Skip to content

Commit e42fe45

Browse files
committed
Make it possible to choose resolvo with --solver-to-run
Signed-off-by: J Robert Ray <[email protected]>
1 parent 22e8029 commit e42fe45

File tree

7 files changed

+65
-44
lines changed

7 files changed

+65
-44
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/spk-cli/cmd-test/src/test/build.rs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ where
3838

3939
impl<Solver> PackageBuildTester<Solver>
4040
where
41-
Solver: AbstractSolverExt + AbstractSolverMut + Default + Send,
41+
Solver: AbstractSolverExt + AbstractSolverMut + Clone + Send,
4242
{
4343
pub fn new(recipe: SpecRecipe, script: String, solver: Solver) -> Self {
4444
let source =
@@ -109,22 +109,22 @@ where
109109
}
110110
}
111111

112-
self.solver.set_binary_only(true);
113-
self.solver.update_options(self.options.clone());
112+
// Use a clone of the solver before changing settings so
113+
// `resolve_source_package` can do the same.
114+
let mut solver = self.solver.clone();
115+
solver.set_binary_only(true);
116+
solver.update_options(self.options.clone());
114117
for repo in self.repos.iter().cloned() {
115-
self.solver.add_repository(repo);
118+
solver.add_repository(repo);
116119
}
117120
// TODO
118121
// solver.configure_for_build_environment(&self.recipe)?;
119122
for request in self.additional_requirements.drain(..) {
120-
self.solver.add_request(request)
123+
solver.add_request(request)
121124
}
122125

123126
// let (solution, _) = self.build_resolver.solve(&solver).await?;
124-
let solution = self
125-
.solver
126-
.run_and_print_resolve(&self.build_formatter)
127-
.await?;
127+
let solution = solver.run_and_print_resolve(&self.build_formatter).await?;
128128

129129
for layer in resolve_runtime_layers(requires_localization, &solution).await? {
130130
rt.push_digest(layer);
@@ -150,7 +150,9 @@ where
150150
}
151151

