Interface InnerScoreDirector<Solution_,Score_ extends Score<Score_>>
-
- Type Parameters:
Solution_- the solution type, the class with thePlanningSolutionannotationScore_- the score type to go with the solution
- All Superinterfaces:
AutoCloseable,ScoreDirector<Solution_>
- All Known Implementing Classes:
AbstractScoreDirector,BavetConstraintStreamScoreDirector,DroolsConstraintStreamScoreDirector,DroolsScoreDirector,EasyScoreDirector,IncrementalScoreDirector,TestGenDroolsScoreDirector
public interface InnerScoreDirector<Solution_,Score_ extends Score<Score_>> extends ScoreDirector<Solution_>, AutoCloseable
-
-
Method Summary
All Methods Instance Methods Abstract Methods Modifier and Type Method Description voidafterVariableChanged(VariableDescriptor<Solution_> variableDescriptor, Object entity)voidassertExpectedUndoMoveScore(Move<Solution_> move, Score_ beforeMoveScore)Asserts that if theScoreis calculated for the currentworking solutionin the currentScoreDirector(with incremental calculation residue), it is equal to the parameterbeforeMoveScore.voidassertExpectedWorkingScore(Score_ expectedWorkingScore, Object completedAction)Asserts that if theScoreis calculated for the currentworking solutionin the currentScoreDirector(with possibly incremental calculation residue), it is equal to the parameterexpectedWorkingScore.voidassertNonNullPlanningIds()Asserts that none of the planning facts fromSolutionDescriptor.getAllFacts(Object)forScoreDirector.getWorkingSolution()havePlanningIds with a null value.voidassertPredictedScoreFromScratch(Score_ predictedScore, Object completedAction)Asserts that if theScoreis calculated for the currentworking solutionin a freshScoreDirector(with no incremental calculation residue), it is equal to the parameterpredictedScore.voidassertShadowVariablesAreNotStale(Score_ expectedWorkingScore, Object completedAction)Asserts that if allVariableListeners are forcibly triggered, and therefore all shadow variables are updated if needed, that none of the shadow variables of theworking solutionchange, Then also asserts that theScorecalculated for theworking solutionafterwards is equal to the parameterexpectedWorkingScore.voidassertWorkingScoreFromScratch(Score_ workingScore, Object completedAction)Asserts that if theScoreis calculated for the currentworking solutionin a freshScoreDirector(with no incremental calculation residue), it is equal to the parameterworkingScore.voidbeforeVariableChanged(VariableDescriptor<Solution_> variableDescriptor, Object entity)Score_calculateScore()Calculates theScoreand updates theworking solutionaccordingly.voidchangeVariableFacade(VariableDescriptor<Solution_> variableDescriptor, Object entity, Object newValue)InnerScoreDirector<Solution_,Score_>clone()Clones thisScoreDirectorand itsworking solution.Solution_cloneSolution(Solution_ originalSolution)Returns a planning clone of the solution, which is not a shallow clone nor a deep clone nor a partition clone.Solution_cloneWorkingSolution()Returns a planning clone of the solution, which is not a shallow clone nor a deep clone nor a partition clone.voidclose()Needs to be called after use because some implementations need to clean up their resources.InnerScoreDirector<Solution_,Score_>createChildThreadScoreDirector(ChildThreadType childThreadType)Score_doAndProcessMove(Move<Solution_> move, boolean assertMoveScoreFromScratch)voiddoAndProcessMove(Move<Solution_> move, boolean assertMoveScoreFromScratch, Consumer<Score_> moveProcessor)longgetCalculationCount()Map<String,ConstraintMatchTotal<Score_>>getConstraintMatchTotalMap()Map<Object,Indictment<Score_>>getIndictmentMap()Explains the impact of each planning entity or problem fact on theScore.ScoreDefinition<Score_>getScoreDefinition()InnerScoreDirectorFactory<Solution_,Score_>getScoreDirectorFactory()SolutionDescriptor<Solution_>getSolutionDescriptor()SupplyManager<Solution_>getSupplyManager()intgetWorkingEntityCount()List<Object>getWorkingEntityList()longgetWorkingEntityListRevision()intgetWorkingValueCount()booleanisConstraintMatchEnabled()booleanisWorkingEntityListDirty(long expectedWorkingEntityListRevision)voidoverwriteConstraintMatchEnabledPreference(boolean constraintMatchEnabledPreference)voidresetCalculationCount()voidsetAllChangesWillBeUndoneBeforeStepEnds(boolean allChangesWillBeUndoneBeforeStepEnds)Do not waste performance by propagating changes to step (or higher) mechanisms.voidsetWorkingSolution(Solution_ workingSolution)Theworking solutionmust never be the same instance as thebest solution, it should be a (un)changed clone.-
Methods inherited from interface org.optaplanner.core.api.score.director.ScoreDirector
afterEntityAdded, afterEntityRemoved, afterProblemFactAdded, afterProblemFactRemoved, afterProblemPropertyChanged, afterVariableChanged, beforeEntityAdded, beforeEntityRemoved, beforeProblemFactAdded, beforeProblemFactRemoved, beforeProblemPropertyChanged, beforeVariableChanged, getWorkingSolution, lookUpWorkingObject, lookUpWorkingObjectOrReturnNull, triggerVariableListeners
-
-
-
-
Method Detail
-
setWorkingSolution
void setWorkingSolution(Solution_ workingSolution)
Theworking solutionmust never be the same instance as thebest solution, it should be a (un)changed clone.- Parameters:
workingSolution- never null
-
calculateScore
Score_ calculateScore()
Calculates theScoreand updates theworking solutionaccordingly.- Returns:
- never null, the
Scoreof theworking solution
-
isConstraintMatchEnabled
boolean isConstraintMatchEnabled()
- Returns:
- true if
getConstraintMatchTotalMap()andgetIndictmentMap()can be called
-
getConstraintMatchTotalMap
Map<String,ConstraintMatchTotal<Score_>> getConstraintMatchTotalMap()
Explains theScoreofcalculateScore()by splitting it up perConstraint.The sum of
ConstraintMatchTotal.getScore()equalscalculateScore().Call
calculateScore()before calling this method, unless that method has already been called since the lastPlanningVariablechanges.- Returns:
- never null, the key is the
constraintId(to create one, useConstraintMatchTotal.composeConstraintId(String, String)). - Throws:
IllegalStateException- ifisConstraintMatchEnabled()returns false- See Also:
getIndictmentMap()
-
getIndictmentMap
Map<Object,Indictment<Score_>> getIndictmentMap()
Explains the impact of each planning entity or problem fact on theScore. AnIndictmentis basically the inverse of aConstraintMatchTotal: it is aScoretotal for each justificationObjectinConstraintMatch.getJustificationList().The sum of
ConstraintMatchTotal.getScore()differs fromcalculateScore()because eachConstraintMatch.getScore()is counted for each justification inConstraintMatch.getJustificationList().Call
calculateScore()before calling this method, unless that method has already been called since the lastPlanningVariablechanges.- Returns:
- never null, the key is a
problem factor aplanning entity - Throws:
IllegalStateException- ifisConstraintMatchEnabled()returns false- See Also:
getConstraintMatchTotalMap()
-
overwriteConstraintMatchEnabledPreference
void overwriteConstraintMatchEnabledPreference(boolean constraintMatchEnabledPreference)
- Parameters:
constraintMatchEnabledPreference- false if aScoreDirectorimplementation should not doConstraintMatchtracking even if it supports it.
-
getWorkingEntityListRevision
long getWorkingEntityListRevision()
- Returns:
- used to check
isWorkingEntityListDirty(long)later on
-
doAndProcessMove
Score_ doAndProcessMove(Move<Solution_> move, boolean assertMoveScoreFromScratch)
- Parameters:
move- never nullassertMoveScoreFromScratch- true will hurt performance- Returns:
- never null
-
doAndProcessMove
void doAndProcessMove(Move<Solution_> move, boolean assertMoveScoreFromScratch, Consumer<Score_> moveProcessor)
- Parameters:
move- never nullassertMoveScoreFromScratch- true will hurt performancemoveProcessor- never null, use this to store the score as well as call the acceptor and forager
-
isWorkingEntityListDirty
boolean isWorkingEntityListDirty(long expectedWorkingEntityListRevision)
- Parameters:
expectedWorkingEntityListRevision- an- Returns:
- true if the entityList might have a different set of instances now
-
getScoreDirectorFactory
InnerScoreDirectorFactory<Solution_,Score_> getScoreDirectorFactory()
- Returns:
- never null
-
getSolutionDescriptor
SolutionDescriptor<Solution_> getSolutionDescriptor()
- Returns:
- never null
-
getScoreDefinition
ScoreDefinition<Score_> getScoreDefinition()
- Returns:
- never null
-
cloneWorkingSolution
Solution_ cloneWorkingSolution()
Returns a planning clone of the solution, which is not a shallow clone nor a deep clone nor a partition clone.- Returns:
- never null, planning clone
-
cloneSolution
Solution_ cloneSolution(Solution_ originalSolution)
Returns a planning clone of the solution, which is not a shallow clone nor a deep clone nor a partition clone.- Parameters:
originalSolution- never null- Returns:
- never null, planning clone
-
getWorkingEntityCount
int getWorkingEntityCount()
- Returns:
>= 0
-
getWorkingEntityList
List<Object> getWorkingEntityList()
- Returns:
- never null: an empty list if there are none
-
getWorkingValueCount
int getWorkingValueCount()
- Returns:
>= 0
-
getCalculationCount
long getCalculationCount()
- Returns:
- at least 0L
-
resetCalculationCount
void resetCalculationCount()
-
getSupplyManager
SupplyManager<Solution_> getSupplyManager()
- Returns:
- never null
-
clone
InnerScoreDirector<Solution_,Score_> clone()
Clones thisScoreDirectorand itsworking solution. UseScoreDirector.getWorkingSolution()to retrieve theworking solutionof that clone.This is heavy method, because it usually breaks incremental score calculation. Use it sparingly. Therefore it's best to clone lazily by delaying the clone call as long as possible.
- Returns:
- never null
-
createChildThreadScoreDirector
InnerScoreDirector<Solution_,Score_> createChildThreadScoreDirector(ChildThreadType childThreadType)
-
setAllChangesWillBeUndoneBeforeStepEnds
void setAllChangesWillBeUndoneBeforeStepEnds(boolean allChangesWillBeUndoneBeforeStepEnds)
Do not waste performance by propagating changes to step (or higher) mechanisms.- Parameters:
allChangesWillBeUndoneBeforeStepEnds- true if all changes will be undone
-
assertExpectedWorkingScore
void assertExpectedWorkingScore(Score_ expectedWorkingScore, Object completedAction)
Asserts that if theScoreis calculated for the currentworking solutionin the currentScoreDirector(with possibly incremental calculation residue), it is equal to the parameterexpectedWorkingScore.Used to assert that skipping
calculateScore()(when the score is otherwise determined) is correct.- Parameters:
expectedWorkingScore- never nullcompletedAction- sometimes null, when assertion fails then the completedAction'sObject.toString()is included in the exception message
-
assertShadowVariablesAreNotStale
void assertShadowVariablesAreNotStale(Score_ expectedWorkingScore, Object completedAction)
Asserts that if allVariableListeners are forcibly triggered, and therefore all shadow variables are updated if needed, that none of the shadow variables of theworking solutionchange, Then also asserts that theScorecalculated for theworking solutionafterwards is equal to the parameterexpectedWorkingScore.Used to assert that the shadow variables' state is consistent with the genuine variables' state.
- Parameters:
expectedWorkingScore- never nullcompletedAction- sometimes null, when assertion fails then the completedAction'sObject.toString()is included in the exception message
-
assertWorkingScoreFromScratch
void assertWorkingScoreFromScratch(Score_ workingScore, Object completedAction)
Asserts that if theScoreis calculated for the currentworking solutionin a freshScoreDirector(with no incremental calculation residue), it is equal to the parameterworkingScore.Furthermore, if the assert fails, a score corruption analysis might be included in the exception message.
- Parameters:
workingScore- never nullcompletedAction- sometimes null, when assertion fails then the completedAction'sObject.toString()is included in the exception message- See Also:
InnerScoreDirectorFactory.assertScoreFromScratch(Solution_)
-
assertPredictedScoreFromScratch
void assertPredictedScoreFromScratch(Score_ predictedScore, Object completedAction)
Asserts that if theScoreis calculated for the currentworking solutionin a freshScoreDirector(with no incremental calculation residue), it is equal to the parameterpredictedScore.Furthermore, if the assert fails, a score corruption analysis might be included in the exception message.
- Parameters:
predictedScore- never nullcompletedAction- sometimes null, when assertion fails then the completedAction'sObject.toString()is included in the exception message- See Also:
InnerScoreDirectorFactory.assertScoreFromScratch(Solution_)
-
assertExpectedUndoMoveScore
void assertExpectedUndoMoveScore(Move<Solution_> move, Score_ beforeMoveScore)
Asserts that if theScoreis calculated for the currentworking solutionin the currentScoreDirector(with incremental calculation residue), it is equal to the parameterbeforeMoveScore.Furthermore, if the assert fails, a score corruption analysis might be included in the exception message.
- Parameters:
move- never nullbeforeMoveScore- never null
-
assertNonNullPlanningIds
void assertNonNullPlanningIds()
Asserts that none of the planning facts fromSolutionDescriptor.getAllFacts(Object)forScoreDirector.getWorkingSolution()havePlanningIds with a null value.
-
close
void close()
Needs to be called after use because some implementations need to clean up their resources.- Specified by:
closein interfaceAutoCloseable
-
beforeVariableChanged
void beforeVariableChanged(VariableDescriptor<Solution_> variableDescriptor, Object entity)
-
afterVariableChanged
void afterVariableChanged(VariableDescriptor<Solution_> variableDescriptor, Object entity)
-
changeVariableFacade
void changeVariableFacade(VariableDescriptor<Solution_> variableDescriptor, Object entity, Object newValue)
-
-