Skip to content
Snippets Groups Projects
Commit acf902ea authored by Luc Maisonobe's avatar Luc Maisonobe
Browse files

Merge branch 'class_AbsoluteDateArrayHandling_for_optical_inverse_location' into 'master'

Adding some functionalities to AbsoluteDateArrayHandling for pyrugged

See merge request !7
parents 169d6b16 cb185d7d
No related branches found
No related tags found
1 merge request!7Adding some functionalities to AbsoluteDateArrayHandling for pyrugged
Pipeline #3172 passed
......@@ -16,15 +16,17 @@
*/
package org.orekit.rugged.utils;
import org.hipparchus.exception.LocalizedCoreFormats;
import org.orekit.errors.OrekitException;
import org.orekit.time.AbsoluteDate;
/** AbsoluteDateForVectorisation consist of additions to AbsoluteDate to handle arrays for vectorization
/** AbsoluteDateArrayHandling consist of additions to AbsoluteDate to handle arrays.
* @author Melina Vanel
*/
public class AbsoluteDateArrayHandling {
/** Dates array on which we want to apply time shift or compute duration */
public AbsoluteDate[] dates;
/** Dates array on which we want to apply time shift or compute duration. */
private final AbsoluteDate[] dates;
/** Simple constructor.
* @param dates is an array of absolute dates on which we want to apply time shift or
......@@ -33,21 +35,36 @@ public class AbsoluteDateArrayHandling {
public AbsoluteDateArrayHandling(final AbsoluteDate[] dates) {
this.dates = dates.clone();
}
/** Get instance dates array.
* @return dates array
*/
public AbsoluteDate[] getDates() {
return this.dates.clone();
}
/** Get time-shifted dates for several dates or several time shifts.
* If instance dates = [date1, date2, ..., daten] and argument
* dts = [dts1, dts2, ..., dtsn] then this function will return a matrix
* [[date1 shiftedby dts1, date1 shiftedBy dts2, ..., date1 shiftedBy dtsn],
* [date2 shiftedby dts1, date2 shiftedBy dts2, ..., date2 shiftedBy dtsn],
* [...]
* [daten shiftedby dts1, daten shiftedBy dts2, ..., date1 shiftedBy dtsn]].
* If ones want to apply only 1 time shift corresponding to 1 date see
* {@link #shiftedBy(double[])}.
* @param dts time shifts array in seconds we want to apply to dates
* @return a matrix of new dates, shifted with respect to wanted time
* shifts. If instance dates = [date1, date2, ..., daten] each line
* correspond to one date (for example date1 shiftedBy all timeshifts
* (building the different columns))
*/
public AbsoluteDate[][] shiftedBySeveralTimeShift(final double[] dts) {
public AbsoluteDate[][] multipleShiftedBy(final double[] dts) {
AbsoluteDate[][] datesShifted = new AbsoluteDate[dates.length][dts.length];
final AbsoluteDate[][] datesShifted = new AbsoluteDate[dates.length][dts.length];
int index_dates = 0;
for (AbsoluteDate date: this.dates) {
AbsoluteDate[] dateShifted = new AbsoluteDate[dts.length];
final AbsoluteDate[] dateShifted = new AbsoluteDate[dts.length];
int index_dts = 0;
for (double dt: dts) {
dateShifted[index_dts] = date.shiftedBy(dt);
......@@ -60,23 +77,61 @@ public class AbsoluteDateArrayHandling {
return (AbsoluteDate[][]) datesShifted;
}
/** Get time-shifted dates for several dates and corresponding time shifts.
* If instance dates = [date1, date2, ..., daten] and argument
* dts = [dts1, dts2, ..., dtsn] then this function will return
* [date1 shiftedby dts1, date2 shiftedBy dts2, ..., daten shiftedBy dtsn]. If
* several time shift want to be applied on each date see
* {@link #multipleShiftedBy(double[])}.
* @param dts time shifts array in seconds we want to apply to corresponding dates.
* Warning, must be same length as dates.
* @return an 1D array of new dates, shifted with respect to wanted corresponding time
* shifts.
*/
public AbsoluteDate[] shiftedBy(final double[] dts) {
// Check same dimensions
if (dates.length != dts.length) {
throw new OrekitException(LocalizedCoreFormats.DIMENSIONS_MISMATCH,
dates.length, dts.length);
}
final AbsoluteDate[] datesShifted = new AbsoluteDate[dates.length];
int index_dates = 0;
for (AbsoluteDate date: this.dates) {
datesShifted[index_dates] = date.shiftedBy(dts[index_dates]);
index_dates += 1;
}
return datesShifted;
}
/** Get array with durations between instances dates and given dates
* If instance dates = [date1, date2, ..., daten] and argument
* datesForDuration = [d1, d2, ..., dn] then this function will return a matrix
* [[date1 durationFrom d1, date1 durationFrom d2, ..., date1 durationFrom dn],
* [date2 durationFrom d1, date2 durationFrom d2, ..., date2 durationFrom dn],
* [...]
* [daten durationFrom d1, daten durationFrom d2, ..., date1 durationFrom dn]].
* If ones want to compute duration from only 1 date corresponding to 1 instance date see
* {@link #durationFrom(AbsoluteDate[])}.
* @param datesForDuration dates for which we want to compute the duration form instances dates
* @return a matrix of double representing durations from instance dates
* @return a matrix of double representing durations from instance dates
* If instance dates = [date1, date2, ..., daten] each line
* correspond to one date (for example date1 duration from all given dates in arguments
* (building the different columns))
*/
public double[][] durationsFromSeveralTimeShifts(final AbsoluteDate[] datesForDuration) {
public double[][] multipleDurationFrom(final AbsoluteDate[] datesForDuration) {
double[][] durationsFromDates = new double[dates.length][datesForDuration.length];
final double[][] durationsFromDates = new double[dates.length][datesForDuration.length];
int index_dates = 0;
for (AbsoluteDate date: this.dates) {
double[] durationFromDate = new double[datesForDuration.length];
final double[] durationFromDate = new double[datesForDuration.length];
int index_datesForDuration = 0;
for (AbsoluteDate dateForDuration: datesForDuration) {
durationFromDate[index_datesForDuration] = date.durationFrom(dateForDuration);
durationFromDate[index_datesForDuration] = date.durationFrom(dateForDuration);
index_datesForDuration += 1;
}
durationsFromDates[index_dates] = durationFromDate;
......@@ -86,5 +141,34 @@ public class AbsoluteDateArrayHandling {
return (double[][]) durationsFromDates;
}
/** Get array with durations between instances dates and corresponding given dates
* If instance dates = [date1, date2, ..., daten] and argument
* datesForDuration = [d1, d2, ..., dn] then this function will return
* [date1 durationFrom d1, date2 durationFrom d2, ..., daten durationFrom dn]. If
* duration from from all arguments dates wants to be compute on each date see
* {@link #multipleDurationFrom(AbsoluteDate[])}.
* @param datesForDuration dates for which we want to compute the duration form instances dates.
* Warning must have same length as instance dates.
* @return a array of double representing durations between instance dates and corresponding
* argument dates
*/
public double[] durationFrom(final AbsoluteDate[] datesForDuration) {
// Check same dimensions
if (dates.length != datesForDuration.length) {
throw new OrekitException(LocalizedCoreFormats.DIMENSIONS_MISMATCH,
dates.length, datesForDuration.length);
}
final double[] durationsFromDates = new double[dates.length];
int index_dates = 0;
for (AbsoluteDate date: this.dates) {
durationsFromDates[index_dates] = date.durationFrom(datesForDuration[index_dates]);
index_dates += 1;
}
return durationsFromDates;
}
}
......@@ -17,8 +17,10 @@
package org.orekit.rugged.utils;
import org.hipparchus.exception.LocalizedCoreFormats;
import org.junit.Assert;
import org.junit.Test;
import org.orekit.errors.OrekitException;
import org.orekit.time.AbsoluteDate;
public class AbsoluteDateForVectorisationTest {
......@@ -29,10 +31,26 @@ public class AbsoluteDateForVectorisationTest {
AbsoluteDate[] dates = new AbsoluteDate[] {date1};
double[] dts = new double[] {10.0, 20.0, 30.0};
AbsoluteDateArrayHandling datesForVect = new AbsoluteDateArrayHandling(dates);
AbsoluteDate[][] datesShifted = datesForVect.shiftedBySeveralTimeShift(dts);
AbsoluteDate[][] datesShifted = datesForVect.multipleShiftedBy(dts);
Assert.assertEquals(datesShifted[0][0].durationFrom(date1.shiftedBy(10)), 0.0, 1e-5);
Assert.assertEquals(datesShifted[0][1].durationFrom(date1.shiftedBy(20)), 0.0, 1e-5);
}
@Test
public void testShiftedByCorrespondingTimeShift() {
AbsoluteDate date1 = new AbsoluteDate();
AbsoluteDate date2 = date1.shiftedBy(10000);
AbsoluteDate date3 = date1.shiftedBy(20000);
AbsoluteDate[] dates = new AbsoluteDate[] {date1, date2, date3};
double[] dts = new double[] {10.0, 20.0, 30.0};
AbsoluteDateArrayHandling datesForVect = new AbsoluteDateArrayHandling(dates);
AbsoluteDate[] datesShifted = datesForVect.shiftedBy(dts);
Assert.assertEquals(datesShifted[0].durationFrom(date1.shiftedBy(10)), 0.0, 1e-5);
Assert.assertEquals(datesShifted[1].durationFrom(date1.shiftedBy(10020)), 0.0, 1e-5);
Assert.assertEquals(datesShifted[2].durationFrom(date1.shiftedBy(20030)), 0.0, 1e-5);
}
@Test
......@@ -43,7 +61,7 @@ public class AbsoluteDateForVectorisationTest {
AbsoluteDate[] dates = new AbsoluteDate[] {date1, date2};
double[] dts = new double[] {10.0, 20.0, 30.0};
AbsoluteDateArrayHandling datesForVect = new AbsoluteDateArrayHandling(dates);
AbsoluteDate[][] datesShifted = datesForVect.shiftedBySeveralTimeShift(dts);
AbsoluteDate[][] datesShifted = datesForVect.multipleShiftedBy(dts);
Assert.assertEquals(datesShifted[0][0].durationFrom(date1.shiftedBy(10)), 0.0, 1e-5);
Assert.assertEquals(datesShifted[0][1].durationFrom(date1.shiftedBy(20)), 0.0, 1e-5);
Assert.assertEquals(datesShifted[1][1].durationFrom(date2.shiftedBy(20)), 0.0, 1e-5);
......@@ -61,7 +79,7 @@ public class AbsoluteDateForVectorisationTest {
AbsoluteDate[] dates = new AbsoluteDate[] {date1, date2, date3};
AbsoluteDate[] datesComputeDuration = new AbsoluteDate[] {date4, date1};
AbsoluteDateArrayHandling datesForVect = new AbsoluteDateArrayHandling(dates);
double[][] datesDurations = datesForVect.durationsFromSeveralTimeShifts(datesComputeDuration);
double[][] datesDurations = datesForVect.multipleDurationFrom(datesComputeDuration);
Assert.assertEquals(datesDurations[0][0], date1.durationFrom(date4), 1e-5);
Assert.assertEquals(datesDurations[0][1], date1.durationFrom(date1), 1e-5);
Assert.assertEquals(datesDurations[1][0], date2.durationFrom(date4), 1e-5);
......@@ -71,5 +89,39 @@ public class AbsoluteDateForVectorisationTest {
}
@Test
public void testDurationFromCorrespondingDates() {
AbsoluteDate date1 = new AbsoluteDate();
AbsoluteDate date2 = date1.shiftedBy(10000);
AbsoluteDate date3 = date1.shiftedBy(20000);
AbsoluteDate date4 = date1.shiftedBy(100000);
AbsoluteDate[] dates = new AbsoluteDate[] {date1, date2, date3};
AbsoluteDate[] datesComputeDuration = new AbsoluteDate[] {date4, date1, date2};
AbsoluteDateArrayHandling datesForVect = new AbsoluteDateArrayHandling(dates);
double[] datesDurations = datesForVect.durationFrom(datesComputeDuration);
Assert.assertEquals(datesDurations[0], date1.durationFrom(date4), 1e-5);
Assert.assertEquals(datesDurations[1], date2.durationFrom(date1), 1e-5);
Assert.assertEquals(datesDurations[2], date3.durationFrom(date2), 1e-5);
}
@Test
public void testExceptionDimensions() {
AbsoluteDate date1 = new AbsoluteDate();
AbsoluteDate date2 = date1.shiftedBy(10000);
AbsoluteDate date3 = date1.shiftedBy(20000);
AbsoluteDate date4 = date1.shiftedBy(100000);
AbsoluteDate[] dates = new AbsoluteDate[] {date1, date2, date3};
AbsoluteDate[] datesComputeDuration = new AbsoluteDate[] {date4, date1};
AbsoluteDateArrayHandling datesForVect = new AbsoluteDateArrayHandling(dates);
try {
datesForVect.durationFrom(datesComputeDuration);
Assert.fail("an exception should have been thrown");
} catch (OrekitException oe) {
Assert.assertEquals(LocalizedCoreFormats.DIMENSIONS_MISMATCH, oe.getSpecifier());
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment