solverforge 0.6.6__tar.gz → 0.6.7__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.6 → solverforge-0.6.7}/Cargo.lock +15 -15
  2. {solverforge-0.6.6 → solverforge-0.6.7}/Cargo.toml +9 -9
  3. {solverforge-0.6.6 → solverforge-0.6.7}/PKG-INFO +18 -15
  4. {solverforge-0.6.6 → solverforge-0.6.7}/README.md +17 -14
  5. {solverforge-0.6.6 → solverforge-0.6.7}/pyproject.toml +1 -1
  6. {solverforge-0.6.6 → solverforge-0.6.7}/python/solverforge/__init__.py +1 -1
  7. {solverforge-0.6.6 → solverforge-0.6.7}/python/solverforge/decorators.py +0 -1
  8. {solverforge-0.6.6 → solverforge-0.6.7}/python/solverforge/fields.py +10 -2
  9. {solverforge-0.6.6 → solverforge-0.6.7}/LICENSE +0 -0
  10. {solverforge-0.6.6 → solverforge-0.6.7}/python/solverforge/_native.pyi +0 -0
  11. {solverforge-0.6.6 → solverforge-0.6.7}/python/solverforge/config.py +0 -0
  12. {solverforge-0.6.6 → solverforge-0.6.7}/python/solverforge/console.py +0 -0
  13. {solverforge-0.6.6 → solverforge-0.6.7}/python/solverforge/constraints.py +0 -0
  14. {solverforge-0.6.6 → solverforge-0.6.7}/python/solverforge/errors.py +0 -0
  15. {solverforge-0.6.6 → solverforge-0.6.7}/python/solverforge/events.py +0 -0
  16. {solverforge-0.6.6 → solverforge-0.6.7}/python/solverforge/groups.py +0 -0
  17. {solverforge-0.6.6 → solverforge-0.6.7}/python/solverforge/joiner.py +0 -0
  18. {solverforge-0.6.6 → solverforge-0.6.7}/python/solverforge/manager.py +0 -0
  19. {solverforge-0.6.6 → solverforge-0.6.7}/python/solverforge/model.py +0 -0
  20. {solverforge-0.6.6 → solverforge-0.6.7}/python/solverforge/py.typed +0 -0
  21. {solverforge-0.6.6 → solverforge-0.6.7}/python/solverforge/score.py +0 -0
  22. {solverforge-0.6.6 → solverforge-0.6.7}/python/solverforge/solver.py +0 -0
  23. {solverforge-0.6.6 → solverforge-0.6.7}/python/solverforge/typing.py +0 -0
  24. {solverforge-0.6.6 → solverforge-0.6.7}/python/solverforge/ui.py +0 -0
  25. {solverforge-0.6.6 → solverforge-0.6.7}/rust-toolchain.toml +0 -0
  26. {solverforge-0.6.6 → solverforge-0.6.7}/src/bindings.rs +0 -0
  27. {solverforge-0.6.6 → solverforge-0.6.7}/src/callbacks/call.rs +0 -0
  28. {solverforge-0.6.6 → solverforge-0.6.7}/src/callbacks/mod.rs +0 -0
  29. {solverforge-0.6.6 → solverforge-0.6.7}/src/callbacks/registry.rs +0 -0
  30. {solverforge-0.6.6 → solverforge-0.6.7}/src/callbacks/threading.rs +0 -0
  31. {solverforge-0.6.6 → solverforge-0.6.7}/src/config.rs +0 -0
  32. {solverforge-0.6.6 → solverforge-0.6.7}/src/constraints/compiled.rs +0 -0
  33. {solverforge-0.6.6 → solverforge-0.6.7}/src/constraints/evaluate.rs +0 -0
  34. {solverforge-0.6.6 → solverforge-0.6.7}/src/constraints/incremental.rs +0 -0
  35. {solverforge-0.6.6 → solverforge-0.6.7}/src/constraints/list_precedence.rs +0 -0
  36. {solverforge-0.6.6 → solverforge-0.6.7}/src/constraints/matches.rs +0 -0
  37. {solverforge-0.6.6 → solverforge-0.6.7}/src/constraints/mod.rs +0 -0
  38. {solverforge-0.6.6 → solverforge-0.6.7}/src/constraints/state.rs +0 -0
  39. {solverforge-0.6.6 → solverforge-0.6.7}/src/constraints/stream_plan.rs +0 -0
  40. {solverforge-0.6.6 → solverforge-0.6.7}/src/descriptor/extractor.rs +0 -0
  41. {solverforge-0.6.6 → solverforge-0.6.7}/src/descriptor/mod.rs +0 -0
  42. {solverforge-0.6.6 → solverforge-0.6.7}/src/descriptor/variable.rs +0 -0
  43. {solverforge-0.6.6 → solverforge-0.6.7}/src/error.rs +0 -0
  44. {solverforge-0.6.6 → solverforge-0.6.7}/src/intern.rs +0 -0
  45. {solverforge-0.6.6 → solverforge-0.6.7}/src/lib.rs +0 -0
  46. {solverforge-0.6.6 → solverforge-0.6.7}/src/manager/candidate_trace.rs +0 -0
  47. {solverforge-0.6.6 → solverforge-0.6.7}/src/manager/events.rs +0 -0
  48. {solverforge-0.6.6 → solverforge-0.6.7}/src/manager/jobs.rs +0 -0
  49. {solverforge-0.6.6 → solverforge-0.6.7}/src/manager/mod.rs +0 -0
  50. {solverforge-0.6.6 → solverforge-0.6.7}/src/manager/provenance.rs +0 -0
  51. {solverforge-0.6.6 → solverforge-0.6.7}/src/proxy/entity.rs +0 -0
  52. {solverforge-0.6.6 → solverforge-0.6.7}/src/proxy/list.rs +0 -0
  53. {solverforge-0.6.6 → solverforge-0.6.7}/src/proxy/mod.rs +0 -0
  54. {solverforge-0.6.6 → solverforge-0.6.7}/src/proxy/solution.rs +0 -0
  55. {solverforge-0.6.6 → solverforge-0.6.7}/src/runtime/candidate_metric.rs +0 -0
  56. {solverforge-0.6.6 → solverforge-0.6.7}/src/runtime/dynamic_assignment_group.rs +0 -0
  57. {solverforge-0.6.6 → solverforge-0.6.7}/src/runtime/dynamic_provider.rs +0 -0
  58. {solverforge-0.6.6 → solverforge-0.6.7}/src/runtime/list_slots.rs +0 -0
  59. {solverforge-0.6.6 → solverforge-0.6.7}/src/runtime/mod.rs +0 -0
  60. {solverforge-0.6.6 → solverforge-0.6.7}/src/runtime/scalar_slots.rs +0 -0
  61. {solverforge-0.6.6 → solverforge-0.6.7}/src/schema/build.rs +0 -0
  62. {solverforge-0.6.6 → solverforge-0.6.7}/src/schema/compiled.rs +0 -0
  63. {solverforge-0.6.6 → solverforge-0.6.7}/src/schema/mod.rs +0 -0
  64. {solverforge-0.6.6 → solverforge-0.6.7}/src/schema/parse.rs +0 -0
  65. {solverforge-0.6.6 → solverforge-0.6.7}/src/schema/python.rs +0 -0
  66. {solverforge-0.6.6 → solverforge-0.6.7}/src/schema/runtime_plan.rs +0 -0
  67. {solverforge-0.6.6 → solverforge-0.6.7}/src/schema/types.rs +0 -0
  68. {solverforge-0.6.6 → solverforge-0.6.7}/src/schema/validate.rs +0 -0
  69. {solverforge-0.6.6 → solverforge-0.6.7}/src/score.rs +0 -0
  70. {solverforge-0.6.6 → solverforge-0.6.7}/src/solver/api.rs +0 -0
  71. {solverforge-0.6.6 → solverforge-0.6.7}/src/solver/console.rs +0 -0
  72. {solverforge-0.6.6 → solverforge-0.6.7}/src/solver/mod.rs +0 -0
  73. {solverforge-0.6.6 → solverforge-0.6.7}/src/solver/progress.rs +0 -0
  74. {solverforge-0.6.6 → solverforge-0.6.7}/src/solver/result.rs +0 -0
  75. {solverforge-0.6.6 → solverforge-0.6.7}/src/solver/solvable.rs +0 -0
  76. {solverforge-0.6.6 → solverforge-0.6.7}/src/state/callback_view.rs +0 -0
  77. {solverforge-0.6.6 → solverforge-0.6.7}/src/state/clone.rs +0 -0
  78. {solverforge-0.6.6 → solverforge-0.6.7}/src/state/entity_table.rs +0 -0
  79. {solverforge-0.6.6 → solverforge-0.6.7}/src/state/marshal.rs +0 -0
  80. {solverforge-0.6.6 → solverforge-0.6.7}/src/state/mod.rs +0 -0
  81. {solverforge-0.6.6 → solverforge-0.6.7}/src/state/solution.rs +0 -0
  82. {solverforge-0.6.6 → solverforge-0.6.7}/src/state/variables.rs +0 -0
  83. {solverforge-0.6.6 → solverforge-0.6.7}/src/ui.rs +0 -0
  84. {solverforge-0.6.6 → solverforge-0.6.7}/src/value.rs +0 -0