152152
async fn resolve_source_package(&mut self, package: &AnyIdent) -> Result<Solution> {
153-
let mut solver = Solver::default();
153+
// Use a clone of the solver before changing settings so `test` can do
154+
// the same.
155+
let mut solver = self.solver.clone();
154156
solver.update_options(self.options.clone());
155157
let local_repo: Arc<storage::RepositoryHandle> =
156158
Arc::new(storage::local_repository().await?.into());
@@ -180,7 +182,7 @@ where
180182
#[async_trait::async_trait]
181183
impl<Solver> Tester for PackageBuildTester<Solver>
182184
where
183-
Solver: AbstractSolverExt + AbstractSolverMut + Default + Send,
185+
Solver: AbstractSolverExt + AbstractSolverMut + Clone + Send,
184186
{
185187
async fn test(&mut self) -> Result<()> {
186188
PackageBuildTester::test(self).await

crates/spk-cli/common/src/exec.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ use crate::Result;
1818
/// Returns a new solution of only binary packages.
1919
pub async fn build_required_packages<Solver>(
2020
solution: &Solution,
21-
_solver: Solver,
21+
solver: Solver,
2222
) -> Result<Solution>
2323
where
24-
Solver: AbstractSolverExt + AbstractSolverMut + Default,
24+
Solver: AbstractSolverExt + AbstractSolverMut + Clone,
2525
{
2626
let handle: storage::RepositoryHandle = storage::local_repository().await?.into();
2727
let local_repo = Arc::new(handle);
@@ -43,7 +43,7 @@ where
4343
options.format_option_map()
4444
);
4545
let (package, components) =
46-
BinaryPackageBuilder::from_recipe_with_solver((**recipe).clone(), Solver::default())
46+
BinaryPackageBuilder::from_recipe_with_solver((**recipe).clone(), solver.clone())
4747
.with_repositories(repos.clone())
4848
.build_and_publish(&options, &*local_repo)
4949
.await?;

crates/spk-cli/common/src/flags.rs

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ use spk_schema::option_map::HOST_OPTIONS;
3636
use spk_schema::{Recipe, SpecFileData, SpecRecipe, Template, TestStage, VariantExt};
3737
#[cfg(feature = "statsd")]
3838
use spk_solve::{get_metrics_client, SPK_RUN_TIME_METRIC};
39-
use spk_solve::{AbstractSolverExt, AbstractSolverMut};
39+
use spk_solve::{AbstractSolverExt, AbstractSolverMut, SolverImpl};
4040
use spk_workspace::FindPackageTemplateResult;
4141
pub use variant::{Variant, VariantBuildStatus, VariantLocation};
4242
use {spk_solve as solve, spk_storage as storage};
@@ -264,27 +264,34 @@ impl Solver {
264264
pub async fn get_solver(
265265
&self,
266266
options: &Options,
267-
) -> Result<impl AbstractSolverExt + AbstractSolverMut + Clone + Default> {
267+
) -> Result<impl AbstractSolverExt + AbstractSolverMut + Clone> {
268268
let option_map = options.get_options()?;
269269

270-
//let mut solver = solve::Solver::default();
271-
let mut solver = solve::cdcl_solver::Solver::default();
270+
let mut solver = match self.decision_formatter_settings.solver_to_run {
271+
SolverToRun::Resolvo => SolverImpl::Cdcl(solve::cdcl_solver::Solver::default()),
272+
_ => {
273+
let mut solver = solve::Solver::default();
274+
// These settings are only applicable to the Og solver.
275+
solver.set_initial_request_impossible_checks(
276+
self.check_impossible_initial || self.check_impossible_all,
277+
);
278+
solver.set_resolve_validation_impossible_checks(
279+
self.check_impossible_validation || self.check_impossible_all,
280+
);
281+
solver.set_build_key_impossible_checks(
282+
self.check_impossible_builds || self.check_impossible_all,
283+
);
284+
SolverImpl::Og(solver)
285+
}
286+
};
287+
272288
solver.update_options(option_map);
273289

274290
for (name, repo) in self.repos.get_repos_for_non_destructive_operation().await? {
275291
tracing::debug!(repo=%name, "using repository");
276292
solver.add_repository(repo);
277293
}
278294
solver.set_binary_only(!self.allow_builds);
279-
//solver.set_initial_request_impossible_checks(
280-
// self.check_impossible_initial || self.check_impossible_all,
281-
//);
282-
//solver.set_resolve_validation_impossible_checks(
283-
// self.check_impossible_validation || self.check_impossible_all,
284-
//);
285-
//solver.set_build_key_impossible_checks(
286-
// self.check_impossible_builds || self.check_impossible_all,
287-
//);
288295

289296
Ok(solver)
290297
}
@@ -1123,17 +1130,22 @@ pub enum SolverToRun {
11231130
Cli,
11241131
/// Run and show output from the "impossible requests" checking solver
11251132
Checks,
1126-
/// Run both solvers, showing the output from the basic solver,
1127-
/// unless overridden with --solver-to-run
1133+
/// Run both "cli" and "checks" solvers, showing the output from the "cli"
1134+
/// solver, unless overridden with --solver-to-run
11281135
All,
1136+
/// Run the Resolvo-based SAT solver
1137+
Resolvo,
11291138
}
11301139

11311140
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum)]
11321141
pub enum SolverToShow {
1133-
/// Show output from the basic solver
1142+
/// Show output from the basic solver.
11341143
Cli,
1135-
/// Show output from the "impossible requests" checking solver
1144+
/// Show output from the "impossible requests" checking solver.
11361145
Checks,
1146+
/// Show output from the Resolvo SAT solver. This is only possible when
1147+
/// running with that solver.
1148+
Resolvo,
11371149
}
11381150

11391151
impl From<SolverToRun> for MultiSolverKind {
@@ -1142,6 +1154,7 @@ impl From<SolverToRun> for MultiSolverKind {
11421154
SolverToRun::Cli => MultiSolverKind::Unchanged,
11431155
SolverToRun::Checks => MultiSolverKind::AllImpossibleChecks,
11441156
SolverToRun::All => MultiSolverKind::All,
1157+
SolverToRun::Resolvo => MultiSolverKind::Resolvo,
11451158
}
11461159
}
11471160
}
@@ -1151,6 +1164,7 @@ impl From<SolverToShow> for MultiSolverKind {
11511164
match item {
11521165
SolverToShow::Cli => MultiSolverKind::Unchanged,
11531166
SolverToShow::Checks => MultiSolverKind::AllImpossibleChecks,
1167+
SolverToShow::Resolvo => MultiSolverKind::Resolvo,
11541168
}
11551169
}
11561170
}

