FieldTuple.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.util;
- import java.util.Arrays;
- import org.hipparchus.CalculusFieldElement;
- import org.hipparchus.Field;
- import org.hipparchus.exception.MathIllegalArgumentException;
- /**
- * This class allows to perform the same computation of all components of a Tuple at once.
- * @param <T> the type of the field elements
- * @since 1.2
- */
- public class FieldTuple<T extends CalculusFieldElement<T>> implements CalculusFieldElement<FieldTuple<T>> {
- /** Components of the tuple. */
- private final T[] values;
- /** Field the instance belongs to. */
- private final transient FieldTupleField<T> field;
- /** Creates a new instance from its components.
- * @param x components of the tuple
- */
- @SafeVarargs
- public FieldTuple(final T... x) {
- this(new FieldTupleField<>(x[0].getField(), x.length), x.clone());
- }
- /** Creates a new instance from its components.
- * @param field field the instance belongs to
- * @param x components of the tuple (beware, it is <em>not</em> copied, it is shared with caller)
- */
- private FieldTuple(final FieldTupleField<T> field, final T[] x) { // NOPMD - storing user-supplied array is intentional and documented here
- this.values = x;
- this.field = field;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> newInstance(final double value) {
- return field.getZero().add(value);
- }
- /** Get the dimension of the tuple.
- * @return dimension of the tuple
- */
- public int getDimension() {
- return values.length;
- }
- /** Get one component of the tuple.
- * @param index index of the component, between 0 and {@link #getDimension() getDimension()} - 1
- * @return value of the component
- */
- public T getComponent(final int index) {
- return values[index];
- }
- /** Get all components of the tuple.
- * @return all components
- */
- public T[] getComponents() {
- return values.clone();
- }
- /** {@inheritDoc} */
- @Override
- public Field<FieldTuple<T>> getField() {
- return field;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> add(final FieldTuple<T> a) {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].add(a.values[i]);
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> subtract(final FieldTuple<T> a) {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].subtract(a.values[i]);
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> negate() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].negate();
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> multiply(final FieldTuple<T> a) {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].multiply(a.values[i]);
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> multiply(final int n) {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].multiply(n);
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> divide(final FieldTuple<T> a) {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].divide(a.values[i]);
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> reciprocal() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].reciprocal();
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public boolean equals(final Object obj) {
- if (obj instanceof FieldTuple<?> ) {
- @SuppressWarnings("unchecked")
- final FieldTuple<T> that = (FieldTuple<T>) obj;
- if (getDimension() == that.getDimension()) {
- boolean equals = true;
- for (int i = 0; i < values.length; ++i) {
- equals &= values[i].equals(that.values[i]);
- }
- return equals;
- }
- }
- return false;
- }
- /** {@inheritDoc} */
- @Override
- public int hashCode() {
- return 0x58f61de5 + Arrays.hashCode(values);
- }
- /** {@inheritDoc} */
- @Override
- public double getReal() {
- return values[0].getReal();
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> getAddendum() {
- final T[] addendum = values.clone();
- addendum[0] = addendum[0].getField().getZero();
- for (int i = 1; i < addendum.length; ++i) {
- addendum[i] = addendum[i].subtract(values[0]);
- }
- return new FieldTuple<>(field, addendum);
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> add(final double a) {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].add(a);
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> subtract(final double a) {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].subtract(a);
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> multiply(final double a) {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].multiply(a);
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> square() {
- return multiply(this);
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> divide(final double a) {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].divide(a);
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> remainder(final double a) {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].remainder(a);
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> remainder(final FieldTuple<T> a) {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].remainder(a.values[i]);
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> abs() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].abs();
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> ceil() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].ceil();
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> floor() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].floor();
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> rint() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].rint();
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> sign() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].sign();
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> copySign(final FieldTuple<T> sign) {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].copySign(sign.values[i]);
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> copySign(final double sign) {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].copySign(sign);
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> scalb(final int n) {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].scalb(n);
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> ulp() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].ulp();
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> hypot(final FieldTuple<T> y) {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].hypot(y.values[i]);
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> sqrt() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].sqrt();
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> cbrt() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].cbrt();
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> rootN(final int n) {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].rootN(n);
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> pow(final double p) {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].pow(p);
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> pow(final int n) {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].pow(n);
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> pow(final FieldTuple<T> e) {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].pow(e.values[i]);
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> exp() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].exp();
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> expm1() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].expm1();
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> log() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].log();
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> log1p() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].log1p();
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> log10() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].log10();
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> cos() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].cos();
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> sin() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].sin();
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldSinCos<FieldTuple<T>> sinCos() {
- final FieldTuple<T> sin = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- final FieldTuple<T> cos = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- final FieldSinCos<T> sc = FastMath.sinCos(values[i]);
- sin.values[i] = sc.sin();
- cos.values[i] = sc.cos();
- }
- return new FieldSinCos<>(sin, cos);
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> tan() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].tan();
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> acos() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].acos();
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> asin() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].asin();
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> atan() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].atan();
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> atan2(final FieldTuple<T> x) {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].atan2(x.values[i]);
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> cosh() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].cosh();
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> sinh() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].sinh();
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldSinhCosh<FieldTuple<T>> sinhCosh() {
- final FieldTuple<T> sinh = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- final FieldTuple<T> cosh = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- final FieldSinhCosh<T> sc = FastMath.sinhCosh(values[i]);
- sinh.values[i] = sc.sinh();
- cosh.values[i] = sc.cosh();
- }
- return new FieldSinhCosh<>(sinh, cosh);
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> tanh() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].tanh();
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> acosh() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].acosh();
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> asinh() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].asinh();
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> atanh() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].atanh();
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> toDegrees() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].toDegrees();
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> toRadians() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = values[i].toRadians();
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> linearCombination(final FieldTuple<T>[] a, final FieldTuple<T>[] b)
- throws MathIllegalArgumentException {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- MathUtils.checkDimension(a.length, b.length);
- final T[] aT = MathArrays.buildArray(values[0].getField(), a.length);
- final T[] bT = MathArrays.buildArray(values[0].getField(), b.length);
- for (int i = 0; i < values.length; ++i) {
- for (int j = 0; j < a.length; ++j) {
- aT[j] = a[j].values[i];
- bT[j] = b[j].values[i];
- }
- result.values[i] = aT[0].linearCombination(aT, bT);
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> linearCombination(final double[] a, final FieldTuple<T>[] b)
- throws MathIllegalArgumentException {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- MathUtils.checkDimension(a.length, b.length);
- final T[] bT = MathArrays.buildArray(values[0].getField(), b.length);
- for (int i = 0; i < values.length; ++i) {
- for (int j = 0; j < a.length; ++j) {
- bT[j] = b[j].values[i];
- }
- result.values[i] = bT[0].linearCombination(a, bT);
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> linearCombination(final FieldTuple<T> a1, final FieldTuple<T> b1,
- final FieldTuple<T> a2, final FieldTuple<T> b2) {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = a1.values[0].linearCombination(a1.values[i], b1.values[i],
- a2.values[i], b2.values[i]);
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> linearCombination(final double a1, final FieldTuple<T> b1,
- final double a2, final FieldTuple<T> b2) {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = b1.values[0].linearCombination(a1, b1.values[i],
- a2, b2.values[i]);
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> linearCombination(final FieldTuple<T> a1, final FieldTuple<T> b1,
- final FieldTuple<T> a2, final FieldTuple<T> b2,
- final FieldTuple<T> a3, final FieldTuple<T> b3) {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = a1.values[0].linearCombination(a1.values[i], b1.values[i],
- a2.values[i], b2.values[i],
- a3.values[i], b3.values[i]);
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> linearCombination(final double a1, final FieldTuple<T> b1,
- final double a2, final FieldTuple<T> b2,
- final double a3, final FieldTuple<T> b3) {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = b1.values[0].linearCombination(a1, b1.values[i],
- a2, b2.values[i],
- a3, b3.values[i]);
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> linearCombination(final FieldTuple<T> a1, final FieldTuple<T> b1,
- final FieldTuple<T> a2, final FieldTuple<T> b2,
- final FieldTuple<T> a3, final FieldTuple<T> b3,
- final FieldTuple<T> a4, final FieldTuple<T> b4) {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = a1.values[0].linearCombination(a1.values[i], b1.values[i],
- a2.values[i], b2.values[i],
- a3.values[i], b3.values[i],
- a4.values[i], b4.values[i]);
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> linearCombination(final double a1, final FieldTuple<T> b1,
- final double a2, final FieldTuple<T> b2,
- final double a3, final FieldTuple<T> b3,
- final double a4, final FieldTuple<T> b4) {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- for (int i = 0; i < values.length; ++i) {
- result.values[i] = b1.values[0].linearCombination(a1, b1.values[i],
- a2, b2.values[i],
- a3, b3.values[i],
- a4, b4.values[i]);
- }
- return result;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> getPi() {
- final FieldTuple<T> result = new FieldTuple<>(field, MathArrays.buildArray(values[0].getField(), values.length));
- Arrays.fill(result.values, values[0].getPi());
- return result;
- }
- /** Field for {link FieldTuple} instances.
- * @param <T> the type of the field elements
- */
- private static class FieldTupleField<T extends CalculusFieldElement<T>> implements Field<FieldTuple<T>> {
- /** Constant function evaluating to 0.0. */
- private final FieldTuple<T> zero;
- /** Constant function evaluating to 1.0. */
- private final FieldTuple<T> one;
- /** Simple constructor.
- * @param field field to which the elements belong
- * @param dimension dimension of the tuple
- */
- FieldTupleField(final Field<T> field, final int dimension) {
- final T[] zeroData = MathArrays.buildArray(field, dimension);
- Arrays.fill(zeroData, field.getZero());
- final T[] oneData = MathArrays.buildArray(field, dimension);
- Arrays.fill(oneData, field.getOne());
- this.zero = new FieldTuple<>(this, zeroData);
- this.one = new FieldTuple<>(this, oneData);
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> getZero() {
- return zero;
- }
- /** {@inheritDoc} */
- @Override
- public FieldTuple<T> getOne() {
- return one;
- }
- /** {@inheritDoc} */
- @SuppressWarnings("unchecked")
- @Override
- public Class<FieldTuple<T>> getRuntimeClass() {
- return (Class<FieldTuple<T>>) zero.getClass();
- }
- /** {@inheritDoc} */
- @Override
- public boolean equals(final Object other) {
- if (other instanceof FieldTupleField) {
- @SuppressWarnings("unchecked")
- final FieldTupleField<T> that = (FieldTupleField<T>) other;
- return zero.getDimension() == that.zero.getDimension();
- } else {
- return false;
- }
- }
- /** {@inheritDoc} */
- @Override
- public int hashCode() {
- return 0xb4a533e1 ^ zero.getDimension();
- }
- }
- }