Skip to content

Use MathUtils.twoSum for 2Sum algorithm

Andrew Goetz requested to merge andrewsgoetz/orekit:twosum into develop

Tested for performance regression in PoissonSeries.CompiledSeries.value with the following snippet and did not find any regression.

final File orekitData = new File("orekit-data-master");
DataContext.getDefault().getDataProvidersManager().addProvider(new DirectoryCrawler(orekitData));

// Taken from IERSConventions.java.
final String X_SERIES = "/assets/org/orekit/IERS-conventions/2010/tab5.2a.txt";
final String Y_SERIES = "/assets/org/orekit/IERS-conventions/2010/tab5.2b.txt";
final String S_SERIES = "/assets/org/orekit/IERS-conventions/2010/tab5.2d.txt";
final double microAS = Constants.ARC_SECONDS_TO_RADIANS * 1.0e-6;
final PoissonSeriesParser parser = new PoissonSeriesParser(17)
        .withPolynomialPart('t', PolynomialParser.Unit.MICRO_ARC_SECONDS).withFirstDelaunay(4)
        .withFirstPlanetary(9).withSinCos(0, 2, microAS, 3, microAS);
final PoissonSeries.CompiledSeries xys;
try (InputStream xIn = IERSConventions.class.getResourceAsStream(X_SERIES);
        InputStream yIn = IERSConventions.class.getResourceAsStream(Y_SERIES);
        InputStream sIn = IERSConventions.class.getResourceAsStream(S_SERIES)) {
    final PoissonSeries xSeries = parser.parse(xIn, X_SERIES);
    final PoissonSeries ySeries = parser.parse(yIn, Y_SERIES);
    final PoissonSeries sSeries = parser.parse(sIn, S_SERIES);
    xys = PoissonSeries.compile(xSeries, ySeries, sSeries);
} catch (IOException e) {
    throw new OrekitException(OrekitMessages.INTERNAL_ERROR, e);
}

final TimeScales timeScales = TimeScalesFactory.getTimeScales();
final String NUTATION_ARGUMENTS = "/assets/org/orekit/IERS-conventions/2010/nutation-arguments.txt";
FundamentalNutationArguments arguments;
try (InputStream in = IERSConventions.class.getResourceAsStream(NUTATION_ARGUMENTS)) {
    arguments = new FundamentalNutationArguments(IERSConventions.IERS_2010, null, in, NUTATION_ARGUMENTS,
            timeScales);
} catch (IOException e) {
    throw new OrekitException(OrekitMessages.INTERNAL_ERROR, e);
}

final DatesSelector datesSelector = new FixedStepSelector(3600., TimeScalesFactory.getTAI());
final List<AbsoluteDate> dates = datesSelector.selectDates(
        new AbsoluteDate("2000-01-01T00:00:00", TimeScalesFactory.getTAI()),
        new AbsoluteDate("2020-01-01T00:00:00", TimeScalesFactory.getTAI()));

// Accumulate values to make sure there's no optimizing away being done on the sly.
final long start = System.currentTimeMillis();
double accum = 0.;
for (final AbsoluteDate date : dates) {
    // Call to TwoSum is in PoissonSeries.CompiledSeries.value.
    final double[] value = xys.value(arguments.evaluateAll(date));
    accum += value[0] + value[1] + value[2];
}
final long stop = System.currentTimeMillis();
System.out.println(accum);
System.out.println(stop - start);
Edited by Andrew Goetz

Merge request reports