Skip to content

Commit ea7248c

Browse files
author
Alen John
committed
Replace condition with polymorphism -Set 2
1 parent 0ab8b66 commit ea7248c

File tree

4 files changed

+54
-26
lines changed

4 files changed

+54
-26
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package net.finmath.interpolation;
2+
3+
public class ConstantExtrapolation extends Extrapolation {
4+
@Override
5+
public double getValue(double[] points, double[] values, double x) {
6+
return values[0];
7+
}
8+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package net.finmath.interpolation;
2+
3+
public abstract class Extrapolation {
4+
public abstract double getValue(double[] points, double[] values, double x);
5+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package net.finmath.interpolation;
2+
3+
public class LinearExtrapolation extends Extrapolation {
4+
@Override
5+
public double getValue(double[] points, double[] values, double x) {
6+
return values[0] + (values[1] - values[0]) / (points[1] - points[0]) * (x - points[0]);
7+
}
8+
}
9+

src/main/java/net/finmath/interpolation/RationalFunctionInterpolation.java

Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -181,49 +181,55 @@ public InterpolationMethod getInterpolationMethod() {
181181
* @param x The abscissa at which the interpolation should be performed.
182182
* @return The interpolated value (ordinate).
183183
*/
184-
public double getValue(final double x)
185-
{
184+
public double getValue(final double x) {
186185
synchronized(interpolatingRationalFunctionsLazyInitLock) {
187186
if(interpolatingRationalFunctions == null) {
188187
doCreateRationalFunctions();
189188
}
190189
}
191-
190+
192191
// Get interpolating rational function for the given point x
193192
final int pointIndex = java.util.Arrays.binarySearch(points, x);
194193
if(pointIndex >= 0) {
195194
return values[pointIndex];
196195
}
197-
196+
198197
int intervalIndex = -pointIndex-2;
199-
198+
200199
// Check for extrapolation
200+
Extrapolation extrapolation;
201201
if(intervalIndex < 0) {
202202
// Extrapolation
203-
if(extrapolationMethod == ExtrapolationMethod.CONSTANT) {
204-
return values[0];
205-
} else if(extrapolationMethod == ExtrapolationMethod.LINEAR) {
206-
return values[0]+(values[1]-values[0])/(points[1]-points[0])*(x-points[0]);
207-
} else {
208-
intervalIndex = 0;
209-
}
210-
}
211-
else if(intervalIndex > points.length-2) {
203+
extrapolation = getExtrapolationMethod();
204+
intervalIndex = 0;
205+
} else if(intervalIndex > points.length-2) {
212206
// Extrapolation
213-
if(extrapolationMethod == ExtrapolationMethod.CONSTANT) {
214-
return values[points.length-1];
215-
} else if(extrapolationMethod == ExtrapolationMethod.LINEAR) {
216-
return values[points.length-1]+(values[points.length-2]-values[points.length-1])/(points[points.length-2]-points[points.length-1])*(x-points[points.length-1]);
217-
} else {
218-
intervalIndex = points.length-2;
219-
}
207+
extrapolation = getExtrapolationMethod();
208+
intervalIndex = points.length-2;
209+
} else {
210+
extrapolation = null;
211+
}
212+
213+
// Calculate interpolating value or use extrapolation
214+
if(extrapolation == null) {
215+
final RationalFunction rationalFunction = interpolatingRationalFunctions[intervalIndex];
216+
return rationalFunction.getValue(x-points[intervalIndex]);
217+
} else {
218+
return extrapolation.getValue(points, values, x);
219+
}
220+
}
221+
222+
public Extrapolation getExtrapolationMethod() {
223+
if(extrapolationMethod == ExtrapolationMethod.CONSTANT) {
224+
return new ConstantExtrapolation();
225+
} else if(extrapolationMethod == ExtrapolationMethod.LINEAR) {
226+
return new LinearExtrapolation();
227+
} else {
228+
return null;
220229
}
221-
222-
final RationalFunction rationalFunction = interpolatingRationalFunctions[intervalIndex];
223-
224-
// Calculate interpolating value
225-
return rationalFunction.getValue(x-points[intervalIndex]);
226230
}
231+
232+
227233

228234
private void doCreateRationalFunctions()
229235
{

0 commit comments

Comments
 (0)