Ordering.java

/* Copyright 2002-2023 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.files.ccsds.ndm.odm.ocm;

/** Keys for {@link OrbitCovariance} elements ordering.
 * @author Luc Maisonobe
 * @since 11.0
 */
public enum Ordering {

    /** Lower Triangular Matrix. */
    LTM {

        /** {@inheritDoc} */
        @Override
        int nbElements(final int dimension) {
            return (dimension * (dimension + 1)) / 2;
        }

        /** {@inheritDoc} */
        @Override
        void update(final CovarianceIndexer indexer) {
            final int i = indexer.getRow();
            final int j = indexer.getColumn();
            if (j < i) {
                // continue on same row
                indexer.setColumn(j + 1);
            } else {
                // start new row
                indexer.setRow(i + 1);
                indexer.setColumn(0);
            }
        }

    },

    /** Upper Triangular Matrix. */
    UTM {

        /** {@inheritDoc} */
        @Override
        int nbElements(final int dimension) {
            return (dimension * (dimension + 1)) / 2;
        }

        /** {@inheritDoc} */
        @Override
        void update(final CovarianceIndexer indexer) {
            final int i = indexer.getRow();
            final int j = indexer.getColumn();
            if (j + 1 < indexer.getDimension()) {
                // continue on same row
                indexer.setColumn(j + 1);
            } else {
                // start new row
                indexer.setRow(i + 1);
                indexer.setColumn(i + 1);
            }
        }

    },

    /** Full symmetric Matrix. */
    FULL {

        /** {@inheritDoc} */
        @Override
        int nbElements(final int dimension) {
            return dimension * dimension;
        }

        /** {@inheritDoc} */
        @Override
        void update(final CovarianceIndexer indexer) {
            final int i = indexer.getRow();
            final int j = indexer.getColumn();
            if (j + 1 < indexer.getDimension()) {
                // continue on same row
                indexer.setColumn(j + 1);
            } else {
                // start new row
                indexer.setRow(i + 1);
                indexer.setColumn(0);
            }
        }

    },

    /** Lower Triangular Matrix conflated with cross-correlation terms. */
    LTMWCC {

        /** {@inheritDoc} */
        @Override
        int nbElements(final int dimension) {
            return FULL.nbElements(dimension);
        }

        /** {@inheritDoc} */
        @Override
        void update(final CovarianceIndexer indexer) {
            FULL.update(indexer);
            indexer.setCrossCorrelation(indexer.getColumn() > indexer.getRow());
        }

    },

    /** Upper Triangular Matrix conflated with cross-correlation terms. */
    UTMWCC {

        /** {@inheritDoc} */
        @Override
        int nbElements(final int dimension) {
            return FULL.nbElements(dimension);
        }

        /** {@inheritDoc} */
        @Override
        void update(final CovarianceIndexer indexer) {
            FULL.update(indexer);
            indexer.setCrossCorrelation(indexer.getRow() > indexer.getColumn());
        }

    };

    /** Get number of ordered elements.
     * @param dimension matrix dimension
     * @return number of ordered elements
     */
    abstract int nbElements(int dimension);

    /** Update indexer.
     * @param indexer index to update for handling next element
     */
    abstract void update(CovarianceIndexer indexer);

}