package name.abuchen.portfolio.math;
import java.time.LocalDate;
import java.util.List;
import name.abuchen.portfolio.math.NewtonGoalSeek.Function;
import name.abuchen.portfolio.util.Dates;
@SuppressWarnings("nls")
/* package */class NPVFunction implements Function
{
private final int[] days;
private final double[] values;
public NPVFunction(List<LocalDate> dates, List<Double> values)
{
if (dates == null || values == null)
throw new NullPointerException("dates and/or values are null");
if (dates.size() != values.size())
throw new UnsupportedOperationException("dates and values must have equal size.");
if (dates.isEmpty() || values.isEmpty())
throw new UnsupportedOperationException("at least one data point must be provided");
this.days = new int[dates.size()];
for (int ii = 0; ii < dates.size(); ii++)
this.days[ii] = Dates.daysBetween(dates.get(0), dates.get(ii));
this.values = new double[values.size()];
for (int ii = 0; ii < values.size(); ii++)
this.values[ii] = values.get(ii);
}
@Override
public double compute(double rate)
{
double answer = 0;
for (int ii = 0; ii < days.length; ii++)
{
answer += values[ii] / Math.pow(rate, days[ii] / 365.0);
}
return answer;
}
}