1   /* Copyright 2002-2025 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  package org.orekit.files.ccsds.ndm.odm.ocm;
18  
19  /** Keys for {@link OrbitCovariance} elements ordering.
20   * @author Luc Maisonobe
21   * @since 11.0
22   */
23  public enum Ordering {
24  
25      /** Lower Triangular Matrix. */
26      LTM {
27  
28          /** {@inheritDoc} */
29          @Override
30          int nbElements(final int dimension) {
31              return (dimension * (dimension + 1)) / 2;
32          }
33  
34          /** {@inheritDoc} */
35          @Override
36          void update(final CovarianceIndexer indexer) {
37              final int i = indexer.getRow();
38              final int j = indexer.getColumn();
39              if (j < i) {
40                  // continue on same row
41                  indexer.setColumn(j + 1);
42              } else {
43                  // start new row
44                  indexer.setRow(i + 1);
45                  indexer.setColumn(0);
46              }
47          }
48  
49      },
50  
51      /** Upper Triangular Matrix. */
52      UTM {
53  
54          /** {@inheritDoc} */
55          @Override
56          int nbElements(final int dimension) {
57              return (dimension * (dimension + 1)) / 2;
58          }
59  
60          /** {@inheritDoc} */
61          @Override
62          void update(final CovarianceIndexer indexer) {
63              final int i = indexer.getRow();
64              final int j = indexer.getColumn();
65              if (j + 1 < indexer.getDimension()) {
66                  // continue on same row
67                  indexer.setColumn(j + 1);
68              } else {
69                  // start new row
70                  indexer.setRow(i + 1);
71                  indexer.setColumn(i + 1);
72              }
73          }
74  
75      },
76  
77      /** Full symmetric Matrix. */
78      FULL {
79  
80          /** {@inheritDoc} */
81          @Override
82          int nbElements(final int dimension) {
83              return dimension * dimension;
84          }
85  
86          /** {@inheritDoc} */
87          @Override
88          void update(final CovarianceIndexer indexer) {
89              final int i = indexer.getRow();
90              final int j = indexer.getColumn();
91              if (j + 1 < indexer.getDimension()) {
92                  // continue on same row
93                  indexer.setColumn(j + 1);
94              } else {
95                  // start new row
96                  indexer.setRow(i + 1);
97                  indexer.setColumn(0);
98              }
99          }
100 
101     },
102 
103     /** Lower Triangular Matrix conflated with cross-correlation terms. */
104     LTMWCC {
105 
106         /** {@inheritDoc} */
107         @Override
108         int nbElements(final int dimension) {
109             return FULL.nbElements(dimension);
110         }
111 
112         /** {@inheritDoc} */
113         @Override
114         void update(final CovarianceIndexer indexer) {
115             FULL.update(indexer);
116             indexer.setCrossCorrelation(indexer.getColumn() > indexer.getRow());
117         }
118 
119     },
120 
121     /** Upper Triangular Matrix conflated with cross-correlation terms. */
122     UTMWCC {
123 
124         /** {@inheritDoc} */
125         @Override
126         int nbElements(final int dimension) {
127             return FULL.nbElements(dimension);
128         }
129 
130         /** {@inheritDoc} */
131         @Override
132         void update(final CovarianceIndexer indexer) {
133             FULL.update(indexer);
134             indexer.setCrossCorrelation(indexer.getRow() > indexer.getColumn());
135         }
136 
137     };
138 
139     /** Get number of ordered elements.
140      * @param dimension matrix dimension
141      * @return number of ordered elements
142      */
143     abstract int nbElements(int dimension);
144 
145     /** Update indexer.
146      * @param indexer index to update for handling next element
147      */
148     abstract void update(CovarianceIndexer indexer);
149 
150 }