Package org.optaplanner.core.api.score.buildin.bendable

## Class BendableScore

- java.lang.Object
- - org.optaplanner.core.api.score.AbstractScore<Score_>
  - - org.optaplanner.core.api.score.AbstractBendableScore<BendableScore>
    - - org.optaplanner.core.api.score.buildin.bendable.BendableScore

- All Implemented Interfaces:
    `Serializable`, `Comparable<BendableScore>`, `Score<BendableScore>`

      public final class BendableScore
      extends AbstractBendableScore<BendableScore>

  This `Score` is based on n levels of int constraints. The number of levels is bendable at configuration time.

  This class is immutable.

  The `getHardLevelsSize()` and `getSoftLevelsSize()` must be the same as in the `BendableScoreDefinition` used.

  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
    --- | --- | ---
    `protected` | `BendableScore​(int initScore, int[] hardScores, int[] softScores)` |

  - ### Method Summary

    All Methods Static Methods Instance Methods Concrete Methods
    Modifier and Type | Method | Description
    --- | --- | ---
    `BendableScore` | `add​(BendableScore addend)` | Returns a Score whose value is (this + addend).
    `int` | `compareTo​(BendableScore other)` |
    `BendableScore` | `divide​(double divisor)` | Returns a Score whose value is (this / divisor).
    `boolean` | `equals​(Object o)` |
    `int` | `getHardLevelsSize()` | The sum of this and `AbstractBendableScore.getSoftLevelsSize()` equals `AbstractBendableScore.getLevelsSize()`.
    `int` | `getHardOrSoftScore​(int level)` |
    `int` | `getHardScore​(int hardLevel)` |
    `int[]` | `getHardScores()` |
    `int` | `getLevelsSize()` |
    `int` | `getSoftLevelsSize()` | The sum of `AbstractBendableScore.getHardLevelsSize()` and this equals `AbstractBendableScore.getLevelsSize()`.
    `int` | `getSoftScore​(int softLevel)` |
    `int[]` | `getSoftScores()` |
    `int` | `hashCode()` |
    `boolean` | `isFeasible()` | A `PlanningSolution` is feasible if it has no broken hard constraints and `Score.isSolutionInitialized()` is true.
    `BendableScore` | `multiply​(double multiplicand)` | Returns a Score whose value is (this * multiplicand).
    `BendableScore` | `negate()` | Returns a Score whose value is (- this).
    `static BendableScore` | `of​(int[] hardScores, int[] softScores)` | Creates a new `BendableScore`.
    `static BendableScore` | `ofHard​(int hardLevelsSize, int softLevelsSize, int hardLevel, int hardScore)` | Creates a new `BendableScore`.
    `static BendableScore` | `ofSoft​(int hardLevelsSize, int softLevelsSize, int softLevel, int softScore)` | Creates a new `BendableScore`.
    `static BendableScore` | `ofUninitialized​(int initScore, int[] hardScores, int[] softScores)` | Creates a new `BendableScore`.
    `static BendableScore` | `parseScore​(String scoreString)` |
    `BendableScore` | `power​(double exponent)` | Returns a Score whose value is (this ^ exponent).
    `BendableScore` | `subtract​(BendableScore subtrahend)` | Returns a Score whose value is (this - subtrahend).
    `Number[]` | `toLevelNumbers()` | Returns an array of numbers representing the Score.
    `String` | `toShortString()` | Like `Object.toString()`, but trims score levels which have a zero weight.
    `String` | `toString()` |
    `void` | `validateCompatible​(BendableScore other)` |
    `BendableScore` | `withInitScore​(int newInitScore)` | For example `0hard/-8soft` with `-7` returns `-7init/0hard/-8soft`.
    `static BendableScore` | `zero​(int hardLevelsSize, int softLevelsSize)` | Creates a new `BendableScore`.

    - ### Methods inherited from class org.optaplanner.core.api.score.AbstractBendableScore

      `buildBendableShortString, parseBendableScoreTokens`

    - ### Methods inherited from class org.optaplanner.core.api.score.AbstractScore

      `buildScorePattern, buildShortString, getInitPrefix, getInitScore, isSolutionInitialized, parseInitScore, parseLevelAsBigDecimal, parseLevelAsInt, parseLevelAsLong, parseScoreTokens`

    - ### Methods inherited from class java.lang.Object

      `clone, finalize, getClass, notify, notifyAll, wait, wait, wait`