crates/spk-solve/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ spk-solve-solution = { workspace = true }
5656
spk-solve-validation = { workspace = true }
5757
spk-storage = { workspace = true }
5858
statsd = { version = "0.15.0", optional = true }
59+
strum = { workspace = true }
5960
thiserror = { workspace = true }
6061
tokio = { workspace = true, features = ["rt"] }
6162
tracing = { workspace = true }

crates/spk-solve/src/abstract_solver.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ use variantly::Variantly;
1414
use crate::{DecisionFormatter, Result};
1515

1616
#[enum_dispatch(AbstractSolver, AbstractSolverExt, AbstractSolverMut)]
17+
// Don't derive Default. If some code is generic on AbstractSolver and is given
18+
// one of these, if it wants a "default" solver it needs to be given a new
19+
// solver of the same variety and `SolverImpl::default()` can't do that.
1720
#[derive(Clone, Variantly)]
1821
pub enum SolverImpl {
1922
Og(crate::Solver),

crates/spk-solve/src/io.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
use std::cmp::max;
66
use std::collections::VecDeque;
7-
use std::fmt::{Display, Write};
7+
use std::fmt::Write;
88
use std::fs::{File, OpenOptions};
99
use std::io::{BufWriter, ErrorKind, Write as IOWrite};
1010
use std::path::{Path, PathBuf};
@@ -67,6 +67,7 @@ const BY_USER: &str = "by user";
6767
const CLI_SOLVER: &str = "cli";
6868
const IMPOSSIBLE_CHECKS_SOLVER: &str = "check";
6969
const ALL_SOLVERS: &str = "all";
70+
const RESOLVO_SOLVER: &str = "resolvo";
7071

7172
const UNABLE_TO_GET_OUTPUT_FILE_LOCK: &str = "Unable to get lock to write solver output to file";
7273
const UNABLE_TO_WRITE_OUTPUT_MESSAGE: &str = "Unable to write solver output message to file";
@@ -1038,14 +1039,22 @@ enum LoopOutcome {
10381039
Success,
10391040
}
10401041

1041-
#[derive(PartialEq, Eq, Clone, Debug, Default)]
1042+
#[derive(PartialEq, Eq, Clone, Debug, Default, strum::Display)]
10421043
pub enum MultiSolverKind {
1044+
#[strum(to_string = "Unchanged")]
10431045
Unchanged,
1046+
#[strum(to_string = "All Impossible Checks")]
10441047
AllImpossibleChecks,
10451048
// This isn't a solver on its own. It indicates: the run all the
10461049
// solvers in parallel but show the output from the unchanged one.
1050+
// This runs all the solvers implemented in the original solver. At least
1051+
// for now, it is not possible to run both the original solver and the
1052+
// new solver in parallel.
10471053
#[default]
1054+
#[strum(to_string = "All")]
10481055
All,
1056+
#[strum(to_string = "Resolvo")]
1057+
Resolvo,
10491058
}
10501059

10511060
impl MultiSolverKind {
@@ -1060,6 +1069,7 @@ impl MultiSolverKind {
10601069
MultiSolverKind::Unchanged => CLI_SOLVER,
10611070
MultiSolverKind::AllImpossibleChecks => IMPOSSIBLE_CHECKS_SOLVER,
10621071
MultiSolverKind::All => ALL_SOLVERS,
1072+
MultiSolverKind::Resolvo => RESOLVO_SOLVER,
10631073
}
10641074
}
10651075

@@ -1087,17 +1097,6 @@ impl MultiSolverKind {
10871097
}
10881098
}
10891099

1090-
impl Display for MultiSolverKind {
1091-
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1092-
let name = match self {
1093-
MultiSolverKind::Unchanged => "Unchanged",
1094-
MultiSolverKind::AllImpossibleChecks => "All Impossible Checks",
1095-
MultiSolverKind::All => "All",
1096-
};
1097-
write!(f, "{name}")
1098-
}
1099-
}
1100-
11011100
struct SolverTaskSettings {
11021101
solver: Solver,
11031102
solver_kind: MultiSolverKind,
@@ -1233,6 +1232,7 @@ impl DecisionFormatter {
12331232
ignore_failure: false,
12341233
},
12351234
]),
1235+
MultiSolverKind::Resolvo => unreachable!(),
12361236
}
12371237
}
12381238

0 commit comments

Comments
 (0)