Class BendableScore
- java.lang.Object
-
- org.optaplanner.core.api.score.AbstractScore<S>
-
- org.optaplanner.core.api.score.AbstractBendableScore<BendableScore>
-
- org.optaplanner.core.api.score.buildin.bendable.BendableScore
-
- All Implemented Interfaces:
Serializable,Comparable<BendableScore>,FeasibilityScore<BendableScore>,Score<BendableScore>
public final class BendableScore extends AbstractBendableScore<BendableScore> implements FeasibilityScore<BendableScore>
ThisScoreis based on n levels of int constraints. The number of levels is bendable at configuration time.This class is immutable.
The
getHardLevelsSize()andgetSoftLevelsSize()must be the same as in theBendableScoreDefinitionused.- See Also:
Score, Serialized Form
-
-
Field Summary
-
Fields inherited from class org.optaplanner.core.api.score.AbstractBendableScore
HARD_LABEL, LEVEL_SUFFIXES, SOFT_LABEL
-
Fields inherited from class org.optaplanner.core.api.score.AbstractScore
INIT_LABEL, initScore
-
-
Constructor Summary
Constructors Modifier Constructor Description protectedBendableScore(int initScore, int[] hardScores, int[] softScores)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Deprecated Methods Modifier and Type Method Description BendableScoreadd(BendableScore addend)Returns a Score whose value is (this + addend).intcompareTo(BendableScore other)BendableScoredivide(double divisor)Returns a Score whose value is (this / divisor).booleanequals(Object o)intgetHardLevelsSize()The sum of this andAbstractBendableScore.getSoftLevelsSize()equalsAbstractBendableScore.getLevelsSize().intgetHardOrSoftScore(int level)intgetHardScore(int hardLevel)int[]getHardScores()intgetLevelsSize()intgetSoftLevelsSize()The sum ofAbstractBendableScore.getHardLevelsSize()and this equalsAbstractBendableScore.getLevelsSize().intgetSoftScore(int softLevel)int[]getSoftScores()inthashCode()booleanisCompatibleArithmeticArgument(Score otherScore)booleanisFeasible()APlanningSolutionis feasible if it has no broken hard constraints andScore.isSolutionInitialized()is true.BendableScoremultiply(double multiplicand)Returns a Score whose value is (this * multiplicand).BendableScorenegate()Returns a Score whose value is (- this).static BendableScoreof(int[] hardScores, int[] softScores)Creates a newBendableScore.static BendableScoreofHard(int hardLevelsSize, int softLevelsSize, int hardLevel, int hardScore)Creates a newBendableScore.static BendableScoreofSoft(int hardLevelsSize, int softLevelsSize, int softLevel, int softScore)Creates a newBendableScore.static BendableScoreofUninitialized(int initScore, int[] hardScores, int[] softScores)Creates a newBendableScore.static BendableScoreparseScore(String scoreString)BendableScorepower(double exponent)Returns a Score whose value is (this ^ exponent).BendableScoresubtract(BendableScore subtrahend)Returns a Score whose value is (this - subtrahend).Number[]toLevelNumbers()Returns an array of numbers representing the Score.StringtoShortString()LikeObject.toString(), but trims score levels which have a zero weight.StringtoString()voidvalidateCompatible(BendableScore other)static BendableScorevalueOf(int[] hardScores, int[] softScores)Deprecated.in favor ofof(int[], int[])static BendableScorevalueOfUninitialized(int initScore, int[] hardScores, int[] softScores)Deprecated.in favor ofofUninitialized(int, int[], int[])BendableScorewithInitScore(int newInitScore)For example0hard/-8softwith-7returns-7init/0hard/-8soft.static BendableScorezero(int hardLevelsSize, int softLevelsSize)Creates a newBendableScore.-
Methods inherited from class org.optaplanner.core.api.score.AbstractBendableScore
buildBendableShortString, parseBendableScoreTokens
-
Methods inherited from class org.optaplanner.core.api.score.AbstractScore
assertNoInitScore, buildScorePattern, buildShortString, getInitPrefix, getInitScore, isSolutionInitialized, parseInitScore, parseLevelAsBigDecimal, parseLevelAsDouble, parseLevelAsInt, parseLevelAsLong, parseScoreTokens
-
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface org.optaplanner.core.api.score.Score
getInitScore, isSolutionInitialized, toInitializedScore
-
-
-
-
Constructor Detail
-
BendableScore
protected BendableScore(int initScore, int[] hardScores, int[] softScores)- Parameters:
initScore- seeScore.getInitScore()hardScores- never nullsoftScores- never null
-
-
Method Detail
-
parseScore
public static BendableScore parseScore(String scoreString)
- Parameters:
scoreString- never null- Returns:
- never null
-
ofUninitialized
public static BendableScore ofUninitialized(int initScore, int[] hardScores, int[] softScores)
Creates a newBendableScore.- Parameters:
initScore- seeScore.getInitScore()hardScores- never null, never change that array afterwards: it must be immutablesoftScores- never null, never change that array afterwards: it must be immutable- Returns:
- never null
-
valueOfUninitialized
@Deprecated public static BendableScore valueOfUninitialized(int initScore, int[] hardScores, int[] softScores)
Deprecated.in favor ofofUninitialized(int, int[], int[])
-
of
public static BendableScore of(int[] hardScores, int[] softScores)
Creates a newBendableScore.- Parameters:
hardScores- never null, never change that array afterwards: it must be immutablesoftScores- never null, never change that array afterwards: it must be immutable- Returns:
- never null
-
valueOf
@Deprecated public static BendableScore valueOf(int[] hardScores, int[] softScores)
Deprecated.in favor ofof(int[], int[])
-
zero
public static BendableScore zero(int hardLevelsSize, int softLevelsSize)
Creates a newBendableScore.- Parameters:
hardLevelsSize- at least 0softLevelsSize- at least 0- Returns:
- never null
-
ofHard
public static BendableScore ofHard(int hardLevelsSize, int softLevelsSize, int hardLevel, int hardScore)
Creates a newBendableScore.- Parameters:
hardLevelsSize- at least 0softLevelsSize- at least 0hardLevel- at least 0, less than hardLevelsSizehardScore- any- Returns:
- never null
-
ofSoft
public static BendableScore ofSoft(int hardLevelsSize, int softLevelsSize, int softLevel, int softScore)
Creates a newBendableScore.- Parameters:
hardLevelsSize- at least 0softLevelsSize- at least 0softLevel- at least 0, less than softLevelsSizesoftScore- any- Returns:
- never null
-
getHardScores
public int[] getHardScores()
- Returns:
- not null, array copy because this class is immutable
-
getSoftScores
public int[] getSoftScores()
- Returns:
- not null, array copy because this class is immutable
-
getHardLevelsSize
public int getHardLevelsSize()
Description copied from class:AbstractBendableScoreThe sum of this andAbstractBendableScore.getSoftLevelsSize()equalsAbstractBendableScore.getLevelsSize().- Specified by:
getHardLevelsSizein classAbstractBendableScore<BendableScore>- Returns:
>= 0and<AbstractBendableScore.getLevelsSize()
-
getHardScore
public int getHardScore(int hardLevel)
- Parameters:
hardLevel-0 <= hardLevel <getHardLevelsSize(). ThescoreLevelishardLevelfor hard levels andsoftLevel + hardLevelSizefor soft levels.- Returns:
- higher is better
-
getSoftLevelsSize
public int getSoftLevelsSize()
Description copied from class:AbstractBendableScoreThe sum ofAbstractBendableScore.getHardLevelsSize()and this equalsAbstractBendableScore.getLevelsSize().- Specified by:
getSoftLevelsSizein classAbstractBendableScore<BendableScore>- Returns:
>= 0and<AbstractBendableScore.getLevelsSize()
-
getSoftScore
public int getSoftScore(int softLevel)
- Parameters:
softLevel-0 <= softLevel <getSoftLevelsSize(). ThescoreLevelishardLevelfor hard levels andsoftLevel + hardLevelSizefor soft levels.- Returns:
- higher is better
-
withInitScore
public BendableScore withInitScore(int newInitScore)
Description copied from interface:ScoreFor example0hard/-8softwith-7returns-7init/0hard/-8soft.- Specified by:
withInitScorein interfaceScore<BendableScore>- Parameters:
newInitScore- always negative (except in statistical calculations), 0 if all planning variables are initialized- Returns:
- equals score except that
Score.getInitScore()is set tonewInitScore
-
getLevelsSize
public int getLevelsSize()
- Specified by:
getLevelsSizein classAbstractBendableScore<BendableScore>- Returns:
AbstractBendableScore.getHardLevelsSize()+AbstractBendableScore.getSoftLevelsSize()
-
getHardOrSoftScore
public int getHardOrSoftScore(int level)
- Parameters:
level-0 <= level <getLevelsSize()- Returns:
- higher is better
-
isFeasible
public boolean isFeasible()
Description copied from interface:FeasibilityScoreAPlanningSolutionis feasible if it has no broken hard constraints andScore.isSolutionInitialized()is true.- Specified by:
isFeasiblein interfaceFeasibilityScore<BendableScore>- Specified by:
isFeasiblein interfaceScore<BendableScore>- Returns:
- true if the hard score is 0 or higher and the
Score.getInitScore()is 0.
-
add
public BendableScore add(BendableScore addend)
Description copied from interface:ScoreReturns a Score whose value is (this + addend).- Specified by:
addin interfaceScore<BendableScore>- Parameters:
addend- value to be added to this Score- Returns:
- this + addend
-
subtract
public BendableScore subtract(BendableScore subtrahend)
Description copied from interface:ScoreReturns a Score whose value is (this - subtrahend).- Specified by:
subtractin interfaceScore<BendableScore>- Parameters:
subtrahend- value to be subtracted from this Score- Returns:
- this - subtrahend, rounded as necessary
-
multiply
public BendableScore multiply(double multiplicand)
Description copied from interface:ScoreReturns a Score whose value is (this * multiplicand). When rounding is needed, it should be floored (as defined byMath.floor(double)).If the implementation has a scale/precision, then the unspecified scale/precision of the double multiplicand should have no impact on the returned scale/precision.
- Specified by:
multiplyin interfaceScore<BendableScore>- Parameters:
multiplicand- value to be multiplied by this Score.- Returns:
- this * multiplicand
-
divide
public BendableScore divide(double divisor)
Description copied from interface:ScoreReturns a Score whose value is (this / divisor). When rounding is needed, it should be floored (as defined byMath.floor(double)).If the implementation has a scale/precision, then the unspecified scale/precision of the double divisor should have no impact on the returned scale/precision.
- Specified by:
dividein interfaceScore<BendableScore>- Parameters:
divisor- value by which this Score is to be divided- Returns:
- this / divisor
-
power
public BendableScore power(double exponent)
Description copied from interface:ScoreReturns a Score whose value is (this ^ exponent). When rounding is needed, it should be floored (as defined byMath.floor(double)).If the implementation has a scale/precision, then the unspecified scale/precision of the double exponent should have no impact on the returned scale/precision.
- Specified by:
powerin interfaceScore<BendableScore>- Parameters:
exponent- value by which this Score is to be powered- Returns:
- this ^ exponent
-
negate
public BendableScore negate()
Description copied from interface:ScoreReturns a Score whose value is (- this).- Specified by:
negatein interfaceScore<BendableScore>- Returns:
- - this
-
toLevelNumbers
public Number[] toLevelNumbers()
Description copied from interface:ScoreReturns an array of numbers representing the Score. Each number represents 1 score level. A greater score level uses a lower array index than a lesser score level.When rounding is needed, each rounding should be floored (as defined by
Math.floor(double)). The length of the returned array must be stable for a specificScoreimplementation.For example:
-0hard/-7softreturnsnew int{-0, -7}The level numbers do not contain the
Score.getInitScore(). For example:-3init/-0hard/-7softalso returnsnew int{-0, -7}- Specified by:
toLevelNumbersin interfaceScore<BendableScore>- Returns:
- never null
- See Also:
ScoreDefinition.fromLevelNumbers(int, Number[])
-
compareTo
public int compareTo(BendableScore other)
- Specified by:
compareToin interfaceComparable<BendableScore>
-
toShortString
public String toShortString()
Description copied from interface:ScoreLikeObject.toString(), but trims score levels which have a zero weight. For example 0hard/-258soft returns -258soft.Do not use this format to persist information as text, use
Object.toString()instead, so it can be parsed reliably.- Specified by:
toShortStringin interfaceScore<BendableScore>- Returns:
- never null
-
validateCompatible
public void validateCompatible(BendableScore other)
-
isCompatibleArithmeticArgument
public boolean isCompatibleArithmeticArgument(Score otherScore)
- Specified by:
isCompatibleArithmeticArgumentin interfaceScore<BendableScore>- Parameters:
otherScore- never null- Returns:
- true if the otherScore is accepted as a parameter of
Score.add(Score),Score.subtract(Score)andComparable.compareTo(Object).
-
-