1 /* 2 * Licensed to the Hipparchus project under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The Hipparchus project 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 * https://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.hipparchus.linear; 18 19 import java.util.List; 20 21 import org.hipparchus.CalculusFieldElement; 22 import org.hipparchus.Field; 23 import org.hipparchus.exception.LocalizedCoreFormats; 24 import org.hipparchus.exception.MathIllegalArgumentException; 25 26 /** Enumerate to specify how dependent vectors should be handled in 27 * {@link MatrixUtils#orthonormalize(List, double, DependentVectorsHandler)} and 28 * {@link MatrixUtils#orthonormalize(Field, List, CalculusFieldElement, DependentVectorsHandler)}. 29 * @since 2.1 30 */ 31 public enum DependentVectorsHandler { 32 33 /** Generate a {@link MathIllegalArgumentException} if dependent vectors are found. */ 34 GENERATE_EXCEPTION { 35 36 /** {@inheritDoc} */ 37 @Override 38 public int manageDependent(final int index, final List<RealVector> basis) { 39 // generate exception, dependent vectors are forbidden with this settings 40 throw new MathIllegalArgumentException(LocalizedCoreFormats.ZERO_NORM); 41 } 42 43 44 /** {@inheritDoc} */ 45 @Override 46 public <T extends CalculusFieldElement<T>> int manageDependent(final Field<T> field, 47 final int index, 48 final List<FieldVector<T>> basis) { 49 // generate exception, dependent vectors are forbidden with this settings 50 throw new MathIllegalArgumentException(LocalizedCoreFormats.ZERO_NORM); 51 } 52 53 }, 54 55 /** Replace dependent vectors by vectors with norm 0. 56 * <p> 57 * This behavior matches the Wolfram language API. It keeps the 58 * number of output vectors equal to the number of input vectors. 59 * The only two norms output vectors can have are 0 and 1. 60 * </p> 61 */ 62 ADD_ZERO_VECTOR { 63 64 /** {@inheritDoc} */ 65 @Override 66 public int manageDependent(final int index, final List<RealVector> basis) { 67 // add a zero vector, preserving output vector size (and dropping its normalization property) 68 basis.set(index, MatrixUtils.createRealVector(basis.get(index).getDimension())); 69 return index + 1; 70 } 71 72 73 /** {@inheritDoc} */ 74 @Override 75 public <T extends CalculusFieldElement<T>> int manageDependent(final Field<T> field, 76 final int index, 77 final List<FieldVector<T>> basis) { 78 // add a zero vector, preserving output vector size (and dropping its normalization property) 79 basis.set(index, MatrixUtils.createFieldVector(field, basis.get(index).getDimension())); 80 return index + 1; 81 } 82 83 }, 84 85 /** Ignore dependent vectors. 86 * <p> 87 * This behavior ensures the output vectors form an orthonormal 88 * basis, i.e. all vectors are independent and they all have norm 1. 89 * The number of output vectors may be smaller than the number of 90 * input vectors, this number corresponds to the dimension of the 91 * span of the input vectors. 92 * </p> 93 */ 94 REDUCE_BASE_TO_SPAN { 95 96 /** {@inheritDoc} */ 97 @Override 98 public int manageDependent(final int index, final List<RealVector> basis) { 99 // remove dependent vector 100 basis.remove(index); 101 return index; 102 } 103 104 105 /** {@inheritDoc} */ 106 @Override 107 public <T extends CalculusFieldElement<T>> int manageDependent(final Field<T> field, 108 final int index, 109 final List<FieldVector<T>> basis) { 110 // remove dependent vector 111 basis.remove(index); 112 return index; 113 } 114 115 }; 116 117 /** Manage a dependent vector. 118 * @param index of the vector in the basis 119 * @param basis placeholder for basis vectors 120 * @return next index to manage 121 */ 122 public abstract int manageDependent(int index, List<RealVector> basis); 123 124 /** Manage a dependent vector. 125 * @param <T> type of the vectors components 126 * @param field field to which the vectors belong 127 * @param index of the vector in the basis 128 * @param basis placeholder for basis vectors 129 * @return next index to manage 130 */ 131 public abstract <T extends CalculusFieldElement<T>> int manageDependent(Field<T> field, int index, List<FieldVector<T>> basis); 132 133 }