solverforge 0.6.1__tar.gz → 0.6.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. {solverforge-0.6.1 → solverforge-0.6.3}/Cargo.lock +13 -85
  2. {solverforge-0.6.1 → solverforge-0.6.3}/Cargo.toml +8 -8
  3. {solverforge-0.6.1 → solverforge-0.6.3}/PKG-INFO +21 -14
  4. {solverforge-0.6.1 → solverforge-0.6.3}/README.md +20 -13
  5. {solverforge-0.6.1 → solverforge-0.6.3}/pyproject.toml +1 -1
  6. {solverforge-0.6.1 → solverforge-0.6.3}/python/solverforge/__init__.py +1 -1
  7. {solverforge-0.6.1 → solverforge-0.6.3}/LICENSE +0 -0
  8. {solverforge-0.6.1 → solverforge-0.6.3}/python/solverforge/_native.pyi +0 -0
  9. {solverforge-0.6.1 → solverforge-0.6.3}/python/solverforge/config.py +0 -0
  10. {solverforge-0.6.1 → solverforge-0.6.3}/python/solverforge/console.py +0 -0
  11. {solverforge-0.6.1 → solverforge-0.6.3}/python/solverforge/constraints.py +0 -0
  12. {solverforge-0.6.1 → solverforge-0.6.3}/python/solverforge/decorators.py +0 -0
  13. {solverforge-0.6.1 → solverforge-0.6.3}/python/solverforge/errors.py +0 -0
  14. {solverforge-0.6.1 → solverforge-0.6.3}/python/solverforge/events.py +0 -0
  15. {solverforge-0.6.1 → solverforge-0.6.3}/python/solverforge/fields.py +0 -0
  16. {solverforge-0.6.1 → solverforge-0.6.3}/python/solverforge/groups.py +0 -0
  17. {solverforge-0.6.1 → solverforge-0.6.3}/python/solverforge/joiner.py +0 -0
  18. {solverforge-0.6.1 → solverforge-0.6.3}/python/solverforge/manager.py +0 -0
  19. {solverforge-0.6.1 → solverforge-0.6.3}/python/solverforge/model.py +0 -0
  20. {solverforge-0.6.1 → solverforge-0.6.3}/python/solverforge/py.typed +0 -0
  21. {solverforge-0.6.1 → solverforge-0.6.3}/python/solverforge/score.py +0 -0
  22. {solverforge-0.6.1 → solverforge-0.6.3}/python/solverforge/solver.py +0 -0
  23. {solverforge-0.6.1 → solverforge-0.6.3}/python/solverforge/typing.py +0 -0
  24. {solverforge-0.6.1 → solverforge-0.6.3}/python/solverforge/ui.py +0 -0
  25. {solverforge-0.6.1 → solverforge-0.6.3}/rust-toolchain.toml +0 -0
  26. {solverforge-0.6.1 → solverforge-0.6.3}/src/bindings.rs +0 -0
  27. {solverforge-0.6.1 → solverforge-0.6.3}/src/callbacks/call.rs +0 -0
  28. {solverforge-0.6.1 → solverforge-0.6.3}/src/callbacks/mod.rs +0 -0
  29. {solverforge-0.6.1 → solverforge-0.6.3}/src/callbacks/registry.rs +0 -0
  30. {solverforge-0.6.1 → solverforge-0.6.3}/src/callbacks/threading.rs +0 -0
  31. {solverforge-0.6.1 → solverforge-0.6.3}/src/config.rs +0 -0
  32. {solverforge-0.6.1 → solverforge-0.6.3}/src/constraints/compiled.rs +0 -0
  33. {solverforge-0.6.1 → solverforge-0.6.3}/src/constraints/evaluate.rs +0 -0
  34. {solverforge-0.6.1 → solverforge-0.6.3}/src/constraints/incremental.rs +0 -0
  35. {solverforge-0.6.1 → solverforge-0.6.3}/src/constraints/list_precedence.rs +0 -0
  36. {solverforge-0.6.1 → solverforge-0.6.3}/src/constraints/matches.rs +0 -0
  37. {solverforge-0.6.1 → solverforge-0.6.3}/src/constraints/mod.rs +0 -0
  38. {solverforge-0.6.1 → solverforge-0.6.3}/src/constraints/state.rs +0 -0
  39. {solverforge-0.6.1 → solverforge-0.6.3}/src/constraints/stream_plan.rs +0 -0
  40. {solverforge-0.6.1 → solverforge-0.6.3}/src/descriptor/extractor.rs +0 -0
  41. {solverforge-0.6.1 → solverforge-0.6.3}/src/descriptor/mod.rs +0 -0
  42. {solverforge-0.6.1 → solverforge-0.6.3}/src/descriptor/variable.rs +0 -0
  43. {solverforge-0.6.1 → solverforge-0.6.3}/src/error.rs +0 -0
  44. {solverforge-0.6.1 → solverforge-0.6.3}/src/intern.rs +0 -0
  45. {solverforge-0.6.1 → solverforge-0.6.3}/src/lib.rs +0 -0
  46. {solverforge-0.6.1 → solverforge-0.6.3}/src/manager/candidate_trace.rs +0 -0
  47. {solverforge-0.6.1 → solverforge-0.6.3}/src/manager/events.rs +0 -0
  48. {solverforge-0.6.1 → solverforge-0.6.3}/src/manager/jobs.rs +0 -0
  49. {solverforge-0.6.1 → solverforge-0.6.3}/src/manager/mod.rs +0 -0
  50. {solverforge-0.6.1 → solverforge-0.6.3}/src/manager/provenance.rs +0 -0
  51. {solverforge-0.6.1 → solverforge-0.6.3}/src/proxy/entity.rs +0 -0
  52. {solverforge-0.6.1 → solverforge-0.6.3}/src/proxy/list.rs +0 -0
  53. {solverforge-0.6.1 → solverforge-0.6.3}/src/proxy/mod.rs +0 -0
  54. {solverforge-0.6.1 → solverforge-0.6.3}/src/proxy/solution.rs +0 -0
  55. {solverforge-0.6.1 → solverforge-0.6.3}/src/runtime/candidate_metric.rs +0 -0
  56. {solverforge-0.6.1 → solverforge-0.6.3}/src/runtime/dynamic_assignment_group.rs +0 -0
  57. {solverforge-0.6.1 → solverforge-0.6.3}/src/runtime/dynamic_provider.rs +0 -0
  58. {solverforge-0.6.1 → solverforge-0.6.3}/src/runtime/list_slots.rs +0 -0
  59. {solverforge-0.6.1 → solverforge-0.6.3}/src/runtime/mod.rs +0 -0
  60. {solverforge-0.6.1 → solverforge-0.6.3}/src/runtime/scalar_slots.rs +0 -0
  61. {solverforge-0.6.1 → solverforge-0.6.3}/src/schema/build.rs +0 -0
  62. {solverforge-0.6.1 → solverforge-0.6.3}/src/schema/compiled.rs +0 -0
  63. {solverforge-0.6.1 → solverforge-0.6.3}/src/schema/mod.rs +0 -0
  64. {solverforge-0.6.1 → solverforge-0.6.3}/src/schema/parse.rs +0 -0
  65. {solverforge-0.6.1 → solverforge-0.6.3}/src/schema/python.rs +0 -0
  66. {solverforge-0.6.1 → solverforge-0.6.3}/src/schema/runtime_plan.rs +0 -0
  67. {solverforge-0.6.1 → solverforge-0.6.3}/src/schema/types.rs +0 -0
  68. {solverforge-0.6.1 → solverforge-0.6.3}/src/schema/validate.rs +0 -0
  69. {solverforge-0.6.1 → solverforge-0.6.3}/src/score.rs +0 -0
  70. {solverforge-0.6.1 → solverforge-0.6.3}/src/solver/api.rs +0 -0
  71. {solverforge-0.6.1 → solverforge-0.6.3}/src/solver/console.rs +0 -0
  72. {solverforge-0.6.1 → solverforge-0.6.3}/src/solver/mod.rs +0 -0
  73. {solverforge-0.6.1 → solverforge-0.6.3}/src/solver/progress.rs +0 -0
  74. {solverforge-0.6.1 → solverforge-0.6.3}/src/solver/result.rs +0 -0
  75. {solverforge-0.6.1 → solverforge-0.6.3}/src/solver/solvable.rs +0 -0
  76. {solverforge-0.6.1 → solverforge-0.6.3}/src/state/callback_view.rs +0 -0
  77. {solverforge-0.6.1 → solverforge-0.6.3}/src/state/clone.rs +0 -0
  78. {solverforge-0.6.1 → solverforge-0.6.3}/src/state/entity_table.rs +0 -0
  79. {solverforge-0.6.1 → solverforge-0.6.3}/src/state/marshal.rs +0 -0
  80. {solverforge-0.6.1 → solverforge-0.6.3}/src/state/mod.rs +0 -0
  81. {solverforge-0.6.1 → solverforge-0.6.3}/src/state/solution.rs +0 -0
  82. {solverforge-0.6.1 → solverforge-0.6.3}/src/state/variables.rs +0 -0
  83. {solverforge-0.6.1 → solverforge-0.6.3}/src/ui.rs +0 -0
  84. {solverforge-0.6.1 → solverforge-0.6.3}/src/value.rs +0 -0
