solverforge/lib.rs
1/* SolverForge - A Constraint Solver in Rust
2
3SolverForge is a high-performance constraint satisfaction/optimization solver.
4It helps you optimize planning and scheduling problems.
5
6# Quick Start
7
8```
9use solverforge::prelude::*;
10
11#[problem_fact]
12pub struct Employee {
13#[planning_id]
14pub id: i64,
15pub name: String,
16}
17
18#[planning_entity]
19pub struct Shift {
20#[planning_id]
21pub id: i64,
22#[planning_variable]
23pub employee: Option<i64>,
24}
25
26#[planning_solution]
27pub struct Schedule {
28#[problem_fact_collection]
29pub employees: Vec<Employee>,
30#[planning_entity_collection]
31pub shifts: Vec<Shift>,
32#[planning_score]
33pub score: Option<HardSoftScore>,
34}
35```
36*/
37
38/* ============================================================================
39Attribute Macros
40============================================================================
41*/
42
43pub use solverforge_macros::{planning_entity, planning_solution, problem_fact};
44
45// Derive macros (used by attribute macros, must be at root level)
46pub use solverforge_macros::{PlanningEntityImpl, PlanningSolutionImpl, ProblemFactImpl};
47
48/* ============================================================================
49Score Types
50============================================================================
51*/
52
53pub use solverforge_core::score::{
54 BendableScore, HardMediumSoftScore, HardSoftDecimalScore, HardSoftScore, Score, SoftScore,
55};
56
57/* ============================================================================
58Constraint API
59============================================================================
60*/
61
62pub use solverforge_scoring::{
63 ConstraintSet, IncrementalBiConstraint, IncrementalConstraint, IncrementalUniConstraint,
64};
65
66/// Fluent constraint stream API.
67pub mod stream {
68 pub use solverforge_scoring::stream::collection_extract::vec;
69 pub use solverforge_scoring::stream::collection_extract::{CollectionExtract, VecExtract};
70 pub use solverforge_scoring::stream::{joiner, ConstraintFactory};
71}
72
73/* ============================================================================
74Score Director
75============================================================================
76*/
77
78pub use solverforge_scoring::{Director, ScoreDirector};
79
80/* ============================================================================
81Solver
82============================================================================
83*/
84
85pub use solverforge_solver::heuristic::selector::DefaultDistanceMeter;
86pub use solverforge_solver::CrossEntityDistanceMeter;
87pub use solverforge_solver::{
88 analyze, run_solver, Analyzable, BasicSpec, ConstraintAnalysis, ListSpec, ScoreAnalysis,
89 Solvable, SolverManager, SolverStatus,
90};
91
92/* ============================================================================
93CVRP domain helpers
94============================================================================
95*/
96
97pub mod cvrp {
98 pub use solverforge_cvrp::{
99 capacity, depot_for_cw, depot_for_entity, distance, element_load, get_route,
100 is_kopt_feasible, is_time_feasible, replace_route, MatrixDistanceMeter,
101 MatrixIntraDistanceMeter, ProblemData, VrpSolution,
102 };
103}
104
105/* ============================================================================
106Console Output (feature-gated)
107============================================================================
108*/
109
110#[cfg(feature = "console")]
111pub use solverforge_console as console;
112
113/* ============================================================================
114Prelude
115============================================================================
116*/
117
118pub mod prelude {
119 pub use crate::stream::{joiner, ConstraintFactory};
120 pub use crate::{
121 planning_entity, planning_solution, problem_fact, BendableScore, ConstraintSet, Director,
122 HardMediumSoftScore, HardSoftDecimalScore, HardSoftScore, Score, ScoreDirector, SoftScore,
123 };
124}
125
126/* ============================================================================
127Internal API for Macros
128============================================================================
129*/
130
131// Internal module for macro-generated code. Not part of public API.
132#[doc(hidden)]
133pub mod __internal {
134 // Initializes console output if the feature is enabled.
135 #[inline]
136 pub fn init_console() {
137 #[cfg(feature = "console")]
138 solverforge_console::init();
139 }
140
141 // Derive macros
142 pub use solverforge_macros::{PlanningEntityImpl, PlanningSolutionImpl, ProblemFactImpl};
143
144 // Domain types
145 pub use solverforge_core::domain::{
146 EntityDescriptor, PlanningEntity, PlanningId, PlanningSolution, ProblemFact,
147 ProblemFactDescriptor, ShadowVariableKind, SolutionDescriptor, TypedEntityExtractor,
148 VariableDescriptor,
149 };
150
151 // Scoring
152 pub use solverforge_scoring::{
153 Director, ScoreDirector, ShadowVariableSupport, SolvableSolution,
154 };
155
156 // Solver infrastructure
157 pub use solverforge_solver::heuristic::selector::{
158 DefaultDistanceMeter, FromSolutionEntitySelector,
159 };
160 pub use solverforge_solver::manager::{
161 KOptPhaseBuilder, ListConstructionPhaseBuilder, PhaseFactory, SolverFactory,
162 };
163 pub use solverforge_solver::{BasicSpec, ListSpec};
164
165 // Config
166 pub use solverforge_config::SolverConfig;
167
168 // Stream types needed for macro-generated extension traits
169 pub use solverforge_scoring::stream::filter::{
170 AndUniFilter, FnUniFilter, TrueFilter, UniFilter,
171 };
172 pub use solverforge_scoring::stream::{UniConstraintBuilder, UniConstraintStream};
173}