MATH-1284: Merge branch 'feature-MATH-1284'
Project: http://git-wip-us.apache.org/repos/asf/commons-math/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-math/commit/7a59c0af Tree: http://git-wip-us.apache.org/repos/asf/commons-math/tree/7a59c0af Diff: http://git-wip-us.apache.org/repos/asf/commons-math/diff/7a59c0af Branch: refs/heads/master Commit: 7a59c0af26177cf69e702eaac85471e54762f664 Parents: bf91584 c9e49fa Author: Ray DeCampo <r...@decampo.org> Authored: Fri May 12 17:30:53 2017 -0400 Committer: Ray DeCampo <r...@decampo.org> Committed: Fri May 12 17:30:53 2017 -0400 ---------------------------------------------------------------------- findbugs-exclude-filter.xml | 6 +- .../apache/commons/math4/geometry/Vector.java | 19 +- .../geometry/euclidean/oned/Cartesian1D.java | 387 ++++++ .../geometry/euclidean/oned/IntervalsSet.java | 18 +- .../geometry/euclidean/oned/OrientedPoint.java | 8 +- .../math4/geometry/euclidean/oned/Vector1D.java | 344 +---- .../geometry/euclidean/oned/Vector1DFormat.java | 2 +- .../geometry/euclidean/threed/Cartesian3D.java | 621 +++++++++ .../euclidean/threed/FieldRotation.java | 100 +- .../euclidean/threed/FieldVector3D.java | 92 +- .../math4/geometry/euclidean/threed/Line.java | 80 +- .../euclidean/threed/OutlineExtractor.java | 46 +- .../math4/geometry/euclidean/threed/Plane.java | 132 +- .../euclidean/threed/PolyhedronsSet.java | 96 +- .../geometry/euclidean/threed/Rotation.java | 246 ++-- .../euclidean/threed/RotationConvention.java | 16 +- .../euclidean/threed/RotationOrder.java | 38 +- .../geometry/euclidean/threed/Segment.java | 10 +- .../euclidean/threed/SphereGenerator.java | 22 +- .../euclidean/threed/SphericalCoordinates.java | 10 +- .../geometry/euclidean/threed/SubLine.java | 14 +- .../geometry/euclidean/threed/SubPlane.java | 14 +- .../geometry/euclidean/threed/Vector3D.java | 572 +------- .../euclidean/threed/Vector3DFormat.java | 2 +- .../geometry/euclidean/twod/Cartesian2D.java | 492 +++++++ .../geometry/euclidean/twod/DiskGenerator.java | 16 +- .../math4/geometry/euclidean/twod/Line.java | 88 +- .../geometry/euclidean/twod/NestedLoops.java | 14 +- .../geometry/euclidean/twod/PolygonsSet.java | 78 +- .../math4/geometry/euclidean/twod/Segment.java | 14 +- .../math4/geometry/euclidean/twod/SubLine.java | 22 +- .../math4/geometry/euclidean/twod/Vector2D.java | 447 +------ .../geometry/euclidean/twod/Vector2DFormat.java | 2 +- .../hull/AbstractConvexHullGenerator2D.java | 10 +- .../twod/hull/AklToussaintHeuristic.java | 34 +- .../euclidean/twod/hull/ConvexHull2D.java | 32 +- .../twod/hull/ConvexHullGenerator2D.java | 6 +- .../euclidean/twod/hull/MonotoneChain.java | 28 +- .../geometry/partitioning/AbstractRegion.java | 6 +- .../math4/geometry/partitioning/Embedding.java | 4 +- .../math4/geometry/spherical/oned/S1Point.java | 14 +- .../math4/geometry/spherical/twod/Circle.java | 38 +- .../math4/geometry/spherical/twod/Edge.java | 4 +- .../geometry/spherical/twod/EdgesBuilder.java | 10 +- .../spherical/twod/PropertiesComputer.java | 30 +- .../math4/geometry/spherical/twod/S2Point.java | 32 +- .../spherical/twod/SphericalPolygonsSet.java | 28 +- .../geometry/spherical/twod/SubCircle.java | 4 +- src/site/design/threeD.puml | 4 +- src/site/design/twoD.puml | 4 +- src/site/xdoc/userguide/geometry.xml | 16 +- src/site/xdoc/userguide/leastsquares.xml | 20 +- .../commons/math4/complex/QuaternionTest.java | 30 +- ...stractLeastSquaresOptimizerAbstractTest.java | 6 +- .../fitting/leastsquares/CircleVectorial.java | 18 +- .../GaussNewtonOptimizerWithSVDTest.java | 6 +- .../LevenbergMarquardtOptimizerTest.java | 6 +- .../RandomCirclePointGenerator.java | 10 +- .../geometry/enclosing/WelzlEncloser2DTest.java | 56 +- .../geometry/enclosing/WelzlEncloser3DTest.java | 110 +- .../euclidean/oned/Cartesian1DTest.java | 219 +++ .../euclidean/oned/IntervalsSetTest.java | 44 +- .../oned/Vector1DFormatAbstractTest.java | 45 +- .../geometry/euclidean/oned/Vector1DTest.java | 220 --- .../euclidean/threed/FieldRotationDSTest.java | 20 +- .../euclidean/threed/FieldRotationDfpTest.java | 6 +- .../euclidean/threed/FieldVector3DTest.java | 70 +- .../geometry/euclidean/threed/LineTest.java | 76 +- .../geometry/euclidean/threed/PLYParser.java | 8 +- .../geometry/euclidean/threed/PlaneTest.java | 88 +- .../euclidean/threed/PolyhedronsSetTest.java | 146 +- .../geometry/euclidean/threed/RotationTest.java | 250 ++-- .../euclidean/threed/SphereGeneratorTest.java | 114 +- .../threed/SphericalCoordinatesTest.java | 30 +- .../geometry/euclidean/threed/SubLineTest.java | 60 +- .../threed/Vector3DFormatAbstractTest.java | 50 +- .../geometry/euclidean/threed/Vector3DTest.java | 246 ++-- .../euclidean/twod/Cartesian2DTest.java | 235 ++++ .../euclidean/twod/DiskGeneratorTest.java | 58 +- .../math4/geometry/euclidean/twod/LineTest.java | 67 +- .../euclidean/twod/NestedLoopsTest.java | 16 +- .../euclidean/twod/PolygonsSetTest.java | 1260 +++++++++--------- .../geometry/euclidean/twod/SegmentTest.java | 14 +- .../geometry/euclidean/twod/SubLineTest.java | 60 +- .../twod/Vector2DFormatAbstractTest.java | 50 +- .../geometry/euclidean/twod/Vector2DTest.java | 235 ---- .../twod/hull/AklToussaintHeuristicTest.java | 4 +- .../hull/ConvexHullGenerator2DAbstractTest.java | 226 ++-- .../euclidean/twod/hull/MonotoneChainTest.java | 22 +- .../geometry/partitioning/RegionDumper.java | 10 +- .../geometry/partitioning/RegionParser.java | 16 +- .../geometry/spherical/twod/CircleTest.java | 80 +- .../twod/SphericalPolygonsSetTest.java | 152 +-- .../geometry/spherical/twod/SubCircleTest.java | 34 +- .../MultiStartMultivariateOptimizerTest.java | 4 +- .../nonlinear/scalar/gradient/CircleScalar.java | 18 +- ...NonLinearConjugateGradientOptimizerTest.java | 4 +- .../userguide/ClusterAlgorithmComparison.java | 40 +- .../LowDiscrepancyGeneratorComparison.java | 43 +- .../userguide/geometry/GeometryExample.java | 36 +- .../math4/userguide/sofm/ChineseRings.java | 20 +- .../userguide/sofm/ChineseRingsClassifier.java | 10 +- 102 files changed, 4634 insertions(+), 4406 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-math/blob/7a59c0af/src/main/java/org/apache/commons/math4/geometry/euclidean/oned/IntervalsSet.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-math/blob/7a59c0af/src/main/java/org/apache/commons/math4/geometry/euclidean/threed/FieldVector3D.java ---------------------------------------------------------------------- diff --cc src/main/java/org/apache/commons/math4/geometry/euclidean/threed/FieldVector3D.java index 4f04edf,6f93fdd..c49dd76 --- a/src/main/java/org/apache/commons/math4/geometry/euclidean/threed/FieldVector3D.java +++ b/src/main/java/org/apache/commons/math4/geometry/euclidean/threed/FieldVector3D.java @@@ -535,10 -535,10 +535,10 @@@ public class FieldVector3D<T extends Re * following example shows how to build a frame having the k axis * aligned with the known vector u : * <pre><code> - * Vector3D k = u.normalize(); - * Vector3D i = k.orthogonal(); - * Vector3D j = Vector3D.crossProduct(k, i); + * Cartesian3D k = u.normalize(); + * Cartesian3D i = k.orthogonal(); + * Cartesian3D j = Cartesian3D.crossProduct(k, i); - * </code></pre></p> + * </code></pre> * @return a new normalized vector orthogonal to the instance * @exception MathArithmeticException if the norm of the instance is null */ http://git-wip-us.apache.org/repos/asf/commons-math/blob/7a59c0af/src/main/java/org/apache/commons/math4/geometry/euclidean/threed/Line.java ---------------------------------------------------------------------- diff --cc src/main/java/org/apache/commons/math4/geometry/euclidean/threed/Line.java index 6b14f6e,4ec55a3..6b467fc --- a/src/main/java/org/apache/commons/math4/geometry/euclidean/threed/Line.java +++ b/src/main/java/org/apache/commons/math4/geometry/euclidean/threed/Line.java @@@ -22,10 -22,10 +22,10 @@@ import org.apache.commons.math4.geometr import org.apache.commons.math4.geometry.Vector; import org.apache.commons.math4.geometry.euclidean.oned.Euclidean1D; import org.apache.commons.math4.geometry.euclidean.oned.IntervalsSet; - import org.apache.commons.math4.geometry.euclidean.oned.Vector1D; + import org.apache.commons.math4.geometry.euclidean.oned.Cartesian1D; import org.apache.commons.math4.geometry.partitioning.Embedding; import org.apache.commons.math4.util.FastMath; -import org.apache.commons.math4.util.Precision; +import org.apache.commons.numbers.core.Precision; /** The class represent lines in a three dimensional space. http://git-wip-us.apache.org/repos/asf/commons-math/blob/7a59c0af/src/main/java/org/apache/commons/math4/geometry/euclidean/twod/PolygonsSet.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-math/blob/7a59c0af/src/main/java/org/apache/commons/math4/geometry/euclidean/twod/hull/ConvexHull2D.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-math/blob/7a59c0af/src/main/java/org/apache/commons/math4/geometry/euclidean/twod/hull/MonotoneChain.java ---------------------------------------------------------------------- diff --cc src/main/java/org/apache/commons/math4/geometry/euclidean/twod/hull/MonotoneChain.java index d23a902,42cbc33..e77d4e3 --- a/src/main/java/org/apache/commons/math4/geometry/euclidean/twod/hull/MonotoneChain.java +++ b/src/main/java/org/apache/commons/math4/geometry/euclidean/twod/hull/MonotoneChain.java @@@ -23,9 -23,9 +23,9 @@@ import java.util.Comparator import java.util.List; import org.apache.commons.math4.geometry.euclidean.twod.Line; - import org.apache.commons.math4.geometry.euclidean.twod.Vector2D; + import org.apache.commons.math4.geometry.euclidean.twod.Cartesian2D; import org.apache.commons.math4.util.FastMath; -import org.apache.commons.math4.util.Precision; +import org.apache.commons.numbers.core.Precision; /** * Implements Andrew's monotone chain method to generate the convex hull of a finite set of http://git-wip-us.apache.org/repos/asf/commons-math/blob/7a59c0af/src/test/java/org/apache/commons/math4/fitting/leastsquares/AbstractLeastSquaresOptimizerAbstractTest.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-math/blob/7a59c0af/src/test/java/org/apache/commons/math4/fitting/leastsquares/LevenbergMarquardtOptimizerTest.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-math/blob/7a59c0af/src/test/java/org/apache/commons/math4/geometry/euclidean/oned/Cartesian1DTest.java ---------------------------------------------------------------------- diff --cc src/test/java/org/apache/commons/math4/geometry/euclidean/oned/Cartesian1DTest.java index 0000000,2b60c3d..a01c9ef mode 000000,100644..100644 --- a/src/test/java/org/apache/commons/math4/geometry/euclidean/oned/Cartesian1DTest.java +++ b/src/test/java/org/apache/commons/math4/geometry/euclidean/oned/Cartesian1DTest.java @@@ -1,0 -1,219 +1,219 @@@ + /* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.apache.commons.math4.geometry.euclidean.oned; + + import java.text.DecimalFormat; + import java.text.DecimalFormatSymbols; + import java.text.NumberFormat; + import java.util.Locale; + + import org.apache.commons.math4.exception.DimensionMismatchException; + import org.apache.commons.math4.exception.MathArithmeticException; + import org.apache.commons.math4.geometry.Space; + import org.apache.commons.math4.util.FastMath; -import org.apache.commons.math4.util.Precision; ++import org.apache.commons.numbers.core.Precision; + import org.junit.Assert; + import org.junit.Test; + + public class Cartesian1DTest { + @Test + public void testConstructors() throws DimensionMismatchException { + checkVector(new Cartesian1D(3, new Cartesian1D(FastMath.PI / 3)), + FastMath.PI); + checkVector(new Cartesian1D(2, Cartesian1D.ONE, -3, new Cartesian1D(2)), + -4); + checkVector(new Cartesian1D(2, Cartesian1D.ONE, + 5, new Cartesian1D(2), + -3, new Cartesian1D(3)), + 3); + checkVector(new Cartesian1D(2, Cartesian1D.ONE, + 5, new Cartesian1D(2), + 5, new Cartesian1D(-2), + -3, new Cartesian1D(-3)), + 11); + } + + @Test + public void testSpace() { + Space space = new Cartesian1D(1).getSpace(); + Assert.assertEquals(1, space.getDimension()); + } + + @Test + public void testZero() { + Assert.assertEquals(0, new Cartesian1D(1).getZero().getNorm(), 1.0e-15); + } + + @Test + public void testEquals() { + Cartesian1D u1 = new Cartesian1D(1); + Cartesian1D u2 = new Cartesian1D(1); + Assert.assertTrue(u1.equals(u1)); + Assert.assertTrue(u1.equals(u2)); + Assert.assertFalse(u1.equals(new Cartesian1D(1 + 10 * Precision.EPSILON))); + Assert.assertTrue(new Cartesian1D(Double.NaN).equals(new Cartesian1D(Double.NaN))); + } + + @Test + public void testHash() { + Assert.assertEquals(new Cartesian1D(Double.NaN).hashCode(), new Cartesian1D(Double.NaN).hashCode()); + Cartesian1D u = new Cartesian1D(1); + Cartesian1D v = new Cartesian1D(1 + 10 * Precision.EPSILON); + Assert.assertTrue(u.hashCode() != v.hashCode()); + } + + @Test + public void testInfinite() { + Assert.assertTrue(new Cartesian1D(Double.NEGATIVE_INFINITY).isInfinite()); + Assert.assertTrue(new Cartesian1D(Double.POSITIVE_INFINITY).isInfinite()); + Assert.assertFalse(new Cartesian1D(1).isInfinite()); + Assert.assertFalse(new Cartesian1D(Double.NaN).isInfinite()); + } + + @Test + public void testNaN() { + Assert.assertTrue(new Cartesian1D(Double.NaN).isNaN()); + Assert.assertFalse(new Cartesian1D(1).isNaN()); + Assert.assertFalse(new Cartesian1D(Double.NEGATIVE_INFINITY).isNaN()); + } + + @Test + public void testToString() { + Assert.assertEquals("{3}", new Cartesian1D(3).toString()); + NumberFormat format = new DecimalFormat("0.000", new DecimalFormatSymbols(Locale.US)); + Assert.assertEquals("{3.000}", new Cartesian1D(3).toString(format)); + } + + @Test + public void testCoordinates() { + Cartesian1D v = new Cartesian1D(1); + Assert.assertTrue(FastMath.abs(v.getX() - 1) < 1.0e-12); + } + + @Test + public void testNorm1() { + Assert.assertEquals(0.0, Cartesian1D.ZERO.getNorm1(), 0); + Assert.assertEquals(6.0, new Cartesian1D(6).getNorm1(), 0); + } + + @Test + public void testNorm() { + Assert.assertEquals(0.0, Cartesian1D.ZERO.getNorm(), 0); + Assert.assertEquals(3.0, new Cartesian1D(-3).getNorm(), 1.0e-12); + } + + @Test + public void testNormSq() { + Assert.assertEquals(0.0, new Cartesian1D(0).getNormSq(), 0); + Assert.assertEquals(9.0, new Cartesian1D(-3).getNormSq(), 1.0e-12); + } + + @Test + public void testNormInf() { + Assert.assertEquals(0.0, Cartesian1D.ZERO.getNormInf(), 0); + Assert.assertEquals(3.0, new Cartesian1D(-3).getNormInf(), 0); + } + + @Test + public void testDistance1() { + Cartesian1D v1 = new Cartesian1D(1); + Cartesian1D v2 = new Cartesian1D(-4); + Assert.assertEquals(0.0, new Cartesian1D(-1).distance1(new Cartesian1D(-1)), 0); + Assert.assertEquals(5.0, v1.distance1(v2), 1.0e-12); + Assert.assertEquals(v1.subtract(v2).getNorm1(), v1.distance1(v2), 1.0e-12); + } + + @Test + public void testDistance() { + Cartesian1D v1 = new Cartesian1D(1); + Cartesian1D v2 = new Cartesian1D(-4); + Assert.assertEquals(0.0, Cartesian1D.distance(new Cartesian1D(-1), new Cartesian1D(-1)), 0); + Assert.assertEquals(5.0, Cartesian1D.distance(v1, v2), 1.0e-12); + Assert.assertEquals(v1.subtract(v2).getNorm(), Cartesian1D.distance(v1, v2), 1.0e-12); + } + + @Test + public void testDistanceSq() { + Cartesian1D v1 = new Cartesian1D(1); + Cartesian1D v2 = new Cartesian1D(-4); + Assert.assertEquals(0.0, Cartesian1D.distanceSq(new Cartesian1D(-1), new Cartesian1D(-1)), 0); + Assert.assertEquals(25.0, Cartesian1D.distanceSq(v1, v2), 1.0e-12); + Assert.assertEquals(Cartesian1D.distance(v1, v2) * Cartesian1D.distance(v1, v2), + Cartesian1D.distanceSq(v1, v2), 1.0e-12); + } + + @Test + public void testDistanceInf() { + Cartesian1D v1 = new Cartesian1D(1); + Cartesian1D v2 = new Cartesian1D(-4); + Assert.assertEquals(0.0, Cartesian1D.distanceInf(new Cartesian1D(-1), new Cartesian1D(-1)), 0); + Assert.assertEquals(5.0, Cartesian1D.distanceInf(v1, v2), 1.0e-12); + Assert.assertEquals(v1.subtract(v2).getNormInf(), Cartesian1D.distanceInf(v1, v2), 1.0e-12); + } + + @Test + public void testSubtract() { + Cartesian1D v1 = new Cartesian1D(1); + Cartesian1D v2 = new Cartesian1D(-3); + v1 = v1.subtract(v2); + checkVector(v1, 4); + + checkVector(v2.subtract(v1), -7); + checkVector(v2.subtract(3, v1), -15); + } + + @Test + public void testAdd() { + Cartesian1D v1 = new Cartesian1D(1); + Cartesian1D v2 = new Cartesian1D(-3); + v1 = v1.add(v2); + checkVector(v1, -2); + + checkVector(v2.add(v1), -5); + checkVector(v2.add(3, v1), -9); + } + + @Test + public void testScalarProduct() { + Cartesian1D v = new Cartesian1D(1); + v = v.scalarMultiply(3); + checkVector(v, 3); + + checkVector(v.scalarMultiply(0.5), 1.5); + } + + @Test + public void testNormalize() throws MathArithmeticException { + Assert.assertEquals(1.0, new Cartesian1D(5).normalize().getNorm(), 1.0e-12); + try { + Cartesian1D.ZERO.normalize(); + Assert.fail("an exception should have been thrown"); + } catch (MathArithmeticException ae) { + // expected behavior + } + } + + @Test + public void testNegate() { + checkVector(new Cartesian1D(0.1).negate(), -0.1); + } + + private void checkVector(Cartesian1D v, double x) { + Assert.assertEquals(x, v.getX(), 1.0e-12); + } + } http://git-wip-us.apache.org/repos/asf/commons-math/blob/7a59c0af/src/test/java/org/apache/commons/math4/geometry/euclidean/oned/IntervalsSetTest.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-math/blob/7a59c0af/src/test/java/org/apache/commons/math4/geometry/euclidean/threed/FieldVector3DTest.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-math/blob/7a59c0af/src/test/java/org/apache/commons/math4/geometry/euclidean/threed/PLYParser.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-math/blob/7a59c0af/src/test/java/org/apache/commons/math4/geometry/euclidean/threed/Vector3DTest.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-math/blob/7a59c0af/src/test/java/org/apache/commons/math4/geometry/euclidean/twod/hull/ConvexHullGenerator2DAbstractTest.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-math/blob/7a59c0af/src/test/java/org/apache/commons/math4/optim/nonlinear/scalar/MultiStartMultivariateOptimizerTest.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-math/blob/7a59c0af/src/test/java/org/apache/commons/math4/optim/nonlinear/scalar/gradient/NonLinearConjugateGradientOptimizerTest.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-math/blob/7a59c0af/src/userguide/java/org/apache/commons/math4/userguide/sofm/ChineseRingsClassifier.java ----------------------------------------------------------------------