solverforge-solver
solverforge-solver contains SolverForge's runtime phase assembly, move
implementations, selector builders, construction heuristics, local search, and
retained solver lifecycle.
Grouped Scalar Reachability
Normal scalar construction is single-slot: each nullable scalar variable is
assigned independently through its descriptor/runtime scalar binding. That
behavior remains the default whenever a construction heuristic has no
group_name.
Use grouped scalar construction when a model has nullable scalar variables that
must change together before a hard-feasible state is reachable. A model declares
named ScalarGroupContext entries, and a construction heuristic opts in with
group_name. The grouped route evaluates a whole ScalarGroupCandidate as one
compound scalar move, applies all legal edits atomically, and marks every
touched scalar slot complete through the normal committed mutation path.
GroupedScalarMoveSelector exposes the same declared groups during local search.
It is a first-class scalar neighborhood, not cartesian-product composition.
Compound Conflict Repair
CompoundConflictRepairMoveSelector is the stock conflict-aware repair
primitive. Domain providers still supply candidate edit hints, but the framework
owns selector limits, duplicate filtering, legality checks, not-doable filtering,
hard-improvement filtering, scoring, tabu identity, and affected-entity
reporting through CompoundScalarMove.
Configured constraint keys resolve against scoring metadata by exact identity:
package-qualified constraints use ConstraintRef::full_name() strings, while
package-less constraints use the short name.
This keeps app-specific logic as domain candidate generation only. Applications should not add seed repair, relaxed hard constraints, fake variables, or private solver orchestration to make coupled scalar states reachable.