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);
}