- - ### Constructor Detail

    - #### BendableScore

          protected BendableScore​(int initScore,
                                  int[] hardScores,
                                  int[] softScores)

      Parameters:
        `initScore` - see `Score.getInitScore()`
        `hardScores` - never null
        `softScores` - 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 new `BendableScore`.
      Parameters:
        `initScore` - see `Score.getInitScore()`
        `hardScores` - never null, never change that array afterwards: it must be immutable
        `softScores` - never null, never change that array afterwards: it must be immutable
      Returns:
        never null

    - #### of

          public static BendableScore of​(int[] hardScores,
                                         int[] softScores)

      Creates a new `BendableScore`.
      Parameters:
        `hardScores` - never null, never change that array afterwards: it must be immutable
        `softScores` - never null, never change that array afterwards: it must be immutable
      Returns:
        never null

    - #### zero

          public static BendableScore zero​(int hardLevelsSize,
                                           int softLevelsSize)

      Creates a new `BendableScore`.
      Parameters:
        `hardLevelsSize` - at least 0
        `softLevelsSize` - at least 0
      Returns:
        never null

    - #### ofHard

          public static BendableScore ofHard​(int hardLevelsSize,
                                             int softLevelsSize,
                                             int hardLevel,
                                             int hardScore)

      Creates a new `BendableScore`.
      Parameters:
        `hardLevelsSize` - at least 0
        `softLevelsSize` - at least 0
        `hardLevel` - at least 0, less than hardLevelsSize
        `hardScore` - any
      Returns:
        never null

    - #### ofSoft

          public static BendableScore ofSoft​(int hardLevelsSize,
                                             int softLevelsSize,
                                             int softLevel,
                                             int softScore)

      Creates a new `BendableScore`.
      Parameters:
        `hardLevelsSize` - at least 0
        `softLevelsSize` - at least 0
        `softLevel` - at least 0, less than softLevelsSize
        `softScore` - 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: `AbstractBendableScore`
      The sum of this and `AbstractBendableScore.getSoftLevelsSize()` equals `AbstractBendableScore.getLevelsSize()`.
      Specified by:
        `getHardLevelsSize` in class `AbstractBendableScore<BendableScore>`
      Returns:
        `>= 0` and `<` `AbstractBendableScore.getLevelsSize()`

    - #### getHardScore

          public int getHardScore​(int hardLevel)

      Parameters:
        `hardLevel` - `0 <= hardLevel <` `getHardLevelsSize()`. The `scoreLevel` is `hardLevel` for hard levels and `softLevel + hardLevelSize` for soft levels.
      Returns:
        higher is better

    - #### getSoftLevelsSize

          public int getSoftLevelsSize()

      Description copied from class: `AbstractBendableScore`
      The sum of `AbstractBendableScore.getHardLevelsSize()` and this equals `AbstractBendableScore.getLevelsSize()`.
      Specified by:
        `getSoftLevelsSize` in class `AbstractBendableScore<BendableScore>`
      Returns:
        `>= 0` and `<` `AbstractBendableScore.getLevelsSize()`

    - #### getSoftScore

          public int getSoftScore​(int softLevel)

      Parameters:
        `softLevel` - `0 <= softLevel <` `getSoftLevelsSize()`. The `scoreLevel` is `hardLevel` for hard levels and `softLevel + hardLevelSize` for soft levels.
      Returns:
        higher is better

    - #### withInitScore

          public BendableScore withInitScore​(int newInitScore)

      Description copied from interface: `Score`
      For example `0hard/-8soft` with `-7` returns `-7init/0hard/-8soft`.
      Parameters:
        `newInitScore` - always negative (except in statistical calculations), 0 if all planning variables are initialized
      Returns:
        equals score except that `Score.getInitScore()` is set to `newInitScore`

    - #### getLevelsSize

          public int getLevelsSize()

      Specified by:
        `getLevelsSize` in class `AbstractBendableScore<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: `Score`
      A `PlanningSolution` is feasible if it has no broken hard constraints and `Score.isSolutionInitialized()` is true. Simple scores (`SimpleScore`, `SimpleLongScore`, `SimpleBigDecimalScore`) are always feasible, if their `Score.getInitScore()` is 0.
      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: `Score`
      Returns a Score whose value is (this + addend).
      Parameters:
        `addend` - value to be added to this Score
      Returns:
        this + addend

    - #### subtract

          public BendableScore subtract​(BendableScore subtrahend)

      Description copied from interface: `Score`
      Returns a Score whose value is (this - subtrahend).
      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: `Score`
      Returns a Score whose value is (this * multiplicand). When rounding is needed, it should be floored (as defined by `Math.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.

      Parameters:
        `multiplicand` - value to be multiplied by this Score.
      Returns:
        this * multiplicand

    - #### divide

          public BendableScore divide​(double divisor)

      Description copied from interface: `Score`
      Returns a Score whose value is (this / divisor). When rounding is needed, it should be floored (as defined by `Math.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.

      Parameters:
        `divisor` - value by which this Score is to be divided
      Returns:
        this / divisor

    - #### power

          public BendableScore power​(double exponent)

      Description copied from interface: `Score`
      Returns a Score whose value is (this ^ exponent). When rounding is needed, it should be floored (as defined by `Math.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.

      Parameters:
        `exponent` - value by which this Score is to be powered
      Returns:
        this ^ exponent

    - #### negate

          public BendableScore negate()

      Description copied from interface: `Score`
      Returns a Score whose value is (- this).
      Returns:
        - this

    - #### toLevelNumbers

          public Number[] toLevelNumbers()

      Description copied from interface: `Score`
      Returns 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 specific `Score` implementation.

      For example: `-0hard/-7soft` returns `new int{-0, -7}`

      The level numbers do not contain the `Score.getInitScore()`. For example: `-3init/-0hard/-7soft` also returns `new int{-0, -7}`

      Returns:
        never null
      See Also:
        `ScoreDefinition.fromLevelNumbers(int, Number[])`

    - #### equals

          public boolean equals​(Object o)

      Overrides:
        `equals` in class `Object`

    - #### hashCode

          public int hashCode()

      Overrides:
        `hashCode` in class `Object`

    - #### compareTo

          public int compareTo​(BendableScore other)

    - #### toShortString

          public String toShortString()

      Description copied from interface: `Score`
      Like `Object.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.

      Returns:
        never null

    - #### toString

          public String toString()

      Overrides:
        `toString` in class `Object`

    - #### validateCompatible

          public void validateCompatible​(BendableScore other)