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
,DrlScoreDirector
,EasyScoreDirector
,IncrementalScoreDirector
-
Method Summary
Modifier and TypeMethodDescriptionvoid
afterListVariableChanged
(ListVariableDescriptor<Solution_> variableDescriptor, Object entity, int fromIndex, int toIndex) Notify the score director after a list variable changes.void
afterListVariableElementAssigned
(ListVariableDescriptor<Solution_> variableDescriptor, Object element) Call this for each element that was assigned (added to a list variable of one entity without being removed from a list variable of another entity).void
afterListVariableElementUnassigned
(ListVariableDescriptor<Solution_> variableDescriptor, Object element) Call this for each element that was unassigned (removed from a list variable of one entity without being added to a list variable of another entity).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
Asserts that none of the planning facts fromScoreDirector.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
beforeListVariableChanged
(ListVariableDescriptor<Solution_> variableDescriptor, Object entity, int fromIndex, int toIndex) Notify the score director before a list variable changes.void
beforeListVariableElementAssigned
(ListVariableDescriptor<Solution_> variableDescriptor, Object element) Call this for each element that will be assigned (added to a list variable of one entity without being removed from a list variable of another entity).void
beforeListVariableElementUnassigned
(ListVariableDescriptor<Solution_> variableDescriptor, Object element) Call this for each element that will be unassigned (removed from a list variable of one entity without being added to a list variable of another entity).void
beforeVariableChanged
(VariableDescriptor<Solution_> variableDescriptor, Object entity) Calculates theScore
and updates theworking solution
accordingly.void
changeVariableFacade
(VariableDescriptor<Solution_> variableDescriptor, Object entity, Object newValue) clone()
Clones thisScoreDirector
and itsworking 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.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.createChildThreadScoreDirector
(ChildThreadType childThreadType) doAndProcessMove
(Move<Solution_> move, boolean assertMoveScoreFromScratch) void
doAndProcessMove
(Move<Solution_> move, boolean assertMoveScoreFromScratch, Consumer<Score_> moveProcessor) void
UnlikeScoreDirector.triggerVariableListeners()
which only triggers notifications already in the queue, this triggers every variable listener on every genuine variable.long
Explains the impact of each planning entity or problem fact on theScore
.long
void
boolean
boolean
isWorkingEntityListDirty
(long expectedWorkingEntityListRevision) void
overwriteConstraintMatchEnabledPreference
(boolean constraintMatchEnabledPreference) boolean
Some score directors (such as the Drools-based) keep a set of changes that they only apply whencalculateScore()
is called.void
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, afterListVariableChanged, afterListVariableElementAssigned, afterListVariableElementUnassigned, afterProblemFactAdded, afterProblemFactRemoved, afterProblemPropertyChanged, afterVariableChanged, beforeEntityAdded, beforeEntityRemoved, beforeListVariableChanged, beforeListVariableElementAssigned, beforeListVariableElementUnassigned, beforeProblemFactAdded, beforeProblemFactRemoved, beforeProblemPropertyChanged, beforeVariableChanged, getWorkingSolution, lookUpWorkingObject, lookUpWorkingObjectOrReturnNull, triggerVariableListeners
-
Method Details
-
setWorkingSolution
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
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 eachconstraint justification
.The sum of
ConstraintMatchTotal.getScore()
differs fromcalculateScore()
because eachConstraintMatch.getScore()
is counted for eachconstraint justification
.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:
-
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
- 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
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() -
incrementCalculationCount
void incrementCalculationCount() -
getSupplyManager
SupplyManager 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
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
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
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:
-
assertPredictedScoreFromScratch
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:
-
assertExpectedUndoMoveScore
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 fromScoreDirector.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
-
afterVariableChanged
-
changeVariableFacade
void changeVariableFacade(VariableDescriptor<Solution_> variableDescriptor, Object entity, Object newValue) -
beforeListVariableElementAssigned
void beforeListVariableElementAssigned(ListVariableDescriptor<Solution_> variableDescriptor, Object element) Call this for each element that will be assigned (added to a list variable of one entity without being removed from a list variable of another entity).- Parameters:
variableDescriptor
- the list variable descriptorelement
- the assigned element
-
afterListVariableElementAssigned
void afterListVariableElementAssigned(ListVariableDescriptor<Solution_> variableDescriptor, Object element) Call this for each element that was assigned (added to a list variable of one entity without being removed from a list variable of another entity).- Parameters:
variableDescriptor
- the list variable descriptorelement
- the assigned element
-
beforeListVariableElementUnassigned
void beforeListVariableElementUnassigned(ListVariableDescriptor<Solution_> variableDescriptor, Object element) Call this for each element that will be unassigned (removed from a list variable of one entity without being added to a list variable of another entity).- Parameters:
variableDescriptor
- the list variable descriptorelement
- the unassigned element
-
afterListVariableElementUnassigned
void afterListVariableElementUnassigned(ListVariableDescriptor<Solution_> variableDescriptor, Object element) Call this for each element that was unassigned (removed from a list variable of one entity without being added to a list variable of another entity).- Parameters:
variableDescriptor
- the list variable descriptorelement
- the unassigned element
-
beforeListVariableChanged
void beforeListVariableChanged(ListVariableDescriptor<Solution_> variableDescriptor, Object entity, int fromIndex, int toIndex) Notify the score director before a list variable changes.The list variable change includes:
- Changing position (index) of one or more elements.
- Removing one or more elements from the list variable.
- Adding one or more elements to the list variable.
- Any mix of the above.
fromIndex
(inclusive) and ends attoIndex
(exclusive).The range has to comply with the following contract:
fromIndex
must be greater than or equal to 0;toIndex
must be less than or equal to the list variable size.toIndex
must be greater than or equal tofromIndex
.- The range must contain all elements that are going to be changed.
- The range is allowed to contain elements that are not going to be changed.
- The range may be empty (
fromIndex
equalstoIndex
) if none of the existing list variable elements are going to be changed.
beforeListVariableElementUnassigned(ListVariableDescriptor, Object)
must be called for each element that will be unassigned (removed from a list variable of one entity without being added to a list variable of another entity).- Parameters:
variableDescriptor
- descriptor of the list variable being changedentity
- the entity owning the list variable being changedfromIndex
- low endpoint (inclusive) of the changed rangetoIndex
- high endpoint (exclusive) of the changed range
-
afterListVariableChanged
void afterListVariableChanged(ListVariableDescriptor<Solution_> variableDescriptor, Object entity, int fromIndex, int toIndex) Notify the score director after a list variable changes.The list variable change includes:
- Changing position (index) of one or more elements.
- Removing one or more elements from the list variable.
- Adding one or more elements to the list variable.
- Any mix of the above.
fromIndex
(inclusive) and ends attoIndex
(exclusive).The range has to comply with the following contract:
fromIndex
must be greater than or equal to 0;toIndex
must be less than or equal to the list variable size.toIndex
must be greater than or equal tofromIndex
.- The range must contain all elements that have changed.
- The range is allowed to contain elements that have not changed.
- The range may be empty (
fromIndex
equalstoIndex
) if none of the existing list variable elements have changed.
afterListVariableElementUnassigned(ListVariableDescriptor, Object)
must be called for each element that was unassigned (removed from a list variable of one entity without being added to a list variable of another entity).- Parameters:
variableDescriptor
- descriptor of the list variable being changedentity
- the entity owning the list variable being changedfromIndex
- low endpoint (inclusive) of the changed rangetoIndex
- high endpoint (exclusive) of the changed range
-
forceTriggerVariableListeners
void forceTriggerVariableListeners()UnlikeScoreDirector.triggerVariableListeners()
which only triggers notifications already in the queue, this triggers every variable listener on every genuine variable. This is useful inSolutionManager.update(Object)
to fill in shadow variable values.
-