DependentVectorsHandler.java
/*
* Licensed to the Hipparchus project under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The Hipparchus project 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
*
* https://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.hipparchus.linear;
import java.util.List;
import org.hipparchus.CalculusFieldElement;
import org.hipparchus.Field;
import org.hipparchus.exception.LocalizedCoreFormats;
import org.hipparchus.exception.MathIllegalArgumentException;
/** Enumerate to specify how dependent vectors should be handled in
* {@link MatrixUtils#orthonormalize(List, double, DependentVectorsHandler)} and
* {@link MatrixUtils#orthonormalize(Field, List, CalculusFieldElement, DependentVectorsHandler)}.
* @since 2.1
*/
public enum DependentVectorsHandler {
/** Generate a {@link MathIllegalArgumentException} if dependent vectors are found. */
GENERATE_EXCEPTION {
/** {@inheritDoc} */
@Override
public int manageDependent(final int index, final List<RealVector> basis) {
// generate exception, dependent vectors are forbidden with this settings
throw new MathIllegalArgumentException(LocalizedCoreFormats.ZERO_NORM);
}
/** {@inheritDoc} */
@Override
public <T extends CalculusFieldElement<T>> int manageDependent(final Field<T> field,
final int index,
final List<FieldVector<T>> basis) {
// generate exception, dependent vectors are forbidden with this settings
throw new MathIllegalArgumentException(LocalizedCoreFormats.ZERO_NORM);
}
},
/** Replace dependent vectors by vectors with norm 0.
* <p>
* This behavior matches the Wolfram language API. It keeps the
* number of output vectors equal to the number of input vectors.
* The only two norms output vectors can have are 0 and 1.
* </p>
*/
ADD_ZERO_VECTOR {
/** {@inheritDoc} */
@Override
public int manageDependent(final int index, final List<RealVector> basis) {
// add a zero vector, preserving output vector size (and dropping its normalization property)
basis.set(index, MatrixUtils.createRealVector(basis.get(index).getDimension()));
return index + 1;
}
/** {@inheritDoc} */
@Override
public <T extends CalculusFieldElement<T>> int manageDependent(final Field<T> field,
final int index,
final List<FieldVector<T>> basis) {
// add a zero vector, preserving output vector size (and dropping its normalization property)
basis.set(index, MatrixUtils.createFieldVector(field, basis.get(index).getDimension()));
return index + 1;
}
},
/** Ignore dependent vectors.
* <p>
* This behavior ensures the output vectors form an orthonormal
* basis, i.e. all vectors are independent and they all have norm 1.
* The number of output vectors may be smaller than the number of
* input vectors, this number corresponds to the dimension of the
* span of the input vectors.
* </p>
*/
REDUCE_BASE_TO_SPAN {
/** {@inheritDoc} */
@Override
public int manageDependent(final int index, final List<RealVector> basis) {
// remove dependent vector
basis.remove(index);
return index;
}
/** {@inheritDoc} */
@Override
public <T extends CalculusFieldElement<T>> int manageDependent(final Field<T> field,
final int index,
final List<FieldVector<T>> basis) {
// remove dependent vector
basis.remove(index);
return index;
}
};
/** Manage a dependent vector.
* @param index of the vector in the basis
* @param basis placeholder for basis vectors
* @return next index to manage
*/
public abstract int manageDependent(int index, List<RealVector> basis);
/** Manage a dependent vector.
* @param <T> type of the vectors components
* @param field field to which the vectors belong
* @param index of the vector in the basis
* @param basis placeholder for basis vectors
* @return next index to manage
*/
public abstract <T extends CalculusFieldElement<T>> int manageDependent(Field<T> field, int index, List<FieldVector<T>> basis);
}