Laas2015.java

  1. /* Copyright 2002-2024 CS GROUP
  2.  * Licensed to CS GROUP (CS) under one or more
  3.  * contributor license agreements.  See the NOTICE file distributed with
  4.  * this work for additional information regarding copyright ownership.
  5.  * CS licenses this file to You under the Apache License, Version 2.0
  6.  * (the "License"); you may not use this file except in compliance with
  7.  * the License.  You may obtain a copy of the License at
  8.  *
  9.  *   http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */

  17. /*
  18.  * MIT License
  19.  *
  20.  * Copyright (c) 2019 Romain Serra
  21.  *
  22.  * Permission is hereby granted, free of charge, to any person obtaining a copy
  23.  * of this software and associated documentation files (the "Software"), to deal
  24.  * in the Software without restriction, including without limitation the rights
  25.  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  26.  * copies of the Software, and to permit persons to whom the Software is
  27.  * furnished to do so, subject to the following conditions:
  28.  *
  29.  * The above copyright notice and this permission notice shall be included in all
  30.  * copies or substantial portions of the Software.
  31.  *
  32.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  33.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  34.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  35.  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  36.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  37.  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  38.  * SOFTWARE.
  39.  */
  40. package org.orekit.ssa.collision.shorttermencounter.probability.twod;

  41. import org.hipparchus.CalculusFieldElement;
  42. import org.hipparchus.Field;
  43. import org.hipparchus.linear.FieldVector;
  44. import org.hipparchus.linear.MatrixUtils;
  45. import org.hipparchus.stat.StatUtils;
  46. import org.hipparchus.util.FastMath;
  47. import org.hipparchus.util.MathArrays;
  48. import org.hipparchus.util.MathUtils;
  49. import org.orekit.ssa.metrics.FieldProbabilityOfCollision;
  50. import org.orekit.ssa.metrics.ProbabilityOfCollision;

  51. /**
  52.  * Compute the probability of collision using the method described in : "SERRA, Romain, ARZELIER, Denis, JOLDES, Mioara, et
  53.  * al. Fast and accurate computation of orbital collision probability for short-term encounters. Journal of Guidance,
  54.  * Control, and Dynamics, 2016, vol. 39, no 5, p. 1009-1021.".
  55.  * <p>
  56.  * It is one of the recommended methods to use.
  57.  * <p>
  58.  * It assumes :
  59.  *     <ul>
  60.  *         <li>Short encounter leading to a linear relative motion.</li>
  61.  *         <li>Spherical collision object.</li>
  62.  *         <li>Uncorrelated positional covariance.</li>
  63.  *         <li>Gaussian distribution of the position uncertainties.</li>
  64.  *         <li>Deterministic velocity i.e. no velocity uncertainties.</li>
  65.  *     </ul>
  66.  * <p>
  67.  * The following constants are defined when using the empty constructor :
  68.  * <ul>
  69.  *     <li>A default absolute accuracy of 1e-30.</li>
  70.  *     <li>A maximum number of computed terms of 37000.</li>
  71.  * </ul>
  72.  * <p>
  73.  * This implementation has been translated from python from the provided source code of Romain SERRA on the
  74.  * <a href="https://github.com/Serrof/SST/blob/master/collision/short_term_poc.py">following github account</a>
  75.  *
  76.  * @author Vincent Cucchietti
  77.  * @author Romain Serra
  78.  * @since 12.0
  79.  */
  80. public class Laas2015 extends AbstractShortTermEncounter2DPOCMethod {

  81.     /** Default scaling threshold to use when sum becomes large. */
  82.     public static final double DEFAULT_SCALING_THRESHOLD = 1e10;

  83.     /**
  84.      * Defines the absolute accuracy of this method. For example, given an absolute accuracy of 1e-10, the probability of
  85.      * collision will be exact until its 1e-10 digit.
  86.      */
  87.     private final double absoluteAccuracy;

  88.     /** Defines the max number of terms that the method will use, thus reducing the computation time in particular cases. */
  89.     private final int maxNumberOfTerms;

  90.     /**
  91.      * Default constructor.
  92.      * <p>
  93.      * It uses a default absolute accuracy of 1e-30 and a maximum number of terms of 37000 which is the max number of terms
  94.      * computed based on Romain SERRA's observation (p.56 of "Romain Serra. Opérations de proximité en orbite : * évaluation
  95.      * du risque de collision et calcul de manoeuvres optimales pour l’évitement et le rendez-vous. Automatique / *
  96.      * Robotique. INSA de Toulouse, 2015. Français. NNT : 2015ISAT0035. tel-01261497") about Alfano test case 5 where he
  97.      * explains that 37000 terms were enough to meet the required precision of 5 significant digits.
  98.      */
  99.     public Laas2015() {
  100.         this(1.E-30, 37000);
  101.     }

  102.     /** Simple constructor.
  103.      * @param absoluteAccuracy absolute accuracy of the result
  104.      * @param maxNumberOfTerms max number of terms to compute
  105.      */
  106.     public Laas2015(final double absoluteAccuracy, final int maxNumberOfTerms) {
  107.         super(ShortTermEncounter2DPOCMethodType.LAAS_2015.name());
  108.         this.absoluteAccuracy = absoluteAccuracy;
  109.         this.maxNumberOfTerms = maxNumberOfTerms;
  110.     }

  111.     /** {@inheritDoc} */
  112.     public final ProbabilityOfCollision compute(final double xm, final double ym,
  113.                                                 final double sigmaX,
  114.                                                 final double sigmaY,
  115.                                                 final double radius) {

  116.         // CHECKSTYLE: stop Indentation check
  117.         // Initializing recurrent terms
  118.         final double xmSquared     = xm * xm;
  119.         final double ymSquared     = ym * ym;
  120.         final double sigmaXSq      = sigmaX * sigmaX;
  121.         final double sigmaYSq      = sigmaY * sigmaY;
  122.         final double radiusSquared = radius * radius;

  123.         final double p        = 1. / (2. * (sigmaX * sigmaX));
  124.         final double phiY     = 1. - (sigmaX / sigmaY * sigmaX / sigmaY);
  125.         final double omegaX   = (xm / (2. * sigmaXSq)) * (xm / (2. * sigmaXSq));
  126.         final double omegaY   = (ym / (2. * sigmaYSq)) * (ym / (2. * sigmaYSq));
  127.         final double bigOmega = phiY * 0.5 + (omegaX + omegaY) / p;

  128.         final double alpha0 = 0.5 * FastMath.exp(-(xmSquared / sigmaXSq + ymSquared / sigmaYSq) * 0.5) / sigmaX / sigmaY;

  129.         // Lower boundary
  130.         final double l0 = alpha0 * (1. - FastMath.exp(-p * radiusSquared)) / p;

  131.         // Upper boundary
  132.         final double u0Temp = alpha0 * (FastMath.exp(p * bigOmega * radiusSquared) -
  133.                 FastMath.exp(-p * radiusSquared)) / (p * (1. + bigOmega));
  134.         final double u0 = u0Temp > 1 ? 1 : u0Temp;

  135.         // If the boundaries are close enough to the actual value according to defined relative accuracy
  136.         if (u0 - l0 <= absoluteAccuracy) {
  137.             return new ProbabilityOfCollision(StatUtils.mean(u0, l0), u0, l0, getName(),
  138.                                               isAMaximumProbabilityOfCollisionMethod());
  139.         }
  140.         // Otherwise
  141.         else {
  142.             final int n1 = (int) (2. * FastMath.ceil(FastMath.E * p * radiusSquared * (1. + bigOmega)));
  143.             final double n2_inter =
  144.                     alpha0 * FastMath.exp(p * radiusSquared * bigOmega) /
  145.                             (absoluteAccuracy * p * FastMath.sqrt(MathUtils.TWO_PI * n1) *
  146.                                     (1. + bigOmega));
  147.             final int n2 = (int) FastMath.ceil(FastMath.log(2, n2_inter));

  148.             // Number of terms to get the relative accuracy desired
  149.             int nMax = FastMath.max(n1, n2) - 1;
  150.             nMax = FastMath.min(nMax, maxNumberOfTerms);

  151.             // Initializing terms used in the equations
  152.             final double pSquared                  = p * p;
  153.             final double pCubed                    = pSquared * p;
  154.             final double pTimesRadiusSquared       = p * radiusSquared;
  155.             final double radiusFourth              = radiusSquared * radiusSquared;
  156.             final double radiusSixth               = radiusFourth * radiusSquared;
  157.             final double phiYSquared               = phiY * phiY;
  158.             final double pPhiY                     = p * phiY;
  159.             final double omegaSum                  = omegaX + omegaY;
  160.             final double pSqTimesHalfPhiYSqPlusOne = pSquared * MathArrays.linearCombination(0.5, phiYSquared, 1., 1.);

  161.             final double recurrentTerm0 = MathArrays.linearCombination(0.5, phiY, 1., 1.);
  162.             final double recurrentTerm1 = MathArrays.linearCombination(p, recurrentTerm0, 1., omegaSum);
  163.             final double recurrentTerm2 = MathArrays.linearCombination(1., pSqTimesHalfPhiYSqPlusOne, 2., pPhiY * omegaY);
  164.             final double recurrentTerm3 = recurrentTerm1 * recurrentTerm1;

  165.             final double auxiliaryTerm0 = radiusSixth * pCubed * phiYSquared * omegaX;
  166.             final double auxiliaryTerm1 = radiusFourth * pSquared * phiY;
  167.             final double auxiliaryTerm2 = 2. * omegaX * recurrentTerm0;

  168.             final double auxiliaryTerm3 = phiY * MathArrays.linearCombination(2., omegaX, 1.5, p) + omegaSum;
  169.             final double auxiliaryTerm4 = pPhiY * recurrentTerm0 * 2.;
  170.             final double auxiliaryTerm5 = p * (2. * phiY + 1.);

  171.             double kPlus2 = 2.;
  172.             double kPlus3 = 3.;
  173.             double kPlus4 = 4.;
  174.             double kPlus5 = 5.;
  175.             double halfY  = 2.5;

  176.             // Initialize recurrence
  177.             double c0 = alpha0 * radiusSquared;
  178.             double c1 = c0 * radiusSquared * 0.5 * recurrentTerm1;
  179.             double c2 = c0 * (radiusFourth / 12.) * (recurrentTerm3 + recurrentTerm2);
  180.             double c3 = c0 * (radiusSixth / 144.) * (recurrentTerm1 * (recurrentTerm3 + 3. * recurrentTerm2) +
  181.                     2. * (pCubed * (1. + phiYSquared * phiY * 0.5) + 3. * pSquared * phiYSquared * omegaY));
  182.             final double[] initialCoefficients = new double[] { c0, c1, c2, c3 };

  183.             double sum              = 0.;
  184.             double rescalingCounter = 0.;
  185.             for (int i = 0; i < FastMath.min(nMax, 4); i++) {
  186.                 sum += initialCoefficients[i];

  187.                 // Rescale quantities if necessary
  188.                 if (sum > DEFAULT_SCALING_THRESHOLD) {
  189.                     rescalingCounter += FastMath.log10(DEFAULT_SCALING_THRESHOLD);
  190.                     c0 /= DEFAULT_SCALING_THRESHOLD;
  191.                     c1 /= DEFAULT_SCALING_THRESHOLD;
  192.                     c2 /= DEFAULT_SCALING_THRESHOLD;
  193.                     c3 /= DEFAULT_SCALING_THRESHOLD;
  194.                     sum /= DEFAULT_SCALING_THRESHOLD;
  195.                 }

  196.             }

  197.             // Iterate
  198.             double temp;
  199.             for (int k = 0; k < nMax - 4; k++) {

  200.                 // Rescale quantities if necessary
  201.                 if (sum > DEFAULT_SCALING_THRESHOLD) {
  202.                     rescalingCounter += FastMath.log10(DEFAULT_SCALING_THRESHOLD);
  203.                     c0 /= DEFAULT_SCALING_THRESHOLD;
  204.                     c1 /= DEFAULT_SCALING_THRESHOLD;
  205.                     c2 /= DEFAULT_SCALING_THRESHOLD;
  206.                     c3 /= DEFAULT_SCALING_THRESHOLD;
  207.                     sum /= DEFAULT_SCALING_THRESHOLD;
  208.                 }

  209.                 // Recurrence relation
  210.                 final double denominator = kPlus4 * kPlus3;

  211.                 temp = c3 * MathArrays.linearCombination(1, recurrentTerm1, kPlus3, auxiliaryTerm5);
  212.                 temp -= c2 * pTimesRadiusSquared * MathArrays.linearCombination(halfY, auxiliaryTerm4, 1, auxiliaryTerm3) /
  213.                         kPlus4;
  214.                 temp += c1 * auxiliaryTerm1 * MathArrays.linearCombination(halfY, pPhiY, 1., auxiliaryTerm2) / denominator;
  215.                 temp -= c0 * auxiliaryTerm0 / (denominator * kPlus2);
  216.                 temp *= radiusSquared / (kPlus4 * kPlus5);

  217.                 c0 = c1;
  218.                 c1 = c2;
  219.                 c2 = c3;
  220.                 c3 = temp;

  221.                 // Update intermediate variables
  222.                 kPlus2 = kPlus3;
  223.                 kPlus3 = kPlus4;
  224.                 kPlus4 = kPlus5;
  225.                 kPlus5 = kPlus5 + 1.;
  226.                 halfY += 1.;

  227.                 // Update sum
  228.                 sum += c3;

  229.             }
  230.             // CHECKSTYLE: resume Indentation check
  231.             final double value = sum *
  232.                     FastMath.exp(MathArrays.linearCombination(FastMath.log(10.), rescalingCounter, -p, radiusSquared));

  233.             return new ProbabilityOfCollision(value, l0, u0, getName(), isAMaximumProbabilityOfCollisionMethod());
  234.         }
  235.     }

  236.     /** {@inheritDoc} */
  237.     public final <T extends CalculusFieldElement<T>> FieldProbabilityOfCollision<T> compute(final T xm, final T ym,
  238.                                                                                             final T sigmaX,
  239.                                                                                             final T sigmaY,
  240.                                                                                             final T radius) {

  241.         // CHECKSTYLE: stop Indentation check
  242.         // Initializing recurrent terms
  243.         final Field<T> field = xm.getField();
  244.         final T        zero  = field.getZero();
  245.         final T        one   = field.getOne();

  246.         final T xmSquared     = xm.square();
  247.         final T ymSquared     = ym.square();
  248.         final T sigmaXSquared = sigmaX.square();
  249.         final T sigmaYSquared = sigmaY.square();
  250.         final T twoSigmaXY    = sigmaX.multiply(sigmaY).multiply(2);
  251.         final T radiusSquared = radius.square();
  252.         final T radiusFourth  = radiusSquared.square();
  253.         final T radiusSixth   = radiusFourth.multiply(radiusSquared);

  254.         final T p                   = sigmaX.square().reciprocal().multiply(0.5);
  255.         final T pTimesRadiusSquared = p.multiply(radiusSquared);
  256.         final T phiY                = sigmaXSquared.divide(sigmaYSquared).negate().add(1.);
  257.         final T omegaX              = xm.divide(sigmaXSquared.multiply(2.)).pow(2.);
  258.         final T omegaY              = ym.divide(sigmaYSquared.multiply(2.)).pow(2.);
  259.         final T omegaSum            = omegaX.add(omegaY);
  260.         final T bigOmega            = phiY.multiply(0.5).add(omegaX.add(omegaY).divide(p));

  261.         final T minusP                    = p.negate();
  262.         final T pSquared                  = p.square();
  263.         final T pCubed                    = p.multiply(pSquared);
  264.         final T pPhiY                     = p.multiply(phiY);
  265.         final T phiYSquared               = phiY.square();
  266.         final T pRadiusSquaredBigOmega    = p.multiply(radiusSquared).multiply(bigOmega);
  267.         final T bigOmegaPlusOne           = bigOmega.add(1.);
  268.         final T pSqTimesHalfPhiYSqPlusOne = pSquared.multiply(phiYSquared.multiply(0.5).add(1.));

  269.         final T alpha0 = xmSquared.divide(sigmaXSquared).add(ymSquared.divide(sigmaYSquared)).multiply(-0.5).exp()
  270.                                   .divide(twoSigmaXY);

  271.         // Lower boundary
  272.         final T l0 = alpha0.multiply(radiusSquared.multiply(minusP).exp().negate().add(1.)).divide(p);

  273.         // Upper boundary
  274.         final T u0Temp = alpha0.multiply(pRadiusSquaredBigOmega.exp().subtract(radiusSquared.multiply(minusP).exp()))
  275.                                .divide(p.multiply(bigOmegaPlusOne));
  276.         final T u0 = u0Temp.getReal() > 1 ? one : u0Temp;

  277.         // If the boundaries are close enough to the actual value according to defined relative accuracy
  278.         if (u0.getReal() - l0.getReal() <= absoluteAccuracy) {
  279.             return new FieldProbabilityOfCollision<>(u0.add(l0).multiply(0.5), u0, l0, getName(),
  280.                                                      isAMaximumProbabilityOfCollisionMethod());
  281.         }
  282.         // Otherwise
  283.         else {
  284.             final int n1 = (int) (2. *
  285.                     FastMath.ceil(FastMath.E * p.multiply(radiusSquared).multiply(bigOmegaPlusOne).getReal()));
  286.             final double n2_inter =
  287.                     alpha0.getReal() * FastMath.exp(pRadiusSquaredBigOmega.getReal()) /
  288.                             (absoluteAccuracy * p.getReal() * FastMath.sqrt(MathUtils.TWO_PI * n1) *
  289.                                     (1. + bigOmega.getReal()));
  290.             final int n2 = (int) FastMath.ceil(FastMath.log(2., n2_inter));

  291.             // Number of terms to get the relative accuracy desired
  292.             int nMax = FastMath.max(n1, n2) - 1;
  293.             nMax = FastMath.min(nMax, maxNumberOfTerms);

  294.             // Recurrent term in the equations
  295.             final T recurrentTerm0 = phiY.multiply(0.5).add(1);
  296.             final T recurrentTerm1 = p.multiply(recurrentTerm0).add(omegaSum);
  297.             final T recurrentTerm2 = pSqTimesHalfPhiYSqPlusOne.add(pPhiY.multiply(omegaY).multiply(2.));
  298.             final T recurrentTerm3 = recurrentTerm1.multiply(recurrentTerm1);

  299.             final T auxiliaryTerm0 = radiusSixth.multiply(pCubed).multiply(phiYSquared).multiply(omegaX);
  300.             final T auxiliaryTerm1 = radiusFourth.multiply(pSquared).multiply(phiY);
  301.             final T auxiliaryTerm2 = omegaX.multiply(recurrentTerm0).multiply(2.);
  302.             final T auxiliaryTerm3 = phiY.multiply(omegaX.multiply(2.).add(p.multiply(1.5))).add(omegaSum);
  303.             final T auxiliaryTerm4 = pPhiY.multiply(recurrentTerm0).multiply(2.);
  304.             final T auxiliaryTerm5 = p.multiply(phiY.multiply(2.).add(1.));

  305.             T kPlus2 = one.newInstance(2.);
  306.             T kPlus3 = one.newInstance(3.);
  307.             T kPlus4 = one.newInstance(4.);
  308.             T kPlus5 = one.newInstance(5.);
  309.             T halfY  = one.newInstance(2.5);

  310.             // Initialize recurrence
  311.             T c0 = alpha0.multiply(radiusSquared);
  312.             T c1 = c0.multiply(radiusSquared).multiply(0.5).multiply(recurrentTerm1);
  313.             T c2 = c0.multiply(radiusFourth.divide(12.)).multiply(recurrentTerm3.add(recurrentTerm2));
  314.             T c3 = c0.multiply(radiusSixth.divide(144.)).multiply(
  315.                     recurrentTerm1.multiply(recurrentTerm2.multiply(3.).add(recurrentTerm3))
  316.                                   .add(pCubed.multiply(2.).multiply(phiYSquared.multiply(phiY).multiply(0.5).add(1.)))
  317.                                   .add(pSquared.multiply(phiYSquared).multiply(omegaY).multiply(6.)));
  318.             final FieldVector<T> initialCoefficients = MatrixUtils.createFieldVector(field, 4);
  319.             initialCoefficients.setEntry(0, c0);
  320.             initialCoefficients.setEntry(1, c1);
  321.             initialCoefficients.setEntry(2, c2);
  322.             initialCoefficients.setEntry(3, c3);

  323.             T sum              = zero;
  324.             T rescalingCounter = zero;
  325.             for (int i = 0; i < FastMath.min(nMax, 4); i++) {
  326.                 sum = sum.add(initialCoefficients.getEntry(i));

  327.                 // Rescale quantities if necessary
  328.                 if (sum.getReal() > DEFAULT_SCALING_THRESHOLD) {
  329.                     rescalingCounter = rescalingCounter.add(FastMath.log10(DEFAULT_SCALING_THRESHOLD));
  330.                     c0               = c0.divide(DEFAULT_SCALING_THRESHOLD);
  331.                     c1               = c1.divide(DEFAULT_SCALING_THRESHOLD);
  332.                     c2               = c2.divide(DEFAULT_SCALING_THRESHOLD);
  333.                     c3               = c3.divide(DEFAULT_SCALING_THRESHOLD);
  334.                     sum              = sum.divide(DEFAULT_SCALING_THRESHOLD);
  335.                 }

  336.             }

  337.             // Iterate
  338.             T temp;
  339.             for (int k = 0; k < nMax - 4; k++) {

  340.                 // Rescale quantities if necessary
  341.                 if (sum.getReal() > DEFAULT_SCALING_THRESHOLD) {
  342.                     rescalingCounter = rescalingCounter.add(FastMath.log10(DEFAULT_SCALING_THRESHOLD));
  343.                     c0               = c0.divide(DEFAULT_SCALING_THRESHOLD);
  344.                     c1               = c1.divide(DEFAULT_SCALING_THRESHOLD);
  345.                     c2               = c2.divide(DEFAULT_SCALING_THRESHOLD);
  346.                     c3               = c3.divide(DEFAULT_SCALING_THRESHOLD);
  347.                     sum              = sum.divide(DEFAULT_SCALING_THRESHOLD);
  348.                 }

  349.                 // Recurrence relation
  350.                 final T denominator = kPlus4.multiply(kPlus3);

  351.                 temp = c3.multiply(recurrentTerm1.add(auxiliaryTerm5.multiply(kPlus3)));
  352.                 temp = temp.subtract(
  353.                         c2.multiply(pTimesRadiusSquared).multiply(auxiliaryTerm4.multiply(halfY).add(auxiliaryTerm3))
  354.                           .divide(kPlus4));
  355.                 temp = temp.add(
  356.                         c1.multiply(auxiliaryTerm1).multiply(pPhiY.multiply(halfY).add(auxiliaryTerm2)).divide(denominator));
  357.                 temp = temp.subtract(c0.multiply(auxiliaryTerm0).divide(denominator.multiply(kPlus2)));
  358.                 temp = temp.multiply(radiusSquared.divide(kPlus4.multiply(kPlus5)));

  359.                 c0 = c1;
  360.                 c1 = c2;
  361.                 c2 = c3;
  362.                 c3 = temp;

  363.                 // Update intermediate variables
  364.                 kPlus2 = kPlus3;
  365.                 kPlus3 = kPlus4;
  366.                 kPlus4 = kPlus5;
  367.                 kPlus5 = kPlus5.add(1.);
  368.                 halfY  = halfY.add(1.);

  369.                 // Update sum
  370.                 sum = sum.add(c3);

  371.             }
  372.             final T value =
  373.                     sum.multiply((rescalingCounter.multiply(FastMath.log(10.)).subtract(pTimesRadiusSquared)).exp());

  374.             return new FieldProbabilityOfCollision<>(value, l0, u0, getName(), isAMaximumProbabilityOfCollisionMethod());
  375.             // CHECKSTYLE: resume Indentation check
  376.         }
  377.     }

  378.     /** {@inheritDoc} */
  379.     @Override
  380.     public ShortTermEncounter2DPOCMethodType getType() {
  381.         return ShortTermEncounter2DPOCMethodType.LAAS_2015;
  382.     }

  383. }