@@ -560,9 +560,9 @@ checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90"
560
560
 
561
561
  [[package]]
562
562
  name = "solverforge-bridge"
563
- version = "0.19.4"
563
+ version = "0.19.7"
564
564
  source = "registry+https://github.com/rust-lang/crates.io-index"
565
- checksum = "12530829741dfb79552c5cb4ae70ac621503b5e9438947cbf9b50257f712a997"
565
+ checksum = "6257a13961202890dad23729ccceae45afd14c156e046c60b74e739bf0a26f36"
566
566
  dependencies = [
567
567
  "solverforge-config",
568
568
  "solverforge-core",
@@ -572,9 +572,9 @@ dependencies = [
572
572
 
573
573
  [[package]]
574
574
  name = "solverforge-config"
575
- version = "0.19.4"
575
+ version = "0.19.7"
576
576
  source = "registry+https://github.com/rust-lang/crates.io-index"
577
- checksum = "5cf7440a6bbc97606dfae1be85e55de541d30cc9a25635ba58eb4e78395faf1c"
577
+ checksum = "0801115100979d1c4558918277d6a2f2992f843f90f67b9fc0cf78699a5bde06"
578
578
  dependencies = [
579
579
  "serde",
580
580
  "serde_yaml",
@@ -585,9 +585,9 @@ dependencies = [
585
585
 
586
586
  [[package]]
587
587
  name = "solverforge-console"
588
- version = "0.19.4"
588
+ version = "0.19.7"
589
589
  source = "registry+https://github.com/rust-lang/crates.io-index"
590
- checksum = "ccca538afe6f31d83bb699e7d6ec7f679033b9713828b8139a897d81faf2ef9e"
590
+ checksum = "2728833bbaf987be4058e60d77a013408b8c577570a552adecddd0461ac56f40"
591
591
  dependencies = [
592
592
  "num-format",
593
593
  "owo-colors",
@@ -597,18 +597,18 @@ dependencies = [
597
597
 
598
598
  [[package]]
599
599
  name = "solverforge-core"
600
- version = "0.19.4"
600
+ version = "0.19.7"
601
601
  source = "registry+https://github.com/rust-lang/crates.io-index"
602
- checksum = "79b244e1efabe25575798d8d53a1d4d43492167d5bc004bff9c7a9505f5aae1d"
602
+ checksum = "897a977c2b4af1ceb8bb01707bd23783ffa1363d7c70950767718b3daf767e48"
603
603
  dependencies = [
604
604
  "thiserror",
605
605
  ]
606
606
 
607
607
  [[package]]
608
608
  name = "solverforge-scoring"
609
- version = "0.19.4"
609
+ version = "0.19.7"
610
610
  source = "registry+https://github.com/rust-lang/crates.io-index"
611
- checksum = "4c097aee46dd2e6f09be86392e85fe28cb5eeb18c575f835e3c7ce768236ad79"
611
+ checksum = "18f932ada3a948f09e3234197dc4696626264c73e89f2cf520fe3e87ad61f445"
612
612
  dependencies = [
613
613
  "solverforge-core",
614
614
  "thiserror",
@@ -616,9 +616,9 @@ dependencies = [
616
616
 
617
617
  [[package]]
618
618
  name = "solverforge-solver"
619
- version = "0.19.4"
619
+ version = "0.19.7"
620
620
  source = "registry+https://github.com/rust-lang/crates.io-index"
621
- checksum = "7cb0d393e0c42c3e6e88c71e0a07a09b245225f20cfca05d4a5a01f1ddda2d8c"
621
+ checksum = "e2f21595deb21733528ffbb95c076dceee638aa93bafad812676aa53ca7af4b1"
622
622
  dependencies = [
623
623
  "rand",
624
624
  "rand_chacha",
@@ -635,16 +635,16 @@ dependencies = [
635
635
 
636
636
  [[package]]
637
637
  name = "solverforge-ui"
638
- version = "0.7.0"
638
+ version = "0.9.0"
639
639
  source = "registry+https://github.com/rust-lang/crates.io-index"
640
- checksum = "4f28bc3b68bf72c2ed690c9e6f67627aad2e17f0b239da90125bb229ecbf4362"
640
+ checksum = "87dc89ca92af46ff7c55eb29d4072d98b2414047fd84cd8c77458e60468d53f6"
641
641
  dependencies = [
642
642
  "include_dir",
643
643
  ]
644
644
 
645
645
  [[package]]
646
646
  name = "solverforge_py"
647
- version = "0.6.6"
647
+ version = "0.6.7"
648
648
  dependencies = [
649
649
  "indexmap",
650
650
  "once_cell",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "solverforge_py"
3
- version = "0.6.6"
3
+ version = "0.6.7"
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.19.4"
29
+ version = "0.19.7"
30
30
 
31
31
  [dependencies]
32
32
  indexmap = "2.12.1"
@@ -42,13 +42,13 @@ 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.19.4" }
46
- solverforge-bridge = { version = "=0.19.4" }
47
- solverforge-console = { version = "=0.19.4", features = ["verbose-logging"] }
48
- solverforge-core = { version = "=0.19.4" }
49
- solverforge-scoring = { version = "=0.19.4" }
50
- solverforge-solver = { version = "=0.19.4" }
51
- solverforge-ui = { version = "=0.7.0", default-features = false }
45
+ solverforge-config = { version = "=0.19.7" }
46
+ solverforge-bridge = { version = "=0.19.7" }
47
+ solverforge-console = { version = "=0.19.7", features = ["verbose-logging"] }
48
+ solverforge-core = { version = "=0.19.7" }
49
+ solverforge-scoring = { version = "=0.19.7" }
50
+ solverforge-solver = { version = "=0.19.7" }
51
+ solverforge-ui = { version = "=0.9.0", default-features = false }
52
52
 
53
53
  [dev-dependencies]
54
54
  pretty_assertions = "1.4.1"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: solverforge
3
- Version: 0.6.6
3
+ Version: 0.6.7
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: Intended Audience :: Science/Research
@@ -40,24 +40,23 @@ clone, mutate, and snapshot solutions safely. Python callbacks are the single
40
40
  constraint authoring surface.
41
41
 
42
42
  The package targets CPython 3.14 and Rust 1.95.0. This release-preparation
43
- checkout pins the six published SolverForge Rust dependencies to `0.19.4` and
44
- `solverforge-ui` to `0.7.0` through exact crates.io requirements in
43
+ checkout pins the six published SolverForge Rust dependencies to `0.19.7` and
44
+ `solverforge-ui` to `0.9.0` through exact crates.io requirements in
45
45
  `Cargo.toml` and registry checksums in `Cargo.lock`. There is no local path or
46
46
  Git dependency override. The `solverforge` `0.6.x` line is the current dynamic
47
47
  binding architecture and intentionally supersedes the older incompatible
48
- `0.2.x` and `0.3.0` artifacts in the same PyPI namespace. Those older artifacts
49
- exposed `SolverFactory`, `PlanningVariable`, Java service requirements, and
50
- other APIs that are not part of this package.
48
+ `0.2.x` and `0.3.0` artifacts in the same PyPI namespace.
49
+ Those older artifacts exposed `SolverFactory`, `PlanningVariable`, Java service
50
+ requirements, and other APIs that are not part of this package.
51
51
 
52
52
  ## Installation
53
53
 
54
- The package version prepared by this checkout is `solverforge` `0.6.6`. Its
55
- release-quality build requires the published and registry-locked SolverForge
56
- Rust `0.19.4` dependency base. Install the matching package after its Python
57
- release with:
54
+ The package version prepared by this checkout is `solverforge` `0.6.7`, targeting
55
+ the published and registry-locked SolverForge Rust `0.19.7` dependency base.
56
+ Install the matching package after its Python release with:
58
57
 
59
58
  ```sh
60
- python3.14 -m pip install "solverforge==0.6.6"
59
+ python3.14 -m pip install "solverforge==0.6.7"
61
60
  ```
62
61
 
63
62
  The installable wheel contains the core `solverforge` package, native extension,
@@ -76,13 +75,13 @@ make hospital-run
76
75
  make deliveries-run PORT=7861
77
76
  ```
78
77
 
79
- The same source-checkout examples can be run against the published package
80
- without `PYTHONPATH` or an editable checkout:
78
+ The same source-checkout examples can be run against the matching published
79
+ package once `0.6.7` is released, without `PYTHONPATH` or an editable checkout:
81
80
 
82
81
  ```sh
83
82
  python3.14 -m venv .venv-examples
84
83
  . .venv-examples/bin/activate
85
- python -m pip install "solverforge[examples]==0.6.6"
84
+ python -m pip install "solverforge[examples]==0.6.7"
86
85
  python examples/nqueens.py
87
86
  python -m examples.solverforge_hospital
88
87
  python -m examples.solverforge_deliveries
@@ -244,7 +243,11 @@ Run `make help` for focused targets such as `make test-hospital`,
244
243
  per-query Python callbacks. Provider-backed value ranges are imported once per
245
244
  variable and shared across rows in Rust-owned state. Row candidate callbacks
246
245
  remain row-specific and define move legality throughout construction and local
247
- search, including assignment-group swaps and rematches.
246
+ search, including assignment-group swaps and rematches. `pinning=True` is
247
+ rejected with `ModelValidationError` rather than ignored: SolverForge pins a
248
+ whole planning entity through an entity-level descriptor predicate, and no
249
+ public bridge seam exposes entity pinning to the Python binding yet. Pin an
250
+ input value by restricting `candidate_values` instead.
248
251
  - `scalar_assignment_group(...)` declares assignment-aware scalar groups for
249
252
  grouped scalar local search and assignment-group construction. Group metadata
250
253
  covers required entities, capacity keys, assignment rules, ordering callbacks,
@@ -9,24 +9,23 @@ clone, mutate, and snapshot solutions safely. Python callbacks are the single
9
9
  constraint authoring surface.
10
10
 
11
11
  The package targets CPython 3.14 and Rust 1.95.0. This release-preparation
12
- checkout pins the six published SolverForge Rust dependencies to `0.19.4` and
13
- `solverforge-ui` to `0.7.0` through exact crates.io requirements in
12
+ checkout pins the six published SolverForge Rust dependencies to `0.19.7` and
13
+ `solverforge-ui` to `0.9.0` through exact crates.io requirements in
14
14
  `Cargo.toml` and registry checksums in `Cargo.lock`. There is no local path or
15
15
  Git dependency override. The `solverforge` `0.6.x` line is the current dynamic
16
16
  binding architecture and intentionally supersedes the older incompatible
17
- `0.2.x` and `0.3.0` artifacts in the same PyPI namespace. Those older artifacts
18
- exposed `SolverFactory`, `PlanningVariable`, Java service requirements, and
19
- other APIs that are not part of this package.
17
+ `0.2.x` and `0.3.0` artifacts in the same PyPI namespace.
18
+ Those older artifacts exposed `SolverFactory`, `PlanningVariable`, Java service
19
+ requirements, and other APIs that are not part of this package.
20
20
 
21
21
  ## Installation
22
22
 
23
- The package version prepared by this checkout is `solverforge` `0.6.6`. Its
24
- release-quality build requires the published and registry-locked SolverForge
25
- Rust `0.19.4` dependency base. Install the matching package after its Python
26
- release with:
23
+ The package version prepared by this checkout is `solverforge` `0.6.7`, targeting
24
+ the published and registry-locked SolverForge Rust `0.19.7` dependency base.
25
+ Install the matching package after its Python release with:
27
26
 
28
27
  ```sh
29
- python3.14 -m pip install "solverforge==0.6.6"
28
+ python3.14 -m pip install "solverforge==0.6.7"
30
29
  ```
31
30
 
32
31
  The installable wheel contains the core `solverforge` package, native extension,
@@ -45,13 +44,13 @@ make hospital-run
45
44
  make deliveries-run PORT=7861
46
45
  ```
47
46
 
48
- The same source-checkout examples can be run against the published package
49
- without `PYTHONPATH` or an editable checkout:
47
+ The same source-checkout examples can be run against the matching published
48
+ package once `0.6.7` is released, without `PYTHONPATH` or an editable checkout:
50
49
 
51
50
  ```sh
52
51
  python3.14 -m venv .venv-examples
53
52
  . .venv-examples/bin/activate
54
- python -m pip install "solverforge[examples]==0.6.6"
53
+ python -m pip install "solverforge[examples]==0.6.7"
55
54
  python examples/nqueens.py
56
55
  python -m examples.solverforge_hospital
57
56
  python -m examples.solverforge_deliveries
@@ -213,7 +212,11 @@ Run `make help` for focused targets such as `make test-hospital`,
213
212
  per-query Python callbacks. Provider-backed value ranges are imported once per
214
213
  variable and shared across rows in Rust-owned state. Row candidate callbacks
215
214
  remain row-specific and define move legality throughout construction and local
216
- search, including assignment-group swaps and rematches.
215
+ search, including assignment-group swaps and rematches. `pinning=True` is
216
+ rejected with `ModelValidationError` rather than ignored: SolverForge pins a
217
+ whole planning entity through an entity-level descriptor predicate, and no
218
+ public bridge seam exposes entity pinning to the Python binding yet. Pin an
219
+ input value by restricting `candidate_values` instead.
217
220
  - `scalar_assignment_group(...)` declares assignment-aware scalar groups for
218
221
  grouped scalar local search and assignment-group construction. Group metadata
219
222
  covers required entities, capacity keys, assignment rules, ordering callbacks,
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "solverforge"
7
- version = "0.6.6"
7
+ version = "0.6.7"
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.6"
43
+ __version__ = "0.6.7"
44
44
 
45
45
  __all__ = [
46
46
  "CallbackError",
@@ -40,7 +40,6 @@ def _collect_fields(cls: type[object]) -> list[dict[str, object]]:
40
40
  "nearby_entity_distance_field": value.metadata.nearby_entity_distance_field,
41
41
  "allows_unassigned": value.metadata.allows_unassigned,
42
42
  "element_collection": value.metadata.element_collection,
43
- "pinning": value.metadata.pinning,
44
43
  "element_owner": value.metadata.element_owner,
45
44
  "element_owner_field": value.metadata.element_owner_field,
46
45
  "construction_element_order_key": value.metadata.construction_element_order_key,
@@ -5,6 +5,8 @@ from dataclasses import dataclass
5
5
  from inspect import Parameter, signature
6
6
  from typing import Any, NamedTuple, TypeAlias
7
7
 
8
+ from .errors import ModelValidationError
9
+
8
10
  MetadataSource = Callable[..., object] | str
9
11
 
10
12
 
@@ -143,7 +145,6 @@ class FieldMetadata:
143
145
  nearby_entity_distance_field: str | None = None
144
146
  allows_unassigned: bool = False
145
147
  element_collection: str | None = None
146
- pinning: bool = False
147
148
  element_owner: Callable[..., object] | None = None
148
149
  element_owner_field: str | None = None
149
150
  construction_element_order_key: Callable[..., object] | None = None
@@ -191,6 +192,14 @@ def planning_variable(
191
192
  allows_unassigned: bool = False,
192
193
  pinning: bool = False,
193
194
  ) -> PlanningField:
195
+ if pinning:
196
+ msg = (
197
+ "planning_variable(pinning=True) is not supported: SolverForge pins a whole "
198
+ "planning entity through an entity-level descriptor predicate, and no public "
199
+ "bridge seam exposes entity pinning to the Python binding yet. Pin an input "
200
+ "value by restricting candidate_values instead."
201
+ )
202
+ raise ModelValidationError(msg)
194
203
  value_candidates = _resolve_metadata_source(
195
204
  nearby_value_candidates, name="nearby_value_candidates"
196
205
  )
@@ -217,7 +226,6 @@ def planning_variable(
217
226
  nearby_entity_distance_meter=entity_distance.callback,
218
227
  nearby_entity_distance_field=entity_distance.field_name,
219
228
  allows_unassigned=allows_unassigned,
220
- pinning=pinning,
221
229
  )
222
230
  )
223
231
 
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