| applyInternalConstraints(double, double[]) |   | 6% |   | 12% | 4 | 5 | 8 | 10 | 0 | 1 |
| validateProductEventTimesInGrid() |   | 7% |   | 10% | 5 | 6 | 10 | 12 | 0 | 1 |
| applyContinuousObstacleIfNeeded(double, double[], AbstractADI2D.DoubleTernaryOperator) |  | 0% |  | 0% | 5 | 5 | 12 | 12 | 1 | 1 |
| applyExerciseObstacleIfNeeded(double, double, double[], AbstractADI2D.DoubleTernaryOperator) |   | 12% |   | 10% | 5 | 6 | 8 | 12 | 0 | 1 |
| isProductEventTime(double) |   | 15% |   | 16% | 3 | 4 | 5 | 7 | 0 | 1 |
| getValueWithContinuousObstacle(double, double, DoubleBinaryOperator, AbstractADI2D.DoubleTernaryOperator) |  | 0% | | n/a | 1 | 1 | 5 | 5 | 1 | 1 |
| getValue(double, double, DoubleBinaryOperator, AbstractADI2D.DoubleTernaryOperator) |  | 0% | | n/a | 1 | 1 | 4 | 4 | 1 | 1 |
| getValue(double, double, DoubleBinaryOperator) |  | 0% | | n/a | 1 | 1 | 4 | 4 | 1 | 1 |
| isInternalConstraintActive(double, double, double) |  | 0% |  | 0% | 2 | 2 | 3 | 3 | 1 | 1 |
| getValuesInternal(double, DoubleBinaryOperator, AbstractADI2D.DoubleTernaryOperator, AbstractADI2D.DoubleTernaryOperator) |   | 93% |   | 75% | 3 | 7 | 2 | 33 | 0 | 1 |
| applyProductEventConditionIfNeeded(double, double[]) |   | 40% |   | 50% | 1 | 2 | 2 | 4 | 0 | 1 |
| getValues(double, DoubleBinaryOperator) |  | 0% | | n/a | 1 | 1 | 1 | 1 | 1 | 1 |
| getValuesWithContinuousObstacle(double, DoubleBinaryOperator, AbstractADI2D.DoubleTernaryOperator) |  | 0% | | n/a | 1 | 1 | 1 | 1 | 1 | 1 |
| AbstractADI2D(FiniteDifferenceEquityModel, FiniteDifferenceEquityProduct, SpaceTimeDiscretization, Exercise) |   | 93% |   | 50% | 2 | 3 | 1 | 18 | 0 | 1 |
| add(double[], double[]) |   | 85% |   | 75% | 1 | 3 | 1 | 6 | 0 | 1 |
| subtract(double[], double[]) |   | 85% |   | 75% | 1 | 3 | 1 | 6 | 0 | 1 |
| sanitize(double[]) |   | 79% |   | 75% | 1 | 3 | 1 | 5 | 0 | 1 |
| lambda$getValues$2(DoubleBinaryOperator, double, double, double) |  | 0% | | n/a | 1 | 1 | 1 | 1 | 1 | 1 |
| lambda$getValues$1(DoubleUnaryOperator, double, double, double) |  | 0% | | n/a | 1 | 1 | 1 | 1 | 1 | 1 |
| applyA0Explicit(double[], double) |  | 100% |  | 100% | 0 | 4 | 0 | 24 | 0 | 1 |
| applyA1Explicit(double[], double) |  | 100% |  | 100% | 0 | 4 | 0 | 21 | 0 | 1 |
| applyA2Explicit(double[], double) |  | 100% |  | 100% | 0 | 4 | 0 | 21 | 0 | 1 |
| solveFirstDirectionLines(double[], double, double) |  | 100% |  | 100% | 0 | 4 | 0 | 14 | 0 | 1 |
| solveSecondDirectionLines(double[], double, double) |  | 100% |  | 100% | 0 | 4 | 0 | 14 | 0 | 1 |
| applyOuterBoundaries(double, double[]) |  | 100% |  | 100% | 0 | 3 | 0 | 7 | 0 | 1 |
| performDouglasHalfStep(double[], double, double) |  | 100% | | n/a | 0 | 1 | 0 | 15 | 0 | 1 |
| getUpperBoundaryValueForFirstDirection(double, int, double) |  | 100% | | n/a | 0 | 1 | 0 | 3 | 0 | 1 |
| getUpperBoundaryValueForSecondDirection(double, int, double) |  | 100% | | n/a | 0 | 1 | 0 | 3 | 0 | 1 |
| getLowerBoundaryValueForFirstDirection(double, int, double) |  | 100% | | n/a | 0 | 1 | 0 | 3 | 0 | 1 |
| getLowerBoundaryValueForSecondDirection(double, int, double) |  | 100% | | n/a | 0 | 1 | 0 | 3 | 0 | 1 |
| performStableDouglasStep(double[], double, double) |  | 100% | | n/a | 0 | 1 | 0 | 6 | 0 | 1 |
| getValue(double, double, DoubleUnaryOperator) |  | 100% | | n/a | 0 | 1 | 0 | 4 | 0 | 1 |
| scale(double[], double) |  | 100% |  | 100% | 0 | 2 | 0 | 4 | 0 | 1 |
| overwriteBoundaryRow(TridiagonalMatrix, double[], int, double) |  | 100% | | n/a | 0 | 1 | 0 | 5 | 0 | 1 |
| applyFullExplicitOperator(double[], double) |  | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |
| extractBoundaryValue(BoundaryCondition, double) |  | 100% |   | 75% | 1 | 3 | 0 | 3 | 0 | 1 |
| getValues(double, DoubleUnaryOperator) |  | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |
| getValues(double, DoubleBinaryOperator, AbstractADI2D.DoubleTernaryOperator) |  | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |
| flatten(int, int) |  | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |
| lambda$getValues$0(DoubleUnaryOperator, double, double) |  | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |
| getStencilBuilder() |  | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |
| getN() |  | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |
| getN1() |  | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |
| getN0() |  | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |
| getX1Grid() |  | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |
| getX0Grid() |  | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |
| getTheta() |  | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |
| getExercise() |  | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |
| getSpaceTimeDiscretization() |  | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |
| getProduct() |  | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |
| getModel() |  | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |