Reference
A practical map of the SolverForge workspace and the companion repos around it.
Crate & Runtime Map
Use this page when you need to decide which crate or companion repository should own a piece of work.
Default starting point
For most application code, depend on solverforge and stay on the facade until
you have a concrete reason to go lower-level.
This map is aligned with the published solverforge 0.15.0 crate and current
release workspace.
The facade re-exports the normal modeling, scoring, projection, configuration,
custom-search, and retained runtime surface, including
solverforge_constraints, Projection, ProjectionSink, SolverConfig,
PhaseConfig, MoveSelectorConfig, SearchContext, CustomSearchPhase,
ScalarGroup, ScalarAssignmentRule, ScalarGroupLimits,
SharedNodeDiagnostics, SharedNodeId, SharedNodeOperation, direct
cross-join .group_by(|left, right| key, collector), cross-join
.project(|left, right| row) projected scoring, direct cross-join grouped
complements, projected grouped complements, score weight helpers such as
fixed_weight and hard_weight, collector helpers such as count, sum,
load_balance, consecutive_runs, collect_vec, and indexed_presence,
plus advanced grouped-scalar assignment, conflict-repair extension types,
move-label telemetry, bounded applied-move traces, and owner-aware CVRP route
helpers such as
route_metric_class, route_distance, and route_feasible. That keeps app
code on solverforge unless it needs to implement lower-level solver internals
directly.
Workspace crates
| Crate | Owns | Reach for it when… |
|---|---|---|
solverforge |
the public facade and re-exports | you are building an app and want the normal public API |
solverforge-core |
score types, descriptors, domain traits | you are extending lower-level abstractions or implementing core-facing helpers |
solverforge-macros |
#[planning_solution], #[planning_entity], #[problem_fact], #[solverforge_constraints] |
you need derive behavior, model glue, or constraint-function compilation |
solverforge-scoring |
constraint streams, incremental scoring, and shared grouped node state | you are working directly on scoring internals or advanced scoring extensions |
solverforge-config |
TOML/YAML config parsing, selector config, acceptor config, and builders | you need direct config construction or parsing outside the stock solve path |
solverforge-solver |
phases, move selectors, acceptors, retained lifecycle, and telemetry | you are building custom runtime behavior beyond facade-level use |
solverforge-console |
tracing-driven console output | you want the standard terminal UX or progress formatting |
solverforge-cvrp |
CVRP-specific helpers and distance utilities | your problem is route-centric and the domain benefits from these helpers |
Companion repositories
| Repo | Owns | Use it when… |
|---|---|---|
solverforge-cli |
scaffolding and code generation | you are starting a new app or extending a generated shell |
solverforge-py |
the solverforge Python package and PyO3 binding |
you want Python model authoring backed by the Rust solver engine |
solverforge-ui |
retained-job frontend controls and scheduling-facing components | you need a web UI around a retained solve lifecycle |
solverforge-maps |
road networks, routing, matrices, and map-backed planning helpers | you need route costs, geometry, or spatial planning support |
Practical dependency rules
- Start with
solverforge-clito scaffold the app shell. - Start with the PyPI
solverforgepackage when the application surface is Python and you do not need a generated Rust web/API/CLI shell. - Keep application code on the
solverforgefacade unless a lower-level crate unlocks something you actually need. - Keep scalar/list model declarations in the
planning_model!manifest and variable attributes; solver config consumes declared hooks rather than inferring nearby or construction-order behavior. - Keep reusable grouped constraint work inside a
#[solverforge_constraints]function; do not add app-level caches or public sharing helpers. - Add
solverforge-uionly if the product needs retained-job UI flows. - Add
solverforge-mapsonly if routing or map-backed costs are part of the planning model. - Use
solverforge-pyfor Python classes, decorators, callbacks, and retained jobs over the native Rust engine. - Reach into
solverforge-solverdirectly only when configuration and the public facade stop being enough.
Typical stacks
| Scenario | Typical stack |
|---|---|
| service or CLI planner | solverforge-cli scaffold + solverforge |
| Python-authored planner | PyPI solverforge package from solverforge-py |
| web app with retained lifecycle UI | solverforge-cli + solverforge + solverforge-ui |
| routing or fleet optimization | solverforge-cli + solverforge + solverforge-maps |
| research or advanced runtime work | solverforge plus selected lower-level crates |
What not to do
- Do not start on the lowest-level crates unless the public API is clearly insufficient.
- Do not push app-specific business rules into SolverForge crates just because the extension point exists.
- Do not treat
solverforge-uiorsolverforge-mapsas part of this repository’s workspace; they are companion repos with their own release lines.See also
- SolverForge docs
- SolverForge Python docs
- Integration Boundaries
- Modeling Cheat Sheet