FieldProbabilityOfCollision.java

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

import org.hipparchus.CalculusFieldElement;
import org.hipparchus.util.MathUtils;
import org.orekit.ssa.collision.shorttermencounter.probability.twod.Alfriend1999Max;
import org.orekit.ssa.collision.shorttermencounter.probability.twod.Laas2015;

/**
 * Container for values relative to the probability of collision :
 * <ul>
 *     <li>Value of the probability of collision.</li>
 *     <li>Name of the method with which it was computed.</li>
 *     <li>Upper and lower limit of the value if the method provides them (such as {@link Laas2015} for example).</li>
 *     <li>Flag defining if the probability was maximized in any way (such as {@link Alfriend1999Max} for example).</li>
 * </ul>
 *
 * @author Vincent Cucchietti
 * @since 12.0
 * @param <T> type of the field elements
 */
public class FieldProbabilityOfCollision<T extends CalculusFieldElement<T>> {

    /** Value of the probability of collision. */
    private final T value;

    /**
     * Lower limit of the probability of collision.
     * <p>
     * 0 by default.
     */
    private final T lowerLimit;

    /**
     * Upper limit of the probability of collision.
     * <p>
     * 0 by default.
     */
    private final T upperLimit;

    /** Name of the probability computing method with which this probability was calculated. */
    private final String probabilityOfCollisionMethodName;

    /**
     * Defines if this probability of collision can be considered a maximum probability of collision.
     * <p>
     * It depends on what method was used to compute this probability.
     * <p>
     * False by default.
     */
    private final boolean isMaxProbability;

    /**
     * Constructor with default values of 0 for the upper/lower limits and default false flag for maximum probability.
     *
     * @param value value of the probability of collision
     * @param probabilityOfCollisionMethodName name of the probability computing method with which this probability was
     * computed
     */
    public FieldProbabilityOfCollision(final T value, final String probabilityOfCollisionMethodName) {
        this(value, probabilityOfCollisionMethodName, false);
    }

    /**
     * Constructor with default values of 0 for the upper and lower limits.
     *
     * @param value value of the probability of collision
     * @param probabilityOfCollisionMethodName name of the probability computing method with which this probability was
     * computed
     * @param isMaxProbability flag defining if it has been computed using a maximum probability of collision method
     */
    public FieldProbabilityOfCollision(final T value, final String probabilityOfCollisionMethodName,
                                       final boolean isMaxProbability) {
        this(value, value.getField().getZero(), value.getField().getZero(), probabilityOfCollisionMethodName,
             isMaxProbability);
    }

    /**
     * Constructor.
     *
     * @param value value of the probability of collision
     * @param lowerLimit lower limit of the probability of collision
     * @param upperLimit upper limit of the probability of collision
     * @param probabilityOfCollisionMethodName name of the probability computing method with which this probability was
     * computed
     * @param isMaxProbability flag indicating if this method computes a maximum probability of collision
     */
    public FieldProbabilityOfCollision(final T value, final T lowerLimit, final T upperLimit,
                                       final String probabilityOfCollisionMethodName, final boolean isMaxProbability) {

        // Check that inputs are valid
        MathUtils.checkRangeInclusive(value.getReal(), 0, 1);
        MathUtils.checkRangeInclusive(lowerLimit.getReal(), 0, 1);
        MathUtils.checkRangeInclusive(upperLimit.getReal(), 0, 1);

        // Initialization
        this.value                            = value;
        this.lowerLimit                       = lowerLimit;
        this.upperLimit                       = upperLimit;
        this.probabilityOfCollisionMethodName = probabilityOfCollisionMethodName;
        this.isMaxProbability                 = isMaxProbability;
    }

    /** Get value of the probability of collision.
     * @return value of the probability of collision
     */
    public T getValue() {
        return value;
    }

    /** Get lower limit of the probability of collision value.
     * @return lower limit of the probability of collision value, 0 by default
     */
    public T getLowerLimit() {
        return lowerLimit;
    }

    /** Get upper limit of the probability of collision value.
     * @return upper limit of the probability of collision value, 0 by default
     */
    public T getUpperLimit() {
        return upperLimit;
    }

    /** Get name of the probability computing method with which this probability was computed.
     * @return name of the probability computing method with which this probability was computed
     */
    public String getProbabilityOfCollisionMethodName() {
        return probabilityOfCollisionMethodName;
    }

    /** Get flag that defines if this probability of collision can be considered a maximum probability of collision.
     * @return flag that defines if this probability of collision can be considered a maximum probability of collision
     */
    public boolean isMaxProbability() {
        return isMaxProbability;
    }

}