@@ -29,12 +29,6 @@ version = "2.13.0"
29
29
  source = "registry+https://github.com/rust-lang/crates.io-index"
30
30
  checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8"
31
31
 
32
- [[package]]
33
- name = "bytes"
34
- version = "1.12.0"
35
- source = "registry+https://github.com/rust-lang/crates.io-index"
36
- checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593"
37
-
38
32
  [[package]]
39
33
  name = "cfg-if"
40
34
  version = "1.0.4"
@@ -104,16 +98,6 @@ version = "1.0.2"
104
98
  source = "registry+https://github.com/rust-lang/crates.io-index"
105
99
  checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
106
100
 
107
- [[package]]
108
- name = "errno"
109
- version = "0.3.14"
110
- source = "registry+https://github.com/rust-lang/crates.io-index"
111
- checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
112
- dependencies = [
113
- "libc",
114
- "windows-sys",
115
- ]
116
-
117
101
  [[package]]
118
102
  name = "getrandom"
119
103
  version = "0.4.3"
@@ -233,17 +217,6 @@ dependencies = [
233
217
  "autocfg",
234
218
  ]
235
219
 
236
- [[package]]
237
- name = "mio"
238
- version = "1.2.1"
239
- source = "registry+https://github.com/rust-lang/crates.io-index"
240
- checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda"
241
- dependencies = [
242
- "libc",
243
- "wasi",
244
- "windows-sys",
245
- ]
246
-
247
220
  [[package]]
