Interface InnerScoreDirector<Solution_,Score_ extends Score<Score_>>
-
- Type Parameters:
Solution_
- the solution type, the class with thePlanningSolution
annotationScore_
- the score type to go with the solution
- All Superinterfaces:
AutoCloseable
,ScoreDirector<Solution_>
- All Known Implementing Classes:
AbstractScoreDirector
,BavetConstraintStreamScoreDirector
,DrlScoreDirector
,DroolsConstraintStreamScoreDirector
,EasyScoreDirector
,IncrementalScoreDirector
,TestGenDrlScoreDirector
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 void
afterVariableChanged(VariableDescriptor<Solution_> variableDescriptor, Object entity)
void
assertExpectedUndoMoveScore(Move<Solution_> move, Score_ beforeMoveScore)
Asserts that if theScore
is calculated for the currentworking solution
in the currentScoreDirector
(with incremental calculation residue), it is equal to the parameterbeforeMoveScore
.void
assertExpectedWorkingScore(Score_ expectedWorkingScore, Object completedAction)
Asserts that if theScore
is calculated for the currentworking solution
in the currentScoreDirector
(with possibly incremental calculation residue), it is equal to the parameterexpectedWorkingScore
.void
assertNonNullPlanningIds()
Asserts that none of the planning facts fromSolutionDescriptor.getAllFacts(Object)
forScoreDirector.getWorkingSolution()
havePlanningId
s with a null value.void
assertPredictedScoreFromScratch(Score_ predictedScore, Object completedAction)
Asserts that if theScore
is calculated for the currentworking solution
in a freshScoreDirector
(with no incremental calculation residue), it is equal to the parameterpredictedScore
.void
assertShadowVariablesAreNotStale(Score_ expectedWorkingScore, Object completedAction)
Asserts that if allVariableListener
s are forcibly triggered, and therefore all shadow variables are updated if needed, that none of the shadow variables of theworking solution
change, Then also asserts that theScore
calculated for theworking solution
afterwards is equal to the parameterexpectedWorkingScore
.void
assertWorkingScoreFromScratch(Score_ workingScore, Object completedAction)
Asserts that if theScore
is calculated for the currentworking solution
in a freshScoreDirector
(with no incremental calculation residue), it is equal to the parameterworkingScore
.void
beforeVariableChanged(VariableDescriptor<Solution_> variableDescriptor, Object entity)
Score_
calculateScore()
Calculates theScore
and updates theworking solution
accordingly.void
changeVariableFacade(VariableDescriptor<Solution_> variableDescriptor, Object entity, Object newValue)
InnerScoreDirector<Solution_,Score_>
clone()
Clones thisScoreDirector
and 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.void
close()
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)
void
doAndProcessMove(Move<Solution_> move, boolean assertMoveScoreFromScratch, Consumer<Score_> moveProcessor)
long
getCalculationCount()
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()
long
getWorkingEntityListRevision()
boolean
isConstraintMatchEnabled()
boolean
isWorkingEntityListDirty(long expectedWorkingEntityListRevision)
void
overwriteConstraintMatchEnabledPreference(boolean constraintMatchEnabledPreference)
boolean
requiresFlushing()
Some score directors (such as the Drools-based) keep a set of changes that they only apply whencalculateScore()
is called.void
resetCalculationCount()
void
setAllChangesWillBeUndoneBeforeStepEnds(boolean allChangesWillBeUndoneBeforeStepEnds)
Do not waste performance by propagating changes to step (or higher) mechanisms.void
setWorkingSolution(Solution_ workingSolution)
Theworking solution
must 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 solution
must never be the same instance as thebest solution
, it should be a (un)changed clone.- Parameters:
workingSolution
- never null
-
calculateScore
Score_ calculateScore()
Calculates theScore
and updates theworking solution
accordingly.- Returns:
- never null, the
Score
of theworking solution
-
isConstraintMatchEnabled
boolean isConstraintMatchEnabled()
- Returns:
- true if
getConstraintMatchTotalMap()
andgetIndictmentMap()
can be called
-
getConstraintMatchTotalMap
Map<String,ConstraintMatchTotal<Score_>> getConstraintMatchTotalMap()
Explains theScore
ofcalculateScore()
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 lastPlanningVariable
changes.- 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
. AnIndictment
is basically the inverse of aConstraintMatchTotal
: it is aScore
total for each justificationObject
inConstraintMatch.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 lastPlanningVariable
changes.- Returns:
- never null, the key is a
problem fact
or aplanning entity
- Throws:
IllegalStateException
- ifisConstraintMatchEnabled()
returns false- See Also:
getConstraintMatchTotalMap()
-
overwriteConstraintMatchEnabledPreference
void overwriteConstraintMatchEnabledPreference(boolean constraintMatchEnabledPreference)
- Parameters:
constraintMatchEnabledPreference
- false if aScoreDirector
implementation should not doConstraintMatch
tracking 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
-
requiresFlushing
boolean requiresFlushing()
Some score directors (such as the Drools-based) keep a set of changes that they only apply whencalculateScore()
is called. Until that happens, this set accumulates and could possibly act as a memory leak.- Returns:
- true if the score director can potentially cause a memory leak due to unflushed changes.
-
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
-
getCalculationCount
long getCalculationCount()
- Returns:
- at least 0L
-
resetCalculationCount
void resetCalculationCount()
-
getSupplyManager
SupplyManager<Solution_> getSupplyManager()
- Returns:
- never null
-
clone
InnerScoreDirector<Solution_,Score_> clone()
Clones thisScoreDirector
and itsworking solution
. UseScoreDirector.getWorkingSolution()
to retrieve theworking solution
of 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 theScore
is calculated for the currentworking solution
in 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 allVariableListener
s are forcibly triggered, and therefore all shadow variables are updated if needed, that none of the shadow variables of theworking solution
change, Then also asserts that theScore
calculated for theworking solution
afterwards 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 theScore
is calculated for the currentworking solution
in 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 theScore
is calculated for the currentworking solution
in 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 theScore
is calculated for the currentworking solution
in 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()
havePlanningId
s with a null value.
-
close
void close()
Needs to be called after use because some implementations need to clean up their resources.- Specified by:
close
in 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)
-
-