Skip to content

Commit e08d602

Browse files
authored
Merge pull request #3513 from kosmikus/count-conflicts-2
Count conflicts to speed up solver
2 parents d068a1c + 45c38b9 commit e08d602

File tree

16 files changed

+198
-61
lines changed

16 files changed

+198
-61
lines changed

cabal-install/Distribution/Client/Config.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@ instance Semigroup SavedConfig where
239239
installDryRun = combine installDryRun,
240240
installMaxBackjumps = combine installMaxBackjumps,
241241
installReorderGoals = combine installReorderGoals,
242+
installCountConflicts = combine installCountConflicts,
242243
installIndependentGoals = combine installIndependentGoals,
243244
installShadowPkgs = combine installShadowPkgs,
244245
installStrongFlags = combine installStrongFlags,

cabal-install/Distribution/Client/Dependency.hs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ module Distribution.Client.Dependency (
4848
addPreferences,
4949
setPreferenceDefault,
5050
setReorderGoals,
51+
setCountConflicts,
5152
setIndependentGoals,
5253
setAvoidReinstalls,
5354
setShadowPkgs,
@@ -159,6 +160,7 @@ data DepResolverParams = DepResolverParams {
159160
depResolverInstalledPkgIndex :: InstalledPackageIndex,
160161
depResolverSourcePkgIndex :: PackageIndex.PackageIndex UnresolvedSourcePackage,
161162
depResolverReorderGoals :: ReorderGoals,
163+
depResolverCountConflicts :: CountConflicts,
162164
depResolverIndependentGoals :: IndependentGoals,
163165
depResolverAvoidReinstalls :: AvoidReinstalls,
164166
depResolverShadowPkgs :: ShadowPkgs,
@@ -181,6 +183,7 @@ showDepResolverParams p =
181183
(depResolverPreferences p)
182184
++ "\nstrategy: " ++ show (depResolverPreferenceDefault p)
183185
++ "\nreorder goals: " ++ show (depResolverReorderGoals p)
186+
++ "\ncount conflicts: " ++ show (depResolverCountConflicts p)
184187
++ "\nindependent goals: " ++ show (depResolverIndependentGoals p)
185188
++ "\navoid reinstalls: " ++ show (depResolverAvoidReinstalls p)
186189
++ "\nshadow packages: " ++ show (depResolverShadowPkgs p)
@@ -234,6 +237,7 @@ basicDepResolverParams installedPkgIndex sourcePkgIndex =
234237
depResolverInstalledPkgIndex = installedPkgIndex,
235238
depResolverSourcePkgIndex = sourcePkgIndex,
236239
depResolverReorderGoals = ReorderGoals False,
240+
depResolverCountConflicts = CountConflicts True,
237241
depResolverIndependentGoals = IndependentGoals False,
238242
depResolverAvoidReinstalls = AvoidReinstalls False,
239243
depResolverShadowPkgs = ShadowPkgs False,
@@ -279,6 +283,12 @@ setReorderGoals reorder params =
279283
depResolverReorderGoals = reorder
280284
}
281285

286+
setCountConflicts :: CountConflicts -> DepResolverParams -> DepResolverParams
287+
setCountConflicts count params =
288+
params {
289+
depResolverCountConflicts = count
290+
}
291+
282292
setIndependentGoals :: IndependentGoals -> DepResolverParams -> DepResolverParams
283293
setIndependentGoals indep params =
284294
params {
@@ -621,7 +631,8 @@ resolveDependencies platform comp pkgConfigDB solver params =
621631

622632
Step (showDepResolverParams finalparams)
623633
$ fmap (validateSolverResult platform comp indGoals)
624-
$ runSolver solver (SolverConfig reorderGoals indGoals noReinstalls
634+
$ runSolver solver (SolverConfig reordGoals cntConflicts
635+
indGoals noReinstalls
625636
shadowing strFlags maxBkjumps enableBj order)
626637
platform comp installedPkgIndex sourcePkgIndex
627638
pkgConfigDB preferences constraints targets
@@ -632,7 +643,8 @@ resolveDependencies platform comp pkgConfigDB solver params =
632643
prefs defpref
633644
installedPkgIndex
634645
sourcePkgIndex
635-
reorderGoals
646+
reordGoals
647+
cntConflicts
636648
indGoals
637649
noReinstalls
638650
shadowing
@@ -873,7 +885,7 @@ resolveWithoutDependencies :: DepResolverParams
873885
-> Either [ResolveNoDepsError] [UnresolvedSourcePackage]
874886
resolveWithoutDependencies (DepResolverParams targets constraints
875887
prefs defpref installedPkgIndex sourcePkgIndex
876-
_reorderGoals _indGoals _avoidReinstalls
888+
_reorderGoals _countConflicts _indGoals _avoidReinstalls
877889
_shadowing _strFlags _maxBjumps _enableBj _order) =
878890
collectEithers (map selectPackage targets)
879891
where

cabal-install/Distribution/Client/Fetch.hs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,8 @@ planPackages verbosity comp platform fetchFlags
158158

159159
. setReorderGoals reorderGoals
160160

161+
. setCountConflicts countConflicts
162+
161163
. setShadowPkgs shadowPkgs
162164

163165
. setStrongFlags strongFlags
@@ -174,6 +176,7 @@ planPackages verbosity comp platform fetchFlags
174176
logMsg message rest = debug verbosity message >> rest
175177

176178
reorderGoals = fromFlag (fetchReorderGoals fetchFlags)
179+
countConflicts = fromFlag (fetchCountConflicts fetchFlags)
177180
independentGoals = fromFlag (fetchIndependentGoals fetchFlags)
178181
shadowPkgs = fromFlag (fetchShadowPkgs fetchFlags)
179182
strongFlags = fromFlag (fetchStrongFlags fetchFlags)

cabal-install/Distribution/Client/Freeze.hs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,8 @@ planPackages verbosity comp platform mSandboxPkgInfo freezeFlags
179179

180180
. setReorderGoals reorderGoals
181181

182+
. setCountConflicts countConflicts
183+
182184
. setShadowPkgs shadowPkgs
183185

184186
. setStrongFlags strongFlags
@@ -201,6 +203,7 @@ planPackages verbosity comp platform mSandboxPkgInfo freezeFlags
201203
benchmarksEnabled = fromFlagOrDefault False $ freezeBenchmarks freezeFlags
202204

203205
reorderGoals = fromFlag (freezeReorderGoals freezeFlags)
206+
countConflicts = fromFlag (freezeCountConflicts freezeFlags)
204207
independentGoals = fromFlag (freezeIndependentGoals freezeFlags)
205208
shadowPkgs = fromFlag (freezeShadowPkgs freezeFlags)
206209
strongFlags = fromFlag (freezeStrongFlags freezeFlags)

cabal-install/Distribution/Client/Install.hs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,8 @@ planPackages comp platform mSandboxPkgInfo solver
379379

380380
. setReorderGoals reorderGoals
381381

382+
. setCountConflicts countConflicts
383+
382384
. setAvoidReinstalls avoidReinstalls
383385

384386
. setShadowPkgs shadowPkgs
@@ -431,6 +433,7 @@ planPackages comp platform mSandboxPkgInfo solver
431433
reinstall = fromFlag (installOverrideReinstall installFlags) ||
432434
fromFlag (installReinstall installFlags)
433435
reorderGoals = fromFlag (installReorderGoals installFlags)
436+
countConflicts = fromFlag (installCountConflicts installFlags)
434437
independentGoals = fromFlag (installIndependentGoals installFlags)
435438
avoidReinstalls = fromFlag (installAvoidReinstalls installFlags)
436439
shadowPkgs = fromFlag (installShadowPkgs installFlags)

cabal-install/Distribution/Client/ProjectConfig.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ resolveSolverSettings ProjectConfig{
196196
n | n < 0 -> Nothing
197197
| otherwise -> Just n
198198
solverSettingReorderGoals = fromFlag projectConfigReorderGoals
199+
solverSettingCountConflicts = fromFlag projectConfigCountConflicts
199200
solverSettingStrongFlags = fromFlag projectConfigStrongFlags
200201
--solverSettingIndependentGoals = fromFlag projectConfigIndependentGoals
201202
--solverSettingShadowPkgs = fromFlag projectConfigShadowPkgs
@@ -211,6 +212,7 @@ resolveSolverSettings ProjectConfig{
211212
projectConfigAllowNewer = Just AllowNewerNone,
212213
projectConfigMaxBackjumps = Flag defaultMaxBackjumps,
213214
projectConfigReorderGoals = Flag (ReorderGoals False),
215+
projectConfigCountConflicts = Flag (CountConflicts True),
214216
projectConfigStrongFlags = Flag (StrongFlags False)
215217
--projectConfigIndependentGoals = Flag False,
216218
--projectConfigShadowPkgs = Flag False,

cabal-install/Distribution/Client/ProjectConfig/Legacy.hs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,7 @@ convertLegacyAllPackageFlags globalFlags configFlags
303303
installMaxBackjumps = projectConfigMaxBackjumps,
304304
--installUpgradeDeps = projectConfigUpgradeDeps,
305305
installReorderGoals = projectConfigReorderGoals,
306+
installCountConflicts = projectConfigCountConflicts,
306307
--installIndependentGoals = projectConfigIndependentGoals,
307308
--installShadowPkgs = projectConfigShadowPkgs,
308309
installStrongFlags = projectConfigStrongFlags
@@ -495,6 +496,7 @@ convertToLegacySharedConfig
495496
installMaxBackjumps = projectConfigMaxBackjumps,
496497
installUpgradeDeps = mempty, --projectConfigUpgradeDeps,
497498
installReorderGoals = projectConfigReorderGoals,
499+
installCountConflicts = projectConfigCountConflicts,
498500
installIndependentGoals = mempty, --projectConfigIndependentGoals,
499501
installShadowPkgs = mempty, --projectConfigShadowPkgs,
500502
installStrongFlags = projectConfigStrongFlags,
@@ -827,7 +829,7 @@ legacySharedConfigFieldDescrs =
827829
, "remote-build-reporting", "report-planning-failure"
828830
, "one-shot", "jobs", "keep-going", "offline"
829831
-- solver flags:
830-
, "max-backjumps", "reorder-goals", "strong-flags"
832+
, "max-backjumps", "reorder-goals", "count-conflicts", "strong-flags"
831833
]
832834
. commandOptionsToFields
833835
) (installOptions ParseArgs)

cabal-install/Distribution/Client/ProjectConfig/Types.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ data ProjectConfigShared
165165
projectConfigAllowNewer :: Maybe AllowNewer,
166166
projectConfigMaxBackjumps :: Flag Int,
167167
projectConfigReorderGoals :: Flag ReorderGoals,
168+
projectConfigCountConflicts :: Flag CountConflicts,
168169
projectConfigStrongFlags :: Flag StrongFlags
169170

170171
-- More things that only make sense for manual mode, not --local mode
@@ -319,6 +320,7 @@ data SolverSettings
319320
solverSettingAllowNewer :: AllowNewer,
320321
solverSettingMaxBackjumps :: Maybe Int,
321322
solverSettingReorderGoals :: ReorderGoals,
323+
solverSettingCountConflicts :: CountConflicts,
322324
solverSettingStrongFlags :: StrongFlags
323325
-- Things that only make sense for manual mode, not --local mode
324326
-- too much control!

cabal-install/Distribution/Client/ProjectPlanning.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -865,6 +865,8 @@ planPackages comp platform solver SolverSettings{..}
865865

866866
. setReorderGoals solverSettingReorderGoals
867867

868+
. setCountConflicts solverSettingCountConflicts
869+
868870
--TODO: [required eventually] should only be configurable for custom installs
869871
-- . setAvoidReinstalls solverSettingAvoidReinstalls
870872

cabal-install/Distribution/Client/Setup.hs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -606,6 +606,7 @@ data FetchFlags = FetchFlags {
606606
fetchSolver :: Flag PreSolver,
607607
fetchMaxBackjumps :: Flag Int,
608608
fetchReorderGoals :: Flag ReorderGoals,
609+
fetchCountConflicts :: Flag CountConflicts,
609610
fetchIndependentGoals :: Flag IndependentGoals,
610611
fetchShadowPkgs :: Flag ShadowPkgs,
611612
fetchStrongFlags :: Flag StrongFlags,
@@ -620,6 +621,7 @@ defaultFetchFlags = FetchFlags {
620621
fetchSolver = Flag defaultSolver,
621622
fetchMaxBackjumps = Flag defaultMaxBackjumps,
622623
fetchReorderGoals = Flag (ReorderGoals False),
624+
fetchCountConflicts = Flag (CountConflicts True),
623625
fetchIndependentGoals = Flag (IndependentGoals False),
624626
fetchShadowPkgs = Flag (ShadowPkgs False),
625627
fetchStrongFlags = Flag (StrongFlags False),
@@ -666,6 +668,7 @@ fetchCommand = CommandUI {
666668
optionSolverFlags showOrParseArgs
667669
fetchMaxBackjumps (\v flags -> flags { fetchMaxBackjumps = v })
668670
fetchReorderGoals (\v flags -> flags { fetchReorderGoals = v })
671+
fetchCountConflicts (\v flags -> flags { fetchCountConflicts = v })
669672
fetchIndependentGoals (\v flags -> flags { fetchIndependentGoals = v })
670673
fetchShadowPkgs (\v flags -> flags { fetchShadowPkgs = v })
671674
fetchStrongFlags (\v flags -> flags { fetchStrongFlags = v })
@@ -683,6 +686,7 @@ data FreezeFlags = FreezeFlags {
683686
freezeSolver :: Flag PreSolver,
684687
freezeMaxBackjumps :: Flag Int,
685688
freezeReorderGoals :: Flag ReorderGoals,
689+
freezeCountConflicts :: Flag CountConflicts,
686690
freezeIndependentGoals :: Flag IndependentGoals,
687691
freezeShadowPkgs :: Flag ShadowPkgs,
688692
freezeStrongFlags :: Flag StrongFlags,
@@ -697,6 +701,7 @@ defaultFreezeFlags = FreezeFlags {
697701
freezeSolver = Flag defaultSolver,
698702
freezeMaxBackjumps = Flag defaultMaxBackjumps,
699703
freezeReorderGoals = Flag (ReorderGoals False),
704+
freezeCountConflicts = Flag (CountConflicts True),
700705
freezeIndependentGoals = Flag (IndependentGoals False),
701706
freezeShadowPkgs = Flag (ShadowPkgs False),
702707
freezeStrongFlags = Flag (StrongFlags False),
@@ -742,6 +747,7 @@ freezeCommand = CommandUI {
742747
optionSolverFlags showOrParseArgs
743748
freezeMaxBackjumps (\v flags -> flags { freezeMaxBackjumps = v })
744749
freezeReorderGoals (\v flags -> flags { freezeReorderGoals = v })
750+
freezeCountConflicts (\v flags -> flags { freezeCountConflicts = v })
745751
freezeIndependentGoals (\v flags -> flags { freezeIndependentGoals = v })
746752
freezeShadowPkgs (\v flags -> flags { freezeShadowPkgs = v })
747753
freezeStrongFlags (\v flags -> flags { freezeStrongFlags = v })
@@ -1144,6 +1150,7 @@ data InstallFlags = InstallFlags {
11441150
installDryRun :: Flag Bool,
11451151
installMaxBackjumps :: Flag Int,
11461152
installReorderGoals :: Flag ReorderGoals,
1153+
installCountConflicts :: Flag CountConflicts,
11471154
installIndependentGoals :: Flag IndependentGoals,
11481155
installShadowPkgs :: Flag ShadowPkgs,
11491156
installStrongFlags :: Flag StrongFlags,
@@ -1176,6 +1183,7 @@ defaultInstallFlags = InstallFlags {
11761183
installDryRun = Flag False,
11771184
installMaxBackjumps = Flag defaultMaxBackjumps,
11781185
installReorderGoals = Flag (ReorderGoals False),
1186+
installCountConflicts = Flag (CountConflicts True),
11791187
installIndependentGoals= Flag (IndependentGoals False),
11801188
installShadowPkgs = Flag (ShadowPkgs False),
11811189
installStrongFlags = Flag (StrongFlags False),
@@ -1321,6 +1329,7 @@ installOptions showOrParseArgs =
13211329
optionSolverFlags showOrParseArgs
13221330
installMaxBackjumps (\v flags -> flags { installMaxBackjumps = v })
13231331
installReorderGoals (\v flags -> flags { installReorderGoals = v })
1332+
installCountConflicts (\v flags -> flags { installCountConflicts = v })
13241333
installIndependentGoals (\v flags -> flags { installIndependentGoals = v })
13251334
installShadowPkgs (\v flags -> flags { installShadowPkgs = v })
13261335
installStrongFlags (\v flags -> flags { installStrongFlags = v }) ++
@@ -2085,11 +2094,12 @@ optionSolver get set =
20852094
optionSolverFlags :: ShowOrParseArgs
20862095
-> (flags -> Flag Int ) -> (Flag Int -> flags -> flags)
20872096
-> (flags -> Flag ReorderGoals) -> (Flag ReorderGoals -> flags -> flags)
2097+
-> (flags -> Flag CountConflicts) -> (Flag CountConflicts -> flags -> flags)
20882098
-> (flags -> Flag IndependentGoals) -> (Flag IndependentGoals -> flags -> flags)
20892099
-> (flags -> Flag ShadowPkgs) -> (Flag ShadowPkgs -> flags -> flags)
20902100
-> (flags -> Flag StrongFlags) -> (Flag StrongFlags -> flags -> flags)
20912101
-> [OptionField flags]
2092-
optionSolverFlags showOrParseArgs getmbj setmbj getrg setrg _getig _setig getsip setsip getstrfl setstrfl =
2102+
optionSolverFlags showOrParseArgs getmbj setmbj getrg setrg getcc setcc _getig _setig getsip setsip getstrfl setstrfl =
20932103
[ option [] ["max-backjumps"]
20942104
("Maximum number of backjumps allowed while solving (default: " ++ show defaultMaxBackjumps ++ "). Use a negative number to enable unlimited backtracking. Use 0 to disable backtracking completely.")
20952105
getmbj setmbj
@@ -2100,6 +2110,11 @@ optionSolverFlags showOrParseArgs getmbj setmbj getrg setrg _getig _setig getsip
21002110
(fmap asBool . getrg)
21012111
(setrg . fmap ReorderGoals)
21022112
(yesNoOpt showOrParseArgs)
2113+
, option [] ["count-conflicts"]
2114+
"Try to speed up solving by preferring goals that are involved in a lot of conflicts (default)."
2115+
(fmap asBool . getcc)
2116+
(setcc . fmap CountConflicts)
2117+
(yesNoOpt showOrParseArgs)
21032118
-- TODO: Disabled for now because it does not work as advertised (yet).
21042119
{-
21052120
, option [] ["independent-goals"]

0 commit comments

Comments
 (0)