Class AbstractScoreDirector<Solution_,Factory_ extends AbstractScoreDirectorFactory<Solution_>>
- java.lang.Object
-
- org.optaplanner.core.impl.score.director.AbstractScoreDirector<Solution_,Factory_>
-
- All Implemented Interfaces:
AutoCloseable
,Cloneable
,InnerScoreDirector<Solution_>
,ScoreDirector<Solution_>
- Direct Known Subclasses:
ConstraintStreamScoreDirector
,DroolsScoreDirector
,EasyScoreDirector
,IncrementalScoreDirector
public abstract class AbstractScoreDirector<Solution_,Factory_ extends AbstractScoreDirectorFactory<Solution_>> extends Object implements InnerScoreDirector<Solution_>, Cloneable
Abstract superclass forScoreDirector
.Implementation note: Extending classes should follow these guidelines:
- before* method: last statement should be a call to the super method
- after* method: first statement should be a call to the super method
- See Also:
ScoreDirector
-
-
Field Summary
Fields Modifier and Type Field Description protected boolean
allChangesWillBeUndoneBeforeStepEnds
protected long
calculationCount
protected boolean
constraintMatchEnabledPreference
protected org.slf4j.Logger
logger
protected boolean
lookUpEnabled
protected LookUpManager
lookUpManager
protected Factory_
scoreDirectorFactory
protected VariableListenerSupport<Solution_>
variableListenerSupport
protected long
workingEntityListRevision
protected Integer
workingInitScore
protected Solution_
workingSolution
-
Constructor Summary
Constructors Modifier Constructor Description protected
AbstractScoreDirector(Factory_ scoreDirectorFactory, boolean lookUpEnabled, boolean constraintMatchEnabledPreference)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
afterEntityAdded(Object entity)
void
afterEntityAdded(EntityDescriptor<Solution_> entityDescriptor, Object entity)
void
afterEntityRemoved(Object entity)
void
afterEntityRemoved(EntityDescriptor<Solution_> entityDescriptor, Object entity)
void
afterProblemFactAdded(Object problemFact)
void
afterProblemFactRemoved(Object problemFact)
void
afterProblemPropertyChanged(Object problemFactOrEntity)
void
afterVariableChanged(Object entity, String variableName)
void
afterVariableChanged(VariableDescriptor variableDescriptor, Object entity)
void
assertExpectedUndoMoveScore(Move 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
assertPredictedScoreFromScratch(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 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
beforeEntityAdded(Object entity)
void
beforeEntityAdded(EntityDescriptor<Solution_> entityDescriptor, Object entity)
void
beforeEntityRemoved(Object entity)
void
beforeEntityRemoved(EntityDescriptor<Solution_> entityDescriptor, Object entity)
void
beforeProblemFactAdded(Object problemFact)
void
beforeProblemFactRemoved(Object problemFact)
void
beforeProblemPropertyChanged(Object problemFactOrEntity)
void
beforeVariableChanged(Object entity, String variableName)
void
beforeVariableChanged(VariableDescriptor variableDescriptor, Object entity)
protected String
buildScoreCorruptionAnalysis(ScoreDirector<Solution_> uncorruptedScoreDirector, boolean predicted)
protected String
buildShadowVariableAnalysis(boolean predicted)
void
changeVariableFacade(VariableDescriptor variableDescriptor, Object entity, Object newValue)
AbstractScoreDirector<Solution_,Factory_>
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_>
createChildThreadScoreDirector(ChildThreadType childThreadType)
protected String
createShadowVariablesViolationMessage()
Score
doAndProcessMove(Move<Solution_> move, boolean assertMoveScoreFromScratch)
void
doAndProcessMove(Move<Solution_> move, boolean assertMoveScoreFromScratch, Consumer<Score> moveProcessor)
String
explainScore()
Returns a diagnostic text that explains theScore
through theConstraintMatch
API to identify which constraints or planning entities cause that score quality.long
getCalculationCount()
ScoreDefinition
getScoreDefinition()
Factory_
getScoreDirectorFactory()
SolutionDescriptor<Solution_>
getSolutionDescriptor()
SupplyManager
getSupplyManager()
int
getWorkingEntityCount()
List<Object>
getWorkingEntityList()
long
getWorkingEntityListRevision()
Solution_
getWorkingSolution()
ThePlanningSolution
that is used to calculate theScore
.int
getWorkingValueCount()
boolean
isAllChangesWillBeUndoneBeforeStepEnds()
boolean
isConstraintMatchEnabledPreference()
boolean
isLookUpEnabled()
boolean
isWorkingEntityListDirty(long expectedWorkingEntityListRevision)
<E> E
lookUpWorkingObject(E externalObject)
Translates an entity or fact instance (often from anotherThread
or JVM) to thisScoreDirector
's internal working instance.<E> E
lookUpWorkingObjectOrReturnNull(E externalObject)
As defined byScoreDirector.lookUpWorkingObject(Object)
, but doesn't fail fast if no workingObject was ever added for the externalObject.void
overwriteConstraintMatchEnabledPreference(boolean constraintMatchEnabledPreference)
void
resetCalculationCount()
void
setAllChangesWillBeUndoneBeforeStepEnds(boolean allChangesWillBeUndoneBeforeStepEnds)
Do not waste performance by propagating changes to step (or higher) mechanisms.protected void
setCalculatedScore(Score score)
protected void
setWorkingEntityListDirty()
void
setWorkingSolution(Solution_ workingSolution)
Theworking solution
must never be the same instance as thebest solution
, it should be a (un)changed clone.String
toString()
void
triggerVariableListeners()
-
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface org.optaplanner.core.impl.score.director.ScoreDirector
calculateScore, dispose, getConstraintMatchTotalMap, getConstraintMatchTotals, getIndictmentMap, isConstraintMatchEnabled
-
-
-
-
Field Detail
-
logger
protected final transient org.slf4j.Logger logger
-
scoreDirectorFactory
protected final Factory_ extends AbstractScoreDirectorFactory<Solution_> scoreDirectorFactory
-
lookUpEnabled
protected final boolean lookUpEnabled
-
lookUpManager
protected final LookUpManager lookUpManager
-
constraintMatchEnabledPreference
protected boolean constraintMatchEnabledPreference
-
variableListenerSupport
protected final VariableListenerSupport<Solution_> variableListenerSupport
-
workingSolution
protected Solution_ workingSolution
-
workingEntityListRevision
protected long workingEntityListRevision
-
workingInitScore
protected Integer workingInitScore
-
allChangesWillBeUndoneBeforeStepEnds
protected boolean allChangesWillBeUndoneBeforeStepEnds
-
calculationCount
protected long calculationCount
-
-
Constructor Detail
-
AbstractScoreDirector
protected AbstractScoreDirector(Factory_ scoreDirectorFactory, boolean lookUpEnabled, boolean constraintMatchEnabledPreference)
-
-
Method Detail
-
getScoreDirectorFactory
public Factory_ getScoreDirectorFactory()
- Specified by:
getScoreDirectorFactory
in interfaceInnerScoreDirector<Solution_>
- Returns:
- never null
-
getSolutionDescriptor
public SolutionDescriptor<Solution_> getSolutionDescriptor()
- Specified by:
getSolutionDescriptor
in interfaceInnerScoreDirector<Solution_>
- Returns:
- never null
-
getScoreDefinition
public ScoreDefinition getScoreDefinition()
- Specified by:
getScoreDefinition
in interfaceInnerScoreDirector<Solution_>
- Returns:
- never null
-
isLookUpEnabled
public boolean isLookUpEnabled()
-
isConstraintMatchEnabledPreference
public boolean isConstraintMatchEnabledPreference()
-
overwriteConstraintMatchEnabledPreference
public void overwriteConstraintMatchEnabledPreference(boolean constraintMatchEnabledPreference)
- Specified by:
overwriteConstraintMatchEnabledPreference
in interfaceInnerScoreDirector<Solution_>
- Parameters:
constraintMatchEnabledPreference
- false if aScoreDirector
implementation should not doConstraintMatch
tracking even if it supports it.
-
getWorkingSolution
public Solution_ getWorkingSolution()
Description copied from interface:ScoreDirector
ThePlanningSolution
that is used to calculate theScore
.Because a
Score
is best calculated incrementally (by deltas), theScoreDirector
needs to be notified when itsworking solution
changes.If the
working solution
has been changed sinceScoreDirector.calculateScore()
was called, itsScore
won't be correct.- Specified by:
getWorkingSolution
in interfaceScoreDirector<Solution_>
- Returns:
- never null
-
getWorkingEntityListRevision
public long getWorkingEntityListRevision()
- Specified by:
getWorkingEntityListRevision
in interfaceInnerScoreDirector<Solution_>
- Returns:
- used to check
InnerScoreDirector.isWorkingEntityListDirty(long)
later on
-
isAllChangesWillBeUndoneBeforeStepEnds
public boolean isAllChangesWillBeUndoneBeforeStepEnds()
-
setAllChangesWillBeUndoneBeforeStepEnds
public void setAllChangesWillBeUndoneBeforeStepEnds(boolean allChangesWillBeUndoneBeforeStepEnds)
Description copied from interface:InnerScoreDirector
Do not waste performance by propagating changes to step (or higher) mechanisms.- Specified by:
setAllChangesWillBeUndoneBeforeStepEnds
in interfaceInnerScoreDirector<Solution_>
- Parameters:
allChangesWillBeUndoneBeforeStepEnds
- true if all changes will be undone
-
getCalculationCount
public long getCalculationCount()
- Specified by:
getCalculationCount
in interfaceInnerScoreDirector<Solution_>
- Returns:
- at least 0L
-
resetCalculationCount
public void resetCalculationCount()
- Specified by:
resetCalculationCount
in interfaceInnerScoreDirector<Solution_>
-
getSupplyManager
public SupplyManager getSupplyManager()
- Specified by:
getSupplyManager
in interfaceInnerScoreDirector<Solution_>
- Returns:
- never null
-
setWorkingSolution
public void setWorkingSolution(Solution_ workingSolution)
Description copied from interface:ScoreDirector
Theworking solution
must never be the same instance as thebest solution
, it should be a (un)changed clone.Only call this method on a separate
ScoreDirector
instance, built bySolverFactory.getScoreDirectorFactory()
, not on the one used inside theSolver
itself.- Specified by:
setWorkingSolution
in interfaceScoreDirector<Solution_>
- Parameters:
workingSolution
- never null
-
doAndProcessMove
public Score doAndProcessMove(Move<Solution_> move, boolean assertMoveScoreFromScratch)
- Specified by:
doAndProcessMove
in interfaceInnerScoreDirector<Solution_>
- Parameters:
move
- never nullassertMoveScoreFromScratch
- true will hurt performance- Returns:
- never null
-
doAndProcessMove
public void doAndProcessMove(Move<Solution_> move, boolean assertMoveScoreFromScratch, Consumer<Score> moveProcessor)
- Specified by:
doAndProcessMove
in interfaceInnerScoreDirector<Solution_>
- 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
public boolean isWorkingEntityListDirty(long expectedWorkingEntityListRevision)
- Specified by:
isWorkingEntityListDirty
in interfaceInnerScoreDirector<Solution_>
- Parameters:
expectedWorkingEntityListRevision
- an- Returns:
- true if the entityList might have a different set of instances now
-
setWorkingEntityListDirty
protected void setWorkingEntityListDirty()
-
cloneWorkingSolution
public Solution_ cloneWorkingSolution()
Description copied from interface:InnerScoreDirector
Returns a planning clone of the solution, which is not a shallow clone nor a deep clone nor a partition clone.- Specified by:
cloneWorkingSolution
in interfaceInnerScoreDirector<Solution_>
- Returns:
- never null, planning clone
-
cloneSolution
public Solution_ cloneSolution(Solution_ originalSolution)
Description copied from interface:InnerScoreDirector
Returns a planning clone of the solution, which is not a shallow clone nor a deep clone nor a partition clone.- Specified by:
cloneSolution
in interfaceInnerScoreDirector<Solution_>
- Parameters:
originalSolution
- never null- Returns:
- never null, planning clone
-
getWorkingEntityCount
public int getWorkingEntityCount()
- Specified by:
getWorkingEntityCount
in interfaceInnerScoreDirector<Solution_>
- Returns:
>= 0
-
getWorkingEntityList
public List<Object> getWorkingEntityList()
- Specified by:
getWorkingEntityList
in interfaceInnerScoreDirector<Solution_>
- Returns:
- never null: an empty list if there are none
-
getWorkingValueCount
public int getWorkingValueCount()
- Specified by:
getWorkingValueCount
in interfaceInnerScoreDirector<Solution_>
- Returns:
>= 0
-
triggerVariableListeners
public void triggerVariableListeners()
- Specified by:
triggerVariableListeners
in interfaceScoreDirector<Solution_>
-
setCalculatedScore
protected void setCalculatedScore(Score score)
-
explainScore
public String explainScore()
Description copied from interface:ScoreDirector
Returns a diagnostic text that explains theScore
through theConstraintMatch
API to identify which constraints or planning entities cause that score quality. In case of aninfeasible
solution, this can help diagnose the cause of that.Do not parse this string. Instead, to provide this information in a UI or a service, use
ScoreDirector.getConstraintMatchTotalMap()
andScoreDirector.getIndictmentMap()
and convert those into a domain specific API.This automatically calls
ScoreDirector.calculateScore()
first.- Specified by:
explainScore
in interfaceScoreDirector<Solution_>
- Returns:
- never null
-
clone
public AbstractScoreDirector<Solution_,Factory_> clone()
Description copied from interface:InnerScoreDirector
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.
- Specified by:
clone
in interfaceInnerScoreDirector<Solution_>
- Overrides:
clone
in classObject
- Returns:
- never null
-
createChildThreadScoreDirector
public InnerScoreDirector<Solution_> createChildThreadScoreDirector(ChildThreadType childThreadType)
- Specified by:
createChildThreadScoreDirector
in interfaceInnerScoreDirector<Solution_>
-
close
public void close()
Description copied from interface:ScoreDirector
Needs to be called after use because some implementations need to clean up their resources.- Specified by:
close
in interfaceAutoCloseable
- Specified by:
close
in interfaceScoreDirector<Solution_>
-
beforeEntityAdded
public final void beforeEntityAdded(Object entity)
- Specified by:
beforeEntityAdded
in interfaceScoreDirector<Solution_>
-
afterEntityAdded
public final void afterEntityAdded(Object entity)
- Specified by:
afterEntityAdded
in interfaceScoreDirector<Solution_>
-
beforeVariableChanged
public final void beforeVariableChanged(Object entity, String variableName)
- Specified by:
beforeVariableChanged
in interfaceScoreDirector<Solution_>
-
afterVariableChanged
public final void afterVariableChanged(Object entity, String variableName)
- Specified by:
afterVariableChanged
in interfaceScoreDirector<Solution_>
-
beforeEntityRemoved
public final void beforeEntityRemoved(Object entity)
- Specified by:
beforeEntityRemoved
in interfaceScoreDirector<Solution_>
-
afterEntityRemoved
public final void afterEntityRemoved(Object entity)
- Specified by:
afterEntityRemoved
in interfaceScoreDirector<Solution_>
-
beforeEntityAdded
public void beforeEntityAdded(EntityDescriptor<Solution_> entityDescriptor, Object entity)
-
afterEntityAdded
public void afterEntityAdded(EntityDescriptor<Solution_> entityDescriptor, Object entity)
-
beforeVariableChanged
public void beforeVariableChanged(VariableDescriptor variableDescriptor, Object entity)
- Specified by:
beforeVariableChanged
in interfaceScoreDirector<Solution_>
-
afterVariableChanged
public void afterVariableChanged(VariableDescriptor variableDescriptor, Object entity)
- Specified by:
afterVariableChanged
in interfaceScoreDirector<Solution_>
-
changeVariableFacade
public void changeVariableFacade(VariableDescriptor variableDescriptor, Object entity, Object newValue)
- Specified by:
changeVariableFacade
in interfaceScoreDirector<Solution_>
-
beforeEntityRemoved
public void beforeEntityRemoved(EntityDescriptor<Solution_> entityDescriptor, Object entity)
-
afterEntityRemoved
public void afterEntityRemoved(EntityDescriptor<Solution_> entityDescriptor, Object entity)
-
beforeProblemFactAdded
public void beforeProblemFactAdded(Object problemFact)
- Specified by:
beforeProblemFactAdded
in interfaceScoreDirector<Solution_>
-
afterProblemFactAdded
public void afterProblemFactAdded(Object problemFact)
- Specified by:
afterProblemFactAdded
in interfaceScoreDirector<Solution_>
-
beforeProblemPropertyChanged
public void beforeProblemPropertyChanged(Object problemFactOrEntity)
- Specified by:
beforeProblemPropertyChanged
in interfaceScoreDirector<Solution_>
-
afterProblemPropertyChanged
public void afterProblemPropertyChanged(Object problemFactOrEntity)
- Specified by:
afterProblemPropertyChanged
in interfaceScoreDirector<Solution_>
-
beforeProblemFactRemoved
public void beforeProblemFactRemoved(Object problemFact)
- Specified by:
beforeProblemFactRemoved
in interfaceScoreDirector<Solution_>
-
afterProblemFactRemoved
public void afterProblemFactRemoved(Object problemFact)
- Specified by:
afterProblemFactRemoved
in interfaceScoreDirector<Solution_>
-
lookUpWorkingObject
public <E> E lookUpWorkingObject(E externalObject)
Description copied from interface:ScoreDirector
Translates an entity or fact instance (often from anotherThread
or JVM) to thisScoreDirector
's internal working instance. Useful forMove.rebase(ScoreDirector)
and in aProblemFactChange
.Matching is determined by the
LookUpStrategyType
onPlanningSolution
. Matching uses aPlanningId
by default.- Specified by:
lookUpWorkingObject
in interfaceScoreDirector<Solution_>
- Type Parameters:
E
- the object type- Parameters:
externalObject
- sometimes null- Returns:
- null if externalObject is null
-
lookUpWorkingObjectOrReturnNull
public <E> E lookUpWorkingObjectOrReturnNull(E externalObject)
Description copied from interface:ScoreDirector
As defined byScoreDirector.lookUpWorkingObject(Object)
, but doesn't fail fast if no workingObject was ever added for the externalObject. It's recommended to useScoreDirector.lookUpWorkingObject(Object)
instead, especially in aMove.rebase(ScoreDirector)
code.- Specified by:
lookUpWorkingObjectOrReturnNull
in interfaceScoreDirector<Solution_>
- Type Parameters:
E
- the object type- Parameters:
externalObject
- sometimes null- Returns:
- null if externalObject is null or if there is no workingObject for externalObject
-
assertExpectedWorkingScore
public void assertExpectedWorkingScore(Score expectedWorkingScore, Object completedAction)
Description copied from interface:InnerScoreDirector
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
ScoreDirector.calculateScore()
(when the score is otherwise determined) is correct.- Specified by:
assertExpectedWorkingScore
in interfaceInnerScoreDirector<Solution_>
- Parameters:
expectedWorkingScore
- never nullcompletedAction
- sometimes null, when assertion fails then the completedAction'sObject.toString()
is included in the exception message
-
assertShadowVariablesAreNotStale
public void assertShadowVariablesAreNotStale(Score expectedWorkingScore, Object completedAction)
Description copied from interface:InnerScoreDirector
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.
- Specified by:
assertShadowVariablesAreNotStale
in interfaceInnerScoreDirector<Solution_>
- Parameters:
expectedWorkingScore
- never nullcompletedAction
- sometimes null, when assertion fails then the completedAction'sObject.toString()
is included in the exception message
-
buildShadowVariableAnalysis
protected String buildShadowVariableAnalysis(boolean predicted)
- Parameters:
predicted
- true if the score was predicted and might have been calculated on another thread- Returns:
- never null
-
createShadowVariablesViolationMessage
protected String createShadowVariablesViolationMessage()
- Returns:
- null if there are no violations
-
assertWorkingScoreFromScratch
public void assertWorkingScoreFromScratch(Score workingScore, Object completedAction)
Description copied from interface:InnerScoreDirector
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.
- Specified by:
assertWorkingScoreFromScratch
in interfaceInnerScoreDirector<Solution_>
- 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
public void assertPredictedScoreFromScratch(Score workingScore, Object completedAction)
Description copied from interface:InnerScoreDirector
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.
- Specified by:
assertPredictedScoreFromScratch
in interfaceInnerScoreDirector<Solution_>
- 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_)
-
assertExpectedUndoMoveScore
public void assertExpectedUndoMoveScore(Move move, Score beforeMoveScore)
Description copied from interface:InnerScoreDirector
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.
- Specified by:
assertExpectedUndoMoveScore
in interfaceInnerScoreDirector<Solution_>
- Parameters:
move
- never nullbeforeMoveScore
- never null
-
buildScoreCorruptionAnalysis
protected String buildScoreCorruptionAnalysis(ScoreDirector<Solution_> uncorruptedScoreDirector, boolean predicted)
- Parameters:
uncorruptedScoreDirector
- never nullpredicted
- true if the score was predicted and might have been calculated on another thread- Returns:
- never null
-
-