Type Alias: WorkerParameters
WorkerParameters: {
cumulPropagationLevel:number;fdsAdditionalStepRatio:number;fdsBothFailRewardFactor:number;fdsBranchOnObjective:boolean;fdsBranchOrdering:"FailureFirst"|"FailureLast"|"Random";fdsDualResetRatings:boolean;fdsDualStrategy:"Minimum"|"Random"|"Split";fdsEpsilon:number;fdsEventTimeInfluence:number;fdsFixedAlpha:number;fdsInitialRating:number;fdsInitialRestartLimit:number;fdsLengthStepRatio:number;fdsMaxCounterAfterRestart:number;fdsMaxCounterAfterSolution:number;fdsMaxInitialChoicesPerVariable:number;fdsMaxInitialLengthChoices:number;fdsMinIntVarChoiceStep:number;fdsMinLengthChoiceStep:number;fdsPresenceStatusChoices:boolean;fdsRatingAverageComparison:"Off"|"Global"|"Depth";fdsRatingAverageLength:number;fdsReductionFactor:"Normal"|"Zero"|"Random";fdsReductionWeight:number;fdsResetRestartsAfterSolution:boolean;fdsRestartGrowthFactor:number;fdsRestartStrategy:"Geometric"|"Nested"|"Luby";fdsReuseClosing:boolean;fdsStrongBranchingCriterion:"Both"|"Left"|"Right";fdsStrongBranchingDepth:number;fdsStrongBranchingSize:number;fdsUniformChoiceStep:boolean;fdsUseNogoods:boolean;integralPropagationLevel:number;lnsUseWarmStartOnly:boolean;noOverlapPropagationLevel:number;positionPropagationLevel:number;propagationTraceLevel:number;randomSeed:number;reservoirPropagationLevel:number;searchTraceLevel:number;searchType:"Auto"|"LNS"|"FDS"|"FDSDual"|"SetTimes"|"FDSLB";simpleLBMaxIterations:number;simpleLBShavingRounds:number;simpleLBWorker:number; }
Type declaration
Failure-Directed Search
fdsAdditionalStepRatio?
optionalfdsAdditionalStepRatio:number
Domain split ratio when run out of choices
Remarks
When all choices are decided, and a greedy algorithm cannot find a solution, then more choices are generated by splitting domains into the specified number of pieces.
The parameter takes a floating point value in range 2.0..Infinity.
The default value is 7.
fdsBothFailRewardFactor?
optionalfdsBothFailRewardFactor:number
How much to improve rating when both branches fail immediately
Remarks
This parameter sets a bonus reward for a choice when both left and right branches fail immediately. Current rating of both branches is multiplied by the specified value.
The parameter takes a floating point value in range 0..1.
The default value is 0.98.
fdsBranchOnObjective?
optionalfdsBranchOnObjective:boolean
Whether to generate choices for objective expression/variable
Remarks
This option controls the generation of choices on the objective. It works regardless of the objective is given by an expression or a variable.
The default value is False.
fdsBranchOrdering?
optionalfdsBranchOrdering:"FailureFirst"|"FailureLast"|"Random"
Controls which side of a choice is explored first (considering the rating).
Remarks
This option can take the following values:
FailureFirst: Explore the failure side first.FailureLast: Explore the failure side last.Random: Explore either side randomly.
The default value is FailureFirst.
fdsDualResetRatings?
optionalfdsDualResetRatings:boolean
Whether to reset ratings when a new LB is proved
Remarks
When this parameter is on, and FDSDual proves a new lower bound, then all ratings are reset to default values.
The default value is False.
fdsDualStrategy?
optionalfdsDualStrategy:"Minimum"|"Random"|"Split"
A strategy to choose objective cuts during FDSDual search.
Remarks
Possible values are:
Minimum: Always change the cut by the minimum amount.Random: At each restart, randomly choose a value in range LB..UB. The default.Split: Always split the current range LB..UB in half.
The default value is Random.
fdsEpsilon?
optionalfdsEpsilon:number
How often to chose a choice randomly
Remarks
Probability that a choice is taken randomly. A randomly selected choice is not added to the search tree automatically. Instead, the choice is tried, its rating is updated, but it is added to the search tree only if one of the branches fails. The mechanism is similar to strong branching.
The parameter takes a floating point value in range 0.0..0.99999.
The default value is 0.1.
fdsEventTimeInfluence?
optionalfdsEventTimeInfluence:number
Influence of event time to initial choice rating
Remarks
When non-zero, the initial choice rating is influenced by the date of the choice. This way, very first choices in the search should be taken chronologically.
The parameter takes a floating point value in range 0..1.
The default value is 0.
fdsFixedAlpha?
optionalfdsFixedAlpha:number
When non-zero, alpha factor for rating updates
Remarks
When this parameter is set to a non-zero, parameter FDSRatingAverageLength is ignored. Instead, the rating of a branch is computed as an exponential moving average with the given parameter alpha.
The parameter takes a floating point value in range 0..1.
The default value is 0.
fdsInitialRating?
optionalfdsInitialRating:number
Initial rating for newly created choices
Remarks
Default rating for newly created choices. Both left and right branches get the same rating. Choice is initially permuted so that bigger domain change is the left branch.
The parameter takes a floating point value in range 0.0..2.0.
The default value is 0.5.
fdsInitialRestartLimit?
optionalfdsInitialRestartLimit:number
Fail limit for the first restart
Remarks
Failure-directed search is periodically restarted: explored part of the current search tree is turned into a no-good constraint, and the search starts again in the root node. This parameter specifies the size of the very first search tree (measured in number of failures).
The parameter takes an integer value in range 1..9223372036854775807.
The default value is 100.
fdsLengthStepRatio?
optionalfdsLengthStepRatio:number
Choice step relative to average length
Remarks
Ratio of initial choice step size to the minimum length of interval variable. When FDSUniformChoiceStep is set, this ratio is used to compute global choice step using the average of interval var length. When FDSUniformChoiceStep is not set, this ratio is used to compute the choice step for every interval var individually.
The parameter takes a floating point value in range 0.0..Infinity.
The default value is 0.699999988079071.
fdsMaxCounterAfterRestart?
optionalfdsMaxCounterAfterRestart:number
Truncate choice use counts after a restart to this value
Remarks
The idea is that ratings learned in the previous restart are less valid in the new restart. Using this parameter, it is possible to truncate use counts on choices so that new local ratings will have bigger weights (when FDSFixedAlpha is not used).
The parameter takes an integer value.
The default value is 255.
fdsMaxCounterAfterSolution?
optionalfdsMaxCounterAfterSolution:number
Truncate choice use counts after a solution is found
Remarks
Similar to Parameters.fdsMaxCounterAfterRestart, this parameter allows truncating use counts on choices when a solution is found.
The parameter takes an integer value.
The default value is 255.
fdsMaxInitialChoicesPerVariable?
optionalfdsMaxInitialChoicesPerVariable:number
Maximum number of choices generated initially per a variable
Remarks
Initial domains are often very large (e.g., 0..IntervalMax). Therefore initial
number of generated choices is limited: only choices near startMin are kept.
The parameter takes an integer value in range 2..2147483647.
The default value is 90.
fdsMaxInitialLengthChoices?
optionalfdsMaxInitialLengthChoices:number
Maximum number of initial choices on length of an interval variable
Remarks
When non-zero, this parameter limits the number of initial choices generated on length of an interval variable. When zero (the default), no choices on length are generated.
The parameter takes an integer value in range 0..2147483647.
The default value is 0.
fdsMinIntVarChoiceStep?
optionalfdsMinIntVarChoiceStep:number
Minimum step when generating choices for integer variables.
Remarks
Steps between choices for integer variables are never smaller than the specified value.
The parameter takes an integer value in range 1..1073741823.
The default value is 1073741823.
fdsMinLengthChoiceStep?
optionalfdsMinLengthChoiceStep:number
Maximum step when generating initial choices for length of an interval variable
Remarks
Steps between choices for length of an interval variable are never bigger than the specified value.
The parameter takes an integer value in range 1..1073741823.
The default value is 1073741823.
fdsPresenceStatusChoices?
optionalfdsPresenceStatusChoices:boolean
Whether to generate choices on presence status
Remarks
Choices on start time also include a choice on presence status. Therefore, dedicated choices on presence status only are not mandatory.
The default value is True.
fdsRatingAverageComparison?
optionalfdsRatingAverageComparison:"Off"|"Global"|"Depth"
Whether to compare the local rating with the average
Remarks
Possible values are:
Off(the default): No comparison is done.Global: Compare with the global average.Depth: Compare with the average on the current search depth
Arithmetic average is used for global and depth averages.
The default value is Off.
fdsRatingAverageLength?
optionalfdsRatingAverageLength:number
Length of average rating computed for choices
Remarks
For the computation of rating of a branch. Arithmetic average is used until the branch is taken at least FDSRatingAverageLength times. After that exponential moving average is used with parameter alpha = 1 - 1 / FDSRatingAverageLength.
The parameter takes an integer value in range 0..254.
The default value is 25.
fdsReductionFactor?
optionalfdsReductionFactor:"Normal"|"Zero"|"Random"
Reduction factor R for rating computation
Remarks
Possible values are:
Normal(the default): Normal reduction factor.Zero: Factor is not used (it is 0 all the time).Random: A random number in the range [0,1] is used instead.
The default value is Normal.
fdsReductionWeight?
optionalfdsReductionWeight:number
Weight of the reduction factor in rating computation
Remarks
When computing the local rating of a branch, multiply reduction factor by the given weight.
The parameter takes a floating point value in range 0.0..Infinity.
The default value is 1.
fdsResetRestartsAfterSolution?
optionalfdsResetRestartsAfterSolution:boolean
Reset restart size after a solution is found (ignored in Luby)
Remarks
When this parameter is set (the default), then restart limit is set back to Parameters.fdsInitialRestartLimit when a solution is found.
The default value is True.
fdsRestartGrowthFactor?
optionalfdsRestartGrowthFactor:number
Growth factor for fail limit after each restart
Remarks
After each restart, the fail limit for the restart is multiplied by the specified factor.
This parameter is ignored when Parameters.fdsRestartStrategy is Luby.
The parameter takes a floating point value in range 1.0..Infinity.
The default value is 1.15.
fdsRestartStrategy?
optionalfdsRestartStrategy:"Geometric"|"Nested"|"Luby"
Restart strategy to use
Remarks
This parameter specifies how the restart limit (maximum number of failures) changes from restart to restart. Possible values are:
Geometric(the default): After each restart, restart limit is multiplied by Parameters.fdsRestartGrowthFactor.Nested: Similar toGeometricbut the limit is changed back to Parameters.fdsInitialRestartLimit each time a new maximum limit is reached.Luby: Luby restart strategy is used. Parameter Parameters.fdsRestartGrowthFactor is ignored.
The default value is Geometric.
fdsReuseClosing?
optionalfdsReuseClosing:boolean
Whether always reuse closing choice
Remarks
Most of the time, FDS reuses closing choice automatically. This parameter enforces it all the time.
The default value is False.
fdsStrongBranchingCriterion?
optionalfdsStrongBranchingCriterion:"Both"|"Left"|"Right"
How to choose the best choice in strong branching
Remarks
Possible values are:
Both: Choose the the choice with best combined rating.Left(the default): Choose the choice with the best rating of the left branch.Right: Choose the choice with the best rating of the right branch.
The default value is Left.
fdsStrongBranchingDepth?
optionalfdsStrongBranchingDepth:number
Up-to what search depth apply strong branching
Remarks
Strong branching is typically used in the root node. This parameter controls the maximum search depth when strong branching is used.
The parameter takes an integer value.
The default value is 6.
fdsStrongBranchingSize?
optionalfdsStrongBranchingSize:number
Number of choices to try in strong branching
Remarks
Strong branching means that instead of taking a choice with the best rating, we take the specified number (FDSStrongBranchingSize) of best choices, try them in dry-run mode, measure their local rating, and then chose the one with the best local rating.
The parameter takes an integer value.
The default value is 10.
fdsUniformChoiceStep?
optionalfdsUniformChoiceStep:boolean
Whether all initial choices have the same step length
Remarks
When set, then initial choices generated on interval variables will have the same step size.
The default value is True.
fdsUseNogoods?
optionalfdsUseNogoods:boolean
Whether to use or not nogood constraints
Remarks
By default, no-good constraint is generated after each restart. This parameter allows to turn no-good constraints off.
The default value is True.
Large Neighborhood Search
lnsUseWarmStartOnly?
optionallnsUseWarmStartOnly:boolean
Use only the user-provided warm start as the initial solution in LNS
Remarks
When this parameter is on, the solver will use only the user-specified warm start solution for the initial solution phase in LNS. If no warm start is provided, the solver will search for its own initial solution as usual.
The default value is False.
Major options
randomSeed?
optionalrandomSeed:number
Random seed
Remarks
The solver breaks ties randomly using a pseudorandom number generator. This parameter sets the seed of the generator.
Note that when Parameters.nbWorkers is more than 1 then there is also another source of randomness: the time it takes for a message to pass from one worker to another. Therefore with 1 worker the solver is deterministic (random behavior depends only on random seed). With more workers the solver is not deterministic.
Even with the same random seed, the solver may behave differently on different platforms. This can be due to different implementations of certain functions such as std::sort.
The parameter takes an integer value.
The default value is 1.
searchType?
optionalsearchType:"Auto"|"LNS"|"FDS"|"FDSDual"|"SetTimes"|"FDSLB"
Type of search to use
Remarks
This parameter controls which search algorithm the solver uses. Different search types have different strengths:
-
Auto: Automatically determined based on the Parameters.preset (the default). With theDefaultpreset, workers are distributed across LNS, FDS, and FDSDual. With theLargepreset, all workers use LNS. -
LNS: Large Neighborhood Search. Starts from an initial solution and iteratively improves it by relaxing and re-optimizing parts of the solution. Good for finding high-quality solutions quickly, especially on large problems. Works best when a good initial solution can be found. -
FDS: Failure-Directed Search. A systematic search that learns from failures to guide exploration. Uses restarts with no-good learning. Often effective at proving optimality and works well with strong propagation. -
FDSDual: Failure-Directed Search working on objective bounds. Similar to FDS but focuses on proving bounds on the objective value. Useful for optimization problems where you want to know how far from optimal your solutions are. -
SetTimes: Depth-first set-times search (not restarted). A simple chronological search that assigns start times in order. Can be effective for tightly constrained problems but generally less robust than other methods.
Interaction with presets:
When searchType is set to Auto, the actual search type is determined by the Parameters.preset:
-
Defaultpreset: Distributes workers across different search types. Half use LNS, 3/8 use FDS, and the rest use FDSDual. This portfolio approach provides robustness across different problem types. -
Largepreset: All workers use LNS. For very large problems, the overhead of systematic search methods like FDS becomes prohibitive, so LNS is used exclusively.
If you explicitly set searchType to a specific value (not Auto), that value is used regardless of the preset.
import * as CP from "optalcp";
let model = new CP.Model();
// ... build your model ...
// Let the preset decide (default behavior)
let result = await model.solve();
// Or explicitly use FDS for systematic search
result = await model.solve({ searchType: "FDS" });
// Or use LNS for quick solutions on large problems
result = await model.solve({ searchType: "LNS" });
See
- Parameters.preset for automatic configuration of search and propagation.
- Parameters.noOverlapPropagationLevel which works well with FDS at higher levels.
Propagation levels
cumulPropagationLevel?
optionalcumulPropagationLevel:number
How much to propagate constraints on cumul functions
Remarks
This parameter controls the amount of propagation done for CumulExpr.le constraint when used with a sum of Model.pulse pulses.
Higher levels use more sophisticated algorithms that can detect more infeasibilities and prune more values from domains, but at the cost of increased computation time.
Propagation levels:
- Level 1: Basic timetable propagation
- Level 2: Adds time-table edge-finding
- Level 3: Maximum propagation with all available algorithms
Automatic selection (level 0):
When set to 0 (the default), the propagation level is determined automatically based on the Parameters.preset:
Defaultpreset: Uses level 3 (maximum propagation)Largepreset: Uses level 1 (minimum propagation for scalability)
Performance considerations:
More propagation doesn't necessarily mean better overall performance. The trade-off depends on your problem:
-
Resource-constrained problems with tight capacity limits often benefit from higher propagation levels because cumulative reasoning can prune many infeasible assignments.
-
Problems with loose resource constraints may not benefit much from higher levels because the extra computation doesn't lead to significant pruning.
-
Very large problems may perform better with lower propagation levels because the overhead becomes prohibitive.
-
FDS search (see Parameters.searchType) typically benefits from higher propagation levels.
If you're unsure, start with the automatic selection (level 0) and let the preset choose.
import * as CP from "optalcp";
let model = new CP.Model();
// ... build your model with cumulative constraints ...
// Let the preset decide (default)
let result = await model.solve();
// Or use maximum propagation for resource-constrained problems
result = await model.solve({ cumulPropagationLevel: 3 });
// Or use minimum propagation for very large problems
result = await model.solve({ cumulPropagationLevel: 1 });
See
- Parameters.preset for automatic configuration of propagation levels.
- Parameters.searchType for choosing the search algorithm.
- Model.pulse for creating pulse contributions to cumulative functions.
integralPropagationLevel?
optionalintegralPropagationLevel:number
How much to propagate integral expression
Remarks
This parameter controls the amount of propagation done for Model.integral expressions. In particular, it controls whether the propagation also affects the minimum and the maximum length of the associated interval variable:
1: The length is updated only once during initial constraint propagation.2: The length is updated every time the expression is propagated.
The parameter takes an integer value in range 1..2.
The default value is 1.
noOverlapPropagationLevel?
optionalnoOverlapPropagationLevel:number
How much to propagate noOverlap constraints
Remarks
This parameter controls the amount of propagation done for noOverlap constraints. Higher levels use more sophisticated algorithms that can detect more infeasibilities and prune more values from domains, but at the cost of increased computation time.
Propagation levels:
- Level 1: Basic timetable propagation only
- Level 2: Adds detectable precedences algorithm
- Level 3: Adds edge-finding reasoning
- Level 4: Maximum propagation with all available algorithms
Automatic selection (level 0):
When set to 0 (the default), the propagation level is determined automatically based on the Parameters.preset:
Defaultpreset: Uses level 4 (maximum propagation)Largepreset: Uses level 1 (minimum propagation for scalability)
Performance considerations:
More propagation doesn't necessarily mean better overall performance. The trade-off depends on your problem:
-
Dense scheduling problems with many overlapping intervals often benefit from higher propagation levels because the extra pruning reduces the search space significantly.
-
Sparse problems or very large problems may perform better with lower propagation levels because the overhead of sophisticated algorithms outweighs the benefit.
-
FDS search (see Parameters.searchType) typically benefits from higher propagation levels because it relies on strong propagation to guide the search.
If you're unsure, start with the automatic selection (level 0) and let the preset choose. You can then experiment with explicit levels if needed.
import * as CP from "optalcp";
let model = new CP.Model();
// ... build your model with noOverlap constraints ...
// Let the preset decide (default)
let result = await model.solve();
// Or use maximum propagation for dense problems
result = await model.solve({ noOverlapPropagationLevel: 4 });
// Or use minimum propagation for very large problems
result = await model.solve({ noOverlapPropagationLevel: 1 });
See
- Parameters.preset for automatic configuration of propagation levels.
- Parameters.searchType for choosing the search algorithm.
- Model.noOverlap for creating noOverlap constraints.
positionPropagationLevel?
optionalpositionPropagationLevel:number
How much to propagate position expressions on noOverlap constraints
Remarks
This parameter controls the amount of propagation done for position expressions on noOverlap constraints. The bigger the value, the more algorithms are used for propagation. It means that more time is spent by the propagation, and possibly more values are removed from domains. However, more propagation doesn't necessarily mean better performance. FDS search (see Parameters.searchType) usually benefits from higher propagation levels.
The parameter takes an integer value in range 1..3.
The default value is 2.
reservoirPropagationLevel?
optionalreservoirPropagationLevel:number
How much to propagate constraints on cumul functions
Remarks
This parameter controls the amount of propagation done for CumulExpr.le and CumulExpr.ge when used together with steps (Model.stepAtStart, Model.stepAtEnd, Model.stepAt).
The bigger the value, the more algorithms are used for propagation. It means that more time is spent by the propagation, and possibly more values are removed from domains. More propagation doesn't necessarily mean better performance. FDS search (see Parameters.searchType) usually benefits from higher propagation levels.
The parameter takes an integer value in range 1..2.
The default value is 1.
Simple Lower Bound
simpleLBMaxIterations?
optionalsimpleLBMaxIterations:number
Maximum number of feasibility checks
Remarks
Simple lower bound is computed by binary search for the best objective value that is not infeasible by propagation. This parameter limits the maximum number of iterations of the binary search. When the value is 0, then simple lower bound is not computed at all.
The parameter takes an integer value in range 0..2147483647.
The default value is 2147483647.
simpleLBShavingRounds?
optionalsimpleLBShavingRounds:number
Number of shaving rounds
Remarks
When non-zero, the solver shaves on variable domains to improve the lower bound. This parameter controls the number of shaving rounds.
The parameter takes an integer value in range 0..2147483647.
The default value is 0.
simpleLBWorker?
optionalsimpleLBWorker:number
Which worker computes simple lower bound
Remarks
Simple lower bound is a bound such that infeasibility of a better objective can be proved by propagation only (without the search). The given worker computes simple lower bound before it starts the normal search. If a worker with the given number doesn't exist, then the lower bound is not computed.
The parameter takes an integer value in range -1..2147483647.
The default value is 0.
Trace
propagationTraceLevel?
optionalpropagationTraceLevel:number
Level of propagation trace
Remarks
This parameter is available only in the development edition of the solver.
When set to a value bigger than zero, the solver prints a trace of the propagation, that is a line for every domain change. The higher the value, the more information is printed.
The parameter takes an integer value in range 0..5.
The default value is 0.
searchTraceLevel?
optionalsearchTraceLevel:number
Level of search trace
Remarks
This parameter is available only in the development edition of the solver.
When set to a value bigger than zero, the solver prints a trace of the search. The trace contains information about every choice taken by the solver. The higher the value, the more information is printed.
The parameter takes an integer value in range 0..5.
The default value is 0.
Remarks
WorkerParameters specify the behavior of each worker separately. It is part of the Parameters object.
If a parameter is not listed here, then it can be set only globally (in Parameters), not per worker. For example, timeLimit or logPeriod are global parameters.