248
221
  name = "nu-ansi-term"
249
222
  version = "0.50.3"
@@ -579,37 +552,17 @@ dependencies = [
579
552
  "lazy_static",
580
553
  ]
581
554
 
582
- [[package]]
583
- name = "signal-hook-registry"
584
- version = "1.4.8"
585
- source = "registry+https://github.com/rust-lang/crates.io-index"
586
- checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b"
587
- dependencies = [
588
- "errno",
589
- "libc",
590
- ]
591
-
592
555
  [[package]]
593
556
  name = "smallvec"
594
557
  version = "1.15.2"
595
558
  source = "registry+https://github.com/rust-lang/crates.io-index"
596
559
  checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90"
597
560
 
598
- [[package]]
599
- name = "socket2"
600
- version = "0.6.4"
601
- source = "registry+https://github.com/rust-lang/crates.io-index"
602
- checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51"
603
- dependencies = [
604
- "libc",
605
- "windows-sys",
606
- ]
607
-
608
561
  [[package]]
609
562
  name = "solverforge-bridge"
610
- version = "0.18.0"
563
+ version = "0.19.1"
611
564
  source = "registry+https://github.com/rust-lang/crates.io-index"
612
- checksum = "a9c592f73f90c14ca2af38b80ba6371ff4d41b6aaebafe341086225161836353"
565
+ checksum = "6bc1bbd14aa7b23a845359b408747b6b783ed31529f1b2cfa12512d425e305f5"
613
566
  dependencies = [
614
567
  "solverforge-config",
615
568
  "solverforge-core",
@@ -619,9 +572,9 @@ dependencies = [
619
572
 
620
573
  [[package]]
621
574
  name = "solverforge-config"
622
- version = "0.18.0"
575
+ version = "0.19.1"
623
576
  source = "registry+https://github.com/rust-lang/crates.io-index"
624
- checksum = "0cb6e55b036aaff944d1c772ca6e51524c1dfe8dfa704342c2319b47665b8834"
577
+ checksum = "3251fc0471e05f2c05f9148f648618aa8d021fa4dff9af626ac7f05843f114f8"
625
578
  dependencies = [
626
579
  "serde",
627
580
  "serde_yaml",
@@ -632,9 +585,9 @@ dependencies = [
632
585
 
633
586
  [[package]]
634
587
  name = "solverforge-console"
635
- version = "0.18.0"
588
+ version = "0.19.1"
636
589
  source = "registry+https://github.com/rust-lang/crates.io-index"
637
- checksum = "e100997cd6d2fbafc8eb8e1d84bf60149a1386b89e8562a81d9408085a00520c"
590
+ checksum = "42794d46f6685a00e9387a67b0037d49321f7e34796cd5a97b8fd99a72e20377"
638
591
  dependencies = [
639
592
  "num-format",
640
593
  "owo-colors",
@@ -644,18 +597,18 @@ dependencies = [
644
597
 
645
598
  [[package]]
646
599
  name = "solverforge-core"
647
- version = "0.18.0"
600
+ version = "0.19.1"
648
601
  source = "registry+https://github.com/rust-lang/crates.io-index"
649
- checksum = "d922c9a0ee10e0ba68c7c9b98e38d07399820358dc0d10d238a9e6641ef45d27"
602
+ checksum = "32858c2be2505640f60a0bcee902a29e7b9dd136aec49928601ca8764920cb79"
650
603
  dependencies = [
651
604
  "thiserror",
652
605
  ]
653
606
 
654
607
  [[package]]
655
608
  name = "solverforge-scoring"
656
- version = "0.18.0"
609
+ version = "0.19.1"
657
610
  source = "registry+https://github.com/rust-lang/crates.io-index"
658
- checksum = "40a4b4eb8031ba04556106ae1bb13533c4f50ab206b3c5844c4e0284e42bd4f2"
611
+ checksum = "50bd20153f578099fe768873f8d5c07f8e4a56e79bb3da4611776ca5f65941e4"
659
612
  dependencies = [
660
613
  "solverforge-core",
661
614
  "thiserror",
@@ -663,9 +616,9 @@ dependencies = [
663
616
 
664
617
  [[package]]
665
618
  name = "solverforge-solver"
666
- version = "0.18.0"
619
+ version = "0.19.1"
667
620
  source = "registry+https://github.com/rust-lang/crates.io-index"
668
- checksum = "7a5b5a898495984107de03cdc9c151c39ec9b4d70cfa509950cbe58c263953a4"
621
+ checksum = "ae2870ba2c94f03150870d84224fc009936071f9e9313161979473735e059988"
669
622
  dependencies = [
670
623
  "rand",
671
624
  "rand_chacha",
@@ -691,7 +644,7 @@ dependencies = [
691
644
 
692
645
  [[package]]
693
646
  name = "solverforge_py"
694
- version = "0.6.1"
647
+ version = "0.6.3"
695
648
  dependencies = [
696
649
  "indexmap",
697
650
  "once_cell",
@@ -767,26 +720,7 @@ version = "1.52.3"
767
720
  source = "registry+https://github.com/rust-lang/crates.io-index"
768
721
  checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe"
769
722
  dependencies = [
770
- "bytes",
771
- "libc",
772
- "mio",
773
- "parking_lot",
774
723
  "pin-project-lite",
775
- "signal-hook-registry",
776
- "socket2",
777
- "tokio-macros",
778
- "windows-sys",
779
- ]
780
-
781
- [[package]]
782
- name = "tokio-macros"
783
- version = "2.7.0"
784
- source = "registry+https://github.com/rust-lang/crates.io-index"
785
- checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496"
786
- dependencies = [
787
- "proc-macro2",
788
- "quote",
789
- "syn",
790
724
  ]
791
725
 
792
726
  [[package]]
@@ -937,12 +871,6 @@ version = "0.1.1"
937
871
  source = "registry+https://github.com/rust-lang/crates.io-index"
938
872
  checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65"
939
873
 
940
- [[package]]
941
- name = "wasi"
942
- version = "0.11.1+wasi-snapshot-preview1"
943
- source = "registry+https://github.com/rust-lang/crates.io-index"
944
- checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
945
-
946
874
  [[package]]
947
875
  name = "windows-link"
948
876
  version = "0.2.1"
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "solverforge_py"
3
- version = "0.6.1"
3
+ version = "0.6.3"
4
4
  edition = "2021"
5
5
  license = "Apache-2.0"
6
6
  rust-version = "1.95"
@@ -26,7 +26,7 @@ name = "solverforge_py"
26
26
  crate-type = ["cdylib", "rlib"]
27
27
 
28
28
  [package.metadata.solverforge]
29
- version = "0.18.0"
29
+ version = "0.19.1"
30
30
 
31
31
  [dependencies]
32
32
  indexmap = "2.12.1"
@@ -42,12 +42,12 @@ toml = "0.9.8"
42
42
  tracing = "0.1.44"
43
43
  tracing-subscriber = { version = "0.3.23", features = ["env-filter"] }
44
44
 
45
- solverforge-config = { version = "=0.18.0" }
46
- solverforge-bridge = { version = "=0.18.0" }
47
- solverforge-console = { version = "=0.18.0", features = ["verbose-logging"] }
48
- solverforge-core = { version = "=0.18.0" }
49
- solverforge-scoring = { version = "=0.18.0" }
50
- solverforge-solver = { version = "=0.18.0" }
45
+ solverforge-config = { version = "=0.19.1" }
46
+ solverforge-bridge = { version = "=0.19.1" }
47
+ solverforge-console = { version = "=0.19.1", features = ["verbose-logging"] }
48
+ solverforge-core = { version = "=0.19.1" }
49
+ solverforge-scoring = { version = "=0.19.1" }
50
+ solverforge-solver = { version = "=0.19.1" }
51
51
  solverforge-ui = { version = "=0.7.0", default-features = false }
52
52
 
53
53
  [dev-dependencies]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: solverforge
3
- Version: 0.6.1
3
+ Version: 0.6.3
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: Intended Audience :: Science/Research
@@ -39,10 +39,10 @@ The native extension owns the working solution state in Rust so SolverForge can
39
39
  clone, mutate, and snapshot solutions safely. Python callbacks are the single
40
40
  constraint authoring surface.
41
41
 
42
- The package targets CPython 3.14 and Rust 1.95.0. This checkout consumes the
43
- published SolverForge Rust crates `0.18.0` and pins `solverforge-ui` to `0.7.0`
44
- through exact crates.io versions in `Cargo.toml` and registry checksums in
45
- `Cargo.lock`; it has no local path or Git dependency override. The `solverforge`
42
+ The package targets CPython 3.14 and Rust 1.95.0. This checkout targets the
43
+ SolverForge Rust crates `0.19.1` and pins `solverforge-ui` to `0.7.0` through
44
+ exact crates.io versions in `Cargo.toml` and registry checksums in `Cargo.lock`.
45
+ There is no local path or Git dependency override. The `solverforge`
46
46
  `0.6.x` line is the current dynamic binding architecture and intentionally
47
47
  supersedes the older incompatible `0.2.x` and `0.3.0` artifacts in the same PyPI
48
48
  namespace. Those older artifacts exposed `SolverFactory`, `PlanningVariable`,
@@ -50,11 +50,12 @@ Java service requirements, and other APIs that are not part of this package.
50
50
 
51
51
  ## Installation
52
52
 
53
- Install the `solverforge` `0.6.1` release, built on the exact published and
54
- locked SolverForge Rust `0.18.0` registry dependency base:
53
+ The package version prepared by this checkout is `solverforge` `0.6.3`, targeting
54
+ the published and locked SolverForge Rust `0.19.1` registry dependency base.
55
+ Install the matching package after its Python release with:
55
56
 
56
57
  ```sh
57
- python3.14 -m pip install "solverforge==0.6.1"
58
+ python3.14 -m pip install "solverforge==0.6.3"
58
59
  ```
59
60
 
60
61
  The installable wheel contains the core `solverforge` package, native extension,
@@ -73,13 +74,13 @@ make hospital-run
73
74
  make deliveries-run PORT=7861
74
75
  ```
75
76
 
76
- The same source-checkout examples can be run against the installed package
77
- without `PYTHONPATH` or an editable checkout:
77
+ After publication, the same source-checkout examples can be run against the
78
+ installed package without `PYTHONPATH` or an editable checkout:
78
79
 
79
80
  ```sh
80
81
  python3.14 -m venv .venv-examples
81
82
  . .venv-examples/bin/activate
82
- python -m pip install "solverforge[examples]==0.6.1"
83
+ python -m pip install "solverforge[examples]==0.6.3"
83
84
  python examples/nqueens.py
84
85
  python -m examples.solverforge_hospital
85
86
  python -m examples.solverforge_deliveries
@@ -186,9 +187,13 @@ Run `make help` for focused targets such as `make test-hospital`,
186
187
  `list_cheapest_insertion`, `list_regret_insertion`, `list_clarke_wright`, and
187
188
  `list_k_opt`, with the final two requiring their respective savings and route
188
189
  metadata bundles. These are core graph nodes over the immutable runtime
189
- model. An explicit `group_name` phase obeys its configured obligation and
190
- termination; required-only completion belongs solely to upstream omitted
191
- defaults. Default local search is assembled only when the top-level
190
+ model. All configured limits remain binding during construction. A solve
191
+ publishes a best or completed solution only after every list element,
192
+ required assignment row, and non-optional scalar variable is assigned; if a
193
+ limit is reached first, a direct solve raises and a retained job enters
194
+ `FAILED` without exposing a partial snapshot. Omitted construction still
195
+ resolves required and optional stages in core, but required work never
196
+ bypasses a configured limit. Default local search is assembled only when the top-level
192
197
  termination has an effective finite limit, so an empty or invalid termination
193
198
  cannot accidentally create an unbounded solve. There is no wrapper assignment
194
199
  placer, required stream, phase tree, TLS slot state, synthetic metric, or
@@ -196,6 +201,8 @@ Run `make help` for focused targets such as `make test-hospital`,
196
201
  - `SolverManager` is backed by upstream retained jobs, statuses, events, and
197
202
  snapshots. `SolverManager.solve(...)` returns `JobHandle(job_id=...)`; the
198
203
  manager supports pause, resume, cancel, delete, and exact snapshot reads.
204
+ A pause before mandatory construction completes remains resumable internal
205
+ state and does not expose an incomplete solution snapshot.
199
206
  Retained event payloads read current score from the attached solution snapshot
200
207
  when present. Long-running phases publish progress at the shared upstream
201
208
  cadence, and telemetry includes the current phase type, index, counters, and
@@ -8,10 +8,10 @@ The native extension owns the working solution state in Rust so SolverForge can
8
8
  clone, mutate, and snapshot solutions safely. Python callbacks are the single
9
9
  constraint authoring surface.
10
10
 
11
- The package targets CPython 3.14 and Rust 1.95.0. This checkout consumes the
12
- published SolverForge Rust crates `0.18.0` and pins `solverforge-ui` to `0.7.0`
13
- through exact crates.io versions in `Cargo.toml` and registry checksums in
14
- `Cargo.lock`; it has no local path or Git dependency override. The `solverforge`
11
+ The package targets CPython 3.14 and Rust 1.95.0. This checkout targets the
12
+ SolverForge Rust crates `0.19.1` and pins `solverforge-ui` to `0.7.0` through
13
+ exact crates.io versions in `Cargo.toml` and registry checksums in `Cargo.lock`.
14
+ There is no local path or Git dependency override. The `solverforge`
15
15
  `0.6.x` line is the current dynamic binding architecture and intentionally
16
16
  supersedes the older incompatible `0.2.x` and `0.3.0` artifacts in the same PyPI
17
17
  namespace. Those older artifacts exposed `SolverFactory`, `PlanningVariable`,
@@ -19,11 +19,12 @@ Java service requirements, and other APIs that are not part of this package.
19
19
 
20
20
  ## Installation
21
21
 
22
- Install the `solverforge` `0.6.1` release, built on the exact published and
23
- locked SolverForge Rust `0.18.0` registry dependency base:
22
+ The package version prepared by this checkout is `solverforge` `0.6.3`, targeting
23
+ the published and locked SolverForge Rust `0.19.1` registry dependency base.
24
+ Install the matching package after its Python release with:
24
25
 
25
26
  ```sh
26
- python3.14 -m pip install "solverforge==0.6.1"
27
+ python3.14 -m pip install "solverforge==0.6.3"
27
28
  ```
28
29
 
29
30
  The installable wheel contains the core `solverforge` package, native extension,
@@ -42,13 +43,13 @@ make hospital-run
42
43
  make deliveries-run PORT=7861
43
44
  ```
44
45
 
45
- The same source-checkout examples can be run against the installed package
46
- without `PYTHONPATH` or an editable checkout:
46
+ After publication, the same source-checkout examples can be run against the
47
+ installed package without `PYTHONPATH` or an editable checkout:
47
48
 
48
49
  ```sh
49
50
  python3.14 -m venv .venv-examples
50
51
  . .venv-examples/bin/activate
51
- python -m pip install "solverforge[examples]==0.6.1"
52
+ python -m pip install "solverforge[examples]==0.6.3"
52
53
  python examples/nqueens.py
53
54
  python -m examples.solverforge_hospital
54
55
  python -m examples.solverforge_deliveries
@@ -155,9 +156,13 @@ Run `make help` for focused targets such as `make test-hospital`,
155
156
  `list_cheapest_insertion`, `list_regret_insertion`, `list_clarke_wright`, and
156
157
  `list_k_opt`, with the final two requiring their respective savings and route
157
158
  metadata bundles. These are core graph nodes over the immutable runtime
158
- model. An explicit `group_name` phase obeys its configured obligation and
159
- termination; required-only completion belongs solely to upstream omitted
160
- defaults. Default local search is assembled only when the top-level
159
+ model. All configured limits remain binding during construction. A solve
160
+ publishes a best or completed solution only after every list element,
161
+ required assignment row, and non-optional scalar variable is assigned; if a
162
+ limit is reached first, a direct solve raises and a retained job enters
163
+ `FAILED` without exposing a partial snapshot. Omitted construction still
164
+ resolves required and optional stages in core, but required work never
165
+ bypasses a configured limit. Default local search is assembled only when the top-level
161
166
  termination has an effective finite limit, so an empty or invalid termination
162
167
  cannot accidentally create an unbounded solve. There is no wrapper assignment
163
168
  placer, required stream, phase tree, TLS slot state, synthetic metric, or
@@ -165,6 +170,8 @@ Run `make help` for focused targets such as `make test-hospital`,
165
170
  - `SolverManager` is backed by upstream retained jobs, statuses, events, and
166
171
  snapshots. `SolverManager.solve(...)` returns `JobHandle(job_id=...)`; the
167
172
  manager supports pause, resume, cancel, delete, and exact snapshot reads.
173
+ A pause before mandatory construction completes remains resumable internal
174
+ state and does not expose an incomplete solution snapshot.
168
175
  Retained event payloads read current score from the attached solution snapshot
169
176
  when present. Long-running phases publish progress at the shared upstream
170
177
  cadence, and telemetry includes the current phase type, index, counters, and
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "solverforge"
7
- version = "0.6.1"
7
+ version = "0.6.3"
8
8
  description = "Dynamic Python bindings for the SolverForge constraint solver."
9
9
  readme = "README.md"
10
10
  license = { text = "Apache-2.0" }
@@ -40,7 +40,7 @@ from .manager import JobHandle, SolverManager
40
40
  from .score import HardMediumSoftScore, HardSoftDecimalScore, HardSoftScore, SoftScore
41
41
  from .solver import Solver
42
42
 
43
- __version__ = "0.6.1"
43
+ __version__ = "0.6.3"
44
44
 
45
45
  __all__ = [
46
46
  "CallbackError",
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes