Interface SolutionManager<Solution_,Score_ extends Score<Score_>>
- Type Parameters:
Solution_- the solution type, the class with thePlanningSolutionannotationScore_- the actual score type
- All Known Implementing Classes:
DefaultSolutionManager
Score, ConstraintMatchTotal,
Indictment, etc.
To create a SolutionManager instance, use create(SolverFactory).
These methods are thread-safe unless explicitly stated otherwise.
-
Method Summary
Modifier and TypeMethodDescriptiondefault @NonNull ScoreAnalysis<Score_>default @NonNull ScoreAnalysis<Score_>analyze(@NonNull Solution_ solution, @NonNull ScoreAnalysisFetchPolicy fetchPolicy) @NonNull ScoreAnalysis<Score_>analyze(@NonNull Solution_ solution, @NonNull ScoreAnalysisFetchPolicy fetchPolicy, @NonNull SolutionUpdatePolicy solutionUpdatePolicy) Calculates and retrieves information about which constraints contributed to the solution's score.static <Solution_,Score_ extends Score<Score_>>
@NonNull SolutionManager<Solution_,Score_> create(@NonNull SolverFactory<Solution_> solverFactory) Uses aSolverFactoryto build aSolutionManager.static <Solution_,Score_ extends Score<Score_>, ProblemId_>
@NonNull SolutionManager<Solution_,Score_> create(@NonNull SolverManager<Solution_, ProblemId_> solverManager) Uses aSolverManagerto build aSolutionManager.@NonNull PlanningSolutionDiff<Solution_>Compute a difference between two solutions.default @NonNull ScoreExplanation<Solution_,Score_> As defined byexplain(Object, SolutionUpdatePolicy), usingSolutionUpdatePolicy.UPDATE_ALL.@NonNull ScoreExplanation<Solution_,Score_> explain(@NonNull Solution_ solution, @NonNull SolutionUpdatePolicy solutionUpdatePolicy) Calculates and retrievesConstraintMatchTotals andIndictments necessary for describing the quality of a particular solution.<EntityOrElement_,Proposition_>
@NonNull List<RecommendedAssignment<Proposition_,Score_>> recommendAssignment(@NonNull Solution_ solution, @NonNull EntityOrElement_ evaluatedEntityOrElement, @NonNull Function<EntityOrElement_, Proposition_> propositionFunction, @NonNull ScoreAnalysisFetchPolicy fetchPolicy) Quickly runs through all possible options of assigning a given entity or element in a given solution, and returns a list of recommendations sorted by score, with most favorable score first.default <EntityOrElement_,Proposition_>
@NonNull List<RecommendedAssignment<Proposition_,Score_>> recommendAssignment(@NonNull Solution_ solution, EntityOrElement_ evaluatedEntityOrElement, @NonNull Function<EntityOrElement_, @NonNull Proposition_> propositionFunction) default <EntityOrElement_,Proposition_>
List<RecommendedFit<Proposition_,Score_>> recommendFit(Solution_ solution, EntityOrElement_ fittedEntityOrElement, Function<EntityOrElement_, Proposition_> propositionFunction) Deprecated, for removal: This API element is subject to removal in a future version.<EntityOrElement_,Proposition_>
List<RecommendedFit<Proposition_,Score_>> recommendFit(Solution_ solution, EntityOrElement_ fittedEntityOrElement, Function<EntityOrElement_, Proposition_> propositionFunction, ScoreAnalysisFetchPolicy fetchPolicy) Deprecated, for removal: This API element is subject to removal in a future version.default @Nullable Score_As defined byupdate(Object, SolutionUpdatePolicy), usingSolutionUpdatePolicy.UPDATE_ALL.@Nullable Score_update(@NonNull Solution_ solution, @NonNull SolutionUpdatePolicy solutionUpdatePolicy) Updates the given solution according to theSolutionUpdatePolicy.static <Solution_>
voidupdateShadowVariables(@NonNull Class<Solution_> solutionClass, @NonNull Object... entities) This method updates all shadow variables at the entity level, simplifying the requirements ofupdate(Object).static <Solution_>
voidupdateShadowVariables(@NonNull Solution_ solution) Same asupdateShadowVariables(Class, Object...), this method accepts a solution rather than a list of entities.
-
Method Details
-
create
static <Solution_,Score_ extends Score<Score_>> @NonNull SolutionManager<Solution_,Score_> create(@NonNull SolverFactory<Solution_> solverFactory) Uses aSolverFactoryto build aSolutionManager.- Type Parameters:
Solution_- the solution type, the class with thePlanningSolutionannotationScore_- the actual score type
-
create
static <Solution_,Score_ extends Score<Score_>, @NonNull SolutionManager<Solution_,ProblemId_> Score_> create(@NonNull SolverManager<Solution_, ProblemId_> solverManager) Uses aSolverManagerto build aSolutionManager.- Type Parameters:
Solution_- the solution type, the class with thePlanningSolutionannotationScore_- the actual score typeProblemId_- the ID type of a submitted problem, such asLongorUUID
-
update
As defined byupdate(Object, SolutionUpdatePolicy), usingSolutionUpdatePolicy.UPDATE_ALL. -
update
@Nullable Score_ update(@NonNull Solution_ solution, @NonNull SolutionUpdatePolicy solutionUpdatePolicy) Updates the given solution according to theSolutionUpdatePolicy.- Parameters:
solutionUpdatePolicy- if unsure, pickSolutionUpdatePolicy.UPDATE_ALL- Returns:
- possibly null if already null and
SolutionUpdatePolicydidn't cause its update - See Also:
-
updateShadowVariables
static <Solution_> void updateShadowVariables(@NonNull Class<Solution_> solutionClass, @NonNull Object... entities) This method updates all shadow variables at the entity level, simplifying the requirements ofupdate(Object). Unlike the latter method, it does not require the complete configuration necessary to obtain an instance ofSolutionManager.However, this method requires that the entity does not define any shadow variables that rely on listeners, as that would require a complete solution.
- Parameters:
solutionClass- the solution classentities- all entities to be updated
-
updateShadowVariables
static <Solution_> void updateShadowVariables(@NonNull Solution_ solution) Same asupdateShadowVariables(Class, Object...), this method accepts a solution rather than a list of entities.- Parameters:
solution- the solution
-
explain
As defined byexplain(Object, SolutionUpdatePolicy), usingSolutionUpdatePolicy.UPDATE_ALL. -
explain
@NonNull ScoreExplanation<Solution_,Score_> explain(@NonNull Solution_ solution, @NonNull SolutionUpdatePolicy solutionUpdatePolicy) Calculates and retrievesConstraintMatchTotals andIndictments necessary for describing the quality of a particular solution. For a simplified, faster and JSON-friendly alternative, seeanalyze(Object)}.- Parameters:
solutionUpdatePolicy- if unsure, pickSolutionUpdatePolicy.UPDATE_ALL- Throws:
IllegalStateException- when constraint matching is disabled or not supported by the underlying score calculator, such asEasyScoreCalculator.- See Also:
-
analyze
-
analyze
default @NonNull ScoreAnalysis<Score_> analyze(@NonNull Solution_ solution, @NonNull ScoreAnalysisFetchPolicy fetchPolicy) -
analyze
@NonNull ScoreAnalysis<Score_> analyze(@NonNull Solution_ solution, @NonNull ScoreAnalysisFetchPolicy fetchPolicy, @NonNull SolutionUpdatePolicy solutionUpdatePolicy) Calculates and retrieves information about which constraints contributed to the solution's score. This is a faster, JSON-friendly version ofexplain(Object).- Parameters:
solution- must be fully initialized otherwise an exception is thrownfetchPolicy- if unsure, pickScoreAnalysisFetchPolicy.FETCH_MATCH_COUNTsolutionUpdatePolicy- if unsure, pickSolutionUpdatePolicy.UPDATE_ALL- Throws:
IllegalStateException- when constraint matching is disabled or not supported by the underlying score calculator, such asEasyScoreCalculator.- See Also:
-
diff
@NonNull PlanningSolutionDiff<Solution_> diff(@NonNull Solution_ oldSolution, @NonNull Solution_ newSolution) Compute a difference between two solutions. The difference will contain information about which entities's variables have changed, which entities were added and which were removed.Two instances of a planning entity or a variable value are considered equal if they
equal. Instances of different classes are never considered equal, even if they share a common superclass. For the correct operation of this method, make sure thatequalsandhashCodehonor their contract and are mutually consistent.This method is only offered as a preview feature. There are no guarantees for backward compatibility; its signature or the types it operates on and returns may change or be removed without prior notice, although we will strive to avoid this as much as possible.
- Parameters:
oldSolution- The solution to use as a base for comparison.newSolution- The solution to compare against the base.- Returns:
- A diff object containing information about the differences between the two solutions. Entities from the old solution that are not present in the new solution will be marked as removed. Entities from the new solution that are not present in the old solution will be marked as added. Entities that are present in both solutions will be marked as changed if their variables differ, according to the equality rules described above.
-
recommendAssignment
default <EntityOrElement_,Proposition_> @NonNull List<RecommendedAssignment<Proposition_,Score_>> recommendAssignment(@NonNull Solution_ solution, EntityOrElement_ evaluatedEntityOrElement, @NonNull Function<EntityOrElement_, @NonNull Proposition_> propositionFunction) -
recommendAssignment
<EntityOrElement_,Proposition_> @NonNull List<RecommendedAssignment<Proposition_,Score_>> recommendAssignment(@NonNull Solution_ solution, @NonNull EntityOrElement_ evaluatedEntityOrElement, @NonNull Function<EntityOrElement_, Proposition_> propositionFunction, @NonNull ScoreAnalysisFetchPolicy fetchPolicy) Quickly runs through all possible options of assigning a given entity or element in a given solution, and returns a list of recommendations sorted by score, with most favorable score first. The input solution must either be fully initialized, or have a single entity or element unassigned.For problems with only basic planning variables or with chained planning variables, the fitted element is a planning entity of the problem. Each available planning value will be tested by setting it to the planning variable in question. For problems with a list variable, the evaluated element may be a shadow entity, and it will be tested in each position of the planning list variable.
The score returned by
RecommendedAssignment.scoreAnalysisDiff()is the difference between the score of the solution before and after fitting. Every recommendation will be in a state as if the solution was never changed; if it references entities, none of their genuine planning variables or shadow planning variables will be initialized. The input solution will be unchanged.This method does not call local search, it runs a fast greedy algorithm instead. The construction heuristic configuration from the solver configuration is used. If not present, the default construction heuristic configuration is used. This means that the API will fail if the solver config requires custom initialization phase. In this case, it will fail either directly by throwing an exception, or indirectly by not providing correct data.
When an element is tested, a score is calculated over the entire solution with the element in place, also called a placement. The proposition function is also called at that time, allowing the user to extract any information from the current placement; the extracted information is called the proposition. After the proposition is extracted, the solution is returned to its original state, resetting all changes made by the fitting. This has a major consequence for the proposition, if it is a planning entity: planning entities contain live data in their planning variables, and that data will be erased when the next placement is tested for fit. In this case, the proposition function needs to make defensive copies of everything it wants to return, such as values of shadow variables etc.
Example: Consider a planning entity Shift, with a variable "employee". Let's assume we have two employees to test for fit, Ann and Bob, and a single Shift instance to fit them into,
mondayShift. The proposition function will be called twice, once asmondayShift@Annand once asmondayShift@Bob. Let's assume the proposition function returns the Shift instance in its entirety. This is what will happen:- Calling propositionFunction on
mondayShift@Annresults in proposition P1:mondayShift@Ann - Placement is cleared,
mondayShift@Bobis now tested for fit. - Calling propositionFunction on
mondayShift@Bobresults in proposition P2:mondayShift@Bob - Proposition P1 and P2 are now both the same
mondayShift, which means Bob is now assigned to both of them. This is because both propositions operate on the same entity, and therefore share the same state. - The placement is then cleared again,
both elements have been tested,
and solution is returned to its original order.
The propositions are then returned to the user,
who notices that both P1 and P2 are
mondayShift@null. This is because they shared state, and the original state of the solution was for Shift to be unassigned.
If instead the proposition function returned Ann and Bob directly, the immutable planning variables, this problem would have been avoided. Alternatively, the proposition function could have returned a defensive copy of the Shift.
- Type Parameters:
EntityOrElement_- generic type of the evaluated entity or elementProposition_- generic type of the user-provided proposition; if it is a planning entity, it is recommended to make a defensive copy inside the proposition function.- Parameters:
solution- for basic variable, must be fully initialized or have a single entity unassigned. For list variable, all values must be assigned to some list, with the optional exception of one.evaluatedEntityOrElement- must be part of the solution. For basic variable, it is a planning entity and may have one or more variables unassigned. For list variable, it is a shadow entity and need not be present in any list variable.ScoreAnalysisFetchPolicy.FETCH_ALLwill include more data withinRecommendedAssignment, but will also take more time to gather that data.- Returns:
- sorted from best to worst;
designed to be JSON-friendly, see
RecommendedAssignmentJavadoc for more. - See Also:
- Calling propositionFunction on
-
recommendFit
@Deprecated(forRemoval=true, since="1.15.0") default <EntityOrElement_,Proposition_> List<RecommendedFit<Proposition_,Score_>> recommendFit(Solution_ solution, EntityOrElement_ fittedEntityOrElement, Function<EntityOrElement_, Proposition_> propositionFunction) Deprecated, for removal: This API element is subject to removal in a future version. -
recommendFit
@Deprecated(forRemoval=true, since="1.15.0") <EntityOrElement_,Proposition_> List<RecommendedFit<Proposition_,Score_>> recommendFit(Solution_ solution, EntityOrElement_ fittedEntityOrElement, Function<EntityOrElement_, Proposition_> propositionFunction, ScoreAnalysisFetchPolicy fetchPolicy) Deprecated, for removal: This API element is subject to removal in a future version.
-
recommendAssignment(Object, Object, Function, ScoreAnalysisFetchPolicy).