You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2017/05/04 13:37:05 UTC
[01/67] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math
module to Ignite ML module added missed licenses renamed packages fixed wrong
ml profile activation (cherry picked from commit d78e071)
Repository: ignite
Updated Branches:
refs/heads/ignite-5075 a1d410412 -> 26a1bb6a5
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorIterableTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorIterableTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorIterableTest.java
new file mode 100644
index 0000000..16c2571
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorIterableTest.java
@@ -0,0 +1,376 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.util.Spliterator;
+import java.util.function.BiConsumer;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.impls.MathTestConstants;
+import org.junit.Test;
+
+import static java.util.Spliterator.ORDERED;
+import static java.util.Spliterator.SIZED;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+/** */
+public class VectorIterableTest {
+ /** */
+ @Test
+ public void allTest() {
+ consumeSampleVectors(
+ (v, desc) -> {
+ int expIdx = 0;
+
+ for (Vector.Element e : v.all()) {
+ int actualIdx = e.index();
+
+ assertEquals("Unexpected index for " + desc,
+ expIdx, actualIdx);
+
+ expIdx++;
+ }
+
+ assertEquals("Unexpected amount of elements for " + desc,
+ expIdx, v.size());
+ }
+ );
+ }
+
+ /** */
+ @Test
+ public void allTestBound() {
+ consumeSampleVectors(
+ (v, desc) -> iteratorTestBound(v.all().iterator(), desc)
+ );
+ }
+
+ /** */
+ @Test
+ public void nonZeroesTestBasic() {
+ final int size = 5;
+
+ final double[] nonZeroesOddData = new double[size], nonZeroesEvenData = new double[size];
+
+ for (int idx = 0; idx < size; idx++) {
+ final boolean odd = (idx & 1) == 1;
+
+ nonZeroesOddData[idx] = odd ? 1 : 0;
+
+ nonZeroesEvenData[idx] = odd ? 0 : 1;
+ }
+
+ assertTrue("Arrays failed to initialize.",
+ !isZero(nonZeroesEvenData[0])
+ && isZero(nonZeroesEvenData[1])
+ && isZero(nonZeroesOddData[0])
+ && !isZero(nonZeroesOddData[1]));
+
+ final Vector nonZeroesEvenVec = new DenseLocalOnHeapVector(nonZeroesEvenData),
+ nonZeroesOddVec = new DenseLocalOnHeapVector(nonZeroesOddData);
+
+ assertTrue("Vectors failed to initialize.",
+ !isZero(nonZeroesEvenVec.getElement(0).get())
+ && isZero(nonZeroesEvenVec.getElement(1).get())
+ && isZero(nonZeroesOddVec.getElement(0).get())
+ && !isZero(nonZeroesOddVec.getElement(1).get()));
+
+ assertTrue("Iterator(s) failed to start.",
+ nonZeroesEvenVec.nonZeroes().iterator().next() != null
+ && nonZeroesOddVec.nonZeroes().iterator().next() != null);
+
+ int nonZeroesActual = 0;
+
+ for (Vector.Element e : nonZeroesEvenVec.nonZeroes()) {
+ final int idx = e.index();
+
+ final boolean odd = (idx & 1) == 1;
+
+ final double val = e.get();
+
+ assertTrue("Not an even index " + idx + ", for value " + val, !odd);
+
+ assertTrue("Zero value " + val + " at even index " + idx, !isZero(val));
+
+ nonZeroesActual++;
+ }
+
+ final int nonZeroesOddExp = (size + 1) / 2;
+
+ assertEquals("Unexpected num of iterated odd non-zeroes.", nonZeroesOddExp, nonZeroesActual);
+
+ assertEquals("Unexpected nonZeroElements of odd.", nonZeroesOddExp, nonZeroesEvenVec.nonZeroElements());
+
+ nonZeroesActual = 0;
+
+ for (Vector.Element e : nonZeroesOddVec.nonZeroes()) {
+ final int idx = e.index();
+
+ final boolean odd = (idx & 1) == 1;
+
+ final double val = e.get();
+
+ assertTrue("Not an odd index " + idx + ", for value " + val, odd);
+
+ assertTrue("Zero value " + val + " at even index " + idx, !isZero(val));
+
+ nonZeroesActual++;
+ }
+
+ final int nonZeroesEvenExp = size / 2;
+
+ assertEquals("Unexpected num of iterated even non-zeroes", nonZeroesEvenExp, nonZeroesActual);
+
+ assertEquals("Unexpected nonZeroElements of even", nonZeroesEvenExp, nonZeroesOddVec.nonZeroElements());
+ }
+
+ /** */
+ @Test
+ public void nonZeroesTest() {
+ // todo make RandomVector constructor that accepts a function and use it here
+ // in order to *reliably* test non-zeroes in there
+ consumeSampleVectors(
+ (v, desc) -> consumeSampleVectorsWithZeroes(v, (vec, numZeroes)
+ -> {
+ int numZeroesActual = vec.size();
+
+ for (Vector.Element e : vec.nonZeroes()) {
+ numZeroesActual--;
+
+ assertTrue("Unexpected zero at " + desc + ", index " + e.index(), !isZero(e.get()));
+ }
+
+ assertEquals("Unexpected num zeroes at " + desc, (int)numZeroes, numZeroesActual);
+ }));
+ }
+
+ /** */
+ @Test
+ public void nonZeroesTestBound() {
+ consumeSampleVectors(
+ (v, desc) -> consumeSampleVectorsWithZeroes(v, (vec, numZeroes)
+ -> iteratorTestBound(vec.nonZeroes().iterator(), desc)));
+ }
+
+ /** */
+ @Test
+ public void nonZeroElementsTest() {
+ consumeSampleVectors(
+ (v, desc) -> consumeSampleVectorsWithZeroes(v, (vec, numZeroes)
+ -> assertEquals("Unexpected num zeroes at " + desc,
+ (int)numZeroes, vec.size() - vec.nonZeroElements())));
+ }
+
+ /** */
+ @Test
+ public void allSpliteratorTest() {
+ consumeSampleVectors(
+ (v, desc) -> {
+ final String desc1 = " " + desc;
+
+ Spliterator<Double> spliterator = v.allSpliterator();
+
+ assertNotNull(MathTestConstants.NULL_VAL + desc1, spliterator);
+
+ assertNull(MathTestConstants.NOT_NULL_VAL + desc1, spliterator.trySplit());
+
+ assertTrue(MathTestConstants.UNEXPECTED_VAL + desc1, spliterator.hasCharacteristics(ORDERED | SIZED));
+
+ if (!readOnly(v))
+ fillWithNonZeroes(v);
+
+ spliterator = v.allSpliterator();
+
+ assertNotNull(MathTestConstants.NULL_VAL + desc1, spliterator);
+
+ assertEquals(MathTestConstants.VAL_NOT_EQUALS + desc1, spliterator.estimateSize(), v.size());
+
+ assertEquals(MathTestConstants.VAL_NOT_EQUALS + desc1, spliterator.getExactSizeIfKnown(), v.size());
+
+ assertTrue(MathTestConstants.UNEXPECTED_VAL + desc1, spliterator.hasCharacteristics(ORDERED | SIZED));
+
+ Spliterator<Double> secondHalf = spliterator.trySplit();
+
+ assertNull(MathTestConstants.NOT_NULL_VAL + desc1, secondHalf);
+
+ spliterator.tryAdvance(x -> {
+ });
+ }
+ );
+ }
+
+ /** */
+ @Test
+ public void nonZeroSpliteratorTest() {
+ consumeSampleVectors(
+ (v, desc) -> consumeSampleVectorsWithZeroes(v, (vec, numZeroes)
+ -> {
+ final String desc1 = " Num zeroes " + numZeroes + " " + desc;
+
+ Spliterator<Double> spliterator = vec.nonZeroSpliterator();
+
+ assertNotNull(MathTestConstants.NULL_VAL + desc1, spliterator);
+
+ assertNull(MathTestConstants.NOT_NULL_VAL + desc1, spliterator.trySplit());
+
+ assertTrue(MathTestConstants.UNEXPECTED_VAL + desc1, spliterator.hasCharacteristics(ORDERED | SIZED));
+
+ spliterator = vec.nonZeroSpliterator();
+
+ assertNotNull(MathTestConstants.NULL_VAL + desc1, spliterator);
+
+ assertEquals(MathTestConstants.VAL_NOT_EQUALS + desc1, spliterator.estimateSize(), vec.size() - numZeroes);
+
+ assertEquals(MathTestConstants.VAL_NOT_EQUALS + desc1, spliterator.getExactSizeIfKnown(), vec.size() - numZeroes);
+
+ assertTrue(MathTestConstants.UNEXPECTED_VAL + desc1, spliterator.hasCharacteristics(ORDERED | SIZED));
+
+ Spliterator<Double> secondHalf = spliterator.trySplit();
+
+ assertNull(MathTestConstants.NOT_NULL_VAL + desc1, secondHalf);
+
+ double[] data = new double[vec.size()];
+
+ for (Vector.Element e : vec.all())
+ data[e.index()] = e.get();
+
+ spliterator = vec.nonZeroSpliterator();
+
+ assertNotNull(MathTestConstants.NULL_VAL + desc1, spliterator);
+
+ assertEquals(MathTestConstants.VAL_NOT_EQUALS + desc1, spliterator.estimateSize(),
+ Arrays.stream(data).filter(x -> x != 0d).count());
+
+ assertEquals(MathTestConstants.VAL_NOT_EQUALS + desc1, spliterator.getExactSizeIfKnown(),
+ Arrays.stream(data).filter(x -> x != 0d).count());
+
+ assertTrue(MathTestConstants.UNEXPECTED_VAL + desc1, spliterator.hasCharacteristics(ORDERED | SIZED));
+
+ secondHalf = spliterator.trySplit();
+
+ assertNull(MathTestConstants.NOT_NULL_VAL + desc1, secondHalf);
+
+ if (!spliterator.tryAdvance(x -> {
+ }))
+ fail(MathTestConstants.NO_NEXT_ELEMENT + desc1);
+ }));
+ }
+
+ /** */
+ private void iteratorTestBound(Iterator<Vector.Element> it, String desc) {
+ while (it.hasNext())
+ assertNotNull(it.next());
+
+ boolean expECaught = false;
+
+ try {
+ it.next();
+ }
+ catch (NoSuchElementException e) {
+ expECaught = true;
+ }
+
+ assertTrue("Expected exception missed for " + desc,
+ expECaught);
+ }
+
+ /** */
+ private void consumeSampleVectorsWithZeroes(Vector sample,
+ BiConsumer<Vector, Integer> consumer) {
+ if (readOnly(sample)) {
+ int numZeroes = 0;
+
+ for (Vector.Element e : sample.all())
+ if (isZero(e.get()))
+ numZeroes++;
+
+ consumer.accept(sample, numZeroes);
+
+ return;
+ }
+
+ fillWithNonZeroes(sample);
+
+ consumer.accept(sample, 0);
+
+ final int sampleSize = sample.size();
+
+ if (sampleSize == 0)
+ return;
+
+ for (Vector.Element e : sample.all())
+ e.set(0);
+
+ consumer.accept(sample, sampleSize);
+
+ fillWithNonZeroes(sample);
+
+ for (int testIdx : new int[] {0, sampleSize / 2, sampleSize - 1}) {
+ final Vector.Element e = sample.getElement(testIdx);
+
+ final double backup = e.get();
+
+ e.set(0);
+
+ consumer.accept(sample, 1);
+
+ e.set(backup);
+ }
+
+ if (sampleSize < 3)
+ return;
+
+ sample.getElement(sampleSize / 3).set(0);
+
+ sample.getElement((2 * sampleSize) / 3).set(0);
+
+ consumer.accept(sample, 2);
+ }
+
+ /** */
+ private void fillWithNonZeroes(Vector sample) {
+ int idx = 0;
+
+ for (Vector.Element e : sample.all())
+ e.set(1 + idx++);
+
+ assertEquals("Not all filled with non-zeroes", idx, sample.size());
+ }
+
+ /** */
+ private void consumeSampleVectors(BiConsumer<Vector, String> consumer) {
+ new VectorImplementationsFixtures().consumeSampleVectors(null, consumer);
+ }
+
+ /** */
+ private boolean isZero(double val) {
+ return val == 0.0;
+ }
+
+ /** */
+ private boolean readOnly(Vector v) {
+ return v instanceof RandomVector || v instanceof ConstantVector;
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorNormTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorNormTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorNormTest.java
new file mode 100644
index 0000000..4e4f212
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorNormTest.java
@@ -0,0 +1,247 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import java.util.function.BiConsumer;
+import java.util.function.BiFunction;
+import java.util.function.Function;
+import org.apache.ignite.ml.math.Vector;
+import org.junit.Test;
+
+import static org.junit.Assert.assertTrue;
+
+/** */
+public class VectorNormTest {
+ /** */
+ @Test
+ public void normalizeTest() {
+ normalizeTest(2, (val, len) -> val / len, Vector::normalize);
+ }
+
+ /** */
+ @Test
+ public void normalizePowerTest() {
+ for (double pow : new double[] {0, 0.5, 1, 2, 2.5, Double.POSITIVE_INFINITY})
+ normalizeTest(pow, (val, norm) -> val / norm, (v) -> v.normalize(pow));
+ }
+
+ /** */
+ @Test
+ public void logNormalizeTest() {
+ normalizeTest(2, (val, len) -> Math.log1p(val) / (len * Math.log(2)), Vector::logNormalize);
+ }
+
+ /** */
+ @Test
+ public void logNormalizePowerTest() {
+ for (double pow : new double[] {1.1, 2, 2.5})
+ normalizeTest(pow, (val, norm) -> Math.log1p(val) / (norm * Math.log(pow)), (v) -> v.logNormalize(pow));
+ }
+
+ /** */
+ @Test
+ public void kNormTest() {
+ for (double pow : new double[] {0, 0.5, 1, 2, 2.5, Double.POSITIVE_INFINITY})
+ toDoubleTest(pow, ref -> new Norm(ref, pow).calculate(), v -> v.kNorm(pow));
+ }
+
+ /** */
+ @Test
+ public void getLengthSquaredTest() {
+ toDoubleTest(2.0, ref -> new Norm(ref, 2).sumPowers(), Vector::getLengthSquared);
+ }
+
+ /** */
+ @Test
+ public void getDistanceSquaredTest() {
+ consumeSampleVectors((v, desc) -> {
+ new VectorImplementationsTest.ElementsChecker(v, desc); // IMPL NOTE this initialises vector
+
+ final int size = v.size();
+ final Vector vOnHeap = new DenseLocalOnHeapVector(size);
+ final Vector vOffHeap = new DenseLocalOffHeapVector(size);
+
+ invertValues(v, vOnHeap);
+ invertValues(v, vOffHeap);
+
+ for (int idx = 0; idx < size; idx++) {
+ final double exp = v.get(idx);
+ final int idxMirror = size - 1 - idx;
+
+ assertTrue("On heap vector difference at " + desc + ", idx " + idx,
+ exp - vOnHeap.get(idxMirror) == 0);
+ assertTrue("Off heap vector difference at " + desc + ", idx " + idx,
+ exp - vOffHeap.get(idxMirror) == 0);
+ }
+
+ final double exp = vOnHeap.minus(v).getLengthSquared(); // IMPL NOTE this won't mutate vOnHeap
+ final VectorImplementationsTest.Metric metric = new VectorImplementationsTest.Metric(exp, v.getDistanceSquared(vOnHeap));
+
+ assertTrue("On heap vector not close enough at " + desc + ", " + metric,
+ metric.closeEnough());
+
+ final VectorImplementationsTest.Metric metric1 = new VectorImplementationsTest.Metric(exp, v.getDistanceSquared(vOffHeap));
+
+ assertTrue("Off heap vector not close enough at " + desc + ", " + metric1,
+ metric1.closeEnough());
+ });
+ }
+
+ /** */
+ @Test
+ public void dotTest() {
+ consumeSampleVectors((v, desc) -> {
+ new VectorImplementationsTest.ElementsChecker(v, desc); // IMPL NOTE this initialises vector
+
+ final int size = v.size();
+ final Vector v1 = new DenseLocalOnHeapVector(size);
+
+ invertValues(v, v1);
+
+ final double actual = v.dot(v1);
+
+ double exp = 0;
+
+ for (Vector.Element e : v.all())
+ exp += e.get() * v1.get(e.index());
+
+ final VectorImplementationsTest.Metric metric = new VectorImplementationsTest.Metric(exp, actual);
+
+ assertTrue("Dot product not close enough at " + desc + ", " + metric,
+ metric.closeEnough());
+ });
+ }
+
+ /** */
+ private void invertValues(Vector src, Vector dst) {
+ final int size = src.size();
+
+ for (Vector.Element e : src.all()) {
+ final int idx = size - 1 - e.index();
+ final double val = e.get();
+
+ dst.set(idx, val);
+ }
+ }
+
+ /** */
+ private void toDoubleTest(Double val, Function<double[], Double> calcRef, Function<Vector, Double> calcVec) {
+ consumeSampleVectors((v, desc) -> {
+ final int size = v.size();
+ final double[] ref = new double[size];
+
+ new VectorImplementationsTest.ElementsChecker(v, ref, desc); // IMPL NOTE this initialises vector and reference array
+
+ final double exp = calcRef.apply(ref);
+ final double obtained = calcVec.apply(v);
+ final VectorImplementationsTest.Metric metric = new VectorImplementationsTest.Metric(exp, obtained);
+
+ assertTrue("Not close enough at " + desc
+ + (val == null ? "" : ", value " + val) + ", " + metric, metric.closeEnough());
+ });
+ }
+
+ /** */
+ private void normalizeTest(double pow, BiFunction<Double, Double, Double> operation,
+ Function<Vector, Vector> vecOperation) {
+ consumeSampleVectors((v, desc) -> {
+ final int size = v.size();
+ final double[] ref = new double[size];
+ final boolean nonNegative = pow != (int)pow;
+
+ final VectorImplementationsTest.ElementsChecker checker = new VectorImplementationsTest.ElementsChecker(v, ref, desc + ", pow = " + pow, nonNegative);
+ final double norm = new Norm(ref, pow).calculate();
+
+ for (int idx = 0; idx < size; idx++)
+ ref[idx] = operation.apply(ref[idx], norm);
+
+ checker.assertCloseEnough(vecOperation.apply(v), ref);
+ });
+ }
+
+ /** */
+ private void consumeSampleVectors(BiConsumer<Vector, String> consumer) {
+ new VectorImplementationsFixtures().consumeSampleVectors(null, consumer);
+ }
+
+ /** */
+ private static class Norm {
+ /** */
+ private final double[] arr;
+
+ /** */
+ private final Double pow;
+
+ /** */
+ Norm(double[] arr, double pow) {
+ this.arr = arr;
+ this.pow = pow;
+ }
+
+ /** */
+ double calculate() {
+ if (pow.equals(0.0))
+ return countNonZeroes(); // IMPL NOTE this is beautiful if you think of it
+
+ if (pow.equals(Double.POSITIVE_INFINITY))
+ return maxAbs();
+
+ return Math.pow(sumPowers(), 1 / pow);
+ }
+
+ /** */
+ double sumPowers() {
+ if (pow.equals(0.0))
+ return countNonZeroes();
+
+ double norm = 0;
+
+ for (double val : arr)
+ norm += pow == 1 ? Math.abs(val) : Math.pow(val, pow);
+
+ return norm;
+ }
+
+ /** */
+ private int countNonZeroes() {
+ int cnt = 0;
+
+ final Double zero = 0.0;
+
+ for (double val : arr)
+ if (!zero.equals(val))
+ cnt++;
+
+ return cnt;
+ }
+
+ /** */
+ private double maxAbs() {
+ double res = 0;
+
+ for (double val : arr) {
+ final double abs = Math.abs(val);
+
+ if (abs > res)
+ res = abs;
+ }
+
+ return res;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorToMatrixTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorToMatrixTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorToMatrixTest.java
new file mode 100644
index 0000000..4d5bc56
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorToMatrixTest.java
@@ -0,0 +1,308 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.BiConsumer;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOffHeapMatrix;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
+import org.apache.ignite.ml.math.impls.matrix.RandomMatrix;
+import org.apache.ignite.ml.math.impls.matrix.SparseLocalOnHeapMatrix;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+/** Tests for methods of Vector that involve Matrix. */
+public class VectorToMatrixTest {
+ /** */
+ private static final Map<Class<? extends Vector>, Class<? extends Matrix>> typesMap = typesMap();
+
+ /** */
+ private static final List<Class<? extends Vector>> likeMatrixUnsupported = Arrays.asList(FunctionVector.class,
+ SingleElementVector.class, SingleElementVectorView.class, ConstantVector.class);
+
+ /** */
+ @Test
+ public void testHaveLikeMatrix() throws InstantiationException, IllegalAccessException {
+ for (Class<? extends Vector> key : typesMap.keySet()) {
+ Class<? extends Matrix> val = typesMap.get(key);
+
+ if (val == null && likeMatrixSupported(key))
+ System.out.println("Missing test for implementation of likeMatrix for " + key.getSimpleName());
+ }
+ }
+
+ /** */
+ @Test
+ public void testLikeMatrixUnsupported() throws Exception {
+ consumeSampleVectors((v, desc) -> {
+ if (likeMatrixSupported(v.getClass()))
+ return;
+
+ boolean expECaught = false;
+
+ try {
+ assertNull("Null view instead of exception in " + desc, v.likeMatrix(1, 1));
+ }
+ catch (UnsupportedOperationException uoe) {
+ expECaught = true;
+ }
+
+ assertTrue("Expected exception was not caught in " + desc, expECaught);
+ });
+ }
+
+ /** */
+ @Test
+ public void testLikeMatrix() {
+ consumeSampleVectors((v, desc) -> {
+ if (!availableForTesting(v))
+ return;
+
+ final Matrix matrix = v.likeMatrix(1, 1);
+
+ Class<? extends Vector> key = v.getClass();
+
+ Class<? extends Matrix> expMatrixType = typesMap.get(key);
+
+ assertNotNull("Expect non-null matrix for " + key.getSimpleName() + " in " + desc, matrix);
+
+ Class<? extends Matrix> actualMatrixType = matrix.getClass();
+
+ assertTrue("Expected matrix type " + expMatrixType.getSimpleName()
+ + " should be assignable from actual type " + actualMatrixType.getSimpleName() + " in " + desc,
+ expMatrixType.isAssignableFrom(actualMatrixType));
+
+ for (int rows : new int[] {1, 2})
+ for (int cols : new int[] {1, 2}) {
+ final Matrix actualMatrix = v.likeMatrix(rows, cols);
+
+ String details = "rows " + rows + " cols " + cols;
+
+ assertNotNull("Expect non-null matrix for " + details + " in " + desc,
+ actualMatrix);
+
+ assertEquals("Unexpected number of rows in " + desc, rows, actualMatrix.rowSize());
+
+ assertEquals("Unexpected number of cols in " + desc, cols, actualMatrix.columnSize());
+ }
+ });
+ }
+
+ /** */
+ @Test
+ public void testToMatrix() {
+ consumeSampleVectors((v, desc) -> {
+ if (!availableForTesting(v))
+ return;
+
+ fillWithNonZeroes(v);
+
+ final Matrix matrixRow = v.toMatrix(true);
+
+ final Matrix matrixCol = v.toMatrix(false);
+
+ for (Vector.Element e : v.all())
+ assertToMatrixValue(desc, matrixRow, matrixCol, e.get(), e.index());
+ });
+ }
+
+ /** */
+ @Test
+ public void testToMatrixPlusOne() {
+ consumeSampleVectors((v, desc) -> {
+ if (!availableForTesting(v))
+ return;
+
+ fillWithNonZeroes(v);
+
+ for (double zeroVal : new double[] {-1, 0, 1, 2}) {
+ final Matrix matrixRow = v.toMatrixPlusOne(true, zeroVal);
+
+ final Matrix matrixCol = v.toMatrixPlusOne(false, zeroVal);
+
+ final Metric metricRow0 = new Metric(zeroVal, matrixRow.get(0, 0));
+
+ assertTrue("Not close enough row like " + metricRow0 + " at index 0 in " + desc,
+ metricRow0.closeEnough());
+
+ final Metric metricCol0 = new Metric(zeroVal, matrixCol.get(0, 0));
+
+ assertTrue("Not close enough cols like " + metricCol0 + " at index 0 in " + desc,
+ metricCol0.closeEnough());
+
+ for (Vector.Element e : v.all())
+ assertToMatrixValue(desc, matrixRow, matrixCol, e.get(), e.index() + 1);
+ }
+ });
+ }
+
+ /** */
+ @Test
+ public void testCross() {
+ consumeSampleVectors((v, desc) -> {
+ if (!availableForTesting(v))
+ return;
+
+ fillWithNonZeroes(v);
+
+ for (int delta : new int[] {-1, 0, 1}) {
+ final int size2 = v.size() + delta;
+
+ if (size2 < 1)
+ return;
+
+ final Vector v2 = new DenseLocalOnHeapVector(size2);
+
+ for (Vector.Element e : v2.all())
+ e.set(size2 - e.index());
+
+ assertCross(v, v2, desc);
+ }
+ });
+ }
+
+ /** */
+ private void assertCross(Vector v1, Vector v2, String desc) {
+ assertNotNull(v1);
+ assertNotNull(v2);
+
+ final Matrix res = v1.cross(v2);
+
+ assertNotNull("Cross matrix is expected to be not null in " + desc, res);
+
+ assertEquals("Unexpected number of rows in cross Matrix in " + desc, v1.size(), res.rowSize());
+
+ assertEquals("Unexpected number of cols in cross Matrix in " + desc, v2.size(), res.columnSize());
+
+ for (int row = 0; row < v1.size(); row++)
+ for (int col = 0; col < v2.size(); col++) {
+ final Metric metric = new Metric(v1.get(row) * v2.get(col), res.get(row, col));
+
+ assertTrue("Not close enough cross " + metric + " at row " + row + " at col " + col
+ + " in " + desc, metric.closeEnough());
+ }
+ }
+
+ /** */
+ private void assertToMatrixValue(String desc, Matrix matrixRow, Matrix matrixCol, double exp, int idx) {
+ final Metric metricRow = new Metric(exp, matrixRow.get(0, idx));
+
+ assertTrue("Not close enough row like " + metricRow + " at index " + idx + " in " + desc,
+ metricRow.closeEnough());
+
+ final Metric metricCol = new Metric(exp, matrixCol.get(idx, 0));
+
+ assertTrue("Not close enough cols like " + matrixCol + " at index " + idx + " in " + desc,
+ metricCol.closeEnough());
+ }
+
+ /** */
+ private void fillWithNonZeroes(Vector sample) {
+ if (sample instanceof RandomVector)
+ return;
+
+ for (Vector.Element e : sample.all())
+ e.set(1 + e.index());
+ }
+
+ /** */
+ private boolean availableForTesting(Vector v) {
+ assertNotNull("Error in test: vector is null", v);
+
+ if (!likeMatrixSupported(v.getClass()))
+ return false;
+
+ final boolean availableForTesting = typesMap.get(v.getClass()) != null;
+
+ final Matrix actualLikeMatrix = v.likeMatrix(1, 1);
+
+ assertTrue("Need to enable matrix testing for vector type " + v.getClass().getSimpleName(),
+ availableForTesting || actualLikeMatrix == null);
+
+ return availableForTesting;
+ }
+
+ /** Ignore test for given vector type. */
+ private boolean likeMatrixSupported(Class<? extends Vector> clazz) {
+ for (Class<? extends Vector> ignoredClass : likeMatrixUnsupported)
+ if (ignoredClass.isAssignableFrom(clazz))
+ return false;
+
+ return true;
+ }
+
+ /** */
+ private void consumeSampleVectors(BiConsumer<Vector, String> consumer) {
+ new VectorImplementationsFixtures().consumeSampleVectors(null, consumer);
+ }
+
+ /** */
+ private static Map<Class<? extends Vector>, Class<? extends Matrix>> typesMap() {
+ return new LinkedHashMap<Class<? extends Vector>, Class<? extends Matrix>>() {{
+ put(DenseLocalOnHeapVector.class, DenseLocalOnHeapMatrix.class);
+ put(DenseLocalOffHeapVector.class, DenseLocalOffHeapMatrix.class);
+ put(RandomVector.class, RandomMatrix.class);
+ put(SparseLocalVector.class, SparseLocalOnHeapMatrix.class);
+ put(SingleElementVector.class, null); // todo find out if we need SingleElementMatrix to match, or skip it
+ put(ConstantVector.class, null);
+ put(FunctionVector.class, null);
+ put(PivotedVectorView.class, DenseLocalOnHeapMatrix.class); // IMPL NOTE per fixture
+ put(SingleElementVectorView.class, null);
+ put(MatrixVectorView.class, DenseLocalOnHeapMatrix.class); // IMPL NOTE per fixture
+ put(DelegatingVector.class, DenseLocalOnHeapMatrix.class); // IMPL NOTE per fixture
+ // IMPL NOTE check for presence of all implementations here will be done in testHaveLikeMatrix via Fixture
+ }};
+ }
+
+ /** */
+ private static class Metric { // todo consider if softer tolerance (like say 0.1 or 0.01) would make sense here
+ /** */
+ private final double exp;
+
+ /** */
+ private final double obtained;
+
+ /** **/
+ Metric(double exp, double obtained) {
+ this.exp = exp;
+ this.obtained = obtained;
+ }
+
+ /** */
+ boolean closeEnough() {
+ return new Double(exp).equals(obtained);
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return "Metric{" + "expected=" + exp +
+ ", obtained=" + obtained +
+ '}';
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorViewTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorViewTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorViewTest.java
new file mode 100644
index 0000000..ad2bc3f
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorViewTest.java
@@ -0,0 +1,162 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.function.BiConsumer;
+import java.util.stream.IntStream;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.impls.MathTestConstants;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+/**
+ * Unit tests for {@link VectorView}.
+ */
+public class VectorViewTest {
+ /** */
+ private static final int OFFSET = 10;
+
+ /** */
+ private static final int VIEW_LENGTH = 80;
+
+ /** */
+ private static final String EXTERNALIZE_TEST_FILE_NAME = "externalizeTest";
+
+ /** */
+ private VectorView testVector;
+
+ /** */
+ private DenseLocalOnHeapVector parentVector;
+
+ /** */
+ private double[] parentData;
+
+ /** */
+ @Before
+ public void setup() {
+ parentVector = new DenseLocalOnHeapVector(MathTestConstants.STORAGE_SIZE);
+
+ IntStream.range(0, MathTestConstants.STORAGE_SIZE).forEach(idx -> parentVector.set(idx, Math.random()));
+
+ parentData = parentVector.getStorage().data().clone();
+
+ testVector = new VectorView(parentVector, OFFSET, VIEW_LENGTH);
+ }
+
+ /** */
+ @AfterClass
+ public static void cleanup() throws IOException {
+ Files.deleteIfExists(Paths.get(EXTERNALIZE_TEST_FILE_NAME));
+ }
+
+ /** */
+ @Test
+ public void testCopy() throws Exception {
+ Vector cp = testVector.copy();
+
+ assertTrue(MathTestConstants.VAL_NOT_EQUALS, cp.equals(testVector));
+ }
+
+ /** */
+ @Test(expected = UnsupportedOperationException.class)
+ public void testLike() throws Exception {
+ for (int card : new int[] {1, 2, 4, 8, 16, 32, 64, 128})
+ consumeSampleVectors((v, desc) -> {
+ Vector vLike = new VectorView(v, 0, 1).like(card);
+
+ Class<? extends Vector> expType = v.getClass();
+
+ assertNotNull("Expect non-null like vector for " + expType.getSimpleName() + " in " + desc, vLike);
+
+ assertEquals("Expect size equal to cardinality at " + desc, card, vLike.size());
+
+ Class<? extends Vector> actualType = vLike.getClass();
+
+ assertTrue("Expected matrix type " + expType.getSimpleName()
+ + " should be assignable from actual type " + actualType.getSimpleName() + " in " + desc,
+ expType.isAssignableFrom(actualType));
+
+ });
+ }
+
+ /** See also {@link VectorToMatrixTest#testLikeMatrix()}. */
+ @Test
+ public void testLikeMatrix() {
+ consumeSampleVectors((v, desc) -> {
+ boolean expECaught = false;
+
+ try {
+ assertNull("Null view instead of exception in " + desc, new VectorView(v, 0, 1).likeMatrix(1, 1));
+ }
+ catch (UnsupportedOperationException uoe) {
+ expECaught = true;
+ }
+
+ assertTrue("Expected exception was not caught in " + desc, expECaught);
+ });
+ }
+
+ /** */
+ @Test
+ public void testWriteReadExternal() throws Exception {
+ assertNotNull("Unexpected null parent data", parentData);
+
+ File f = new File(EXTERNALIZE_TEST_FILE_NAME);
+
+ try {
+ ObjectOutputStream objOutputStream = new ObjectOutputStream(new FileOutputStream(f));
+
+ objOutputStream.writeObject(testVector);
+
+ objOutputStream.close();
+
+ ObjectInputStream objInputStream = new ObjectInputStream(new FileInputStream(f));
+
+ VectorView readVector = (VectorView)objInputStream.readObject();
+
+ objInputStream.close();
+
+ assertTrue(MathTestConstants.VAL_NOT_EQUALS, testVector.equals(readVector));
+ }
+ catch (ClassNotFoundException | IOException e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /** */
+ private void consumeSampleVectors(BiConsumer<Vector, String> consumer) {
+ new VectorImplementationsFixtures().consumeSampleVectors(null, consumer);
+ }
+
+}
[07/67] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math
module to Ignite ML module added missed licenses renamed packages fixed wrong
ml profile activation (cherry picked from commit d78e071)
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/RandomVectorConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/RandomVectorConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/RandomVectorConstructorTest.java
deleted file mode 100644
index 6d4e4f1..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/RandomVectorConstructorTest.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import java.util.HashMap;
-import java.util.Map;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-/** */
-public class RandomVectorConstructorTest {
- /** */
- private static final int IMPOSSIBLE_SIZE = -1;
-
- /** */
- @Test(expected = org.apache.ignite.math.exceptions.UnsupportedOperationException.class)
- public void mapInvalidArgsTest() {
- assertEquals("Expect exception due to invalid args.", IMPOSSIBLE_SIZE,
- new RandomVector(new HashMap<String, Object>() {{
- put("invalid", 99);
- }}).size());
- }
-
- /** */
- @Test(expected = UnsupportedOperationException.class)
- public void mapMissingArgsTest() {
- final Map<String, Object> test = new HashMap<String, Object>() {{
- put("paramMissing", "whatever");
- }};
-
- assertEquals("Expect exception due to missing args.",
- -1, new RandomVector(test).size());
- }
-
- /** */
- @Test(expected = ClassCastException.class)
- public void mapInvalidParamTypeTest() {
- final Map<String, Object> test = new HashMap<String, Object>() {{
- put("size", "whatever");
- put("fastHash", true);
- }};
-
- assertEquals("Expect exception due to invalid param type.", IMPOSSIBLE_SIZE,
- new RandomVector(test).size());
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void mapNullTest() {
- //noinspection ConstantConditions
- assertEquals("Null map args.", IMPOSSIBLE_SIZE,
- new RandomVector(null).size());
- }
-
- /** */
- @Test
- public void mapTest() {
- assertEquals("Size from args.", 99,
- new RandomVector(new HashMap<String, Object>() {{
- put("size", 99);
- }}).size());
-
- final int test = 99;
-
- assertEquals("Size from args with fastHash false.", test,
- new RandomVector(new HashMap<String, Object>() {{
- put("size", test);
- put("fastHash", false);
- }}).size());
-
- assertEquals("Size from args with fastHash true.", test,
- new RandomVector(new HashMap<String, Object>() {{
- put("size", test);
- put("fastHash", true);
- }}).size());
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void negativeSizeTest() {
- assertEquals("Negative size.", IMPOSSIBLE_SIZE,
- new RandomVector(-1).size());
- }
-
- /** */
- @Test
- public void basicTest() {
- final int basicSize = 3;
-
- Vector v1 = new RandomVector(basicSize);
-
- //noinspection EqualsWithItself
- assertTrue("Expect vector to be equal to self", v1.equals(v1));
-
- //noinspection ObjectEqualsNull
- assertFalse("Expect vector to be not equal to null", v1.equals(null));
-
- assertEquals("Size differs from expected", basicSize, v1.size());
-
- verifyValues(v1);
-
- Vector v2 = new RandomVector(basicSize, true);
-
- assertEquals("Size differs from expected", basicSize, v2.size());
-
- verifyValues(v2);
-
- Vector v3 = new RandomVector(basicSize, false);
-
- assertEquals("Size differs from expected", basicSize, v3.size());
-
- verifyValues(v3);
- }
-
- /** */
- private void verifyValues(Vector v) {
- for (Vector.Element e : v.all()) {
- double val = e.get();
-
- assertTrue("Value too small: " + val + " at index " + e.index(), -1d <= val);
-
- assertTrue("Value too large: " + val + " at index " + e.index(), val <= 1d);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/SingleElementVectorConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/SingleElementVectorConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/SingleElementVectorConstructorTest.java
deleted file mode 100644
index 69e22e0..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/SingleElementVectorConstructorTest.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import java.util.HashMap;
-import java.util.Map;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-/** */
-public class SingleElementVectorConstructorTest {
- /** */
- private static final int IMPOSSIBLE_SIZE = -1;
-
- /** */
- @Test(expected = UnsupportedOperationException.class)
- public void mapInvalidArgsTest() {
- assertEquals("Expect exception due to invalid args.", IMPOSSIBLE_SIZE,
- new SingleElementVector(new HashMap<String, Object>() {{
- put("invalid", 99);
- }}).size());
- }
-
- /** */
- @Test(expected = UnsupportedOperationException.class)
- public void mapMissingArgsTest() {
- final Map<String, Object> test = new HashMap<String, Object>() {{
- put("size", 1);
-
- put("paramMissing", "whatever");
- }};
-
- assertEquals("Expect exception due to missing args.",
- -1, new SingleElementVector(test).size());
- }
-
- /** */
- @Test(expected = ClassCastException.class)
- public void mapInvalidParamTypeTest() {
- final Map<String, Object> test = new HashMap<String, Object>() {{
- put("size", "whatever");
-
- put("index", 0);
- put("value", 1.0);
- }};
-
- assertEquals("Expect exception due to invalid param type.", IMPOSSIBLE_SIZE,
- new SingleElementVector(test).size());
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void mapNullTest() {
- //noinspection ConstantConditions
- assertEquals("Null map args.", IMPOSSIBLE_SIZE,
- new SingleElementVector(null).size());
- }
-
- /** */
- @Test
- public void mapTest() {
- assertEquals("Size from array in args.", 99,
- new SingleElementVector(new HashMap<String, Object>() {{
- put("size", 99);
- put("index", 0);
- put("value", 1.0);
- }}).size());
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void negativeSizeTest() {
- assertEquals("Negative size.", IMPOSSIBLE_SIZE,
- new SingleElementVector(-1, 0, 1.0).size());
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void zeroSizeTest() {
- assertEquals("Zero size.", IMPOSSIBLE_SIZE,
- new SingleElementVector(0, 0, 1.0).size());
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void wrongIndexTest() {
- //noinspection ConstantConditions
- assertEquals("Wrong index.", IMPOSSIBLE_SIZE,
- new SingleElementVector(1, 2, 1.0).size());
- }
-
- /** */
- @Test
- public void basicTest() {
- final int[] sizes = new int[] {1, 4, 8};
-
- for (int size : sizes)
- for (int idx = 0; idx < size; idx++)
- basicTest(size, idx);
- }
-
- /** */
- private void basicTest(int size, int idx) {
- final Double expVal = (double)(size - idx);
-
- Vector v = new SingleElementVector(size, idx, expVal);
-
- assertTrue("Expect value " + expVal + " at index " + idx + " for size " + size,
- expVal.equals(v.get(idx)));
-
- final double delta = 1.0;
-
- v.set(idx, expVal - delta);
-
- assertTrue("Expect value " + expVal + " at index " + idx + " for size " + size,
- expVal.equals(v.get(idx) + delta));
-
- final Double zero = 0.0;
-
- for (int i = 0; i < size; i++) {
- if (i == idx)
- continue;
-
- assertTrue("Expect zero at index " + i + " for size " + size,
- zero.equals(v.get(i)));
-
- boolean eCaught = false;
-
- try {
- v.set(i, 1.0);
- }
- catch (UnsupportedOperationException uoe) {
- eCaught = true;
- }
-
- assertTrue("Expect " + java.lang.UnsupportedOperationException.class.getSimpleName()
- + " at index " + i + " for size " + size, eCaught);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/SingleElementVectorViewConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/SingleElementVectorViewConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/SingleElementVectorViewConstructorTest.java
deleted file mode 100644
index 957f3b7..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/SingleElementVectorViewConstructorTest.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-/** */
-public class SingleElementVectorViewConstructorTest {
- /** */
- private static final int IMPOSSIBLE_SIZE = -1;
-
- /** */
- private static final SampleHelper helper = new SampleHelper();
-
- /** */
- @Test(expected = AssertionError.class)
- public void nullVecParamTest() {
- assertEquals("Expect exception due to null vector param.", IMPOSSIBLE_SIZE,
- new SingleElementVectorView(null, helper.idx).size());
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void negativeIdxParamTest() {
- assertEquals("Expect exception due to negative index param.", IMPOSSIBLE_SIZE,
- new SingleElementVectorView(helper.vec, -1).size());
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void tooLargeIdxParamTest() {
- assertEquals("Expect exception due to too large index param.", IMPOSSIBLE_SIZE,
- new SingleElementVectorView(helper.vec, helper.vec.size()).size());
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void emptyVecParamTest() {
- assertEquals("Expect exception due to empty vector param.", IMPOSSIBLE_SIZE,
- new SingleElementVectorView(helper.vecEmpty, 0).size());
- }
-
- /** */
- @Test
- public void basicTest() {
- final int[] sizes = new int[] {1, 4, 8};
-
- for (int size : sizes)
- for (int idx = 0; idx < size; idx++)
- basicTest(size, idx);
- }
-
- /** */
- private void basicTest(int size, int idx) {
- final Double expVal = (double)(size - idx);
-
- Vector orig = helper.newSample(size, idx, expVal);
-
- SingleElementVectorView svv = new SingleElementVectorView(orig, idx);
-
- assertEquals("Size differs from expected", size, svv.size());
-
- assertTrue("Expect value " + expVal + " at index " + idx + " for size " + size,
- expVal.equals(svv.get(idx)));
-
- final double delta = 1.0;
-
- svv.set(idx, expVal - delta);
-
- assertTrue("Expect value " + expVal + " at index " + idx + " for size " + size,
- expVal.equals(orig.get(idx) + delta));
-
- final Double zero = 0.0;
-
- for (int i = 0; i < size; i++) {
- if (i == idx)
- continue;
-
- assertTrue("Expect zero at index " + i + " for size " + size,
- zero.equals(svv.get(i)));
-
- boolean eCaught = false;
-
- try {
- svv.set(i, 1.0);
- }
- catch (UnsupportedOperationException uoe) {
- eCaught = true;
- }
-
- assertTrue("Expect " + UnsupportedOperationException.class.getSimpleName()
- + " at index " + i + " for size " + size, eCaught);
- }
- }
-
- /** */
- private static class SampleHelper {
- /** */
- final double[] data = new double[] {0, 1};
- /** */
- final Vector vec = new DenseLocalOnHeapVector(data);
- /** */
- final Vector vecEmpty = new DenseLocalOnHeapVector(new double[] {});
- /** */
- final int idx = 0;
-
- /** */
- Vector newSample(int size, int idx, double expVal) {
- final Vector v = new DenseLocalOnHeapVector(size);
-
- for (int i = 0; i < size; i++)
- v.set(i, i == idx ? expVal : i);
-
- return v;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/SparseLocalVectorConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/SparseLocalVectorConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/SparseLocalVectorConstructorTest.java
deleted file mode 100644
index 2be4a10..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/SparseLocalVectorConstructorTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import org.apache.ignite.math.StorageConstants;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-/** */
-public class SparseLocalVectorConstructorTest {
- /** */
- private static final int IMPOSSIBLE_SIZE = -1;
-
- /** */
- @Test(expected = AssertionError.class)
- public void negativeSizeTest() {
- assertEquals("Negative size.", IMPOSSIBLE_SIZE,
- new SparseLocalVector(-1, 1).size());
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void zeroSizeTest() {
- assertEquals("0 size.", IMPOSSIBLE_SIZE,
- new SparseLocalVector(0, 1).size());
- }
-
- /** */
- @Test
- public void primitiveTest() {
- assertEquals("1 size, random access.", 1,
- new SparseLocalVector(1, StorageConstants.RANDOM_ACCESS_MODE).size());
-
- assertEquals("1 size, sequential access.", 1,
- new SparseLocalVector(1, StorageConstants.SEQUENTIAL_ACCESS_MODE).size());
-
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorAttributesTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorAttributesTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorAttributesTest.java
deleted file mode 100644
index 992018a..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorAttributesTest.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.function.Function;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.impls.matrix.DenseLocalOffHeapMatrix;
-import org.apache.ignite.math.impls.matrix.DenseLocalOnHeapMatrix;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-/** */
-public class VectorAttributesTest {
- /** */
- private final List<AttrCfg> attrCfgs = Arrays.asList(
- new AttrCfg("isDense", Vector::isDense,
- DenseLocalOnHeapVector.class, DenseLocalOffHeapVector.class, RandomVector.class, ConstantVector.class,
- SingleElementVector.class),
- new AttrCfg("isArrayBased", Vector::isArrayBased,
- DenseLocalOnHeapVector.class),
- new AttrCfg("isSequentialAccess", Vector::isSequentialAccess,
- DenseLocalOnHeapVector.class, DenseLocalOffHeapVector.class, SparseLocalVectorSequentialAccess.class,
- RandomVector.class, ConstantVector.class, SingleElementVector.class),
- new AttrCfg("guidNotNull", v -> v.guid() == null), // IMPL NOTE this is somewhat artificial
- new AttrCfg("isRandomAccess", Vector::isRandomAccess,
- DenseLocalOnHeapVector.class, DenseLocalOffHeapVector.class, RandomVector.class, ConstantVector.class,
- SingleElementVector.class, SparseLocalVectorSequentialAccess.class, SparseLocalVectorRandomAccess.class),
- new AttrCfg("isDistributed", Vector::isDistributed));
-
- /** */
- private final List<Specification> specFixture = Arrays.asList(
- new Specification(new DenseLocalOnHeapVector(1)),
- new Specification(new DenseLocalOffHeapVector(1)),
- new Specification(new DelegatingVector(new DenseLocalOnHeapVector(1)),
- DenseLocalOnHeapVector.class, "isDense", "isArrayBased", "isSequentialAccess",
- "isRandomAccess", "isDistributed"),
- new Specification(new DelegatingVector(new DenseLocalOffHeapVector(1)),
- DenseLocalOffHeapVector.class, "isDense", "isArrayBased", "isSequentialAccess",
- "isRandomAccess", "isDistributed"),
- new Specification(new SparseLocalVectorSequentialAccess(1)),
- new Specification(new SparseLocalVectorRandomAccess(1)),
- new Specification(new RandomVector(1)),
- new Specification(new ConstantVector(1, 1.0)),
- new Specification(new FunctionVector(1, idx -> (double)idx)),
- new Specification(new SingleElementVector(1, 0, 1.0)),
- new Specification(new PivotedVectorView(new DenseLocalOnHeapVector(1), new int[] {0}),
- DenseLocalOnHeapVector.class, "isDense", "isArrayBased", "isSequentialAccess",
- "isRandomAccess", "isDistributed"),
- new Specification(new PivotedVectorView(new DenseLocalOffHeapVector(1), new int[] {0}),
- DenseLocalOffHeapVector.class, "isDense", "isArrayBased", "isSequentialAccess",
- "isRandomAccess", "isDistributed"),
- new Specification(new SingleElementVectorView(new DenseLocalOnHeapVector(1), 0),
- DenseLocalOnHeapVector.class, "isDense", "isSequentialAccess",
- "isRandomAccess", "isDistributed"),
- new Specification(new SingleElementVectorView(new DenseLocalOffHeapVector(1), 0),
- DenseLocalOffHeapVector.class, "isDense", "isSequentialAccess",
- "isRandomAccess", "isDistributed"),
- new Specification(new MatrixVectorView(new DenseLocalOnHeapMatrix(1, 1), 0, 0, 1, 1),
- DenseLocalOnHeapVector.class, "isDense",
- "isRandomAccess", "isDistributed"), // todo find out why "isSequentialAccess" fails here
- new Specification(new MatrixVectorView(new DenseLocalOffHeapMatrix(1, 1), 0, 0, 1, 1),
- DenseLocalOffHeapVector.class, "isDense",
- "isRandomAccess", "isDistributed"));
-
- /** */
- @Test
- public void isDenseTest() {
- assertAttribute("isDense");
- }
-
- /** */
- @Test
- public void isArrayBasedTest() {
- assertAttribute("isArrayBased");
- }
-
- /** */
- @Test
- public void isSequentialAccessTest() {
- assertAttribute("isSequentialAccess");
- }
-
- /** */
- @Test
- public void guidTest() {
- assertAttribute("guidNotNull");
- }
-
- /** */
- @Test
- public void isRandomAccessTest() {
- assertAttribute("isRandomAccess");
- }
-
- /** */
- @Test
- public void isDistributedTest() {
- assertAttribute("isDistributed");
- }
-
- /** */
- private void assertAttribute(String name) {
- final AttrCfg attr = attrCfg(name);
-
- for (Specification spec : specFixture)
- spec.verify(attr);
- }
-
- /** */
- private AttrCfg attrCfg(String name) {
- for (AttrCfg attr : attrCfgs)
- if (attr.name.equals(name))
- return attr;
-
- throw new IllegalArgumentException("Undefined attribute " + name);
- }
-
- /** See http://en.wikipedia.org/wiki/Specification_pattern */
- private static class Specification {
- /** */
- private final Vector v;
- /** */
- private final Class<? extends Vector> underlyingType;
- /** */
- private final List<String> attrsFromUnderlying;
- /** */
- final String desc;
-
- /** */
- Specification(Vector v, Class<? extends Vector> underlyingType, String... attrsFromUnderlying) {
- this.v = v;
- this.underlyingType = underlyingType;
- this.attrsFromUnderlying = Arrays.asList(attrsFromUnderlying);
- final Class<? extends Vector> clazz = v.getClass();
- desc = clazz.getSimpleName() + (clazz.equals(underlyingType)
- ? "" : " (underlying type " + underlyingType.getSimpleName() + ")");
- }
-
- /** */
- Specification(Vector v) {
- this(v, v.getClass());
- }
-
- /** */
- void verify(AttrCfg attr) {
- final boolean obtained = attr.obtain.apply(v);
-
- final Class<? extends Vector> typeToCheck
- = attrsFromUnderlying.contains(attr.name) ? underlyingType : v.getClass();
-
- final boolean exp = attr.trueInTypes.contains(typeToCheck);
-
- assertEquals("Unexpected " + attr.name + " value for " + desc, exp, obtained);
- }
- }
-
- /** */
- private static class AttrCfg {
- /** */
- final String name;
- /** */
- final Function<Vector, Boolean> obtain;
- /** */
- final List<Class> trueInTypes;
-
- /** */
- AttrCfg(String name, Function<Vector, Boolean> obtain, Class... trueInTypes) {
- this.name = name;
- this.obtain = obtain;
- this.trueInTypes = Arrays.asList(trueInTypes);
- }
- }
-
- /** */
- private static class SparseLocalVectorSequentialAccess extends SparseLocalVector {
- /** */
- public SparseLocalVectorSequentialAccess() {
- // No-op.
- }
-
- /** */
- SparseLocalVectorSequentialAccess(int size) {
- super(size, SEQUENTIAL_ACCESS_MODE);
- }
- }
-
- /** */
- private static class SparseLocalVectorRandomAccess extends SparseLocalVector {
- /** */
- public SparseLocalVectorRandomAccess() {
- // No-op.
- }
-
- /** */
- SparseLocalVectorRandomAccess(int size) {
- super(size, RANDOM_ACCESS_MODE);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorFoldMapTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorFoldMapTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorFoldMapTest.java
deleted file mode 100644
index 67eb8ba..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorFoldMapTest.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import java.util.Arrays;
-import java.util.function.BiConsumer;
-import java.util.function.BiFunction;
-import java.util.function.Function;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.functions.Functions;
-import org.junit.Test;
-
-import static java.util.function.DoubleUnaryOperator.identity;
-import static org.junit.Assert.assertTrue;
-
-/** See also: {@link AbstractVectorTest} and {@link VectorToMatrixTest}. */
-public class VectorFoldMapTest {
- /** */
- @Test
- public void mapVectorTest() {
- operationVectorTest((operand1, operand2) -> operand1 + operand2, (Vector v1, Vector v2) -> v1.map(v2, Functions.PLUS));
- }
-
- /** */
- @Test
- public void mapDoubleFunctionTest() {
- consumeSampleVectors((v, desc) -> operatorTest(v, desc,
- (vec) -> vec.map(Functions.INV), (val) -> 1.0 / val));
- }
-
- /** */
- @Test
- public void mapBiFunctionTest() {
- consumeSampleVectors((v, desc) -> operatorTest(v, desc,
- (vec) -> vec.map(Functions.PLUS, 1.0), (val) -> 1.0 + val));
- }
-
- /** */
- @Test
- public void foldMapTest() {
- toDoubleTest(
- ref -> Arrays.stream(ref).map(identity()).sum(),
- (v) -> v.foldMap(Functions.PLUS, Functions.IDENTITY, 0.0));
- }
-
- /** */
- @Test
- public void foldMapVectorTest() {
- toDoubleTest(
- ref -> 2.0 * Arrays.stream(ref).sum(),
- (v) -> v.foldMap(v, Functions.PLUS, Functions.PLUS, 0.0));
-
- }
-
- /** */
- private void operatorTest(Vector v, String desc, Function<Vector, Vector> op, Function<Double, Double> refOp) {
- final int size = v.size();
- final double[] ref = new double[size];
-
- VectorImplementationsTest.ElementsChecker checker = new VectorImplementationsTest.ElementsChecker(v, ref, desc);
-
- Vector actual = op.apply(v);
-
- for (int idx = 0; idx < size; idx++)
- ref[idx] = refOp.apply(ref[idx]);
-
- checker.assertCloseEnough(actual, ref);
- }
-
- /** */
- private void toDoubleTest(Function<double[], Double> calcRef, Function<Vector, Double> calcVec) {
- consumeSampleVectors((v, desc) -> {
- final int size = v.size();
- final double[] ref = new double[size];
-
- new VectorImplementationsTest.ElementsChecker(v, ref, desc); // IMPL NOTE this initialises vector and reference array
-
- final VectorImplementationsTest.Metric metric = new VectorImplementationsTest.Metric(calcRef.apply(ref), calcVec.apply(v));
-
- assertTrue("Not close enough at " + desc
- + ", " + metric, metric.closeEnough());
- });
- }
-
- /** */
- private void operationVectorTest(BiFunction<Double, Double, Double> operation,
- BiFunction<Vector, Vector, Vector> vecOperation) {
- consumeSampleVectors((v, desc) -> {
- // TODO find out if more elaborate testing scenario is needed or it's okay as is.
- final int size = v.size();
- final double[] ref = new double[size];
-
- final VectorImplementationsTest.ElementsChecker checker = new VectorImplementationsTest.ElementsChecker(v, ref, desc);
- final Vector operand = v.copy();
-
- for (int idx = 0; idx < size; idx++)
- ref[idx] = operation.apply(ref[idx], ref[idx]);
-
- checker.assertCloseEnough(vecOperation.apply(v, operand), ref);
- });
- }
-
- /** */
- private void consumeSampleVectors(BiConsumer<Vector, String> consumer) {
- new VectorImplementationsFixtures().consumeSampleVectors(null, consumer);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorImplementationsFixtures.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorImplementationsFixtures.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorImplementationsFixtures.java
deleted file mode 100644
index 5a46218..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorImplementationsFixtures.java
+++ /dev/null
@@ -1,655 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.function.BiConsumer;
-import java.util.function.BiFunction;
-import java.util.function.Consumer;
-import java.util.function.Function;
-import java.util.function.Supplier;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.StorageConstants;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.impls.matrix.DenseLocalOnHeapMatrix;
-import org.apache.ignite.math.impls.storage.vector.FunctionVectorStorage;
-import org.jetbrains.annotations.NotNull;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-/** */
-class VectorImplementationsFixtures {
- /** */
- private static final List<Supplier<Iterable<Vector>>> suppliers = Arrays.asList(
- (Supplier<Iterable<Vector>>)DenseLocalOnHeapVectorFixture::new,
- (Supplier<Iterable<Vector>>)DenseLocalOffHeapVectorFixture::new,
- (Supplier<Iterable<Vector>>)SparseLocalVectorFixture::new,
- (Supplier<Iterable<Vector>>)RandomVectorFixture::new,
- (Supplier<Iterable<Vector>>)ConstantVectorFixture::new,
- (Supplier<Iterable<Vector>>)DelegatingVectorFixture::new,
- (Supplier<Iterable<Vector>>)FunctionVectorFixture::new,
- (Supplier<Iterable<Vector>>)SingleElementVectorFixture::new,
- (Supplier<Iterable<Vector>>)PivotedVectorViewFixture::new,
- (Supplier<Iterable<Vector>>)SingleElementVectorViewFixture::new,
- (Supplier<Iterable<Vector>>)MatrixVectorViewFixture::new,
- (Supplier<Iterable<Vector>>)SparseLocalOffHeapVectorFixture::new
- );
-
- /** */
- void consumeSampleVectors(Consumer<Integer> paramsConsumer, BiConsumer<Vector, String> consumer) {
- for (Supplier<Iterable<Vector>> fixtureSupplier : VectorImplementationsFixtures.suppliers) {
- final Iterable<Vector> fixture = fixtureSupplier.get();
-
- for (Vector v : fixture) {
- if (paramsConsumer != null)
- paramsConsumer.accept(v.size());
-
- consumer.accept(v, fixture.toString());
- }
- }
- }
-
- /** */
- void selfTest() {
- new VectorSizesExtraIterator<>("VectorSizesExtraIterator test",
- (size, shallowCp) -> new DenseLocalOnHeapVector(new double[size], shallowCp),
- null, "shallow copy", new Boolean[] {false, true, null}).selfTest();
-
- new VectorSizesIterator("VectorSizesIterator test", DenseLocalOffHeapVector::new, null).selfTest();
- }
-
- /** */
- private static class DenseLocalOnHeapVectorFixture extends VectorSizesExtraFixture<Boolean> {
- /** */
- DenseLocalOnHeapVectorFixture() {
- super("DenseLocalOnHeapVector",
- (size, shallowCp) -> new DenseLocalOnHeapVector(new double[size], shallowCp),
- "shallow copy", new Boolean[] {false, true, null});
- }
- }
-
- /** */
- private static class DenseLocalOffHeapVectorFixture extends VectorSizesFixture {
- /** */
- DenseLocalOffHeapVectorFixture() {
- super("DenseLocalOffHeapVector", DenseLocalOffHeapVector::new);
- }
- }
-
- /** */
- private static class SparseLocalVectorFixture extends VectorSizesExtraFixture<Integer> {
- /** */
- SparseLocalVectorFixture() {
- super("SparseLocalVector", SparseLocalVector::new, "access mode",
- new Integer[] {StorageConstants.SEQUENTIAL_ACCESS_MODE, StorageConstants.RANDOM_ACCESS_MODE, null});
- }
- }
-
- /** */
- private static class RandomVectorFixture extends VectorSizesFixture {
- /** */
- RandomVectorFixture() {
- super("RandomVector", RandomVector::new);
- }
- }
-
- /** */
- private static class ConstantVectorFixture extends VectorSizesExtraFixture<Double> {
- /** */
- ConstantVectorFixture() {
- super("ConstantVector", ConstantVector::new,
- "value", new Double[] {-1.0, 0.0, 0.5, 1.0, 2.0, null});
- }
- }
-
- /** */
- private static class FunctionVectorFixture extends VectorSizesExtraFixture<Double> {
- /** */
- FunctionVectorFixture() {
- super("FunctionVector",
- (size, scale) -> new FunctionVectorForTest(new double[size], scale),
- "scale", new Double[] {0.5, 1.0, 2.0, null});
- }
- }
-
- /** */
- private static class SingleElementVectorFixture implements Iterable<Vector> {
- /** */
- private final Supplier<TwoParamsIterator<Integer, Double>> iter;
-
- /** */
- private final AtomicReference<String> ctxDescrHolder = new AtomicReference<>("Iterator not started.");
-
- /** */
- SingleElementVectorFixture() {
- iter = () -> new TwoParamsIterator<Integer, Double>("SingleElementVector",
- null, ctxDescrHolder::set,
- "size", new Integer[] {1, null},
- "value", new Double[] {-1.0, 0.0, 0.5, 1.0, 2.0, null}) {
-
- /** {@inheritDoc} */
- @Override BiFunction<Integer, Double, Vector> ctor() {
- return (size, value) -> new SingleElementVector(size, 0, value);
- }
- };
- }
-
- /** {@inheritDoc} */
- @NotNull
- @Override public Iterator<Vector> iterator() {
- return iter.get();//(
- }
-
- /** {@inheritDoc} */
- @Override public String toString() {
- // IMPL NOTE index within bounds is expected to be guaranteed by proper code in this class
- return ctxDescrHolder.get();
- }
- }
-
- /** */
- private static class PivotedVectorViewFixture extends VectorSizesFixture {
- /** */
- PivotedVectorViewFixture() {
- super("PivotedVectorView", PivotedVectorViewFixture::pivotedVectorView);
- }
-
- /** */
- private static PivotedVectorView pivotedVectorView(int size) {
- final DenseLocalOnHeapVector vec = new DenseLocalOnHeapVector(size);
-
- final int[] pivot = new int[size];
-
- for (int idx = 0; idx < size; idx++)
- pivot[idx] = size - 1 - idx;
-
- PivotedVectorView tmp = new PivotedVectorView(vec, pivot);
-
- final int[] unpivot = new int[size];
-
- for (int idx = 0; idx < size; idx++)
- unpivot[idx] = tmp.unpivot(idx);
-
- final int[] idxRecovery = new int[size];
-
- for (int idx = 0; idx < size; idx++)
- idxRecovery[idx] = idx;
-
- return new PivotedVectorView(new PivotedVectorView(tmp, unpivot), idxRecovery);
- }
- }
-
- /** */
- private static class SingleElementVectorViewFixture implements Iterable<Vector> {
- /** */
- private final Supplier<TwoParamsIterator<Integer, Double>> iter;
-
- /** */
- private final AtomicReference<String> ctxDescrHolder = new AtomicReference<>("Iterator not started.");
-
- /** */
- SingleElementVectorViewFixture() {
- iter = () -> new TwoParamsIterator<Integer, Double>("SingleElementVectorView",
- null, ctxDescrHolder::set,
- "size", new Integer[] {1, null},
- "value", new Double[] {-1.0, 0.0, 0.5, 1.0, 2.0, null}) {
-
- /** {@inheritDoc} */
- @Override BiFunction<Integer, Double, Vector> ctor() {
- return (size, value) -> new SingleElementVectorView(new SingleElementVector(size, 0, value), 0);
- }
- };
- }
-
- /** {@inheritDoc} */
- @NotNull
- @Override public Iterator<Vector> iterator() {
- return iter.get();
- }
-
- /** {@inheritDoc} */
- @Override public String toString() {
- // IMPL NOTE index within bounds is expected to be guaranteed by proper code in this class
- return ctxDescrHolder.get();
- }
- }
-
- /** */
- private static class MatrixVectorViewFixture extends VectorSizesExtraFixture<Integer> {
- /** */
- MatrixVectorViewFixture() {
- super("MatrixVectorView",
- MatrixVectorViewFixture::newView,
- "stride kind", new Integer[] {0, 1, 2, null});
- }
-
- /** */
- private static Vector newView(int size, int strideKind) {
- final Matrix parent = new DenseLocalOnHeapMatrix(size, size);
-
- return new MatrixVectorView(parent, 0, 0, strideKind != 1 ? 1 : 0, strideKind != 0 ? 1 : 0);
- }
- }
-
- /** */
- private static class VectorSizesExtraFixture<T> implements Iterable<Vector> {
- /** */
- private final Supplier<VectorSizesExtraIterator<T>> iter;
-
- /** */
- private final AtomicReference<String> ctxDescrHolder = new AtomicReference<>("Iterator not started.");
-
- /** */
- VectorSizesExtraFixture(String vectorKind, BiFunction<Integer, T, Vector> ctor, String extraParamName,
- T[] extras) {
- iter = () -> new VectorSizesExtraIterator<>(vectorKind, ctor, ctxDescrHolder::set, extraParamName, extras);
- }
-
- /** {@inheritDoc} */
- @NotNull
- @Override public Iterator<Vector> iterator() {
- return iter.get();
- }
-
- /** {@inheritDoc} */
- @Override public String toString() {
- // IMPL NOTE index within bounds is expected to be guaranteed by proper code in this class
- return ctxDescrHolder.get();
- }
- }
-
- /** */
- private static abstract class VectorSizesFixture implements Iterable<Vector> {
- /** */
- private final Supplier<VectorSizesIterator> iter;
-
- /** */
- private final AtomicReference<String> ctxDescrHolder = new AtomicReference<>("Iterator not started.");
-
- /** */
- VectorSizesFixture(String vectorKind, Function<Integer, Vector> ctor) {
- iter = () -> new VectorSizesIterator(vectorKind, ctor, ctxDescrHolder::set);
- }
-
- /** {@inheritDoc} */
- @NotNull
- @Override public Iterator<Vector> iterator() {
- return iter.get();
- }
-
- /** {@inheritDoc} */
- @Override public String toString() {
- // IMPL NOTE index within bounds is expected to be guaranteed by proper code in this class
- return ctxDescrHolder.get();
- }
- }
-
- /** */
- private static class VectorSizesExtraIterator<T> extends VectorSizesIterator {
- /** */
- private final T[] extras;
- /** */
- private int extraIdx = 0;
- /** */
- private final BiFunction<Integer, T, Vector> ctor;
- /** */
- private final String extraParamName;
-
- /**
- * @param vectorKind Descriptive name to use for context logging.
- * @param ctor Constructor for objects to iterate over.
- * @param ctxDescrConsumer Context logging consumer.
- * @param extraParamName Name of extra parameter to iterate over.
- * @param extras Array of extra parameter values to iterate over.
- */
- VectorSizesExtraIterator(String vectorKind, BiFunction<Integer, T, Vector> ctor,
- Consumer<String> ctxDescrConsumer, String extraParamName, T[] extras) {
- super(vectorKind, null, ctxDescrConsumer);
-
- this.ctor = ctor;
- this.extraParamName = extraParamName;
- this.extras = extras;
- }
-
- /** {@inheritDoc} */
- @Override public boolean hasNext() {
- return super.hasNext() && hasNextExtra(extraIdx);
- }
-
- /** {@inheritDoc} */
- @Override void nextIdx() {
- assert extras[extraIdx] != null
- : "Index(es) out of bound at " + VectorSizesExtraIterator.this;
-
- if (hasNextExtra(extraIdx + 1)) {
- extraIdx++;
-
- return;
- }
-
- extraIdx = 0;
-
- super.nextIdx();
- }
-
- /** {@inheritDoc} */
- @Override public String toString() {
- // IMPL NOTE index within bounds is expected to be guaranteed by proper code in this class
- return "{" + super.toString() +
- ", " + extraParamName + "=" + extras[extraIdx] +
- '}';
- }
-
- /** {@inheritDoc} */
- @Override BiFunction<Integer, Integer, Vector> ctor() {
- return (size, delta) -> ctor.apply(size + delta, extras[extraIdx]);
- }
-
- /** */
- void selfTest() {
- final Set<Integer> extraIdxs = new HashSet<>();
-
- int cnt = 0;
-
- while (hasNext()) {
- assertNotNull("Expect not null vector at " + this, next());
-
- if (extras[extraIdx] != null)
- extraIdxs.add(extraIdx);
-
- cnt++;
- }
-
- assertEquals("Extra param tested", extraIdxs.size(), extras.length - 1);
-
- assertEquals("Combinations tested mismatch.",
- 7 * 3 * (extras.length - 1), cnt);
- }
-
- /** */
- private boolean hasNextExtra(int idx) {
- return extras[idx] != null;
- }
- }
-
- /** */
- private static class VectorSizesIterator extends TwoParamsIterator<Integer, Integer> {
- /** */
- private final Function<Integer, Vector> ctor;
-
- /** */
- VectorSizesIterator(String vectorKind, Function<Integer, Vector> ctor, Consumer<String> ctxDescrConsumer) {
- super(vectorKind, null, ctxDescrConsumer,
- "size", new Integer[] {2, 4, 8, 16, 32, 64, 128, null},
- "size delta", new Integer[] {-1, 0, 1, null});
-
- this.ctor = ctor;
- }
-
- /** {@inheritDoc} */
- @Override BiFunction<Integer, Integer, Vector> ctor() {
- return (size, delta) -> ctor.apply(size + delta);
- }
- }
-
- /** */
- private static class TwoParamsIterator<T, U> implements Iterator<Vector> {
- /** */
- private final T params1[];
-
- /** */
- private final U params2[];
-
- /** */
- private final String vectorKind;
-
- /** */
- private final String param1Name;
-
- /** */
- private final String param2Name;
-
- /** */
- private final BiFunction<T, U, Vector> ctor;
-
- /** */
- private final Consumer<String> ctxDescrConsumer;
-
- /** */
- private int param1Idx = 0;
-
- /** */
- private int param2Idx = 0;
-
- /** */
- TwoParamsIterator(String vectorKind, BiFunction<T, U, Vector> ctor,
- Consumer<String> ctxDescrConsumer, String param1Name, T[] params1, String param2Name, U[] params2) {
- this.param1Name = param1Name;
- this.params1 = params1;
-
- this.param2Name = param2Name;
- this.params2 = params2;
-
- this.vectorKind = vectorKind;
-
- this.ctor = ctor;
-
- this.ctxDescrConsumer = ctxDescrConsumer;
- }
-
- /** {@inheritDoc} */
- @Override public boolean hasNext() {
- return hasNextParam1(param1Idx) && hasNextParam2(param2Idx);
- }
-
- /** {@inheritDoc} */
- @Override public Vector next() {
- if (!hasNext())
- throw new NoSuchElementException(TwoParamsIterator.this.toString());
-
- if (ctxDescrConsumer != null)
- ctxDescrConsumer.accept(toString());
-
- Vector res = ctor().apply(params1[param1Idx], params2[param2Idx]);
-
- nextIdx();
-
- return res;
- }
-
- /** */
- void selfTest() {
- final Set<Integer> sizeIdxs = new HashSet<>(), deltaIdxs = new HashSet<>();
-
- int cnt = 0;
-
- while (hasNext()) {
- assertNotNull("Expect not null vector at " + this, next());
-
- if (params1[param1Idx] != null)
- sizeIdxs.add(param1Idx);
-
- if (params2[param2Idx] != null)
- deltaIdxs.add(param2Idx);
-
- cnt++;
- }
-
- assertEquals("Sizes tested mismatch.", sizeIdxs.size(), params1.length - 1);
-
- assertEquals("Deltas tested", deltaIdxs.size(), params2.length - 1);
-
- assertEquals("Combinations tested mismatch.",
- (params1.length - 1) * (params2.length - 1), cnt);
- }
-
- /** IMPL NOTE override in subclasses if needed */
- void nextIdx() {
- assert params1[param1Idx] != null && params2[param2Idx] != null
- : "Index(es) out of bound at " + TwoParamsIterator.this;
-
- if (hasNextParam2(param2Idx + 1)) {
- param2Idx++;
-
- return;
- }
-
- param2Idx = 0;
-
- param1Idx++;
- }
-
- /** {@inheritDoc} */
- @Override public String toString() {
- // IMPL NOTE index within bounds is expected to be guaranteed by proper code in this class
- return vectorKind + "{" + param1Name + "=" + params1[param1Idx] +
- ", " + param2Name + "=" + params2[param2Idx] +
- '}';
- }
-
- /** IMPL NOTE override in subclasses if needed */
- BiFunction<T, U, Vector> ctor() {
- return ctor;
- }
-
- /** */
- private boolean hasNextParam1(int idx) {
- return params1[idx] != null;
- }
-
- /** */
- private boolean hasNextParam2(int idx) {
- return params2[idx] != null;
- }
- }
-
- /** Delegating vector with dense local onheap vector */
- private static class DelegatingVectorFixture implements Iterable<Vector> {
-
- /** */
- private final Supplier<VectorSizesExtraIterator<Boolean>> iter;
-
- /** */
- private final AtomicReference<String> ctxDescrHolder = new AtomicReference<>("Iterator not started.");
-
- /** */
- DelegatingVectorFixture() {
- iter = () -> new VectorSizesExtraIterator<>("DelegatingVector with DenseLocalOnHeapVector",
- (size, shallowCp) -> new DelegatingVector(new DenseLocalOnHeapVector(new double[size], shallowCp)),
- ctxDescrHolder::set, "shallow copy", new Boolean[] {false, true, null});
- }
-
- /** {@inheritDoc} */
- @NotNull
- @Override public Iterator<Vector> iterator() {
- return iter.get();
- }
-
- /** {@inheritDoc} */
- @Override public String toString() {
- // IMPL NOTE index within bounds is expected to be guaranteed by proper code in this class
- return ctxDescrHolder.get();
- }
- }
-
- /** Subclass tweaked for serialization */
- private static class FunctionVectorForTest extends FunctionVector {
- /** */
- double[] arr;
-
- /** */
- double scale;
-
- /** */
- public FunctionVectorForTest() {
- // No-op.
- }
-
- /** */
- FunctionVectorForTest(double[] arr, double scale) {
- super(arr.length, idx -> arr[idx] * scale, (idx, value) -> arr[idx] = value / scale);
-
- this.arr = arr;
-
- this.scale = scale;
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- super.writeExternal(out);
-
- out.writeObject(arr);
-
- out.writeDouble(scale);
- }
-
- /** {@inheritDoc} */
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- super.readExternal(in);
-
- arr = (double[])in.readObject();
-
- scale = in.readDouble();
-
- setStorage(new FunctionVectorStorage(arr.length, idx -> arr[idx] * scale, (idx, value) -> arr[idx] = value / scale));
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- int res = 1;
-
- res = res * 37 + Double.hashCode(scale);
- res = res * 37 + Integer.hashCode(getStorage().size());
-
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object o) {
- if (this == o)
- return true;
-
- if (o == null || getClass() != o.getClass())
- return false;
-
- FunctionVectorForTest that = (FunctionVectorForTest)o;
-
- return new Double(scale).equals(that.scale)
- && (arr != null ? Arrays.equals(arr, that.arr) : that.arr == null);
- }
- }
-
- /** */
- private static class SparseLocalOffHeapVectorFixture extends VectorSizesFixture {
-
- /** */
- SparseLocalOffHeapVectorFixture() {
- super("SparseLocalOffHeapVector", SparseLocalOffHeapVector::new);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorImplementationsTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorImplementationsTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorImplementationsTest.java
deleted file mode 100644
index 0e61513..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorImplementationsTest.java
+++ /dev/null
@@ -1,860 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import java.util.Arrays;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.function.BiConsumer;
-import java.util.function.BiFunction;
-import java.util.function.Consumer;
-import java.util.function.Function;
-import org.apache.ignite.IgniteException;
-import org.apache.ignite.math.ExternalizeTest;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.exceptions.CardinalityException;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-/** See also: {@link AbstractVectorTest} and {@link VectorToMatrixTest}. */
-public class VectorImplementationsTest { // todo split this to smaller cohesive test classes
- /** */
- @Test
- public void vectorImplementationsFixturesTest() {
- new VectorImplementationsFixtures().selfTest();
- }
-
- /** */
- @Test
- public void setGetTest() {
- consumeSampleVectors((v, desc) -> mutateAtIdxTest(v, desc, (vec, idx, val) -> {
- vec.set(idx, val);
-
- return val;
- }));
- }
-
- /** */
- @Test
- public void setXTest() {
- consumeSampleVectors((v, desc) -> mutateAtIdxTest(v, desc, (vec, idx, val) -> {
- vec.setX(idx, val);
-
- return val;
- }));
- }
-
- /** */
- @Test
- public void incrementTest() {
- consumeSampleVectors((v, desc) -> mutateAtIdxTest(v, desc, (vec, idx, val) -> {
- double old = vec.get(idx);
-
- vec.increment(idx, val);
-
- return old + val;
- }));
- }
-
- /** */
- @Test
- public void incrementXTest() {
- consumeSampleVectors((v, desc) -> mutateAtIdxTest(v, desc, (vec, idx, val) -> {
- double old = vec.getX(idx);
-
- vec.incrementX(idx, val);
-
- return old + val;
- }));
- }
-
- /** */
- @Test
- public void operateXOutOfBoundsTest() {
- consumeSampleVectors((v, desc) -> {
- if (v instanceof DenseLocalOffHeapVector || v instanceof SparseLocalVector || v instanceof SparseLocalOffHeapVector)
- return; // todo find out if it's OK to skip by instances here
-
- boolean expECaught = false;
-
- try {
- v.getX(-1);
- }
- catch (ArrayIndexOutOfBoundsException | IgniteException e) {
- expECaught = true;
- }
-
- if (!getXOutOfBoundsOK(v))
- assertTrue("Expect exception at negative index getX in " + desc, expECaught);
-
- expECaught = false;
-
- try {
- v.setX(-1, 0);
- }
- catch (ArrayIndexOutOfBoundsException | IgniteException e) {
- expECaught = true;
- }
-
- assertTrue("Expect exception at negative index setX in " + desc, expECaught);
-
- expECaught = false;
-
- try {
- v.incrementX(-1, 1);
- }
- catch (ArrayIndexOutOfBoundsException | IgniteException e) {
- expECaught = true;
- }
-
- assertTrue("Expect exception at negative index incrementX in " + desc, expECaught);
-
- expECaught = false;
-
- try {
- v.getX(v.size());
- }
- catch (ArrayIndexOutOfBoundsException | IgniteException e) {
- expECaught = true;
- }
-
- if (!getXOutOfBoundsOK(v))
- assertTrue("Expect exception at too large index getX in " + desc, expECaught);
-
- expECaught = false;
-
- try {
- v.setX(v.size(), 1);
- }
- catch (ArrayIndexOutOfBoundsException | IgniteException e) {
- expECaught = true;
- }
-
- assertTrue("Expect exception at too large index setX in " + desc, expECaught);
-
- expECaught = false;
-
- try {
- v.incrementX(v.size(), 1);
- }
- catch (ArrayIndexOutOfBoundsException | IgniteException e) {
- expECaught = true;
- }
-
- assertTrue("Expect exception at too large index incrementX in " + desc, expECaught);
- });
- }
-
- /** */
- @Test
- public void sizeTest() {
- final AtomicReference<Integer> expSize = new AtomicReference<>(0);
-
- consumeSampleVectors(
- expSize::set,
- (v, desc) -> assertEquals("Expected size for " + desc,
- (int)expSize.get(), v.size())
- );
- }
-
- /** */
- @Test
- public void getElementTest() {
- consumeSampleVectors((v, desc) -> new ElementsChecker(v, desc).assertCloseEnough(v));
- }
-
- /** */
- @Test
- public void copyTest() {
- consumeSampleVectors((v, desc) -> new ElementsChecker(v, desc).assertCloseEnough(v.copy()));
- }
-
- /** */
- @Test
- public void divideTest() {
- operationTest((val, operand) -> val / operand, Vector::divide);
- }
-
- /** */
- @Test
- public void likeTest() {
- for (int card : new int[] {1, 2, 4, 8, 16, 32, 64, 128})
- consumeSampleVectors((v, desc) -> {
- Class<? extends Vector> expType = expLikeType(v);
-
- if (expType == null) {
- try {
- v.like(card);
- }
- catch (UnsupportedOperationException uoe) {
- return;
- }
-
- fail("Expected exception wasn't caught for " + desc);
-
- return;
- }
-
- Vector vLike = v.like(card);
-
- assertNotNull("Expect non-null like vector for " + expType.getSimpleName() + " in " + desc, vLike);
- assertEquals("Expect size equal to cardinality at " + desc, card, vLike.size());
-
- Class<? extends Vector> actualType = vLike.getClass();
-
- assertTrue("Actual vector type " + actualType.getSimpleName()
- + " should be assignable from expected type " + expType.getSimpleName() + " in " + desc,
- actualType.isAssignableFrom(expType));
- });
- }
-
- /** */
- @Test
- public void minusTest() {
- operationVectorTest((operand1, operand2) -> operand1 - operand2, Vector::minus);
- }
-
- /** */
- @Test
- public void plusVectorTest() {
- operationVectorTest((operand1, operand2) -> operand1 + operand2, Vector::plus);
- }
-
- /** */
- @Test
- public void plusDoubleTest() {
- operationTest((val, operand) -> val + operand, Vector::plus);
- }
-
- /** */
- @Test
- public void timesVectorTest() {
- operationVectorTest((operand1, operand2) -> operand1 * operand2, Vector::times);
- }
-
- /** */
- @Test
- public void timesDoubleTest() {
- operationTest((val, operand) -> val * operand, Vector::times);
- }
-
- /** */
- @Test
- public void viewPartTest() {
- consumeSampleVectors((v, desc) -> {
- final int size = v.size();
- final double[] ref = new double[size];
- final int delta = size > 32 ? 3 : 1; // IMPL NOTE this is for faster test execution
-
- final ElementsChecker checker = new ElementsChecker(v, ref, desc);
-
- for (int off = 0; off < size; off += delta)
- for (int len = 1; len < size - off; len += delta)
- checker.assertCloseEnough(v.viewPart(off, len), Arrays.copyOfRange(ref, off, off + len));
- });
- }
-
- /** */
- @Test
- public void sumTest() {
- toDoubleTest(
- ref -> Arrays.stream(ref).sum(),
- Vector::sum);
- }
-
- /** */
- @Test
- public void minValueTest() {
- toDoubleTest(
- ref -> Arrays.stream(ref).min().getAsDouble(),
- Vector::minValue);
- }
-
- /** */
- @Test
- public void maxValueTest() {
- toDoubleTest(
- ref -> Arrays.stream(ref).max().getAsDouble(),
- Vector::maxValue);
- }
-
- /** */
- @Test
- public void sortTest() {
- consumeSampleVectors((v, desc) -> {
- if (readOnly(v) || !v.isArrayBased()) {
- boolean expECaught = false;
-
- try {
- v.sort();
- }
- catch (UnsupportedOperationException uoe) {
- expECaught = true;
- }
-
- assertTrue("Expected exception was not caught for sort in " + desc, expECaught);
-
- return;
- }
-
- final int size = v.size();
- final double[] ref = new double[size];
-
- new ElementsChecker(v, ref, desc).assertCloseEnough(v.sort(), Arrays.stream(ref).sorted().toArray());
- });
- }
-
- /** */
- @Test
- public void metaAttributesTest() {
- consumeSampleVectors((v, desc) -> {
- assertNotNull("Null meta storage in " + desc, v.getMetaStorage());
-
- final String key = "test key";
- final String val = "test value";
- final String details = "key [" + key + "] for " + desc;
-
- v.setAttribute(key, val);
- assertTrue("Expect to have meta attribute for " + details, v.hasAttribute(key));
- assertEquals("Unexpected meta attribute value for " + details, val, v.getAttribute(key));
-
- v.removeAttribute(key);
- assertFalse("Expect not to have meta attribute for " + details, v.hasAttribute(key));
- assertNull("Unexpected meta attribute value for " + details, v.getAttribute(key));
- });
- }
-
- /** */
- @Test
- public void assignDoubleTest() {
- consumeSampleVectors((v, desc) -> {
- if (readOnly(v))
- return;
-
- for (double val : new double[] {0, -1, 0, 1}) {
- v.assign(val);
-
- for (int idx = 0; idx < v.size(); idx++) {
- final Metric metric = new Metric(val, v.get(idx));
-
- assertTrue("Not close enough at index " + idx + ", val " + val + ", " + metric
- + ", " + desc, metric.closeEnough());
- }
- }
- });
- }
-
- /** */
- @Test
- public void assignDoubleArrTest() {
- consumeSampleVectors((v, desc) -> {
- if (readOnly(v))
- return;
-
- final int size = v.size();
- final double[] ref = new double[size];
-
- final ElementsChecker checker = new ElementsChecker(v, ref, desc);
-
- for (int idx = 0; idx < size; idx++)
- ref[idx] = -ref[idx];
-
- v.assign(ref);
-
- checker.assertCloseEnough(v, ref);
-
- assignDoubleArrWrongCardinality(v, desc);
- });
- }
-
- /** */
- @Test
- public void assignVectorTest() {
- consumeSampleVectors((v, desc) -> {
- if (readOnly(v))
- return;
-
- final int size = v.size();
- final double[] ref = new double[size];
-
- final ElementsChecker checker = new ElementsChecker(v, ref, desc);
-
- for (int idx = 0; idx < size; idx++)
- ref[idx] = -ref[idx];
-
- v.assign(new DenseLocalOnHeapVector(ref));
-
- checker.assertCloseEnough(v, ref);
-
- assignVectorWrongCardinality(v, desc);
- });
- }
-
- /** */
- @Test
- public void assignFunctionTest() {
- consumeSampleVectors((v, desc) -> {
- if (readOnly(v))
- return;
-
- final int size = v.size();
- final double[] ref = new double[size];
-
- final ElementsChecker checker = new ElementsChecker(v, ref, desc);
-
- for (int idx = 0; idx < size; idx++)
- ref[idx] = -ref[idx];
-
- v.assign((idx) -> ref[idx]);
-
- checker.assertCloseEnough(v, ref);
- });
- }
-
- /** */
- @Test
- public void minElementTest() {
- consumeSampleVectors((v, desc) -> {
- final ElementsChecker checker = new ElementsChecker(v, desc);
-
- final Vector.Element minE = v.minElement();
-
- final int minEIdx = minE.index();
-
- assertTrue("Unexpected index from minElement " + minEIdx + ", " + desc,
- minEIdx >= 0 && minEIdx < v.size());
-
- final Metric metric = new Metric(minE.get(), v.minValue());
-
- assertTrue("Not close enough minElement at index " + minEIdx + ", " + metric
- + ", " + desc, metric.closeEnough());
-
- checker.assertNewMinElement(v);
- });
- }
-
- /** */
- @Test
- public void maxElementTest() {
- consumeSampleVectors((v, desc) -> {
- final ElementsChecker checker = new ElementsChecker(v, desc);
-
- final Vector.Element maxE = v.maxElement();
-
- final int minEIdx = maxE.index();
-
- assertTrue("Unexpected index from minElement " + minEIdx + ", " + desc,
- minEIdx >= 0 && minEIdx < v.size());
-
- final Metric metric = new Metric(maxE.get(), v.maxValue());
-
- assertTrue("Not close enough maxElement at index " + minEIdx + ", " + metric
- + ", " + desc, metric.closeEnough());
-
- checker.assertNewMaxElement(v);
- });
- }
-
- /** */
- @Test
- public void externalizeTest() {
- (new ExternalizeTest<Vector>() {
- /** {@inheritDoc} */
- @Override public void externalizeTest() {
- consumeSampleVectors((v, desc) -> {
- if (v instanceof SparseLocalOffHeapVector)
- return; //TODO: wait till SparseLocalOffHeapVector externalization support.
-
- externalizeTest(v);
- });
- }
- }).externalizeTest();
- }
-
- /** */
- @Test
- public void hashCodeTest() {
- consumeSampleVectors((v, desc) -> assertTrue("Zero hash code for " + desc, v.hashCode() != 0));
- }
-
- /** */
- private boolean getXOutOfBoundsOK(Vector v) {
- // todo find out if this is indeed OK
- return v instanceof RandomVector || v instanceof ConstantVector
- || v instanceof SingleElementVector || v instanceof SingleElementVectorView;
- }
-
- /** */
- private void mutateAtIdxTest(Vector v, String desc, MutateAtIdx operation) {
- if (readOnly(v)) {
- if (v.size() < 1)
- return;
-
- boolean expECaught = false;
-
- try {
- operation.apply(v, 0, 1);
- }
- catch (UnsupportedOperationException uoe) {
- expECaught = true;
- }
-
- assertTrue("Expect exception at attempt to mutate element in " + desc, expECaught);
-
- return;
- }
-
- for (double val : new double[] {0, -1, 0, 1})
- for (int idx = 0; idx < v.size(); idx++) {
- double exp = operation.apply(v, idx, val);
-
- final Metric metric = new Metric(exp, v.get(idx));
-
- assertTrue("Not close enough at index " + idx + ", val " + val + ", " + metric
- + ", " + desc, metric.closeEnough());
- }
- }
-
- /** */
- private Class<? extends Vector> expLikeType(Vector v) {
- Class<? extends Vector> clazz = v.getClass();
-
- if (clazz.isAssignableFrom(PivotedVectorView.class) || clazz.isAssignableFrom(SingleElementVectorView.class))
- return null;
-
- if (clazz.isAssignableFrom(MatrixVectorView.class) || clazz.isAssignableFrom(DelegatingVector.class))
- return DenseLocalOnHeapVector.class; // IMPL NOTE per fixture
-
- return clazz;
- }
-
- /** */
- private void toDoubleTest(Function<double[], Double> calcRef, Function<Vector, Double> calcVec) {
- consumeSampleVectors((v, desc) -> {
- final int size = v.size();
- final double[] ref = new double[size];
-
- new ElementsChecker(v, ref, desc); // IMPL NOTE this initialises vector and reference array
-
- final Metric metric = new Metric(calcRef.apply(ref), calcVec.apply(v));
-
- assertTrue("Not close enough at " + desc
- + ", " + metric, metric.closeEnough());
- });
- }
-
- /** */
- private void operationVectorTest(BiFunction<Double, Double, Double> operation,
- BiFunction<Vector, Vector, Vector> vecOperation) {
- consumeSampleVectors((v, desc) -> {
- // TODO find out if more elaborate testing scenario is needed or it's okay as is.
- final int size = v.size();
- final double[] ref = new double[size];
-
- final ElementsChecker checker = new ElementsChecker(v, ref, desc);
- final Vector operand = v.copy();
-
- for (int idx = 0; idx < size; idx++)
- ref[idx] = operation.apply(ref[idx], ref[idx]);
-
- checker.assertCloseEnough(vecOperation.apply(v, operand), ref);
-
- assertWrongCardinality(v, desc, vecOperation);
- });
- }
-
- /** */
- private void assignDoubleArrWrongCardinality(Vector v, String desc) {
- boolean expECaught = false;
-
- try {
- v.assign(new double[v.size() + 1]);
- }
- catch (CardinalityException ce) {
- expECaught = true;
- }
-
- assertTrue("Expect exception at too large size in " + desc, expECaught);
-
- if (v.size() < 2)
- return;
-
- expECaught = false;
-
- try {
- v.assign(new double[v.size() - 1]);
- }
- catch (CardinalityException ce) {
- expECaught = true;
- }
-
- assertTrue("Expect exception at too small size in " + desc, expECaught);
- }
-
- /** */
- private void assignVectorWrongCardinality(Vector v, String desc) {
- boolean expECaught = false;
-
- try {
- v.assign(new DenseLocalOnHeapVector(v.size() + 1));
- }
- catch (CardinalityException ce) {
- expECaught = true;
- }
-
- assertTrue("Expect exception at too large size in " + desc, expECaught);
-
- if (v.size() < 2)
- return;
-
- expECaught = false;
-
- try {
- v.assign(new DenseLocalOnHeapVector(v.size() - 1));
- }
- catch (CardinalityException ce) {
- expECaught = true;
- }
-
- assertTrue("Expect exception at too small size in " + desc, expECaught);
- }
-
- /** */
- private void assertWrongCardinality(
- Vector v, String desc, BiFunction<Vector, Vector, Vector> vecOperation) {
- boolean expECaught = false;
-
- try {
- vecOperation.apply(v, new DenseLocalOnHeapVector(v.size() + 1));
- }
- catch (CardinalityException ce) {
- expECaught = true;
- }
-
- assertTrue("Expect exception at too large size in " + desc, expECaught);
-
- if (v.size() < 2)
- return;
-
- expECaught = false;
-
- try {
- vecOperation.apply(v, new DenseLocalOnHeapVector(v.size() - 1));
- }
- catch (CardinalityException ce) {
- expECaught = true;
- }
-
- assertTrue("Expect exception at too small size in " + desc, expECaught);
- }
-
- /** */
- private void operationTest(BiFunction<Double, Double, Double> operation,
- BiFunction<Vector, Double, Vector> vecOperation) {
- for (double val : new double[] {0, 0.1, 1, 2, 10})
- consumeSampleVectors((v, desc) -> {
- final int size = v.size();
- final double[] ref = new double[size];
-
- final ElementsChecker checker = new ElementsChecker(v, ref, "val " + val + ", " + desc);
-
- for (int idx = 0; idx < size; idx++)
- ref[idx] = operation.apply(ref[idx], val);
-
- checker.assertCloseEnough(vecOperation.apply(v, val), ref);
- });
- }
-
- /** */
- private void consumeSampleVectors(BiConsumer<Vector, String> consumer) {
- consumeSampleVectors(null, consumer);
- }
-
- /** */
- private void consumeSampleVectors(Consumer<Integer> paramsConsumer, BiConsumer<Vector, String> consumer) {
- new VectorImplementationsFixtures().consumeSampleVectors(paramsConsumer, consumer);
- }
-
- /** */
- private static boolean readOnly(Vector v) {
- return v instanceof RandomVector || v instanceof ConstantVector;
- }
-
- /** */
- private interface MutateAtIdx {
- /** */
- double apply(Vector v, int idx, double val);
- }
-
- /** */
- static class ElementsChecker {
- /** */
- private final String fixtureDesc;
-
- /** */
- private final double[] refReadOnly;
-
- /** */
- private final boolean nonNegative;
-
- /** */
- ElementsChecker(Vector v, double[] ref, String fixtureDesc, boolean nonNegative) {
- this.fixtureDesc = fixtureDesc;
-
- this.nonNegative = nonNegative;
-
- refReadOnly = readOnly(v) && ref == null ? new double[v.size()] : null;
-
- init(v, ref);
- }
-
- /** */
- ElementsChecker(Vector v, double[] ref, String fixtureDesc) {
- this(v, ref, fixtureDesc, false);
- }
-
- /** */
- ElementsChecker(Vector v, String fixtureDesc) {
- this(v, null, fixtureDesc);
- }
-
- /** */
- void assertCloseEnough(Vector obtained, double[] exp) {
- final int size = obtained.size();
-
- for (int i = 0; i < size; i++) {
- final Vector.Element e = obtained.getElement(i);
-
- if (refReadOnly != null && exp == null)
- exp = refReadOnly;
-
- final Metric metric = new Metric(exp == null ? generated(i) : exp[i], e.get());
-
- assertEquals("Unexpected vector index at " + fixtureDesc, i, e.index());
- assertTrue("Not close enough at index " + i + ", size " + size + ", " + metric
- + ", " + fixtureDesc, metric.closeEnough());
- }
- }
-
- /** */
- void assertCloseEnough(Vector obtained) {
- assertCloseEnough(obtained, null);
- }
-
- /** */
- void assertNewMinElement(Vector v) {
- if (readOnly(v))
- return;
-
- int exp = v.size() / 2;
-
- v.set(exp, -(v.size() * 2 + 1));
-
- assertEquals("Unexpected minElement index at " + fixtureDesc, exp, v.minElement().index());
- }
-
- /** */
- void assertNewMaxElement(Vector v) {
- if (readOnly(v))
- return;
-
- int exp = v.size() / 2;
-
- v.set(exp, v.size() * 2 + 1);
-
- assertEquals("Unexpected minElement index at " + fixtureDesc, exp, v.maxElement().index());
- }
-
- /** */
- private void init(Vector v, double[] ref) {
- if (readOnly(v)) {
- initReadonly(v, ref);
-
- return;
- }
-
- for (Vector.Element e : v.all()) {
- int idx = e.index();
-
- // IMPL NOTE introduce negative values because their absence
- // blocked catching an ugly bug in AbstractVector#kNorm
- int val = generated(idx);
-
- e.set(val);
-
- if (ref != null)
- ref[idx] = val;
- }
- }
-
- /** */
- private void initReadonly(Vector v, double[] ref) {
- if (refReadOnly != null)
- for (Vector.Element e : v.all())
- refReadOnly[e.index()] = e.get();
-
- if (ref != null)
- for (Vector.Element e : v.all())
- ref[e.index()] = e.get();
- }
-
- /** */
- private int generated(int idx) {
- return nonNegative || (idx & 1) == 0 ? idx : -idx;
- }
- }
-
- /** */
- static class Metric { // todo consider if softer tolerance (like say 0.1 or 0.01) would make sense here
- /** */
- private final double exp;
-
- /** */
- private final double obtained;
-
- /** **/
- Metric(double exp, double obtained) {
- this.exp = exp;
- this.obtained = obtained;
- }
-
- /** */
- boolean closeEnough() {
- return new Double(exp).equals(obtained) || closeEnoughToZero();
- }
-
- /** {@inheritDoc} */
- @Override public String toString() {
- return "Metric{" + "expected=" + exp +
- ", obtained=" + obtained +
- '}';
- }
-
- /** */
- private boolean closeEnoughToZero() {
- return (new Double(exp).equals(0.0) && new Double(obtained).equals(-0.0))
- || (new Double(exp).equals(-0.0) && new Double(obtained).equals(0.0));
- }
- }
-}
[27/67] [abbrv] ignite git commit: 2.1.0-SNAPSHOT
Posted by sb...@apache.org.
2.1.0-SNAPSHOT
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/27fd74ee
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/27fd74ee
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/27fd74ee
Branch: refs/heads/ignite-5075
Commit: 27fd74eeeef1ebd0cb89a99be69c5c74829307e3
Parents: 0da51d4
Author: Ignite Teamcity <ig...@apache.org>
Authored: Tue Apr 18 19:43:28 2017 +0300
Committer: Ignite Teamcity <ig...@apache.org>
Committed: Tue Apr 18 19:43:28 2017 +0300
----------------------------------------------------------------------
examples/pom.xml | 5 +--
modules/aop/pom.xml | 2 +-
modules/apache-license-gen/pom.xml | 2 +-
modules/aws/pom.xml | 2 +-
modules/benchmarks/pom.xml | 2 +-
modules/camel/pom.xml | 2 +-
modules/cassandra/pom.xml | 2 +-
modules/cassandra/serializers/pom.xml | 4 +-
modules/cassandra/store/pom.xml | 4 +-
modules/clients/pom.xml | 2 +-
modules/cloud/pom.xml | 2 +-
modules/codegen/pom.xml | 2 +-
modules/core/pom.xml | 2 +-
.../core/src/main/resources/ignite.properties | 2 +-
modules/extdata/p2p/pom.xml | 2 +-
.../extdata/uri/modules/uri-dependency/pom.xml | 2 +-
modules/extdata/uri/pom.xml | 2 +-
modules/flink/pom.xml | 2 +-
modules/flume/pom.xml | 2 +-
modules/gce/pom.xml | 2 +-
modules/geospatial/pom.xml | 2 +-
modules/hadoop/pom.xml | 2 +-
modules/hibernate/pom.xml | 2 +-
modules/hibernate5/pom.xml | 2 +-
modules/indexing/pom.xml | 2 +-
modules/jcl/pom.xml | 2 +-
modules/jms11/pom.xml | 2 +-
modules/jta/pom.xml | 2 +-
modules/kafka/pom.xml | 2 +-
modules/kubernetes/pom.xml | 2 +-
modules/log4j/pom.xml | 2 +-
modules/log4j2/pom.xml | 2 +-
modules/mesos/pom.xml | 2 +-
modules/ml/pom.xml | 6 +--
modules/mqtt/pom.xml | 2 +-
modules/osgi-karaf/pom.xml | 2 +-
modules/osgi-paxlogging/pom.xml | 2 +-
modules/osgi/pom.xml | 2 +-
modules/platforms/cpp/common/configure.ac | 2 +-
modules/platforms/cpp/configure.ac | 2 +-
modules/platforms/cpp/configure.acrel | 2 +-
modules/platforms/cpp/core-test/configure.ac | 2 +-
modules/platforms/cpp/core/configure.ac | 2 +-
modules/platforms/cpp/examples/configure.ac | 2 +-
modules/platforms/cpp/ignite/configure.ac | 2 +-
.../cpp/odbc/install/ignite-odbc-amd64.wxs | 2 +-
.../cpp/odbc/install/ignite-odbc-x86.wxs | 2 +-
.../Properties/AssemblyInfo.cs | 6 +--
.../Properties/AssemblyInfo.cs | 6 +--
.../Properties/AssemblyInfo.cs | 6 +--
.../Properties/AssemblyInfo.cs | 6 +--
.../Properties/AssemblyInfo.cs | 6 +--
.../Properties/AssemblyInfo.cs | 6 +--
.../Properties/AssemblyInfo.cs | 6 +--
.../Properties/AssemblyInfo.cs | 6 +--
.../Properties/AssemblyInfo.cs | 6 +--
.../Properties/AssemblyInfo.cs | 6 +--
.../Properties/AssemblyInfo.cs | 6 +--
.../Properties/AssemblyInfo.cs | 6 +--
.../Apache.Ignite/Properties/AssemblyInfo.cs | 6 +--
.../Properties/AssemblyInfo.cs | 6 +--
.../Properties/AssemblyInfo.cs | 6 +--
modules/rest-http/pom.xml | 2 +-
modules/scalar-2.10/pom.xml | 2 +-
modules/scalar/pom.xml | 2 +-
modules/schedule/pom.xml | 2 +-
modules/slf4j/pom.xml | 2 +-
modules/spark-2.10/pom.xml | 2 +-
modules/spark/pom.xml | 2 +-
modules/spring-data/pom.xml | 5 +--
modules/spring/pom.xml | 2 +-
modules/ssh/pom.xml | 2 +-
modules/storm/pom.xml | 2 +-
modules/tools/pom.xml | 2 +-
modules/twitter/pom.xml | 2 +-
modules/urideploy/pom.xml | 2 +-
modules/visor-console-2.10/pom.xml | 2 +-
modules/visor-console/pom.xml | 2 +-
modules/visor-plugins/pom.xml | 2 +-
modules/web-console/pom.xml | 2 +-
modules/web-console/web-agent/pom.xml | 2 +-
modules/web/ignite-appserver-test/pom.xml | 2 +-
modules/web/ignite-websphere-test/pom.xml | 2 +-
modules/web/pom.xml | 2 +-
modules/yardstick/pom.xml | 2 +-
modules/yarn/pom.xml | 2 +-
modules/zeromq/pom.xml | 2 +-
modules/zookeeper/pom.xml | 2 +-
pom.xml | 43 +++++++++-----------
89 files changed, 143 insertions(+), 150 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/examples/pom.xml
----------------------------------------------------------------------
diff --git a/examples/pom.xml b/examples/pom.xml
index 895519b..0a55627 100644
--- a/examples/pom.xml
+++ b/examples/pom.xml
@@ -17,8 +17,7 @@
limitations under the License.
-->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
@@ -29,7 +28,7 @@
</parent>
<artifactId>ignite-examples</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<dependencies>
<dependency>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/aop/pom.xml
----------------------------------------------------------------------
diff --git a/modules/aop/pom.xml b/modules/aop/pom.xml
index e548db2..3d56599 100644
--- a/modules/aop/pom.xml
+++ b/modules/aop/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-aop</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/apache-license-gen/pom.xml
----------------------------------------------------------------------
diff --git a/modules/apache-license-gen/pom.xml b/modules/apache-license-gen/pom.xml
index 825d55b..0edff09 100644
--- a/modules/apache-license-gen/pom.xml
+++ b/modules/apache-license-gen/pom.xml
@@ -31,7 +31,7 @@
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-apache-license-gen</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<build>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/aws/pom.xml
----------------------------------------------------------------------
diff --git a/modules/aws/pom.xml b/modules/aws/pom.xml
index a9cfcca..a23843e 100644
--- a/modules/aws/pom.xml
+++ b/modules/aws/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-aws</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/benchmarks/pom.xml
----------------------------------------------------------------------
diff --git a/modules/benchmarks/pom.xml b/modules/benchmarks/pom.xml
index caa3cd2..b33931c 100644
--- a/modules/benchmarks/pom.xml
+++ b/modules/benchmarks/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-benchmarks</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<properties>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/camel/pom.xml
----------------------------------------------------------------------
diff --git a/modules/camel/pom.xml b/modules/camel/pom.xml
index 66c7ae6..975c391 100644
--- a/modules/camel/pom.xml
+++ b/modules/camel/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-camel</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<properties>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/cassandra/pom.xml
----------------------------------------------------------------------
diff --git a/modules/cassandra/pom.xml b/modules/cassandra/pom.xml
index a4f947a..83e1ce4 100644
--- a/modules/cassandra/pom.xml
+++ b/modules/cassandra/pom.xml
@@ -32,7 +32,7 @@
<artifactId>ignite-cassandra</artifactId>
<packaging>pom</packaging>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencyManagement>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/cassandra/serializers/pom.xml
----------------------------------------------------------------------
diff --git a/modules/cassandra/serializers/pom.xml b/modules/cassandra/serializers/pom.xml
index 4278eef..3ef1e53 100644
--- a/modules/cassandra/serializers/pom.xml
+++ b/modules/cassandra/serializers/pom.xml
@@ -26,12 +26,12 @@
<parent>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-cassandra</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<relativePath>..</relativePath>
</parent>
<artifactId>ignite-cassandra-serializers</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<properties>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/cassandra/store/pom.xml
----------------------------------------------------------------------
diff --git a/modules/cassandra/store/pom.xml b/modules/cassandra/store/pom.xml
index eaf012a..16df518 100644
--- a/modules/cassandra/store/pom.xml
+++ b/modules/cassandra/store/pom.xml
@@ -26,12 +26,12 @@
<parent>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-cassandra</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<relativePath>..</relativePath>
</parent>
<artifactId>ignite-cassandra-store</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<properties>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/clients/pom.xml
----------------------------------------------------------------------
diff --git a/modules/clients/pom.xml b/modules/clients/pom.xml
index 195204c..edd20ee 100644
--- a/modules/clients/pom.xml
+++ b/modules/clients/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-clients</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/cloud/pom.xml
----------------------------------------------------------------------
diff --git a/modules/cloud/pom.xml b/modules/cloud/pom.xml
index 8d806f4..6fd1248 100644
--- a/modules/cloud/pom.xml
+++ b/modules/cloud/pom.xml
@@ -29,7 +29,7 @@
</parent>
<artifactId>ignite-cloud</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<properties>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/codegen/pom.xml
----------------------------------------------------------------------
diff --git a/modules/codegen/pom.xml b/modules/codegen/pom.xml
index 3cc30cd..b6400fa 100644
--- a/modules/codegen/pom.xml
+++ b/modules/codegen/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-codegen</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<properties>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/core/pom.xml
----------------------------------------------------------------------
diff --git a/modules/core/pom.xml b/modules/core/pom.xml
index cb44418..6c714d0f 100644
--- a/modules/core/pom.xml
+++ b/modules/core/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-core</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<repositories>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/core/src/main/resources/ignite.properties
----------------------------------------------------------------------
diff --git a/modules/core/src/main/resources/ignite.properties b/modules/core/src/main/resources/ignite.properties
index b599e11..9e150b9 100644
--- a/modules/core/src/main/resources/ignite.properties
+++ b/modules/core/src/main/resources/ignite.properties
@@ -15,7 +15,7 @@
# limitations under the License.
#
-ignite.version=2.0.0-SNAPSHOT
+ignite.version=2.1.0-SNAPSHOT
ignite.build=0
ignite.revision=DEV
ignite.rel.date=01011970
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/extdata/p2p/pom.xml
----------------------------------------------------------------------
diff --git a/modules/extdata/p2p/pom.xml b/modules/extdata/p2p/pom.xml
index 4863fdd..89c6840 100644
--- a/modules/extdata/p2p/pom.xml
+++ b/modules/extdata/p2p/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-extdata-p2p</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<dependencies>
<dependency>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/extdata/uri/modules/uri-dependency/pom.xml
----------------------------------------------------------------------
diff --git a/modules/extdata/uri/modules/uri-dependency/pom.xml b/modules/extdata/uri/modules/uri-dependency/pom.xml
index 9c6f687..a940ccb 100644
--- a/modules/extdata/uri/modules/uri-dependency/pom.xml
+++ b/modules/extdata/uri/modules/uri-dependency/pom.xml
@@ -27,7 +27,7 @@
<artifactId>ignite-extdata-uri-dep</artifactId>
<packaging>jar</packaging>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<modelVersion>4.0.0</modelVersion>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/extdata/uri/pom.xml
----------------------------------------------------------------------
diff --git a/modules/extdata/uri/pom.xml b/modules/extdata/uri/pom.xml
index be4f036..09d7826 100644
--- a/modules/extdata/uri/pom.xml
+++ b/modules/extdata/uri/pom.xml
@@ -32,7 +32,7 @@
</parent>
<artifactId>ignite-extdata-uri</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<dependencies>
<dependency>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/flink/pom.xml
----------------------------------------------------------------------
diff --git a/modules/flink/pom.xml b/modules/flink/pom.xml
index e0603e1..44c79e5 100644
--- a/modules/flink/pom.xml
+++ b/modules/flink/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-flink</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<properties>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/flume/pom.xml
----------------------------------------------------------------------
diff --git a/modules/flume/pom.xml b/modules/flume/pom.xml
index d35c452..2e2fcbd 100644
--- a/modules/flume/pom.xml
+++ b/modules/flume/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-flume</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/gce/pom.xml
----------------------------------------------------------------------
diff --git a/modules/gce/pom.xml b/modules/gce/pom.xml
index 89f9a8b..34c6ea3 100644
--- a/modules/gce/pom.xml
+++ b/modules/gce/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-gce</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/geospatial/pom.xml
----------------------------------------------------------------------
diff --git a/modules/geospatial/pom.xml b/modules/geospatial/pom.xml
index 6ad6d27..c715ffa 100644
--- a/modules/geospatial/pom.xml
+++ b/modules/geospatial/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-geospatial</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/hadoop/pom.xml
----------------------------------------------------------------------
diff --git a/modules/hadoop/pom.xml b/modules/hadoop/pom.xml
index 5432052..e7f71ec 100644
--- a/modules/hadoop/pom.xml
+++ b/modules/hadoop/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-hadoop</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/hibernate/pom.xml
----------------------------------------------------------------------
diff --git a/modules/hibernate/pom.xml b/modules/hibernate/pom.xml
index 75dacb1..390b290 100644
--- a/modules/hibernate/pom.xml
+++ b/modules/hibernate/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-hibernate</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/hibernate5/pom.xml
----------------------------------------------------------------------
diff --git a/modules/hibernate5/pom.xml b/modules/hibernate5/pom.xml
index 13a0c40..a20b410 100644
--- a/modules/hibernate5/pom.xml
+++ b/modules/hibernate5/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-hibernate5</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/indexing/pom.xml
----------------------------------------------------------------------
diff --git a/modules/indexing/pom.xml b/modules/indexing/pom.xml
index 363974e..2a4cfd3 100644
--- a/modules/indexing/pom.xml
+++ b/modules/indexing/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-indexing</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/jcl/pom.xml
----------------------------------------------------------------------
diff --git a/modules/jcl/pom.xml b/modules/jcl/pom.xml
index 27d2e7f..ce68c7f 100644
--- a/modules/jcl/pom.xml
+++ b/modules/jcl/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-jcl</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/jms11/pom.xml
----------------------------------------------------------------------
diff --git a/modules/jms11/pom.xml b/modules/jms11/pom.xml
index 9032a93..a226043 100644
--- a/modules/jms11/pom.xml
+++ b/modules/jms11/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-jms11</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/jta/pom.xml
----------------------------------------------------------------------
diff --git a/modules/jta/pom.xml b/modules/jta/pom.xml
index ae75f8a..254e146 100644
--- a/modules/jta/pom.xml
+++ b/modules/jta/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-jta</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/kafka/pom.xml
----------------------------------------------------------------------
diff --git a/modules/kafka/pom.xml b/modules/kafka/pom.xml
index 6f65fec..1affd57 100644
--- a/modules/kafka/pom.xml
+++ b/modules/kafka/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-kafka</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/kubernetes/pom.xml
----------------------------------------------------------------------
diff --git a/modules/kubernetes/pom.xml b/modules/kubernetes/pom.xml
index 5d4e5f0..88884d2 100644
--- a/modules/kubernetes/pom.xml
+++ b/modules/kubernetes/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-kubernetes</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/log4j/pom.xml
----------------------------------------------------------------------
diff --git a/modules/log4j/pom.xml b/modules/log4j/pom.xml
index 0dd1db6..5a41708 100644
--- a/modules/log4j/pom.xml
+++ b/modules/log4j/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-log4j</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/log4j2/pom.xml
----------------------------------------------------------------------
diff --git a/modules/log4j2/pom.xml b/modules/log4j2/pom.xml
index 5c6e7c4..9ae74aa 100644
--- a/modules/log4j2/pom.xml
+++ b/modules/log4j2/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-log4j2</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/mesos/pom.xml
----------------------------------------------------------------------
diff --git a/modules/mesos/pom.xml b/modules/mesos/pom.xml
index bd59fbd..2723334 100644
--- a/modules/mesos/pom.xml
+++ b/modules/mesos/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-mesos</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<properties>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/ml/pom.xml
----------------------------------------------------------------------
diff --git a/modules/ml/pom.xml b/modules/ml/pom.xml
index e6f5acb..1df5bb6 100644
--- a/modules/ml/pom.xml
+++ b/modules/ml/pom.xml
@@ -19,9 +19,7 @@
<!--
POM file.
-->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
@@ -32,7 +30,7 @@
</parent>
<artifactId>ignite-ml</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<properties>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/mqtt/pom.xml
----------------------------------------------------------------------
diff --git a/modules/mqtt/pom.xml b/modules/mqtt/pom.xml
index daa196e..80fc720 100644
--- a/modules/mqtt/pom.xml
+++ b/modules/mqtt/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-mqtt</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/osgi-karaf/pom.xml
----------------------------------------------------------------------
diff --git a/modules/osgi-karaf/pom.xml b/modules/osgi-karaf/pom.xml
index 97a9048..80b9fe9 100644
--- a/modules/osgi-karaf/pom.xml
+++ b/modules/osgi-karaf/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-osgi-karaf</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<build>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/osgi-paxlogging/pom.xml
----------------------------------------------------------------------
diff --git a/modules/osgi-paxlogging/pom.xml b/modules/osgi-paxlogging/pom.xml
index 6e764a5..4852ed7 100644
--- a/modules/osgi-paxlogging/pom.xml
+++ b/modules/osgi-paxlogging/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-osgi-paxlogging</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/osgi/pom.xml
----------------------------------------------------------------------
diff --git a/modules/osgi/pom.xml b/modules/osgi/pom.xml
index b7fd589..74a2c3d 100644
--- a/modules/osgi/pom.xml
+++ b/modules/osgi/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-osgi</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/platforms/cpp/common/configure.ac
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/common/configure.ac b/modules/platforms/cpp/common/configure.ac
index cfe098c..ab78388 100644
--- a/modules/platforms/cpp/common/configure.ac
+++ b/modules/platforms/cpp/common/configure.ac
@@ -19,7 +19,7 @@
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
-AC_INIT([Apache Ignite JNI bridge for C++], [1.6.1.9108], [dev@ignite.apache.org], [ignite-common], [ignite.apache.org])
+AC_INIT([Apache Ignite JNI bridge for C++], [2.1.0.19388], [dev@ignite.apache.org], [ignite-common], [ignite.apache.org])
AC_CONFIG_SRCDIR(src)
AC_CANONICAL_SYSTEM
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/platforms/cpp/configure.ac
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/configure.ac b/modules/platforms/cpp/configure.ac
index 3c98225..9dd52d7 100644
--- a/modules/platforms/cpp/configure.ac
+++ b/modules/platforms/cpp/configure.ac
@@ -19,7 +19,7 @@
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
-AC_INIT([Apache Ignite C++], [2.0.0.16694], [dev@ignite.apache.org], [ignite], [ignite.apache.org])
+AC_INIT([Apache Ignite C++], [2.1.0.19388], [dev@ignite.apache.org], [ignite], [ignite.apache.org])
AC_CANONICAL_HOST
AC_CONFIG_MACRO_DIR([m4])
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/platforms/cpp/configure.acrel
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/configure.acrel b/modules/platforms/cpp/configure.acrel
index f73b57c..5f8c4ed 100644
--- a/modules/platforms/cpp/configure.acrel
+++ b/modules/platforms/cpp/configure.acrel
@@ -19,7 +19,7 @@
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
-AC_INIT([Apache Ignite C++], [2.0.0.16694], [dev@ignite.apache.org], [ignite], [ignite.apache.org])
+AC_INIT([Apache Ignite C++], [2.1.0.19388], [dev@ignite.apache.org], [ignite], [ignite.apache.org])
AC_CANONICAL_HOST
AC_CONFIG_MACRO_DIR([m4])
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/platforms/cpp/core-test/configure.ac
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/configure.ac b/modules/platforms/cpp/core-test/configure.ac
index b23c0d1..c718055 100644
--- a/modules/platforms/cpp/core-test/configure.ac
+++ b/modules/platforms/cpp/core-test/configure.ac
@@ -19,7 +19,7 @@
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
-AC_INIT([Apache Ignite C++ Test], [1.6.1.9108], [dev@ignite.apache.org], [ignite], [ignite.apache.org])
+AC_INIT([Apache Ignite C++ Test], [2.1.0.19388], [dev@ignite.apache.org], [ignite], [ignite.apache.org])
AC_CONFIG_SRCDIR(src)
AC_CANONICAL_SYSTEM
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/platforms/cpp/core/configure.ac
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core/configure.ac b/modules/platforms/cpp/core/configure.ac
index 5e15deb..5f1881c 100644
--- a/modules/platforms/cpp/core/configure.ac
+++ b/modules/platforms/cpp/core/configure.ac
@@ -19,7 +19,7 @@
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
-AC_INIT([Apache Ignite C++], [1.6.1.9108], [dev@ignite.apache.org], [ignite], [ignite.apache.org])
+AC_INIT([Apache Ignite C++], [2.1.0.19388], [dev@ignite.apache.org], [ignite], [ignite.apache.org])
AC_CONFIG_SRCDIR(src)
AC_CANONICAL_SYSTEM
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/platforms/cpp/examples/configure.ac
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/examples/configure.ac b/modules/platforms/cpp/examples/configure.ac
index e15d186..3350d40 100644
--- a/modules/platforms/cpp/examples/configure.ac
+++ b/modules/platforms/cpp/examples/configure.ac
@@ -19,7 +19,7 @@
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
-AC_INIT([Apache Ignite C++ Examples], [2.0.0.16694], [dev@ignite.apache.org], [ignite-examples], [ignite.apache.org])
+AC_INIT([Apache Ignite C++ Examples], [2.1.0.19388], [dev@ignite.apache.org], [ignite-examples], [ignite.apache.org])
AC_CANONICAL_HOST
AC_CONFIG_MACRO_DIR([m4])
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/platforms/cpp/ignite/configure.ac
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/ignite/configure.ac b/modules/platforms/cpp/ignite/configure.ac
index f71261e..69b76e0 100644
--- a/modules/platforms/cpp/ignite/configure.ac
+++ b/modules/platforms/cpp/ignite/configure.ac
@@ -19,7 +19,7 @@
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
-AC_INIT([Apache Ignite C++ Runner], [1.6.1.9108], [dev@ignite.apache.org], [ignite], [ignite.apache.org])
+AC_INIT([Apache Ignite C++ Runner], [2.1.0.19388], [dev@ignite.apache.org], [ignite], [ignite.apache.org])
AC_CONFIG_SRCDIR(src)
AC_CANONICAL_SYSTEM
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/platforms/cpp/odbc/install/ignite-odbc-amd64.wxs
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/odbc/install/ignite-odbc-amd64.wxs b/modules/platforms/cpp/odbc/install/ignite-odbc-amd64.wxs
index eadbe88..186465c 100644
--- a/modules/platforms/cpp/odbc/install/ignite-odbc-amd64.wxs
+++ b/modules/platforms/cpp/odbc/install/ignite-odbc-amd64.wxs
@@ -21,7 +21,7 @@
<Product Name='Apache Ignite ODBC 64-bit Driver' Manufacturer='The Apache Software Foundation'
Id='F3E308E4-910C-4AF5-82DE-2ACF4D64830E'
UpgradeCode='1D7AEFDF-6CD2-4FB5-88F2-811A89832D6D'
- Language='1033' Codepage='1252' Version='2.0.0.16694'>
+ Language='1033' Codepage='1252' Version='2.1.0.19388'>
<Package Id='*' Keywords='Installer' Description="Apache Ignite ODBC 64-bit Driver Installer"
Comments='Apache, Apache Ignite, the Apache feather and the Apache Ignite logo are trademarks of The Apache Software Foundation.'
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/platforms/cpp/odbc/install/ignite-odbc-x86.wxs
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/odbc/install/ignite-odbc-x86.wxs b/modules/platforms/cpp/odbc/install/ignite-odbc-x86.wxs
index b50b5a3..28a405e 100644
--- a/modules/platforms/cpp/odbc/install/ignite-odbc-x86.wxs
+++ b/modules/platforms/cpp/odbc/install/ignite-odbc-x86.wxs
@@ -21,7 +21,7 @@
<Product Name='Apache Ignite ODBC 32-bit Driver' Manufacturer='The Apache Software Foundation'
Id='D39CBABA-1E21-4701-AA5C-91EDA07B383B'
UpgradeCode='743902A4-365C-424E-B226-5B2898A3941E'
- Language='1033' Codepage='1252' Version='2.0.0.16694'>
+ Language='1033' Codepage='1252' Version='2.1.0.19388'>
<Package Id='*' Keywords='Installer' Description="Apache Ignite ODBC 32-bit Driver Installer"
Comments='Apache, Apache Ignite, the Apache feather and the Apache Ignite logo are trademarks of The Apache Software Foundation.'
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/platforms/dotnet/Apache.Ignite.AspNet.Tests/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.AspNet.Tests/Properties/AssemblyInfo.cs b/modules/platforms/dotnet/Apache.Ignite.AspNet.Tests/Properties/AssemblyInfo.cs
index 6981500..fb582d6 100644
--- a/modules/platforms/dotnet/Apache.Ignite.AspNet.Tests/Properties/AssemblyInfo.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.AspNet.Tests/Properties/AssemblyInfo.cs
@@ -35,8 +35,8 @@ using System.Runtime.InteropServices;
[assembly: Guid("18ea4c71-a11d-4ab1-8042-418f7559d84f")]
-[assembly: AssemblyVersion("2.0.0.16694")]
-[assembly: AssemblyFileVersion("2.0.0.16694")]
-[assembly: AssemblyInformationalVersion("2.0.0")]
+[assembly: AssemblyVersion("2.1.0.19388")]
+[assembly: AssemblyFileVersion("2.1.0.19388")]
+[assembly: AssemblyInformationalVersion("2.1.0")]
[assembly: CLSCompliant(true)]
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/platforms/dotnet/Apache.Ignite.AspNet/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.AspNet/Properties/AssemblyInfo.cs b/modules/platforms/dotnet/Apache.Ignite.AspNet/Properties/AssemblyInfo.cs
index 1073986..3629b9c 100644
--- a/modules/platforms/dotnet/Apache.Ignite.AspNet/Properties/AssemblyInfo.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.AspNet/Properties/AssemblyInfo.cs
@@ -33,9 +33,9 @@ using System.Runtime.InteropServices;
[assembly: Guid("13ea96fc-cc83-4164-a7c0-4f30ed797460")]
-[assembly: AssemblyVersion("2.0.0.16694")]
-[assembly: AssemblyFileVersion("2.0.0.16694")]
-[assembly: AssemblyInformationalVersion("2.0.0")]
+[assembly: AssemblyVersion("2.1.0.19388")]
+[assembly: AssemblyFileVersion("2.1.0.19388")]
+[assembly: AssemblyInformationalVersion("2.1.0")]
[assembly: CLSCompliant(true)]
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/platforms/dotnet/Apache.Ignite.Benchmarks/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Benchmarks/Properties/AssemblyInfo.cs b/modules/platforms/dotnet/Apache.Ignite.Benchmarks/Properties/AssemblyInfo.cs
index ce82281..cc25f0b 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Benchmarks/Properties/AssemblyInfo.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Benchmarks/Properties/AssemblyInfo.cs
@@ -31,6 +31,6 @@ using System.Runtime.InteropServices;
[assembly: Guid("8fae8395-7e91-411a-a78f-44d6d3fed0fc")]
-[assembly: AssemblyVersion("2.0.0.16694")]
-[assembly: AssemblyFileVersion("2.0.0.16694")]
-[assembly: AssemblyInformationalVersion("2.0.0")]
\ No newline at end of file
+[assembly: AssemblyVersion("2.1.0.19388")]
+[assembly: AssemblyFileVersion("2.1.0.19388")]
+[assembly: AssemblyInformationalVersion("2.1.0")]
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/platforms/dotnet/Apache.Ignite.Core.Tests.NuGet/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.NuGet/Properties/AssemblyInfo.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests.NuGet/Properties/AssemblyInfo.cs
index d6b1699..0980324 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.NuGet/Properties/AssemblyInfo.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests.NuGet/Properties/AssemblyInfo.cs
@@ -30,6 +30,6 @@ using System.Runtime.InteropServices;
[assembly: ComVisible(false)]
[assembly: Guid("134707f6-155d-47f6-9eb2-c67abbf3c009")]
-[assembly: AssemblyVersion("2.0.0.16694")]
-[assembly: AssemblyFileVersion("2.0.0.16694")]
-[assembly: AssemblyInformationalVersion("2.0.0")]
\ No newline at end of file
+[assembly: AssemblyVersion("2.1.0.19388")]
+[assembly: AssemblyFileVersion("2.1.0.19388")]
+[assembly: AssemblyInformationalVersion("2.1.0")]
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/platforms/dotnet/Apache.Ignite.Core.Tests.TestDll/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.TestDll/Properties/AssemblyInfo.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests.TestDll/Properties/AssemblyInfo.cs
index e9f93bd..e21044d 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests.TestDll/Properties/AssemblyInfo.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests.TestDll/Properties/AssemblyInfo.cs
@@ -45,6 +45,6 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("2.0.0.16694")]
-[assembly: AssemblyFileVersion("2.0.0.16694")]
-[assembly: AssemblyInformationalVersion("2.0.0")]
+[assembly: AssemblyVersion("2.1.0.19388")]
+[assembly: AssemblyFileVersion("2.1.0.19388")]
+[assembly: AssemblyInformationalVersion("2.1.0")]
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Properties/AssemblyInfo.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Properties/AssemblyInfo.cs
index 28f6e72..c65084d 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Properties/AssemblyInfo.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Properties/AssemblyInfo.cs
@@ -31,6 +31,6 @@ using System.Runtime.InteropServices;
[assembly: Guid("de8dd5cc-7c7f-4a09-80d5-7086d9416a7b")]
-[assembly: AssemblyVersion("2.0.0.16694")]
-[assembly: AssemblyFileVersion("2.0.0.16694")]
-[assembly: AssemblyInformationalVersion("2.0.0")]
\ No newline at end of file
+[assembly: AssemblyVersion("2.1.0.19388")]
+[assembly: AssemblyFileVersion("2.1.0.19388")]
+[assembly: AssemblyInformationalVersion("2.1.0")]
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/platforms/dotnet/Apache.Ignite.Core/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Properties/AssemblyInfo.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Properties/AssemblyInfo.cs
index cb903aa..fb07d1d 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Properties/AssemblyInfo.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Properties/AssemblyInfo.cs
@@ -33,9 +33,9 @@ using System.Runtime.InteropServices;
[assembly: Guid("97db45a8-f922-456a-a819-7b3c6e5e03ba")]
-[assembly: AssemblyVersion("2.0.0.16694")]
-[assembly: AssemblyFileVersion("2.0.0.16694")]
-[assembly: AssemblyInformationalVersion("2.0.0")]
+[assembly: AssemblyVersion("2.1.0.19388")]
+[assembly: AssemblyFileVersion("2.1.0.19388")]
+[assembly: AssemblyInformationalVersion("2.1.0")]
[assembly: CLSCompliant(true)]
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/platforms/dotnet/Apache.Ignite.EntityFramework.Tests/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.EntityFramework.Tests/Properties/AssemblyInfo.cs b/modules/platforms/dotnet/Apache.Ignite.EntityFramework.Tests/Properties/AssemblyInfo.cs
index 8aeec58..efa6c22 100644
--- a/modules/platforms/dotnet/Apache.Ignite.EntityFramework.Tests/Properties/AssemblyInfo.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.EntityFramework.Tests/Properties/AssemblyInfo.cs
@@ -32,8 +32,8 @@ using System.Runtime.InteropServices;
[assembly: Guid("cda5700e-78f3-4a9e-a9b0-704cbe94651c")]
-[assembly: AssemblyVersion("2.0.0.16694")]
-[assembly: AssemblyFileVersion("2.0.0.16694")]
-[assembly: AssemblyInformationalVersion("2.0.0")]
+[assembly: AssemblyVersion("2.1.0.19388")]
+[assembly: AssemblyFileVersion("2.1.0.19388")]
+[assembly: AssemblyInformationalVersion("2.1.0")]
[assembly: CLSCompliant(true)]
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/platforms/dotnet/Apache.Ignite.EntityFramework/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.EntityFramework/Properties/AssemblyInfo.cs b/modules/platforms/dotnet/Apache.Ignite.EntityFramework/Properties/AssemblyInfo.cs
index 4d25f53..4df418b 100644
--- a/modules/platforms/dotnet/Apache.Ignite.EntityFramework/Properties/AssemblyInfo.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.EntityFramework/Properties/AssemblyInfo.cs
@@ -32,9 +32,9 @@ using System.Runtime.InteropServices;
[assembly: ComVisible(false)]
[assembly: Guid("c558518a-c1a0-4224-aaa9-a8688474b4dc")]
-[assembly: AssemblyVersion("2.0.0.16694")]
-[assembly: AssemblyFileVersion("2.0.0.16694")]
-[assembly: AssemblyInformationalVersion("2.0.0")]
+[assembly: AssemblyVersion("2.1.0.19388")]
+[assembly: AssemblyFileVersion("2.1.0.19388")]
+[assembly: AssemblyInformationalVersion("2.1.0")]
[assembly: CLSCompliant(true)]
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/platforms/dotnet/Apache.Ignite.Linq/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Linq/Properties/AssemblyInfo.cs b/modules/platforms/dotnet/Apache.Ignite.Linq/Properties/AssemblyInfo.cs
index 561674a..e1b5402 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Linq/Properties/AssemblyInfo.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Linq/Properties/AssemblyInfo.cs
@@ -33,8 +33,8 @@ using System.Runtime.InteropServices;
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("5b571661-17f4-4f29-8c7d-0edb38ca9b55")]
-[assembly: AssemblyVersion("2.0.0.16694")]
-[assembly: AssemblyFileVersion("2.0.0.16694")]
-[assembly: AssemblyInformationalVersion("2.0.0")]
+[assembly: AssemblyVersion("2.1.0.19388")]
+[assembly: AssemblyFileVersion("2.1.0.19388")]
+[assembly: AssemblyInformationalVersion("2.1.0")]
[assembly: CLSCompliant(true)]
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/platforms/dotnet/Apache.Ignite.Log4Net/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Log4Net/Properties/AssemblyInfo.cs b/modules/platforms/dotnet/Apache.Ignite.Log4Net/Properties/AssemblyInfo.cs
index 09e5749..e2ab220 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Log4Net/Properties/AssemblyInfo.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Log4Net/Properties/AssemblyInfo.cs
@@ -33,8 +33,8 @@ using System.Runtime.InteropServices;
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("6f82d669-382e-4435-8092-68c4440146d8")]
-[assembly: AssemblyVersion("2.0.0.16694")]
-[assembly: AssemblyFileVersion("2.0.0.16694")]
-[assembly: AssemblyInformationalVersion("2.0.0")]
+[assembly: AssemblyVersion("2.1.0.19388")]
+[assembly: AssemblyFileVersion("2.1.0.19388")]
+[assembly: AssemblyInformationalVersion("2.1.0")]
[assembly: CLSCompliant(true)]
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/platforms/dotnet/Apache.Ignite.NLog/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.NLog/Properties/AssemblyInfo.cs b/modules/platforms/dotnet/Apache.Ignite.NLog/Properties/AssemblyInfo.cs
index 3f2aa71..747f440 100644
--- a/modules/platforms/dotnet/Apache.Ignite.NLog/Properties/AssemblyInfo.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.NLog/Properties/AssemblyInfo.cs
@@ -33,8 +33,8 @@ using System.Runtime.InteropServices;
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("c6b58e4a-a2e9-4554-ad02-68ce6da5cfb7")]
-[assembly: AssemblyVersion("2.0.0.16694")]
-[assembly: AssemblyFileVersion("2.0.0.16694")]
-[assembly: AssemblyInformationalVersion("2.0.0")]
+[assembly: AssemblyVersion("2.1.0.19388")]
+[assembly: AssemblyFileVersion("2.1.0.19388")]
+[assembly: AssemblyInformationalVersion("2.1.0")]
[assembly: CLSCompliant(true)]
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/platforms/dotnet/Apache.Ignite/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite/Properties/AssemblyInfo.cs b/modules/platforms/dotnet/Apache.Ignite/Properties/AssemblyInfo.cs
index 3e0e305..73eb876 100644
--- a/modules/platforms/dotnet/Apache.Ignite/Properties/AssemblyInfo.cs
+++ b/modules/platforms/dotnet/Apache.Ignite/Properties/AssemblyInfo.cs
@@ -31,6 +31,6 @@ using System.Runtime.InteropServices;
[assembly: Guid("0f9702ec-da7d-4ce5-b4b7-73310c885355")]
-[assembly: AssemblyVersion("2.0.0.16694")]
-[assembly: AssemblyFileVersion("2.0.0.16694")]
-[assembly: AssemblyInformationalVersion("2.0.0")]
\ No newline at end of file
+[assembly: AssemblyVersion("2.1.0.19388")]
+[assembly: AssemblyFileVersion("2.1.0.19388")]
+[assembly: AssemblyInformationalVersion("2.1.0")]
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/platforms/dotnet/examples/Apache.Ignite.Examples/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/examples/Apache.Ignite.Examples/Properties/AssemblyInfo.cs b/modules/platforms/dotnet/examples/Apache.Ignite.Examples/Properties/AssemblyInfo.cs
index f6323e0..a87a8e0 100644
--- a/modules/platforms/dotnet/examples/Apache.Ignite.Examples/Properties/AssemblyInfo.cs
+++ b/modules/platforms/dotnet/examples/Apache.Ignite.Examples/Properties/AssemblyInfo.cs
@@ -31,6 +31,6 @@ using System.Runtime.InteropServices;
[assembly: Guid("41a0cb95-3435-4c78-b867-900b28e2c9ee")]
-[assembly: AssemblyVersion("2.0.0.16694")]
-[assembly: AssemblyFileVersion("2.0.0.16694")]
-[assembly: AssemblyInformationalVersion("2.0.0")]
\ No newline at end of file
+[assembly: AssemblyVersion("2.1.0.19388")]
+[assembly: AssemblyFileVersion("2.1.0.19388")]
+[assembly: AssemblyInformationalVersion("2.1.0")]
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/platforms/dotnet/examples/Apache.Ignite.ExamplesDll/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/examples/Apache.Ignite.ExamplesDll/Properties/AssemblyInfo.cs b/modules/platforms/dotnet/examples/Apache.Ignite.ExamplesDll/Properties/AssemblyInfo.cs
index 6d28b2b..1e9dcc8 100644
--- a/modules/platforms/dotnet/examples/Apache.Ignite.ExamplesDll/Properties/AssemblyInfo.cs
+++ b/modules/platforms/dotnet/examples/Apache.Ignite.ExamplesDll/Properties/AssemblyInfo.cs
@@ -31,6 +31,6 @@ using System.Runtime.InteropServices;
[assembly: Guid("ce65ec7c-d3cf-41ad-8f45-f90d5af68d77")]
-[assembly: AssemblyVersion("2.0.0.16694")]
-[assembly: AssemblyFileVersion("2.0.0.16694")]
-[assembly: AssemblyInformationalVersion("2.0.0")]
\ No newline at end of file
+[assembly: AssemblyVersion("2.1.0.19388")]
+[assembly: AssemblyFileVersion("2.1.0.19388")]
+[assembly: AssemblyInformationalVersion("2.1.0")]
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/rest-http/pom.xml
----------------------------------------------------------------------
diff --git a/modules/rest-http/pom.xml b/modules/rest-http/pom.xml
index 85969b3..4a29eea 100644
--- a/modules/rest-http/pom.xml
+++ b/modules/rest-http/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-rest-http</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<properties>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/scalar-2.10/pom.xml
----------------------------------------------------------------------
diff --git a/modules/scalar-2.10/pom.xml b/modules/scalar-2.10/pom.xml
index 8d3d86d..ac3dadc 100644
--- a/modules/scalar-2.10/pom.xml
+++ b/modules/scalar-2.10/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-scalar_2.10</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/scalar/pom.xml
----------------------------------------------------------------------
diff --git a/modules/scalar/pom.xml b/modules/scalar/pom.xml
index 2bb114f..c6c3f93 100644
--- a/modules/scalar/pom.xml
+++ b/modules/scalar/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-scalar</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/schedule/pom.xml
----------------------------------------------------------------------
diff --git a/modules/schedule/pom.xml b/modules/schedule/pom.xml
index 935f0ff..22c2571 100644
--- a/modules/schedule/pom.xml
+++ b/modules/schedule/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-schedule</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<properties>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/slf4j/pom.xml
----------------------------------------------------------------------
diff --git a/modules/slf4j/pom.xml b/modules/slf4j/pom.xml
index a19b46b..96b7309 100644
--- a/modules/slf4j/pom.xml
+++ b/modules/slf4j/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-slf4j</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/spark-2.10/pom.xml
----------------------------------------------------------------------
diff --git a/modules/spark-2.10/pom.xml b/modules/spark-2.10/pom.xml
index 58e2860..90f7d0b 100644
--- a/modules/spark-2.10/pom.xml
+++ b/modules/spark-2.10/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-spark_2.10</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/spark/pom.xml
----------------------------------------------------------------------
diff --git a/modules/spark/pom.xml b/modules/spark/pom.xml
index 140f637..86ed9f6 100644
--- a/modules/spark/pom.xml
+++ b/modules/spark/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-spark</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/spring-data/pom.xml
----------------------------------------------------------------------
diff --git a/modules/spring-data/pom.xml b/modules/spring-data/pom.xml
index 4d8107b..3d8bcea 100644
--- a/modules/spring-data/pom.xml
+++ b/modules/spring-data/pom.xml
@@ -20,8 +20,7 @@
<!--
POM file.
-->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
@@ -32,7 +31,7 @@
</parent>
<artifactId>ignite-spring-data</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/spring/pom.xml
----------------------------------------------------------------------
diff --git a/modules/spring/pom.xml b/modules/spring/pom.xml
index 275243f..edaa013 100644
--- a/modules/spring/pom.xml
+++ b/modules/spring/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-spring</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/ssh/pom.xml
----------------------------------------------------------------------
diff --git a/modules/ssh/pom.xml b/modules/ssh/pom.xml
index 4b448a0..64ffabc 100644
--- a/modules/ssh/pom.xml
+++ b/modules/ssh/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-ssh</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/storm/pom.xml
----------------------------------------------------------------------
diff --git a/modules/storm/pom.xml b/modules/storm/pom.xml
index 827bcf9..444aac5 100644
--- a/modules/storm/pom.xml
+++ b/modules/storm/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-storm</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<properties>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/tools/pom.xml
----------------------------------------------------------------------
diff --git a/modules/tools/pom.xml b/modules/tools/pom.xml
index 6dec29a..a5a6360 100644
--- a/modules/tools/pom.xml
+++ b/modules/tools/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-tools</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<properties>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/twitter/pom.xml
----------------------------------------------------------------------
diff --git a/modules/twitter/pom.xml b/modules/twitter/pom.xml
index 126c590..b6795f3 100644
--- a/modules/twitter/pom.xml
+++ b/modules/twitter/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-twitter</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/urideploy/pom.xml
----------------------------------------------------------------------
diff --git a/modules/urideploy/pom.xml b/modules/urideploy/pom.xml
index 266dd6a..d08372f 100644
--- a/modules/urideploy/pom.xml
+++ b/modules/urideploy/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-urideploy</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/visor-console-2.10/pom.xml
----------------------------------------------------------------------
diff --git a/modules/visor-console-2.10/pom.xml b/modules/visor-console-2.10/pom.xml
index bcdc8b1..2cd6864 100644
--- a/modules/visor-console-2.10/pom.xml
+++ b/modules/visor-console-2.10/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-visor-console_2.10</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/visor-console/pom.xml
----------------------------------------------------------------------
diff --git a/modules/visor-console/pom.xml b/modules/visor-console/pom.xml
index 80de214..794a22f 100644
--- a/modules/visor-console/pom.xml
+++ b/modules/visor-console/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-visor-console</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/visor-plugins/pom.xml
----------------------------------------------------------------------
diff --git a/modules/visor-plugins/pom.xml b/modules/visor-plugins/pom.xml
index 208dc8d..b9befad 100644
--- a/modules/visor-plugins/pom.xml
+++ b/modules/visor-plugins/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-visor-plugins</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/web-console/pom.xml
----------------------------------------------------------------------
diff --git a/modules/web-console/pom.xml b/modules/web-console/pom.xml
index 6c7959e..f1f0a14 100644
--- a/modules/web-console/pom.xml
+++ b/modules/web-console/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-web-console</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<build>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/web-console/web-agent/pom.xml
----------------------------------------------------------------------
diff --git a/modules/web-console/web-agent/pom.xml b/modules/web-console/web-agent/pom.xml
index 697e58f..2bf7875 100644
--- a/modules/web-console/web-agent/pom.xml
+++ b/modules/web-console/web-agent/pom.xml
@@ -32,7 +32,7 @@
<artifactId>ignite-web-agent</artifactId>
<packaging>jar</packaging>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<properties>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/web/ignite-appserver-test/pom.xml
----------------------------------------------------------------------
diff --git a/modules/web/ignite-appserver-test/pom.xml b/modules/web/ignite-appserver-test/pom.xml
index 9d0461b..6ee8d15 100644
--- a/modules/web/ignite-appserver-test/pom.xml
+++ b/modules/web/ignite-appserver-test/pom.xml
@@ -30,7 +30,7 @@
<artifactId>ignite-appserver-test</artifactId>
<packaging>jar</packaging>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/web/ignite-websphere-test/pom.xml
----------------------------------------------------------------------
diff --git a/modules/web/ignite-websphere-test/pom.xml b/modules/web/ignite-websphere-test/pom.xml
index b055b6a..8d20041 100644
--- a/modules/web/ignite-websphere-test/pom.xml
+++ b/modules/web/ignite-websphere-test/pom.xml
@@ -30,7 +30,7 @@
<artifactId>ignite-websphere-test</artifactId>
<packaging>war</packaging>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/web/pom.xml
----------------------------------------------------------------------
diff --git a/modules/web/pom.xml b/modules/web/pom.xml
index eee51eb..86d7634 100644
--- a/modules/web/pom.xml
+++ b/modules/web/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-web</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/yardstick/pom.xml
----------------------------------------------------------------------
diff --git a/modules/yardstick/pom.xml b/modules/yardstick/pom.xml
index fbc56d2..f496e02 100644
--- a/modules/yardstick/pom.xml
+++ b/modules/yardstick/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-yardstick</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<properties>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/yarn/pom.xml
----------------------------------------------------------------------
diff --git a/modules/yarn/pom.xml b/modules/yarn/pom.xml
index a8602cf..8620ef5 100644
--- a/modules/yarn/pom.xml
+++ b/modules/yarn/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-yarn</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<properties>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/zeromq/pom.xml
----------------------------------------------------------------------
diff --git a/modules/zeromq/pom.xml b/modules/zeromq/pom.xml
index c11416c..8538582 100644
--- a/modules/zeromq/pom.xml
+++ b/modules/zeromq/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-zeromq</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<properties>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/modules/zookeeper/pom.xml
----------------------------------------------------------------------
diff --git a/modules/zookeeper/pom.xml b/modules/zookeeper/pom.xml
index 0e4e94e..fd7d648 100644
--- a/modules/zookeeper/pom.xml
+++ b/modules/zookeeper/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-zookeeper</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/27fd74ee/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 45d478c..c3f41f6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -32,7 +32,7 @@
<groupId>org.apache.ignite</groupId>
<artifactId>apache-ignite</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
@@ -516,7 +516,7 @@
<mkdir dir="${basedir}/target/release-package/benchmarks" />
<copy todir="${basedir}/target/release-package/benchmarks/">
- <fileset dir="${basedir}/modules/yardstick/target/assembly/"/>
+ <fileset dir="${basedir}/modules/yardstick/target/assembly/" />
</copy>
<!--todo: only required jars should be exported to /benchmarks/libs during compilation-->
@@ -533,47 +533,44 @@
<delete>
<fileset dir="${basedir}/target/release-package/benchmarks/config/">
<include name="*.*" />
- <exclude name="benchmark.properties"/>
- <exclude name="benchmark-remote.properties"/>
- <exclude name="benchmark-sample.properties"/>
- <exclude name="benchmark-remote-sample.properties"/>
- <exclude name="benchmark-multicast.properties"/>
- <exclude name="ignite-base-config.xml"/>
- <exclude name="ignite-localhost-config.xml"/>
- <exclude name="ignite-remote-config.xml"/>
- <exclude name="ignite-multicast-config.xml"/>
+ <exclude name="benchmark.properties" />
+ <exclude name="benchmark-remote.properties" />
+ <exclude name="benchmark-sample.properties" />
+ <exclude name="benchmark-remote-sample.properties" />
+ <exclude name="benchmark-multicast.properties" />
+ <exclude name="ignite-base-config.xml" />
+ <exclude name="ignite-localhost-config.xml" />
+ <exclude name="ignite-remote-config.xml" />
+ <exclude name="ignite-multicast-config.xml" />
</fileset>
</delete>
<mkdir dir="${basedir}/target/release-package/benchmarks/sources/src" />
<copy todir="${basedir}/target/release-package/benchmarks/sources/src/">
- <fileset dir="${basedir}/modules/yardstick/src"/>
+ <fileset dir="${basedir}/modules/yardstick/src" />
</copy>
<mkdir dir="${basedir}/target/release-package/benchmarks/sources/config" />
<copy todir="${basedir}/target/release-package/benchmarks/sources/config/">
- <fileset dir="${basedir}/target/release-package/benchmarks/config"/>
+ <fileset dir="${basedir}/target/release-package/benchmarks/config" />
</copy>
- <copy file="${basedir}/modules/yardstick/pom-standalone.xml"
- tofile="${basedir}/target/release-package/benchmarks/sources/pom.xml"/>
+ <copy file="${basedir}/modules/yardstick/pom-standalone.xml" tofile="${basedir}/target/release-package/benchmarks/sources/pom.xml" />
<replaceregexp byline="true">
- <regexp pattern="to_be_replaced_by_ignite_version"/>
- <substitution expression="${project.version}"/>
- <fileset dir="${basedir}/target/release-package/benchmarks/sources/" >
- <include name="pom.xml"/>
+ <regexp pattern="to_be_replaced_by_ignite_version" />
+ <substitution expression="${project.version}" />
+ <fileset dir="${basedir}/target/release-package/benchmarks/sources/">
+ <include name="pom.xml" />
</fileset>
</replaceregexp>
- <copy file="${basedir}/modules/yardstick/README.txt"
- tofile="${basedir}/target/release-package/benchmarks/README.txt" overwrite="true">
+ <copy file="${basedir}/modules/yardstick/README.txt" tofile="${basedir}/target/release-package/benchmarks/README.txt" overwrite="true">
</copy>
- <copy file="${basedir}/modules/yardstick/DEVNOTES-standalone.txt"
- tofile="${basedir}/target/release-package/benchmarks/sources/DEVNOTES.txt"/>
+ <copy file="${basedir}/modules/yardstick/DEVNOTES-standalone.txt" tofile="${basedir}/target/release-package/benchmarks/sources/DEVNOTES.txt" />
</target>
</configuration>
</execution>
[15/67] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math
module to Ignite ML module added missed licenses renamed packages fixed wrong
ml profile activation (cherry picked from commit d78e071)
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/UnsupportedOperationException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/UnsupportedOperationException.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/UnsupportedOperationException.java
new file mode 100644
index 0000000..0fea255
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/UnsupportedOperationException.java
@@ -0,0 +1,44 @@
+/*
+ * 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.ignite.ml.math.exceptions;
+
+import org.apache.ignite.IgniteException;
+
+/**
+ * Indicate that a specific operation is not supported by the underlying implementation.
+ * In some cases, an operation may be unsupported only in certain cases where, for example,
+ * it could not be deterministically completed in polynomial time.
+ */
+public class UnsupportedOperationException extends IgniteException {
+ /** */
+ private static final long serialVersionUID = 0L;
+
+ /**
+ * @param errMsg Error message.
+ */
+ public UnsupportedOperationException(String errMsg) {
+ super(errMsg);
+ }
+
+ /**
+ *
+ */
+ public UnsupportedOperationException() {
+ this("Unsupported operation.");
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/package-info.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/package-info.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/package-info.java
new file mode 100644
index 0000000..1990a8a
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * 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 description. -->
+ * Contains exceptions for distributed code algebra.
+ */
+package org.apache.ignite.ml.math.exceptions;
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/Functions.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/Functions.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/Functions.java
new file mode 100644
index 0000000..cd48daa
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/Functions.java
@@ -0,0 +1,136 @@
+/*
+ * 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.ignite.ml.math.functions;
+
+/**
+ * Compatibility with Apache Mahout.
+ */
+public final class Functions {
+ /** Function that returns {@code Math.abs(a)}. */
+ public static final IgniteDoubleFunction<Double> ABS = Math::abs;
+
+ /** Function that returns its argument. */
+ public static final IgniteDoubleFunction<Double> IDENTITY = (a) -> a;
+
+ /** Function that returns {@code Math.log(a) / Math.log(2)}. */
+ public static final IgniteDoubleFunction<Double> LOG2 = (a) -> Math.log(a) * 1.4426950408889634;
+
+ /** Function that returns {@code -a}. */
+ public static final IgniteDoubleFunction<Double> NEGATE = (a) -> -a;
+
+ /** Function that returns {@code a < 0 ? -1 : a > 0 ? 1 : 0 }. */
+ public static final IgniteDoubleFunction<Double> SIGN = (a) -> a < 0.0 ? -1.0 : a > 0.0 ? 1.0 : 0.0;
+
+ /** Function that returns {@code a * a}. */
+ public static final IgniteDoubleFunction<Double> SQUARE = (a) -> a * a;
+
+ /** Function that returns {@code 1 / (1 + exp(-a) } */
+ public static final IgniteDoubleFunction<Double> SIGMOID = (a) -> 1.0 / (1.0 + Math.exp(-a));
+
+ /** Function that returns {@code 1 / a } */
+ public static final IgniteDoubleFunction<Double> INV = (a) -> 1.0 / a;
+
+ /** Function that returns {@code a * (1-a) } */
+ public static final IgniteDoubleFunction<Double> SIGMOIDGRADIENT = (a) -> a * (1.0 - a);
+
+ /** Function that returns {@code a % b}. */
+ public static final IgniteBiFunction<Double, Double, Double> MOD = (a, b) -> a % b;
+
+ /** Function that returns {@code a * b}. */
+ public static final IgniteBiFunction<Double, Double, Double> MULT = (a, b) -> a * b;
+
+ /** Function that returns {@code Math.log(a) / Math.log(b)}. */
+ public static final IgniteBiFunction<Double, Double, Double> LG = (a, b) -> Math.log(a) / Math.log(b);
+
+ /** Function that returns {@code a + b}. */
+ public static final IgniteBiFunction<Double, Double, Double> PLUS = (a, b) -> a + b;
+
+ /** Function that returns {@code a - b}. */
+ public static final IgniteBiFunction<Double, Double, Double> MINUS = (a, b) -> a - b;
+
+ /** Function that returns {@code abs(a - b)}. */
+ public static final IgniteBiFunction<Double, Double, Double> MINUS_ABS = (a, b) -> Math.abs(a - b);
+
+ /** Function that returns {@code max(abs(a), abs(b))}. */
+ public static final IgniteBiFunction<Double, Double, Double> MAX_ABS = (a, b) -> Math.max(Math.abs(a), Math.abs(b));
+
+ /** Function that returns {@code min(abs(a), abs(b))}. */
+ public static final IgniteBiFunction<Double, Double, Double> MIN_ABS = (a, b) -> Math.min(Math.abs(a), Math.abs(b));
+
+ /** Function that returns {@code Math.abs(a) + Math.abs(b)}. */
+ public static final IgniteBiFunction<Double, Double, Double> PLUS_ABS = (a, b) -> Math.abs(a) + Math.abs(b);
+
+ /** Function that returns {@code (a - b) * (a - b)} */
+ public static final IgniteBiFunction<Double, Double, Double> MINUS_SQUARED = (a, b) -> (a - b) * (a - b);
+
+ /**
+ * Function that returns {@code a < b ? -1 : a > b ? 1 : 0}.
+ */
+ public static final IgniteBiFunction<Double, Double, Double> COMPARE = (a, b) -> a < b ? -1.0 : a > b ? 1.0 : 0.0;
+
+ /**
+ * Function that returns {@code a + b}. {@code a} is a variable, {@code b} is fixed.
+ *
+ * @param b
+ */
+ public static IgniteDoubleFunction<Double> plus(final double b) {
+ return (a) -> a + b;
+ }
+
+ /**
+ * Function that returns {@code a * b}. {@code a} is a variable, {@code b} is fixed.
+ *
+ * @param b
+ */
+ public static IgniteDoubleFunction<Double> mult(final double b) {
+ return (a) -> a * b;
+ }
+
+ /** Function that returns {@code a / b}. {@code a} is a variable, {@code b} is fixed. */
+ public static IgniteDoubleFunction<Double> div(double b) {
+ return mult(1 / b);
+ }
+
+ /**
+ * Function that returns {@code a + b*constant}. {@code a} and {@code b} are variables,
+ * {@code constant} is fixed.
+ */
+ public static IgniteBiFunction<Double, Double, Double> plusMult(double constant) {
+ return (a, b) -> a + b * constant;
+ }
+
+ /**
+ * Function that returns {@code a - b*constant}. {@code a} and {@code b} are variables,
+ * {@code constant} is fixed.
+ */
+ public static IgniteBiFunction<Double, Double, Double> minusMult(double constant) {
+ return (a, b) -> a - b * constant;
+ }
+
+ /**
+ * @param b
+ */
+ public static IgniteDoubleFunction<Double> pow(final double b) {
+ return (a) -> {
+ if (b == 2)
+ return a * a;
+ else
+ return Math.pow(a, b);
+ };
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteBiConsumer.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteBiConsumer.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteBiConsumer.java
new file mode 100644
index 0000000..f3303cd
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteBiConsumer.java
@@ -0,0 +1,29 @@
+/*
+ * 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.ignite.ml.math.functions;
+
+import java.io.Serializable;
+import java.util.function.BiConsumer;
+
+/**
+ * Serializable binary consumer.
+ *
+ * @see java.util.function.BiConsumer
+ */
+public interface IgniteBiConsumer<T, U> extends BiConsumer<T, U>, Serializable {
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteBiFunction.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteBiFunction.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteBiFunction.java
new file mode 100644
index 0000000..dc49739
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteBiFunction.java
@@ -0,0 +1,29 @@
+/*
+ * 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.ignite.ml.math.functions;
+
+import java.io.Serializable;
+import java.util.function.BiFunction;
+
+/**
+ * Serializable binary function.
+ *
+ * @see java.util.function.BiFunction
+ */
+public interface IgniteBiFunction<A, B, T> extends BiFunction<A, B, T>, Serializable {
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteConsumer.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteConsumer.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteConsumer.java
new file mode 100644
index 0000000..1d52e1d
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteConsumer.java
@@ -0,0 +1,29 @@
+/*
+ * 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.ignite.ml.math.functions;
+
+import java.io.Serializable;
+import java.util.function.Consumer;
+
+/**
+ * Serializable consumer.
+ *
+ * @see java.util.function.Consumer
+ */
+public interface IgniteConsumer<T> extends Consumer<T>, Serializable {
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteDoubleFunction.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteDoubleFunction.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteDoubleFunction.java
new file mode 100644
index 0000000..dfbf393
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteDoubleFunction.java
@@ -0,0 +1,29 @@
+/*
+ * 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.ignite.ml.math.functions;
+
+import java.io.Serializable;
+import java.util.function.DoubleFunction;
+
+/**
+ * Serializable double function.
+ *
+ * @see java.util.function.DoubleFunction
+ */
+public interface IgniteDoubleFunction<Double> extends DoubleFunction<Double>, Serializable {
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteFunction.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteFunction.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteFunction.java
new file mode 100644
index 0000000..9d19592
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteFunction.java
@@ -0,0 +1,30 @@
+/*
+ * 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.ignite.ml.math.functions;
+
+import java.io.Serializable;
+import java.util.function.Function;
+
+/**
+ * Serializable function.
+ *
+ * @see java.util.function.Function
+ */
+public interface IgniteFunction<T, R> extends Function<T, R>, Serializable {
+
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IntDoubleToVoidFunction.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IntDoubleToVoidFunction.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IntDoubleToVoidFunction.java
new file mode 100644
index 0000000..981e0c5
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IntDoubleToVoidFunction.java
@@ -0,0 +1,25 @@
+/*
+ * 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.ignite.ml.math.functions;
+
+/**
+ * Setter function for the vector.
+ */
+public interface IntDoubleToVoidFunction extends IgniteBiConsumer<Integer, Double> {
+
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IntIntDoubleToVoidFunction.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IntIntDoubleToVoidFunction.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IntIntDoubleToVoidFunction.java
new file mode 100644
index 0000000..a9b3f9c
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IntIntDoubleToVoidFunction.java
@@ -0,0 +1,28 @@
+/*
+ * 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.ignite.ml.math.functions;
+
+import java.io.Serializable;
+
+/**
+ * Setter function for matrices.
+ */
+public interface IntIntDoubleToVoidFunction extends Serializable {
+ /** */
+ public void apply(int x, int y, double v);
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IntIntToDoubleFunction.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IntIntToDoubleFunction.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IntIntToDoubleFunction.java
new file mode 100644
index 0000000..5fabfb7
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IntIntToDoubleFunction.java
@@ -0,0 +1,24 @@
+/*
+ * 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.ignite.ml.math.functions;
+
+/**
+ * Getters functions for matrices.
+ */
+public interface IntIntToDoubleFunction extends IgniteBiFunction<Integer, Integer, Double> {
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/package-info.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/package-info.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/package-info.java
new file mode 100644
index 0000000..d41f94d
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * 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 description. -->
+ * Contains serializable functions for distributed code algebra.
+ */
+package org.apache.ignite.ml.math.functions;
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/CacheUtils.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/CacheUtils.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/CacheUtils.java
new file mode 100644
index 0000000..cfb01be
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/CacheUtils.java
@@ -0,0 +1,356 @@
+/*
+ * 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.ignite.ml.math.impls;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+import javax.cache.Cache;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.Ignition;
+import org.apache.ignite.cache.affinity.Affinity;
+import org.apache.ignite.cache.query.ScanQuery;
+import org.apache.ignite.cluster.ClusterGroup;
+import org.apache.ignite.cluster.ClusterNode;
+import org.apache.ignite.lang.IgniteCallable;
+import org.apache.ignite.lang.IgniteRunnable;
+import org.apache.ignite.ml.math.KeyMapper;
+import org.apache.ignite.ml.math.ValueMapper;
+import org.apache.ignite.ml.math.functions.IgniteBiFunction;
+import org.apache.ignite.ml.math.functions.IgniteConsumer;
+import org.apache.ignite.ml.math.functions.IgniteFunction;
+
+/**
+ * Distribution-related misc. support.
+ */
+public class CacheUtils {
+ /**
+ * Cache entry support.
+ *
+ * @param <K>
+ * @param <V>
+ */
+ public static class CacheEntry<K, V> {
+ /** */
+ private Cache.Entry<K, V> entry;
+ /** */
+ private IgniteCache<K, V> cache;
+
+ /**
+ * @param entry Original cache entry.
+ * @param cache Cache instance.
+ */
+ CacheEntry(Cache.Entry<K, V> entry, IgniteCache<K, V> cache) {
+ this.entry = entry;
+ this.cache = cache;
+ }
+
+ /**
+ *
+ *
+ */
+ public Cache.Entry<K, V> entry() {
+ return entry;
+ }
+
+ /**
+ *
+ *
+ */
+ public IgniteCache<K, V> cache() {
+ return cache;
+ }
+ }
+
+ /**
+ * Gets local Ignite instance.
+ */
+ public static Ignite ignite() {
+ return Ignition.localIgnite();
+ }
+
+ /**
+ * @param cacheName Cache name.
+ * @param k Key into the cache.
+ * @param <K> Key type.
+ * @return Cluster group for given key.
+ */
+ public static <K> ClusterGroup groupForKey(String cacheName, K k) {
+ return ignite().cluster().forNode(ignite().affinity(cacheName).mapKeyToNode(k));
+ }
+
+ /**
+ * @param cacheName Cache name.
+ * @param keyMapper {@link KeyMapper} to validate cache key.
+ * @param valMapper {@link ValueMapper} to obtain double value for given cache key.
+ * @param <K> Cache key object type.
+ * @param <V> Cache value object type.
+ * @return Sum of the values obtained for valid keys.
+ */
+ public static <K, V> double sum(String cacheName, KeyMapper<K> keyMapper, ValueMapper<V> valMapper) {
+ Collection<Double> subSums = fold(cacheName, (CacheEntry<K, V> ce, Double acc) -> {
+ if (keyMapper.isValid(ce.entry().getKey())) {
+ double v = valMapper.toDouble(ce.entry().getValue());
+
+ return acc == null ? v : acc + v;
+ }
+ else
+ return acc;
+ });
+
+ return sum(subSums);
+ }
+
+ /**
+ * @param cacheName Cache name.
+ * @return Sum obtained using sparse logic.
+ */
+ public static <K, V> double sparseSum(String cacheName) {
+ Collection<Double> subSums = fold(cacheName, (CacheEntry<Integer, Map<Integer, Double>> ce, Double acc) -> {
+ Map<Integer, Double> map = ce.entry().getValue();
+
+ double sum = sum(map.values());
+
+ return acc == null ? sum : acc + sum;
+ });
+
+ return sum(subSums);
+ }
+
+ /**
+ * @param c {@link Collection} of double values to sum.
+ * @return Sum of the values.
+ */
+ private static double sum(Collection<Double> c) {
+ double sum = 0.0;
+
+ for (double d : c)
+ sum += d;
+
+ return sum;
+ }
+
+ /**
+ * @param cacheName Cache name.
+ * @param keyMapper {@link KeyMapper} to validate cache key.
+ * @param valMapper {@link ValueMapper} to obtain double value for given cache key.
+ * @param <K> Cache key object type.
+ * @param <V> Cache value object type.
+ * @return Minimum value for valid keys.
+ */
+ public static <K, V> double min(String cacheName, KeyMapper<K> keyMapper, ValueMapper<V> valMapper) {
+ Collection<Double> mins = fold(cacheName, (CacheEntry<K, V> ce, Double acc) -> {
+ if (keyMapper.isValid(ce.entry().getKey())) {
+ double v = valMapper.toDouble(ce.entry().getValue());
+
+ if (acc == null)
+ return v;
+ else
+ return Math.min(acc, v);
+ }
+ else
+ return acc;
+ });
+
+ return Collections.min(mins);
+ }
+
+ /**
+ * @param cacheName Cache name.
+ * @return Minimum value obtained using sparse logic.
+ */
+ public static <K, V> double sparseMin(String cacheName) {
+ Collection<Double> mins = fold(cacheName, (CacheEntry<Integer, Map<Integer, Double>> ce, Double acc) -> {
+ Map<Integer, Double> map = ce.entry().getValue();
+
+ double min = Collections.min(map.values());
+
+ if (acc == null)
+ return min;
+ else
+ return Math.min(acc, min);
+ });
+
+ return Collections.min(mins);
+ }
+
+ /**
+ * @param cacheName Cache name.
+ * @return Maximum value obtained using sparse logic.
+ */
+ public static <K, V> double sparseMax(String cacheName) {
+ Collection<Double> maxes = fold(cacheName, (CacheEntry<Integer, Map<Integer, Double>> ce, Double acc) -> {
+ Map<Integer, Double> map = ce.entry().getValue();
+
+ double max = Collections.max(map.values());
+
+ if (acc == null)
+ return max;
+ else
+ return Math.max(acc, max);
+ });
+
+ return Collections.max(maxes);
+ }
+
+ /**
+ * @param cacheName Cache name.
+ * @param keyMapper {@link KeyMapper} to validate cache key.
+ * @param valMapper {@link ValueMapper} to obtain double value for given cache key.
+ * @param <K> Cache key object type.
+ * @param <V> Cache value object type.
+ * @return Maximum value for valid keys.
+ */
+ public static <K, V> double max(String cacheName, KeyMapper<K> keyMapper, ValueMapper<V> valMapper) {
+ Collection<Double> maxes = fold(cacheName, (CacheEntry<K, V> ce, Double acc) -> {
+ if (keyMapper.isValid(ce.entry().getKey())) {
+ double v = valMapper.toDouble(ce.entry().getValue());
+
+ if (acc == null)
+ return v;
+ else
+ return Math.max(acc, v);
+ }
+ else
+ return acc;
+ });
+
+ return Collections.max(maxes);
+ }
+
+ /**
+ * @param cacheName Cache name.
+ * @param keyMapper {@link KeyMapper} to validate cache key.
+ * @param valMapper {@link ValueMapper} to obtain double value for given cache key.
+ * @param mapper Mapping {@link IgniteFunction}.
+ * @param <K> Cache key object type.
+ * @param <V> Cache value object type.
+ */
+ public static <K, V> void map(String cacheName, KeyMapper<K> keyMapper, ValueMapper<V> valMapper,
+ IgniteFunction<Double, Double> mapper) {
+ foreach(cacheName, (CacheEntry<K, V> ce) -> {
+ K k = ce.entry().getKey();
+
+ if (keyMapper.isValid(k))
+ // Actual assignment.
+ ce.cache().put(k, valMapper.fromDouble(mapper.apply(valMapper.toDouble(ce.entry().getValue()))));
+ });
+ }
+
+ /**
+ * @param cacheName Cache name.
+ * @param mapper Mapping {@link IgniteFunction}.
+ */
+ public static <K, V> void sparseMap(String cacheName, IgniteFunction<Double, Double> mapper) {
+ foreach(cacheName, (CacheEntry<Integer, Map<Integer, Double>> ce) -> {
+ Integer k = ce.entry().getKey();
+ Map<Integer, Double> v = ce.entry().getValue();
+
+ for (Map.Entry<Integer, Double> e : v.entrySet())
+ e.setValue(mapper.apply(e.getValue()));
+
+ ce.cache().put(k, v);
+ });
+ }
+
+ /**
+ * @param cacheName Cache name.
+ * @param fun An operation that accepts a cache entry and processes it.
+ * @param <K> Cache key object type.
+ * @param <V> Cache value object type.
+ */
+ public static <K, V> void foreach(String cacheName, IgniteConsumer<CacheEntry<K, V>> fun) {
+ bcast(cacheName, () -> {
+ Ignite ignite = Ignition.localIgnite();
+ IgniteCache<K, V> cache = ignite.getOrCreateCache(cacheName);
+
+ int partsCnt = ignite.affinity(cacheName).partitions();
+
+ // Use affinity in filter for scan query. Otherwise we accept consumer in each node which is wrong.
+ Affinity affinity = ignite.affinity(cacheName);
+ ClusterNode locNode = ignite.cluster().localNode();
+
+ // Iterate over all partitions. Some of them will be stored on that local node.
+ for (int part = 0; part < partsCnt; part++) {
+ int p = part;
+
+ // Iterate over given partition.
+ // Query returns an empty cursor if this partition is not stored on this node.
+ for (Cache.Entry<K, V> entry : cache.query(new ScanQuery<K, V>(part,
+ (k, v) -> affinity.mapPartitionToNode(p) == locNode)))
+ fun.accept(new CacheEntry<>(entry, cache));
+ }
+ });
+ }
+
+ /**
+ * <b>Currently fold supports only commutative operations.<b/>
+ *
+ * @param cacheName Cache name.
+ * @param folder Fold function operating over cache entries.
+ * @param <K> Cache key object type.
+ * @param <V> Cache value object type.
+ * @param <A> Fold result type.
+ * @return Fold operation result.
+ */
+ public static <K, V, A> Collection<A> fold(String cacheName, IgniteBiFunction<CacheEntry<K, V>, A, A> folder) {
+ return bcast(cacheName, () -> {
+ Ignite ignite = Ignition.localIgnite();
+ IgniteCache<K, V> cache = ignite.getOrCreateCache(cacheName);
+
+ int partsCnt = ignite.affinity(cacheName).partitions();
+
+ // Use affinity in filter for ScanQuery. Otherwise we accept consumer in each node which is wrong.
+ Affinity affinity = ignite.affinity(cacheName);
+ ClusterNode locNode = ignite.cluster().localNode();
+
+ A a = null;
+
+ // Iterate over all partitions. Some of them will be stored on that local node.
+ for (int part = 0; part < partsCnt; part++) {
+ int p = part;
+
+ // Iterate over given partition.
+ // Query returns an empty cursor if this partition is not stored on this node.
+ for (Cache.Entry<K, V> entry : cache.query(new ScanQuery<K, V>(part,
+ (k, v) -> affinity.mapPartitionToNode(p) == locNode)))
+ a = folder.apply(new CacheEntry<>(entry, cache), a);
+ }
+
+ return a;
+ });
+ }
+
+ /**
+ * @param cacheName Cache name.
+ * @param run {@link Runnable} to broadcast to cache nodes for given cache name.
+ */
+ public static void bcast(String cacheName, IgniteRunnable run) {
+ ignite().compute(ignite().cluster().forCacheNodes(cacheName)).broadcast(run);
+ }
+
+ /**
+ * @param cacheName Cache name.
+ * @param call {@link IgniteCallable} to broadcast to cache nodes for given cache name.
+ * @param <A> Type returned by the callable.
+ */
+ public static <A> Collection<A> bcast(String cacheName, IgniteCallable<A> call) {
+ return ignite().compute(ignite().cluster().forCacheNodes(cacheName)).broadcast(call);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/AbstractMatrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/AbstractMatrix.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/AbstractMatrix.java
new file mode 100644
index 0000000..c5edeb1
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/AbstractMatrix.java
@@ -0,0 +1,880 @@
+/*
+ * 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.ignite.ml.math.impls.matrix;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+import org.apache.ignite.lang.IgniteUuid;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.MatrixStorage;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.decompositions.LUDecomposition;
+import org.apache.ignite.ml.math.exceptions.CardinalityException;
+import org.apache.ignite.ml.math.exceptions.ColumnIndexException;
+import org.apache.ignite.ml.math.exceptions.RowIndexException;
+import org.apache.ignite.ml.math.functions.Functions;
+import org.apache.ignite.ml.math.functions.IgniteBiFunction;
+import org.apache.ignite.ml.math.functions.IgniteDoubleFunction;
+import org.apache.ignite.ml.math.functions.IgniteFunction;
+import org.apache.ignite.ml.math.functions.IntIntToDoubleFunction;
+import org.apache.ignite.ml.math.impls.vector.MatrixVectorView;
+
+/**
+ * This class provides a helper implementation of the {@link Matrix}
+ * interface to minimize the effort required to implement it.
+ * Subclasses may override some of the implemented methods if a more
+ * specific or optimized implementation is desirable.
+ *
+ * TODO: add row/column optimization.
+ */
+public abstract class AbstractMatrix implements Matrix {
+ // Stochastic sparsity analysis.
+ /** */
+ private static final double Z95 = 1.959964;
+ /** */
+ private static final double Z80 = 1.281552;
+ /** */
+ private static final int MAX_SAMPLES = 500;
+ /** */
+ private static final int MIN_SAMPLES = 15;
+
+ /** Cached minimum element. */
+ private Element minElm;
+ /** Cached maximum element. */
+ private Element maxElm = null;
+
+ /** Matrix storage implementation. */
+ private MatrixStorage sto;
+
+ /** Meta attributes storage. */
+ private Map<String, Object> meta = new HashMap<>();
+
+ /** Matrix's GUID. */
+ private IgniteUuid guid = IgniteUuid.randomUuid();
+
+ /**
+ * @param sto Backing {@link MatrixStorage}.
+ */
+ public AbstractMatrix(MatrixStorage sto) {
+ this.sto = sto;
+ }
+
+ /**
+ *
+ */
+ public AbstractMatrix() {
+ // No-op.
+ }
+
+ /**
+ * @param sto Backing {@link MatrixStorage}.
+ */
+ protected void setStorage(MatrixStorage sto) {
+ assert sto != null;
+
+ this.sto = sto;
+ }
+
+ /**
+ * @param row Row index in the matrix.
+ * @param col Column index in the matrix.
+ * @param v Value to set.
+ */
+ protected void storageSet(int row, int col, double v) {
+ sto.set(row, col, v);
+
+ // Reset cached values.
+ minElm = maxElm = null;
+ }
+
+ /**
+ * @param row Row index in the matrix.
+ * @param col Column index in the matrix.
+ */
+ protected double storageGet(int row, int col) {
+ return sto.get(row, col);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Element maxElement() {
+ if (maxElm == null) {
+ double max = Double.NEGATIVE_INFINITY;
+ int row = 0, col = 0;
+
+ int rows = rowSize();
+ int cols = columnSize();
+
+ for (int x = 0; x < rows; x++)
+ for (int y = 0; y < cols; y++) {
+ double d = storageGet(x, y);
+
+ if (d > max) {
+ max = d;
+ row = x;
+ col = y;
+ }
+ }
+
+ maxElm = mkElement(row, col);
+ }
+
+ return maxElm;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Element minElement() {
+ if (minElm == null) {
+ double min = Double.MAX_VALUE;
+ int row = 0, col = 0;
+
+ int rows = rowSize();
+ int cols = columnSize();
+
+ for (int x = 0; x < rows; x++)
+ for (int y = 0; y < cols; y++) {
+ double d = storageGet(x, y);
+
+ if (d < min) {
+ min = d;
+ row = x;
+ col = y;
+ }
+ }
+
+ minElm = mkElement(row, col);
+ }
+
+ return minElm;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double maxValue() {
+ return maxElement().get();
+ }
+
+ /** {@inheritDoc} */
+ @Override public double minValue() {
+ return minElement().get();
+ }
+
+ /**
+ * @param row Row index in the matrix.
+ * @param col Column index in the matrix.
+ */
+ private Element mkElement(int row, int col) {
+ return new Element() {
+ /** {@inheritDoc} */
+ @Override public double get() {
+ return storageGet(row, col);
+ }
+
+ /** {@inheritDoc} */
+ @Override public int row() {
+ return row;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int column() {
+ return col;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void set(double d) {
+ storageSet(row, col, d);
+ }
+ };
+ }
+
+ /** {@inheritDoc} */
+ @Override public Element getElement(int row, int col) {
+ return mkElement(row, col);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix swapRows(int row1, int row2) {
+ checkRowIndex(row1);
+ checkRowIndex(row2);
+
+ int cols = columnSize();
+
+ for (int y = 0; y < cols; y++) {
+ double v = getX(row1, y);
+
+ setX(row1, y, getX(row2, y));
+ setX(row2, y, v);
+ }
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix swapColumns(int col1, int col2) {
+ checkColumnIndex(col1);
+ checkColumnIndex(col2);
+
+ int rows = rowSize();
+
+ for (int x = 0; x < rows; x++) {
+ double v = getX(x, col1);
+
+ setX(x, col1, getX(x, col2));
+ setX(x, col2, v);
+ }
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public MatrixStorage getStorage() {
+ return sto;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isSequentialAccess() {
+ return sto.isSequentialAccess();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDense() {
+ return sto.isDense();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isRandomAccess() {
+ return sto.isRandomAccess();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDistributed() {
+ return sto.isDistributed();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isArrayBased() {
+ return sto.isArrayBased();
+ }
+
+ /**
+ * Check row index bounds.
+ *
+ * @param row Row index.
+ */
+ private void checkRowIndex(int row) {
+ if (row < 0 || row >= rowSize())
+ throw new RowIndexException(row);
+ }
+
+ /**
+ * Check column index bounds.
+ *
+ * @param col Column index.
+ */
+ private void checkColumnIndex(int col) {
+ if (col < 0 || col >= columnSize())
+ throw new ColumnIndexException(col);
+ }
+
+ /**
+ * Check column and row index bounds.
+ *
+ * @param row Row index.
+ * @param col Column index.
+ */
+ protected void checkIndex(int row, int col) {
+ checkRowIndex(row);
+ checkColumnIndex(col);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeObject(sto);
+ out.writeObject(meta);
+ out.writeObject(guid);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Map<String, Object> getMetaStorage() {
+ return meta;
+ }
+
+ /** {@inheritDoc} */
+ @SuppressWarnings("unchecked")
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ sto = (MatrixStorage)in.readObject();
+ meta = (Map<String, Object>)in.readObject();
+ guid = (IgniteUuid)in.readObject();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix assign(double val) {
+ if (sto.isArrayBased())
+ for (double[] column : sto.data())
+ Arrays.fill(column, val);
+ else {
+ int rows = rowSize();
+ int cols = columnSize();
+
+ for (int x = 0; x < rows; x++)
+ for (int y = 0; y < cols; y++)
+ storageSet(x, y, val);
+ }
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix assign(IntIntToDoubleFunction fun) {
+ int rows = rowSize();
+ int cols = columnSize();
+
+ for (int x = 0; x < rows; x++)
+ for (int y = 0; y < cols; y++)
+ storageSet(x, y, fun.apply(x, y));
+
+ return this;
+ }
+
+ /** */
+ private void checkCardinality(Matrix mtx) {
+ checkCardinality(mtx.rowSize(), mtx.columnSize());
+ }
+
+ /** */
+ private void checkCardinality(int rows, int cols) {
+ if (rows != rowSize())
+ throw new CardinalityException(rowSize(), rows);
+
+ if (cols != columnSize())
+ throw new CardinalityException(columnSize(), cols);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix assign(double[][] vals) {
+ checkCardinality(vals.length, vals[0].length);
+
+ int rows = rowSize();
+ int cols = columnSize();
+
+ for (int x = 0; x < rows; x++)
+ for (int y = 0; y < cols; y++)
+ storageSet(x, y, vals[x][y]);
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix assign(Matrix mtx) {
+ checkCardinality(mtx);
+
+ int rows = rowSize();
+ int cols = columnSize();
+
+ for (int x = 0; x < rows; x++)
+ for (int y = 0; y < cols; y++)
+ storageSet(x, y, mtx.getX(x, y));
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix map(IgniteDoubleFunction<Double> fun) {
+ int rows = rowSize();
+ int cols = columnSize();
+
+ for (int x = 0; x < rows; x++)
+ for (int y = 0; y < cols; y++)
+ storageSet(x, y, fun.apply(storageGet(x, y)));
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix map(Matrix mtx, IgniteBiFunction<Double, Double, Double> fun) {
+ checkCardinality(mtx);
+
+ int rows = rowSize();
+ int cols = columnSize();
+
+ for (int x = 0; x < rows; x++)
+ for (int y = 0; y < cols; y++)
+ storageSet(x, y, fun.apply(storageGet(x, y), mtx.getX(x, y)));
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix assignColumn(int col, Vector vec) {
+ checkColumnIndex(col);
+
+ int rows = rowSize();
+
+ for (int x = 0; x < rows; x++)
+ storageSet(x, col, vec.getX(x));
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix assignRow(int row, Vector vec) {
+ checkRowIndex(row);
+
+ int cols = columnSize();
+
+ if (cols != vec.size())
+ throw new CardinalityException(cols, vec.size());
+
+ if (sto.isArrayBased() && vec.getStorage().isArrayBased())
+ System.arraycopy(vec.getStorage().data(), 0, sto.data()[row], 0, cols);
+ else
+ for (int y = 0; y < cols; y++)
+ storageSet(row, y, vec.getX(y));
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector foldRows(IgniteFunction<Vector, Double> fun) {
+ int rows = rowSize();
+
+ Vector vec = likeVector(rows);
+
+ for (int i = 0; i < rows; i++)
+ vec.setX(i, fun.apply(viewRow(i)));
+
+ return vec;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector foldColumns(IgniteFunction<Vector, Double> fun) {
+ int cols = columnSize();
+
+ Vector vec = likeVector(cols);
+
+ for (int i = 0; i < cols; i++)
+ vec.setX(i, fun.apply(viewColumn(i)));
+
+ return vec;
+ }
+
+ /** {@inheritDoc} */
+ @Override public <T> T foldMap(IgniteBiFunction<T, Double, T> foldFun, IgniteDoubleFunction<Double> mapFun,
+ T zeroVal) {
+ T res = zeroVal;
+
+ int rows = rowSize();
+ int cols = columnSize();
+
+ for (int x = 0; x < rows; x++)
+ for (int y = 0; y < cols; y++)
+ res = foldFun.apply(res, mapFun.apply(storageGet(x, y)));
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int columnSize() {
+ return sto.columnSize();
+ }
+
+ /** {@inheritDoc} */
+ @Override public int rowSize() {
+ return sto.rowSize();
+ }
+
+ /** {@inheritDoc} */
+ @Override public double determinant() {
+ //TODO: This decomposition should be cached
+ LUDecomposition dec = new LUDecomposition(this);
+ double res = dec.determinant();
+ dec.destroy();
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix inverse() {
+ if (rowSize() != columnSize())
+ throw new CardinalityException(rowSize(), columnSize());
+
+ //TODO: This decomposition should be cached
+ LUDecomposition dec = new LUDecomposition(this);
+
+ Matrix res = dec.solve(likeIdentity());
+ dec.destroy();
+
+ return res;
+ }
+
+ /** */
+ protected Matrix likeIdentity() {
+ int n = rowSize();
+ Matrix res = like(n, n);
+
+ for (int i = 0; i < n; i++)
+ res.setX(i, i, 1.0);
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix divide(double d) {
+ int rows = rowSize();
+ int cols = columnSize();
+
+ for (int x = 0; x < rows; x++)
+ for (int y = 0; y < cols; y++)
+ setX(x, y, getX(x, y) / d);
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double get(int row, int col) {
+ checkIndex(row, col);
+
+ return storageGet(row, col);
+ }
+
+ /** {@inheritDoc} */
+ @Override public double getX(int row, int col) {
+ return storageGet(row, col);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix minus(Matrix mtx) {
+ int rows = rowSize();
+ int cols = columnSize();
+
+ checkCardinality(rows, cols);
+
+ Matrix res = like(rows, cols);
+
+ for (int x = 0; x < rows; x++)
+ for (int y = 0; y < cols; y++)
+ res.setX(x, y, getX(x, y) - mtx.getX(x, y));
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix plus(double x) {
+ Matrix cp = copy();
+
+ cp.map(Functions.plus(x));
+
+ return cp;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix plus(Matrix mtx) {
+ int rows = rowSize();
+ int cols = columnSize();
+
+ checkCardinality(rows, cols);
+
+ Matrix res = like(rows, cols);
+
+ for (int x = 0; x < rows; x++)
+ for (int y = 0; y < cols; y++)
+ res.setX(x, y, getX(x, y) + mtx.getX(x, y));
+
+ return res;
+
+ }
+
+ /** {@inheritDoc} */
+ @Override public IgniteUuid guid() {
+ return guid;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix set(int row, int col, double val) {
+ checkIndex(row, col);
+
+ storageSet(row, col, val);
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix setRow(int row, double[] data) {
+ checkRowIndex(row);
+
+ int cols = columnSize();
+
+ if (cols != data.length)
+ throw new CardinalityException(cols, data.length);
+
+ if (sto.isArrayBased())
+ System.arraycopy(data, 0, sto.data()[row], 0, cols);
+ else
+ for (int y = 0; y < cols; y++)
+ setX(row, y, data[y]);
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix setColumn(int col, double[] data) {
+ checkColumnIndex(col);
+
+ int rows = rowSize();
+
+ if (rows != data.length)
+ throw new CardinalityException(rows, data.length);
+
+ for (int x = 0; x < rows; x++)
+ setX(x, col, data[x]);
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix setX(int row, int col, double val) {
+ storageSet(row, col, val);
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix times(double x) {
+ Matrix cp = copy();
+
+ cp.map(Functions.mult(x));
+
+ return cp;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double maxAbsRowSumNorm() {
+ double max = 0.0;
+
+ int rows = rowSize();
+ int cols = columnSize();
+
+ for (int x = 0; x < rows; x++) {
+ double sum = 0;
+
+ for (int y = 0; y < cols; y++)
+ sum += Math.abs(getX(x, y));
+
+ if (sum > max)
+ max = sum;
+ }
+
+ return max;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector times(Vector vec) {
+ int cols = columnSize();
+
+ if (cols != vec.size())
+ throw new CardinalityException(cols, vec.size());
+
+ int rows = rowSize();
+
+ Vector res = likeVector(rows);
+
+ for (int x = 0; x < rows; x++)
+ res.setX(x, vec.dot(viewRow(x)));
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix times(Matrix mtx) {
+ int cols = columnSize();
+
+ if (cols != mtx.rowSize())
+ throw new CardinalityException(cols, mtx.rowSize());
+
+ int rows = rowSize();
+
+ int mtxCols = mtx.columnSize();
+
+ Matrix res = like(rows, mtxCols);
+
+ for (int x = 0; x < rows; x++)
+ for (int y = 0; y < mtxCols; y++) {
+ double sum = 0.0;
+
+ for (int k = 0; k < cols; k++)
+ sum += getX(x, k) * mtx.getX(k, y);
+
+ res.setX(x, y, sum);
+ }
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double sum() {
+ int rows = rowSize();
+ int cols = columnSize();
+
+ double sum = 0.0;
+
+ for (int x = 0; x < rows; x++)
+ for (int y = 0; y < cols; y++)
+ sum += getX(x, y);
+
+ return sum;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix transpose() {
+ int rows = rowSize();
+ int cols = columnSize();
+
+ Matrix mtx = like(cols, rows);
+
+ for (int x = 0; x < rows; x++)
+ for (int y = 0; y < cols; y++)
+ mtx.setX(y, x, getX(x, y));
+
+ return mtx;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean density(double threshold) {
+ assert threshold >= 0.0 && threshold <= 1.0;
+
+ int n = MIN_SAMPLES;
+ int rows = rowSize();
+ int cols = columnSize();
+
+ double mean = 0.0;
+ double pq = threshold * (1 - threshold);
+
+ Random rnd = new Random();
+
+ for (int i = 0; i < MIN_SAMPLES; i++)
+ if (getX(rnd.nextInt(rows), rnd.nextInt(cols)) != 0.0)
+ mean++;
+
+ mean /= MIN_SAMPLES;
+
+ double iv = Z80 * Math.sqrt(pq / n);
+
+ if (mean < threshold - iv)
+ return false; // Sparse.
+ else if (mean > threshold + iv)
+ return true; // Dense.
+
+ while (n < MAX_SAMPLES) {
+ // Determine upper bound we may need for 'n' to likely relinquish the uncertainty.
+ // Here, we use confidence interval formula but solved for 'n'.
+ double ivX = Math.max(Math.abs(threshold - mean), 1e-11);
+
+ double stdErr = ivX / Z80;
+ double nX = Math.min(Math.max((int)Math.ceil(pq / (stdErr * stdErr)), n), MAX_SAMPLES) - n;
+
+ if (nX < 1.0) // IMPL NOTE this can happen with threshold 1.0
+ nX = 1.0;
+
+ double meanNext = 0.0;
+
+ for (int i = 0; i < nX; i++)
+ if (getX(rnd.nextInt(rows), rnd.nextInt(cols)) != 0.0)
+ meanNext++;
+
+ mean = (n * mean + meanNext) / (n + nX);
+
+ n += nX;
+
+ // Are we good now?
+ iv = Z80 * Math.sqrt(pq / n);
+
+ if (mean < threshold - iv)
+ return false; // Sparse.
+ else if (mean > threshold + iv)
+ return true; // Dense.
+ }
+
+ return mean > threshold; // Dense if mean > threshold.
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix viewPart(int[] off, int[] size) {
+ return new MatrixView(this, off[0], off[1], size[0], size[1]);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix viewPart(int rowOff, int rows, int colOff, int cols) {
+ return viewPart(new int[] {rowOff, colOff}, new int[] {rows, cols});
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector viewRow(int row) {
+ return new MatrixVectorView(this, row, 0, 0, 1);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector viewColumn(int col) {
+ return new MatrixVectorView(this, 0, col, 1, 0);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector viewDiagonal() {
+ return new MatrixVectorView(this, 0, 0, 1, 1);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix copy() {
+ Matrix cp = like(rowSize(), columnSize());
+
+ cp.assign(this);
+
+ return cp;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ int res = 1;
+
+ res = res * 37 + guid.hashCode();
+ res = res * 37 + sto.hashCode();
+ res = res * 37 + meta.hashCode();
+
+ return res;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * We ignore guid's for comparisons.
+ */
+ @Override public boolean equals(Object o) {
+ if (this == o)
+ return true;
+
+ if (o == null || getClass() != o.getClass())
+ return false;
+
+ AbstractMatrix that = (AbstractMatrix)o;
+
+ MatrixStorage sto = getStorage();
+
+ return (sto != null ? sto.equals(that.getStorage()) : that.getStorage() == null);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/CacheMatrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/CacheMatrix.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/CacheMatrix.java
new file mode 100644
index 0000000..73a3493
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/CacheMatrix.java
@@ -0,0 +1,158 @@
+/*
+ * 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.ignite.ml.math.impls.matrix;
+
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.MatrixKeyMapper;
+import org.apache.ignite.ml.math.ValueMapper;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.functions.IgniteDoubleFunction;
+import org.apache.ignite.ml.math.functions.IgniteFunction;
+import org.apache.ignite.ml.math.impls.CacheUtils;
+import org.apache.ignite.ml.math.impls.storage.matrix.CacheMatrixStorage;
+
+/**
+ * Matrix based on existing cache and key and value mapping functions.
+ */
+public class CacheMatrix<K, V> extends AbstractMatrix {
+ /**
+ *
+ */
+ public CacheMatrix() {
+ // No-op.
+ }
+
+ /**
+ * Creates new matrix over existing cache.
+ *
+ * @param rows
+ * @param cols
+ * @param cache
+ * @param keyMapper
+ * @param valMapper
+ */
+ public CacheMatrix(
+ int rows,
+ int cols,
+ IgniteCache<K, V> cache,
+ MatrixKeyMapper<K> keyMapper,
+ ValueMapper<V> valMapper) {
+ assert rows > 0;
+ assert cols > 0;
+ assert cache != null;
+ assert keyMapper != null;
+ assert valMapper != null;
+
+ setStorage(new CacheMatrixStorage<>(rows, cols, cache, keyMapper, valMapper));
+ }
+
+ /**
+ *
+ *
+ */
+ @SuppressWarnings({"unchecked"})
+ private CacheMatrixStorage<K, V> storage() {
+ return (CacheMatrixStorage<K, V>)getStorage();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix copy() {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix like(int rows, int cols) {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector likeVector(int crd) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Return the same matrix with updates values (broken contract).
+ *
+ * @param d
+ */
+ @Override public Matrix divide(double d) {
+ return mapOverValues((Double v) -> v / d);
+ }
+
+ /**
+ * Return the same matrix with updates values (broken contract).
+ *
+ * @param x
+ */
+ @Override public Matrix plus(double x) {
+ return mapOverValues((Double v) -> v + x);
+ }
+
+ /**
+ * Return the same matrix with updates values (broken contract).
+ *
+ * @param x
+ */
+ @Override public Matrix times(double x) {
+ return mapOverValues((Double v) -> v * x);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix assign(double val) {
+ return mapOverValues((Double v) -> val);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix map(IgniteDoubleFunction<Double> fun) {
+ return mapOverValues(fun::apply);
+ }
+
+ /** {@inheritDoc} */
+ @Override public double sum() {
+ CacheMatrixStorage<K, V> sto = storage();
+
+ return CacheUtils.sum(sto.cache().getName(), sto.keyMapper(), sto.valueMapper());
+ }
+
+ /** {@inheritDoc} */
+ @Override public double maxValue() {
+ CacheMatrixStorage<K, V> sto = storage();
+
+ return CacheUtils.max(sto.cache().getName(), sto.keyMapper(), sto.valueMapper());
+ }
+
+ /** {@inheritDoc} */
+ @Override public double minValue() {
+ CacheMatrixStorage<K, V> sto = storage();
+
+ return CacheUtils.min(sto.cache().getName(), sto.keyMapper(), sto.valueMapper());
+ }
+
+ /**
+ * @param mapper
+ */
+ private Matrix mapOverValues(IgniteFunction<Double, Double> mapper) {
+ CacheMatrixStorage<K, V> sto = storage();
+
+ CacheUtils.map(sto.cache().getName(), sto.keyMapper(), sto.valueMapper(), mapper);
+
+ return this;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/DenseLocalOffHeapMatrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/DenseLocalOffHeapMatrix.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/DenseLocalOffHeapMatrix.java
new file mode 100644
index 0000000..4161228
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/DenseLocalOffHeapMatrix.java
@@ -0,0 +1,90 @@
+/*
+ * 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.ignite.ml.math.impls.matrix;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.impls.storage.matrix.DenseOffHeapMatrixStorage;
+import org.apache.ignite.ml.math.impls.vector.DenseLocalOffHeapVector;
+
+/**
+ * Dense local off-heap implementation of the {@link Matrix} interface.
+ */
+public class DenseLocalOffHeapMatrix extends AbstractMatrix {
+ /** */
+ public DenseLocalOffHeapMatrix() {
+ // No-op.
+ }
+
+ /**
+ * @param data Backing data array.
+ */
+ public DenseLocalOffHeapMatrix(double[][] data) {
+ assert data != null;
+
+ setStorage(new DenseOffHeapMatrixStorage(data));
+ }
+
+ /**
+ * @param rows Amount of rows in matrix.
+ * @param cols Amount of columns in matrix.
+ */
+ public DenseLocalOffHeapMatrix(int rows, int cols) {
+ assert rows > 0;
+ assert cols > 0;
+
+ setStorage(new DenseOffHeapMatrixStorage(rows, cols));
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix copy() {
+ DenseLocalOffHeapMatrix cp = new DenseLocalOffHeapMatrix(getStorage().rowSize(), getStorage().columnSize());
+
+ cp.assign(this);
+
+ return cp;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix like(int rows, int cols) {
+ return new DenseLocalOffHeapMatrix(rows, cols);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector likeVector(int crd) {
+ return new DenseLocalOffHeapVector(crd);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void destroy() {
+ getStorage().destroy();
+ }
+
+ /** {@inheritDoc} */
+ @Override protected Matrix likeIdentity() {
+ int n = rowSize();
+ Matrix res = like(n, n);
+
+ // IMPL NOTE as opposed to on-heap matrices this one isn't initialized with zeroes
+ for (int i = 0; i < n; i++)
+ for (int j = 0; j < n; j++)
+ res.setX(i, j, i == j ? 1.0 : 0.0);
+
+ return res;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/DenseLocalOnHeapMatrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/DenseLocalOnHeapMatrix.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/DenseLocalOnHeapMatrix.java
new file mode 100644
index 0000000..f95e0cc
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/DenseLocalOnHeapMatrix.java
@@ -0,0 +1,86 @@
+/*
+ * 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.ignite.ml.math.impls.matrix;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.impls.storage.matrix.ArrayMatrixStorage;
+import org.apache.ignite.ml.math.impls.vector.DenseLocalOnHeapVector;
+
+/**
+ * Basic implementation for matrix.
+ *
+ * This is a trivial implementation for matrix assuming dense logic, local on-heap JVM storage
+ * based on <code>double[][]</code> array. It is only suitable for data sets where
+ * local, non-distributed execution is satisfactory and on-heap JVM storage is enough
+ * to keep the entire data set.
+ */
+public class DenseLocalOnHeapMatrix extends AbstractMatrix {
+ /**
+ *
+ */
+ public DenseLocalOnHeapMatrix() {
+ // No-op.
+ }
+
+ /**
+ * @param rows Amount of rows in matrix.
+ * @param cols Amount of columns in matrix.
+ */
+ public DenseLocalOnHeapMatrix(int rows, int cols) {
+ assert rows > 0;
+ assert cols > 0;
+
+ setStorage(new ArrayMatrixStorage(rows, cols));
+ }
+
+ /**
+ * @param mtx Backing data array.
+ */
+ public DenseLocalOnHeapMatrix(double[][] mtx) {
+ assert mtx != null;
+
+ setStorage(new ArrayMatrixStorage(mtx));
+ }
+
+ /**
+ * @param orig Original matrix.
+ */
+ private DenseLocalOnHeapMatrix(DenseLocalOnHeapMatrix orig) {
+ assert orig != null;
+
+ setStorage(new ArrayMatrixStorage(orig.rowSize(), orig.columnSize()));
+
+ assign(orig);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix copy() {
+ return new DenseLocalOnHeapMatrix(this);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix like(int rows, int cols) {
+ return new DenseLocalOnHeapMatrix(rows, cols);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector likeVector(int crd) {
+ return new DenseLocalOnHeapVector(crd);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/DiagonalMatrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/DiagonalMatrix.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/DiagonalMatrix.java
new file mode 100644
index 0000000..bd9a4a1
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/DiagonalMatrix.java
@@ -0,0 +1,101 @@
+/*
+ * 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.ignite.ml.math.impls.matrix;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.impls.storage.matrix.DiagonalMatrixStorage;
+import org.apache.ignite.ml.math.impls.vector.ConstantVector;
+import org.apache.ignite.ml.math.impls.vector.DenseLocalOnHeapVector;
+import org.apache.ignite.ml.math.impls.vector.SingleElementVectorView;
+
+/**
+ * Implementation of diagonal view of the {@link Matrix}.
+ *
+ * <p>See also: <a href="https://en.wikipedia.org/wiki/Diagonal_matrix">Wikipedia article</a>.</p>
+ */
+public class DiagonalMatrix extends AbstractMatrix {
+ /**
+ *
+ */
+ public DiagonalMatrix() {
+ // No-op.
+ }
+
+ /**
+ * @param diagonal Backing {@link Vector}.
+ */
+ public DiagonalMatrix(Vector diagonal) {
+ super(new DiagonalMatrixStorage(diagonal));
+ }
+
+ /**
+ * @param mtx Backing {@link Matrix}.
+ */
+ public DiagonalMatrix(Matrix mtx) {
+ super(new DiagonalMatrixStorage(mtx == null ? null : mtx.viewDiagonal()));
+ }
+
+ /**
+ * @param vals Backing array of values at diagonal.
+ */
+ public DiagonalMatrix(double[] vals) {
+ super(new DiagonalMatrixStorage(new DenseLocalOnHeapVector(vals)));
+ }
+
+ /**
+ *
+ *
+ */
+ private DiagonalMatrixStorage storage() {
+ return (DiagonalMatrixStorage)getStorage();
+ }
+
+ /**
+ * @param size Size of diagonal.
+ * @param val Constant value at diagonal.
+ */
+ public DiagonalMatrix(int size, double val) {
+ super(new DiagonalMatrixStorage(new ConstantVector(size, val)));
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector viewRow(int row) {
+ return new SingleElementVectorView(storage().diagonal(), row);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector viewColumn(int col) {
+ return new SingleElementVectorView(storage().diagonal(), col);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix copy() {
+ return new DiagonalMatrix(storage().diagonal());
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix like(int rows, int cols) {
+ return storage().diagonal().likeMatrix(rows, cols);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector likeVector(int crd) {
+ return storage().diagonal().like(crd);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/FunctionMatrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/FunctionMatrix.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/FunctionMatrix.java
new file mode 100644
index 0000000..020d50a
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/FunctionMatrix.java
@@ -0,0 +1,95 @@
+/*
+ * 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.ignite.ml.math.impls.matrix;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.functions.IntIntDoubleToVoidFunction;
+import org.apache.ignite.ml.math.functions.IntIntToDoubleFunction;
+import org.apache.ignite.ml.math.impls.storage.matrix.FunctionMatrixStorage;
+
+/**
+ * Implementation of {@link Matrix} that maps row and column index to {@link java.util.function} interfaces.
+ */
+public class FunctionMatrix extends AbstractMatrix {
+ /**
+ *
+ */
+ public FunctionMatrix() {
+ // No-op.
+ }
+
+ /**
+ * Creates read-write or read-only function matrix.
+ *
+ * @param rows Amount of rows in the matrix.
+ * @param cols Amount of columns in the matrix.
+ * @param getFunc Function that returns value corresponding to given row and column index.
+ * @param setFunc Set function. If {@code null} - this will be a read-only matrix.
+ */
+ public FunctionMatrix(int rows, int cols, IntIntToDoubleFunction getFunc, IntIntDoubleToVoidFunction setFunc) {
+ assert rows > 0;
+ assert cols > 0;
+ assert getFunc != null;
+
+ setStorage(new FunctionMatrixStorage(rows, cols, getFunc, setFunc));
+ }
+
+ /**
+ * Creates read-only function matrix.
+ *
+ * @param rows Amount of rows in the matrix.
+ * @param cols Amount of columns in the matrix.
+ * @param getFunc Function that returns value corresponding to given row and column index.
+ */
+ public FunctionMatrix(int rows, int cols, IntIntToDoubleFunction getFunc) {
+ assert rows > 0;
+ assert cols > 0;
+ assert getFunc != null;
+
+ setStorage(new FunctionMatrixStorage(rows, cols, getFunc));
+ }
+
+ /**
+ *
+ *
+ */
+ private FunctionMatrixStorage storage() {
+ return (FunctionMatrixStorage)getStorage();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix copy() {
+ FunctionMatrixStorage sto = storage();
+
+ return new FunctionMatrix(sto.rowSize(), sto.columnSize(), sto.getFunction(), sto.setFunction());
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix like(int rows, int cols) {
+ FunctionMatrixStorage sto = storage();
+
+ return new FunctionMatrix(rows, cols, sto.getFunction(), sto.setFunction());
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector likeVector(int crd) {
+ throw new UnsupportedOperationException();
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/MatrixView.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/MatrixView.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/MatrixView.java
new file mode 100644
index 0000000..89b031e
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/MatrixView.java
@@ -0,0 +1,84 @@
+/*
+ * 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.ignite.ml.math.impls.matrix;
+
+import java.io.Externalizable;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.MatrixStorage;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.impls.storage.matrix.MatrixDelegateStorage;
+
+/**
+ * Implements the rectangular view into the parent {@link Matrix}.
+ */
+public class MatrixView extends AbstractMatrix {
+ /**
+ * Constructor for {@link Externalizable} interface.
+ */
+ public MatrixView() {
+ // No-op.
+ }
+
+ /**
+ * @param parent Backing parent {@link Matrix}.
+ * @param rowOff Row offset to parent matrix.
+ * @param colOff Column offset to parent matrix.
+ * @param rows Amount of rows in the view.
+ * @param cols Amount of columns in the view.
+ */
+ public MatrixView(Matrix parent, int rowOff, int colOff, int rows, int cols) {
+ this(parent == null ? null : parent.getStorage(), rowOff, colOff, rows, cols);
+ }
+
+ /**
+ * @param sto Backing parent {@link MatrixStorage}.
+ * @param rowOff Row offset to parent storage.
+ * @param colOff Column offset to parent storage.
+ * @param rows Amount of rows in the view.
+ * @param cols Amount of columns in the view.
+ */
+ public MatrixView(MatrixStorage sto, int rowOff, int colOff, int rows, int cols) {
+ super(new MatrixDelegateStorage(sto, rowOff, colOff, rows, cols));
+ }
+
+ /**
+ *
+ *
+ */
+ private MatrixDelegateStorage storage() {
+ return (MatrixDelegateStorage)getStorage();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix copy() {
+ MatrixDelegateStorage sto = storage();
+
+ return new MatrixView(sto.delegate(), sto.rowOffset(), sto.columnOffset(), sto.rowSize(), sto.columnSize());
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix like(int rows, int cols) {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector likeVector(int crd) {
+ throw new UnsupportedOperationException();
+ }
+}
[12/67] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math
module to Ignite ML module added missed licenses renamed packages fixed wrong
ml profile activation (cherry picked from commit d78e071)
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/AbstractVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/AbstractVector.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/AbstractVector.java
new file mode 100644
index 0000000..3c075f4
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/AbstractVector.java
@@ -0,0 +1,903 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Spliterator;
+import java.util.function.Consumer;
+import java.util.function.IntToDoubleFunction;
+import org.apache.ignite.lang.IgniteUuid;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.VectorStorage;
+import org.apache.ignite.ml.math.exceptions.CardinalityException;
+import org.apache.ignite.ml.math.exceptions.IndexException;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.functions.Functions;
+import org.apache.ignite.ml.math.functions.IgniteBiFunction;
+import org.apache.ignite.ml.math.functions.IgniteDoubleFunction;
+import org.apache.ignite.ml.math.impls.matrix.MatrixView;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * This class provides a helper implementation of the {@link Vector}
+ * interface to minimize the effort required to implement it.
+ * Subclasses may override some of the implemented methods if a more
+ * specific or optimized implementation is desirable.
+ */
+public abstract class AbstractVector implements Vector {
+ /** Vector storage implementation. */
+ private VectorStorage sto;
+
+ /** Meta attribute storage. */
+ private Map<String, Object> meta = new HashMap<>();
+
+ /** Vector's GUID. */
+ private IgniteUuid guid = IgniteUuid.randomUuid();
+
+ /** Cached value for length squared. */
+ private double lenSq = 0.0;
+
+ /** Maximum cached element. */
+ private Element maxElm = null;
+ /** Minimum cached element. */
+ private Element minElm = null;
+
+ /** Readonly flag (false by default). */
+ private boolean readOnly = false;
+
+ /** Read-only error message. */
+ private static final String RO_MSG = "Vector is read-only.";
+
+ /**
+ *
+ */
+ private void ensureReadOnly() {
+ if (readOnly)
+ throw new UnsupportedOperationException(RO_MSG);
+ }
+
+ /**
+ * @param sto Storage.
+ */
+ public AbstractVector(VectorStorage sto) {
+ this(false, sto);
+ }
+
+ /**
+ * @param readOnly Is read only.
+ * @param sto Storage.
+ */
+ public AbstractVector(boolean readOnly, VectorStorage sto) {
+ assert sto != null;
+
+ this.readOnly = readOnly;
+ this.sto = sto;
+ }
+
+ /**
+ *
+ */
+ public AbstractVector() {
+ // No-op.
+ }
+
+ /**
+ * Set storage.
+ *
+ * @param sto Storage.
+ */
+ protected void setStorage(VectorStorage sto) {
+ this.sto = sto;
+ }
+
+ /**
+ * @param i Index.
+ * @param v Value.
+ */
+ protected void storageSet(int i, double v) {
+ ensureReadOnly();
+
+ sto.set(i, v);
+
+ // Reset cached values.
+ lenSq = 0.0;
+ maxElm = minElm = null;
+ }
+
+ /**
+ * @param i Index.
+ * @return Value.
+ */
+ protected double storageGet(int i) {
+ return sto.get(i);
+ }
+
+ /** {@inheritDoc} */
+ @Override public int size() {
+ return sto.size();
+ }
+
+ /**
+ * Check index bounds.
+ *
+ * @param idx Index to check.
+ */
+ protected void checkIndex(int idx) {
+ if (idx < 0 || idx >= sto.size())
+ throw new IndexException(idx);
+ }
+
+ /** {@inheritDoc} */
+ @Override public double get(int idx) {
+ checkIndex(idx);
+
+ return storageGet(idx);
+ }
+
+ /** {@inheritDoc} */
+ @Override public double getX(int idx) {
+ return storageGet(idx);
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isArrayBased() {
+ return sto.isArrayBased();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector sort() {
+ if (isArrayBased())
+ Arrays.parallelSort(sto.data());
+ else
+ throw new UnsupportedOperationException();
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector map(IgniteDoubleFunction<Double> fun) {
+ if (sto.isArrayBased()) {
+ double[] data = sto.data();
+
+ Arrays.setAll(data, (idx) -> fun.apply(data[idx]));
+ }
+ else {
+ int len = size();
+
+ for (int i = 0; i < len; i++)
+ storageSet(i, fun.apply(storageGet(i)));
+ }
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector map(Vector vec, IgniteBiFunction<Double, Double, Double> fun) {
+ checkCardinality(vec);
+
+ int len = size();
+
+ for (int i = 0; i < len; i++)
+ storageSet(i, fun.apply(storageGet(i), vec.get(i)));
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector map(IgniteBiFunction<Double, Double, Double> fun, double y) {
+ int len = size();
+
+ for (int i = 0; i < len; i++)
+ storageSet(i, fun.apply(storageGet(i), y));
+
+ return this;
+ }
+
+ /**
+ * @param idx Index.
+ * @return Value.
+ */
+ protected Element makeElement(int idx) {
+ checkIndex(idx);
+
+ return new Element() {
+ /** {@inheritDoc} */
+ @Override public double get() {
+ return storageGet(idx);
+ }
+
+ /** {@inheritDoc} */
+ @Override public int index() {
+ return idx;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void set(double val) {
+ storageSet(idx, val);
+ }
+ };
+ }
+
+ /** {@inheritDoc} */
+ @Override public Element minElement() {
+ if (minElm == null) {
+ int minIdx = 0;
+ int len = size();
+
+ for (int i = 0; i < len; i++)
+ if (storageGet(i) < storageGet(minIdx))
+ minIdx = i;
+
+ minElm = makeElement(minIdx);
+ }
+
+ return minElm;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Element maxElement() {
+ if (maxElm == null) {
+ int maxIdx = 0;
+ int len = size();
+
+ for (int i = 0; i < len; i++)
+ if (storageGet(i) > storageGet(maxIdx))
+ maxIdx = i;
+
+ maxElm = makeElement(maxIdx);
+ }
+
+ return maxElm;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double minValue() {
+ return minElement().get();
+ }
+
+ /** {@inheritDoc} */
+ @Override public double maxValue() {
+ return maxElement().get();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector set(int idx, double val) {
+ checkIndex(idx);
+
+ storageSet(idx, val);
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector setX(int idx, double val) {
+ storageSet(idx, val);
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector increment(int idx, double val) {
+ checkIndex(idx);
+
+ storageSet(idx, storageGet(idx) + val);
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector incrementX(int idx, double val) {
+ storageSet(idx, storageGet(idx) + val);
+
+ return this;
+ }
+
+ /**
+ * Tests if given value is considered a zero value.
+ *
+ * @param val Value to check.
+ */
+ protected boolean isZero(double val) {
+ return val == 0.0;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double sum() {
+ double sum = 0;
+ int len = size();
+
+ for (int i = 0; i < len; i++)
+ sum += storageGet(i);
+
+ return sum;
+ }
+
+ /** {@inheritDoc} */
+ @Override public IgniteUuid guid() {
+ return guid;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Iterable<Element> all() {
+ return new Iterable<Element>() {
+ private int idx = 0;
+
+ /** {@inheritDoc} */
+ @NotNull
+ @Override public Iterator<Element> iterator() {
+ return new Iterator<Element>() {
+ /** {@inheritDoc} */
+ @Override public boolean hasNext() {
+ return size() > 0 && idx < size();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Element next() {
+ if (hasNext())
+ return getElement(idx++);
+
+ throw new NoSuchElementException();
+ }
+ };
+ }
+ };
+ }
+
+ /** {@inheritDoc} */
+ @Override public int nonZeroElements() {
+ int cnt = 0;
+
+ for (Element ignored : nonZeroes())
+ cnt++;
+
+ return cnt;
+ }
+
+ /** {@inheritDoc} */
+ @Override public <T> T foldMap(IgniteBiFunction<T, Double, T> foldFun, IgniteDoubleFunction<Double> mapFun,
+ T zeroVal) {
+ T res = zeroVal;
+ int len = size();
+
+ for (int i = 0; i < len; i++)
+ res = foldFun.apply(res, mapFun.apply(storageGet(i)));
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public <T> T foldMap(Vector vec, IgniteBiFunction<T, Double, T> foldFun,
+ IgniteBiFunction<Double, Double, Double> combFun, T zeroVal) {
+ checkCardinality(vec);
+
+ T res = zeroVal;
+ int len = size();
+
+ for (int i = 0; i < len; i++)
+ res = foldFun.apply(res, combFun.apply(storageGet(i), vec.getX(i)));
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Iterable<Element> nonZeroes() {
+ return new Iterable<Element>() {
+ private int idx = 0;
+ private int idxNext = -1;
+
+ /** {@inheritDoc} */
+ @NotNull
+ @Override public Iterator<Element> iterator() {
+ return new Iterator<Element>() {
+ @Override public boolean hasNext() {
+ findNext();
+
+ return !over();
+ }
+
+ @Override public Element next() {
+ if (hasNext()) {
+ idx = idxNext;
+
+ return getElement(idxNext);
+ }
+
+ throw new NoSuchElementException();
+ }
+
+ private void findNext() {
+ if (over())
+ return;
+
+ if (idxNextInitialized() && idx != idxNext)
+ return;
+
+ if (idxNextInitialized())
+ idx = idxNext + 1;
+
+ while (idx < size() && isZero(get(idx)))
+ idx++;
+
+ idxNext = idx++;
+ }
+
+ private boolean over() {
+ return idxNext >= size();
+ }
+
+ private boolean idxNextInitialized() {
+ return idxNext != -1;
+ }
+ };
+ }
+ };
+ }
+
+ /** {@inheritDoc} */
+ @Override public Map<String, Object> getMetaStorage() {
+ return meta;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector assign(double val) {
+ if (sto.isArrayBased()) {
+ ensureReadOnly();
+
+ Arrays.fill(sto.data(), val);
+ }
+ else {
+ int len = size();
+
+ for (int i = 0; i < len; i++)
+ storageSet(i, val);
+ }
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector assign(double[] vals) {
+ checkCardinality(vals);
+
+ if (sto.isArrayBased()) {
+ ensureReadOnly();
+
+ System.arraycopy(vals, 0, sto.data(), 0, vals.length);
+
+ lenSq = 0.0;
+ }
+ else {
+ int len = size();
+
+ for (int i = 0; i < len; i++)
+ storageSet(i, vals[i]);
+ }
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector assign(Vector vec) {
+ checkCardinality(vec);
+
+ for (Vector.Element x : vec.all())
+ storageSet(x.index(), x.get());
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector assign(IntToDoubleFunction fun) {
+ assert fun != null;
+
+ if (sto.isArrayBased()) {
+ ensureReadOnly();
+
+ Arrays.setAll(sto.data(), fun);
+ }
+ else {
+ int len = size();
+
+ for (int i = 0; i < len; i++)
+ storageSet(i, fun.applyAsDouble(i));
+ }
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Spliterator<Double> allSpliterator() {
+ return new Spliterator<Double>() {
+ /** {@inheritDoc} */
+ @Override public boolean tryAdvance(Consumer<? super Double> act) {
+ int len = size();
+
+ for (int i = 0; i < len; i++)
+ act.accept(storageGet(i));
+
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Spliterator<Double> trySplit() {
+ return null; // No Splitting.
+ }
+
+ /** {@inheritDoc} */
+ @Override public long estimateSize() {
+ return size();
+ }
+
+ /** {@inheritDoc} */
+ @Override public int characteristics() {
+ return ORDERED | SIZED;
+ }
+ };
+ }
+
+ /** {@inheritDoc} */
+ @Override public Spliterator<Double> nonZeroSpliterator() {
+ return new Spliterator<Double>() {
+ /** {@inheritDoc} */
+ @Override public boolean tryAdvance(Consumer<? super Double> act) {
+ int len = size();
+
+ for (int i = 0; i < len; i++) {
+ double val = storageGet(i);
+
+ if (!isZero(val))
+ act.accept(val);
+ }
+
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Spliterator<Double> trySplit() {
+ return null; // No Splitting.
+ }
+
+ /** {@inheritDoc} */
+ @Override public long estimateSize() {
+ return nonZeroElements();
+ }
+
+ /** {@inheritDoc} */
+ @Override public int characteristics() {
+ return ORDERED | SIZED;
+ }
+ };
+ }
+
+ /** {@inheritDoc} */
+ @Override public double dot(Vector vec) {
+ checkCardinality(vec);
+
+ double sum = 0.0;
+ int len = size();
+
+ for (int i = 0; i < len; i++)
+ sum += storageGet(i) * vec.getX(i);
+
+ return sum;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double getLengthSquared() {
+ if (lenSq == 0.0)
+ lenSq = dotSelf();
+
+ return lenSq;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDense() {
+ return sto.isDense();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isSequentialAccess() {
+ return sto.isSequentialAccess();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isRandomAccess() {
+ return sto.isRandomAccess();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDistributed() {
+ return sto.isDistributed();
+ }
+
+ /** {@inheritDoc} */
+ @Override public VectorStorage getStorage() {
+ return sto;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector viewPart(int off, int len) {
+ return new VectorView(this, off, len);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix cross(Vector vec) {
+ Matrix res = likeMatrix(size(), vec.size());
+
+ if (res == null)
+ return null;
+
+ for (Element e : nonZeroes()) {
+ int row = e.index();
+
+ res.assignRow(row, vec.times(getX(row)));
+ }
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix toMatrix(boolean rowLike) {
+ Matrix res = likeMatrix(rowLike ? 1 : size(), rowLike ? size() : 1);
+
+ if (res == null)
+ return null;
+
+ if (rowLike)
+ res.assignRow(0, this);
+ else
+ res.assignColumn(0, this);
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix toMatrixPlusOne(boolean rowLike, double zeroVal) {
+ Matrix res = likeMatrix(rowLike ? 1 : size() + 1, rowLike ? size() + 1 : 1);
+
+ if (res == null)
+ return null;
+
+ res.set(0, 0, zeroVal);
+
+ if (rowLike)
+ new MatrixView(res, 0, 1, 1, size()).assignRow(0, this);
+ else
+ new MatrixView(res, 1, 0, size(), 1).assignColumn(0, this);
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double getDistanceSquared(Vector vec) {
+ checkCardinality(vec);
+
+ double thisLenSq = getLengthSquared();
+ double thatLenSq = vec.getLengthSquared();
+ double dot = dot(vec);
+ double distEst = thisLenSq + thatLenSq - 2 * dot;
+
+ if (distEst > 1.0e-3 * (thisLenSq + thatLenSq))
+ // The vectors are far enough from each other that the formula is accurate.
+ return Math.max(distEst, 0);
+ else
+ return foldMap(vec, Functions.PLUS, Functions.MINUS_SQUARED, 0d);
+ }
+
+ /** */
+ protected void checkCardinality(Vector vec) {
+ if (vec.size() != size())
+ throw new CardinalityException(size(), vec.size());
+ }
+
+ /** */
+ protected void checkCardinality(double[] vec) {
+ if (vec.length != size())
+ throw new CardinalityException(size(), vec.length);
+ }
+
+ /** */
+ protected void checkCardinality(int[] arr) {
+ if (arr.length != size())
+ throw new CardinalityException(size(), arr.length);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector minus(Vector vec) {
+ checkCardinality(vec);
+
+ Vector cp = copy();
+
+ return cp.map(vec, Functions.MINUS);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector plus(double x) {
+ Vector cp = copy();
+
+ return x != 0.0 ? cp.map(Functions.plus(x)) : cp;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector divide(double x) {
+ Vector cp = copy();
+
+ if (x != 1.0)
+ for (Element element : cp.all())
+ element.set(element.get() / x);
+
+ return cp;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector times(double x) {
+ if (x == 0.0)
+ return like(size());
+ else
+ return copy().map(Functions.mult(x));
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector times(Vector vec) {
+ checkCardinality(vec);
+
+ return copy().map(vec, Functions.MULT);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector plus(Vector vec) {
+ checkCardinality(vec);
+
+ Vector cp = copy();
+
+ return cp.map(vec, Functions.PLUS);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector logNormalize() {
+ return logNormalize(2.0, Math.sqrt(getLengthSquared()));
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector logNormalize(double power) {
+ return logNormalize(power, kNorm(power));
+ }
+
+ /**
+ * @param power Power.
+ * @param normLen Normalized length.
+ * @return logNormalized value.
+ */
+ private Vector logNormalize(double power, double normLen) {
+ assert !(Double.isInfinite(power) || power <= 1.0);
+
+ double denominator = normLen * Math.log(power);
+
+ Vector cp = copy();
+
+ for (Element element : cp.all())
+ element.set(Math.log1p(element.get()) / denominator);
+
+ return cp;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double kNorm(double power) {
+ assert power >= 0.0;
+
+ // Special cases.
+ if (Double.isInfinite(power))
+ return foldMap(Math::max, Math::abs, 0d);
+ else if (power == 2.0)
+ return Math.sqrt(getLengthSquared());
+ else if (power == 1.0)
+ return foldMap(Functions.PLUS, Math::abs, 0d);
+ else if (power == 0.0)
+ return nonZeroElements();
+ else
+ // Default case.
+ return Math.pow(foldMap(Functions.PLUS, Functions.pow(power), 0d), 1.0 / power);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector normalize() {
+ return divide(Math.sqrt(getLengthSquared()));
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector normalize(double power) {
+ return divide(kNorm(power));
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector copy() {
+ return like(size()).assign(this);
+ }
+
+ /**
+ * @return Result of dot with self.
+ */
+ protected double dotSelf() {
+ double sum = 0.0;
+ int len = size();
+
+ for (int i = 0; i < len; i++) {
+ double v = storageGet(i);
+
+ sum += v * v;
+ }
+
+ return sum;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Element getElement(int idx) {
+ return makeElement(idx);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeObject(sto);
+ out.writeObject(meta);
+ out.writeObject(guid);
+ out.writeBoolean(readOnly);
+ }
+
+ /** {@inheritDoc} */
+ @SuppressWarnings("unchecked")
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ sto = (VectorStorage)in.readObject();
+ meta = (Map<String, Object>)in.readObject();
+ guid = (IgniteUuid)in.readObject();
+ readOnly = in.readBoolean();
+ }
+
+ /** {@inheritDoc} */
+ @Override public void destroy() {
+ sto.destroy();
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ int res = 1;
+ res += res * 37 + guid.hashCode();
+ res += sto == null ? 0 : res * 37 + sto.hashCode();
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+
+ if (obj == null || getClass() != obj.getClass())
+ return false;
+
+ AbstractVector that = (AbstractVector)obj;
+
+ return (sto != null ? sto.equals(that.sto) : that.sto == null);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/CacheVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/CacheVector.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/CacheVector.java
new file mode 100644
index 0000000..7e23791
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/CacheVector.java
@@ -0,0 +1,140 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.ValueMapper;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.VectorKeyMapper;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.functions.IgniteBiFunction;
+import org.apache.ignite.ml.math.functions.IgniteDoubleFunction;
+import org.apache.ignite.ml.math.functions.IgniteFunction;
+import org.apache.ignite.ml.math.impls.CacheUtils;
+import org.apache.ignite.ml.math.impls.storage.vector.CacheVectorStorage;
+
+/**
+ * Vector based on existing cache and index and value mapping functions.
+ */
+public class CacheVector<K, V> extends AbstractVector {
+ /**
+ *
+ */
+ public CacheVector() {
+ // No-op.
+ }
+
+ /**
+ * Creates new vector over existing cache.
+ *
+ * @param size
+ * @param cache
+ * @param keyFunc
+ * @param valMapper
+ */
+ public CacheVector(
+ int size,
+ IgniteCache<K, V> cache,
+ VectorKeyMapper<K> keyFunc,
+ ValueMapper<V> valMapper) {
+ setStorage(new CacheVectorStorage<>(size, cache, keyFunc, valMapper));
+ }
+
+ /**
+ * @param mapper
+ */
+ private Vector mapOverCache(IgniteFunction<Double, Double> mapper) {
+ CacheVectorStorage<K, V> sto = storage();
+
+ CacheUtils.map(sto.cache().getName(), sto.keyMapper(), sto.valueMapper(), mapper);
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double minValue() {
+ CacheVectorStorage<K, V> sto = storage();
+
+ return CacheUtils.min(sto.cache().getName(), sto.keyMapper(), sto.valueMapper());
+ }
+
+ /** {@inheritDoc} */
+ @Override public double maxValue() {
+ CacheVectorStorage<K, V> sto = storage();
+
+ return CacheUtils.max(sto.cache().getName(), sto.keyMapper(), sto.valueMapper());
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector map(IgniteDoubleFunction<Double> fun) {
+ return mapOverCache(fun::apply);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector map(IgniteBiFunction<Double, Double, Double> fun, double y) {
+ // TODO: provide cache-optimized implementation.
+ return super.map(fun, y); // TODO
+ }
+
+ /** {@inheritDoc} */
+ @Override public double sum() {
+ CacheVectorStorage<K, V> sto = storage();
+
+ return CacheUtils.sum(sto.cache().getName(), sto.keyMapper(), sto.valueMapper());
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector assign(double val) {
+ return mapOverCache((Double d) -> val);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector plus(double x) {
+ return mapOverCache((Double d) -> d + x);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector divide(double x) {
+ return mapOverCache((Double d) -> d / x);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector times(double x) {
+ return mapOverCache((Double d) -> d * x);
+ }
+
+ /**
+ *
+ *
+ */
+ @SuppressWarnings({"unchecked"})
+ private CacheVectorStorage<K, V> storage() {
+ return (CacheVectorStorage<K, V>)getStorage();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector like(int crd) {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix likeMatrix(int rows, int cols) {
+ throw new UnsupportedOperationException();
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/ConstantVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/ConstantVector.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/ConstantVector.java
new file mode 100644
index 0000000..71c9c3e
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/ConstantVector.java
@@ -0,0 +1,84 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.VectorStorage;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.impls.storage.vector.ConstantVectorStorage;
+
+/**
+ * Constant value, read-only vector.
+ */
+public class ConstantVector extends AbstractReadOnlyVector {
+ /**
+ *
+ */
+ public ConstantVector() {
+ // No-op.
+ }
+
+ /**
+ * @param size
+ * @param val
+ */
+ public ConstantVector(int size, double val) {
+ super(new ConstantVectorStorage(size, val));
+ }
+
+ /**
+ *
+ *
+ */
+ private ConstantVectorStorage storage() {
+ return (ConstantVectorStorage)getStorage();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector copy() {
+ ConstantVectorStorage sto = storage();
+
+ return new ConstantVector(sto.size(), sto.constant());
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector like(int crd) {
+ return new ConstantVector(crd, storage().constant());
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix likeMatrix(int rows, int cols) {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object o) {
+ if (this == o)
+ return true;
+
+ if (o == null || getClass() != o.getClass())
+ return false;
+
+ ConstantVector that = (ConstantVector)o;
+
+ VectorStorage sto = getStorage();
+
+ return (sto != null ? sto.equals(that.getStorage()) : that.getStorage() == null);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/DelegatingVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/DelegatingVector.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/DelegatingVector.java
new file mode 100644
index 0000000..891eb8e
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/DelegatingVector.java
@@ -0,0 +1,391 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Spliterator;
+import java.util.function.IntToDoubleFunction;
+import org.apache.ignite.lang.IgniteUuid;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.VectorStorage;
+import org.apache.ignite.ml.math.functions.IgniteBiFunction;
+import org.apache.ignite.ml.math.functions.IgniteDoubleFunction;
+
+/**
+ * Convenient class that can be used to add decorations to an existing vector. Subclasses
+ * can add weights, indices, etc. while maintaining full vector functionality.
+ */
+public class DelegatingVector implements Vector {
+ /** Delegating vector. */
+ private Vector dlg;
+
+ /** Meta attribute storage. */
+ private Map<String, Object> meta = new HashMap<>();
+
+ /** GUID. */
+ private IgniteUuid guid = IgniteUuid.randomUuid();
+
+ /** */
+ public DelegatingVector() {
+ // No-op.
+ }
+
+ /**
+ * @param dlg
+ */
+ public DelegatingVector(Vector dlg) {
+ assert dlg != null;
+
+ this.dlg = dlg;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeObject(dlg);
+ out.writeObject(meta);
+ out.writeObject(guid);
+ }
+
+ /** {@inheritDoc} */
+ @SuppressWarnings("unchecked")
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ dlg = (Vector)in.readObject();
+ meta = (Map<String, Object>)in.readObject();
+ guid = (IgniteUuid)in.readObject();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Map<String, Object> getMetaStorage() {
+ return meta;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix likeMatrix(int rows, int cols) {
+ return dlg.likeMatrix(rows, cols);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix toMatrix(boolean rowLike) {
+ return dlg.toMatrix(rowLike);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix toMatrixPlusOne(boolean rowLike, double zeroVal) {
+ return dlg.toMatrixPlusOne(rowLike, zeroVal);
+ }
+
+ /** {@inheritDoc} */
+ @Override public int size() {
+ return dlg.size();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDense() {
+ return dlg.isDense();
+ }
+
+ /** {@inheritDoc} */
+ @Override public double minValue() {
+ return dlg.minValue();
+ }
+
+ /** {@inheritDoc} */
+ @Override public double maxValue() {
+ return dlg.maxValue();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isSequentialAccess() {
+ return dlg.isSequentialAccess();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isArrayBased() {
+ return dlg.isArrayBased();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector copy() {
+ return new DelegatingVector(dlg);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Iterable<Element> all() {
+ return dlg.all();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Iterable<Element> nonZeroes() {
+ return dlg.nonZeroes();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector sort() {
+ return dlg.sort();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Spliterator<Double> allSpliterator() {
+ return dlg.allSpliterator();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Spliterator<Double> nonZeroSpliterator() {
+ return dlg.nonZeroSpliterator();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Element getElement(int idx) {
+ return dlg.getElement(idx);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector assign(double val) {
+ return dlg.assign(val);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector assign(double[] vals) {
+ return dlg.assign(vals);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector assign(Vector vec) {
+ return dlg.assign(vec);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector assign(IntToDoubleFunction fun) {
+ return dlg.assign(fun);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector map(IgniteDoubleFunction<Double> fun) {
+ return dlg.map(fun);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector map(Vector vec, IgniteBiFunction<Double, Double, Double> fun) {
+ return dlg.map(vec, fun);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector map(IgniteBiFunction<Double, Double, Double> fun, double y) {
+ return dlg.map(fun, y);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector divide(double x) {
+ return dlg.divide(x);
+ }
+
+ /** {@inheritDoc} */
+ @Override public double dot(Vector vec) {
+ return dlg.dot(vec);
+ }
+
+ /** {@inheritDoc} */
+ @Override public double get(int idx) {
+ return dlg.get(idx);
+ }
+
+ /** {@inheritDoc} */
+ @Override public double getX(int idx) {
+ return dlg.getX(idx);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector like(int crd) {
+ return dlg.like(crd);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector minus(Vector vec) {
+ return dlg.minus(vec);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector normalize() {
+ return dlg.normalize();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector normalize(double power) {
+ return dlg.normalize(power);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector logNormalize() {
+ return dlg.logNormalize();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector logNormalize(double power) {
+ return dlg.logNormalize(power);
+ }
+
+ /** {@inheritDoc} */
+ @Override public double kNorm(double power) {
+ return dlg.kNorm(power);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Element minElement() {
+ return dlg.minElement();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Element maxElement() {
+ return dlg.maxElement();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector plus(double x) {
+ return dlg.plus(x);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector plus(Vector vec) {
+ return dlg.plus(vec);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector set(int idx, double val) {
+ return dlg.set(idx, val);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector setX(int idx, double val) {
+ return dlg.setX(idx, val);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector incrementX(int idx, double val) {
+ return dlg.incrementX(idx, val);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector increment(int idx, double val) {
+ return dlg.increment(idx, val);
+ }
+
+ /** {@inheritDoc} */
+ @Override public int nonZeroElements() {
+ return dlg.nonZeroElements();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector times(double x) {
+ return dlg.times(x);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector times(Vector vec) {
+ return dlg.times(vec);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector viewPart(int off, int len) {
+ return dlg.viewPart(off, len);
+ }
+
+ /** {@inheritDoc} */
+ @Override public VectorStorage getStorage() {
+ return dlg.getStorage();
+ }
+
+ /** {@inheritDoc} */
+ @Override public double sum() {
+ return dlg.sum();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix cross(Vector vec) {
+ return dlg.cross(vec);
+ }
+
+ /** {@inheritDoc} */
+ @Override public <T> T foldMap(IgniteBiFunction<T, Double, T> foldFun, IgniteDoubleFunction<Double> mapFun,
+ T zeroVal) {
+ return dlg.foldMap(foldFun, mapFun, zeroVal);
+ }
+
+ /** {@inheritDoc} */
+ @Override public <T> T foldMap(Vector vec, IgniteBiFunction<T, Double, T> foldFun,
+ IgniteBiFunction<Double, Double, Double> combFun, T zeroVal) {
+ return dlg.foldMap(vec, foldFun, combFun, zeroVal);
+ }
+
+ /** {@inheritDoc} */
+ @Override public double getLengthSquared() {
+ return dlg.getLengthSquared();
+ }
+
+ /** {@inheritDoc} */
+ @Override public double getDistanceSquared(Vector vec) {
+ return dlg.getDistanceSquared(vec);
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isRandomAccess() {
+ return dlg.isRandomAccess();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDistributed() {
+ return dlg.isDistributed();
+ }
+
+ /** {@inheritDoc} */
+ @Override public IgniteUuid guid() {
+ return guid;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void destroy() {
+ dlg.destroy();
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ int res = 1;
+
+ res = res * 37 + meta.hashCode();
+ res = res * 37 + dlg.hashCode();
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object o) {
+ if (this == o)
+ return true;
+
+ if (o == null || getClass() != o.getClass())
+ return false;
+
+ DelegatingVector that = (DelegatingVector)o;
+
+ return meta.equals(that.meta) && dlg.equals(that.dlg);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/DenseLocalOffHeapVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/DenseLocalOffHeapVector.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/DenseLocalOffHeapVector.java
new file mode 100644
index 0000000..c635572
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/DenseLocalOffHeapVector.java
@@ -0,0 +1,89 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import java.util.stream.IntStream;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOffHeapMatrix;
+import org.apache.ignite.ml.math.impls.storage.vector.DenseLocalOffHeapVectorStorage;
+
+/**
+ * Implementation for {@link Vector} assuming dense logic and local offheap JVM storage.
+ * It is suitable for data sets where local, non-distributed execution is satisfactory and on-heap JVM storage
+ * is not enough to keep the entire data set.
+ */
+public class DenseLocalOffHeapVector extends AbstractVector {
+ /** */
+ public DenseLocalOffHeapVector() {
+ // No-op.
+ }
+
+ /** */
+ private void makeOffheapStorage(int size) {
+ setStorage(new DenseLocalOffHeapVectorStorage(size));
+ }
+
+ /**
+ * @param arr Array to copy to offheap storage.
+ */
+ public DenseLocalOffHeapVector(double[] arr) {
+ makeOffheapStorage(arr.length);
+
+ assign(arr);
+ }
+
+ /**
+ * @param size Vector cardinality.
+ */
+ public DenseLocalOffHeapVector(int size) {
+ makeOffheapStorage(size);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector assign(Vector vec) {
+ checkCardinality(vec);
+
+ IntStream.range(0, size()).parallel().forEach(idx -> set(idx, vec.get(idx)));
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector times(double x) {
+ if (x == 0.0)
+ return like(size()).assign(0);
+ else
+ return super.times(x);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector like(int crd) {
+ return new DenseLocalOffHeapVector(crd);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix likeMatrix(int rows, int cols) {
+ return new DenseLocalOffHeapMatrix(rows, cols);
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object o) {
+ return o != null && getClass().equals(o.getClass()) && (getStorage().equals(((Vector)o).getStorage()));
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/DenseLocalOnHeapVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/DenseLocalOnHeapVector.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/DenseLocalOnHeapVector.java
new file mode 100644
index 0000000..c37bda0
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/DenseLocalOnHeapVector.java
@@ -0,0 +1,104 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import java.util.Map;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.VectorStorage;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
+import org.apache.ignite.ml.math.impls.storage.vector.ArrayVectorStorage;
+
+/**
+ * Basic implementation for vector.
+ * <p>
+ * This is a trivial implementation for vector assuming dense logic, local on-heap JVM storage
+ * based on {@code double[]} array. It is only suitable for data sets where
+ * local, non-distributed execution is satisfactory and on-heap JVM storage is enough
+ * to keep the entire data set.
+ */
+public class DenseLocalOnHeapVector extends AbstractVector {
+ /**
+ * @param size Vector cardinality.
+ */
+ private VectorStorage mkStorage(int size) {
+ return new ArrayVectorStorage(size);
+ }
+
+ /**
+ * @param arr Source array.
+ * @param cp {@code true} to clone array, reuse it otherwise.
+ */
+ private VectorStorage mkStorage(double[] arr, boolean cp) {
+ assert arr != null;
+
+ return new ArrayVectorStorage(cp ? arr.clone() : arr);
+ }
+
+ /**
+ * @param args Parameters for new Vector.
+ */
+ public DenseLocalOnHeapVector(Map<String, Object> args) {
+ assert args != null;
+
+ if (args.containsKey("size"))
+ setStorage(mkStorage((int)args.get("size")));
+ else if (args.containsKey("arr") && args.containsKey("copy"))
+ setStorage(mkStorage((double[])args.get("arr"), (boolean)args.get("copy")));
+ else
+ throw new UnsupportedOperationException("Invalid constructor argument(s).");
+ }
+
+ /** */
+ public DenseLocalOnHeapVector() {
+ // No-op.
+ }
+
+ /**
+ * @param size Vector cardinality.
+ */
+ public DenseLocalOnHeapVector(int size) {
+ setStorage(mkStorage(size));
+ }
+
+ /**
+ * @param arr Source array.
+ * @param shallowCp {@code true} to use shallow copy.
+ */
+ public DenseLocalOnHeapVector(double[] arr, boolean shallowCp) {
+ setStorage(mkStorage(arr, shallowCp));
+ }
+
+ /**
+ * @param arr Source array.
+ */
+ public DenseLocalOnHeapVector(double[] arr) {
+ this(arr, false);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix likeMatrix(int rows, int cols) {
+ return new DenseLocalOnHeapMatrix(rows, cols);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector like(int crd) {
+ return new DenseLocalOnHeapVector(crd);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/FunctionVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/FunctionVector.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/FunctionVector.java
new file mode 100644
index 0000000..a2ffd90
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/FunctionVector.java
@@ -0,0 +1,112 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import java.util.Map;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.functions.IgniteFunction;
+import org.apache.ignite.ml.math.functions.IntDoubleToVoidFunction;
+import org.apache.ignite.ml.math.impls.storage.vector.FunctionVectorStorage;
+
+/**
+ * Implementation of {@link Vector} that maps vector element index to {@link java.util.function} interfaces.
+ */
+public class FunctionVector extends AbstractVector {
+ /**
+ *
+ */
+ public FunctionVector() {
+ // No-op.
+ }
+
+ /**
+ * Creates read-write or read-only function vector.
+ *
+ * @param size Vector size.
+ * @param getFunc Function that returns value corresponding to given element index.
+ * @param setFunc Set function. If {@code null} - this will be a read-only vector.
+ */
+ public FunctionVector(int size, IgniteFunction<Integer, Double> getFunc, IntDoubleToVoidFunction setFunc) {
+ setStorage(new FunctionVectorStorage(size, getFunc, setFunc));
+ }
+
+ /**
+ * Creates read-only function vector.
+ *
+ * @param size Vector size.
+ * @param getFunc Function that returns value corresponding to given element index.
+ */
+ public FunctionVector(int size, IgniteFunction<Integer, Double> getFunc) {
+ setStorage(new FunctionVectorStorage(size, getFunc));
+ }
+
+ /**
+ * @param args Arguments for vector constructor.
+ */
+ public FunctionVector(Map<String, Object> args) {
+ assert args != null;
+
+ if (args.containsKey("size") && args.containsKey("getFunc") && args.containsKey("setFunc")) {
+ @SuppressWarnings("unchecked")
+ IgniteFunction<Integer, Double> getFunc = (IgniteFunction<Integer, Double>)args.get("getFunc");
+ IntDoubleToVoidFunction setFunc = (IntDoubleToVoidFunction)args.get("setFunc");
+ int size = (int)args.get("size");
+
+ setStorage(new FunctionVectorStorage(size, getFunc, setFunc));
+ }
+ else if (args.containsKey("size") && args.containsKey("getFunc")) {
+ @SuppressWarnings("unchecked")
+ IgniteFunction<Integer, Double> getFunc = (IgniteFunction<Integer, Double>)args.get("getFunc");
+ int size = (int)args.get("size");
+
+ setStorage(new FunctionVectorStorage(size, getFunc));
+ }
+ else
+ throw new UnsupportedOperationException("Invalid constructor argument(s).");
+ }
+
+ /**
+ *
+ *
+ */
+ private FunctionVectorStorage storage() {
+ return (FunctionVectorStorage)getStorage();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector like(int crd) {
+ FunctionVectorStorage sto = storage();
+
+ return new FunctionVector(crd, sto.getFunction(), sto.setFunction());
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix likeMatrix(int rows, int cols) {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector times(double x) {
+ if (x == 0.0)
+ return like(size()).assign(0);
+ else
+ return super.times(x);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/MatrixVectorView.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/MatrixVectorView.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/MatrixVectorView.java
new file mode 100644
index 0000000..723c585
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/MatrixVectorView.java
@@ -0,0 +1,139 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.IndexException;
+import org.apache.ignite.ml.math.impls.storage.vector.MatrixVectorStorage;
+
+/**
+ * Row or column vector view off the matrix.
+ */
+public class MatrixVectorView extends AbstractVector {
+ /** */ private Matrix parent;
+
+ /** */ private int row;
+ /** */ private int col;
+
+ /** */ private int rowStride;
+ /** */ private int colStride;
+
+ /**
+ *
+ */
+ public MatrixVectorView() {
+ // No-op.
+ }
+
+ /**
+ * @param parent
+ * @param row
+ * @param col
+ * @param rowStride
+ * @param colStride
+ */
+ public MatrixVectorView(Matrix parent, int row, int col, int rowStride, int colStride) {
+ assert parent != null;
+
+ if (row < 0 || row >= parent.rowSize())
+ throw new IndexException(row);
+ if (col < 0 || col >= parent.columnSize())
+ throw new IndexException(col);
+
+ this.parent = parent;
+
+ this.row = row;
+ this.col = col;
+
+ this.rowStride = rowStride;
+ this.colStride = colStride;
+
+ setStorage(new MatrixVectorStorage(parent, row, col, rowStride, colStride));
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector copy() {
+ return new MatrixVectorView(parent, row, col, rowStride, colStride);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector like(int crd) {
+ return parent.likeVector(crd);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix likeMatrix(int rows, int cols) {
+ return parent.like(rows, cols);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ super.writeExternal(out);
+
+ out.writeObject(parent);
+ out.writeInt(row);
+ out.writeInt(col);
+ out.writeInt(rowStride);
+ out.writeInt(colStride);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ super.readExternal(in);
+
+ parent = (Matrix)in.readObject();
+ row = in.readInt();
+ col = in.readInt();
+ rowStride = in.readInt();
+ colStride = in.readInt();
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ int res = 1;
+
+ res = res * 37 + (parent == null ? 0 : parent.hashCode());
+ res = res * 37 + row;
+ res = res * 37 + col;
+ res = res * 37 + rowStride;
+ res = res * 37 + colStride;
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object o) {
+ if (this == o)
+ return true;
+
+ if (o == null || getClass() != o.getClass())
+ return false;
+
+ MatrixVectorView that = (MatrixVectorView)o;
+
+ return (parent != null ? parent.equals(that.parent) : that.parent == null) &&
+ row == that.row &&
+ col == that.col &&
+ rowStride == that.rowStride &&
+ colStride == that.colStride;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/PivotedVectorView.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/PivotedVectorView.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/PivotedVectorView.java
new file mode 100644
index 0000000..607bb72
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/PivotedVectorView.java
@@ -0,0 +1,163 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.functions.Functions;
+import org.apache.ignite.ml.math.impls.storage.vector.PivotedVectorStorage;
+
+/**
+ * Pivoted (index mapped) view over another vector.
+ */
+public class PivotedVectorView extends AbstractVector {
+ /** */ private Vector vec;
+
+ /**
+ * @param vec
+ * @param pivot Mapping from external index to internal.
+ * @param unpivot Mapping from internal index to external.
+ */
+ public PivotedVectorView(Vector vec, int[] pivot, int[] unpivot) {
+ setStorage(new PivotedVectorStorage(vec.getStorage(), pivot, unpivot));
+
+ checkCardinality(pivot);
+ checkCardinality(unpivot);
+
+ this.vec = vec;
+ }
+
+ /**
+ * @param vec
+ * @param pivot
+ */
+ public PivotedVectorView(Vector vec, int[] pivot) {
+ setStorage(new PivotedVectorStorage(vec.getStorage(), pivot));
+
+ checkCardinality(pivot);
+
+ this.vec = vec;
+ }
+
+ /**
+ *
+ *
+ */
+ private PivotedVectorStorage storage() {
+ return (PivotedVectorStorage)getStorage();
+ }
+
+ /**
+ *
+ */
+ public PivotedVectorView() {
+ // No-op.
+ }
+
+ /**
+ *
+ *
+ */
+ public Vector getBaseVector() {
+ return vec;
+ }
+
+ /**
+ * @param i
+ */
+ public int pivot(int i) {
+ return storage().pivot()[i];
+ }
+
+ /**
+ * @param i
+ */
+ public int unpivot(int i) {
+ return storage().unpivot()[i];
+ }
+
+ /**
+ * @param idx
+ */
+ protected Vector.Element makeElement(int idx) {
+ checkIndex(idx);
+
+ // External index.
+ int exIdx = storage().pivot()[idx];
+
+ return new Vector.Element() {
+ /** {@inheritDoc */
+ @Override public double get() {
+ return storageGet(idx);
+ }
+
+ /** {@inheritDoc */
+ @Override public int index() {
+ return exIdx;
+ }
+
+ /** {@inheritDoc */
+ @Override public void set(double val) {
+ storageSet(idx, val);
+ }
+ };
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector copy() {
+ PivotedVectorStorage sto = storage();
+
+ return new PivotedVectorView(vec, sto.pivot(), sto.unpivot());
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector like(int crd) {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix likeMatrix(int rows, int cols) {
+ return vec.likeMatrix(rows, cols);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector times(double x) {
+ if (x == 0.0)
+ return copy().map(Functions.mult(x));
+ else
+ return super.times(x);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ super.writeExternal(out);
+
+ out.writeObject(vec);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ super.readExternal(in);
+
+ vec = (Vector)in.readObject();
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/RandomVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/RandomVector.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/RandomVector.java
new file mode 100644
index 0000000..08292eb
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/RandomVector.java
@@ -0,0 +1,129 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.Map;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.VectorStorage;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.impls.matrix.RandomMatrix;
+import org.apache.ignite.ml.math.impls.storage.vector.RandomVectorStorage;
+import org.apache.ignite.ml.math.Vector;
+
+/**
+ * Random vector. Each value is taken from {-1,0,1} with roughly equal probability. Note
+ * that by default, the value is determined by a relatively simple hash of the index.
+ */
+public class RandomVector extends AbstractReadOnlyVector {
+ /** */ private boolean fastHash;
+
+ /**
+ * @param size Vector cardinality.
+ * @param fastHash
+ */
+ private VectorStorage mkStorage(int size, boolean fastHash) {
+ this.fastHash = fastHash;
+
+ return new RandomVectorStorage(size, fastHash);
+ }
+
+ /**
+ * @param size
+ * @param fastHash
+ */
+ public RandomVector(int size, boolean fastHash) {
+ setStorage(mkStorage(size, fastHash));
+ }
+
+ /**
+ * @param size
+ */
+ public RandomVector(int size) {
+ this(size, true);
+ }
+
+ /**
+ * @param args
+ */
+ public RandomVector(Map<String, Object> args) {
+ assert args != null;
+
+ if (args.containsKey("size") && args.containsKey("fastHash"))
+ setStorage(mkStorage((int)args.get("size"), (boolean)args.get("fastHash")));
+ else if (args.containsKey("size"))
+ setStorage(mkStorage((int)args.get("size"), true));
+ else
+ throw new UnsupportedOperationException("Invalid constructor argument(s).");
+ }
+
+ /** */
+ public RandomVector() {
+ // No-op.
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector like(int crd) {
+ return new RandomVector(crd, fastHash);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix likeMatrix(int rows, int cols) {
+ return new RandomMatrix(rows, cols);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ super.writeExternal(out);
+
+ out.writeBoolean(fastHash);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ super.readExternal(in);
+
+ fastHash = in.readBoolean();
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ int res = 1;
+
+ res = res * 37 + Boolean.hashCode(fastHash);
+ res = res * 37 + getStorage().hashCode();
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object o) {
+ if (this == o)
+ return true;
+
+ if (o == null || getClass() != o.getClass())
+ return false;
+
+ RandomVector that = (RandomVector)o;
+ VectorStorage sto = getStorage();
+
+ return fastHash == that.fastHash && (sto != null ? sto.equals(that.getStorage()) : that.getStorage() == null);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SingleElementVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SingleElementVector.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SingleElementVector.java
new file mode 100644
index 0000000..cae5ca3
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SingleElementVector.java
@@ -0,0 +1,102 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import java.util.Map;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.impls.storage.vector.SingleElementVectorStorage;
+
+/**
+ * Read-write vector holding a single non-zero value at some index.
+ */
+public class SingleElementVector extends AbstractVector {
+ /**
+ *
+ */
+ public SingleElementVector() {
+ // No-op
+ }
+
+ /**
+ * @param size
+ * @param idx
+ * @param val
+ */
+ public SingleElementVector(int size, int idx, double val) {
+ super(new SingleElementVectorStorage(size, idx, val));
+ }
+
+ /**
+ * @param args
+ */
+ public SingleElementVector(Map<String, Object> args) {
+ assert args != null;
+
+ if (args.containsKey("size") && args.containsKey("index") && args.containsKey("value")) {
+ int size = (int)args.get("size");
+ int idx = (int)args.get("index");
+ double val = (double)args.get("value");
+
+ setStorage(new SingleElementVectorStorage(size, idx, val));
+ }
+ else
+ throw new UnsupportedOperationException("Invalid constructor argument(s).");
+ }
+
+ /**
+ *
+ *
+ */
+ private SingleElementVectorStorage storage() {
+ return (SingleElementVectorStorage)getStorage();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Element minElement() {
+ return makeElement(storage().index());
+ }
+
+ /** {@inheritDoc} */
+ @Override public Element maxElement() {
+ return makeElement(storage().index());
+ }
+
+ /** {@inheritDoc} */
+ @Override public double sum() {
+ return getX(storage().index());
+ }
+
+ /** {@inheritDoc} */
+ @Override public int nonZeroElements() {
+ return isZero(get(storage().index())) ? 0 : 1;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector like(int crd) {
+ int idx = storage().index();
+
+ return new SingleElementVector(crd, idx, getX(idx));
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix likeMatrix(int rows, int cols) {
+ throw new UnsupportedOperationException();
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SingleElementVectorView.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SingleElementVectorView.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SingleElementVectorView.java
new file mode 100644
index 0000000..0fb4105
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SingleElementVectorView.java
@@ -0,0 +1,97 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.functions.Functions;
+import org.apache.ignite.ml.math.impls.storage.vector.SingleElementVectorDelegateStorage;
+
+/**
+ * Single value vector view over another vector.
+ */
+public class SingleElementVectorView extends AbstractVector {
+ /**
+ *
+ */
+ public SingleElementVectorView() {
+ // No-op.
+ }
+
+ /**
+ * @param vec
+ * @param idx
+ */
+ public SingleElementVectorView(Vector vec, int idx) {
+ super(new SingleElementVectorDelegateStorage(vec, idx));
+ }
+
+ /**
+ *
+ *
+ */
+ private SingleElementVectorDelegateStorage storage() {
+ return (SingleElementVectorDelegateStorage)getStorage();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector.Element minElement() {
+ return makeElement(storage().index());
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector.Element maxElement() {
+ return makeElement(storage().index());
+ }
+
+ /** {@inheritDoc} */
+ @Override public double sum() {
+ return getX(storage().index());
+ }
+
+ /** {@inheritDoc} */
+ @Override public int nonZeroElements() {
+ return isZero(getX(storage().index())) ? 0 : 1;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector copy() {
+ SingleElementVectorDelegateStorage sto = storage();
+
+ return new SingleElementVectorView(sto.delegate(), sto.index());
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector times(double x) {
+ if (x == 0.0)
+ return copy().map(Functions.mult(x));
+ else
+ return super.times(x);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector like(int crd) {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix likeMatrix(int rows, int cols) {
+ throw new UnsupportedOperationException();
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SparseLocalOffHeapVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SparseLocalOffHeapVector.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SparseLocalOffHeapVector.java
new file mode 100644
index 0000000..fa216ff
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SparseLocalOffHeapVector.java
@@ -0,0 +1,47 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.impls.storage.vector.SparseLocalOffHeapVectorStorage;
+
+/**
+ * Implementation for {@link Vector} assuming sparse logic and local offheap JVM storage.
+ * It is suitable for data sets where local, non-distributed execution is satisfactory and on-heap JVM storage
+ * is not enough to keep the entire data set.
+ * <p>See also: <a href="https://en.wikipedia.org/wiki/Sparse_array">Wikipedia article</a>.</p>
+ */
+public class SparseLocalOffHeapVector extends AbstractVector {
+ /**
+ * @param crd Vector cardinality.
+ */
+ public SparseLocalOffHeapVector(int crd) {
+ setStorage(new SparseLocalOffHeapVectorStorage(crd));
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector like(int crd) {
+ return new SparseLocalOffHeapVector(crd);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix likeMatrix(int rows, int cols) {
+ return null;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SparseLocalVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SparseLocalVector.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SparseLocalVector.java
new file mode 100644
index 0000000..d60eea8
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SparseLocalVector.java
@@ -0,0 +1,71 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.StorageConstants;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.impls.matrix.SparseLocalOnHeapMatrix;
+import org.apache.ignite.ml.math.impls.storage.vector.SparseLocalOnHeapVectorStorage;
+
+/**
+ * Local on-heap sparse vector based on hash map storage.
+ */
+public class SparseLocalVector extends AbstractVector implements StorageConstants {
+ /**
+ *
+ */
+ public SparseLocalVector() {
+ // No-op.
+ }
+
+ /**
+ * @param size
+ * @param acsMode
+ */
+ public SparseLocalVector(int size, int acsMode) {
+ assertAccessMode(acsMode);
+
+ setStorage(new SparseLocalOnHeapVectorStorage(size, acsMode));
+ }
+
+ /** */
+ private SparseLocalOnHeapVectorStorage storage() {
+ return (SparseLocalOnHeapVectorStorage)getStorage();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector like(int crd) {
+ SparseLocalOnHeapVectorStorage sto = storage();
+
+ return new SparseLocalVector(crd, sto.getAccessMode());
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix likeMatrix(int rows, int cols) {
+ return new SparseLocalOnHeapMatrix(rows, cols);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector times(double x) {
+ if (x == 0.0)
+ return assign(0);
+ else
+ return super.times(x);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/VectorView.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/VectorView.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/VectorView.java
new file mode 100644
index 0000000..f3bd4dd
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/VectorView.java
@@ -0,0 +1,85 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import java.io.Externalizable;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.VectorStorage;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.impls.storage.vector.DelegateVectorStorage;
+
+/**
+ * Implements the partial view into the parent {@link Vector}.
+ */
+public class VectorView extends AbstractVector {
+ /**
+ * Constructor for {@link Externalizable} interface.
+ */
+ public VectorView() {
+ // No-op.
+ }
+
+ /**
+ * @param parent Backing parent {@link Vector}.
+ * @param off Offset to parent vector.
+ * @param len Size of the view.
+ */
+ public VectorView(Vector parent, int off, int len) {
+ super(new DelegateVectorStorage(parent.getStorage(), off, len));
+ }
+
+ /**
+ * @param sto Backing parent {@link VectorStorage}.
+ * @param off Offset to parent vector.
+ * @param len Size of the view.
+ */
+ public VectorView(VectorStorage sto, int off, int len) {
+ super(new DelegateVectorStorage(sto, off, len));
+ }
+
+ /** */
+ private DelegateVectorStorage storage() {
+ return (DelegateVectorStorage)getStorage();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector copy() {
+ DelegateVectorStorage sto = storage();
+
+ return new VectorView(sto.delegate(), sto.offset(), sto.length());
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector like(int crd) {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix likeMatrix(int rows, int cols) {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object o) {
+ return this == o ||
+ ((o != null)
+ && o.getClass() == getClass()
+ && (getStorage().equals(((VectorView)o).getStorage())));
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/package-info.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/package-info.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/package-info.java
new file mode 100644
index 0000000..b7f485c
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * 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 description. -->
+ * Contains specific implementations for vectors.
+ */
+package org.apache.ignite.ml.math.impls.vector;
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/package-info.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/package-info.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/package-info.java
new file mode 100644
index 0000000..5887d4b
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * 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 description. -->
+ * Contains main APIs for distributed code algebra.
+ */
+package org.apache.ignite.ml.math;
\ No newline at end of file
[05/67] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math
module to Ignite ML module added missed licenses renamed packages fixed wrong
ml profile activation (cherry picked from commit d78e071)
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/decompositions/EigenDecompositionTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/decompositions/EigenDecompositionTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/decompositions/EigenDecompositionTest.java
new file mode 100644
index 0000000..d283ce7
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/decompositions/EigenDecompositionTest.java
@@ -0,0 +1,193 @@
+/*
+ * 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.ignite.ml.math.decompositions;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Tests for {@link EigenDecomposition}
+ */
+public class EigenDecompositionTest {
+ /** */
+ private static final double EPSILON = 1e-11;
+
+ /** */
+ @Test
+ public void testMatrixWithRealEigenvalues() {
+ test(new double[][] {
+ {1.0d, 0.0d, 0.0d, 0.0d},
+ {0.0d, 1.0d, 0.0d, 0.0d},
+ {0.0d, 0.0d, 2.0d, 0.0d},
+ {1.0d, 1.0d, 0.0d, 2.0d}},
+ new double[] {1, 2, 2, 1});
+ }
+
+ /** */
+ @Test
+ public void testSymmetricMatrix() {
+ EigenDecomposition decomposition = new EigenDecomposition(new DenseLocalOnHeapMatrix(new double[][] {
+ {1.0d, 0.0d, 0.0d, 1.0d},
+ {0.0d, 1.0d, 0.0d, 1.0d},
+ {0.0d, 0.0d, 2.0d, 0.0d},
+ {1.0d, 1.0d, 0.0d, 2.0d}}));
+
+ Matrix d = decomposition.getD();
+ Matrix v = decomposition.getV();
+
+ assertNotNull("Matrix d is expected to be not null.", d);
+ assertNotNull("Matrix v is expected to be not null.", v);
+
+ assertEquals("Unexpected rows in d matrix.", 4, d.rowSize());
+ assertEquals("Unexpected cols in d matrix.", 4, d.columnSize());
+
+ assertEquals("Unexpected rows in v matrix.", 4, v.rowSize());
+ assertEquals("Unexpected cols in v matrix.", 4, v.columnSize());
+
+ assertIsDiagonalNonZero(d);
+
+ decomposition.destroy();
+ }
+
+ /** */
+ @Test
+ public void testNonSquareMatrix() {
+ EigenDecomposition decomposition = new EigenDecomposition(new DenseLocalOnHeapMatrix(new double[][] {
+ {1.0d, 0.0d, 0.0d},
+ {0.0d, 1.0d, 0.0d},
+ {0.0d, 0.0d, 2.0d},
+ {1.0d, 1.0d, 0.0d}}));
+ // todo find out why decomposition of 3X4 matrix throws row index exception
+
+ Matrix d = decomposition.getD();
+ Matrix v = decomposition.getV();
+
+ assertNotNull("Matrix d is expected to be not null.", d);
+ assertNotNull("Matrix v is expected to be not null.", v);
+
+ assertEquals("Unexpected rows in d matrix.", 4, d.rowSize());
+ assertEquals("Unexpected cols in d matrix.", 4, d.columnSize());
+
+ assertEquals("Unexpected rows in v matrix.", 4, v.rowSize());
+ assertEquals("Unexpected cols in v matrix.", 3, v.columnSize());
+
+ assertIsDiagonal(d, true);
+
+ decomposition.destroy();
+ }
+
+ /** */
+ private void test(double[][] mRaw, double[] expRealEigenValues) {
+ DenseLocalOnHeapMatrix m = new DenseLocalOnHeapMatrix(mRaw);
+ EigenDecomposition decomposition = new EigenDecomposition(m);
+
+ Matrix d = decomposition.getD();
+ Matrix v = decomposition.getV();
+
+ assertIsDiagonalNonZero(d);
+
+ // check that d's diagonal consists of eigenvalues of m.
+ assertDiagonalConsistsOfEigenvalues(m, d, v);
+
+ // m = v d v^{-1} is equivalent to
+ // m v = v d
+ assertMatricesAreEqual(m.times(v), v.times(d));
+
+ assertEigenvalues(decomposition, expRealEigenValues);
+
+ decomposition.destroy();
+ }
+
+ /** */
+ private void assertEigenvalues(EigenDecomposition decomposition, double[] expRealEigenValues) {
+ Vector real = decomposition.getRealEigenValues();
+ Vector imag = decomposition.getImagEigenvalues();
+
+ assertEquals("Real values size differs from expected.", expRealEigenValues.length, real.size());
+ assertEquals("Imag values size differs from expected.", expRealEigenValues.length, imag.size());
+
+ for (int idx = 0; idx < expRealEigenValues.length; idx++) {
+ assertEquals("Real eigen value differs from expected at " + idx,
+ expRealEigenValues[idx], real.get(idx), 0d);
+
+ assertEquals("Imag eigen value differs from expected at " + idx,
+ 0d, imag.get(idx), 0d);
+ }
+
+ }
+
+ /** */
+ private void assertDiagonalConsistsOfEigenvalues(DenseLocalOnHeapMatrix m, Matrix d, Matrix v) {
+ int n = m.columnSize();
+ for (int i = 0; i < n; i++) {
+ Vector eigenVector = v.viewColumn(i);
+ double eigenVal = d.getX(i, i);
+ assertVectorsAreEqual(m.times(eigenVector), eigenVector.times(eigenVal));
+ }
+
+ }
+
+ /** */
+ private void assertMatricesAreEqual(Matrix exp, Matrix actual) {
+ assertTrue("The row sizes of matrices are not equal", exp.rowSize() == actual.rowSize());
+ assertTrue("The col sizes of matrices are not equal", exp.columnSize() == actual.columnSize());
+
+ // Since matrix is square, we need only one dimension
+ int n = exp.columnSize();
+
+ for (int i = 0; i < n; i++)
+ for (int j = 0; j < n; j++)
+ assertEquals("Values should be equal", exp.getX(i, j), actual.getX(i, j), EPSILON);
+ }
+
+ /** */
+ private void assertVectorsAreEqual(Vector exp, Vector actual) {
+ assertTrue("Vectors sizes are not equal", exp.size() == actual.size());
+
+ // Since matrix is square, we need only one dimension
+ int n = exp.size();
+
+ for (int i = 0; i < n; i++)
+ assertEquals("Values should be equal", exp.getX(i), actual.getX(i), EPSILON);
+ }
+
+ /** */
+ private void assertIsDiagonalNonZero(Matrix m) {
+ assertIsDiagonal(m, false);
+ }
+
+ /** */
+ private void assertIsDiagonal(Matrix m, boolean zeroesAllowed) {
+ // Since matrix is square, we need only one dimension
+ int n = m.columnSize();
+
+ assertEquals("Diagonal matrix is not square", n, m.rowSize());
+
+ for (int i = 0; i < n; i++)
+ for (int j = 0; j < n; j++)
+ assertTrue("Matrix is not diagonal, violation at (" + i + "," + j + ")",
+ ((i == j) && (zeroesAllowed || m.getX(i, j) != 0))
+ || ((i != j) && m.getX(i, j) == 0));
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/decompositions/LUDecompositionTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/decompositions/LUDecompositionTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/decompositions/LUDecompositionTest.java
new file mode 100644
index 0000000..fc76c39
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/decompositions/LUDecompositionTest.java
@@ -0,0 +1,250 @@
+/*
+ * 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.ignite.ml.math.decompositions;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.CardinalityException;
+import org.apache.ignite.ml.math.exceptions.SingularMatrixException;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
+import org.apache.ignite.ml.math.impls.matrix.PivotedMatrixView;
+import org.apache.ignite.ml.math.impls.vector.DenseLocalOnHeapVector;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Tests for {@link LUDecomposition}.
+ */
+public class LUDecompositionTest {
+ /** */
+ private Matrix testL;
+ /** */
+ private Matrix testU;
+ /** */
+ private Matrix testP;
+ /** */
+ private Matrix testMatrix;
+ /** */
+ private int[] rawPivot;
+
+ /** */
+ @Before
+ public void setUp() {
+ double[][] rawMatrix = new double[][] {
+ {2.0d, 1.0d, 1.0d, 0.0d},
+ {4.0d, 3.0d, 3.0d, 1.0d},
+ {8.0d, 7.0d, 9.0d, 5.0d},
+ {6.0d, 7.0d, 9.0d, 8.0d}};
+ double[][] rawL = {
+ {1.0d, 0.0d, 0.0d, 0.0d},
+ {3.0d / 4.0d, 1.0d, 0.0d, 0.0d},
+ {1.0d / 2.0d, -2.0d / 7.0d, 1.0d, 0.0d},
+ {1.0d / 4.0d, -3.0d / 7.0d, 1.0d / 3.0d, 1.0d}};
+ double[][] rawU = {
+ {8.0d, 7.0d, 9.0d, 5.0d},
+ {0.0d, 7.0d / 4.0d, 9.0d / 4.0d, 17.0d / 4.0d},
+ {0.0d, 0.0d, -6.0d / 7.0d, -2.0d / 7.0d},
+ {0.0d, 0.0d, 0.0d, 2.0d / 3.0d}};
+ double[][] rawP = new double[][] {
+ {0, 0, 1.0d, 0},
+ {0, 0, 0, 1.0d},
+ {0, 1.0d, 0, 0},
+ {1.0d, 0, 0, 0}};
+
+ rawPivot = new int[] {3, 4, 2, 1};
+
+ testMatrix = new DenseLocalOnHeapMatrix(rawMatrix);
+ testL = new DenseLocalOnHeapMatrix(rawL);
+ testU = new DenseLocalOnHeapMatrix(rawU);
+ testP = new DenseLocalOnHeapMatrix(rawP);
+ }
+
+ /** */
+ @Test
+ public void getL() throws Exception {
+ Matrix luDecompositionL = new LUDecomposition(testMatrix).getL();
+
+ assertEquals("Unexpected row size.", testL.rowSize(), luDecompositionL.rowSize());
+ assertEquals("Unexpected column size.", testL.columnSize(), luDecompositionL.columnSize());
+
+ for (int i = 0; i < testL.rowSize(); i++)
+ for (int j = 0; j < testL.columnSize(); j++)
+ assertEquals("Unexpected value at (" + i + "," + j + ").",
+ testL.getX(i, j), luDecompositionL.getX(i, j), 0.0000001d);
+
+ luDecompositionL.destroy();
+ }
+
+ /** */
+ @Test
+ public void getU() throws Exception {
+ Matrix luDecompositionU = new LUDecomposition(testMatrix).getU();
+
+ assertEquals("Unexpected row size.", testU.rowSize(), luDecompositionU.rowSize());
+ assertEquals("Unexpected column size.", testU.columnSize(), luDecompositionU.columnSize());
+
+ for (int i = 0; i < testU.rowSize(); i++)
+ for (int j = 0; j < testU.columnSize(); j++)
+ assertEquals("Unexpected value at (" + i + "," + j + ").",
+ testU.getX(i, j), luDecompositionU.getX(i, j), 0.0000001d);
+
+ luDecompositionU.destroy();
+ }
+
+ /** */
+ @Test
+ public void getP() throws Exception {
+ Matrix luDecompositionP = new LUDecomposition(testMatrix).getP();
+
+ assertEquals("Unexpected row size.", testP.rowSize(), luDecompositionP.rowSize());
+ assertEquals("Unexpected column size.", testP.columnSize(), luDecompositionP.columnSize());
+
+ for (int i = 0; i < testP.rowSize(); i++)
+ for (int j = 0; j < testP.columnSize(); j++)
+ assertEquals("Unexpected value at (" + i + "," + j + ").",
+ testP.getX(i, j), luDecompositionP.getX(i, j), 0.0000001d);
+
+ luDecompositionP.destroy();
+ }
+
+ /** */
+ @Test
+ public void getPivot() throws Exception {
+ Vector pivot = new LUDecomposition(testMatrix).getPivot();
+
+ assertEquals("Unexpected pivot size.", rawPivot.length, pivot.size());
+
+ for (int i = 0; i < testU.rowSize(); i++)
+ assertEquals("Unexpected value at " + i, rawPivot[i], (int)pivot.get(i) + 1);
+ }
+
+ /**
+ * Test for {@link DecompositionSupport} features.
+ */
+ @Test
+ public void decompositionSupportTest() {
+ LUDecomposition dec = new LUDecomposition(new PivotedMatrixView(testMatrix));
+ Matrix luDecompositionL = dec.getL();
+
+ assertEquals("Unexpected L row size.", testL.rowSize(), luDecompositionL.rowSize());
+ assertEquals("Unexpected L column size.", testL.columnSize(), luDecompositionL.columnSize());
+
+ for (int i = 0; i < testL.rowSize(); i++)
+ for (int j = 0; j < testL.columnSize(); j++)
+ assertEquals("Unexpected L value at (" + i + "," + j + ").",
+ testL.getX(i, j), luDecompositionL.getX(i, j), 0.0000001d);
+
+ Matrix luDecompositionU = dec.getU();
+
+ assertEquals("Unexpected U row size.", testU.rowSize(), luDecompositionU.rowSize());
+ assertEquals("Unexpected U column size.", testU.columnSize(), luDecompositionU.columnSize());
+
+ for (int i = 0; i < testU.rowSize(); i++)
+ for (int j = 0; j < testU.columnSize(); j++)
+ assertEquals("Unexpected U value at (" + i + "," + j + ").",
+ testU.getX(i, j), luDecompositionU.getX(i, j), 0.0000001d);
+
+ Matrix luDecompositionP = dec.getP();
+
+ assertEquals("Unexpected P row size.", testP.rowSize(), luDecompositionP.rowSize());
+ assertEquals("Unexpected P column size.", testP.columnSize(), luDecompositionP.columnSize());
+
+ for (int i = 0; i < testP.rowSize(); i++)
+ for (int j = 0; j < testP.columnSize(); j++)
+ assertEquals("Unexpected P value at (" + i + "," + j + ").",
+ testP.getX(i, j), luDecompositionP.getX(i, j), 0.0000001d);
+
+ dec.destroy();
+ }
+
+ /** */
+ @Test
+ public void singularDeterminant() throws Exception {
+ assertEquals("Unexpected determinant for singular matrix decomposition.",
+ 0d, new LUDecomposition(new DenseLocalOnHeapMatrix(2, 2)).determinant(), 0d);
+ }
+
+ /** */
+ @Test(expected = CardinalityException.class)
+ public void solveVecWrongSize() throws Exception {
+ new LUDecomposition(testMatrix).solve(new DenseLocalOnHeapVector(testMatrix.rowSize() + 1));
+ }
+
+ /** */
+ @Test(expected = SingularMatrixException.class)
+ public void solveVecSingularMatrix() throws Exception {
+ new LUDecomposition(new DenseLocalOnHeapMatrix(testMatrix.rowSize(), testMatrix.rowSize()))
+ .solve(new DenseLocalOnHeapVector(testMatrix.rowSize()));
+ }
+
+ /** */
+ @Test
+ public void solveVec() throws Exception {
+ Vector sol = new LUDecomposition(new PivotedMatrixView(testMatrix))
+ .solve(new DenseLocalOnHeapVector(testMatrix.rowSize()));
+
+ assertEquals("Wrong solution vector size.", testMatrix.rowSize(), sol.size());
+
+ for (int i = 0; i < sol.size(); i++)
+ assertEquals("Unexpected value at index " + i, 0d, sol.getX(i), 0.0000001d);
+ }
+
+ /** */
+ @Test(expected = CardinalityException.class)
+ public void solveMtxWrongSize() throws Exception {
+ new LUDecomposition(testMatrix).solve(
+ new DenseLocalOnHeapMatrix(testMatrix.rowSize() + 1, testMatrix.rowSize()));
+ }
+
+ /** */
+ @Test(expected = SingularMatrixException.class)
+ public void solveMtxSingularMatrix() throws Exception {
+ new LUDecomposition(new DenseLocalOnHeapMatrix(testMatrix.rowSize(), testMatrix.rowSize()))
+ .solve(new DenseLocalOnHeapMatrix(testMatrix.rowSize(), testMatrix.rowSize()));
+ }
+
+ /** */
+ @Test
+ public void solveMtx() throws Exception {
+ Matrix sol = new LUDecomposition(new PivotedMatrixView(testMatrix))
+ .solve(new DenseLocalOnHeapMatrix(testMatrix.rowSize(), testMatrix.rowSize()));
+
+ assertEquals("Wrong solution matrix row size.", testMatrix.rowSize(), sol.rowSize());
+
+ assertEquals("Wrong solution matrix column size.", testMatrix.rowSize(), sol.columnSize());
+
+ for (int row = 0; row < sol.rowSize(); row++)
+ for (int col = 0; col < sol.columnSize(); col++)
+ assertEquals("Unexpected P value at (" + row + "," + col + ").",
+ 0d, sol.getX(row, col), 0.0000001d);
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void nullMatrixTest() {
+ new LUDecomposition(null);
+ }
+
+ /** */
+ @Test(expected = CardinalityException.class)
+ public void nonSquareMatrixTest() {
+ new LUDecomposition(new DenseLocalOnHeapMatrix(2, 3));
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/decompositions/QRDecompositionTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/decompositions/QRDecompositionTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/decompositions/QRDecompositionTest.java
new file mode 100644
index 0000000..589d5d1
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/decompositions/QRDecompositionTest.java
@@ -0,0 +1,139 @@
+/*
+ * 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.ignite.ml.math.decompositions;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
+import org.apache.ignite.ml.math.impls.matrix.PivotedMatrixView;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+/** */
+public class QRDecompositionTest {
+ /** */
+ @Test
+ public void basicTest() {
+ basicTest(new DenseLocalOnHeapMatrix(new double[][] {
+ {2.0d, -1.0d, 0.0d},
+ {-1.0d, 2.0d, -1.0d},
+ {0.0d, -1.0d, 2.0d}
+ }));
+ }
+
+ /**
+ * Test for {@link DecompositionSupport} features.
+ */
+ @Test
+ public void decompositionSupportTest() {
+ basicTest(new PivotedMatrixView(new DenseLocalOnHeapMatrix(new double[][] {
+ {2.0d, -1.0d, 0.0d},
+ {-1.0d, 2.0d, -1.0d},
+ {0.0d, -1.0d, 2.0d}
+ })));
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void nullMatrixTest() {
+ new QRDecomposition(null);
+ }
+
+ /** */
+ @Test(expected = IllegalArgumentException.class)
+ public void solveWrongMatrixSizeTest() {
+ new QRDecomposition(new DenseLocalOnHeapMatrix(new double[][] {
+ {2.0d, -1.0d, 0.0d},
+ {-1.0d, 2.0d, -1.0d},
+ {0.0d, -1.0d, 2.0d}
+ })).solve(new DenseLocalOnHeapMatrix(2, 3));
+ }
+
+ /** */
+ private void basicTest(Matrix m) {
+ QRDecomposition dec = new QRDecomposition(m);
+ assertTrue("Unexpected value for full rank in decomposition " + dec, dec.hasFullRank());
+
+ Matrix q = dec.getQ();
+ Matrix r = dec.getR();
+
+ assertNotNull("Matrix q is expected to be not null.", q);
+ assertNotNull("Matrix r is expected to be not null.", r);
+
+ Matrix qSafeCp = safeCopy(q);
+
+ Matrix expIdentity = qSafeCp.times(qSafeCp.transpose());
+
+ final double delta = 0.0001;
+
+ for (int row = 0; row < expIdentity.rowSize(); row++)
+ for (int col = 0; col < expIdentity.columnSize(); col++)
+ assertEquals("Unexpected identity matrix value at (" + row + "," + col + ").",
+ row == col ? 1d : 0d, expIdentity.get(col, row), delta);
+
+ for (int row = 0; row < r.rowSize(); row++)
+ for (int col = 0; col < row - 1; col++)
+ assertEquals("Unexpected upper triangular matrix value at (" + row + "," + col + ").",
+ 0d, r.get(row, col), delta);
+
+ Matrix recomposed = qSafeCp.times(r);
+
+ for (int row = 0; row < m.rowSize(); row++)
+ for (int col = 0; col < m.columnSize(); col++)
+ assertEquals("Unexpected recomposed matrix value at (" + row + "," + col + ").",
+ m.get(row, col), recomposed.get(row, col), delta);
+
+ Matrix sol = dec.solve(new DenseLocalOnHeapMatrix(3, 10));
+ assertEquals("Unexpected rows in solution matrix.", 3, sol.rowSize());
+ assertEquals("Unexpected cols in solution matrix.", 10, sol.columnSize());
+
+ for (int row = 0; row < sol.rowSize(); row++)
+ for (int col = 0; col < sol.columnSize(); col++)
+ assertEquals("Unexpected solution matrix value at (" + row + "," + col + ").",
+ 0d, sol.get(row, col), delta);
+
+ dec.destroy();
+
+ QRDecomposition dec1 = new QRDecomposition(new DenseLocalOnHeapMatrix(new double[][] {
+ {2.0d, -1.0d},
+ {-1.0d, 2.0d},
+ {0.0d, -1.0d}
+ }));
+
+ assertTrue("Unexpected value for full rank in decomposition " + dec1, dec1.hasFullRank());
+
+ dec1.destroy();
+
+ QRDecomposition dec2 = new QRDecomposition(new DenseLocalOnHeapMatrix(new double[][] {
+ {2.0d, -1.0d, 0.0d, 0.0d},
+ {-1.0d, 2.0d, -1.0d, 0.0d},
+ {0.0d, -1.0d, 2.0d, 0.0d}
+ }));
+
+ assertTrue("Unexpected value for full rank in decomposition " + dec2, dec2.hasFullRank());
+
+ dec2.destroy();
+ }
+
+ /** */
+ private Matrix safeCopy(Matrix orig) {
+ return new DenseLocalOnHeapMatrix(orig.rowSize(), orig.columnSize()).assign(orig);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/decompositions/SingularValueDecompositionTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/decompositions/SingularValueDecompositionTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/decompositions/SingularValueDecompositionTest.java
new file mode 100644
index 0000000..f9843ae
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/decompositions/SingularValueDecompositionTest.java
@@ -0,0 +1,120 @@
+/*
+ * 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.ignite.ml.math.decompositions;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
+import org.apache.ignite.ml.math.impls.matrix.PivotedMatrixView;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+/** */
+public class SingularValueDecompositionTest {
+ /** */
+ @Test
+ public void basicTest() {
+ basicTest(new DenseLocalOnHeapMatrix(new double[][] {
+ {2.0d, -1.0d, 0.0d},
+ {-1.0d, 2.0d, -1.0d},
+ {0.0d, -1.0d, 2.0d}
+ }));
+ }
+
+ /**
+ * Test for {@link DecompositionSupport} features.
+ */
+ @Test
+ public void decompositionSupportTest() {
+ basicTest(new PivotedMatrixView(new DenseLocalOnHeapMatrix(new double[][] {
+ {2.0d, -1.0d, 0.0d},
+ {-1.0d, 2.0d, -1.0d},
+ {0.0d, -1.0d, 2.0d}
+ })));
+ }
+
+ /** */
+ @Test
+ public void rowsLessThanColumnsTest() {
+ DenseLocalOnHeapMatrix m = new DenseLocalOnHeapMatrix(new double[][] {
+ {2.0d, -1.0d, 0.0d},
+ {-1.0d, 2.0d, -1.0d}
+ });
+
+ SingularValueDecomposition dec = new SingularValueDecomposition(m);
+ assertEquals("Unexpected value for singular values size.",
+ 2, dec.getSingularValues().length);
+
+ Matrix s = dec.getS();
+ Matrix u = dec.getU();
+ Matrix v = dec.getV();
+ Matrix covariance = dec.getCovariance(0.5);
+
+ assertNotNull("Matrix s is expected to be not null.", s);
+ assertNotNull("Matrix u is expected to be not null.", u);
+ assertNotNull("Matrix v is expected to be not null.", v);
+ assertNotNull("Covariance matrix is expected to be not null.", covariance);
+
+ dec.destroy();
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void nullMatrixTest() {
+ new SingularValueDecomposition(null);
+ }
+
+ /** */
+ private void basicTest(Matrix m) {
+ SingularValueDecomposition dec = new SingularValueDecomposition(m);
+ assertEquals("Unexpected value for singular values size.",
+ 3, dec.getSingularValues().length);
+
+ Matrix s = dec.getS();
+ Matrix u = dec.getU();
+ Matrix v = dec.getV();
+ Matrix covariance = dec.getCovariance(0.5);
+
+ assertNotNull("Matrix s is expected to be not null.", s);
+ assertNotNull("Matrix u is expected to be not null.", u);
+ assertNotNull("Matrix v is expected to be not null.", v);
+ assertNotNull("Covariance matrix is expected to be not null.", covariance);
+
+ assertTrue("Decomposition cond is expected to be positive.", dec.cond() > 0);
+ assertTrue("Decomposition norm2 is expected to be positive.", dec.norm2() > 0);
+ assertEquals("Decomposition rank differs from expected.", 3, dec.rank());
+ assertEquals("Decomposition singular values size differs from expected.",
+ 3, dec.getSingularValues().length);
+
+ Matrix recomposed = (u.times(s).times(v.transpose()));
+
+ for (int row = 0; row < m.rowSize(); row++)
+ for (int col = 0; col < m.columnSize(); col++)
+ assertEquals("Unexpected recomposed matrix value at (" + row + "," + col + ").",
+ m.get(row, col), recomposed.get(row, col), 0.001);
+
+ for (int row = 0; row < covariance.rowSize(); row++)
+ for (int col = row + 1; col < covariance.columnSize(); col++)
+ assertEquals("Unexpected covariance matrix value at (" + row + "," + col + ").",
+ covariance.get(row, col), covariance.get(col, row), 0.001);
+
+ dec.destroy();
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/MathTestConstants.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/MathTestConstants.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/MathTestConstants.java
new file mode 100644
index 0000000..d26733e
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/MathTestConstants.java
@@ -0,0 +1,88 @@
+/*
+ * 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.ignite.ml.math.impls;
+
+/**
+ * Collect constants for org.apache.ignite.math tests
+ */
+public interface MathTestConstants {
+ /** */
+ public double SECOND_ARG = 1d;
+
+ /**
+ * We assume that we will check calculation precision in other tests.
+ */
+ public double EXP_DELTA = 0.1d;
+
+ /** */
+ public String UNEXPECTED_VAL = "Unexpected value.";
+
+ /** */
+ public String NULL_GUID = "Null GUID.";
+
+ /** */
+ public String UNEXPECTED_GUID_VAL = "Unexpected GUID value.";
+
+ /** */
+ public String EMPTY_GUID = "Empty GUID.";
+
+ /** */
+ public String VALUES_SHOULD_BE_NOT_EQUALS = "Values should be not equals.";
+
+ /** */
+ public String NULL_VAL = "Null value.";
+
+ /** */
+ public String NULL_VALUES = "Null values.";
+
+ /** */
+ public String NOT_NULL_VAL = "Not null value.";
+
+ /** */
+ public double TEST_VAL = 1d;
+
+ /** */
+ public String VAL_NOT_EQUALS = "Values not equals.";
+
+ /** */
+ public String NO_NEXT_ELEMENT = "No next element.";
+
+ /** */
+ public int STORAGE_SIZE = 100;
+
+ /** */
+ public String WRONG_ATTRIBUTE_VAL = "Wrong attribute value.";
+
+ /** */
+ public String NULL_DATA_ELEMENT = "Null data element.";
+
+ /** */
+ public String WRONG_DATA_ELEMENT = "Wrong data element.";
+
+ /** */
+ public double NIL_DELTA = 0d;
+
+ /** */
+ public String NULL_DATA_STORAGE = "Null data storage.";
+
+ /** */
+ public String WRONG_DATA_SIZE = "Wrong data size.";
+
+ /** */
+ public String UNEXPECTED_DATA_VAL = "Unexpected data value.";
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/CacheMatrixTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/CacheMatrixTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/CacheMatrixTest.java
new file mode 100644
index 0000000..3d4d05e
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/CacheMatrixTest.java
@@ -0,0 +1,369 @@
+/*
+ * 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.ignite.ml.math.impls.matrix;
+
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.internal.util.IgniteUtils;
+import org.apache.ignite.ml.math.ExternalizeTest;
+import org.apache.ignite.ml.math.IdentityValueMapper;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.MatrixKeyMapper;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.impls.MathTestConstants;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.apache.ignite.testframework.junits.common.GridCommonTest;
+
+/**
+ * Tests for {@link CacheMatrix}.
+ */
+@GridCommonTest(group = "Distributed Models")
+public class CacheMatrixTest extends GridCommonAbstractTest {
+ /** Number of nodes in grid */
+ private static final int NODE_COUNT = 3;
+ /** Cache name. */
+ private static final String CACHE_NAME = "test-cache";
+ /** */
+ private static final String UNEXPECTED_ATTRIBUTE_VALUE = "Unexpected attribute value.";
+ /** Grid instance. */
+ private Ignite ignite;
+ /** Matrix rows */
+ private final int rows = MathTestConstants.STORAGE_SIZE;
+ /** Matrix cols */
+ private final int cols = MathTestConstants.STORAGE_SIZE;
+
+ /**
+ * Default constructor.
+ */
+ public CacheMatrixTest() {
+ super(false);
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void beforeTestsStarted() throws Exception {
+ for (int i = 1; i <= NODE_COUNT; i++)
+ startGrid(i);
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void afterTestsStopped() throws Exception {
+ stopAllGrids();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override protected void beforeTest() throws Exception {
+ ignite = grid(NODE_COUNT);
+
+ ignite.configuration().setPeerClassLoadingEnabled(true);
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void afterTest() throws Exception {
+ ignite.destroyCache(CACHE_NAME);
+ }
+
+ /** */
+ public void testGetSet() throws Exception {
+ MatrixKeyMapper<Integer> keyMapper = getKeyMapper(rows, cols);
+ IgniteCache<Integer, Double> cache = getCache();
+ CacheMatrix<Integer, Double> cacheMatrix = new CacheMatrix<>(rows, cols, cache, keyMapper, new IdentityValueMapper());
+
+ for (int i = 0; i < rows; i++) {
+ for (int j = 0; j < cols; j++) {
+ double v = Math.random();
+ cacheMatrix.set(i, j, v);
+
+ assert Double.compare(v, cacheMatrix.get(i, j)) == 0;
+ assert Double.compare(v, cache.get(keyMapper.apply(i, j))) == 0;
+ }
+ }
+ }
+
+ /** */
+ public void testCopy() throws Exception {
+ MatrixKeyMapper<Integer> keyMapper = getKeyMapper(rows, cols);
+ IgniteCache<Integer, Double> cache = getCache();
+ CacheMatrix<Integer, Double> cacheMatrix = new CacheMatrix<>(rows, cols, cache, keyMapper, new IdentityValueMapper());
+
+ fillMatrix(cacheMatrix);
+
+ try {
+ cacheMatrix.copy();
+
+ fail("UnsupportedOperationException expected");
+ }
+ catch (UnsupportedOperationException e) {
+ // No-op.
+ }
+ }
+
+ /** */
+ public void testLike() throws Exception {
+ MatrixKeyMapper<Integer> keyMapper = getKeyMapper(rows, cols);
+ IgniteCache<Integer, Double> cache = getCache();
+ CacheMatrix<Integer, Double> cacheMatrix = new CacheMatrix<>(rows, cols, cache, keyMapper, new IdentityValueMapper());
+
+ try {
+ cacheMatrix.like(rows, cols);
+
+ fail("UnsupportedOperationException expected");
+ }
+ catch (UnsupportedOperationException e) {
+ // No-op.
+ }
+ }
+
+ /** */
+ public void testLikeVector() throws Exception {
+ MatrixKeyMapper<Integer> keyMapper = getKeyMapper(rows, cols);
+ IgniteCache<Integer, Double> cache = getCache();
+ CacheMatrix<Integer, Double> cacheMatrix = new CacheMatrix<>(rows, cols, cache, keyMapper, new IdentityValueMapper());
+
+ try {
+ cacheMatrix.likeVector(cols);
+
+ fail("UnsupportedOperationException expected");
+ }
+ catch (UnsupportedOperationException e) {
+ // No-op.
+ }
+ }
+
+ /** */
+ public void testPlus() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ double plusVal = 2;
+
+ MatrixKeyMapper<Integer> keyMapper = getKeyMapper(rows, cols);
+ IgniteCache<Integer, Double> cache = getCache();
+ CacheMatrix<Integer, Double> cacheMatrix = new CacheMatrix<>(rows, cols, cache, keyMapper, new IdentityValueMapper());
+
+ initMatrix(cacheMatrix);
+
+ cacheMatrix.plus(plusVal);
+
+ for (int i = 0; i < rows; i++)
+ for (int j = 0; j < cols; j++)
+ assertEquals(plusVal, cacheMatrix.get(i, j));
+ }
+
+ /** */
+ public void testDivide() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ double initVal = 1;
+ double divVal = 2;
+
+ MatrixKeyMapper<Integer> keyMapper = getKeyMapper(rows, cols);
+ IgniteCache<Integer, Double> cache = getCache();
+ CacheMatrix<Integer, Double> cacheMatrix = new CacheMatrix<>(rows, cols, cache, keyMapper, new IdentityValueMapper());
+
+ initMatrix(cacheMatrix);
+ cacheMatrix.assign(initVal);
+ cacheMatrix.divide(divVal);
+
+ for (int i = 0; i < rows; i++)
+ for (int j = 0; j < cols; j++)
+ assertTrue(Double.compare(cacheMatrix.get(i, j), initVal / divVal) == 0);
+ }
+
+ /** */
+ public void testTimes() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ double initVal = 1;
+ double timVal = 2;
+
+ MatrixKeyMapper<Integer> keyMapper = getKeyMapper(rows, cols);
+ IgniteCache<Integer, Double> cache = getCache();
+ CacheMatrix<Integer, Double> cacheMatrix = new CacheMatrix<>(rows, cols, cache, keyMapper, new IdentityValueMapper());
+
+ initMatrix(cacheMatrix);
+ cacheMatrix.assign(initVal);
+ cacheMatrix.times(timVal);
+
+ for (int i = 0; i < rows; i++)
+ for (int j = 0; j < cols; j++)
+ assertTrue(Double.compare(cacheMatrix.get(i, j), initVal * timVal) == 0);
+ }
+
+ /** */
+ public void testSum() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ double initVal = 1;
+
+ MatrixKeyMapper<Integer> keyMapper = getKeyMapper(rows, cols);
+ IgniteCache<Integer, Double> cache = getCache();
+ CacheMatrix<Integer, Double> cacheMatrix = new CacheMatrix<>(rows, cols, cache, keyMapper, new IdentityValueMapper());
+
+ double sum = 0;
+
+ initMatrix(cacheMatrix);
+ sum = cacheMatrix.sum();
+
+ assertTrue(Double.compare(sum, 0d) == 0);
+
+ cacheMatrix.assign(1d);
+ sum = cacheMatrix.sum();
+
+ assertTrue(Double.compare(sum, rows * cols) == 0);
+ }
+
+ /** */
+ public void testAssignSingleValue() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ double initVal = 1;
+
+ MatrixKeyMapper<Integer> keyMapper = getKeyMapper(rows, cols);
+ IgniteCache<Integer, Double> cache = getCache();
+ CacheMatrix<Integer, Double> cacheMatrix = new CacheMatrix<>(rows, cols, cache, keyMapper, new IdentityValueMapper());
+
+ initMatrix(cacheMatrix);
+
+ cacheMatrix.assign(initVal);
+
+ for (int i = 0; i < rows; i++)
+ for (int j = 0; j < cols; j++)
+ assertEquals(initVal, cacheMatrix.get(i, j));
+ }
+
+ /** */
+ public void testAssignArray() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ double[][] initVal = new double[rows][cols];
+
+ MatrixKeyMapper<Integer> keyMapper = getKeyMapper(rows, cols);
+ IgniteCache<Integer, Double> cache = getCache();
+ CacheMatrix<Integer, Double> cacheMatrix = new CacheMatrix<>(rows, cols, cache, keyMapper, new IdentityValueMapper());
+
+ for (int i = 0; i < rows; i++)
+ for (int j = 0; j < cols; j++)
+ initVal[i][j] = Math.random();
+
+ cacheMatrix.assign(initVal);
+
+ for (int i = 0; i < rows; i++)
+ for (int j = 0; j < cols; j++)
+ assertEquals(initVal[i][j], cacheMatrix.get(i, j));
+ }
+
+ /** */
+ public void testAttributes() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ MatrixKeyMapper<Integer> keyMapper = getKeyMapper(rows, cols);
+ IgniteCache<Integer, Double> cache = getCache();
+ CacheMatrix<Integer, Double> cacheMatrix = new CacheMatrix<>(rows, cols, cache, keyMapper, new IdentityValueMapper());
+
+ assertFalse(UNEXPECTED_ATTRIBUTE_VALUE, cacheMatrix.isSequentialAccess());
+ assertFalse(UNEXPECTED_ATTRIBUTE_VALUE, cacheMatrix.isDense());
+ assertFalse(UNEXPECTED_ATTRIBUTE_VALUE, cacheMatrix.isArrayBased());
+ assertTrue(UNEXPECTED_ATTRIBUTE_VALUE, cacheMatrix.isRandomAccess());
+ assertTrue(UNEXPECTED_ATTRIBUTE_VALUE, cacheMatrix.isDistributed());
+ }
+
+ /** */
+ public void testExternalization() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ MatrixKeyMapper<Integer> keyMapper = getKeyMapper(rows, cols);
+ IgniteCache<Integer, Double> cache = getCache();
+ final CacheMatrix<Integer, Double> cacheMatrix = new CacheMatrix<>(rows, cols, cache, keyMapper, new IdentityValueMapper());
+
+ ExternalizeTest<CacheMatrix<Integer, Double>> externalizeTest = new ExternalizeTest<CacheMatrix<Integer, Double>>() {
+
+ @Override public void externalizeTest() {
+ super.externalizeTest(cacheMatrix);
+ }
+ };
+
+ externalizeTest.externalizeTest();
+ }
+
+ /** */
+ public void testMinMax() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ MatrixKeyMapper<Integer> keyMapper = getKeyMapper(rows, cols);
+ IgniteCache<Integer, Double> cache = getCache();
+ final CacheMatrix<Integer, Double> cacheMatrix = new CacheMatrix<>(rows, cols, cache, keyMapper, new IdentityValueMapper());
+
+ for (int i = 0; i < rows; i++)
+ for (int j = 0; j < cols; j++)
+ cacheMatrix.set(i, j, i * rows + j);
+
+ assertEquals(0.0, cacheMatrix.minValue(), 0.0);
+ assertEquals(rows * cols - 1, cacheMatrix.maxValue(), 0.0);
+ }
+
+ /** */
+ public void testMap() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ MatrixKeyMapper<Integer> keyMapper = getKeyMapper(rows, cols);
+ IgniteCache<Integer, Double> cache = getCache();
+ final CacheMatrix<Integer, Double> cacheMatrix = new CacheMatrix<>(rows, cols, cache, keyMapper, new IdentityValueMapper());
+
+ initMatrix(cacheMatrix);
+
+ cacheMatrix.map(value -> value + 10);
+
+ for (int i = 0; i < rows; i++)
+ for (int j = 0; j < cols; j++)
+ assertEquals(10.0, cacheMatrix.getX(i, j), 0.0);
+ }
+
+ /** */
+ private IgniteCache<Integer, Double> getCache() {
+ assert ignite != null;
+
+ CacheConfiguration cfg = new CacheConfiguration();
+ cfg.setName(CACHE_NAME);
+
+ IgniteCache<Integer, Double> cache = ignite.getOrCreateCache(CACHE_NAME);
+
+ assert cache != null;
+ return cache;
+ }
+
+ /** */
+ private MatrixKeyMapper<Integer> getKeyMapper(final int rows, final int cols) {
+ return new MatrixKeyMapperForTests(rows, cols);
+ }
+
+ /** Init the given matrix by random values. */
+ private void fillMatrix(Matrix m) {
+ for (int i = 0; i < m.rowSize(); i++)
+ for (int j = 0; j < m.columnSize(); j++)
+ m.set(i, j, Math.random());
+ }
+
+ /** Init the given matrix by zeros. */
+ private void initMatrix(Matrix m) {
+ for (int i = 0; i < m.rowSize(); i++)
+ for (int j = 0; j < m.columnSize(); j++)
+ m.set(i, j, 0d);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/DenseLocalOffHeapMatrixConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/DenseLocalOffHeapMatrixConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/DenseLocalOffHeapMatrixConstructorTest.java
new file mode 100644
index 0000000..88bf8d0
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/DenseLocalOffHeapMatrixConstructorTest.java
@@ -0,0 +1,65 @@
+/*
+ * 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.ignite.ml.math.impls.matrix;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+/** */
+public class DenseLocalOffHeapMatrixConstructorTest {
+ /** */
+ @Test
+ public void invalidArgsTest() {
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new DenseLocalOffHeapMatrix(0, 1), "invalid row parameter");
+
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new DenseLocalOffHeapMatrix(1, 0), "invalid col parameter");
+
+ //noinspection ConstantConditions
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new DenseLocalOffHeapMatrix(null), "null matrix parameter");
+
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new DenseLocalOffHeapMatrix(new double[][] {null, new double[1]}),
+ "null row in matrix");
+ }
+
+ /** */
+ @Test
+ public void basicTest() {
+ assertEquals("Expected number of rows, int parameters.", 1,
+ new DenseLocalOffHeapMatrix(1, 2).rowSize());
+
+ assertEquals("Expected number of rows, double[][] parameter.", 1,
+ new DenseLocalOffHeapMatrix(new double[][] {new double[2]}).rowSize());
+
+ assertEquals("Expected number of cols, int parameters.", 1,
+ new DenseLocalOffHeapMatrix(2, 1).columnSize());
+
+ assertEquals("Expected number of cols, double[][] parameter.", 1,
+ new DenseLocalOffHeapMatrix(new double[][] {new double[1], new double[1]}).columnSize());
+
+ double[][] data1 = new double[][] {{1, 2}, {3, 4}}, data2 = new double[][] {{1, 2}, {3, 5}};
+
+ assertTrue("Matrices with same values are expected to be equal",
+ new DenseLocalOffHeapMatrix(data1).equals(new DenseLocalOffHeapMatrix(data1)));
+
+ assertFalse("Matrices with same values are expected to be equal",
+ new DenseLocalOffHeapMatrix(data1).equals(new DenseLocalOffHeapMatrix(data2)));
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/DenseLocalOnHeapMatrixConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/DenseLocalOnHeapMatrixConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/DenseLocalOnHeapMatrixConstructorTest.java
new file mode 100644
index 0000000..1cf6464
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/DenseLocalOnHeapMatrixConstructorTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.ignite.ml.math.impls.matrix;
+
+import java.util.function.Supplier;
+import org.apache.ignite.ml.math.Matrix;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
+/** */
+public class DenseLocalOnHeapMatrixConstructorTest {
+ /** */
+ @Test
+ public void invalidArgsTest() {
+ verifyAssertionError(() -> new DenseLocalOnHeapMatrix(0, 1), "invalid row parameter");
+
+ verifyAssertionError(() -> new DenseLocalOnHeapMatrix(1, 0), "invalid col parameter");
+
+ //noinspection ConstantConditions
+ verifyAssertionError(() -> new DenseLocalOnHeapMatrix(null), "null matrix parameter");
+
+ verifyAssertionError(() -> new DenseLocalOnHeapMatrix(new double[][] {null, new double[1]}),
+ "null row in matrix");
+ }
+
+ /** */
+ @Test
+ public void basicTest() {
+ assertEquals("Expected number of rows, int parameters.", 1,
+ new DenseLocalOnHeapMatrix(1, 2).rowSize());
+
+ assertEquals("Expected number of rows, double[][] parameter.", 1,
+ new DenseLocalOnHeapMatrix(new double[][] {new double[2]}).rowSize());
+
+ assertEquals("Expected number of cols, int parameters.", 1,
+ new DenseLocalOnHeapMatrix(2, 1).columnSize());
+
+ assertEquals("Expected number of cols, double[][] parameter.", 1,
+ new DenseLocalOnHeapMatrix(new double[][] {new double[1], new double[1]}).columnSize());
+ }
+
+ /** */
+ static void verifyAssertionError(Supplier<Matrix> ctor, String desc) {
+ try {
+ assertNotNull("Unexpected null matrix in " + desc, ctor.get());
+ }
+ catch (AssertionError ae) {
+ return;
+ }
+
+ fail("Expected error not caught in " + desc);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/DiagonalMatrixTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/DiagonalMatrixTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/DiagonalMatrixTest.java
new file mode 100644
index 0000000..a00403f
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/DiagonalMatrixTest.java
@@ -0,0 +1,209 @@
+/*
+ * 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.ignite.ml.math.impls.matrix;
+
+import org.apache.ignite.ml.math.ExternalizeTest;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.impls.MathTestConstants;
+import org.apache.ignite.ml.math.impls.vector.DenseLocalOnHeapVector;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+/**
+ * Tests for {@link DiagonalMatrix}.
+ */
+public class DiagonalMatrixTest extends ExternalizeTest<DiagonalMatrix> {
+ /** */
+ public static final String UNEXPECTED_VALUE = "Unexpected value";
+
+ /** */
+ private DiagonalMatrix testMatrix;
+
+ /** */
+ @Before
+ public void setup() {
+ DenseLocalOnHeapMatrix parent = new DenseLocalOnHeapMatrix(MathTestConstants.STORAGE_SIZE, MathTestConstants.STORAGE_SIZE);
+ fillMatrix(parent);
+ testMatrix = new DiagonalMatrix(parent);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void externalizeTest() {
+ externalizeTest(testMatrix);
+ }
+
+ /** */
+ @Test
+ public void testSetGetBasic() {
+ double testVal = 42;
+ for (int i = 0; i < MathTestConstants.STORAGE_SIZE; i++) {
+ testMatrix.set(i, i, testVal);
+
+ assertEquals(UNEXPECTED_VALUE + " at (" + i + "," + i + ")", testMatrix.get(i, i), testVal, 0d);
+ }
+
+ //noinspection EqualsWithItself
+ assertTrue("Matrix is expected to be equal to self.", testMatrix.equals(testMatrix));
+ //noinspection ObjectEqualsNull
+ assertFalse("Matrix is expected to be not equal to null.", testMatrix.equals(null));
+ }
+
+ /** */
+ @Test
+ public void testSetGet() {
+ verifyDiagonal(testMatrix);
+
+ final int size = MathTestConstants.STORAGE_SIZE;
+
+ for (Matrix m : new Matrix[] {
+ new DenseLocalOnHeapMatrix(size + 1, size),
+ new DenseLocalOnHeapMatrix(size, size + 1)}) {
+ fillMatrix(m);
+
+ verifyDiagonal(new DiagonalMatrix(m));
+ }
+
+ final double[] data = new double[size];
+
+ for (int i = 0; i < size; i++)
+ data[i] = 1 + i;
+
+ final Matrix m = new DiagonalMatrix(new DenseLocalOnHeapVector(data));
+
+ assertEquals("Rows in matrix constructed from vector", size, m.rowSize());
+ assertEquals("Cols in matrix constructed from vector", size, m.columnSize());
+
+ for (int i = 0; i < size; i++)
+ assertEquals(UNEXPECTED_VALUE + " at vector index " + i, data[i], m.get(i, i), 0d);
+
+ verifyDiagonal(m);
+
+ final Matrix m1 = new DiagonalMatrix(data);
+
+ assertEquals("Rows in matrix constructed from array", size, m1.rowSize());
+ assertEquals("Cols in matrix constructed from array", size, m1.columnSize());
+
+ for (int i = 0; i < size; i++)
+ assertEquals(UNEXPECTED_VALUE + " at array index " + i, data[i], m1.get(i, i), 0d);
+
+ verifyDiagonal(m1);
+ }
+
+ /** */
+ @Test
+ public void testConstant() {
+ final int size = MathTestConstants.STORAGE_SIZE;
+
+ for (double val : new double[] {-1.0, 0.0, 1.0}) {
+ Matrix m = new DiagonalMatrix(size, val);
+
+ assertEquals("Rows in matrix", size, m.rowSize());
+ assertEquals("Cols in matrix", size, m.columnSize());
+
+ for (int i = 0; i < size; i++)
+ assertEquals(UNEXPECTED_VALUE + " at index " + i, val, m.get(i, i), 0d);
+
+ verifyDiagonal(m, true);
+ }
+ }
+
+ /** */
+ @Test
+ public void testAttributes() {
+ assertTrue(UNEXPECTED_VALUE, testMatrix.rowSize() == MathTestConstants.STORAGE_SIZE);
+ assertTrue(UNEXPECTED_VALUE, testMatrix.columnSize() == MathTestConstants.STORAGE_SIZE);
+
+ assertFalse(UNEXPECTED_VALUE, testMatrix.isArrayBased());
+ assertTrue(UNEXPECTED_VALUE, testMatrix.isDense());
+ assertFalse(UNEXPECTED_VALUE, testMatrix.isDistributed());
+
+ assertEquals(UNEXPECTED_VALUE, testMatrix.isRandomAccess(), !testMatrix.isSequentialAccess());
+ assertTrue(UNEXPECTED_VALUE, testMatrix.isRandomAccess());
+ }
+
+ /** */
+ @Test
+ public void testNullParams() {
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new DiagonalMatrix((Matrix)null), "Null Matrix parameter");
+
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new DiagonalMatrix((Vector)null), "Null Vector parameter");
+
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new DiagonalMatrix((double[])null), "Null double[] parameter");
+ }
+
+ /** */
+ private void verifyDiagonal(Matrix m, boolean readonly) {
+ final int rows = m.rowSize(), cols = m.columnSize();
+
+ final String sizeDetails = "rows" + "X" + "cols " + rows + "X" + cols;
+
+ for (int i = 0; i < rows; i++)
+ for (int j = 0; j < cols; j++) {
+ final String details = " at (" + i + "," + j + "), " + sizeDetails;
+
+ final boolean diagonal = i == j;
+
+ final double old = m.get(i, j);
+
+ if (!diagonal)
+ assertEquals(UNEXPECTED_VALUE + details, 0, old, 0d);
+
+ final double exp = diagonal && !readonly ? old + 1 : old;
+
+ boolean expECaught = false;
+
+ try {
+ m.set(i, j, exp);
+ }
+ catch (UnsupportedOperationException uoe) {
+ if (diagonal && !readonly)
+ throw uoe;
+
+ expECaught = true;
+ }
+
+ if ((!diagonal || readonly) && !expECaught)
+ fail("Expected exception was not caught " + details);
+
+ assertEquals(UNEXPECTED_VALUE + details, exp, m.get(i, j), 0d);
+ }
+ }
+
+ /** */
+ private void verifyDiagonal(Matrix m) {
+ verifyDiagonal(m, false);
+ }
+
+ /** */
+ private void fillMatrix(Matrix m) {
+ final int rows = m.rowSize(), cols = m.columnSize();
+
+ boolean negative = false;
+
+ for (int i = 0; i < rows; i++)
+ for (int j = 0; j < cols; j++)
+ m.set(i, j, (negative = !negative) ? -(i * cols + j + 1) : i * cols + j + 1);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/FunctionMatrixConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/FunctionMatrixConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/FunctionMatrixConstructorTest.java
new file mode 100644
index 0000000..25de7d3
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/FunctionMatrixConstructorTest.java
@@ -0,0 +1,113 @@
+/*
+ * 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.ignite.ml.math.impls.matrix;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+/** */
+public class FunctionMatrixConstructorTest {
+ /** */
+ @Test
+ public void invalidArgsTest() {
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new FunctionMatrix(0, 1, (i, j) -> 0.0),
+ "Invalid row parameter.");
+
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new FunctionMatrix(1, 0, (i, j) -> 0.0),
+ "Invalid col parameter.");
+
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new FunctionMatrix(1, 1, null),
+ "Invalid func parameter.");
+
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new FunctionMatrix(0, 1, (i, j) -> 0.0, null),
+ "Invalid row parameter, with setter func.");
+
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new FunctionMatrix(1, 0, (i, j) -> 0.0, null),
+ "Invalid col parameter, with setter func.");
+
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new FunctionMatrix(1, 1, null, null),
+ "Invalid func parameter, with setter func.");
+ }
+
+ /** */
+ @Test
+ public void basicTest() {
+ for (int rows : new int[] {1, 2, 3})
+ for (int cols : new int[] {1, 2, 3})
+ basicTest(rows, cols);
+
+ Matrix m = new FunctionMatrix(1, 1, (i, j) -> 1d);
+ //noinspection EqualsWithItself
+ assertTrue("Matrix is expected to be equal to self.", m.equals(m));
+ //noinspection ObjectEqualsNull
+ assertFalse("Matrix is expected to be not equal to null.", m.equals(null));
+ }
+
+ /** */
+ private void basicTest(int rows, int cols) {
+ double[][] data = new double[rows][cols];
+
+ for (int row = 0; row < rows; row++)
+ for (int col = 0; col < cols; col++)
+ data[row][col] = row * cols + row;
+
+ Matrix mReadOnly = new FunctionMatrix(rows, cols, (i, j) -> data[i][j]);
+
+ assertEquals("Rows in matrix.", rows, mReadOnly.rowSize());
+ assertEquals("Cols in matrix.", cols, mReadOnly.columnSize());
+
+ for (int row = 0; row < rows; row++)
+ for (int col = 0; col < cols; col++) {
+ assertEquals("Unexpected value at " + row + "x" + col, data[row][col], mReadOnly.get(row, col), 0d);
+
+ boolean expECaught = false;
+
+ try {
+ mReadOnly.set(row, col, 0.0);
+ }
+ catch (UnsupportedOperationException uoe) {
+ expECaught = true;
+ }
+
+ assertTrue("Expected exception wasn't thrown at " + row + "x" + col, expECaught);
+ }
+
+ Matrix m = new FunctionMatrix(rows, cols, (i, j) -> data[i][j], (i, j, val) -> data[i][j] = val);
+
+ assertEquals("Rows in matrix, with setter function.", rows, m.rowSize());
+ assertEquals("Cols in matrix, with setter function.", cols, m.columnSize());
+
+ for (int row = 0; row < rows; row++)
+ for (int col = 0; col < cols; col++) {
+ assertEquals("Unexpected value at " + row + "x" + col, data[row][col], m.get(row, col), 0d);
+
+ m.set(row, col, -data[row][col]);
+ }
+
+ for (int row = 0; row < rows; row++)
+ for (int col = 0; col < cols; col++)
+ assertEquals("Unexpected value set at " + row + "x" + col, -(row * cols + row), m.get(row, col), 0d);
+
+ assertTrue("Incorrect copy for empty matrix.", m.copy().equals(m));
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixAttributeTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixAttributeTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixAttributeTest.java
new file mode 100644
index 0000000..79cb13a
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixAttributeTest.java
@@ -0,0 +1,156 @@
+/*
+ * 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.ignite.ml.math.impls.matrix;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.Function;
+import org.apache.ignite.ml.math.Matrix;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Attribute tests for matrices.
+ *
+ * TODO: WIP
+ */
+public class MatrixAttributeTest {
+ /** */
+ private final List<MatrixAttributeTest.AttrCfg> attrCfgs = Arrays.asList(
+ new AttrCfg("isDense", Matrix::isDense,
+ DenseLocalOnHeapMatrix.class, DenseLocalOffHeapMatrix.class, RandomMatrix.class, DiagonalMatrix.class),
+ new AttrCfg("isArrayBased", Matrix::isArrayBased, DenseLocalOnHeapMatrix.class),
+ new AttrCfg("isDistributed", Matrix::isDistributed),
+ new AttrCfg("isRandomAccess", Matrix::isRandomAccess, DenseLocalOnHeapMatrix.class, DenseLocalOffHeapMatrix.class, RandomMatrix.class, DiagonalMatrix.class, SparseLocalOnHeapMatrix.class),
+ new AttrCfg("isSequentialAccess", Matrix::isSequentialAccess, DiagonalMatrix.class)
+ );
+
+ /** */
+ private final List<MatrixAttributeTest.Specification> specFixture = Arrays.asList(
+ new Specification(new DenseLocalOnHeapMatrix(1, 1)),
+ new Specification(new DenseLocalOffHeapMatrix(1, 1)),
+ new Specification(new RandomMatrix(1, 1)),
+ new Specification(new DiagonalMatrix(new double[] {1.0})),
+ new Specification(new FunctionMatrix(1, 1, (x, y) -> 1.0)),
+ new Specification(new SparseLocalOnHeapMatrix(1, 1))
+ );
+
+ /** */
+ @Test
+ public void isDenseTest() {
+ assertAttribute("isDense");
+ }
+
+ /** */
+ @Test
+ public void isArrayBasedTest() {
+ assertAttribute("isArrayBased");
+ }
+
+ /** */
+ @Test
+ public void isSequentialAccessTest() {
+ assertAttribute("isSequentialAccess");
+ }
+
+ /** */
+ @Test
+ public void isRandomAccessTest() {
+ assertAttribute("isRandomAccess");
+ }
+
+ /** */
+ @Test
+ public void isDistributedTest() {
+ assertAttribute("isDistributed");
+ }
+
+ /** */
+ private void assertAttribute(String name) {
+ final MatrixAttributeTest.AttrCfg attr = attrCfg(name);
+
+ for (MatrixAttributeTest.Specification spec : specFixture)
+ spec.verify(attr);
+ }
+
+ /** */
+ private MatrixAttributeTest.AttrCfg attrCfg(String name) {
+ for (MatrixAttributeTest.AttrCfg attr : attrCfgs)
+ if (attr.name.equals(name))
+ return attr;
+
+ throw new IllegalArgumentException("Undefined attribute " + name);
+ }
+
+ /** See http://en.wikipedia.org/wiki/Specification_pattern */
+ private static class Specification {
+ /** */
+ private final Matrix m;
+ /** */
+ private final Class<? extends Matrix> underlyingType;
+ /** */
+ private final List<String> attrsFromUnderlying;
+ /** */
+ final String desc;
+
+ /** */
+ Specification(Matrix m, Class<? extends Matrix> underlyingType, String... attrsFromUnderlying) {
+ this.m = m;
+ this.underlyingType = underlyingType;
+ this.attrsFromUnderlying = Arrays.asList(attrsFromUnderlying);
+ final Class<? extends Matrix> clazz = m.getClass();
+ desc = clazz.getSimpleName() + (clazz.equals(underlyingType)
+ ? "" : " (underlying type " + underlyingType.getSimpleName() + ")");
+ }
+
+ /** */
+ Specification(Matrix m) {
+ this(m, m.getClass());
+ }
+
+ /** */
+ void verify(MatrixAttributeTest.AttrCfg attr) {
+ final boolean obtained = attr.obtain.apply(m);
+
+ final Class<? extends Matrix> typeToCheck
+ = attrsFromUnderlying.contains(attr.name) ? underlyingType : m.getClass();
+
+ final boolean exp = attr.trueInTypes.contains(typeToCheck);
+
+ assertEquals("Unexpected " + attr.name + " value for " + desc, exp, obtained);
+ }
+ }
+
+ /** */
+ private static class AttrCfg {
+ /** */
+ final String name;
+ /** */
+ final Function<Matrix, Boolean> obtain;
+ /** */
+ final List<Class> trueInTypes;
+
+ /** */
+ AttrCfg(String name, Function<Matrix, Boolean> obtain, Class... trueInTypes) {
+ this.name = name;
+ this.obtain = obtain;
+ this.trueInTypes = Arrays.asList(trueInTypes);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixImplementationFixtures.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixImplementationFixtures.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixImplementationFixtures.java
new file mode 100644
index 0000000..52a0077
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixImplementationFixtures.java
@@ -0,0 +1,381 @@
+/*
+ * 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.ignite.ml.math.impls.matrix;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.function.BiConsumer;
+import java.util.function.BiFunction;
+import java.util.function.Function;
+import java.util.function.Supplier;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.impls.storage.matrix.FunctionMatrixStorage;
+import org.jetbrains.annotations.NotNull;
+
+/** */
+class MatrixImplementationFixtures {
+ /** */
+ private static final List<Supplier<Iterable<Matrix>>> suppliers = Arrays.asList(
+ (Supplier<Iterable<Matrix>>)DenseLocalOnHeapMatrixFixture::new,
+ (Supplier<Iterable<Matrix>>)DenseLocalOffHeapMatrixFixture::new,
+ (Supplier<Iterable<Matrix>>)RandomMatrixFixture::new,
+ (Supplier<Iterable<Matrix>>)SparseLocalOnHeapMatrixFixture::new,
+ (Supplier<Iterable<Matrix>>)PivotedMatrixViewFixture::new,
+ (Supplier<Iterable<Matrix>>)MatrixViewFixture::new,
+ (Supplier<Iterable<Matrix>>)FunctionMatrixFixture::new,
+ (Supplier<Iterable<Matrix>>)DiagonalMatrixFixture::new,
+ (Supplier<Iterable<Matrix>>)TransposedMatrixViewFixture::new
+ );
+
+ /** */
+ void consumeSampleMatrix(BiConsumer<Matrix, String> consumer) {
+ for (Supplier<Iterable<Matrix>> fixtureSupplier : suppliers) {
+ final Iterable<Matrix> fixture = fixtureSupplier.get();
+
+ for (Matrix matrix : fixture) {
+ consumer.accept(matrix, fixture.toString());
+
+ matrix.destroy();
+ }
+ }
+ }
+
+ /** */
+ private static class DenseLocalOnHeapMatrixFixture extends MatrixSizeIterator {
+ /** */
+ DenseLocalOnHeapMatrixFixture() {
+ super(DenseLocalOnHeapMatrix::new, "DenseLocalOnHeapMatrix");
+ }
+ }
+
+ /** */
+ private static class DenseLocalOffHeapMatrixFixture extends MatrixSizeIterator {
+ /** */
+ DenseLocalOffHeapMatrixFixture() {
+ super(DenseLocalOffHeapMatrix::new, "DenseLocalOffHeapMatrix");
+ }
+ }
+
+ /** */
+ private static class RandomMatrixFixture extends MatrixSizeIterator {
+ /** */
+ RandomMatrixFixture() {
+ super(RandomMatrix::new, "RandomMatrix");
+ }
+ }
+
+ /** */
+ private static class SparseLocalOnHeapMatrixFixture extends MatrixSizeIterator {
+ /** */
+ SparseLocalOnHeapMatrixFixture() {
+ super(SparseLocalOnHeapMatrix::new, "SparseLocalOnHeapMatrix");
+ }
+ }
+
+ /** */
+ private static class PivotedMatrixViewFixture extends WrapperMatrixIterator {
+ /** */
+ PivotedMatrixViewFixture() {
+ super(PivotedMatrixView::new, "PivotedMatrixView over DenseLocalOnHeapMatrix");
+ }
+ }
+
+ /** */
+ private static class MatrixViewFixture extends WrapperMatrixIterator {
+ /** */
+ MatrixViewFixture() {
+ super((matrix) -> new MatrixView(matrix, 0, 0, matrix.rowSize(), matrix.columnSize()),
+ "MatrixView over DenseLocalOnHeapMatrix");
+ }
+ }
+
+ /** */
+ private static class FunctionMatrixFixture extends WrapperMatrixIterator {
+ /** */
+ FunctionMatrixFixture() {
+ super(FunctionMatrixForTest::new, "FunctionMatrix wrapping DenseLocalOnHeapMatrix");
+ }
+ }
+
+ /** */
+ private static class DiagonalMatrixFixture extends DiagonalIterator {
+ /** */
+ DiagonalMatrixFixture() {
+ super(DenseLocalOnHeapMatrix::new, "DiagonalMatrix over DenseLocalOnHeapMatrix");
+ }
+
+ /** {@inheritDoc} */
+ @NotNull
+ @Override public Iterator<Matrix> iterator() {
+ return new Iterator<Matrix>() {
+ /** {@inheritDoc} */
+ @Override public boolean hasNext() {
+ return hasNextSize(getSizeIdx());
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix next() {
+ assert getSize(getSizeIdx()) == 1 : "Only size 1 allowed for diagonal matrix fixture.";
+
+ Matrix matrix = getConstructor().apply(getSize(getSizeIdx()), getSize(getSizeIdx()));
+
+ nextIdx();
+
+ return new DiagonalMatrix(matrix);
+ }
+ };
+ }
+ }
+
+ /** */
+ private static class TransposedMatrixViewFixture extends WrapperMatrixIterator {
+ /** */
+ TransposedMatrixViewFixture() {
+ super(TransposedMatrixView::new, "TransposedMatrixView over DenseLocalOnHeapMatrix");
+ }
+ }
+
+ /** */
+ private static abstract class DiagonalIterator implements Iterable<Matrix> {
+ /** */
+ private final Integer[] sizes = new Integer[] {1, null};
+ /** */
+ private int sizeIdx = 0;
+
+ /** */
+ private BiFunction<Integer, Integer, ? extends Matrix> constructor;
+ /** */
+ private String desc;
+
+ /** */
+ DiagonalIterator(BiFunction<Integer, Integer, ? extends Matrix> constructor, String desc) {
+ this.constructor = constructor;
+ this.desc = desc;
+ }
+
+ /** */
+ public BiFunction<Integer, Integer, ? extends Matrix> getConstructor() {
+ return constructor;
+ }
+
+ /** */
+ int getSizeIdx() {
+ return sizeIdx;
+ }
+
+ /** */
+ @Override public String toString() {
+ return desc + "{rows=" + sizes[sizeIdx] + ", cols=" + sizes[sizeIdx] + "}";
+ }
+
+ /** */
+ boolean hasNextSize(int idx) {
+ return sizes[idx] != null;
+ }
+
+ /** */
+ Integer getSize(int idx) {
+ return sizes[idx];
+ }
+
+ /** */
+ void nextIdx() {
+ sizeIdx++;
+ }
+ }
+
+ /** */
+ private static class WrapperMatrixIterator extends MatrixSizeIterator {
+ /** */
+ private final Function<Matrix, Matrix> wrapperCtor;
+
+ /** */
+ WrapperMatrixIterator(Function<Matrix, Matrix> wrapperCtor, String desc) {
+ super(DenseLocalOnHeapMatrix::new, desc);
+
+ this.wrapperCtor = wrapperCtor;
+ }
+
+ /** {@inheritDoc} */
+ @NotNull
+ @Override public Iterator<Matrix> iterator() {
+ return new Iterator<Matrix>() {
+ /** {@inheritDoc} */
+ @Override public boolean hasNext() {
+ return hasNextCol(getSizeIdx()) && hasNextRow(getSizeIdx());
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix next() {
+ Matrix matrix = getConstructor().apply(getRow(getSizeIdx()), getCol(getSizeIdx()));
+
+ nextIdx();
+
+ return wrapperCtor.apply(matrix);
+ }
+ };
+ }
+ }
+
+ /** */
+ private static class MatrixSizeIterator implements Iterable<Matrix> {
+ /** */
+ private final Integer[] rows = new Integer[] {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 512, 1024, null};
+ /** */
+ private final Integer[] cols = new Integer[] {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 1024, 512, null};
+ /** */
+ private int sizeIdx = 0;
+
+ /** */
+ private BiFunction<Integer, Integer, ? extends Matrix> constructor;
+ /** */
+ private String desc;
+
+ /** */
+ MatrixSizeIterator(BiFunction<Integer, Integer, ? extends Matrix> constructor, String desc) {
+ this.constructor = constructor;
+ this.desc = desc;
+ }
+
+ /** */
+ public BiFunction<Integer, Integer, ? extends Matrix> getConstructor() {
+ return constructor;
+ }
+
+ /** */
+ int getSizeIdx() {
+ return sizeIdx;
+ }
+
+ /** */
+ @Override public String toString() {
+ return desc + "{rows=" + rows[sizeIdx] + ", cols=" + cols[sizeIdx] + "}";
+ }
+
+ /** */
+ boolean hasNextRow(int idx) {
+ return rows[idx] != null;
+ }
+
+ /** */
+ boolean hasNextCol(int idx) {
+ return cols[idx] != null;
+ }
+
+ /** */
+ Integer getRow(int idx) {
+ return rows[idx];
+ }
+
+ /** */
+ int getCol(int idx) {
+ return cols[idx];
+ }
+
+ /** {@inheritDoc} */
+ @NotNull
+ @Override public Iterator<Matrix> iterator() {
+ return new Iterator<Matrix>() {
+ /** {@inheritDoc} */
+ @Override public boolean hasNext() {
+ return hasNextCol(sizeIdx) && hasNextRow(sizeIdx);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix next() {
+ Matrix matrix = constructor.apply(rows[sizeIdx], cols[sizeIdx]);
+
+ nextIdx();
+
+ return matrix;
+ }
+ };
+ }
+
+ /** */
+ void nextIdx() {
+ sizeIdx++;
+ }
+ }
+
+ /** Subclass tweaked for serialization */
+ private static class FunctionMatrixForTest extends FunctionMatrix {
+ /** */
+ Matrix underlying;
+
+ /** */
+ public FunctionMatrixForTest() {
+ // No-op.
+ }
+
+ /** */
+ FunctionMatrixForTest(Matrix underlying) {
+ super(underlying.rowSize(), underlying.columnSize(), underlying::get, underlying::set);
+
+ this.underlying = underlying;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix copy() {
+ return new FunctionMatrixForTest(underlying);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ super.writeExternal(out);
+
+ out.writeObject(underlying);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ super.readExternal(in);
+
+ underlying = (Matrix)in.readObject();
+
+ setStorage(new FunctionMatrixStorage(underlying.rowSize(), underlying.columnSize(),
+ underlying::get, underlying::set));
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ int res = 1;
+
+ res = res * 37 + underlying.hashCode();
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object o) {
+ if (this == o)
+ return true;
+
+ if (o == null || getClass() != o.getClass())
+ return false;
+
+ FunctionMatrixForTest that = (FunctionMatrixForTest)o;
+
+ return underlying != null ? underlying.equals(that.underlying) : that.underlying == null;
+ }
+ }
+}
[48/67] [abbrv] ignite git commit: IGNITE-5143 Fixed agent watch
logic.
Posted by sb...@apache.org.
IGNITE-5143 Fixed agent watch logic.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/2436b934
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/2436b934
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/2436b934
Branch: refs/heads/ignite-5075
Commit: 2436b93411dc84c10672b86534ad23816db4c03a
Parents: 1a33948
Author: Andrey Novikov <an...@gridgain.com>
Authored: Wed May 3 16:50:16 2017 +0700
Committer: Andrey Novikov <an...@gridgain.com>
Committed: Wed May 3 16:50:16 2017 +0700
----------------------------------------------------------------------
.../web-console/backend/app/browsersHandler.js | 6 +-
.../app/modules/agent/AgentManager.service.js | 73 ++++++++++++++++----
.../frontend/app/modules/demo/Demo.module.js | 2 +-
.../frontend/app/modules/sql/sql.controller.js | 8 +--
.../frontend/controllers/domains-controller.js | 2 +-
5 files changed, 69 insertions(+), 22 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/2436b934/modules/web-console/backend/app/browsersHandler.js
----------------------------------------------------------------------
diff --git a/modules/web-console/backend/app/browsersHandler.js b/modules/web-console/backend/app/browsersHandler.js
index 4a03abe..66ac5f8 100644
--- a/modules/web-console/backend/app/browsersHandler.js
+++ b/modules/web-console/backend/app/browsersHandler.js
@@ -115,15 +115,15 @@ module.exports.factory = (_, socketio, configure, errors) => {
acc.hasDemo |= _.get(agentSock, 'demo.enabled');
if (agentSock.cluster) {
- acc.clusters.add({
+ acc.clusters.push({
id: agentSock.cluster.id
});
}
return acc;
- }, {count: 0, hasDemo: false, clusters: new Set()});
+ }, {count: 0, hasDemo: false, clusters: []});
- stat.clusters = Array.from(stat.clusters);
+ stat.clusters = _.uniqWith(stat.clusters, _.isEqual);
return stat;
})
http://git-wip-us.apache.org/repos/asf/ignite/blob/2436b934/modules/web-console/frontend/app/modules/agent/AgentManager.service.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/agent/AgentManager.service.js b/modules/web-console/frontend/app/modules/agent/AgentManager.service.js
index db8b493..cb77832 100644
--- a/modules/web-console/frontend/app/modules/agent/AgentManager.service.js
+++ b/modules/web-console/frontend/app/modules/agent/AgentManager.service.js
@@ -41,7 +41,7 @@ export default class IgniteAgentManager {
this.clusters = [];
- $root.$on('$stateChangeSuccess', _.bind(this.stopWatch, this));
+ $root.$on('$stateChangeSuccess', () => this.stopWatch());
/**
* Connection to backend.
@@ -128,20 +128,29 @@ export default class IgniteAgentManager {
}
/**
+ * @param states
* @returns {Promise}
*/
- awaitAgent() {
- this.latchAwaitAgent = this.$q.defer();
+ awaitConnectionState(...states) {
+ this.latchAwaitStates = this.$q.defer();
this.offAwaitAgent = this.$root.$watch(() => this.connectionState, (state) => {
- if (state === State.CONNECTED) {
+ if (_.includes(states, state)) {
this.offAwaitAgent();
- this.latchAwaitAgent.resolve();
+ this.latchAwaitStates.resolve();
}
});
- return this.latchAwaitAgent.promise;
+ return this.latchAwaitStates.promise;
+ }
+
+ awaitCluster() {
+ return this.awaitConnectionState(State.CONNECTED);
+ }
+
+ awaitAgent() {
+ return this.awaitConnectionState(State.CONNECTED, State.CLUSTER_DISCONNECTED);
}
/**
@@ -149,7 +158,7 @@ export default class IgniteAgentManager {
* @param {String} [backState]
* @returns {Promise}
*/
- startWatch(backText, backState) {
+ startAgentWatch(backText, backState) {
const self = this;
self.backText = backText;
@@ -163,27 +172,65 @@ export default class IgniteAgentManager {
self.offStateWatch = this.$root.$watch(() => self.connectionState, (state) => {
switch (state) {
+ case State.CONNECTED:
+ case State.CLUSTER_DISCONNECTED:
+ this.AgentModal.hide();
+
+ break;
+
case State.AGENT_DISCONNECTED:
this.AgentModal.agentDisconnected(self.backText, self.backState);
break;
- case State.CLUSTER_DISCONNECTED:
- self.AgentModal.clusterDisconnected(self.backText, self.backState);
+ default:
+ // Connection to backend is not established yet.
+ }
+ });
- break;
+ return self.awaitAgent();
+ }
+
+ /**
+ * @param {String} backText
+ * @param {String} [backState]
+ * @returns {Promise}
+ */
+ startClusterWatch(backText, backState) {
+ const self = this;
+ self.backText = backText;
+ self.backState = backState;
+
+ if (_.nonEmpty(self.clusters) && _.get(self.cluster, 'disconnect') === true) {
+ self.cluster = _.head(self.clusters);
+
+ self.connectionState = State.CONNECTED;
+ }
+
+ self.offStateWatch = this.$root.$watch(() => self.connectionState, (state) => {
+ switch (state) {
case State.CONNECTED:
this.AgentModal.hide();
break;
+ case State.AGENT_DISCONNECTED:
+ this.AgentModal.agentDisconnected(self.backText, self.backState);
+
+ break;
+
+ case State.CLUSTER_DISCONNECTED:
+ self.AgentModal.clusterDisconnected(self.backText, self.backState);
+
+ break;
+
default:
// Connection to backend is not established yet.
}
});
- return self.awaitAgent();
+ return self.awaitCluster();
}
stopWatch() {
@@ -194,10 +241,10 @@ export default class IgniteAgentManager {
this.AgentModal.hide();
- if (this.latchAwaitAgent) {
+ if (this.latchAwaitStates) {
this.offAwaitAgent();
- this.latchAwaitAgent.reject('Agent watch stopped.');
+ this.latchAwaitStates.reject('Agent watch stopped.');
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/2436b934/modules/web-console/frontend/app/modules/demo/Demo.module.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/demo/Demo.module.js b/modules/web-console/frontend/app/modules/demo/Demo.module.js
index 99ea2cb..1de45cd 100644
--- a/modules/web-console/frontend/app/modules/demo/Demo.module.js
+++ b/modules/web-console/frontend/app/modules/demo/Demo.module.js
@@ -165,7 +165,7 @@ angular
return dialog.$promise
.then(dialog.show)
- .then(() => Promise.race([agentMgr.awaitAgent(), closePromise.promise]))
+ .then(() => Promise.race([agentMgr.awaitCluster(), closePromise.promise]))
.then(() => scope.hasAgents = true);
}
};
http://git-wip-us.apache.org/repos/asf/ignite/blob/2436b934/modules/web-console/frontend/app/modules/sql/sql.controller.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/sql/sql.controller.js b/modules/web-console/frontend/app/modules/sql/sql.controller.js
index c86ab6b..3806351 100644
--- a/modules/web-console/frontend/app/modules/sql/sql.controller.js
+++ b/modules/web-console/frontend/app/modules/sql/sql.controller.js
@@ -887,7 +887,7 @@ export default ['$rootScope', '$scope', '$http', '$q', '$timeout', '$interval',
.catch((err) => Messages.showError(err));
const _startWatch = () =>
- agentMgr.startWatch('Back to Configuration', 'base.configuration.clusters')
+ agentMgr.startClusterWatch('Back to Configuration', 'base.configuration.clusters')
.then(() => Loading.start('sqlLoading'))
.then(_refreshFn)
.then(() => Loading.finish('sqlLoading'))
@@ -1336,12 +1336,12 @@ export default ['$rootScope', '$scope', '$http', '$q', '$timeout', '$interval',
const _executeRefresh = (paragraph) => {
const args = paragraph.queryArgs;
- agentMgr.awaitAgent()
+ agentMgr.awaitCluster()
.then(() => _closeOldQuery(paragraph))
.then(() => args.localNid || _chooseNode(args.cacheName, false))
.then((nid) => agentMgr.querySql(nid, args.cacheName, args.query, args.nonCollocatedJoins,
args.enforceJoinOrder, false, !!args.localNid, args.pageSize))
- .then(_processQueryResult.bind(this, paragraph, false))
+ .then((res) => _processQueryResult(paragraph, false, res))
.catch((err) => paragraph.setError(err));
};
@@ -1467,7 +1467,7 @@ export default ['$rootScope', '$scope', '$http', '$q', '$timeout', '$interval',
return agentMgr.querySql(nid, args.cacheName, args.query, false, !!paragraph.enforceJoinOrder, false, false, args.pageSize);
})
- .then(_processQueryResult.bind(this, paragraph, true))
+ .then((res) => _processQueryResult(paragraph, true, res))
.catch((err) => {
paragraph.setError(err);
http://git-wip-us.apache.org/repos/asf/ignite/blob/2436b934/modules/web-console/frontend/controllers/domains-controller.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/controllers/domains-controller.js b/modules/web-console/frontend/controllers/domains-controller.js
index 57050a0..ea5e389 100644
--- a/modules/web-console/frontend/controllers/domains-controller.js
+++ b/modules/web-console/frontend/controllers/domains-controller.js
@@ -461,7 +461,7 @@ export default ['domainsController', [
$scope.importDomain.loadingOptions = LOADING_JDBC_DRIVERS;
- agentMgr.startWatch('Back to Domain models', 'import domain model from database')
+ agentMgr.startAgentWatch('Back to Domain models', 'import domain model from database')
.then(() => {
ActivitiesData.post({
group: 'configuration',
[19/67] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math
module to Ignite ML module added missed licenses renamed packages fixed wrong
ml profile activation (cherry picked from commit d78e071)
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/CacheVectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/CacheVectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/CacheVectorStorage.java
deleted file mode 100644
index 670deef..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/CacheVectorStorage.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.vector;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.Ignition;
-import org.apache.ignite.math.ValueMapper;
-import org.apache.ignite.math.VectorKeyMapper;
-import org.apache.ignite.math.VectorStorage;
-
-/**
- * Vector storage based on existing cache and index and value mapping functions.
- */
-public class CacheVectorStorage<K, V> implements VectorStorage {
- /** Storage size. */
- private int size;
- /** Key mapper. */
- private VectorKeyMapper<K> keyMapper;
- /** Value mapper. */
- private ValueMapper<V> valMapper;
- /** Underlying ignite cache. */
- private IgniteCache<K, V> cache;
-
- /**
- *
- */
- public CacheVectorStorage() {
- // No-op.
- }
-
- /**
- * @param size
- * @param cache
- * @param keyMapper
- * @param valMapper
- */
- public CacheVectorStorage(int size, IgniteCache<K, V> cache, VectorKeyMapper<K> keyMapper,
- ValueMapper<V> valMapper) {
- assert size > 0;
- assert cache != null;
- assert keyMapper != null;
- assert valMapper != null;
-
- this.size = size;
- this.cache = cache;
- this.keyMapper = keyMapper;
- this.valMapper = valMapper;
- }
-
- /**
- *
- *
- */
- public IgniteCache<K, V> cache() {
- return cache;
- }
-
- /**
- *
- *
- */
- public VectorKeyMapper<K> keyMapper() {
- return keyMapper;
- }
-
- /**
- *
- *
- */
- public ValueMapper<V> valueMapper() {
- return valMapper;
- }
-
- /** {@inheritDoc} */
- @Override public int size() {
- return size;
- }
-
- /** {@inheritDoc} */
- @Override public double get(int i) {
- return valMapper.toDouble(cache.get(keyMapper.apply(i)));
- }
-
- /** {@inheritDoc} */
- @Override public void set(int i, double v) {
- cache.put(keyMapper.apply(i), valMapper.fromDouble(v));
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- out.writeInt(size);
- out.writeObject(keyMapper);
- out.writeObject(valMapper);
- out.writeUTF(cache.getName());
- }
-
- /** {@inheritDoc} */
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- size = in.readInt();
- keyMapper = (VectorKeyMapper<K>)in.readObject();
- valMapper = (ValueMapper<V>)in.readObject();
- cache = Ignition.localIgnite().getOrCreateCache(in.readUTF());
- }
-
- /** {@inheritDoc} */
- @Override public boolean isSequentialAccess() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDense() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isRandomAccess() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDistributed() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isArrayBased() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- int res = 1;
-
- res = res * 37 + size();
- res = res * 37 + keyMapper.hashCode();
- res = res * 37 + valMapper.hashCode();
- res = res * 37 + cache.hashCode();
-
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object obj) {
- if (this == obj)
- return true;
-
- if (obj == null || getClass() != obj.getClass())
- return false;
-
- CacheVectorStorage that = (CacheVectorStorage)obj;
-
- return size == that.size
- && (keyMapper != null ? keyMapper.getClass().equals(that.keyMapper.getClass()) : that.keyMapper == null)
- && (valMapper != null ? valMapper.getClass().equals(that.valMapper.getClass()) : that.valMapper == null)
- && (cache != null ? cache.equals(that.cache) : that.cache == null);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/ConstantVectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/ConstantVectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/ConstantVectorStorage.java
deleted file mode 100644
index ff5ab26..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/ConstantVectorStorage.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.vector;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import org.apache.ignite.math.VectorStorage;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-
-/**
- * Constant read-only vector storage.
- */
-public class ConstantVectorStorage implements VectorStorage {
- /** */ private int size;
- /** */ private double val;
-
- /**
- *
- */
- public ConstantVectorStorage() {
- // No-op.
- }
-
- /**
- * @param size Vector size.
- * @param val Value to set for vector elements.
- */
- public ConstantVectorStorage(int size, double val) {
- assert size > 0;
-
- this.size = size;
- this.val = val;
- }
-
- /**
- *
- *
- */
- public double constant() {
- return val;
- }
-
- /** {@inheritDoc} */
- @Override public int size() {
- return size;
- }
-
- /** {@inheritDoc} */
- @Override public double get(int i) {
- return val;
- }
-
- /** {@inheritDoc} */
- @Override public void set(int i, double v) {
- throw new UnsupportedOperationException("Can't set value into constant vector.");
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- out.writeInt(size);
- out.writeDouble(val);
- }
-
- /** {@inheritDoc} */
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- size = in.readInt();
- val = in.readDouble();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isSequentialAccess() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDense() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isRandomAccess() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDistributed() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isArrayBased() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- int res = 1;
-
- res = res * 37 + size;
- res = res * 37 + Double.hashCode(val);
-
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object o) {
- if (this == o)
- return true;
-
- if (o == null || getClass() != o.getClass())
- return false;
-
- ConstantVectorStorage that = (ConstantVectorStorage)o;
-
- return size == that.size && val == that.val;
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/DelegateVectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/DelegateVectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/DelegateVectorStorage.java
deleted file mode 100644
index aa6018c..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/DelegateVectorStorage.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.vector;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import org.apache.ignite.math.VectorStorage;
-
-/**
- * {@link VectorStorage} implementation that delegates to parent matrix.
- */
-public class DelegateVectorStorage implements VectorStorage {
- /** Parent vector storage. */
- private VectorStorage sto;
-
- /** Offset in the parent vector. */
- private int off;
-
- /** Size of the vector. */
- private int len;
-
- /**
- *
- */
- public DelegateVectorStorage() {
- // No-op.
- }
-
- /**
- * @param sto Vector storage to delegate to.
- * @param off Offset in the parent vector.
- * @param len Size of the vector.
- */
- public DelegateVectorStorage(VectorStorage sto, int off, int len) {
- assert sto != null;
- assert off >= 0;
- assert len > 0;
-
- this.sto = sto;
- this.off = off;
- this.len = len;
- }
-
- /** */
- public VectorStorage delegate() {
- return sto;
- }
-
- /** */
- public int offset() {
- return off;
- }
-
- /** */
- public int length() {
- return len;
- }
-
- /** {@inheritDoc} */
- @Override public int size() {
- return len;
- }
-
- /** {@inheritDoc} */
- @Override public double get(int i) {
- return sto.get(off + i);
- }
-
- /** {@inheritDoc} */
- @Override public void set(int i, double v) {
- sto.set(off + i, v);
- }
-
- /** {@inheritDoc} */
- @Override public double[] data() {
- return sto.data();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isSequentialAccess() {
- return sto.isSequentialAccess();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDense() {
- return sto.isDense();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isRandomAccess() {
- return sto.isRandomAccess();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDistributed() {
- return sto.isDistributed();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isArrayBased() {
- return sto.isArrayBased();
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- out.writeObject(sto);
- out.writeInt(off);
- out.writeInt(len);
- }
-
- /** {@inheritDoc} */
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- sto = (VectorStorage)in.readObject();
- off = in.readInt();
- len = in.readInt();
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object o) {
- if (this == o)
- return true;
-
- if (o == null || getClass() != o.getClass())
- return false;
-
- DelegateVectorStorage that = (DelegateVectorStorage)o;
-
- return len == that.len && off == that.off && (sto != null ? sto.equals(that.sto) : that.sto == null);
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- int res = 1;
-
- res = res * 37 + off;
- res = res * 37 + len;
- res = res * 37 + sto.hashCode();
-
- return res;
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/DenseLocalOffHeapVectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/DenseLocalOffHeapVectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/DenseLocalOffHeapVectorStorage.java
deleted file mode 100644
index 2e7cdc9..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/DenseLocalOffHeapVectorStorage.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.vector;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.util.stream.IntStream;
-import org.apache.ignite.internal.util.GridUnsafe;
-import org.apache.ignite.math.VectorStorage;
-
-/**
- * Local, dense off-heap vector storage.
- */
-public class DenseLocalOffHeapVectorStorage implements VectorStorage {
- /** Vector size. */
- private int size;
-
- /** */
- private transient long ptr;
- //TODO: temp solution.
- /** */
- private int ptrInitHash;
-
- /**
- *
- */
- public DenseLocalOffHeapVectorStorage() {
- // No-op.
- }
-
- /**
- * @param size Vector size.
- */
- public DenseLocalOffHeapVectorStorage(int size) {
- assert size > 0;
-
- this.size = size;
-
- allocateMemory(size);
- }
-
- /** {@inheritDoc} */
- @Override public int size() {
- return size;
- }
-
- /** {@inheritDoc} */
- @Override public double get(int i) {
- return GridUnsafe.getDouble(pointerOffset(i));
- }
-
- /** {@inheritDoc} */
- @Override public void set(int i, double v) {
- GridUnsafe.putDouble(pointerOffset(i), v);
- }
-
- /** {@inheritDoc} */
- @Override public boolean isArrayBased() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public double[] data() {
- return null;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isSequentialAccess() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDense() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isRandomAccess() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDistributed() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- out.writeInt(size);
- out.writeInt(ptrInitHash);
-
- for (int i = 0; i < size; i++)
- out.writeDouble(get(i));
- }
-
- /** {@inheritDoc} */
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- size = in.readInt();
-
- allocateMemory(size);
-
- ptrInitHash = in.readInt();
-
- for (int i = 0; i < size; i++)
- set(i, in.readDouble());
- }
-
- /** {@inheritDoc} */
- @Override public void destroy() {
- GridUnsafe.freeMemory(ptr);
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- int res = 1;
-
- res = res * 37 + size;
- res = res * 37 + ptrInitHash;
-
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object o) {
- if (this == o)
- return true;
-
- if (o == null || getClass() != o.getClass())
- return false;
-
- DenseLocalOffHeapVectorStorage that = (DenseLocalOffHeapVectorStorage)o;
-
- return size == that.size && isMemoryEquals(that);
- }
-
- /** */
- private boolean isMemoryEquals(DenseLocalOffHeapVectorStorage otherStorage) {
- return IntStream.range(0, size).parallel().noneMatch(idx -> Double.compare(get(idx), otherStorage.get(idx)) != 0);
- }
-
- /**
- * Pointer offset for specific index.
- *
- * @param i Offset index.
- */
- private long pointerOffset(int i) {
- return ptr + i * Double.BYTES;
- }
-
- /** */
- private void allocateMemory(int size) {
- ptr = GridUnsafe.allocateMemory(size * Double.BYTES);
-
- ptrInitHash = Long.hashCode(ptr);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/FunctionVectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/FunctionVectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/FunctionVectorStorage.java
deleted file mode 100644
index df8fa12..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/FunctionVectorStorage.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.vector;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import org.apache.ignite.math.VectorStorage;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.apache.ignite.math.functions.IgniteFunction;
-import org.apache.ignite.math.functions.IntDoubleToVoidFunction;
-
-/**
- * Read-only or read-write function-based vector storage.
- */
-public class FunctionVectorStorage implements VectorStorage {
- /** */ private IgniteFunction<Integer, Double> getFunc;
- /** */ private IntDoubleToVoidFunction setFunc;
- /** */ private int size;
-
- /**
- *
- */
- public FunctionVectorStorage() {
- // No-op.
- }
-
- /**
- * Creates read-only or read-write storage.
- *
- * @param size Cardinality of this vector storage.
- * @param getFunc Get function.
- * @param setFunc Optional set function ({@code null} for read-only storage).
- */
- public FunctionVectorStorage(int size, IgniteFunction<Integer, Double> getFunc, IntDoubleToVoidFunction setFunc) {
- assert size > 0;
- assert getFunc != null; // At least get function is required.
-
- this.size = size;
- this.getFunc = getFunc;
- this.setFunc = setFunc;
- }
-
- /**
- *
- *
- */
- public IgniteFunction<Integer, Double> getFunction() {
- return getFunc;
- }
-
- /**
- *
- *
- */
- public IntDoubleToVoidFunction setFunction() {
- return setFunc;
- }
-
- /**
- * Creates read-only storage.
- *
- * @param size Cardinality of this vector storage.
- * @param getFunc Get function.
- */
- public FunctionVectorStorage(int size, IgniteFunction<Integer, Double> getFunc) {
- this(size, getFunc, null);
- }
-
- /** {@inheritDoc} */
- @Override public int size() {
- return size;
- }
-
- /** {@inheritDoc} */
- @Override public double get(int i) {
- return getFunc.apply(i);
- }
-
- /** {@inheritDoc} */
- @Override public void set(int i, double v) {
- if (setFunc != null)
- setFunc.accept(i, v);
- else
- throw new UnsupportedOperationException("Cannot set into read-only vector.");
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- out.writeObject(setFunc);
- out.writeObject(getFunc);
- out.writeInt(size);
- }
-
- /** {@inheritDoc} */
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- setFunc = (IntDoubleToVoidFunction)in.readObject();
- getFunc = (IgniteFunction<Integer, Double>)in.readObject();
- size = in.readInt();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isSequentialAccess() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDense() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isRandomAccess() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDistributed() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isArrayBased() {
- return false;
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/MatrixVectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/MatrixVectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/MatrixVectorStorage.java
deleted file mode 100644
index ece0003..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/MatrixVectorStorage.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.vector;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.VectorStorage;
-import org.apache.ignite.math.exceptions.IndexException;
-
-/**
- * Row, column or diagonal vector-based view of the matrix
- */
-public class MatrixVectorStorage implements VectorStorage {
- /** */ private Matrix parent;
-
- /** */ private int row;
- /** */ private int col;
-
- /** */ private int rowStride;
- /** */ private int colStride;
-
- /** */ private int size;
-
- /**
- *
- */
- public MatrixVectorStorage() {
- // No-op.
- }
-
- /**
- * @param parent
- * @param row
- * @param col
- * @param rowStride
- * @param colStride
- */
- public MatrixVectorStorage(Matrix parent, int row, int col, int rowStride, int colStride) {
- assert parent != null;
- assert rowStride >= 0;
- assert colStride >= 0;
- assert rowStride > 0 || colStride > 0;
-
- if (row < 0 || row >= parent.rowSize())
- throw new IndexException(row);
- if (col < 0 || col >= parent.columnSize())
- throw new IndexException(col);
-
- this.parent = parent;
-
- this.row = row;
- this.col = col;
-
- this.rowStride = rowStride;
- this.colStride = colStride;
-
- this.size = getSize();
- }
-
- /**
- *
- *
- */
- int row() {
- return row;
- }
-
- /**
- *
- *
- */
- int column() {
- return col;
- }
-
- /**
- *
- *
- */
- int rowStride() {
- return rowStride;
- }
-
- /**
- *
- *
- */
- int columnStride() {
- return colStride;
- }
-
- /**
- *
- *
- */
- private int getSize() {
- if (rowStride != 0 && colStride != 0) {
- int n1 = (parent.rowSize() - row) / rowStride;
- int n2 = (parent.columnSize() - col) / colStride;
-
- return Math.min(n1, n2);
- }
- else if (rowStride > 0)
- return (parent.rowSize() - row) / rowStride;
- else
- return (parent.columnSize() - col) / colStride;
- }
-
- /** {@inheritDoc} */
- @Override public int size() {
- return size;
- }
-
- /** {@inheritDoc} */
- @Override public double get(int i) {
- return parent.get(row + i * rowStride, col + i * colStride);
- }
-
- /** {@inheritDoc} */
- @Override public void set(int i, double v) {
- parent.set(row + i * rowStride, col + i * colStride, v);
- }
-
- /** {@inheritDoc} */
- @Override public boolean isSequentialAccess() {
- return parent.isSequentialAccess();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDense() {
- return parent.isDense();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isRandomAccess() {
- return parent.isRandomAccess();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDistributed() {
- return parent.isDistributed();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isArrayBased() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- out.writeObject(parent);
- out.writeInt(row);
- out.writeInt(col);
- out.writeInt(rowStride);
- out.writeInt(colStride);
- }
-
- /** {@inheritDoc} */
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- parent = (Matrix)in.readObject();
- row = in.readInt();
- col = in.readInt();
- rowStride = in.readInt();
- colStride = in.readInt();
-
- size = getSize();
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/PivotedVectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/PivotedVectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/PivotedVectorStorage.java
deleted file mode 100644
index f69e959..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/PivotedVectorStorage.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.vector;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.util.Arrays;
-import org.apache.ignite.math.VectorStorage;
-
-/**
- * Pivoted (index mapped) view over another vector storage implementation.
- */
-public class PivotedVectorStorage implements VectorStorage {
- /** */ private VectorStorage sto;
-
- /** */ private int[] pivot;
- /** */ private int[] unpivot;
-
- /**
- * @param pivot Pivot array.
- */
- private static int[] reverse(int[] pivot) {
- int[] res = new int[pivot.length];
-
- for (int i = 0; i < pivot.length; i++)
- res[pivot[i]] = i;
-
- return res;
- }
-
- /**
- *
- *
- */
- public int[] pivot() {
- return pivot;
- }
-
- /**
- *
- *
- */
- public int[] unpivot() {
- return unpivot;
- }
-
- /**
- * @param sto Backing vector storage.
- * @param pivot Mapping from external index to internal.
- * @param unpivot Mapping from internal index to external.
- */
- public PivotedVectorStorage(VectorStorage sto, int[] pivot, int[] unpivot) {
- assert sto != null;
- assert pivot != null;
- assert unpivot != null;
-
- this.sto = sto;
- this.pivot = pivot;
- this.unpivot = unpivot;
- }
-
- /**
- * @param sto Backing vector storage.
- * @param pivot Mapping from external index to internal.
- */
- public PivotedVectorStorage(VectorStorage sto, int[] pivot) {
- this(sto, pivot, reverse(pivot));
- }
-
- /**
- *
- */
- public PivotedVectorStorage() {
- // No-op.
- }
-
- /** {@inheritDoc} */
- @Override public int size() {
- return sto.size();
- }
-
- /** {@inheritDoc} */
- @Override public double get(int i) {
- return sto.get(pivot[i]);
- }
-
- /** {@inheritDoc} */
- @Override public void set(int i, double v) {
- sto.set(pivot[i], v);
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- out.writeObject(sto);
- out.writeObject(pivot);
- out.writeObject(unpivot);
- }
-
- /** {@inheritDoc} */
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- sto = (VectorStorage)in.readObject();
- pivot = (int[])in.readObject();
- unpivot = (int[])in.readObject();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isSequentialAccess() {
- return sto.isSequentialAccess();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDense() {
- return sto.isDense();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isRandomAccess() {
- return sto.isRandomAccess();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDistributed() {
- return sto.isDistributed();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isArrayBased() {
- return sto.isArrayBased();
- }
-
- /** {@inheritDoc} */
- @Override public double[] data() {
- return isArrayBased() ? sto.data() : null;
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object o) {
- if (this == o)
- return true;
-
- if (o == null || getClass() != o.getClass())
- return false;
-
- PivotedVectorStorage that = (PivotedVectorStorage)o;
-
- return (sto != null ? sto.equals(that.sto) : that.sto == null) && Arrays.equals(pivot, that.pivot)
- && Arrays.equals(unpivot, that.unpivot);
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- int res = sto != null ? sto.hashCode() : 0;
-
- res = 31 * res + Arrays.hashCode(pivot);
- res = 31 * res + Arrays.hashCode(unpivot);
-
- return res;
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/RandomVectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/RandomVectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/RandomVectorStorage.java
deleted file mode 100644
index 58f0fb4..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/RandomVectorStorage.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.vector;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.nio.ByteBuffer;
-import java.util.Random;
-import org.apache.ignite.math.MurmurHash;
-import org.apache.ignite.math.VectorStorage;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-
-/**
- * {@link VectorStorage} implementation with random values in the vector elements.
- */
-public class RandomVectorStorage implements VectorStorage {
- /** */
- private static final long SCALE = 1L << 32;
- /** */
- private static final int PRIME = 104047;
-
- /** Random generation seed. */
- private int seed;
-
- /** Vector size. */
- private int size;
-
- /** Whether fast hash is used, in {@link #get(int)}. */
- private boolean fastHash;
-
- /** */
- public RandomVectorStorage() {
- // No-op.
- }
-
- /**
- * @param size Size of the storage.
- * @param fastHash Whether or not to use fast hashing or Murmur hashing.
- */
- public RandomVectorStorage(int size, boolean fastHash) {
- assert size > 0;
-
- this.size = size;
- this.fastHash = fastHash;
-
- seed = new Random().nextInt();
- }
-
- /** {@inheritDoc} */
- @Override public int size() {
- return size;
- }
-
- /** {@inheritDoc} */
- @Override public double get(int i) {
- if (!fastHash) {
- ByteBuffer buf = ByteBuffer.allocate(4);
-
- buf.putInt(i);
- buf.flip();
-
- return (MurmurHash.hash64A(buf, seed) & (SCALE - 1)) / (double)SCALE;
- }
- else
- // This isn't a fantastic random number generator, but it is just fine for random projections.
- return (((i * PRIME) & 8) * 0.25) - 1;
- }
-
- /** {@inheritDoc} */
- @Override public void set(int i, double v) {
- throw new UnsupportedOperationException("Random vector storage is a read-only storage.");
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- out.writeInt(size);
- out.writeInt(seed);
- out.writeBoolean(fastHash);
- }
-
- /** {@inheritDoc} */
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- size = in.readInt();
- seed = in.readInt();
- fastHash = in.readBoolean();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isSequentialAccess() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDense() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isRandomAccess() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDistributed() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isArrayBased() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- int res = 1;
-
- res = res * 37 + Boolean.hashCode(fastHash);
- res = res * 37 + seed;
- res = res * 37 + size;
-
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object o) {
- if (this == o)
- return true;
-
- if (o == null || getClass() != o.getClass())
- return false;
-
- RandomVectorStorage that = (RandomVectorStorage)o;
-
- return size == that.size && seed == that.seed && fastHash == that.fastHash;
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/SingleElementVectorDelegateStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/SingleElementVectorDelegateStorage.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/SingleElementVectorDelegateStorage.java
deleted file mode 100644
index c5a4350..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/SingleElementVectorDelegateStorage.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.vector;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.VectorStorage;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-
-/**
- * Single value view storage over another vector.
- */
-public class SingleElementVectorDelegateStorage implements VectorStorage {
- /** */ private int idx;
- /** */ private Vector vec;
-
- /**
- *
- */
- public SingleElementVectorDelegateStorage() {
- // No-op.
- }
-
- /**
- * @param vec Parent vector.
- * @param idx Element index.
- */
- public SingleElementVectorDelegateStorage(Vector vec, int idx) {
- assert vec != null;
- assert idx >= 0;
-
- this.vec = vec;
- this.idx = idx;
- }
-
- /**
- *
- *
- */
- public int index() {
- return idx;
- }
-
- /**
- *
- *
- */
- public Vector delegate() {
- return vec;
- }
-
- /** {@inheritDoc} */
- @Override public int size() {
- return vec.size();
- }
-
- /** {@inheritDoc} */
- @Override public double get(int i) {
- return i == idx ? vec.get(i) : 0.0;
- }
-
- /** {@inheritDoc} */
- @Override public void set(int i, double v) {
- if (i == idx)
- vec.set(i, v);
- else
- throw new UnsupportedOperationException("Can't set element outside of index: " + idx);
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- out.writeObject(vec);
- out.writeInt(idx);
- }
-
- /** {@inheritDoc} */
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- vec = (Vector)in.readObject();
- idx = in.readInt();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isSequentialAccess() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDense() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isRandomAccess() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDistributed() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isArrayBased() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object o) {
- if (this == o)
- return true;
-
- if (o == null || getClass() != o.getClass())
- return false;
-
- SingleElementVectorDelegateStorage that = (SingleElementVectorDelegateStorage)o;
-
- return idx == that.idx && (vec != null ? vec.equals(that.vec) : that.vec == null);
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- int res = idx;
-
- res = 31 * res + (vec != null ? vec.hashCode() : 0);
-
- return res;
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/SingleElementVectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/SingleElementVectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/SingleElementVectorStorage.java
deleted file mode 100644
index 3378817..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/SingleElementVectorStorage.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.vector;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import org.apache.ignite.math.VectorStorage;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-
-/**
- * Vector storage holding a single non-zero value at some index.
- */
-public class SingleElementVectorStorage implements VectorStorage {
- /** */ private int idx;
- /** */ private double val;
- /** */ private int size;
-
- /**
- *
- */
- public SingleElementVectorStorage() {
- // No-op.
- }
-
- /**
- * @param size Parent vector size.
- * @param idx Element index in the parent vector.
- * @param val Value of the element.
- */
- public SingleElementVectorStorage(int size, int idx, double val) {
- assert size > 0;
- assert idx >= 0;
-
- this.size = size;
- this.idx = idx;
- this.val = val;
- }
-
- /**
- *
- * @return Index of the element in the parent vector.
- */
- public int index() {
- return idx;
- }
-
- /** {@inheritDoc} */
- @Override public int size() {
- return size;
- }
-
- /** {@inheritDoc} */
- @Override public double get(int i) {
- return i == idx ? val : 0.0;
- }
-
- /** {@inheritDoc} */
- @Override public void set(int i, double v) {
- if (i == idx)
- val = v;
- else
- throw new UnsupportedOperationException("Can't set element outside of index: " + idx);
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- out.writeInt(size);
- out.writeInt(idx);
- out.writeDouble(val);
- }
-
- /** {@inheritDoc} */
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- size = in.readInt();
- idx = in.readInt();
- val = in.readDouble();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isSequentialAccess() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDense() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isRandomAccess() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDistributed() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isArrayBased() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object o) {
- if (this == o)
- return true;
-
- if (o == null || getClass() != o.getClass())
- return false;
-
- SingleElementVectorStorage that = (SingleElementVectorStorage)o;
-
- return idx == that.idx && Double.compare(that.val, val) == 0 && size == that.size;
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- int res = idx;
- long temp = Double.doubleToLongBits(val);
-
- res = 31 * res + (int)(temp ^ (temp >>> 32));
- res = 31 * res + size;
-
- return res;
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/SparseLocalOffHeapVectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/SparseLocalOffHeapVectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/SparseLocalOffHeapVectorStorage.java
deleted file mode 100644
index 9b912cb..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/SparseLocalOffHeapVectorStorage.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.vector;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.nio.ByteBuffer;
-import org.apache.ignite.internal.util.offheap.GridOffHeapMap;
-import org.apache.ignite.internal.util.offheap.GridOffHeapMapFactory;
-import org.apache.ignite.math.VectorStorage;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-
-/**
- * {@link VectorStorage} implementation for {@link org.apache.ignite.math.impls.vector.SparseLocalOffHeapVector}.
- */
-public class SparseLocalOffHeapVectorStorage implements VectorStorage {
- /** Assume 10% density. */
- private static final int INIT_DENSITY = 10;
- /** Storage capacity. */
- private int size;
- /** Local off heap map. */
- private GridOffHeapMap gridOffHeapMap;
-
- /** */
- public SparseLocalOffHeapVectorStorage() {
- //No-op.
- }
-
- /** */
- public SparseLocalOffHeapVectorStorage(int cap) {
- assert cap > 0;
-
- gridOffHeapMap = GridOffHeapMapFactory.unsafeMap(cap / INIT_DENSITY);
- size = cap;
- }
-
- /** {@inheritDoc} */
- @Override public int size() {
- return size;
- }
-
- /** {@inheritDoc} */
- @Override public double get(int i) {
- byte[] bytes = gridOffHeapMap.get(hash(i), intToByteArray(i));
- return bytes == null ? 0 : ByteBuffer.wrap(bytes).getDouble();
- }
-
- /** {@inheritDoc} */
- @Override public void set(int i, double v) {
- if (v != 0.0)
- gridOffHeapMap.put(hash(i), intToByteArray(i), doubleToByteArray(v));
- else if (gridOffHeapMap.contains(hash(i), intToByteArray(i)))
- gridOffHeapMap.remove(hash(i), intToByteArray(i));
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- throw new UnsupportedOperationException(); // TODO: add externalization support.
- }
-
- /** {@inheritDoc} */
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isSequentialAccess() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isRandomAccess() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDense() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isArrayBased() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDistributed() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public void destroy() {
- gridOffHeapMap.destruct();
- }
-
- /** */
- private int hash(int h) {
- // Apply base step of MurmurHash; see http://code.google.com/p/smhasher/
- // Despite two multiplies, this is often faster than others
- // with comparable bit-spread properties.
- h ^= h >>> 16;
- h *= 0x85ebca6b;
- h ^= h >>> 13;
- h *= 0xc2b2ae35;
-
- return (h >>> 16) ^ h;
- }
-
- /** */
- private byte[] intToByteArray(int val) {
- return new byte[] {
- (byte)(val >>> 24),
- (byte)(val >>> 16),
- (byte)(val >>> 8),
- (byte)val};
- }
-
- /** */
- private byte[] doubleToByteArray(double val) {
- long l = Double.doubleToRawLongBits(val);
- return new byte[] {
- (byte)((l >> 56) & 0xff),
- (byte)((l >> 48) & 0xff),
- (byte)((l >> 40) & 0xff),
- (byte)((l >> 32) & 0xff),
- (byte)((l >> 24) & 0xff),
- (byte)((l >> 16) & 0xff),
- (byte)((l >> 8) & 0xff),
- (byte)((l) & 0xff),
- };
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/SparseLocalOnHeapVectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/SparseLocalOnHeapVectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/SparseLocalOnHeapVectorStorage.java
deleted file mode 100644
index b3a8a3c..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/SparseLocalOnHeapVectorStorage.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.vector;
-
-import it.unimi.dsi.fastutil.ints.Int2DoubleOpenHashMap;
-import it.unimi.dsi.fastutil.ints.Int2DoubleRBTreeMap;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.util.Map;
-import org.apache.ignite.math.StorageConstants;
-import org.apache.ignite.math.VectorStorage;
-
-/**
- * Sparse, local, on-heap vector storage.
- */
-public class SparseLocalOnHeapVectorStorage implements VectorStorage, StorageConstants {
- /** */ private int size;
- /** */ private int acsMode;
-
- /** Actual map storage. */
- private Map<Integer, Double> sto;
-
- /**
- *
- */
- public SparseLocalOnHeapVectorStorage() {
- // No-op.
- }
-
- /**
- * @param size Vector size.
- * @param acsMode Access mode.
- */
- public SparseLocalOnHeapVectorStorage(int size, int acsMode) {
- assert size > 0;
- assertAccessMode(acsMode);
-
- this.size = size;
- this.acsMode = acsMode;
-
- if (acsMode == SEQUENTIAL_ACCESS_MODE)
- sto = new Int2DoubleRBTreeMap();
- else
- sto = new Int2DoubleOpenHashMap();
- }
-
- /**
- *
- *
- */
- public int getAccessMode() {
- return acsMode;
- }
-
- /** {@inheritDoc} */
- @Override public int size() {
- return size;
- }
-
- /** {@inheritDoc} */
- @Override public double get(int i) {
- return sto.getOrDefault(i, 0.0);
- }
-
- /** {@inheritDoc} */
- @Override public void set(int i, double v) {
- if (v != 0.0)
- sto.put(i, v);
- else if (sto.containsKey(i))
- sto.remove(i);
-
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- out.writeInt(size);
- out.writeInt(acsMode);
- out.writeObject(sto);
- }
-
- /** {@inheritDoc} */
- @SuppressWarnings({"unchecked"})
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- size = in.readInt();
- acsMode = in.readInt();
- sto = (Map<Integer, Double>)in.readObject();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isSequentialAccess() {
- return acsMode == SEQUENTIAL_ACCESS_MODE;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDense() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isRandomAccess() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDistributed() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isArrayBased() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object o) {
- if (this == o)
- return true;
-
- if (o == null || getClass() != o.getClass())
- return false;
-
- SparseLocalOnHeapVectorStorage that = (SparseLocalOnHeapVectorStorage)o;
-
- return size == that.size && acsMode == that.acsMode && (sto != null ? sto.equals(that.sto) : that.sto == null);
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- int res = size;
-
- res = 31 * res + acsMode;
- res = 31 * res + (sto != null ? sto.hashCode() : 0);
-
- return res;
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/package-info.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/package-info.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/package-info.java
deleted file mode 100644
index a716e6a..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/package-info.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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 description. -->
- * Contains specific implementations for vector storage models.
- */
-package org.apache.ignite.math.impls.storage.vector;
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/AbstractReadOnlyVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/AbstractReadOnlyVector.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/AbstractReadOnlyVector.java
deleted file mode 100644
index 58c583a..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/AbstractReadOnlyVector.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package org.apache.ignite.math.impls.vector;
-
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.VectorStorage;
-import org.apache.ignite.math.functions.IgniteBiFunction;
-import org.apache.ignite.math.functions.IgniteDoubleFunction;
-import org.apache.ignite.math.impls.matrix.FunctionMatrix;
-
-/**
- * This class provides a helper implementation of the read-only implementation of {@link Vector}
- * interface to minimize the effort required to implement it.
- * Subclasses may override some of the implemented methods if a more
- * specific or optimized implementation is desirable.
- */
-public abstract class AbstractReadOnlyVector extends AbstractVector {
- /** */
- public AbstractReadOnlyVector() {
- // No-op.
- }
-
- /**
- * @param sto Storage.
- */
- public AbstractReadOnlyVector(VectorStorage sto) {
- super(true, sto);
- }
-
- /** {@inheritDoc} */
- @Override public Matrix cross(Vector vec) {
- return new FunctionMatrix(size(), vec.size(),
- (row, col) -> vec.get(col) * get(row));
- }
-
- /** {@inheritDoc} */
- @Override public Matrix toMatrix(boolean rowLike) {
- return new FunctionMatrix(rowLike ? 1 : size(), rowLike ? size() : 1,
- (row, col) -> rowLike ? get(col) : get(row));
- }
-
- /** {@inheritDoc} */
- @Override public Matrix toMatrixPlusOne(boolean rowLike, double zeroVal) {
- return new FunctionMatrix(rowLike ? 1 : size() + 1, rowLike ? size() + 1 : 1, (row, col) -> {
- if (row == 0 && col == 0)
- return zeroVal;
-
- return rowLike ? get(col - 1) : get(row - 1);
- });
- }
-
- /** {@inheritDoc} */
- @Override public Vector copy() {
- return this; // This exploits read-only feature of this type vector.
- }
-
- /** {@inheritDoc} */
- @Override public Vector logNormalize() {
- return logNormalize(2.0, Math.sqrt(getLengthSquared()));
- }
-
- /** {@inheritDoc} */
- @Override public Vector logNormalize(double power) {
- return logNormalize(power, kNorm(power));
- }
-
- /** {@inheritDoc} */
- @Override public Vector map(IgniteDoubleFunction<Double> fun) {
- return new FunctionVector(size(), (i) -> fun.apply(get(i)));
- }
-
- /** {@inheritDoc} */
- @Override public Vector map(Vector vec, IgniteBiFunction<Double, Double, Double> fun) {
- checkCardinality(vec);
-
- return new FunctionVector(size(), (i) -> fun.apply(get(i), vec.get(i)));
- }
-
- /** {@inheritDoc} */
- @Override public Vector map(IgniteBiFunction<Double, Double, Double> fun, double y) {
- return new FunctionVector(size(), (i) -> fun.apply(get(i), y));
- }
-
- /** {@inheritDoc} */
- @Override public Vector divide(double x) {
- if (x == 1.0)
- return this;
-
- return new FunctionVector(size(), (i) -> get(i) / x);
- }
-
- /** {@inheritDoc} */
- @Override public Vector times(double x) {
- return x == 0 ? new ConstantVector(size(), 0) : new FunctionVector(size(), (i) -> get(i) * x);
- }
-
- /**
- * @param power Power.
- * @param normLen Normalized length.
- * @return logNormalized value.
- */
- private Vector logNormalize(double power, double normLen) {
- assert !(Double.isInfinite(power) || power <= 1.0);
-
- double denominator = normLen * Math.log(power);
-
- return new FunctionVector(size(), (idx) -> Math.log1p(get(idx)) / denominator);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/AbstractVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/AbstractVector.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/AbstractVector.java
deleted file mode 100644
index d84c0f3..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/AbstractVector.java
+++ /dev/null
@@ -1,903 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.Spliterator;
-import java.util.function.Consumer;
-import java.util.function.IntToDoubleFunction;
-import org.apache.ignite.lang.IgniteUuid;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.VectorStorage;
-import org.apache.ignite.math.exceptions.CardinalityException;
-import org.apache.ignite.math.exceptions.IndexException;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.apache.ignite.math.functions.Functions;
-import org.apache.ignite.math.functions.IgniteBiFunction;
-import org.apache.ignite.math.functions.IgniteDoubleFunction;
-import org.apache.ignite.math.impls.matrix.MatrixView;
-import org.jetbrains.annotations.NotNull;
-
-/**
- * This class provides a helper implementation of the {@link Vector}
- * interface to minimize the effort required to implement it.
- * Subclasses may override some of the implemented methods if a more
- * specific or optimized implementation is desirable.
- */
-public abstract class AbstractVector implements Vector {
- /** Vector storage implementation. */
- private VectorStorage sto;
-
- /** Meta attribute storage. */
- private Map<String, Object> meta = new HashMap<>();
-
- /** Vector's GUID. */
- private IgniteUuid guid = IgniteUuid.randomUuid();
-
- /** Cached value for length squared. */
- private double lenSq = 0.0;
-
- /** Maximum cached element. */
- private Element maxElm = null;
- /** Minimum cached element. */
- private Element minElm = null;
-
- /** Readonly flag (false by default). */
- private boolean readOnly = false;
-
- /** Read-only error message. */
- private static final String RO_MSG = "Vector is read-only.";
-
- /**
- *
- */
- private void ensureReadOnly() {
- if (readOnly)
- throw new UnsupportedOperationException(RO_MSG);
- }
-
- /**
- * @param sto Storage.
- */
- public AbstractVector(VectorStorage sto) {
- this(false, sto);
- }
-
- /**
- * @param readOnly Is read only.
- * @param sto Storage.
- */
- public AbstractVector(boolean readOnly, VectorStorage sto) {
- assert sto != null;
-
- this.readOnly = readOnly;
- this.sto = sto;
- }
-
- /**
- *
- */
- public AbstractVector() {
- // No-op.
- }
-
- /**
- * Set storage.
- *
- * @param sto Storage.
- */
- protected void setStorage(VectorStorage sto) {
- this.sto = sto;
- }
-
- /**
- * @param i Index.
- * @param v Value.
- */
- protected void storageSet(int i, double v) {
- ensureReadOnly();
-
- sto.set(i, v);
-
- // Reset cached values.
- lenSq = 0.0;
- maxElm = minElm = null;
- }
-
- /**
- * @param i Index.
- * @return Value.
- */
- protected double storageGet(int i) {
- return sto.get(i);
- }
-
- /** {@inheritDoc} */
- @Override public int size() {
- return sto.size();
- }
-
- /**
- * Check index bounds.
- *
- * @param idx Index to check.
- */
- protected void checkIndex(int idx) {
- if (idx < 0 || idx >= sto.size())
- throw new IndexException(idx);
- }
-
- /** {@inheritDoc} */
- @Override public double get(int idx) {
- checkIndex(idx);
-
- return storageGet(idx);
- }
-
- /** {@inheritDoc} */
- @Override public double getX(int idx) {
- return storageGet(idx);
- }
-
- /** {@inheritDoc} */
- @Override public boolean isArrayBased() {
- return sto.isArrayBased();
- }
-
- /** {@inheritDoc} */
- @Override public Vector sort() {
- if (isArrayBased())
- Arrays.parallelSort(sto.data());
- else
- throw new UnsupportedOperationException();
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public Vector map(IgniteDoubleFunction<Double> fun) {
- if (sto.isArrayBased()) {
- double[] data = sto.data();
-
- Arrays.setAll(data, (idx) -> fun.apply(data[idx]));
- }
- else {
- int len = size();
-
- for (int i = 0; i < len; i++)
- storageSet(i, fun.apply(storageGet(i)));
- }
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public Vector map(Vector vec, IgniteBiFunction<Double, Double, Double> fun) {
- checkCardinality(vec);
-
- int len = size();
-
- for (int i = 0; i < len; i++)
- storageSet(i, fun.apply(storageGet(i), vec.get(i)));
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public Vector map(IgniteBiFunction<Double, Double, Double> fun, double y) {
- int len = size();
-
- for (int i = 0; i < len; i++)
- storageSet(i, fun.apply(storageGet(i), y));
-
- return this;
- }
-
- /**
- * @param idx Index.
- * @return Value.
- */
- protected Element makeElement(int idx) {
- checkIndex(idx);
-
- return new Element() {
- /** {@inheritDoc} */
- @Override public double get() {
- return storageGet(idx);
- }
-
- /** {@inheritDoc} */
- @Override public int index() {
- return idx;
- }
-
- /** {@inheritDoc} */
- @Override public void set(double val) {
- storageSet(idx, val);
- }
- };
- }
-
- /** {@inheritDoc} */
- @Override public Element minElement() {
- if (minElm == null) {
- int minIdx = 0;
- int len = size();
-
- for (int i = 0; i < len; i++)
- if (storageGet(i) < storageGet(minIdx))
- minIdx = i;
-
- minElm = makeElement(minIdx);
- }
-
- return minElm;
- }
-
- /** {@inheritDoc} */
- @Override public Element maxElement() {
- if (maxElm == null) {
- int maxIdx = 0;
- int len = size();
-
- for (int i = 0; i < len; i++)
- if (storageGet(i) > storageGet(maxIdx))
- maxIdx = i;
-
- maxElm = makeElement(maxIdx);
- }
-
- return maxElm;
- }
-
- /** {@inheritDoc} */
- @Override public double minValue() {
- return minElement().get();
- }
-
- /** {@inheritDoc} */
- @Override public double maxValue() {
- return maxElement().get();
- }
-
- /** {@inheritDoc} */
- @Override public Vector set(int idx, double val) {
- checkIndex(idx);
-
- storageSet(idx, val);
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public Vector setX(int idx, double val) {
- storageSet(idx, val);
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public Vector increment(int idx, double val) {
- checkIndex(idx);
-
- storageSet(idx, storageGet(idx) + val);
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public Vector incrementX(int idx, double val) {
- storageSet(idx, storageGet(idx) + val);
-
- return this;
- }
-
- /**
- * Tests if given value is considered a zero value.
- *
- * @param val Value to check.
- */
- protected boolean isZero(double val) {
- return val == 0.0;
- }
-
- /** {@inheritDoc} */
- @Override public double sum() {
- double sum = 0;
- int len = size();
-
- for (int i = 0; i < len; i++)
- sum += storageGet(i);
-
- return sum;
- }
-
- /** {@inheritDoc} */
- @Override public IgniteUuid guid() {
- return guid;
- }
-
- /** {@inheritDoc} */
- @Override public Iterable<Element> all() {
- return new Iterable<Element>() {
- private int idx = 0;
-
- /** {@inheritDoc} */
- @NotNull
- @Override public Iterator<Element> iterator() {
- return new Iterator<Element>() {
- /** {@inheritDoc} */
- @Override public boolean hasNext() {
- return size() > 0 && idx < size();
- }
-
- /** {@inheritDoc} */
- @Override public Element next() {
- if (hasNext())
- return getElement(idx++);
-
- throw new NoSuchElementException();
- }
- };
- }
- };
- }
-
- /** {@inheritDoc} */
- @Override public int nonZeroElements() {
- int cnt = 0;
-
- for (Element ignored : nonZeroes())
- cnt++;
-
- return cnt;
- }
-
- /** {@inheritDoc} */
- @Override public <T> T foldMap(IgniteBiFunction<T, Double, T> foldFun, IgniteDoubleFunction<Double> mapFun,
- T zeroVal) {
- T res = zeroVal;
- int len = size();
-
- for (int i = 0; i < len; i++)
- res = foldFun.apply(res, mapFun.apply(storageGet(i)));
-
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public <T> T foldMap(Vector vec, IgniteBiFunction<T, Double, T> foldFun,
- IgniteBiFunction<Double, Double, Double> combFun, T zeroVal) {
- checkCardinality(vec);
-
- T res = zeroVal;
- int len = size();
-
- for (int i = 0; i < len; i++)
- res = foldFun.apply(res, combFun.apply(storageGet(i), vec.getX(i)));
-
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public Iterable<Element> nonZeroes() {
- return new Iterable<Element>() {
- private int idx = 0;
- private int idxNext = -1;
-
- /** {@inheritDoc} */
- @NotNull
- @Override public Iterator<Element> iterator() {
- return new Iterator<Element>() {
- @Override public boolean hasNext() {
- findNext();
-
- return !over();
- }
-
- @Override public Element next() {
- if (hasNext()) {
- idx = idxNext;
-
- return getElement(idxNext);
- }
-
- throw new NoSuchElementException();
- }
-
- private void findNext() {
- if (over())
- return;
-
- if (idxNextInitialized() && idx != idxNext)
- return;
-
- if (idxNextInitialized())
- idx = idxNext + 1;
-
- while (idx < size() && isZero(get(idx)))
- idx++;
-
- idxNext = idx++;
- }
-
- private boolean over() {
- return idxNext >= size();
- }
-
- private boolean idxNextInitialized() {
- return idxNext != -1;
- }
- };
- }
- };
- }
-
- /** {@inheritDoc} */
- @Override public Map<String, Object> getMetaStorage() {
- return meta;
- }
-
- /** {@inheritDoc} */
- @Override public Vector assign(double val) {
- if (sto.isArrayBased()) {
- ensureReadOnly();
-
- Arrays.fill(sto.data(), val);
- }
- else {
- int len = size();
-
- for (int i = 0; i < len; i++)
- storageSet(i, val);
- }
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public Vector assign(double[] vals) {
- checkCardinality(vals);
-
- if (sto.isArrayBased()) {
- ensureReadOnly();
-
- System.arraycopy(vals, 0, sto.data(), 0, vals.length);
-
- lenSq = 0.0;
- }
- else {
- int len = size();
-
- for (int i = 0; i < len; i++)
- storageSet(i, vals[i]);
- }
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public Vector assign(Vector vec) {
- checkCardinality(vec);
-
- for (Vector.Element x : vec.all())
- storageSet(x.index(), x.get());
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public Vector assign(IntToDoubleFunction fun) {
- assert fun != null;
-
- if (sto.isArrayBased()) {
- ensureReadOnly();
-
- Arrays.setAll(sto.data(), fun);
- }
- else {
- int len = size();
-
- for (int i = 0; i < len; i++)
- storageSet(i, fun.applyAsDouble(i));
- }
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public Spliterator<Double> allSpliterator() {
- return new Spliterator<Double>() {
- /** {@inheritDoc} */
- @Override public boolean tryAdvance(Consumer<? super Double> act) {
- int len = size();
-
- for (int i = 0; i < len; i++)
- act.accept(storageGet(i));
-
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public Spliterator<Double> trySplit() {
- return null; // No Splitting.
- }
-
- /** {@inheritDoc} */
- @Override public long estimateSize() {
- return size();
- }
-
- /** {@inheritDoc} */
- @Override public int characteristics() {
- return ORDERED | SIZED;
- }
- };
- }
-
- /** {@inheritDoc} */
- @Override public Spliterator<Double> nonZeroSpliterator() {
- return new Spliterator<Double>() {
- /** {@inheritDoc} */
- @Override public boolean tryAdvance(Consumer<? super Double> act) {
- int len = size();
-
- for (int i = 0; i < len; i++) {
- double val = storageGet(i);
-
- if (!isZero(val))
- act.accept(val);
- }
-
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public Spliterator<Double> trySplit() {
- return null; // No Splitting.
- }
-
- /** {@inheritDoc} */
- @Override public long estimateSize() {
- return nonZeroElements();
- }
-
- /** {@inheritDoc} */
- @Override public int characteristics() {
- return ORDERED | SIZED;
- }
- };
- }
-
- /** {@inheritDoc} */
- @Override public double dot(Vector vec) {
- checkCardinality(vec);
-
- double sum = 0.0;
- int len = size();
-
- for (int i = 0; i < len; i++)
- sum += storageGet(i) * vec.getX(i);
-
- return sum;
- }
-
- /** {@inheritDoc} */
- @Override public double getLengthSquared() {
- if (lenSq == 0.0)
- lenSq = dotSelf();
-
- return lenSq;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDense() {
- return sto.isDense();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isSequentialAccess() {
- return sto.isSequentialAccess();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isRandomAccess() {
- return sto.isRandomAccess();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDistributed() {
- return sto.isDistributed();
- }
-
- /** {@inheritDoc} */
- @Override public VectorStorage getStorage() {
- return sto;
- }
-
- /** {@inheritDoc} */
- @Override public Vector viewPart(int off, int len) {
- return new VectorView(this, off, len);
- }
-
- /** {@inheritDoc} */
- @Override public Matrix cross(Vector vec) {
- Matrix res = likeMatrix(size(), vec.size());
-
- if (res == null)
- return null;
-
- for (Element e : nonZeroes()) {
- int row = e.index();
-
- res.assignRow(row, vec.times(getX(row)));
- }
-
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public Matrix toMatrix(boolean rowLike) {
- Matrix res = likeMatrix(rowLike ? 1 : size(), rowLike ? size() : 1);
-
- if (res == null)
- return null;
-
- if (rowLike)
- res.assignRow(0, this);
- else
- res.assignColumn(0, this);
-
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public Matrix toMatrixPlusOne(boolean rowLike, double zeroVal) {
- Matrix res = likeMatrix(rowLike ? 1 : size() + 1, rowLike ? size() + 1 : 1);
-
- if (res == null)
- return null;
-
- res.set(0, 0, zeroVal);
-
- if (rowLike)
- new MatrixView(res, 0, 1, 1, size()).assignRow(0, this);
- else
- new MatrixView(res, 1, 0, size(), 1).assignColumn(0, this);
-
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public double getDistanceSquared(Vector vec) {
- checkCardinality(vec);
-
- double thisLenSq = getLengthSquared();
- double thatLenSq = vec.getLengthSquared();
- double dot = dot(vec);
- double distEst = thisLenSq + thatLenSq - 2 * dot;
-
- if (distEst > 1.0e-3 * (thisLenSq + thatLenSq))
- // The vectors are far enough from each other that the formula is accurate.
- return Math.max(distEst, 0);
- else
- return foldMap(vec, Functions.PLUS, Functions.MINUS_SQUARED, 0d);
- }
-
- /** */
- protected void checkCardinality(Vector vec) {
- if (vec.size() != size())
- throw new CardinalityException(size(), vec.size());
- }
-
- /** */
- protected void checkCardinality(double[] vec) {
- if (vec.length != size())
- throw new CardinalityException(size(), vec.length);
- }
-
- /** */
- protected void checkCardinality(int[] arr) {
- if (arr.length != size())
- throw new CardinalityException(size(), arr.length);
- }
-
- /** {@inheritDoc} */
- @Override public Vector minus(Vector vec) {
- checkCardinality(vec);
-
- Vector cp = copy();
-
- return cp.map(vec, Functions.MINUS);
- }
-
- /** {@inheritDoc} */
- @Override public Vector plus(double x) {
- Vector cp = copy();
-
- return x != 0.0 ? cp.map(Functions.plus(x)) : cp;
- }
-
- /** {@inheritDoc} */
- @Override public Vector divide(double x) {
- Vector cp = copy();
-
- if (x != 1.0)
- for (Element element : cp.all())
- element.set(element.get() / x);
-
- return cp;
- }
-
- /** {@inheritDoc} */
- @Override public Vector times(double x) {
- if (x == 0.0)
- return like(size());
- else
- return copy().map(Functions.mult(x));
- }
-
- /** {@inheritDoc} */
- @Override public Vector times(Vector vec) {
- checkCardinality(vec);
-
- return copy().map(vec, Functions.MULT);
- }
-
- /** {@inheritDoc} */
- @Override public Vector plus(Vector vec) {
- checkCardinality(vec);
-
- Vector cp = copy();
-
- return cp.map(vec, Functions.PLUS);
- }
-
- /** {@inheritDoc} */
- @Override public Vector logNormalize() {
- return logNormalize(2.0, Math.sqrt(getLengthSquared()));
- }
-
- /** {@inheritDoc} */
- @Override public Vector logNormalize(double power) {
- return logNormalize(power, kNorm(power));
- }
-
- /**
- * @param power Power.
- * @param normLen Normalized length.
- * @return logNormalized value.
- */
- private Vector logNormalize(double power, double normLen) {
- assert !(Double.isInfinite(power) || power <= 1.0);
-
- double denominator = normLen * Math.log(power);
-
- Vector cp = copy();
-
- for (Element element : cp.all())
- element.set(Math.log1p(element.get()) / denominator);
-
- return cp;
- }
-
- /** {@inheritDoc} */
- @Override public double kNorm(double power) {
- assert power >= 0.0;
-
- // Special cases.
- if (Double.isInfinite(power))
- return foldMap(Math::max, Math::abs, 0d);
- else if (power == 2.0)
- return Math.sqrt(getLengthSquared());
- else if (power == 1.0)
- return foldMap(Functions.PLUS, Math::abs, 0d);
- else if (power == 0.0)
- return nonZeroElements();
- else
- // Default case.
- return Math.pow(foldMap(Functions.PLUS, Functions.pow(power), 0d), 1.0 / power);
- }
-
- /** {@inheritDoc} */
- @Override public Vector normalize() {
- return divide(Math.sqrt(getLengthSquared()));
- }
-
- /** {@inheritDoc} */
- @Override public Vector normalize(double power) {
- return divide(kNorm(power));
- }
-
- /** {@inheritDoc} */
- @Override public Vector copy() {
- return like(size()).assign(this);
- }
-
- /**
- * @return Result of dot with self.
- */
- protected double dotSelf() {
- double sum = 0.0;
- int len = size();
-
- for (int i = 0; i < len; i++) {
- double v = storageGet(i);
-
- sum += v * v;
- }
-
- return sum;
- }
-
- /** {@inheritDoc} */
- @Override public Element getElement(int idx) {
- return makeElement(idx);
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- out.writeObject(sto);
- out.writeObject(meta);
- out.writeObject(guid);
- out.writeBoolean(readOnly);
- }
-
- /** {@inheritDoc} */
- @SuppressWarnings("unchecked")
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- sto = (VectorStorage)in.readObject();
- meta = (Map<String, Object>)in.readObject();
- guid = (IgniteUuid)in.readObject();
- readOnly = in.readBoolean();
- }
-
- /** {@inheritDoc} */
- @Override public void destroy() {
- sto.destroy();
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- int res = 1;
- res += res * 37 + guid.hashCode();
- res += sto == null ? 0 : res * 37 + sto.hashCode();
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object obj) {
- if (this == obj)
- return true;
-
- if (obj == null || getClass() != obj.getClass())
- return false;
-
- AbstractVector that = (AbstractVector)obj;
-
- return (sto != null ? sto.equals(that.sto) : that.sto == null);
- }
-}
[38/67] [abbrv] ignite git commit: IGNITE-4082 Define filter names in
app.js instead of filter definitions.
Posted by sb...@apache.org.
IGNITE-4082 Define filter names in app.js instead of filter definitions.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/7297e1dc
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/7297e1dc
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/7297e1dc
Branch: refs/heads/ignite-5075
Commit: 7297e1dcac183e81336a588a17fc1a706b8075d7
Parents: 25f0f75
Author: Ilya Borisov <kl...@gmail.com>
Authored: Fri Apr 28 17:09:02 2017 +0700
Committer: Alexey Kuznetsov <ak...@apache.org>
Committed: Fri Apr 28 17:09:02 2017 +0700
----------------------------------------------------------------------
modules/web-console/frontend/app/app.js | 8 ++++----
modules/web-console/frontend/app/filters/byName.filter.js | 4 ++--
.../frontend/app/filters/domainsValidation.filter.js | 4 ++--
modules/web-console/frontend/app/filters/duration.filter.js | 4 ++--
modules/web-console/frontend/app/filters/hasPojo.filter.js | 4 ++--
5 files changed, 12 insertions(+), 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/7297e1dc/modules/web-console/frontend/app/app.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/app.js b/modules/web-console/frontend/app/app.js
index a8460e9..1f87196 100644
--- a/modules/web-console/frontend/app/app.js
+++ b/modules/web-console/frontend/app/app.js
@@ -226,11 +226,11 @@ angular
.controller(...igfs)
.controller(...profile)
// Filters.
-.filter(...byName)
+.filter('byName', byName)
.filter('defaultName', defaultName)
-.filter(...domainsValidation)
-.filter(...duration)
-.filter(...hasPojo)
+.filter('domainsValidation', domainsValidation)
+.filter('duration', duration)
+.filter('hasPojo', hasPojo)
.filter('uiGridSubcategories', uiGridSubcategories)
.config(['$translateProvider', '$stateProvider', '$locationProvider', '$urlRouterProvider', ($translateProvider, $stateProvider, $locationProvider, $urlRouterProvider) => {
$translateProvider.translations('en', i18n);
http://git-wip-us.apache.org/repos/asf/ignite/blob/7297e1dc/modules/web-console/frontend/app/filters/byName.filter.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/filters/byName.filter.js b/modules/web-console/frontend/app/filters/byName.filter.js
index 3b0746f..2769189 100644
--- a/modules/web-console/frontend/app/filters/byName.filter.js
+++ b/modules/web-console/frontend/app/filters/byName.filter.js
@@ -15,9 +15,9 @@
* limitations under the License.
*/
-export default ['byName', [() => (arr, search) => {
+export default [() => (arr, search) => {
if (!(arr && arr.length) || !search)
return arr;
return _.filter(arr, ({ name }) => name.indexOf(search) >= 0);
-}]];
+}];
http://git-wip-us.apache.org/repos/asf/ignite/blob/7297e1dc/modules/web-console/frontend/app/filters/domainsValidation.filter.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/filters/domainsValidation.filter.js b/modules/web-console/frontend/app/filters/domainsValidation.filter.js
index 1a38392..eec0ff1 100644
--- a/modules/web-console/frontend/app/filters/domainsValidation.filter.js
+++ b/modules/web-console/frontend/app/filters/domainsValidation.filter.js
@@ -16,7 +16,7 @@
*/
// Filter domain models with key fields configuration.
-export default ['domainsValidation', ['IgniteLegacyUtils', (LegacyUtils) => (domains, valid, invalid) => {
+export default ['IgniteLegacyUtils', (LegacyUtils) => (domains, valid, invalid) => {
if (valid && invalid)
return domains;
@@ -30,4 +30,4 @@ export default ['domainsValidation', ['IgniteLegacyUtils', (LegacyUtils) => (dom
});
return out;
-}]];
+}];
http://git-wip-us.apache.org/repos/asf/ignite/blob/7297e1dc/modules/web-console/frontend/app/filters/duration.filter.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/filters/duration.filter.js b/modules/web-console/frontend/app/filters/duration.filter.js
index 0d7afe6..770bca3 100644
--- a/modules/web-console/frontend/app/filters/duration.filter.js
+++ b/modules/web-console/frontend/app/filters/duration.filter.js
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-export default ['duration', [() => {
+export default [() => {
/**
* @param {Number} t Time in ms.
*/
@@ -38,4 +38,4 @@ export default ['duration', [() => {
return a(d, 'd') + a(h, 'h') + a(m, 'm') + a(s, 's') + (t < cm ? ms + 'ms' : '');
};
-}]];
+}];
http://git-wip-us.apache.org/repos/asf/ignite/blob/7297e1dc/modules/web-console/frontend/app/filters/hasPojo.filter.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/filters/hasPojo.filter.js b/modules/web-console/frontend/app/filters/hasPojo.filter.js
index ee50051..57530db 100644
--- a/modules/web-console/frontend/app/filters/hasPojo.filter.js
+++ b/modules/web-console/frontend/app/filters/hasPojo.filter.js
@@ -16,6 +16,6 @@
*/
// Filter that return 'true' if caches has at least one domain with 'generatePojo' flag.
-export default ['hasPojo', [() => ({caches} = []) =>
+export default [() => ({caches} = []) =>
_.find(caches, (cache) => cache.domains && cache.domains.length &&
- cache.domains.find((domain) => domain.generatePojo))]];
+ cache.domains.find((domain) => domain.generatePojo))];
[14/67] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math
module to Ignite ML module added missed licenses renamed packages fixed wrong
ml profile activation (cherry picked from commit d78e071)
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/PivotedMatrixView.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/PivotedMatrixView.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/PivotedMatrixView.java
new file mode 100644
index 0000000..b9a3b17
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/PivotedMatrixView.java
@@ -0,0 +1,243 @@
+/*
+ * 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.ignite.ml.math.impls.matrix;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.MatrixStorage;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.IndexException;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.impls.storage.matrix.PivotedMatrixStorage;
+import org.apache.ignite.ml.math.impls.vector.PivotedVectorView;
+
+/**
+ * Pivoted (index mapped) view over another matrix implementation.
+ */
+public class PivotedMatrixView extends AbstractMatrix {
+ /** Pivoted matrix. */
+ private Matrix mtx;
+
+ /**
+ *
+ */
+ public PivotedMatrixView() {
+ // No-op.
+ }
+
+ /**
+ * @param mtx
+ * @param rowPivot
+ * @param colPivot
+ */
+ public PivotedMatrixView(Matrix mtx, int[] rowPivot, int[] colPivot) {
+ super(new PivotedMatrixStorage(mtx == null ? null : mtx.getStorage(), rowPivot, colPivot));
+
+ this.mtx = mtx;
+ }
+
+ /**
+ * @param mtx
+ */
+ public PivotedMatrixView(Matrix mtx) {
+ super(new PivotedMatrixStorage(mtx == null ? null : mtx.getStorage()));
+
+ this.mtx = mtx;
+ }
+
+ /**
+ * @param mtx
+ * @param pivot
+ */
+ public PivotedMatrixView(Matrix mtx, int[] pivot) {
+ super(new PivotedMatrixStorage(mtx == null ? null : mtx.getStorage(), pivot));
+
+ this.mtx = mtx;
+ }
+
+ /**
+ * Swaps indexes {@code i} and {@code j} for both both row and column.
+ *
+ * @param i First index to swap.
+ * @param j Second index to swap.
+ */
+ public Matrix swap(int i, int j) {
+ swapRows(i, j);
+ swapColumns(i, j);
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix swapRows(int i, int j) {
+ if (i < 0 || i >= storage().rowPivot().length)
+ throw new IndexException(i);
+ if (j < 0 || j >= storage().rowPivot().length)
+ throw new IndexException(j);
+
+ storage().swapRows(i, j);
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix swapColumns(int i, int j) {
+ if (i < 0 || i >= storage().columnPivot().length)
+ throw new IndexException(i);
+ if (j < 0 || j >= storage().columnPivot().length)
+ throw new IndexException(j);
+
+ storage().swapColumns(i, j);
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector viewRow(int row) {
+ return new PivotedVectorView(
+ mtx.viewRow(storage().rowPivot()[row]),
+ storage().columnPivot(),
+ storage().columnUnpivot()
+ );
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector viewColumn(int col) {
+ return new PivotedVectorView(
+ mtx.viewColumn(storage().columnPivot()[col]),
+ storage().rowPivot(),
+ storage().rowUnpivot()
+ );
+ }
+
+ /**
+ *
+ *
+ */
+ public Matrix getBaseMatrix() {
+ return mtx;
+ }
+
+ /**
+ *
+ *
+ */
+ public int[] rowPivot() {
+ return storage().rowPivot();
+ }
+
+ /**
+ *
+ *
+ */
+ public int[] columnPivot() {
+ return storage().columnPivot();
+ }
+
+ /**
+ * @param i
+ */
+ public int rowPivot(int i) {
+ return storage().rowPivot()[i];
+ }
+
+ /**
+ * @param i
+ */
+ public int columnPivot(int i) {
+ return storage().columnPivot()[i];
+ }
+
+ /**
+ * @param i
+ */
+ public int rowUnpivot(int i) {
+ return storage().rowUnpivot()[i];
+ }
+
+ /**
+ * @param i
+ */
+ public int columnUnpivot(int i) {
+ return storage().columnUnpivot()[i];
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ super.writeExternal(out);
+
+ out.writeObject(mtx);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ super.readExternal(in);
+
+ mtx = (Matrix)in.readObject();
+ }
+
+ /**
+ *
+ *
+ */
+ private PivotedMatrixStorage storage() {
+ return (PivotedMatrixStorage)getStorage();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix copy() {
+ return new PivotedMatrixView(mtx, storage().rowPivot(), storage().columnPivot());
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix like(int rows, int cols) {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector likeVector(int crd) {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ int res = 1;
+
+ res = res * 37 + mtx.hashCode();
+ res = res * 37 + getStorage().hashCode();
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object o) {
+ if (this == o)
+ return true;
+
+ if (o == null || getClass() != o.getClass())
+ return false;
+
+ PivotedMatrixView that = (PivotedMatrixView)o;
+
+ MatrixStorage sto = storage();
+
+ return mtx.equals(that.mtx) && sto.equals(that.storage());
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/RandomMatrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/RandomMatrix.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/RandomMatrix.java
new file mode 100644
index 0000000..ece4ca9
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/RandomMatrix.java
@@ -0,0 +1,97 @@
+/*
+ * 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.ignite.ml.math.impls.matrix;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.MatrixStorage;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.impls.storage.matrix.RandomMatrixStorage;
+import org.apache.ignite.ml.math.impls.vector.RandomVector;
+
+/**
+ * Implementation of {@link Matrix} with random values in the elements.
+ */
+public class RandomMatrix extends AbstractMatrix {
+ /** Whether fast hash is used, see {@link RandomMatrixStorage}. */
+ private boolean fastHash;
+
+ /**
+ * @param rows Amount of rows in the matrix.
+ * @param cols Amount of columns in the matrix.
+ * @param fastHash Whether fast hash is used.
+ */
+ private MatrixStorage mkStorage(int rows, int cols, boolean fastHash) {
+ this.fastHash = fastHash;
+
+ return new RandomMatrixStorage(rows, cols, fastHash);
+ }
+
+ /**
+ * @param rows Amount of rows in the matrix.
+ * @param cols Amount of columns in the matrix.
+ * @param fastHash Whether fast hash is used.
+ */
+ public RandomMatrix(int rows, int cols, boolean fastHash) {
+ setStorage(mkStorage(rows, cols, fastHash));
+ }
+
+ /**
+ * @param rows Amount of rows in the matrix.
+ * @param cols Amount of columns in the matrix.
+ */
+ public RandomMatrix(int rows, int cols) {
+ this(rows, cols, true);
+ }
+
+ /** */
+ public RandomMatrix() {
+ // No-op.
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix copy() {
+ return new RandomMatrix(rowSize(), columnSize(), fastHash);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix like(int rows, int cols) {
+ return new RandomMatrix(rows, cols);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector likeVector(int crd) {
+ return new RandomVector(crd);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ super.writeExternal(out);
+
+ out.writeBoolean(fastHash);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ super.readExternal(in);
+
+ fastHash = in.readBoolean();
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedMatrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedMatrix.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedMatrix.java
new file mode 100644
index 0000000..8a7cffe
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedMatrix.java
@@ -0,0 +1,155 @@
+// @java.file.header
+
+/* _________ _____ __________________ _____
+ * __ ____/___________(_)______ /__ ____/______ ____(_)_______
+ * _ / __ __ ___/__ / _ __ / _ / __ _ __ `/__ / __ __ \
+ * / /_/ / _ / _ / / /_/ / / /_/ / / /_/ / _ / _ / / /
+ * \____/ /_/ /_/ \_,__/ \____/ \__,_/ /_/ /_/ /_/
+ */
+
+/*
+ * 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.ignite.ml.math.impls.matrix;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.StorageConstants;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.functions.IgniteDoubleFunction;
+import org.apache.ignite.ml.math.functions.IgniteFunction;
+import org.apache.ignite.ml.math.impls.CacheUtils;
+import org.apache.ignite.ml.math.impls.storage.matrix.SparseDistributedMatrixStorage;
+
+/**
+ * Sparse distributed matrix implementation based on data grid.
+ *
+ * Unlike {@link CacheMatrix} that is based on existing cache, this implementation creates distributed
+ * cache internally and doesn't rely on pre-existing cache.
+ *
+ * You also need to call {@link #destroy()} to remove the underlying cache when you no longer need this
+ * matrix.
+ *
+ * <b>Currently fold supports only commutative operations.<b/>
+ */
+public class SparseDistributedMatrix extends AbstractMatrix implements StorageConstants {
+ /**
+ *
+ */
+ public SparseDistributedMatrix() {
+ // No-op.
+ }
+
+ /**
+ * @param rows
+ * @param cols
+ * @param stoMode
+ * @param acsMode
+ */
+ public SparseDistributedMatrix(int rows, int cols, int stoMode, int acsMode) {
+ assert rows > 0;
+ assert cols > 0;
+ assertAccessMode(acsMode);
+ assertStorageMode(stoMode);
+
+ setStorage(new SparseDistributedMatrixStorage(rows, cols, stoMode, acsMode));
+ }
+
+ /**
+ *
+ *
+ */
+ private SparseDistributedMatrixStorage storage() {
+ return (SparseDistributedMatrixStorage)getStorage();
+ }
+
+ /**
+ * Return the same matrix with updates values (broken contract).
+ *
+ * @param d
+ */
+ @Override public Matrix divide(double d) {
+ return mapOverValues((Double v) -> v / d);
+ }
+
+ /**
+ * Return the same matrix with updates values (broken contract).
+ *
+ * @param x
+ */
+ @Override public Matrix plus(double x) {
+ return mapOverValues((Double v) -> v + x);
+ }
+
+ /**
+ * Return the same matrix with updates values (broken contract).
+ *
+ * @param x
+ */
+ @Override public Matrix times(double x) {
+ return mapOverValues((Double v) -> v * x);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix assign(double val) {
+ return mapOverValues((Double v) -> val);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix map(IgniteDoubleFunction<Double> fun) {
+ return mapOverValues(fun::apply);
+ }
+
+ /**
+ * @param mapper
+ */
+ private Matrix mapOverValues(IgniteFunction<Double, Double> mapper) {
+ CacheUtils.sparseMap(storage().cache().getName(), mapper);
+
+ return this;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double sum() {
+ return CacheUtils.sparseSum(storage().cache().getName());
+ }
+
+ /** {@inheritDoc} */
+ @Override public double maxValue() {
+ return CacheUtils.sparseMax(storage().cache().getName());
+ }
+
+ /** {@inheritDoc} */
+ @Override public double minValue() {
+ return CacheUtils.sparseMin(storage().cache().getName());
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix copy() {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix like(int rows, int cols) {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector likeVector(int crd) {
+ throw new UnsupportedOperationException();
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseLocalOnHeapMatrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseLocalOnHeapMatrix.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseLocalOnHeapMatrix.java
new file mode 100644
index 0000000..d711295
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseLocalOnHeapMatrix.java
@@ -0,0 +1,72 @@
+/*
+ * 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.ignite.ml.math.impls.matrix;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.MatrixStorage;
+import org.apache.ignite.ml.math.StorageConstants;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.impls.storage.matrix.SparseLocalOnHeapMatrixStorage;
+import org.apache.ignite.ml.math.impls.vector.SparseLocalVector;
+
+/**
+ * Sparse local onheap matrix with {@link SparseLocalVector} as rows.
+ */
+public class SparseLocalOnHeapMatrix extends AbstractMatrix implements StorageConstants {
+ /**
+ *
+ */
+ public SparseLocalOnHeapMatrix() {
+ // No-op.
+ }
+
+ /**
+ * Construct new {@link SparseLocalOnHeapMatrix}.
+ *
+ * By default storage sets in row optimized mode and in random access mode.
+ */
+ public SparseLocalOnHeapMatrix(int rows, int cols) {
+ setStorage(mkStorage(rows, cols));
+ }
+
+ /**
+ * Create new {@link SparseLocalOnHeapMatrixStorage}.
+ */
+ private MatrixStorage mkStorage(int rows, int cols) {
+ return new SparseLocalOnHeapMatrixStorage(rows, cols, StorageConstants.RANDOM_ACCESS_MODE, StorageConstants.ROW_STORAGE_MODE);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix like(int rows, int cols) {
+ return new SparseLocalOnHeapMatrix(rows, cols);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector likeVector(int crd) {
+ return new SparseLocalVector(crd, StorageConstants.RANDOM_ACCESS_MODE);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix copy() {
+ Matrix cp = like(rowSize(), columnSize());
+
+ cp.assign(this);
+
+ return cp;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/TransposedMatrixView.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/TransposedMatrixView.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/TransposedMatrixView.java
new file mode 100644
index 0000000..309570b
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/TransposedMatrixView.java
@@ -0,0 +1,84 @@
+/*
+ * 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.ignite.ml.math.impls.matrix;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.MatrixStorage;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.impls.storage.matrix.MatrixDelegateStorage;
+
+/**
+ * Implements transposed view of the parent {@link Matrix}.
+ */
+public class TransposedMatrixView extends AbstractMatrix {
+ /** */
+ public TransposedMatrixView() {
+ //No-op.
+ }
+
+ /**
+ * @param mtx Parent matrix.
+ */
+ public TransposedMatrixView(Matrix mtx) {
+ this(mtx == null ? null : mtx.getStorage());
+ }
+
+ /** */
+ private TransposedMatrixView(MatrixStorage sto) {
+ super(new MatrixDelegateStorage(sto, 0, 0,
+ sto == null ? 0 : sto.rowSize(), sto == null ? 0 : sto.columnSize()));
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void storageSet(int row, int col, double v) {
+ super.storageSet(col, row, v);
+ }
+
+ /** {@inheritDoc} */
+ @Override protected double storageGet(int row, int col) {
+ return super.storageGet(col, row);
+ }
+
+ /** {@inheritDoc} */
+ @Override public int rowSize() {
+ return getStorage().columnSize();
+ }
+
+ /** {@inheritDoc} */
+ @Override public int columnSize() {
+ return getStorage().rowSize();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix copy() {
+ MatrixDelegateStorage sto = (MatrixDelegateStorage)getStorage();
+
+ return new TransposedMatrixView(sto.delegate());
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix like(int rows, int cols) {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector likeVector(int crd) {
+ throw new UnsupportedOperationException();
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/package-info.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/package-info.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/package-info.java
new file mode 100644
index 0000000..9eabf80
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * 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 description. -->
+ * Contains several matrix implementations.
+ */
+package org.apache.ignite.ml.math.impls.matrix;
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/package-info.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/package-info.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/package-info.java
new file mode 100644
index 0000000..d531014
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * 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 description. -->
+ * Contains specific implementations for core algebra.
+ */
+package org.apache.ignite.ml.math.impls;
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/ArrayMatrixStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/ArrayMatrixStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/ArrayMatrixStorage.java
new file mode 100644
index 0000000..397bf93
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/ArrayMatrixStorage.java
@@ -0,0 +1,161 @@
+/*
+ * 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.ignite.ml.math.impls.storage.matrix;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.Arrays;
+import org.apache.ignite.ml.math.MatrixStorage;
+
+/**
+ * Array based {@link MatrixStorage} implementation.
+ */
+public class ArrayMatrixStorage implements MatrixStorage {
+ /** Backing data array. */
+ private double[][] data;
+ /** Amount of rows in the matrix. */
+ private int rows;
+ /** Amount of columns in the matrix. */
+ private int cols;
+
+ /**
+ *
+ */
+ public ArrayMatrixStorage() {
+ // No-op.
+ }
+
+ /**
+ * @param rows Amount of rows in the matrix.
+ * @param cols Amount of columns in the matrix.
+ */
+ public ArrayMatrixStorage(int rows, int cols) {
+ assert rows > 0;
+ assert cols > 0;
+
+ this.data = new double[rows][cols];
+ this.rows = rows;
+ this.cols = cols;
+ }
+
+ /**
+ * @param data Backing data array.
+ */
+ public ArrayMatrixStorage(double[][] data) {
+ assert data != null;
+ assert data[0] != null;
+
+ this.data = data;
+ this.rows = data.length;
+ this.cols = data[0].length;
+
+ assert rows > 0;
+ assert cols > 0;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double get(int x, int y) {
+ return data[x][y];
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isSequentialAccess() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDense() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isRandomAccess() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDistributed() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void set(int x, int y, double v) {
+ data[x][y] = v;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int columnSize() {
+ return cols;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int rowSize() {
+ return rows;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isArrayBased() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double[][] data() {
+ return data;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeInt(rows);
+ out.writeInt(cols);
+
+ out.writeObject(data);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ rows = in.readInt();
+ cols = in.readInt();
+
+ data = (double[][])in.readObject();
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ int res = 1;
+
+ res += res * 37 + rows;
+ res += res * 37 + cols;
+ res += res * 37 + Arrays.deepHashCode(data);
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object o) {
+ if (this == o)
+ return true;
+
+ if (o == null || getClass() != o.getClass())
+ return false;
+
+ ArrayMatrixStorage that = (ArrayMatrixStorage)o;
+
+ return Arrays.deepEquals(data, that.data);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/CacheMatrixStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/CacheMatrixStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/CacheMatrixStorage.java
new file mode 100644
index 0000000..510c4cf
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/CacheMatrixStorage.java
@@ -0,0 +1,180 @@
+/*
+ * 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.ignite.ml.math.impls.storage.matrix;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.Ignition;
+import org.apache.ignite.ml.math.MatrixKeyMapper;
+import org.apache.ignite.ml.math.MatrixStorage;
+import org.apache.ignite.ml.math.ValueMapper;
+
+/**
+ * Matrix storage based on arbitrary cache and key and value mapping functions.
+ */
+public class CacheMatrixStorage<K, V> implements MatrixStorage {
+ /** */ private int rows;
+ /** */ private int cols;
+ /** */ private IgniteCache<K, V> cache;
+ /** */ private MatrixKeyMapper<K> keyMapper;
+ /** */ private ValueMapper<V> valMapper;
+
+ /**
+ *
+ */
+ public CacheMatrixStorage() {
+ // No-op.
+ }
+
+ /**
+ * @param rows
+ * @param cols
+ * @param cache
+ * @param keyMapper
+ * @param valMapper
+ */
+ public CacheMatrixStorage(int rows, int cols, IgniteCache<K, V> cache, MatrixKeyMapper<K> keyMapper,
+ ValueMapper<V> valMapper) {
+ assert rows > 0;
+ assert cols > 0;
+ assert cache != null;
+ assert keyMapper != null;
+ assert valMapper != null;
+
+ this.rows = rows;
+ this.cols = cols;
+ this.cache = cache;
+ this.keyMapper = keyMapper;
+ this.valMapper = valMapper;
+ }
+
+ /**
+ * @return Ignite cache.
+ */
+ public IgniteCache<K, V> cache() {
+ return cache;
+ }
+
+ /**
+ * @return Key mapper.
+ */
+ public MatrixKeyMapper<K> keyMapper() {
+ return keyMapper;
+ }
+
+ /**
+ * @return Value mapper.
+ */
+ public ValueMapper<V> valueMapper() {
+ return valMapper;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double get(int x, int y) {
+ return valMapper.toDouble(cache.get(keyMapper.apply(x, y)));
+ }
+
+ /** {@inheritDoc} */
+ @Override public void set(int x, int y, double v) {
+ cache.put(keyMapper.apply(x, y), valMapper.fromDouble(v));
+ }
+
+ /** {@inheritDoc} */
+ @Override public int columnSize() {
+ return cols;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int rowSize() {
+ return rows;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeInt(rows);
+ out.writeInt(cols);
+ out.writeUTF(cache.getName());
+ out.writeObject(keyMapper);
+ out.writeObject(valMapper);
+ }
+
+ /** {@inheritDoc} */
+ @SuppressWarnings({"unchecked"})
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ rows = in.readInt();
+ cols = in.readInt();
+ cache = Ignition.localIgnite().getOrCreateCache(in.readUTF());
+ keyMapper = (MatrixKeyMapper<K>)in.readObject();
+ valMapper = (ValueMapper<V>)in.readObject();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isSequentialAccess() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDense() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isRandomAccess() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDistributed() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isArrayBased() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ int res = 1;
+
+ res = res * 37 + rows;
+ res = res * 37 + cols;
+ res = res * 37 + cache.hashCode();
+ res = res * 37 + keyMapper.hashCode();
+ res = res * 37 + valMapper.hashCode();
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object o) {
+ if (this == o)
+ return true;
+
+ if (o == null || getClass() != o.getClass())
+ return false;
+
+ CacheMatrixStorage that = (CacheMatrixStorage)o;
+
+ return (cache != null ? cache.equals(that.cache) : that.cache == null) &&
+ (keyMapper != null ? keyMapper.equals(that.keyMapper) : that.keyMapper == null) &&
+ (valMapper != null ? valMapper.equals(that.valMapper) : that.valMapper == null);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/DenseOffHeapMatrixStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/DenseOffHeapMatrixStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/DenseOffHeapMatrixStorage.java
new file mode 100644
index 0000000..74952a9
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/DenseOffHeapMatrixStorage.java
@@ -0,0 +1,197 @@
+/*
+ * 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.ignite.ml.math.impls.storage.matrix;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.internal.util.GridUnsafe;
+import org.apache.ignite.ml.math.MatrixStorage;
+
+/**
+ * Local, dense off-heap matrix storage.
+ */
+public class DenseOffHeapMatrixStorage implements MatrixStorage {
+ /** */ private int rows;
+ /** */ private int cols;
+ /** */ private transient long ptr;
+ //TODO: temp solution.
+ /** */ private int ptrInitHash;
+
+ /** */
+ public DenseOffHeapMatrixStorage() {
+ // No-op.
+ }
+
+ /** */
+ public DenseOffHeapMatrixStorage(int rows, int cols) {
+ assert rows > 0;
+ assert cols > 0;
+
+ this.rows = rows;
+ this.cols = cols;
+
+ allocateMemory(rows, cols);
+ }
+
+ /** */
+ public DenseOffHeapMatrixStorage(double[][] data) {
+ assert data != null;
+ assert data[0] != null;
+
+ this.rows = data.length;
+ this.cols = data[0].length;
+
+ assert rows > 0;
+ assert cols > 0;
+
+ allocateMemory(rows, cols);
+
+ for (int i = 0; i < rows; i++)
+ for (int j = 0; j < cols; j++)
+ set(i, j, data[i][j]);
+ }
+
+ /** {@inheritDoc} */
+ @Override public double get(int x, int y) {
+ return GridUnsafe.getDouble(pointerOffset(x, y));
+ }
+
+ /** {@inheritDoc} */
+ @Override public void set(int x, int y, double v) {
+ GridUnsafe.putDouble(pointerOffset(x, y), v);
+ }
+
+ /** {@inheritDoc} */
+ @Override public int columnSize() {
+ return cols;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isSequentialAccess() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDense() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isRandomAccess() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDistributed() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int rowSize() {
+ return rows;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isArrayBased() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double[][] data() {
+ return null;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeInt(rows);
+ out.writeInt(cols);
+ out.writeInt(ptrInitHash);
+
+ for (int i = 0; i < rows; i++)
+ for (int j = 0; j < cols; j++)
+ out.writeDouble(get(i, j));
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ rows = in.readInt();
+ cols = in.readInt();
+
+ allocateMemory(rows, cols);
+
+ ptrInitHash = in.readInt();
+
+ for (int i = 0; i < rows; i++)
+ for (int j = 0; j < cols; j++)
+ set(i, j, in.readDouble());
+ }
+
+ /** {@inheritDoc} */
+ @Override public void destroy() {
+ GridUnsafe.freeMemory(ptr);
+ }
+
+ /** {@inheritDoc} */
+ private long pointerOffset(int x, int y) {
+ return ptr + x * cols * Double.BYTES + y * Double.BYTES;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object obj) {
+ return obj != null &&
+ getClass().equals(obj.getClass()) &&
+ (rows == ((DenseOffHeapMatrixStorage)obj).rows) &&
+ (cols == ((DenseOffHeapMatrixStorage)obj).cols) &&
+ (rows == 0 || cols == 0 || ptr == ((DenseOffHeapMatrixStorage)obj).ptr || isMemoryEquals((DenseOffHeapMatrixStorage)obj));
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ int res = 1;
+
+ res = res * 37 + rows;
+ res = res * 37 + cols;
+ res = res * 37 + ptrInitHash;
+
+ return res;
+ }
+
+ /** */
+ private boolean isMemoryEquals(DenseOffHeapMatrixStorage otherStorage) {
+ boolean res = true;
+
+ for (int i = 0; i < otherStorage.rows; i++) {
+ for (int j = 0; j < otherStorage.cols; j++) {
+ if (Double.compare(get(i, j), otherStorage.get(i, j)) != 0) {
+ res = false;
+ break;
+ }
+ }
+ }
+
+ return res;
+ }
+
+ /** */
+ private void allocateMemory(int rows, int cols) {
+ ptr = GridUnsafe.allocateMemory(rows * cols * Double.BYTES);
+
+ ptrInitHash = Long.hashCode(ptr);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/DiagonalMatrixStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/DiagonalMatrixStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/DiagonalMatrixStorage.java
new file mode 100644
index 0000000..9daacee
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/DiagonalMatrixStorage.java
@@ -0,0 +1,136 @@
+/*
+ * 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.ignite.ml.math.impls.storage.matrix;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.ml.math.MatrixStorage;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+
+/**
+ * {@link MatrixStorage} implementation for diagonal Matrix view.
+ */
+public class DiagonalMatrixStorage implements MatrixStorage {
+ /** Backing vector for matrix diagonal. */
+ private Vector diagonal;
+
+ /**
+ *
+ */
+ public DiagonalMatrixStorage() {
+ // No-op.
+ }
+
+ /**
+ * @param diagonal Backing {@link Vector} for matrix diagonal.
+ */
+ public DiagonalMatrixStorage(Vector diagonal) {
+ assert diagonal != null;
+
+ this.diagonal = diagonal;
+ }
+
+ /**
+ *
+ */
+ public Vector diagonal() {
+ return diagonal;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double get(int x, int y) {
+ return x == y ? diagonal.get(x) : 0.0;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void set(int x, int y, double v) {
+ if (x == y)
+ diagonal.set(x, v);
+ else
+ throw new UnsupportedOperationException("Can't set off-diagonal element.");
+ }
+
+ /** {@inheritDoc} */
+ @Override public int columnSize() {
+ return diagonal.size();
+ }
+
+ /** {@inheritDoc} */
+ @Override public int rowSize() {
+ return diagonal.size();
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeObject(diagonal);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ diagonal = (Vector)in.readObject();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isSequentialAccess() {
+ return diagonal.isSequentialAccess();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDense() {
+ return diagonal.isDense();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isRandomAccess() {
+ return diagonal.isRandomAccess();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDistributed() {
+ return diagonal.isDistributed();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isArrayBased() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ int res = 1;
+
+ res = res * 37 + diagonal.hashCode();
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object o) {
+ if (this == o)
+ return true;
+
+ if (o == null || getClass() != o.getClass())
+ return false;
+
+ DiagonalMatrixStorage that = (DiagonalMatrixStorage)o;
+
+ return diagonal.equals(that.diagonal);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/FunctionMatrixStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/FunctionMatrixStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/FunctionMatrixStorage.java
new file mode 100644
index 0000000..acd7c29
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/FunctionMatrixStorage.java
@@ -0,0 +1,175 @@
+/*
+ * 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.ignite.ml.math.impls.storage.matrix;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.ml.math.MatrixStorage;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.functions.IntIntDoubleToVoidFunction;
+import org.apache.ignite.ml.math.functions.IntIntToDoubleFunction;
+
+/**
+ * Read-only or read-write function-based matrix storage.
+ */
+public class FunctionMatrixStorage implements MatrixStorage {
+ /** */ private int rows;
+ /** */ private int cols;
+
+ /** */ private IntIntToDoubleFunction getFunc;
+ /** */ private IntIntDoubleToVoidFunction setFunc;
+
+ /**
+ *
+ */
+ public FunctionMatrixStorage() {
+ // No-op.
+ }
+
+ /**
+ * @param rows Amount of rows in the matrix.
+ * @param cols Amount of columns in the matrix.
+ * @param getFunc Function that returns value corresponding to given row and column index.
+ * @param setFunc Set function. If {@code null} - this will be a read-only matrix.
+ */
+ public FunctionMatrixStorage(int rows, int cols, IntIntToDoubleFunction getFunc,
+ IntIntDoubleToVoidFunction setFunc) {
+ assert rows > 0;
+ assert cols > 0;
+ assert getFunc != null;
+
+ this.rows = rows;
+ this.cols = cols;
+ this.getFunc = getFunc;
+ this.setFunc = setFunc;
+ }
+
+ /**
+ * @param rows Amount of rows in the matrix.
+ * @param cols Amount of columns in the matrix.
+ * @param getFunc Function that returns value corresponding to given row and column index.
+ */
+ public FunctionMatrixStorage(int rows, int cols, IntIntToDoubleFunction getFunc) {
+ this(rows, cols, getFunc, null);
+ }
+
+ /** {@inheritDoc} */
+ @Override public double get(int x, int y) {
+ return getFunc.apply(x, y);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void set(int x, int y, double v) {
+ if (setFunc != null)
+ setFunc.apply(x, y, v);
+ else
+ throw new UnsupportedOperationException("Cannot set into read-only matrix.");
+ }
+
+ /**
+ *
+ */
+ public IntIntToDoubleFunction getFunction() {
+ return getFunc;
+ }
+
+ /**
+ *
+ */
+ public IntIntDoubleToVoidFunction setFunction() {
+ return setFunc;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int columnSize() {
+ return cols;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int rowSize() {
+ return rows;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeObject(setFunc);
+ out.writeObject(getFunc);
+ out.writeInt(rows);
+ out.writeInt(cols);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ setFunc = (IntIntDoubleToVoidFunction)in.readObject();
+ getFunc = (IntIntToDoubleFunction)in.readObject();
+ rows = in.readInt();
+ cols = in.readInt();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isSequentialAccess() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDense() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isRandomAccess() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDistributed() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isArrayBased() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object o) {
+ if (this == o)
+ return true;
+
+ if (o == null || getClass() != o.getClass())
+ return false;
+
+ FunctionMatrixStorage that = (FunctionMatrixStorage)o;
+
+ return rows == that.rows && cols == that.cols
+ && (getFunc != null ? getFunc.equals(that.getFunc) : that.getFunc == null)
+ && (setFunc != null ? setFunc.equals(that.setFunc) : that.setFunc == null);
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ int res = rows;
+
+ res = 31 * res + cols;
+ res = 31 * res + (getFunc != null ? getFunc.hashCode() : 0);
+ res = 31 * res + (setFunc != null ? setFunc.hashCode() : 0);
+
+ return res;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixDelegateStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixDelegateStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixDelegateStorage.java
new file mode 100644
index 0000000..1f77d0f
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixDelegateStorage.java
@@ -0,0 +1,205 @@
+/*
+ * 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.ignite.ml.math.impls.storage.matrix;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.ml.math.MatrixStorage;
+
+/**
+ * {@link MatrixStorage} implementation that delegates to parent matrix.
+ */
+public class MatrixDelegateStorage implements MatrixStorage {
+ /** Parent matrix storage. */
+ private MatrixStorage sto;
+
+ /** Row offset in the parent matrix. */
+ private int rowOff;
+ /** Column offset in the parent matrix. */
+ private int colOff;
+
+ /** Amount of rows in the matrix. */
+ private int rows;
+ /** Amount of columns in the matrix. */
+ private int cols;
+
+ /**
+ *
+ */
+ public MatrixDelegateStorage() {
+ // No-op.
+ }
+
+ /**
+ * @param sto Backing parent storage.
+ * @param rowOff Row offset to parent matrix.
+ * @param colOff Column offset to parent matrix.
+ * @param rows Amount of rows in the view.
+ * @param cols Amount of columns in the view.
+ */
+ public MatrixDelegateStorage(MatrixStorage sto, int rowOff, int colOff, int rows, int cols) {
+ assert sto != null;
+ assert rowOff >= 0;
+ assert colOff >= 0;
+ assert rows > 0;
+ assert cols > 0;
+
+ this.sto = sto;
+
+ this.rowOff = rowOff;
+ this.colOff = colOff;
+
+ this.rows = rows;
+ this.cols = cols;
+ }
+
+ /**
+ *
+ */
+ public MatrixStorage delegate() {
+ return sto;
+ }
+
+ /**
+ *
+ */
+ public int rowOffset() {
+ return rowOff;
+ }
+
+ /**
+ *
+ */
+ public int columnOffset() {
+ return colOff;
+ }
+
+ /**
+ *
+ */
+ public int rowsLength() {
+ return rows;
+ }
+
+ /**
+ *
+ */
+ public int columnsLength() {
+ return cols;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double get(int x, int y) {
+ return sto.get(rowOff + x, colOff + y);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void set(int x, int y, double v) {
+ sto.set(rowOff + x, colOff + y, v);
+ }
+
+ /** {@inheritDoc} */
+ @Override public int columnSize() {
+ return cols;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int rowSize() {
+ return rows;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isArrayBased() {
+ return sto.isArrayBased() && rowOff == 0 && colOff == 0;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isSequentialAccess() {
+ return sto.isSequentialAccess();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDense() {
+ return sto.isDense();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isRandomAccess() {
+ return sto.isRandomAccess();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDistributed() {
+ return sto.isDistributed();
+ }
+
+ /** {@inheritDoc} */
+ @Override public double[][] data() {
+ return sto.data();
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeObject(sto);
+
+ out.writeInt(rowOff);
+ out.writeInt(colOff);
+
+ out.writeInt(rows);
+ out.writeInt(cols);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ sto = (MatrixStorage)in.readObject();
+
+ rowOff = in.readInt();
+ colOff = in.readInt();
+
+ rows = in.readInt();
+ cols = in.readInt();
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ int res = 1;
+
+ res = res * 37 + rows;
+ res = res * 37 + cols;
+ res = res * 37 + rowOff;
+ res = res * 37 + colOff;
+ res = res * 37 + sto.hashCode();
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object o) {
+ if (this == o)
+ return true;
+
+ if (o == null || getClass() != o.getClass())
+ return false;
+
+ MatrixDelegateStorage that = (MatrixDelegateStorage)o;
+
+ return rows == that.rows && cols == that.cols && rowOff == that.rowOff && colOff == that.colOff &&
+ (sto != null ? sto.equals(that.sto) : that.sto == null);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/PivotedMatrixStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/PivotedMatrixStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/PivotedMatrixStorage.java
new file mode 100644
index 0000000..ab9b871
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/PivotedMatrixStorage.java
@@ -0,0 +1,256 @@
+/*
+ * 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.ignite.ml.math.impls.storage.matrix;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.Arrays;
+import org.apache.ignite.ml.math.MatrixStorage;
+
+/**
+ * Pivoted (index mapped) view over another matrix storage implementation.
+ */
+public class PivotedMatrixStorage implements MatrixStorage {
+ /** Matrix storage. */
+ private MatrixStorage sto;
+
+ /** */
+ private int[] rowPivot;
+ /** */
+ private int[] colPivot;
+ /** */
+ private int[] rowUnpivot;
+ /** */
+ private int[] colUnpivot;
+
+ /**
+ *
+ */
+ public PivotedMatrixStorage() {
+ // No-op.
+ }
+
+ /**
+ * @param sto Matrix storage.
+ * @param rowPivot Pivot array for rows.
+ * @param colPivot Pivot array for columns.
+ */
+ public PivotedMatrixStorage(MatrixStorage sto, int[] rowPivot, int[] colPivot) {
+ assert sto != null;
+ assert rowPivot != null;
+ assert colPivot != null;
+
+ this.sto = sto;
+ this.rowPivot = rowPivot;
+ this.colPivot = colPivot;
+
+ rowUnpivot = invert(rowPivot);
+ colUnpivot = invert(colPivot);
+ }
+
+ /**
+ *
+ */
+ public int[] rowPivot() {
+ return rowPivot;
+ }
+
+ /**
+ *
+ */
+ public int[] columnPivot() {
+ return colPivot;
+ }
+
+ /**
+ *
+ */
+ public int[] rowUnpivot() {
+ return rowUnpivot;
+ }
+
+ /**
+ *
+ */
+ public int[] columnUnpivot() {
+ return colUnpivot;
+ }
+
+ /**
+ * @param sto Matrix storage.
+ * @param pivot Pivot array.
+ */
+ public PivotedMatrixStorage(MatrixStorage sto, int[] pivot) {
+ this(sto, pivot, pivot == null ? null : java.util.Arrays.copyOf(pivot, pivot.length));
+ }
+
+ /**
+ * @param sto Matrix storage.
+ */
+ public PivotedMatrixStorage(MatrixStorage sto) {
+ this(sto, sto == null ? null : identityPivot(sto.rowSize()), sto == null ? null : identityPivot(sto.columnSize()));
+ }
+
+ /**
+ * @param i First row index to swap.
+ * @param j Second row index to swap.
+ */
+ public void swapRows(int i, int j) {
+ if (i != j) {
+ int tmp = rowPivot[i];
+
+ rowPivot[i] = rowPivot[j];
+ rowPivot[j] = tmp;
+
+ rowUnpivot[rowPivot[i]] = i;
+ rowUnpivot[rowPivot[j]] = j;
+ }
+ }
+
+ /**
+ * @param i First column index to swap.
+ * @param j Second column index to swap.
+ */
+ public void swapColumns(int i, int j) {
+ if (i != j) {
+ int tmp = colPivot[i];
+
+ colPivot[i] = colPivot[j];
+ colPivot[j] = tmp;
+
+ colUnpivot[colPivot[i]] = i;
+ colUnpivot[colPivot[j]] = j;
+ }
+ }
+
+ /** {@inheritDoc} */
+ @Override public double get(int x, int y) {
+ return sto.get(rowPivot[x], colPivot[y]);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void set(int x, int y, double v) {
+ sto.set(rowPivot[x], colPivot[y], v);
+ }
+
+ /** {@inheritDoc} */
+ @Override public int columnSize() {
+ return sto.columnSize();
+ }
+
+ /** {@inheritDoc} */
+ @Override public int rowSize() {
+ return sto.rowSize();
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeObject(sto);
+ out.writeObject(rowPivot);
+ out.writeObject(colPivot);
+ out.writeObject(rowUnpivot);
+ out.writeObject(colUnpivot);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ sto = (MatrixStorage)in.readObject();
+ rowPivot = (int[])in.readObject();
+ colPivot = (int[])in.readObject();
+ rowUnpivot = (int[])in.readObject();
+ colUnpivot = (int[])in.readObject();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isSequentialAccess() {
+ return sto.isSequentialAccess();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDense() {
+ return sto.isDense();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isRandomAccess() {
+ return sto.isRandomAccess();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDistributed() {
+ return sto.isDistributed();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isArrayBased() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ int res = 1;
+
+ res = res * 37 + sto.hashCode();
+ res = res * 37 + Arrays.hashCode(rowPivot);
+ res = res * 37 + Arrays.hashCode(rowUnpivot);
+ res = res * 37 + Arrays.hashCode(colPivot);
+ res = res * 37 + Arrays.hashCode(colUnpivot);
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+
+ if (obj == null || getClass() != obj.getClass())
+ return false;
+
+ PivotedMatrixStorage that = (PivotedMatrixStorage)obj;
+
+ return Arrays.equals(rowPivot, that.rowPivot) && Arrays.equals(rowUnpivot, that.rowUnpivot)
+ && Arrays.equals(colPivot, that.colPivot) && Arrays.equals(colUnpivot, that.colUnpivot)
+ && (sto != null ? sto.equals(that.sto) : that.sto == null);
+ }
+
+ /**
+ * @param n Pivot array length.
+ */
+ private static int[] identityPivot(int n) {
+ int[] pivot = new int[n];
+
+ for (int i = 0; i < n; i++)
+ pivot[i] = i;
+
+ return pivot;
+ }
+
+ /**
+ * @param pivot Pivot array to be inverted.
+ */
+ private static int[] invert(int[] pivot) {
+ int[] x = new int[pivot.length];
+
+ for (int i = 0; i < pivot.length; i++)
+ x[pivot[i]] = i;
+
+ return x;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/RandomMatrixStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/RandomMatrixStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/RandomMatrixStorage.java
new file mode 100644
index 0000000..7e0ef27
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/RandomMatrixStorage.java
@@ -0,0 +1,176 @@
+/*
+ * 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.ignite.ml.math.impls.storage.matrix;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.nio.ByteBuffer;
+import org.apache.ignite.ml.math.MatrixStorage;
+import org.apache.ignite.ml.math.MurmurHash;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+
+/**
+ * {@link MatrixStorage} implementation with random values in the matrix elements.
+ */
+public class RandomMatrixStorage implements MatrixStorage {
+ /** */
+ private static final int PRIME1 = 104047;
+ /** */
+ private static final int PRIME2 = 101377;
+ /** */
+ private static final int PRIME3 = 64661;
+ /** */
+ private static final long SCALE = 1L << 32;
+
+ /** Random generation seed. */
+ private int seed;
+
+ /** Amount of rows in the matrix. */
+ private int rows;
+ /** Amount of columns in the matrix. */
+ private int cols;
+
+ /** Whether fast hash is used, in {@link #get(int, int)}. */
+ private boolean fastHash;
+
+ /**
+ * For externalization.
+ */
+ public RandomMatrixStorage() {
+ // No-op.
+ }
+
+ /**
+ * @param rows Amount of rows in the matrix.
+ * @param cols Amount of columns in the matrix.
+ * @param fastHash Whether fast hash is used.
+ */
+ public RandomMatrixStorage(int rows, int cols, boolean fastHash) {
+ assert rows > 0;
+ assert cols > 0;
+
+ this.rows = rows;
+ this.cols = cols;
+ this.fastHash = fastHash;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double get(int x, int y) {
+ if (!fastHash) {
+ ByteBuffer buf = ByteBuffer.allocate(8);
+
+ buf.putInt(x);
+ buf.putInt(y);
+ buf.flip();
+
+ return (MurmurHash.hash64A(buf, seed) & (SCALE - 1)) / (double)SCALE;
+ }
+ else
+ // This isn't a fantastic random number generator, but it is just fine for random projections.
+ return ((((x * PRIME1) + y * PRIME2 + x * y * PRIME3) & 8) * 0.25) - 1;
+ }
+
+ /**
+ *
+ */
+ public boolean isFastHash() {
+ return fastHash;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void set(int x, int y, double v) {
+ throw new UnsupportedOperationException("Random matrix storage is a read-only storage.");
+ }
+
+ /** {@inheritDoc} */
+ @Override public int columnSize() {
+ return cols;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int rowSize() {
+ return rows;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeInt(rows);
+ out.writeInt(cols);
+ out.writeInt(seed);
+ out.writeBoolean(fastHash);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ rows = in.readInt();
+ cols = in.readInt();
+ seed = in.readInt();
+ fastHash = in.readBoolean();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isSequentialAccess() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDense() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isRandomAccess() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDistributed() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isArrayBased() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ int res = 1;
+
+ res = res * 37 + Boolean.hashCode(fastHash);
+ res = res * 37 + seed;
+ res = res * 37 + cols;
+ res = res * 37 + rows;
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object o) {
+ if (this == o)
+ return true;
+
+ if (o == null || getClass() != o.getClass())
+ return false;
+
+ RandomMatrixStorage that = (RandomMatrixStorage)o;
+
+ return rows == that.rows && cols == that.cols && seed == that.seed && fastHash == that.fastHash;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/SparseDistributedMatrixStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/SparseDistributedMatrixStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/SparseDistributedMatrixStorage.java
new file mode 100644
index 0000000..cf200c7
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/SparseDistributedMatrixStorage.java
@@ -0,0 +1,290 @@
+/*
+ * 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.ignite.ml.math.impls.storage.matrix;
+
+import it.unimi.dsi.fastutil.ints.Int2DoubleOpenHashMap;
+import it.unimi.dsi.fastutil.ints.Int2DoubleRBTreeMap;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.Map;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.Ignition;
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.cache.CachePeekMode;
+import org.apache.ignite.cache.CacheWriteSynchronizationMode;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.lang.IgniteUuid;
+import org.apache.ignite.ml.math.MatrixStorage;
+import org.apache.ignite.ml.math.StorageConstants;
+import org.apache.ignite.ml.math.impls.CacheUtils;
+import org.apache.ignite.ml.math.impls.matrix.SparseDistributedMatrix;
+
+/**
+ * {@link MatrixStorage} implementation for {@link SparseDistributedMatrix}.
+ */
+public class SparseDistributedMatrixStorage extends CacheUtils implements MatrixStorage, StorageConstants {
+ /** Amount of rows in the matrix. */
+ private int rows;
+ /** Amount of columns in the matrix. */
+ private int cols;
+
+ /** Row or column based storage mode. */
+ private int stoMode;
+ /** Random or sequential access mode. */
+ private int acsMode;
+
+ /** Actual distributed storage. */
+ private IgniteCache<
+ Integer /* Row or column index. */,
+ Map<Integer, Double> /* Map-based row or column. */
+ > cache = null;
+
+ /**
+ *
+ */
+ public SparseDistributedMatrixStorage() {
+ // No-op.
+ }
+
+ /**
+ * @param rows Amount of rows in the matrix.
+ * @param cols Amount of columns in the matrix.
+ * @param stoMode Row or column based storage mode.
+ * @param acsMode Random or sequential access mode.
+ */
+ public SparseDistributedMatrixStorage(int rows, int cols, int stoMode, int acsMode) {
+ assert rows > 0;
+ assert cols > 0;
+ assertAccessMode(acsMode);
+ assertStorageMode(stoMode);
+
+ this.rows = rows;
+ this.cols = cols;
+ this.stoMode = stoMode;
+ this.acsMode = acsMode;
+
+ cache = newCache();
+ }
+
+ /**
+ *
+ *
+ */
+ private IgniteCache<Integer, Map<Integer, Double>> newCache() {
+ CacheConfiguration<Integer, Map<Integer, Double>> cfg = new CacheConfiguration<>();
+
+ // Assume 10% density.
+ cfg.setStartSize(Math.max(1024, (rows * cols) / 10));
+
+ // Write to primary.
+ cfg.setWriteSynchronizationMode(CacheWriteSynchronizationMode.PRIMARY_SYNC);
+
+ // Atomic transactions only.
+ cfg.setAtomicityMode(CacheAtomicityMode.ATOMIC);
+
+ // No eviction.
+ cfg.setEvictionPolicy(null);
+
+ // No copying of values.
+ cfg.setCopyOnRead(false);
+
+ // Cache is partitioned.
+ cfg.setCacheMode(CacheMode.PARTITIONED);
+
+ // Random cache name.
+ cfg.setName(new IgniteUuid().shortString());
+
+ return Ignition.localIgnite().getOrCreateCache(cfg);
+ }
+
+ /**
+ *
+ *
+ */
+ public IgniteCache<Integer, Map<Integer, Double>> cache() {
+ return cache;
+ }
+
+ /**
+ *
+ *
+ */
+ public int accessMode() {
+ return acsMode;
+ }
+
+ /**
+ *
+ *
+ */
+ public int storageMode() {
+ return stoMode;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double get(int x, int y) {
+ if (stoMode == ROW_STORAGE_MODE)
+ return matrixGet(cache.getName(), x, y);
+ else
+ return matrixGet(cache.getName(), y, x);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void set(int x, int y, double v) {
+ if (stoMode == ROW_STORAGE_MODE)
+ matrixSet(cache.getName(), x, y, v);
+ else
+ matrixSet(cache.getName(), y, x, v);
+ }
+
+ /**
+ * Distributed matrix get.
+ *
+ * @param cacheName Matrix's cache.
+ * @param a Row or column index.
+ * @param b Row or column index.
+ * @return Matrix value at (a, b) index.
+ */
+ private double matrixGet(String cacheName, int a, int b) {
+ // Remote get from the primary node (where given row or column is stored locally).
+ return ignite().compute(groupForKey(cacheName, a)).call(() -> {
+ IgniteCache<Integer, Map<Integer, Double>> cache = Ignition.localIgnite().getOrCreateCache(cacheName);
+
+ // Local get.
+ Map<Integer, Double> map = cache.localPeek(a, CachePeekMode.PRIMARY);
+
+ return (map == null || !map.containsKey(b)) ? 0.0 : map.get(b);
+ });
+ }
+
+ /**
+ * Distributed matrix set.
+ *
+ * @param cacheName Matrix's cache.
+ * @param a Row or column index.
+ * @param b Row or column index.
+ * @param v New value to set.
+ */
+ private void matrixSet(String cacheName, int a, int b, double v) {
+ // Remote set on the primary node (where given row or column is stored locally).
+ ignite().compute(groupForKey(cacheName, a)).run(() -> {
+ IgniteCache<Integer, Map<Integer, Double>> cache = Ignition.localIgnite().getOrCreateCache(cacheName);
+
+ // Local get.
+ Map<Integer, Double> map = cache.localPeek(a, CachePeekMode.PRIMARY);
+
+ if (map == null)
+ map = acsMode == SEQUENTIAL_ACCESS_MODE ? new Int2DoubleRBTreeMap() : new Int2DoubleOpenHashMap();
+
+ if (v != 0.0)
+ map.put(b, v);
+ else if (map.containsKey(b))
+ map.remove(b);
+
+ // Local put.
+ cache.put(a, map);
+ });
+ }
+
+ /** {@inheritDoc} */
+ @Override public int columnSize() {
+ return cols;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int rowSize() {
+ return rows;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeInt(rows);
+ out.writeInt(cols);
+ out.writeInt(acsMode);
+ out.writeInt(stoMode);
+ out.writeUTF(cache.getName());
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ rows = in.readInt();
+ cols = in.readInt();
+ acsMode = in.readInt();
+ stoMode = in.readInt();
+ cache = ignite().getOrCreateCache(in.readUTF());
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isSequentialAccess() {
+ return acsMode == SEQUENTIAL_ACCESS_MODE;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDense() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isRandomAccess() {
+ return acsMode == RANDOM_ACCESS_MODE;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDistributed() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isArrayBased() {
+ return false;
+ }
+
+ /** Destroy underlying cache. */
+ @Override public void destroy() {
+ cache.destroy();
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ int res = 1;
+
+ res = res * 37 + cols;
+ res = res * 37 + rows;
+ res = res * 37 + acsMode;
+ res = res * 37 + stoMode;
+ res = res * 37 + cache.hashCode();
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+
+ if (obj == null || getClass() != obj.getClass())
+ return false;
+
+ SparseDistributedMatrixStorage that = (SparseDistributedMatrixStorage)obj;
+
+ return rows == that.rows && cols == that.cols && acsMode == that.acsMode && stoMode == that.stoMode
+ && (cache != null ? cache.equals(that.cache) : that.cache == null);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/SparseLocalOnHeapMatrixStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/SparseLocalOnHeapMatrixStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/SparseLocalOnHeapMatrixStorage.java
new file mode 100644
index 0000000..4530900
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/SparseLocalOnHeapMatrixStorage.java
@@ -0,0 +1,226 @@
+/*
+ * 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.ignite.ml.math.impls.storage.matrix;
+
+import it.unimi.dsi.fastutil.ints.Int2DoubleOpenHashMap;
+import it.unimi.dsi.fastutil.ints.Int2DoubleRBTreeMap;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.ignite.ml.math.MatrixStorage;
+import org.apache.ignite.ml.math.StorageConstants;
+
+/**
+ * Storage for sparse, local, on-heap matrix.
+ */
+public class SparseLocalOnHeapMatrixStorage implements MatrixStorage, StorageConstants {
+ /** Default zero value. */
+ private static final double DEFAULT_VALUE = 0.0;
+
+ /** */ private int rows;
+ /** */ private int cols;
+
+ /** */ private int acsMode;
+ /** */ private int stoMode;
+
+ /** Actual map storage. */
+ private Map<Integer, Map<Integer, Double>> sto;
+
+ /** */
+ public SparseLocalOnHeapMatrixStorage() {
+ // No-op.
+ }
+
+ /** */
+ public SparseLocalOnHeapMatrixStorage(int rows, int cols, int acsMode, int stoMode) {
+ assert rows > 0;
+ assert cols > 0;
+ assertAccessMode(acsMode);
+ assertStorageMode(stoMode);
+
+ this.rows = rows;
+ this.cols = cols;
+ this.acsMode = acsMode;
+ this.stoMode = stoMode;
+
+ sto = new HashMap<>();
+ }
+
+ /**
+ *
+ *
+ */
+ public int getStorageMode() {
+ return stoMode;
+ }
+
+ /**
+ *
+ *
+ */
+ public int getAccessMode() {
+ return acsMode;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double get(int x, int y) {
+ if (stoMode == ROW_STORAGE_MODE) {
+ Map<Integer, Double> row = sto.get(x);
+
+ if (row != null) {
+ Double val = row.get(y);
+
+ if (val != null)
+ return val;
+ }
+
+ return DEFAULT_VALUE;
+ }
+ else {
+ Map<Integer, Double> col = sto.get(y);
+
+ if (col != null) {
+ Double val = col.get(x);
+
+ if (val != null)
+ return val;
+ }
+
+ return DEFAULT_VALUE;
+ }
+ }
+
+ /** {@inheritDoc} */
+ @Override public void set(int x, int y, double v) {
+ // Ignore default values (currently 0.0).
+ if (v != DEFAULT_VALUE) {
+ if (stoMode == ROW_STORAGE_MODE) {
+ Map<Integer, Double> row = sto.computeIfAbsent(x, k ->
+ acsMode == SEQUENTIAL_ACCESS_MODE ? new Int2DoubleRBTreeMap() : new Int2DoubleOpenHashMap());
+
+ row.put(y, v);
+ }
+ else {
+ Map<Integer, Double> col = sto.computeIfAbsent(y, k ->
+ acsMode == SEQUENTIAL_ACCESS_MODE ? new Int2DoubleRBTreeMap() : new Int2DoubleOpenHashMap());
+
+ col.put(x, v);
+ }
+ }
+ else {
+ if (stoMode == ROW_STORAGE_MODE) {
+ if (sto.containsKey(x)) {
+ Map<Integer, Double> row = sto.get(x);
+
+ if (row.containsKey(y))
+ row.remove(y);
+ }
+
+ }
+ else {
+ if (sto.containsKey(y)) {
+ Map<Integer, Double> col = sto.get(y);
+
+ if (col.containsKey(x))
+ col.remove(x);
+ }
+ }
+ }
+ }
+
+ /** {@inheritDoc} */
+ @Override public int columnSize() {
+ return cols;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int rowSize() {
+ return rows;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeInt(rows);
+ out.writeInt(cols);
+ out.writeInt(acsMode);
+ out.writeInt(stoMode);
+ out.writeObject(sto);
+ }
+
+ /** {@inheritDoc} */
+ @SuppressWarnings({"unchecked"})
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ rows = in.readInt();
+ cols = in.readInt();
+ acsMode = in.readInt();
+ stoMode = in.readInt();
+ sto = (Map<Integer, Map<Integer, Double>>)in.readObject();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isSequentialAccess() {
+ return acsMode == SEQUENTIAL_ACCESS_MODE;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDense() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isRandomAccess() {
+ return acsMode == RANDOM_ACCESS_MODE;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDistributed() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isArrayBased() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ int res = 1;
+
+ res = res * 37 + rows;
+ res = res * 37 + cols;
+ res = res * 37 + sto.hashCode();
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object o) {
+ if (this == o)
+ return true;
+
+ if (o == null || getClass() != o.getClass())
+ return false;
+
+ SparseLocalOnHeapMatrixStorage that = (SparseLocalOnHeapMatrixStorage)o;
+
+ return rows == that.rows && cols == that.cols && acsMode == that.acsMode && stoMode == that.stoMode
+ && (sto != null ? sto.equals(that.sto) : that.sto == null);
+ }
+}
[03/67] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math
module to Ignite ML module added missed licenses renamed packages fixed wrong
ml profile activation (cherry picked from commit d78e071)
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/SparseDistributedMatrixStorageTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/SparseDistributedMatrixStorageTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/SparseDistributedMatrixStorageTest.java
new file mode 100644
index 0000000..7c2d415
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/SparseDistributedMatrixStorageTest.java
@@ -0,0 +1,126 @@
+/*
+ * 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.ignite.ml.math.impls.storage.matrix;
+
+import org.apache.ignite.Ignite;
+import org.apache.ignite.internal.util.IgniteUtils;
+import org.apache.ignite.ml.math.StorageConstants;
+import org.apache.ignite.ml.math.impls.MathTestConstants;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.apache.ignite.testframework.junits.common.GridCommonTest;
+
+/**
+ * Tests for {@link SparseDistributedMatrixStorage}.
+ */
+@GridCommonTest(group = "Distributed Models")
+public class SparseDistributedMatrixStorageTest extends GridCommonAbstractTest {
+ /** Number of nodes in grid */
+ private static final int NODE_COUNT = 3;
+ /** Cache name. */
+ private static final String CACHE_NAME = "test-cache";
+ /** */
+ private static final String UNEXPECTED_ATTRIBUTE_VALUE = "Unexpected attribute value.";
+ /** Grid instance. */
+ private Ignite ignite;
+
+ /**
+ * Default constructor.
+ */
+ public SparseDistributedMatrixStorageTest() {
+ super(false);
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void beforeTestsStarted() throws Exception {
+ for (int i = 1; i <= NODE_COUNT; i++)
+ startGrid(i);
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void afterTestsStopped() throws Exception {
+ stopAllGrids();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override protected void beforeTest() throws Exception {
+ ignite = grid(NODE_COUNT);
+
+ ignite.configuration().setPeerClassLoadingEnabled(true);
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void afterTest() throws Exception {
+ ignite.destroyCache(CACHE_NAME);
+ }
+
+ /** */
+ public void testCacheCreation() throws Exception {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ final int rows = MathTestConstants.STORAGE_SIZE;
+ final int cols = MathTestConstants.STORAGE_SIZE;
+
+ SparseDistributedMatrixStorage storage = new SparseDistributedMatrixStorage(rows, cols, StorageConstants.ROW_STORAGE_MODE, StorageConstants.RANDOM_ACCESS_MODE);
+
+ assertNotNull("SparseDistributedMatrixStorage cache is null.", storage.cache());
+ }
+
+ /** */
+ public void testSetGet() throws Exception {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ final int rows = MathTestConstants.STORAGE_SIZE;
+ final int cols = MathTestConstants.STORAGE_SIZE;
+
+ SparseDistributedMatrixStorage storage = new SparseDistributedMatrixStorage(rows, cols, StorageConstants.ROW_STORAGE_MODE, StorageConstants.RANDOM_ACCESS_MODE);
+
+ for (int i = 0; i < rows; i++) {
+ for (int j = 0; j < cols; j++) {
+ double v = Math.random();
+ storage.set(i, j, v);
+
+ assert Double.compare(v, storage.get(i, j)) == 0;
+ assert Double.compare(v, storage.get(i, j)) == 0;
+ }
+ }
+ }
+
+ /** */
+ public void testAttributes() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ final int rows = MathTestConstants.STORAGE_SIZE;
+ final int cols = MathTestConstants.STORAGE_SIZE;
+
+ SparseDistributedMatrixStorage storage = new SparseDistributedMatrixStorage(rows, cols, StorageConstants.ROW_STORAGE_MODE, StorageConstants.RANDOM_ACCESS_MODE);
+
+ assertEquals(UNEXPECTED_ATTRIBUTE_VALUE, storage.rowSize(), rows);
+ assertEquals(UNEXPECTED_ATTRIBUTE_VALUE, storage.columnSize(), cols);
+
+ assertFalse(UNEXPECTED_ATTRIBUTE_VALUE, storage.isArrayBased());
+ assertFalse(UNEXPECTED_ATTRIBUTE_VALUE, storage.isDense());
+ assertTrue(UNEXPECTED_ATTRIBUTE_VALUE, storage.isDistributed());
+
+ assertEquals(UNEXPECTED_ATTRIBUTE_VALUE, storage.isRandomAccess(), !storage.isSequentialAccess());
+ assertTrue(UNEXPECTED_ATTRIBUTE_VALUE, storage.isRandomAccess());
+
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/vector/RandomAccessSparseVectorStorageTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/vector/RandomAccessSparseVectorStorageTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/vector/RandomAccessSparseVectorStorageTest.java
new file mode 100644
index 0000000..6578e14
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/vector/RandomAccessSparseVectorStorageTest.java
@@ -0,0 +1,60 @@
+/*
+ * 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.ignite.ml.math.impls.storage.vector;
+
+import org.apache.ignite.ml.math.StorageConstants;
+import org.apache.ignite.ml.math.impls.MathTestConstants;
+import org.junit.Test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+
+/**
+ * Unit tests for {@link SparseLocalOnHeapVectorStorage}.
+ */
+public class RandomAccessSparseVectorStorageTest extends VectorBaseStorageTest<SparseLocalOnHeapVectorStorage> {
+ /** */
+ @Override public void setUp() {
+ storage = new SparseLocalOnHeapVectorStorage(MathTestConstants.STORAGE_SIZE, StorageConstants.RANDOM_ACCESS_MODE);
+ }
+
+ /** */
+ @Test
+ public void data() throws Exception {
+ assertNull(MathTestConstants.NULL_VAL, storage.data());
+ }
+
+ /** */
+ @Test
+ public void isSequentialAccess() throws Exception {
+ assertFalse(MathTestConstants.UNEXPECTED_VAL, storage.isSequentialAccess());
+ }
+
+ /** */
+ @Test
+ public void isDense() throws Exception {
+ assertFalse(MathTestConstants.UNEXPECTED_VAL, storage.isDense());
+ }
+
+ /** */
+ @Test
+ public void isArrayBased() throws Exception {
+ assertFalse(MathTestConstants.UNEXPECTED_VAL, storage.isArrayBased());
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOffHeapVectorStorageTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOffHeapVectorStorageTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOffHeapVectorStorageTest.java
new file mode 100644
index 0000000..7e5fc48
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOffHeapVectorStorageTest.java
@@ -0,0 +1,78 @@
+/*
+ * 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.ignite.ml.math.impls.storage.vector;
+
+import org.apache.ignite.ml.math.ExternalizeTest;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.apache.ignite.ml.math.impls.MathTestConstants.STORAGE_SIZE;
+import static org.apache.ignite.ml.math.impls.MathTestConstants.UNEXPECTED_VAL;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Tests for {@link SparseLocalOffHeapVectorStorage}.
+ */
+public class SparseLocalOffHeapVectorStorageTest extends ExternalizeTest<SparseLocalOffHeapVectorStorage> {
+ /** */ private SparseLocalOffHeapVectorStorage testVectorStorage;
+
+ /** */
+ @Before
+ public void setup() {
+ testVectorStorage = new SparseLocalOffHeapVectorStorage(STORAGE_SIZE);
+ }
+
+ /** */
+ @After
+ public void teardown() {
+ testVectorStorage.destroy();
+ testVectorStorage = null;
+ }
+
+ /** */
+ @Test
+ public void testBasic() {
+ for (int i = 0; i < STORAGE_SIZE; i++) {
+ double testVal = Math.random();
+ testVectorStorage.set(i, testVal);
+ assertEquals(UNEXPECTED_VAL, testVal, testVectorStorage.get(i), 0d);
+ }
+ }
+
+ /** {@inheritDoc} */
+ @Test(expected = UnsupportedOperationException.class)
+ @Override public void externalizeTest() {
+ super.externalizeTest(new SparseLocalOffHeapVectorStorage(STORAGE_SIZE));
+ }
+
+ /** */
+ @Test
+ public void testAttributes() {
+ SparseLocalOffHeapVectorStorage testVectorStorage = new SparseLocalOffHeapVectorStorage(STORAGE_SIZE);
+
+ assertTrue(UNEXPECTED_VAL, testVectorStorage.isRandomAccess());
+ assertFalse(UNEXPECTED_VAL, testVectorStorage.isSequentialAccess());
+ assertFalse(UNEXPECTED_VAL, testVectorStorage.isDense());
+ assertFalse(UNEXPECTED_VAL, testVectorStorage.isArrayBased());
+ assertFalse(UNEXPECTED_VAL, testVectorStorage.isDistributed());
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/vector/VectorArrayStorageTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/vector/VectorArrayStorageTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/vector/VectorArrayStorageTest.java
new file mode 100644
index 0000000..ce62b3e
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/vector/VectorArrayStorageTest.java
@@ -0,0 +1,58 @@
+/*
+ * 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.ignite.ml.math.impls.storage.vector;
+
+import java.util.Arrays;
+import org.apache.ignite.ml.math.impls.MathTestConstants;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Unit test for {@link ArrayVectorStorage}.
+ */
+public class VectorArrayStorageTest extends VectorBaseStorageTest<ArrayVectorStorage> {
+ /** */
+ @Override public void setUp() {
+ storage = new ArrayVectorStorage(MathTestConstants.STORAGE_SIZE);
+ }
+
+ /** */
+ @Test
+ public void isArrayBased() throws Exception {
+ assertTrue(MathTestConstants.WRONG_ATTRIBUTE_VAL, storage.isArrayBased());
+
+ assertTrue(MathTestConstants.WRONG_ATTRIBUTE_VAL, new ArrayVectorStorage().isArrayBased());
+ }
+
+ /** */
+ @Test
+ public void data() throws Exception {
+ assertNotNull(MathTestConstants.NULL_DATA_STORAGE, storage.data());
+
+ assertEquals(MathTestConstants.WRONG_DATA_SIZE, storage.data().length, MathTestConstants.STORAGE_SIZE);
+
+ assertTrue(MathTestConstants.UNEXPECTED_DATA_VAL, Arrays.equals(storage.data(), new double[MathTestConstants.STORAGE_SIZE]));
+
+ assertNull(MathTestConstants.UNEXPECTED_DATA_VAL, new ArrayVectorStorage().data());
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/vector/VectorBaseStorageTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/vector/VectorBaseStorageTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/vector/VectorBaseStorageTest.java
new file mode 100644
index 0000000..206fe85
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/vector/VectorBaseStorageTest.java
@@ -0,0 +1,69 @@
+/*
+ * 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.ignite.ml.math.impls.storage.vector;
+
+import org.apache.ignite.ml.math.ExternalizeTest;
+import org.apache.ignite.ml.math.VectorStorage;
+import org.apache.ignite.ml.math.impls.MathTestConstants;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Abstract class with base tests for each vector storage.
+ */
+public abstract class VectorBaseStorageTest<T extends VectorStorage> extends ExternalizeTest<T> {
+ /** */
+ protected T storage;
+
+ /** */
+ @Before
+ public abstract void setUp();
+
+ /** */
+ @After
+ public void tearDown() throws Exception {
+ storage.destroy();
+ }
+
+ /** */
+ @Test
+ public void getSet() throws Exception {
+ for (int i = 0; i < MathTestConstants.STORAGE_SIZE; i++) {
+ double random = Math.random();
+
+ storage.set(i, random);
+
+ assertEquals(MathTestConstants.WRONG_DATA_ELEMENT, storage.get(i), random, MathTestConstants.NIL_DELTA);
+ }
+ }
+
+ /** */
+ @Test
+ public void size() {
+ assertTrue(MathTestConstants.UNEXPECTED_VAL, storage.size() == MathTestConstants.STORAGE_SIZE);
+ }
+
+ /** */
+ @Override public void externalizeTest() {
+ super.externalizeTest(storage);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/vector/VectorOffheapStorageTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/vector/VectorOffheapStorageTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/vector/VectorOffheapStorageTest.java
new file mode 100644
index 0000000..6b719d0
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/vector/VectorOffheapStorageTest.java
@@ -0,0 +1,73 @@
+/*
+ * 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.ignite.ml.math.impls.storage.vector;
+
+import org.apache.ignite.ml.math.impls.MathTestConstants;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Unit tests for {@link DenseLocalOffHeapVectorStorage}.
+ */
+public class VectorOffheapStorageTest extends VectorBaseStorageTest<DenseLocalOffHeapVectorStorage> {
+ /** */
+ @Before
+ public void setUp() {
+ storage = new DenseLocalOffHeapVectorStorage(MathTestConstants.STORAGE_SIZE);
+ }
+
+ /** */
+ @Test
+ public void isArrayBased() throws Exception {
+ assertFalse(MathTestConstants.UNEXPECTED_VAL, storage.isArrayBased());
+ }
+
+ /** */
+ @Test
+ public void data() throws Exception {
+ assertNull(MathTestConstants.NULL_VAL, storage.data());
+ }
+
+ /** */
+ @Test
+ public void isSequentialAccess() throws Exception {
+ assertTrue(MathTestConstants.UNEXPECTED_VAL, storage.isSequentialAccess());
+ }
+
+ /** */
+ @Test
+ public void isDense() throws Exception {
+ assertTrue(MathTestConstants.UNEXPECTED_VAL, storage.isDense());
+ }
+
+ /** */
+ @Test
+ public void equalsTest() {
+ //noinspection EqualsWithItself
+ assertTrue(MathTestConstants.VAL_NOT_EQUALS, storage.equals(storage));
+
+ //noinspection EqualsBetweenInconvertibleTypes
+ assertFalse(MathTestConstants.VALUES_SHOULD_BE_NOT_EQUALS,
+ storage.equals(new ArrayVectorStorage(MathTestConstants.STORAGE_SIZE)));
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/AbstractVectorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/AbstractVectorTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/AbstractVectorTest.java
new file mode 100644
index 0000000..fa66769
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/AbstractVectorTest.java
@@ -0,0 +1,543 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import java.util.Arrays;
+import java.util.stream.StreamSupport;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.VectorStorage;
+import org.apache.ignite.ml.math.exceptions.IndexException;
+import org.apache.ignite.ml.math.functions.Functions;
+import org.apache.ignite.ml.math.impls.MathTestConstants;
+import org.apache.ignite.ml.math.impls.storage.vector.ArrayVectorStorage;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Unit test for {@link AbstractVector}.
+ */
+public class AbstractVectorTest {
+ /** */
+ private AbstractVector testVector;
+
+ /** */
+ @Before
+ public void setUp() {
+ testVector = getAbstractVector();
+ }
+
+ /** */
+ @Test
+ public void setStorage() {
+ testVector.setStorage(createStorage());
+
+ assertTrue(testVector.size() == MathTestConstants.STORAGE_SIZE);
+ }
+
+ /** */
+ @Test
+ public void size() {
+ testVector.setStorage(createStorage());
+ assertTrue(testVector.size() == MathTestConstants.STORAGE_SIZE);
+
+ testVector.setStorage(new ArrayVectorStorage(MathTestConstants.STORAGE_SIZE + MathTestConstants.STORAGE_SIZE));
+ assertTrue(testVector.size() == MathTestConstants.STORAGE_SIZE + MathTestConstants.STORAGE_SIZE);
+
+ testVector = getAbstractVector(createStorage());
+ assertTrue(testVector.size() == MathTestConstants.STORAGE_SIZE);
+ }
+
+ /** */
+ @Test
+ public void getPositive() {
+ testVector = getAbstractVector(createStorage());
+
+ for (int i = 0; i < MathTestConstants.STORAGE_SIZE; i++)
+ assertNotNull(MathTestConstants.NULL_VALUES, testVector.get(i));
+
+ }
+
+ /** */
+ @Test(expected = NullPointerException.class)
+ public void getNegative0() {
+ testVector.get(0);
+ }
+
+ /** */
+ @Test(expected = IndexException.class)
+ public void getNegative1() {
+ testVector.setStorage(createStorage());
+
+ testVector.get(-1);
+ }
+
+ /** */
+ @Test(expected = IndexException.class)
+ public void getNegative2() {
+ testVector.setStorage(createStorage());
+
+ testVector.get(testVector.size() + 1);
+ }
+
+ /** */
+ @Test(expected = NullPointerException.class)
+ public void getXNegative0() {
+ testVector.getX(0);
+ }
+
+ /** */
+ @Test(expected = ArrayIndexOutOfBoundsException.class)
+ public void getXNegative1() {
+ testVector.setStorage(createStorage());
+
+ testVector.getX(-1);
+ }
+
+ /** */
+ @Test(expected = ArrayIndexOutOfBoundsException.class)
+ public void getXNegative2() {
+ testVector.setStorage(createStorage());
+
+ testVector.getX(MathTestConstants.STORAGE_SIZE + 1);
+ }
+
+ /** */
+ @Test
+ public void set() {
+ double[] data = initVector();
+
+ for (int i = 0; i < MathTestConstants.STORAGE_SIZE; i++)
+ testVector.set(i, Math.exp(data[i]));
+
+ for (int i = 0; i < MathTestConstants.STORAGE_SIZE; i++)
+ assertEquals(MathTestConstants.VAL_NOT_EQUALS, testVector.get(i), Math.exp(data[i]), MathTestConstants.NIL_DELTA);
+ }
+
+ /** */
+ @Test(expected = IndexException.class)
+ public void setNegative0() {
+ testVector.set(-1, -1);
+ }
+
+ /** */
+ @Test(expected = IndexException.class)
+ public void setNegative1() {
+ initVector();
+
+ testVector.set(-1, -1);
+ }
+
+ /** */
+ @Test(expected = IndexException.class)
+ public void setNegative2() {
+ initVector();
+
+ testVector.set(MathTestConstants.STORAGE_SIZE + 1, -1);
+ }
+
+ /** */
+ @Test(expected = IndexOutOfBoundsException.class)
+ public void setXNegative0() {
+ initVector();
+
+ testVector.setX(-1, -1);
+ }
+
+ /** */
+ @Test(expected = IndexOutOfBoundsException.class)
+ public void setXNegative1() {
+ initVector();
+
+ testVector.setX(MathTestConstants.STORAGE_SIZE + 1, -1);
+ }
+
+ /** */
+ @Test(expected = NullPointerException.class)
+ public void setXNegative2() {
+ testVector.setX(-1, -1);
+ }
+
+ /** */
+ @Test
+ public void isZero() {
+ assertTrue(MathTestConstants.UNEXPECTED_VAL, testVector.isZero(0d));
+
+ assertFalse(MathTestConstants.UNEXPECTED_VAL, testVector.isZero(1d));
+ }
+
+ /** */
+ @Test
+ public void guid() {
+ assertNotNull(MathTestConstants.NULL_GUID, testVector.guid());
+
+ assertEquals(MathTestConstants.UNEXPECTED_GUID_VAL, testVector.guid(), testVector.guid());
+
+ assertFalse(MathTestConstants.EMPTY_GUID, testVector.guid().toString().isEmpty());
+
+ testVector = getAbstractVector(createStorage());
+
+ assertNotNull(MathTestConstants.NULL_GUID, testVector.guid());
+
+ assertEquals(MathTestConstants.UNEXPECTED_GUID_VAL, testVector.guid(), testVector.guid());
+
+ assertFalse(MathTestConstants.EMPTY_GUID, testVector.guid().toString().isEmpty());
+ }
+
+ /** */
+ @Test
+ public void equalsTest() {
+ VectorStorage storage = createStorage();
+
+ AbstractVector testVector1 = getAbstractVector();
+
+ testVector1.setStorage(storage);
+
+ AbstractVector testVector2 = getAbstractVector();
+
+ assertEquals(MathTestConstants.VAL_NOT_EQUALS, testVector, testVector);
+
+ testVector2.setStorage(storage);
+
+ assertTrue(MathTestConstants.VAL_NOT_EQUALS, testVector1.equals(testVector2));
+
+ assertFalse(MathTestConstants.VALUES_SHOULD_BE_NOT_EQUALS, testVector1.equals(testVector));
+ }
+
+ /** */
+ @Test(expected = NullPointerException.class)
+ public void all() {
+ assertNotNull(MathTestConstants.NULL_VAL, testVector.all());
+
+ assertNotNull(MathTestConstants.NULL_VAL, getAbstractVector(createStorage()).all());
+
+ getAbstractVector().all().iterator().next();
+ }
+
+ /** */
+ @Test
+ public void nonZeroElements() {
+ VectorStorage storage = createStorage();
+
+ double[] data = storage.data();
+
+ testVector = getAbstractVector(storage);
+
+ assertEquals(MathTestConstants.VAL_NOT_EQUALS, testVector.nonZeroElements(), Arrays.stream(data).filter(x -> x != 0d).count());
+
+ addNilValues(data);
+
+ assertEquals(MathTestConstants.VAL_NOT_EQUALS, testVector.nonZeroElements(), Arrays.stream(data).filter(x -> x != 0d).count());
+ }
+
+ /** */
+ @Test
+ public void foldMapWithSecondVector() {
+ double[] data0 = initVector();
+
+ VectorStorage storage1 = createStorage();
+
+ double[] data1 = storage1.data().clone();
+
+ AbstractVector testVector1 = getAbstractVector(storage1);
+
+ String testVal = "";
+
+ for (int i = 0; i < data0.length; i++)
+ testVal += data0[i] + data1[i];
+
+ assertEquals(MathTestConstants.VAL_NOT_EQUALS, testVector.foldMap(testVector1, (string, xi) -> string.concat(xi.toString()), Functions.PLUS, ""), testVal);
+ }
+
+ /** */
+ @Test
+ public void nonZeroes() {
+ assertNotNull(MathTestConstants.NULL_VAL, testVector.nonZeroes());
+
+ double[] data = initVector();
+
+ assertNotNull(MathTestConstants.NULL_VAL, testVector.nonZeroes());
+
+ Assert.assertEquals(MathTestConstants.VAL_NOT_EQUALS, StreamSupport.stream(testVector.nonZeroes().spliterator(), false).count(), Arrays.stream(data).filter(x -> x != 0d).count());
+
+ addNilValues(data);
+
+ Assert.assertEquals(MathTestConstants.VAL_NOT_EQUALS, StreamSupport.stream(testVector.nonZeroes().spliterator(), false).count(), Arrays.stream(data).filter(x -> x != 0d).count());
+ }
+
+ /** */
+ @Test(expected = NullPointerException.class)
+ public void nonZeroesEmpty() {
+ testVector.nonZeroes().iterator().next();
+ }
+
+ /** */
+ @Test(expected = NullPointerException.class)
+ public void assign() {
+ testVector.assign(MathTestConstants.TEST_VAL);
+ }
+
+ /** */
+ @Test(expected = NullPointerException.class)
+ public void assignArr() {
+ testVector.assign(new double[1]);
+ }
+
+ /** */
+ @Test(expected = NullPointerException.class)
+ public void assignArrEmpty() {
+ testVector.assign(new double[0]);
+ }
+
+ /** */
+ @Test(expected = NullPointerException.class)
+ public void dotNegative() {
+ testVector.dot(getAbstractVector(createEmptyStorage()));
+ }
+
+ /** */
+ @Test
+ public void dotSelf() {
+ double[] data = initVector();
+
+ assertEquals(MathTestConstants.VAL_NOT_EQUALS, testVector.dotSelf(), Arrays.stream(data).reduce(0, (x, y) -> x + y * y), MathTestConstants.NIL_DELTA);
+ }
+
+ /** */
+ @Test
+ public void getStorage() {
+ assertNotNull(MathTestConstants.NULL_VAL, getAbstractVector(createEmptyStorage()));
+ assertNotNull(MathTestConstants.NULL_VAL, getAbstractVector(createStorage()));
+ testVector.setStorage(createStorage());
+ assertNotNull(MathTestConstants.NULL_VAL, testVector.getStorage());
+ }
+
+ /** */
+ @Test
+ public void getElement() {
+ double[] data = initVector();
+
+ for (int i = 0; i < data.length; i++) {
+ assertNotNull(MathTestConstants.NULL_VAL, testVector.getElement(i));
+
+ assertEquals(MathTestConstants.UNEXPECTED_VAL, testVector.getElement(i).get(), data[i], MathTestConstants.NIL_DELTA);
+
+ testVector.getElement(i).set(++data[i]);
+
+ assertEquals(MathTestConstants.UNEXPECTED_VAL, testVector.getElement(i).get(), data[i], MathTestConstants.NIL_DELTA);
+ }
+ }
+
+ /**
+ * Create {@link AbstractVector} with storage for tests.
+ *
+ * @param storage {@link VectorStorage}
+ * @return AbstractVector.
+ */
+ private AbstractVector getAbstractVector(VectorStorage storage) {
+ return new AbstractVector(storage) { // TODO: find out how to fix warning about missing constructor
+ /** */
+ @Override public boolean isDense() {
+ return false;
+ }
+
+ /** */
+ @Override public boolean isSequentialAccess() {
+ return false;
+ }
+
+ /** */
+ @Override public Matrix likeMatrix(int rows, int cols) {
+ return null;
+ }
+
+ /** */
+ @Override public Vector copy() {
+ return getAbstractVector(this.getStorage());
+ }
+
+ /** */
+ @Override public Vector like(int crd) {
+ return null;
+ }
+
+ /** */
+ @Override public Vector normalize() {
+ return null;
+ }
+
+ /** */
+ @Override public Vector normalize(double power) {
+ return null;
+ }
+
+ /** */
+ @Override public Vector logNormalize() {
+ return null;
+ }
+
+ /** */
+ @Override public Vector logNormalize(double power) {
+ return null;
+ }
+
+ /** */
+ @Override public Vector viewPart(int off, int len) {
+ return null;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isRandomAccess() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDistributed() {
+ return false;
+ }
+ };
+ }
+
+ /**
+ * Create empty {@link AbstractVector} for tests.
+ *
+ * @return AbstractVector.
+ */
+ private AbstractVector getAbstractVector() {
+ return new AbstractVector() { // TODO: find out how to fix warning about missing constructor
+ /** */
+ @Override public boolean isDense() {
+ return false;
+ }
+
+ /** */
+ @Override public Matrix likeMatrix(int rows, int cols) {
+ return null;
+ }
+
+ /** */
+ @Override public boolean isSequentialAccess() {
+ return false;
+ }
+
+ /** */
+ @Override public Vector copy() {
+ return getAbstractVector(this.getStorage());
+ }
+
+ /** */
+ @Override public Vector like(int crd) {
+ return null;
+ }
+
+ /** */
+ @Override public Vector normalize() {
+ return null;
+ }
+
+ /** */
+ @Override public Vector normalize(double power) {
+ return null;
+ }
+
+ /** */
+ @Override public Vector logNormalize() {
+ return null;
+ }
+
+ /** */
+ @Override public Vector logNormalize(double power) {
+ return null;
+ }
+
+ /** */
+ @Override public Vector viewPart(int off, int len) {
+ return null;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isRandomAccess() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDistributed() {
+ return false;
+ }
+ };
+ }
+
+ /**
+ * Create {@link VectorStorage} for tests.
+ *
+ * @return VectorStorage
+ */
+ private VectorStorage createEmptyStorage() {
+ return new ArrayVectorStorage(MathTestConstants.STORAGE_SIZE);
+ }
+
+ /**
+ * Create filled {@link VectorStorage} for tests.
+ *
+ * @return VectorStorage.
+ */
+ private VectorStorage createStorage() {
+ ArrayVectorStorage storage = new ArrayVectorStorage(MathTestConstants.STORAGE_SIZE);
+
+ for (int i = 0; i < MathTestConstants.STORAGE_SIZE; i++)
+ storage.set(i, Math.random());
+
+ return storage;
+ }
+
+ /**
+ * Init vector and return initialized values.
+ *
+ * @return Initial values.
+ */
+ private double[] initVector() {
+ VectorStorage storage = createStorage();
+ double[] data = storage.data().clone();
+
+ testVector = getAbstractVector(storage);
+ return data;
+ }
+
+ /**
+ * Add some zeroes to vector elements.
+ */
+ private void addNilValues() {
+ testVector.set(10, 0);
+ testVector.set(50, 0);
+ }
+
+ /**
+ * Add some zeroes to vector elements. Also set zeroes to the same elements in reference array data
+ */
+ private void addNilValues(double[] testRef) {
+ addNilValues();
+ testRef[10] = 0;
+ testRef[50] = 0;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/CacheVectorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/CacheVectorTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/CacheVectorTest.java
new file mode 100644
index 0000000..0026e2b
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/CacheVectorTest.java
@@ -0,0 +1,434 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.stream.IntStream;
+import junit.framework.TestCase;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.internal.util.IgniteUtils;
+import org.apache.ignite.ml.math.IdentityValueMapper;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.VectorKeyMapper;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.functions.Functions;
+import org.apache.ignite.ml.math.impls.MathTestConstants;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.apache.ignite.testframework.junits.common.GridCommonTest;
+
+/**
+ * Tests for {@link CacheVector}.
+ */
+@GridCommonTest(group = "Distributed Models")
+public class CacheVectorTest extends GridCommonAbstractTest {
+ /** Number of nodes in grid */
+ private static final int NODE_COUNT = 3;
+ /** Cache name. */
+ private static final String CACHE_NAME = "test-cache";
+ /** Cache size. */
+ private static final int size = MathTestConstants.STORAGE_SIZE;
+ /** Grid instance. */
+ private Ignite ignite;
+ /** Default key mapper. */
+ private VectorKeyMapper<Integer> keyMapper = new TestKeyMapper();
+
+ /**
+ * Default constructor.
+ */
+ public CacheVectorTest() {
+ super(false);
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void beforeTestsStarted() throws Exception {
+ for (int i = 1; i <= NODE_COUNT; i++)
+ startGrid(i);
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void afterTestsStopped() throws Exception {
+ stopAllGrids();
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void beforeTest() throws Exception {
+ ignite = grid(NODE_COUNT);
+
+ ignite.configuration().setPeerClassLoadingEnabled(true);
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void afterTest() throws Exception {
+ ignite.destroyCache(CACHE_NAME);
+ }
+
+ /** */
+ public void testGetSet() throws Exception {
+ IdentityValueMapper valMapper = new IdentityValueMapper();
+ CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
+
+ for (int i = 0; i < size; i++) {
+ double random = Math.random();
+ cacheVector.set(i, random);
+ assertEquals("Unexpected value.", random, cacheVector.get(i), 0d);
+ }
+ }
+
+ /** */
+ public void testMap() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ IdentityValueMapper valMapper = new IdentityValueMapper();
+ CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
+
+ initVector(cacheVector);
+
+ cacheVector.map(value -> 110d);
+
+ for (int i = 0; i < size; i++)
+ assertEquals("Unexpected value.", cacheVector.get(i), 110d, 0d);
+ }
+
+ /** */
+ public void testMapBiFunc() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ IdentityValueMapper valMapper = new IdentityValueMapper();
+ CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
+
+ initVector(cacheVector);
+
+ cacheVector.map(Functions.PLUS, 1d);
+
+ for (int i = 0; i < size; i++)
+ assertEquals("Unexpected value.", cacheVector.get(i), 1d, 0d);
+ }
+
+ /** */
+ public void testSum() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ IdentityValueMapper valMapper = new IdentityValueMapper();
+ CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
+
+ initVector(cacheVector);
+
+ assertEquals("Unexpected value.", cacheVector.sum(), 0d, 0d);
+
+ cacheVector.assign(1d);
+
+ assertEquals("Unexpected value.", cacheVector.sum(), size, 0d);
+ }
+
+ /** */
+ public void testSumNegative() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ IdentityValueMapper valMapper = new IdentityValueMapper();
+ CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
+
+ try {
+ double d = cacheVector.sum();
+ fail();
+ }
+ catch (NullPointerException e) {
+ // No-op.
+ }
+ }
+
+ /** */
+ public void testAssign() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ IdentityValueMapper valMapper = new IdentityValueMapper();
+ CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
+
+ initVector(cacheVector);
+
+ cacheVector.assign(1d);
+
+ for (int i = 0; i < size; i++)
+ assertEquals("Unexpected value.", cacheVector.get(i), 1d, 0d);
+ }
+
+ /** */
+ public void testAssignRange() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ IdentityValueMapper valMapper = new IdentityValueMapper();
+ CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
+
+ cacheVector.assign(IntStream.range(0, size).asDoubleStream().toArray());
+
+ for (int i = 0; i < size; i++)
+ assertEquals("Unexpected value.", cacheVector.get(i), i, 0d);
+ }
+
+ /** */
+ public void testAssignVector() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ IdentityValueMapper valMapper = new IdentityValueMapper();
+ CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
+
+ Vector testVec = new DenseLocalOnHeapVector(IntStream.range(0, size).asDoubleStream().toArray());
+
+ cacheVector.assign(testVec);
+
+ for (int i = 0; i < size; i++)
+ assertEquals("Unexpected value.", cacheVector.get(i), testVec.get(i), 0d);
+ }
+
+ /** */
+ public void testAssignFunc() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ IdentityValueMapper valMapper = new IdentityValueMapper();
+ CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
+
+ cacheVector.assign(idx -> idx);
+
+ for (int i = 0; i < size; i++)
+ assertEquals("Unexpected value.", cacheVector.get(i), i, 0d);
+ }
+
+ /** */
+ public void testPlus() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ IdentityValueMapper valMapper = new IdentityValueMapper();
+ CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
+
+ initVector(cacheVector);
+
+ cacheVector.plus(1d);
+
+ for (int i = 0; i < size; i++)
+ assertEquals("Unexpected value.", cacheVector.get(i), 1d, 0d);
+ }
+
+ /** */
+ public void testPlusVec() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ IdentityValueMapper valMapper = new IdentityValueMapper();
+ CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
+
+ Vector testVec = new DenseLocalOnHeapVector(IntStream.range(0, size).asDoubleStream().toArray());
+
+ try {
+ cacheVector.plus(testVec);
+ TestCase.fail();
+ }
+ catch (UnsupportedOperationException ignored) {
+
+ }
+ }
+
+ /** */
+ public void testDivide() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ final int size = MathTestConstants.STORAGE_SIZE;
+
+ IdentityValueMapper valMapper = new IdentityValueMapper();
+ CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
+
+ initVector(cacheVector);
+ cacheVector.assign(1d);
+
+ cacheVector.divide(2d);
+
+ for (int i = 0; i < size; i++)
+ assertEquals("Unexpected value.", cacheVector.get(i), 1d / 2d, 0d);
+ }
+
+ /** */
+ public void testTimes() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ final int size = MathTestConstants.STORAGE_SIZE;
+
+ IdentityValueMapper valMapper = new IdentityValueMapper();
+ CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
+
+ initVector(cacheVector);
+ cacheVector.assign(1d);
+
+ cacheVector.times(2d);
+
+ for (int i = 0; i < size; i++)
+ assertEquals("Unexpected value.", cacheVector.get(i), 2d, 0d);
+ }
+
+ /** */
+ public void testTimesVector() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ IdentityValueMapper valMapper = new IdentityValueMapper();
+ CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
+
+ cacheVector.assign(1d);
+ Vector testVec = new DenseLocalOnHeapVector(IntStream.range(0, size).asDoubleStream().toArray());
+
+ try {
+ cacheVector.times(testVec);
+ TestCase.fail();
+ }
+ catch (UnsupportedOperationException ignored) {
+
+ }
+
+ }
+
+ /** */
+ public void testMin() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ IdentityValueMapper valMapper = new IdentityValueMapper();
+ CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
+
+ Vector testVec = new DenseLocalOnHeapVector(IntStream.range(0, size).asDoubleStream().toArray());
+
+ cacheVector.assign(testVec);
+
+ assertEquals("Unexpected value.", cacheVector.minValue(), 0d, 0d);
+ }
+
+ /** */
+ public void testMax() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ IdentityValueMapper valMapper = new IdentityValueMapper();
+ CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
+
+ Vector testVec = new DenseLocalOnHeapVector(IntStream.range(0, size).asDoubleStream().toArray());
+
+ cacheVector.assign(testVec);
+
+ assertEquals("Unexpected value.", cacheVector.maxValue(), testVec.get(size - 1), 0d);
+ }
+
+ /** */
+ public void testLike() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ IdentityValueMapper valMapper = new IdentityValueMapper();
+ CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
+
+ try {
+ cacheVector.like(size);
+ TestCase.fail("Unsupported case");
+ }
+ catch (UnsupportedOperationException ignored) {
+
+ }
+ }
+
+ /** */
+ public void testLikeMatrix() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ IdentityValueMapper valMapper = new IdentityValueMapper();
+ CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
+
+ try {
+ cacheVector.likeMatrix(size, size);
+ TestCase.fail("Unsupported case");
+ }
+ catch (UnsupportedOperationException ignored) {
+
+ }
+ }
+
+ /** */
+ public void testCopy() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ IdentityValueMapper valMapper = new IdentityValueMapper();
+ CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
+
+ try {
+ cacheVector.copy();
+ TestCase.fail("Unsupported case");
+ }
+ catch (UnsupportedOperationException ignored) {
+
+ }
+ }
+
+ /** */
+ public void testExternalize() throws IOException, ClassNotFoundException {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ IdentityValueMapper valMapper = new IdentityValueMapper();
+ CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
+
+ cacheVector.set(1, 1.0);
+
+ ByteArrayOutputStream byteArrOutputStream = new ByteArrayOutputStream();
+ ObjectOutputStream objOutputStream = new ObjectOutputStream(byteArrOutputStream);
+
+ objOutputStream.writeObject(cacheVector);
+
+ ByteArrayInputStream byteArrInputStream = new ByteArrayInputStream(byteArrOutputStream.toByteArray());
+ ObjectInputStream objInputStream = new ObjectInputStream(byteArrInputStream);
+
+ CacheVector objRestored = (CacheVector)objInputStream.readObject();
+
+ assertTrue(MathTestConstants.VAL_NOT_EQUALS, cacheVector.equals(objRestored));
+ assertEquals(MathTestConstants.VAL_NOT_EQUALS, objRestored.get(1), 1.0, 0.0);
+ }
+
+ /** */
+ private void initVector(CacheVector cacheVector) {
+ for (int i = 0; i < cacheVector.size(); i++)
+ cacheVector.set(i, 0d);
+ }
+
+ /** */
+ private IgniteCache<Integer, Double> getCache() {
+ assert ignite != null;
+
+ CacheConfiguration cfg = new CacheConfiguration();
+ cfg.setName(CACHE_NAME);
+
+ IgniteCache<Integer, Double> cache = ignite.getOrCreateCache(CACHE_NAME);
+
+ assert cache != null;
+ return cache;
+ }
+
+ /** */ private static class TestKeyMapper implements VectorKeyMapper<Integer> {
+ /** {@inheritDoc} */
+ @Override public Integer apply(int i) {
+ return i;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isValid(Integer i) {
+ return i < size;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/ConstantVectorConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/ConstantVectorConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/ConstantVectorConstructorTest.java
new file mode 100644
index 0000000..c5c0bbd
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/ConstantVectorConstructorTest.java
@@ -0,0 +1,52 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/** */
+public class ConstantVectorConstructorTest {
+ /** */
+ private static final int IMPOSSIBLE_SIZE = -1;
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void negativeSizeTest() {
+ assertEquals("Negative size.", IMPOSSIBLE_SIZE,
+ new ConstantVector(-1, 1).size());
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void zeroSizeTest() {
+ assertEquals("Zero size.", IMPOSSIBLE_SIZE,
+ new ConstantVector(0, 1).size());
+ }
+
+ /** */
+ @Test
+ public void primitiveTest() {
+ assertEquals("1 size.", 1,
+ new ConstantVector(1, 1).size());
+
+ assertEquals("2 size.", 2,
+ new ConstantVector(2, 1).size());
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/DelegatingVectorConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/DelegatingVectorConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/DelegatingVectorConstructorTest.java
new file mode 100644
index 0000000..1a9884f
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/DelegatingVectorConstructorTest.java
@@ -0,0 +1,62 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import org.apache.ignite.ml.math.Vector;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/** */
+public class DelegatingVectorConstructorTest {
+ /** */
+ private static final int IMPOSSIBLE_SIZE = -1;
+
+ /** */
+ @Test
+ public void basicTest() {
+ final Vector parent = new DenseLocalOnHeapVector(new double[] {0, 1});
+
+ final Vector delegate = new DelegatingVector(parent);
+
+ final int size = parent.size();
+
+ assertEquals("Delegate size differs from expected.", size, delegate.size());
+
+ for (int idx = 0; idx < size; idx++)
+ assertDelegate(parent, delegate, idx);
+ }
+
+ /** */
+ private void assertDelegate(Vector parent, Vector delegate, int idx) {
+ assertValue(parent, delegate, idx);
+
+ parent.set(idx, parent.get(idx) + 1);
+
+ assertValue(parent, delegate, idx);
+
+ delegate.set(idx, delegate.get(idx) + 2);
+
+ assertValue(parent, delegate, idx);
+ }
+
+ /** */
+ private void assertValue(Vector parent, Vector delegate, int idx) {
+ assertEquals("Unexpected value at index " + idx, parent.get(idx), delegate.get(idx), 0d);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/DenseLocalOffHeapVectorConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/DenseLocalOffHeapVectorConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/DenseLocalOffHeapVectorConstructorTest.java
new file mode 100644
index 0000000..1a979bd
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/DenseLocalOffHeapVectorConstructorTest.java
@@ -0,0 +1,59 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/** */
+public class DenseLocalOffHeapVectorConstructorTest {
+ /** */
+ private static final int IMPOSSIBLE_SIZE = -1;
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void negativeSizeTest() {
+ assertEquals("Negative size.", IMPOSSIBLE_SIZE,
+ new DenseLocalOffHeapVector(-1).size());
+ }
+
+ /** */
+ @Test(expected = NullPointerException.class)
+ public void nullArrayTest() {
+ assertEquals("Null array.", IMPOSSIBLE_SIZE,
+ new DenseLocalOffHeapVector(null).size());
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void zeroSizeTest() {
+ assertEquals("0 size.", IMPOSSIBLE_SIZE,
+ new DenseLocalOffHeapVector(new double[0]).size());
+ }
+
+ /** */
+ @Test
+ public void primitiveTest() {
+ assertEquals("1 size.", 1,
+ new DenseLocalOffHeapVector(new double[1]).size());
+
+ assertEquals("2 size.", 2,
+ new DenseLocalOffHeapVector(new double[2]).size());
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/DenseLocalOnHeapVectorConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/DenseLocalOnHeapVectorConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/DenseLocalOnHeapVectorConstructorTest.java
new file mode 100644
index 0000000..df504f3
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/DenseLocalOnHeapVectorConstructorTest.java
@@ -0,0 +1,163 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/** */
+public class DenseLocalOnHeapVectorConstructorTest {
+ /** */
+ private static final int IMPOSSIBLE_SIZE = -1;
+
+ /** */
+ @Test(expected = UnsupportedOperationException.class)
+ public void mapInvalidArgsTest() {
+ assertEquals("Expect exception due to invalid args.", IMPOSSIBLE_SIZE,
+ new DenseLocalOnHeapVector(new HashMap<String, Object>() {{
+ put("invalid", 99);
+ }}).size());
+ }
+
+ /** */
+ @Test(expected = UnsupportedOperationException.class)
+ public void mapMissingArgsTest() {
+ final Map<String, Object> test = new HashMap<String, Object>() {{
+ put("arr", new double[0]);
+ put("shallowCopyMissing", "whatever");
+ }};
+
+ assertEquals("Expect exception due to missing args.", IMPOSSIBLE_SIZE,
+ new DenseLocalOnHeapVector(test).size());
+ }
+
+ /** */
+ @Test(expected = ClassCastException.class)
+ public void mapInvalidArrTypeTest() {
+ final Map<String, Object> test = new HashMap<String, Object>() {{
+ put("size", "whatever");
+ }};
+
+ assertEquals("Expect exception due to invalid arr type.", IMPOSSIBLE_SIZE,
+ new DenseLocalOnHeapVector(test).size());
+ }
+
+ /** */
+ @Test(expected = UnsupportedOperationException.class)
+ public void mapInvalidCopyTypeTest() {
+ final Map<String, Object> test = new HashMap<String, Object>() {{
+ put("arr", new double[0]);
+ put("shallowCopy", 0);
+ }};
+
+ assertEquals("Expect exception due to invalid copy type.", IMPOSSIBLE_SIZE,
+ new DenseLocalOnHeapVector(test).size());
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void mapNullTest() {
+ //noinspection ConstantConditions
+ assertEquals("Null map args.", IMPOSSIBLE_SIZE,
+ new DenseLocalOnHeapVector((Map<String, Object>)null).size());
+ }
+
+ /** */
+ @Test
+ public void mapTest() {
+ assertEquals("Size from args.", 99,
+ new DenseLocalOnHeapVector(new HashMap<String, Object>() {{
+ put("size", 99);
+ }}).size());
+
+ final double[] test = new double[99];
+
+ assertEquals("Size from array in args.", test.length,
+ new DenseLocalOnHeapVector(new HashMap<String, Object>() {{
+ put("arr", test);
+ put("copy", false);
+ }}).size());
+
+ assertEquals("Size from array in args, shallow copy.", test.length,
+ new DenseLocalOnHeapVector(new HashMap<String, Object>() {{
+ put("arr", test);
+ put("copy", true);
+ }}).size());
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void negativeSizeTest() {
+ assertEquals("Negative size.", IMPOSSIBLE_SIZE,
+ new DenseLocalOnHeapVector(-1).size());
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void nullCopyTest() {
+ assertEquals("Null array to non-shallow copy.", IMPOSSIBLE_SIZE,
+ new DenseLocalOnHeapVector(null, false).size());
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void nullDefaultCopyTest() {
+ assertEquals("Null array default copy.", IMPOSSIBLE_SIZE,
+ new DenseLocalOnHeapVector((double[])null).size());
+ }
+
+ /** */
+ @Test(expected = NullPointerException.class)
+ public void defaultConstructorTest() {
+ assertEquals("Default constructor.", IMPOSSIBLE_SIZE,
+ new DenseLocalOnHeapVector().size());
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void nullArrShallowCopyTest() {
+ assertEquals("Null array shallow copy.", IMPOSSIBLE_SIZE,
+ new DenseLocalOnHeapVector(null, true).size());
+ }
+
+ /** */
+ @Test
+ public void primitiveTest() {
+ assertEquals("0 size shallow copy.", 0,
+ new DenseLocalOnHeapVector(new double[0], true).size());
+
+ assertEquals("0 size.", 0,
+ new DenseLocalOnHeapVector(new double[0], false).size());
+
+ assertEquals("1 size shallow copy.", 1,
+ new DenseLocalOnHeapVector(new double[1], true).size());
+
+ assertEquals("1 size.", 1,
+ new DenseLocalOnHeapVector(new double[1], false).size());
+
+ assertEquals("0 size default copy.", 0,
+ new DenseLocalOnHeapVector(new double[0]).size());
+
+ assertEquals("1 size default copy.", 1,
+ new DenseLocalOnHeapVector(new double[1]).size());
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/FunctionVectorConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/FunctionVectorConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/FunctionVectorConstructorTest.java
new file mode 100644
index 0000000..1e99f7e
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/FunctionVectorConstructorTest.java
@@ -0,0 +1,121 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.IntToDoubleFunction;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.functions.IgniteFunction;
+import org.apache.ignite.ml.math.functions.IntDoubleToVoidFunction;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/** */
+public class FunctionVectorConstructorTest {
+ /** */
+ private static final int IMPOSSIBLE_SIZE = -1;
+
+ /** */
+ @Test(expected = UnsupportedOperationException.class)
+ public void mapInvalidArgsTest() {
+ assertEquals("Expect exception due to invalid args.", IMPOSSIBLE_SIZE,
+ new FunctionVector(new HashMap<String, Object>() {{
+ put("invalid", 99);
+ }}).size());
+ }
+
+ /** */
+ @Test(expected = UnsupportedOperationException.class)
+ public void mapMissingArgsTest() {
+ final Map<String, Object> test = new HashMap<String, Object>() {{
+ put("size", 1);
+ put("paramMissing", "whatever");
+ }};
+
+ assertEquals("Expect exception due to missing args.",
+ -1, new FunctionVector(test).size());
+ }
+
+ /** */
+ @Test(expected = ClassCastException.class)
+ public void mapInvalidParamTypeTest() {
+ final Map<String, Object> test = new HashMap<String, Object>() {{
+ put("size", "whatever");
+
+ put("getFunc", (IntToDoubleFunction)i -> i);
+ }};
+
+ assertEquals("Expect exception due to invalid param type.", IMPOSSIBLE_SIZE,
+ new FunctionVector(test).size());
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void mapNullTest() {
+ //noinspection ConstantConditions
+ assertEquals("Null map args.", IMPOSSIBLE_SIZE,
+ new FunctionVector(null).size());
+ }
+
+ /** */
+ @Test
+ public void mapTest() {
+ assertEquals("Size from args.", 99,
+ new FunctionVector(new HashMap<String, Object>() {{
+ put("size", 99);
+
+ put("getFunc", (IgniteFunction<Integer, Double>)i -> (double)i);
+ }}).size());
+
+ assertEquals("Size from args with setFunc.", 99,
+ new FunctionVector(new HashMap<String, Object>() {{
+ put("size", 99);
+
+ put("getFunc", (IgniteFunction<Integer, Double>)i -> (double)i);
+
+ put("setFunc", (IntDoubleToVoidFunction)(integer, aDouble) -> {
+ });
+ }}).size());
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void negativeSizeTest() {
+ assertEquals("Negative size.", IMPOSSIBLE_SIZE,
+ new FunctionVector(-1, (i) -> (double)i).size());
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void zeroSizeTest() {
+ assertEquals("0 size.", IMPOSSIBLE_SIZE,
+ new FunctionVector(0, (i) -> (double)i).size());
+ }
+
+ /** */
+ @Test
+ public void primitiveTest() {
+ assertEquals("1 size.", 1,
+ new FunctionVector(1, (i) -> (double)i).size());
+
+ assertEquals("2 size.", 2,
+ new FunctionVector(2, (i) -> (double)i).size());
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/MatrixVectorViewTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/MatrixVectorViewTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/MatrixVectorViewTest.java
new file mode 100644
index 0000000..c861a0e
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/MatrixVectorViewTest.java
@@ -0,0 +1,226 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.IndexException;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Tests for {@link MatrixVectorView}.
+ */
+public class MatrixVectorViewTest {
+ /** */
+ private static final String UNEXPECTED_VALUE = "Unexpected value";
+ /** */
+ private static final int SMALL_SIZE = 3;
+ /** */
+ private static final int IMPOSSIBLE_SIZE = -1;
+
+ /** */
+ private Matrix parent;
+
+ /** */
+ @Before
+ public void setup() {
+ parent = newMatrix(SMALL_SIZE, SMALL_SIZE);
+ }
+
+ /** */
+ @Test
+ public void testDiagonal() {
+ Vector vector = parent.viewDiagonal();
+
+ for (int i = 0; i < SMALL_SIZE; i++)
+ assertView(i, i, vector, i);
+ }
+
+ /** */
+ @Test
+ public void testRow() {
+ for (int i = 0; i < SMALL_SIZE; i++) {
+ Vector viewRow = parent.viewRow(i);
+
+ for (int j = 0; j < SMALL_SIZE; j++)
+ assertView(i, j, viewRow, j);
+ }
+ }
+
+ /** */
+ @Test
+ public void testCols() {
+ for (int i = 0; i < SMALL_SIZE; i++) {
+ Vector viewCol = parent.viewColumn(i);
+
+ for (int j = 0; j < SMALL_SIZE; j++)
+ assertView(j, i, viewCol, j);
+ }
+ }
+
+ /** */
+ @Test
+ public void basicTest() {
+ for (int rowSize : new int[] {1, 2, 3, 4})
+ for (int colSize : new int[] {1, 2, 3, 4})
+ for (int row = 0; row < rowSize; row++)
+ for (int col = 0; col < colSize; col++)
+ for (int rowStride = 0; rowStride < rowSize; rowStride++)
+ for (int colStride = 0; colStride < colSize; colStride++)
+ if (rowStride != 0 || colStride != 0)
+ assertMatrixVectorView(newMatrix(rowSize, colSize), row, col, rowStride, colStride);
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void parentNullTest() {
+ //noinspection ConstantConditions
+ assertEquals(IMPOSSIBLE_SIZE,
+ new MatrixVectorView(null, 1, 1, 1, 1).size());
+ }
+
+ /** */
+ @Test(expected = IndexException.class)
+ public void rowNegativeTest() {
+ //noinspection ConstantConditions
+ assertEquals(IMPOSSIBLE_SIZE,
+ new MatrixVectorView(parent, -1, 1, 1, 1).size());
+ }
+
+ /** */
+ @Test(expected = IndexException.class)
+ public void colNegativeTest() {
+ //noinspection ConstantConditions
+ assertEquals(IMPOSSIBLE_SIZE,
+ new MatrixVectorView(parent, 1, -1, 1, 1).size());
+ }
+
+ /** */
+ @Test(expected = IndexException.class)
+ public void rowTooLargeTest() {
+ //noinspection ConstantConditions
+ assertEquals(IMPOSSIBLE_SIZE,
+ new MatrixVectorView(parent, parent.rowSize() + 1, 1, 1, 1).size());
+ }
+
+ /** */
+ @Test(expected = IndexException.class)
+ public void colTooLargeTest() {
+ //noinspection ConstantConditions
+ assertEquals(IMPOSSIBLE_SIZE,
+ new MatrixVectorView(parent, 1, parent.columnSize() + 1, 1, 1).size());
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void rowStrideNegativeTest() {
+ //noinspection ConstantConditions
+ assertEquals(IMPOSSIBLE_SIZE,
+ new MatrixVectorView(parent, 1, 1, -1, 1).size());
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void colStrideNegativeTest() {
+ //noinspection ConstantConditions
+ assertEquals(IMPOSSIBLE_SIZE,
+ new MatrixVectorView(parent, 1, 1, 1, -1).size());
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void rowStrideTooLargeTest() {
+ //noinspection ConstantConditions
+ assertEquals(IMPOSSIBLE_SIZE,
+ new MatrixVectorView(parent, 1, 1, parent.rowSize() + 1, 1).size());
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void colStrideTooLargeTest() {
+ //noinspection ConstantConditions
+ assertEquals(IMPOSSIBLE_SIZE,
+ new MatrixVectorView(parent, 1, 1, 1, parent.columnSize() + 1).size());
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void bothStridesZeroTest() {
+ //noinspection ConstantConditions
+ assertEquals(IMPOSSIBLE_SIZE,
+ new MatrixVectorView(parent, 1, 1, 0, 0).size());
+ }
+
+ /** */
+ private void assertMatrixVectorView(Matrix parent, int row, int col, int rowStride, int colStride) {
+ MatrixVectorView view = new MatrixVectorView(parent, row, col, rowStride, colStride);
+
+ String desc = "parent [" + parent.rowSize() + "x" + parent.columnSize() + "], view ["
+ + row + "x" + col + "], strides [" + rowStride + ", " + colStride + "]";
+
+ final int size = view.size();
+
+ final int sizeByRows = rowStride == 0 ? IMPOSSIBLE_SIZE : (parent.rowSize() - row) / rowStride;
+ final int sizeByCols = colStride == 0 ? IMPOSSIBLE_SIZE : (parent.columnSize() - col) / colStride;
+
+ assertTrue("Size " + size + " differs from expected for " + desc,
+ size == sizeByRows || size == sizeByCols);
+
+ for (int idx = 0; idx < size; idx++) {
+ final int rowIdx = row + idx * rowStride;
+ final int colIdx = col + idx * colStride;
+
+ assertEquals(UNEXPECTED_VALUE + " at view index " + idx + desc,
+ parent.get(rowIdx, colIdx), view.get(idx), 0d);
+ }
+ }
+
+ /** */
+ private Matrix newMatrix(int rowSize, int colSize) {
+ Matrix res = new DenseLocalOnHeapMatrix(rowSize, colSize);
+
+ for (int i = 0; i < res.rowSize(); i++)
+ for (int j = 0; j < res.columnSize(); j++)
+ res.set(i, j, i * res.rowSize() + j);
+
+ return res;
+ }
+
+ /** */
+ private void assertView(int row, int col, Vector view, int viewIdx) {
+ assertValue(row, col, view, viewIdx);
+
+ parent.set(row, col, parent.get(row, col) + 1);
+
+ assertValue(row, col, view, viewIdx);
+
+ view.set(viewIdx, view.get(viewIdx) + 2);
+
+ assertValue(row, col, view, viewIdx);
+ }
+
+ /** */
+ private void assertValue(int row, int col, Vector view, int viewIdx) {
+ assertEquals(UNEXPECTED_VALUE + " at row " + row + " col " + col, parent.get(row, col), view.get(viewIdx), 0d);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/PivotedVectorViewConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/PivotedVectorViewConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/PivotedVectorViewConstructorTest.java
new file mode 100644
index 0000000..72be324
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/PivotedVectorViewConstructorTest.java
@@ -0,0 +1,211 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.CardinalityException;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+
+/** */
+public class PivotedVectorViewConstructorTest {
+ /** */
+ private static final int IMPOSSIBLE_SIZE = -1;
+
+ /** */
+ private static final SampleParams sampleParams = new SampleParams();
+
+ /** */
+ @Test(expected = NullPointerException.class)
+ public void nullVecParamTest() {
+ assertEquals("Expect exception due to null vector param.", IMPOSSIBLE_SIZE,
+ new PivotedVectorView(null, sampleParams.pivot).size());
+ }
+
+ /** */
+ @Test(expected = NullPointerException.class)
+ public void nullVecParam2Test() {
+ assertEquals("Expect exception due to null vector param, with unpivot.", IMPOSSIBLE_SIZE,
+ new PivotedVectorView(null, sampleParams.pivot, sampleParams.unpivot).size());
+ }
+
+ /** */
+ @Test(expected = NullPointerException.class)
+ public void nullPivotParamTest() {
+ assertEquals("Expect exception due to null pivot param.", IMPOSSIBLE_SIZE,
+ new PivotedVectorView(sampleParams.vec, null).size());
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void nullPivotParam2Test() {
+ assertEquals("Expect exception due to null pivot param, with unpivot.", IMPOSSIBLE_SIZE,
+ new PivotedVectorView(sampleParams.vec, null, sampleParams.unpivot).size());
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void nullUnpivotParam2Test() {
+ assertEquals("Expect exception due to null unpivot param.", IMPOSSIBLE_SIZE,
+ new PivotedVectorView(sampleParams.vec, sampleParams.pivot, null).size());
+ }
+
+ /** */
+ @Test(expected = CardinalityException.class)
+ public void emptyPivotTest() {
+ assertEquals("Expect exception due to empty pivot param.", IMPOSSIBLE_SIZE,
+ new PivotedVectorView(sampleParams.vec, new int[] {}).size());
+ }
+
+ /** */
+ @Test(expected = CardinalityException.class)
+ public void emptyPivot2Test() {
+ assertEquals("Expect exception due to empty pivot param, with unpivot.", IMPOSSIBLE_SIZE,
+ new PivotedVectorView(sampleParams.vec, new int[] {}, sampleParams.unpivot).size());
+ }
+
+ /** */
+ @Test(expected = CardinalityException.class)
+ public void wrongPivotTest() {
+ assertEquals("Expect exception due to wrong pivot param.", IMPOSSIBLE_SIZE,
+ new PivotedVectorView(sampleParams.vec, new int[] {0}).size());
+ }
+
+ /** */
+ @Test(expected = CardinalityException.class)
+ public void wrongPivot2Test() {
+ assertEquals("Expect exception due to wrong pivot param, with unpivot.", IMPOSSIBLE_SIZE,
+ new PivotedVectorView(sampleParams.vec, new int[] {0}, sampleParams.unpivot).size());
+ }
+
+ /** */
+ @Test(expected = CardinalityException.class)
+ public void emptyUnpivotTest() {
+ assertEquals("Expect exception due to empty unpivot param.", IMPOSSIBLE_SIZE,
+ new PivotedVectorView(sampleParams.vec, sampleParams.pivot, new int[] {}).size());
+ }
+
+ /** */
+ @Test(expected = CardinalityException.class)
+ public void wrongUnpivotTest() {
+ assertEquals("Expect exception due to wrong unpivot param, with unpivot.", IMPOSSIBLE_SIZE,
+ new PivotedVectorView(sampleParams.vec, sampleParams.pivot, new int[] {0}).size());
+ }
+
+ /** */
+ @Test
+ public void basicPivotTest() {
+ final PivotedVectorView pvv = new PivotedVectorView(sampleParams.vec, sampleParams.pivot);
+
+ final int size = sampleParams.vec.size();
+
+ assertEquals("View size differs from expected.", size, pvv.size());
+
+ assertSame("Base vector differs from expected.", sampleParams.vec, pvv.getBaseVector());
+
+ for (int idx = 0; idx < size; idx++) {
+ assertEquals("Sample pivot and unpivot differ from expected",
+ idx, sampleParams.unpivot[sampleParams.pivot[idx]]);
+
+ assertEquals("Pivot differs from expected at index " + idx,
+ sampleParams.pivot[idx], pvv.pivot(idx));
+
+ assertEquals("Default unpivot differs from expected at index " + idx,
+ sampleParams.unpivot[idx], pvv.unpivot(idx));
+
+ final Metric metric = new Metric(sampleParams.vec.get(idx), pvv.get(pvv.pivot(idx)));
+
+ assertTrue("Not close enough at index " + idx + ", " + metric, metric.closeEnough());
+ }
+
+ for (int idx = 0; idx < size; idx++) {
+ sampleParams.vec.set(idx, sampleParams.vec.get(idx) + idx + 1);
+
+ final Metric metric = new Metric(sampleParams.vec.get(idx), pvv.get(pvv.pivot(idx)));
+
+ assertTrue("Modified value not close enough at index " + idx + ", " + metric, metric.closeEnough());
+ }
+ }
+
+ /** */
+ @Test
+ public void basicUnpivotTest() {
+ final PivotedVectorView pvv = new PivotedVectorView(sampleParams.vec, sampleParams.pivot, sampleParams.unpivot);
+
+ final int size = sampleParams.vec.size();
+
+ assertEquals("View size differs from expected.", size, pvv.size());
+
+ for (int idx = 0; idx < size; idx++) {
+ assertEquals("Unpivot differs from expected at index " + idx,
+ sampleParams.unpivot[idx], pvv.unpivot(idx));
+
+ final Metric metric = new Metric(sampleParams.vec.get(idx), pvv.get(pvv.unpivot(idx)));
+
+ assertTrue("Not close enough at index " + idx + ", " + metric, metric.closeEnough());
+ }
+ }
+
+ /** */
+ private static class SampleParams {
+ /** */
+ final double[] data = new double[] {0, 1};
+ /** */
+ final Vector vec = new DenseLocalOnHeapVector(data);
+ /** */
+ final int[] pivot = new int[] {1, 0};
+ /** */
+ final int[] unpivot = new int[] {1, 0};
+ }
+
+ /** */
+ private static class Metric { // todo consider if softer tolerance (like say 0.1 or 0.01) would make sense here
+ /** */
+ private final double exp;
+
+ /** */
+ private final double obtained;
+
+ /** **/
+ Metric(double exp, double obtained) {
+ this.exp = exp;
+ this.obtained = obtained;
+ }
+
+ /** */
+ boolean closeEnough() {
+ return new Double(exp).equals(obtained) || closeEnoughToZero();
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return "Metric{" + "expected=" + exp +
+ ", obtained=" + obtained +
+ '}';
+ }
+
+ /** */
+ private boolean closeEnoughToZero() {
+ return (new Double(exp).equals(0.0) && new Double(obtained).equals(-0.0))
+ || (new Double(exp).equals(-0.0) && new Double(obtained).equals(0.0));
+ }
+ }
+}
[44/67] [abbrv] ignite git commit: IGNITE-5127 Fixed validation of
url fields. Refactored mixins.
Posted by sb...@apache.org.
IGNITE-5127 Fixed validation of url fields. Refactored mixins.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/843b3f7d
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/843b3f7d
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/843b3f7d
Branch: refs/heads/ignite-5075
Commit: 843b3f7d45512e3d8c2f34c3151b233201712227
Parents: e7826aa
Author: Vasiliy Sisko <vs...@gridgain.com>
Authored: Wed May 3 11:12:40 2017 +0700
Committer: Andrey Novikov <an...@gridgain.com>
Committed: Wed May 3 11:13:21 2017 +0700
----------------------------------------------------------------------
.../app/helpers/jade/form/form-field-text.pug | 55 +++-----------------
.../frontend/app/helpers/jade/mixins.pug | 14 +++--
2 files changed, 18 insertions(+), 51 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/843b3f7d/modules/web-console/frontend/app/helpers/jade/form/form-field-text.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/helpers/jade/form/form-field-text.pug b/modules/web-console/frontend/app/helpers/jade/form/form-field-text.pug
index 5a7aa2e..8207271 100644
--- a/modules/web-console/frontend/app/helpers/jade/form/form-field-text.pug
+++ b/modules/web-console/frontend/app/helpers/jade/form/form-field-text.pug
@@ -14,12 +14,11 @@
See the License for the specific language governing permissions and
limitations under the License.
-mixin ignite-field-input(type, name, model, disabled, required, placeholder)
+mixin ignite-form-field-input(name, model, disabled, required, placeholder)
input.form-control(
id=`{{ ${name} }}Input`
name=`{{ ${name} }}`
placeholder=placeholder
- type=type
data-ng-model=model
@@ -28,61 +27,21 @@ mixin ignite-field-input(type, name, model, disabled, required, placeholder)
data-ng-focus='tableReset()'
data-ignite-form-panel-field=''
- )&attributes(attributes ? attributes.attributes ? attributes.attributes : attributes: {})
-
-mixin ignite-form-field-input(name, model, disabled, required, placeholder)
- +ignite-field-input('text', name, model, disabled, required, placeholder)
+ )&attributes(attributes ? attributes.attributes ? attributes.attributes : attributes : {})
-mixin ignite-form-field-url-input(name, model, disabled, required, placeholder)
- +ignite-field-input('url', name, model, disabled, required, placeholder)
-
-mixin ignite-form-field-text(label, model, name, disabled, required, placeholder, tip)
- -var errLbl = label.substring(0, label.length - 1)
+mixin ignite-form-field-text(lbl, model, name, disabled, required, placeholder, tip)
+ -var errLbl = lbl.substring(0, lbl.length - 1)
.ignite-form-field
- +ignite-form-field__label(label, name, required)
+ +ignite-form-field__label(lbl, name, required)
.ignite-form-field__control
+tooltip(tip, tipOpts)
if block
block
- +form-field-feedback(name, 'required', errLbl + ' could not be empty!')
+ if required
+ +form-field-feedback(name, 'required', `${errLbl} could not be empty!`)
.input-tip
+ignite-form-field-input(name, model, disabled, required, placeholder)(attributes=attributes)
-
-mixin ignite-form-field-url(label, model, name, required, placeholder, tip)
- -var errLbl = label.substring(0, label.length - 1)
-
- .ignite-form-field
- +ignite-form-field__label(label, name, required)
- .ignite-form-field__control
- +tooltip(tip, tipOpts)
-
- if block
- block
-
- +form-field-feedback(name, 'required', errLbl + ' could not be empty!')
- +form-field-feedback(name, 'url', errLbl + ' should be a valid URL!')
-
- .input-tip
- +ignite-form-field-url-input(name, model, false, required, placeholder)(attributes=attributes)
-
-mixin ignite-form-field-url(label, model, name, required, placeholder, tip)
- -var errLbl = label.substring(0, label.length - 1)
-
- .ignite-form-field
- +ignite-form-field__label(label, name, required)
- .ignite-form-field__control
- if tip
- i.tipField.icon-help(bs-tooltip='' data-title=tip)
-
- if block
- block
-
- +form-field-feedback(name, 'required', errLbl + ' could not be empty!')
- +form-field-feedback(name, 'url', errLbl + ' should be a valid URL!')
-
- .input-tip
- +ignite-form-field-url-input(name, model, false, required, placeholder)(attributes=attributes)
http://git-wip-us.apache.org/repos/asf/ignite/blob/843b3f7d/modules/web-console/frontend/app/helpers/jade/mixins.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/helpers/jade/mixins.pug b/modules/web-console/frontend/app/helpers/jade/mixins.pug
index 73aa7c5..ae80ec8 100644
--- a/modules/web-console/frontend/app/helpers/jade/mixins.pug
+++ b/modules/web-console/frontend/app/helpers/jade/mixins.pug
@@ -203,12 +203,16 @@ mixin text(lbl, model, name, required, placeholder, tip)
if block
block
-//- Mixin for text field.
+//- Mixin for url field.
mixin url(lbl, model, name, required, placeholder, tip)
- +ignite-form-field-url(lbl, model, name, required, placeholder, tip)
+ -var errLbl = lbl.substring(0, lbl.length - 1)
+
+ +ignite-form-field-text(lbl, model, name, 'false', required, placeholder, tip)(type='url')
if block
block
+ +form-field-feedback(name, 'url', errLbl + ' should be a valid URL!')
+
//- Mixin for password field.
mixin password(lbl, model, name, required, placeholder, tip)
+ignite-form-field-password(lbl, model, name, false, required, placeholder, tip)
@@ -371,11 +375,15 @@ mixin table-url-field(name, model, items, valid, save, newItem)
-var onBlur = `${valid} && (${save}); ${resetOnBlur};`
div(ignite-on-focus-out=onBlur)
+ +form-field-feedback(name, 'url', 'URL should be valid!')
+
if block
block
.input-tip
- +ignite-form-field-url-input(name, model, false, 'true', 'Enter URL')(
+ +ignite-form-field-input(name, model, false, 'true', 'Enter URL')(
+ type='url'
+
data-ignite-unique=items
data-ignite-form-field-input-autofocus='true'
[16/67] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math
module to Ignite ML module added missed licenses renamed packages fixed wrong
ml profile activation (cherry picked from commit d78e071)
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/DecompositionSupport.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/DecompositionSupport.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/DecompositionSupport.java
new file mode 100644
index 0000000..20d6e79
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/DecompositionSupport.java
@@ -0,0 +1,105 @@
+/*
+ * 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.ignite.ml.math.decompositions;
+
+import org.apache.ignite.ml.math.Destroyable;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.impls.matrix.CacheMatrix;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
+import org.apache.ignite.ml.math.impls.matrix.PivotedMatrixView;
+import org.apache.ignite.ml.math.impls.matrix.RandomMatrix;
+import org.apache.ignite.ml.math.impls.vector.DenseLocalOnHeapVector;
+
+/**
+ * Helper methods to support decomposition of matrix types having some functionality limited.
+ */
+public abstract class DecompositionSupport implements Destroyable {
+ /**
+ * Create the like matrix with read-only matrices support.
+ *
+ * @param matrix Matrix for like.
+ * @return Like matrix.
+ */
+ protected Matrix like(Matrix matrix) {
+ if (isCopyLikeSupport(matrix))
+ return new DenseLocalOnHeapMatrix(matrix.rowSize(), matrix.columnSize());
+ else
+ return matrix.like(matrix.rowSize(), matrix.columnSize());
+ }
+
+ /**
+ * Create the like matrix with specified size with read-only matrices support.
+ *
+ * @param matrix Matrix for like.
+ * @return Like matrix.
+ */
+ protected Matrix like(Matrix matrix, int rows, int cols) {
+ if (isCopyLikeSupport(matrix))
+ return new DenseLocalOnHeapMatrix(rows, cols);
+ else
+ return matrix.like(rows, cols);
+ }
+
+ /**
+ * Create the like vector with read-only matrices support.
+ *
+ * @param matrix Matrix for like.
+ * @param crd Cardinality of the vector.
+ * @return Like vector.
+ */
+ protected Vector likeVector(Matrix matrix, int crd) {
+ if (isCopyLikeSupport(matrix))
+ return new DenseLocalOnHeapVector(crd);
+ else
+ return matrix.likeVector(crd);
+ }
+
+ /**
+ * Create the like vector with read-only matrices support.
+ *
+ * @param matrix Matrix for like.
+ * @return Like vector.
+ */
+ protected Vector likeVector(Matrix matrix) {
+ return likeVector(matrix, matrix.rowSize());
+ }
+
+ /**
+ * Create the copy of matrix with read-only matrices support.
+ *
+ * @param matrix Matrix for copy.
+ * @return Copy.
+ */
+ protected Matrix copy(Matrix matrix) {
+ if (isCopyLikeSupport(matrix)) {
+ DenseLocalOnHeapMatrix cp = new DenseLocalOnHeapMatrix(matrix.rowSize(), matrix.columnSize());
+
+ cp.assign(matrix);
+
+ return cp;
+ }
+ else
+ return matrix.copy();
+ }
+
+ /** */
+ private boolean isCopyLikeSupport(Matrix matrix) {
+ return matrix instanceof RandomMatrix || matrix instanceof PivotedMatrixView || matrix instanceof CacheMatrix;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/EigenDecomposition.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/EigenDecomposition.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/EigenDecomposition.java
new file mode 100644
index 0000000..01af989
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/EigenDecomposition.java
@@ -0,0 +1,923 @@
+/*
+ * 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.ignite.ml.math.decompositions;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.functions.Functions;
+
+/**
+ * This class provides EigenDecomposition of given matrix. The class is based on
+ * class with similar name from <a href="http://mahout.apache.org/">Apache Mahout</a> library.
+ *
+ * @see <a href=http://mathworld.wolfram.com/EigenDecomposition.html>MathWorld</a>
+ */
+public class EigenDecomposition extends DecompositionSupport {
+ /** Row and column dimension (square matrix). */
+ private final int n;
+
+ /** Array for internal storage of eigen vectors. */
+ private final Matrix v;
+
+ /** Array for internal storage of eigenvalues. */
+ private final Vector d;
+ /** Array for internal storage of eigenvalues. */
+ private final Vector e;
+
+ /** */
+ public EigenDecomposition(Matrix matrix) {
+ this(matrix, isSymmetric(matrix));
+ }
+
+ /** */
+ public EigenDecomposition(Matrix matrix, boolean isSymmetric) {
+ n = matrix.columnSize();
+
+ d = likeVector(matrix);
+ e = likeVector(matrix);
+ v = like(matrix);
+
+ if (isSymmetric) {
+ v.assign(matrix);
+
+ // Tridiagonalize.
+ tred2();
+
+ // Diagonalize.
+ tql2();
+
+ }
+ else
+ // Reduce to Hessenberg form.
+ // Reduce Hessenberg to real Schur form.
+ hqr2(orthes(matrix));
+ }
+
+ /**
+ * Return the eigen vector matrix
+ *
+ * @return V
+ */
+ public Matrix getV() {
+ return like(v).assign(v);
+ }
+
+ /**
+ * Return the real parts of the eigenvalues
+ */
+ public Vector getRealEigenValues() {
+ return d;
+ }
+
+ /**
+ * Return the imaginary parts of the eigenvalues
+ */
+ public Vector getImagEigenvalues() {
+ return e;
+ }
+
+ /**
+ * Return the block diagonal eigenvalue matrix
+ *
+ * @return D
+ */
+ public Matrix getD() {
+ Matrix res = like(v, d.size(), d.size());
+ res.assign(0);
+ res.viewDiagonal().assign(d);
+ for (int i = 0; i < n; i++) {
+ double v = e.getX(i);
+ if (v > 0)
+ res.setX(i, i + 1, v);
+ else if (v < 0)
+ res.setX(i, i - 1, v);
+ }
+ return res;
+ }
+
+ /**
+ * Destroys decomposition components and other internal components of decomposition.
+ */
+ @Override public void destroy() {
+ e.destroy();
+ v.destroy();
+ d.destroy();
+ }
+
+ /** */
+ private void tred2() {
+ // This is derived from the Algol procedures tred2 by
+ // Bowdler, Martin, Reinsch, and Wilkinson, Handbook for
+ // Auto. Comp., Vol.ii-Linear Algebra, and the corresponding
+ // Fortran subroutine in EISPACK.
+
+ d.assign(v.viewColumn(n - 1));
+
+ // Householder reduction to tridiagonal form.
+
+ for (int i = n - 1; i > 0; i--) {
+
+ // Scale to avoid under/overflow.
+ double scale = d.viewPart(0, i).kNorm(1);
+ double h = 0.0;
+
+ if (scale == 0.0) {
+ e.setX(i, d.getX(i - 1));
+ for (int j = 0; j < i; j++) {
+ d.setX(j, v.getX(i - 1, j));
+ v.setX(i, j, 0.0);
+ v.setX(j, i, 0.0);
+ }
+ }
+ else {
+
+ // Generate Householder vector.
+
+ for (int k = 0; k < i; k++) {
+ d.setX(k, d.getX(k) / scale);
+ h += d.getX(k) * d.getX(k);
+ }
+
+ double f = d.getX(i - 1);
+ double g = Math.sqrt(h);
+
+ if (f > 0)
+ g = -g;
+
+ e.setX(i, scale * g);
+ h -= f * g;
+ d.setX(i - 1, f - g);
+
+ for (int j = 0; j < i; j++)
+ e.setX(j, 0.0);
+
+ // Apply similarity transformation to remaining columns.
+
+ for (int j = 0; j < i; j++) {
+ f = d.getX(j);
+ v.setX(j, i, f);
+ g = e.getX(j) + v.getX(j, j) * f;
+
+ for (int k = j + 1; k <= i - 1; k++) {
+ g += v.getX(k, j) * d.getX(k);
+ e.setX(k, e.getX(k) + v.getX(k, j) * f);
+ }
+
+ e.setX(j, g);
+ }
+
+ f = 0.0;
+
+ for (int j = 0; j < i; j++) {
+ e.setX(j, e.getX(j) / h);
+ f += e.getX(j) * d.getX(j);
+ }
+
+ double hh = f / (h + h);
+
+ for (int j = 0; j < i; j++)
+ e.setX(j, e.getX(j) - hh * d.getX(j));
+
+ for (int j = 0; j < i; j++) {
+ f = d.getX(j);
+ g = e.getX(j);
+
+ for (int k = j; k <= i - 1; k++)
+ v.setX(k, j, v.getX(k, j) - (f * e.getX(k) + g * d.getX(k)));
+
+ d.setX(j, v.getX(i - 1, j));
+ v.setX(i, j, 0.0);
+ }
+ }
+
+ d.setX(i, h);
+ }
+ }
+
+ /** */
+ private Matrix orthes(Matrix matrix) {
+ // Working storage for nonsymmetric algorithm.
+ Vector ort = likeVector(matrix);
+ Matrix hessenBerg = like(matrix).assign(matrix);
+
+ // This is derived from the Algol procedures orthes and ortran,
+ // by Martin and Wilkinson, Handbook for Auto. Comp.,
+ // Vol.ii-Linear Algebra, and the corresponding
+ // Fortran subroutines in EISPACK.
+
+ int low = 0;
+ int high = n - 1;
+
+ for (int m = low + 1; m <= high - 1; m++) {
+
+ // Scale column.
+
+ Vector hCol = hessenBerg.viewColumn(m - 1).viewPart(m, high - m + 1);
+ double scale = hCol.kNorm(1);
+
+ if (scale != 0.0) {
+ // Compute Householder transformation.
+ ort.viewPart(m, high - m + 1).map(hCol, Functions.plusMult(1 / scale));
+ double h = ort.viewPart(m, high - m + 1).getLengthSquared();
+
+ double g = Math.sqrt(h);
+
+ if (ort.getX(m) > 0)
+ g = -g;
+
+ h -= ort.getX(m) * g;
+ ort.setX(m, ort.getX(m) - g);
+
+ // Apply Householder similarity transformation
+ // H = (I-u*u'/h)*H*(I-u*u')/h)
+
+ Vector ortPiece = ort.viewPart(m, high - m + 1);
+
+ for (int j = m; j < n; j++) {
+ double f = ortPiece.dot(hessenBerg.viewColumn(j).viewPart(m, high - m + 1)) / h;
+ hessenBerg.viewColumn(j).viewPart(m, high - m + 1).map(ortPiece, Functions.plusMult(-f));
+ }
+
+ for (int i = 0; i <= high; i++) {
+ double f = ortPiece.dot(hessenBerg.viewRow(i).viewPart(m, high - m + 1)) / h;
+ hessenBerg.viewRow(i).viewPart(m, high - m + 1).map(ortPiece, Functions.plusMult(-f));
+ }
+
+ ort.setX(m, scale * ort.getX(m));
+ hessenBerg.setX(m, m - 1, scale * g);
+ }
+ }
+
+ // Accumulate transformations (Algol's ortran).
+
+ v.assign(0);
+ v.viewDiagonal().assign(1);
+
+ for (int m = high - 1; m >= low + 1; m--) {
+ if (hessenBerg.getX(m, m - 1) != 0.0) {
+ ort.viewPart(m + 1, high - m).assign(hessenBerg.viewColumn(m - 1).viewPart(m + 1, high - m));
+
+ for (int j = m; j <= high; j++) {
+ double g = ort.viewPart(m, high - m + 1).dot(v.viewColumn(j).viewPart(m, high - m + 1));
+
+ // Double division avoids possible underflow
+ g = g / ort.getX(m) / hessenBerg.getX(m, m - 1);
+ v.viewColumn(j).viewPart(m, high - m + 1).map(ort.viewPart(m, high - m + 1), Functions.plusMult(g));
+ }
+ }
+ }
+
+ return hessenBerg;
+ }
+
+ /** Symmetric tridiagonal QL algorithm. */
+ private void tql2() {
+ // This is derived from the Algol procedures tql2, by
+ // Bowdler, Martin, Reinsch, and Wilkinson, Handbook for
+ // Auto. Comp., Vol.ii-Linear Algebra, and the corresponding
+ // Fortran subroutine in EISPACK.
+
+ e.viewPart(0, n - 1).assign(e.viewPart(1, n - 1));
+ e.setX(n - 1, 0.0);
+
+ double f = 0.0;
+ double tst1 = 0.0;
+ double eps = Math.pow(2.0, -52.0);
+
+ for (int l = 0; l < n; l++) {
+ // Find small subdiagonal element.
+
+ tst1 = Math.max(tst1, Math.abs(d.getX(l)) + Math.abs(e.getX(l)));
+ int m = l;
+
+ while (m < n) {
+ if (Math.abs(e.getX(m)) <= eps * tst1)
+ break;
+
+ m++;
+ }
+
+ // If m == l, d.getX(l) is an eigenvalue,
+ // otherwise, iterate.
+
+ if (m > l) {
+ do {
+ // Compute implicit shift
+
+ double g = d.getX(l);
+ double p = (d.getX(l + 1) - g) / (2.0 * e.getX(l));
+ double r = Math.hypot(p, 1.0);
+
+ if (p < 0)
+ r = -r;
+
+ d.setX(l, e.getX(l) / (p + r));
+ d.setX(l + 1, e.getX(l) * (p + r));
+ double dl1 = d.getX(l + 1);
+ double h = g - d.getX(l);
+
+ for (int i = l + 2; i < n; i++)
+ d.setX(i, d.getX(i) - h);
+
+ f += h;
+
+ // Implicit QL transformation.
+
+ p = d.getX(m);
+ double c = 1.0;
+ double c2 = c;
+ double c3 = c;
+ double el1 = e.getX(l + 1);
+ double s = 0.0;
+ double s2 = 0.0;
+
+ for (int i = m - 1; i >= l; i--) {
+ c3 = c2;
+ c2 = c;
+ s2 = s;
+ g = c * e.getX(i);
+ h = c * p;
+ r = Math.hypot(p, e.getX(i));
+ e.setX(i + 1, s * r);
+ s = e.getX(i) / r;
+ c = p / r;
+ p = c * d.getX(i) - s * g;
+ d.setX(i + 1, h + s * (c * g + s * d.getX(i)));
+
+ // Accumulate transformation.
+
+ for (int k = 0; k < n; k++) {
+ h = v.getX(k, i + 1);
+ v.setX(k, i + 1, s * v.getX(k, i) + c * h);
+ v.setX(k, i, c * v.getX(k, i) - s * h);
+ }
+ }
+
+ p = -s * s2 * c3 * el1 * e.getX(l) / dl1;
+ e.setX(l, s * p);
+ d.setX(l, c * p);
+
+ // Check for convergence.
+
+ }
+ while (Math.abs(e.getX(l)) > eps * tst1);
+ }
+
+ d.setX(l, d.getX(l) + f);
+ e.setX(l, 0.0);
+ }
+
+ // Sort eigenvalues and corresponding vectors.
+
+ for (int i = 0; i < n - 1; i++) {
+ int k = i;
+ double p = d.getX(i);
+
+ for (int j = i + 1; j < n; j++)
+ if (d.getX(j) > p) {
+ k = j;
+ p = d.getX(j);
+ }
+
+ if (k != i) {
+ d.setX(k, d.getX(i));
+ d.setX(i, p);
+
+ for (int j = 0; j < n; j++) {
+ p = v.getX(j, i);
+ v.setX(j, i, v.getX(j, k));
+ v.setX(j, k, p);
+ }
+ }
+ }
+ }
+
+ /** */
+ private void hqr2(Matrix h) {
+ // This is derived from the Algol procedure hqr2,
+ // by Martin and Wilkinson, Handbook for Auto. Comp.,
+ // Vol.ii-Linear Algebra, and the corresponding
+ // Fortran subroutine in EISPACK.
+
+ // Initialize
+
+ int nn = this.n;
+ int n = nn - 1;
+ int low = 0;
+ int high = nn - 1;
+ double eps = Math.pow(2.0, -52.0);
+ double exshift = 0.0;
+ double p = 0;
+ double q = 0;
+ double r = 0;
+ double s = 0;
+ double z = 0;
+ double w;
+ double x;
+ double y;
+
+ // Store roots isolated by balanc and compute matrix norm
+
+ double norm = h.foldMap(Functions.PLUS, Functions.ABS, 0.0);
+
+ // Outer loop over eigenvalue index
+
+ int iter = 0;
+ while (n >= low) {
+ // Look for single small sub-diagonal element
+ int l = n;
+
+ while (l > low) {
+ s = Math.abs(h.getX(l - 1, l - 1)) + Math.abs(h.getX(l, l));
+
+ if (s == 0.0)
+ s = norm;
+
+ if (Math.abs(h.getX(l, l - 1)) < eps * s)
+ break;
+
+ l--;
+ }
+
+ // Check for convergence
+
+ if (l == n) {
+ // One root found
+ h.setX(n, n, h.getX(n, n) + exshift);
+ d.setX(n, h.getX(n, n));
+ e.setX(n, 0.0);
+ n--;
+ iter = 0;
+ }
+ else if (l == n - 1) {
+ // Two roots found
+ w = h.getX(n, n - 1) * h.getX(n - 1, n);
+ p = (h.getX(n - 1, n - 1) - h.getX(n, n)) / 2.0;
+ q = p * p + w;
+ z = Math.sqrt(Math.abs(q));
+ h.setX(n, n, h.getX(n, n) + exshift);
+ h.setX(n - 1, n - 1, h.getX(n - 1, n - 1) + exshift);
+ x = h.getX(n, n);
+
+ // Real pair
+ if (q >= 0) {
+ if (p >= 0)
+ z = p + z;
+ else
+ z = p - z;
+
+ d.setX(n - 1, x + z);
+ d.setX(n, d.getX(n - 1));
+
+ if (z != 0.0)
+ d.setX(n, x - w / z);
+
+ e.setX(n - 1, 0.0);
+ e.setX(n, 0.0);
+ x = h.getX(n, n - 1);
+ s = Math.abs(x) + Math.abs(z);
+ p = x / s;
+ q = z / s;
+ r = Math.sqrt(p * p + q * q);
+ p /= r;
+ q /= r;
+
+ // Row modification
+
+ for (int j = n - 1; j < nn; j++) {
+ z = h.getX(n - 1, j);
+ h.setX(n - 1, j, q * z + p * h.getX(n, j));
+ h.setX(n, j, q * h.getX(n, j) - p * z);
+ }
+
+ // Column modification
+
+ for (int i = 0; i <= n; i++) {
+ z = h.getX(i, n - 1);
+ h.setX(i, n - 1, q * z + p * h.getX(i, n));
+ h.setX(i, n, q * h.getX(i, n) - p * z);
+ }
+
+ // Accumulate transformations
+
+ for (int i = low; i <= high; i++) {
+ z = v.getX(i, n - 1);
+ v.setX(i, n - 1, q * z + p * v.getX(i, n));
+ v.setX(i, n, q * v.getX(i, n) - p * z);
+ }
+
+ // Complex pair
+
+ }
+ else {
+ d.setX(n - 1, x + p);
+ d.setX(n, x + p);
+ e.setX(n - 1, z);
+ e.setX(n, -z);
+ }
+
+ n -= 2;
+ iter = 0;
+
+ // No convergence yet
+
+ }
+ else {
+ // Form shift
+ x = h.getX(n, n);
+ y = 0.0;
+ w = 0.0;
+
+ if (l < n) {
+ y = h.getX(n - 1, n - 1);
+ w = h.getX(n, n - 1) * h.getX(n - 1, n);
+ }
+
+ // Wilkinson's original ad hoc shift
+
+ if (iter == 10) {
+ exshift += x;
+
+ for (int i = low; i <= n; i++)
+ h.setX(i, i, x);
+
+ s = Math.abs(h.getX(n, n - 1)) + Math.abs(h.getX(n - 1, n - 2));
+ x = y = 0.75 * s;
+ w = -0.4375 * s * s;
+ }
+
+ // MATLAB's new ad hoc shift
+
+ if (iter == 30) {
+ s = (y - x) / 2.0;
+ s = s * s + w;
+
+ if (s > 0) {
+ s = Math.sqrt(s);
+
+ if (y < x)
+ s = -s;
+
+ s = x - w / ((y - x) / 2.0 + s);
+
+ for (int i = low; i <= n; i++)
+ h.setX(i, i, h.getX(i, i) - s);
+
+ exshift += s;
+ x = y = w = 0.964;
+ }
+ }
+
+ iter++; // (Could check iteration count here.)
+
+ // Look for two consecutive small sub-diagonal elements
+
+ int m = n - 2;
+
+ while (m >= l) {
+ z = h.getX(m, m);
+ r = x - z;
+ s = y - z;
+ p = (r * s - w) / h.getX(m + 1, m) + h.getX(m, m + 1);
+ q = h.getX(m + 1, m + 1) - z - r - s;
+ r = h.getX(m + 2, m + 1);
+ s = Math.abs(p) + Math.abs(q) + Math.abs(r);
+ p /= s;
+ q /= s;
+ r /= s;
+
+ if (m == l)
+ break;
+
+ double hmag = Math.abs(h.getX(m - 1, m - 1)) + Math.abs(h.getX(m + 1, m + 1));
+ double threshold = eps * Math.abs(p) * (Math.abs(z) + hmag);
+
+ if (Math.abs(h.getX(m, m - 1)) * (Math.abs(q) + Math.abs(r)) < threshold)
+ break;
+
+ m--;
+ }
+
+ for (int i = m + 2; i <= n; i++) {
+ h.setX(i, i - 2, 0.0);
+
+ if (i > m + 2)
+ h.setX(i, i - 3, 0.0);
+ }
+
+ // Double QR step involving rows l:n and columns m:n
+
+ for (int k = m; k <= n - 1; k++) {
+ boolean notlast = k != n - 1;
+
+ if (k != m) {
+ p = h.getX(k, k - 1);
+ q = h.getX(k + 1, k - 1);
+ r = notlast ? h.getX(k + 2, k - 1) : 0.0;
+ x = Math.abs(p) + Math.abs(q) + Math.abs(r);
+ if (x != 0.0) {
+ p /= x;
+ q /= x;
+ r /= x;
+ }
+ }
+
+ if (x == 0.0)
+ break;
+
+ s = Math.sqrt(p * p + q * q + r * r);
+
+ if (p < 0)
+ s = -s;
+
+ if (s != 0) {
+ if (k != m)
+ h.setX(k, k - 1, -s * x);
+ else if (l != m)
+ h.setX(k, k - 1, -h.getX(k, k - 1));
+
+ p += s;
+ x = p / s;
+ y = q / s;
+ z = r / s;
+ q /= p;
+ r /= p;
+
+ // Row modification
+
+ for (int j = k; j < nn; j++) {
+ p = h.getX(k, j) + q * h.getX(k + 1, j);
+
+ if (notlast) {
+ p += r * h.getX(k + 2, j);
+ h.setX(k + 2, j, h.getX(k + 2, j) - p * z);
+ }
+
+ h.setX(k, j, h.getX(k, j) - p * x);
+ h.setX(k + 1, j, h.getX(k + 1, j) - p * y);
+ }
+
+ // Column modification
+
+ for (int i = 0; i <= Math.min(n, k + 3); i++) {
+ p = x * h.getX(i, k) + y * h.getX(i, k + 1);
+
+ if (notlast) {
+ p += z * h.getX(i, k + 2);
+ h.setX(i, k + 2, h.getX(i, k + 2) - p * r);
+ }
+
+ h.setX(i, k, h.getX(i, k) - p);
+ h.setX(i, k + 1, h.getX(i, k + 1) - p * q);
+ }
+
+ // Accumulate transformations
+
+ for (int i = low; i <= high; i++) {
+ p = x * v.getX(i, k) + y * v.getX(i, k + 1);
+
+ if (notlast) {
+ p += z * v.getX(i, k + 2);
+ v.setX(i, k + 2, v.getX(i, k + 2) - p * r);
+ }
+
+ v.setX(i, k, v.getX(i, k) - p);
+ v.setX(i, k + 1, v.getX(i, k + 1) - p * q);
+ }
+ } // (s != 0)
+ } // k loop
+ } // check convergence
+ } // while (n >= low)
+
+ // Back substitute to find vectors of upper triangular form
+
+ if (norm == 0.0)
+ return;
+
+ for (n = nn - 1; n >= 0; n--) {
+ p = d.getX(n);
+ q = e.getX(n);
+
+ // Real vector
+
+ double t;
+
+ if (q == 0) {
+ int l = n;
+ h.setX(n, n, 1.0);
+
+ for (int i = n - 1; i >= 0; i--) {
+ w = h.getX(i, i) - p;
+ r = 0.0;
+
+ for (int j = l; j <= n; j++)
+ r += h.getX(i, j) * h.getX(j, n);
+
+ if (e.getX(i) < 0.0) {
+ z = w;
+ s = r;
+ }
+ else {
+ l = i;
+
+ if (e.getX(i) == 0.0) {
+ if (w == 0.0)
+ h.setX(i, n, -r / (eps * norm));
+ else
+ h.setX(i, n, -r / w);
+
+ // Solve real equations
+
+ }
+ else {
+ x = h.getX(i, i + 1);
+ y = h.getX(i + 1, i);
+ q = (d.getX(i) - p) * (d.getX(i) - p) + e.getX(i) * e.getX(i);
+ t = (x * s - z * r) / q;
+ h.setX(i, n, t);
+
+ if (Math.abs(x) > Math.abs(z))
+ h.setX(i + 1, n, (-r - w * t) / x);
+ else
+ h.setX(i + 1, n, (-s - y * t) / z);
+ }
+
+ // Overflow control
+
+ t = Math.abs(h.getX(i, n));
+
+ if (eps * t * t > 1) {
+ for (int j = i; j <= n; j++)
+ h.setX(j, n, h.getX(j, n) / t);
+ }
+ }
+ }
+
+ // Complex vector
+
+ }
+ else if (q < 0) {
+ int l = n - 1;
+
+ // Last vector component imaginary so matrix is triangular
+
+ if (Math.abs(h.getX(n, n - 1)) > Math.abs(h.getX(n - 1, n))) {
+ h.setX(n - 1, n - 1, q / h.getX(n, n - 1));
+ h.setX(n - 1, n, -(h.getX(n, n) - p) / h.getX(n, n - 1));
+ }
+ else {
+ cdiv(0.0, -h.getX(n - 1, n), h.getX(n - 1, n - 1) - p, q);
+ h.setX(n - 1, n - 1, cdivr);
+ h.setX(n - 1, n, cdivi);
+ }
+
+ h.setX(n, n - 1, 0.0);
+ h.setX(n, n, 1.0);
+
+ for (int i = n - 2; i >= 0; i--) {
+ double ra = 0.0;
+ double sa = 0.0;
+
+ for (int j = l; j <= n; j++) {
+ ra += h.getX(i, j) * h.getX(j, n - 1);
+ sa += h.getX(i, j) * h.getX(j, n);
+ }
+
+ w = h.getX(i, i) - p;
+
+ if (e.getX(i) < 0.0) {
+ z = w;
+ r = ra;
+ s = sa;
+ }
+ else {
+ l = i;
+
+ if (e.getX(i) == 0) {
+ cdiv(-ra, -sa, w, q);
+ h.setX(i, n - 1, cdivr);
+ h.setX(i, n, cdivi);
+ }
+ else {
+
+ // Solve complex equations
+
+ x = h.getX(i, i + 1);
+ y = h.getX(i + 1, i);
+
+ double vr = (d.getX(i) - p) * (d.getX(i) - p) + e.getX(i) * e.getX(i) - q * q;
+ double vi = (d.getX(i) - p) * 2.0 * q;
+
+ if (vr == 0.0 && vi == 0.0) {
+ double hmag = Math.abs(x) + Math.abs(y);
+ vr = eps * norm * (Math.abs(w) + Math.abs(q) + hmag + Math.abs(z));
+ }
+
+ cdiv(x * r - z * ra + q * sa, x * s - z * sa - q * ra, vr, vi);
+
+ h.setX(i, n - 1, cdivr);
+ h.setX(i, n, cdivi);
+
+ if (Math.abs(x) > (Math.abs(z) + Math.abs(q))) {
+ h.setX(i + 1, n - 1, (-ra - w * h.getX(i, n - 1) + q * h.getX(i, n)) / x);
+ h.setX(i + 1, n, (-sa - w * h.getX(i, n) - q * h.getX(i, n - 1)) / x);
+ }
+ else {
+ cdiv(-r - y * h.getX(i, n - 1), -s - y * h.getX(i, n), z, q);
+
+ h.setX(i + 1, n - 1, cdivr);
+ h.setX(i + 1, n, cdivi);
+ }
+ }
+
+ // Overflow control
+
+ t = Math.max(Math.abs(h.getX(i, n - 1)), Math.abs(h.getX(i, n)));
+
+ if (eps * t * t > 1)
+ for (int j = i; j <= n; j++) {
+ h.setX(j, n - 1, h.getX(j, n - 1) / t);
+ h.setX(j, n, h.getX(j, n) / t);
+ }
+ }
+ }
+ }
+ }
+
+ // Vectors of isolated roots
+
+ for (int i = 0; i < nn; i++)
+ if (i < low || i > high) {
+ for (int j = i; j < nn; j++)
+ v.setX(i, j, h.getX(i, j));
+ }
+
+ // Back transformation to get eigen vectors of original matrix
+
+ for (int j = nn - 1; j >= low; j--)
+ for (int i = low; i <= high; i++) {
+ z = 0.0;
+
+ for (int k = low; k <= Math.min(j, high); k++)
+ z += v.getX(i, k) * h.getX(k, j);
+
+ v.setX(i, j, z);
+ }
+ }
+
+ /** */
+ private static boolean isSymmetric(Matrix matrix) {
+ int cols = matrix.columnSize();
+ int rows = matrix.rowSize();
+
+ if (cols != rows)
+ return false;
+
+ for (int i = 0; i < cols; i++)
+ for (int j = 0; j < rows; j++) {
+ if (matrix.getX(i, j) != matrix.get(j, i))
+ return false;
+ }
+
+ return true;
+ }
+
+ /** Complex scalar division - real part. */
+ private double cdivr;
+ /** Complex scalar division - imaginary part. */
+ private double cdivi;
+
+ /** */
+ private void cdiv(double xr, double xi, double yr, double yi) {
+ double r;
+ double d;
+
+ if (Math.abs(yr) > Math.abs(yi)) {
+ r = yi / yr;
+ d = yr + r * yi;
+ cdivr = (xr + r * xi) / d;
+ cdivi = (xi - r * xr) / d;
+ }
+ else {
+ r = yr / yi;
+ d = yi + r * yr;
+ cdivr = (r * xr + xi) / d;
+ cdivi = (r * xi - xr) / d;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/LUDecomposition.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/LUDecomposition.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/LUDecomposition.java
new file mode 100644
index 0000000..b1efc09
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/LUDecomposition.java
@@ -0,0 +1,366 @@
+/*
+ * 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.ignite.ml.math.decompositions;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.CardinalityException;
+import org.apache.ignite.ml.math.exceptions.SingularMatrixException;
+
+/**
+ * Calculates the LU-decomposition of a square matrix.
+ *
+ * This class inspired by class from Apache Common Math with similar name.
+ *
+ * @see <a href="http://mathworld.wolfram.com/LUDecomposition.html">MathWorld</a>
+ * @see <a href="http://en.wikipedia.org/wiki/LU_decomposition">Wikipedia</a>
+ */
+public class LUDecomposition extends DecompositionSupport {
+ /** Default bound to determine effective singularity in LU decomposition. */
+ private static final double DEFAULT_TOO_SMALL = 1e-11;
+
+ /** Pivot permutation associated with LU decomposition. */
+ private final Vector pivot;
+ /** Parity of the permutation associated with the LU decomposition. */
+ private boolean even;
+ /** Singularity indicator. */
+ private boolean singular;
+ /** Cached value of L. */
+ private Matrix cachedL;
+ /** Cached value of U. */
+ private Matrix cachedU;
+ /** Cached value of P. */
+ private Matrix cachedP;
+ /** Original matrix. */
+ private Matrix matrix;
+ /** Entries of LU decomposition. */
+ private Matrix lu;
+
+ /**
+ * Calculates the LU-decomposition of the given matrix.
+ * This constructor uses 1e-11 as default value for the singularity
+ * threshold.
+ *
+ * @param matrix Matrix to decompose.
+ * @throws CardinalityException if matrix is not square.
+ */
+ public LUDecomposition(Matrix matrix) {
+ this(matrix, DEFAULT_TOO_SMALL);
+ }
+
+ /**
+ * Calculates the LUP-decomposition of the given matrix.
+ *
+ * @param matrix Matrix to decompose.
+ * @param singularityThreshold threshold (based on partial row norm).
+ * @throws CardinalityException if matrix is not square.
+ */
+ public LUDecomposition(Matrix matrix, double singularityThreshold) {
+ assert matrix != null;
+
+ int rows = matrix.rowSize();
+ int cols = matrix.columnSize();
+
+ if (rows != cols)
+ throw new CardinalityException(rows, cols);
+
+ this.matrix = matrix;
+
+ lu = copy(matrix);
+
+ pivot = likeVector(matrix);
+
+ for (int i = 0; i < pivot.size(); i++)
+ pivot.setX(i, i);
+
+ even = true;
+ singular = false;
+
+ cachedL = null;
+ cachedU = null;
+ cachedP = null;
+
+ for (int col = 0; col < cols; col++) {
+
+ //upper
+ for (int row = 0; row < col; row++) {
+ Vector luRow = lu.viewRow(row);
+ double sum = luRow.get(col);
+
+ for (int i = 0; i < row; i++)
+ sum -= luRow.getX(i) * lu.getX(i, col);
+
+ luRow.setX(col, sum);
+ }
+
+ // permutation row
+ int max = col;
+
+ double largest = Double.NEGATIVE_INFINITY;
+
+ // lower
+ for (int row = col; row < rows; row++) {
+ Vector luRow = lu.viewRow(row);
+ double sum = luRow.getX(col);
+
+ for (int i = 0; i < col; i++)
+ sum -= luRow.getX(i) * lu.getX(i, col);
+
+ luRow.setX(col, sum);
+
+ if (Math.abs(sum) > largest) {
+ largest = Math.abs(sum);
+ max = row;
+ }
+ }
+
+ // Singularity check
+ if (Math.abs(lu.getX(max, col)) < singularityThreshold) {
+ singular = true;
+ return;
+ }
+
+ // Pivot if necessary
+ if (max != col) {
+ double tmp;
+ Vector luMax = lu.viewRow(max);
+ Vector luCol = lu.viewRow(col);
+
+ for (int i = 0; i < cols; i++) {
+ tmp = luMax.getX(i);
+ luMax.setX(i, luCol.getX(i));
+ luCol.setX(i, tmp);
+ }
+
+ int temp = (int)pivot.getX(max);
+ pivot.setX(max, pivot.getX(col));
+ pivot.setX(col, temp);
+
+ even = !even;
+ }
+
+ // Divide the lower elements by the "winning" diagonal elt.
+ final double luDiag = lu.getX(col, col);
+
+ for (int row = col + 1; row < cols; row++) {
+ double val = lu.getX(row, col) / luDiag;
+ lu.setX(row, col, val);
+ }
+ }
+ }
+
+ /**
+ * Destroys decomposition components and other internal components of decomposition.
+ */
+ @Override public void destroy() {
+ if (cachedL != null)
+ cachedL.destroy();
+ if (cachedU != null)
+ cachedU.destroy();
+ if (cachedP != null)
+ cachedP.destroy();
+ lu.destroy();
+ }
+
+ /**
+ * Returns the matrix L of the decomposition.
+ * <p>L is a lower-triangular matrix</p>
+ *
+ * @return the L matrix (or null if decomposed matrix is singular).
+ */
+ public Matrix getL() {
+ if ((cachedL == null) && !singular) {
+ final int m = pivot.size();
+
+ cachedL = like(matrix);
+ cachedL.assign(0.0);
+
+ for (int i = 0; i < m; ++i) {
+ for (int j = 0; j < i; ++j)
+ cachedL.setX(i, j, lu.getX(i, j));
+
+ cachedL.setX(i, i, 1.0);
+ }
+ }
+
+ return cachedL;
+ }
+
+ /**
+ * Returns the matrix U of the decomposition.
+ * <p>U is an upper-triangular matrix</p>
+ *
+ * @return the U matrix (or null if decomposed matrix is singular).
+ */
+ public Matrix getU() {
+ if ((cachedU == null) && !singular) {
+ final int m = pivot.size();
+
+ cachedU = like(matrix);
+ cachedU.assign(0.0);
+
+ for (int i = 0; i < m; ++i)
+ for (int j = i; j < m; ++j)
+ cachedU.setX(i, j, lu.getX(i, j));
+ }
+
+ return cachedU;
+ }
+
+ /**
+ * Returns the P rows permutation matrix.
+ * <p>P is a sparse matrix with exactly one element set to 1.0 in
+ * each row and each column, all other elements being set to 0.0.</p>
+ * <p>The positions of the 1 elements are given by the {@link #getPivot()
+ * pivot permutation vector}.</p>
+ *
+ * @return the P rows permutation matrix (or null if decomposed matrix is singular).
+ * @see #getPivot()
+ */
+ public Matrix getP() {
+ if ((cachedP == null) && !singular) {
+ final int m = pivot.size();
+
+ cachedP = like(matrix);
+ cachedP.assign(0.0);
+
+ for (int i = 0; i < m; ++i)
+ cachedP.setX(i, (int)pivot.get(i), 1.0);
+ }
+
+ return cachedP;
+ }
+
+ /**
+ * Returns the pivot permutation vector.
+ *
+ * @return the pivot permutation vector.
+ * @see #getP()
+ */
+ public Vector getPivot() {
+ return pivot.copy();
+ }
+
+ /**
+ * Return the determinant of the matrix.
+ *
+ * @return determinant of the matrix.
+ */
+ public double determinant() {
+ if (singular)
+ return 0;
+
+ final int m = pivot.size();
+ double determinant = even ? 1 : -1;
+
+ for (int i = 0; i < m; i++)
+ determinant *= lu.getX(i, i);
+
+ return determinant;
+ }
+
+ /** */
+ public Vector solve(Vector b) {
+ final int m = pivot.size();
+
+ if (b.size() != m)
+ throw new CardinalityException(b.size(), m);
+
+ if (singular)
+ throw new SingularMatrixException();
+
+ final double[] bp = new double[m];
+
+ // Apply permutations to b
+ for (int row = 0; row < m; row++)
+ bp[row] = b.get((int)pivot.get(row));
+
+ // Solve LY = b
+ for (int col = 0; col < m; col++) {
+ final double bpCol = bp[col];
+
+ for (int i = col + 1; i < m; i++)
+ bp[i] -= bpCol * lu.get(i, col);
+ }
+
+ // Solve UX = Y
+ for (int col = m - 1; col >= 0; col--) {
+ bp[col] /= lu.get(col, col);
+ final double bpCol = bp[col];
+
+ for (int i = 0; i < col; i++)
+ bp[i] -= bpCol * lu.get(i, col);
+ }
+
+ return b.like(m).assign(bp);
+ }
+
+ /** */
+ public Matrix solve(Matrix b) {
+ final int m = pivot.size();
+
+ if (b.rowSize() != m)
+ throw new CardinalityException(b.rowSize(), m);
+
+ if (singular)
+ throw new SingularMatrixException();
+
+ final int nColB = b.columnSize();
+
+ // Apply permutations to b
+ final double[][] bp = new double[m][nColB];
+ for (int row = 0; row < m; row++) {
+ final double[] bpRow = bp[row];
+ final int pRow = (int)pivot.get(row);
+
+ for (int col = 0; col < nColB; col++)
+ bpRow[col] = b.get(pRow, col);
+ }
+
+ // Solve LY = b
+ for (int col = 0; col < m; col++) {
+ final double[] bpCol = bp[col];
+ for (int i = col + 1; i < m; i++) {
+ final double[] bpI = bp[i];
+ final double luICol = lu.get(i, col);
+
+ for (int j = 0; j < nColB; j++)
+ bpI[j] -= bpCol[j] * luICol;
+ }
+ }
+
+ // Solve UX = Y
+ for (int col = m - 1; col >= 0; col--) {
+ final double[] bpCol = bp[col];
+ final double luDiag = lu.getX(col, col);
+
+ for (int j = 0; j < nColB; j++)
+ bpCol[j] /= luDiag;
+
+ for (int i = 0; i < col; i++) {
+ final double[] bpI = bp[i];
+ final double luICol = lu.get(i, col);
+
+ for (int j = 0; j < nColB; j++)
+ bpI[j] -= bpCol[j] * luICol;
+ }
+ }
+
+ return b.like(b.rowSize(), b.columnSize()).assign(bp);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/QRDecomposition.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/QRDecomposition.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/QRDecomposition.java
new file mode 100644
index 0000000..39215e8
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/QRDecomposition.java
@@ -0,0 +1,186 @@
+/*
+ * 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.ignite.ml.math.decompositions;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.functions.Functions;
+
+/**
+ * For an {@code m x n} matrix {@code A} with {@code m >= n}, the QR decomposition
+ * is an {@code m x n} orthogonal matrix {@code Q} and an {@code n x n} upper
+ * triangular matrix {@code R} so that {@code A = Q*R}.
+ */
+public class QRDecomposition extends DecompositionSupport {
+ /** */
+ private final Matrix q;
+ /** */
+ private final Matrix r;
+
+ /** */
+ private final Matrix mType;
+ /** */
+ private final boolean fullRank;
+
+ /** */
+ private final int rows;
+ /** */
+ private final int cols;
+
+ /**
+ * @param v Value to be checked for being an ordinary double.
+ */
+ private void checkDouble(double v) {
+ if (Double.isInfinite(v) || Double.isNaN(v))
+ throw new ArithmeticException("Invalid intermediate result");
+ }
+
+ /**
+ * Constructs a new QR decomposition object computed by Householder reflections.
+ *
+ * @param mtx A rectangular matrix.
+ */
+ public QRDecomposition(Matrix mtx) {
+ assert mtx != null;
+
+ rows = mtx.rowSize();
+
+ int min = Math.min(mtx.rowSize(), mtx.columnSize());
+
+ cols = mtx.columnSize();
+
+ mType = like(mtx, 1, 1);
+
+ Matrix qTmp = copy(mtx);
+
+ boolean fullRank = true;
+
+ r = like(mtx, min, cols);
+
+ for (int i = 0; i < min; i++) {
+ Vector qi = qTmp.viewColumn(i);
+
+ double alpha = qi.kNorm(2);
+
+ if (Math.abs(alpha) > Double.MIN_VALUE)
+ qi.map(Functions.div(alpha));
+ else {
+ checkDouble(alpha);
+
+ fullRank = false;
+ }
+
+ r.set(i, i, alpha);
+
+ for (int j = i + 1; j < cols; j++) {
+ Vector qj = qTmp.viewColumn(j);
+
+ double norm = qj.kNorm(2);
+
+ if (Math.abs(norm) > Double.MIN_VALUE) {
+ double beta = qi.dot(qj);
+
+ r.set(i, j, beta);
+
+ if (j < min)
+ qj.map(qi, Functions.plusMult(-beta));
+ }
+ else
+ checkDouble(norm);
+ }
+ }
+
+ if (cols > min)
+ q = qTmp.viewPart(0, rows, 0, min).copy();
+ else
+ q = qTmp;
+
+ this.fullRank = fullRank;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void destroy() {
+ q.destroy();
+ r.destroy();
+ mType.destroy();
+ }
+
+ /**
+ * Gets orthogonal factor {@code Q}.
+ */
+ public Matrix getQ() {
+ return q;
+ }
+
+ /**
+ * Gets triangular factor {@code R}.
+ */
+ public Matrix getR() {
+ return r;
+ }
+
+ /**
+ * Returns whether the matrix {@code A} has full rank.
+ *
+ * @return true if {@code R}, and hence {@code A} , has full rank.
+ */
+ public boolean hasFullRank() {
+ return fullRank;
+ }
+
+ /**
+ * Least squares solution of {@code A*X = B}; {@code returns X}.
+ *
+ * @param mtx A matrix with as many rows as {@code A} and any number of cols.
+ * @return {@code X<} that minimizes the two norm of {@code Q*R*X - B}.
+ * @throws IllegalArgumentException if {@code B.rows() != A.rows()}.
+ */
+ public Matrix solve(Matrix mtx) {
+ if (mtx.rowSize() != rows)
+ throw new IllegalArgumentException("Matrix row dimensions must agree.");
+
+ int cols = mtx.columnSize();
+
+ Matrix x = like(mType, this.cols, cols);
+
+ Matrix qt = getQ().transpose();
+ Matrix y = qt.times(mtx);
+
+ Matrix r = getR();
+
+ for (int k = Math.min(this.cols, rows) - 1; k > 0; k--) {
+ // X[k,] = Y[k,] / R[k,k], note that X[k,] starts with 0 so += is same as =
+ x.viewRow(k).map(y.viewRow(k), Functions.plusMult(1 / r.get(k, k)));
+
+ // Y[0:(k-1),] -= R[0:(k-1),k] * X[k,]
+ Vector rCol = r.viewColumn(k).viewPart(0, k);
+
+ for (int c = 0; c < cols; c++)
+ y.viewColumn(c).viewPart(0, k).map(rCol, Functions.plusMult(-x.get(k, c)));
+ }
+
+ return x;
+ }
+
+ /**
+ * Returns a rough string rendition of a QR.
+ */
+ @Override public String toString() {
+ return String.format("QR(%d x %d, fullRank=%s)", rows, cols, hasFullRank());
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/SingularValueDecomposition.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/SingularValueDecomposition.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/SingularValueDecomposition.java
new file mode 100644
index 0000000..1b04e4f
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/SingularValueDecomposition.java
@@ -0,0 +1,620 @@
+/*
+ * 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.ignite.ml.math.decompositions;
+
+import org.apache.ignite.ml.math.Algebra;
+import org.apache.ignite.ml.math.Matrix;
+
+/**
+ * Compute a singular value decomposition (SVD) of {@code (l x k)} matrix {@code m}.
+ * <p>This decomposition can be thought
+ * as an extension of {@link EigenDecomposition} to rectangular matrices. The factorization we get is following:</p>
+ * <p>{@code m = u * s * v^{*}}, where</p>
+ * <ul><li>{@code u} is a real or complex unitary matrix.</li>
+ * <li>{@code s} is a rectangular diagonal matrix with non-negative real numbers on diagonal
+ * (these numbers are singular values of {@code m}).</li>
+ * <li>{@code v} is a real or complex unitary matrix.</li></ul>
+ * <p>If {@code m} is real then {@code u} and {@code v} are also real.</p>
+ * <p>See also: <a href="https://en.wikipedia.org/wiki/Singular_value_decomposition">Wikipedia article on SVD</a>.</p>
+ * <p>Note: complex case is currently not supported.</p>
+ */
+public class SingularValueDecomposition extends DecompositionSupport {
+ // U and V.
+ /** */
+ private final double[][] u;
+ /** */
+ private final double[][] v;
+
+ /** Singular values. */
+ private final double[] s;
+
+ /** Row dimension. */
+ private final int m;
+ /** Column dimension. */
+ private final int n;
+
+ /** */
+ private Matrix arg;
+
+ /** */
+ private boolean transpositionNeeded;
+
+ /**
+ * Singular value decomposition object.
+ *
+ * @param arg A rectangular matrix.
+ */
+ public SingularValueDecomposition(Matrix arg) {
+ assert arg != null;
+
+ this.arg = arg;
+
+ if (arg.rowSize() < arg.columnSize())
+ transpositionNeeded = true;
+
+ double[][] a;
+
+ if (transpositionNeeded) {
+ // Use the transpose matrix.
+ m = arg.columnSize();
+ n = arg.rowSize();
+
+ a = new double[m][n];
+
+ for (int i = 0; i < m; i++)
+ for (int j = 0; j < n; j++)
+ a[i][j] = arg.get(j, i);
+ }
+ else {
+ m = arg.rowSize();
+ n = arg.columnSize();
+
+ a = new double[m][n];
+
+ for (int i = 0; i < m; i++)
+ for (int j = 0; j < n; j++)
+ a[i][j] = arg.get(i, j);
+ }
+
+ int nu = Math.min(m, n);
+
+ s = new double[Math.min(m + 1, n)];
+ u = new double[m][nu];
+ v = new double[n][n];
+
+ double[] e = new double[n];
+ double[] work = new double[m];
+
+ int nct = Math.min(m - 1, n);
+ int nrt = Math.max(0, Math.min(n - 2, m));
+
+ for (int k = 0; k < Math.max(nct, nrt); k++) {
+ if (k < nct) {
+ // Compute the transformation for the k-th column and
+ // place the k-th diagonal in s[k]. Compute 2-norm of k-th
+ // column without under/overflow.
+ s[k] = 0;
+
+ for (int i = k; i < m; i++)
+ s[k] = Algebra.hypot(s[k], a[i][k]);
+
+ if (s[k] != 0.0) {
+ if (a[k][k] < 0.0)
+ s[k] = -s[k];
+
+ for (int i = k; i < m; i++)
+ a[i][k] /= s[k];
+
+ a[k][k] += 1.0;
+ }
+
+ s[k] = -s[k];
+ }
+
+ for (int j = k + 1; j < n; j++) {
+ if (k < nct && s[k] != 0.0) {
+ // Apply the transformation.
+ double t = 0;
+
+ for (int i = k; i < m; i++)
+ t += a[i][k] * a[i][j];
+
+ t = -t / a[k][k];
+
+ for (int i = k; i < m; i++)
+ a[i][j] += t * a[i][k];
+ }
+
+ // Place the k-th row of A into e for the
+ // subsequent calculation of the row transformation.
+ e[j] = a[k][j];
+ }
+
+ if (k < nct)
+ // Place the transformation in U for subsequent back
+ // multiplication.
+ for (int i = k; i < m; i++)
+ u[i][k] = a[i][k];
+
+ if (k < nrt) {
+ // Compute the k-th row transformation and place the
+ // k-th super-diagonal in e[k].
+ // Compute 2-norm without under/overflow.
+ e[k] = 0;
+
+ for (int i = k + 1; i < n; i++)
+ e[k] = Algebra.hypot(e[k], e[i]);
+
+ if (e[k] != 0.0) {
+ if (e[k + 1] < 0.0)
+ e[k] = -e[k];
+
+ for (int i = k + 1; i < n; i++)
+ e[i] /= e[k];
+
+ e[k + 1] += 1.0;
+ }
+
+ e[k] = -e[k];
+
+ if (k + 1 < m && e[k] != 0.0) {
+ // Apply the transformation.
+ for (int i = k + 1; i < m; i++)
+ work[i] = 0.0;
+
+ for (int j = k + 1; j < n; j++)
+ for (int i = k + 1; i < m; i++)
+ work[i] += e[j] * a[i][j];
+
+ for (int j = k + 1; j < n; j++) {
+ double t = -e[j] / e[k + 1];
+
+ for (int i = k + 1; i < m; i++)
+ a[i][j] += t * work[i];
+ }
+ }
+
+ // Place the transformation in V for subsequent
+ // back multiplication.
+ for (int i = k + 1; i < n; i++)
+ v[i][k] = e[i];
+ }
+ }
+
+ // Set up the final bi-diagonal matrix or order p.
+ int p = Math.min(n, m + 1);
+
+ if (nct < n)
+ s[nct] = a[nct][nct];
+
+ if (m < p)
+ s[p - 1] = 0.0;
+
+ if (nrt + 1 < p)
+ e[nrt] = a[nrt][p - 1];
+
+ e[p - 1] = 0.0;
+
+ // Generate U.
+ for (int j = nct; j < nu; j++) {
+ for (int i = 0; i < m; i++)
+ u[i][j] = 0.0;
+
+ u[j][j] = 1.0;
+ }
+
+ for (int k = nct - 1; k >= 0; k--) {
+ if (s[k] != 0.0) {
+ for (int j = k + 1; j < nu; j++) {
+ double t = 0;
+
+ for (int i = k; i < m; i++)
+ t += u[i][k] * u[i][j];
+
+ t = -t / u[k][k];
+
+ for (int i = k; i < m; i++)
+ u[i][j] += t * u[i][k];
+ }
+
+ for (int i = k; i < m; i++)
+ u[i][k] = -u[i][k];
+
+ u[k][k] = 1.0 + u[k][k];
+
+ for (int i = 0; i < k - 1; i++)
+ u[i][k] = 0.0;
+ }
+ else {
+ for (int i = 0; i < m; i++)
+ u[i][k] = 0.0;
+
+ u[k][k] = 1.0;
+ }
+ }
+
+ // Generate V.
+ for (int k = n - 1; k >= 0; k--) {
+ if (k < nrt && e[k] != 0.0) {
+ for (int j = k + 1; j < nu; j++) {
+ double t = 0;
+
+ for (int i = k + 1; i < n; i++)
+ t += v[i][k] * v[i][j];
+
+ t = -t / v[k + 1][k];
+
+ for (int i = k + 1; i < n; i++)
+ v[i][j] += t * v[i][k];
+ }
+ }
+
+ for (int i = 0; i < n; i++)
+ v[i][k] = 0.0;
+
+ v[k][k] = 1.0;
+ }
+
+ // Main iteration loop for the singular values.
+ int pp = p - 1;
+ int iter = 0;
+
+ double eps = Math.pow(2.0, -52.0);
+ double tiny = Math.pow(2.0, -966.0);
+
+ while (p > 0) {
+ int k;
+
+ for (k = p - 2; k >= -1; k--) {
+ if (k == -1)
+ break;
+
+ if (Math.abs(e[k]) <= tiny + eps * (Math.abs(s[k]) + Math.abs(s[k + 1]))) {
+ e[k] = 0.0;
+
+ break;
+ }
+ }
+
+ int kase;
+
+ if (k == p - 2)
+ kase = 4;
+ else {
+ int ks;
+
+ for (ks = p - 1; ks >= k; ks--) {
+ if (ks == k)
+ break;
+
+ double t =
+ (ks != p ? Math.abs(e[ks]) : 0.) +
+ (ks != k + 1 ? Math.abs(e[ks - 1]) : 0.);
+
+ if (Math.abs(s[ks]) <= tiny + eps * t) {
+ s[ks] = 0.0;
+
+ break;
+ }
+ }
+
+ if (ks == k)
+ kase = 3;
+ else if (ks == p - 1)
+ kase = 1;
+ else {
+ kase = 2;
+
+ k = ks;
+ }
+ }
+
+ k++;
+
+ // Perform the task indicated by kase.
+ switch (kase) {
+ // Deflate negligible s(p).
+ case 1: {
+ double f = e[p - 2];
+
+ e[p - 2] = 0.0;
+
+ for (int j = p - 2; j >= k; j--) {
+ double t = Algebra.hypot(s[j], f);
+ double cs = s[j] / t;
+ double sn = f / t;
+
+ s[j] = t;
+
+ if (j != k) {
+ f = -sn * e[j - 1];
+ e[j - 1] = cs * e[j - 1];
+ }
+
+ for (int i = 0; i < n; i++) {
+ t = cs * v[i][j] + sn * v[i][p - 1];
+
+ v[i][p - 1] = -sn * v[i][j] + cs * v[i][p - 1];
+ v[i][j] = t;
+ }
+ }
+ }
+
+ break;
+
+ // Split at negligible s(k).
+ case 2: {
+ double f = e[k - 1];
+ e[k - 1] = 0.0;
+
+ for (int j = k; j < p; j++) {
+ double t = Algebra.hypot(s[j], f);
+ double cs = s[j] / t;
+ double sn = f / t;
+
+ s[j] = t;
+ f = -sn * e[j];
+ e[j] = cs * e[j];
+
+ for (int i = 0; i < m; i++) {
+ t = cs * u[i][j] + sn * u[i][k - 1];
+
+ u[i][k - 1] = -sn * u[i][j] + cs * u[i][k - 1];
+ u[i][j] = t;
+ }
+ }
+ }
+
+ break;
+
+ // Perform one qr step.
+ case 3: {
+ // Calculate the shift.
+ double scale = Math.max(Math.max(Math.max(Math.max(
+ Math.abs(s[p - 1]), Math.abs(s[p - 2])), Math.abs(e[p - 2])),
+ Math.abs(s[k])), Math.abs(e[k]));
+
+ double sp = s[p - 1] / scale;
+ double spm1 = s[p - 2] / scale;
+ double epm1 = e[p - 2] / scale;
+ double sk = s[k] / scale;
+ double ek = e[k] / scale;
+ double b = ((spm1 + sp) * (spm1 - sp) + epm1 * epm1) / 2.0;
+ double c = sp * epm1 * sp * epm1;
+ double shift = 0.0;
+
+ if (b != 0.0 || c != 0.0) {
+ shift = Math.sqrt(b * b + c);
+
+ if (b < 0.0)
+ shift = -shift;
+
+ shift = c / (b + shift);
+ }
+
+ double f = (sk + sp) * (sk - sp) + shift;
+ double g = sk * ek;
+
+ // Chase zeros.
+ for (int j = k; j < p - 1; j++) {
+ double t = Algebra.hypot(f, g);
+ double cs = f / t;
+ double sn = g / t;
+
+ if (j != k)
+ e[j - 1] = t;
+
+ f = cs * s[j] + sn * e[j];
+ e[j] = cs * e[j] - sn * s[j];
+ g = sn * s[j + 1];
+ s[j + 1] = cs * s[j + 1];
+
+ for (int i = 0; i < n; i++) {
+ t = cs * v[i][j] + sn * v[i][j + 1];
+
+ v[i][j + 1] = -sn * v[i][j] + cs * v[i][j + 1];
+ v[i][j] = t;
+ }
+
+ t = Algebra.hypot(f, g);
+ cs = f / t;
+ sn = g / t;
+ s[j] = t;
+ f = cs * e[j] + sn * s[j + 1];
+ s[j + 1] = -sn * e[j] + cs * s[j + 1];
+ g = sn * e[j + 1];
+ e[j + 1] = cs * e[j + 1];
+
+ if (j < m - 1)
+ for (int i = 0; i < m; i++) {
+ t = cs * u[i][j] + sn * u[i][j + 1];
+
+ u[i][j + 1] = -sn * u[i][j] + cs * u[i][j + 1];
+ u[i][j] = t;
+ }
+ }
+
+ e[p - 2] = f;
+ iter = iter + 1;
+ }
+
+ break;
+
+ // Convergence.
+ case 4: {
+ // Make the singular values positive.
+ if (s[k] <= 0.0) {
+ s[k] = s[k] < 0.0 ? -s[k] : 0.0;
+
+ for (int i = 0; i <= pp; i++)
+ v[i][k] = -v[i][k];
+ }
+
+ // Order the singular values.
+ while (k < pp) {
+ if (s[k] >= s[k + 1])
+ break;
+
+ double t = s[k];
+
+ s[k] = s[k + 1];
+ s[k + 1] = t;
+
+ if (k < n - 1)
+ for (int i = 0; i < n; i++) {
+ t = v[i][k + 1];
+
+ v[i][k + 1] = v[i][k];
+ v[i][k] = t;
+ }
+
+ if (k < m - 1)
+ for (int i = 0; i < m; i++) {
+ t = u[i][k + 1];
+
+ u[i][k + 1] = u[i][k];
+ u[i][k] = t;
+ }
+
+ k++;
+ }
+
+ iter = 0;
+ p--;
+ }
+
+ break;
+
+ default:
+ throw new IllegalStateException();
+ }
+ }
+ }
+
+ /**
+ * Gets the two norm condition number, which is {@code max(S) / min(S)} .
+ */
+ public double cond() {
+ return s[0] / s[Math.min(m, n) - 1];
+ }
+
+ /**
+ * @return the diagonal matrix of singular values.
+ */
+ public Matrix getS() {
+ double[][] s = new double[n][n];
+
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < n; j++)
+ s[i][j] = 0.0;
+
+ s[i][i] = this.s[i];
+ }
+
+ return like(arg, n, n).assign(s);
+ }
+
+ /**
+ * Gets the diagonal of {@code S}, which is a one-dimensional array of
+ * singular values.
+ *
+ * @return diagonal of {@code S}.
+ */
+ public double[] getSingularValues() {
+ return s;
+ }
+
+ /**
+ * Gets the left singular vectors {@code U}.
+ *
+ * @return {@code U}
+ */
+ public Matrix getU() {
+ if (transpositionNeeded)
+ return like(arg, v.length, v.length).assign(v);
+ else {
+ int numCols = Math.min(m + 1, n);
+
+ Matrix r = like(arg, m, numCols);
+
+ for (int i = 0; i < m; i++)
+ for (int j = 0; j < numCols; j++)
+ r.set(i, j, u[i][j]);
+
+ return r;
+ }
+ }
+
+ /**
+ * Gets the right singular vectors {@code V}.
+ *
+ * @return {@code V}
+ */
+ public Matrix getV() {
+ if (transpositionNeeded) {
+ int numCols = Math.min(m + 1, n);
+
+ Matrix r = like(arg, m, numCols);
+
+ for (int i = 0; i < m; i++)
+ for (int j = 0; j < numCols; j++)
+ r.set(i, j, u[i][j]);
+
+ return r;
+ }
+ else
+ return like(arg, v.length, v.length).assign(v);
+ }
+
+ /**
+ * Gets the two norm, which is {@code max(S)}.
+ */
+ public double norm2() {
+ return s[0];
+ }
+
+ /**
+ * Gets effective numerical matrix rank.
+ */
+ public int rank() {
+ double eps = Math.pow(2.0, -52.0);
+ double tol = Math.max(m, n) * s[0] * eps;
+ int r = 0;
+
+ for (double value : s)
+ if (value > tol)
+ r++;
+
+ return r;
+ }
+
+ /**
+ * Gets [n × n] covariance matrix.
+ *
+ * @param minSingularVal Value below which singular values are ignored.
+ */
+ Matrix getCovariance(double minSingularVal) {
+ Matrix j = like(arg, s.length, s.length);
+ Matrix vMat = like(arg, v.length, v.length).assign(v);
+
+ for (int i = 0; i < s.length; i++)
+ j.set(i, i, s[i] >= minSingularVal ? 1 / (s[i] * s[i]) : 0.0);
+
+ return vMat.times(j).times(vMat.transpose());
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/package-info.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/package-info.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/package-info.java
new file mode 100644
index 0000000..d317ccd
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * 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 description. -->
+ * Contains matrix decompositions for distributed code algebra.
+ */
+package org.apache.ignite.ml.math.decompositions;
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/CardinalityException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/CardinalityException.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/CardinalityException.java
new file mode 100644
index 0000000..f03e5d8
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/CardinalityException.java
@@ -0,0 +1,38 @@
+/*
+ * 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.ignite.ml.math.exceptions;
+
+import org.apache.ignite.IgniteException;
+
+/**
+ * Indicates a cardinality mismatch in matrix or vector operations.
+ */
+public class CardinalityException extends IgniteException {
+ /** */
+ private static final long serialVersionUID = 0L;
+
+ /**
+ * Creates new cardinality violation exception.
+ *
+ * @param exp Expected cardinality.
+ * @param act Actual cardinality.
+ */
+ public CardinalityException(int exp, int act) {
+ super("Cardinality violation [expected=" + exp + ", actual=" + act + "]");
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/ColumnIndexException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/ColumnIndexException.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/ColumnIndexException.java
new file mode 100644
index 0000000..08a67b5
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/ColumnIndexException.java
@@ -0,0 +1,35 @@
+/*
+ * 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.ignite.ml.math.exceptions;
+
+import org.apache.ignite.IgniteException;
+
+/**
+ * This exception is used to indicate any error condition accessing matrix elements by invalid column index.
+ */
+public class ColumnIndexException extends IgniteException {
+ /** */
+ private static final long serialVersionUID = 0L;
+
+ /**
+ * @param idx Index value that caused this exception.
+ */
+ public ColumnIndexException(int idx) {
+ super("Invalid (out of bound) column index: " + idx);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/IndexException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/IndexException.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/IndexException.java
new file mode 100644
index 0000000..93ca11e
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/IndexException.java
@@ -0,0 +1,35 @@
+/*
+ * 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.ignite.ml.math.exceptions;
+
+import org.apache.ignite.IgniteException;
+
+/**
+ * Indicates an invalid, i.e. out of bound, index on matrix or vector operations.
+ */
+public class IndexException extends IgniteException {
+ /** */
+ private static final long serialVersionUID = 0L;
+
+ /**
+ * @param idx Index value that caused this exception.
+ */
+ public IndexException(int idx) {
+ super("Invalid (out of bound) index: " + idx);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/NonPositiveDefiniteMatrixException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/NonPositiveDefiniteMatrixException.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/NonPositiveDefiniteMatrixException.java
new file mode 100644
index 0000000..b0cf294
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/NonPositiveDefiniteMatrixException.java
@@ -0,0 +1,37 @@
+/*
+ * 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.ignite.ml.math.exceptions;
+
+import org.apache.ignite.IgniteException;
+
+/**
+ * This exception is used to indicate error condition of matrix elements failing the positivity check.
+ */
+public class NonPositiveDefiniteMatrixException extends IgniteException {
+ /**
+ * Construct an exception.
+ *
+ * @param wrong Value that fails the positivity check.
+ * @param idx Row (and column) index.
+ * @param threshold Absolute positivity threshold.
+ */
+ public NonPositiveDefiniteMatrixException(double wrong, int idx, double threshold) {
+ super("Matrix must be positive, wrong element located on diagonal with index "
+ + idx + " and has value " + wrong + " with this threshold " + threshold);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/NonSymmetricMatrixException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/NonSymmetricMatrixException.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/NonSymmetricMatrixException.java
new file mode 100644
index 0000000..7c563fe
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/NonSymmetricMatrixException.java
@@ -0,0 +1,35 @@
+/*
+ * 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.ignite.ml.math.exceptions;
+
+import org.apache.ignite.IgniteException;
+
+/**
+ * This exception is used to indicate error condition of matrix failing the symmetry check.
+ */
+public class NonSymmetricMatrixException extends IgniteException {
+ /**
+ * @param row Row.
+ * @param col Column.
+ * @param threshold Threshold.
+ */
+ public NonSymmetricMatrixException(int row, int col, double threshold) {
+ super("Symmetric matrix expected, the symmetry is broken on row "
+ + row + " and col " + col + " with this threshold " + threshold);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/RowIndexException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/RowIndexException.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/RowIndexException.java
new file mode 100644
index 0000000..ebbbca3
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/RowIndexException.java
@@ -0,0 +1,35 @@
+/*
+ * 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.ignite.ml.math.exceptions;
+
+import org.apache.ignite.IgniteException;
+
+/**
+ * This exception is used to indicate any error condition accessing matrix elements by invalid row index.
+ */
+public class RowIndexException extends IgniteException {
+ /** */
+ private static final long serialVersionUID = 0L;
+
+ /**
+ * @param idx Index value that caused this exception.
+ */
+ public RowIndexException(int idx) {
+ super("Invalid (out of bound) row index: " + idx);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/SingularMatrixException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/SingularMatrixException.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/SingularMatrixException.java
new file mode 100644
index 0000000..789b686
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/SingularMatrixException.java
@@ -0,0 +1,30 @@
+/*
+ * 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.ignite.ml.math.exceptions;
+
+import org.apache.ignite.IgniteException;
+
+/**
+ * Exception to be thrown when a non-singular matrix is expected.
+ */
+public class SingularMatrixException extends IgniteException {
+ /** */
+ public SingularMatrixException() {
+ super("Regular (or non-singular) matrix expected.");
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/UnknownProviderException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/UnknownProviderException.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/UnknownProviderException.java
new file mode 100644
index 0000000..940b9aa
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/UnknownProviderException.java
@@ -0,0 +1,35 @@
+/*
+ * 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.ignite.ml.math.exceptions;
+
+import org.apache.ignite.IgniteException;
+
+/**
+ * Indicates that no provider has been found for a given vector or matrix flavor.
+ */
+public class UnknownProviderException extends IgniteException {
+ /** */
+ private static final long serialVersionUID = 0L;
+
+ /**
+ * @param flv Flavor (a.k.a. operation performance hints) that has no registered provider for.
+ */
+ public UnknownProviderException(String flv) {
+ super("No provider has been found for the flavor: " + flv);
+ }
+}
[43/67] [abbrv] ignite git commit: Merge branch 'ignite-2.0'
Posted by sb...@apache.org.
Merge branch 'ignite-2.0'
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/e7826aa8
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/e7826aa8
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/e7826aa8
Branch: refs/heads/ignite-5075
Commit: e7826aa89a5bbcf2023a7fed300fb62b31c07df2
Parents: 56ec995 a04aa10
Author: devozerov <vo...@gridgain.com>
Authored: Tue May 2 16:51:51 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Tue May 2 16:51:51 2017 +0300
----------------------------------------------------------------------
examples/rest/http-rest-example.php | 4 ++--
modules/hibernate-core/pom.xml | 8 ++++++++
pom.xml | 2 +-
3 files changed, 11 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/e7826aa8/modules/hibernate-core/pom.xml
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/e7826aa8/pom.xml
----------------------------------------------------------------------
[32/67] [abbrv] ignite git commit: IGNITE-4052 Add ability to set up
users for MESOS.
Posted by sb...@apache.org.
IGNITE-4052 Add ability to set up users for MESOS.
Signed-off-by: nikolay_tikhonov <nt...@gridgain.com>
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/7db2d63e
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/7db2d63e
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/7db2d63e
Branch: refs/heads/ignite-5075
Commit: 7db2d63efc4e4e8100dd7c7d9ff4be5503b689a2
Parents: 402154c
Author: vadopolski <vo...@gmail.com>
Authored: Thu Apr 27 19:21:01 2017 +0300
Committer: nikolay_tikhonov <nt...@gridgain.com>
Committed: Thu Apr 27 19:21:01 2017 +0300
----------------------------------------------------------------------
.../apache/ignite/mesos/IgniteFramework.java | 111 ++++++++++++++-----
.../ignite/mesos/IgniteSchedulerSelfTest.java | 39 ++++++-
2 files changed, 123 insertions(+), 27 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/7db2d63e/modules/mesos/src/main/java/org/apache/ignite/mesos/IgniteFramework.java
----------------------------------------------------------------------
diff --git a/modules/mesos/src/main/java/org/apache/ignite/mesos/IgniteFramework.java b/modules/mesos/src/main/java/org/apache/ignite/mesos/IgniteFramework.java
index 6054302..451d870 100644
--- a/modules/mesos/src/main/java/org/apache/ignite/mesos/IgniteFramework.java
+++ b/modules/mesos/src/main/java/org/apache/ignite/mesos/IgniteFramework.java
@@ -38,6 +38,24 @@ public class IgniteFramework {
/** Framework name. */
private static final String IGNITE_FRAMEWORK_NAME = "Ignite";
+ /** MESOS system environment name */
+ private static final String MESOS_USER_NAME = "MESOS_USER";
+
+ /** MESOS system environment role */
+ private static final String MESOS_ROLE = "MESOS_ROLE";
+
+ /** */
+ private static final String MESOS_AUTHENTICATE = "MESOS_AUTHENTICATE";
+
+ /** */
+ private static final String DEFAULT_PRINCIPAL = "DEFAULT_PRINCIPAL";
+
+ /** */
+ private static final String DEFAULT_SECRET = "DEFAULT_SECRET";
+
+ /** */
+ private static final String MESOS_CHECKPOINT = "MESOS_CHECKPOINT";
+
/**
* Main methods has only one optional parameter - path to properties files.
*
@@ -45,19 +63,7 @@ public class IgniteFramework {
* @throws Exception If failed.
*/
public static void main(String[] args) throws Exception {
- final int frameworkFailoverTimeout = 0;
-
- // Have Mesos fill in the current user.
- Protos.FrameworkInfo.Builder frameworkBuilder = Protos.FrameworkInfo.newBuilder()
- .setName(IGNITE_FRAMEWORK_NAME)
- .setUser("")
- .setFailoverTimeout(frameworkFailoverTimeout);
-
- if (System.getenv("MESOS_CHECKPOINT") != null) {
- log.info("Enabling checkpoint for the framework");
-
- frameworkBuilder.setCheckpoint(true);
- }
+ IgniteFramework igniteFramework = new IgniteFramework();
ClusterProperties clusterProps = ClusterProperties.from(args.length >= 1 ? args[0] : null);
@@ -82,36 +88,31 @@ public class IgniteFramework {
// Create the driver.
MesosSchedulerDriver driver;
- if (System.getenv("MESOS_AUTHENTICATE") != null) {
+ if (System.getenv(MESOS_AUTHENTICATE) != null) {
log.info("Enabling authentication for the framework");
- if (System.getenv("DEFAULT_PRINCIPAL") == null) {
+ if (System.getenv(DEFAULT_PRINCIPAL) == null) {
log.log(Level.SEVERE, "Expecting authentication principal in the environment");
System.exit(1);
}
- if (System.getenv("DEFAULT_SECRET") == null) {
+ if (System.getenv(DEFAULT_SECRET) == null) {
log.log(Level.SEVERE, "Expecting authentication secret in the environment");
System.exit(1);
}
Protos.Credential cred = Protos.Credential.newBuilder()
- .setPrincipal(System.getenv("DEFAULT_PRINCIPAL"))
- .setSecret(ByteString.copyFrom(System.getenv("DEFAULT_SECRET").getBytes()))
+ .setPrincipal(System.getenv(DEFAULT_PRINCIPAL))
+ .setSecret(ByteString.copyFrom(System.getenv(DEFAULT_SECRET).getBytes()))
.build();
- frameworkBuilder.setPrincipal(System.getenv("DEFAULT_PRINCIPAL"));
-
- driver = new MesosSchedulerDriver(scheduler, frameworkBuilder.build(), clusterProps.masterUrl(),
+ driver = new MesosSchedulerDriver(scheduler, igniteFramework.getFrameworkInfo(), clusterProps.masterUrl(),
cred);
}
- else {
- frameworkBuilder.setPrincipal("ignite-framework-java");
-
- driver = new MesosSchedulerDriver(scheduler, frameworkBuilder.build(), clusterProps.masterUrl());
- }
+ else
+ driver = new MesosSchedulerDriver(scheduler, igniteFramework.getFrameworkInfo(), clusterProps.masterUrl());
int status = driver.run() == Protos.Status.DRIVER_STOPPED ? 0 : 1;
@@ -122,4 +123,62 @@ public class IgniteFramework {
System.exit(status);
}
+
+ /**
+ * @return Mesos Protos FrameworkInfo.
+ */
+ public Protos.FrameworkInfo getFrameworkInfo() throws Exception {
+ final int frameworkFailoverTimeout = 0;
+
+ Protos.FrameworkInfo.Builder frameworkBuilder = Protos.FrameworkInfo.newBuilder()
+ .setName(IGNITE_FRAMEWORK_NAME)
+ .setUser(getUser())
+ .setRole(getRole())
+ .setFailoverTimeout(frameworkFailoverTimeout);
+
+ if (System.getenv(MESOS_CHECKPOINT) != null) {
+ log.info("Enabling checkpoint for the framework");
+
+ frameworkBuilder.setCheckpoint(true);
+ }
+
+ if (System.getenv(MESOS_AUTHENTICATE) != null)
+ frameworkBuilder.setPrincipal(System.getenv(DEFAULT_PRINCIPAL));
+ else
+ frameworkBuilder.setPrincipal("ignite-framework-java");
+
+ return frameworkBuilder.build();
+ }
+
+ /**
+ * @return Mesos user name value.
+ */
+ protected String getUser() {
+ String userName = System.getenv(MESOS_USER_NAME);
+
+ return userName != null ? userName : "";
+ }
+
+ /**
+ * @return Mesos role value.
+ */
+ protected String getRole() {
+ String mesosRole = System.getenv(MESOS_ROLE);
+
+ return isRoleValid(mesosRole) ? mesosRole : "*";
+ }
+
+ /**
+ * @return Result of Mesos role validation.
+ */
+ static boolean isRoleValid(String mRole) {
+ if (mRole == null || mRole.isEmpty() || mRole.equals(".") || mRole.equals("..") ||
+ mRole.startsWith("-") || mRole.contains("/") || mRole.contains("\\") || mRole.contains(" ")) {
+ log.severe("Provided mesos role is not valid:" + mRole +
+ ". Mesos role should be a valid directory name.");
+
+ return false;
+ }
+ return true;
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/7db2d63e/modules/mesos/src/test/java/org/apache/ignite/mesos/IgniteSchedulerSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/mesos/src/test/java/org/apache/ignite/mesos/IgniteSchedulerSelfTest.java b/modules/mesos/src/test/java/org/apache/ignite/mesos/IgniteSchedulerSelfTest.java
index d4e7ecb..099daa2 100644
--- a/modules/mesos/src/test/java/org/apache/ignite/mesos/IgniteSchedulerSelfTest.java
+++ b/modules/mesos/src/test/java/org/apache/ignite/mesos/IgniteSchedulerSelfTest.java
@@ -17,6 +17,7 @@
package org.apache.ignite.mesos;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -111,7 +112,6 @@ public class IgniteSchedulerSelfTest extends TestCase {
assertEquals(offer.getId(), declinedOffer);
}
-
/**
* @throws Exception If failed.
*/
@@ -302,6 +302,43 @@ public class IgniteSchedulerSelfTest extends TestCase {
}
/**
+ * @throws Exception If failed.
+ */
+ public void testIgniteFramework() throws Exception {
+ final String mesosUserValue = "userAAAAA";
+ final String mesosRoleValue = "role1";
+
+ IgniteFramework igniteFramework = new IgniteFramework() {
+ @Override protected String getUser() {
+ return mesosUserValue;
+ }
+
+ @Override protected String getRole() {
+ return mesosRoleValue;
+ }
+ };
+
+ Protos.FrameworkInfo info = igniteFramework.getFrameworkInfo();
+
+ String actualUserValue = info.getUser();
+ String actualRoleValue = info.getRole();
+
+ assertEquals(actualUserValue, mesosUserValue);
+ assertEquals(actualRoleValue, mesosRoleValue);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testMesosRoleValidation() throws Exception {
+ List<String> failedRoleValues = Arrays.asList("", ".", "..", "-testRole",
+ "test/Role", "test\\Role", "test Role", null);
+
+ for (String failedRoleValue : failedRoleValues)
+ assertFalse(IgniteFramework.isRoleValid(failedRoleValue));
+ }
+
+ /**
* @param resourceType Resource type.
* @return Value.
*/
[47/67] [abbrv] ignite git commit: Merge remote-tracking branch
'origin/master'
Posted by sb...@apache.org.
Merge remote-tracking branch 'origin/master'
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/1a339481
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/1a339481
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/1a339481
Branch: refs/heads/ignite-5075
Commit: 1a339481b6a7e04051e011bfacec9eb143d143b2
Parents: 4c1dab4 843b3f7
Author: devozerov <vo...@gridgain.com>
Authored: Wed May 3 11:24:22 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Wed May 3 11:24:22 2017 +0300
----------------------------------------------------------------------
.../app/helpers/jade/form/form-field-text.pug | 55 +++-----------------
.../frontend/app/helpers/jade/mixins.pug | 14 +++--
2 files changed, 18 insertions(+), 51 deletions(-)
----------------------------------------------------------------------
[60/67] [abbrv] ignite git commit: IGNITE-5147 Fixed generation of
project structure view.
Posted by sb...@apache.org.
IGNITE-5147 Fixed generation of project structure view.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/8be68138
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/8be68138
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/8be68138
Branch: refs/heads/ignite-5075
Commit: 8be68138c7911f2001eddd3c16cc968601e90777
Parents: 934f6ac
Author: Vasiliy Sisko <vs...@gridgain.com>
Authored: Thu May 4 09:53:54 2017 +0700
Committer: Andrey Novikov <an...@gridgain.com>
Committed: Thu May 4 09:53:54 2017 +0700
----------------------------------------------------------------------
.../app/modules/states/configuration/summary/summary.controller.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/8be68138/modules/web-console/frontend/app/modules/states/configuration/summary/summary.controller.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/summary/summary.controller.js b/modules/web-console/frontend/app/modules/states/configuration/summary/summary.controller.js
index 0089528..71b5a82 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/summary/summary.controller.js
+++ b/modules/web-console/frontend/app/modules/states/configuration/summary/summary.controller.js
@@ -276,7 +276,7 @@ export default [
}
_.forEach(cache.domains, (domain) => {
- if (!_.isEmpty(domain.keyFields)) {
+ if (domain.generatePojo && _.nonEmpty(domain.keyFields)) {
if (JavaTypes.nonBuiltInClass(domain.keyType))
addClass(domain.keyType);
[10/67] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math
module to Ignite ML module added missed licenses renamed packages fixed wrong
ml profile activation (cherry picked from commit d78e071)
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/decompositions/SingularValueDecompositionTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/decompositions/SingularValueDecompositionTest.java b/modules/ml/src/test/java/org/apache/ignite/math/decompositions/SingularValueDecompositionTest.java
deleted file mode 100644
index d0b89f8..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/decompositions/SingularValueDecompositionTest.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * 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.ignite.math.decompositions;
-
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.impls.matrix.DenseLocalOnHeapMatrix;
-import org.apache.ignite.math.impls.matrix.PivotedMatrixView;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-/** */
-public class SingularValueDecompositionTest {
- /** */
- @Test
- public void basicTest() {
- basicTest(new DenseLocalOnHeapMatrix(new double[][] {
- {2.0d, -1.0d, 0.0d},
- {-1.0d, 2.0d, -1.0d},
- {0.0d, -1.0d, 2.0d}
- }));
- }
-
- /**
- * Test for {@link DecompositionSupport} features.
- */
- @Test
- public void decompositionSupportTest() {
- basicTest(new PivotedMatrixView(new DenseLocalOnHeapMatrix(new double[][] {
- {2.0d, -1.0d, 0.0d},
- {-1.0d, 2.0d, -1.0d},
- {0.0d, -1.0d, 2.0d}
- })));
- }
-
- /** */
- @Test
- public void rowsLessThanColumnsTest() {
- DenseLocalOnHeapMatrix m = new DenseLocalOnHeapMatrix(new double[][] {
- {2.0d, -1.0d, 0.0d},
- {-1.0d, 2.0d, -1.0d}
- });
-
- SingularValueDecomposition dec = new SingularValueDecomposition(m);
- assertEquals("Unexpected value for singular values size.",
- 2, dec.getSingularValues().length);
-
- Matrix s = dec.getS();
- Matrix u = dec.getU();
- Matrix v = dec.getV();
- Matrix covariance = dec.getCovariance(0.5);
-
- assertNotNull("Matrix s is expected to be not null.", s);
- assertNotNull("Matrix u is expected to be not null.", u);
- assertNotNull("Matrix v is expected to be not null.", v);
- assertNotNull("Covariance matrix is expected to be not null.", covariance);
-
- dec.destroy();
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void nullMatrixTest() {
- new SingularValueDecomposition(null);
- }
-
- /** */
- private void basicTest(Matrix m) {
- SingularValueDecomposition dec = new SingularValueDecomposition(m);
- assertEquals("Unexpected value for singular values size.",
- 3, dec.getSingularValues().length);
-
- Matrix s = dec.getS();
- Matrix u = dec.getU();
- Matrix v = dec.getV();
- Matrix covariance = dec.getCovariance(0.5);
-
- assertNotNull("Matrix s is expected to be not null.", s);
- assertNotNull("Matrix u is expected to be not null.", u);
- assertNotNull("Matrix v is expected to be not null.", v);
- assertNotNull("Covariance matrix is expected to be not null.", covariance);
-
- assertTrue("Decomposition cond is expected to be positive.", dec.cond() > 0);
- assertTrue("Decomposition norm2 is expected to be positive.", dec.norm2() > 0);
- assertEquals("Decomposition rank differs from expected.", 3, dec.rank());
- assertEquals("Decomposition singular values size differs from expected.",
- 3, dec.getSingularValues().length);
-
- Matrix recomposed = (u.times(s).times(v.transpose()));
-
- for (int row = 0; row < m.rowSize(); row++)
- for (int col = 0; col < m.columnSize(); col++)
- assertEquals("Unexpected recomposed matrix value at (" + row + "," + col + ").",
- m.get(row, col), recomposed.get(row, col), 0.001);
-
- for (int row = 0; row < covariance.rowSize(); row++)
- for (int col = row + 1; col < covariance.columnSize(); col++)
- assertEquals("Unexpected covariance matrix value at (" + row + "," + col + ").",
- covariance.get(row, col), covariance.get(col, row), 0.001);
-
- dec.destroy();
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/MathTestConstants.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/MathTestConstants.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/MathTestConstants.java
deleted file mode 100644
index 122c62e..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/MathTestConstants.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * 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.ignite.math.impls;
-
-/**
- * Collect constants for org.apache.ignite.math tests
- */
-public interface MathTestConstants {
- /** */
- public double SECOND_ARG = 1d;
-
- /**
- * We assume that we will check calculation precision in other tests.
- */
- public double EXP_DELTA = 0.1d;
-
- /** */
- public String UNEXPECTED_VAL = "Unexpected value.";
-
- /** */
- public String NULL_GUID = "Null GUID.";
-
- /** */
- public String UNEXPECTED_GUID_VAL = "Unexpected GUID value.";
-
- /** */
- public String EMPTY_GUID = "Empty GUID.";
-
- /** */
- public String VALUES_SHOULD_BE_NOT_EQUALS = "Values should be not equals.";
-
- /** */
- public String NULL_VAL = "Null value.";
-
- /** */
- public String NULL_VALUES = "Null values.";
-
- /** */
- public String NOT_NULL_VAL = "Not null value.";
-
- /** */
- public double TEST_VAL = 1d;
-
- /** */
- public String VAL_NOT_EQUALS = "Values not equals.";
-
- /** */
- public String NO_NEXT_ELEMENT = "No next element.";
-
- /** */
- public int STORAGE_SIZE = 100;
-
- /** */
- public String WRONG_ATTRIBUTE_VAL = "Wrong attribute value.";
-
- /** */
- public String NULL_DATA_ELEMENT = "Null data element.";
-
- /** */
- public String WRONG_DATA_ELEMENT = "Wrong data element.";
-
- /** */
- public double NIL_DELTA = 0d;
-
- /** */
- public String NULL_DATA_STORAGE = "Null data storage.";
-
- /** */
- public String WRONG_DATA_SIZE = "Wrong data size.";
-
- /** */
- public String UNEXPECTED_DATA_VAL = "Unexpected data value.";
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/CacheMatrixTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/CacheMatrixTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/CacheMatrixTest.java
deleted file mode 100644
index 8a6d077..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/CacheMatrixTest.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/*
- * 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.ignite.math.impls.matrix;
-
-import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.configuration.CacheConfiguration;
-import org.apache.ignite.internal.util.IgniteUtils;
-import org.apache.ignite.math.ExternalizeTest;
-import org.apache.ignite.math.IdentityValueMapper;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.MatrixKeyMapper;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.apache.ignite.math.impls.MathTestConstants;
-import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
-import org.apache.ignite.testframework.junits.common.GridCommonTest;
-
-/**
- * Tests for {@link CacheMatrix}.
- */
-@GridCommonTest(group = "Distributed Models")
-public class CacheMatrixTest extends GridCommonAbstractTest {
- /** Number of nodes in grid */
- private static final int NODE_COUNT = 3;
- /** Cache name. */
- private static final String CACHE_NAME = "test-cache";
- /** */
- private static final String UNEXPECTED_ATTRIBUTE_VALUE = "Unexpected attribute value.";
- /** Grid instance. */
- private Ignite ignite;
- /** Matrix rows */
- private final int rows = MathTestConstants.STORAGE_SIZE;
- /** Matrix cols */
- private final int cols = MathTestConstants.STORAGE_SIZE;
-
- /**
- * Default constructor.
- */
- public CacheMatrixTest() {
- super(false);
- }
-
- /** {@inheritDoc} */
- @Override protected void beforeTestsStarted() throws Exception {
- for (int i = 1; i <= NODE_COUNT; i++)
- startGrid(i);
- }
-
- /** {@inheritDoc} */
- @Override protected void afterTestsStopped() throws Exception {
- stopAllGrids();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override protected void beforeTest() throws Exception {
- ignite = grid(NODE_COUNT);
-
- ignite.configuration().setPeerClassLoadingEnabled(true);
- }
-
- /** {@inheritDoc} */
- @Override protected void afterTest() throws Exception {
- ignite.destroyCache(CACHE_NAME);
- }
-
- /** */
- public void testGetSet() throws Exception {
- MatrixKeyMapper<Integer> keyMapper = getKeyMapper(rows, cols);
- IgniteCache<Integer, Double> cache = getCache();
- CacheMatrix<Integer, Double> cacheMatrix = new CacheMatrix<>(rows, cols, cache, keyMapper, new IdentityValueMapper());
-
- for (int i = 0; i < rows; i++) {
- for (int j = 0; j < cols; j++) {
- double v = Math.random();
- cacheMatrix.set(i, j, v);
-
- assert Double.compare(v, cacheMatrix.get(i, j)) == 0;
- assert Double.compare(v, cache.get(keyMapper.apply(i, j))) == 0;
- }
- }
- }
-
- /** */
- public void testCopy() throws Exception {
- MatrixKeyMapper<Integer> keyMapper = getKeyMapper(rows, cols);
- IgniteCache<Integer, Double> cache = getCache();
- CacheMatrix<Integer, Double> cacheMatrix = new CacheMatrix<>(rows, cols, cache, keyMapper, new IdentityValueMapper());
-
- fillMatrix(cacheMatrix);
-
- try {
- cacheMatrix.copy();
-
- fail("UnsupportedOperationException expected");
- }
- catch (UnsupportedOperationException e) {
- // No-op.
- }
- }
-
- /** */
- public void testLike() throws Exception {
- MatrixKeyMapper<Integer> keyMapper = getKeyMapper(rows, cols);
- IgniteCache<Integer, Double> cache = getCache();
- CacheMatrix<Integer, Double> cacheMatrix = new CacheMatrix<>(rows, cols, cache, keyMapper, new IdentityValueMapper());
-
- try {
- cacheMatrix.like(rows, cols);
-
- fail("UnsupportedOperationException expected");
- }
- catch (UnsupportedOperationException e) {
- // No-op.
- }
- }
-
- /** */
- public void testLikeVector() throws Exception {
- MatrixKeyMapper<Integer> keyMapper = getKeyMapper(rows, cols);
- IgniteCache<Integer, Double> cache = getCache();
- CacheMatrix<Integer, Double> cacheMatrix = new CacheMatrix<>(rows, cols, cache, keyMapper, new IdentityValueMapper());
-
- try {
- cacheMatrix.likeVector(cols);
-
- fail("UnsupportedOperationException expected");
- }
- catch (UnsupportedOperationException e) {
- // No-op.
- }
- }
-
- /** */
- public void testPlus() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- double plusVal = 2;
-
- MatrixKeyMapper<Integer> keyMapper = getKeyMapper(rows, cols);
- IgniteCache<Integer, Double> cache = getCache();
- CacheMatrix<Integer, Double> cacheMatrix = new CacheMatrix<>(rows, cols, cache, keyMapper, new IdentityValueMapper());
-
- initMatrix(cacheMatrix);
-
- cacheMatrix.plus(plusVal);
-
- for (int i = 0; i < rows; i++)
- for (int j = 0; j < cols; j++)
- assertEquals(plusVal, cacheMatrix.get(i, j));
- }
-
- /** */
- public void testDivide() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- double initVal = 1;
- double divVal = 2;
-
- MatrixKeyMapper<Integer> keyMapper = getKeyMapper(rows, cols);
- IgniteCache<Integer, Double> cache = getCache();
- CacheMatrix<Integer, Double> cacheMatrix = new CacheMatrix<>(rows, cols, cache, keyMapper, new IdentityValueMapper());
-
- initMatrix(cacheMatrix);
- cacheMatrix.assign(initVal);
- cacheMatrix.divide(divVal);
-
- for (int i = 0; i < rows; i++)
- for (int j = 0; j < cols; j++)
- assertTrue(Double.compare(cacheMatrix.get(i, j), initVal / divVal) == 0);
- }
-
- /** */
- public void testTimes() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- double initVal = 1;
- double timVal = 2;
-
- MatrixKeyMapper<Integer> keyMapper = getKeyMapper(rows, cols);
- IgniteCache<Integer, Double> cache = getCache();
- CacheMatrix<Integer, Double> cacheMatrix = new CacheMatrix<>(rows, cols, cache, keyMapper, new IdentityValueMapper());
-
- initMatrix(cacheMatrix);
- cacheMatrix.assign(initVal);
- cacheMatrix.times(timVal);
-
- for (int i = 0; i < rows; i++)
- for (int j = 0; j < cols; j++)
- assertTrue(Double.compare(cacheMatrix.get(i, j), initVal * timVal) == 0);
- }
-
- /** */
- public void testSum() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- double initVal = 1;
-
- MatrixKeyMapper<Integer> keyMapper = getKeyMapper(rows, cols);
- IgniteCache<Integer, Double> cache = getCache();
- CacheMatrix<Integer, Double> cacheMatrix = new CacheMatrix<>(rows, cols, cache, keyMapper, new IdentityValueMapper());
-
- double sum = 0;
-
- initMatrix(cacheMatrix);
- sum = cacheMatrix.sum();
-
- assertTrue(Double.compare(sum, 0d) == 0);
-
- cacheMatrix.assign(1d);
- sum = cacheMatrix.sum();
-
- assertTrue(Double.compare(sum, rows * cols) == 0);
- }
-
- /** */
- public void testAssignSingleValue() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- double initVal = 1;
-
- MatrixKeyMapper<Integer> keyMapper = getKeyMapper(rows, cols);
- IgniteCache<Integer, Double> cache = getCache();
- CacheMatrix<Integer, Double> cacheMatrix = new CacheMatrix<>(rows, cols, cache, keyMapper, new IdentityValueMapper());
-
- initMatrix(cacheMatrix);
-
- cacheMatrix.assign(initVal);
-
- for (int i = 0; i < rows; i++)
- for (int j = 0; j < cols; j++)
- assertEquals(initVal, cacheMatrix.get(i, j));
- }
-
- /** */
- public void testAssignArray() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- double[][] initVal = new double[rows][cols];
-
- MatrixKeyMapper<Integer> keyMapper = getKeyMapper(rows, cols);
- IgniteCache<Integer, Double> cache = getCache();
- CacheMatrix<Integer, Double> cacheMatrix = new CacheMatrix<>(rows, cols, cache, keyMapper, new IdentityValueMapper());
-
- for (int i = 0; i < rows; i++)
- for (int j = 0; j < cols; j++)
- initVal[i][j] = Math.random();
-
- cacheMatrix.assign(initVal);
-
- for (int i = 0; i < rows; i++)
- for (int j = 0; j < cols; j++)
- assertEquals(initVal[i][j], cacheMatrix.get(i, j));
- }
-
- /** */
- public void testAttributes() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- MatrixKeyMapper<Integer> keyMapper = getKeyMapper(rows, cols);
- IgniteCache<Integer, Double> cache = getCache();
- CacheMatrix<Integer, Double> cacheMatrix = new CacheMatrix<>(rows, cols, cache, keyMapper, new IdentityValueMapper());
-
- assertFalse(UNEXPECTED_ATTRIBUTE_VALUE, cacheMatrix.isSequentialAccess());
- assertFalse(UNEXPECTED_ATTRIBUTE_VALUE, cacheMatrix.isDense());
- assertFalse(UNEXPECTED_ATTRIBUTE_VALUE, cacheMatrix.isArrayBased());
- assertTrue(UNEXPECTED_ATTRIBUTE_VALUE, cacheMatrix.isRandomAccess());
- assertTrue(UNEXPECTED_ATTRIBUTE_VALUE, cacheMatrix.isDistributed());
- }
-
- /** */
- public void testExternalization() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- MatrixKeyMapper<Integer> keyMapper = getKeyMapper(rows, cols);
- IgniteCache<Integer, Double> cache = getCache();
- final CacheMatrix<Integer, Double> cacheMatrix = new CacheMatrix<>(rows, cols, cache, keyMapper, new IdentityValueMapper());
-
- ExternalizeTest<CacheMatrix<Integer, Double>> externalizeTest = new ExternalizeTest<CacheMatrix<Integer, Double>>() {
-
- @Override public void externalizeTest() {
- super.externalizeTest(cacheMatrix);
- }
- };
-
- externalizeTest.externalizeTest();
- }
-
- /** */
- public void testMinMax() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- MatrixKeyMapper<Integer> keyMapper = getKeyMapper(rows, cols);
- IgniteCache<Integer, Double> cache = getCache();
- final CacheMatrix<Integer, Double> cacheMatrix = new CacheMatrix<>(rows, cols, cache, keyMapper, new IdentityValueMapper());
-
- for (int i = 0; i < rows; i++)
- for (int j = 0; j < cols; j++)
- cacheMatrix.set(i, j, i * rows + j);
-
- assertEquals(0.0, cacheMatrix.minValue(), 0.0);
- assertEquals(rows * cols - 1, cacheMatrix.maxValue(), 0.0);
- }
-
- /** */
- public void testMap() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- MatrixKeyMapper<Integer> keyMapper = getKeyMapper(rows, cols);
- IgniteCache<Integer, Double> cache = getCache();
- final CacheMatrix<Integer, Double> cacheMatrix = new CacheMatrix<>(rows, cols, cache, keyMapper, new IdentityValueMapper());
-
- initMatrix(cacheMatrix);
-
- cacheMatrix.map(value -> value + 10);
-
- for (int i = 0; i < rows; i++)
- for (int j = 0; j < cols; j++)
- assertEquals(10.0, cacheMatrix.getX(i, j), 0.0);
- }
-
- /** */
- private IgniteCache<Integer, Double> getCache() {
- assert ignite != null;
-
- CacheConfiguration cfg = new CacheConfiguration();
- cfg.setName(CACHE_NAME);
-
- IgniteCache<Integer, Double> cache = ignite.getOrCreateCache(CACHE_NAME);
-
- assert cache != null;
- return cache;
- }
-
- /** */
- private MatrixKeyMapper<Integer> getKeyMapper(final int rows, final int cols) {
- return new MatrixKeyMapperForTests(rows, cols);
- }
-
- /** Init the given matrix by random values. */
- private void fillMatrix(Matrix m) {
- for (int i = 0; i < m.rowSize(); i++)
- for (int j = 0; j < m.columnSize(); j++)
- m.set(i, j, Math.random());
- }
-
- /** Init the given matrix by zeros. */
- private void initMatrix(Matrix m) {
- for (int i = 0; i < m.rowSize(); i++)
- for (int j = 0; j < m.columnSize(); j++)
- m.set(i, j, 0d);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/DenseLocalOffHeapMatrixConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/DenseLocalOffHeapMatrixConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/DenseLocalOffHeapMatrixConstructorTest.java
deleted file mode 100644
index 1f0537c..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/DenseLocalOffHeapMatrixConstructorTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * 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.ignite.math.impls.matrix;
-
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-/** */
-public class DenseLocalOffHeapMatrixConstructorTest {
- /** */
- @Test
- public void invalidArgsTest() {
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new DenseLocalOffHeapMatrix(0, 1), "invalid row parameter");
-
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new DenseLocalOffHeapMatrix(1, 0), "invalid col parameter");
-
- //noinspection ConstantConditions
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new DenseLocalOffHeapMatrix(null), "null matrix parameter");
-
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new DenseLocalOffHeapMatrix(new double[][] {null, new double[1]}),
- "null row in matrix");
- }
-
- /** */
- @Test
- public void basicTest() {
- assertEquals("Expected number of rows, int parameters.", 1,
- new DenseLocalOffHeapMatrix(1, 2).rowSize());
-
- assertEquals("Expected number of rows, double[][] parameter.", 1,
- new DenseLocalOffHeapMatrix(new double[][] {new double[2]}).rowSize());
-
- assertEquals("Expected number of cols, int parameters.", 1,
- new DenseLocalOffHeapMatrix(2, 1).columnSize());
-
- assertEquals("Expected number of cols, double[][] parameter.", 1,
- new DenseLocalOffHeapMatrix(new double[][] {new double[1], new double[1]}).columnSize());
-
- double[][] data1 = new double[][] {{1, 2}, {3, 4}}, data2 = new double[][] {{1, 2}, {3, 5}};
-
- assertTrue("Matrices with same values are expected to be equal",
- new DenseLocalOffHeapMatrix(data1).equals(new DenseLocalOffHeapMatrix(data1)));
-
- assertFalse("Matrices with same values are expected to be equal",
- new DenseLocalOffHeapMatrix(data1).equals(new DenseLocalOffHeapMatrix(data2)));
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/DenseLocalOnHeapMatrixConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/DenseLocalOnHeapMatrixConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/DenseLocalOnHeapMatrixConstructorTest.java
deleted file mode 100644
index 0a25e31..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/DenseLocalOnHeapMatrixConstructorTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * 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.ignite.math.impls.matrix;
-
-import java.util.function.Supplier;
-import org.apache.ignite.math.Matrix;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-
-/** */
-public class DenseLocalOnHeapMatrixConstructorTest {
- /** */
- @Test
- public void invalidArgsTest() {
- verifyAssertionError(() -> new DenseLocalOnHeapMatrix(0, 1), "invalid row parameter");
-
- verifyAssertionError(() -> new DenseLocalOnHeapMatrix(1, 0), "invalid col parameter");
-
- //noinspection ConstantConditions
- verifyAssertionError(() -> new DenseLocalOnHeapMatrix(null), "null matrix parameter");
-
- verifyAssertionError(() -> new DenseLocalOnHeapMatrix(new double[][] {null, new double[1]}),
- "null row in matrix");
- }
-
- /** */
- @Test
- public void basicTest() {
- assertEquals("Expected number of rows, int parameters.", 1,
- new DenseLocalOnHeapMatrix(1, 2).rowSize());
-
- assertEquals("Expected number of rows, double[][] parameter.", 1,
- new DenseLocalOnHeapMatrix(new double[][] {new double[2]}).rowSize());
-
- assertEquals("Expected number of cols, int parameters.", 1,
- new DenseLocalOnHeapMatrix(2, 1).columnSize());
-
- assertEquals("Expected number of cols, double[][] parameter.", 1,
- new DenseLocalOnHeapMatrix(new double[][] {new double[1], new double[1]}).columnSize());
- }
-
- /** */
- static void verifyAssertionError(Supplier<Matrix> ctor, String desc) {
- try {
- assertNotNull("Unexpected null matrix in " + desc, ctor.get());
- }
- catch (AssertionError ae) {
- return;
- }
-
- fail("Expected error not caught in " + desc);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/DiagonalMatrixTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/DiagonalMatrixTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/DiagonalMatrixTest.java
deleted file mode 100644
index c0c2af7..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/DiagonalMatrixTest.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * 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.ignite.math.impls.matrix;
-
-import org.apache.ignite.math.ExternalizeTest;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.apache.ignite.math.impls.MathTestConstants;
-import org.apache.ignite.math.impls.vector.DenseLocalOnHeapVector;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-/**
- * Tests for {@link DiagonalMatrix}.
- */
-public class DiagonalMatrixTest extends ExternalizeTest<DiagonalMatrix> {
- /** */
- public static final String UNEXPECTED_VALUE = "Unexpected value";
-
- /** */
- private DiagonalMatrix testMatrix;
-
- /** */
- @Before
- public void setup() {
- DenseLocalOnHeapMatrix parent = new DenseLocalOnHeapMatrix(MathTestConstants.STORAGE_SIZE, MathTestConstants.STORAGE_SIZE);
- fillMatrix(parent);
- testMatrix = new DiagonalMatrix(parent);
- }
-
- /** {@inheritDoc} */
- @Override public void externalizeTest() {
- externalizeTest(testMatrix);
- }
-
- /** */
- @Test
- public void testSetGetBasic() {
- double testVal = 42;
- for (int i = 0; i < MathTestConstants.STORAGE_SIZE; i++) {
- testMatrix.set(i, i, testVal);
-
- assertEquals(UNEXPECTED_VALUE + " at (" + i + "," + i + ")", testMatrix.get(i, i), testVal, 0d);
- }
-
- //noinspection EqualsWithItself
- assertTrue("Matrix is expected to be equal to self.", testMatrix.equals(testMatrix));
- //noinspection ObjectEqualsNull
- assertFalse("Matrix is expected to be not equal to null.", testMatrix.equals(null));
- }
-
- /** */
- @Test
- public void testSetGet() {
- verifyDiagonal(testMatrix);
-
- final int size = MathTestConstants.STORAGE_SIZE;
-
- for (Matrix m : new Matrix[] {
- new DenseLocalOnHeapMatrix(size + 1, size),
- new DenseLocalOnHeapMatrix(size, size + 1)}) {
- fillMatrix(m);
-
- verifyDiagonal(new DiagonalMatrix(m));
- }
-
- final double[] data = new double[size];
-
- for (int i = 0; i < size; i++)
- data[i] = 1 + i;
-
- final Matrix m = new DiagonalMatrix(new DenseLocalOnHeapVector(data));
-
- assertEquals("Rows in matrix constructed from vector", size, m.rowSize());
- assertEquals("Cols in matrix constructed from vector", size, m.columnSize());
-
- for (int i = 0; i < size; i++)
- assertEquals(UNEXPECTED_VALUE + " at vector index " + i, data[i], m.get(i, i), 0d);
-
- verifyDiagonal(m);
-
- final Matrix m1 = new DiagonalMatrix(data);
-
- assertEquals("Rows in matrix constructed from array", size, m1.rowSize());
- assertEquals("Cols in matrix constructed from array", size, m1.columnSize());
-
- for (int i = 0; i < size; i++)
- assertEquals(UNEXPECTED_VALUE + " at array index " + i, data[i], m1.get(i, i), 0d);
-
- verifyDiagonal(m1);
- }
-
- /** */
- @Test
- public void testConstant() {
- final int size = MathTestConstants.STORAGE_SIZE;
-
- for (double val : new double[] {-1.0, 0.0, 1.0}) {
- Matrix m = new DiagonalMatrix(size, val);
-
- assertEquals("Rows in matrix", size, m.rowSize());
- assertEquals("Cols in matrix", size, m.columnSize());
-
- for (int i = 0; i < size; i++)
- assertEquals(UNEXPECTED_VALUE + " at index " + i, val, m.get(i, i), 0d);
-
- verifyDiagonal(m, true);
- }
- }
-
- /** */
- @Test
- public void testAttributes() {
- assertTrue(UNEXPECTED_VALUE, testMatrix.rowSize() == MathTestConstants.STORAGE_SIZE);
- assertTrue(UNEXPECTED_VALUE, testMatrix.columnSize() == MathTestConstants.STORAGE_SIZE);
-
- assertFalse(UNEXPECTED_VALUE, testMatrix.isArrayBased());
- assertTrue(UNEXPECTED_VALUE, testMatrix.isDense());
- assertFalse(UNEXPECTED_VALUE, testMatrix.isDistributed());
-
- assertEquals(UNEXPECTED_VALUE, testMatrix.isRandomAccess(), !testMatrix.isSequentialAccess());
- assertTrue(UNEXPECTED_VALUE, testMatrix.isRandomAccess());
- }
-
- /** */
- @Test
- public void testNullParams() {
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new DiagonalMatrix((Matrix)null), "Null Matrix parameter");
-
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new DiagonalMatrix((Vector)null), "Null Vector parameter");
-
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new DiagonalMatrix((double[])null), "Null double[] parameter");
- }
-
- /** */
- private void verifyDiagonal(Matrix m, boolean readonly) {
- final int rows = m.rowSize(), cols = m.columnSize();
-
- final String sizeDetails = "rows" + "X" + "cols " + rows + "X" + cols;
-
- for (int i = 0; i < rows; i++)
- for (int j = 0; j < cols; j++) {
- final String details = " at (" + i + "," + j + "), " + sizeDetails;
-
- final boolean diagonal = i == j;
-
- final double old = m.get(i, j);
-
- if (!diagonal)
- assertEquals(UNEXPECTED_VALUE + details, 0, old, 0d);
-
- final double exp = diagonal && !readonly ? old + 1 : old;
-
- boolean expECaught = false;
-
- try {
- m.set(i, j, exp);
- }
- catch (UnsupportedOperationException uoe) {
- if (diagonal && !readonly)
- throw uoe;
-
- expECaught = true;
- }
-
- if ((!diagonal || readonly) && !expECaught)
- fail("Expected exception was not caught " + details);
-
- assertEquals(UNEXPECTED_VALUE + details, exp, m.get(i, j), 0d);
- }
- }
-
- /** */
- private void verifyDiagonal(Matrix m) {
- verifyDiagonal(m, false);
- }
-
- /** */
- private void fillMatrix(Matrix m) {
- final int rows = m.rowSize(), cols = m.columnSize();
-
- boolean negative = false;
-
- for (int i = 0; i < rows; i++)
- for (int j = 0; j < cols; j++)
- m.set(i, j, (negative = !negative) ? -(i * cols + j + 1) : i * cols + j + 1);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/FunctionMatrixConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/FunctionMatrixConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/FunctionMatrixConstructorTest.java
deleted file mode 100644
index a5ac84a..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/FunctionMatrixConstructorTest.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * 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.ignite.math.impls.matrix;
-
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-/** */
-public class FunctionMatrixConstructorTest {
- /** */
- @Test
- public void invalidArgsTest() {
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new FunctionMatrix(0, 1, (i, j) -> 0.0),
- "Invalid row parameter.");
-
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new FunctionMatrix(1, 0, (i, j) -> 0.0),
- "Invalid col parameter.");
-
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new FunctionMatrix(1, 1, null),
- "Invalid func parameter.");
-
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new FunctionMatrix(0, 1, (i, j) -> 0.0, null),
- "Invalid row parameter, with setter func.");
-
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new FunctionMatrix(1, 0, (i, j) -> 0.0, null),
- "Invalid col parameter, with setter func.");
-
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new FunctionMatrix(1, 1, null, null),
- "Invalid func parameter, with setter func.");
- }
-
- /** */
- @Test
- public void basicTest() {
- for (int rows : new int[] {1, 2, 3})
- for (int cols : new int[] {1, 2, 3})
- basicTest(rows, cols);
-
- Matrix m = new FunctionMatrix(1, 1, (i, j) -> 1d);
- //noinspection EqualsWithItself
- assertTrue("Matrix is expected to be equal to self.", m.equals(m));
- //noinspection ObjectEqualsNull
- assertFalse("Matrix is expected to be not equal to null.", m.equals(null));
- }
-
- /** */
- private void basicTest(int rows, int cols) {
- double[][] data = new double[rows][cols];
-
- for (int row = 0; row < rows; row++)
- for (int col = 0; col < cols; col++)
- data[row][col] = row * cols + row;
-
- Matrix mReadOnly = new FunctionMatrix(rows, cols, (i, j) -> data[i][j]);
-
- assertEquals("Rows in matrix.", rows, mReadOnly.rowSize());
- assertEquals("Cols in matrix.", cols, mReadOnly.columnSize());
-
- for (int row = 0; row < rows; row++)
- for (int col = 0; col < cols; col++) {
- assertEquals("Unexpected value at " + row + "x" + col, data[row][col], mReadOnly.get(row, col), 0d);
-
- boolean expECaught = false;
-
- try {
- mReadOnly.set(row, col, 0.0);
- }
- catch (UnsupportedOperationException uoe) {
- expECaught = true;
- }
-
- assertTrue("Expected exception wasn't thrown at " + row + "x" + col, expECaught);
- }
-
- Matrix m = new FunctionMatrix(rows, cols, (i, j) -> data[i][j], (i, j, val) -> data[i][j] = val);
-
- assertEquals("Rows in matrix, with setter function.", rows, m.rowSize());
- assertEquals("Cols in matrix, with setter function.", cols, m.columnSize());
-
- for (int row = 0; row < rows; row++)
- for (int col = 0; col < cols; col++) {
- assertEquals("Unexpected value at " + row + "x" + col, data[row][col], m.get(row, col), 0d);
-
- m.set(row, col, -data[row][col]);
- }
-
- for (int row = 0; row < rows; row++)
- for (int col = 0; col < cols; col++)
- assertEquals("Unexpected value set at " + row + "x" + col, -(row * cols + row), m.get(row, col), 0d);
-
- assertTrue("Incorrect copy for empty matrix.", m.copy().equals(m));
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/MatrixAttributeTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/MatrixAttributeTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/MatrixAttributeTest.java
deleted file mode 100644
index c9fb390..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/MatrixAttributeTest.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * 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.ignite.math.impls.matrix;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.function.Function;
-import org.apache.ignite.math.Matrix;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-/**
- * Attribute tests for matrices.
- *
- * TODO: WIP
- */
-public class MatrixAttributeTest {
- /** */
- private final List<MatrixAttributeTest.AttrCfg> attrCfgs = Arrays.asList(
- new AttrCfg("isDense", Matrix::isDense,
- DenseLocalOnHeapMatrix.class, DenseLocalOffHeapMatrix.class, RandomMatrix.class, DiagonalMatrix.class),
- new AttrCfg("isArrayBased", Matrix::isArrayBased, DenseLocalOnHeapMatrix.class),
- new AttrCfg("isDistributed", Matrix::isDistributed),
- new AttrCfg("isRandomAccess", Matrix::isRandomAccess, DenseLocalOnHeapMatrix.class, DenseLocalOffHeapMatrix.class, RandomMatrix.class, DiagonalMatrix.class, SparseLocalOnHeapMatrix.class),
- new AttrCfg("isSequentialAccess", Matrix::isSequentialAccess, DiagonalMatrix.class)
- );
-
- /** */
- private final List<MatrixAttributeTest.Specification> specFixture = Arrays.asList(
- new Specification(new DenseLocalOnHeapMatrix(1, 1)),
- new Specification(new DenseLocalOffHeapMatrix(1, 1)),
- new Specification(new RandomMatrix(1, 1)),
- new Specification(new DiagonalMatrix(new double[] {1.0})),
- new Specification(new FunctionMatrix(1, 1, (x, y) -> 1.0)),
- new Specification(new SparseLocalOnHeapMatrix(1, 1))
- );
-
- /** */
- @Test
- public void isDenseTest() {
- assertAttribute("isDense");
- }
-
- /** */
- @Test
- public void isArrayBasedTest() {
- assertAttribute("isArrayBased");
- }
-
- /** */
- @Test
- public void isSequentialAccessTest() {
- assertAttribute("isSequentialAccess");
- }
-
- /** */
- @Test
- public void isRandomAccessTest() {
- assertAttribute("isRandomAccess");
- }
-
- /** */
- @Test
- public void isDistributedTest() {
- assertAttribute("isDistributed");
- }
-
- /** */
- private void assertAttribute(String name) {
- final MatrixAttributeTest.AttrCfg attr = attrCfg(name);
-
- for (MatrixAttributeTest.Specification spec : specFixture)
- spec.verify(attr);
- }
-
- /** */
- private MatrixAttributeTest.AttrCfg attrCfg(String name) {
- for (MatrixAttributeTest.AttrCfg attr : attrCfgs)
- if (attr.name.equals(name))
- return attr;
-
- throw new IllegalArgumentException("Undefined attribute " + name);
- }
-
- /** See http://en.wikipedia.org/wiki/Specification_pattern */
- private static class Specification {
- /** */
- private final Matrix m;
- /** */
- private final Class<? extends Matrix> underlyingType;
- /** */
- private final List<String> attrsFromUnderlying;
- /** */
- final String desc;
-
- /** */
- Specification(Matrix m, Class<? extends Matrix> underlyingType, String... attrsFromUnderlying) {
- this.m = m;
- this.underlyingType = underlyingType;
- this.attrsFromUnderlying = Arrays.asList(attrsFromUnderlying);
- final Class<? extends Matrix> clazz = m.getClass();
- desc = clazz.getSimpleName() + (clazz.equals(underlyingType)
- ? "" : " (underlying type " + underlyingType.getSimpleName() + ")");
- }
-
- /** */
- Specification(Matrix m) {
- this(m, m.getClass());
- }
-
- /** */
- void verify(MatrixAttributeTest.AttrCfg attr) {
- final boolean obtained = attr.obtain.apply(m);
-
- final Class<? extends Matrix> typeToCheck
- = attrsFromUnderlying.contains(attr.name) ? underlyingType : m.getClass();
-
- final boolean exp = attr.trueInTypes.contains(typeToCheck);
-
- assertEquals("Unexpected " + attr.name + " value for " + desc, exp, obtained);
- }
- }
-
- /** */
- private static class AttrCfg {
- /** */
- final String name;
- /** */
- final Function<Matrix, Boolean> obtain;
- /** */
- final List<Class> trueInTypes;
-
- /** */
- AttrCfg(String name, Function<Matrix, Boolean> obtain, Class... trueInTypes) {
- this.name = name;
- this.obtain = obtain;
- this.trueInTypes = Arrays.asList(trueInTypes);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/MatrixImplementationFixtures.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/MatrixImplementationFixtures.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/MatrixImplementationFixtures.java
deleted file mode 100644
index 88aa4fe..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/MatrixImplementationFixtures.java
+++ /dev/null
@@ -1,381 +0,0 @@
-/*
- * 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.ignite.math.impls.matrix;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import java.util.function.BiConsumer;
-import java.util.function.BiFunction;
-import java.util.function.Function;
-import java.util.function.Supplier;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.impls.storage.matrix.FunctionMatrixStorage;
-import org.jetbrains.annotations.NotNull;
-
-/** */
-class MatrixImplementationFixtures {
- /** */
- private static final List<Supplier<Iterable<Matrix>>> suppliers = Arrays.asList(
- (Supplier<Iterable<Matrix>>)DenseLocalOnHeapMatrixFixture::new,
- (Supplier<Iterable<Matrix>>)DenseLocalOffHeapMatrixFixture::new,
- (Supplier<Iterable<Matrix>>)RandomMatrixFixture::new,
- (Supplier<Iterable<Matrix>>)SparseLocalOnHeapMatrixFixture::new,
- (Supplier<Iterable<Matrix>>)PivotedMatrixViewFixture::new,
- (Supplier<Iterable<Matrix>>)MatrixViewFixture::new,
- (Supplier<Iterable<Matrix>>)FunctionMatrixFixture::new,
- (Supplier<Iterable<Matrix>>)DiagonalMatrixFixture::new,
- (Supplier<Iterable<Matrix>>)TransposedMatrixViewFixture::new
- );
-
- /** */
- void consumeSampleMatrix(BiConsumer<Matrix, String> consumer) {
- for (Supplier<Iterable<Matrix>> fixtureSupplier : suppliers) {
- final Iterable<Matrix> fixture = fixtureSupplier.get();
-
- for (Matrix matrix : fixture) {
- consumer.accept(matrix, fixture.toString());
-
- matrix.destroy();
- }
- }
- }
-
- /** */
- private static class DenseLocalOnHeapMatrixFixture extends MatrixSizeIterator {
- /** */
- DenseLocalOnHeapMatrixFixture() {
- super(DenseLocalOnHeapMatrix::new, "DenseLocalOnHeapMatrix");
- }
- }
-
- /** */
- private static class DenseLocalOffHeapMatrixFixture extends MatrixSizeIterator {
- /** */
- DenseLocalOffHeapMatrixFixture() {
- super(DenseLocalOffHeapMatrix::new, "DenseLocalOffHeapMatrix");
- }
- }
-
- /** */
- private static class RandomMatrixFixture extends MatrixSizeIterator {
- /** */
- RandomMatrixFixture() {
- super(RandomMatrix::new, "RandomMatrix");
- }
- }
-
- /** */
- private static class SparseLocalOnHeapMatrixFixture extends MatrixSizeIterator {
- /** */
- SparseLocalOnHeapMatrixFixture() {
- super(SparseLocalOnHeapMatrix::new, "SparseLocalOnHeapMatrix");
- }
- }
-
- /** */
- private static class PivotedMatrixViewFixture extends WrapperMatrixIterator {
- /** */
- PivotedMatrixViewFixture() {
- super(PivotedMatrixView::new, "PivotedMatrixView over DenseLocalOnHeapMatrix");
- }
- }
-
- /** */
- private static class MatrixViewFixture extends WrapperMatrixIterator {
- /** */
- MatrixViewFixture() {
- super((matrix) -> new MatrixView(matrix, 0, 0, matrix.rowSize(), matrix.columnSize()),
- "MatrixView over DenseLocalOnHeapMatrix");
- }
- }
-
- /** */
- private static class FunctionMatrixFixture extends WrapperMatrixIterator {
- /** */
- FunctionMatrixFixture() {
- super(FunctionMatrixForTest::new, "FunctionMatrix wrapping DenseLocalOnHeapMatrix");
- }
- }
-
- /** */
- private static class DiagonalMatrixFixture extends DiagonalIterator {
- /** */
- DiagonalMatrixFixture() {
- super(DenseLocalOnHeapMatrix::new, "DiagonalMatrix over DenseLocalOnHeapMatrix");
- }
-
- /** {@inheritDoc} */
- @NotNull
- @Override public Iterator<Matrix> iterator() {
- return new Iterator<Matrix>() {
- /** {@inheritDoc} */
- @Override public boolean hasNext() {
- return hasNextSize(getSizeIdx());
- }
-
- /** {@inheritDoc} */
- @Override public Matrix next() {
- assert getSize(getSizeIdx()) == 1 : "Only size 1 allowed for diagonal matrix fixture.";
-
- Matrix matrix = getConstructor().apply(getSize(getSizeIdx()), getSize(getSizeIdx()));
-
- nextIdx();
-
- return new DiagonalMatrix(matrix);
- }
- };
- }
- }
-
- /** */
- private static class TransposedMatrixViewFixture extends WrapperMatrixIterator {
- /** */
- TransposedMatrixViewFixture() {
- super(TransposedMatrixView::new, "TransposedMatrixView over DenseLocalOnHeapMatrix");
- }
- }
-
- /** */
- private static abstract class DiagonalIterator implements Iterable<Matrix> {
- /** */
- private final Integer[] sizes = new Integer[] {1, null};
- /** */
- private int sizeIdx = 0;
-
- /** */
- private BiFunction<Integer, Integer, ? extends Matrix> constructor;
- /** */
- private String desc;
-
- /** */
- DiagonalIterator(BiFunction<Integer, Integer, ? extends Matrix> constructor, String desc) {
- this.constructor = constructor;
- this.desc = desc;
- }
-
- /** */
- public BiFunction<Integer, Integer, ? extends Matrix> getConstructor() {
- return constructor;
- }
-
- /** */
- int getSizeIdx() {
- return sizeIdx;
- }
-
- /** */
- @Override public String toString() {
- return desc + "{rows=" + sizes[sizeIdx] + ", cols=" + sizes[sizeIdx] + "}";
- }
-
- /** */
- boolean hasNextSize(int idx) {
- return sizes[idx] != null;
- }
-
- /** */
- Integer getSize(int idx) {
- return sizes[idx];
- }
-
- /** */
- void nextIdx() {
- sizeIdx++;
- }
- }
-
- /** */
- private static class WrapperMatrixIterator extends MatrixSizeIterator {
- /** */
- private final Function<Matrix, Matrix> wrapperCtor;
-
- /** */
- WrapperMatrixIterator(Function<Matrix, Matrix> wrapperCtor, String desc) {
- super(DenseLocalOnHeapMatrix::new, desc);
-
- this.wrapperCtor = wrapperCtor;
- }
-
- /** {@inheritDoc} */
- @NotNull
- @Override public Iterator<Matrix> iterator() {
- return new Iterator<Matrix>() {
- /** {@inheritDoc} */
- @Override public boolean hasNext() {
- return hasNextCol(getSizeIdx()) && hasNextRow(getSizeIdx());
- }
-
- /** {@inheritDoc} */
- @Override public Matrix next() {
- Matrix matrix = getConstructor().apply(getRow(getSizeIdx()), getCol(getSizeIdx()));
-
- nextIdx();
-
- return wrapperCtor.apply(matrix);
- }
- };
- }
- }
-
- /** */
- private static class MatrixSizeIterator implements Iterable<Matrix> {
- /** */
- private final Integer[] rows = new Integer[] {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 512, 1024, null};
- /** */
- private final Integer[] cols = new Integer[] {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 1024, 512, null};
- /** */
- private int sizeIdx = 0;
-
- /** */
- private BiFunction<Integer, Integer, ? extends Matrix> constructor;
- /** */
- private String desc;
-
- /** */
- MatrixSizeIterator(BiFunction<Integer, Integer, ? extends Matrix> constructor, String desc) {
- this.constructor = constructor;
- this.desc = desc;
- }
-
- /** */
- public BiFunction<Integer, Integer, ? extends Matrix> getConstructor() {
- return constructor;
- }
-
- /** */
- int getSizeIdx() {
- return sizeIdx;
- }
-
- /** */
- @Override public String toString() {
- return desc + "{rows=" + rows[sizeIdx] + ", cols=" + cols[sizeIdx] + "}";
- }
-
- /** */
- boolean hasNextRow(int idx) {
- return rows[idx] != null;
- }
-
- /** */
- boolean hasNextCol(int idx) {
- return cols[idx] != null;
- }
-
- /** */
- Integer getRow(int idx) {
- return rows[idx];
- }
-
- /** */
- int getCol(int idx) {
- return cols[idx];
- }
-
- /** {@inheritDoc} */
- @NotNull
- @Override public Iterator<Matrix> iterator() {
- return new Iterator<Matrix>() {
- /** {@inheritDoc} */
- @Override public boolean hasNext() {
- return hasNextCol(sizeIdx) && hasNextRow(sizeIdx);
- }
-
- /** {@inheritDoc} */
- @Override public Matrix next() {
- Matrix matrix = constructor.apply(rows[sizeIdx], cols[sizeIdx]);
-
- nextIdx();
-
- return matrix;
- }
- };
- }
-
- /** */
- void nextIdx() {
- sizeIdx++;
- }
- }
-
- /** Subclass tweaked for serialization */
- private static class FunctionMatrixForTest extends FunctionMatrix {
- /** */
- Matrix underlying;
-
- /** */
- public FunctionMatrixForTest() {
- // No-op.
- }
-
- /** */
- FunctionMatrixForTest(Matrix underlying) {
- super(underlying.rowSize(), underlying.columnSize(), underlying::get, underlying::set);
-
- this.underlying = underlying;
- }
-
- /** {@inheritDoc} */
- @Override public Matrix copy() {
- return new FunctionMatrixForTest(underlying);
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- super.writeExternal(out);
-
- out.writeObject(underlying);
- }
-
- /** {@inheritDoc} */
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- super.readExternal(in);
-
- underlying = (Matrix)in.readObject();
-
- setStorage(new FunctionMatrixStorage(underlying.rowSize(), underlying.columnSize(),
- underlying::get, underlying::set));
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- int res = 1;
-
- res = res * 37 + underlying.hashCode();
-
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object o) {
- if (this == o)
- return true;
-
- if (o == null || getClass() != o.getClass())
- return false;
-
- FunctionMatrixForTest that = (FunctionMatrixForTest)o;
-
- return underlying != null ? underlying.equals(that.underlying) : that.underlying == null;
- }
- }
-}
[45/67] [abbrv] ignite git commit: ignite-5075
Posted by sb...@apache.org.
ignite-5075
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/14dba6e4
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/14dba6e4
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/14dba6e4
Branch: refs/heads/ignite-5075
Commit: 14dba6e417f5101b920a1c59db4551f15b304472
Parents: 193b805
Author: sboikov <sb...@gridgain.com>
Authored: Wed May 3 11:15:19 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Wed May 3 11:15:19 2017 +0300
----------------------------------------------------------------------
.../processors/cache/ClusterCachesInfo.java | 124 +++++++++++++++-
.../cache/DynamicCacheDescriptor.java | 33 -----
.../processors/cache/GridCacheProcessor.java | 142 ++-----------------
3 files changed, 133 insertions(+), 166 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/14dba6e4/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClusterCachesInfo.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClusterCachesInfo.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClusterCachesInfo.java
index 1064de3..4d53361 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClusterCachesInfo.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClusterCachesInfo.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.processors.cache;
import java.util.Collections;
import java.util.concurrent.Callable;
import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.IgniteLogger;
import org.apache.ignite.cache.CacheExistsException;
import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.configuration.CacheConfiguration;
@@ -46,6 +47,8 @@ import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
+import static org.apache.ignite.cache.CacheMode.LOCAL;
+import static org.apache.ignite.cache.CacheMode.PARTITIONED;
import static org.apache.ignite.events.EventType.EVT_NODE_JOINED;
import static org.apache.ignite.internal.GridComponent.DiscoveryDataExchangeType.CACHE_PROC;
@@ -63,6 +66,9 @@ class ClusterCachesInfo {
private final ConcurrentMap<String, DynamicCacheDescriptor> registeredTemplates = new ConcurrentHashMap<>();
/** */
+ private final IgniteLogger log;
+
+ /** */
private Map<String, DynamicCacheDescriptor> cachesOnDisconnect;
/** */
@@ -82,6 +88,8 @@ class ClusterCachesInfo {
*/
ClusterCachesInfo(GridKernalContext ctx) {
this.ctx = ctx;
+
+ log = ctx.log(getClass());
}
/**
@@ -91,8 +99,118 @@ class ClusterCachesInfo {
this.joinDiscoData = joinDiscoData;
}
- void onKernalStart() throws IgniteCheckedException {
- // TODO: validate cache configurations.
+ /**
+ * @throws IgniteCheckedException If failed.
+ */
+ void onKernalStart(boolean checkConsistency) throws IgniteCheckedException {
+ if (checkConsistency && joinDiscoData != null && gridData != null) {
+ for (CacheJoinNodeDiscoveryData.CacheInfo locCacheInfo : joinDiscoData.caches().values()) {
+ CacheConfiguration locCfg = locCacheInfo.config();
+
+ CacheData cacheData = gridData.caches().get(locCfg.getName());
+
+ if (cacheData != null)
+ checkCache(locCfg, cacheData.cacheConfiguration(), cacheData.receivedFrom());
+ }
+ }
+
+ joinDiscoData = null;
+ gridData = null;
+ }
+ /**
+ * Checks that remote caches has configuration compatible with the local.
+ *
+ * @param locCfg Local configuration.
+ * @param rmtCfg Remote configuration.
+ * @param rmt Remote node.
+ * @throws IgniteCheckedException If check failed.
+ */
+ private void checkCache(CacheConfiguration locCfg, CacheConfiguration rmtCfg, UUID rmt) throws IgniteCheckedException {
+ GridCacheAttributes rmtAttr = new GridCacheAttributes(rmtCfg);
+ GridCacheAttributes locAttr = new GridCacheAttributes(locCfg);
+
+ CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "cacheMode", "Cache mode",
+ locAttr.cacheMode(), rmtAttr.cacheMode(), true);
+
+ if (rmtAttr.cacheMode() != LOCAL) {
+ CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "interceptor", "Cache Interceptor",
+ locAttr.interceptorClassName(), rmtAttr.interceptorClassName(), true);
+
+ CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "atomicityMode",
+ "Cache atomicity mode", locAttr.atomicityMode(), rmtAttr.atomicityMode(), true);
+
+ CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "cachePreloadMode",
+ "Cache preload mode", locAttr.cacheRebalanceMode(), rmtAttr.cacheRebalanceMode(), true);
+
+ if (CU.affinityNode(ctx.discovery().localNode(), locCfg.getNodeFilter())) {
+ CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "storeFactory", "Store factory",
+ locAttr.storeFactoryClassName(), rmtAttr.storeFactoryClassName(), true);
+ }
+
+ CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "cacheAffinity", "Cache affinity",
+ locAttr.cacheAffinityClassName(), rmtAttr.cacheAffinityClassName(), true);
+
+ CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "cacheAffinityMapper",
+ "Cache affinity mapper", locAttr.cacheAffinityMapperClassName(),
+ rmtAttr.cacheAffinityMapperClassName(), true);
+
+ CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "affinityPartitionsCount",
+ "Affinity partitions count", locAttr.affinityPartitionsCount(),
+ rmtAttr.affinityPartitionsCount(), true);
+
+ CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "evictionFilter", "Eviction filter",
+ locAttr.evictionFilterClassName(), rmtAttr.evictionFilterClassName(), true);
+
+ CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "evictionPolicy", "Eviction policy",
+ locAttr.evictionPolicyClassName(), rmtAttr.evictionPolicyClassName(), true);
+
+ CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "transactionManagerLookup",
+ "Transaction manager lookup", locAttr.transactionManagerLookupClassName(),
+ rmtAttr.transactionManagerLookupClassName(), false);
+
+ CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "defaultLockTimeout",
+ "Default lock timeout", locAttr.defaultLockTimeout(), rmtAttr.defaultLockTimeout(), false);
+
+ CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "preloadBatchSize",
+ "Preload batch size", locAttr.rebalanceBatchSize(), rmtAttr.rebalanceBatchSize(), false);
+
+ CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "writeSynchronizationMode",
+ "Write synchronization mode", locAttr.writeSynchronization(), rmtAttr.writeSynchronization(),
+ true);
+
+ CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "writeBehindBatchSize",
+ "Write behind batch size", locAttr.writeBehindBatchSize(), rmtAttr.writeBehindBatchSize(),
+ false);
+
+ CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "writeBehindEnabled",
+ "Write behind enabled", locAttr.writeBehindEnabled(), rmtAttr.writeBehindEnabled(), false);
+
+ CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "writeBehindFlushFrequency",
+ "Write behind flush frequency", locAttr.writeBehindFlushFrequency(),
+ rmtAttr.writeBehindFlushFrequency(), false);
+
+ CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "writeBehindFlushSize",
+ "Write behind flush size", locAttr.writeBehindFlushSize(), rmtAttr.writeBehindFlushSize(),
+ false);
+
+ CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "writeBehindFlushThreadCount",
+ "Write behind flush thread count", locAttr.writeBehindFlushThreadCount(),
+ rmtAttr.writeBehindFlushThreadCount(), false);
+
+ if (locAttr.cacheMode() == PARTITIONED) {
+ CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "nearEvictionPolicy",
+ "Near eviction policy", locAttr.nearEvictionPolicyClassName(),
+ rmtAttr.nearEvictionPolicyClassName(), false);
+
+ CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "affinityIncludeNeighbors",
+ "Affinity include neighbors", locAttr.affinityIncludeNeighbors(),
+ rmtAttr.affinityIncludeNeighbors(), true);
+
+ CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "affinityKeyBackups",
+ "Affinity key backups", locAttr.affinityKeyBackups(),
+ rmtAttr.affinityKeyBackups(), true);
+ }
+ }
}
/**
@@ -435,8 +553,6 @@ class ClusterCachesInfo {
if (locCfg != null || CU.affinityNode(ctx.discovery().localNode(), cfg.getNodeFilter()))
locJoinStartCaches.add(new T2<>(desc, nearCfg));
}
-
- joinDiscoData = null;
}
}
else {
http://git-wip-us.apache.org/repos/asf/ignite/blob/14dba6e4/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheDescriptor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheDescriptor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheDescriptor.java
index bae711a..374bcb8 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheDescriptor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheDescriptor.java
@@ -56,9 +56,6 @@ public class DynamicCacheDescriptor {
/** Cache type. */
private CacheType cacheType;
- /** */
- private volatile Map<UUID, CacheConfiguration> rmtCfgs;
-
/** Template configuration flag. */
private boolean template;
@@ -249,36 +246,6 @@ public class DynamicCacheDescriptor {
}
/**
- * @param nodeId Remote node ID.
- * @return Configuration.
- */
- public CacheConfiguration remoteConfiguration(UUID nodeId) {
- Map<UUID, CacheConfiguration> cfgs = rmtCfgs;
-
- return cfgs == null ? null : cfgs.get(nodeId);
- }
-
- /**
- * @param nodeId Remote node ID.
- * @param cfg Remote node configuration.
- */
- public void addRemoteConfiguration(UUID nodeId, CacheConfiguration cfg) {
- Map<UUID, CacheConfiguration> cfgs = rmtCfgs;
-
- if (cfgs == null)
- rmtCfgs = cfgs = new HashMap<>();
-
- cfgs.put(nodeId, cfg);
- }
-
- /**
- *
- */
- public void clearRemoteConfigurations() {
- rmtCfgs = null;
- }
-
- /**
* @return Updates allowed flag.
*/
public boolean updatesAllowed() {
http://git-wip-us.apache.org/repos/asf/ignite/blob/14dba6e4/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
index 2ed20e4..2fabcc5 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
@@ -772,7 +772,12 @@ public class GridCacheProcessor extends GridProcessorAdapter {
ClusterNode locNode = ctx.discovery().localNode();
try {
- checkConsistency();
+ boolean check = !ctx.config().isDaemon() && !getBoolean(IGNITE_SKIP_CONFIGURATION_CONSISTENCY_CHECK);
+
+ if (check)
+ checkConsistency();
+
+ cachesInfo.onKernalStart(check);
boolean currStatus = ctx.state().active();
@@ -873,35 +878,18 @@ public class GridCacheProcessor extends GridProcessorAdapter {
*
*/
private void checkConsistency() throws IgniteCheckedException {
- if (!ctx.config().isDaemon() && !getBoolean(IGNITE_SKIP_CONFIGURATION_CONSISTENCY_CHECK)) {
- for (ClusterNode n : ctx.discovery().remoteNodes()) {
- if (n.attribute(ATTR_CONSISTENCY_CHECK_SKIPPED))
- continue;
+ for (ClusterNode n : ctx.discovery().remoteNodes()) {
+ if (n.attribute(ATTR_CONSISTENCY_CHECK_SKIPPED))
+ continue;
- checkTransactionConfiguration(n);
+ checkTransactionConfiguration(n);
- DeploymentMode locDepMode = ctx.config().getDeploymentMode();
- DeploymentMode rmtDepMode = n.attribute(IgniteNodeAttributes.ATTR_DEPLOYMENT_MODE);
+ DeploymentMode locDepMode = ctx.config().getDeploymentMode();
+ DeploymentMode rmtDepMode = n.attribute(IgniteNodeAttributes.ATTR_DEPLOYMENT_MODE);
- CU.checkAttributeMismatch(
+ CU.checkAttributeMismatch(
log, null, n.id(), "deploymentMode", "Deployment mode",
locDepMode, rmtDepMode, true);
-
- for (DynamicCacheDescriptor desc : cacheDescriptors()) {
- CacheConfiguration rmtCfg = desc.remoteConfiguration(n.id());
-
- if (rmtCfg != null) {
- CacheConfiguration locCfg = desc.cacheConfiguration();
-
- checkCache(locCfg, rmtCfg, n);
-
- // Check plugin cache configurations.
- CachePluginManager pluginMgr = desc.pluginManager();
-
- pluginMgr.validateRemotes(rmtCfg, n);
- }
- }
- }
}
}
@@ -2690,110 +2678,6 @@ public class GridCacheProcessor extends GridProcessorAdapter {
}
/**
- * Checks that remote caches has configuration compatible with the local.
- *
- * @param locCfg Local configuration.
- * @param rmtCfg Remote configuration.
- * @param rmtNode Remote node.
- * @throws IgniteCheckedException If check failed.
- */
- private void checkCache(CacheConfiguration locCfg, CacheConfiguration rmtCfg, ClusterNode rmtNode) throws IgniteCheckedException {
- ClusterNode locNode = ctx.discovery().localNode();
-
- UUID rmt = rmtNode.id();
-
- GridCacheAttributes rmtAttr = new GridCacheAttributes(rmtCfg);
- GridCacheAttributes locAttr = new GridCacheAttributes(locCfg);
-
- boolean isLocAff = CU.affinityNode(locNode, locCfg.getNodeFilter());
- boolean isRmtAff = CU.affinityNode(rmtNode, rmtCfg.getNodeFilter());
-
- CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "cacheMode", "Cache mode",
- locAttr.cacheMode(), rmtAttr.cacheMode(), true);
-
- if (rmtAttr.cacheMode() != LOCAL) {
- CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "interceptor", "Cache Interceptor",
- locAttr.interceptorClassName(), rmtAttr.interceptorClassName(), true);
-
- CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "atomicityMode",
- "Cache atomicity mode", locAttr.atomicityMode(), rmtAttr.atomicityMode(), true);
-
- CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "cachePreloadMode",
- "Cache preload mode", locAttr.cacheRebalanceMode(), rmtAttr.cacheRebalanceMode(), true);
-
- boolean checkStore = isLocAff && isRmtAff;
-
- if (checkStore)
- CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "storeFactory", "Store factory",
- locAttr.storeFactoryClassName(), rmtAttr.storeFactoryClassName(), true);
-
- CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "cacheAffinity", "Cache affinity",
- locAttr.cacheAffinityClassName(), rmtAttr.cacheAffinityClassName(), true);
-
- CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "cacheAffinityMapper",
- "Cache affinity mapper", locAttr.cacheAffinityMapperClassName(),
- rmtAttr.cacheAffinityMapperClassName(), true);
-
- CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "affinityPartitionsCount",
- "Affinity partitions count", locAttr.affinityPartitionsCount(),
- rmtAttr.affinityPartitionsCount(), true);
-
- CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "evictionFilter", "Eviction filter",
- locAttr.evictionFilterClassName(), rmtAttr.evictionFilterClassName(), true);
-
- CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "evictionPolicy", "Eviction policy",
- locAttr.evictionPolicyClassName(), rmtAttr.evictionPolicyClassName(), true);
-
- CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "transactionManagerLookup",
- "Transaction manager lookup", locAttr.transactionManagerLookupClassName(),
- rmtAttr.transactionManagerLookupClassName(), false);
-
- CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "defaultLockTimeout",
- "Default lock timeout", locAttr.defaultLockTimeout(), rmtAttr.defaultLockTimeout(), false);
-
- CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "preloadBatchSize",
- "Preload batch size", locAttr.rebalanceBatchSize(), rmtAttr.rebalanceBatchSize(), false);
-
- CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "writeSynchronizationMode",
- "Write synchronization mode", locAttr.writeSynchronization(), rmtAttr.writeSynchronization(),
- true);
-
- CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "writeBehindBatchSize",
- "Write behind batch size", locAttr.writeBehindBatchSize(), rmtAttr.writeBehindBatchSize(),
- false);
-
- CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "writeBehindEnabled",
- "Write behind enabled", locAttr.writeBehindEnabled(), rmtAttr.writeBehindEnabled(), false);
-
- CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "writeBehindFlushFrequency",
- "Write behind flush frequency", locAttr.writeBehindFlushFrequency(),
- rmtAttr.writeBehindFlushFrequency(), false);
-
- CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "writeBehindFlushSize",
- "Write behind flush size", locAttr.writeBehindFlushSize(), rmtAttr.writeBehindFlushSize(),
- false);
-
- CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "writeBehindFlushThreadCount",
- "Write behind flush thread count", locAttr.writeBehindFlushThreadCount(),
- rmtAttr.writeBehindFlushThreadCount(), false);
-
- if (locAttr.cacheMode() == PARTITIONED) {
- CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "nearEvictionPolicy",
- "Near eviction policy", locAttr.nearEvictionPolicyClassName(),
- rmtAttr.nearEvictionPolicyClassName(), false);
-
- CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "affinityIncludeNeighbors",
- "Affinity include neighbors", locAttr.affinityIncludeNeighbors(),
- rmtAttr.affinityIncludeNeighbors(), true);
-
- CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "affinityKeyBackups",
- "Affinity key backups", locAttr.affinityKeyBackups(),
- rmtAttr.affinityKeyBackups(), true);
- }
- }
- }
-
- /**
* @param rmt Remote node to check.
* @throws IgniteCheckedException If check failed.
*/
[63/67] [abbrv] ignite git commit: topologyVersion was not
initialized for GridDhtAtomicSingleUpdateRequest.
Posted by sb...@apache.org.
topologyVersion was not initialized for GridDhtAtomicSingleUpdateRequest.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/7d0cc2c4
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/7d0cc2c4
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/7d0cc2c4
Branch: refs/heads/ignite-5075
Commit: 7d0cc2c4df9dca67a981cb1770bb13092535eb9a
Parents: 6579197
Author: sboikov <sb...@gridgain.com>
Authored: Thu May 4 11:23:41 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Thu May 4 11:23:41 2017 +0300
----------------------------------------------------------------------
.../atomic/GridDhtAtomicAbstractUpdateRequest.java | 15 +++++++++++++++
.../dht/atomic/GridDhtAtomicUpdateRequest.java | 7 ++-----
2 files changed, 17 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/7d0cc2c4/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicAbstractUpdateRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicAbstractUpdateRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicAbstractUpdateRequest.java
index 4ff8484..6fb7df6 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicAbstractUpdateRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicAbstractUpdateRequest.java
@@ -138,6 +138,15 @@ public abstract class GridDhtAtomicAbstractUpdateRequest extends GridCacheMessag
setFlag(true, DHT_ATOMIC_KEEP_BINARY_FLAG_MASK);
}
+ /** {@inheritDoc} */
+ @Override public final AffinityTopologyVersion topologyVersion() {
+ return topVer;
+ }
+
+ /**
+ * @param nearNodeId Near node ID.
+ * @param nearFutId Future ID on near node.
+ */
void nearReplyInfo(UUID nearNodeId, long nearFutId) {
assert nearNodeId != null;
@@ -145,10 +154,16 @@ public abstract class GridDhtAtomicAbstractUpdateRequest extends GridCacheMessag
this.nearFutId = nearFutId;
}
+ /**
+ * @return {@code True} if backups should reply immediately.
+ */
boolean replyWithoutDelay() {
return isFlag(DHT_ATOMIC_REPLY_WITHOUT_DELAY);
}
+ /**
+ * @param replyWithoutDelay {@code True} if backups should reply immediately.
+ */
void replyWithoutDelay(boolean replyWithoutDelay) {
setFlag(replyWithoutDelay, DHT_ATOMIC_REPLY_WITHOUT_DELAY);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/7d0cc2c4/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicUpdateRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicUpdateRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicUpdateRequest.java
index 54b2ae7..6f3f530 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicUpdateRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicUpdateRequest.java
@@ -143,6 +143,8 @@ public class GridDhtAtomicUpdateRequest extends GridDhtAtomicAbstractUpdateReque
* @param invokeArgs Optional arguments for entry processor.
* @param syncMode Cache write synchronization mode.
* @param topVer Topology version.
+ * @param keepBinary Keep binary flag.
+ * @param skipStore Skip store flag.
* @param forceTransformBackups Force transform backups flag.
* @param subjId Subject ID.
* @param taskNameHash Task name hash code.
@@ -333,11 +335,6 @@ public class GridDhtAtomicUpdateRequest extends GridDhtAtomicAbstractUpdateReque
}
/** {@inheritDoc} */
- @Override public AffinityTopologyVersion topologyVersion() {
- return topVer;
- }
-
- /** {@inheritDoc} */
@Override public int size() {
return keys.size();
}
[36/67] [abbrv] ignite git commit: IGNITE-5077 - Support service
security permissions
Posted by sb...@apache.org.
IGNITE-5077 - Support service security permissions
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/6236b5f7
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/6236b5f7
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/6236b5f7
Branch: refs/heads/ignite-5075
Commit: 6236b5f7721f92acceb1b3b814d6ce0987178033
Parents: c9a11d4
Author: dkarachentsev <dk...@gridgain.com>
Authored: Fri Apr 28 11:46:23 2017 +0300
Committer: dkarachentsev <dk...@gridgain.com>
Committed: Fri Apr 28 11:46:23 2017 +0300
----------------------------------------------------------------------
.../processors/security/SecurityContext.java | 9 ++++++
.../service/GridServiceProcessor.java | 11 +++++++
.../security/SecurityBasicPermissionSet.java | 17 +++++++++++
.../plugin/security/SecurityPermission.java | 13 ++++++--
.../plugin/security/SecurityPermissionSet.java | 8 +++++
.../security/SecurityPermissionSetBuilder.java | 19 ++++++++++++
.../SecurityPermissionSetBuilderTest.java | 32 ++++++++++++++++----
.../junits/spi/GridSpiAbstractTest.java | 5 +++
8 files changed, 106 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/6236b5f7/modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityContext.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityContext.java
index ef46713..bf5894e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityContext.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/SecurityContext.java
@@ -48,6 +48,15 @@ public interface SecurityContext {
public boolean cacheOperationAllowed(String cacheName, SecurityPermission perm);
/**
+ * Checks whether service operation is allowed.
+ *
+ * @param srvcName Service name.
+ * @param perm Permission to check.
+ * @return {@code True} if task operation is allowed.
+ */
+ public boolean serviceOperationAllowed(String srvcName, SecurityPermission perm);
+
+ /**
* Checks whether system-wide permission is allowed (excluding Visor task operations).
*
* @param perm Permission to check.
http://git-wip-us.apache.org/repos/asf/ignite/blob/6236b5f7/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProcessor.java
index 0c8f857..dda4328 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProcessor.java
@@ -91,6 +91,7 @@ import org.apache.ignite.lang.IgniteCallable;
import org.apache.ignite.lang.IgniteFuture;
import org.apache.ignite.lang.IgniteUuid;
import org.apache.ignite.marshaller.Marshaller;
+import org.apache.ignite.plugin.security.SecurityPermission;
import org.apache.ignite.resources.IgniteInstanceResource;
import org.apache.ignite.resources.JobContextResource;
import org.apache.ignite.resources.LoggerResource;
@@ -490,6 +491,8 @@ public class GridServiceProcessor extends GridProcessorAdapter implements Ignite
validate(cfg);
+ ctx.security().authorize(cfg.getName(), SecurityPermission.SERVICE_DEPLOY, null);
+
if (!state.srvcCompatibility) {
Marshaller marsh = ctx.config().getMarshaller();
@@ -624,6 +627,8 @@ public class GridServiceProcessor extends GridProcessorAdapter implements Ignite
* @return Future.
*/
public IgniteInternalFuture<?> cancel(String name) {
+ ctx.security().authorize(name, SecurityPermission.SERVICE_CANCEL, null);
+
while (true) {
try {
GridFutureAdapter<?> fut = new GridFutureAdapter<>();
@@ -761,6 +766,8 @@ public class GridServiceProcessor extends GridProcessorAdapter implements Ignite
*/
@SuppressWarnings("unchecked")
public <T> T service(String name) {
+ ctx.security().authorize(name, SecurityPermission.SERVICE_INVOKE, null);
+
Collection<ServiceContextImpl> ctxs;
synchronized (locSvcs) {
@@ -825,6 +832,8 @@ public class GridServiceProcessor extends GridProcessorAdapter implements Ignite
@SuppressWarnings("unchecked")
public <T> T serviceProxy(ClusterGroup prj, String name, Class<? super T> svcItf, boolean sticky, long timeout)
throws IgniteException {
+ ctx.security().authorize(name, SecurityPermission.SERVICE_INVOKE, null);
+
if (hasLocalNode(prj)) {
ServiceContextImpl ctx = serviceContext(name);
@@ -864,6 +873,8 @@ public class GridServiceProcessor extends GridProcessorAdapter implements Ignite
*/
@SuppressWarnings("unchecked")
public <T> Collection<T> services(String name) {
+ ctx.security().authorize(name, SecurityPermission.SERVICE_INVOKE, null);
+
Collection<ServiceContextImpl> ctxs;
synchronized (locSvcs) {
http://git-wip-us.apache.org/repos/asf/ignite/blob/6236b5f7/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityBasicPermissionSet.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityBasicPermissionSet.java b/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityBasicPermissionSet.java
index 5b50c56..7521dff 100644
--- a/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityBasicPermissionSet.java
+++ b/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityBasicPermissionSet.java
@@ -38,6 +38,9 @@ public class SecurityBasicPermissionSet implements SecurityPermissionSet {
/** Task permissions. */
private Map<String, Collection<SecurityPermission>> taskPerms = new HashMap<>();
+ /** Service permissions. */
+ private Map<String, Collection<SecurityPermission>> srvcPerms = new HashMap<>();
+
/** System permissions. */
private Collection<SecurityPermission> sysPerms = new ArrayList<>();
@@ -63,6 +66,15 @@ public class SecurityBasicPermissionSet implements SecurityPermissionSet {
}
/**
+ * Setter for set service permission map.
+ *
+ * @param srvcPerms Service permissions.
+ */
+ public void setServicePermissions(Map<String, Collection<SecurityPermission>> srvcPerms) {
+ this.srvcPerms = srvcPerms;
+ }
+
+ /**
* Setter for set collection system permission.
*
* @param sysPerms System permissions.
@@ -91,6 +103,11 @@ public class SecurityBasicPermissionSet implements SecurityPermissionSet {
}
/** {@inheritDoc} */
+ @Override public Map<String, Collection<SecurityPermission>> servicePermissions() {
+ return srvcPerms;
+ }
+
+ /** {@inheritDoc} */
@Nullable @Override public Collection<SecurityPermission> systemPermissions() {
return sysPerms;
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/6236b5f7/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermission.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermission.java b/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermission.java
index 9f63c1e..5436161 100644
--- a/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermission.java
+++ b/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermission.java
@@ -21,7 +21,7 @@ import org.jetbrains.annotations.Nullable;
/**
* Supported security permissions within grid. Permissions
- * are specified on per-cache or per-task level.
+ * are specified on per-cache, per-task or per-service level.
*/
public enum SecurityPermission {
/** Cache {@code read} permission. */
@@ -55,7 +55,16 @@ public enum SecurityPermission {
ADMIN_CACHE,
/** Visor admin operations permissions. */
- ADMIN_OPS;
+ ADMIN_OPS,
+
+ /** Service deploy permission. */
+ SERVICE_DEPLOY,
+
+ /** Service cancel permission. */
+ SERVICE_CANCEL,
+
+ /** Service invoke permission. */
+ SERVICE_INVOKE;
/** Enumerated values. */
private static final SecurityPermission[] VALS = values();
http://git-wip-us.apache.org/repos/asf/ignite/blob/6236b5f7/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermissionSet.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermissionSet.java b/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermissionSet.java
index 2415fad..96340d8 100644
--- a/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermissionSet.java
+++ b/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermissionSet.java
@@ -58,6 +58,14 @@ public interface SecurityPermissionSet extends Serializable {
public Map<String, Collection<SecurityPermission>> cachePermissions();
/**
+ * Map of service names to service permissions. Wildcards are allowed at the
+ * end of service names.
+ *
+ * @return Map of service names to service permissions.
+ */
+ public Map<String, Collection<SecurityPermission>> servicePermissions();
+
+ /**
* Collection of system-wide permissions (events enable/disable, Visor task execution).
*
* @return Collection of system-wide permissions.
http://git-wip-us.apache.org/repos/asf/ignite/blob/6236b5f7/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermissionSetBuilder.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermissionSetBuilder.java b/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermissionSetBuilder.java
index 61ad77c..cf38c0f 100644
--- a/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermissionSetBuilder.java
+++ b/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermissionSetBuilder.java
@@ -57,6 +57,9 @@ public class SecurityPermissionSetBuilder {
/** Task permissions.*/
private Map<String, Collection<SecurityPermission>> taskPerms = new HashMap<>();
+ /** Service permissions.*/
+ private Map<String, Collection<SecurityPermission>> srvcPerms = new HashMap<>();
+
/** System permissions.*/
private List<SecurityPermission> sysPerms = new ArrayList<>();
@@ -100,6 +103,21 @@ public class SecurityPermissionSetBuilder {
}
/**
+ * Append permission set form {@link org.apache.ignite.IgniteServices service} with {@code name}.
+ *
+ * @param name String for map some service to permission set.
+ * @param perms Permissions.
+ * @return SecurityPermissionSetBuilder refer to same permission builder.
+ */
+ public SecurityPermissionSetBuilder appendServicePermissions(String name, SecurityPermission... perms) {
+ validate(toCollection("SERVICE_"), perms);
+
+ append(srvcPerms, name, toCollection(perms));
+
+ return this;
+ }
+
+ /**
* Append permission set form {@link org.apache.ignite.IgniteCache cache} with {@code name}.
*
* @param name String for map some cache to permission set.
@@ -215,6 +233,7 @@ public class SecurityPermissionSetBuilder {
permSet.setDefaultAllowAll(dfltAllowAll);
permSet.setCachePermissions(unmodifiableMap(cachePerms));
permSet.setTaskPermissions(unmodifiableMap(taskPerms));
+ permSet.setServicePermissions(unmodifiableMap(srvcPerms));
permSet.setSystemPermissions(unmodifiableList(sysPerms));
return permSet;
http://git-wip-us.apache.org/repos/asf/ignite/blob/6236b5f7/modules/core/src/test/java/org/apache/ignite/plugin/security/SecurityPermissionSetBuilderTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/plugin/security/SecurityPermissionSetBuilderTest.java b/modules/core/src/test/java/org/apache/ignite/plugin/security/SecurityPermissionSetBuilderTest.java
index f63f9a7..5443cfd 100644
--- a/modules/core/src/test/java/org/apache/ignite/plugin/security/SecurityPermissionSetBuilderTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/plugin/security/SecurityPermissionSetBuilderTest.java
@@ -28,6 +28,8 @@ import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
import static org.apache.ignite.plugin.security.SecurityPermission.CACHE_PUT;
import static org.apache.ignite.plugin.security.SecurityPermission.CACHE_READ;
import static org.apache.ignite.plugin.security.SecurityPermission.CACHE_REMOVE;
+import static org.apache.ignite.plugin.security.SecurityPermission.SERVICE_DEPLOY;
+import static org.apache.ignite.plugin.security.SecurityPermission.SERVICE_INVOKE;
import static org.apache.ignite.plugin.security.SecurityPermission.TASK_CANCEL;
import static org.apache.ignite.plugin.security.SecurityPermission.TASK_EXECUTE;
import static org.apache.ignite.plugin.security.SecurityPermission.EVENTS_ENABLE;
@@ -41,6 +43,7 @@ public class SecurityPermissionSetBuilderTest extends GridCommonAbstractTest {
/**
*
*/
+ @SuppressWarnings({"ThrowableNotThrown", "ArraysAsListWithZeroOrOneArgument"})
public void testPermissionBuilder() {
SecurityBasicPermissionSet exp = new SecurityBasicPermissionSet();
@@ -56,13 +59,18 @@ public class SecurityPermissionSetBuilderTest extends GridCommonAbstractTest {
exp.setTaskPermissions(permTask);
+ Map<String, Collection<SecurityPermission>> permSrvc = new HashMap<>();
+ permSrvc.put("service1", Arrays.asList(SERVICE_DEPLOY));
+ permSrvc.put("service2", Arrays.asList(SERVICE_INVOKE));
+
+ exp.setServicePermissions(permSrvc);
+
exp.setSystemPermissions(Arrays.asList(ADMIN_VIEW, EVENTS_ENABLE));
final SecurityPermissionSetBuilder permsBuilder = new SecurityPermissionSetBuilder();
assertThrows(log, new Callable<Object>() {
- @Override
- public Object call() throws Exception {
+ @Override public Object call() throws Exception {
permsBuilder.appendCachePermissions("cache", ADMIN_VIEW);
return null;
}
@@ -71,8 +79,7 @@ public class SecurityPermissionSetBuilderTest extends GridCommonAbstractTest {
);
assertThrows(log, new Callable<Object>() {
- @Override
- public Object call() throws Exception {
+ @Override public Object call() throws Exception {
permsBuilder.appendTaskPermissions("task", CACHE_READ);
return null;
}
@@ -81,8 +88,7 @@ public class SecurityPermissionSetBuilderTest extends GridCommonAbstractTest {
);
assertThrows(log, new Callable<Object>() {
- @Override
- public Object call() throws Exception {
+ @Override public Object call() throws Exception {
permsBuilder.appendSystemPermissions(TASK_EXECUTE, CACHE_PUT);
return null;
}
@@ -90,6 +96,15 @@ public class SecurityPermissionSetBuilderTest extends GridCommonAbstractTest {
"you can assign permission only start with [EVENTS_, ADMIN_], but you try TASK_EXECUTE"
);
+ assertThrows(log, new Callable<Object>() {
+ @Override public Object call() throws Exception {
+ permsBuilder.appendSystemPermissions(SERVICE_INVOKE, CACHE_REMOVE);
+ return null;
+ }
+ }, IgniteException.class,
+ "you can assign permission only start with [EVENTS_, ADMIN_], but you try SERVICE_INVOKE"
+ );
+
permsBuilder.appendCachePermissions(
"cache1", CACHE_PUT, CACHE_REMOVE
).appendCachePermissions(
@@ -98,12 +113,17 @@ public class SecurityPermissionSetBuilderTest extends GridCommonAbstractTest {
"task1", TASK_CANCEL
).appendTaskPermissions(
"task2", TASK_EXECUTE
+ ).appendServicePermissions(
+ "service1", SERVICE_DEPLOY
+ ).appendServicePermissions(
+ "service2", SERVICE_INVOKE
).appendSystemPermissions(ADMIN_VIEW, EVENTS_ENABLE);
SecurityPermissionSet actual = permsBuilder.build();
assertEquals(exp.cachePermissions(), actual.cachePermissions());
assertEquals(exp.taskPermissions(), actual.taskPermissions());
+ assertEquals(exp.servicePermissions(), actual.servicePermissions());
assertEquals(exp.systemPermissions(), actual.systemPermissions());
assertEquals(exp.defaultAllowAll(), actual.defaultAllowAll());
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/6236b5f7/modules/core/src/test/java/org/apache/ignite/testframework/junits/spi/GridSpiAbstractTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/junits/spi/GridSpiAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/testframework/junits/spi/GridSpiAbstractTest.java
index 091abd7..101d016 100644
--- a/modules/core/src/test/java/org/apache/ignite/testframework/junits/spi/GridSpiAbstractTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/testframework/junits/spi/GridSpiAbstractTest.java
@@ -721,6 +721,11 @@ public abstract class GridSpiAbstractTest<T extends IgniteSpi> extends GridAbstr
}
/** {@inheritDoc} */
+ @Override public Map<String, Collection<SecurityPermission>> servicePermissions() {
+ return Collections.emptyMap();
+ }
+
+ /** {@inheritDoc} */
@Nullable @Override public Collection<SecurityPermission> systemPermissions() {
return null;
}
[23/67] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math
module to Ignite ML module added missed licenses renamed packages fixed wrong
ml profile activation (cherry picked from commit d78e071)
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/Matrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/Matrix.java b/modules/ml/src/main/java/org/apache/ignite/math/Matrix.java
deleted file mode 100644
index ee7a807..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/Matrix.java
+++ /dev/null
@@ -1,518 +0,0 @@
-/*
- * 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.ignite.math;
-
-import java.io.Externalizable;
-import org.apache.ignite.lang.IgniteUuid;
-import org.apache.ignite.math.exceptions.CardinalityException;
-import org.apache.ignite.math.exceptions.IndexException;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.apache.ignite.math.functions.IgniteBiFunction;
-import org.apache.ignite.math.functions.IgniteDoubleFunction;
-import org.apache.ignite.math.functions.IgniteFunction;
-import org.apache.ignite.math.functions.IntIntToDoubleFunction;
-
-/**
- * A matrix interface.
- *
- * Based on its flavor it can have vastly different implementations tailored for
- * for different types of data (e.g. dense vs. sparse), different sizes of data or different operation
- * optimizations.
- *
- * Note also that not all operations can be supported by all underlying implementations. If an operation is not
- * supported a {@link UnsupportedOperationException} is thrown. This exception can also be thrown in partial cases
- * where an operation is unsupported only in special cases, e.g. where a given operation cannot be deterministically
- * completed in polynomial time.
- *
- * Based on ideas from <a href="http://mahout.apache.org/">Apache Mahout</a>.
- */
-public interface Matrix extends MetaAttributes, Externalizable, StorageOpsMetrics, Destroyable {
- /**
- * Holder for matrix's element.
- */
- interface Element {
- /**
- * Gets element's value.
- *
- * @return The value of this matrix element.
- */
- double get();
-
- /**
- * Gets element's row index.
- *
- * @return The row index of this element.
- */
- int row();
-
- /**
- * Gets element's column index.
- *
- * @return The column index of this element.
- */
- int column();
-
- /**
- * Sets element's value.
- *
- * @param val Value to set.
- */
- void set(double val);
- }
-
- /**
- * Gets the maximum value in this matrix.
- *
- * @return Maximum value in this matrix.
- */
- public double maxValue();
-
- /**
- * Gets the minimum value in this matrix.
- *
- * @return Minimum value in this matrix.
- */
- public double minValue();
-
- /**
- * Gets the maximum element in this matrix.
- *
- * @return Maximum element in this matrix.
- */
- public Element maxElement();
-
- /**
- * Gets the minimum element in this matrix.
- *
- * @return Minimum element in this matrix.
- */
- public Element minElement();
-
- /**
- * Gets the matrix's element at the given coordinates.
- *
- * @param row Row index.
- * @param col Column index.
- * @return Element at the given coordinates.
- */
- public Element getElement(int row, int col);
-
- /**
- * Swaps two rows in this matrix.
- *
- * @param row1 Row #1.
- * @param row2 Row #2.
- * @return This matrix.
- */
- public Matrix swapRows(int row1, int row2);
-
- /**
- * Swaps two columns in this matrix.
- *
- * @param col1 Column #1.
- * @param col2 Column #2.
- * @return This matrix.
- */
- public Matrix swapColumns(int col1, int col2);
-
- /**
- * Assigns given value to all elements of this matrix.
- *
- * @param val Value to assign to all elements.
- * @return This matrix.
- */
- public Matrix assign(double val);
-
- /**
- * Assigns given values to this matrix.
- *
- * @param vals Values to assign.
- * @return This matrix.
- * @throws CardinalityException Thrown if cardinalities mismatch.
- */
- public Matrix assign(double[][] vals);
-
- /**
- * Assigns values from given matrix to this matrix.
- *
- * @param mtx Matrix to assign to this matrix.
- * @return This matrix.
- * @throws CardinalityException Thrown if cardinalities mismatch.
- */
- public Matrix assign(Matrix mtx);
-
- /**
- * Assigns each matrix element to the value generated by given function.
- *
- * @param fun Function that takes the row and column and returns the value to assign.
- * @return This matrix.
- */
- public Matrix assign(IntIntToDoubleFunction fun);
-
- /**
- * Maps all values in this matrix through a given function.
- *
- * @param fun Mapping function.
- * @return This matrix.
- */
- public Matrix map(IgniteDoubleFunction<Double> fun);
-
- /**
- * Maps all values in this matrix through a given function.
- *
- * For this matrix <code>A</code>, argument matrix <code>B</code> and the
- * function <code>F</code> this method maps every cell <code>x, y</code> as:
- * <code>A(x,y) = fun(A(x,y), B(x,y))</code>
- *
- * @param mtx Argument matrix.
- * @param fun Mapping function.
- * @return This function.
- * @throws CardinalityException Thrown if cardinalities mismatch.
- */
- public Matrix map(Matrix mtx, IgniteBiFunction<Double, Double, Double> fun);
-
- /**
- * Assigns values from given vector to the specified column in this matrix.
- *
- * @param col Column index.
- * @param vec Vector to get values from.
- * @return This matrix.
- * @throws CardinalityException Thrown if cardinalities mismatch.
- */
- public Matrix assignColumn(int col, Vector vec);
-
- /**
- * Assigns values from given vector to the specified row in this matrix.
- *
- * @param row Row index.
- * @param vec Vector to get values from.
- * @return This matrix.
- * @throws CardinalityException Thrown if cardinalities mismatch.
- */
- public Matrix assignRow(int row, Vector vec);
-
- /**
- * Collects the results of applying a given function to all rows in this matrix.
- *
- * @param fun Aggregating function.
- * @return Vector of row aggregates.
- */
- public Vector foldRows(IgniteFunction<Vector, Double> fun);
-
- /**
- * Collects the results of applying a given function to all columns in this matrix.
- *
- * @param fun Aggregating function.
- * @return Vector of column aggregates.
- */
- public Vector foldColumns(IgniteFunction<Vector, Double> fun);
-
- /**
- * Folds this matrix into a single value.
- *
- * @param foldFun Folding function that takes two parameters: accumulator and the current value.
- * @param mapFun Mapping function that is called on each matrix cell before its passed to the accumulator (as its
- * second parameter).
- * @param <T> Type of the folded value.
- * @param zeroVal Zero value for fold function.
- * @return Folded value of this matrix.
- */
- public <T> T foldMap(IgniteBiFunction<T, Double, T> foldFun, IgniteDoubleFunction<Double> mapFun, T zeroVal);
-
- /**
- * Calculates the density of the matrix based on supplied criteria.
- * Returns {@code true} if this matrix is denser than threshold with at least 80% confidence.
- *
- * @param threshold the threshold value [0, 1] of non-zero elements above which the matrix is considered dense.
- */
- public boolean density(double threshold);
-
- /**
- * Gets number of columns in this matrix.
- *
- * @return The number of columns in this matrix.
- */
- public int columnSize();
-
- /**
- * Gets number of rows in this matrix.
- *
- * @return The number of rows in this matrix.
- */
- public int rowSize();
-
- /**
- * Returns matrix determinant using Laplace theorem.
- *
- * @return A determinant for this matrix.
- * @throws CardinalityException Thrown if matrix is not square.
- */
- public double determinant();
-
- /**
- * Returns the inverse matrix of this matrix
- *
- * @return Inverse of this matrix
- */
- public Matrix inverse();
-
- /**
- * Divides each value in this matrix by the argument.
- *
- * @param x Divider value.
- * @return This matrix.
- */
- public Matrix divide(double x);
-
- /**
- * Gets the matrix value at the provided location.
- *
- * @param row Row index.
- * @param col Column index.
- * @return Matrix value.
- * @throws IndexException Thrown in case of index is out of bound.
- */
- public double get(int row, int col);
-
- /**
- * Gets the matrix value at the provided location without checking boundaries.
- * This method is marginally quicker than its {@link #get(int, int)} sibling.
- *
- * @param row Row index.
- * @param col Column index.
- * @return Matrix value.
- */
- public double getX(int row, int col);
-
- /**
- * Gets matrix storage model.
- */
- public MatrixStorage getStorage();
-
- /**
- * Clones this matrix.
- *
- * NOTE: new matrix will have the same flavor as the this matrix but a different ID.
- *
- * @return New matrix of the same underlying class, the same size and the same values.
- */
- public Matrix copy();
-
- /**
- * Creates new empty matrix of the same underlying class but of different size.
- *
- * NOTE: new matrix will have the same flavor as the this matrix but a different ID.
- *
- * @param rows Number of rows for new matrix.
- * @param cols Number of columns for new matrix.
- * @return New matrix of the same underlying class and size.
- */
- public Matrix like(int rows, int cols);
-
- /**
- * Creates new empty vector of compatible properties (similar or the same flavor) to this matrix.
- *
- * @param crd Cardinality of the vector.
- * @return Newly created empty vector "compatible" to this matrix.
- */
- public Vector likeVector(int crd);
-
- /**
- * Creates new matrix where each value is a difference between corresponding value of this matrix and
- * passed in argument matrix.
- *
- * @param mtx Argument matrix.
- * @return New matrix of the same underlying class and size.
- * @throws CardinalityException Thrown if cardinalities mismatch.
- */
- public Matrix minus(Matrix mtx);
-
- /**
- * Creates new matrix where each value is a sum of the corresponding value of this matrix and
- * argument value.
- *
- * @param x Value to add.
- * @return New matrix of the same underlying class and size.
- */
- public Matrix plus(double x);
-
- /**
- * Creates new matrix where each value is a sum of corresponding values of this matrix and
- * passed in argument matrix.
- *
- * @param mtx Argument matrix.
- * @return New matrix of the same underlying class and size.
- * @throws CardinalityException Thrown if cardinalities mismatch.
- */
- public Matrix plus(Matrix mtx);
-
- /**
- * Auto-generated globally unique matrix ID.
- *
- * @return Matrix GUID.
- */
- public IgniteUuid guid();
-
- /**
- * Sets given value.
- *
- * @param row Row index.
- * @param col Column index.
- * @param val Value to set.
- * @return This matrix.
- * @throws IndexException Thrown in case of either index is out of bound.
- */
- public Matrix set(int row, int col, double val);
-
- /**
- * Sets values for given row.
- *
- * @param row Row index.
- * @param data Row data to set.
- * @return This matrix.
- * @throws IndexException Thrown in case of index is out of bound.
- * @throws CardinalityException Thrown if cardinalities mismatch.
- */
- public Matrix setRow(int row, double[] data);
-
- /**
- * Sets values for given column.
- *
- * @param col Column index.
- * @param data Column data to set.
- * @return This matrix.
- * @throws IndexException Thrown in case of index is out of bound.
- * @throws CardinalityException Thrown if cardinalities mismatch.
- */
- public Matrix setColumn(int col, double[] data);
-
- /**
- * Sets given value without checking for index bounds. This method is marginally faster
- * than its {@link #set(int, int, double)} sibling.
- *
- * @param row Row index.
- * @param col Column index.
- * @param val Value to set.
- * @return This matrix.
- */
- public Matrix setX(int row, int col, double val);
-
- /**
- * Creates new matrix containing the product of given value and values in this matrix.
- *
- * @param x Value to multiply.
- * @return New matrix.
- */
- public Matrix times(double x);
-
- /**
- * Creates new matrix that is the product of multiplying this matrix and the argument matrix.
- *
- * @param mtx Argument matrix.
- * @return New matrix.
- * @throws CardinalityException Thrown if cardinalities mismatch.
- */
- public Matrix times(Matrix mtx);
-
- /**
- * Creates new matrix that is the product of multiplying this matrix and the argument vector.
- *
- * @param vec Argument vector.
- * @return New matrix.
- * @throws CardinalityException Thrown if cardinalities mismatch.
- */
- public Vector times(Vector vec);
-
- /**
- * Gets maximum absolute row sum norm of this matrix.
- * See http://mathworld.wolfram.com/MaximumAbsoluteRowSumNorm.html
- *
- * @return Maximum absolute row sum norm of this matrix.
- */
- public double maxAbsRowSumNorm();
-
- /**
- * Gets sum of all elements in the matrix.
- *
- * @return Sum of all elements in this matrix.
- */
- public double sum();
-
- /**
- * Creates new matrix that is transpose of this matrix.
- *
- * @return New transposed matrix.
- */
- public Matrix transpose();
-
- /**
- * Creates new view into this matrix. Changes to the view will be propagated to this matrix.
- *
- * @param off View offset as <code>int[x,y]</code>.
- * @param size View size as <code>int[rows, cols]</code>
- * @return New view.
- * @throws CardinalityException Thrown if cardinalities mismatch.
- * @throws IndexException Thrown in case of offset is out of bound.
- */
- public Matrix viewPart(int[] off, int[] size);
-
- /**
- * Creates new view into this matrix. Changes to the view will be propagated to this matrix.
- *
- * @param rowOff
- * @param rows
- * @param colOff
- * @param cols
- * @return New view.
- * @throws CardinalityException Thrown if cardinalities mismatch.
- * @throws IndexException Thrown in case of offset is out of bound.
- */
- public Matrix viewPart(int rowOff, int rows, int colOff, int cols);
-
- /**
- * Creates new view into matrix row. Changes to the view will be propagated to this matrix.
- *
- * @param row Row index.
- * @return New view.
- * @throws IndexException Thrown in case of index is out of bound.
- */
- public Vector viewRow(int row);
-
- /**
- * Creates new view into matrix column . Changes to the view will be propagated to this matrix.
- *
- * @param col Column index.
- * @return New view.
- * @throws IndexException Thrown in case of index is out of bound.
- */
- public Vector viewColumn(int col);
-
- /**
- * Creates new view into matrix diagonal. Changes to the view will be propagated to this matrix.
- *
- * @return New view.
- */
- public Vector viewDiagonal();
-
- /**
- * Destroys matrix if managed outside of JVM. It's a no-op in all other cases.
- */
- public default void destroy() {
- // No-op.
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/MatrixKeyMapper.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/MatrixKeyMapper.java b/modules/ml/src/main/java/org/apache/ignite/math/MatrixKeyMapper.java
deleted file mode 100644
index d6ae06f..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/MatrixKeyMapper.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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.ignite.math;
-
-/**
- * Maps {@link Matrix} row and column index to cache key.
- */
-public interface MatrixKeyMapper<K> extends KeyMapper<K> {
- /**
- * @param x Matrix row index.
- * @param y Matrix column index.
- * @return Cache key for given row and column.
- */
- public K apply(int x, int y);
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/MatrixStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/MatrixStorage.java b/modules/ml/src/main/java/org/apache/ignite/math/MatrixStorage.java
deleted file mode 100644
index 11eced7..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/MatrixStorage.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * 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.ignite.math;
-
-import java.io.Externalizable;
-
-/**
- * Data storage support for {@link Matrix}.
- */
-public interface MatrixStorage extends Externalizable, StorageOpsMetrics, Destroyable {
- /**
- * @param x Matrix row index.
- * @param y Matrix column index.
- * @return Value corresponding to given row and column.
- */
- public double get(int x, int y);
-
- /**
- * @param x Matrix row index.
- * @param y Matrix column index.
- * @param v Value to set at given row and column.
- */
- public void set(int x, int y, double v);
-
- /**
- *
- */
- public int columnSize();
-
- /**
- *
- */
- public int rowSize();
-
- /**
- * Gets underlying array if {@link StorageOpsMetrics#isArrayBased()} returns {@code true}.
- *
- * @see StorageOpsMetrics#isArrayBased()
- */
- default public double[][] data() {
- return null;
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/MetaAttributes.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/MetaAttributes.java b/modules/ml/src/main/java/org/apache/ignite/math/MetaAttributes.java
deleted file mode 100644
index 8973b55..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/MetaAttributes.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * 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.ignite.math;
-
-import java.util.Map;
-
-/**
- * Interface provides support for meta attributes on vectors and matrices.
- */
-public interface MetaAttributes {
- /**
- * Implementation should return an instance of the map to store meta attributes.
- */
- public Map<String, Object> getMetaStorage();
-
- /**
- * Gets meta attribute with given name.
- *
- * @param name Name of the vector meta attribute to get.
- * @param <T> Attribute's type.
- */
- @SuppressWarnings("unchecked")
- public default <T> T getAttribute(String name) {
- return (T)getMetaStorage().get(name);
- }
-
- /**
- * Sets meta attribute with given name and value.
- *
- * @param name Name of the meta attribute.
- * @param val Attribute value.
- * @param <T> Attribute's type.
- */
- public default <T> void setAttribute(String name, T val) {
- getMetaStorage().put(name, val);
- }
-
- /**
- * Removes meta attribute with given name.
- *
- * @param name Name of the meta attribute.
- * @return {@code true} if attribute was present and was removed, {@code false} otherwise.
- */
- public default boolean removeAttribute(String name) {
- boolean is = getMetaStorage().containsKey(name);
-
- if (is)
- getMetaStorage().remove(name);
-
- return is;
- }
-
- /**
- * Checks if given meta attribute is present.
- *
- * @param name Attribute name to check.
- */
- public default boolean hasAttribute(String name) {
- return getMetaStorage().containsKey(name);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/MurmurHash.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/MurmurHash.java b/modules/ml/src/main/java/org/apache/ignite/math/MurmurHash.java
deleted file mode 100644
index 3d1252e..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/MurmurHash.java
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- * 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.ignite.math;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-/**
- * This is a very fast, non-cryptographic hash suitable for general hash-based lookup.
- *
- * See http://murmurhash.googlepages.com/ for mre details.
- */
-public class MurmurHash {
- /** Hide it. */
- private MurmurHash() {
- }
-
- /**
- * This produces exactly the same hash values as the final C+ version of MurmurHash3 and is
- * thus suitable for producing the same hash values across platforms.
- *
- * The 32 bit x86 version of this hash should be the fastest variant for relatively short keys like IDs.
- *
- * Note - The x86 and x64 versions do _not_ produce the same results, as the algorithms are
- * optimized for their respective platforms.
- *
- * See also http://github.com/yonik/java_util for future updates to this method.
- *
- * @param data
- * @param off
- * @param len
- * @param seed
- * @return 32 bit hash platform compatible with C++ MurmurHash3 implementation on x86.
- */
- public static int hash3X86(byte[] data, int off, int len, int seed) {
- int c1 = 0xcc9e2d51;
- int c2 = 0x1b873593;
-
- int h1 = seed;
- int roundedEnd = off + (len & 0xfffffffc); // Round down to 4 byte block.
-
- for (int i = off; i < roundedEnd; i += 4) {
- int k1 = (data[i] & 0xff) | ((data[i + 1] & 0xff) << 8) | ((data[i + 2] & 0xff) << 16) | (data[i + 3] << 24);
-
- k1 *= c1;
- k1 = (k1 << 15) | (k1 >>> 17);
- k1 *= c2;
-
- h1 ^= k1;
- h1 = (h1 << 13) | (h1 >>> 19);
- h1 = h1 * 5 + 0xe6546b64;
- }
-
- // Tail.
- int k1 = 0;
-
- switch (len & 0x03) {
- case 3:
- k1 = (data[roundedEnd + 2] & 0xff) << 16;
- // Fallthrough - WTF?
- case 2:
- k1 |= (data[roundedEnd + 1] & 0xff) << 8;
- // Fallthrough - WTF?
- case 1:
- k1 |= data[roundedEnd] & 0xff;
- k1 *= c1;
- k1 = (k1 << 15) | (k1 >>> 17);
- k1 *= c2;
- h1 ^= k1;
- default:
- }
-
- // Finalization.
- h1 ^= len;
-
- h1 ^= h1 >>> 16;
- h1 *= 0x85ebca6b;
- h1 ^= h1 >>> 13;
- h1 *= 0xc2b2ae35;
- h1 ^= h1 >>> 16;
-
- return h1;
- }
-
- /**
- * Hashes an int.
- *
- * @param data The int to hash.
- * @param seed The seed for the hash.
- * @return The 32 bit hash of the bytes in question.
- */
- public static int hash(int data, int seed) {
- byte[] arr = new byte[] {
- (byte)(data >>> 24),
- (byte)(data >>> 16),
- (byte)(data >>> 8),
- (byte)data
- };
-
- return hash(ByteBuffer.wrap(arr), seed);
- }
-
- /**
- * Hashes bytes in an array.
- *
- * @param data The bytes to hash.
- * @param seed The seed for the hash.
- * @return The 32 bit hash of the bytes in question.
- */
- public static int hash(byte[] data, int seed) {
- return hash(ByteBuffer.wrap(data), seed);
- }
-
- /**
- * Hashes bytes in part of an array.
- *
- * @param data The data to hash.
- * @param off Where to start munging.
- * @param len How many bytes to process.
- * @param seed The seed to start with.
- * @return The 32-bit hash of the data in question.
- */
- public static int hash(byte[] data, int off, int len, int seed) {
- return hash(ByteBuffer.wrap(data, off, len), seed);
- }
-
- /**
- * Hashes the bytes in a buffer from the current position to the limit.
- *
- * @param buf The bytes to hash.
- * @param seed The seed for the hash.
- * @return The 32 bit murmur hash of the bytes in the buffer.
- */
- public static int hash(ByteBuffer buf, int seed) {
- ByteOrder byteOrder = buf.order();
- buf.order(ByteOrder.LITTLE_ENDIAN);
-
- int m = 0x5bd1e995;
- int r = 24;
-
- int h = seed ^ buf.remaining();
-
- while (buf.remaining() >= 4) {
- int k = buf.getInt();
-
- k *= m;
- k ^= k >>> r;
- k *= m;
-
- h *= m;
- h ^= k;
- }
-
- if (buf.remaining() > 0) {
- ByteBuffer finish = ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN);
-
- finish.put(buf).rewind();
-
- h ^= finish.getInt();
- h *= m;
- }
-
- h ^= h >>> 13;
- h *= m;
- h ^= h >>> 15;
-
- buf.order(byteOrder);
-
- return h;
- }
-
- /**
- * @param data
- * @param seed
- */
- public static long hash64A(byte[] data, int seed) {
- return hash64A(ByteBuffer.wrap(data), seed);
- }
-
- /**
- * @param data
- * @param off
- * @param len
- * @param seed
- */
- public static long hash64A(byte[] data, int off, int len, int seed) {
- return hash64A(ByteBuffer.wrap(data, off, len), seed);
- }
-
- /**
- * @param buf
- * @param seed
- */
- public static long hash64A(ByteBuffer buf, int seed) {
- ByteOrder byteOrder = buf.order();
- buf.order(ByteOrder.LITTLE_ENDIAN);
-
- long m = 0xc6a4a7935bd1e995L;
- int r = 47;
-
- long h = seed ^ (buf.remaining() * m);
-
- while (buf.remaining() >= 8) {
- long k = buf.getLong();
-
- k *= m;
- k ^= k >>> r;
- k *= m;
-
- h ^= k;
- h *= m;
- }
-
- if (buf.remaining() > 0) {
- ByteBuffer finish = ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN);
-
- finish.put(buf).rewind();
-
- h ^= finish.getLong();
- h *= m;
- }
-
- h ^= h >>> r;
- h *= m;
- h ^= h >>> r;
-
- buf.order(byteOrder);
-
- return h;
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/StorageConstants.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/StorageConstants.java b/modules/ml/src/main/java/org/apache/ignite/math/StorageConstants.java
deleted file mode 100644
index e8bfdf6..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/StorageConstants.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * 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.ignite.math;
-
-/**
- * Support for different modes of accessing data storage.
- */
-public interface StorageConstants {
- /** Storage mode optimized for sequential access. */
- public static final int SEQUENTIAL_ACCESS_MODE = 1001;
-
- /** Storage mode optimized for random access. */
- public static final int RANDOM_ACCESS_MODE = 1002;
-
- /** Storage mode optimized for row access. */
- public static final int ROW_STORAGE_MODE = 2001;
-
- /** Storage mode optimized for column access. */
- public static final int COLUMN_STORAGE_MODE = 2002;
-
- /**
- * @param mode Access mode to verify.
- */
- public default void assertAccessMode(int mode) {
- assert mode == SEQUENTIAL_ACCESS_MODE || mode == RANDOM_ACCESS_MODE;
- }
-
- /**
- * @param mode Storage mode to verify.
- */
- public default void assertStorageMode(int mode) {
- assert mode == ROW_STORAGE_MODE || mode == COLUMN_STORAGE_MODE;
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/StorageOpsMetrics.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/StorageOpsMetrics.java b/modules/ml/src/main/java/org/apache/ignite/math/StorageOpsMetrics.java
deleted file mode 100644
index c3252ba..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/StorageOpsMetrics.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * 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.ignite.math;
-
-/**
- * Storage and operation cost characteristics.
- */
-public interface StorageOpsMetrics {
- /**
- * Checks if this implementation should be considered to be iterable in index order in an efficient way.
- */
- public boolean isSequentialAccess();
-
- /**
- * Checks if this implementation is optimized for random access.
- */
- public boolean isRandomAccess();
-
- /**
- * Checks if this implementation should be considered dense so that it explicitly
- * represents every value.
- */
- public boolean isDense();
-
- /**
- * Checks if implementation is based on Java arrays.
- */
- public boolean isArrayBased();
-
- /**
- * Checks whether implementation is JVM-local or distributed (multi-JVM).
- */
- public boolean isDistributed();
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/Tracer.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/Tracer.java b/modules/ml/src/main/java/org/apache/ignite/math/Tracer.java
deleted file mode 100644
index 89d4669..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/Tracer.java
+++ /dev/null
@@ -1,456 +0,0 @@
-/*
- * 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.ignite.math;
-
-import java.awt.Color;
-import java.awt.Desktop;
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.nio.file.StandardOpenOption;
-import java.util.Locale;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-import org.apache.ignite.IgniteLogger;
-import org.apache.ignite.lang.IgniteUuid;
-
-/**
- * Utility methods to support output of {@link Vector} and {@link Matrix} instances to plain text or HTML.
- */
-public class Tracer {
- /**
- * Double to color mapper.
- */
- public interface ColorMapper extends Function<Double, Color> {
- }
-
- /** Continuous red-to-blue color mapping. */
- static private ColorMapper defaultColorMapper(double min, double max) {
- double range = max - min;
-
- return new ColorMapper() {
- /** {@inheritDoc} */
- @Override public Color apply(Double d) {
- int r = (int)Math.round(255 * d);
- int g = 0;
- int b = (int)Math.round(255 * (1 - d));
-
- return new Color(r, g, b);
- }
- };
- }
-
- /**
- * Default vector color mapper implementation that map given double value
- * to continuous red-blue (R_B) specter.
- *
- * @param vec Vector to map.
- * @return {@link ColorMapper} for the given vector.
- */
- static private ColorMapper mkVectorColorMapper(Vector vec) {
- return defaultColorMapper(vec.minValue(), vec.maxValue());
- }
-
- /** Default matrix color mapper implementation that map given double value
- * to continuous red-blue (R_B) specter.
- * @param mtx Matrix to be mapped.
- * @return Color mapper for given matrix.
- */
- static private ColorMapper mkMatrixColorMapper(Matrix mtx) {
- return defaultColorMapper(mtx.minValue(), mtx.maxValue());
- }
-
- /**
- * @param vec Vector to show.
- * @param log {@link IgniteLogger} instance for output.
- * @param fmt Format string for vector elements.
- */
- public static void showAscii(Vector vec, IgniteLogger log, String fmt) {
- String cls = vec.getClass().getSimpleName();
-
- log.info(String.format("%s(%d) [%s]", cls, vec.size(), mkString(vec, fmt)));
- }
-
- /**
- * @param vec Vector to show as plain text.
- * @param log {@link IgniteLogger} instance for output.
- */
- public static void showAscii(Vector vec, IgniteLogger log) {
- showAscii(vec, log, "%4f");
- }
-
- /**
- * @param vec Vector to show as plain text.
- * @param fmt Format string for vector elements.
- */
- public static void showAscii(Vector vec, String fmt) {
- String cls = vec.getClass().getSimpleName();
-
- System.out.println(String.format("%s(%d) [%s]", cls, vec.size(), mkString(vec, fmt)));
- }
-
- /**
- * @param mtx Matrix to show as plain text.
- */
- public static void showAscii(Matrix mtx) {
- showAscii(mtx, "%4f");
- }
-
- /**
- * @param mtx Matrix to show.
- * @param row Matrix row to output.
- * @param fmt Format string for matrix elements in the row.
- * @return String representation of given matrix row according to given format.
- */
- static private String rowStr(Matrix mtx, int row, String fmt) {
- StringBuilder buf = new StringBuilder();
-
- boolean first = true;
-
- int cols = mtx.columnSize();
-
- for (int col = 0; col < cols; col++) {
- String s = String.format(fmt, mtx.get(row, col));
-
- if (!first)
- buf.append(", ");
-
- buf.append(s);
-
- first = false;
- }
-
- return buf.toString();
- }
-
- /**
- * @param mtx {@link Matrix} object to show as a plain text.
- * @param fmt Format string for matrix rows.
- */
- public static void showAscii(Matrix mtx, String fmt) {
- String cls = mtx.getClass().getSimpleName();
-
- int rows = mtx.rowSize();
- int cols = mtx.columnSize();
-
- System.out.println(String.format("%s(%dx%d)", cls, rows, cols));
-
- for (int row = 0; row < rows; row++)
- System.out.println(rowStr(mtx, row, fmt));
- }
-
- /**
- * @param mtx {@link Matrix} object to show as a plain text.
- * @param log {@link IgniteLogger} instance to output the logged matrix.
- * @param fmt Format string for matrix rows.
- */
- public static void showAscii(Matrix mtx, IgniteLogger log, String fmt) {
- String cls = mtx.getClass().getSimpleName();
-
- int rows = mtx.rowSize();
- int cols = mtx.columnSize();
-
- log.info(String.format("%s(%dx%d)", cls, rows, cols));
-
- for (int row = 0; row < rows; row++)
- log.info(rowStr(mtx, row, fmt));
- }
-
- /**
- * @param vec {@link Vector} object to show as a plain text.
- */
- public static void showAscii(Vector vec) {
- showAscii(vec, "%4f");
- }
-
- /**
- * Saves given vector as CSV file.
- *
- * @param vec Vector to save.
- * @param fmt Format to use.
- * @param filePath Path of the file to save to.
- */
- public static void saveAsCsv(Vector vec, String fmt, String filePath) throws IOException {
- String s = mkString(vec, fmt);
-
- Files.write(Paths.get(filePath), s.getBytes(), StandardOpenOption.CREATE, StandardOpenOption.WRITE);
- }
-
- /**
- * Saves given matrix as CSV file.
- *
- * @param mtx Matrix to save.
- * @param fmt Format to use.
- * @param filePath Path of the file to save to.
- */
- public static void saveAsCsv(Matrix mtx, String fmt, String filePath) throws IOException {
- String s = mkString(mtx, fmt);
-
- Files.write(Paths.get(filePath), s.getBytes(), StandardOpenOption.CREATE, StandardOpenOption.WRITE);
- }
-
- /**
- * Shows given matrix in the browser with D3-based visualization.
- *
- * @param mtx Matrix to show.
- * @throws IOException Thrown in case of any errors.
- */
- public static void showHtml(Matrix mtx) throws IOException {
- showHtml(mtx, mkMatrixColorMapper(mtx));
- }
-
- /**
- * Shows given matrix in the browser with D3-based visualization.
- *
- * @param mtx Matrix to show.
- * @param cm Optional color mapper. If not provided - red-to-blue (R_B) mapper will be used.
- * @throws IOException Thrown in case of any errors.
- */
- public static void showHtml(Matrix mtx, ColorMapper cm) throws IOException {
- // Read it every time so that we can change it at runtime.
- String tmpl = fileToString("d3-matrix-template.html");
-
- String cls = mtx.getClass().getSimpleName();
-
- double min = mtx.minValue();
- double max = mtx.maxValue();
-
- openHtmlFile(tmpl.
- replaceAll("/\\*@NAME@\\*/.*\n", "var name = \"" + cls + "\";\n").
- replaceAll("/\\*@MIN@\\*/.*\n", "var min = " + dataColorJson(min, cm.apply(min)) + ";\n").
- replaceAll("/\\*@MAX@\\*/.*\n", "var max = " + dataColorJson(max, cm.apply(max)) + ";\n").
- replaceAll("/\\*@DATA@\\*/.*\n", "var data = " + mkJsArrayString(mtx, cm) + ";\n")
- );
- }
-
- /**
- * Shows given vector in the browser with D3-based visualization.
- *
- * @param vec Vector to show.
- * @throws IOException Thrown in case of any errors.
- */
- public static void showHtml(Vector vec) throws IOException {
- showHtml(vec, mkVectorColorMapper(vec));
- }
-
- /**
- * @param d Value of {@link Matrix} or {@link Vector} element.
- * @param clr {@link Color} to paint.
- * @return JSON representation for given value and color.
- */
- static private String dataColorJson(double d, Color clr) {
- return "{" +
- "d: " + String.format("%4f", d) +
- ", r: " + clr.getRed() +
- ", g: " + clr.getGreen() +
- ", b: " + clr.getBlue() +
- "}";
- }
-
- /**
- * Shows given vector in the browser with D3-based visualization.
- *
- * @param vec Vector to show.
- * @param cm Optional color mapper. If not provided - red-to-blue (R_B) mapper will be used.
- * @throws IOException Thrown in case of any errors.
- */
- public static void showHtml(Vector vec, ColorMapper cm) throws IOException {
- // Read it every time so that we can change it at runtime.
- String tmpl = fileToString("d3-vector-template.html");
-
- String cls = vec.getClass().getSimpleName();
-
- double min = vec.minValue();
- double max = vec.maxValue();
-
- openHtmlFile(tmpl.
- replaceAll("/\\*@NAME@\\*/.*\n", "var name = \"" + cls + "\";\n").
- replaceAll("/\\*@MIN@\\*/.*\n", "var min = " + dataColorJson(min, cm.apply(min)) + ";\n").
- replaceAll("/\\*@MAX@\\*/.*\n", "var max = " + dataColorJson(max, cm.apply(max)) + ";\n").
- replaceAll("/\\*@DATA@\\*/.*\n", "var data = " + mkJsArrayString(vec, cm) + ";\n")
- );
- }
-
- /**
- * Reads file content into the string.
- *
- * @param fileName Name of the file (on classpath) to read.
- * @return Content of the file.
- * @throws IOException If an I/O error of some sort has occurred.
- */
- private static String fileToString(String fileName) throws IOException {
- assert Tracer.class.getResourceAsStream(fileName) != null : "Can't get resource: " + fileName;
-
- InputStreamReader is = new InputStreamReader(Tracer.class.getResourceAsStream(fileName));
-
- String str = new BufferedReader(is).lines().collect(Collectors.joining("\n"));
-
- is.close();
-
- return str;
- }
-
- /**
- * Opens file in the browser with given HTML content.
- *
- * @param html HTML content.
- * @throws IOException Thrown in case of any errors.
- */
- static private void openHtmlFile(String html) throws IOException {
- File temp = File.createTempFile(IgniteUuid.randomUuid().toString(), ".html");
-
- BufferedWriter bw = new BufferedWriter(new FileWriter(temp));
-
- bw.write(html);
-
- bw.close();
-
- Desktop.getDesktop().browse(temp.toURI());
- }
-
- /**
- * Gets string presentation of this vector.
- *
- * @param vec Vector to string-ify.
- * @param fmt {@link String#format(Locale, String, Object...)} format.
- */
- private static String mkString(Vector vec, String fmt) {
- boolean first = true;
-
- StringBuilder buf = new StringBuilder();
-
- for (Vector.Element x : vec.all()) {
- String s = String.format(Locale.US, fmt, x.get());
-
- if (!first) {
- buf.append(", ");
- buf.append(s);
- }
- else {
- buf.append(s);
- first = false;
- }
- }
-
- return buf.toString();
- }
-
- /**
- * Gets JavaScript array presentation of this vector.
- *
- * @param vec Vector to JavaScript-ify.
- * @param cm Color mapper to user.
- */
- private static String mkJsArrayString(Vector vec, ColorMapper cm) {
- boolean first = true;
-
- StringBuilder buf = new StringBuilder();
-
- for (Vector.Element x : vec.all()) {
- double d = x.get();
-
- String s = dataColorJson(d, cm.apply(d));
-
- if (!first)
- buf.append(", ");
-
- buf.append(s);
-
- first = false;
- }
-
- return '[' + buf.toString() + ']';
- }
-
- /**
- * Gets JavaScript array presentation of this vector.
- *
- * @param mtx Matrix to JavaScript-ify.
- * @param cm Color mapper to user.
- */
- private static String mkJsArrayString(Matrix mtx, ColorMapper cm) {
- boolean first = true;
-
- StringBuilder buf = new StringBuilder();
-
- int rows = mtx.rowSize();
- int cols = mtx.columnSize();
-
- for (int row = 0; row < rows; row++) {
- StringBuilder rowBuf = new StringBuilder();
-
- boolean rowFirst = true;
-
- for (int col = 0; col < cols; col++) {
- double d = mtx.get(row, col);
-
- String s = dataColorJson(d, cm.apply(d));
-
- if (!rowFirst)
- rowBuf.append(", ");
-
- rowBuf.append(s);
-
- rowFirst = false;
- }
-
- if (!first)
- buf.append(", ");
-
- buf.append('[').append(rowBuf.toString()).append(']');
-
- first = false;
- }
-
- return '[' + buf.toString() + ']';
- }
-
- /**
- * @param mtx Matrix to log.
- * @param fmt Output format.
- * @return Formatted representation of a matrix.
- */
- private static String mkString(Matrix mtx, String fmt) {
- StringBuilder buf = new StringBuilder();
-
- int rows = mtx.rowSize();
- int cols = mtx.columnSize();
-
- for (int row = 0; row < rows; row++) {
- for (int col = 0; col < cols; col++) {
- String s = String.format(Locale.US, fmt, mtx.get(row, col));
-
- if (col != 0)
- buf.append(", ");
-
- buf.append(s);
-
- if (col == cols - 1 && row != rows - 1)
- buf.append(",\n");
-
- }
- }
-
- return buf.toString();
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/ValueMapper.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/ValueMapper.java b/modules/ml/src/main/java/org/apache/ignite/math/ValueMapper.java
deleted file mode 100644
index 9459bd1..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/ValueMapper.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// @java.file.header
-
-/* _________ _____ __________________ _____
- * __ ____/___________(_)______ /__ ____/______ ____(_)_______
- * _ / __ __ ___/__ / _ __ / _ / __ _ __ `/__ / __ __ \
- * / /_/ / _ / _ / / /_/ / / /_/ / / /_/ / _ / _ / / /
- * \____/ /_/ /_/ \_,__/ \____/ \__,_/ /_/ /_/ /_/
- */
-
-package org.apache.ignite.math;
-
-import java.io.Serializable;
-
-/**
- * Utility mapper that can be used to map arbitrary values types to and from double.
- */
-public interface ValueMapper<V> extends Serializable {
- /**
- * @param v
- */
- public V fromDouble(double v);
-
- /**
- * @param v
- */
- public double toDouble(V v);
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/Vector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/Vector.java b/modules/ml/src/main/java/org/apache/ignite/math/Vector.java
deleted file mode 100644
index ac2a6c7..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/Vector.java
+++ /dev/null
@@ -1,498 +0,0 @@
-/*
- * 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.ignite.math;
-
-import java.io.Externalizable;
-import java.util.Spliterator;
-import java.util.function.IntToDoubleFunction;
-import org.apache.ignite.lang.IgniteUuid;
-import org.apache.ignite.math.exceptions.CardinalityException;
-import org.apache.ignite.math.exceptions.IndexException;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.apache.ignite.math.functions.IgniteBiFunction;
-import org.apache.ignite.math.functions.IgniteDoubleFunction;
-
-/**
- * A vector interface.
- *
- * Based on its flavor it can have vastly different implementations tailored for
- * for different types of data (e.g. dense vs. sparse), different sizes of data or different operation
- * optimizations.
- *
- * Note also that not all operations can be supported by all underlying implementations. If an operation is not
- * supported a {@link UnsupportedOperationException} is thrown. This exception can also be thrown in partial cases
- * where an operation is unsupported only in special cases, e.g. where a given operation cannot be deterministically
- * completed in polynomial time.
- *
- * Based on ideas from <a href="http://mahout.apache.org/">Apache Mahout</a>.
- */
-public interface Vector extends MetaAttributes, Externalizable, StorageOpsMetrics, Destroyable {
- /**
- * Holder for vector's element.
- */
- interface Element {
- /**
- * Gets element's value.
- *
- * @return The value of this vector element.
- */
- double get();
-
- /**
- * Gets element's index in the vector.
- *
- * @return The index of this vector element.
- */
- int index();
-
- /**
- * Sets element's value.
- *
- * @param val Value to set.
- */
- void set(double val);
- }
-
- /**
- * Gets cardinality of this vector (maximum number of the elements).
- *
- * @return This vector's cardinality.
- */
- public int size();
-
- /**
- * Creates new copy of this vector.
- *
- * @return New copy vector.
- */
- public Vector copy();
-
- /**
- * Gets iterator over all elements in this vector.
- *
- * NOTE: implementation can choose to reuse {@link Element} instance so you need to copy it
- * if you want to retain it outside of iteration.
- *
- * @return Iterator.
- */
- public Iterable<Element> all();
-
- /**
- * Iterates ove all non-zero elements in this vector.
- *
- * NOTE: implementation can choose to reuse {@link Element} instance so you need to copy it
- * if you want to retain it outside of iteration.
- *
- * @return Iterator.
- */
- public Iterable<Element> nonZeroes();
-
- /**
- * Gets spliterator for all values in this vector.
- *
- * @return Spliterator for all values.
- */
- public Spliterator<Double> allSpliterator();
-
- /**
- * Gets spliterator for all non-zero values in this vector.
- *
- * @return Spliterator for all non-zero values.
- */
- public Spliterator<Double> nonZeroSpliterator();
-
- /**
- * Sorts this vector in ascending order.
- */
- public Vector sort();
-
- /**
- * Gets element at the given index.
- *
- * NOTE: implementation can choose to reuse {@link Element} instance so you need to copy it
- * if you want to retain it outside of iteration.
- *
- * @param idx Element's index.
- * @return Vector's element at the given index.
- * @throws IndexException Throw if index is out of bounds.
- */
- public Element getElement(int idx);
-
- /**
- * Assigns given value to all elements of this vector.
- *
- * @param val Value to assign.
- * @return This vector.
- */
- public Vector assign(double val);
-
- /**
- * Assigns values from given array to this vector.
- *
- * @param vals Values to assign.
- * @return This vector.
- * @throws CardinalityException Thrown if cardinalities mismatch.
- */
- public Vector assign(double[] vals);
-
- /**
- * Copies values from the argument vector to this one.
- *
- * @param vec Argument vector.
- * @return This vector.
- * @throws CardinalityException Thrown if cardinalities mismatch.
- */
- public Vector assign(Vector vec);
-
- /**
- * Assigns each vector element to the value generated by given function.
- *
- * @param fun Function that takes the index and returns value.
- * @return This vector.
- */
- public Vector assign(IntToDoubleFunction fun);
-
- /**
- * Maps all values in this vector through a given function.
- *
- * @param fun Mapping function.
- * @return This vector.
- */
- public Vector map(IgniteDoubleFunction<Double> fun);
-
- /**
- * Maps all values in this vector through a given function.
- *
- * For this vector <code>A</code>, argument vector <code>B</code> and the
- * function <code>F</code> this method maps every element <code>x</code> as:
- * <code>A(x) = F(A(x), B(x))</code>
- *
- * @param vec Argument vector.
- * @param fun Mapping function.
- * @return This function.
- * @throws CardinalityException Thrown if cardinalities mismatch.
- */
- public Vector map(Vector vec, IgniteBiFunction<Double, Double, Double> fun);
-
- /**
- * Maps all elements of this vector by applying given function to each element with a constant
- * second parameter <code>y</code>.
- *
- * @param fun Mapping function.
- * @param y Second parameter for mapping function.
- * @return This vector.
- */
- public Vector map(IgniteBiFunction<Double, Double, Double> fun, double y);
-
- /**
- * Creates new vector containing values from this vector divided by the argument.
- *
- * @param x Division argument.
- * @return New vector.
- */
- public Vector divide(double x);
-
- /**
- * Gets dot product of two vectors.
- *
- * @param vec Argument vector.
- * @return Dot product of two vectors.
- */
- public double dot(Vector vec);
-
- /**
- * Gets the value at specified index.
- *
- * @param idx Vector index.
- * @return Vector value.
- * @throws IndexException Throw if index is out of bounds.
- */
- public double get(int idx);
-
- /**
- * Gets the value at specified index without checking for index boundaries.
- *
- * @param idx Vector index.
- * @return Vector value.
- */
- public double getX(int idx);
-
- /**
- * Creates new empty vector of the same underlying class but of different cardinality.
- *
- * @param crd Cardinality for new vector.
- * @return New vector.
- */
- public Vector like(int crd);
-
- /**
- * Creates new matrix of compatible flavor with given size.
- *
- * @param rows Number of rows.
- * @param cols Number of columns.
- * @return New matrix.
- */
- public Matrix likeMatrix(int rows, int cols);
-
- /**
- * Converts this vector into [N x 1] or [1 x N] matrix where N is this vector cardinality.
- *
- * @param rowLike {@code true} for rowLike [N x 1], or {@code false} for column [1 x N] matrix.
- * @return Newly created matrix.
- */
- public Matrix toMatrix(boolean rowLike);
-
- /**
- * Converts this vector into [N+1 x 1] or [1 x N+1] matrix where N is this vector cardinality.
- * (0,0) element of this matrix will be {@code zeroVal} parameter.
- *
- * @param rowLike {@code true} for rowLike [N+1 x 1], or {@code false} for column [1 x N+1] matrix.
- * @return Newly created matrix.
- */
- public Matrix toMatrixPlusOne(boolean rowLike, double zeroVal);
-
- /**
- * Creates new vector containing element by element difference between this vector and the argument one.
- *
- * @param vec Argument vector.
- * @return New vector.
- * @throws CardinalityException Thrown if cardinalities mismatch.
- */
- public Vector minus(Vector vec);
-
- /**
- * Creates new vector containing the normalized (L_2 norm) values of this vector.
- *
- * @return New vector.
- */
- public Vector normalize();
-
- /**
- * Creates new vector containing the normalized (L_power norm) values of this vector.
- * See http://en.wikipedia.org/wiki/Lp_space for details.
- *
- * @param power The power to use. Must be >= 0. May also be {@link Double#POSITIVE_INFINITY}.
- * @return New vector {@code x} such that {@code norm(x, power) == 1}
- */
- public Vector normalize(double power);
-
- /**
- * Creates new vector containing the {@code log(1 + entry) / L_2 norm} values of this vector.
- *
- * @return New vector.
- */
- public Vector logNormalize();
-
- /**
- * Creates new vector with a normalized value calculated as {@code log_power(1 + entry) / L_power norm}.
- *
- * @param power The power to use. Must be > 1. Cannot be {@link Double#POSITIVE_INFINITY}.
- * @return New vector
- */
- public Vector logNormalize(double power);
-
- /**
- * Gets the k-norm of the vector. See http://en.wikipedia.org/wiki/Lp_space for more details.
- *
- * @param power The power to use.
- * @see #normalize(double)
- */
- public double kNorm(double power);
-
- /**
- * Gets minimal value in this vector.
- *
- * @return Minimal value.
- */
- public double minValue();
-
- /**
- * Gets maximum value in this vector.
- *
- * @return Maximum c.
- */
- public double maxValue();
-
- /**
- * Gets minimal element in this vector.
- *
- * @return Minimal element.
- */
- public Element minElement();
-
- /**
- * Gets maximum element in this vector.
- *
- * @return Maximum element.
- */
- public Element maxElement();
-
- /**
- * Creates new vector containing sum of each element in this vector and argument.
- *
- * @param x Argument value.
- * @return New vector.
- */
- public Vector plus(double x);
-
- /**
- * Creates new vector containing element by element sum from both vectors.
- *
- * @param vec Other argument vector to add.
- * @return New vector.
- * @throws CardinalityException Thrown if cardinalities mismatch.
- */
- public Vector plus(Vector vec);
-
- /**
- * Sets value.
- *
- * @param idx Vector index to set value at.
- * @param val Value to set.
- * @return This vector.
- * @throws IndexException Throw if index is out of bounds.
- */
- public Vector set(int idx, double val);
-
- /**
- * Sets value without checking for index boundaries.
- *
- * @param idx Vector index to set value at.
- * @param val Value to set.
- * @return This vector.
- */
- public Vector setX(int idx, double val);
-
- /**
- * Increments value at given index without checking for index boundaries.
- *
- * @param idx Vector index.
- * @param val Increment value.
- * @return This vector.
- */
- public Vector incrementX(int idx, double val);
-
- /**
- * Increments value at given index.
- *
- * @param idx Vector index.
- * @param val Increment value.
- * @return This vector.
- * @throws IndexException Throw if index is out of bounds.
- */
- public Vector increment(int idx, double val);
-
- /**
- * Gets number of non-zero elements in this vector.
- *
- * @return Number of non-zero elements in this vector.
- */
- public int nonZeroElements();
-
- /**
- * Gets a new vector that contains product of each element and the argument.
- *
- * @param x Multiply argument.
- * @return New vector.
- */
- public Vector times(double x);
-
- /**
- * Gets a new vector that is an element-wie product of this vector and the argument.
- *
- * @param vec Vector to multiply by.
- * @return New vector.
- * @throws CardinalityException Thrown if cardinalities mismatch.
- */
- public Vector times(Vector vec);
-
- /**
- * @param off Offset into parent vector.
- * @param len Length of the view.
- */
- public Vector viewPart(int off, int len);
-
- /**
- * Gets vector storage model.
- */
- public VectorStorage getStorage();
-
- /**
- * Gets the sum of all elements in this vector.
- *
- * @return Vector's sum
- */
- public double sum();
-
- /**
- * Gets the cross product of this vector and the other vector.
- *
- * @param vec Second vector.
- * @return New matrix as a cross product of two vectors.
- */
- public Matrix cross(Vector vec);
-
- /**
- * Folds this vector into a single value.
- *
- * @param foldFun Folding function that takes two parameters: accumulator and the current value.
- * @param mapFun Mapping function that is called on each vector element before its passed to the accumulator (as its
- * second parameter).
- * @param <T> Type of the folded value.
- * @param zeroVal Zero value for fold operation.
- * @return Folded value of this vector.
- */
- public <T> T foldMap(IgniteBiFunction<T, Double, T> foldFun, IgniteDoubleFunction<Double> mapFun, T zeroVal);
-
- /**
- * Combines & maps two vector and folds them into a single value.
- *
- * @param vec Another vector to combine with.
- * @param foldFun Folding function.
- * @param combFun Combine function.
- * @param <T> Type of the folded value.
- * @param zeroVal Zero value for fold operation.
- * @return Folded value of these vectors.
- * @throws CardinalityException Thrown when cardinalities mismatch.
- */
- public <T> T foldMap(Vector vec, IgniteBiFunction<T, Double, T> foldFun, IgniteBiFunction<Double, Double, Double> combFun,
- T zeroVal);
-
- /**
- * Gets the sum of squares of all elements in this vector.
- *
- * @return Length squared value.
- */
- public double getLengthSquared();
-
- /**
- * Get the square of the distance between this vector and the argument vector.
- *
- * @param vec Another vector.
- * @return Distance squared.
- * @throws CardinalityException Thrown if cardinalities mismatch.
- */
- public double getDistanceSquared(Vector vec);
-
- /**
- * Auto-generated globally unique vector ID.
- *
- * @return Vector GUID.
- */
- public IgniteUuid guid();
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/VectorKeyMapper.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/VectorKeyMapper.java b/modules/ml/src/main/java/org/apache/ignite/math/VectorKeyMapper.java
deleted file mode 100644
index 17d76f5..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/VectorKeyMapper.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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.ignite.math;
-
-/**
- * Maps {@link Vector} element index to cache key.
- */
-public interface VectorKeyMapper<K> extends KeyMapper<K> {
- /**
- * @param i Vector element index.
- * @return Cache key for given element index.
- */
- public K apply(int i);
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/VectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/VectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/math/VectorStorage.java
deleted file mode 100644
index f410254..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/VectorStorage.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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.ignite.math;
-
-import java.io.Externalizable;
-
-/**
- * Data storage support for {@link Vector}.
- */
-public interface VectorStorage extends Externalizable, StorageOpsMetrics, Destroyable {
- /**
- *
- *
- */
- public int size();
-
- /**
- * @param i Vector element index.
- * @return Value obtained for given element index.
- */
- public double get(int i);
-
- /**
- * @param i Vector element index.
- * @param v Value to set at given index.
- */
- public void set(int i, double v);
-
- /**
- * Gets underlying array if {@link StorageOpsMetrics#isArrayBased()} returns {@code true}.
- * Returns {@code null} if in other cases.
- *
- * @see StorageOpsMetrics#isArrayBased()
- */
- public default double[] data() {
- return null;
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/decompositions/CholeskyDecomposition.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/decompositions/CholeskyDecomposition.java b/modules/ml/src/main/java/org/apache/ignite/math/decompositions/CholeskyDecomposition.java
deleted file mode 100644
index 9554737..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/decompositions/CholeskyDecomposition.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * 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.ignite.math.decompositions;
-
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.exceptions.CardinalityException;
-import org.apache.ignite.math.exceptions.NonPositiveDefiniteMatrixException;
-import org.apache.ignite.math.exceptions.NonSymmetricMatrixException;
-
-/**
- * Calculates the Cholesky decomposition of a matrix.
- *
- * This class inspired by class from Apache Common Math with similar name.
- *
- * @see <a href="http://mathworld.wolfram.com/CholeskyDecomposition.html">MathWorld</a>
- * @see <a href="http://en.wikipedia.org/wiki/Cholesky_decomposition">Wikipedia</a>
- */
-public class CholeskyDecomposition extends DecompositionSupport {
- /**
- * Default threshold above which off-diagonal elements are considered too different
- * and matrix not symmetric.
- */
- public static final double DFLT_REL_SYMMETRY_THRESHOLD = 1.0e-15;
-
- /**
- * Default threshold below which diagonal elements are considered null
- * and matrix not positive definite.
- */
- public static final double DFLT_ABS_POSITIVITY_THRESHOLD = 1.0e-10;
-
- /** Row-oriented storage for L<sup>T</sup> matrix data. */
- private double[][] lTData;
- /** Cached value of L. */
- private Matrix cachedL;
- /** Cached value of LT. */
- private Matrix cachedLT;
- /** Origin matrix */
- private Matrix origin;
-
- /**
- * Calculates the Cholesky decomposition of the given matrix.
- *
- * Calling this constructor is equivalent to call {@link #CholeskyDecomposition(Matrix, double, double)} with the
- * thresholds set to the default values {@link #DFLT_REL_SYMMETRY_THRESHOLD} and
- * {@link #DFLT_ABS_POSITIVITY_THRESHOLD}.
- *
- * @param mtx the matrix to decompose.
- * @throws CardinalityException if matrix is not square.
- * @see #CholeskyDecomposition(Matrix, double, double)
- * @see #DFLT_REL_SYMMETRY_THRESHOLD
- * @see #DFLT_ABS_POSITIVITY_THRESHOLD
- */
- public CholeskyDecomposition(final Matrix mtx) {
- this(mtx, DFLT_REL_SYMMETRY_THRESHOLD, DFLT_ABS_POSITIVITY_THRESHOLD);
- }
-
- /**
- * Calculates the Cholesky decomposition of the given matrix.
- *
- * @param mtx the matrix to decompose.
- * @param relSymmetryThreshold threshold above which off-diagonal elements are considered too different and matrix
- * not symmetric
- * @param absPositivityThreshold threshold below which diagonal elements are considered null and matrix not positive
- * definite
- * @see #CholeskyDecomposition(Matrix)
- * @see #DFLT_REL_SYMMETRY_THRESHOLD
- * @see #DFLT_ABS_POSITIVITY_THRESHOLD
- */
- public CholeskyDecomposition(final Matrix mtx, final double relSymmetryThreshold,
- final double absPositivityThreshold) {
- assert mtx != null;
-
- if (mtx.columnSize() != mtx.rowSize())
- throw new CardinalityException(mtx.rowSize(), mtx.columnSize());
-
- origin = mtx;
-
- final int order = mtx.rowSize();
-
- lTData = toDoubleArr(mtx);
- cachedL = null;
- cachedLT = null;
-
- // Check the matrix before transformation.
- for (int i = 0; i < order; ++i) {
- final double[] lI = lTData[i];
-
- // Check off-diagonal elements (and reset them to 0).
- for (int j = i + 1; j < order; ++j) {
- final double[] lJ = lTData[j];
-
- final double lIJ = lI[j];
- final double lJI = lJ[i];
-
- final double maxDelta = relSymmetryThreshold * Math.max(Math.abs(lIJ), Math.abs(lJI));
-
- if (Math.abs(lIJ - lJI) > maxDelta)
- throw new NonSymmetricMatrixException(i, j, relSymmetryThreshold);
-
- lJ[i] = 0;
- }
- }
-
- // Transform the matrix.
- for (int i = 0; i < order; ++i) {
- final double[] ltI = lTData[i];
-
- // Check diagonal element.
- if (ltI[i] <= absPositivityThreshold)
- throw new NonPositiveDefiniteMatrixException(ltI[i], i, absPositivityThreshold);
-
- ltI[i] = Math.sqrt(ltI[i]);
- final double inverse = 1.0 / ltI[i];
-
- for (int q = order - 1; q > i; --q) {
- ltI[q] *= inverse;
- final double[] ltQ = lTData[q];
-
- for (int p = q; p < order; ++p)
- ltQ[p] -= ltI[q] * ltI[p];
- }
- }
- }
-
- /** */
- @Override public void destroy() {
- if (cachedL != null)
- cachedL.destroy();
- if (cachedLT != null)
- cachedLT.destroy();
- }
-
- /**
- * Returns the matrix L of the decomposition.
- * <p>L is an lower-triangular matrix</p>
- *
- * @return the L matrix
- */
- public Matrix getL() {
- if (cachedL == null)
- cachedL = getLT().transpose();
-
- return cachedL;
- }
-
- /**
- * Returns the transpose of the matrix L of the decomposition.
- * <p>L<sup>T</sup> is an upper-triangular matrix</p>
- *
- * @return the transpose of the matrix L of the decomposition
- */
- public Matrix getLT() {
-
- if (cachedLT == null) {
- Matrix like = like(origin, origin.rowSize(), origin.columnSize());
- like.assign(lTData);
-
- cachedLT = like;
- }
-
- // return the cached matrix
- return cachedLT;
- }
-
- /**
- * Return the determinant of the matrix
- *
- * @return determinant of the matrix
- */
- public double getDeterminant() {
- double determinant = 1.0;
-
- for (int i = 0; i < lTData.length; ++i) {
- double lTii = lTData[i][i];
- determinant *= lTii * lTii;
- }
-
- return determinant;
- }
-
- /**
- * Solve the linear equation A × X = B for matrices A.
- *
- * @param b right-hand side of the equation A × X = B
- * @return a vector X that minimizes the two norm of A × X - B
- * @throws CardinalityException if the vectors dimensions do not match
- */
- public Vector solve(final Vector b) {
- final int m = lTData.length;
-
- if (b.size() != m)
- throw new CardinalityException(b.size(), m);
-
- final double[] x = b.getStorage().data();
-
- // Solve LY = b
- for (int j = 0; j < m; j++) {
- final double[] lJ = lTData[j];
-
- x[j] /= lJ[j];
-
- final double xJ = x[j];
-
- for (int i = j + 1; i < m; i++)
- x[i] -= xJ * lJ[i];
- }
-
- // Solve LTX = Y
- for (int j = m - 1; j >= 0; j--) {
- x[j] /= lTData[j][j];
-
- final double xJ = x[j];
-
- for (int i = 0; i < j; i++)
- x[i] -= xJ * lTData[i][j];
- }
-
- return likeVector(origin, m).assign(x);
- }
-
- /**
- * Solve the linear equation A × X = B for matrices A.
- *
- * @param b right-hand side of the equation A × X = B
- * @return a matrix X that minimizes the two norm of A × X - B
- * @throws CardinalityException if the matrices dimensions do not match
- */
- public Matrix solve(final Matrix b) {
- final int m = lTData.length;
-
- if (b.rowSize() != m)
- throw new CardinalityException(b.rowSize(), m);
-
- final int nColB = b.columnSize();
- final double[][] x = b.getStorage().data();
-
- // Solve LY = b
- for (int j = 0; j < m; j++) {
- final double[] lJ = lTData[j];
- final double lJJ = lJ[j];
- final double[] xJ = x[j];
-
- for (int k = 0; k < nColB; ++k)
- xJ[k] /= lJJ;
-
- for (int i = j + 1; i < m; i++) {
- final double[] xI = x[i];
- final double lJI = lJ[i];
-
- for (int k = 0; k < nColB; ++k)
- xI[k] -= xJ[k] * lJI;
- }
- }
-
- // Solve LTX = Y
- for (int j = m - 1; j >= 0; j--) {
- final double lJJ = lTData[j][j];
- final double[] xJ = x[j];
-
- for (int k = 0; k < nColB; ++k)
- xJ[k] /= lJJ;
-
- for (int i = 0; i < j; i++) {
- final double[] xI = x[i];
- final double lIJ = lTData[i][j];
-
- for (int k = 0; k < nColB; ++k)
- xI[k] -= xJ[k] * lIJ;
- }
- }
-
- return like(origin, m, b.columnSize()).assign(x);
- }
-
- /** */
- private double[][] toDoubleArr(Matrix mtx) {
- if (mtx.isArrayBased())
- return mtx.getStorage().data();
-
- double[][] res = new double[mtx.rowSize()][];
-
- for (int row = 0; row < mtx.rowSize(); row++) {
- res[row] = new double[mtx.columnSize()];
- for (int col = 0; col < mtx.columnSize(); col++)
- res[row][col] = mtx.get(row, col);
- }
-
- return res;
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/decompositions/DecompositionSupport.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/decompositions/DecompositionSupport.java b/modules/ml/src/main/java/org/apache/ignite/math/decompositions/DecompositionSupport.java
deleted file mode 100644
index 2c76284..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/decompositions/DecompositionSupport.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * 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.ignite.math.decompositions;
-
-import org.apache.ignite.math.Destroyable;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.impls.matrix.CacheMatrix;
-import org.apache.ignite.math.impls.matrix.DenseLocalOnHeapMatrix;
-import org.apache.ignite.math.impls.matrix.PivotedMatrixView;
-import org.apache.ignite.math.impls.matrix.RandomMatrix;
-import org.apache.ignite.math.impls.vector.DenseLocalOnHeapVector;
-
-/**
- * Helper methods to support decomposition of matrix types having some functionality limited.
- */
-public abstract class DecompositionSupport implements Destroyable {
- /**
- * Create the like matrix with read-only matrices support.
- *
- * @param matrix Matrix for like.
- * @return Like matrix.
- */
- protected Matrix like(Matrix matrix) {
- if (isCopyLikeSupport(matrix))
- return new DenseLocalOnHeapMatrix(matrix.rowSize(), matrix.columnSize());
- else
- return matrix.like(matrix.rowSize(), matrix.columnSize());
- }
-
- /**
- * Create the like matrix with specified size with read-only matrices support.
- *
- * @param matrix Matrix for like.
- * @return Like matrix.
- */
- protected Matrix like(Matrix matrix, int rows, int cols) {
- if (isCopyLikeSupport(matrix))
- return new DenseLocalOnHeapMatrix(rows, cols);
- else
- return matrix.like(rows, cols);
- }
-
- /**
- * Create the like vector with read-only matrices support.
- *
- * @param matrix Matrix for like.
- * @param crd Cardinality of the vector.
- * @return Like vector.
- */
- protected Vector likeVector(Matrix matrix, int crd) {
- if (isCopyLikeSupport(matrix))
- return new DenseLocalOnHeapVector(crd);
- else
- return matrix.likeVector(crd);
- }
-
- /**
- * Create the like vector with read-only matrices support.
- *
- * @param matrix Matrix for like.
- * @return Like vector.
- */
- protected Vector likeVector(Matrix matrix) {
- return likeVector(matrix, matrix.rowSize());
- }
-
- /**
- * Create the copy of matrix with read-only matrices support.
- *
- * @param matrix Matrix for copy.
- * @return Copy.
- */
- protected Matrix copy(Matrix matrix) {
- if (isCopyLikeSupport(matrix)) {
- DenseLocalOnHeapMatrix cp = new DenseLocalOnHeapMatrix(matrix.rowSize(), matrix.columnSize());
-
- cp.assign(matrix);
-
- return cp;
- }
- else
- return matrix.copy();
- }
-
- /** */
- private boolean isCopyLikeSupport(Matrix matrix) {
- return matrix instanceof RandomMatrix || matrix instanceof PivotedMatrixView || matrix instanceof CacheMatrix;
- }
-}
[52/67] [abbrv] ignite git commit: IGNITE-5135 .NET: Improve remote
error propagation
Posted by sb...@apache.org.
IGNITE-5135 .NET: Improve remote error propagation
This closes #1899
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/97c2a3ce
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/97c2a3ce
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/97c2a3ce
Branch: refs/heads/ignite-5075
Commit: 97c2a3ce0f1d0a6f30e288bee8102cb107f46ee6
Parents: ed72663
Author: Pavel Tupitsyn <pt...@apache.org>
Authored: Wed May 3 16:45:52 2017 +0300
Committer: Pavel Tupitsyn <pt...@apache.org>
Committed: Wed May 3 16:45:52 2017 +0300
----------------------------------------------------------------------
.../Compute/BinarizableClosureTaskTest.cs | 10 +-
.../Compute/ComputeApiTest.cs | 26 +++++
.../Compute/FailoverTaskSelfTest.cs | 46 +++-----
.../Compute/IgniteExceptionTaskSelfTest.cs | 105 ++++++++++---------
.../Compute/SerializableClosureTaskTest.cs | 30 +++---
.../Log/CustomLoggerTest.cs | 3 +-
.../Compute/ComputeTaskAdapter.cs | 4 +-
.../Closure/ComputeAbstractClosureTask.cs | 3 +-
.../Apache.Ignite.Core/Impl/Compute/Compute.cs | 17 +++
.../Impl/Compute/ComputeJobHolder.cs | 3 +-
.../Impl/Compute/ComputeTaskHolder.cs | 8 +-
11 files changed, 149 insertions(+), 106 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/97c2a3ce/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/BinarizableClosureTaskTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/BinarizableClosureTaskTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/BinarizableClosureTaskTest.cs
index 051917b..e8952bf 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/BinarizableClosureTaskTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/BinarizableClosureTaskTest.cs
@@ -56,9 +56,9 @@ namespace Apache.Ignite.Core.Tests.Compute
{
Assert.IsTrue(res != null);
- BinarizableResult res0 = res as BinarizableResult;
+ var res0 = res as BinarizableResult;
- Assert.IsTrue(res0 != null);
+ Assert.IsNotNull(res0);
Assert.AreEqual(1, res0.Res);
}
@@ -72,9 +72,11 @@ namespace Apache.Ignite.Core.Tests.Compute
if (aggregate != null)
err = aggregate.InnerException;
- BinarizableException err0 = err as BinarizableException;
+ Assert.IsNotNull(err);
- Assert.IsTrue(err0 != null);
+ var err0 = err.InnerException as BinarizableException;
+
+ Assert.IsNotNull(err0);
Assert.AreEqual(ErrMsg, err0.Msg);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/97c2a3ce/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTest.cs
index 02eb266..e403d93 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTest.cs
@@ -1265,6 +1265,22 @@ namespace Apache.Ignite.Core.Tests.Compute
Assert.Throws<BinaryObjectException>(
() => _grid1.GetCompute().Execute<NetSimpleJobArgument, NetSimpleJobResult, NetSimpleTaskResult>(
typeof (NetSimpleTask), new NetSimpleJobArgument(-1)));
+
+ // Local.
+ var ex = Assert.Throws<IgniteException>(() =>
+ _grid1.GetCluster().ForLocal().GetCompute().Broadcast(new ExceptionalComputeAction()));
+
+ Assert.AreEqual("Compute job has failed on local node, examine InnerException for details.", ex.Message);
+ Assert.IsNotNull(ex.InnerException);
+ Assert.AreEqual(ExceptionalComputeAction.ErrorText, ex.InnerException.Message);
+
+ // Remote.
+ ex = Assert.Throws<IgniteException>(() =>
+ _grid1.GetCluster().ForRemotes().GetCompute().Broadcast(new ExceptionalComputeAction()));
+
+ Assert.AreEqual("Compute job has failed on remote node, examine InnerException for details.", ex.Message);
+ Assert.IsNotNull(ex.InnerException);
+ Assert.AreEqual(ExceptionalComputeAction.ErrorText, ex.InnerException.Message);
}
/// <summary>
@@ -1465,6 +1481,16 @@ namespace Apache.Ignite.Core.Tests.Compute
}
}
+ class ExceptionalComputeAction : IComputeAction
+ {
+ public const string ErrorText = "Expected user exception";
+
+ public void Invoke()
+ {
+ throw new OverflowException(ErrorText);
+ }
+ }
+
interface IUserInterface<out T>
{
T Invoke();
http://git-wip-us.apache.org/repos/asf/ignite/blob/97c2a3ce/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/FailoverTaskSelfTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/FailoverTaskSelfTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/FailoverTaskSelfTest.cs
index 9eb87c0..3193e46 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/FailoverTaskSelfTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/FailoverTaskSelfTest.cs
@@ -19,6 +19,7 @@ namespace Apache.Ignite.Core.Tests.Compute
{
using System;
using System.Collections.Generic;
+ using System.Linq;
using Apache.Ignite.Core.Cluster;
using Apache.Ignite.Core.Compute;
using Apache.Ignite.Core.Resource;
@@ -112,45 +113,28 @@ namespace Apache.Ignite.Core.Tests.Compute
/// <summary>
/// Test task.
/// </summary>
- public class TestTask : ComputeTaskAdapter<Tuple<bool, bool>, int, int>
+ private class TestTask : ComputeTaskAdapter<Tuple<bool, bool>, int, int>
{
/** <inheritDoc /> */
- override public IDictionary<IComputeJob<int>, IClusterNode> Map(IList<IClusterNode> subgrid, Tuple<bool, bool> arg)
+ public override IDictionary<IComputeJob<int>, IClusterNode> Map(IList<IClusterNode> subgrid,
+ Tuple<bool, bool> arg)
{
Assert.AreEqual(2, subgrid.Count);
- Tuple<bool, bool> t = arg;
+ var serializable = arg.Item1;
+ var local = arg.Item2;
- bool serializable = t.Item1;
- bool local = t.Item2;
+ var job = serializable
+ ? (IComputeJob<int>) new TestSerializableJob()
+ : new TestBinarizableJob();
- IDictionary<IComputeJob<int>, IClusterNode> jobs = new Dictionary<IComputeJob<int>, IClusterNode>();
+ var node = subgrid.Single(x => x.IsLocal == local);
- IComputeJob<int> job;
-
- if (serializable)
- job = new TestSerializableJob();
- else
- job = new TestBinarizableJob();
-
- foreach (IClusterNode node in subgrid) {
- bool add = local ? node.IsLocal : !node.IsLocal;
-
- if (add)
- {
- jobs.Add(job, node);
-
- break;
- }
- }
-
- Assert.AreEqual(1, jobs.Count);
-
- return jobs;
+ return new Dictionary<IComputeJob<int>, IClusterNode> {{job, node}};
}
/** <inheritDoc /> */
- override public int Reduce(IList<IComputeJobResult<int>> results)
+ public override int Reduce(IList<IComputeJobResult<int>> results)
{
Assert.AreEqual(1, results.Count);
@@ -162,7 +146,7 @@ namespace Apache.Ignite.Core.Tests.Compute
///
/// </summary>
[Serializable]
- class TestClosure : IComputeFunc<int>
+ private class TestClosure : IComputeFunc<int>
{
[InstanceResource]
private readonly IIgnite _grid = null;
@@ -178,7 +162,7 @@ namespace Apache.Ignite.Core.Tests.Compute
///
/// </summary>
[Serializable]
- class TestSerializableJob : IComputeJob<int>
+ private class TestSerializableJob : IComputeJob<int>
{
[InstanceResource]
private readonly IIgnite _grid = null;
@@ -199,7 +183,7 @@ namespace Apache.Ignite.Core.Tests.Compute
/// <summary>
///
/// </summary>
- class TestBinarizableJob : IComputeJob<int>
+ private class TestBinarizableJob : IComputeJob<int>
{
[InstanceResource]
private readonly IIgnite _grid = null;
http://git-wip-us.apache.org/repos/asf/ignite/blob/97c2a3ce/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/IgniteExceptionTaskSelfTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/IgniteExceptionTaskSelfTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/IgniteExceptionTaskSelfTest.cs
index 21cd263..2f9f6b4 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/IgniteExceptionTaskSelfTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/IgniteExceptionTaskSelfTest.cs
@@ -34,10 +34,10 @@ namespace Apache.Ignite.Core.Tests.Compute
public class IgniteExceptionTaskSelfTest : AbstractTaskTest
{
/** Error mode. */
- public static ErrorMode Mode;
+ private static ErrorMode _mode;
/** Observed job errors. */
- public static readonly ICollection<Exception> JobErrs = new List<Exception>();
+ private static readonly ICollection<Exception> JobErrs = new List<Exception>();
/// <summary>
/// Constructor.
@@ -56,7 +56,7 @@ namespace Apache.Ignite.Core.Tests.Compute
[Test]
public void TestMapError()
{
- Mode = ErrorMode.MapErr;
+ _mode = ErrorMode.MapErr;
GoodException e = ExecuteWithError() as GoodException;
@@ -71,7 +71,7 @@ namespace Apache.Ignite.Core.Tests.Compute
[Test]
public void TestMapNotMarshalableError()
{
- Mode = ErrorMode.MapErrNotMarshalable;
+ _mode = ErrorMode.MapErrNotMarshalable;
BadException e = ExecuteWithError() as BadException;
@@ -86,7 +86,7 @@ namespace Apache.Ignite.Core.Tests.Compute
[Test]
public void TestMapNotMarshalableJob()
{
- Mode = ErrorMode.MapJobNotMarshalable;
+ _mode = ErrorMode.MapJobNotMarshalable;
Assert.IsInstanceOf<BinaryObjectException>(ExecuteWithError());
}
@@ -97,15 +97,16 @@ namespace Apache.Ignite.Core.Tests.Compute
[Test]
public void TestLocalJobError()
{
- Mode = ErrorMode.LocJobErr;
+ _mode = ErrorMode.LocJobErr;
int res = Execute();
Assert.AreEqual(1, res);
Assert.AreEqual(4, JobErrs.Count);
- Assert.IsNotNull(JobErrs.First() as GoodException);
- Assert.AreEqual(ErrorMode.LocJobErr, ((GoodException) JobErrs.First()).Mode);
+ var goodEx = JobErrs.First().InnerException as GoodException;
+ Assert.IsNotNull(goodEx);
+ Assert.AreEqual(ErrorMode.LocJobErr, goodEx.Mode);
}
/// <summary>
@@ -114,14 +115,14 @@ namespace Apache.Ignite.Core.Tests.Compute
[Test]
public void TestLocalJobErrorNotMarshalable()
{
- Mode = ErrorMode.LocJobErrNotMarshalable;
+ _mode = ErrorMode.LocJobErrNotMarshalable;
int res = Execute();
Assert.AreEqual(1, res);
Assert.AreEqual(4, JobErrs.Count);
- Assert.IsNotNull(JobErrs.First() as BadException); // Local job exception is not marshalled.
+ Assert.IsInstanceOf<BadException>(JobErrs.First().InnerException); // Local job exception is not marshalled.
}
/// <summary>
@@ -130,7 +131,7 @@ namespace Apache.Ignite.Core.Tests.Compute
[Test]
public void TestLocalJobResultNotMarshalable()
{
- Mode = ErrorMode.LocJobResNotMarshalable;
+ _mode = ErrorMode.LocJobResNotMarshalable;
int res = Execute();
@@ -145,7 +146,7 @@ namespace Apache.Ignite.Core.Tests.Compute
[Test]
public void TestRemoteJobError()
{
- Mode = ErrorMode.RmtJobErr;
+ _mode = ErrorMode.RmtJobErr;
int res = Execute();
@@ -153,9 +154,10 @@ namespace Apache.Ignite.Core.Tests.Compute
Assert.AreEqual(4, JobErrs.Count);
- Assert.IsNotNull(JobErrs.ElementAt(0) as GoodException);
+ var goodEx = JobErrs.First().InnerException as GoodException;
+ Assert.IsNotNull(goodEx);
- Assert.AreEqual(ErrorMode.RmtJobErr, ((GoodException) JobErrs.ElementAt(0)).Mode);
+ Assert.AreEqual(ErrorMode.RmtJobErr, goodEx.Mode);
}
/// <summary>
@@ -164,7 +166,7 @@ namespace Apache.Ignite.Core.Tests.Compute
[Test]
public void TestRemoteJobErrorNotMarshalable()
{
- Mode = ErrorMode.RmtJobErrNotMarshalable;
+ _mode = ErrorMode.RmtJobErrNotMarshalable;
Assert.Throws<SerializationException>(() => Execute());
}
@@ -175,7 +177,7 @@ namespace Apache.Ignite.Core.Tests.Compute
[Test]
public void TestRemoteJobResultNotMarshalable()
{
- Mode = ErrorMode.RmtJobResNotMarshalable;
+ _mode = ErrorMode.RmtJobResNotMarshalable;
int res = Execute();
@@ -192,7 +194,7 @@ namespace Apache.Ignite.Core.Tests.Compute
[Test]
public void TestLocalResultError()
{
- Mode = ErrorMode.LocResErr;
+ _mode = ErrorMode.LocResErr;
GoodException e = ExecuteWithError() as GoodException;
@@ -207,7 +209,7 @@ namespace Apache.Ignite.Core.Tests.Compute
[Test]
public void TestLocalResultErrorNotMarshalable()
{
- Mode = ErrorMode.LocResErrNotMarshalable;
+ _mode = ErrorMode.LocResErrNotMarshalable;
BadException e = ExecuteWithError() as BadException;
@@ -222,7 +224,7 @@ namespace Apache.Ignite.Core.Tests.Compute
[Test]
public void TestRemoteResultError()
{
- Mode = ErrorMode.RmtResErr;
+ _mode = ErrorMode.RmtResErr;
GoodException e = ExecuteWithError() as GoodException;
@@ -237,7 +239,7 @@ namespace Apache.Ignite.Core.Tests.Compute
[Test]
public void TestRemoteResultErrorNotMarshalable()
{
- Mode = ErrorMode.RmtResErrNotMarshalable;
+ _mode = ErrorMode.RmtResErrNotMarshalable;
BadException e = ExecuteWithError() as BadException;
@@ -252,7 +254,7 @@ namespace Apache.Ignite.Core.Tests.Compute
[Test]
public void TestReduceError()
{
- Mode = ErrorMode.ReduceErr;
+ _mode = ErrorMode.ReduceErr;
GoodException e = ExecuteWithError() as GoodException;
@@ -267,7 +269,7 @@ namespace Apache.Ignite.Core.Tests.Compute
[Test]
public void TestReduceErrorNotMarshalable()
{
- Mode = ErrorMode.ReduceErrNotMarshalable;
+ _mode = ErrorMode.ReduceErrNotMarshalable;
BadException e = ExecuteWithError() as BadException;
@@ -282,7 +284,7 @@ namespace Apache.Ignite.Core.Tests.Compute
[Test]
public void TestReduceResultNotMarshalable()
{
- Mode = ErrorMode.ReduceResNotMarshalable;
+ _mode = ErrorMode.ReduceResNotMarshalable;
int res = Execute();
@@ -326,7 +328,7 @@ namespace Apache.Ignite.Core.Tests.Compute
/// <summary>
/// Error modes.
/// </summary>
- public enum ErrorMode
+ private enum ErrorMode
{
/** Error during map step. */
MapErr,
@@ -392,7 +394,7 @@ namespace Apache.Ignite.Core.Tests.Compute
/** <inheritDoc /> */
public IDictionary<IComputeJob<object>, IClusterNode> Map(IList<IClusterNode> subgrid, object arg)
{
- switch (Mode)
+ switch (_mode)
{
case ErrorMode.MapErr:
throw new GoodException(ErrorMode.MapErr);
@@ -424,16 +426,19 @@ namespace Apache.Ignite.Core.Tests.Compute
public ComputeJobResultPolicy OnResult(IComputeJobResult<object> res, IList<IComputeJobResult<object>> rcvd)
{
if (res.Exception != null)
+ {
JobErrs.Add(res.Exception);
+ }
else
{
object res0 = res.Data;
- bool rmt = res0 is GoodJobResult ? ((GoodJobResult)res0).Rmt : ((BadJobResult)res0).Rmt;
+ var result = res0 as GoodJobResult;
+ bool rmt = result != null ? result.Rmt : ((BadJobResult) res0).Rmt;
if (rmt)
{
- switch (Mode)
+ switch (_mode)
{
case ErrorMode.RmtResErr:
throw new GoodException(ErrorMode.RmtResErr);
@@ -444,7 +449,7 @@ namespace Apache.Ignite.Core.Tests.Compute
}
else
{
- switch (Mode)
+ switch (_mode)
{
case ErrorMode.LocResErr:
throw new GoodException(ErrorMode.LocResErr);
@@ -463,7 +468,7 @@ namespace Apache.Ignite.Core.Tests.Compute
/** <inheritDoc /> */
public object Reduce(IList<IComputeJobResult<object>> results)
{
- switch (Mode)
+ switch (_mode)
{
case ErrorMode.ReduceErr:
throw new GoodException(ErrorMode.ReduceErr);
@@ -483,10 +488,10 @@ namespace Apache.Ignite.Core.Tests.Compute
///
/// </summary>
[Serializable]
- public class GoodJob : IComputeJob<object>
+ private class GoodJob : IComputeJob<object>, ISerializable
{
/** Whether the job is remote. */
- private bool _rmt;
+ private readonly bool _rmt;
/// <summary>
///
@@ -502,7 +507,7 @@ namespace Apache.Ignite.Core.Tests.Compute
/// </summary>
/// <param name="info"></param>
/// <param name="context"></param>
- public GoodJob(SerializationInfo info, StreamingContext context)
+ protected GoodJob(SerializationInfo info, StreamingContext context)
{
_rmt = info.GetBoolean("rmt");
}
@@ -518,7 +523,7 @@ namespace Apache.Ignite.Core.Tests.Compute
{
if (_rmt)
{
- switch (Mode)
+ switch (_mode)
{
case ErrorMode.RmtJobErr:
throw new GoodException(ErrorMode.RmtJobErr);
@@ -532,7 +537,7 @@ namespace Apache.Ignite.Core.Tests.Compute
}
else
{
- switch (Mode)
+ switch (_mode)
{
case ErrorMode.LocJobErr:
throw new GoodException(ErrorMode.LocJobErr);
@@ -558,7 +563,7 @@ namespace Apache.Ignite.Core.Tests.Compute
/// <summary>
///
/// </summary>
- public class BadJob : IComputeJob<object>, IBinarizable
+ private class BadJob : IComputeJob<object>, IBinarizable
{
[InstanceResource]
@@ -591,10 +596,10 @@ namespace Apache.Ignite.Core.Tests.Compute
///
/// </summary>
[Serializable]
- public class GoodJobResult
+ private class GoodJobResult : ISerializable
{
/** */
- public bool Rmt;
+ public readonly bool Rmt;
/// <summary>
///
@@ -610,7 +615,7 @@ namespace Apache.Ignite.Core.Tests.Compute
/// </summary>
/// <param name="info"></param>
/// <param name="context"></param>
- public GoodJobResult(SerializationInfo info, StreamingContext context)
+ protected GoodJobResult(SerializationInfo info, StreamingContext context)
{
Rmt = info.GetBoolean("rmt");
}
@@ -625,10 +630,10 @@ namespace Apache.Ignite.Core.Tests.Compute
/// <summary>
///
/// </summary>
- public class BadJobResult : IBinarizable
+ private class BadJobResult : IBinarizable
{
/** */
- public bool Rmt;
+ public readonly bool Rmt;
/// <summary>
///
@@ -656,10 +661,10 @@ namespace Apache.Ignite.Core.Tests.Compute
///
/// </summary>
[Serializable]
- public class GoodTaskResult
+ private class GoodTaskResult : ISerializable
{
/** */
- public int Res;
+ public readonly int Res;
/// <summary>
///
@@ -675,7 +680,7 @@ namespace Apache.Ignite.Core.Tests.Compute
/// </summary>
/// <param name="info"></param>
/// <param name="context"></param>
- public GoodTaskResult(SerializationInfo info, StreamingContext context)
+ protected GoodTaskResult(SerializationInfo info, StreamingContext context)
{
Res = info.GetInt32("res");
}
@@ -690,10 +695,10 @@ namespace Apache.Ignite.Core.Tests.Compute
/// <summary>
///
/// </summary>
- public class BadTaskResult
+ private class BadTaskResult
{
/** */
- public int Res;
+ public readonly int Res;
/// <summary>
///
@@ -709,10 +714,10 @@ namespace Apache.Ignite.Core.Tests.Compute
/// Marshalable exception.
/// </summary>
[Serializable]
- public class GoodException : Exception
+ private class GoodException : Exception
{
/** */
- public ErrorMode Mode;
+ public readonly ErrorMode Mode;
/// <summary>
///
@@ -728,7 +733,7 @@ namespace Apache.Ignite.Core.Tests.Compute
/// </summary>
/// <param name="info"></param>
/// <param name="context"></param>
- public GoodException(SerializationInfo info, StreamingContext context)
+ protected GoodException(SerializationInfo info, StreamingContext context)
{
Mode = (ErrorMode)info.GetInt32("mode");
}
@@ -745,10 +750,10 @@ namespace Apache.Ignite.Core.Tests.Compute
/// <summary>
/// Not marshalable exception.
/// </summary>
- public class BadException : Exception
+ private class BadException : Exception
{
/** */
- public ErrorMode Mode;
+ public readonly ErrorMode Mode;
/// <summary>
///
http://git-wip-us.apache.org/repos/asf/ignite/blob/97c2a3ce/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/SerializableClosureTaskTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/SerializableClosureTaskTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/SerializableClosureTaskTest.cs
index 9f1ae68..ecb4aa5 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/SerializableClosureTaskTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/SerializableClosureTaskTest.cs
@@ -54,11 +54,11 @@ namespace Apache.Ignite.Core.Tests.Compute
/** <inheritDoc /> */
protected override void CheckResult(object res)
{
- Assert.IsTrue(res != null);
+ Assert.IsNotNull(res);
- SerializableResult res0 = res as SerializableResult;
+ var res0 = res as SerializableResult;
- Assert.IsTrue(res0 != null);
+ Assert.IsNotNull(res0);
Assert.AreEqual(1, res0.Res);
}
@@ -72,9 +72,10 @@ namespace Apache.Ignite.Core.Tests.Compute
if (aggregate != null)
err = aggregate.InnerException;
- SerializableException err0 = err as SerializableException;
+ Assert.IsNotNull(err);
+ SerializableException err0 = err.InnerException as SerializableException;
- Assert.IsTrue(err0 != null);
+ Assert.IsNotNull(err0);
Assert.AreEqual(ErrMsg, err0.Msg);
}
@@ -85,12 +86,12 @@ namespace Apache.Ignite.Core.Tests.Compute
private class SerializableOutFunc : IComputeFunc<object>
{
/** Error. */
- private bool _err;
+ private readonly bool _err;
/// <summary>
///
/// </summary>
- public SerializableOutFunc()
+ private SerializableOutFunc()
{
// No-op.
}
@@ -109,6 +110,7 @@ namespace Apache.Ignite.Core.Tests.Compute
{
if (_err)
throw new SerializableException(ErrMsg);
+
return new SerializableResult(1);
}
}
@@ -120,12 +122,12 @@ namespace Apache.Ignite.Core.Tests.Compute
private class SerializableFunc : IComputeFunc<object, object>
{
/** Error. */
- private bool _err;
+ private readonly bool _err;
/// <summary>
///
/// </summary>
- public SerializableFunc()
+ private SerializableFunc()
{
// No-op.
}
@@ -157,12 +159,12 @@ namespace Apache.Ignite.Core.Tests.Compute
private class SerializableException : Exception
{
/** */
- public string Msg;
+ public readonly string Msg;
/// <summary>
///
/// </summary>
- public SerializableException()
+ private SerializableException()
{
// No-op.
}
@@ -180,7 +182,7 @@ namespace Apache.Ignite.Core.Tests.Compute
/// </summary>
/// <param name="info"></param>
/// <param name="context"></param>
- public SerializableException(SerializationInfo info, StreamingContext context) : base(info, context)
+ protected SerializableException(SerializationInfo info, StreamingContext context) : base(info, context)
{
Msg = info.GetString("msg");
}
@@ -200,12 +202,12 @@ namespace Apache.Ignite.Core.Tests.Compute
[Serializable]
private class SerializableResult
{
- public int Res;
+ public readonly int Res;
/// <summary>
///
/// </summary>
- public SerializableResult()
+ private SerializableResult()
{
// No-op.
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/97c2a3ce/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Log/CustomLoggerTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Log/CustomLoggerTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Log/CustomLoggerTest.cs
index 567ca2f..7d4c945 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Log/CustomLoggerTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Log/CustomLoggerTest.cs
@@ -130,7 +130,8 @@ namespace Apache.Ignite.Core.Tests.Log
{
var compute = ignite.GetCluster().ForRemotes().GetCompute();
- Assert.Throws<ArithmeticException>(() => compute.Call(new FailFunc()));
+ var ex = Assert.Throws<IgniteException>(() => compute.Call(new FailFunc()));
+ Assert.IsInstanceOf<ArithmeticException>(ex.InnerException);
// Log updates may not arrive immediately
TestUtils.WaitForCondition(() => TestLogger.Entries.Any(x => x.Exception != null), 3000);
http://git-wip-us.apache.org/repos/asf/ignite/blob/97c2a3ce/modules/platforms/dotnet/Apache.Ignite.Core/Compute/ComputeTaskAdapter.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Compute/ComputeTaskAdapter.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Compute/ComputeTaskAdapter.cs
index 79f32a6..a344b51 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Compute/ComputeTaskAdapter.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Compute/ComputeTaskAdapter.cs
@@ -22,6 +22,7 @@ namespace Apache.Ignite.Core.Compute
using System.Diagnostics.CodeAnalysis;
using Apache.Ignite.Core.Cluster;
using Apache.Ignite.Core.Common;
+ using Apache.Ignite.Core.Impl.Compute;
/// <summary>
/// Convenience adapter for <see cref="IComputeTask{TArg,TJobRes,TTaskRes}"/> interface
@@ -51,8 +52,7 @@ namespace Apache.Ignite.Core.Compute
if (err != null)
{
- if (err is ComputeExecutionRejectedException || err is ClusterTopologyException ||
- err is ComputeJobFailoverException)
+ if (Compute.IsFailoverException(err))
return ComputeJobResultPolicy.Failover;
throw new IgniteException("Remote job threw user exception (override or implement " +
http://git-wip-us.apache.org/repos/asf/ignite/blob/97c2a3ce/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/Closure/ComputeAbstractClosureTask.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/Closure/ComputeAbstractClosureTask.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/Closure/ComputeAbstractClosureTask.cs
index c967c7b..6d6e6a2 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/Closure/ComputeAbstractClosureTask.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/Closure/ComputeAbstractClosureTask.cs
@@ -68,8 +68,7 @@ namespace Apache.Ignite.Core.Impl.Compute.Closure
if (err != null)
{
- if (err is ComputeExecutionRejectedException || err is ClusterTopologyException ||
- err is ComputeJobFailoverException)
+ if (Compute.IsFailoverException(err))
return ComputeJobResultPolicy.Failover;
throw err;
http://git-wip-us.apache.org/repos/asf/ignite/blob/97c2a3ce/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/Compute.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/Compute.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/Compute.cs
index efe5905..b54d6a9 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/Compute.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/Compute.cs
@@ -461,5 +461,22 @@ namespace Apache.Ignite.Core.Impl.Compute
return null;
}
+
+ /// <summary>
+ /// Determines whether specified exception should result in a job failover.
+ /// </summary>
+ internal static bool IsFailoverException(Exception err)
+ {
+ while (err != null)
+ {
+ if (err is ComputeExecutionRejectedException || err is ClusterTopologyException ||
+ err is ComputeJobFailoverException)
+ return true;
+
+ err = err.InnerException;
+ }
+
+ return false;
+ }
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/97c2a3ce/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeJobHolder.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeJobHolder.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeJobHolder.cs
index 6389730..314814d 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeJobHolder.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeJobHolder.cs
@@ -83,7 +83,8 @@ namespace Apache.Ignite.Core.Impl.Compute
_jobRes = new ComputeJobResultImpl(
success ? res : null,
- success ? null : res as Exception,
+ success ? null : new IgniteException("Compute job has failed on local node, " +
+ "examine InnerException for details.", (Exception) res),
_job,
_ignite.GetLocalNode().Id,
cancel
http://git-wip-us.apache.org/repos/asf/ignite/blob/97c2a3ce/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeTaskHolder.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeTaskHolder.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeTaskHolder.cs
index a6d7cb4..489fe44 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeTaskHolder.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeTaskHolder.cs
@@ -327,7 +327,13 @@ namespace Apache.Ignite.Core.Impl.Compute
var data = BinaryUtils.ReadInvocationResult(reader, out err);
// 2. Process the result.
- return (int) JobResult0(new ComputeJobResultImpl(data, (Exception) err, job.Job, nodeId.Value, cancelled));
+ var exception = (Exception) err;
+ exception = exception == null
+ ? null
+ : new IgniteException("Compute job has failed on remote node, " +
+ "examine InnerException for details.", exception);
+
+ return (int) JobResult0(new ComputeJobResultImpl(data, exception, job.Job, nodeId.Value, cancelled));
}
catch (Exception e)
{
[28/67] [abbrv] ignite git commit: Fixed service deployment tests.
Posted by sb...@apache.org.
Fixed service deployment tests.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/9c954c93
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/9c954c93
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/9c954c93
Branch: refs/heads/ignite-5075
Commit: 9c954c93a9d93952354e784a75c45cecdf245a2d
Parents: 27fd74e
Author: Andrey V. Mashenkov <an...@gmail.com>
Authored: Wed Apr 19 06:30:30 2017 +0300
Committer: Andrey V. Mashenkov <an...@gmail.com>
Committed: Wed Apr 19 06:30:30 2017 +0300
----------------------------------------------------------------------
.../GridServiceProcessorAbstractSelfTest.java | 17 +++
...ServiceProcessorMultiNodeConfigSelfTest.java | 40 +++----
.../GridServiceProcessorMultiNodeSelfTest.java | 113 ++++++++++---------
3 files changed, 95 insertions(+), 75 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/9c954c93/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorAbstractSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorAbstractSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorAbstractSelfTest.java
index b9076b9..fafd24e 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorAbstractSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorAbstractSelfTest.java
@@ -30,7 +30,9 @@ import org.apache.ignite.cache.CacheMode;
import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.IgniteInterruptedCheckedException;
import org.apache.ignite.internal.processors.affinity.GridAffinityProcessor;
+import org.apache.ignite.internal.util.lang.GridAbsPredicateX;
import org.apache.ignite.internal.util.typedef.CA;
import org.apache.ignite.internal.util.typedef.X;
import org.apache.ignite.lang.IgniteFuture;
@@ -783,6 +785,21 @@ public abstract class GridServiceProcessorAbstractSelfTest extends GridCommonAbs
}
/**
+ * @param srvcName Service name
+ * @param expectedDeps Expected number of service deployments
+ *
+ */
+ protected boolean waitForDeployment(final String srvcName, final int expectedDeps) throws IgniteInterruptedCheckedException {
+ final Ignite g = randomGrid();
+
+ return GridTestUtils.waitForCondition(new GridAbsPredicateX() {
+ @Override public boolean applyx() {
+ return actualCount(srvcName, g.services().serviceDescriptors()) == expectedDeps;
+ }
+ }, 1500);
+ }
+
+ /**
* Counter service.
*/
protected interface CounterService {
http://git-wip-us.apache.org/repos/asf/ignite/blob/9c954c93/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorMultiNodeConfigSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorMultiNodeConfigSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorMultiNodeConfigSelfTest.java
index 9da62c0..16e5e30 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorMultiNodeConfigSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorMultiNodeConfigSelfTest.java
@@ -22,7 +22,6 @@ import java.util.List;
import java.util.concurrent.CountDownLatch;
import org.apache.ignite.Ignite;
import org.apache.ignite.configuration.CacheConfiguration;
-import org.apache.ignite.internal.IgniteInterruptedCheckedException;
import org.apache.ignite.internal.util.lang.GridAbsPredicateX;
import org.apache.ignite.services.ServiceConfiguration;
import org.apache.ignite.testframework.GridTestUtils;
@@ -213,32 +212,20 @@ public class GridServiceProcessorMultiNodeConfigSelfTest extends GridServiceProc
try {
latch.await();
+ waitForDeployment(name, nodeCount() + 1);
+
checkCount(name, g.services().serviceDescriptors(), nodeCount() + 1);
}
finally {
stopExtraNodes(extraNodes);
}
- assertEquals(name, 1, DummyService.cancelled(name));
-
waitForDeployment(name, nodeCount());
- checkCount(name, g.services().serviceDescriptors(), nodeCount());
- }
-
- /**
- * @param srvcName Service name
- * @param expectedDeps Expected number of service deployments
- *
- */
- private boolean waitForDeployment(final String srvcName, final int expectedDeps) throws IgniteInterruptedCheckedException {
- final Ignite g = randomGrid();
+ // Service can be redeployed when nodes is stopping one-by-one.
+ assertEquals(0, DummyService.started(name) - DummyService.cancelled(name));
- return GridTestUtils.waitForCondition(new GridAbsPredicateX() {
- @Override public boolean applyx() {
- return actualCount(srvcName, g.services().serviceDescriptors()) == expectedDeps;
- }
- }, 1500);
+ checkCount(name, g.services().serviceDescriptors(), nodeCount());
}
/**
@@ -281,8 +268,12 @@ public class GridServiceProcessorMultiNodeConfigSelfTest extends GridServiceProc
try {
latch.await();
- assertEquals(name, newNodes, DummyService.started(name));
- assertEquals(name, 0, DummyService.cancelled(name));
+ waitForDeployment(name, nodeCount() + newNodes);
+
+ assertEquals(name, newNodes, DummyService.started(name) - DummyService.cancelled(name));
+// Next may fails. Server can be restarted on unstable topology.
+// assertEquals(name, newNodes, DummyService.started(name));
+// assertEquals(name, 0, DummyService.cancelled(name));
checkCount(name, g.services().serviceDescriptors(), nodeCount() + newNodes);
}
@@ -314,8 +305,13 @@ public class GridServiceProcessorMultiNodeConfigSelfTest extends GridServiceProc
try {
latch.await();
- assertEquals(name, servers, DummyService.started(name));
- assertEquals(name, 0, DummyService.cancelled(name));
+ waitForDeployment(name, nodeCount() + servers);
+
+ assertEquals(name, servers, DummyService.started(name) - DummyService.cancelled(name));
+// Next may fails. Server can be restarted on unstable topology.
+// assertEquals(name, servers, DummyService.started(name));
+// assertEquals(name, 0, DummyService.cancelled(name));
+
checkCount(name, g.services().serviceDescriptors(), nodeCount() + servers);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/9c954c93/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorMultiNodeSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorMultiNodeSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorMultiNodeSelfTest.java
index 50f5999..32d1462 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorMultiNodeSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorMultiNodeSelfTest.java
@@ -90,7 +90,7 @@ public class GridServiceProcessorMultiNodeSelfTest extends GridServiceProcessorA
// Store a cache key.
g.cache(CACHE_NAME).put(affKey, affKey.toString());
- String name = "serviceAffinityUpdateTopology";
+ final String name = "serviceAffinityUpdateTopology";
IgniteServices svcs = g.services();
@@ -125,9 +125,7 @@ public class GridServiceProcessorMultiNodeSelfTest extends GridServiceProcessorA
Ignite client = startGrid("client", getConfiguration("client").setClientMode(true));
try {
- final int prestartedNodes = nodeCount() + 1;
-
- String name = "serviceOnEachNodeButClientUpdateTopology";
+ final String name = "serviceOnEachNodeButClientUpdateTopology";
Ignite g = randomGrid();
@@ -135,9 +133,9 @@ public class GridServiceProcessorMultiNodeSelfTest extends GridServiceProcessorA
DummyService.exeLatch(name, latch);
- IgniteServices svcs = g.services();
+ IgniteServices svcs = g.services();
- IgniteFuture<?> fut = svcs.deployNodeSingletonAsync(name, new DummyService());
+ IgniteFuture<?> fut = svcs.deployNodeSingletonAsync(name, new DummyService());
info("Deployed service: " + name);
@@ -150,8 +148,8 @@ public class GridServiceProcessorMultiNodeSelfTest extends GridServiceProcessorA
// Ensure service is deployed
assertNotNull(client.services().serviceProxy(name, Service.class, false, 2000));
- TestCase.assertEquals(name, nodeCount(), DummyService.started(name));
- TestCase.assertEquals(name, 0, DummyService.cancelled(name));
+ assertEquals(name, nodeCount(), DummyService.started(name));
+ assertEquals(name, 0, DummyService.cancelled(name));
int servers = 2;
int clients = 2;
@@ -165,12 +163,13 @@ public class GridServiceProcessorMultiNodeSelfTest extends GridServiceProcessorA
try {
latch.await();
- // Ensure service is deployed
- assertNotNull(grid(prestartedNodes + servers - 1)
- .services().serviceProxy(name, Service.class, false, 2000));
+ waitForDeployment(name, servers);
+
+ assertEquals(name, nodeCount() + servers, DummyService.started(name) - DummyService.cancelled(name));
- TestCase.assertEquals(name, nodeCount() + servers, DummyService.started(name));
- TestCase.assertEquals(name, 0, DummyService.cancelled(name));
+// Next may fails. Server can be restarted on unstable topology.
+// assertEquals(name, nodeCount() + servers, DummyService.started(name));
+// assertEquals(name, 0, DummyService.cancelled(name));
checkCount(name, g.services().serviceDescriptors(), nodeCount() + servers);
}
@@ -191,7 +190,7 @@ public class GridServiceProcessorMultiNodeSelfTest extends GridServiceProcessorA
Ignite client = startGrid("client", getConfiguration("client").setClientMode(true));
try {
- String name = "serviceOnEachNodeUpdateTopology";
+ final String name = "serviceOnEachNodeUpdateTopology";
Ignite g = randomGrid();
@@ -223,8 +222,8 @@ public class GridServiceProcessorMultiNodeSelfTest extends GridServiceProcessorA
// Ensure service is deployed
assertNotNull(client.services().serviceProxy(name, Service.class, false, 2000));
- TestCase.assertEquals(name, prestartedNodes, DummyService.started(name));
- TestCase.assertEquals(name, 0, DummyService.cancelled(name));
+ assertEquals(name, prestartedNodes, DummyService.started(name));
+ assertEquals(name, 0, DummyService.cancelled(name));
int servers = 2;
int clients = 2;
@@ -240,11 +239,14 @@ public class GridServiceProcessorMultiNodeSelfTest extends GridServiceProcessorA
try {
latch.await();
- // Ensure service is deployed
- assertNotNull(client.services().serviceProxy(name, Service.class, false, 2000));
+ waitForDeployment(name, prestartedNodes + extraNodes);
+
+ assertEquals(name, prestartedNodes + extraNodes,
+ DummyService.started(name) - DummyService.cancelled(name));
- TestCase.assertEquals(name, prestartedNodes + extraNodes, DummyService.started(name));
- TestCase.assertEquals(name, 0, DummyService.cancelled(name));
+// Next may fails. Server can be restarted on unstable topology.
+// assertEquals(name, prestartedNodes + extraNodes, DummyService.started(name));
+// assertEquals(name, 0, DummyService.cancelled(name));
checkCount(name, g.services().serviceDescriptors(), prestartedNodes + extraNodes);
}
@@ -261,60 +263,65 @@ public class GridServiceProcessorMultiNodeSelfTest extends GridServiceProcessorA
* @throws Exception If failed.
*/
public void testDeployLimits() throws Exception {
- String name = "serviceWithLimitsUpdateTopology";
+ final String name = "serviceWithLimitsUpdateTopology";
- Ignite g = randomGrid();
+ Ignite g = randomGrid();
- final int totalInstances = nodeCount() + 1;
+ final int totalInstances = nodeCount() + 1;
- CountDownLatch latch = new CountDownLatch(nodeCount());
+ CountDownLatch latch = new CountDownLatch(nodeCount());
- DummyService.exeLatch(name, latch);
+ DummyService.exeLatch(name, latch);
- ServiceConfiguration srvcCfg = new ServiceConfiguration();
+ ServiceConfiguration srvcCfg = new ServiceConfiguration();
- srvcCfg.setName(name);
- srvcCfg.setMaxPerNodeCount(1);
- srvcCfg.setTotalCount(totalInstances);
- srvcCfg.setService(new DummyService());
+ srvcCfg.setName(name);
+ srvcCfg.setMaxPerNodeCount(1);
+ srvcCfg.setTotalCount(totalInstances);
+ srvcCfg.setService(new DummyService());
- IgniteServices svcs = g.services().withAsync();
+ IgniteServices svcs = g.services().withAsync();
- svcs.deploy(srvcCfg);
+ svcs.deploy(srvcCfg);
- IgniteFuture<?> fut = svcs.future();
+ IgniteFuture<?> fut = svcs.future();
- info("Deployed service: " + name);
+ info("Deployed service: " + name);
- fut.get();
+ fut.get();
- info("Finished waiting for service future: " + name);
+ info("Finished waiting for service future: " + name);
- latch.await();
+ latch.await();
- TestCase.assertEquals(name, nodeCount(), DummyService.started(name));
- TestCase.assertEquals(name, 0, DummyService.cancelled(name));
+ assertEquals(name, nodeCount(), DummyService.started(name));
+ assertEquals(name, 0, DummyService.cancelled(name));
- checkCount(name, g.services().serviceDescriptors(), nodeCount());
+ checkCount(name, g.services().serviceDescriptors(), nodeCount());
- int extraNodes = 2;
+ int extraNodes = 2;
- latch = new CountDownLatch(1);
+ latch = new CountDownLatch(1);
- DummyService.exeLatch(name, latch);
+ DummyService.exeLatch(name, latch);
- startExtraNodes(2);
+ startExtraNodes(2);
- try {
- latch.await();
+ try {
+ latch.await();
- TestCase.assertEquals(name, totalInstances, DummyService.started(name));
- TestCase.assertEquals(name, 0, DummyService.cancelled(name));
+ waitForDeployment(name, totalInstances);
- checkCount(name, g.services().serviceDescriptors(), totalInstances);
- }
- finally {
- stopExtraNodes(extraNodes);
- }
+ assertEquals(name, totalInstances, DummyService.started(name) - DummyService.cancelled(name));
+
+// Next may fails. Server can be restarted on unstable topology.
+// assertEquals(name, totalInstances, DummyService.started(name));
+// assertEquals(name, 0, DummyService.cancelled(name));
+
+ checkCount(name, g.services().serviceDescriptors(), totalInstances);
+ }
+ finally {
+ stopExtraNodes(extraNodes);
+ }
}
}
\ No newline at end of file
[18/67] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math
module to Ignite ML module added missed licenses renamed packages fixed wrong
ml profile activation (cherry picked from commit d78e071)
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/CacheVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/CacheVector.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/CacheVector.java
deleted file mode 100644
index 0e9b26f..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/CacheVector.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.ValueMapper;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.VectorKeyMapper;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.apache.ignite.math.functions.IgniteBiFunction;
-import org.apache.ignite.math.functions.IgniteDoubleFunction;
-import org.apache.ignite.math.functions.IgniteFunction;
-import org.apache.ignite.math.impls.CacheUtils;
-import org.apache.ignite.math.impls.storage.vector.CacheVectorStorage;
-
-/**
- * Vector based on existing cache and index and value mapping functions.
- */
-public class CacheVector<K, V> extends AbstractVector {
- /**
- *
- */
- public CacheVector() {
- // No-op.
- }
-
- /**
- * Creates new vector over existing cache.
- *
- * @param size
- * @param cache
- * @param keyFunc
- * @param valMapper
- */
- public CacheVector(
- int size,
- IgniteCache<K, V> cache,
- VectorKeyMapper<K> keyFunc,
- ValueMapper<V> valMapper) {
- setStorage(new CacheVectorStorage<>(size, cache, keyFunc, valMapper));
- }
-
- /**
- * @param mapper
- */
- private Vector mapOverCache(IgniteFunction<Double, Double> mapper) {
- CacheVectorStorage<K, V> sto = storage();
-
- CacheUtils.map(sto.cache().getName(), sto.keyMapper(), sto.valueMapper(), mapper);
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public double minValue() {
- CacheVectorStorage<K, V> sto = storage();
-
- return CacheUtils.min(sto.cache().getName(), sto.keyMapper(), sto.valueMapper());
- }
-
- /** {@inheritDoc} */
- @Override public double maxValue() {
- CacheVectorStorage<K, V> sto = storage();
-
- return CacheUtils.max(sto.cache().getName(), sto.keyMapper(), sto.valueMapper());
- }
-
- /** {@inheritDoc} */
- @Override public Vector map(IgniteDoubleFunction<Double> fun) {
- return mapOverCache(fun::apply);
- }
-
- /** {@inheritDoc} */
- @Override public Vector map(IgniteBiFunction<Double, Double, Double> fun, double y) {
- // TODO: provide cache-optimized implementation.
- return super.map(fun, y); // TODO
- }
-
- /** {@inheritDoc} */
- @Override public double sum() {
- CacheVectorStorage<K, V> sto = storage();
-
- return CacheUtils.sum(sto.cache().getName(), sto.keyMapper(), sto.valueMapper());
- }
-
- /** {@inheritDoc} */
- @Override public Vector assign(double val) {
- return mapOverCache((Double d) -> val);
- }
-
- /** {@inheritDoc} */
- @Override public Vector plus(double x) {
- return mapOverCache((Double d) -> d + x);
- }
-
- /** {@inheritDoc} */
- @Override public Vector divide(double x) {
- return mapOverCache((Double d) -> d / x);
- }
-
- /** {@inheritDoc} */
- @Override public Vector times(double x) {
- return mapOverCache((Double d) -> d * x);
- }
-
- /**
- *
- *
- */
- @SuppressWarnings({"unchecked"})
- private CacheVectorStorage<K, V> storage() {
- return (CacheVectorStorage<K, V>)getStorage();
- }
-
- /** {@inheritDoc} */
- @Override public Vector like(int crd) {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public Matrix likeMatrix(int rows, int cols) {
- throw new UnsupportedOperationException();
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/ConstantVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/ConstantVector.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/ConstantVector.java
deleted file mode 100644
index 0fddfd6..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/ConstantVector.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.VectorStorage;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.apache.ignite.math.impls.storage.vector.ConstantVectorStorage;
-
-/**
- * Constant value, read-only vector.
- */
-public class ConstantVector extends AbstractReadOnlyVector {
- /**
- *
- */
- public ConstantVector() {
- // No-op.
- }
-
- /**
- * @param size
- * @param val
- */
- public ConstantVector(int size, double val) {
- super(new ConstantVectorStorage(size, val));
- }
-
- /**
- *
- *
- */
- private ConstantVectorStorage storage() {
- return (ConstantVectorStorage)getStorage();
- }
-
- /** {@inheritDoc} */
- @Override public Vector copy() {
- ConstantVectorStorage sto = storage();
-
- return new ConstantVector(sto.size(), sto.constant());
- }
-
- /** {@inheritDoc} */
- @Override public Vector like(int crd) {
- return new ConstantVector(crd, storage().constant());
- }
-
- /** {@inheritDoc} */
- @Override public Matrix likeMatrix(int rows, int cols) {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object o) {
- if (this == o)
- return true;
-
- if (o == null || getClass() != o.getClass())
- return false;
-
- ConstantVector that = (ConstantVector)o;
-
- VectorStorage sto = getStorage();
-
- return (sto != null ? sto.equals(that.getStorage()) : that.getStorage() == null);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/DelegatingVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/DelegatingVector.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/DelegatingVector.java
deleted file mode 100644
index a10fa45..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/DelegatingVector.java
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Spliterator;
-import java.util.function.IntToDoubleFunction;
-import org.apache.ignite.lang.IgniteUuid;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.VectorStorage;
-import org.apache.ignite.math.functions.IgniteBiFunction;
-import org.apache.ignite.math.functions.IgniteDoubleFunction;
-
-/**
- * Convenient class that can be used to add decorations to an existing vector. Subclasses
- * can add weights, indices, etc. while maintaining full vector functionality.
- */
-public class DelegatingVector implements Vector {
- /** Delegating vector. */
- private Vector dlg;
-
- /** Meta attribute storage. */
- private Map<String, Object> meta = new HashMap<>();
-
- /** GUID. */
- private IgniteUuid guid = IgniteUuid.randomUuid();
-
- /** */
- public DelegatingVector() {
- // No-op.
- }
-
- /**
- * @param dlg
- */
- public DelegatingVector(Vector dlg) {
- assert dlg != null;
-
- this.dlg = dlg;
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- out.writeObject(dlg);
- out.writeObject(meta);
- out.writeObject(guid);
- }
-
- /** {@inheritDoc} */
- @SuppressWarnings("unchecked")
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- dlg = (Vector)in.readObject();
- meta = (Map<String, Object>)in.readObject();
- guid = (IgniteUuid)in.readObject();
- }
-
- /** {@inheritDoc} */
- @Override public Map<String, Object> getMetaStorage() {
- return meta;
- }
-
- /** {@inheritDoc} */
- @Override public Matrix likeMatrix(int rows, int cols) {
- return dlg.likeMatrix(rows, cols);
- }
-
- /** {@inheritDoc} */
- @Override public Matrix toMatrix(boolean rowLike) {
- return dlg.toMatrix(rowLike);
- }
-
- /** {@inheritDoc} */
- @Override public Matrix toMatrixPlusOne(boolean rowLike, double zeroVal) {
- return dlg.toMatrixPlusOne(rowLike, zeroVal);
- }
-
- /** {@inheritDoc} */
- @Override public int size() {
- return dlg.size();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDense() {
- return dlg.isDense();
- }
-
- /** {@inheritDoc} */
- @Override public double minValue() {
- return dlg.minValue();
- }
-
- /** {@inheritDoc} */
- @Override public double maxValue() {
- return dlg.maxValue();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isSequentialAccess() {
- return dlg.isSequentialAccess();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isArrayBased() {
- return dlg.isArrayBased();
- }
-
- /** {@inheritDoc} */
- @Override public Vector copy() {
- return new DelegatingVector(dlg);
- }
-
- /** {@inheritDoc} */
- @Override public Iterable<Element> all() {
- return dlg.all();
- }
-
- /** {@inheritDoc} */
- @Override public Iterable<Element> nonZeroes() {
- return dlg.nonZeroes();
- }
-
- /** {@inheritDoc} */
- @Override public Vector sort() {
- return dlg.sort();
- }
-
- /** {@inheritDoc} */
- @Override public Spliterator<Double> allSpliterator() {
- return dlg.allSpliterator();
- }
-
- /** {@inheritDoc} */
- @Override public Spliterator<Double> nonZeroSpliterator() {
- return dlg.nonZeroSpliterator();
- }
-
- /** {@inheritDoc} */
- @Override public Element getElement(int idx) {
- return dlg.getElement(idx);
- }
-
- /** {@inheritDoc} */
- @Override public Vector assign(double val) {
- return dlg.assign(val);
- }
-
- /** {@inheritDoc} */
- @Override public Vector assign(double[] vals) {
- return dlg.assign(vals);
- }
-
- /** {@inheritDoc} */
- @Override public Vector assign(Vector vec) {
- return dlg.assign(vec);
- }
-
- /** {@inheritDoc} */
- @Override public Vector assign(IntToDoubleFunction fun) {
- return dlg.assign(fun);
- }
-
- /** {@inheritDoc} */
- @Override public Vector map(IgniteDoubleFunction<Double> fun) {
- return dlg.map(fun);
- }
-
- /** {@inheritDoc} */
- @Override public Vector map(Vector vec, IgniteBiFunction<Double, Double, Double> fun) {
- return dlg.map(vec, fun);
- }
-
- /** {@inheritDoc} */
- @Override public Vector map(IgniteBiFunction<Double, Double, Double> fun, double y) {
- return dlg.map(fun, y);
- }
-
- /** {@inheritDoc} */
- @Override public Vector divide(double x) {
- return dlg.divide(x);
- }
-
- /** {@inheritDoc} */
- @Override public double dot(Vector vec) {
- return dlg.dot(vec);
- }
-
- /** {@inheritDoc} */
- @Override public double get(int idx) {
- return dlg.get(idx);
- }
-
- /** {@inheritDoc} */
- @Override public double getX(int idx) {
- return dlg.getX(idx);
- }
-
- /** {@inheritDoc} */
- @Override public Vector like(int crd) {
- return dlg.like(crd);
- }
-
- /** {@inheritDoc} */
- @Override public Vector minus(Vector vec) {
- return dlg.minus(vec);
- }
-
- /** {@inheritDoc} */
- @Override public Vector normalize() {
- return dlg.normalize();
- }
-
- /** {@inheritDoc} */
- @Override public Vector normalize(double power) {
- return dlg.normalize(power);
- }
-
- /** {@inheritDoc} */
- @Override public Vector logNormalize() {
- return dlg.logNormalize();
- }
-
- /** {@inheritDoc} */
- @Override public Vector logNormalize(double power) {
- return dlg.logNormalize(power);
- }
-
- /** {@inheritDoc} */
- @Override public double kNorm(double power) {
- return dlg.kNorm(power);
- }
-
- /** {@inheritDoc} */
- @Override public Element minElement() {
- return dlg.minElement();
- }
-
- /** {@inheritDoc} */
- @Override public Element maxElement() {
- return dlg.maxElement();
- }
-
- /** {@inheritDoc} */
- @Override public Vector plus(double x) {
- return dlg.plus(x);
- }
-
- /** {@inheritDoc} */
- @Override public Vector plus(Vector vec) {
- return dlg.plus(vec);
- }
-
- /** {@inheritDoc} */
- @Override public Vector set(int idx, double val) {
- return dlg.set(idx, val);
- }
-
- /** {@inheritDoc} */
- @Override public Vector setX(int idx, double val) {
- return dlg.setX(idx, val);
- }
-
- /** {@inheritDoc} */
- @Override public Vector incrementX(int idx, double val) {
- return dlg.incrementX(idx, val);
- }
-
- /** {@inheritDoc} */
- @Override public Vector increment(int idx, double val) {
- return dlg.increment(idx, val);
- }
-
- /** {@inheritDoc} */
- @Override public int nonZeroElements() {
- return dlg.nonZeroElements();
- }
-
- /** {@inheritDoc} */
- @Override public Vector times(double x) {
- return dlg.times(x);
- }
-
- /** {@inheritDoc} */
- @Override public Vector times(Vector vec) {
- return dlg.times(vec);
- }
-
- /** {@inheritDoc} */
- @Override public Vector viewPart(int off, int len) {
- return dlg.viewPart(off, len);
- }
-
- /** {@inheritDoc} */
- @Override public VectorStorage getStorage() {
- return dlg.getStorage();
- }
-
- /** {@inheritDoc} */
- @Override public double sum() {
- return dlg.sum();
- }
-
- /** {@inheritDoc} */
- @Override public Matrix cross(Vector vec) {
- return dlg.cross(vec);
- }
-
- /** {@inheritDoc} */
- @Override public <T> T foldMap(IgniteBiFunction<T, Double, T> foldFun, IgniteDoubleFunction<Double> mapFun,
- T zeroVal) {
- return dlg.foldMap(foldFun, mapFun, zeroVal);
- }
-
- /** {@inheritDoc} */
- @Override public <T> T foldMap(Vector vec, IgniteBiFunction<T, Double, T> foldFun,
- IgniteBiFunction<Double, Double, Double> combFun, T zeroVal) {
- return dlg.foldMap(vec, foldFun, combFun, zeroVal);
- }
-
- /** {@inheritDoc} */
- @Override public double getLengthSquared() {
- return dlg.getLengthSquared();
- }
-
- /** {@inheritDoc} */
- @Override public double getDistanceSquared(Vector vec) {
- return dlg.getDistanceSquared(vec);
- }
-
- /** {@inheritDoc} */
- @Override public boolean isRandomAccess() {
- return dlg.isRandomAccess();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDistributed() {
- return dlg.isDistributed();
- }
-
- /** {@inheritDoc} */
- @Override public IgniteUuid guid() {
- return guid;
- }
-
- /** {@inheritDoc} */
- @Override public void destroy() {
- dlg.destroy();
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- int res = 1;
-
- res = res * 37 + meta.hashCode();
- res = res * 37 + dlg.hashCode();
-
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object o) {
- if (this == o)
- return true;
-
- if (o == null || getClass() != o.getClass())
- return false;
-
- DelegatingVector that = (DelegatingVector)o;
-
- return meta.equals(that.meta) && dlg.equals(that.dlg);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/DenseLocalOffHeapVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/DenseLocalOffHeapVector.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/DenseLocalOffHeapVector.java
deleted file mode 100644
index 4e7eb21..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/DenseLocalOffHeapVector.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import java.util.stream.IntStream;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.impls.matrix.DenseLocalOffHeapMatrix;
-import org.apache.ignite.math.impls.storage.vector.DenseLocalOffHeapVectorStorage;
-
-/**
- * Implementation for {@link Vector} assuming dense logic and local offheap JVM storage.
- * It is suitable for data sets where local, non-distributed execution is satisfactory and on-heap JVM storage
- * is not enough to keep the entire data set.
- */
-public class DenseLocalOffHeapVector extends AbstractVector {
- /** */
- public DenseLocalOffHeapVector() {
- // No-op.
- }
-
- /** */
- private void makeOffheapStorage(int size) {
- setStorage(new DenseLocalOffHeapVectorStorage(size));
- }
-
- /**
- * @param arr Array to copy to offheap storage.
- */
- public DenseLocalOffHeapVector(double[] arr) {
- makeOffheapStorage(arr.length);
-
- assign(arr);
- }
-
- /**
- * @param size Vector cardinality.
- */
- public DenseLocalOffHeapVector(int size) {
- makeOffheapStorage(size);
- }
-
- /** {@inheritDoc} */
- @Override public Vector assign(Vector vec) {
- checkCardinality(vec);
-
- IntStream.range(0, size()).parallel().forEach(idx -> set(idx, vec.get(idx)));
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public Vector times(double x) {
- if (x == 0.0)
- return like(size()).assign(0);
- else
- return super.times(x);
- }
-
- /** {@inheritDoc} */
- @Override public Vector like(int crd) {
- return new DenseLocalOffHeapVector(crd);
- }
-
- /** {@inheritDoc} */
- @Override public Matrix likeMatrix(int rows, int cols) {
- return new DenseLocalOffHeapMatrix(rows, cols);
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object o) {
- return o != null && getClass().equals(o.getClass()) && (getStorage().equals(((Vector)o).getStorage()));
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/DenseLocalOnHeapVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/DenseLocalOnHeapVector.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/DenseLocalOnHeapVector.java
deleted file mode 100644
index 5827998..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/DenseLocalOnHeapVector.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import java.util.Map;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.VectorStorage;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.apache.ignite.math.impls.matrix.DenseLocalOnHeapMatrix;
-import org.apache.ignite.math.impls.storage.vector.ArrayVectorStorage;
-
-/**
- * Basic implementation for vector.
- * <p>
- * This is a trivial implementation for vector assuming dense logic, local on-heap JVM storage
- * based on {@code double[]} array. It is only suitable for data sets where
- * local, non-distributed execution is satisfactory and on-heap JVM storage is enough
- * to keep the entire data set.
- */
-public class DenseLocalOnHeapVector extends AbstractVector {
- /**
- * @param size Vector cardinality.
- */
- private VectorStorage mkStorage(int size) {
- return new ArrayVectorStorage(size);
- }
-
- /**
- * @param arr Source array.
- * @param cp {@code true} to clone array, reuse it otherwise.
- */
- private VectorStorage mkStorage(double[] arr, boolean cp) {
- assert arr != null;
-
- return new ArrayVectorStorage(cp ? arr.clone() : arr);
- }
-
- /**
- * @param args Parameters for new Vector.
- */
- public DenseLocalOnHeapVector(Map<String, Object> args) {
- assert args != null;
-
- if (args.containsKey("size"))
- setStorage(mkStorage((int)args.get("size")));
- else if (args.containsKey("arr") && args.containsKey("copy"))
- setStorage(mkStorage((double[])args.get("arr"), (boolean)args.get("copy")));
- else
- throw new UnsupportedOperationException("Invalid constructor argument(s).");
- }
-
- /** */
- public DenseLocalOnHeapVector() {
- // No-op.
- }
-
- /**
- * @param size Vector cardinality.
- */
- public DenseLocalOnHeapVector(int size) {
- setStorage(mkStorage(size));
- }
-
- /**
- * @param arr Source array.
- * @param shallowCp {@code true} to use shallow copy.
- */
- public DenseLocalOnHeapVector(double[] arr, boolean shallowCp) {
- setStorage(mkStorage(arr, shallowCp));
- }
-
- /**
- * @param arr Source array.
- */
- public DenseLocalOnHeapVector(double[] arr) {
- this(arr, false);
- }
-
- /** {@inheritDoc} */
- @Override public Matrix likeMatrix(int rows, int cols) {
- return new DenseLocalOnHeapMatrix(rows, cols);
- }
-
- /** {@inheritDoc} */
- @Override public Vector like(int crd) {
- return new DenseLocalOnHeapVector(crd);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/FunctionVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/FunctionVector.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/FunctionVector.java
deleted file mode 100644
index 0e7cfad..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/FunctionVector.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import java.util.Map;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.apache.ignite.math.functions.IgniteFunction;
-import org.apache.ignite.math.functions.IntDoubleToVoidFunction;
-import org.apache.ignite.math.impls.storage.vector.FunctionVectorStorage;
-
-/**
- * Implementation of {@link Vector} that maps vector element index to {@link java.util.function} interfaces.
- */
-public class FunctionVector extends AbstractVector {
- /**
- *
- */
- public FunctionVector() {
- // No-op.
- }
-
- /**
- * Creates read-write or read-only function vector.
- *
- * @param size Vector size.
- * @param getFunc Function that returns value corresponding to given element index.
- * @param setFunc Set function. If {@code null} - this will be a read-only vector.
- */
- public FunctionVector(int size, IgniteFunction<Integer, Double> getFunc, IntDoubleToVoidFunction setFunc) {
- setStorage(new FunctionVectorStorage(size, getFunc, setFunc));
- }
-
- /**
- * Creates read-only function vector.
- *
- * @param size Vector size.
- * @param getFunc Function that returns value corresponding to given element index.
- */
- public FunctionVector(int size, IgniteFunction<Integer, Double> getFunc) {
- setStorage(new FunctionVectorStorage(size, getFunc));
- }
-
- /**
- * @param args Arguments for vector constructor.
- */
- public FunctionVector(Map<String, Object> args) {
- assert args != null;
-
- if (args.containsKey("size") && args.containsKey("getFunc") && args.containsKey("setFunc")) {
- @SuppressWarnings("unchecked")
- IgniteFunction<Integer, Double> getFunc = (IgniteFunction<Integer, Double>)args.get("getFunc");
- IntDoubleToVoidFunction setFunc = (IntDoubleToVoidFunction)args.get("setFunc");
- int size = (int)args.get("size");
-
- setStorage(new FunctionVectorStorage(size, getFunc, setFunc));
- }
- else if (args.containsKey("size") && args.containsKey("getFunc")) {
- @SuppressWarnings("unchecked")
- IgniteFunction<Integer, Double> getFunc = (IgniteFunction<Integer, Double>)args.get("getFunc");
- int size = (int)args.get("size");
-
- setStorage(new FunctionVectorStorage(size, getFunc));
- }
- else
- throw new UnsupportedOperationException("Invalid constructor argument(s).");
- }
-
- /**
- *
- *
- */
- private FunctionVectorStorage storage() {
- return (FunctionVectorStorage)getStorage();
- }
-
- /** {@inheritDoc} */
- @Override public org.apache.ignite.math.Vector like(int crd) {
- FunctionVectorStorage sto = storage();
-
- return new FunctionVector(crd, sto.getFunction(), sto.setFunction());
- }
-
- /** {@inheritDoc} */
- @Override public Matrix likeMatrix(int rows, int cols) {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public Vector times(double x) {
- if (x == 0.0)
- return like(size()).assign(0);
- else
- return super.times(x);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/MatrixVectorView.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/MatrixVectorView.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/MatrixVectorView.java
deleted file mode 100644
index 8f32a89..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/MatrixVectorView.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.exceptions.IndexException;
-import org.apache.ignite.math.impls.storage.vector.MatrixVectorStorage;
-
-/**
- * Row or column vector view off the matrix.
- */
-public class MatrixVectorView extends AbstractVector {
- /** */ private Matrix parent;
-
- /** */ private int row;
- /** */ private int col;
-
- /** */ private int rowStride;
- /** */ private int colStride;
-
- /**
- *
- */
- public MatrixVectorView() {
- // No-op.
- }
-
- /**
- * @param parent
- * @param row
- * @param col
- * @param rowStride
- * @param colStride
- */
- public MatrixVectorView(Matrix parent, int row, int col, int rowStride, int colStride) {
- assert parent != null;
-
- if (row < 0 || row >= parent.rowSize())
- throw new IndexException(row);
- if (col < 0 || col >= parent.columnSize())
- throw new IndexException(col);
-
- this.parent = parent;
-
- this.row = row;
- this.col = col;
-
- this.rowStride = rowStride;
- this.colStride = colStride;
-
- setStorage(new MatrixVectorStorage(parent, row, col, rowStride, colStride));
- }
-
- /** {@inheritDoc} */
- @Override public Vector copy() {
- return new MatrixVectorView(parent, row, col, rowStride, colStride);
- }
-
- /** {@inheritDoc} */
- @Override public Vector like(int crd) {
- return parent.likeVector(crd);
- }
-
- /** {@inheritDoc} */
- @Override public Matrix likeMatrix(int rows, int cols) {
- return parent.like(rows, cols);
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- super.writeExternal(out);
-
- out.writeObject(parent);
- out.writeInt(row);
- out.writeInt(col);
- out.writeInt(rowStride);
- out.writeInt(colStride);
- }
-
- /** {@inheritDoc} */
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- super.readExternal(in);
-
- parent = (Matrix)in.readObject();
- row = in.readInt();
- col = in.readInt();
- rowStride = in.readInt();
- colStride = in.readInt();
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- int res = 1;
-
- res = res * 37 + (parent == null ? 0 : parent.hashCode());
- res = res * 37 + row;
- res = res * 37 + col;
- res = res * 37 + rowStride;
- res = res * 37 + colStride;
-
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object o) {
- if (this == o)
- return true;
-
- if (o == null || getClass() != o.getClass())
- return false;
-
- MatrixVectorView that = (MatrixVectorView)o;
-
- return (parent != null ? parent.equals(that.parent) : that.parent == null) &&
- row == that.row &&
- col == that.col &&
- rowStride == that.rowStride &&
- colStride == that.colStride;
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/PivotedVectorView.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/PivotedVectorView.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/PivotedVectorView.java
deleted file mode 100644
index cc9e835..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/PivotedVectorView.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.apache.ignite.math.functions.Functions;
-import org.apache.ignite.math.impls.storage.vector.PivotedVectorStorage;
-
-/**
- * Pivoted (index mapped) view over another vector.
- */
-public class PivotedVectorView extends AbstractVector {
- /** */ private Vector vec;
-
- /**
- * @param vec
- * @param pivot Mapping from external index to internal.
- * @param unpivot Mapping from internal index to external.
- */
- public PivotedVectorView(Vector vec, int[] pivot, int[] unpivot) {
- setStorage(new PivotedVectorStorage(vec.getStorage(), pivot, unpivot));
-
- checkCardinality(pivot);
- checkCardinality(unpivot);
-
- this.vec = vec;
- }
-
- /**
- * @param vec
- * @param pivot
- */
- public PivotedVectorView(Vector vec, int[] pivot) {
- setStorage(new PivotedVectorStorage(vec.getStorage(), pivot));
-
- checkCardinality(pivot);
-
- this.vec = vec;
- }
-
- /**
- *
- *
- */
- private PivotedVectorStorage storage() {
- return (PivotedVectorStorage)getStorage();
- }
-
- /**
- *
- */
- public PivotedVectorView() {
- // No-op.
- }
-
- /**
- *
- *
- */
- public Vector getBaseVector() {
- return vec;
- }
-
- /**
- * @param i
- */
- public int pivot(int i) {
- return storage().pivot()[i];
- }
-
- /**
- * @param i
- */
- public int unpivot(int i) {
- return storage().unpivot()[i];
- }
-
- /**
- * @param idx
- */
- protected Vector.Element makeElement(int idx) {
- checkIndex(idx);
-
- // External index.
- int exIdx = storage().pivot()[idx];
-
- return new Vector.Element() {
- /** {@inheritDoc */
- @Override public double get() {
- return storageGet(idx);
- }
-
- /** {@inheritDoc */
- @Override public int index() {
- return exIdx;
- }
-
- /** {@inheritDoc */
- @Override public void set(double val) {
- storageSet(idx, val);
- }
- };
- }
-
- /** {@inheritDoc} */
- @Override public Vector copy() {
- PivotedVectorStorage sto = storage();
-
- return new PivotedVectorView(vec, sto.pivot(), sto.unpivot());
- }
-
- /** {@inheritDoc} */
- @Override public Vector like(int crd) {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public Matrix likeMatrix(int rows, int cols) {
- return vec.likeMatrix(rows, cols);
- }
-
- /** {@inheritDoc} */
- @Override public Vector times(double x) {
- if (x == 0.0)
- return copy().map(Functions.mult(x));
- else
- return super.times(x);
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- super.writeExternal(out);
-
- out.writeObject(vec);
- }
-
- /** {@inheritDoc} */
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- super.readExternal(in);
-
- vec = (Vector)in.readObject();
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/RandomVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/RandomVector.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/RandomVector.java
deleted file mode 100644
index c9121c9..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/RandomVector.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.util.Map;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.VectorStorage;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.apache.ignite.math.impls.matrix.RandomMatrix;
-import org.apache.ignite.math.impls.storage.vector.RandomVectorStorage;
-
-/**
- * Random vector. Each value is taken from {-1,0,1} with roughly equal probability. Note
- * that by default, the value is determined by a relatively simple hash of the index.
- */
-public class RandomVector extends AbstractReadOnlyVector {
- /** */ private boolean fastHash;
-
- /**
- * @param size Vector cardinality.
- * @param fastHash
- */
- private VectorStorage mkStorage(int size, boolean fastHash) {
- this.fastHash = fastHash;
-
- return new RandomVectorStorage(size, fastHash);
- }
-
- /**
- * @param size
- * @param fastHash
- */
- public RandomVector(int size, boolean fastHash) {
- setStorage(mkStorage(size, fastHash));
- }
-
- /**
- * @param size
- */
- public RandomVector(int size) {
- this(size, true);
- }
-
- /**
- * @param args
- */
- public RandomVector(Map<String, Object> args) {
- assert args != null;
-
- if (args.containsKey("size") && args.containsKey("fastHash"))
- setStorage(mkStorage((int)args.get("size"), (boolean)args.get("fastHash")));
- else if (args.containsKey("size"))
- setStorage(mkStorage((int)args.get("size"), true));
- else
- throw new UnsupportedOperationException("Invalid constructor argument(s).");
- }
-
- /** */
- public RandomVector() {
- // No-op.
- }
-
- /** {@inheritDoc} */
- @Override public org.apache.ignite.math.Vector like(int crd) {
- return new RandomVector(crd, fastHash);
- }
-
- /** {@inheritDoc} */
- @Override public Matrix likeMatrix(int rows, int cols) {
- return new RandomMatrix(rows, cols);
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- super.writeExternal(out);
-
- out.writeBoolean(fastHash);
- }
-
- /** {@inheritDoc} */
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- super.readExternal(in);
-
- fastHash = in.readBoolean();
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- int res = 1;
-
- res = res * 37 + Boolean.hashCode(fastHash);
- res = res * 37 + getStorage().hashCode();
-
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object o) {
- if (this == o)
- return true;
-
- if (o == null || getClass() != o.getClass())
- return false;
-
- RandomVector that = (RandomVector)o;
- VectorStorage sto = getStorage();
-
- return fastHash == that.fastHash && (sto != null ? sto.equals(that.getStorage()) : that.getStorage() == null);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SingleElementVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SingleElementVector.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SingleElementVector.java
deleted file mode 100644
index 8d19ee0..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SingleElementVector.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import java.util.Map;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.apache.ignite.math.impls.storage.vector.SingleElementVectorStorage;
-
-/**
- * Read-write vector holding a single non-zero value at some index.
- */
-public class SingleElementVector extends AbstractVector {
- /**
- *
- */
- public SingleElementVector() {
- // No-op
- }
-
- /**
- * @param size
- * @param idx
- * @param val
- */
- public SingleElementVector(int size, int idx, double val) {
- super(new SingleElementVectorStorage(size, idx, val));
- }
-
- /**
- * @param args
- */
- public SingleElementVector(Map<String, Object> args) {
- assert args != null;
-
- if (args.containsKey("size") && args.containsKey("index") && args.containsKey("value")) {
- int size = (int)args.get("size");
- int idx = (int)args.get("index");
- double val = (double)args.get("value");
-
- setStorage(new SingleElementVectorStorage(size, idx, val));
- }
- else
- throw new UnsupportedOperationException("Invalid constructor argument(s).");
- }
-
- /**
- *
- *
- */
- private SingleElementVectorStorage storage() {
- return (SingleElementVectorStorage)getStorage();
- }
-
- /** {@inheritDoc} */
- @Override public Element minElement() {
- return makeElement(storage().index());
- }
-
- /** {@inheritDoc} */
- @Override public Element maxElement() {
- return makeElement(storage().index());
- }
-
- /** {@inheritDoc} */
- @Override public double sum() {
- return getX(storage().index());
- }
-
- /** {@inheritDoc} */
- @Override public int nonZeroElements() {
- return isZero(get(storage().index())) ? 0 : 1;
- }
-
- /** {@inheritDoc} */
- @Override public Vector like(int crd) {
- int idx = storage().index();
-
- return new SingleElementVector(crd, idx, getX(idx));
- }
-
- /** {@inheritDoc} */
- @Override public Matrix likeMatrix(int rows, int cols) {
- throw new UnsupportedOperationException();
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SingleElementVectorView.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SingleElementVectorView.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SingleElementVectorView.java
deleted file mode 100644
index 76a1c0a..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SingleElementVectorView.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.apache.ignite.math.functions.Functions;
-import org.apache.ignite.math.impls.storage.vector.SingleElementVectorDelegateStorage;
-
-/**
- * Single value vector view over another vector.
- */
-public class SingleElementVectorView extends AbstractVector {
- /**
- *
- */
- public SingleElementVectorView() {
- // No-op.
- }
-
- /**
- * @param vec
- * @param idx
- */
- public SingleElementVectorView(Vector vec, int idx) {
- super(new SingleElementVectorDelegateStorage(vec, idx));
- }
-
- /**
- *
- *
- */
- private SingleElementVectorDelegateStorage storage() {
- return (SingleElementVectorDelegateStorage)getStorage();
- }
-
- /** {@inheritDoc} */
- @Override public Vector.Element minElement() {
- return makeElement(storage().index());
- }
-
- /** {@inheritDoc} */
- @Override public Vector.Element maxElement() {
- return makeElement(storage().index());
- }
-
- /** {@inheritDoc} */
- @Override public double sum() {
- return getX(storage().index());
- }
-
- /** {@inheritDoc} */
- @Override public int nonZeroElements() {
- return isZero(getX(storage().index())) ? 0 : 1;
- }
-
- /** {@inheritDoc} */
- @Override public Vector copy() {
- SingleElementVectorDelegateStorage sto = storage();
-
- return new SingleElementVectorView(sto.delegate(), sto.index());
- }
-
- /** {@inheritDoc} */
- @Override public Vector times(double x) {
- if (x == 0.0)
- return copy().map(Functions.mult(x));
- else
- return super.times(x);
- }
-
- /** {@inheritDoc} */
- @Override public Vector like(int crd) {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public Matrix likeMatrix(int rows, int cols) {
- throw new UnsupportedOperationException();
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SparseLocalOffHeapVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SparseLocalOffHeapVector.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SparseLocalOffHeapVector.java
deleted file mode 100644
index 2fd1c57..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SparseLocalOffHeapVector.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.impls.storage.vector.SparseLocalOffHeapVectorStorage;
-
-/**
- * Implementation for {@link Vector} assuming sparse logic and local offheap JVM storage.
- * It is suitable for data sets where local, non-distributed execution is satisfactory and on-heap JVM storage
- * is not enough to keep the entire data set.
- * <p>See also: <a href="https://en.wikipedia.org/wiki/Sparse_array">Wikipedia article</a>.</p>
- */
-public class SparseLocalOffHeapVector extends AbstractVector {
- /**
- * @param crd Vector cardinality.
- */
- public SparseLocalOffHeapVector(int crd) {
- setStorage(new SparseLocalOffHeapVectorStorage(crd));
- }
-
- /** {@inheritDoc} */
- @Override public Vector like(int crd) {
- return new SparseLocalOffHeapVector(crd);
- }
-
- /** {@inheritDoc} */
- @Override public Matrix likeMatrix(int rows, int cols) {
- return null;
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SparseLocalVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SparseLocalVector.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SparseLocalVector.java
deleted file mode 100644
index ebb6731..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SparseLocalVector.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.StorageConstants;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.impls.matrix.SparseLocalOnHeapMatrix;
-import org.apache.ignite.math.impls.storage.vector.SparseLocalOnHeapVectorStorage;
-
-/**
- * Local on-heap sparse vector based on hash map storage.
- */
-public class SparseLocalVector extends AbstractVector implements StorageConstants {
- /**
- *
- */
- public SparseLocalVector() {
- // No-op.
- }
-
- /**
- * @param size
- * @param acsMode
- */
- public SparseLocalVector(int size, int acsMode) {
- assertAccessMode(acsMode);
-
- setStorage(new SparseLocalOnHeapVectorStorage(size, acsMode));
- }
-
- /** */
- private SparseLocalOnHeapVectorStorage storage() {
- return (SparseLocalOnHeapVectorStorage)getStorage();
- }
-
- /** {@inheritDoc} */
- @Override public Vector like(int crd) {
- SparseLocalOnHeapVectorStorage sto = storage();
-
- return new SparseLocalVector(crd, sto.getAccessMode());
- }
-
- /** {@inheritDoc} */
- @Override public Matrix likeMatrix(int rows, int cols) {
- return new SparseLocalOnHeapMatrix(rows, cols);
- }
-
- /** {@inheritDoc} */
- @Override public Vector times(double x) {
- if (x == 0.0)
- return assign(0);
- else
- return super.times(x);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/VectorView.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/VectorView.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/VectorView.java
deleted file mode 100644
index ce51a45..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/VectorView.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import java.io.Externalizable;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.VectorStorage;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.apache.ignite.math.impls.storage.vector.DelegateVectorStorage;
-
-/**
- * Implements the partial view into the parent {@link Vector}.
- */
-public class VectorView extends AbstractVector {
- /**
- * Constructor for {@link Externalizable} interface.
- */
- public VectorView() {
- // No-op.
- }
-
- /**
- * @param parent Backing parent {@link Vector}.
- * @param off Offset to parent vector.
- * @param len Size of the view.
- */
- public VectorView(Vector parent, int off, int len) {
- super(new DelegateVectorStorage(parent.getStorage(), off, len));
- }
-
- /**
- * @param sto Backing parent {@link VectorStorage}.
- * @param off Offset to parent vector.
- * @param len Size of the view.
- */
- public VectorView(VectorStorage sto, int off, int len) {
- super(new DelegateVectorStorage(sto, off, len));
- }
-
- /** */
- private DelegateVectorStorage storage() {
- return (DelegateVectorStorage)getStorage();
- }
-
- /** {@inheritDoc} */
- @Override public Vector copy() {
- DelegateVectorStorage sto = storage();
-
- return new VectorView(sto.delegate(), sto.offset(), sto.length());
- }
-
- /** {@inheritDoc} */
- @Override public Vector like(int crd) {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public Matrix likeMatrix(int rows, int cols) {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object o) {
- return this == o ||
- ((o != null)
- && o.getClass() == getClass()
- && (getStorage().equals(((VectorView)o).getStorage())));
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/package-info.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/package-info.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/package-info.java
deleted file mode 100644
index d6ca1f3..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/package-info.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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 description. -->
- * Contains specific implementations for vectors.
- */
-package org.apache.ignite.math.impls.vector;
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/package-info.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/package-info.java b/modules/ml/src/main/java/org/apache/ignite/math/package-info.java
deleted file mode 100644
index 05ce651..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/package-info.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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 description. -->
- * Contains main APIs for distributed code algebra.
- */
-package org.apache.ignite.math;
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/Algebra.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/Algebra.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/Algebra.java
new file mode 100644
index 0000000..a31503f
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/Algebra.java
@@ -0,0 +1,571 @@
+/*
+ * 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.
+ */
+
+/*
+Copyright 1999 CERN - European Organization for Nuclear Research.
+Permission to use, copy, modify, distribute and sell this software and its documentation for any purpose
+is hereby granted without fee, provided that the above copyright notice appear in all copies and
+that both that copyright notice and this permission notice appear in supporting documentation.
+CERN makes no representations about the suitability of this software for any purpose.
+It is provided "as is" without expressed or implied warranty.
+*/
+
+package org.apache.ignite.ml.math;
+
+/**
+ * Miscellaneous arithmetic and algebra functions.
+ * Lifted from Apache Mahout.
+ */
+public class Algebra extends Constants {
+ /** */ private static final double[] STIRLING_CORRECTION = {
+ 0.0,
+ 8.106146679532726e-02, 4.134069595540929e-02,
+ 2.767792568499834e-02, 2.079067210376509e-02,
+ 1.664469118982119e-02, 1.387612882307075e-02,
+ 1.189670994589177e-02, 1.041126526197209e-02,
+ 9.255462182712733e-03, 8.330563433362871e-03,
+ 7.573675487951841e-03, 6.942840107209530e-03,
+ 6.408994188004207e-03, 5.951370112758848e-03,
+ 5.554733551962801e-03, 5.207655919609640e-03,
+ 4.901395948434738e-03, 4.629153749334029e-03,
+ 4.385560249232324e-03, 4.166319691996922e-03,
+ 3.967954218640860e-03, 3.787618068444430e-03,
+ 3.622960224683090e-03, 3.472021382978770e-03,
+ 3.333155636728090e-03, 3.204970228055040e-03,
+ 3.086278682608780e-03, 2.976063983550410e-03,
+ 2.873449362352470e-03, 2.777674929752690e-03,
+ };
+
+ /** */ private static final double[] LOG_FACTORIALS = {
+ 0.00000000000000000, 0.00000000000000000, 0.69314718055994531,
+ 1.79175946922805500, 3.17805383034794562, 4.78749174278204599,
+ 6.57925121201010100, 8.52516136106541430, 10.60460290274525023,
+ 12.80182748008146961, 15.10441257307551530, 17.50230784587388584,
+ 19.98721449566188615, 22.55216385312342289, 25.19122118273868150,
+ 27.89927138384089157, 30.67186010608067280, 33.50507345013688888,
+ 36.39544520803305358, 39.33988418719949404, 42.33561646075348503,
+ 45.38013889847690803, 48.47118135183522388, 51.60667556776437357,
+ 54.78472939811231919, 58.00360522298051994, 61.26170176100200198,
+ 64.55753862700633106, 67.88974313718153498, 71.25703896716800901
+ };
+
+ /** */ private static final long[] LONG_FACTORIALS = {
+ 1L,
+ 1L,
+ 2L,
+ 6L,
+ 24L,
+ 120L,
+ 720L,
+ 5040L,
+ 40320L,
+ 362880L,
+ 3628800L,
+ 39916800L,
+ 479001600L,
+ 6227020800L,
+ 87178291200L,
+ 1307674368000L,
+ 20922789888000L,
+ 355687428096000L,
+ 6402373705728000L,
+ 121645100408832000L,
+ 2432902008176640000L
+ };
+
+ /** */ private static final double[] DOUBLE_FACTORIALS = {
+ 5.109094217170944E19,
+ 1.1240007277776077E21,
+ 2.585201673888498E22,
+ 6.204484017332394E23,
+ 1.5511210043330984E25,
+ 4.032914611266057E26,
+ 1.0888869450418352E28,
+ 3.048883446117138E29,
+ 8.841761993739701E30,
+ 2.652528598121911E32,
+ 8.222838654177924E33,
+ 2.6313083693369355E35,
+ 8.68331761881189E36,
+ 2.952327990396041E38,
+ 1.0333147966386144E40,
+ 3.719933267899013E41,
+ 1.3763753091226346E43,
+ 5.23022617466601E44,
+ 2.0397882081197447E46,
+ 8.15915283247898E47,
+ 3.34525266131638E49,
+ 1.4050061177528801E51,
+ 6.041526306337384E52,
+ 2.6582715747884495E54,
+ 1.196222208654802E56,
+ 5.502622159812089E57,
+ 2.5862324151116827E59,
+ 1.2413915592536068E61,
+ 6.082818640342679E62,
+ 3.0414093201713376E64,
+ 1.5511187532873816E66,
+ 8.06581751709439E67,
+ 4.274883284060024E69,
+ 2.308436973392413E71,
+ 1.2696403353658264E73,
+ 7.109985878048632E74,
+ 4.052691950487723E76,
+ 2.350561331282879E78,
+ 1.386831185456898E80,
+ 8.32098711274139E81,
+ 5.075802138772246E83,
+ 3.146997326038794E85,
+ 1.9826083154044396E87,
+ 1.2688693218588414E89,
+ 8.247650592082472E90,
+ 5.443449390774432E92,
+ 3.6471110918188705E94,
+ 2.48003554243683E96,
+ 1.7112245242814127E98,
+ 1.1978571669969892E100,
+ 8.504785885678624E101,
+ 6.123445837688612E103,
+ 4.470115461512686E105,
+ 3.307885441519387E107,
+ 2.4809140811395404E109,
+ 1.8854947016660506E111,
+ 1.451830920282859E113,
+ 1.1324281178206295E115,
+ 8.94618213078298E116,
+ 7.15694570462638E118,
+ 5.797126020747369E120,
+ 4.7536433370128435E122,
+ 3.94552396972066E124,
+ 3.314240134565354E126,
+ 2.8171041143805494E128,
+ 2.4227095383672744E130,
+ 2.107757298379527E132,
+ 1.854826422573984E134,
+ 1.6507955160908465E136,
+ 1.4857159644817605E138,
+ 1.3520015276784033E140,
+ 1.2438414054641305E142,
+ 1.156772507081641E144,
+ 1.0873661566567426E146,
+ 1.0329978488239061E148,
+ 9.916779348709491E149,
+ 9.619275968248216E151,
+ 9.426890448883248E153,
+ 9.332621544394415E155,
+ 9.332621544394418E157,
+ 9.42594775983836E159,
+ 9.614466715035125E161,
+ 9.902900716486178E163,
+ 1.0299016745145631E166,
+ 1.0813967582402912E168,
+ 1.1462805637347086E170,
+ 1.2265202031961373E172,
+ 1.324641819451829E174,
+ 1.4438595832024942E176,
+ 1.5882455415227423E178,
+ 1.7629525510902457E180,
+ 1.974506857221075E182,
+ 2.2311927486598138E184,
+ 2.543559733472186E186,
+ 2.925093693493014E188,
+ 3.393108684451899E190,
+ 3.96993716080872E192,
+ 4.6845258497542896E194,
+ 5.574585761207606E196,
+ 6.689502913449135E198,
+ 8.094298525273444E200,
+ 9.875044200833601E202,
+ 1.2146304367025332E205,
+ 1.506141741511141E207,
+ 1.882677176888926E209,
+ 2.3721732428800483E211,
+ 3.0126600184576624E213,
+ 3.856204823625808E215,
+ 4.974504222477287E217,
+ 6.466855489220473E219,
+ 8.471580690878813E221,
+ 1.1182486511960037E224,
+ 1.4872707060906847E226,
+ 1.99294274616152E228,
+ 2.690472707318049E230,
+ 3.6590428819525483E232,
+ 5.0128887482749884E234,
+ 6.917786472619482E236,
+ 9.615723196941089E238,
+ 1.3462012475717523E241,
+ 1.8981437590761713E243,
+ 2.6953641378881633E245,
+ 3.8543707171800694E247,
+ 5.550293832739308E249,
+ 8.047926057471989E251,
+ 1.1749972043909107E254,
+ 1.72724589045464E256,
+ 2.5563239178728637E258,
+ 3.8089226376305687E260,
+ 5.7133839564458575E262,
+ 8.627209774233244E264,
+ 1.3113358856834527E267,
+ 2.0063439050956838E269,
+ 3.0897696138473515E271,
+ 4.789142901463393E273,
+ 7.471062926282892E275,
+ 1.1729568794264134E278,
+ 1.8532718694937346E280,
+ 2.946702272495036E282,
+ 4.714723635992061E284,
+ 7.590705053947223E286,
+ 1.2296942187394494E289,
+ 2.0044015765453032E291,
+ 3.287218585534299E293,
+ 5.423910666131583E295,
+ 9.003691705778434E297,
+ 1.5036165148649983E300,
+ 2.5260757449731988E302,
+ 4.2690680090047056E304,
+ 7.257415615308004E306
+ };
+
+ /**
+ * Efficiently returns the binomial coefficient, often also referred to as
+ * "n over k" or "n choose k". The binomial coefficient is defined as
+ * {@code (n * n-1 * ... * n-k+1 ) / ( 1 * 2 * ... * k )}.
+ * <ul> <li>{@code k<0}: {@code 0}.</li>
+ * <li>{@code k==0}: {@code 1}.</li>
+ * <li>{@code k==1}: {@code n}.</li>
+ * <li>else: {@code (n * n-1 * ... * n-k+1 ) / ( 1 * 2 * ... * k)}.</li>
+ * </ul>
+ *
+ * @param n
+ * @param k
+ * @return Binomial coefficient.
+ */
+ public static double binomial(double n, long k) {
+ if (k < 0)
+ return 0;
+
+ if (k == 0)
+ return 1;
+
+ if (k == 1)
+ return n;
+
+ // binomial(n,k) = (n * n-1 * ... * n-k+1 ) / ( 1 * 2 * ... * k )
+ double a = n - k + 1;
+ double b = 1;
+ double binomial = 1;
+
+ for (long i = k; i-- > 0; )
+ binomial *= (a++) / (b++);
+
+ return binomial;
+ }
+
+ /**
+ * Efficiently returns the binomial coefficient, often also referred to as "n over k" or "n choose k".
+ * The binomial coefficient is defined as
+ * <ul> <li>{@code k<0}: {@code 0}. <li>{@code k==0 || k==n}: {@code 1}. <li>{@code k==1 || k==n-1}:
+ * {@code n}. <li>else: {@code (n * n-1 * ... * n-k+1 ) / ( 1 * 2 * ... * k )}. </ul>
+ *
+ * @param n
+ * @param k
+ * @return Binomial coefficient.
+ */
+ public static double binomial(long n, long k) {
+ if (k < 0)
+ return 0;
+
+ if (k == 0 || k == n)
+ return 1;
+
+ if (k == 1 || k == n - 1)
+ return n;
+
+ if (n > k) {
+ int max = LONG_FACTORIALS.length + DOUBLE_FACTORIALS.length;
+
+ if (n < max) {
+ double nFac = factorial((int)n);
+ double kFac = factorial((int)k);
+ double nMinusKFac = factorial((int)(n - k));
+ double nk = nMinusKFac * kFac;
+
+ if (nk != Double.POSITIVE_INFINITY) // No numeric overflow?
+ return nFac / nk;
+ }
+
+ if (k > n / 2)
+ k = n - k;
+ }
+
+ // binomial(n,k) = (n * n-1 * ... * n-k+1 ) / ( 1 * 2 * ... * k )
+ long a = n - k + 1;
+ long b = 1;
+ double binomial = 1;
+
+ for (long i = k; i-- > 0; )
+ binomial *= (double)a++ / (b++);
+
+ return binomial;
+ }
+
+ /**
+ * Returns the smallest <code>long >= value</code>.
+ * <dl><dt>Examples: {@code 1.0 -> 1, 1.2 -> 2, 1.9 -> 2}. This
+ * method is safer than using (long) Math.ceil(value), because of possible rounding error.</dt></dl>
+ *
+ * @param val
+ */
+ public static long ceil(double val) {
+ return Math.round(Math.ceil(val));
+ }
+
+ /**
+ * Evaluates the series of Chebyshev polynomials Ti at argument x/2. The series is given by
+ * <pre>
+ * N-1
+ * - '
+ * y = > coef[i] T (x/2)
+ * - i
+ * i=0
+ * </pre>
+ * Coefficients are stored in reverse order, i.e. the zero order term is last in the array. Note N is the number of
+ * coefficients, not the order. <p> If coefficients are for the interval a to b, x must have been transformed to x
+ * -< 2(2x - b - a)/(b-a) before entering the routine. This maps x from (a, b) to (-1, 1), over which the
+ * Chebyshev polynomials are defined. <p> If the coefficients are for the inverted interval, in which (a, b) is
+ * mapped to (1/b, 1/a), the transformation required is {@code x -> 2(2ab/x - b - a)/(b-a)}. If b is infinity, this
+ * becomes {@code x -> 4a/x - 1}. <p> SPEED: <p> Taking advantage of the recurrence properties of the Chebyshev
+ * polynomials, the routine requires one more addition per loop than evaluating a nested polynomial of the same
+ * degree.
+ *
+ * @param x Argument to the polynomial.
+ * @param coef Coefficients of the polynomial.
+ * @param N Number of coefficients.
+ */
+ public static double chbevl(double x, double[] coef, int N) {
+ int p = 0;
+
+ double b0 = coef[p++];
+ double b1 = 0.0;
+ int i = N - 1;
+
+ double b2;
+
+ do {
+ b2 = b1;
+ b1 = b0;
+ b0 = x * b1 - b2 + coef[p++];
+ }
+ while (--i > 0);
+
+ return 0.5 * (b0 - b2);
+ }
+
+ /**
+ * Instantly returns the factorial {@code k!}.
+ *
+ * @param k must hold {@code k >= 0}.
+ */
+ private static double factorial(int k) {
+ if (k < 0)
+ throw new IllegalArgumentException();
+
+ int len1 = LONG_FACTORIALS.length;
+
+ if (k < len1)
+ return LONG_FACTORIALS[k];
+
+ int len2 = DOUBLE_FACTORIALS.length;
+
+ return (k < len1 + len2) ? DOUBLE_FACTORIALS[k - len1] : Double.POSITIVE_INFINITY;
+ }
+
+ /**
+ * Returns the largest <code>long <= value</code>.
+ * <dl><dt>Examples: {@code 1.0 -> 1, 1.2 -> 1, 1.9 -> 1 <dt> 2.0 -> 2, 2.2 -> 2, 2.9 -> 2}</dt></dl>
+ * This method is safer than using (long) Math.floor(value), because of possible rounding error.
+ */
+ public static long floor(double val) {
+ return Math.round(Math.floor(val));
+ }
+
+ /**
+ * Returns {@code log<sub>base</sub>value}.
+ */
+ public static double log(double base, double val) {
+ return Math.log(val) / Math.log(base);
+ }
+
+ /**
+ * Returns {@code log<sub>10</sub>value}.
+ */
+ public static double log10(double val) {
+ // 1.0 / Math.log(10) == 0.43429448190325176
+ return Math.log(val) * 0.43429448190325176;
+ }
+
+ /**
+ * Returns {@code log<sub>2</sub>value}.
+ */
+ public static double log2(double val) {
+ // 1.0 / Math.log(2) == 1.4426950408889634
+ return Math.log(val) * 1.4426950408889634;
+ }
+
+ /**
+ * Returns {@code log(k!)}. Tries to avoid overflows. For {@code k<30} simply looks up a table in O(1).
+ * For {@code k>=30} uses stirlings approximation.
+ *
+ * @param k must hold {@code k >= 0}.
+ */
+ public static double logFactorial(int k) {
+ if (k >= 30) {
+ double r = 1.0 / k;
+ double rr = r * r;
+ double C7 = -5.95238095238095238e-04;
+ double C5 = 7.93650793650793651e-04;
+ double C3 = -2.77777777777777778e-03;
+ double C1 = 8.33333333333333333e-02;
+ double C0 = 9.18938533204672742e-01;
+
+ return (k + 0.5) * Math.log(k) - k + C0 + r * (C1 + rr * (C3 + rr * (C5 + rr * C7)));
+ }
+ else
+ return LOG_FACTORIALS[k];
+ }
+
+ /**
+ * Instantly returns the factorial {@code k!}.
+ *
+ * @param k must hold {@code k >= 0 && k < 21}
+ */
+ public static long longFactorial(int k) {
+ if (k < 0)
+ throw new IllegalArgumentException("Negative k");
+
+ if (k < LONG_FACTORIALS.length)
+ return LONG_FACTORIALS[k];
+
+ throw new IllegalArgumentException("Overflow");
+ }
+
+ /**
+ * Returns the StirlingCorrection.
+ *
+ * Correction term of the Stirling approximation for {@code log(k!)} (series in
+ * 1/k, or table values for small k) with int parameter k. </p> {@code log k! = (k + 1/2)log(k + 1) - (k + 1) +
+ * (1/2)log(2Pi) + STIRLING_CORRECTION(k + 1) log k! = (k + 1/2)log(k) - k + (1/2)log(2Pi) +
+ * STIRLING_CORRECTION(k) }
+ */
+ public static double stirlingCorrection(int k) {
+ if (k > 30) {
+ double r = 1.0 / k;
+ double rr = r * r;
+ double C7 = -5.95238095238095238e-04;
+ double C5 = 7.93650793650793651e-04;
+ double C3 = -2.77777777777777778e-03;
+ double C1 = 8.33333333333333333e-02;
+
+ return r * (C1 + rr * (C3 + rr * (C5 + rr * C7)));
+ }
+ else
+ return STIRLING_CORRECTION[k];
+ }
+
+ /**
+ * Evaluates the given polynomial of degree {@code N} at {@code x}, assuming coefficient of N is 1.0. Otherwise same
+ * as {@link #evalPoly(double, double[], int)}.
+ * <pre>
+ * 2 N
+ * y = C + C x + C x +...+ C x
+ * 0 1 2 N
+ *
+ * where C = 1 and hence is omitted from the array.
+ * N
+ *
+ * Coefficients are stored in reverse order:
+ *
+ * coef[0] = C , ..., coef[N-1] = C .
+ * N-1 0
+ *
+ * Calling arguments are otherwise the same as {@link #evalPoly(double, double[], int)}.
+ * </pre>
+ * In the interest of speed, there are no checks for out of bounds arithmetic.
+ *
+ * @param x Argument to the polynomial.
+ * @param coef Coefficients of the polynomial.
+ * @param n Degree of the polynomial.
+ */
+ public static double evalPoly1(double x, double[] coef, int n) {
+ double res = x + coef[0];
+
+ for (int i = 1; i < n; i++)
+ res = res * x + coef[i];
+
+ return res;
+ }
+
+ /**
+ * Evaluates the given polynomial of degree {@code N} at {@code x}.
+ * <pre>
+ * 2 N
+ * y = C + C x + C x +...+ C x
+ * 0 1 2 N
+ *
+ * Coefficients are stored in reverse order:
+ *
+ * coef[0] = C , ..., coef[N] = C .
+ * N 0
+ * </pre>
+ * In the interest of speed, there are no checks for out of bounds arithmetic.
+ *
+ * @param x Argument to the polynomial.
+ * @param coef Coefficients of the polynomial.
+ * @param n Degree of the polynomial.
+ */
+ public static double evalPoly(double x, double[] coef, int n) {
+ double res = coef[0];
+
+ for (int i = 1; i <= n; i++)
+ res = res * x + coef[i];
+
+ return res;
+ }
+
+ /**
+ * Gets <code>sqrt(a^2 + b^2)</code> without under/overflow.
+ *
+ * @param a
+ * @param b
+ */
+ public static double hypot(double a, double b) {
+ double r;
+
+ if (Math.abs(a) > Math.abs(b)) {
+ r = b / a;
+ r = Math.abs(a) * Math.sqrt(1 + r * r);
+ }
+ else if (b != 0) {
+ r = a / b;
+ r = Math.abs(b) * Math.sqrt(1 + r * r);
+ }
+ else
+ r = 0.0;
+
+ return r;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/Constants.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/Constants.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/Constants.java
new file mode 100644
index 0000000..e20c139
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/Constants.java
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ */
+
+/*
+Copyright 1999 CERN - European Organization for Nuclear Research.
+Permission to use, copy, modify, distribute and sell this software and its documentation for any purpose
+is hereby granted without fee, provided that the above copyright notice appear in all copies and
+that both that copyright notice and this permission notice appear in supporting documentation.
+CERN makes no representations about the suitability of this software for any purpose.
+It is provided "as is" without expressed or implied warranty.
+*/
+
+package org.apache.ignite.ml.math;
+
+/**
+ * Math constants. Lifted from Apache Mahout.
+ */
+public class Constants {
+ /** */ public static final double MACHEP = 1.11022302462515654042E-16;
+ /** */ public static final double MAXLOG = 7.09782712893383996732E2;
+ /** */ public static final double MINLOG = -7.451332191019412076235E2;
+ /** */ public static final double MAXGAM = 171.624376956302725;
+ /** */ public static final double SQTPI = 2.50662827463100050242E0;
+ /** */ public static final double SQRTH = 7.07106781186547524401E-1;
+ /** */ public static final double LOGPI = 1.14472988584940017414;
+ /** */ public static final double BIG = 4.503599627370496e15;
+ /** */ public static final double BIGINV = 2.22044604925031308085e-16;
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/Destroyable.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/Destroyable.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/Destroyable.java
new file mode 100644
index 0000000..8e7ce95
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/Destroyable.java
@@ -0,0 +1,30 @@
+/*
+ * 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.ignite.ml.math;
+
+/**
+ * Support for destroying objects that are managed outside of JVM.
+ */
+public interface Destroyable {
+ /**
+ * Destroys object if managed outside of JVM. It's a no-op in all other cases.
+ */
+ public default void destroy() {
+ // No-op.
+ }
+}
[24/67] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math
module to Ignite ML module added missed licenses renamed packages fixed wrong
ml profile activation (cherry picked from commit d78e071)
Posted by sb...@apache.org.
IGNITE-5000 Rename Ignite Math module to Ignite ML module
added missed licenses
renamed packages
fixed wrong ml profile activation
(cherry picked from commit d78e071)
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/0abf6601
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/0abf6601
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/0abf6601
Branch: refs/heads/ignite-5075
Commit: 0abf6601fc1ff1e6e659381666ae706e31b51de0
Parents: 5d8e318
Author: Yury Babak <yb...@gridgain.com>
Authored: Tue Apr 18 16:47:15 2017 +0300
Committer: Anton Vinogradov <av...@apache.org>
Committed: Tue Apr 18 17:54:20 2017 +0300
----------------------------------------------------------------------
examples/pom-standalone-lgpl.xml | 4 -
examples/pom-standalone.xml | 4 -
examples/pom.xml | 4 -
.../CholeskyDecompositionExample.java | 8 +-
.../EigenDecompositionExample.java | 8 +-
.../decompositions/LUDecompositionExample.java | 8 +-
.../SingularValueDecompositionExample.java | 6 +-
.../ml/math/matrix/CacheMatrixExample.java | 10 +-
.../ml/math/matrix/ExampleMatrixStorage.java | 4 +-
.../math/matrix/MatrixCustomStorageExample.java | 12 +-
.../examples/ml/math/matrix/MatrixExample.java | 4 +-
.../ml/math/matrix/MatrixExampleUtil.java | 4 +-
.../ml/math/matrix/OffHeapMatrixExample.java | 4 +-
.../matrix/SparseDistributedMatrixExample.java | 5 +-
.../ml/math/matrix/SparseMatrixExample.java | 4 +-
.../examples/ml/math/tracer/TracerExample.java | 4 +-
.../ml/math/vector/CacheVectorExample.java | 8 +-
.../ml/math/vector/ExampleVectorStorage.java | 4 +-
.../ml/math/vector/OffHeapVectorExample.java | 4 +-
.../ml/math/vector/SparseVectorExample.java | 6 +-
.../math/vector/VectorCustomStorageExample.java | 14 +-
.../examples/ml/math/vector/VectorExample.java | 4 +-
modules/ml/pom.xml | 6 -
.../java/org/apache/ignite/math/Algebra.java | 571 ---------
.../java/org/apache/ignite/math/Constants.java | 42 -
.../org/apache/ignite/math/Destroyable.java | 30 -
.../apache/ignite/math/IdentityValueMapper.java | 53 -
.../java/org/apache/ignite/math/KeyMapper.java | 33 -
.../java/org/apache/ignite/math/Matrix.java | 518 --------
.../org/apache/ignite/math/MatrixKeyMapper.java | 30 -
.../org/apache/ignite/math/MatrixStorage.java | 58 -
.../org/apache/ignite/math/MetaAttributes.java | 76 --
.../java/org/apache/ignite/math/MurmurHash.java | 246 ----
.../apache/ignite/math/StorageConstants.java | 49 -
.../apache/ignite/math/StorageOpsMetrics.java | 49 -
.../java/org/apache/ignite/math/Tracer.java | 456 -------
.../org/apache/ignite/math/ValueMapper.java | 27 -
.../java/org/apache/ignite/math/Vector.java | 498 --------
.../org/apache/ignite/math/VectorKeyMapper.java | 29 -
.../org/apache/ignite/math/VectorStorage.java | 53 -
.../decompositions/CholeskyDecomposition.java | 306 -----
.../decompositions/DecompositionSupport.java | 105 --
.../math/decompositions/EigenDecomposition.java | 923 ---------------
.../math/decompositions/LUDecomposition.java | 366 ------
.../math/decompositions/QRDecomposition.java | 186 ---
.../SingularValueDecomposition.java | 620 ----------
.../math/decompositions/package-info.java | 22 -
.../math/exceptions/CardinalityException.java | 38 -
.../math/exceptions/ColumnIndexException.java | 35 -
.../ignite/math/exceptions/IndexException.java | 35 -
.../NonPositiveDefiniteMatrixException.java | 20 -
.../exceptions/NonSymmetricMatrixException.java | 18 -
.../math/exceptions/RowIndexException.java | 35 -
.../exceptions/SingularMatrixException.java | 30 -
.../exceptions/UnknownProviderException.java | 35 -
.../UnsupportedOperationException.java | 44 -
.../ignite/math/exceptions/package-info.java | 22 -
.../apache/ignite/math/functions/Functions.java | 136 ---
.../ignite/math/functions/IgniteBiConsumer.java | 12 -
.../ignite/math/functions/IgniteBiFunction.java | 29 -
.../ignite/math/functions/IgniteConsumer.java | 29 -
.../math/functions/IgniteDoubleFunction.java | 29 -
.../ignite/math/functions/IgniteFunction.java | 30 -
.../math/functions/IntDoubleToVoidFunction.java | 25 -
.../functions/IntIntDoubleToVoidFunction.java | 28 -
.../math/functions/IntIntToDoubleFunction.java | 24 -
.../ignite/math/functions/package-info.java | 22 -
.../apache/ignite/math/impls/CacheUtils.java | 356 ------
.../math/impls/matrix/AbstractMatrix.java | 880 --------------
.../ignite/math/impls/matrix/CacheMatrix.java | 158 ---
.../impls/matrix/DenseLocalOffHeapMatrix.java | 90 --
.../impls/matrix/DenseLocalOnHeapMatrix.java | 86 --
.../math/impls/matrix/DiagonalMatrix.java | 101 --
.../math/impls/matrix/FunctionMatrix.java | 95 --
.../ignite/math/impls/matrix/MatrixView.java | 84 --
.../math/impls/matrix/PivotedMatrixView.java | 243 ----
.../ignite/math/impls/matrix/RandomMatrix.java | 97 --
.../impls/matrix/SparseDistributedMatrix.java | 155 ---
.../impls/matrix/SparseLocalOnHeapMatrix.java | 72 --
.../math/impls/matrix/TransposedMatrixView.java | 84 --
.../ignite/math/impls/matrix/package-info.java | 22 -
.../apache/ignite/math/impls/package-info.java | 22 -
.../storage/matrix/ArrayMatrixStorage.java | 161 ---
.../storage/matrix/CacheMatrixStorage.java | 180 ---
.../matrix/DenseOffHeapMatrixStorage.java | 197 ----
.../storage/matrix/DiagonalMatrixStorage.java | 136 ---
.../storage/matrix/FunctionMatrixStorage.java | 175 ---
.../storage/matrix/MatrixDelegateStorage.java | 205 ----
.../storage/matrix/PivotedMatrixStorage.java | 256 ----
.../storage/matrix/RandomMatrixStorage.java | 176 ---
.../matrix/SparseDistributedMatrixStorage.java | 281 -----
.../matrix/SparseLocalOnHeapMatrixStorage.java | 226 ----
.../math/impls/storage/matrix/package-info.java | 22 -
.../storage/vector/ArrayVectorStorage.java | 135 ---
.../storage/vector/CacheVectorStorage.java | 175 ---
.../storage/vector/ConstantVectorStorage.java | 133 ---
.../storage/vector/DelegateVectorStorage.java | 157 ---
.../vector/DenseLocalOffHeapVectorStorage.java | 172 ---
.../storage/vector/FunctionVectorStorage.java | 141 ---
.../storage/vector/MatrixVectorStorage.java | 185 ---
.../storage/vector/PivotedVectorStorage.java | 175 ---
.../storage/vector/RandomVectorStorage.java | 152 ---
.../SingleElementVectorDelegateStorage.java | 145 ---
.../vector/SingleElementVectorStorage.java | 143 ---
.../vector/SparseLocalOffHeapVectorStorage.java | 148 ---
.../vector/SparseLocalOnHeapVectorStorage.java | 152 ---
.../math/impls/storage/vector/package-info.java | 22 -
.../impls/vector/AbstractReadOnlyVector.java | 108 --
.../math/impls/vector/AbstractVector.java | 903 --------------
.../ignite/math/impls/vector/CacheVector.java | 140 ---
.../math/impls/vector/ConstantVector.java | 84 --
.../math/impls/vector/DelegatingVector.java | 391 ------
.../impls/vector/DenseLocalOffHeapVector.java | 89 --
.../impls/vector/DenseLocalOnHeapVector.java | 104 --
.../math/impls/vector/FunctionVector.java | 112 --
.../math/impls/vector/MatrixVectorView.java | 139 ---
.../math/impls/vector/PivotedVectorView.java | 163 ---
.../ignite/math/impls/vector/RandomVector.java | 128 --
.../math/impls/vector/SingleElementVector.java | 102 --
.../impls/vector/SingleElementVectorView.java | 97 --
.../impls/vector/SparseLocalOffHeapVector.java | 47 -
.../math/impls/vector/SparseLocalVector.java | 71 --
.../ignite/math/impls/vector/VectorView.java | 85 --
.../ignite/math/impls/vector/package-info.java | 22 -
.../org/apache/ignite/math/package-info.java | 22 -
.../java/org/apache/ignite/ml/math/Algebra.java | 571 +++++++++
.../org/apache/ignite/ml/math/Constants.java | 42 +
.../org/apache/ignite/ml/math/Destroyable.java | 30 +
.../ignite/ml/math/IdentityValueMapper.java | 53 +
.../org/apache/ignite/ml/math/KeyMapper.java | 33 +
.../java/org/apache/ignite/ml/math/Matrix.java | 518 ++++++++
.../apache/ignite/ml/math/MatrixKeyMapper.java | 30 +
.../apache/ignite/ml/math/MatrixStorage.java | 58 +
.../apache/ignite/ml/math/MetaAttributes.java | 76 ++
.../org/apache/ignite/ml/math/MurmurHash.java | 246 ++++
.../apache/ignite/ml/math/StorageConstants.java | 49 +
.../ignite/ml/math/StorageOpsMetrics.java | 49 +
.../java/org/apache/ignite/ml/math/Tracer.java | 456 +++++++
.../org/apache/ignite/ml/math/ValueMapper.java | 35 +
.../java/org/apache/ignite/ml/math/Vector.java | 498 ++++++++
.../apache/ignite/ml/math/VectorKeyMapper.java | 29 +
.../apache/ignite/ml/math/VectorStorage.java | 53 +
.../decompositions/CholeskyDecomposition.java | 306 +++++
.../decompositions/DecompositionSupport.java | 105 ++
.../math/decompositions/EigenDecomposition.java | 923 +++++++++++++++
.../ml/math/decompositions/LUDecomposition.java | 366 ++++++
.../ml/math/decompositions/QRDecomposition.java | 186 +++
.../SingularValueDecomposition.java | 620 ++++++++++
.../ml/math/decompositions/package-info.java | 22 +
.../math/exceptions/CardinalityException.java | 38 +
.../math/exceptions/ColumnIndexException.java | 35 +
.../ml/math/exceptions/IndexException.java | 35 +
.../NonPositiveDefiniteMatrixException.java | 37 +
.../exceptions/NonSymmetricMatrixException.java | 35 +
.../ml/math/exceptions/RowIndexException.java | 35 +
.../exceptions/SingularMatrixException.java | 30 +
.../exceptions/UnknownProviderException.java | 35 +
.../UnsupportedOperationException.java | 44 +
.../ignite/ml/math/exceptions/package-info.java | 22 +
.../ignite/ml/math/functions/Functions.java | 136 +++
.../ml/math/functions/IgniteBiConsumer.java | 29 +
.../ml/math/functions/IgniteBiFunction.java | 29 +
.../ml/math/functions/IgniteConsumer.java | 29 +
.../ml/math/functions/IgniteDoubleFunction.java | 29 +
.../ml/math/functions/IgniteFunction.java | 30 +
.../math/functions/IntDoubleToVoidFunction.java | 25 +
.../functions/IntIntDoubleToVoidFunction.java | 28 +
.../math/functions/IntIntToDoubleFunction.java | 24 +
.../ignite/ml/math/functions/package-info.java | 22 +
.../apache/ignite/ml/math/impls/CacheUtils.java | 356 ++++++
.../ml/math/impls/matrix/AbstractMatrix.java | 880 ++++++++++++++
.../ml/math/impls/matrix/CacheMatrix.java | 158 +++
.../impls/matrix/DenseLocalOffHeapMatrix.java | 90 ++
.../impls/matrix/DenseLocalOnHeapMatrix.java | 86 ++
.../ml/math/impls/matrix/DiagonalMatrix.java | 101 ++
.../ml/math/impls/matrix/FunctionMatrix.java | 95 ++
.../ignite/ml/math/impls/matrix/MatrixView.java | 84 ++
.../ml/math/impls/matrix/PivotedMatrixView.java | 243 ++++
.../ml/math/impls/matrix/RandomMatrix.java | 97 ++
.../impls/matrix/SparseDistributedMatrix.java | 155 +++
.../impls/matrix/SparseLocalOnHeapMatrix.java | 72 ++
.../math/impls/matrix/TransposedMatrixView.java | 84 ++
.../ml/math/impls/matrix/package-info.java | 22 +
.../ignite/ml/math/impls/package-info.java | 22 +
.../storage/matrix/ArrayMatrixStorage.java | 161 +++
.../storage/matrix/CacheMatrixStorage.java | 180 +++
.../matrix/DenseOffHeapMatrixStorage.java | 197 ++++
.../storage/matrix/DiagonalMatrixStorage.java | 136 +++
.../storage/matrix/FunctionMatrixStorage.java | 175 +++
.../storage/matrix/MatrixDelegateStorage.java | 205 ++++
.../storage/matrix/PivotedMatrixStorage.java | 256 ++++
.../storage/matrix/RandomMatrixStorage.java | 176 +++
.../matrix/SparseDistributedMatrixStorage.java | 290 +++++
.../matrix/SparseLocalOnHeapMatrixStorage.java | 226 ++++
.../math/impls/storage/matrix/package-info.java | 22 +
.../storage/vector/ArrayVectorStorage.java | 135 +++
.../storage/vector/CacheVectorStorage.java | 175 +++
.../storage/vector/ConstantVectorStorage.java | 133 +++
.../storage/vector/DelegateVectorStorage.java | 157 +++
.../vector/DenseLocalOffHeapVectorStorage.java | 172 +++
.../storage/vector/FunctionVectorStorage.java | 141 +++
.../storage/vector/MatrixVectorStorage.java | 185 +++
.../storage/vector/PivotedVectorStorage.java | 175 +++
.../storage/vector/RandomVectorStorage.java | 152 +++
.../SingleElementVectorDelegateStorage.java | 145 +++
.../vector/SingleElementVectorStorage.java | 143 +++
.../vector/SparseLocalOffHeapVectorStorage.java | 149 +++
.../vector/SparseLocalOnHeapVectorStorage.java | 152 +++
.../math/impls/storage/vector/package-info.java | 22 +
.../impls/vector/AbstractReadOnlyVector.java | 125 ++
.../ml/math/impls/vector/AbstractVector.java | 903 ++++++++++++++
.../ml/math/impls/vector/CacheVector.java | 140 +++
.../ml/math/impls/vector/ConstantVector.java | 84 ++
.../ml/math/impls/vector/DelegatingVector.java | 391 ++++++
.../impls/vector/DenseLocalOffHeapVector.java | 89 ++
.../impls/vector/DenseLocalOnHeapVector.java | 104 ++
.../ml/math/impls/vector/FunctionVector.java | 112 ++
.../ml/math/impls/vector/MatrixVectorView.java | 139 +++
.../ml/math/impls/vector/PivotedVectorView.java | 163 +++
.../ml/math/impls/vector/RandomVector.java | 129 ++
.../math/impls/vector/SingleElementVector.java | 102 ++
.../impls/vector/SingleElementVectorView.java | 97 ++
.../impls/vector/SparseLocalOffHeapVector.java | 47 +
.../ml/math/impls/vector/SparseLocalVector.java | 71 ++
.../ignite/ml/math/impls/vector/VectorView.java | 85 ++
.../ml/math/impls/vector/package-info.java | 22 +
.../org/apache/ignite/ml/math/package-info.java | 22 +
.../apache/ignite/math/d3-matrix-template.html | 128 --
.../apache/ignite/math/d3-vector-template.html | 111 --
.../ignite/ml/math/d3-matrix-template.html | 128 ++
.../ignite/ml/math/d3-vector-template.html | 111 ++
.../org/apache/ignite/math/ExternalizeTest.java | 66 --
.../math/MathImplDistributedTestSuite.java | 39 -
.../ignite/math/MathImplLocalTestSuite.java | 123 --
.../ignite/math/MathImplMainTestSuite.java | 33 -
.../java/org/apache/ignite/math/TracerTest.java | 195 ---
.../ignite/math/benchmark/MathBenchmark.java | 205 ----
.../math/benchmark/MathBenchmarkSelfTest.java | 100 --
.../ignite/math/benchmark/ResultsWriter.java | 127 --
.../math/benchmark/VectorBenchmarkTest.java | 138 ---
.../ignite/math/benchmark/package-info.java | 18 -
.../CholeskyDecompositionTest.java | 158 ---
.../decompositions/EigenDecompositionTest.java | 193 ---
.../decompositions/LUDecompositionTest.java | 250 ----
.../decompositions/QRDecompositionTest.java | 139 ---
.../SingularValueDecompositionTest.java | 120 --
.../ignite/math/impls/MathTestConstants.java | 88 --
.../math/impls/matrix/CacheMatrixTest.java | 369 ------
.../DenseLocalOffHeapMatrixConstructorTest.java | 65 -
.../DenseLocalOnHeapMatrixConstructorTest.java | 71 --
.../math/impls/matrix/DiagonalMatrixTest.java | 209 ----
.../matrix/FunctionMatrixConstructorTest.java | 113 --
.../math/impls/matrix/MatrixAttributeTest.java | 156 ---
.../matrix/MatrixImplementationFixtures.java | 381 ------
.../impls/matrix/MatrixImplementationsTest.java | 1113 ------------------
.../impls/matrix/MatrixKeyMapperForTests.java | 69 --
.../impls/matrix/MatrixViewConstructorTest.java | 114 --
.../PivotedMatrixViewConstructorTest.java | 128 --
.../matrix/RandomMatrixConstructorTest.java | 71 --
.../matrix/SparseDistributedMatrixTest.java | 265 -----
.../SparseLocalOnHeapMatrixConstructorTest.java | 53 -
.../impls/matrix/TransposedMatrixViewTest.java | 87 --
.../storage/matrix/MatrixArrayStorageTest.java | 63 -
.../storage/matrix/MatrixBaseStorageTest.java | 89 --
.../matrix/MatrixOffHeapStorageTest.java | 39 -
.../storage/matrix/MatrixStorageFixtures.java | 141 ---
.../matrix/MatrixStorageImplementationTest.java | 73 --
.../SparseDistributedMatrixStorageTest.java | 126 --
.../RandomAccessSparseVectorStorageTest.java | 60 -
.../SparseLocalOffHeapVectorStorageTest.java | 78 --
.../storage/vector/VectorArrayStorageTest.java | 58 -
.../storage/vector/VectorBaseStorageTest.java | 69 --
.../vector/VectorOffheapStorageTest.java | 73 --
.../math/impls/vector/AbstractVectorTest.java | 543 ---------
.../math/impls/vector/CacheVectorTest.java | 417 -------
.../vector/ConstantVectorConstructorTest.java | 52 -
.../vector/DelegatingVectorConstructorTest.java | 62 -
.../DenseLocalOffHeapVectorConstructorTest.java | 59 -
.../DenseLocalOnHeapVectorConstructorTest.java | 163 ---
.../vector/FunctionVectorConstructorTest.java | 121 --
.../math/impls/vector/MatrixVectorViewTest.java | 209 ----
.../PivotedVectorViewConstructorTest.java | 211 ----
.../vector/RandomVectorConstructorTest.java | 145 ---
.../SingleElementVectorConstructorTest.java | 159 ---
.../SingleElementVectorViewConstructorTest.java | 137 ---
.../SparseLocalVectorConstructorTest.java | 54 -
.../math/impls/vector/VectorAttributesTest.java | 217 ----
.../math/impls/vector/VectorFoldMapTest.java | 122 --
.../vector/VectorImplementationsFixtures.java | 655 -----------
.../impls/vector/VectorImplementationsTest.java | 860 --------------
.../math/impls/vector/VectorIterableTest.java | 376 ------
.../math/impls/vector/VectorNormTest.java | 247 ----
.../math/impls/vector/VectorToMatrixTest.java | 291 -----
.../math/impls/vector/VectorViewTest.java | 162 ---
.../apache/ignite/ml/math/ExternalizeTest.java | 66 ++
.../ml/math/MathImplDistributedTestSuite.java | 39 +
.../ignite/ml/math/MathImplLocalTestSuite.java | 123 ++
.../ignite/ml/math/MathImplMainTestSuite.java | 33 +
.../org/apache/ignite/ml/math/TracerTest.java | 195 +++
.../ignite/ml/math/benchmark/MathBenchmark.java | 205 ++++
.../math/benchmark/MathBenchmarkSelfTest.java | 100 ++
.../ignite/ml/math/benchmark/ResultsWriter.java | 127 ++
.../ml/math/benchmark/VectorBenchmarkTest.java | 138 +++
.../ignite/ml/math/benchmark/package-info.java | 18 +
.../CholeskyDecompositionTest.java | 158 +++
.../decompositions/EigenDecompositionTest.java | 193 +++
.../decompositions/LUDecompositionTest.java | 250 ++++
.../decompositions/QRDecompositionTest.java | 139 +++
.../SingularValueDecompositionTest.java | 120 ++
.../ignite/ml/math/impls/MathTestConstants.java | 88 ++
.../ml/math/impls/matrix/CacheMatrixTest.java | 369 ++++++
.../DenseLocalOffHeapMatrixConstructorTest.java | 65 +
.../DenseLocalOnHeapMatrixConstructorTest.java | 71 ++
.../math/impls/matrix/DiagonalMatrixTest.java | 209 ++++
.../matrix/FunctionMatrixConstructorTest.java | 113 ++
.../math/impls/matrix/MatrixAttributeTest.java | 156 +++
.../matrix/MatrixImplementationFixtures.java | 381 ++++++
.../impls/matrix/MatrixImplementationsTest.java | 1113 ++++++++++++++++++
.../impls/matrix/MatrixKeyMapperForTests.java | 69 ++
.../impls/matrix/MatrixViewConstructorTest.java | 114 ++
.../PivotedMatrixViewConstructorTest.java | 129 ++
.../matrix/RandomMatrixConstructorTest.java | 71 ++
.../matrix/SparseDistributedMatrixTest.java | 265 +++++
.../SparseLocalOnHeapMatrixConstructorTest.java | 53 +
.../impls/matrix/TransposedMatrixViewTest.java | 87 ++
.../storage/matrix/MatrixArrayStorageTest.java | 63 +
.../storage/matrix/MatrixBaseStorageTest.java | 89 ++
.../matrix/MatrixOffHeapStorageTest.java | 39 +
.../storage/matrix/MatrixStorageFixtures.java | 137 +++
.../matrix/MatrixStorageImplementationTest.java | 73 ++
.../SparseDistributedMatrixStorageTest.java | 126 ++
.../RandomAccessSparseVectorStorageTest.java | 60 +
.../SparseLocalOffHeapVectorStorageTest.java | 78 ++
.../storage/vector/VectorArrayStorageTest.java | 58 +
.../storage/vector/VectorBaseStorageTest.java | 69 ++
.../vector/VectorOffheapStorageTest.java | 73 ++
.../math/impls/vector/AbstractVectorTest.java | 543 +++++++++
.../ml/math/impls/vector/CacheVectorTest.java | 434 +++++++
.../vector/ConstantVectorConstructorTest.java | 52 +
.../vector/DelegatingVectorConstructorTest.java | 62 +
.../DenseLocalOffHeapVectorConstructorTest.java | 59 +
.../DenseLocalOnHeapVectorConstructorTest.java | 163 +++
.../vector/FunctionVectorConstructorTest.java | 121 ++
.../math/impls/vector/MatrixVectorViewTest.java | 226 ++++
.../PivotedVectorViewConstructorTest.java | 211 ++++
.../vector/RandomVectorConstructorTest.java | 145 +++
.../SingleElementVectorConstructorTest.java | 159 +++
.../SingleElementVectorViewConstructorTest.java | 137 +++
.../SparseLocalVectorConstructorTest.java | 54 +
.../math/impls/vector/VectorAttributesTest.java | 217 ++++
.../ml/math/impls/vector/VectorFoldMapTest.java | 122 ++
.../vector/VectorImplementationsFixtures.java | 655 +++++++++++
.../impls/vector/VectorImplementationsTest.java | 861 ++++++++++++++
.../math/impls/vector/VectorIterableTest.java | 376 ++++++
.../ml/math/impls/vector/VectorNormTest.java | 247 ++++
.../math/impls/vector/VectorToMatrixTest.java | 308 +++++
.../ml/math/impls/vector/VectorViewTest.java | 162 +++
357 files changed, 27247 insertions(+), 27128 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/examples/pom-standalone-lgpl.xml
----------------------------------------------------------------------
diff --git a/examples/pom-standalone-lgpl.xml b/examples/pom-standalone-lgpl.xml
index 2b4ece0..5fbb4ea 100644
--- a/examples/pom-standalone-lgpl.xml
+++ b/examples/pom-standalone-lgpl.xml
@@ -113,10 +113,6 @@
<java.ver>1.8</java.ver>
</properties>
- <activation>
- <jdk>[1.8,)</jdk>
- </activation>
-
<dependencies>
<dependency>
<groupId>org.apache.ignite</groupId>
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/examples/pom-standalone.xml
----------------------------------------------------------------------
diff --git a/examples/pom-standalone.xml b/examples/pom-standalone.xml
index 64b4301..0183563 100644
--- a/examples/pom-standalone.xml
+++ b/examples/pom-standalone.xml
@@ -113,10 +113,6 @@
<java.ver>1.8</java.ver>
</properties>
- <activation>
- <jdk>[1.8,)</jdk>
- </activation>
-
<dependencies>
<dependency>
<groupId>org.apache.ignite</groupId>
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/examples/pom.xml
----------------------------------------------------------------------
diff --git a/examples/pom.xml b/examples/pom.xml
index b933385..895519b 100644
--- a/examples/pom.xml
+++ b/examples/pom.xml
@@ -260,10 +260,6 @@
<ml.folder>src/main/ml</ml.folder>
</properties>
- <activation>
- <jdk>[1.8,)</jdk>
- </activation>
-
<build>
<plugins>
<plugin>
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/examples/src/main/ml/org/apache/ignite/examples/ml/math/decompositions/CholeskyDecompositionExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/ml/org/apache/ignite/examples/ml/math/decompositions/CholeskyDecompositionExample.java b/examples/src/main/ml/org/apache/ignite/examples/ml/math/decompositions/CholeskyDecompositionExample.java
index 07308f5..ebac2b1 100644
--- a/examples/src/main/ml/org/apache/ignite/examples/ml/math/decompositions/CholeskyDecompositionExample.java
+++ b/examples/src/main/ml/org/apache/ignite/examples/ml/math/decompositions/CholeskyDecompositionExample.java
@@ -17,10 +17,10 @@
package org.apache.ignite.examples.ml.math.decompositions;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Tracer;
-import org.apache.ignite.math.decompositions.CholeskyDecomposition;
-import org.apache.ignite.math.impls.matrix.DenseLocalOnHeapMatrix;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Tracer;
+import org.apache.ignite.ml.math.decompositions.CholeskyDecomposition;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
/**
* Example of using {@link CholeskyDecomposition}.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/examples/src/main/ml/org/apache/ignite/examples/ml/math/decompositions/EigenDecompositionExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/ml/org/apache/ignite/examples/ml/math/decompositions/EigenDecompositionExample.java b/examples/src/main/ml/org/apache/ignite/examples/ml/math/decompositions/EigenDecompositionExample.java
index 16e692b..cda37f4 100644
--- a/examples/src/main/ml/org/apache/ignite/examples/ml/math/decompositions/EigenDecompositionExample.java
+++ b/examples/src/main/ml/org/apache/ignite/examples/ml/math/decompositions/EigenDecompositionExample.java
@@ -17,10 +17,10 @@
package org.apache.ignite.examples.ml.math.decompositions;
-import org.apache.ignite.math.Tracer;
-import org.apache.ignite.math.decompositions.EigenDecomposition;
-import org.apache.ignite.math.functions.Functions;
-import org.apache.ignite.math.impls.matrix.DenseLocalOnHeapMatrix;
+import org.apache.ignite.ml.math.Tracer;
+import org.apache.ignite.ml.math.decompositions.EigenDecomposition;
+import org.apache.ignite.ml.math.functions.Functions;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
/**
* Example of using {@link EigenDecomposition}.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/examples/src/main/ml/org/apache/ignite/examples/ml/math/decompositions/LUDecompositionExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/ml/org/apache/ignite/examples/ml/math/decompositions/LUDecompositionExample.java b/examples/src/main/ml/org/apache/ignite/examples/ml/math/decompositions/LUDecompositionExample.java
index c670eab..a815047 100644
--- a/examples/src/main/ml/org/apache/ignite/examples/ml/math/decompositions/LUDecompositionExample.java
+++ b/examples/src/main/ml/org/apache/ignite/examples/ml/math/decompositions/LUDecompositionExample.java
@@ -17,10 +17,10 @@
package org.apache.ignite.examples.ml.math.decompositions;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Tracer;
-import org.apache.ignite.math.decompositions.LUDecomposition;
-import org.apache.ignite.math.impls.matrix.DenseLocalOnHeapMatrix;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Tracer;
+import org.apache.ignite.ml.math.decompositions.LUDecomposition;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
/**
* Example of using {@link LUDecomposition}.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/examples/src/main/ml/org/apache/ignite/examples/ml/math/decompositions/SingularValueDecompositionExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/ml/org/apache/ignite/examples/ml/math/decompositions/SingularValueDecompositionExample.java b/examples/src/main/ml/org/apache/ignite/examples/ml/math/decompositions/SingularValueDecompositionExample.java
index 281fbc4..81406ae 100644
--- a/examples/src/main/ml/org/apache/ignite/examples/ml/math/decompositions/SingularValueDecompositionExample.java
+++ b/examples/src/main/ml/org/apache/ignite/examples/ml/math/decompositions/SingularValueDecompositionExample.java
@@ -17,9 +17,9 @@
package org.apache.ignite.examples.ml.math.decompositions;
-import org.apache.ignite.math.Tracer;
-import org.apache.ignite.math.decompositions.SingularValueDecomposition;
-import org.apache.ignite.math.impls.matrix.DenseLocalOnHeapMatrix;
+import org.apache.ignite.ml.math.Tracer;
+import org.apache.ignite.ml.math.decompositions.SingularValueDecomposition;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
/**
* Example of using {@link SingularValueDecomposition}.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/CacheMatrixExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/CacheMatrixExample.java b/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/CacheMatrixExample.java
index 80f861f..ec414e5 100644
--- a/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/CacheMatrixExample.java
+++ b/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/CacheMatrixExample.java
@@ -21,11 +21,11 @@ import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.Ignition;
import org.apache.ignite.configuration.CacheConfiguration;
-import org.apache.ignite.math.IdentityValueMapper;
-import org.apache.ignite.math.MatrixKeyMapper;
-import org.apache.ignite.math.ValueMapper;
-import org.apache.ignite.math.functions.Functions;
-import org.apache.ignite.math.impls.matrix.CacheMatrix;
+import org.apache.ignite.ml.math.IdentityValueMapper;
+import org.apache.ignite.ml.math.MatrixKeyMapper;
+import org.apache.ignite.ml.math.ValueMapper;
+import org.apache.ignite.ml.math.functions.Functions;
+import org.apache.ignite.ml.math.impls.matrix.CacheMatrix;
/** */
public class CacheMatrixExample {
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/ExampleMatrixStorage.java
----------------------------------------------------------------------
diff --git a/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/ExampleMatrixStorage.java b/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/ExampleMatrixStorage.java
index d0c8604..5fb06d7 100644
--- a/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/ExampleMatrixStorage.java
+++ b/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/ExampleMatrixStorage.java
@@ -22,10 +22,10 @@ import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.Arrays;
-import org.apache.ignite.math.MatrixStorage;
+import org.apache.ignite.ml.math.MatrixStorage;
/**
- * Example matrix storage, modeled after {@link org.apache.ignite.math.impls.storage.matrix.ArrayMatrixStorage}.
+ * Example matrix storage, modeled after {@link org.apache.ignite.ml.math.impls.storage.matrix.ArrayMatrixStorage}.
*/
class ExampleMatrixStorage implements MatrixStorage {
/** Backing data array. */
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/MatrixCustomStorageExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/MatrixCustomStorageExample.java b/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/MatrixCustomStorageExample.java
index b3df9f1..76716cc 100644
--- a/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/MatrixCustomStorageExample.java
+++ b/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/MatrixCustomStorageExample.java
@@ -17,11 +17,11 @@
package org.apache.ignite.examples.ml.math.matrix;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.MatrixStorage;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.impls.matrix.AbstractMatrix;
-import org.apache.ignite.math.impls.vector.DenseLocalOnHeapVector;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.MatrixStorage;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.impls.matrix.AbstractMatrix;
+import org.apache.ignite.ml.math.impls.vector.DenseLocalOnHeapVector;
/**
* This example shows how to use {@link Matrix} API based on custom {@link MatrixStorage}.
@@ -82,7 +82,7 @@ public final class MatrixCustomStorageExample {
/**
* Example of vector with custom storage, modeled after
- * {@link org.apache.ignite.math.impls.matrix.DenseLocalOnHeapMatrix}.
+ * {@link org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix}.
*/
static class MatrixCustomStorage extends AbstractMatrix {
/**
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/MatrixExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/MatrixExample.java b/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/MatrixExample.java
index 66f50d5..66db374 100644
--- a/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/MatrixExample.java
+++ b/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/MatrixExample.java
@@ -17,8 +17,8 @@
package org.apache.ignite.examples.ml.math.matrix;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.impls.matrix.DenseLocalOnHeapMatrix;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
/**
* This example shows how to use {@link Matrix} API.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/MatrixExampleUtil.java
----------------------------------------------------------------------
diff --git a/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/MatrixExampleUtil.java b/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/MatrixExampleUtil.java
index bf406a8..af12e15 100644
--- a/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/MatrixExampleUtil.java
+++ b/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/MatrixExampleUtil.java
@@ -17,8 +17,8 @@
package org.apache.ignite.examples.ml.math.matrix;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Tracer;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Tracer;
/**
* Utility functions for {@link Matrix} API examples.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/OffHeapMatrixExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/OffHeapMatrixExample.java b/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/OffHeapMatrixExample.java
index 71dc2b8..f743bd9 100644
--- a/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/OffHeapMatrixExample.java
+++ b/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/OffHeapMatrixExample.java
@@ -17,8 +17,8 @@
package org.apache.ignite.examples.ml.math.matrix;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.impls.matrix.DenseLocalOffHeapMatrix;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOffHeapMatrix;
/**
* This example shows how to use off-heap {@link Matrix} API.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/SparseDistributedMatrixExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/SparseDistributedMatrixExample.java b/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/SparseDistributedMatrixExample.java
index ffbd9af..1e5f099 100644
--- a/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/SparseDistributedMatrixExample.java
+++ b/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/SparseDistributedMatrixExample.java
@@ -14,12 +14,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package org.apache.ignite.examples.ml.math.matrix;
import org.apache.ignite.Ignite;
import org.apache.ignite.Ignition;
-import org.apache.ignite.math.StorageConstants;
-import org.apache.ignite.math.impls.matrix.SparseDistributedMatrix;
+import org.apache.ignite.ml.math.StorageConstants;
+import org.apache.ignite.ml.math.impls.matrix.SparseDistributedMatrix;
import org.apache.ignite.thread.IgniteThread;
/**
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/SparseMatrixExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/SparseMatrixExample.java b/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/SparseMatrixExample.java
index d63d985..d3715ea 100644
--- a/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/SparseMatrixExample.java
+++ b/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/SparseMatrixExample.java
@@ -17,8 +17,8 @@
package org.apache.ignite.examples.ml.math.matrix;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.impls.matrix.SparseLocalOnHeapMatrix;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.impls.matrix.SparseLocalOnHeapMatrix;
/**
* This example shows how to use sparse {@link Matrix} API.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/examples/src/main/ml/org/apache/ignite/examples/ml/math/tracer/TracerExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/ml/org/apache/ignite/examples/ml/math/tracer/TracerExample.java b/examples/src/main/ml/org/apache/ignite/examples/ml/math/tracer/TracerExample.java
index 0bf7743..085153c 100644
--- a/examples/src/main/ml/org/apache/ignite/examples/ml/math/tracer/TracerExample.java
+++ b/examples/src/main/ml/org/apache/ignite/examples/ml/math/tracer/TracerExample.java
@@ -19,8 +19,8 @@ package org.apache.ignite.examples.ml.math.tracer;
import java.awt.Color;
import java.io.IOException;
-import org.apache.ignite.math.Tracer;
-import org.apache.ignite.math.impls.matrix.DenseLocalOnHeapMatrix;
+import org.apache.ignite.ml.math.Tracer;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
/**
* Example of using {@link Tracer} utility API.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/CacheVectorExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/CacheVectorExample.java b/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/CacheVectorExample.java
index 3e83ef5..789248c 100644
--- a/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/CacheVectorExample.java
+++ b/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/CacheVectorExample.java
@@ -21,10 +21,10 @@ import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.Ignition;
import org.apache.ignite.configuration.CacheConfiguration;
-import org.apache.ignite.math.IdentityValueMapper;
-import org.apache.ignite.math.ValueMapper;
-import org.apache.ignite.math.VectorKeyMapper;
-import org.apache.ignite.math.impls.vector.CacheVector;
+import org.apache.ignite.ml.math.IdentityValueMapper;
+import org.apache.ignite.ml.math.ValueMapper;
+import org.apache.ignite.ml.math.VectorKeyMapper;
+import org.apache.ignite.ml.math.impls.vector.CacheVector;
/**
* This example shows how to use {@link CacheVector} API.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/ExampleVectorStorage.java
----------------------------------------------------------------------
diff --git a/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/ExampleVectorStorage.java b/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/ExampleVectorStorage.java
index b382c46..bc46b63 100644
--- a/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/ExampleVectorStorage.java
+++ b/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/ExampleVectorStorage.java
@@ -22,10 +22,10 @@ import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.Arrays;
-import org.apache.ignite.math.VectorStorage;
+import org.apache.ignite.ml.math.VectorStorage;
/**
- * Example vector storage, modeled after {@link org.apache.ignite.math.impls.storage.vector.ArrayVectorStorage}.
+ * Example vector storage, modeled after {@link org.apache.ignite.ml.math.impls.storage.vector.ArrayVectorStorage}.
*/
class ExampleVectorStorage implements VectorStorage {
/** */
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/OffHeapVectorExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/OffHeapVectorExample.java b/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/OffHeapVectorExample.java
index 031843b..f470aef 100644
--- a/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/OffHeapVectorExample.java
+++ b/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/OffHeapVectorExample.java
@@ -18,8 +18,8 @@
package org.apache.ignite.examples.ml.math.vector;
import java.util.Arrays;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.impls.vector.DenseLocalOffHeapVector;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.impls.vector.DenseLocalOffHeapVector;
/**
* This example shows how to use off-heap {@link Vector} API.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/SparseVectorExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/SparseVectorExample.java b/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/SparseVectorExample.java
index f5678f6..8ace55b 100644
--- a/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/SparseVectorExample.java
+++ b/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/SparseVectorExample.java
@@ -18,10 +18,10 @@
package org.apache.ignite.examples.ml.math.vector;
import java.util.Arrays;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.impls.vector.SparseLocalVector;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.impls.vector.SparseLocalVector;
-import static org.apache.ignite.math.StorageConstants.RANDOM_ACCESS_MODE;
+import static org.apache.ignite.ml.math.StorageConstants.RANDOM_ACCESS_MODE;
/**
* This example shows how to use sparse {@link Vector} API.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/VectorCustomStorageExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/VectorCustomStorageExample.java b/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/VectorCustomStorageExample.java
index 2d549ae..a7204ad 100644
--- a/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/VectorCustomStorageExample.java
+++ b/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/VectorCustomStorageExample.java
@@ -18,11 +18,11 @@
package org.apache.ignite.examples.ml.math.vector;
import java.util.Arrays;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.VectorStorage;
-import org.apache.ignite.math.impls.matrix.DenseLocalOnHeapMatrix;
-import org.apache.ignite.math.impls.vector.AbstractVector;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.VectorStorage;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
+import org.apache.ignite.ml.math.impls.vector.AbstractVector;
/**
* This example shows how to use {@link Vector} based on custom {@link VectorStorage}.
@@ -78,7 +78,7 @@ public final class VectorCustomStorageExample {
/**
* Example of vector with custom storage, modeled after
- * {@link org.apache.ignite.math.impls.vector.DenseLocalOnHeapVector}.
+ * {@link org.apache.ignite.ml.math.impls.vector.DenseLocalOnHeapVector}.
*/
static class VectorCustomStorage extends AbstractVector {
/**
@@ -118,7 +118,7 @@ public final class VectorCustomStorageExample {
/** {@inheritDoc */
@Override public Vector like(int crd) {
- return new org.apache.ignite.math.impls.vector.DenseLocalOnHeapVector(crd);
+ return new org.apache.ignite.ml.math.impls.vector.DenseLocalOnHeapVector(crd);
}
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/VectorExample.java
----------------------------------------------------------------------
diff --git a/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/VectorExample.java b/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/VectorExample.java
index d6971a7..3390de5 100644
--- a/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/VectorExample.java
+++ b/examples/src/main/ml/org/apache/ignite/examples/ml/math/vector/VectorExample.java
@@ -18,8 +18,8 @@
package org.apache.ignite.examples.ml.math.vector;
import java.util.Arrays;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.impls.vector.DenseLocalOnHeapVector;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.impls.vector.DenseLocalOnHeapVector;
/**
* This example shows how to use {@link Vector} API.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/pom.xml
----------------------------------------------------------------------
diff --git a/modules/ml/pom.xml b/modules/ml/pom.xml
index 4755a2c..e6f5acb 100644
--- a/modules/ml/pom.xml
+++ b/modules/ml/pom.xml
@@ -100,10 +100,4 @@
</plugin>
</plugins>
</build>
-
- <profiles>
- <profile>
- <id>math</id>
- </profile>
- </profiles>
</project>
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/Algebra.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/Algebra.java b/modules/ml/src/main/java/org/apache/ignite/math/Algebra.java
deleted file mode 100644
index 6bfd608..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/Algebra.java
+++ /dev/null
@@ -1,571 +0,0 @@
-/*
- * 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.
- */
-
-/*
-Copyright 1999 CERN - European Organization for Nuclear Research.
-Permission to use, copy, modify, distribute and sell this software and its documentation for any purpose
-is hereby granted without fee, provided that the above copyright notice appear in all copies and
-that both that copyright notice and this permission notice appear in supporting documentation.
-CERN makes no representations about the suitability of this software for any purpose.
-It is provided "as is" without expressed or implied warranty.
-*/
-
-package org.apache.ignite.math;
-
-/**
- * Miscellaneous arithmetic and algebra functions.
- * Lifted from Apache Mahout.
- */
-public class Algebra extends Constants {
- /** */ private static final double[] STIRLING_CORRECTION = {
- 0.0,
- 8.106146679532726e-02, 4.134069595540929e-02,
- 2.767792568499834e-02, 2.079067210376509e-02,
- 1.664469118982119e-02, 1.387612882307075e-02,
- 1.189670994589177e-02, 1.041126526197209e-02,
- 9.255462182712733e-03, 8.330563433362871e-03,
- 7.573675487951841e-03, 6.942840107209530e-03,
- 6.408994188004207e-03, 5.951370112758848e-03,
- 5.554733551962801e-03, 5.207655919609640e-03,
- 4.901395948434738e-03, 4.629153749334029e-03,
- 4.385560249232324e-03, 4.166319691996922e-03,
- 3.967954218640860e-03, 3.787618068444430e-03,
- 3.622960224683090e-03, 3.472021382978770e-03,
- 3.333155636728090e-03, 3.204970228055040e-03,
- 3.086278682608780e-03, 2.976063983550410e-03,
- 2.873449362352470e-03, 2.777674929752690e-03,
- };
-
- /** */ private static final double[] LOG_FACTORIALS = {
- 0.00000000000000000, 0.00000000000000000, 0.69314718055994531,
- 1.79175946922805500, 3.17805383034794562, 4.78749174278204599,
- 6.57925121201010100, 8.52516136106541430, 10.60460290274525023,
- 12.80182748008146961, 15.10441257307551530, 17.50230784587388584,
- 19.98721449566188615, 22.55216385312342289, 25.19122118273868150,
- 27.89927138384089157, 30.67186010608067280, 33.50507345013688888,
- 36.39544520803305358, 39.33988418719949404, 42.33561646075348503,
- 45.38013889847690803, 48.47118135183522388, 51.60667556776437357,
- 54.78472939811231919, 58.00360522298051994, 61.26170176100200198,
- 64.55753862700633106, 67.88974313718153498, 71.25703896716800901
- };
-
- /** */ private static final long[] LONG_FACTORIALS = {
- 1L,
- 1L,
- 2L,
- 6L,
- 24L,
- 120L,
- 720L,
- 5040L,
- 40320L,
- 362880L,
- 3628800L,
- 39916800L,
- 479001600L,
- 6227020800L,
- 87178291200L,
- 1307674368000L,
- 20922789888000L,
- 355687428096000L,
- 6402373705728000L,
- 121645100408832000L,
- 2432902008176640000L
- };
-
- /** */ private static final double[] DOUBLE_FACTORIALS = {
- 5.109094217170944E19,
- 1.1240007277776077E21,
- 2.585201673888498E22,
- 6.204484017332394E23,
- 1.5511210043330984E25,
- 4.032914611266057E26,
- 1.0888869450418352E28,
- 3.048883446117138E29,
- 8.841761993739701E30,
- 2.652528598121911E32,
- 8.222838654177924E33,
- 2.6313083693369355E35,
- 8.68331761881189E36,
- 2.952327990396041E38,
- 1.0333147966386144E40,
- 3.719933267899013E41,
- 1.3763753091226346E43,
- 5.23022617466601E44,
- 2.0397882081197447E46,
- 8.15915283247898E47,
- 3.34525266131638E49,
- 1.4050061177528801E51,
- 6.041526306337384E52,
- 2.6582715747884495E54,
- 1.196222208654802E56,
- 5.502622159812089E57,
- 2.5862324151116827E59,
- 1.2413915592536068E61,
- 6.082818640342679E62,
- 3.0414093201713376E64,
- 1.5511187532873816E66,
- 8.06581751709439E67,
- 4.274883284060024E69,
- 2.308436973392413E71,
- 1.2696403353658264E73,
- 7.109985878048632E74,
- 4.052691950487723E76,
- 2.350561331282879E78,
- 1.386831185456898E80,
- 8.32098711274139E81,
- 5.075802138772246E83,
- 3.146997326038794E85,
- 1.9826083154044396E87,
- 1.2688693218588414E89,
- 8.247650592082472E90,
- 5.443449390774432E92,
- 3.6471110918188705E94,
- 2.48003554243683E96,
- 1.7112245242814127E98,
- 1.1978571669969892E100,
- 8.504785885678624E101,
- 6.123445837688612E103,
- 4.470115461512686E105,
- 3.307885441519387E107,
- 2.4809140811395404E109,
- 1.8854947016660506E111,
- 1.451830920282859E113,
- 1.1324281178206295E115,
- 8.94618213078298E116,
- 7.15694570462638E118,
- 5.797126020747369E120,
- 4.7536433370128435E122,
- 3.94552396972066E124,
- 3.314240134565354E126,
- 2.8171041143805494E128,
- 2.4227095383672744E130,
- 2.107757298379527E132,
- 1.854826422573984E134,
- 1.6507955160908465E136,
- 1.4857159644817605E138,
- 1.3520015276784033E140,
- 1.2438414054641305E142,
- 1.156772507081641E144,
- 1.0873661566567426E146,
- 1.0329978488239061E148,
- 9.916779348709491E149,
- 9.619275968248216E151,
- 9.426890448883248E153,
- 9.332621544394415E155,
- 9.332621544394418E157,
- 9.42594775983836E159,
- 9.614466715035125E161,
- 9.902900716486178E163,
- 1.0299016745145631E166,
- 1.0813967582402912E168,
- 1.1462805637347086E170,
- 1.2265202031961373E172,
- 1.324641819451829E174,
- 1.4438595832024942E176,
- 1.5882455415227423E178,
- 1.7629525510902457E180,
- 1.974506857221075E182,
- 2.2311927486598138E184,
- 2.543559733472186E186,
- 2.925093693493014E188,
- 3.393108684451899E190,
- 3.96993716080872E192,
- 4.6845258497542896E194,
- 5.574585761207606E196,
- 6.689502913449135E198,
- 8.094298525273444E200,
- 9.875044200833601E202,
- 1.2146304367025332E205,
- 1.506141741511141E207,
- 1.882677176888926E209,
- 2.3721732428800483E211,
- 3.0126600184576624E213,
- 3.856204823625808E215,
- 4.974504222477287E217,
- 6.466855489220473E219,
- 8.471580690878813E221,
- 1.1182486511960037E224,
- 1.4872707060906847E226,
- 1.99294274616152E228,
- 2.690472707318049E230,
- 3.6590428819525483E232,
- 5.0128887482749884E234,
- 6.917786472619482E236,
- 9.615723196941089E238,
- 1.3462012475717523E241,
- 1.8981437590761713E243,
- 2.6953641378881633E245,
- 3.8543707171800694E247,
- 5.550293832739308E249,
- 8.047926057471989E251,
- 1.1749972043909107E254,
- 1.72724589045464E256,
- 2.5563239178728637E258,
- 3.8089226376305687E260,
- 5.7133839564458575E262,
- 8.627209774233244E264,
- 1.3113358856834527E267,
- 2.0063439050956838E269,
- 3.0897696138473515E271,
- 4.789142901463393E273,
- 7.471062926282892E275,
- 1.1729568794264134E278,
- 1.8532718694937346E280,
- 2.946702272495036E282,
- 4.714723635992061E284,
- 7.590705053947223E286,
- 1.2296942187394494E289,
- 2.0044015765453032E291,
- 3.287218585534299E293,
- 5.423910666131583E295,
- 9.003691705778434E297,
- 1.5036165148649983E300,
- 2.5260757449731988E302,
- 4.2690680090047056E304,
- 7.257415615308004E306
- };
-
- /**
- * Efficiently returns the binomial coefficient, often also referred to as
- * "n over k" or "n choose k". The binomial coefficient is defined as
- * {@code (n * n-1 * ... * n-k+1 ) / ( 1 * 2 * ... * k )}.
- * <ul> <li>{@code k<0}: {@code 0}.</li>
- * <li>{@code k==0}: {@code 1}.</li>
- * <li>{@code k==1}: {@code n}.</li>
- * <li>else: {@code (n * n-1 * ... * n-k+1 ) / ( 1 * 2 * ... * k)}.</li>
- * </ul>
- *
- * @param n
- * @param k
- * @return Binomial coefficient.
- */
- public static double binomial(double n, long k) {
- if (k < 0)
- return 0;
-
- if (k == 0)
- return 1;
-
- if (k == 1)
- return n;
-
- // binomial(n,k) = (n * n-1 * ... * n-k+1 ) / ( 1 * 2 * ... * k )
- double a = n - k + 1;
- double b = 1;
- double binomial = 1;
-
- for (long i = k; i-- > 0; )
- binomial *= (a++) / (b++);
-
- return binomial;
- }
-
- /**
- * Efficiently returns the binomial coefficient, often also referred to as "n over k" or "n choose k".
- * The binomial coefficient is defined as
- * <ul> <li>{@code k<0}: {@code 0}. <li>{@code k==0 || k==n}: {@code 1}. <li>{@code k==1 || k==n-1}:
- * {@code n}. <li>else: {@code (n * n-1 * ... * n-k+1 ) / ( 1 * 2 * ... * k )}. </ul>
- *
- * @param n
- * @param k
- * @return Binomial coefficient.
- */
- public static double binomial(long n, long k) {
- if (k < 0)
- return 0;
-
- if (k == 0 || k == n)
- return 1;
-
- if (k == 1 || k == n - 1)
- return n;
-
- if (n > k) {
- int max = LONG_FACTORIALS.length + DOUBLE_FACTORIALS.length;
-
- if (n < max) {
- double nFac = factorial((int)n);
- double kFac = factorial((int)k);
- double nMinusKFac = factorial((int)(n - k));
- double nk = nMinusKFac * kFac;
-
- if (nk != Double.POSITIVE_INFINITY) // No numeric overflow?
- return nFac / nk;
- }
-
- if (k > n / 2)
- k = n - k;
- }
-
- // binomial(n,k) = (n * n-1 * ... * n-k+1 ) / ( 1 * 2 * ... * k )
- long a = n - k + 1;
- long b = 1;
- double binomial = 1;
-
- for (long i = k; i-- > 0; )
- binomial *= (double)a++ / (b++);
-
- return binomial;
- }
-
- /**
- * Returns the smallest <code>long >= value</code>.
- * <dl><dt>Examples: {@code 1.0 -> 1, 1.2 -> 2, 1.9 -> 2}. This
- * method is safer than using (long) Math.ceil(value), because of possible rounding error.</dt></dl>
- *
- * @param val
- */
- public static long ceil(double val) {
- return Math.round(Math.ceil(val));
- }
-
- /**
- * Evaluates the series of Chebyshev polynomials Ti at argument x/2. The series is given by
- * <pre>
- * N-1
- * - '
- * y = > coef[i] T (x/2)
- * - i
- * i=0
- * </pre>
- * Coefficients are stored in reverse order, i.e. the zero order term is last in the array. Note N is the number of
- * coefficients, not the order. <p> If coefficients are for the interval a to b, x must have been transformed to x
- * -< 2(2x - b - a)/(b-a) before entering the routine. This maps x from (a, b) to (-1, 1), over which the
- * Chebyshev polynomials are defined. <p> If the coefficients are for the inverted interval, in which (a, b) is
- * mapped to (1/b, 1/a), the transformation required is {@code x -> 2(2ab/x - b - a)/(b-a)}. If b is infinity, this
- * becomes {@code x -> 4a/x - 1}. <p> SPEED: <p> Taking advantage of the recurrence properties of the Chebyshev
- * polynomials, the routine requires one more addition per loop than evaluating a nested polynomial of the same
- * degree.
- *
- * @param x Argument to the polynomial.
- * @param coef Coefficients of the polynomial.
- * @param N Number of coefficients.
- */
- public static double chbevl(double x, double[] coef, int N) {
- int p = 0;
-
- double b0 = coef[p++];
- double b1 = 0.0;
- int i = N - 1;
-
- double b2;
-
- do {
- b2 = b1;
- b1 = b0;
- b0 = x * b1 - b2 + coef[p++];
- }
- while (--i > 0);
-
- return 0.5 * (b0 - b2);
- }
-
- /**
- * Instantly returns the factorial {@code k!}.
- *
- * @param k must hold {@code k >= 0}.
- */
- private static double factorial(int k) {
- if (k < 0)
- throw new IllegalArgumentException();
-
- int len1 = LONG_FACTORIALS.length;
-
- if (k < len1)
- return LONG_FACTORIALS[k];
-
- int len2 = DOUBLE_FACTORIALS.length;
-
- return (k < len1 + len2) ? DOUBLE_FACTORIALS[k - len1] : Double.POSITIVE_INFINITY;
- }
-
- /**
- * Returns the largest <code>long <= value</code>.
- * <dl><dt>Examples: {@code 1.0 -> 1, 1.2 -> 1, 1.9 -> 1 <dt> 2.0 -> 2, 2.2 -> 2, 2.9 -> 2}</dt></dl>
- * This method is safer than using (long) Math.floor(value), because of possible rounding error.
- */
- public static long floor(double val) {
- return Math.round(Math.floor(val));
- }
-
- /**
- * Returns {@code log<sub>base</sub>value}.
- */
- public static double log(double base, double val) {
- return Math.log(val) / Math.log(base);
- }
-
- /**
- * Returns {@code log<sub>10</sub>value}.
- */
- public static double log10(double val) {
- // 1.0 / Math.log(10) == 0.43429448190325176
- return Math.log(val) * 0.43429448190325176;
- }
-
- /**
- * Returns {@code log<sub>2</sub>value}.
- */
- public static double log2(double val) {
- // 1.0 / Math.log(2) == 1.4426950408889634
- return Math.log(val) * 1.4426950408889634;
- }
-
- /**
- * Returns {@code log(k!)}. Tries to avoid overflows. For {@code k<30} simply looks up a table in O(1).
- * For {@code k>=30} uses stirlings approximation.
- *
- * @param k must hold {@code k >= 0}.
- */
- public static double logFactorial(int k) {
- if (k >= 30) {
- double r = 1.0 / k;
- double rr = r * r;
- double C7 = -5.95238095238095238e-04;
- double C5 = 7.93650793650793651e-04;
- double C3 = -2.77777777777777778e-03;
- double C1 = 8.33333333333333333e-02;
- double C0 = 9.18938533204672742e-01;
-
- return (k + 0.5) * Math.log(k) - k + C0 + r * (C1 + rr * (C3 + rr * (C5 + rr * C7)));
- }
- else
- return LOG_FACTORIALS[k];
- }
-
- /**
- * Instantly returns the factorial {@code k!}.
- *
- * @param k must hold {@code k >= 0 && k < 21}
- */
- public static long longFactorial(int k) {
- if (k < 0)
- throw new IllegalArgumentException("Negative k");
-
- if (k < LONG_FACTORIALS.length)
- return LONG_FACTORIALS[k];
-
- throw new IllegalArgumentException("Overflow");
- }
-
- /**
- * Returns the StirlingCorrection.
- *
- * Correction term of the Stirling approximation for {@code log(k!)} (series in
- * 1/k, or table values for small k) with int parameter k. </p> {@code log k! = (k + 1/2)log(k + 1) - (k + 1) +
- * (1/2)log(2Pi) + STIRLING_CORRECTION(k + 1) log k! = (k + 1/2)log(k) - k + (1/2)log(2Pi) +
- * STIRLING_CORRECTION(k) }
- */
- public static double stirlingCorrection(int k) {
- if (k > 30) {
- double r = 1.0 / k;
- double rr = r * r;
- double C7 = -5.95238095238095238e-04;
- double C5 = 7.93650793650793651e-04;
- double C3 = -2.77777777777777778e-03;
- double C1 = 8.33333333333333333e-02;
-
- return r * (C1 + rr * (C3 + rr * (C5 + rr * C7)));
- }
- else
- return STIRLING_CORRECTION[k];
- }
-
- /**
- * Evaluates the given polynomial of degree {@code N} at {@code x}, assuming coefficient of N is 1.0. Otherwise same
- * as {@link #evalPoly(double, double[], int)}.
- * <pre>
- * 2 N
- * y = C + C x + C x +...+ C x
- * 0 1 2 N
- *
- * where C = 1 and hence is omitted from the array.
- * N
- *
- * Coefficients are stored in reverse order:
- *
- * coef[0] = C , ..., coef[N-1] = C .
- * N-1 0
- *
- * Calling arguments are otherwise the same as {@link #evalPoly(double, double[], int)}.
- * </pre>
- * In the interest of speed, there are no checks for out of bounds arithmetic.
- *
- * @param x Argument to the polynomial.
- * @param coef Coefficients of the polynomial.
- * @param n Degree of the polynomial.
- */
- public static double evalPoly1(double x, double[] coef, int n) {
- double res = x + coef[0];
-
- for (int i = 1; i < n; i++)
- res = res * x + coef[i];
-
- return res;
- }
-
- /**
- * Evaluates the given polynomial of degree {@code N} at {@code x}.
- * <pre>
- * 2 N
- * y = C + C x + C x +...+ C x
- * 0 1 2 N
- *
- * Coefficients are stored in reverse order:
- *
- * coef[0] = C , ..., coef[N] = C .
- * N 0
- * </pre>
- * In the interest of speed, there are no checks for out of bounds arithmetic.
- *
- * @param x Argument to the polynomial.
- * @param coef Coefficients of the polynomial.
- * @param n Degree of the polynomial.
- */
- public static double evalPoly(double x, double[] coef, int n) {
- double res = coef[0];
-
- for (int i = 1; i <= n; i++)
- res = res * x + coef[i];
-
- return res;
- }
-
- /**
- * Gets <code>sqrt(a^2 + b^2)</code> without under/overflow.
- *
- * @param a
- * @param b
- */
- public static double hypot(double a, double b) {
- double r;
-
- if (Math.abs(a) > Math.abs(b)) {
- r = b / a;
- r = Math.abs(a) * Math.sqrt(1 + r * r);
- }
- else if (b != 0) {
- r = a / b;
- r = Math.abs(b) * Math.sqrt(1 + r * r);
- }
- else
- r = 0.0;
-
- return r;
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/Constants.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/Constants.java b/modules/ml/src/main/java/org/apache/ignite/math/Constants.java
deleted file mode 100644
index 02756b6..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/Constants.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * 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.
- */
-
-/*
-Copyright 1999 CERN - European Organization for Nuclear Research.
-Permission to use, copy, modify, distribute and sell this software and its documentation for any purpose
-is hereby granted without fee, provided that the above copyright notice appear in all copies and
-that both that copyright notice and this permission notice appear in supporting documentation.
-CERN makes no representations about the suitability of this software for any purpose.
-It is provided "as is" without expressed or implied warranty.
-*/
-
-package org.apache.ignite.math;
-
-/**
- * Math constants. Lifted from Apache Mahout.
- */
-public class Constants {
- /** */ public static final double MACHEP = 1.11022302462515654042E-16;
- /** */ public static final double MAXLOG = 7.09782712893383996732E2;
- /** */ public static final double MINLOG = -7.451332191019412076235E2;
- /** */ public static final double MAXGAM = 171.624376956302725;
- /** */ public static final double SQTPI = 2.50662827463100050242E0;
- /** */ public static final double SQRTH = 7.07106781186547524401E-1;
- /** */ public static final double LOGPI = 1.14472988584940017414;
- /** */ public static final double BIG = 4.503599627370496e15;
- /** */ public static final double BIGINV = 2.22044604925031308085e-16;
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/Destroyable.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/Destroyable.java b/modules/ml/src/main/java/org/apache/ignite/math/Destroyable.java
deleted file mode 100644
index f3b467c..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/Destroyable.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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.ignite.math;
-
-/**
- * Support for destroying objects that are managed outside of JVM.
- */
-public interface Destroyable {
- /**
- * Destroys object if managed outside of JVM. It's a no-op in all other cases.
- */
- public default void destroy() {
- // No-op.
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/IdentityValueMapper.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/IdentityValueMapper.java b/modules/ml/src/main/java/org/apache/ignite/math/IdentityValueMapper.java
deleted file mode 100644
index 65c7024..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/IdentityValueMapper.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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.ignite.math;
-
-/**
- * Identity value mapper.
- */
-public class IdentityValueMapper implements ValueMapper<Double> {
- /** */ private static final long serialVersionUID = -8010078306142216389L;
-
- /** {@inheritDoc} */
- @Override public Double fromDouble(double v) {
- return v;
- }
-
- /** {@inheritDoc} */
- @Override public double toDouble(Double v) {
- assert v != null;
-
- return v;
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- return Long.hashCode(serialVersionUID);
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object o) {
- if (this == o)
- return true;
-
- if (o == null || getClass() != o.getClass())
- return false;
-
- return true;
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/KeyMapper.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/KeyMapper.java b/modules/ml/src/main/java/org/apache/ignite/math/KeyMapper.java
deleted file mode 100644
index f4f9a39..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/KeyMapper.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.ignite.math;
-
-import java.io.Serializable;
-
-/**
- * Maps key objects to index in {@link Vector} or {@link Matrix}.
- */
-public interface KeyMapper<K> extends Serializable {
- /**
- * Checks given cache key corresponds to a valid index in vector or matrix.
- *
- * @param k Key to check.
- * @return {@code true} if there is a valid index, {@code false} otherwise.
- */
- public boolean isValid(K k);
-}
[49/67] [abbrv] ignite git commit: Hibernate module deploy fix
Posted by sb...@apache.org.
Hibernate module deploy fix
(cherry picked from commit ff08c8e)
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/28870dc7
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/28870dc7
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/28870dc7
Branch: refs/heads/ignite-5075
Commit: 28870dc711d23693179e3f25dc31259ce2c92361
Parents: 2436b93
Author: Anton Vinogradov <av...@apache.org>
Authored: Wed May 3 12:49:18 2017 +0300
Committer: Anton Vinogradov <av...@apache.org>
Committed: Wed May 3 12:54:09 2017 +0300
----------------------------------------------------------------------
modules/hibernate-core/pom.xml | 8 --------
1 file changed, 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/28870dc7/modules/hibernate-core/pom.xml
----------------------------------------------------------------------
diff --git a/modules/hibernate-core/pom.xml b/modules/hibernate-core/pom.xml
index 014405e..624dcc8 100644
--- a/modules/hibernate-core/pom.xml
+++ b/modules/hibernate-core/pom.xml
@@ -71,14 +71,6 @@
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
</plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-deploy-plugin</artifactId>
- <version>2.8.2</version>
- <configuration>
- <skip>true</skip>
- </configuration>
- </plugin>
</plugins>
</build>
</project>
[50/67] [abbrv] ignite git commit: IGNITE-4989 Assertion error in
BPlusTree#finishTail - Fixes #1894.
Posted by sb...@apache.org.
IGNITE-4989 Assertion error in BPlusTree#finishTail - Fixes #1894.
Signed-off-by: Sergi Vladykin <se...@gmail.com>
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/85f5309d
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/85f5309d
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/85f5309d
Branch: refs/heads/ignite-5075
Commit: 85f5309db0b12f3dc1c843463537518e05c0fd80
Parents: 28870dc
Author: EdShangGG <es...@gridgain.com>
Authored: Wed May 3 15:07:54 2017 +0300
Committer: Sergi Vladykin <se...@gmail.com>
Committed: Wed May 3 15:07:54 2017 +0300
----------------------------------------------------------------------
.../cache/database/tree/BPlusTree.java | 6 +-
.../processors/database/BPlusTreeSelfTest.java | 75 ++++++++++++++++++++
2 files changed, 80 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/85f5309d/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java
index 648f35a..a4c09d5 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java
@@ -443,6 +443,10 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
throws IgniteCheckedException {
assert lvl == 0 : lvl; // Leaf.
+ // Check the triangle invariant.
+ if (io.getForward(leafAddr) != r.fwdId)
+ return RETRY;
+
final int cnt = io.getCount(leafAddr);
assert cnt <= Short.MAX_VALUE: cnt;
@@ -3384,7 +3388,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
if (tail.lvl == 0) {
// At the bottom level we can't have a tail without a sibling, it means we have higher levels.
- assert tail.sibling != null;
+ assert tail.sibling != null : tail;
return NOT_FOUND; // Lock upper level, we are at the bottom now.
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/85f5309d/modules/core/src/test/java/org/apache/ignite/internal/processors/database/BPlusTreeSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/BPlusTreeSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/BPlusTreeSelfTest.java
index 0254c4c..a46242c 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/BPlusTreeSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/BPlusTreeSelfTest.java
@@ -27,8 +27,10 @@ import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicLongArray;
+import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.locks.Lock;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.configuration.MemoryPolicyConfiguration;
@@ -1225,6 +1227,79 @@ public class BPlusTreeSelfTest extends GridCommonAbstractTest {
}
/**
+ *
+ */
+ public void testConcurrentGrowDegenerateTreeAndConcurrentRemove() throws Exception {
+ //calculate tree size when split happens
+ final TestTree t = createTestTree(true);
+ long i = 0;
+
+ for (; ; i++) {
+ t.put(i);
+
+ if (t.rootLevel() > 0) //split happened
+ break;
+ }
+
+ final long treeStartSize = i;
+
+ final AtomicReference<Throwable> failed = new AtomicReference<>();
+
+ for (int k = 0; k < 100; k++) {
+ final TestTree tree = createTestTree(true);
+
+ final AtomicBoolean start = new AtomicBoolean();
+
+ final AtomicInteger ready = new AtomicInteger();
+
+ Thread first = new Thread(new Runnable() {
+ @Override public void run() {
+ ready.incrementAndGet();
+
+ while (!start.get()); //waiting without blocking
+
+ try {
+ tree.remove(treeStartSize / 2L);
+ }
+ catch (Throwable th) {
+ failed.set(th);
+ }
+ }
+ });
+
+ Thread second = new Thread(new Runnable() {
+ @Override public void run() {
+ ready.incrementAndGet();
+
+ while (!start.get()); //waiting without blocking
+
+ try {
+ tree.put(treeStartSize + 1);
+ }
+ catch (Throwable th) {
+ failed.set(th);
+ }
+ }
+ });
+
+ for (int j = 0; j < treeStartSize; j++)
+ tree.put((long)j);
+
+ first.start();
+ second.start();
+
+ while (ready.get() != 2);
+
+ start.set(true);
+
+ first.join();
+ second.join();
+
+ assertNull(failed.get());
+ }
+ }
+
+ /**
* @param canGetRow Can get row from inner page.
* @throws Exception If failed.
*/
[06/67] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math
module to Ignite ML module added missed licenses renamed packages fixed wrong
ml profile activation (cherry picked from commit d78e071)
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorIterableTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorIterableTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorIterableTest.java
deleted file mode 100644
index 7a64c85..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorIterableTest.java
+++ /dev/null
@@ -1,376 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-import java.util.Spliterator;
-import java.util.function.BiConsumer;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.impls.MathTestConstants;
-import org.junit.Test;
-
-import static java.util.Spliterator.ORDERED;
-import static java.util.Spliterator.SIZED;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-/** */
-public class VectorIterableTest {
- /** */
- @Test
- public void allTest() {
- consumeSampleVectors(
- (v, desc) -> {
- int expIdx = 0;
-
- for (Vector.Element e : v.all()) {
- int actualIdx = e.index();
-
- assertEquals("Unexpected index for " + desc,
- expIdx, actualIdx);
-
- expIdx++;
- }
-
- assertEquals("Unexpected amount of elements for " + desc,
- expIdx, v.size());
- }
- );
- }
-
- /** */
- @Test
- public void allTestBound() {
- consumeSampleVectors(
- (v, desc) -> iteratorTestBound(v.all().iterator(), desc)
- );
- }
-
- /** */
- @Test
- public void nonZeroesTestBasic() {
- final int size = 5;
-
- final double[] nonZeroesOddData = new double[size], nonZeroesEvenData = new double[size];
-
- for (int idx = 0; idx < size; idx++) {
- final boolean odd = (idx & 1) == 1;
-
- nonZeroesOddData[idx] = odd ? 1 : 0;
-
- nonZeroesEvenData[idx] = odd ? 0 : 1;
- }
-
- assertTrue("Arrays failed to initialize.",
- !isZero(nonZeroesEvenData[0])
- && isZero(nonZeroesEvenData[1])
- && isZero(nonZeroesOddData[0])
- && !isZero(nonZeroesOddData[1]));
-
- final Vector nonZeroesEvenVec = new DenseLocalOnHeapVector(nonZeroesEvenData),
- nonZeroesOddVec = new DenseLocalOnHeapVector(nonZeroesOddData);
-
- assertTrue("Vectors failed to initialize.",
- !isZero(nonZeroesEvenVec.getElement(0).get())
- && isZero(nonZeroesEvenVec.getElement(1).get())
- && isZero(nonZeroesOddVec.getElement(0).get())
- && !isZero(nonZeroesOddVec.getElement(1).get()));
-
- assertTrue("Iterator(s) failed to start.",
- nonZeroesEvenVec.nonZeroes().iterator().next() != null
- && nonZeroesOddVec.nonZeroes().iterator().next() != null);
-
- int nonZeroesActual = 0;
-
- for (Vector.Element e : nonZeroesEvenVec.nonZeroes()) {
- final int idx = e.index();
-
- final boolean odd = (idx & 1) == 1;
-
- final double val = e.get();
-
- assertTrue("Not an even index " + idx + ", for value " + val, !odd);
-
- assertTrue("Zero value " + val + " at even index " + idx, !isZero(val));
-
- nonZeroesActual++;
- }
-
- final int nonZeroesOddExp = (size + 1) / 2;
-
- assertEquals("Unexpected num of iterated odd non-zeroes.", nonZeroesOddExp, nonZeroesActual);
-
- assertEquals("Unexpected nonZeroElements of odd.", nonZeroesOddExp, nonZeroesEvenVec.nonZeroElements());
-
- nonZeroesActual = 0;
-
- for (Vector.Element e : nonZeroesOddVec.nonZeroes()) {
- final int idx = e.index();
-
- final boolean odd = (idx & 1) == 1;
-
- final double val = e.get();
-
- assertTrue("Not an odd index " + idx + ", for value " + val, odd);
-
- assertTrue("Zero value " + val + " at even index " + idx, !isZero(val));
-
- nonZeroesActual++;
- }
-
- final int nonZeroesEvenExp = size / 2;
-
- assertEquals("Unexpected num of iterated even non-zeroes", nonZeroesEvenExp, nonZeroesActual);
-
- assertEquals("Unexpected nonZeroElements of even", nonZeroesEvenExp, nonZeroesOddVec.nonZeroElements());
- }
-
- /** */
- @Test
- public void nonZeroesTest() {
- // todo make RandomVector constructor that accepts a function and use it here
- // in order to *reliably* test non-zeroes in there
- consumeSampleVectors(
- (v, desc) -> consumeSampleVectorsWithZeroes(v, (vec, numZeroes)
- -> {
- int numZeroesActual = vec.size();
-
- for (Vector.Element e : vec.nonZeroes()) {
- numZeroesActual--;
-
- assertTrue("Unexpected zero at " + desc + ", index " + e.index(), !isZero(e.get()));
- }
-
- assertEquals("Unexpected num zeroes at " + desc, (int)numZeroes, numZeroesActual);
- }));
- }
-
- /** */
- @Test
- public void nonZeroesTestBound() {
- consumeSampleVectors(
- (v, desc) -> consumeSampleVectorsWithZeroes(v, (vec, numZeroes)
- -> iteratorTestBound(vec.nonZeroes().iterator(), desc)));
- }
-
- /** */
- @Test
- public void nonZeroElementsTest() {
- consumeSampleVectors(
- (v, desc) -> consumeSampleVectorsWithZeroes(v, (vec, numZeroes)
- -> assertEquals("Unexpected num zeroes at " + desc,
- (int)numZeroes, vec.size() - vec.nonZeroElements())));
- }
-
- /** */
- @Test
- public void allSpliteratorTest() {
- consumeSampleVectors(
- (v, desc) -> {
- final String desc1 = " " + desc;
-
- Spliterator<Double> spliterator = v.allSpliterator();
-
- assertNotNull(MathTestConstants.NULL_VAL + desc1, spliterator);
-
- assertNull(MathTestConstants.NOT_NULL_VAL + desc1, spliterator.trySplit());
-
- assertTrue(MathTestConstants.UNEXPECTED_VAL + desc1, spliterator.hasCharacteristics(ORDERED | SIZED));
-
- if (!readOnly(v))
- fillWithNonZeroes(v);
-
- spliterator = v.allSpliterator();
-
- assertNotNull(MathTestConstants.NULL_VAL + desc1, spliterator);
-
- assertEquals(MathTestConstants.VAL_NOT_EQUALS + desc1, spliterator.estimateSize(), v.size());
-
- assertEquals(MathTestConstants.VAL_NOT_EQUALS + desc1, spliterator.getExactSizeIfKnown(), v.size());
-
- assertTrue(MathTestConstants.UNEXPECTED_VAL + desc1, spliterator.hasCharacteristics(ORDERED | SIZED));
-
- Spliterator<Double> secondHalf = spliterator.trySplit();
-
- assertNull(MathTestConstants.NOT_NULL_VAL + desc1, secondHalf);
-
- spliterator.tryAdvance(x -> {
- });
- }
- );
- }
-
- /** */
- @Test
- public void nonZeroSpliteratorTest() {
- consumeSampleVectors(
- (v, desc) -> consumeSampleVectorsWithZeroes(v, (vec, numZeroes)
- -> {
- final String desc1 = " Num zeroes " + numZeroes + " " + desc;
-
- Spliterator<Double> spliterator = vec.nonZeroSpliterator();
-
- assertNotNull(MathTestConstants.NULL_VAL + desc1, spliterator);
-
- assertNull(MathTestConstants.NOT_NULL_VAL + desc1, spliterator.trySplit());
-
- assertTrue(MathTestConstants.UNEXPECTED_VAL + desc1, spliterator.hasCharacteristics(ORDERED | SIZED));
-
- spliterator = vec.nonZeroSpliterator();
-
- assertNotNull(MathTestConstants.NULL_VAL + desc1, spliterator);
-
- assertEquals(MathTestConstants.VAL_NOT_EQUALS + desc1, spliterator.estimateSize(), vec.size() - numZeroes);
-
- assertEquals(MathTestConstants.VAL_NOT_EQUALS + desc1, spliterator.getExactSizeIfKnown(), vec.size() - numZeroes);
-
- assertTrue(MathTestConstants.UNEXPECTED_VAL + desc1, spliterator.hasCharacteristics(ORDERED | SIZED));
-
- Spliterator<Double> secondHalf = spliterator.trySplit();
-
- assertNull(MathTestConstants.NOT_NULL_VAL + desc1, secondHalf);
-
- double[] data = new double[vec.size()];
-
- for (Vector.Element e : vec.all())
- data[e.index()] = e.get();
-
- spliterator = vec.nonZeroSpliterator();
-
- assertNotNull(MathTestConstants.NULL_VAL + desc1, spliterator);
-
- assertEquals(MathTestConstants.VAL_NOT_EQUALS + desc1, spliterator.estimateSize(),
- Arrays.stream(data).filter(x -> x != 0d).count());
-
- assertEquals(MathTestConstants.VAL_NOT_EQUALS + desc1, spliterator.getExactSizeIfKnown(),
- Arrays.stream(data).filter(x -> x != 0d).count());
-
- assertTrue(MathTestConstants.UNEXPECTED_VAL + desc1, spliterator.hasCharacteristics(ORDERED | SIZED));
-
- secondHalf = spliterator.trySplit();
-
- assertNull(MathTestConstants.NOT_NULL_VAL + desc1, secondHalf);
-
- if (!spliterator.tryAdvance(x -> {
- }))
- fail(MathTestConstants.NO_NEXT_ELEMENT + desc1);
- }));
- }
-
- /** */
- private void iteratorTestBound(Iterator<Vector.Element> it, String desc) {
- while (it.hasNext())
- assertNotNull(it.next());
-
- boolean expECaught = false;
-
- try {
- it.next();
- }
- catch (NoSuchElementException e) {
- expECaught = true;
- }
-
- assertTrue("Expected exception missed for " + desc,
- expECaught);
- }
-
- /** */
- private void consumeSampleVectorsWithZeroes(Vector sample,
- BiConsumer<Vector, Integer> consumer) {
- if (readOnly(sample)) {
- int numZeroes = 0;
-
- for (Vector.Element e : sample.all())
- if (isZero(e.get()))
- numZeroes++;
-
- consumer.accept(sample, numZeroes);
-
- return;
- }
-
- fillWithNonZeroes(sample);
-
- consumer.accept(sample, 0);
-
- final int sampleSize = sample.size();
-
- if (sampleSize == 0)
- return;
-
- for (Vector.Element e : sample.all())
- e.set(0);
-
- consumer.accept(sample, sampleSize);
-
- fillWithNonZeroes(sample);
-
- for (int testIdx : new int[] {0, sampleSize / 2, sampleSize - 1}) {
- final Vector.Element e = sample.getElement(testIdx);
-
- final double backup = e.get();
-
- e.set(0);
-
- consumer.accept(sample, 1);
-
- e.set(backup);
- }
-
- if (sampleSize < 3)
- return;
-
- sample.getElement(sampleSize / 3).set(0);
-
- sample.getElement((2 * sampleSize) / 3).set(0);
-
- consumer.accept(sample, 2);
- }
-
- /** */
- private void fillWithNonZeroes(Vector sample) {
- int idx = 0;
-
- for (Vector.Element e : sample.all())
- e.set(1 + idx++);
-
- assertEquals("Not all filled with non-zeroes", idx, sample.size());
- }
-
- /** */
- private void consumeSampleVectors(BiConsumer<Vector, String> consumer) {
- new VectorImplementationsFixtures().consumeSampleVectors(null, consumer);
- }
-
- /** */
- private boolean isZero(double val) {
- return val == 0.0;
- }
-
- /** */
- private boolean readOnly(Vector v) {
- return v instanceof RandomVector || v instanceof ConstantVector;
- }
-}
-
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorNormTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorNormTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorNormTest.java
deleted file mode 100644
index f1c2928..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorNormTest.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import java.util.function.BiConsumer;
-import java.util.function.BiFunction;
-import java.util.function.Function;
-import org.apache.ignite.math.Vector;
-import org.junit.Test;
-
-import static org.junit.Assert.assertTrue;
-
-/** */
-public class VectorNormTest {
- /** */
- @Test
- public void normalizeTest() {
- normalizeTest(2, (val, len) -> val / len, Vector::normalize);
- }
-
- /** */
- @Test
- public void normalizePowerTest() {
- for (double pow : new double[] {0, 0.5, 1, 2, 2.5, Double.POSITIVE_INFINITY})
- normalizeTest(pow, (val, norm) -> val / norm, (v) -> v.normalize(pow));
- }
-
- /** */
- @Test
- public void logNormalizeTest() {
- normalizeTest(2, (val, len) -> Math.log1p(val) / (len * Math.log(2)), Vector::logNormalize);
- }
-
- /** */
- @Test
- public void logNormalizePowerTest() {
- for (double pow : new double[] {1.1, 2, 2.5})
- normalizeTest(pow, (val, norm) -> Math.log1p(val) / (norm * Math.log(pow)), (v) -> v.logNormalize(pow));
- }
-
- /** */
- @Test
- public void kNormTest() {
- for (double pow : new double[] {0, 0.5, 1, 2, 2.5, Double.POSITIVE_INFINITY})
- toDoubleTest(pow, ref -> new Norm(ref, pow).calculate(), v -> v.kNorm(pow));
- }
-
- /** */
- @Test
- public void getLengthSquaredTest() {
- toDoubleTest(2.0, ref -> new Norm(ref, 2).sumPowers(), Vector::getLengthSquared);
- }
-
- /** */
- @Test
- public void getDistanceSquaredTest() {
- consumeSampleVectors((v, desc) -> {
- new VectorImplementationsTest.ElementsChecker(v, desc); // IMPL NOTE this initialises vector
-
- final int size = v.size();
- final Vector vOnHeap = new DenseLocalOnHeapVector(size);
- final Vector vOffHeap = new DenseLocalOffHeapVector(size);
-
- invertValues(v, vOnHeap);
- invertValues(v, vOffHeap);
-
- for (int idx = 0; idx < size; idx++) {
- final double exp = v.get(idx);
- final int idxMirror = size - 1 - idx;
-
- assertTrue("On heap vector difference at " + desc + ", idx " + idx,
- exp - vOnHeap.get(idxMirror) == 0);
- assertTrue("Off heap vector difference at " + desc + ", idx " + idx,
- exp - vOffHeap.get(idxMirror) == 0);
- }
-
- final double exp = vOnHeap.minus(v).getLengthSquared(); // IMPL NOTE this won't mutate vOnHeap
- final VectorImplementationsTest.Metric metric = new VectorImplementationsTest.Metric(exp, v.getDistanceSquared(vOnHeap));
-
- assertTrue("On heap vector not close enough at " + desc + ", " + metric,
- metric.closeEnough());
-
- final VectorImplementationsTest.Metric metric1 = new VectorImplementationsTest.Metric(exp, v.getDistanceSquared(vOffHeap));
-
- assertTrue("Off heap vector not close enough at " + desc + ", " + metric1,
- metric1.closeEnough());
- });
- }
-
- /** */
- @Test
- public void dotTest() {
- consumeSampleVectors((v, desc) -> {
- new VectorImplementationsTest.ElementsChecker(v, desc); // IMPL NOTE this initialises vector
-
- final int size = v.size();
- final Vector v1 = new DenseLocalOnHeapVector(size);
-
- invertValues(v, v1);
-
- final double actual = v.dot(v1);
-
- double exp = 0;
-
- for (Vector.Element e : v.all())
- exp += e.get() * v1.get(e.index());
-
- final VectorImplementationsTest.Metric metric = new VectorImplementationsTest.Metric(exp, actual);
-
- assertTrue("Dot product not close enough at " + desc + ", " + metric,
- metric.closeEnough());
- });
- }
-
- /** */
- private void invertValues(Vector src, Vector dst) {
- final int size = src.size();
-
- for (Vector.Element e : src.all()) {
- final int idx = size - 1 - e.index();
- final double val = e.get();
-
- dst.set(idx, val);
- }
- }
-
- /** */
- private void toDoubleTest(Double val, Function<double[], Double> calcRef, Function<Vector, Double> calcVec) {
- consumeSampleVectors((v, desc) -> {
- final int size = v.size();
- final double[] ref = new double[size];
-
- new VectorImplementationsTest.ElementsChecker(v, ref, desc); // IMPL NOTE this initialises vector and reference array
-
- final double exp = calcRef.apply(ref);
- final double obtained = calcVec.apply(v);
- final VectorImplementationsTest.Metric metric = new VectorImplementationsTest.Metric(exp, obtained);
-
- assertTrue("Not close enough at " + desc
- + (val == null ? "" : ", value " + val) + ", " + metric, metric.closeEnough());
- });
- }
-
- /** */
- private void normalizeTest(double pow, BiFunction<Double, Double, Double> operation,
- Function<Vector, Vector> vecOperation) {
- consumeSampleVectors((v, desc) -> {
- final int size = v.size();
- final double[] ref = new double[size];
- final boolean nonNegative = pow != (int)pow;
-
- final VectorImplementationsTest.ElementsChecker checker = new VectorImplementationsTest.ElementsChecker(v, ref, desc + ", pow = " + pow, nonNegative);
- final double norm = new Norm(ref, pow).calculate();
-
- for (int idx = 0; idx < size; idx++)
- ref[idx] = operation.apply(ref[idx], norm);
-
- checker.assertCloseEnough(vecOperation.apply(v), ref);
- });
- }
-
- /** */
- private void consumeSampleVectors(BiConsumer<Vector, String> consumer) {
- new VectorImplementationsFixtures().consumeSampleVectors(null, consumer);
- }
-
- /** */
- private static class Norm {
- /** */
- private final double[] arr;
-
- /** */
- private final Double pow;
-
- /** */
- Norm(double[] arr, double pow) {
- this.arr = arr;
- this.pow = pow;
- }
-
- /** */
- double calculate() {
- if (pow.equals(0.0))
- return countNonZeroes(); // IMPL NOTE this is beautiful if you think of it
-
- if (pow.equals(Double.POSITIVE_INFINITY))
- return maxAbs();
-
- return Math.pow(sumPowers(), 1 / pow);
- }
-
- /** */
- double sumPowers() {
- if (pow.equals(0.0))
- return countNonZeroes();
-
- double norm = 0;
-
- for (double val : arr)
- norm += pow == 1 ? Math.abs(val) : Math.pow(val, pow);
-
- return norm;
- }
-
- /** */
- private int countNonZeroes() {
- int cnt = 0;
-
- final Double zero = 0.0;
-
- for (double val : arr)
- if (!zero.equals(val))
- cnt++;
-
- return cnt;
- }
-
- /** */
- private double maxAbs() {
- double res = 0;
-
- for (double val : arr) {
- final double abs = Math.abs(val);
-
- if (abs > res)
- res = abs;
- }
-
- return res;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorToMatrixTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorToMatrixTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorToMatrixTest.java
deleted file mode 100644
index adcb2cc..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorToMatrixTest.java
+++ /dev/null
@@ -1,291 +0,0 @@
-package org.apache.ignite.math.impls.vector;
-
-import java.util.Arrays;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.function.BiConsumer;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.apache.ignite.math.impls.matrix.DenseLocalOffHeapMatrix;
-import org.apache.ignite.math.impls.matrix.DenseLocalOnHeapMatrix;
-import org.apache.ignite.math.impls.matrix.RandomMatrix;
-import org.apache.ignite.math.impls.matrix.SparseLocalOnHeapMatrix;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-/** Tests for methods of Vector that involve Matrix. */
-public class VectorToMatrixTest {
- /** */
- private static final Map<Class<? extends Vector>, Class<? extends Matrix>> typesMap = typesMap();
-
- /** */
- private static final List<Class<? extends Vector>> likeMatrixUnsupported = Arrays.asList(FunctionVector.class,
- SingleElementVector.class, SingleElementVectorView.class, ConstantVector.class);
-
- /** */
- @Test
- public void testHaveLikeMatrix() throws InstantiationException, IllegalAccessException {
- for (Class<? extends Vector> key : typesMap.keySet()) {
- Class<? extends Matrix> val = typesMap.get(key);
-
- if (val == null && likeMatrixSupported(key))
- System.out.println("Missing test for implementation of likeMatrix for " + key.getSimpleName());
- }
- }
-
- /** */
- @Test
- public void testLikeMatrixUnsupported() throws Exception {
- consumeSampleVectors((v, desc) -> {
- if (likeMatrixSupported(v.getClass()))
- return;
-
- boolean expECaught = false;
-
- try {
- assertNull("Null view instead of exception in " + desc, v.likeMatrix(1, 1));
- }
- catch (UnsupportedOperationException uoe) {
- expECaught = true;
- }
-
- assertTrue("Expected exception was not caught in " + desc, expECaught);
- });
- }
-
- /** */
- @Test
- public void testLikeMatrix() {
- consumeSampleVectors((v, desc) -> {
- if (!availableForTesting(v))
- return;
-
- final Matrix matrix = v.likeMatrix(1, 1);
-
- Class<? extends Vector> key = v.getClass();
-
- Class<? extends Matrix> expMatrixType = typesMap.get(key);
-
- assertNotNull("Expect non-null matrix for " + key.getSimpleName() + " in " + desc, matrix);
-
- Class<? extends Matrix> actualMatrixType = matrix.getClass();
-
- assertTrue("Expected matrix type " + expMatrixType.getSimpleName()
- + " should be assignable from actual type " + actualMatrixType.getSimpleName() + " in " + desc,
- expMatrixType.isAssignableFrom(actualMatrixType));
-
- for (int rows : new int[] {1, 2})
- for (int cols : new int[] {1, 2}) {
- final Matrix actualMatrix = v.likeMatrix(rows, cols);
-
- String details = "rows " + rows + " cols " + cols;
-
- assertNotNull("Expect non-null matrix for " + details + " in " + desc,
- actualMatrix);
-
- assertEquals("Unexpected number of rows in " + desc, rows, actualMatrix.rowSize());
-
- assertEquals("Unexpected number of cols in " + desc, cols, actualMatrix.columnSize());
- }
- });
- }
-
- /** */
- @Test
- public void testToMatrix() {
- consumeSampleVectors((v, desc) -> {
- if (!availableForTesting(v))
- return;
-
- fillWithNonZeroes(v);
-
- final Matrix matrixRow = v.toMatrix(true);
-
- final Matrix matrixCol = v.toMatrix(false);
-
- for (Vector.Element e : v.all())
- assertToMatrixValue(desc, matrixRow, matrixCol, e.get(), e.index());
- });
- }
-
- /** */
- @Test
- public void testToMatrixPlusOne() {
- consumeSampleVectors((v, desc) -> {
- if (!availableForTesting(v))
- return;
-
- fillWithNonZeroes(v);
-
- for (double zeroVal : new double[] {-1, 0, 1, 2}) {
- final Matrix matrixRow = v.toMatrixPlusOne(true, zeroVal);
-
- final Matrix matrixCol = v.toMatrixPlusOne(false, zeroVal);
-
- final Metric metricRow0 = new Metric(zeroVal, matrixRow.get(0, 0));
-
- assertTrue("Not close enough row like " + metricRow0 + " at index 0 in " + desc,
- metricRow0.closeEnough());
-
- final Metric metricCol0 = new Metric(zeroVal, matrixCol.get(0, 0));
-
- assertTrue("Not close enough cols like " + metricCol0 + " at index 0 in " + desc,
- metricCol0.closeEnough());
-
- for (Vector.Element e : v.all())
- assertToMatrixValue(desc, matrixRow, matrixCol, e.get(), e.index() + 1);
- }
- });
- }
-
- /** */
- @Test
- public void testCross() {
- consumeSampleVectors((v, desc) -> {
- if (!availableForTesting(v))
- return;
-
- fillWithNonZeroes(v);
-
- for (int delta : new int[] {-1, 0, 1}) {
- final int size2 = v.size() + delta;
-
- if (size2 < 1)
- return;
-
- final Vector v2 = new DenseLocalOnHeapVector(size2);
-
- for (Vector.Element e : v2.all())
- e.set(size2 - e.index());
-
- assertCross(v, v2, desc);
- }
- });
- }
-
- /** */
- private void assertCross(Vector v1, Vector v2, String desc) {
- assertNotNull(v1);
- assertNotNull(v2);
-
- final Matrix res = v1.cross(v2);
-
- assertNotNull("Cross matrix is expected to be not null in " + desc, res);
-
- assertEquals("Unexpected number of rows in cross Matrix in " + desc, v1.size(), res.rowSize());
-
- assertEquals("Unexpected number of cols in cross Matrix in " + desc, v2.size(), res.columnSize());
-
- for (int row = 0; row < v1.size(); row++)
- for (int col = 0; col < v2.size(); col++) {
- final Metric metric = new Metric(v1.get(row) * v2.get(col), res.get(row, col));
-
- assertTrue("Not close enough cross " + metric + " at row " + row + " at col " + col
- + " in " + desc, metric.closeEnough());
- }
- }
-
- /** */
- private void assertToMatrixValue(String desc, Matrix matrixRow, Matrix matrixCol, double exp, int idx) {
- final Metric metricRow = new Metric(exp, matrixRow.get(0, idx));
-
- assertTrue("Not close enough row like " + metricRow + " at index " + idx + " in " + desc,
- metricRow.closeEnough());
-
- final Metric metricCol = new Metric(exp, matrixCol.get(idx, 0));
-
- assertTrue("Not close enough cols like " + matrixCol + " at index " + idx + " in " + desc,
- metricCol.closeEnough());
- }
-
- /** */
- private void fillWithNonZeroes(Vector sample) {
- if (sample instanceof RandomVector)
- return;
-
- for (Vector.Element e : sample.all())
- e.set(1 + e.index());
- }
-
- /** */
- private boolean availableForTesting(Vector v) {
- assertNotNull("Error in test: vector is null", v);
-
- if (!likeMatrixSupported(v.getClass()))
- return false;
-
- final boolean availableForTesting = typesMap.get(v.getClass()) != null;
-
- final Matrix actualLikeMatrix = v.likeMatrix(1, 1);
-
- assertTrue("Need to enable matrix testing for vector type " + v.getClass().getSimpleName(),
- availableForTesting || actualLikeMatrix == null);
-
- return availableForTesting;
- }
-
- /** Ignore test for given vector type. */
- private boolean likeMatrixSupported(Class<? extends Vector> clazz) {
- for (Class<? extends Vector> ignoredClass : likeMatrixUnsupported)
- if (ignoredClass.isAssignableFrom(clazz))
- return false;
-
- return true;
- }
-
- /** */
- private void consumeSampleVectors(BiConsumer<Vector, String> consumer) {
- new VectorImplementationsFixtures().consumeSampleVectors(null, consumer);
- }
-
- /** */
- private static Map<Class<? extends Vector>, Class<? extends Matrix>> typesMap() {
- return new LinkedHashMap<Class<? extends Vector>, Class<? extends Matrix>>() {{
- put(DenseLocalOnHeapVector.class, DenseLocalOnHeapMatrix.class);
- put(DenseLocalOffHeapVector.class, DenseLocalOffHeapMatrix.class);
- put(RandomVector.class, RandomMatrix.class);
- put(SparseLocalVector.class, SparseLocalOnHeapMatrix.class);
- put(SingleElementVector.class, null); // todo find out if we need SingleElementMatrix to match, or skip it
- put(ConstantVector.class, null);
- put(FunctionVector.class, null);
- put(PivotedVectorView.class, DenseLocalOnHeapMatrix.class); // IMPL NOTE per fixture
- put(SingleElementVectorView.class, null);
- put(MatrixVectorView.class, DenseLocalOnHeapMatrix.class); // IMPL NOTE per fixture
- put(DelegatingVector.class, DenseLocalOnHeapMatrix.class); // IMPL NOTE per fixture
- // IMPL NOTE check for presence of all implementations here will be done in testHaveLikeMatrix via Fixture
- }};
- }
-
- /** */
- private static class Metric { // todo consider if softer tolerance (like say 0.1 or 0.01) would make sense here
- /** */
- private final double exp;
-
- /** */
- private final double obtained;
-
- /** **/
- Metric(double exp, double obtained) {
- this.exp = exp;
- this.obtained = obtained;
- }
-
- /** */
- boolean closeEnough() {
- return new Double(exp).equals(obtained);
- }
-
- /** {@inheritDoc} */
- @Override public String toString() {
- return "Metric{" + "expected=" + exp +
- ", obtained=" + obtained +
- '}';
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorViewTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorViewTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorViewTest.java
deleted file mode 100644
index 55893d0..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/VectorViewTest.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.function.BiConsumer;
-import java.util.stream.IntStream;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.apache.ignite.math.impls.MathTestConstants;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-/**
- * Unit tests for {@link VectorView}.
- */
-public class VectorViewTest {
- /** */
- private static final int OFFSET = 10;
-
- /** */
- private static final int VIEW_LENGTH = 80;
-
- /** */
- private static final String EXTERNALIZE_TEST_FILE_NAME = "externalizeTest";
-
- /** */
- private VectorView testVector;
-
- /** */
- private DenseLocalOnHeapVector parentVector;
-
- /** */
- private double[] parentData;
-
- /** */
- @Before
- public void setup() {
- parentVector = new DenseLocalOnHeapVector(MathTestConstants.STORAGE_SIZE);
-
- IntStream.range(0, MathTestConstants.STORAGE_SIZE).forEach(idx -> parentVector.set(idx, Math.random()));
-
- parentData = parentVector.getStorage().data().clone();
-
- testVector = new VectorView(parentVector, OFFSET, VIEW_LENGTH);
- }
-
- /** */
- @AfterClass
- public static void cleanup() throws IOException {
- Files.deleteIfExists(Paths.get(EXTERNALIZE_TEST_FILE_NAME));
- }
-
- /** */
- @Test
- public void testCopy() throws Exception {
- Vector cp = testVector.copy();
-
- assertTrue(MathTestConstants.VAL_NOT_EQUALS, cp.equals(testVector));
- }
-
- /** */
- @Test(expected = org.apache.ignite.math.exceptions.UnsupportedOperationException.class)
- public void testLike() throws Exception {
- for (int card : new int[] {1, 2, 4, 8, 16, 32, 64, 128})
- consumeSampleVectors((v, desc) -> {
- Vector vLike = new VectorView(v, 0, 1).like(card);
-
- Class<? extends Vector> expType = v.getClass();
-
- assertNotNull("Expect non-null like vector for " + expType.getSimpleName() + " in " + desc, vLike);
-
- assertEquals("Expect size equal to cardinality at " + desc, card, vLike.size());
-
- Class<? extends Vector> actualType = vLike.getClass();
-
- assertTrue("Expected matrix type " + expType.getSimpleName()
- + " should be assignable from actual type " + actualType.getSimpleName() + " in " + desc,
- expType.isAssignableFrom(actualType));
-
- });
- }
-
- /** See also {@link VectorToMatrixTest#testLikeMatrix()}. */
- @Test
- public void testLikeMatrix() {
- consumeSampleVectors((v, desc) -> {
- boolean expECaught = false;
-
- try {
- assertNull("Null view instead of exception in " + desc, new VectorView(v, 0, 1).likeMatrix(1, 1));
- }
- catch (UnsupportedOperationException uoe) {
- expECaught = true;
- }
-
- assertTrue("Expected exception was not caught in " + desc, expECaught);
- });
- }
-
- /** */
- @Test
- public void testWriteReadExternal() throws Exception {
- assertNotNull("Unexpected null parent data", parentData);
-
- File f = new File(EXTERNALIZE_TEST_FILE_NAME);
-
- try {
- ObjectOutputStream objOutputStream = new ObjectOutputStream(new FileOutputStream(f));
-
- objOutputStream.writeObject(testVector);
-
- objOutputStream.close();
-
- ObjectInputStream objInputStream = new ObjectInputStream(new FileInputStream(f));
-
- VectorView readVector = (VectorView)objInputStream.readObject();
-
- objInputStream.close();
-
- assertTrue(MathTestConstants.VAL_NOT_EQUALS, testVector.equals(readVector));
- }
- catch (ClassNotFoundException | IOException e) {
- fail(e.getMessage());
- }
- }
-
- /** */
- private void consumeSampleVectors(BiConsumer<Vector, String> consumer) {
- new VectorImplementationsFixtures().consumeSampleVectors(null, consumer);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/ExternalizeTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/ExternalizeTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/ExternalizeTest.java
new file mode 100644
index 0000000..32a8ec1
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/ExternalizeTest.java
@@ -0,0 +1,66 @@
+/*
+ * 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.ignite.ml.math;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import org.apache.ignite.ml.math.impls.MathTestConstants;
+import org.junit.Test;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+/**
+ * Common test for externalization.
+ */
+public abstract class ExternalizeTest<T extends Externalizable & Destroyable> {
+ /** */
+ protected void externalizeTest(T initObj) {
+ T objRestored = null;
+
+ try {
+ ByteArrayOutputStream byteArrOutputStream = new ByteArrayOutputStream();
+ ObjectOutputStream objOutputStream = new ObjectOutputStream(byteArrOutputStream);
+
+ objOutputStream.writeObject(initObj);
+
+ ByteArrayInputStream byteArrInputStream = new ByteArrayInputStream(byteArrOutputStream.toByteArray());
+ ObjectInputStream objInputStream = new ObjectInputStream(byteArrInputStream);
+
+ objRestored = (T)objInputStream.readObject();
+
+ assertTrue(MathTestConstants.VAL_NOT_EQUALS, initObj.equals(objRestored));
+ assertTrue(MathTestConstants.VAL_NOT_EQUALS, Integer.compare(initObj.hashCode(), objRestored.hashCode()) == 0);
+ }
+ catch (ClassNotFoundException | IOException e) {
+ fail(e + " [" + e.getMessage() + "]");
+ }
+ finally {
+ if (objRestored != null)
+ objRestored.destroy();
+ }
+ }
+
+ /** */
+ @Test
+ public abstract void externalizeTest();
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/MathImplDistributedTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/MathImplDistributedTestSuite.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/MathImplDistributedTestSuite.java
new file mode 100644
index 0000000..720a090
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/MathImplDistributedTestSuite.java
@@ -0,0 +1,39 @@
+/*
+ * 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.ignite.ml.math;
+
+import org.apache.ignite.ml.math.impls.matrix.CacheMatrixTest;
+import org.apache.ignite.ml.math.impls.matrix.SparseDistributedMatrixTest;
+import org.apache.ignite.ml.math.impls.storage.matrix.SparseDistributedMatrixStorageTest;
+import org.apache.ignite.ml.math.impls.vector.CacheVectorTest;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+/**
+ * Test suite for all distributed tests located in org.apache.ignite.math.impls.* package.
+ */
+@RunWith(Suite.class)
+@Suite.SuiteClasses({
+ CacheVectorTest.class,
+ CacheMatrixTest.class,
+ SparseDistributedMatrixStorageTest.class,
+ SparseDistributedMatrixTest.class,
+})
+public class MathImplDistributedTestSuite {
+ // No-op.
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/MathImplLocalTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/MathImplLocalTestSuite.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/MathImplLocalTestSuite.java
new file mode 100644
index 0000000..be9c33a
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/MathImplLocalTestSuite.java
@@ -0,0 +1,123 @@
+/*
+ * 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.ignite.ml.math;
+
+import org.apache.ignite.ml.math.decompositions.CholeskyDecompositionTest;
+import org.apache.ignite.ml.math.decompositions.EigenDecompositionTest;
+import org.apache.ignite.ml.math.decompositions.LUDecompositionTest;
+import org.apache.ignite.ml.math.decompositions.QRDecompositionTest;
+import org.apache.ignite.ml.math.decompositions.SingularValueDecompositionTest;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOffHeapMatrixConstructorTest;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrixConstructorTest;
+import org.apache.ignite.ml.math.impls.matrix.DiagonalMatrixTest;
+import org.apache.ignite.ml.math.impls.matrix.FunctionMatrixConstructorTest;
+import org.apache.ignite.ml.math.impls.matrix.MatrixAttributeTest;
+import org.apache.ignite.ml.math.impls.matrix.MatrixImplementationsTest;
+import org.apache.ignite.ml.math.impls.matrix.MatrixViewConstructorTest;
+import org.apache.ignite.ml.math.impls.matrix.PivotedMatrixViewConstructorTest;
+import org.apache.ignite.ml.math.impls.matrix.RandomMatrixConstructorTest;
+import org.apache.ignite.ml.math.impls.matrix.SparseLocalOnHeapMatrixConstructorTest;
+import org.apache.ignite.ml.math.impls.matrix.TransposedMatrixViewTest;
+import org.apache.ignite.ml.math.impls.storage.matrix.MatrixArrayStorageTest;
+import org.apache.ignite.ml.math.impls.storage.matrix.MatrixOffHeapStorageTest;
+import org.apache.ignite.ml.math.impls.storage.matrix.MatrixStorageImplementationTest;
+import org.apache.ignite.ml.math.impls.storage.vector.RandomAccessSparseVectorStorageTest;
+import org.apache.ignite.ml.math.impls.storage.vector.SparseLocalOffHeapVectorStorageTest;
+import org.apache.ignite.ml.math.impls.storage.vector.VectorArrayStorageTest;
+import org.apache.ignite.ml.math.impls.storage.vector.VectorOffheapStorageTest;
+import org.apache.ignite.ml.math.impls.vector.AbstractVectorTest;
+import org.apache.ignite.ml.math.impls.vector.ConstantVectorConstructorTest;
+import org.apache.ignite.ml.math.impls.vector.DelegatingVectorConstructorTest;
+import org.apache.ignite.ml.math.impls.vector.DenseLocalOffHeapVectorConstructorTest;
+import org.apache.ignite.ml.math.impls.vector.DenseLocalOnHeapVectorConstructorTest;
+import org.apache.ignite.ml.math.impls.vector.FunctionVectorConstructorTest;
+import org.apache.ignite.ml.math.impls.vector.MatrixVectorViewTest;
+import org.apache.ignite.ml.math.impls.vector.PivotedVectorViewConstructorTest;
+import org.apache.ignite.ml.math.impls.vector.RandomVectorConstructorTest;
+import org.apache.ignite.ml.math.impls.vector.SingleElementVectorConstructorTest;
+import org.apache.ignite.ml.math.impls.vector.SingleElementVectorViewConstructorTest;
+import org.apache.ignite.ml.math.impls.vector.SparseLocalVectorConstructorTest;
+import org.apache.ignite.ml.math.impls.vector.VectorAttributesTest;
+import org.apache.ignite.ml.math.impls.vector.VectorFoldMapTest;
+import org.apache.ignite.ml.math.impls.vector.VectorImplementationsTest;
+import org.apache.ignite.ml.math.impls.vector.VectorIterableTest;
+import org.apache.ignite.ml.math.impls.vector.VectorNormTest;
+import org.apache.ignite.ml.math.impls.vector.VectorToMatrixTest;
+import org.apache.ignite.ml.math.impls.vector.VectorViewTest;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+/**
+ * Test suite for all local tests located in org.apache.ignite.math.impls.* package.
+ */
+@RunWith(Suite.class)
+@Suite.SuiteClasses({
+ // Vector constructors tests.
+ DenseLocalOnHeapVectorConstructorTest.class,
+ DenseLocalOffHeapVectorConstructorTest.class,
+ SparseLocalVectorConstructorTest.class,
+ RandomVectorConstructorTest.class,
+ ConstantVectorConstructorTest.class,
+ FunctionVectorConstructorTest.class,
+ SingleElementVectorConstructorTest.class,
+ PivotedVectorViewConstructorTest.class,
+ SingleElementVectorViewConstructorTest.class,
+ DelegatingVectorConstructorTest.class,
+ // Various vectors tests.
+ AbstractVectorTest.class,
+ VectorImplementationsTest.class,
+ VectorViewTest.class,
+ MatrixVectorViewTest.class,
+ // Vector particular features tests.
+ VectorIterableTest.class,
+ VectorAttributesTest.class,
+ VectorToMatrixTest.class,
+ VectorNormTest.class,
+ VectorFoldMapTest.class,
+ // Vector storage tests
+ VectorArrayStorageTest.class,
+ VectorOffheapStorageTest.class,
+ RandomAccessSparseVectorStorageTest.class,
+ SparseLocalOffHeapVectorStorageTest.class,
+ // Matrix storage tests.
+ MatrixStorageImplementationTest.class,
+ MatrixOffHeapStorageTest.class,
+ MatrixArrayStorageTest.class,
+ // Matrix constructors tests.
+ DenseLocalOnHeapMatrixConstructorTest.class,
+ DenseLocalOffHeapMatrixConstructorTest.class,
+ RandomMatrixConstructorTest.class,
+ FunctionMatrixConstructorTest.class,
+ MatrixViewConstructorTest.class,
+ PivotedMatrixViewConstructorTest.class,
+ SparseLocalOnHeapMatrixConstructorTest.class,
+ // Matrix tests.
+ MatrixImplementationsTest.class,
+ DiagonalMatrixTest.class,
+ MatrixAttributeTest.class,
+ TransposedMatrixViewTest.class,
+ // Decomposes
+ LUDecompositionTest.class,
+ EigenDecompositionTest.class,
+ CholeskyDecompositionTest.class,
+ QRDecompositionTest.class,
+ SingularValueDecompositionTest.class
+})
+public class MathImplLocalTestSuite {
+ // No-op.
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/MathImplMainTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/MathImplMainTestSuite.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/MathImplMainTestSuite.java
new file mode 100644
index 0000000..5f41583
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/MathImplMainTestSuite.java
@@ -0,0 +1,33 @@
+/*
+ * 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.ignite.ml.math;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+/**
+ * Test suite for local and distributed tests
+ */
+@RunWith(Suite.class)
+@Suite.SuiteClasses({
+ MathImplLocalTestSuite.class,
+ MathImplDistributedTestSuite.class
+})
+public class MathImplMainTestSuite {
+ // No-op.
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/TracerTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/TracerTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/TracerTest.java
new file mode 100644
index 0000000..d7c746d
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/TracerTest.java
@@ -0,0 +1,195 @@
+/*
+ * 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.ignite.ml.math;
+
+import java.awt.Color;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.List;
+import java.util.Optional;
+import org.apache.ignite.ml.math.impls.MathTestConstants;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
+import org.apache.ignite.ml.math.impls.vector.DenseLocalOnHeapVector;
+import org.junit.Test;
+
+import static java.nio.file.Files.createTempFile;
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Tests for {@link Tracer}.
+ */
+public class TracerTest {
+ /** */ private static final String DEFAULT_FORMAT = "%.10f";
+ /** */ private static final double DEFAULT_DELTA = 0.000000001d;
+
+ /**
+ * Color mapper that maps [0, 1] range into three distinct RGB segments.
+ */
+ private static final Tracer.ColorMapper COLOR_MAPPER = new Tracer.ColorMapper() {
+ /** {@inheritDoc} */
+ @Override public Color apply(Double d) {
+ if (d <= 0.33)
+ return Color.RED;
+ else if (d <= 0.66)
+ return Color.GREEN;
+ else
+ return Color.BLUE;
+ }
+ };
+
+ /**
+ * @param size Vector size.
+ */
+ private Vector makeRandomVector(int size) {
+ DenseLocalOnHeapVector vec = new DenseLocalOnHeapVector(size);
+
+ vec.assign((idx) -> Math.random());
+
+ return vec;
+ }
+
+ /**
+ * @param rows Amount of rows in matrix.
+ * @param cols Amount of columns in matrix.
+ */
+ private Matrix makeRandomMatrix(int rows, int cols) {
+ DenseLocalOnHeapMatrix mtx = new DenseLocalOnHeapMatrix(rows, cols);
+
+ // Missing assign(f)?
+ mtx.map((d) -> Math.random());
+
+ return mtx;
+ }
+
+ /**
+ *
+ */
+ @Test
+ public void testAsciiVectorTracer() {
+ Vector vec = makeRandomVector(20);
+
+ Tracer.showAscii(vec);
+ Tracer.showAscii(vec, "%2f");
+ Tracer.showAscii(vec, "%.3g");
+ }
+
+ /**
+ *
+ */
+ @Test
+ public void testAsciiMatrixTracer() {
+ Matrix mtx = makeRandomMatrix(10, 10);
+
+ Tracer.showAscii(mtx);
+ Tracer.showAscii(mtx, "%2f");
+ Tracer.showAscii(mtx, "%.3g");
+ }
+
+ /**
+ *
+ */
+ @Test
+ public void testHtmlVectorTracer() throws IOException {
+ Vector vec1 = makeRandomVector(1000);
+
+ // Default color mapping.
+ Tracer.showHtml(vec1);
+
+ // Custom color mapping.
+ Tracer.showHtml(vec1, COLOR_MAPPER);
+
+ // Default color mapping with sorted vector.
+ Tracer.showHtml(vec1.sort());
+ }
+
+ /**
+ *
+ */
+ @Test
+ public void testHtmlMatrixTracer() throws IOException {
+ Matrix mtx1 = makeRandomMatrix(100, 100);
+
+ // Custom color mapping.
+ Tracer.showHtml(mtx1, COLOR_MAPPER);
+
+ Matrix mtx2 = new DenseLocalOnHeapMatrix(100, 100);
+
+ double MAX = (double)(mtx2.rowSize() * mtx2.columnSize());
+
+ mtx2.assign((x, y) -> (double)(x * y) / MAX);
+
+ Tracer.showHtml(mtx2);
+ }
+
+ /** */
+ @Test
+ public void testWriteVectorToCSVFile() throws IOException {
+ DenseLocalOnHeapVector vector = new DenseLocalOnHeapVector(MathTestConstants.STORAGE_SIZE);
+
+ for (int i = 0; i < vector.size(); i++)
+ vector.set(i, Math.random());
+
+ Path file = createTempFile("vector", ".csv");
+
+ Tracer.saveAsCsv(vector, DEFAULT_FORMAT, file.toString());
+
+ System.out.println("Vector exported: " + file.getFileName());
+
+ List<String> strings = Files.readAllLines(file);
+ Optional<String> reduce = strings.stream().reduce((s1, s2) -> s1 + s2);
+ String[] csvVals = reduce.get().split(",");
+
+ for (int i = 0; i < vector.size(); i++) {
+ Double csvVal = Double.valueOf(csvVals[i]);
+
+ assertEquals("Unexpected value.", csvVal, vector.get(i), DEFAULT_DELTA);
+ }
+
+ Files.deleteIfExists(file);
+ }
+
+ /** */
+ @Test
+ public void testWriteMatrixToCSVFile() throws IOException {
+ DenseLocalOnHeapMatrix matrix = new DenseLocalOnHeapMatrix(MathTestConstants.STORAGE_SIZE, MathTestConstants.STORAGE_SIZE);
+
+ for (int i = 0; i < matrix.rowSize(); i++)
+ for (int j = 0; j < matrix.columnSize(); j++)
+ matrix.set(i, j, Math.random());
+
+ Path file = createTempFile("matrix", ".csv");
+
+ Tracer.saveAsCsv(matrix, DEFAULT_FORMAT, file.toString());
+
+ System.out.println("Matrix exported: " + file.getFileName());
+
+ List<String> strings = Files.readAllLines(file);
+ Optional<String> reduce = strings.stream().reduce((s1, s2) -> s1 + s2);
+ String[] csvVals = reduce.get().split(",");
+
+ for (int i = 0; i < matrix.rowSize(); i++)
+ for (int j = 0; j < matrix.columnSize(); j++) {
+ Double csvVal = Double.valueOf(csvVals[i * matrix.rowSize() + j]);
+
+ assertEquals("Unexpected value.", csvVal, matrix.get(i, j), DEFAULT_DELTA);
+ }
+
+ Files.deleteIfExists(file);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/MathBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/MathBenchmark.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/MathBenchmark.java
new file mode 100644
index 0000000..33ccfc9
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/MathBenchmark.java
@@ -0,0 +1,205 @@
+/*
+ * 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.ignite.ml.math.benchmark;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+import java.util.TimeZone;
+
+/** Refer {@link MathBenchmarkSelfTest} for usage examples. */
+class MathBenchmark {
+ /** */
+ private final boolean outputToConsole;
+
+ /** */
+ private final String benchmarkName;
+
+ /** */
+ private final int measurementTimes;
+
+ /** */
+ private final int warmUpTimes;
+
+ /** */
+ private final String tag;
+
+ /** */
+ private final String comments;
+
+ /** Constructor strictly for use within this class. */
+ private MathBenchmark(String benchmarkName, boolean outputToConsole, int measurementTimes, int warmUpTimes,
+ String tag, String comments) {
+ this.benchmarkName = benchmarkName;
+ this.outputToConsole = outputToConsole;
+ this.measurementTimes = measurementTimes;
+ this.warmUpTimes = warmUpTimes;
+ this.tag = tag;
+ this.comments = comments;
+ validate();
+ }
+
+ /**
+ * Benchmark with specified name and default parameters, in particular, default output file.
+ *
+ * @param benchmarkName name
+ */
+ MathBenchmark(String benchmarkName) {
+ this(benchmarkName, false, 100, 1, "", "");
+ }
+
+ /**
+ * Executes the code using config of this benchmark.
+ *
+ * @param code code to execute
+ * @throws Exception if something goes wrong
+ */
+ void execute(BenchmarkCode code) throws Exception {
+ System.out.println("Started benchmark [" + benchmarkName + "].");
+
+ for (int cnt = 0; cnt < warmUpTimes; cnt++)
+ code.call();
+
+ final long start = System.currentTimeMillis();
+
+ for (int cnt = 0; cnt < measurementTimes; cnt++)
+ code.call();
+
+ final long end = System.currentTimeMillis();
+
+ writeResults(formatResults(start, end));
+
+ System.out.println("Finished benchmark [" + benchmarkName + "].");
+ }
+
+ /**
+ * Set optional output mode for using stdout.
+ *
+ * @return configured benchmark
+ */
+ MathBenchmark outputToConsole() {
+ return new MathBenchmark(benchmarkName, true, measurementTimes, warmUpTimes, tag, comments);
+ }
+
+ /**
+ * Set optional measurement times.
+ *
+ * @param param times
+ * @return configured benchmark
+ */
+ MathBenchmark measurementTimes(int param) {
+ return new MathBenchmark(benchmarkName, outputToConsole, param, warmUpTimes, tag, comments);
+ }
+
+ /**
+ * Set optional warm-up times.
+ *
+ * @param param times
+ * @return configured benchmark
+ */
+ MathBenchmark warmUpTimes(int param) {
+ return new MathBenchmark(benchmarkName, outputToConsole, measurementTimes, param, tag, comments);
+ }
+
+ /**
+ * Set optional tag to help filtering specific kind of benchmark results.
+ *
+ * @param param name
+ * @return configured benchmark
+ */
+ MathBenchmark tag(String param) {
+ return new MathBenchmark(benchmarkName, outputToConsole, measurementTimes, warmUpTimes, param, comments);
+ }
+
+ /**
+ * Set optional comments.
+ *
+ * @param param name
+ * @return configured benchmark
+ */
+ MathBenchmark comments(String param) {
+ return new MathBenchmark(benchmarkName, outputToConsole, measurementTimes, warmUpTimes, tag, param);
+ }
+
+ /** */
+ private void writeResults(String results) throws Exception {
+ if (outputToConsole) {
+ System.out.println(results);
+
+ return;
+ }
+
+ new ResultsWriter().append(results);
+ }
+
+ /** */
+ private String formatResults(long start, long end) {
+ final String delim = ",";
+
+ assert !formatDouble(1000_000_001.1).contains(delim) : "Formatted results contain [" + delim + "].";
+
+ final String ts = formatTs(start);
+
+ assert !ts.contains(delim) : "Formatted timestamp contains [" + delim + "].";
+
+ return benchmarkName +
+ delim +
+ ts + // IMPL NOTE timestamp
+ delim +
+ formatDouble((double)(end - start) / measurementTimes) +
+ delim +
+ measurementTimes +
+ delim +
+ warmUpTimes +
+ delim +
+ tag +
+ delim +
+ comments;
+ }
+
+ /** */
+ private String formatDouble(double val) {
+ return String.format(Locale.US, "%f", val);
+ }
+
+ /** */
+ private String formatTs(long ts) {
+ final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
+
+ sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
+
+ return sdf.format(new Date(ts));
+ }
+
+ /** */
+ private void validate() {
+ if (benchmarkName == null || benchmarkName.isEmpty())
+ throw new IllegalArgumentException("Invalid benchmark name: [" + benchmarkName + "].");
+
+ if (measurementTimes < 1)
+ throw new IllegalArgumentException("Invalid measurement times: [" + measurementTimes + "].");
+ }
+
+ /** */
+ interface BenchmarkCode {
+ // todo find out why Callable<Void> failed to work here
+
+ /** */
+ void call() throws Exception;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/MathBenchmarkSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/MathBenchmarkSelfTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/MathBenchmarkSelfTest.java
new file mode 100644
index 0000000..86b29db
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/MathBenchmarkSelfTest.java
@@ -0,0 +1,100 @@
+/*
+ * 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.ignite.ml.math.benchmark;
+
+import org.junit.Ignore;
+import org.junit.Test;
+
+import static org.junit.Assert.assertTrue;
+
+/** */
+public class MathBenchmarkSelfTest {
+ /** */
+ @Test
+ @Ignore("Benchmark tests are intended only for manual execution")
+ public void demoTest() throws Exception {
+ for (int i = 0; i < 2; i++)
+ new MathBenchmark("demo test")
+ .outputToConsole() // IMPL NOTE this is to write output into console instead of a file
+ .tag(null) // IMPL NOTE try null for tag, expect it to be formatted reasonably
+ .comments(null) // IMPL NOTE try null for comments, expect it to be formatted reasonably
+ .execute(() -> {
+ double seed = 1.1;
+
+ for (int cnt = 0; cnt < 1000; cnt++) {
+ seed = Math.pow(seed, 2);
+
+ assertTrue(seed > 0);
+ }
+ });
+ }
+
+ /** */
+ @Test
+ @Ignore("Benchmark tests are intended only for manual execution")
+ public void configTest() throws Exception {
+ new MathBenchmark("demo config test")
+ .outputToConsole()
+ .measurementTimes(2)
+ .warmUpTimes(0)
+ .tag("demo tag")
+ .comments("demo comments")
+ .execute(() -> System.out.println("config test"));
+ }
+
+ /** */
+ @Test(expected = IllegalArgumentException.class)
+ @Ignore("Benchmark tests are intended only for manual execution")
+ public void emptyNameTest() throws Exception {
+ new MathBenchmark("")
+ .outputToConsole()
+ .measurementTimes(1)
+ .warmUpTimes(1)
+ .tag("empty name test tag")
+ .comments("empty name test comments")
+ .execute(() -> System.out.println("empty name test"));
+ }
+
+ /** */
+ @Test(expected = IllegalArgumentException.class)
+ @Ignore("Benchmark tests are intended only for manual execution")
+ public void nullDropboxPathTest() throws Exception {
+ new ResultsWriter(null, "whatever", "whatever");
+ }
+
+ /** */
+ @Test(expected = IllegalArgumentException.class)
+ @Ignore("Benchmark tests are intended only for manual execution")
+ public void nullDropboxUrlTest() throws Exception {
+ new ResultsWriter("whatever", null, "whatever");
+ }
+
+ /** */
+ @Test(expected = IllegalArgumentException.class)
+ @Ignore("Benchmark tests are intended only for manual execution")
+ public void nullDropboxTokenTest() throws Exception {
+ new ResultsWriter("whatever", "whatever", null);
+ }
+
+ /** */
+ @Test(expected = IllegalArgumentException.class)
+ @Ignore("Benchmark tests are intended only for manual execution")
+ public void nullResultsTest() throws Exception {
+ new ResultsWriter("whatever", "whatever", "whatever").append(null);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/ResultsWriter.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/ResultsWriter.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/ResultsWriter.java
new file mode 100644
index 0000000..2c37bff
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/ResultsWriter.java
@@ -0,0 +1,127 @@
+/*
+ * 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.ignite.ml.math.benchmark;
+
+import com.dropbox.core.DbxException;
+import com.dropbox.core.DbxRequestConfig;
+import com.dropbox.core.v2.DbxClientV2;
+import com.dropbox.core.v2.files.WriteMode;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
+import java.util.UUID;
+
+/** */
+class ResultsWriter {
+ /** */
+ private static final String DROPBOX_PATH
+ = "/benchmarks/math.benchmark.results.csv";
+
+ /** */
+ private static final String DROPBOX_URL
+ = "https://www.dropbox.com/s/r7tcle31r7gaty8/math.benchmark.results.csv";
+
+ /** */
+ private static final String ACCESS_TOKEN
+ = "1MMmQjEyzGAAAAAAAAAAfDFrQ6oBPPi4NX-iU_VrgmXB2JDXqRHGa125cTkkEQ0V";
+
+ /** */
+ private final String dropboxPath;
+ /** */
+ private final String dropboxUrl;
+ /** */
+ private final String accessTok;
+
+ /** */
+ ResultsWriter(String dropboxPath, String dropboxUrl, String accessTok) {
+ this.dropboxPath = dropboxPath;
+ this.dropboxUrl = dropboxUrl;
+ this.accessTok = accessTok;
+
+ if (dropboxPath == null || dropboxUrl == null || accessTok == null)
+ throw new IllegalArgumentException("Neither of dropbox path, URL, access token can be null.");
+ }
+
+ /** **/
+ ResultsWriter() {
+ this(DROPBOX_PATH, DROPBOX_URL, ACCESS_TOKEN);
+ }
+
+ /** */
+ void append(String res) throws DbxException, IOException {
+ if (res == null)
+ throw new IllegalArgumentException("benchmark result is null");
+
+ if (dropboxPath == null) {
+ System.out.println(res);
+
+ return;
+ }
+
+ append(res, client());
+ }
+
+ /** */
+ private void append(String res, DbxClientV2 client) throws DbxException, IOException {
+ File tmp = createTmpFile();
+
+ try (FileOutputStream out = new FileOutputStream(tmp)) {
+ client.files().download(dropboxPath).download(out);
+ }
+
+ writeResults(res, tmp);
+
+ try (FileInputStream in = new FileInputStream(tmp)) {
+ client.files().uploadBuilder(dropboxPath).withMode(WriteMode.OVERWRITE).uploadAndFinish(in);
+ }
+
+ if (!tmp.delete())
+ System.out.println("Failed to delete " + tmp.getAbsolutePath());
+
+ System.out.println("Uploaded benchmark results to: " + dropboxUrl);
+ }
+
+ /** */
+ private void writeResults(String res, File tmp) throws IOException {
+ final String unixLineSeparator = "\n";
+
+ try (final PrintWriter writer = new PrintWriter(Files.newBufferedWriter(Paths.get(tmp.toURI()),
+ StandardOpenOption.APPEND, StandardOpenOption.CREATE))) {
+ writer.write(res + unixLineSeparator);
+ }
+ }
+
+ /** */
+ private File createTmpFile() throws IOException {
+ File tmp = File.createTempFile(UUID.randomUUID().toString(), ".csv");
+
+ tmp.deleteOnExit();
+
+ return tmp;
+ }
+
+ /** */
+ private DbxClientV2 client() {
+ return new DbxClientV2(DbxRequestConfig.newBuilder("dropbox/MathBenchmark").build(), accessTok);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/VectorBenchmarkTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/VectorBenchmarkTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/VectorBenchmarkTest.java
new file mode 100644
index 0000000..fd98382
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/VectorBenchmarkTest.java
@@ -0,0 +1,138 @@
+/*
+ * 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.ignite.ml.math.benchmark;
+
+import java.util.function.BiConsumer;
+import java.util.function.Function;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.impls.vector.DenseLocalOffHeapVector;
+import org.apache.ignite.ml.math.impls.vector.DenseLocalOnHeapVector;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+
+/** */
+public class VectorBenchmarkTest {
+ // todo add benchmarks for other methods in Vector and for other types of Vector and Matrix
+
+ /** */
+ @Test
+ @Ignore("Benchmark tests are intended only for manual execution")
+ public void testDenseLocalOnHeapVector() throws Exception {
+ benchmark("DenseLocalOnHeapVector basic mix", DenseLocalOnHeapVector::new, this::basicMix);
+
+ benchmark("DenseLocalOnHeapVector fold map", DenseLocalOnHeapVector::new, this::foldMapMix);
+ }
+
+ /** */
+ @Test
+ @Ignore("Benchmark tests are intended only for manual execution")
+ public void testDenseLocalOffHeapVector() throws Exception {
+ benchmark("DenseLocalOffHeapVector basic mix", DenseLocalOffHeapVector::new, this::basicMix);
+
+ benchmark("DenseLocalOffHeapVector fold map", DenseLocalOffHeapVector::new, this::foldMapMix);
+ }
+
+ /** */
+ private void benchmark(String namePrefix, Function<Integer, Vector> constructor,
+ BiConsumer<Integer, Function<Integer, Vector>> consumer) throws Exception {
+ assertNotNull(namePrefix);
+
+ new MathBenchmark(namePrefix + " small sizes").execute(() -> {
+ for (int size : new int[] {2, 3, 4, 5, 6, 7})
+ consumer.accept(size, constructor);
+ });
+
+ new MathBenchmark(namePrefix + " sizes powers of 2").execute(() -> {
+ for (int power : new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14})
+ consumer.accept(1 << power, constructor);
+ });
+
+ new MathBenchmark(namePrefix + " large sizes").execute(() -> {
+ for (int power : new int[] {10, 12, 14, 16})
+ for (int delta : new int[] {-1, 0, 1})
+ consumer.accept((1 << power) + delta, constructor);
+ });
+
+ new MathBenchmark(namePrefix + " extra large sizes")
+ .measurementTimes(10)
+ .execute(() -> { // IMPL NOTE trying below with power 22 almost killed my IDEA and laptop
+ for (int power : new int[] {17, 18, 19, 20, 21})
+ for (int delta : new int[] {-1, 0}) // IMPL NOTE delta +1 is not intended for use here
+ consumer.accept((1 << power) + delta, constructor);
+ });
+ }
+
+ /** */
+ private void basicMix(int size, Function<Integer, Vector> constructor) {
+ final Vector v1 = constructor.apply(size), v2 = constructor.apply(size);
+
+ for (int idx = 0; idx < size; idx++) {
+ v1.set(idx, idx);
+
+ v2.set(idx, size - idx);
+ }
+
+ assertNotNull(v1.sum());
+
+ assertNotNull(v1.copy());
+
+ assertFalse(v1.getLengthSquared() < 0);
+
+ assertNotNull(v1.normalize());
+
+ assertNotNull(v1.logNormalize());
+
+ assertFalse(v1.getDistanceSquared(v2) < 0);
+
+ assertNotNull(v1.divide(2));
+
+ assertNotNull(v1.minus(v2));
+
+ assertNotNull(v1.plus(v2));
+
+ assertNotNull(v1.dot(v2));
+
+ assertNotNull(v1.assign(v2));
+
+ assertNotNull(v1.assign(1)); // IMPL NOTE this would better be last test for it sets all values the same
+ }
+
+ /** */
+ private void foldMapMix(int size, Function<Integer, Vector> constructor) {
+ final Vector v1 = constructor.apply(size), v2 = constructor.apply(size);
+
+ for (int idx = 0; idx < size; idx++) {
+ v1.set(idx, idx);
+
+ v2.set(idx, size - idx);
+ }
+
+ assertNotNull(v1.map((val) -> (val + 1)));
+
+ assertNotNull(v1.map(v2, (one, other) -> one + other / 2.0));
+
+ assertNotNull(v1.map((val, val1) -> (val + val1), 2.0));
+
+ assertNotNull(v1.foldMap((sum, val) -> (val + sum), (val) -> val, 0.0));
+
+ assertNotNull(v1.foldMap(v2, (sum, val) -> (val + sum), (val1, val2) -> val1 + val2, 0.0));
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/package-info.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/package-info.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/package-info.java
new file mode 100644
index 0000000..f77e6e32
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/package-info.java
@@ -0,0 +1,18 @@
+/*
+ * 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.ignite.ml.math.benchmark;
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/decompositions/CholeskyDecompositionTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/decompositions/CholeskyDecompositionTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/decompositions/CholeskyDecompositionTest.java
new file mode 100644
index 0000000..be03cb1
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/decompositions/CholeskyDecompositionTest.java
@@ -0,0 +1,158 @@
+/*
+ * 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.ignite.ml.math.decompositions;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.CardinalityException;
+import org.apache.ignite.ml.math.exceptions.NonPositiveDefiniteMatrixException;
+import org.apache.ignite.ml.math.exceptions.NonSymmetricMatrixException;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
+import org.apache.ignite.ml.math.impls.matrix.PivotedMatrixView;
+import org.apache.ignite.ml.math.impls.vector.DenseLocalOnHeapVector;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+/** */
+public class CholeskyDecompositionTest {
+ /** */
+ @Test
+ public void basicTest() {
+ basicTest(new DenseLocalOnHeapMatrix(new double[][] {
+ {2.0d, -1.0d, 0.0d},
+ {-1.0d, 2.0d, -1.0d},
+ {0.0d, -1.0d, 2.0d}
+ }));
+ }
+
+ /**
+ * Test for {@link DecompositionSupport} features.
+ */
+ @Test
+ public void decompositionSupportTest() {
+ basicTest(new PivotedMatrixView(new DenseLocalOnHeapMatrix(new double[][] {
+ {2.0d, -1.0d, 0.0d},
+ {-1.0d, 2.0d, -1.0d},
+ {0.0d, -1.0d, 2.0d}
+ })));
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void nullMatrixTest() {
+ new CholeskyDecomposition(null);
+ }
+
+ /** */
+ @Test(expected = CardinalityException.class)
+ public void wrongMatrixSizeTest() {
+ new CholeskyDecomposition(new DenseLocalOnHeapMatrix(2, 3));
+ }
+
+ /** */
+ @Test(expected = NonSymmetricMatrixException.class)
+ public void nonSymmetricMatrixTest() {
+ new CholeskyDecomposition(new DenseLocalOnHeapMatrix(new double[][] {
+ {2.0d, -1.0d, 10.0d},
+ {-1.0d, 2.0d, -1.0d},
+ {-10.0d, -1.0d, 2.0d}
+ }));
+ }
+
+ /** */
+ @Test(expected = NonPositiveDefiniteMatrixException.class)
+ public void nonAbsPositiveMatrixTest() {
+ new CholeskyDecomposition(new DenseLocalOnHeapMatrix(new double[][] {
+ {2.0d, -1.0d, 0.0d},
+ {-1.0d, 0.0d, -1.0d},
+ {0.0d, -1.0d, 2.0d}
+ }));
+ }
+
+ /** */
+ @Test(expected = CardinalityException.class)
+ public void solveWrongVectorSizeTest() {
+ new CholeskyDecomposition(new DenseLocalOnHeapMatrix(new double[][] {
+ {2.0d, -1.0d, 0.0d},
+ {-1.0d, 2.0d, -1.0d},
+ {0.0d, -1.0d, 2.0d}
+ })).solve(new DenseLocalOnHeapVector(2));
+ }
+
+ /** */
+ @Test(expected = CardinalityException.class)
+ public void solveWrongMatrixSizeTest() {
+ new CholeskyDecomposition(new DenseLocalOnHeapMatrix(new double[][] {
+ {2.0d, -1.0d, 0.0d},
+ {-1.0d, 2.0d, -1.0d},
+ {0.0d, -1.0d, 2.0d}
+ })).solve(new DenseLocalOnHeapMatrix(2, 3));
+ }
+
+ /** */
+ private void basicTest(Matrix m) {
+ // This decomposition is useful when dealing with systems of linear equations of the form
+ // m x = b where m is a Hermitian matrix.
+ // For such systems Cholesky decomposition provides
+ // more effective method of solving compared to LU decomposition.
+ // Suppose we want to solve system
+ // m x = b for various bs. Then after we computed Cholesky decomposition, we can feed various bs
+ // as a matrix of the form
+ // (b1, b2, ..., bm)
+ // to the method Cholesky::solve which returns solutions in the form
+ // (sol1, sol2, ..., solm)
+ CholeskyDecomposition dec = new CholeskyDecomposition(m);
+ assertEquals("Unexpected value for decomposition determinant.",
+ 4d, dec.getDeterminant(), 0d);
+
+ Matrix l = dec.getL();
+ Matrix lt = dec.getLT();
+
+ assertNotNull("Matrix l is expected to be not null.", l);
+ assertNotNull("Matrix lt is expected to be not null.", lt);
+
+ for (int row = 0; row < l.rowSize(); row++)
+ for (int col = 0; col < l.columnSize(); col++)
+ assertEquals("Unexpected value transposed matrix at (" + row + "," + col + ").",
+ l.get(row, col), lt.get(col, row), 0d);
+
+ Matrix bs = new DenseLocalOnHeapMatrix(new double[][] {
+ {4.0, -6.0, 7.0},
+ {1.0, 1.0, 1.0}
+ }).transpose();
+ Matrix sol = dec.solve(bs);
+
+ assertNotNull("Solution matrix is expected to be not null.", sol);
+ assertEquals("Solution rows are not as expected.", bs.rowSize(), sol.rowSize());
+ assertEquals("Solution columns are not as expected.", bs.columnSize(), sol.columnSize());
+
+ for (int i = 0; i < sol.columnSize(); i++)
+ assertNotNull("Solution matrix column is expected to be not null at index " + i, sol.viewColumn(i));
+
+ Vector b = new DenseLocalOnHeapVector(new double[] {4.0, -6.0, 7.0});
+ Vector solVec = dec.solve(b);
+
+ for (int idx = 0; idx < b.size(); idx++)
+ assertEquals("Unexpected value solution vector at " + idx,
+ b.get(idx), solVec.get(idx), 0d);
+
+ dec.destroy();
+ }
+}
[25/67] [abbrv] ignite git commit: master - Mute test with a correct
link
Posted by sb...@apache.org.
master - Mute test with a correct link
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/364c3866
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/364c3866
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/364c3866
Branch: refs/heads/ignite-5075
Commit: 364c38661a1864e0b823be737998ed66927d11ca
Parents: 0abf660
Author: Alexey Goncharuk <al...@gmail.com>
Authored: Tue Apr 18 18:40:27 2017 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Tue Apr 18 18:40:27 2017 +0300
----------------------------------------------------------------------
.../cache/IgniteCacheJoinPartitionedAndReplicatedTest.java | 2 ++
1 file changed, 2 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/364c3866/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheJoinPartitionedAndReplicatedTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheJoinPartitionedAndReplicatedTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheJoinPartitionedAndReplicatedTest.java
index 46b8272..fb78678 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheJoinPartitionedAndReplicatedTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheJoinPartitionedAndReplicatedTest.java
@@ -179,6 +179,8 @@ public class IgniteCacheJoinPartitionedAndReplicatedTest extends GridCommonAbstr
* @throws Exception If failed.
*/
public void testJoin() throws Exception {
+ fail("https://issues.apache.org/jira/browse/IGNITE-5016");
+
Ignite client = grid(2);
IgniteCache<Object, Object> personCache = client.cache(PERSON_CACHE);
[17/67] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math
module to Ignite ML module added missed licenses renamed packages fixed wrong
ml profile activation (cherry picked from commit d78e071)
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/IdentityValueMapper.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/IdentityValueMapper.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/IdentityValueMapper.java
new file mode 100644
index 0000000..00bf915
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/IdentityValueMapper.java
@@ -0,0 +1,53 @@
+/*
+ * 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.ignite.ml.math;
+
+/**
+ * Identity value mapper.
+ */
+public class IdentityValueMapper implements ValueMapper<Double> {
+ /** */ private static final long serialVersionUID = -8010078306142216389L;
+
+ /** {@inheritDoc} */
+ @Override public Double fromDouble(double v) {
+ return v;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double toDouble(Double v) {
+ assert v != null;
+
+ return v;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ return Long.hashCode(serialVersionUID);
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object o) {
+ if (this == o)
+ return true;
+
+ if (o == null || getClass() != o.getClass())
+ return false;
+
+ return true;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/KeyMapper.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/KeyMapper.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/KeyMapper.java
new file mode 100644
index 0000000..1ac2f3d
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/KeyMapper.java
@@ -0,0 +1,33 @@
+/*
+ * 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.ignite.ml.math;
+
+import java.io.Serializable;
+
+/**
+ * Maps key objects to index in {@link Vector} or {@link Matrix}.
+ */
+public interface KeyMapper<K> extends Serializable {
+ /**
+ * Checks given cache key corresponds to a valid index in vector or matrix.
+ *
+ * @param k Key to check.
+ * @return {@code true} if there is a valid index, {@code false} otherwise.
+ */
+ public boolean isValid(K k);
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/Matrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/Matrix.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/Matrix.java
new file mode 100644
index 0000000..1039484
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/Matrix.java
@@ -0,0 +1,518 @@
+/*
+ * 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.ignite.ml.math;
+
+import java.io.Externalizable;
+import org.apache.ignite.lang.IgniteUuid;
+import org.apache.ignite.ml.math.exceptions.CardinalityException;
+import org.apache.ignite.ml.math.exceptions.IndexException;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.functions.IgniteBiFunction;
+import org.apache.ignite.ml.math.functions.IgniteDoubleFunction;
+import org.apache.ignite.ml.math.functions.IgniteFunction;
+import org.apache.ignite.ml.math.functions.IntIntToDoubleFunction;
+
+/**
+ * A matrix interface.
+ *
+ * Based on its flavor it can have vastly different implementations tailored for
+ * for different types of data (e.g. dense vs. sparse), different sizes of data or different operation
+ * optimizations.
+ *
+ * Note also that not all operations can be supported by all underlying implementations. If an operation is not
+ * supported a {@link UnsupportedOperationException} is thrown. This exception can also be thrown in partial cases
+ * where an operation is unsupported only in special cases, e.g. where a given operation cannot be deterministically
+ * completed in polynomial time.
+ *
+ * Based on ideas from <a href="http://mahout.apache.org/">Apache Mahout</a>.
+ */
+public interface Matrix extends MetaAttributes, Externalizable, StorageOpsMetrics, Destroyable {
+ /**
+ * Holder for matrix's element.
+ */
+ interface Element {
+ /**
+ * Gets element's value.
+ *
+ * @return The value of this matrix element.
+ */
+ double get();
+
+ /**
+ * Gets element's row index.
+ *
+ * @return The row index of this element.
+ */
+ int row();
+
+ /**
+ * Gets element's column index.
+ *
+ * @return The column index of this element.
+ */
+ int column();
+
+ /**
+ * Sets element's value.
+ *
+ * @param val Value to set.
+ */
+ void set(double val);
+ }
+
+ /**
+ * Gets the maximum value in this matrix.
+ *
+ * @return Maximum value in this matrix.
+ */
+ public double maxValue();
+
+ /**
+ * Gets the minimum value in this matrix.
+ *
+ * @return Minimum value in this matrix.
+ */
+ public double minValue();
+
+ /**
+ * Gets the maximum element in this matrix.
+ *
+ * @return Maximum element in this matrix.
+ */
+ public Element maxElement();
+
+ /**
+ * Gets the minimum element in this matrix.
+ *
+ * @return Minimum element in this matrix.
+ */
+ public Element minElement();
+
+ /**
+ * Gets the matrix's element at the given coordinates.
+ *
+ * @param row Row index.
+ * @param col Column index.
+ * @return Element at the given coordinates.
+ */
+ public Element getElement(int row, int col);
+
+ /**
+ * Swaps two rows in this matrix.
+ *
+ * @param row1 Row #1.
+ * @param row2 Row #2.
+ * @return This matrix.
+ */
+ public Matrix swapRows(int row1, int row2);
+
+ /**
+ * Swaps two columns in this matrix.
+ *
+ * @param col1 Column #1.
+ * @param col2 Column #2.
+ * @return This matrix.
+ */
+ public Matrix swapColumns(int col1, int col2);
+
+ /**
+ * Assigns given value to all elements of this matrix.
+ *
+ * @param val Value to assign to all elements.
+ * @return This matrix.
+ */
+ public Matrix assign(double val);
+
+ /**
+ * Assigns given values to this matrix.
+ *
+ * @param vals Values to assign.
+ * @return This matrix.
+ * @throws CardinalityException Thrown if cardinalities mismatch.
+ */
+ public Matrix assign(double[][] vals);
+
+ /**
+ * Assigns values from given matrix to this matrix.
+ *
+ * @param mtx Matrix to assign to this matrix.
+ * @return This matrix.
+ * @throws CardinalityException Thrown if cardinalities mismatch.
+ */
+ public Matrix assign(Matrix mtx);
+
+ /**
+ * Assigns each matrix element to the value generated by given function.
+ *
+ * @param fun Function that takes the row and column and returns the value to assign.
+ * @return This matrix.
+ */
+ public Matrix assign(IntIntToDoubleFunction fun);
+
+ /**
+ * Maps all values in this matrix through a given function.
+ *
+ * @param fun Mapping function.
+ * @return This matrix.
+ */
+ public Matrix map(IgniteDoubleFunction<Double> fun);
+
+ /**
+ * Maps all values in this matrix through a given function.
+ *
+ * For this matrix <code>A</code>, argument matrix <code>B</code> and the
+ * function <code>F</code> this method maps every cell <code>x, y</code> as:
+ * <code>A(x,y) = fun(A(x,y), B(x,y))</code>
+ *
+ * @param mtx Argument matrix.
+ * @param fun Mapping function.
+ * @return This function.
+ * @throws CardinalityException Thrown if cardinalities mismatch.
+ */
+ public Matrix map(Matrix mtx, IgniteBiFunction<Double, Double, Double> fun);
+
+ /**
+ * Assigns values from given vector to the specified column in this matrix.
+ *
+ * @param col Column index.
+ * @param vec Vector to get values from.
+ * @return This matrix.
+ * @throws CardinalityException Thrown if cardinalities mismatch.
+ */
+ public Matrix assignColumn(int col, Vector vec);
+
+ /**
+ * Assigns values from given vector to the specified row in this matrix.
+ *
+ * @param row Row index.
+ * @param vec Vector to get values from.
+ * @return This matrix.
+ * @throws CardinalityException Thrown if cardinalities mismatch.
+ */
+ public Matrix assignRow(int row, Vector vec);
+
+ /**
+ * Collects the results of applying a given function to all rows in this matrix.
+ *
+ * @param fun Aggregating function.
+ * @return Vector of row aggregates.
+ */
+ public Vector foldRows(IgniteFunction<Vector, Double> fun);
+
+ /**
+ * Collects the results of applying a given function to all columns in this matrix.
+ *
+ * @param fun Aggregating function.
+ * @return Vector of column aggregates.
+ */
+ public Vector foldColumns(IgniteFunction<Vector, Double> fun);
+
+ /**
+ * Folds this matrix into a single value.
+ *
+ * @param foldFun Folding function that takes two parameters: accumulator and the current value.
+ * @param mapFun Mapping function that is called on each matrix cell before its passed to the accumulator (as its
+ * second parameter).
+ * @param <T> Type of the folded value.
+ * @param zeroVal Zero value for fold function.
+ * @return Folded value of this matrix.
+ */
+ public <T> T foldMap(IgniteBiFunction<T, Double, T> foldFun, IgniteDoubleFunction<Double> mapFun, T zeroVal);
+
+ /**
+ * Calculates the density of the matrix based on supplied criteria.
+ * Returns {@code true} if this matrix is denser than threshold with at least 80% confidence.
+ *
+ * @param threshold the threshold value [0, 1] of non-zero elements above which the matrix is considered dense.
+ */
+ public boolean density(double threshold);
+
+ /**
+ * Gets number of columns in this matrix.
+ *
+ * @return The number of columns in this matrix.
+ */
+ public int columnSize();
+
+ /**
+ * Gets number of rows in this matrix.
+ *
+ * @return The number of rows in this matrix.
+ */
+ public int rowSize();
+
+ /**
+ * Returns matrix determinant using Laplace theorem.
+ *
+ * @return A determinant for this matrix.
+ * @throws CardinalityException Thrown if matrix is not square.
+ */
+ public double determinant();
+
+ /**
+ * Returns the inverse matrix of this matrix
+ *
+ * @return Inverse of this matrix
+ */
+ public Matrix inverse();
+
+ /**
+ * Divides each value in this matrix by the argument.
+ *
+ * @param x Divider value.
+ * @return This matrix.
+ */
+ public Matrix divide(double x);
+
+ /**
+ * Gets the matrix value at the provided location.
+ *
+ * @param row Row index.
+ * @param col Column index.
+ * @return Matrix value.
+ * @throws IndexException Thrown in case of index is out of bound.
+ */
+ public double get(int row, int col);
+
+ /**
+ * Gets the matrix value at the provided location without checking boundaries.
+ * This method is marginally quicker than its {@link #get(int, int)} sibling.
+ *
+ * @param row Row index.
+ * @param col Column index.
+ * @return Matrix value.
+ */
+ public double getX(int row, int col);
+
+ /**
+ * Gets matrix storage model.
+ */
+ public MatrixStorage getStorage();
+
+ /**
+ * Clones this matrix.
+ *
+ * NOTE: new matrix will have the same flavor as the this matrix but a different ID.
+ *
+ * @return New matrix of the same underlying class, the same size and the same values.
+ */
+ public Matrix copy();
+
+ /**
+ * Creates new empty matrix of the same underlying class but of different size.
+ *
+ * NOTE: new matrix will have the same flavor as the this matrix but a different ID.
+ *
+ * @param rows Number of rows for new matrix.
+ * @param cols Number of columns for new matrix.
+ * @return New matrix of the same underlying class and size.
+ */
+ public Matrix like(int rows, int cols);
+
+ /**
+ * Creates new empty vector of compatible properties (similar or the same flavor) to this matrix.
+ *
+ * @param crd Cardinality of the vector.
+ * @return Newly created empty vector "compatible" to this matrix.
+ */
+ public Vector likeVector(int crd);
+
+ /**
+ * Creates new matrix where each value is a difference between corresponding value of this matrix and
+ * passed in argument matrix.
+ *
+ * @param mtx Argument matrix.
+ * @return New matrix of the same underlying class and size.
+ * @throws CardinalityException Thrown if cardinalities mismatch.
+ */
+ public Matrix minus(Matrix mtx);
+
+ /**
+ * Creates new matrix where each value is a sum of the corresponding value of this matrix and
+ * argument value.
+ *
+ * @param x Value to add.
+ * @return New matrix of the same underlying class and size.
+ */
+ public Matrix plus(double x);
+
+ /**
+ * Creates new matrix where each value is a sum of corresponding values of this matrix and
+ * passed in argument matrix.
+ *
+ * @param mtx Argument matrix.
+ * @return New matrix of the same underlying class and size.
+ * @throws CardinalityException Thrown if cardinalities mismatch.
+ */
+ public Matrix plus(Matrix mtx);
+
+ /**
+ * Auto-generated globally unique matrix ID.
+ *
+ * @return Matrix GUID.
+ */
+ public IgniteUuid guid();
+
+ /**
+ * Sets given value.
+ *
+ * @param row Row index.
+ * @param col Column index.
+ * @param val Value to set.
+ * @return This matrix.
+ * @throws IndexException Thrown in case of either index is out of bound.
+ */
+ public Matrix set(int row, int col, double val);
+
+ /**
+ * Sets values for given row.
+ *
+ * @param row Row index.
+ * @param data Row data to set.
+ * @return This matrix.
+ * @throws IndexException Thrown in case of index is out of bound.
+ * @throws CardinalityException Thrown if cardinalities mismatch.
+ */
+ public Matrix setRow(int row, double[] data);
+
+ /**
+ * Sets values for given column.
+ *
+ * @param col Column index.
+ * @param data Column data to set.
+ * @return This matrix.
+ * @throws IndexException Thrown in case of index is out of bound.
+ * @throws CardinalityException Thrown if cardinalities mismatch.
+ */
+ public Matrix setColumn(int col, double[] data);
+
+ /**
+ * Sets given value without checking for index bounds. This method is marginally faster
+ * than its {@link #set(int, int, double)} sibling.
+ *
+ * @param row Row index.
+ * @param col Column index.
+ * @param val Value to set.
+ * @return This matrix.
+ */
+ public Matrix setX(int row, int col, double val);
+
+ /**
+ * Creates new matrix containing the product of given value and values in this matrix.
+ *
+ * @param x Value to multiply.
+ * @return New matrix.
+ */
+ public Matrix times(double x);
+
+ /**
+ * Creates new matrix that is the product of multiplying this matrix and the argument matrix.
+ *
+ * @param mtx Argument matrix.
+ * @return New matrix.
+ * @throws CardinalityException Thrown if cardinalities mismatch.
+ */
+ public Matrix times(Matrix mtx);
+
+ /**
+ * Creates new matrix that is the product of multiplying this matrix and the argument vector.
+ *
+ * @param vec Argument vector.
+ * @return New matrix.
+ * @throws CardinalityException Thrown if cardinalities mismatch.
+ */
+ public Vector times(Vector vec);
+
+ /**
+ * Gets maximum absolute row sum norm of this matrix.
+ * See http://mathworld.wolfram.com/MaximumAbsoluteRowSumNorm.html
+ *
+ * @return Maximum absolute row sum norm of this matrix.
+ */
+ public double maxAbsRowSumNorm();
+
+ /**
+ * Gets sum of all elements in the matrix.
+ *
+ * @return Sum of all elements in this matrix.
+ */
+ public double sum();
+
+ /**
+ * Creates new matrix that is transpose of this matrix.
+ *
+ * @return New transposed matrix.
+ */
+ public Matrix transpose();
+
+ /**
+ * Creates new view into this matrix. Changes to the view will be propagated to this matrix.
+ *
+ * @param off View offset as <code>int[x,y]</code>.
+ * @param size View size as <code>int[rows, cols]</code>
+ * @return New view.
+ * @throws CardinalityException Thrown if cardinalities mismatch.
+ * @throws IndexException Thrown in case of offset is out of bound.
+ */
+ public Matrix viewPart(int[] off, int[] size);
+
+ /**
+ * Creates new view into this matrix. Changes to the view will be propagated to this matrix.
+ *
+ * @param rowOff
+ * @param rows
+ * @param colOff
+ * @param cols
+ * @return New view.
+ * @throws CardinalityException Thrown if cardinalities mismatch.
+ * @throws IndexException Thrown in case of offset is out of bound.
+ */
+ public Matrix viewPart(int rowOff, int rows, int colOff, int cols);
+
+ /**
+ * Creates new view into matrix row. Changes to the view will be propagated to this matrix.
+ *
+ * @param row Row index.
+ * @return New view.
+ * @throws IndexException Thrown in case of index is out of bound.
+ */
+ public Vector viewRow(int row);
+
+ /**
+ * Creates new view into matrix column . Changes to the view will be propagated to this matrix.
+ *
+ * @param col Column index.
+ * @return New view.
+ * @throws IndexException Thrown in case of index is out of bound.
+ */
+ public Vector viewColumn(int col);
+
+ /**
+ * Creates new view into matrix diagonal. Changes to the view will be propagated to this matrix.
+ *
+ * @return New view.
+ */
+ public Vector viewDiagonal();
+
+ /**
+ * Destroys matrix if managed outside of JVM. It's a no-op in all other cases.
+ */
+ public default void destroy() {
+ // No-op.
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/MatrixKeyMapper.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/MatrixKeyMapper.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/MatrixKeyMapper.java
new file mode 100644
index 0000000..54d2088
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/MatrixKeyMapper.java
@@ -0,0 +1,30 @@
+/*
+ * 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.ignite.ml.math;
+
+/**
+ * Maps {@link Matrix} row and column index to cache key.
+ */
+public interface MatrixKeyMapper<K> extends KeyMapper<K> {
+ /**
+ * @param x Matrix row index.
+ * @param y Matrix column index.
+ * @return Cache key for given row and column.
+ */
+ public K apply(int x, int y);
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/MatrixStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/MatrixStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/MatrixStorage.java
new file mode 100644
index 0000000..ccfebe5
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/MatrixStorage.java
@@ -0,0 +1,58 @@
+/*
+ * 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.ignite.ml.math;
+
+import java.io.Externalizable;
+
+/**
+ * Data storage support for {@link Matrix}.
+ */
+public interface MatrixStorage extends Externalizable, StorageOpsMetrics, Destroyable {
+ /**
+ * @param x Matrix row index.
+ * @param y Matrix column index.
+ * @return Value corresponding to given row and column.
+ */
+ public double get(int x, int y);
+
+ /**
+ * @param x Matrix row index.
+ * @param y Matrix column index.
+ * @param v Value to set at given row and column.
+ */
+ public void set(int x, int y, double v);
+
+ /**
+ *
+ */
+ public int columnSize();
+
+ /**
+ *
+ */
+ public int rowSize();
+
+ /**
+ * Gets underlying array if {@link StorageOpsMetrics#isArrayBased()} returns {@code true}.
+ *
+ * @see StorageOpsMetrics#isArrayBased()
+ */
+ default public double[][] data() {
+ return null;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/MetaAttributes.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/MetaAttributes.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/MetaAttributes.java
new file mode 100644
index 0000000..8befc6a
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/MetaAttributes.java
@@ -0,0 +1,76 @@
+/*
+ * 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.ignite.ml.math;
+
+import java.util.Map;
+
+/**
+ * Interface provides support for meta attributes on vectors and matrices.
+ */
+public interface MetaAttributes {
+ /**
+ * Implementation should return an instance of the map to store meta attributes.
+ */
+ public Map<String, Object> getMetaStorage();
+
+ /**
+ * Gets meta attribute with given name.
+ *
+ * @param name Name of the vector meta attribute to get.
+ * @param <T> Attribute's type.
+ */
+ @SuppressWarnings("unchecked")
+ public default <T> T getAttribute(String name) {
+ return (T)getMetaStorage().get(name);
+ }
+
+ /**
+ * Sets meta attribute with given name and value.
+ *
+ * @param name Name of the meta attribute.
+ * @param val Attribute value.
+ * @param <T> Attribute's type.
+ */
+ public default <T> void setAttribute(String name, T val) {
+ getMetaStorage().put(name, val);
+ }
+
+ /**
+ * Removes meta attribute with given name.
+ *
+ * @param name Name of the meta attribute.
+ * @return {@code true} if attribute was present and was removed, {@code false} otherwise.
+ */
+ public default boolean removeAttribute(String name) {
+ boolean is = getMetaStorage().containsKey(name);
+
+ if (is)
+ getMetaStorage().remove(name);
+
+ return is;
+ }
+
+ /**
+ * Checks if given meta attribute is present.
+ *
+ * @param name Attribute name to check.
+ */
+ public default boolean hasAttribute(String name) {
+ return getMetaStorage().containsKey(name);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/MurmurHash.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/MurmurHash.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/MurmurHash.java
new file mode 100644
index 0000000..0cbcbdf
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/MurmurHash.java
@@ -0,0 +1,246 @@
+/*
+ * 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.ignite.ml.math;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * This is a very fast, non-cryptographic hash suitable for general hash-based lookup.
+ *
+ * See http://murmurhash.googlepages.com/ for mre details.
+ */
+public class MurmurHash {
+ /** Hide it. */
+ private MurmurHash() {
+ }
+
+ /**
+ * This produces exactly the same hash values as the final C+ version of MurmurHash3 and is
+ * thus suitable for producing the same hash values across platforms.
+ *
+ * The 32 bit x86 version of this hash should be the fastest variant for relatively short keys like IDs.
+ *
+ * Note - The x86 and x64 versions do _not_ produce the same results, as the algorithms are
+ * optimized for their respective platforms.
+ *
+ * See also http://github.com/yonik/java_util for future updates to this method.
+ *
+ * @param data
+ * @param off
+ * @param len
+ * @param seed
+ * @return 32 bit hash platform compatible with C++ MurmurHash3 implementation on x86.
+ */
+ public static int hash3X86(byte[] data, int off, int len, int seed) {
+ int c1 = 0xcc9e2d51;
+ int c2 = 0x1b873593;
+
+ int h1 = seed;
+ int roundedEnd = off + (len & 0xfffffffc); // Round down to 4 byte block.
+
+ for (int i = off; i < roundedEnd; i += 4) {
+ int k1 = (data[i] & 0xff) | ((data[i + 1] & 0xff) << 8) | ((data[i + 2] & 0xff) << 16) | (data[i + 3] << 24);
+
+ k1 *= c1;
+ k1 = (k1 << 15) | (k1 >>> 17);
+ k1 *= c2;
+
+ h1 ^= k1;
+ h1 = (h1 << 13) | (h1 >>> 19);
+ h1 = h1 * 5 + 0xe6546b64;
+ }
+
+ // Tail.
+ int k1 = 0;
+
+ switch (len & 0x03) {
+ case 3:
+ k1 = (data[roundedEnd + 2] & 0xff) << 16;
+ // Fallthrough - WTF?
+ case 2:
+ k1 |= (data[roundedEnd + 1] & 0xff) << 8;
+ // Fallthrough - WTF?
+ case 1:
+ k1 |= data[roundedEnd] & 0xff;
+ k1 *= c1;
+ k1 = (k1 << 15) | (k1 >>> 17);
+ k1 *= c2;
+ h1 ^= k1;
+ default:
+ }
+
+ // Finalization.
+ h1 ^= len;
+
+ h1 ^= h1 >>> 16;
+ h1 *= 0x85ebca6b;
+ h1 ^= h1 >>> 13;
+ h1 *= 0xc2b2ae35;
+ h1 ^= h1 >>> 16;
+
+ return h1;
+ }
+
+ /**
+ * Hashes an int.
+ *
+ * @param data The int to hash.
+ * @param seed The seed for the hash.
+ * @return The 32 bit hash of the bytes in question.
+ */
+ public static int hash(int data, int seed) {
+ byte[] arr = new byte[] {
+ (byte)(data >>> 24),
+ (byte)(data >>> 16),
+ (byte)(data >>> 8),
+ (byte)data
+ };
+
+ return hash(ByteBuffer.wrap(arr), seed);
+ }
+
+ /**
+ * Hashes bytes in an array.
+ *
+ * @param data The bytes to hash.
+ * @param seed The seed for the hash.
+ * @return The 32 bit hash of the bytes in question.
+ */
+ public static int hash(byte[] data, int seed) {
+ return hash(ByteBuffer.wrap(data), seed);
+ }
+
+ /**
+ * Hashes bytes in part of an array.
+ *
+ * @param data The data to hash.
+ * @param off Where to start munging.
+ * @param len How many bytes to process.
+ * @param seed The seed to start with.
+ * @return The 32-bit hash of the data in question.
+ */
+ public static int hash(byte[] data, int off, int len, int seed) {
+ return hash(ByteBuffer.wrap(data, off, len), seed);
+ }
+
+ /**
+ * Hashes the bytes in a buffer from the current position to the limit.
+ *
+ * @param buf The bytes to hash.
+ * @param seed The seed for the hash.
+ * @return The 32 bit murmur hash of the bytes in the buffer.
+ */
+ public static int hash(ByteBuffer buf, int seed) {
+ ByteOrder byteOrder = buf.order();
+ buf.order(ByteOrder.LITTLE_ENDIAN);
+
+ int m = 0x5bd1e995;
+ int r = 24;
+
+ int h = seed ^ buf.remaining();
+
+ while (buf.remaining() >= 4) {
+ int k = buf.getInt();
+
+ k *= m;
+ k ^= k >>> r;
+ k *= m;
+
+ h *= m;
+ h ^= k;
+ }
+
+ if (buf.remaining() > 0) {
+ ByteBuffer finish = ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN);
+
+ finish.put(buf).rewind();
+
+ h ^= finish.getInt();
+ h *= m;
+ }
+
+ h ^= h >>> 13;
+ h *= m;
+ h ^= h >>> 15;
+
+ buf.order(byteOrder);
+
+ return h;
+ }
+
+ /**
+ * @param data
+ * @param seed
+ */
+ public static long hash64A(byte[] data, int seed) {
+ return hash64A(ByteBuffer.wrap(data), seed);
+ }
+
+ /**
+ * @param data
+ * @param off
+ * @param len
+ * @param seed
+ */
+ public static long hash64A(byte[] data, int off, int len, int seed) {
+ return hash64A(ByteBuffer.wrap(data, off, len), seed);
+ }
+
+ /**
+ * @param buf
+ * @param seed
+ */
+ public static long hash64A(ByteBuffer buf, int seed) {
+ ByteOrder byteOrder = buf.order();
+ buf.order(ByteOrder.LITTLE_ENDIAN);
+
+ long m = 0xc6a4a7935bd1e995L;
+ int r = 47;
+
+ long h = seed ^ (buf.remaining() * m);
+
+ while (buf.remaining() >= 8) {
+ long k = buf.getLong();
+
+ k *= m;
+ k ^= k >>> r;
+ k *= m;
+
+ h ^= k;
+ h *= m;
+ }
+
+ if (buf.remaining() > 0) {
+ ByteBuffer finish = ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN);
+
+ finish.put(buf).rewind();
+
+ h ^= finish.getLong();
+ h *= m;
+ }
+
+ h ^= h >>> r;
+ h *= m;
+ h ^= h >>> r;
+
+ buf.order(byteOrder);
+
+ return h;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/StorageConstants.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/StorageConstants.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/StorageConstants.java
new file mode 100644
index 0000000..ec2ee65
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/StorageConstants.java
@@ -0,0 +1,49 @@
+/*
+ * 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.ignite.ml.math;
+
+/**
+ * Support for different modes of accessing data storage.
+ */
+public interface StorageConstants {
+ /** Storage mode optimized for sequential access. */
+ public static final int SEQUENTIAL_ACCESS_MODE = 1001;
+
+ /** Storage mode optimized for random access. */
+ public static final int RANDOM_ACCESS_MODE = 1002;
+
+ /** Storage mode optimized for row access. */
+ public static final int ROW_STORAGE_MODE = 2001;
+
+ /** Storage mode optimized for column access. */
+ public static final int COLUMN_STORAGE_MODE = 2002;
+
+ /**
+ * @param mode Access mode to verify.
+ */
+ public default void assertAccessMode(int mode) {
+ assert mode == SEQUENTIAL_ACCESS_MODE || mode == RANDOM_ACCESS_MODE;
+ }
+
+ /**
+ * @param mode Storage mode to verify.
+ */
+ public default void assertStorageMode(int mode) {
+ assert mode == ROW_STORAGE_MODE || mode == COLUMN_STORAGE_MODE;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/StorageOpsMetrics.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/StorageOpsMetrics.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/StorageOpsMetrics.java
new file mode 100644
index 0000000..aa39481
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/StorageOpsMetrics.java
@@ -0,0 +1,49 @@
+/*
+ * 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.ignite.ml.math;
+
+/**
+ * Storage and operation cost characteristics.
+ */
+public interface StorageOpsMetrics {
+ /**
+ * Checks if this implementation should be considered to be iterable in index order in an efficient way.
+ */
+ public boolean isSequentialAccess();
+
+ /**
+ * Checks if this implementation is optimized for random access.
+ */
+ public boolean isRandomAccess();
+
+ /**
+ * Checks if this implementation should be considered dense so that it explicitly
+ * represents every value.
+ */
+ public boolean isDense();
+
+ /**
+ * Checks if implementation is based on Java arrays.
+ */
+ public boolean isArrayBased();
+
+ /**
+ * Checks whether implementation is JVM-local or distributed (multi-JVM).
+ */
+ public boolean isDistributed();
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/Tracer.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/Tracer.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/Tracer.java
new file mode 100644
index 0000000..007a8fe
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/Tracer.java
@@ -0,0 +1,456 @@
+/*
+ * 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.ignite.ml.math;
+
+import java.awt.Color;
+import java.awt.Desktop;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
+import java.util.Locale;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import org.apache.ignite.IgniteLogger;
+import org.apache.ignite.lang.IgniteUuid;
+
+/**
+ * Utility methods to support output of {@link Vector} and {@link Matrix} instances to plain text or HTML.
+ */
+public class Tracer {
+ /**
+ * Double to color mapper.
+ */
+ public interface ColorMapper extends Function<Double, Color> {
+ }
+
+ /** Continuous red-to-blue color mapping. */
+ static private ColorMapper defaultColorMapper(double min, double max) {
+ double range = max - min;
+
+ return new ColorMapper() {
+ /** {@inheritDoc} */
+ @Override public Color apply(Double d) {
+ int r = (int)Math.round(255 * d);
+ int g = 0;
+ int b = (int)Math.round(255 * (1 - d));
+
+ return new Color(r, g, b);
+ }
+ };
+ }
+
+ /**
+ * Default vector color mapper implementation that map given double value
+ * to continuous red-blue (R_B) specter.
+ *
+ * @param vec Vector to map.
+ * @return {@link ColorMapper} for the given vector.
+ */
+ static private ColorMapper mkVectorColorMapper(Vector vec) {
+ return defaultColorMapper(vec.minValue(), vec.maxValue());
+ }
+
+ /** Default matrix color mapper implementation that map given double value
+ * to continuous red-blue (R_B) specter.
+ * @param mtx Matrix to be mapped.
+ * @return Color mapper for given matrix.
+ */
+ static private ColorMapper mkMatrixColorMapper(Matrix mtx) {
+ return defaultColorMapper(mtx.minValue(), mtx.maxValue());
+ }
+
+ /**
+ * @param vec Vector to show.
+ * @param log {@link IgniteLogger} instance for output.
+ * @param fmt Format string for vector elements.
+ */
+ public static void showAscii(Vector vec, IgniteLogger log, String fmt) {
+ String cls = vec.getClass().getSimpleName();
+
+ log.info(String.format("%s(%d) [%s]", cls, vec.size(), mkString(vec, fmt)));
+ }
+
+ /**
+ * @param vec Vector to show as plain text.
+ * @param log {@link IgniteLogger} instance for output.
+ */
+ public static void showAscii(Vector vec, IgniteLogger log) {
+ showAscii(vec, log, "%4f");
+ }
+
+ /**
+ * @param vec Vector to show as plain text.
+ * @param fmt Format string for vector elements.
+ */
+ public static void showAscii(Vector vec, String fmt) {
+ String cls = vec.getClass().getSimpleName();
+
+ System.out.println(String.format("%s(%d) [%s]", cls, vec.size(), mkString(vec, fmt)));
+ }
+
+ /**
+ * @param mtx Matrix to show as plain text.
+ */
+ public static void showAscii(Matrix mtx) {
+ showAscii(mtx, "%4f");
+ }
+
+ /**
+ * @param mtx Matrix to show.
+ * @param row Matrix row to output.
+ * @param fmt Format string for matrix elements in the row.
+ * @return String representation of given matrix row according to given format.
+ */
+ static private String rowStr(Matrix mtx, int row, String fmt) {
+ StringBuilder buf = new StringBuilder();
+
+ boolean first = true;
+
+ int cols = mtx.columnSize();
+
+ for (int col = 0; col < cols; col++) {
+ String s = String.format(fmt, mtx.get(row, col));
+
+ if (!first)
+ buf.append(", ");
+
+ buf.append(s);
+
+ first = false;
+ }
+
+ return buf.toString();
+ }
+
+ /**
+ * @param mtx {@link Matrix} object to show as a plain text.
+ * @param fmt Format string for matrix rows.
+ */
+ public static void showAscii(Matrix mtx, String fmt) {
+ String cls = mtx.getClass().getSimpleName();
+
+ int rows = mtx.rowSize();
+ int cols = mtx.columnSize();
+
+ System.out.println(String.format("%s(%dx%d)", cls, rows, cols));
+
+ for (int row = 0; row < rows; row++)
+ System.out.println(rowStr(mtx, row, fmt));
+ }
+
+ /**
+ * @param mtx {@link Matrix} object to show as a plain text.
+ * @param log {@link IgniteLogger} instance to output the logged matrix.
+ * @param fmt Format string for matrix rows.
+ */
+ public static void showAscii(Matrix mtx, IgniteLogger log, String fmt) {
+ String cls = mtx.getClass().getSimpleName();
+
+ int rows = mtx.rowSize();
+ int cols = mtx.columnSize();
+
+ log.info(String.format("%s(%dx%d)", cls, rows, cols));
+
+ for (int row = 0; row < rows; row++)
+ log.info(rowStr(mtx, row, fmt));
+ }
+
+ /**
+ * @param vec {@link Vector} object to show as a plain text.
+ */
+ public static void showAscii(Vector vec) {
+ showAscii(vec, "%4f");
+ }
+
+ /**
+ * Saves given vector as CSV file.
+ *
+ * @param vec Vector to save.
+ * @param fmt Format to use.
+ * @param filePath Path of the file to save to.
+ */
+ public static void saveAsCsv(Vector vec, String fmt, String filePath) throws IOException {
+ String s = mkString(vec, fmt);
+
+ Files.write(Paths.get(filePath), s.getBytes(), StandardOpenOption.CREATE, StandardOpenOption.WRITE);
+ }
+
+ /**
+ * Saves given matrix as CSV file.
+ *
+ * @param mtx Matrix to save.
+ * @param fmt Format to use.
+ * @param filePath Path of the file to save to.
+ */
+ public static void saveAsCsv(Matrix mtx, String fmt, String filePath) throws IOException {
+ String s = mkString(mtx, fmt);
+
+ Files.write(Paths.get(filePath), s.getBytes(), StandardOpenOption.CREATE, StandardOpenOption.WRITE);
+ }
+
+ /**
+ * Shows given matrix in the browser with D3-based visualization.
+ *
+ * @param mtx Matrix to show.
+ * @throws IOException Thrown in case of any errors.
+ */
+ public static void showHtml(Matrix mtx) throws IOException {
+ showHtml(mtx, mkMatrixColorMapper(mtx));
+ }
+
+ /**
+ * Shows given matrix in the browser with D3-based visualization.
+ *
+ * @param mtx Matrix to show.
+ * @param cm Optional color mapper. If not provided - red-to-blue (R_B) mapper will be used.
+ * @throws IOException Thrown in case of any errors.
+ */
+ public static void showHtml(Matrix mtx, ColorMapper cm) throws IOException {
+ // Read it every time so that we can change it at runtime.
+ String tmpl = fileToString("d3-matrix-template.html");
+
+ String cls = mtx.getClass().getSimpleName();
+
+ double min = mtx.minValue();
+ double max = mtx.maxValue();
+
+ openHtmlFile(tmpl.
+ replaceAll("/\\*@NAME@\\*/.*\n", "var name = \"" + cls + "\";\n").
+ replaceAll("/\\*@MIN@\\*/.*\n", "var min = " + dataColorJson(min, cm.apply(min)) + ";\n").
+ replaceAll("/\\*@MAX@\\*/.*\n", "var max = " + dataColorJson(max, cm.apply(max)) + ";\n").
+ replaceAll("/\\*@DATA@\\*/.*\n", "var data = " + mkJsArrayString(mtx, cm) + ";\n")
+ );
+ }
+
+ /**
+ * Shows given vector in the browser with D3-based visualization.
+ *
+ * @param vec Vector to show.
+ * @throws IOException Thrown in case of any errors.
+ */
+ public static void showHtml(Vector vec) throws IOException {
+ showHtml(vec, mkVectorColorMapper(vec));
+ }
+
+ /**
+ * @param d Value of {@link Matrix} or {@link Vector} element.
+ * @param clr {@link Color} to paint.
+ * @return JSON representation for given value and color.
+ */
+ static private String dataColorJson(double d, Color clr) {
+ return "{" +
+ "d: " + String.format("%4f", d) +
+ ", r: " + clr.getRed() +
+ ", g: " + clr.getGreen() +
+ ", b: " + clr.getBlue() +
+ "}";
+ }
+
+ /**
+ * Shows given vector in the browser with D3-based visualization.
+ *
+ * @param vec Vector to show.
+ * @param cm Optional color mapper. If not provided - red-to-blue (R_B) mapper will be used.
+ * @throws IOException Thrown in case of any errors.
+ */
+ public static void showHtml(Vector vec, ColorMapper cm) throws IOException {
+ // Read it every time so that we can change it at runtime.
+ String tmpl = fileToString("d3-vector-template.html");
+
+ String cls = vec.getClass().getSimpleName();
+
+ double min = vec.minValue();
+ double max = vec.maxValue();
+
+ openHtmlFile(tmpl.
+ replaceAll("/\\*@NAME@\\*/.*\n", "var name = \"" + cls + "\";\n").
+ replaceAll("/\\*@MIN@\\*/.*\n", "var min = " + dataColorJson(min, cm.apply(min)) + ";\n").
+ replaceAll("/\\*@MAX@\\*/.*\n", "var max = " + dataColorJson(max, cm.apply(max)) + ";\n").
+ replaceAll("/\\*@DATA@\\*/.*\n", "var data = " + mkJsArrayString(vec, cm) + ";\n")
+ );
+ }
+
+ /**
+ * Reads file content into the string.
+ *
+ * @param fileName Name of the file (on classpath) to read.
+ * @return Content of the file.
+ * @throws IOException If an I/O error of some sort has occurred.
+ */
+ private static String fileToString(String fileName) throws IOException {
+ assert Tracer.class.getResourceAsStream(fileName) != null : "Can't get resource: " + fileName;
+
+ InputStreamReader is = new InputStreamReader(Tracer.class.getResourceAsStream(fileName));
+
+ String str = new BufferedReader(is).lines().collect(Collectors.joining("\n"));
+
+ is.close();
+
+ return str;
+ }
+
+ /**
+ * Opens file in the browser with given HTML content.
+ *
+ * @param html HTML content.
+ * @throws IOException Thrown in case of any errors.
+ */
+ static private void openHtmlFile(String html) throws IOException {
+ File temp = File.createTempFile(IgniteUuid.randomUuid().toString(), ".html");
+
+ BufferedWriter bw = new BufferedWriter(new FileWriter(temp));
+
+ bw.write(html);
+
+ bw.close();
+
+ Desktop.getDesktop().browse(temp.toURI());
+ }
+
+ /**
+ * Gets string presentation of this vector.
+ *
+ * @param vec Vector to string-ify.
+ * @param fmt {@link String#format(Locale, String, Object...)} format.
+ */
+ private static String mkString(Vector vec, String fmt) {
+ boolean first = true;
+
+ StringBuilder buf = new StringBuilder();
+
+ for (Vector.Element x : vec.all()) {
+ String s = String.format(Locale.US, fmt, x.get());
+
+ if (!first) {
+ buf.append(", ");
+ buf.append(s);
+ }
+ else {
+ buf.append(s);
+ first = false;
+ }
+ }
+
+ return buf.toString();
+ }
+
+ /**
+ * Gets JavaScript array presentation of this vector.
+ *
+ * @param vec Vector to JavaScript-ify.
+ * @param cm Color mapper to user.
+ */
+ private static String mkJsArrayString(Vector vec, ColorMapper cm) {
+ boolean first = true;
+
+ StringBuilder buf = new StringBuilder();
+
+ for (Vector.Element x : vec.all()) {
+ double d = x.get();
+
+ String s = dataColorJson(d, cm.apply(d));
+
+ if (!first)
+ buf.append(", ");
+
+ buf.append(s);
+
+ first = false;
+ }
+
+ return '[' + buf.toString() + ']';
+ }
+
+ /**
+ * Gets JavaScript array presentation of this vector.
+ *
+ * @param mtx Matrix to JavaScript-ify.
+ * @param cm Color mapper to user.
+ */
+ private static String mkJsArrayString(Matrix mtx, ColorMapper cm) {
+ boolean first = true;
+
+ StringBuilder buf = new StringBuilder();
+
+ int rows = mtx.rowSize();
+ int cols = mtx.columnSize();
+
+ for (int row = 0; row < rows; row++) {
+ StringBuilder rowBuf = new StringBuilder();
+
+ boolean rowFirst = true;
+
+ for (int col = 0; col < cols; col++) {
+ double d = mtx.get(row, col);
+
+ String s = dataColorJson(d, cm.apply(d));
+
+ if (!rowFirst)
+ rowBuf.append(", ");
+
+ rowBuf.append(s);
+
+ rowFirst = false;
+ }
+
+ if (!first)
+ buf.append(", ");
+
+ buf.append('[').append(rowBuf.toString()).append(']');
+
+ first = false;
+ }
+
+ return '[' + buf.toString() + ']';
+ }
+
+ /**
+ * @param mtx Matrix to log.
+ * @param fmt Output format.
+ * @return Formatted representation of a matrix.
+ */
+ private static String mkString(Matrix mtx, String fmt) {
+ StringBuilder buf = new StringBuilder();
+
+ int rows = mtx.rowSize();
+ int cols = mtx.columnSize();
+
+ for (int row = 0; row < rows; row++) {
+ for (int col = 0; col < cols; col++) {
+ String s = String.format(Locale.US, fmt, mtx.get(row, col));
+
+ if (col != 0)
+ buf.append(", ");
+
+ buf.append(s);
+
+ if (col == cols - 1 && row != rows - 1)
+ buf.append(",\n");
+
+ }
+ }
+
+ return buf.toString();
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/ValueMapper.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/ValueMapper.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/ValueMapper.java
new file mode 100644
index 0000000..2b62c0b
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/ValueMapper.java
@@ -0,0 +1,35 @@
+/*
+ * 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.ignite.ml.math;
+
+import java.io.Serializable;
+
+/**
+ * Utility mapper that can be used to map arbitrary values types to and from double.
+ */
+public interface ValueMapper<V> extends Serializable {
+ /**
+ * @param v
+ */
+ public V fromDouble(double v);
+
+ /**
+ * @param v
+ */
+ public double toDouble(V v);
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/Vector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/Vector.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/Vector.java
new file mode 100644
index 0000000..b5e1d69
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/Vector.java
@@ -0,0 +1,498 @@
+/*
+ * 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.ignite.ml.math;
+
+import java.io.Externalizable;
+import java.util.Spliterator;
+import java.util.function.IntToDoubleFunction;
+import org.apache.ignite.lang.IgniteUuid;
+import org.apache.ignite.ml.math.exceptions.CardinalityException;
+import org.apache.ignite.ml.math.exceptions.IndexException;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.functions.IgniteBiFunction;
+import org.apache.ignite.ml.math.functions.IgniteDoubleFunction;
+
+/**
+ * A vector interface.
+ *
+ * Based on its flavor it can have vastly different implementations tailored for
+ * for different types of data (e.g. dense vs. sparse), different sizes of data or different operation
+ * optimizations.
+ *
+ * Note also that not all operations can be supported by all underlying implementations. If an operation is not
+ * supported a {@link UnsupportedOperationException} is thrown. This exception can also be thrown in partial cases
+ * where an operation is unsupported only in special cases, e.g. where a given operation cannot be deterministically
+ * completed in polynomial time.
+ *
+ * Based on ideas from <a href="http://mahout.apache.org/">Apache Mahout</a>.
+ */
+public interface Vector extends MetaAttributes, Externalizable, StorageOpsMetrics, Destroyable {
+ /**
+ * Holder for vector's element.
+ */
+ interface Element {
+ /**
+ * Gets element's value.
+ *
+ * @return The value of this vector element.
+ */
+ double get();
+
+ /**
+ * Gets element's index in the vector.
+ *
+ * @return The index of this vector element.
+ */
+ int index();
+
+ /**
+ * Sets element's value.
+ *
+ * @param val Value to set.
+ */
+ void set(double val);
+ }
+
+ /**
+ * Gets cardinality of this vector (maximum number of the elements).
+ *
+ * @return This vector's cardinality.
+ */
+ public int size();
+
+ /**
+ * Creates new copy of this vector.
+ *
+ * @return New copy vector.
+ */
+ public Vector copy();
+
+ /**
+ * Gets iterator over all elements in this vector.
+ *
+ * NOTE: implementation can choose to reuse {@link Element} instance so you need to copy it
+ * if you want to retain it outside of iteration.
+ *
+ * @return Iterator.
+ */
+ public Iterable<Element> all();
+
+ /**
+ * Iterates ove all non-zero elements in this vector.
+ *
+ * NOTE: implementation can choose to reuse {@link Element} instance so you need to copy it
+ * if you want to retain it outside of iteration.
+ *
+ * @return Iterator.
+ */
+ public Iterable<Element> nonZeroes();
+
+ /**
+ * Gets spliterator for all values in this vector.
+ *
+ * @return Spliterator for all values.
+ */
+ public Spliterator<Double> allSpliterator();
+
+ /**
+ * Gets spliterator for all non-zero values in this vector.
+ *
+ * @return Spliterator for all non-zero values.
+ */
+ public Spliterator<Double> nonZeroSpliterator();
+
+ /**
+ * Sorts this vector in ascending order.
+ */
+ public Vector sort();
+
+ /**
+ * Gets element at the given index.
+ *
+ * NOTE: implementation can choose to reuse {@link Element} instance so you need to copy it
+ * if you want to retain it outside of iteration.
+ *
+ * @param idx Element's index.
+ * @return Vector's element at the given index.
+ * @throws IndexException Throw if index is out of bounds.
+ */
+ public Element getElement(int idx);
+
+ /**
+ * Assigns given value to all elements of this vector.
+ *
+ * @param val Value to assign.
+ * @return This vector.
+ */
+ public Vector assign(double val);
+
+ /**
+ * Assigns values from given array to this vector.
+ *
+ * @param vals Values to assign.
+ * @return This vector.
+ * @throws CardinalityException Thrown if cardinalities mismatch.
+ */
+ public Vector assign(double[] vals);
+
+ /**
+ * Copies values from the argument vector to this one.
+ *
+ * @param vec Argument vector.
+ * @return This vector.
+ * @throws CardinalityException Thrown if cardinalities mismatch.
+ */
+ public Vector assign(Vector vec);
+
+ /**
+ * Assigns each vector element to the value generated by given function.
+ *
+ * @param fun Function that takes the index and returns value.
+ * @return This vector.
+ */
+ public Vector assign(IntToDoubleFunction fun);
+
+ /**
+ * Maps all values in this vector through a given function.
+ *
+ * @param fun Mapping function.
+ * @return This vector.
+ */
+ public Vector map(IgniteDoubleFunction<Double> fun);
+
+ /**
+ * Maps all values in this vector through a given function.
+ *
+ * For this vector <code>A</code>, argument vector <code>B</code> and the
+ * function <code>F</code> this method maps every element <code>x</code> as:
+ * <code>A(x) = F(A(x), B(x))</code>
+ *
+ * @param vec Argument vector.
+ * @param fun Mapping function.
+ * @return This function.
+ * @throws CardinalityException Thrown if cardinalities mismatch.
+ */
+ public Vector map(Vector vec, IgniteBiFunction<Double, Double, Double> fun);
+
+ /**
+ * Maps all elements of this vector by applying given function to each element with a constant
+ * second parameter <code>y</code>.
+ *
+ * @param fun Mapping function.
+ * @param y Second parameter for mapping function.
+ * @return This vector.
+ */
+ public Vector map(IgniteBiFunction<Double, Double, Double> fun, double y);
+
+ /**
+ * Creates new vector containing values from this vector divided by the argument.
+ *
+ * @param x Division argument.
+ * @return New vector.
+ */
+ public Vector divide(double x);
+
+ /**
+ * Gets dot product of two vectors.
+ *
+ * @param vec Argument vector.
+ * @return Dot product of two vectors.
+ */
+ public double dot(Vector vec);
+
+ /**
+ * Gets the value at specified index.
+ *
+ * @param idx Vector index.
+ * @return Vector value.
+ * @throws IndexException Throw if index is out of bounds.
+ */
+ public double get(int idx);
+
+ /**
+ * Gets the value at specified index without checking for index boundaries.
+ *
+ * @param idx Vector index.
+ * @return Vector value.
+ */
+ public double getX(int idx);
+
+ /**
+ * Creates new empty vector of the same underlying class but of different cardinality.
+ *
+ * @param crd Cardinality for new vector.
+ * @return New vector.
+ */
+ public Vector like(int crd);
+
+ /**
+ * Creates new matrix of compatible flavor with given size.
+ *
+ * @param rows Number of rows.
+ * @param cols Number of columns.
+ * @return New matrix.
+ */
+ public Matrix likeMatrix(int rows, int cols);
+
+ /**
+ * Converts this vector into [N x 1] or [1 x N] matrix where N is this vector cardinality.
+ *
+ * @param rowLike {@code true} for rowLike [N x 1], or {@code false} for column [1 x N] matrix.
+ * @return Newly created matrix.
+ */
+ public Matrix toMatrix(boolean rowLike);
+
+ /**
+ * Converts this vector into [N+1 x 1] or [1 x N+1] matrix where N is this vector cardinality.
+ * (0,0) element of this matrix will be {@code zeroVal} parameter.
+ *
+ * @param rowLike {@code true} for rowLike [N+1 x 1], or {@code false} for column [1 x N+1] matrix.
+ * @return Newly created matrix.
+ */
+ public Matrix toMatrixPlusOne(boolean rowLike, double zeroVal);
+
+ /**
+ * Creates new vector containing element by element difference between this vector and the argument one.
+ *
+ * @param vec Argument vector.
+ * @return New vector.
+ * @throws CardinalityException Thrown if cardinalities mismatch.
+ */
+ public Vector minus(Vector vec);
+
+ /**
+ * Creates new vector containing the normalized (L_2 norm) values of this vector.
+ *
+ * @return New vector.
+ */
+ public Vector normalize();
+
+ /**
+ * Creates new vector containing the normalized (L_power norm) values of this vector.
+ * See http://en.wikipedia.org/wiki/Lp_space for details.
+ *
+ * @param power The power to use. Must be >= 0. May also be {@link Double#POSITIVE_INFINITY}.
+ * @return New vector {@code x} such that {@code norm(x, power) == 1}
+ */
+ public Vector normalize(double power);
+
+ /**
+ * Creates new vector containing the {@code log(1 + entry) / L_2 norm} values of this vector.
+ *
+ * @return New vector.
+ */
+ public Vector logNormalize();
+
+ /**
+ * Creates new vector with a normalized value calculated as {@code log_power(1 + entry) / L_power norm}.
+ *
+ * @param power The power to use. Must be > 1. Cannot be {@link Double#POSITIVE_INFINITY}.
+ * @return New vector
+ */
+ public Vector logNormalize(double power);
+
+ /**
+ * Gets the k-norm of the vector. See http://en.wikipedia.org/wiki/Lp_space for more details.
+ *
+ * @param power The power to use.
+ * @see #normalize(double)
+ */
+ public double kNorm(double power);
+
+ /**
+ * Gets minimal value in this vector.
+ *
+ * @return Minimal value.
+ */
+ public double minValue();
+
+ /**
+ * Gets maximum value in this vector.
+ *
+ * @return Maximum c.
+ */
+ public double maxValue();
+
+ /**
+ * Gets minimal element in this vector.
+ *
+ * @return Minimal element.
+ */
+ public Element minElement();
+
+ /**
+ * Gets maximum element in this vector.
+ *
+ * @return Maximum element.
+ */
+ public Element maxElement();
+
+ /**
+ * Creates new vector containing sum of each element in this vector and argument.
+ *
+ * @param x Argument value.
+ * @return New vector.
+ */
+ public Vector plus(double x);
+
+ /**
+ * Creates new vector containing element by element sum from both vectors.
+ *
+ * @param vec Other argument vector to add.
+ * @return New vector.
+ * @throws CardinalityException Thrown if cardinalities mismatch.
+ */
+ public Vector plus(Vector vec);
+
+ /**
+ * Sets value.
+ *
+ * @param idx Vector index to set value at.
+ * @param val Value to set.
+ * @return This vector.
+ * @throws IndexException Throw if index is out of bounds.
+ */
+ public Vector set(int idx, double val);
+
+ /**
+ * Sets value without checking for index boundaries.
+ *
+ * @param idx Vector index to set value at.
+ * @param val Value to set.
+ * @return This vector.
+ */
+ public Vector setX(int idx, double val);
+
+ /**
+ * Increments value at given index without checking for index boundaries.
+ *
+ * @param idx Vector index.
+ * @param val Increment value.
+ * @return This vector.
+ */
+ public Vector incrementX(int idx, double val);
+
+ /**
+ * Increments value at given index.
+ *
+ * @param idx Vector index.
+ * @param val Increment value.
+ * @return This vector.
+ * @throws IndexException Throw if index is out of bounds.
+ */
+ public Vector increment(int idx, double val);
+
+ /**
+ * Gets number of non-zero elements in this vector.
+ *
+ * @return Number of non-zero elements in this vector.
+ */
+ public int nonZeroElements();
+
+ /**
+ * Gets a new vector that contains product of each element and the argument.
+ *
+ * @param x Multiply argument.
+ * @return New vector.
+ */
+ public Vector times(double x);
+
+ /**
+ * Gets a new vector that is an element-wie product of this vector and the argument.
+ *
+ * @param vec Vector to multiply by.
+ * @return New vector.
+ * @throws CardinalityException Thrown if cardinalities mismatch.
+ */
+ public Vector times(Vector vec);
+
+ /**
+ * @param off Offset into parent vector.
+ * @param len Length of the view.
+ */
+ public Vector viewPart(int off, int len);
+
+ /**
+ * Gets vector storage model.
+ */
+ public VectorStorage getStorage();
+
+ /**
+ * Gets the sum of all elements in this vector.
+ *
+ * @return Vector's sum
+ */
+ public double sum();
+
+ /**
+ * Gets the cross product of this vector and the other vector.
+ *
+ * @param vec Second vector.
+ * @return New matrix as a cross product of two vectors.
+ */
+ public Matrix cross(Vector vec);
+
+ /**
+ * Folds this vector into a single value.
+ *
+ * @param foldFun Folding function that takes two parameters: accumulator and the current value.
+ * @param mapFun Mapping function that is called on each vector element before its passed to the accumulator (as its
+ * second parameter).
+ * @param <T> Type of the folded value.
+ * @param zeroVal Zero value for fold operation.
+ * @return Folded value of this vector.
+ */
+ public <T> T foldMap(IgniteBiFunction<T, Double, T> foldFun, IgniteDoubleFunction<Double> mapFun, T zeroVal);
+
+ /**
+ * Combines & maps two vector and folds them into a single value.
+ *
+ * @param vec Another vector to combine with.
+ * @param foldFun Folding function.
+ * @param combFun Combine function.
+ * @param <T> Type of the folded value.
+ * @param zeroVal Zero value for fold operation.
+ * @return Folded value of these vectors.
+ * @throws CardinalityException Thrown when cardinalities mismatch.
+ */
+ public <T> T foldMap(Vector vec, IgniteBiFunction<T, Double, T> foldFun, IgniteBiFunction<Double, Double, Double> combFun,
+ T zeroVal);
+
+ /**
+ * Gets the sum of squares of all elements in this vector.
+ *
+ * @return Length squared value.
+ */
+ public double getLengthSquared();
+
+ /**
+ * Get the square of the distance between this vector and the argument vector.
+ *
+ * @param vec Another vector.
+ * @return Distance squared.
+ * @throws CardinalityException Thrown if cardinalities mismatch.
+ */
+ public double getDistanceSquared(Vector vec);
+
+ /**
+ * Auto-generated globally unique vector ID.
+ *
+ * @return Vector GUID.
+ */
+ public IgniteUuid guid();
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/VectorKeyMapper.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/VectorKeyMapper.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/VectorKeyMapper.java
new file mode 100644
index 0000000..4b8fadb
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/VectorKeyMapper.java
@@ -0,0 +1,29 @@
+/*
+ * 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.ignite.ml.math;
+
+/**
+ * Maps {@link Vector} element index to cache key.
+ */
+public interface VectorKeyMapper<K> extends KeyMapper<K> {
+ /**
+ * @param i Vector element index.
+ * @return Cache key for given element index.
+ */
+ public K apply(int i);
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/VectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/VectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/VectorStorage.java
new file mode 100644
index 0000000..3b66e4f
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/VectorStorage.java
@@ -0,0 +1,53 @@
+/*
+ * 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.ignite.ml.math;
+
+import java.io.Externalizable;
+
+/**
+ * Data storage support for {@link Vector}.
+ */
+public interface VectorStorage extends Externalizable, StorageOpsMetrics, Destroyable {
+ /**
+ *
+ *
+ */
+ public int size();
+
+ /**
+ * @param i Vector element index.
+ * @return Value obtained for given element index.
+ */
+ public double get(int i);
+
+ /**
+ * @param i Vector element index.
+ * @param v Value to set at given index.
+ */
+ public void set(int i, double v);
+
+ /**
+ * Gets underlying array if {@link StorageOpsMetrics#isArrayBased()} returns {@code true}.
+ * Returns {@code null} if in other cases.
+ *
+ * @see StorageOpsMetrics#isArrayBased()
+ */
+ public default double[] data() {
+ return null;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/CholeskyDecomposition.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/CholeskyDecomposition.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/CholeskyDecomposition.java
new file mode 100644
index 0000000..bc18307
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/CholeskyDecomposition.java
@@ -0,0 +1,306 @@
+/*
+ * 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.ignite.ml.math.decompositions;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.CardinalityException;
+import org.apache.ignite.ml.math.exceptions.NonPositiveDefiniteMatrixException;
+import org.apache.ignite.ml.math.exceptions.NonSymmetricMatrixException;
+
+/**
+ * Calculates the Cholesky decomposition of a matrix.
+ *
+ * This class inspired by class from Apache Common Math with similar name.
+ *
+ * @see <a href="http://mathworld.wolfram.com/CholeskyDecomposition.html">MathWorld</a>
+ * @see <a href="http://en.wikipedia.org/wiki/Cholesky_decomposition">Wikipedia</a>
+ */
+public class CholeskyDecomposition extends DecompositionSupport {
+ /**
+ * Default threshold above which off-diagonal elements are considered too different
+ * and matrix not symmetric.
+ */
+ public static final double DFLT_REL_SYMMETRY_THRESHOLD = 1.0e-15;
+
+ /**
+ * Default threshold below which diagonal elements are considered null
+ * and matrix not positive definite.
+ */
+ public static final double DFLT_ABS_POSITIVITY_THRESHOLD = 1.0e-10;
+
+ /** Row-oriented storage for L<sup>T</sup> matrix data. */
+ private double[][] lTData;
+ /** Cached value of L. */
+ private Matrix cachedL;
+ /** Cached value of LT. */
+ private Matrix cachedLT;
+ /** Origin matrix */
+ private Matrix origin;
+
+ /**
+ * Calculates the Cholesky decomposition of the given matrix.
+ *
+ * Calling this constructor is equivalent to call {@link #CholeskyDecomposition(Matrix, double, double)} with the
+ * thresholds set to the default values {@link #DFLT_REL_SYMMETRY_THRESHOLD} and
+ * {@link #DFLT_ABS_POSITIVITY_THRESHOLD}.
+ *
+ * @param mtx the matrix to decompose.
+ * @throws CardinalityException if matrix is not square.
+ * @see #CholeskyDecomposition(Matrix, double, double)
+ * @see #DFLT_REL_SYMMETRY_THRESHOLD
+ * @see #DFLT_ABS_POSITIVITY_THRESHOLD
+ */
+ public CholeskyDecomposition(final Matrix mtx) {
+ this(mtx, DFLT_REL_SYMMETRY_THRESHOLD, DFLT_ABS_POSITIVITY_THRESHOLD);
+ }
+
+ /**
+ * Calculates the Cholesky decomposition of the given matrix.
+ *
+ * @param mtx the matrix to decompose.
+ * @param relSymmetryThreshold threshold above which off-diagonal elements are considered too different and matrix
+ * not symmetric
+ * @param absPositivityThreshold threshold below which diagonal elements are considered null and matrix not positive
+ * definite
+ * @see #CholeskyDecomposition(Matrix)
+ * @see #DFLT_REL_SYMMETRY_THRESHOLD
+ * @see #DFLT_ABS_POSITIVITY_THRESHOLD
+ */
+ public CholeskyDecomposition(final Matrix mtx, final double relSymmetryThreshold,
+ final double absPositivityThreshold) {
+ assert mtx != null;
+
+ if (mtx.columnSize() != mtx.rowSize())
+ throw new CardinalityException(mtx.rowSize(), mtx.columnSize());
+
+ origin = mtx;
+
+ final int order = mtx.rowSize();
+
+ lTData = toDoubleArr(mtx);
+ cachedL = null;
+ cachedLT = null;
+
+ // Check the matrix before transformation.
+ for (int i = 0; i < order; ++i) {
+ final double[] lI = lTData[i];
+
+ // Check off-diagonal elements (and reset them to 0).
+ for (int j = i + 1; j < order; ++j) {
+ final double[] lJ = lTData[j];
+
+ final double lIJ = lI[j];
+ final double lJI = lJ[i];
+
+ final double maxDelta = relSymmetryThreshold * Math.max(Math.abs(lIJ), Math.abs(lJI));
+
+ if (Math.abs(lIJ - lJI) > maxDelta)
+ throw new NonSymmetricMatrixException(i, j, relSymmetryThreshold);
+
+ lJ[i] = 0;
+ }
+ }
+
+ // Transform the matrix.
+ for (int i = 0; i < order; ++i) {
+ final double[] ltI = lTData[i];
+
+ // Check diagonal element.
+ if (ltI[i] <= absPositivityThreshold)
+ throw new NonPositiveDefiniteMatrixException(ltI[i], i, absPositivityThreshold);
+
+ ltI[i] = Math.sqrt(ltI[i]);
+ final double inverse = 1.0 / ltI[i];
+
+ for (int q = order - 1; q > i; --q) {
+ ltI[q] *= inverse;
+ final double[] ltQ = lTData[q];
+
+ for (int p = q; p < order; ++p)
+ ltQ[p] -= ltI[q] * ltI[p];
+ }
+ }
+ }
+
+ /** */
+ @Override public void destroy() {
+ if (cachedL != null)
+ cachedL.destroy();
+ if (cachedLT != null)
+ cachedLT.destroy();
+ }
+
+ /**
+ * Returns the matrix L of the decomposition.
+ * <p>L is an lower-triangular matrix</p>
+ *
+ * @return the L matrix
+ */
+ public Matrix getL() {
+ if (cachedL == null)
+ cachedL = getLT().transpose();
+
+ return cachedL;
+ }
+
+ /**
+ * Returns the transpose of the matrix L of the decomposition.
+ * <p>L<sup>T</sup> is an upper-triangular matrix</p>
+ *
+ * @return the transpose of the matrix L of the decomposition
+ */
+ public Matrix getLT() {
+
+ if (cachedLT == null) {
+ Matrix like = like(origin, origin.rowSize(), origin.columnSize());
+ like.assign(lTData);
+
+ cachedLT = like;
+ }
+
+ // return the cached matrix
+ return cachedLT;
+ }
+
+ /**
+ * Return the determinant of the matrix
+ *
+ * @return determinant of the matrix
+ */
+ public double getDeterminant() {
+ double determinant = 1.0;
+
+ for (int i = 0; i < lTData.length; ++i) {
+ double lTii = lTData[i][i];
+ determinant *= lTii * lTii;
+ }
+
+ return determinant;
+ }
+
+ /**
+ * Solve the linear equation A × X = B for matrices A.
+ *
+ * @param b right-hand side of the equation A × X = B
+ * @return a vector X that minimizes the two norm of A × X - B
+ * @throws CardinalityException if the vectors dimensions do not match
+ */
+ public Vector solve(final Vector b) {
+ final int m = lTData.length;
+
+ if (b.size() != m)
+ throw new CardinalityException(b.size(), m);
+
+ final double[] x = b.getStorage().data();
+
+ // Solve LY = b
+ for (int j = 0; j < m; j++) {
+ final double[] lJ = lTData[j];
+
+ x[j] /= lJ[j];
+
+ final double xJ = x[j];
+
+ for (int i = j + 1; i < m; i++)
+ x[i] -= xJ * lJ[i];
+ }
+
+ // Solve LTX = Y
+ for (int j = m - 1; j >= 0; j--) {
+ x[j] /= lTData[j][j];
+
+ final double xJ = x[j];
+
+ for (int i = 0; i < j; i++)
+ x[i] -= xJ * lTData[i][j];
+ }
+
+ return likeVector(origin, m).assign(x);
+ }
+
+ /**
+ * Solve the linear equation A × X = B for matrices A.
+ *
+ * @param b right-hand side of the equation A × X = B
+ * @return a matrix X that minimizes the two norm of A × X - B
+ * @throws CardinalityException if the matrices dimensions do not match
+ */
+ public Matrix solve(final Matrix b) {
+ final int m = lTData.length;
+
+ if (b.rowSize() != m)
+ throw new CardinalityException(b.rowSize(), m);
+
+ final int nColB = b.columnSize();
+ final double[][] x = b.getStorage().data();
+
+ // Solve LY = b
+ for (int j = 0; j < m; j++) {
+ final double[] lJ = lTData[j];
+ final double lJJ = lJ[j];
+ final double[] xJ = x[j];
+
+ for (int k = 0; k < nColB; ++k)
+ xJ[k] /= lJJ;
+
+ for (int i = j + 1; i < m; i++) {
+ final double[] xI = x[i];
+ final double lJI = lJ[i];
+
+ for (int k = 0; k < nColB; ++k)
+ xI[k] -= xJ[k] * lJI;
+ }
+ }
+
+ // Solve LTX = Y
+ for (int j = m - 1; j >= 0; j--) {
+ final double lJJ = lTData[j][j];
+ final double[] xJ = x[j];
+
+ for (int k = 0; k < nColB; ++k)
+ xJ[k] /= lJJ;
+
+ for (int i = 0; i < j; i++) {
+ final double[] xI = x[i];
+ final double lIJ = lTData[i][j];
+
+ for (int k = 0; k < nColB; ++k)
+ xI[k] -= xJ[k] * lIJ;
+ }
+ }
+
+ return like(origin, m, b.columnSize()).assign(x);
+ }
+
+ /** */
+ private double[][] toDoubleArr(Matrix mtx) {
+ if (mtx.isArrayBased())
+ return mtx.getStorage().data();
+
+ double[][] res = new double[mtx.rowSize()][];
+
+ for (int row = 0; row < mtx.rowSize(); row++) {
+ res[row] = new double[mtx.columnSize()];
+ for (int col = 0; col < mtx.columnSize(); col++)
+ res[row][col] = mtx.get(row, col);
+ }
+
+ return res;
+ }
+}
[51/67] [abbrv] ignite git commit: IGNITE-5132: Fixed PutGet example.
Posted by sb...@apache.org.
IGNITE-5132: Fixed PutGet example.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/ed72663f
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/ed72663f
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/ed72663f
Branch: refs/heads/ignite-5075
Commit: ed72663ff8e6b6f46d77c91471400ec1c9ff0dfa
Parents: 85f5309
Author: Igor Sapego <is...@gridgain.com>
Authored: Tue May 2 20:20:49 2017 +0300
Committer: Igor Sapego <is...@gridgain.com>
Committed: Wed May 3 16:14:20 2017 +0300
----------------------------------------------------------------------
.../common/os/win/include/ignite/common/concurrent_os.h | 2 +-
.../cpp/examples/putget-example/config/example-cache.xml | 10 +---------
.../putget-example/project/vs/putget-example.vcxproj | 3 +++
.../project/vs/putget-example.vcxproj.filters | 8 ++++++++
.../cpp/examples/putget-example/src/putget_example.cpp | 2 +-
.../query-example/project/vs/query-example.vcxproj | 3 +++
.../project/vs/query-example.vcxproj.filters | 8 ++++++++
7 files changed, 25 insertions(+), 11 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/ed72663f/modules/platforms/cpp/common/os/win/include/ignite/common/concurrent_os.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/common/os/win/include/ignite/common/concurrent_os.h b/modules/platforms/cpp/common/os/win/include/ignite/common/concurrent_os.h
index 54f611b..0822ba7 100644
--- a/modules/platforms/cpp/common/os/win/include/ignite/common/concurrent_os.h
+++ b/modules/platforms/cpp/common/os/win/include/ignite/common/concurrent_os.h
@@ -35,7 +35,7 @@ namespace ignite
/**
* Static class to manage memory visibility semantics.
*/
- class Memory
+ class IGNITE_IMPORT_EXPORT Memory
{
public:
/**
http://git-wip-us.apache.org/repos/asf/ignite/blob/ed72663f/modules/platforms/cpp/examples/putget-example/config/example-cache.xml
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/examples/putget-example/config/example-cache.xml b/modules/platforms/cpp/examples/putget-example/config/example-cache.xml
index 28b726c..af523cd 100644
--- a/modules/platforms/cpp/examples/putget-example/config/example-cache.xml
+++ b/modules/platforms/cpp/examples/putget-example/config/example-cache.xml
@@ -35,18 +35,10 @@
Partitioned cache example configuration with binary objects enabled.
-->
<bean class="org.apache.ignite.configuration.CacheConfiguration">
+ <property name="name" value="atomic"/>
<property name="atomicityMode" value="ATOMIC"/>
<property name="backups" value="1"/>
</bean>
-
- <!--
- Partitioned cache example configuration.
- -->
- <bean class="org.apache.ignite.configuration.CacheConfiguration">
- <property name="name" value="tx"/>
- <property name="atomicityMode" value="TRANSACTIONAL"/>
- <property name="backups" value="1"/>
- </bean>
</list>
</property>
http://git-wip-us.apache.org/repos/asf/ignite/blob/ed72663f/modules/platforms/cpp/examples/putget-example/project/vs/putget-example.vcxproj
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/examples/putget-example/project/vs/putget-example.vcxproj b/modules/platforms/cpp/examples/putget-example/project/vs/putget-example.vcxproj
index 555e15a..8842f3a 100644
--- a/modules/platforms/cpp/examples/putget-example/project/vs/putget-example.vcxproj
+++ b/modules/platforms/cpp/examples/putget-example/project/vs/putget-example.vcxproj
@@ -101,6 +101,9 @@ copy "$(ProjectDir)..\..\..\..\project\vs\$(Platform)\$(Configuration)\ignite.co
<ClInclude Include="..\..\..\include\ignite\examples\address.h" />
<ClInclude Include="..\..\..\include\ignite\examples\organization.h" />
</ItemGroup>
+ <ItemGroup>
+ <None Include="..\..\config\example-cache.xml" />
+ </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
http://git-wip-us.apache.org/repos/asf/ignite/blob/ed72663f/modules/platforms/cpp/examples/putget-example/project/vs/putget-example.vcxproj.filters
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/examples/putget-example/project/vs/putget-example.vcxproj.filters b/modules/platforms/cpp/examples/putget-example/project/vs/putget-example.vcxproj.filters
index 1bcaff5..3bb8a8f 100644
--- a/modules/platforms/cpp/examples/putget-example/project/vs/putget-example.vcxproj.filters
+++ b/modules/platforms/cpp/examples/putget-example/project/vs/putget-example.vcxproj.filters
@@ -13,6 +13,9 @@
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
+ <Filter Include="Config">
+ <UniqueIdentifier>{487c5422-915c-4851-892d-c1599ea69e0c}</UniqueIdentifier>
+ </Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\src\putget_example.cpp">
@@ -27,4 +30,9 @@
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
+ <ItemGroup>
+ <None Include="..\..\config\example-cache.xml">
+ <Filter>Config</Filter>
+ </None>
+ </ItemGroup>
</Project>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/ed72663f/modules/platforms/cpp/examples/putget-example/src/putget_example.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/examples/putget-example/src/putget_example.cpp b/modules/platforms/cpp/examples/putget-example/src/putget_example.cpp
index 8bf9c8c..f7bd894 100644
--- a/modules/platforms/cpp/examples/putget-example/src/putget_example.cpp
+++ b/modules/platforms/cpp/examples/putget-example/src/putget_example.cpp
@@ -100,7 +100,7 @@ int main()
std::cout << std::endl;
// Get cache instance.
- Cache<int, Organization> cache = grid.GetCache<int, Organization>(NULL);
+ Cache<int, Organization> cache = grid.GetCache<int, Organization>("atomic");
// Clear cache.
cache.Clear();
http://git-wip-us.apache.org/repos/asf/ignite/blob/ed72663f/modules/platforms/cpp/examples/query-example/project/vs/query-example.vcxproj
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/examples/query-example/project/vs/query-example.vcxproj b/modules/platforms/cpp/examples/query-example/project/vs/query-example.vcxproj
index ff8e5be..22aa2b9 100644
--- a/modules/platforms/cpp/examples/query-example/project/vs/query-example.vcxproj
+++ b/modules/platforms/cpp/examples/query-example/project/vs/query-example.vcxproj
@@ -102,6 +102,9 @@ copy "$(ProjectDir)..\..\..\..\project\vs\$(Platform)\$(Configuration)\ignite.co
<ClInclude Include="..\..\..\include\ignite\examples\organization.h" />
<ClInclude Include="..\..\..\include\ignite\examples\person.h" />
</ItemGroup>
+ <ItemGroup>
+ <None Include="..\..\config\query-example.xml" />
+ </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
http://git-wip-us.apache.org/repos/asf/ignite/blob/ed72663f/modules/platforms/cpp/examples/query-example/project/vs/query-example.vcxproj.filters
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/examples/query-example/project/vs/query-example.vcxproj.filters b/modules/platforms/cpp/examples/query-example/project/vs/query-example.vcxproj.filters
index 219d3f4..506b255 100644
--- a/modules/platforms/cpp/examples/query-example/project/vs/query-example.vcxproj.filters
+++ b/modules/platforms/cpp/examples/query-example/project/vs/query-example.vcxproj.filters
@@ -18,10 +18,18 @@
<Filter Include="Header Files">
<UniqueIdentifier>{b355095f-b4e2-4324-9516-854828c876ff}</UniqueIdentifier>
</Filter>
+ <Filter Include="Config">
+ <UniqueIdentifier>{89a5a9cc-a2c9-4d11-9044-869c3af6a2fd}</UniqueIdentifier>
+ </Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\src\query_example.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
+ <ItemGroup>
+ <None Include="..\..\config\query-example.xml">
+ <Filter>Config</Filter>
+ </None>
+ </ItemGroup>
</Project>
\ No newline at end of file
[56/67] [abbrv] ignite git commit: IGNITE-5012 Implement ordinary
least squares (OLS) linear regression.
Posted by sb...@apache.org.
IGNITE-5012 Implement ordinary least squares (OLS) linear regression.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/934f6ac2
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/934f6ac2
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/934f6ac2
Branch: refs/heads/ignite-5075
Commit: 934f6ac22c04f652815f79a9238ea72b9111a7e8
Parents: 156ec53
Author: Artem Malykh <am...@gridgain.com>
Authored: Wed May 3 20:05:18 2017 +0300
Committer: Anton Vinogradov <av...@apache.org>
Committed: Wed May 3 20:05:18 2017 +0300
----------------------------------------------------------------------
.../org/apache/ignite/ml/math/Precision.java | 588 ++++++++++++++
.../java/org/apache/ignite/ml/math/Tracer.java | 22 +-
.../decompositions/CholeskyDecomposition.java | 6 +-
.../math/decompositions/EigenDecomposition.java | 6 +-
.../ml/math/decompositions/LUDecomposition.java | 9 +-
.../ml/math/decompositions/QRDecomposition.java | 70 +-
.../SingularValueDecomposition.java | 5 +-
.../math/exceptions/CardinalityException.java | 6 +-
.../exceptions/InsufficientDataException.java | 44 +
.../exceptions/MathArithmeticException.java | 47 ++
.../MathIllegalArgumentException.java | 37 +
.../math/exceptions/MathRuntimeException.java | 47 ++
.../ml/math/exceptions/NoDataException.java | 45 +
.../NonPositiveDefiniteMatrixException.java | 8 +-
.../exceptions/NonSquareMatrixException.java | 33 +
.../math/exceptions/NullArgumentException.java | 27 +
.../exceptions/SingularMatrixException.java | 9 +-
.../ignite/ml/math/functions/Functions.java | 5 +
.../apache/ignite/ml/math/util/MatrixUtil.java | 121 +++
.../AbstractMultipleLinearRegression.java | 358 ++++++++
.../regressions/MultipleLinearRegression.java | 71 ++
.../OLSMultipleLinearRegression.java | 272 +++++++
.../regressions/RegressionsErrorMessages.java | 28 +
.../ignite/ml/regressions/package-info.java | 22 +
.../java/org/apache/ignite/ml/TestUtils.java | 248 ++++++
.../apache/ignite/ml/math/ExternalizeTest.java | 1 +
.../ignite/ml/math/MathImplLocalTestSuite.java | 7 +-
.../CholeskyDecompositionTest.java | 6 +-
.../decompositions/LUDecompositionTest.java | 6 +-
.../decompositions/QRDecompositionTest.java | 6 +-
.../SingularValueDecompositionTest.java | 6 +-
.../AbstractMultipleLinearRegressionTest.java | 164 ++++
.../OLSMultipleLinearRegressionTest.java | 812 +++++++++++++++++++
33 files changed, 3100 insertions(+), 42 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/934f6ac2/modules/ml/src/main/java/org/apache/ignite/ml/math/Precision.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/Precision.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/Precision.java
new file mode 100644
index 0000000..830644c
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/Precision.java
@@ -0,0 +1,588 @@
+/*
+ * 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.ignite.ml.math;
+
+import java.math.BigDecimal;
+import org.apache.ignite.ml.math.exceptions.MathArithmeticException;
+import org.apache.ignite.ml.math.exceptions.MathIllegalArgumentException;
+
+/**
+ * This class is based on the corresponding class from Apache Common Math lib.
+ * Utilities for comparing numbers. *
+ */
+public class Precision {
+ /**
+ * <p>
+ * Largest double-precision floating-point number such that
+ * {@code 1 + EPSILON} is numerically equal to 1. This value is an upper
+ * bound on the relative error due to rounding real numbers to double
+ * precision floating-point numbers.
+ * </p>
+ * <p>
+ * In IEEE 754 arithmetic, this is 2<sup>-53</sup>.
+ * </p>
+ *
+ * @see <a href="http://en.wikipedia.org/wiki/Machine_epsilon">Machine epsilon</a>
+ */
+ public static final double EPSILON;
+
+ /**
+ * Safe minimum, such that {@code 1 / SAFE_MIN} does not overflow.
+ * <br/>
+ * In IEEE 754 arithmetic, this is also the smallest normalized
+ * number 2<sup>-1022</sup>.
+ */
+ public static final double SAFE_MIN;
+
+ /** Exponent offset in IEEE754 representation. */
+ private static final long EXPONENT_OFFSET = 1023L;
+
+ /** Offset to order signed double numbers lexicographically. */
+ private static final long SGN_MASK = 0x8000000000000000L;
+ /** Offset to order signed double numbers lexicographically. */
+ private static final int SGN_MASK_FLOAT = 0x80000000;
+ /** Positive zero. */
+ private static final double POSITIVE_ZERO = 0d;
+ /** Positive zero bits. */
+ private static final long POSITIVE_ZERO_DOUBLE_BITS = Double.doubleToRawLongBits(+0.0);
+ /** Negative zero bits. */
+ private static final long NEGATIVE_ZERO_DOUBLE_BITS = Double.doubleToRawLongBits(-0.0);
+ /** Positive zero bits. */
+ private static final int POSITIVE_ZERO_FLOAT_BITS = Float.floatToRawIntBits(+0.0f);
+ /** Negative zero bits. */
+ private static final int NEGATIVE_ZERO_FLOAT_BITS = Float.floatToRawIntBits(-0.0f);
+ /** */
+ private static final String INVALID_ROUNDING_METHOD = "invalid rounding method {0}, " +
+ "valid methods: {1} ({2}), {3} ({4}), {5} ({6}), {7} ({8}), {9} ({10}), {11} ({12}), {13} ({14}), {15} ({16})";
+
+ static {
+ /*
+ * This was previously expressed as = 0x1.0p-53;
+ * However, OpenJDK (Sparc Solaris) cannot handle such small
+ * constants: MATH-721
+ */
+ EPSILON = Double.longBitsToDouble((EXPONENT_OFFSET - 53L) << 52);
+
+ /*
+ * This was previously expressed as = 0x1.0p-1022;
+ * However, OpenJDK (Sparc Solaris) cannot handle such small
+ * constants: MATH-721
+ */
+ SAFE_MIN = Double.longBitsToDouble((EXPONENT_OFFSET - 1022L) << 52);
+ }
+
+ /**
+ * Private constructor.
+ */
+ private Precision() {
+ }
+
+ /**
+ * Compares two numbers given some amount of allowed error.
+ *
+ * @param x the first number
+ * @param y the second number
+ * @param eps the amount of error to allow when checking for equality
+ * @return <ul><li>0 if {@link #equals(double, double, double) equals(x, y, eps)}</li> <li>< 0 if !{@link
+ * #equals(double, double, double) equals(x, y, eps)} && x < y</li> <li>> 0 if !{@link #equals(double,
+ * double, double) equals(x, y, eps)} && x > y or either argument is NaN</li></ul>
+ */
+ public static int compareTo(double x, double y, double eps) {
+ if (equals(x, y, eps))
+ return 0;
+ else if (x < y)
+ return -1;
+ return 1;
+ }
+
+ /**
+ * Compares two numbers given some amount of allowed error.
+ * Two float numbers are considered equal if there are {@code (maxUlps - 1)}
+ * (or fewer) floating point numbers between them, i.e. two adjacent floating
+ * point numbers are considered equal.
+ * Adapted from <a
+ * href="http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/">
+ * Bruce Dawson</a>. Returns {@code false} if either of the arguments is NaN.
+ *
+ * @param x first value
+ * @param y second value
+ * @param maxUlps {@code (maxUlps - 1)} is the number of floating point values between {@code x} and {@code y}.
+ * @return <ul><li>0 if {@link #equals(double, double, int) equals(x, y, maxUlps)}</li> <li>< 0 if !{@link
+ * #equals(double, double, int) equals(x, y, maxUlps)} && x < y</li> <li>> 0 if !{@link
+ * #equals(double, double, int) equals(x, y, maxUlps)} && x > y or either argument is NaN</li></ul>
+ */
+ public static int compareTo(final double x, final double y, final int maxUlps) {
+ if (equals(x, y, maxUlps))
+ return 0;
+ else if (x < y)
+ return -1;
+ return 1;
+ }
+
+ /**
+ * Returns true iff they are equal as defined by
+ * {@link #equals(float, float, int) equals(x, y, 1)}.
+ *
+ * @param x first value
+ * @param y second value
+ * @return {@code true} if the values are equal.
+ */
+ public static boolean equals(float x, float y) {
+ return equals(x, y, 1);
+ }
+
+ /**
+ * Returns true if both arguments are NaN or they are
+ * equal as defined by {@link #equals(float, float) equals(x, y, 1)}.
+ *
+ * @param x first value
+ * @param y second value
+ * @return {@code true} if the values are equal or both are NaN.
+ * @since 2.2
+ */
+ public static boolean equalsIncludingNaN(float x, float y) {
+ return (x != x || y != y) ? !(x != x ^ y != y) : equals(x, y, 1);
+ }
+
+ /**
+ * Returns true if the arguments are equal or within the range of allowed
+ * error (inclusive). Returns {@code false} if either of the arguments
+ * is NaN.
+ *
+ * @param x first value
+ * @param y second value
+ * @param eps the amount of absolute error to allow.
+ * @return {@code true} if the values are equal or within range of each other.
+ * @since 2.2
+ */
+ public static boolean equals(float x, float y, float eps) {
+ return equals(x, y, 1) || Math.abs(y - x) <= eps;
+ }
+
+ /**
+ * Returns true if the arguments are both NaN, are equal, or are within the range
+ * of allowed error (inclusive).
+ *
+ * @param x first value
+ * @param y second value
+ * @param eps the amount of absolute error to allow.
+ * @return {@code true} if the values are equal or within range of each other, or both are NaN.
+ * @since 2.2
+ */
+ public static boolean equalsIncludingNaN(float x, float y, float eps) {
+ return equalsIncludingNaN(x, y) || (Math.abs(y - x) <= eps);
+ }
+
+ /**
+ * Returns true if the arguments are equal or within the range of allowed
+ * error (inclusive).
+ * Two float numbers are considered equal if there are {@code (maxUlps - 1)}
+ * (or fewer) floating point numbers between them, i.e. two adjacent floating
+ * point numbers are considered equal.
+ * Adapted from <a
+ * href="http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/">
+ * Bruce Dawson</a>. Returns {@code false} if either of the arguments is NaN.
+ *
+ * @param x first value
+ * @param y second value
+ * @param maxUlps {@code (maxUlps - 1)} is the number of floating point values between {@code x} and {@code y}.
+ * @return {@code true} if there are fewer than {@code maxUlps} floating point values between {@code x} and {@code
+ * y}.
+ * @since 2.2
+ */
+ public static boolean equals(final float x, final float y, final int maxUlps) {
+
+ final int xInt = Float.floatToRawIntBits(x);
+ final int yInt = Float.floatToRawIntBits(y);
+
+ final boolean isEqual;
+ if (((xInt ^ yInt) & SGN_MASK_FLOAT) == 0) {
+ // number have same sign, there is no risk of overflow
+ isEqual = Math.abs(xInt - yInt) <= maxUlps;
+ }
+ else {
+ // number have opposite signs, take care of overflow
+ final int deltaPlus;
+ final int deltaMinus;
+ if (xInt < yInt) {
+ deltaPlus = yInt - POSITIVE_ZERO_FLOAT_BITS;
+ deltaMinus = xInt - NEGATIVE_ZERO_FLOAT_BITS;
+ }
+ else {
+ deltaPlus = xInt - POSITIVE_ZERO_FLOAT_BITS;
+ deltaMinus = yInt - NEGATIVE_ZERO_FLOAT_BITS;
+ }
+
+ if (deltaPlus > maxUlps)
+ isEqual = false;
+ else
+ isEqual = deltaMinus <= (maxUlps - deltaPlus);
+
+ }
+
+ return isEqual && !Float.isNaN(x) && !Float.isNaN(y);
+
+ }
+
+ /**
+ * Returns true if the arguments are both NaN or if they are equal as defined
+ * by {@link #equals(float, float, int) equals(x, y, maxUlps)}.
+ *
+ * @param x first value
+ * @param y second value
+ * @param maxUlps {@code (maxUlps - 1)} is the number of floating point values between {@code x} and {@code y}.
+ * @return {@code true} if both arguments are NaN or if there are less than {@code maxUlps} floating point values
+ * between {@code x} and {@code y}.
+ * @since 2.2
+ */
+ public static boolean equalsIncludingNaN(float x, float y, int maxUlps) {
+ return (x != x || y != y) ? !(x != x ^ y != y) : equals(x, y, maxUlps);
+ }
+
+ /**
+ * Returns true iff they are equal as defined by
+ * {@link #equals(double, double, int) equals(x, y, 1)}.
+ *
+ * @param x first value
+ * @param y second value
+ * @return {@code true} if the values are equal.
+ */
+ public static boolean equals(double x, double y) {
+ return equals(x, y, 1);
+ }
+
+ /**
+ * Returns true if the arguments are both NaN or they are
+ * equal as defined by {@link #equals(double, double) equals(x, y, 1)}.
+ *
+ * @param x first value
+ * @param y second value
+ * @return {@code true} if the values are equal or both are NaN.
+ * @since 2.2
+ */
+ public static boolean equalsIncludingNaN(double x, double y) {
+ return (x != x || y != y) ? !(x != x ^ y != y) : equals(x, y, 1);
+ }
+
+ /**
+ * Returns {@code true} if there is no double value strictly between the
+ * arguments or the difference between them is within the range of allowed
+ * error (inclusive). Returns {@code false} if either of the arguments
+ * is NaN.
+ *
+ * @param x First value.
+ * @param y Second value.
+ * @param eps Amount of allowed absolute error.
+ * @return {@code true} if the values are two adjacent floating point numbers or they are within range of each
+ * other.
+ */
+ public static boolean equals(double x, double y, double eps) {
+ return equals(x, y, 1) || Math.abs(y - x) <= eps;
+ }
+
+ /**
+ * Returns {@code true} if there is no double value strictly between the
+ * arguments or the relative difference between them is less than or equal
+ * to the given tolerance. Returns {@code false} if either of the arguments
+ * is NaN.
+ *
+ * @param x First value.
+ * @param y Second value.
+ * @param eps Amount of allowed relative error.
+ * @return {@code true} if the values are two adjacent floating point numbers or they are within range of each
+ * other.
+ * @since 3.1
+ */
+ public static boolean equalsWithRelativeTolerance(double x, double y, double eps) {
+ if (equals(x, y, 1))
+ return true;
+
+ final double absMax = Math.max(Math.abs(x), Math.abs(y));
+ final double relativeDifference = Math.abs((x - y) / absMax);
+
+ return relativeDifference <= eps;
+ }
+
+ /**
+ * Returns true if the arguments are both NaN, are equal or are within the range
+ * of allowed error (inclusive).
+ *
+ * @param x first value
+ * @param y second value
+ * @param eps the amount of absolute error to allow.
+ * @return {@code true} if the values are equal or within range of each other, or both are NaN.
+ * @since 2.2
+ */
+ public static boolean equalsIncludingNaN(double x, double y, double eps) {
+ return equalsIncludingNaN(x, y) || (Math.abs(y - x) <= eps);
+ }
+
+ /**
+ * Returns true if the arguments are equal or within the range of allowed
+ * error (inclusive).
+ * <p>
+ * Two float numbers are considered equal if there are {@code (maxUlps - 1)}
+ * (or fewer) floating point numbers between them, i.e. two adjacent
+ * floating point numbers are considered equal.
+ * </p>
+ * <p>
+ * Adapted from <a
+ * href="http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/">
+ * Bruce Dawson</a>. Returns {@code false} if either of the arguments is NaN.
+ * </p>
+ *
+ * @param x first value
+ * @param y second value
+ * @param maxUlps {@code (maxUlps - 1)} is the number of floating point values between {@code x} and {@code y}.
+ * @return {@code true} if there are fewer than {@code maxUlps} floating point values between {@code x} and {@code
+ * y}.
+ */
+ public static boolean equals(final double x, final double y, final int maxUlps) {
+
+ final long xInt = Double.doubleToRawLongBits(x);
+ final long yInt = Double.doubleToRawLongBits(y);
+
+ final boolean isEqual;
+ if (((xInt ^ yInt) & SGN_MASK) == 0L) {
+ // number have same sign, there is no risk of overflow
+ isEqual = Math.abs(xInt - yInt) <= maxUlps;
+ }
+ else {
+ // number have opposite signs, take care of overflow
+ final long deltaPlus;
+ final long deltaMinus;
+ if (xInt < yInt) {
+ deltaPlus = yInt - POSITIVE_ZERO_DOUBLE_BITS;
+ deltaMinus = xInt - NEGATIVE_ZERO_DOUBLE_BITS;
+ }
+ else {
+ deltaPlus = xInt - POSITIVE_ZERO_DOUBLE_BITS;
+ deltaMinus = yInt - NEGATIVE_ZERO_DOUBLE_BITS;
+ }
+
+ if (deltaPlus > maxUlps)
+ isEqual = false;
+ else
+ isEqual = deltaMinus <= (maxUlps - deltaPlus);
+
+ }
+
+ return isEqual && !Double.isNaN(x) && !Double.isNaN(y);
+
+ }
+
+ /**
+ * Returns true if both arguments are NaN or if they are equal as defined
+ * by {@link #equals(double, double, int) equals(x, y, maxUlps)}.
+ *
+ * @param x first value
+ * @param y second value
+ * @param maxUlps {@code (maxUlps - 1)} is the number of floating point values between {@code x} and {@code y}.
+ * @return {@code true} if both arguments are NaN or if there are less than {@code maxUlps} floating point values
+ * between {@code x} and {@code y}.
+ * @since 2.2
+ */
+ public static boolean equalsIncludingNaN(double x, double y, int maxUlps) {
+ return (x != x || y != y) ? !(x != x ^ y != y) : equals(x, y, maxUlps);
+ }
+
+ /**
+ * Rounds the given value to the specified number of decimal places.
+ * The value is rounded using the {@link BigDecimal#ROUND_HALF_UP} method.
+ *
+ * @param x Value to round.
+ * @param scale Number of digits to the right of the decimal point.
+ * @return the rounded value.
+ * @since 1.1 (previously in {@code MathUtils}, moved as of version 3.0)
+ */
+ public static double round(double x, int scale) {
+ return round(x, scale, BigDecimal.ROUND_HALF_UP);
+ }
+
+ /**
+ * Rounds the given value to the specified number of decimal places.
+ * The value is rounded using the given method which is any method defined
+ * in {@link BigDecimal}.
+ * If {@code x} is infinite or {@code NaN}, then the value of {@code x} is
+ * returned unchanged, regardless of the other parameters.
+ *
+ * @param x Value to round.
+ * @param scale Number of digits to the right of the decimal point.
+ * @param roundingMtd Rounding method as defined in {@link BigDecimal}.
+ * @return the rounded value.
+ * @throws ArithmeticException if {@code roundingMethod == ROUND_UNNECESSARY} and the specified scaling operation
+ * would require rounding.
+ * @throws IllegalArgumentException if {@code roundingMethod} does not represent a valid rounding mode.
+ * @since 1.1 (previously in {@code MathUtils}, moved as of version 3.0)
+ */
+ public static double round(double x, int scale, int roundingMtd) {
+ try {
+ final double rounded = (new BigDecimal(Double.toString(x))
+ .setScale(scale, roundingMtd))
+ .doubleValue();
+ // MATH-1089: negative values rounded to zero should result in negative zero
+ return rounded == POSITIVE_ZERO ? POSITIVE_ZERO * x : rounded;
+ }
+ catch (NumberFormatException ex) {
+ if (Double.isInfinite(x))
+ return x;
+ else
+ return Double.NaN;
+ }
+ }
+
+ /**
+ * Rounds the given value to the specified number of decimal places.
+ * The value is rounded using the {@link BigDecimal#ROUND_HALF_UP} method.
+ *
+ * @param x Value to round.
+ * @param scale Number of digits to the right of the decimal point.
+ * @return the rounded value.
+ * @since 1.1 (previously in {@code MathUtils}, moved as of version 3.0)
+ */
+ public static float round(float x, int scale) {
+ return round(x, scale, BigDecimal.ROUND_HALF_UP);
+ }
+
+ /**
+ * Rounds the given value to the specified number of decimal places.
+ * The value is rounded using the given method which is any method defined
+ * in {@link BigDecimal}.
+ *
+ * @param x Value to round.
+ * @param scale Number of digits to the right of the decimal point.
+ * @param roundingMtd Rounding method as defined in {@link BigDecimal}.
+ * @return the rounded value.
+ * @throws MathArithmeticException if an exact operation is required but result is not exact
+ * @throws MathIllegalArgumentException if {@code roundingMethod} is not a valid rounding method.
+ * @since 1.1 (previously in {@code MathUtils}, moved as of version 3.0)
+ */
+ public static float round(float x, int scale, int roundingMtd)
+ throws MathArithmeticException, MathIllegalArgumentException {
+ final float sign = Math.copySign(1f, x);
+ final float factor = (float)Math.pow(10.0f, scale) * sign;
+ return (float)roundUnscaled(x * factor, sign, roundingMtd) / factor;
+ }
+
+ /**
+ * Rounds the given non-negative value to the "nearest" integer. Nearest is
+ * determined by the rounding method specified. Rounding methods are defined
+ * in {@link BigDecimal}.
+ *
+ * @param unscaled Value to round.
+ * @param sign Sign of the original, scaled value.
+ * @param roundingMtd Rounding method, as defined in {@link BigDecimal}.
+ * @return the rounded value.
+ * @throws MathArithmeticException if an exact operation is required but result is not exact
+ * @throws MathIllegalArgumentException if {@code roundingMethod} is not a valid rounding method.
+ * @since 1.1 (previously in {@code MathUtils}, moved as of version 3.0)
+ */
+ private static double roundUnscaled(double unscaled, double sign, int roundingMtd)
+ throws MathArithmeticException, MathIllegalArgumentException {
+ switch (roundingMtd) {
+ case BigDecimal.ROUND_CEILING:
+ if (sign == -1)
+ unscaled = Math.floor(Math.nextAfter(unscaled, Double.NEGATIVE_INFINITY));
+ else
+ unscaled = Math.ceil(Math.nextAfter(unscaled, Double.POSITIVE_INFINITY));
+ break;
+ case BigDecimal.ROUND_DOWN:
+ unscaled = Math.floor(Math.nextAfter(unscaled, Double.NEGATIVE_INFINITY));
+ break;
+ case BigDecimal.ROUND_FLOOR:
+ if (sign == -1)
+ unscaled = Math.ceil(Math.nextAfter(unscaled, Double.POSITIVE_INFINITY));
+ else
+ unscaled = Math.floor(Math.nextAfter(unscaled, Double.NEGATIVE_INFINITY));
+ break;
+ case BigDecimal.ROUND_HALF_DOWN: {
+ unscaled = Math.nextAfter(unscaled, Double.NEGATIVE_INFINITY);
+ double fraction = unscaled - Math.floor(unscaled);
+ if (fraction > 0.5)
+ unscaled = Math.ceil(unscaled);
+ else
+ unscaled = Math.floor(unscaled);
+ break;
+ }
+ case BigDecimal.ROUND_HALF_EVEN: {
+ double fraction = unscaled - Math.floor(unscaled);
+ if (fraction > 0.5)
+ unscaled = Math.ceil(unscaled);
+ else if (fraction < 0.5)
+ unscaled = Math.floor(unscaled);
+ else {
+ // The following equality test is intentional and needed for rounding purposes
+ if (Math.floor(unscaled) / 2.0 == Math.floor(Math.floor(unscaled) / 2.0)) { // even
+ unscaled = Math.floor(unscaled);
+ }
+ else { // odd
+ unscaled = Math.ceil(unscaled);
+ }
+ }
+ break;
+ }
+ case BigDecimal.ROUND_HALF_UP: {
+ unscaled = Math.nextAfter(unscaled, Double.POSITIVE_INFINITY);
+ double fraction = unscaled - Math.floor(unscaled);
+ if (fraction >= 0.5)
+ unscaled = Math.ceil(unscaled);
+ else
+ unscaled = Math.floor(unscaled);
+ break;
+ }
+ case BigDecimal.ROUND_UNNECESSARY:
+ if (unscaled != Math.floor(unscaled))
+ throw new MathArithmeticException();
+ break;
+ case BigDecimal.ROUND_UP:
+ // do not round if the discarded fraction is equal to zero
+ if (unscaled != Math.floor(unscaled))
+ unscaled = Math.ceil(Math.nextAfter(unscaled, Double.POSITIVE_INFINITY));
+ break;
+ default:
+ throw new MathIllegalArgumentException(INVALID_ROUNDING_METHOD,
+ roundingMtd,
+ "ROUND_CEILING", BigDecimal.ROUND_CEILING,
+ "ROUND_DOWN", BigDecimal.ROUND_DOWN,
+ "ROUND_FLOOR", BigDecimal.ROUND_FLOOR,
+ "ROUND_HALF_DOWN", BigDecimal.ROUND_HALF_DOWN,
+ "ROUND_HALF_EVEN", BigDecimal.ROUND_HALF_EVEN,
+ "ROUND_HALF_UP", BigDecimal.ROUND_HALF_UP,
+ "ROUND_UNNECESSARY", BigDecimal.ROUND_UNNECESSARY,
+ "ROUND_UP", BigDecimal.ROUND_UP);
+ }
+ return unscaled;
+ }
+
+ /**
+ * Computes a number {@code delta} close to {@code originalDelta} with
+ * the property that <pre><code>
+ * x + delta - x
+ * </code></pre>
+ * is exactly machine-representable.
+ * This is useful when computing numerical derivatives, in order to reduce
+ * roundoff errors.
+ *
+ * @param x Value.
+ * @param originalDelta Offset value.
+ * @return a number {@code delta} so that {@code x + delta} and {@code x} differ by a representable floating number.
+ */
+ public static double representableDelta(double x, double originalDelta) {
+ return x + originalDelta - x;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/934f6ac2/modules/ml/src/main/java/org/apache/ignite/ml/math/Tracer.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/Tracer.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/Tracer.java
index d334575..d343ce8 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/Tracer.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/Tracer.java
@@ -58,9 +58,9 @@ public class Tracer {
return new ColorMapper() {
/** {@inheritDoc} */
@Override public Color apply(Double d) {
- int r = (int) Math.round(255 * d);
+ int r = (int)Math.round(255 * d);
int g = 0;
- int b = (int) Math.round(255 * (1 - d));
+ int b = (int)Math.round(255 * (1 - d));
return new Color(r, g, b);
}
@@ -195,8 +195,8 @@ public class Tracer {
/**
* Saves given vector as CSV file.
*
- * @param vec Vector to save.
- * @param fmt Format to use.
+ * @param vec Vector to save.
+ * @param fmt Format to use.
* @param filePath Path of the file to save to.
*/
public static void saveAsCsv(Vector vec, String fmt, String filePath) throws IOException {
@@ -208,8 +208,8 @@ public class Tracer {
/**
* Saves given matrix as CSV file.
*
- * @param mtx Matrix to save.
- * @param fmt Format to use.
+ * @param mtx Matrix to save.
+ * @param fmt Format to use.
* @param filePath Path of the file to save to.
*/
public static void saveAsCsv(Matrix mtx, String fmt, String filePath) throws IOException {
@@ -232,7 +232,7 @@ public class Tracer {
* Shows given matrix in the browser with D3-based visualization.
*
* @param mtx Matrix to show.
- * @param cm Optional color mapper. If not provided - red-to-blue (R_B) mapper will be used.
+ * @param cm Optional color mapper. If not provided - red-to-blue (R_B) mapper will be used.
* @throws IOException Thrown in case of any errors.
*/
public static void showHtml(Matrix mtx, ColorMapper cm) throws IOException {
@@ -263,7 +263,7 @@ public class Tracer {
}
/**
- * @param d Value of {@link Matrix} or {@link Vector} element.
+ * @param d Value of {@link Matrix} or {@link Vector} element.
* @param clr {@link Color} to paint.
* @return JSON representation for given value and color.
*/
@@ -280,7 +280,7 @@ public class Tracer {
* Shows given vector in the browser with D3-based visualization.
*
* @param vec Vector to show.
- * @param cm Optional color mapper. If not provided - red-to-blue (R_B) mapper will be used.
+ * @param cm Optional color mapper. If not provided - red-to-blue (R_B) mapper will be used.
* @throws IOException Thrown in case of any errors.
*/
public static void showHtml(Vector vec, ColorMapper cm) throws IOException {
@@ -366,7 +366,7 @@ public class Tracer {
* Gets JavaScript array presentation of this vector.
*
* @param vec Vector to JavaScript-ify.
- * @param cm Color mapper to user.
+ * @param cm Color mapper to user.
*/
private static String mkJsArrayString(Vector vec, ColorMapper cm) {
boolean first = true;
@@ -393,7 +393,7 @@ public class Tracer {
* Gets JavaScript array presentation of this vector.
*
* @param mtx Matrix to JavaScript-ify.
- * @param cm Color mapper to user.
+ * @param cm Color mapper to user.
*/
private static String mkJsArrayString(Matrix mtx, ColorMapper cm) {
boolean first = true;
http://git-wip-us.apache.org/repos/asf/ignite/blob/934f6ac2/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/CholeskyDecomposition.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/CholeskyDecomposition.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/CholeskyDecomposition.java
index 6053e1c..84028fe 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/CholeskyDecomposition.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/CholeskyDecomposition.java
@@ -17,12 +17,16 @@
package org.apache.ignite.ml.math.decompositions;
+import org.apache.ignite.ml.math.Destroyable;
import org.apache.ignite.ml.math.Matrix;
import org.apache.ignite.ml.math.Vector;
import org.apache.ignite.ml.math.exceptions.CardinalityException;
import org.apache.ignite.ml.math.exceptions.NonPositiveDefiniteMatrixException;
import org.apache.ignite.ml.math.exceptions.NonSymmetricMatrixException;
+import static org.apache.ignite.ml.math.util.MatrixUtil.like;
+import static org.apache.ignite.ml.math.util.MatrixUtil.likeVector;
+
/**
* Calculates the Cholesky decomposition of a matrix.
* <p>
@@ -31,7 +35,7 @@ import org.apache.ignite.ml.math.exceptions.NonSymmetricMatrixException;
* @see <a href="http://mathworld.wolfram.com/CholeskyDecomposition.html">MathWorld</a>
* @see <a href="http://en.wikipedia.org/wiki/Cholesky_decomposition">Wikipedia</a>
*/
-public class CholeskyDecomposition extends DecompositionSupport {
+public class CholeskyDecomposition implements Destroyable {
/**
* Default threshold above which off-diagonal elements are considered too different
* and matrix not symmetric.
http://git-wip-us.apache.org/repos/asf/ignite/blob/934f6ac2/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/EigenDecomposition.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/EigenDecomposition.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/EigenDecomposition.java
index 698cbef..d0e91a5 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/EigenDecomposition.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/EigenDecomposition.java
@@ -17,17 +17,21 @@
package org.apache.ignite.ml.math.decompositions;
+import org.apache.ignite.ml.math.Destroyable;
import org.apache.ignite.ml.math.Matrix;
import org.apache.ignite.ml.math.Vector;
import org.apache.ignite.ml.math.functions.Functions;
+import static org.apache.ignite.ml.math.util.MatrixUtil.like;
+import static org.apache.ignite.ml.math.util.MatrixUtil.likeVector;
+
/**
* This class provides EigenDecomposition of given matrix. The class is based on
* class with similar name from <a href="http://mahout.apache.org/">Apache Mahout</a> library.
*
* @see <a href=http://mathworld.wolfram.com/EigenDecomposition.html>MathWorld</a>
*/
-public class EigenDecomposition extends DecompositionSupport {
+public class EigenDecomposition implements Destroyable {
/** Row and column dimension (square matrix). */
private final int n;
http://git-wip-us.apache.org/repos/asf/ignite/blob/934f6ac2/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/LUDecomposition.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/LUDecomposition.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/LUDecomposition.java
index 02a3123..4c388b3 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/LUDecomposition.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/LUDecomposition.java
@@ -17,11 +17,16 @@
package org.apache.ignite.ml.math.decompositions;
+import org.apache.ignite.ml.math.Destroyable;
import org.apache.ignite.ml.math.Matrix;
import org.apache.ignite.ml.math.Vector;
import org.apache.ignite.ml.math.exceptions.CardinalityException;
import org.apache.ignite.ml.math.exceptions.SingularMatrixException;
+import static org.apache.ignite.ml.math.util.MatrixUtil.copy;
+import static org.apache.ignite.ml.math.util.MatrixUtil.like;
+import static org.apache.ignite.ml.math.util.MatrixUtil.likeVector;
+
/**
* Calculates the LU-decomposition of a square matrix.
* <p>
@@ -29,8 +34,10 @@ import org.apache.ignite.ml.math.exceptions.SingularMatrixException;
*
* @see <a href="http://mathworld.wolfram.com/LUDecomposition.html">MathWorld</a>
* @see <a href="http://en.wikipedia.org/wiki/LU_decomposition">Wikipedia</a>
+ *
+ * TODO: Maybe we should make this class (and other decompositions) Externalizable.
*/
-public class LUDecomposition extends DecompositionSupport {
+public class LUDecomposition implements Destroyable {
/** Default bound to determine effective singularity in LU decomposition. */
private static final double DEFAULT_TOO_SMALL = 1e-11;
http://git-wip-us.apache.org/repos/asf/ignite/blob/934f6ac2/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/QRDecomposition.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/QRDecomposition.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/QRDecomposition.java
index 39215e8..5ffa574 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/QRDecomposition.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/QRDecomposition.java
@@ -17,16 +17,21 @@
package org.apache.ignite.ml.math.decompositions;
+import org.apache.ignite.ml.math.Destroyable;
import org.apache.ignite.ml.math.Matrix;
import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.SingularMatrixException;
import org.apache.ignite.ml.math.functions.Functions;
+import static org.apache.ignite.ml.math.util.MatrixUtil.copy;
+import static org.apache.ignite.ml.math.util.MatrixUtil.like;
+
/**
* For an {@code m x n} matrix {@code A} with {@code m >= n}, the QR decomposition
* is an {@code m x n} orthogonal matrix {@code Q} and an {@code n x n} upper
* triangular matrix {@code R} so that {@code A = Q*R}.
*/
-public class QRDecomposition extends DecompositionSupport {
+public class QRDecomposition implements Destroyable {
/** */
private final Matrix q;
/** */
@@ -41,6 +46,8 @@ public class QRDecomposition extends DecompositionSupport {
private final int rows;
/** */
private final int cols;
+ /** */
+ private double threshold;
/**
* @param v Value to be checked for being an ordinary double.
@@ -52,10 +59,21 @@ public class QRDecomposition extends DecompositionSupport {
/**
* Constructs a new QR decomposition object computed by Householder reflections.
+ * Threshold for singularity check used in this case is 0.
*
* @param mtx A rectangular matrix.
*/
public QRDecomposition(Matrix mtx) {
+ this(mtx, 0.0);
+ }
+
+ /**
+ * Constructs a new QR decomposition object computed by Householder reflections.
+ *
+ * @param mtx A rectangular matrix.
+ * @param threshold Value used for detecting singularity of {@code R} matrix in decomposition.
+ */
+ public QRDecomposition(Matrix mtx, double threshold) {
assert mtx != null;
rows = mtx.rowSize();
@@ -71,6 +89,7 @@ public class QRDecomposition extends DecompositionSupport {
boolean fullRank = true;
r = like(mtx, min, cols);
+ this.threshold = threshold;
for (int i = 0; i < min; i++) {
Vector qi = qTmp.viewColumn(i);
@@ -155,18 +174,20 @@ public class QRDecomposition extends DecompositionSupport {
throw new IllegalArgumentException("Matrix row dimensions must agree.");
int cols = mtx.columnSize();
-
+ Matrix r = getR();
+ checkSingular(r, threshold, true);
Matrix x = like(mType, this.cols, cols);
Matrix qt = getQ().transpose();
Matrix y = qt.times(mtx);
- Matrix r = getR();
-
- for (int k = Math.min(this.cols, rows) - 1; k > 0; k--) {
+ for (int k = Math.min(this.cols, rows) - 1; k >= 0; k--) {
// X[k,] = Y[k,] / R[k,k], note that X[k,] starts with 0 so += is same as =
x.viewRow(k).map(y.viewRow(k), Functions.plusMult(1 / r.get(k, k)));
+ if (k == 0)
+ continue;
+
// Y[0:(k-1),] -= R[0:(k-1),k] * X[k,]
Vector rCol = r.viewColumn(k).viewPart(0, k);
@@ -178,9 +199,48 @@ public class QRDecomposition extends DecompositionSupport {
}
/**
+ * Least squares solution of {@code A*X = B}; {@code returns X}.
+ *
+ * @param vec A vector with as many rows as {@code A}.
+ * @return {@code X<} that minimizes the two norm of {@code Q*R*X - B}.
+ * @throws IllegalArgumentException if {@code B.rows() != A.rows()}.
+ */
+ public Vector solve(Vector vec) {
+ Matrix res = solve(vec.likeMatrix(vec.size(), 1).assignColumn(0, vec));
+ return vec.like(res.rowSize()).assign(res.viewColumn(0));
+ }
+
+ /**
* Returns a rough string rendition of a QR.
*/
@Override public String toString() {
return String.format("QR(%d x %d, fullRank=%s)", rows, cols, hasFullRank());
}
+
+ /**
+ * Check singularity.
+ *
+ * @param r R matrix.
+ * @param min Singularity threshold.
+ * @param raise Whether to raise a {@link SingularMatrixException} if any element of the diagonal fails the check.
+ * @return {@code true} if any element of the diagonal is smaller or equal to {@code min}.
+ * @throws SingularMatrixException if the matrix is singular and {@code raise} is {@code true}.
+ */
+ private static boolean checkSingular(Matrix r, double min, boolean raise) {
+ // TODO: Not a very fast approach for distributed matrices. would be nice if we could independently check
+ // parts on different nodes for singularity and do fold with 'or'.
+
+ final int len = r.columnSize();
+ for (int i = 0; i < len; i++) {
+ final double d = r.getX(i, i);
+ if (Math.abs(d) <= min)
+ if (raise)
+ throw new SingularMatrixException("Number is too small (%f, while " +
+ "threshold is %f). Index of diagonal element is (%d, %d)", d, min, i, i);
+ else
+ return true;
+
+ }
+ return false;
+ }
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/934f6ac2/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/SingularValueDecomposition.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/SingularValueDecomposition.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/SingularValueDecomposition.java
index 1b04e4f..68aeb6d 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/SingularValueDecomposition.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/SingularValueDecomposition.java
@@ -18,8 +18,11 @@
package org.apache.ignite.ml.math.decompositions;
import org.apache.ignite.ml.math.Algebra;
+import org.apache.ignite.ml.math.Destroyable;
import org.apache.ignite.ml.math.Matrix;
+import static org.apache.ignite.ml.math.util.MatrixUtil.like;
+
/**
* Compute a singular value decomposition (SVD) of {@code (l x k)} matrix {@code m}.
* <p>This decomposition can be thought
@@ -33,7 +36,7 @@ import org.apache.ignite.ml.math.Matrix;
* <p>See also: <a href="https://en.wikipedia.org/wiki/Singular_value_decomposition">Wikipedia article on SVD</a>.</p>
* <p>Note: complex case is currently not supported.</p>
*/
-public class SingularValueDecomposition extends DecompositionSupport {
+public class SingularValueDecomposition implements Destroyable {
// U and V.
/** */
private final double[][] u;
http://git-wip-us.apache.org/repos/asf/ignite/blob/934f6ac2/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/CardinalityException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/CardinalityException.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/CardinalityException.java
index f03e5d8..e8a073d 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/CardinalityException.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/CardinalityException.java
@@ -17,12 +17,10 @@
package org.apache.ignite.ml.math.exceptions;
-import org.apache.ignite.IgniteException;
-
/**
* Indicates a cardinality mismatch in matrix or vector operations.
*/
-public class CardinalityException extends IgniteException {
+public class CardinalityException extends MathIllegalArgumentException {
/** */
private static final long serialVersionUID = 0L;
@@ -33,6 +31,6 @@ public class CardinalityException extends IgniteException {
* @param act Actual cardinality.
*/
public CardinalityException(int exp, int act) {
- super("Cardinality violation [expected=" + exp + ", actual=" + act + "]");
+ super("Cardinality violation [expected=%d, actual=%d]", exp, act);
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/934f6ac2/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/InsufficientDataException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/InsufficientDataException.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/InsufficientDataException.java
new file mode 100644
index 0000000..a57997d
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/InsufficientDataException.java
@@ -0,0 +1,44 @@
+/*
+ * 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.ignite.ml.math.exceptions;
+
+/**
+ * This class is based on the corresponding class from Apache Common Math lib.
+ * Exception to be thrown when there is insufficient data to perform a computation.
+ */
+public class InsufficientDataException extends MathIllegalArgumentException {
+ /** Serializable version Id. */
+ private static final long serialVersionUID = -2629324471511903359L;
+
+ /** */
+ private static final String INSUFFICIENT_DATA = "Insufficient data.";
+
+ /**
+ * Construct the exception.
+ */
+ public InsufficientDataException() {
+ this(INSUFFICIENT_DATA);
+ }
+
+ /**
+ * Construct the exception.
+ */
+ public InsufficientDataException(String msg, Object... args) {
+ super(msg, args);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/934f6ac2/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/MathArithmeticException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/MathArithmeticException.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/MathArithmeticException.java
new file mode 100644
index 0000000..f48f3c5
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/MathArithmeticException.java
@@ -0,0 +1,47 @@
+/*
+ * 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.ignite.ml.math.exceptions;
+
+/**
+ * This class is based on the corresponding class from Apache Common Math lib.
+ * Base class for arithmetic exceptions.
+ * It is used for all the exceptions that have the semantics of the standard
+ * {@link ArithmeticException}, but must also provide a localized
+ * message.
+ */
+public class MathArithmeticException extends MathRuntimeException {
+ /** Serializable version Id. */
+ private static final long serialVersionUID = -6024911025449780478L;
+
+ /**
+ * Default constructor.
+ */
+ public MathArithmeticException() {
+ this("arithmetic exception");
+ }
+
+ /**
+ * Constructor with a specific message.
+ *
+ * @param format Message pattern providing the specific context of the error.
+ * @param args Arguments.
+ */
+ public MathArithmeticException(String format, Object... args) {
+ super(format, args);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/934f6ac2/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/MathIllegalArgumentException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/MathIllegalArgumentException.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/MathIllegalArgumentException.java
new file mode 100644
index 0000000..eac685d
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/MathIllegalArgumentException.java
@@ -0,0 +1,37 @@
+/*
+ * 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.ignite.ml.math.exceptions;
+
+/**
+ * Base class for all preconditions violation exceptions.
+ * In most cases, this class should not be instantiated directly: it should
+ * serve as a base class to create all the exceptions that have the semantics
+ * of the standard {@link IllegalArgumentException}.
+ */
+public class MathIllegalArgumentException extends MathRuntimeException {
+ /** Serializable version Id. */
+ private static final long serialVersionUID = -6024911025449780478L;
+
+ /**
+ * @param format Message format string explaining the cause of the error.
+ * @param args Arguments.
+ */
+ public MathIllegalArgumentException(String format, Object... args) {
+ super(String.format(format, args));
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/934f6ac2/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/MathRuntimeException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/MathRuntimeException.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/MathRuntimeException.java
new file mode 100644
index 0000000..865428e
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/MathRuntimeException.java
@@ -0,0 +1,47 @@
+/*
+ * 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.ignite.ml.math.exceptions;
+
+import org.apache.ignite.IgniteException;
+
+/**
+ * This class is based on the corresponding class from Apache Common Math lib.
+ * In most cases, this class should not be instantiated directly: it should
+ * serve as a base class for implementing exception classes that describe a
+ * specific "problem".
+ */
+public class MathRuntimeException extends IgniteException {
+ /** Serializable version Id. */
+ private static final long serialVersionUID = 20120926L;
+
+ /**
+ * @param format Message pattern explaining the cause of the error.
+ * @param args Arguments.
+ */
+ public MathRuntimeException(String format, Object... args) {
+ this(null, format, args);
+ }
+
+ /**
+ * @param cause Root cause.
+ * @param format Message pattern explaining the cause of the error.
+ * @param args Arguments.
+ */
+ public MathRuntimeException(Throwable cause, String format, Object... args) {
+ super(String.format(format, args), cause);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/934f6ac2/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/NoDataException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/NoDataException.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/NoDataException.java
new file mode 100644
index 0000000..46d64aa
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/NoDataException.java
@@ -0,0 +1,45 @@
+/*
+ * 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.ignite.ml.math.exceptions;
+
+/**
+ * This class is based on the corresponding class from Apache Common Math lib.
+ * Exception to be thrown when the required data is missing.
+ */
+public class NoDataException extends MathIllegalArgumentException {
+ /** Serializable version Id. */
+ private static final long serialVersionUID = -3629324471511904459L;
+
+ /** */
+ private static final String NO_DATA = "No data.";
+
+ /**
+ * Construct the exception.
+ */
+ public NoDataException() {
+ this(NO_DATA);
+ }
+
+ /**
+ * Construct the exception with a specific message.
+ *
+ * @param msg Message.
+ */
+ public NoDataException(String msg) {
+ super(msg);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/934f6ac2/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/NonPositiveDefiniteMatrixException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/NonPositiveDefiniteMatrixException.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/NonPositiveDefiniteMatrixException.java
index b0cf294..2e588dc 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/NonPositiveDefiniteMatrixException.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/NonPositiveDefiniteMatrixException.java
@@ -17,12 +17,10 @@
package org.apache.ignite.ml.math.exceptions;
-import org.apache.ignite.IgniteException;
-
/**
* This exception is used to indicate error condition of matrix elements failing the positivity check.
*/
-public class NonPositiveDefiniteMatrixException extends IgniteException {
+public class NonPositiveDefiniteMatrixException extends MathIllegalArgumentException {
/**
* Construct an exception.
*
@@ -31,7 +29,7 @@ public class NonPositiveDefiniteMatrixException extends IgniteException {
* @param threshold Absolute positivity threshold.
*/
public NonPositiveDefiniteMatrixException(double wrong, int idx, double threshold) {
- super("Matrix must be positive, wrong element located on diagonal with index "
- + idx + " and has value " + wrong + " with this threshold " + threshold);
+ super("Matrix must be positive, wrong element located on diagonal with index %d and has value %f with this threshold %f",
+ idx, wrong, threshold);
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/934f6ac2/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/NonSquareMatrixException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/NonSquareMatrixException.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/NonSquareMatrixException.java
new file mode 100644
index 0000000..5a4c207
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/NonSquareMatrixException.java
@@ -0,0 +1,33 @@
+/*
+ * 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.ignite.ml.math.exceptions;
+
+/**
+ * Indicates that given matrix is not a square matrix.
+ */
+public class NonSquareMatrixException extends CardinalityException {
+ /**
+ * Creates new square size violation exception.
+ *
+ * @param exp Expected cardinality.
+ * @param act Actual cardinality.
+ */
+ public NonSquareMatrixException(int exp, int act) {
+ super(exp, act);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/934f6ac2/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/NullArgumentException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/NullArgumentException.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/NullArgumentException.java
new file mode 100644
index 0000000..58a6fa3
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/NullArgumentException.java
@@ -0,0 +1,27 @@
+/*
+ * 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.ignite.ml.math.exceptions;
+
+/**
+ * This class is based on the corresponding class from Apache Common Math lib.
+ * All conditions checks that fail due to a {@code null} argument must throw
+ * this exception.
+ * This class is meant to signal a precondition violation ("null is an illegal
+ * argument").
+ */
+public class NullArgumentException extends NullPointerException {
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/934f6ac2/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/SingularMatrixException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/SingularMatrixException.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/SingularMatrixException.java
index 789b686..c7acc80 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/SingularMatrixException.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/SingularMatrixException.java
@@ -17,14 +17,17 @@
package org.apache.ignite.ml.math.exceptions;
-import org.apache.ignite.IgniteException;
-
/**
* Exception to be thrown when a non-singular matrix is expected.
*/
-public class SingularMatrixException extends IgniteException {
+public class SingularMatrixException extends MathIllegalArgumentException {
/** */
public SingularMatrixException() {
super("Regular (or non-singular) matrix expected.");
}
+
+ /** */
+ public SingularMatrixException(String format, Object... args) {
+ super(format, args);
+ }
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/934f6ac2/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/Functions.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/Functions.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/Functions.java
index 2f97067..e86a5eb 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/Functions.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/Functions.java
@@ -133,6 +133,11 @@ public final class Functions {
return (a, b) -> a - b * constant;
}
+ /** Function that returns passed constant. */
+ public static IgniteDoubleFunction<Double> constant(Double c) {
+ return a -> c;
+ }
+
/**
* Function that returns {@code Math.pow(a, b)}.
*
http://git-wip-us.apache.org/repos/asf/ignite/blob/934f6ac2/modules/ml/src/main/java/org/apache/ignite/ml/math/util/MatrixUtil.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/util/MatrixUtil.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/util/MatrixUtil.java
new file mode 100644
index 0000000..9277ae4
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/util/MatrixUtil.java
@@ -0,0 +1,121 @@
+/*
+ * 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.ignite.ml.math.util;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.impls.matrix.CacheMatrix;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
+import org.apache.ignite.ml.math.impls.matrix.MatrixView;
+import org.apache.ignite.ml.math.impls.matrix.PivotedMatrixView;
+import org.apache.ignite.ml.math.impls.matrix.RandomMatrix;
+import org.apache.ignite.ml.math.impls.vector.DenseLocalOnHeapVector;
+
+/**
+ * Utility class for various matrix operations.
+ */
+public class MatrixUtil {
+ /**
+ * Create the like matrix with read-only matrices support.
+ *
+ * @param matrix Matrix for like.
+ * @return Like matrix.
+ */
+ public static Matrix like(Matrix matrix) {
+ if (isCopyLikeSupport(matrix))
+ return new DenseLocalOnHeapMatrix(matrix.rowSize(), matrix.columnSize());
+ else
+ return matrix.like(matrix.rowSize(), matrix.columnSize());
+ }
+
+ /**
+ * Create the identity matrix like a given matrix.
+ *
+ * @param matrix Matrix for like.
+ * @return Identity matrix.
+ */
+ public static Matrix identityLike(Matrix matrix, int n) {
+ Matrix res = like(matrix, n, n);
+ // TODO: Maybe we should introduce API for walking(and changing) matrix in
+ // a fastest possible visiting order.
+ for (int i = 0; i < n; i++)
+ res.setX(i, i, 1.0);
+ return res;
+ }
+
+ /**
+ * Create the like matrix with specified size with read-only matrices support.
+ *
+ * @param matrix Matrix for like.
+ * @return Like matrix.
+ */
+ public static Matrix like(Matrix matrix, int rows, int cols) {
+ if (isCopyLikeSupport(matrix))
+ return new DenseLocalOnHeapMatrix(rows, cols);
+ else
+ return matrix.like(rows, cols);
+ }
+
+ /**
+ * Create the like vector with read-only matrices support.
+ *
+ * @param matrix Matrix for like.
+ * @param crd Cardinality of the vector.
+ * @return Like vector.
+ */
+ public static Vector likeVector(Matrix matrix, int crd) {
+ if (isCopyLikeSupport(matrix))
+ return new DenseLocalOnHeapVector(crd);
+ else
+ return matrix.likeVector(crd);
+ }
+
+ /**
+ * Create the like vector with read-only matrices support.
+ *
+ * @param matrix Matrix for like.
+ * @return Like vector.
+ */
+ public static Vector likeVector(Matrix matrix) {
+ return likeVector(matrix, matrix.rowSize());
+ }
+
+ /**
+ * Create the copy of matrix with read-only matrices support.
+ *
+ * @param matrix Matrix for copy.
+ * @return Copy.
+ */
+ public static Matrix copy(Matrix matrix) {
+ if (isCopyLikeSupport(matrix)) {
+ DenseLocalOnHeapMatrix cp = new DenseLocalOnHeapMatrix(matrix.rowSize(), matrix.columnSize());
+
+ cp.assign(matrix);
+
+ return cp;
+ }
+ else
+ return matrix.copy();
+ }
+
+ /** */
+ private static boolean isCopyLikeSupport(Matrix matrix) {
+ return matrix instanceof RandomMatrix || matrix instanceof MatrixView || matrix instanceof CacheMatrix ||
+ matrix instanceof PivotedMatrixView;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/934f6ac2/modules/ml/src/main/java/org/apache/ignite/ml/regressions/AbstractMultipleLinearRegression.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/regressions/AbstractMultipleLinearRegression.java b/modules/ml/src/main/java/org/apache/ignite/ml/regressions/AbstractMultipleLinearRegression.java
new file mode 100644
index 0000000..d558dc0
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/regressions/AbstractMultipleLinearRegression.java
@@ -0,0 +1,358 @@
+/*
+ * 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.ignite.ml.regressions;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.CardinalityException;
+import org.apache.ignite.ml.math.exceptions.InsufficientDataException;
+import org.apache.ignite.ml.math.exceptions.MathIllegalArgumentException;
+import org.apache.ignite.ml.math.exceptions.NoDataException;
+import org.apache.ignite.ml.math.exceptions.NonSquareMatrixException;
+import org.apache.ignite.ml.math.exceptions.NullArgumentException;
+import org.apache.ignite.ml.math.functions.Functions;
+import org.apache.ignite.ml.math.util.MatrixUtil;
+
+/**
+ * This class is based on the corresponding class from Apache Common Math lib.
+ * Abstract base class for implementations of MultipleLinearRegression.
+ */
+public abstract class AbstractMultipleLinearRegression implements MultipleLinearRegression {
+ /** X sample data. */
+ private Matrix xMatrix;
+
+ /** Y sample data. */
+ private Vector yVector;
+
+ /** Whether or not the regression model includes an intercept. True means no intercept. */
+ private boolean noIntercept = false;
+
+ /**
+ * @return the X sample data.
+ */
+ protected Matrix getX() {
+ return xMatrix;
+ }
+
+ /**
+ * @return the Y sample data.
+ */
+ protected Vector getY() {
+ return yVector;
+ }
+
+ /**
+ * @return true if the model has no intercept term; false otherwise
+ */
+ public boolean isNoIntercept() {
+ return noIntercept;
+ }
+
+ /**
+ * @param noIntercept true means the model is to be estimated without an intercept term
+ */
+ public void setNoIntercept(boolean noIntercept) {
+ this.noIntercept = noIntercept;
+ }
+
+ /**
+ * <p>Loads model x and y sample data from a flat input array, overriding any previous sample.
+ * </p>
+ * <p>Assumes that rows are concatenated with y values first in each row. For example, an input
+ * <code>data</code> array containing the sequence of values (1, 2, 3, 4, 5, 6, 7, 8, 9) with
+ * <code>nobs = 3</code> and <code>nvars = 2</code> creates a regression dataset with two
+ * independent variables, as below:
+ * <pre>
+ * y x[0] x[1]
+ * --------------
+ * 1 2 3
+ * 4 5 6
+ * 7 8 9
+ * </pre>
+ * </p>
+ * <p>Note that there is no need to add an initial unitary column (column of 1's) when
+ * specifying a model including an intercept term. If {@link #isNoIntercept()} is <code>true</code>,
+ * the X matrix will be created without an initial column of "1"s; otherwise this column will
+ * be added.
+ * </p>
+ * <p>Throws IllegalArgumentException if any of the following preconditions fail:
+ * <ul><li><code>data</code> cannot be null</li>
+ * <li><code>data.length = nobs * (nvars + 1)</li>
+ * <li><code>nobs > nvars</code></li></ul>
+ * </p>
+ *
+ * @param data input data array
+ * @param nobs number of observations (rows)
+ * @param nvars number of independent variables (columns, not counting y)
+ * @param like matrix(maybe empty) indicating how data should be stored
+ * @throws NullArgumentException if the data array is null
+ * @throws CardinalityException if the length of the data array is not equal to <code>nobs * (nvars + 1)</code>
+ * @throws InsufficientDataException if <code>nobs</code> is less than <code>nvars + 1</code>
+ */
+ public void newSampleData(double[] data, int nobs, int nvars, Matrix like) {
+ if (data == null)
+ throw new NullArgumentException();
+ if (data.length != nobs * (nvars + 1))
+ throw new CardinalityException(nobs * (nvars + 1), data.length);
+ if (nobs <= nvars)
+ throw new InsufficientDataException(RegressionsErrorMessages.INSUFFICIENT_OBSERVED_POINTS_IN_SAMPLE);
+ double[] y = new double[nobs];
+ final int cols = noIntercept ? nvars : nvars + 1;
+ double[][] x = new double[nobs][cols];
+ int pointer = 0;
+ for (int i = 0; i < nobs; i++) {
+ y[i] = data[pointer++];
+ if (!noIntercept)
+ x[i][0] = 1.0d;
+ for (int j = noIntercept ? 0 : 1; j < cols; j++)
+ x[i][j] = data[pointer++];
+ }
+ xMatrix = MatrixUtil.like(like, nobs, cols).assign(x);
+ yVector = MatrixUtil.likeVector(like, y.length).assign(y);
+ }
+
+ /**
+ * Loads new y sample data, overriding any previous data.
+ *
+ * @param y the array representing the y sample
+ * @throws NullArgumentException if y is null
+ * @throws NoDataException if y is empty
+ */
+ protected void newYSampleData(Vector y) {
+ if (y == null)
+ throw new NullArgumentException();
+ if (y.size() == 0)
+ throw new NoDataException();
+ // TODO: Should we copy here?
+ yVector = y;
+ }
+
+ /**
+ * <p>Loads new x sample data, overriding any previous data.
+ * </p>
+ * The input <code>x</code> array should have one row for each sample
+ * observation, with columns corresponding to independent variables.
+ * For example, if <pre>
+ * <code> x = new double[][] {{1, 2}, {3, 4}, {5, 6}} </code></pre>
+ * then <code>setXSampleData(x) </code> results in a model with two independent
+ * variables and 3 observations:
+ * <pre>
+ * x[0] x[1]
+ * ----------
+ * 1 2
+ * 3 4
+ * 5 6
+ * </pre>
+ * </p>
+ * <p>Note that there is no need to add an initial unitary column (column of 1's) when
+ * specifying a model including an intercept term.
+ * </p>
+ *
+ * @param x the rectangular array representing the x sample
+ * @throws NullArgumentException if x is null
+ * @throws NoDataException if x is empty
+ * @throws CardinalityException if x is not rectangular
+ */
+ protected void newXSampleData(Matrix x) {
+ if (x == null)
+ throw new NullArgumentException();
+ if (x.rowSize() == 0)
+ throw new NoDataException();
+ if (noIntercept)
+ // TODO: Should we copy here?
+ xMatrix = x;
+ else { // Augment design matrix with initial unitary column
+ xMatrix = MatrixUtil.like(x, x.rowSize(), x.columnSize() + 1);
+ xMatrix.viewColumn(0).map(Functions.constant(1.0));
+ xMatrix.viewPart(0, x.rowSize(), 1, x.columnSize()).assign(x);
+ }
+ }
+
+ /**
+ * Validates sample data. Checks that
+ * <ul><li>Neither x nor y is null or empty;</li>
+ * <li>The length (i.e. number of rows) of x equals the length of y</li>
+ * <li>x has at least one more row than it has columns (i.e. there is
+ * sufficient data to estimate regression coefficients for each of the
+ * columns in x plus an intercept.</li>
+ * </ul>
+ *
+ * @param x the n x k matrix representing the x data
+ * @param y the n-sized vector representing the y data
+ * @throws NullArgumentException if {@code x} or {@code y} is null
+ * @throws CardinalityException if {@code x} and {@code y} do not have the same length
+ * @throws NoDataException if {@code x} or {@code y} are zero-length
+ * @throws MathIllegalArgumentException if the number of rows of {@code x} is not larger than the number of columns
+ * + 1
+ */
+ protected void validateSampleData(Matrix x, Vector y) throws MathIllegalArgumentException {
+ if ((x == null) || (y == null))
+ throw new NullArgumentException();
+ if (x.rowSize() != y.size())
+ throw new CardinalityException(y.size(), x.rowSize());
+ if (x.rowSize() == 0) { // Must be no y data either
+ throw new NoDataException();
+ }
+ if (x.columnSize() + 1 > x.rowSize()) {
+ throw new MathIllegalArgumentException(
+ RegressionsErrorMessages.NOT_ENOUGH_DATA_FOR_NUMBER_OF_PREDICTORS,
+ x.rowSize(), x.columnSize());
+ }
+ }
+
+ /**
+ * Validates that the x data and covariance matrix have the same
+ * number of rows and that the covariance matrix is square.
+ *
+ * @param x the [n,k] array representing the x sample
+ * @param covariance the [n,n] array representing the covariance matrix
+ * @throws CardinalityException if the number of rows in x is not equal to the number of rows in covariance
+ * @throws NonSquareMatrixException if the covariance matrix is not square
+ */
+ protected void validateCovarianceData(double[][] x, double[][] covariance) {
+ if (x.length != covariance.length)
+ throw new CardinalityException(x.length, covariance.length);
+ if (covariance.length > 0 && covariance.length != covariance[0].length)
+ throw new NonSquareMatrixException(covariance.length, covariance[0].length);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override public double[] estimateRegressionParameters() {
+ Vector b = calculateBeta();
+ return b.getStorage().data();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override public double[] estimateResiduals() {
+ Vector b = calculateBeta();
+ Vector e = yVector.minus(xMatrix.times(b));
+ return e.getStorage().data();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override public Matrix estimateRegressionParametersVariance() {
+ return calculateBetaVariance();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override public double[] estimateRegressionParametersStandardErrors() {
+ Matrix betaVariance = estimateRegressionParametersVariance();
+ double sigma = calculateErrorVariance();
+ int len = betaVariance.rowSize();
+ double[] res = new double[len];
+ for (int i = 0; i < len; i++)
+ res[i] = Math.sqrt(sigma * betaVariance.getX(i, i));
+ return res;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override public double estimateRegressandVariance() {
+ return calculateYVariance();
+ }
+
+ /**
+ * Estimates the variance of the error.
+ *
+ * @return estimate of the error variance
+ */
+ public double estimateErrorVariance() {
+ return calculateErrorVariance();
+
+ }
+
+ /**
+ * Estimates the standard error of the regression.
+ *
+ * @return regression standard error
+ */
+ public double estimateRegressionStandardError() {
+ return Math.sqrt(estimateErrorVariance());
+ }
+
+ /**
+ * Calculates the beta of multiple linear regression in matrix notation.
+ *
+ * @return beta
+ */
+ protected abstract Vector calculateBeta();
+
+ /**
+ * Calculates the beta variance of multiple linear regression in matrix
+ * notation.
+ *
+ * @return beta variance
+ */
+ protected abstract Matrix calculateBetaVariance();
+
+ /**
+ * Calculates the variance of the y values.
+ *
+ * @return Y variance
+ */
+ protected double calculateYVariance() {
+ // Compute initial estimate using definitional formula
+ int vSize = yVector.size();
+ double xbar = yVector.sum() / vSize;
+ // Compute correction factor in second pass
+ final double corr = yVector.foldMap((val, acc) -> acc + val - xbar, Functions.IDENTITY, 0.0);
+ final double mean = xbar - corr;
+ return yVector.foldMap(Functions.PLUS, val -> (val - mean) * (val - mean), 0.0) / (vSize - 1);
+ }
+
+ /**
+ * <p>Calculates the variance of the error term.</p>
+ * Uses the formula <pre>
+ * var(u) = u · u / (n - k)
+ * </pre>
+ * where n and k are the row and column dimensions of the design
+ * matrix X.
+ *
+ * @return error variance estimate
+ */
+ protected double calculateErrorVariance() {
+ Vector residuals = calculateResiduals();
+ return residuals.dot(residuals) /
+ (xMatrix.rowSize() - xMatrix.columnSize());
+ }
+
+ /**
+ * Calculates the residuals of multiple linear regression in matrix
+ * notation.
+ *
+ * <pre>
+ * u = y - X * b
+ * </pre>
+ *
+ * @return The residuals [n,1] matrix
+ */
+ protected Vector calculateResiduals() {
+ Vector b = calculateBeta();
+ return yVector.minus(xMatrix.times(b));
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/934f6ac2/modules/ml/src/main/java/org/apache/ignite/ml/regressions/MultipleLinearRegression.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/regressions/MultipleLinearRegression.java b/modules/ml/src/main/java/org/apache/ignite/ml/regressions/MultipleLinearRegression.java
new file mode 100644
index 0000000..2fc4dde
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/regressions/MultipleLinearRegression.java
@@ -0,0 +1,71 @@
+/*
+ * 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.ignite.ml.regressions;
+
+import org.apache.ignite.ml.math.Matrix;
+
+/**
+ * This class is based on the corresponding class from Apache Common Math lib. * The multiple linear regression can be
+ * represented in matrix-notation.
+ * <pre>
+ * y=X*b+u
+ * </pre>
+ * where y is an <code>n-vector</code> <b>regressand</b>, X is a <code>[n,k]</code> matrix whose <code>k</code> columns
+ * are called <b>regressors</b>, b is <code>k-vector</code> of <b>regression parameters</b> and <code>u</code> is an
+ * <code>n-vector</code> of <b>error terms</b> or <b>residuals</b>.
+ * <p>
+ * The notation is quite standard in literature, cf eg <a href="http://www.econ.queensu.ca/ETM">Davidson and MacKinnon,
+ * Econometrics Theory and Methods, 2004</a>. </p>
+ */
+public interface MultipleLinearRegression {
+ /**
+ * Estimates the regression parameters b.
+ *
+ * @return The [k,1] array representing b
+ */
+ public double[] estimateRegressionParameters();
+
+ /**
+ * Estimates the variance of the regression parameters, ie Var(b).
+ *
+ * @return The k x k matrix representing the variance of b
+ */
+ public Matrix estimateRegressionParametersVariance();
+
+ /**
+ * Estimates the residuals, ie u = y - X*b.
+ *
+ * @return The [n,1] array representing the residuals
+ */
+ public double[] estimateResiduals();
+
+ /**
+ * Returns the variance of the regressand, ie Var(y).
+ *
+ * @return The double representing the variance of y
+ */
+ public double estimateRegressandVariance();
+
+ /**
+ * Returns the standard errors of the regression parameters.
+ *
+ * @return standard errors of estimated regression parameters
+ */
+ public double[] estimateRegressionParametersStandardErrors();
+
+}
[33/67] [abbrv] ignite git commit: IGNITE-4052 Add ability to set up
users for MESOS.
Posted by sb...@apache.org.
IGNITE-4052 Add ability to set up users for MESOS.
Signed-off-by: nikolay_tikhonov <nt...@gridgain.com>
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/683303c9
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/683303c9
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/683303c9
Branch: refs/heads/ignite-5075
Commit: 683303c98878f55c83d05ed8d79f5da1f1cab6e3
Parents: 7db2d63
Author: nikolay_tikhonov <nt...@gridgain.com>
Authored: Thu Apr 27 19:32:37 2017 +0300
Committer: nikolay_tikhonov <nt...@gridgain.com>
Committed: Thu Apr 27 19:32:37 2017 +0300
----------------------------------------------------------------------
.../src/main/java/org/apache/ignite/mesos/IgniteFramework.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/683303c9/modules/mesos/src/main/java/org/apache/ignite/mesos/IgniteFramework.java
----------------------------------------------------------------------
diff --git a/modules/mesos/src/main/java/org/apache/ignite/mesos/IgniteFramework.java b/modules/mesos/src/main/java/org/apache/ignite/mesos/IgniteFramework.java
index 451d870..eea510a 100644
--- a/modules/mesos/src/main/java/org/apache/ignite/mesos/IgniteFramework.java
+++ b/modules/mesos/src/main/java/org/apache/ignite/mesos/IgniteFramework.java
@@ -174,8 +174,8 @@ public class IgniteFramework {
static boolean isRoleValid(String mRole) {
if (mRole == null || mRole.isEmpty() || mRole.equals(".") || mRole.equals("..") ||
mRole.startsWith("-") || mRole.contains("/") || mRole.contains("\\") || mRole.contains(" ")) {
- log.severe("Provided mesos role is not valid:" + mRole +
- ". Mesos role should be a valid directory name.");
+ log.severe("Provided mesos role is not valid: [" + mRole +
+ "]. Mesos role should be a valid directory name.");
return false;
}
[26/67] [abbrv] ignite git commit: master - Fix mvcc tests after
CLOCK mode removal
Posted by sb...@apache.org.
master - Fix mvcc tests after CLOCK mode removal
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/0da51d41
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/0da51d41
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/0da51d41
Branch: refs/heads/ignite-5075
Commit: 0da51d4110ab13f42f0ee5a2fc3181fc50656cd4
Parents: 364c386
Author: Alexey Goncharuk <al...@gmail.com>
Authored: Tue Apr 18 18:40:55 2017 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Tue Apr 18 18:40:55 2017 +0300
----------------------------------------------------------------------
.../cache/GridCacheMvccPartitionedSelfTest.java | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/0da51d41/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheMvccPartitionedSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheMvccPartitionedSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheMvccPartitionedSelfTest.java
index 2fb5d25..0c53fee 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheMvccPartitionedSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheMvccPartitionedSelfTest.java
@@ -604,9 +604,9 @@ public class GridCacheMvccPartitionedSelfTest extends GridCommonAbstractTest {
public void testSerializableReadLocksAdd() throws Exception {
GridCacheAdapter<String, String> cache = grid.internalCache();
- GridCacheVersion serOrder1 = new GridCacheVersion(0, 0, 1);
- GridCacheVersion serOrder2 = new GridCacheVersion(0, 0, 1);
- GridCacheVersion serOrder3 = new GridCacheVersion(0, 0, 1);
+ GridCacheVersion serOrder1 = new GridCacheVersion(0, 10, 1);
+ GridCacheVersion serOrder2 = new GridCacheVersion(0, 20, 1);
+ GridCacheVersion serOrder3 = new GridCacheVersion(0, 15, 1);
{
GridCacheMvcc mvcc = new GridCacheMvcc(cache.context());
@@ -681,9 +681,9 @@ public class GridCacheMvccPartitionedSelfTest extends GridCommonAbstractTest {
public void testSerializableReadLocksAssign() throws Exception {
GridCacheAdapter<String, String> cache = grid.internalCache();
- GridCacheVersion serOrder1 = new GridCacheVersion(0, 0, 1);
- GridCacheVersion serOrder2 = new GridCacheVersion(0, 0, 1);
- GridCacheVersion serOrder3 = new GridCacheVersion(0, 0, 1);
+ GridCacheVersion serOrder1 = new GridCacheVersion(0, 10, 1);
+ GridCacheVersion serOrder2 = new GridCacheVersion(0, 20, 1);
+ GridCacheVersion serOrder3 = new GridCacheVersion(0, 15, 1);
{
GridCacheMvcc mvcc = new GridCacheMvcc(cache.context());
@@ -883,10 +883,10 @@ public class GridCacheMvccPartitionedSelfTest extends GridCommonAbstractTest {
GridCacheTestEntryEx e = new GridCacheTestEntryEx(cache.context(), "1");
- GridCacheVersion serOrder1 = new GridCacheVersion(0, 0, 1);
- GridCacheVersion serOrder2 = new GridCacheVersion(0, 0, 1);
- GridCacheVersion serOrder3 = new GridCacheVersion(0, 0, 1);
- GridCacheVersion serOrder4 = new GridCacheVersion(0, 0, 1);
+ GridCacheVersion serOrder1 = new GridCacheVersion(0, 10, 1);
+ GridCacheVersion serOrder2 = new GridCacheVersion(0, 20, 1);
+ GridCacheVersion serOrder3 = new GridCacheVersion(0, 15, 1);
+ GridCacheVersion serOrder4 = new GridCacheVersion(0, 30, 1);
GridCacheVersion ver1 = incVer ? version(1) : version(4);
GridCacheVersion ver2 = incVer ? version(2) : version(3);
[40/67] [abbrv] ignite git commit: IGNITE-4995 Minor code cleanup.
Posted by sb...@apache.org.
IGNITE-4995 Minor code cleanup.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/eb6a1697
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/eb6a1697
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/eb6a1697
Branch: refs/heads/ignite-5075
Commit: eb6a1697f5b31827edb780e0cf001e9bb3acac9e
Parents: fcc41ac
Author: Alexey Kuznetsov <ak...@gridgain.com>
Authored: Sat Apr 29 20:27:33 2017 +0700
Committer: Alexey Kuznetsov <ak...@gridgain.com>
Committed: Sat Apr 29 20:27:33 2017 +0700
----------------------------------------------------------------------
modules/web-console/frontend/app/app.config.js | 4 +++-
.../app/components/cluster-select/cluster-select.pug | 3 ++-
modules/web-console/frontend/app/helpers/jade/mixins.pug | 8 +-------
.../web-console/frontend/app/modules/sql/sql.controller.js | 2 +-
4 files changed, 7 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/eb6a1697/modules/web-console/frontend/app/app.config.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/app.config.js b/modules/web-console/frontend/app/app.config.js
index cf527e6..1772453 100644
--- a/modules/web-console/frontend/app/app.config.js
+++ b/modules/web-console/frontend/app/app.config.js
@@ -20,10 +20,12 @@ import angular from 'angular';
const nonNil = _.negate(_.isNil);
const nonEmpty = _.negate(_.isEmpty);
+const id8 = (uuid) => uuid.substring(0, 8).toUpperCase();
_.mixin({
nonNil,
- nonEmpty
+ nonEmpty,
+ id8
});
import alertTemplateUrl from 'views/templates/alert.tpl.pug';
http://git-wip-us.apache.org/repos/asf/ignite/blob/eb6a1697/modules/web-console/frontend/app/components/cluster-select/cluster-select.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/cluster-select/cluster-select.pug b/modules/web-console/frontend/app/components/cluster-select/cluster-select.pug
index 9c1ab75..c290838 100644
--- a/modules/web-console/frontend/app/components/cluster-select/cluster-select.pug
+++ b/modules/web-console/frontend/app/components/cluster-select/cluster-select.pug
@@ -35,6 +35,7 @@ ul.nav.navbar-nav(ng-if='!IgniteDemoMode' ng-switch='ctrl.clusters.length' style
div(ng-click='item.click()')
i.icon-cluster.pull-left(style='margin: 0; padding-left: 10px;')
div: a {{item.name}}
-i.icon-help(bs-tooltip='' data-placement='bottom' data-html=true style='padding-right: 20px; line-height: 25px'
+i.icon-help(ng-if='!IgniteDemoMode' bs-tooltip='' data-placement='bottom' data-html=true style='line-height: 25px'
data-title='Multi-Cluster Support<br/>\
<a href="https://apacheignite-tools.readme.io/docs/multi-cluster-support" target="_blank">More info</a>')
+span(ng-if='!IgniteDemoMode' style='padding-right: 20px')
http://git-wip-us.apache.org/repos/asf/ignite/blob/eb6a1697/modules/web-console/frontend/app/helpers/jade/mixins.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/helpers/jade/mixins.pug b/modules/web-console/frontend/app/helpers/jade/mixins.pug
index 672b8f8..73aa7c5 100644
--- a/modules/web-console/frontend/app/helpers/jade/mixins.pug
+++ b/modules/web-console/frontend/app/helpers/jade/mixins.pug
@@ -15,10 +15,10 @@
limitations under the License.
include ./form
-include ../../primitives/tooltip/index
include ../../primitives/btn-group/index
include ../../primitives/datepicker/index
include ../../primitives/dropdown/index
+include ../../primitives/tooltip/index
include ../../primitives/ui-grid-settings/index
//- Mixin for advanced options toggle.
@@ -209,12 +209,6 @@ mixin url(lbl, model, name, required, placeholder, tip)
if block
block
-//- Mixin for text field.
-mixin url(lbl, model, name, required, placeholder, tip)
- +ignite-form-field-url(lbl, model, name, required, placeholder, tip)
- if block
- block
-
//- Mixin for password field.
mixin password(lbl, model, name, required, placeholder, tip)
+ignite-form-field-password(lbl, model, name, false, required, placeholder, tip)
http://git-wip-us.apache.org/repos/asf/ignite/blob/eb6a1697/modules/web-console/frontend/app/modules/sql/sql.controller.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/sql/sql.controller.js b/modules/web-console/frontend/app/modules/sql/sql.controller.js
index b3ca91b..c86ab6b 100644
--- a/modules/web-console/frontend/app/modules/sql/sql.controller.js
+++ b/modules/web-console/frontend/app/modules/sql/sql.controller.js
@@ -1478,8 +1478,8 @@ export default ['$rootScope', '$scope', '$http', '$q', '$timeout', '$interval',
$scope.scan = (paragraph, local = false) => {
const cacheName = paragraph.cacheName;
- const filter = paragraph.filter;
const caseSensitive = !!paragraph.caseSensitive;
+ const filter = paragraph.filter;
const pageSize = paragraph.pageSize;
$scope.actionAvailable(paragraph, false) && _chooseNode(cacheName, local)
[29/67] [abbrv] ignite git commit: Fixed javadoc.
Posted by sb...@apache.org.
Fixed javadoc.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/9ce62e64
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/9ce62e64
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/9ce62e64
Branch: refs/heads/ignite-5075
Commit: 9ce62e64a7abfc59799f4edf8d057a12c7a0d11d
Parents: 9c954c9
Author: Andrey V. Mashenkov <an...@gmail.com>
Authored: Wed Apr 19 06:45:08 2017 +0300
Committer: Andrey V. Mashenkov <an...@gmail.com>
Committed: Wed Apr 19 06:45:08 2017 +0300
----------------------------------------------------------------------
.../repository/support/IgniteRepositoryFactory.java | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/9ce62e64/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/support/IgniteRepositoryFactory.java
----------------------------------------------------------------------
diff --git a/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/support/IgniteRepositoryFactory.java b/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/support/IgniteRepositoryFactory.java
index bceee1f..de2549f 100644
--- a/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/support/IgniteRepositoryFactory.java
+++ b/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/support/IgniteRepositoryFactory.java
@@ -153,11 +153,11 @@ public class IgniteRepositoryFactory extends RepositoryFactorySupport {
}
/**
- * @param s
- * @return
+ * @param qry Query string.
+ * @return {@code true} if query is SQLFieldsQuery.
*/
- private boolean isFieldQuery(String s) {
- return s.matches("^SELECT.*") && !s.matches("^SELECT\\s+(?:\\w+\\.)?+\\*.*");
+ private boolean isFieldQuery(String qry) {
+ return qry.matches("^SELECT.*") && !qry.matches("^SELECT\\s+(?:\\w+\\.)?+\\*.*");
}
}
[42/67] [abbrv] ignite git commit: IGNITE-5081 - Removed redundant
duplication of permissions in SecurityPermissionSetBuilder
Posted by sb...@apache.org.
IGNITE-5081 - Removed redundant duplication of permissions in SecurityPermissionSetBuilder
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/56ec9951
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/56ec9951
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/56ec9951
Branch: refs/heads/ignite-5075
Commit: 56ec995199d12c3b257e77cb49296dc747bc7a93
Parents: 2f7172c
Author: Valentin Kulichenko <va...@gmail.com>
Authored: Fri Apr 28 14:48:57 2017 +0200
Committer: Valentin Kulichenko <va...@ing.be>
Committed: Tue May 2 12:59:53 2017 +0200
----------------------------------------------------------------------
.../security/SecurityPermissionSetBuilder.java | 17 +++---
.../SecurityPermissionSetBuilderTest.java | 63 ++++++++++++--------
2 files changed, 46 insertions(+), 34 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/56ec9951/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermissionSetBuilder.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermissionSetBuilder.java b/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermissionSetBuilder.java
index cf38c0f..abac541 100644
--- a/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermissionSetBuilder.java
+++ b/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermissionSetBuilder.java
@@ -17,16 +17,17 @@
package org.apache.ignite.plugin.security;
-import java.util.Map;
-import java.util.List;
-import java.util.HashMap;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
import org.apache.ignite.IgniteException;
+import org.apache.ignite.internal.util.typedef.internal.U;
-import static java.util.Collections.unmodifiableList;
import static java.util.Collections.unmodifiableMap;
+import static java.util.Collections.unmodifiableSet;
/**
* Provides a convenient way to create a permission set.
@@ -61,7 +62,7 @@ public class SecurityPermissionSetBuilder {
private Map<String, Collection<SecurityPermission>> srvcPerms = new HashMap<>();
/** System permissions.*/
- private List<SecurityPermission> sysPerms = new ArrayList<>();
+ private Set<SecurityPermission> sysPerms = new HashSet<>();
/** Default allow all.*/
private boolean dfltAllowAll;
@@ -193,7 +194,7 @@ public class SecurityPermissionSetBuilder {
private final <T> Collection<T> toCollection(T... perms) {
assert perms != null;
- Collection<T> col = new ArrayList<>(perms.length);
+ Collection<T> col = U.newHashSet(perms.length);
Collections.addAll(col, perms);
@@ -234,7 +235,7 @@ public class SecurityPermissionSetBuilder {
permSet.setCachePermissions(unmodifiableMap(cachePerms));
permSet.setTaskPermissions(unmodifiableMap(taskPerms));
permSet.setServicePermissions(unmodifiableMap(srvcPerms));
- permSet.setSystemPermissions(unmodifiableList(sysPerms));
+ permSet.setSystemPermissions(unmodifiableSet(sysPerms));
return permSet;
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/56ec9951/modules/core/src/test/java/org/apache/ignite/plugin/security/SecurityPermissionSetBuilderTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/plugin/security/SecurityPermissionSetBuilderTest.java b/modules/core/src/test/java/org/apache/ignite/plugin/security/SecurityPermissionSetBuilderTest.java
index 5443cfd..0ac7bc7 100644
--- a/modules/core/src/test/java/org/apache/ignite/plugin/security/SecurityPermissionSetBuilderTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/plugin/security/SecurityPermissionSetBuilderTest.java
@@ -17,23 +17,24 @@
package org.apache.ignite.plugin.security;
-import java.util.Map;
-import java.util.Arrays;
-import java.util.HashMap;
import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
import java.util.concurrent.Callable;
import org.apache.ignite.IgniteException;
+import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import static org.apache.ignite.plugin.security.SecurityPermission.ADMIN_VIEW;
import static org.apache.ignite.plugin.security.SecurityPermission.CACHE_PUT;
import static org.apache.ignite.plugin.security.SecurityPermission.CACHE_READ;
import static org.apache.ignite.plugin.security.SecurityPermission.CACHE_REMOVE;
import static org.apache.ignite.plugin.security.SecurityPermission.SERVICE_DEPLOY;
import static org.apache.ignite.plugin.security.SecurityPermission.SERVICE_INVOKE;
+import static org.apache.ignite.plugin.security.SecurityPermission.EVENTS_ENABLE;
import static org.apache.ignite.plugin.security.SecurityPermission.TASK_CANCEL;
import static org.apache.ignite.plugin.security.SecurityPermission.TASK_EXECUTE;
-import static org.apache.ignite.plugin.security.SecurityPermission.EVENTS_ENABLE;
-import static org.apache.ignite.plugin.security.SecurityPermission.ADMIN_VIEW;
import static org.apache.ignite.testframework.GridTestUtils.assertThrows;
/**
@@ -41,31 +42,30 @@ import static org.apache.ignite.testframework.GridTestUtils.assertThrows;
*/
public class SecurityPermissionSetBuilderTest extends GridCommonAbstractTest {
/**
- *
*/
@SuppressWarnings({"ThrowableNotThrown", "ArraysAsListWithZeroOrOneArgument"})
public void testPermissionBuilder() {
SecurityBasicPermissionSet exp = new SecurityBasicPermissionSet();
Map<String, Collection<SecurityPermission>> permCache = new HashMap<>();
- permCache.put("cache1", Arrays.asList(CACHE_PUT, CACHE_REMOVE));
- permCache.put("cache2", Arrays.asList(CACHE_READ));
+ permCache.put("cache1", permissions(CACHE_PUT, CACHE_REMOVE));
+ permCache.put("cache2", permissions(CACHE_READ));
exp.setCachePermissions(permCache);
Map<String, Collection<SecurityPermission>> permTask = new HashMap<>();
- permTask.put("task1", Arrays.asList(TASK_CANCEL));
- permTask.put("task2", Arrays.asList(TASK_EXECUTE));
+ permTask.put("task1", permissions(TASK_CANCEL));
+ permTask.put("task2", permissions(TASK_EXECUTE));
exp.setTaskPermissions(permTask);
Map<String, Collection<SecurityPermission>> permSrvc = new HashMap<>();
- permSrvc.put("service1", Arrays.asList(SERVICE_DEPLOY));
- permSrvc.put("service2", Arrays.asList(SERVICE_INVOKE));
+ permSrvc.put("service1", permissions(SERVICE_DEPLOY));
+ permSrvc.put("service2", permissions(SERVICE_INVOKE));
exp.setServicePermissions(permSrvc);
- exp.setSystemPermissions(Arrays.asList(ADMIN_VIEW, EVENTS_ENABLE));
+ exp.setSystemPermissions(permissions(ADMIN_VIEW, EVENTS_ENABLE));
final SecurityPermissionSetBuilder permsBuilder = new SecurityPermissionSetBuilder();
@@ -105,19 +105,18 @@ public class SecurityPermissionSetBuilderTest extends GridCommonAbstractTest {
"you can assign permission only start with [EVENTS_, ADMIN_], but you try SERVICE_INVOKE"
);
- permsBuilder.appendCachePermissions(
- "cache1", CACHE_PUT, CACHE_REMOVE
- ).appendCachePermissions(
- "cache2", CACHE_READ
- ).appendTaskPermissions(
- "task1", TASK_CANCEL
- ).appendTaskPermissions(
- "task2", TASK_EXECUTE
- ).appendServicePermissions(
- "service1", SERVICE_DEPLOY
- ).appendServicePermissions(
- "service2", SERVICE_INVOKE
- ).appendSystemPermissions(ADMIN_VIEW, EVENTS_ENABLE);
+ permsBuilder
+ .appendCachePermissions("cache1", CACHE_PUT)
+ .appendCachePermissions("cache1", CACHE_PUT, CACHE_REMOVE)
+ .appendCachePermissions("cache2", CACHE_READ)
+ .appendTaskPermissions("task1", TASK_CANCEL)
+ .appendTaskPermissions("task2", TASK_EXECUTE)
+ .appendTaskPermissions("task2", TASK_EXECUTE)
+ .appendServicePermissions("service1", SERVICE_DEPLOY)
+ .appendServicePermissions("service2", SERVICE_INVOKE)
+ .appendServicePermissions("service2", SERVICE_INVOKE)
+ .appendSystemPermissions(ADMIN_VIEW)
+ .appendSystemPermissions(ADMIN_VIEW, EVENTS_ENABLE);
SecurityPermissionSet actual = permsBuilder.build();
@@ -127,4 +126,16 @@ public class SecurityPermissionSetBuilderTest extends GridCommonAbstractTest {
assertEquals(exp.systemPermissions(), actual.systemPermissions());
assertEquals(exp.defaultAllowAll(), actual.defaultAllowAll());
}
+
+ /**
+ * @param perms Permissions.
+ * @return Collection.
+ */
+ private static Collection<SecurityPermission> permissions(SecurityPermission... perms) {
+ Collection<SecurityPermission> col = U.newHashSet(perms.length);
+
+ Collections.addAll(col, perms);
+
+ return col;
+ }
}
[41/67] [abbrv] ignite git commit: IGNITE-5080 - Fixes in
SecurityBasicPermissionSet
Posted by sb...@apache.org.
IGNITE-5080 - Fixes in SecurityBasicPermissionSet
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/2f7172cb
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/2f7172cb
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/2f7172cb
Branch: refs/heads/ignite-5075
Commit: 2f7172cb5c7af8e61cba00d6ec5e4d6f76b635e4
Parents: eb6a169
Author: Valentin Kulichenko <va...@gmail.com>
Authored: Fri Apr 28 14:53:33 2017 +0200
Committer: Valentin Kulichenko <va...@ing.be>
Committed: Tue May 2 12:55:37 2017 +0200
----------------------------------------------------------------------
.../security/SecurityBasicPermissionSet.java | 89 ++++++++++++++------
1 file changed, 65 insertions(+), 24 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/2f7172cb/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityBasicPermissionSet.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityBasicPermissionSet.java b/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityBasicPermissionSet.java
index 7521dff..44166d9 100644
--- a/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityBasicPermissionSet.java
+++ b/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityBasicPermissionSet.java
@@ -17,10 +17,12 @@
package org.apache.ignite.plugin.security;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.ArrayList;
import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.ignite.internal.util.tostring.GridToStringInclude;
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.internal.A;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.jetbrains.annotations.Nullable;
@@ -33,16 +35,20 @@ public class SecurityBasicPermissionSet implements SecurityPermissionSet {
private static final long serialVersionUID = 0L;
/** Cache permissions. */
- private Map<String, Collection<SecurityPermission>> cachePerms = new HashMap<>();
+ @GridToStringInclude
+ private Map<String, Collection<SecurityPermission>> cachePermissions = new HashMap<>();
/** Task permissions. */
- private Map<String, Collection<SecurityPermission>> taskPerms = new HashMap<>();
+ @GridToStringInclude
+ private Map<String, Collection<SecurityPermission>> taskPermissions = new HashMap<>();
/** Service permissions. */
- private Map<String, Collection<SecurityPermission>> srvcPerms = new HashMap<>();
+ @GridToStringInclude
+ private Map<String, Collection<SecurityPermission>> servicePermissions = new HashMap<>();
/** System permissions. */
- private Collection<SecurityPermission> sysPerms = new ArrayList<>();
+ @GridToStringInclude
+ private Collection<SecurityPermission> systemPermissions;
/** Default allow all. */
private boolean dfltAllowAll;
@@ -50,37 +56,43 @@ public class SecurityBasicPermissionSet implements SecurityPermissionSet {
/**
* Setter for set cache permission map.
*
- * @param cachePerms Cache permissions.
+ * @param cachePermissions Cache permissions.
*/
- public void setCachePermissions(Map<String, Collection<SecurityPermission>> cachePerms) {
- this.cachePerms = cachePerms;
+ public void setCachePermissions(Map<String, Collection<SecurityPermission>> cachePermissions) {
+ A.notNull(cachePermissions, "cachePermissions");
+
+ this.cachePermissions = cachePermissions;
}
/**
* Setter for set task permission map.
*
- * @param taskPerms Task permissions.
+ * @param taskPermissions Task permissions.
*/
- public void setTaskPermissions(Map<String, Collection<SecurityPermission>> taskPerms) {
- this.taskPerms = taskPerms;
+ public void setTaskPermissions(Map<String, Collection<SecurityPermission>> taskPermissions) {
+ A.notNull(taskPermissions, "taskPermissions");
+
+ this.taskPermissions = taskPermissions;
}
/**
* Setter for set service permission map.
*
- * @param srvcPerms Service permissions.
+ * @param servicePermissions Service permissions.
*/
- public void setServicePermissions(Map<String, Collection<SecurityPermission>> srvcPerms) {
- this.srvcPerms = srvcPerms;
+ public void setServicePermissions(Map<String, Collection<SecurityPermission>> servicePermissions) {
+ A.notNull(taskPermissions, "servicePermissions");
+
+ this.servicePermissions = servicePermissions;
}
/**
- * Setter for set collection system permission.
+ * Setter for set collection system permission.
*
- * @param sysPerms System permissions.
+ * @param systemPermissions System permissions.
*/
- public void setSystemPermissions(Collection<SecurityPermission> sysPerms) {
- this.sysPerms = sysPerms;
+ public void setSystemPermissions(Collection<SecurityPermission> systemPermissions) {
+ this.systemPermissions = systemPermissions;
}
/**
@@ -94,22 +106,22 @@ public class SecurityBasicPermissionSet implements SecurityPermissionSet {
/** {@inheritDoc} */
@Override public Map<String, Collection<SecurityPermission>> cachePermissions() {
- return cachePerms;
+ return cachePermissions;
}
/** {@inheritDoc} */
@Override public Map<String, Collection<SecurityPermission>> taskPermissions() {
- return taskPerms;
+ return taskPermissions;
}
/** {@inheritDoc} */
@Override public Map<String, Collection<SecurityPermission>> servicePermissions() {
- return srvcPerms;
+ return servicePermissions;
}
/** {@inheritDoc} */
@Nullable @Override public Collection<SecurityPermission> systemPermissions() {
- return sysPerms;
+ return systemPermissions;
}
/** {@inheritDoc} */
@@ -118,6 +130,35 @@ public class SecurityBasicPermissionSet implements SecurityPermissionSet {
}
/** {@inheritDoc} */
+ @Override public boolean equals(Object o) {
+ if (this == o)
+ return true;
+
+ if (!(o instanceof SecurityBasicPermissionSet))
+ return false;
+
+ SecurityBasicPermissionSet other = (SecurityBasicPermissionSet)o;
+
+ return dfltAllowAll == other.dfltAllowAll &&
+ F.eq(cachePermissions, other.cachePermissions) &&
+ F.eq(taskPermissions, other.taskPermissions) &&
+ F.eq(servicePermissions, other.servicePermissions) &&
+ F.eq(systemPermissions, other.systemPermissions);
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ int res = (dfltAllowAll ? 1 : 0);
+
+ res = 31 * res + (cachePermissions != null ? cachePermissions.hashCode() : 0);
+ res = 31 * res + (taskPermissions != null ? taskPermissions.hashCode() : 0);
+ res = 31 * res + (servicePermissions != null ? servicePermissions.hashCode() : 0);
+ res = 31 * res + (systemPermissions != null ? systemPermissions.hashCode() : 0);
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
@Override public String toString() {
return S.toString(SecurityBasicPermissionSet.class, this);
}
[37/67] [abbrv] ignite git commit: IGNITE-4082 Fixed tests runner.
Posted by sb...@apache.org.
IGNITE-4082 Fixed tests runner.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/25f0f75d
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/25f0f75d
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/25f0f75d
Branch: refs/heads/ignite-5075
Commit: 25f0f75df2541c164b4164e6430f50f52abd5c92
Parents: 6236b5f
Author: Ilya Borisov <kl...@gmail.com>
Authored: Fri Apr 28 17:04:59 2017 +0700
Committer: Alexey Kuznetsov <ak...@apache.org>
Committed: Fri Apr 28 17:04:59 2017 +0700
----------------------------------------------------------------------
modules/web-console/frontend/test/karma.conf.babel.js | 6 ++++++
1 file changed, 6 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/25f0f75d/modules/web-console/frontend/test/karma.conf.babel.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/test/karma.conf.babel.js b/modules/web-console/frontend/test/karma.conf.babel.js
index 992c4d0..aa6b11c 100644
--- a/modules/web-console/frontend/test/karma.conf.babel.js
+++ b/modules/web-console/frontend/test/karma.conf.babel.js
@@ -20,6 +20,12 @@ import path from 'path';
const basePath = path.resolve('./');
+// Webpack chunk plugin has to be removed during test runs due to incompatibility issues,
+// otherwise tests would not run at all.
+// https://github.com/webpack-contrib/karma-webpack/issues/24#issuecomment-257613167
+const chunkPluginIndex = webpack.plugins.findIndex((plugin) => plugin.chunkNames);
+webpack.plugins.splice(chunkPluginIndex, 1);
+
export default (config) => {
config.set({
// Base path that will be used to resolve all patterns (eg. files, exclude).
[11/67] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math
module to Ignite ML module added missed licenses renamed packages fixed wrong
ml profile activation (cherry picked from commit d78e071)
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/resources/org/apache/ignite/math/d3-matrix-template.html
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/resources/org/apache/ignite/math/d3-matrix-template.html b/modules/ml/src/main/resources/org/apache/ignite/math/d3-matrix-template.html
deleted file mode 100644
index 19a907a..0000000
--- a/modules/ml/src/main/resources/org/apache/ignite/math/d3-matrix-template.html
+++ /dev/null
@@ -1,128 +0,0 @@
-<!DOCTYPE html>
-<!--
- 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.
--->
-<meta charset="utf-8">
-<title>IgniteML</title>
-<style>
- body {
- margin: 0 15px;
- }
-
- p {
- margin: 10px 0 !important;
- }
-
- .name {
- font-size: 20px;
- font-weight: 400;
- font-family: monospace;
- }
-
- .swatch {
- display: inline-block;
- width: 25px;
- height: 25px;
- margin-left: 5px;
- vertical-align: bottom;
- }
-</style>
-<body>
-<img style="margin-top: 15px" width="100px" src="https://ignite.apache.org/images/logo3.png">
-<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.5.0/d3.min.js"></script>
-<script>
- /*@DATA@*/
- var data = [[{d: 2.256, r: 198, g: 128, b: 128}, {d: 0.123, r: 218, g: 228, b: 18}], [{
- d: 2.256,
- r: 108,
- g: 28,
- b: 108
- }, {d: 0.123, r: 228, g: 228, b: 228}]];
- /*@MAX@*/
- var max = {d: 2.256, r: 128, g: 128, b: 128};
- /*@MIN@*/
- var min = {d: 0.123, r: 228, g: 228, b: 228};
- /*@NAME@*/
- var name = "Matrix";
-
- var rows = data.length;
- var cols = data[0].length;
-
- var range = max.d - min.d;
-
- var rw, rh;
- var W, H;
-
- if (cols > W) {
- rw = 1;
- W = cols;
- }
- else {
- W = 1000;
- rw = Math.min(Math.round(W / cols), 10);
- }
-
- if (rows > H) {
- rh = 1;
- H = rows;
- }
- else {
- H = 1000;
- rh = Math.min(Math.round(H / rows), 10);
- }
-
- d3.selectAll("body")
- .append("p")
- .text(name + " (" + rows + "x" + cols + ")")
- .attr("class", "name");
-
- d3.selectAll("body")
- .append("p")
- .attr("class", "name")
- .text("Max: " + max.d)
- .append("span")
- .attr("class", "swatch")
- .attr("style", "background-color: rgb(" + max.r + ", " + max.g + ", " + max.b + ")");
-
- d3.selectAll("body")
- .append("p")
- .attr("class", "name")
- .text("Min: " + min.d)
- .append("span")
- .attr("class", "swatch")
- .attr("style", "background-color: rgb(" + min.r + ", " + min.g + ", " + min.b + ")");
-
- var svg = d3.select("body").append("svg")
- .attr("width", W)
- .attr("height", H);
-
- var y = 0;
-
- for (var row = 0; row < rows; row++)
- svg.selectAll("div")
- .data(data[row])
- .enter()
- .append("rect")
- .attr("x", function (d, i) {
- return i * rw
- })
- .attr("y", rh * row)
- .attr("fill", function (d) {
- return "rgb(" + d.r + ", " + d.g + ", " + d.b + ")";
- })
- .attr("width", rw)
- .attr("height", rh);
-</script>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/resources/org/apache/ignite/math/d3-vector-template.html
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/resources/org/apache/ignite/math/d3-vector-template.html b/modules/ml/src/main/resources/org/apache/ignite/math/d3-vector-template.html
deleted file mode 100644
index 7644481..0000000
--- a/modules/ml/src/main/resources/org/apache/ignite/math/d3-vector-template.html
+++ /dev/null
@@ -1,111 +0,0 @@
-<!DOCTYPE html>
-<!--
- 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.
--->
-<meta charset="utf-8">
-<title>IgniteML</title>
-<style>
- body {
- margin: 0 15px;
- }
-
- p {
- margin: 10px 0 !important;
- }
-
- .name {
- font-size: 20px;
- font-weight: 400;
- font-family: monospace;
- }
-
- .swatch {
- display: inline-block;
- width: 25px;
- height: 25px;
- margin-left: 5px;
- vertical-align: bottom;
- }
-</style>
-<body>
-<img style="margin-top: 15px" width="100px" src="https://ignite.apache.org/images/logo3.png">
-<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.5.0/d3.min.js"></script>
-<script>
- /*@DATA@*/
- var data = [{d: 2.256, r: 128, g: 128, b: 128}, {d: 0.123, r: 228, g: 228, b: 228}];
- /*@MAX@*/
- var max = {d: 2.256, r: 128, g: 128, b: 128};
- /*@MIN@*/
- var min = {d: 0.123, r: 228, g: 228, b: 228};
- /*@NAME@*/
- var name = "Vector";
-
- var W, H = 1000;
-
- var range = max.d - min.d;
-
- var rh = 20; // Constant.
-
- var rw;
-
- if (data.length > W) {
- rw = 1;
- W = data.length;
- }
- else {
- W = 1000;
- rw = Math.min(Math.round(W / data.length), 5);
- }
-
- d3.selectAll("body")
- .append("p")
- .text(name + " (size: " + data.length + ")")
- .attr("class", "name");
-
- d3.selectAll("body")
- .append("p")
- .attr("class", "name")
- .text("Max: " + max.d)
- .append("span")
- .attr("class", "swatch")
- .attr("style", "background-color: rgb(" + max.r + ", " + max.g + ", " + max.b + ")");
-
- d3.selectAll("body")
- .append("p")
- .attr("class", "name")
- .text("Min: " + min.d)
- .append("span")
- .attr("class", "swatch")
- .attr("style", "background-color: rgb(" + min.r + ", " + min.g + ", " + min.b + ")");
-
- var svg = d3.select("body").append("svg")
- .attr("width", W)
- .attr("height", H);
-
- svg.selectAll("rect")
- .data(data)
- .enter()
- .append("rect")
- .attr("x", function (d, i) {
- return i * rw
- })
- .attr("y", 10)
- .attr("fill", function (d) {
- return "rgb(" + d.r + ", " + d.g + ", " + d.b + ")";
- })
- .attr("width", rw)
- .attr("height", rh);
-</script>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/resources/org/apache/ignite/ml/math/d3-matrix-template.html
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/resources/org/apache/ignite/ml/math/d3-matrix-template.html b/modules/ml/src/main/resources/org/apache/ignite/ml/math/d3-matrix-template.html
new file mode 100644
index 0000000..19a907a
--- /dev/null
+++ b/modules/ml/src/main/resources/org/apache/ignite/ml/math/d3-matrix-template.html
@@ -0,0 +1,128 @@
+<!DOCTYPE html>
+<!--
+ 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.
+-->
+<meta charset="utf-8">
+<title>IgniteML</title>
+<style>
+ body {
+ margin: 0 15px;
+ }
+
+ p {
+ margin: 10px 0 !important;
+ }
+
+ .name {
+ font-size: 20px;
+ font-weight: 400;
+ font-family: monospace;
+ }
+
+ .swatch {
+ display: inline-block;
+ width: 25px;
+ height: 25px;
+ margin-left: 5px;
+ vertical-align: bottom;
+ }
+</style>
+<body>
+<img style="margin-top: 15px" width="100px" src="https://ignite.apache.org/images/logo3.png">
+<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.5.0/d3.min.js"></script>
+<script>
+ /*@DATA@*/
+ var data = [[{d: 2.256, r: 198, g: 128, b: 128}, {d: 0.123, r: 218, g: 228, b: 18}], [{
+ d: 2.256,
+ r: 108,
+ g: 28,
+ b: 108
+ }, {d: 0.123, r: 228, g: 228, b: 228}]];
+ /*@MAX@*/
+ var max = {d: 2.256, r: 128, g: 128, b: 128};
+ /*@MIN@*/
+ var min = {d: 0.123, r: 228, g: 228, b: 228};
+ /*@NAME@*/
+ var name = "Matrix";
+
+ var rows = data.length;
+ var cols = data[0].length;
+
+ var range = max.d - min.d;
+
+ var rw, rh;
+ var W, H;
+
+ if (cols > W) {
+ rw = 1;
+ W = cols;
+ }
+ else {
+ W = 1000;
+ rw = Math.min(Math.round(W / cols), 10);
+ }
+
+ if (rows > H) {
+ rh = 1;
+ H = rows;
+ }
+ else {
+ H = 1000;
+ rh = Math.min(Math.round(H / rows), 10);
+ }
+
+ d3.selectAll("body")
+ .append("p")
+ .text(name + " (" + rows + "x" + cols + ")")
+ .attr("class", "name");
+
+ d3.selectAll("body")
+ .append("p")
+ .attr("class", "name")
+ .text("Max: " + max.d)
+ .append("span")
+ .attr("class", "swatch")
+ .attr("style", "background-color: rgb(" + max.r + ", " + max.g + ", " + max.b + ")");
+
+ d3.selectAll("body")
+ .append("p")
+ .attr("class", "name")
+ .text("Min: " + min.d)
+ .append("span")
+ .attr("class", "swatch")
+ .attr("style", "background-color: rgb(" + min.r + ", " + min.g + ", " + min.b + ")");
+
+ var svg = d3.select("body").append("svg")
+ .attr("width", W)
+ .attr("height", H);
+
+ var y = 0;
+
+ for (var row = 0; row < rows; row++)
+ svg.selectAll("div")
+ .data(data[row])
+ .enter()
+ .append("rect")
+ .attr("x", function (d, i) {
+ return i * rw
+ })
+ .attr("y", rh * row)
+ .attr("fill", function (d) {
+ return "rgb(" + d.r + ", " + d.g + ", " + d.b + ")";
+ })
+ .attr("width", rw)
+ .attr("height", rh);
+</script>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/resources/org/apache/ignite/ml/math/d3-vector-template.html
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/resources/org/apache/ignite/ml/math/d3-vector-template.html b/modules/ml/src/main/resources/org/apache/ignite/ml/math/d3-vector-template.html
new file mode 100644
index 0000000..7644481
--- /dev/null
+++ b/modules/ml/src/main/resources/org/apache/ignite/ml/math/d3-vector-template.html
@@ -0,0 +1,111 @@
+<!DOCTYPE html>
+<!--
+ 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.
+-->
+<meta charset="utf-8">
+<title>IgniteML</title>
+<style>
+ body {
+ margin: 0 15px;
+ }
+
+ p {
+ margin: 10px 0 !important;
+ }
+
+ .name {
+ font-size: 20px;
+ font-weight: 400;
+ font-family: monospace;
+ }
+
+ .swatch {
+ display: inline-block;
+ width: 25px;
+ height: 25px;
+ margin-left: 5px;
+ vertical-align: bottom;
+ }
+</style>
+<body>
+<img style="margin-top: 15px" width="100px" src="https://ignite.apache.org/images/logo3.png">
+<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.5.0/d3.min.js"></script>
+<script>
+ /*@DATA@*/
+ var data = [{d: 2.256, r: 128, g: 128, b: 128}, {d: 0.123, r: 228, g: 228, b: 228}];
+ /*@MAX@*/
+ var max = {d: 2.256, r: 128, g: 128, b: 128};
+ /*@MIN@*/
+ var min = {d: 0.123, r: 228, g: 228, b: 228};
+ /*@NAME@*/
+ var name = "Vector";
+
+ var W, H = 1000;
+
+ var range = max.d - min.d;
+
+ var rh = 20; // Constant.
+
+ var rw;
+
+ if (data.length > W) {
+ rw = 1;
+ W = data.length;
+ }
+ else {
+ W = 1000;
+ rw = Math.min(Math.round(W / data.length), 5);
+ }
+
+ d3.selectAll("body")
+ .append("p")
+ .text(name + " (size: " + data.length + ")")
+ .attr("class", "name");
+
+ d3.selectAll("body")
+ .append("p")
+ .attr("class", "name")
+ .text("Max: " + max.d)
+ .append("span")
+ .attr("class", "swatch")
+ .attr("style", "background-color: rgb(" + max.r + ", " + max.g + ", " + max.b + ")");
+
+ d3.selectAll("body")
+ .append("p")
+ .attr("class", "name")
+ .text("Min: " + min.d)
+ .append("span")
+ .attr("class", "swatch")
+ .attr("style", "background-color: rgb(" + min.r + ", " + min.g + ", " + min.b + ")");
+
+ var svg = d3.select("body").append("svg")
+ .attr("width", W)
+ .attr("height", H);
+
+ svg.selectAll("rect")
+ .data(data)
+ .enter()
+ .append("rect")
+ .attr("x", function (d, i) {
+ return i * rw
+ })
+ .attr("y", 10)
+ .attr("fill", function (d) {
+ return "rgb(" + d.r + ", " + d.g + ", " + d.b + ")";
+ })
+ .attr("width", rw)
+ .attr("height", rh);
+</script>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/ExternalizeTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/ExternalizeTest.java b/modules/ml/src/test/java/org/apache/ignite/math/ExternalizeTest.java
deleted file mode 100644
index 218b7ff..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/ExternalizeTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * 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.ignite.math;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.Externalizable;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import org.apache.ignite.math.impls.MathTestConstants;
-import org.junit.Test;
-
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-/**
- * Common test for externalization.
- */
-public abstract class ExternalizeTest<T extends Externalizable & Destroyable> {
- /** */
- protected void externalizeTest(T initObj) {
- T objRestored = null;
-
- try {
- ByteArrayOutputStream byteArrOutputStream = new ByteArrayOutputStream();
- ObjectOutputStream objOutputStream = new ObjectOutputStream(byteArrOutputStream);
-
- objOutputStream.writeObject(initObj);
-
- ByteArrayInputStream byteArrInputStream = new ByteArrayInputStream(byteArrOutputStream.toByteArray());
- ObjectInputStream objInputStream = new ObjectInputStream(byteArrInputStream);
-
- objRestored = (T)objInputStream.readObject();
-
- assertTrue(MathTestConstants.VAL_NOT_EQUALS, initObj.equals(objRestored));
- assertTrue(MathTestConstants.VAL_NOT_EQUALS, Integer.compare(initObj.hashCode(), objRestored.hashCode()) == 0);
- }
- catch (ClassNotFoundException | IOException e) {
- fail(e + " [" + e.getMessage() + "]");
- }
- finally {
- if (objRestored != null)
- objRestored.destroy();
- }
- }
-
- /** */
- @Test
- public abstract void externalizeTest();
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/MathImplDistributedTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/MathImplDistributedTestSuite.java b/modules/ml/src/test/java/org/apache/ignite/math/MathImplDistributedTestSuite.java
deleted file mode 100644
index 318ea95..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/MathImplDistributedTestSuite.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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.ignite.math;
-
-import org.apache.ignite.math.impls.matrix.CacheMatrixTest;
-import org.apache.ignite.math.impls.matrix.SparseDistributedMatrixTest;
-import org.apache.ignite.math.impls.storage.matrix.SparseDistributedMatrixStorageTest;
-import org.apache.ignite.math.impls.vector.CacheVectorTest;
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-
-/**
- * Test suite for all distributed tests located in org.apache.ignite.math.impls.* package.
- */
-@RunWith(Suite.class)
-@Suite.SuiteClasses({
- CacheVectorTest.class,
- CacheMatrixTest.class,
- SparseDistributedMatrixStorageTest.class,
- SparseDistributedMatrixTest.class,
-})
-public class MathImplDistributedTestSuite {
- // No-op.
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/MathImplLocalTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/MathImplLocalTestSuite.java b/modules/ml/src/test/java/org/apache/ignite/math/MathImplLocalTestSuite.java
deleted file mode 100644
index a652e7f..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/MathImplLocalTestSuite.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * 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.ignite.math;
-
-import org.apache.ignite.math.decompositions.CholeskyDecompositionTest;
-import org.apache.ignite.math.decompositions.EigenDecompositionTest;
-import org.apache.ignite.math.decompositions.LUDecompositionTest;
-import org.apache.ignite.math.decompositions.QRDecompositionTest;
-import org.apache.ignite.math.decompositions.SingularValueDecompositionTest;
-import org.apache.ignite.math.impls.matrix.DenseLocalOffHeapMatrixConstructorTest;
-import org.apache.ignite.math.impls.matrix.DenseLocalOnHeapMatrixConstructorTest;
-import org.apache.ignite.math.impls.matrix.DiagonalMatrixTest;
-import org.apache.ignite.math.impls.matrix.FunctionMatrixConstructorTest;
-import org.apache.ignite.math.impls.matrix.MatrixAttributeTest;
-import org.apache.ignite.math.impls.matrix.MatrixImplementationsTest;
-import org.apache.ignite.math.impls.matrix.MatrixViewConstructorTest;
-import org.apache.ignite.math.impls.matrix.PivotedMatrixViewConstructorTest;
-import org.apache.ignite.math.impls.matrix.RandomMatrixConstructorTest;
-import org.apache.ignite.math.impls.matrix.SparseLocalOnHeapMatrixConstructorTest;
-import org.apache.ignite.math.impls.matrix.TransposedMatrixViewTest;
-import org.apache.ignite.math.impls.storage.matrix.MatrixArrayStorageTest;
-import org.apache.ignite.math.impls.storage.matrix.MatrixOffHeapStorageTest;
-import org.apache.ignite.math.impls.storage.matrix.MatrixStorageImplementationTest;
-import org.apache.ignite.math.impls.storage.vector.RandomAccessSparseVectorStorageTest;
-import org.apache.ignite.math.impls.storage.vector.SparseLocalOffHeapVectorStorageTest;
-import org.apache.ignite.math.impls.storage.vector.VectorArrayStorageTest;
-import org.apache.ignite.math.impls.storage.vector.VectorOffheapStorageTest;
-import org.apache.ignite.math.impls.vector.AbstractVectorTest;
-import org.apache.ignite.math.impls.vector.ConstantVectorConstructorTest;
-import org.apache.ignite.math.impls.vector.DelegatingVectorConstructorTest;
-import org.apache.ignite.math.impls.vector.DenseLocalOffHeapVectorConstructorTest;
-import org.apache.ignite.math.impls.vector.DenseLocalOnHeapVectorConstructorTest;
-import org.apache.ignite.math.impls.vector.FunctionVectorConstructorTest;
-import org.apache.ignite.math.impls.vector.MatrixVectorViewTest;
-import org.apache.ignite.math.impls.vector.PivotedVectorViewConstructorTest;
-import org.apache.ignite.math.impls.vector.RandomVectorConstructorTest;
-import org.apache.ignite.math.impls.vector.SingleElementVectorConstructorTest;
-import org.apache.ignite.math.impls.vector.SingleElementVectorViewConstructorTest;
-import org.apache.ignite.math.impls.vector.SparseLocalVectorConstructorTest;
-import org.apache.ignite.math.impls.vector.VectorAttributesTest;
-import org.apache.ignite.math.impls.vector.VectorFoldMapTest;
-import org.apache.ignite.math.impls.vector.VectorImplementationsTest;
-import org.apache.ignite.math.impls.vector.VectorIterableTest;
-import org.apache.ignite.math.impls.vector.VectorNormTest;
-import org.apache.ignite.math.impls.vector.VectorToMatrixTest;
-import org.apache.ignite.math.impls.vector.VectorViewTest;
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-
-/**
- * Test suite for all local tests located in org.apache.ignite.math.impls.* package.
- */
-@RunWith(Suite.class)
-@Suite.SuiteClasses({
- // Vector constructors tests.
- DenseLocalOnHeapVectorConstructorTest.class,
- DenseLocalOffHeapVectorConstructorTest.class,
- SparseLocalVectorConstructorTest.class,
- RandomVectorConstructorTest.class,
- ConstantVectorConstructorTest.class,
- FunctionVectorConstructorTest.class,
- SingleElementVectorConstructorTest.class,
- PivotedVectorViewConstructorTest.class,
- SingleElementVectorViewConstructorTest.class,
- DelegatingVectorConstructorTest.class,
- // Various vectors tests.
- AbstractVectorTest.class,
- VectorImplementationsTest.class,
- VectorViewTest.class,
- MatrixVectorViewTest.class,
- // Vector particular features tests.
- VectorIterableTest.class,
- VectorAttributesTest.class,
- VectorToMatrixTest.class,
- VectorNormTest.class,
- VectorFoldMapTest.class,
- // Vector storage tests
- VectorArrayStorageTest.class,
- VectorOffheapStorageTest.class,
- RandomAccessSparseVectorStorageTest.class,
- SparseLocalOffHeapVectorStorageTest.class,
- // Matrix storage tests.
- MatrixStorageImplementationTest.class,
- MatrixOffHeapStorageTest.class,
- MatrixArrayStorageTest.class,
- // Matrix constructors tests.
- DenseLocalOnHeapMatrixConstructorTest.class,
- DenseLocalOffHeapMatrixConstructorTest.class,
- RandomMatrixConstructorTest.class,
- FunctionMatrixConstructorTest.class,
- MatrixViewConstructorTest.class,
- PivotedMatrixViewConstructorTest.class,
- SparseLocalOnHeapMatrixConstructorTest.class,
- // Matrix tests.
- MatrixImplementationsTest.class,
- DiagonalMatrixTest.class,
- MatrixAttributeTest.class,
- TransposedMatrixViewTest.class,
- // Decomposes
- LUDecompositionTest.class,
- EigenDecompositionTest.class,
- CholeskyDecompositionTest.class,
- QRDecompositionTest.class,
- SingularValueDecompositionTest.class
-})
-public class MathImplLocalTestSuite {
- // No-op.
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/MathImplMainTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/MathImplMainTestSuite.java b/modules/ml/src/test/java/org/apache/ignite/math/MathImplMainTestSuite.java
deleted file mode 100644
index 44fa8e6..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/MathImplMainTestSuite.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.ignite.math;
-
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-
-/**
- * Test suite for local and distributed tests
- */
-@RunWith(Suite.class)
-@Suite.SuiteClasses({
- MathImplLocalTestSuite.class,
- MathImplDistributedTestSuite.class
-})
-public class MathImplMainTestSuite {
- // No-op.
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/TracerTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/TracerTest.java b/modules/ml/src/test/java/org/apache/ignite/math/TracerTest.java
deleted file mode 100644
index 35d2f60..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/TracerTest.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * 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.ignite.math;
-
-import java.awt.Color;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.List;
-import java.util.Optional;
-import org.apache.ignite.math.impls.MathTestConstants;
-import org.apache.ignite.math.impls.matrix.DenseLocalOnHeapMatrix;
-import org.apache.ignite.math.impls.vector.DenseLocalOnHeapVector;
-import org.junit.Test;
-
-import static java.nio.file.Files.createTempFile;
-import static org.junit.Assert.assertEquals;
-
-/**
- * Tests for {@link Tracer}.
- */
-public class TracerTest {
- /** */ private static final String DEFAULT_FORMAT = "%.10f";
- /** */ private static final double DEFAULT_DELTA = 0.000000001d;
-
- /**
- * Color mapper that maps [0, 1] range into three distinct RGB segments.
- */
- private static final Tracer.ColorMapper COLOR_MAPPER = new Tracer.ColorMapper() {
- /** {@inheritDoc} */
- @Override public Color apply(Double d) {
- if (d <= 0.33)
- return Color.RED;
- else if (d <= 0.66)
- return Color.GREEN;
- else
- return Color.BLUE;
- }
- };
-
- /**
- * @param size Vector size.
- */
- private Vector makeRandomVector(int size) {
- DenseLocalOnHeapVector vec = new DenseLocalOnHeapVector(size);
-
- vec.assign((idx) -> Math.random());
-
- return vec;
- }
-
- /**
- * @param rows Amount of rows in matrix.
- * @param cols Amount of columns in matrix.
- */
- private Matrix makeRandomMatrix(int rows, int cols) {
- DenseLocalOnHeapMatrix mtx = new DenseLocalOnHeapMatrix(rows, cols);
-
- // Missing assign(f)?
- mtx.map((d) -> Math.random());
-
- return mtx;
- }
-
- /**
- *
- */
- @Test
- public void testAsciiVectorTracer() {
- Vector vec = makeRandomVector(20);
-
- Tracer.showAscii(vec);
- Tracer.showAscii(vec, "%2f");
- Tracer.showAscii(vec, "%.3g");
- }
-
- /**
- *
- */
- @Test
- public void testAsciiMatrixTracer() {
- Matrix mtx = makeRandomMatrix(10, 10);
-
- Tracer.showAscii(mtx);
- Tracer.showAscii(mtx, "%2f");
- Tracer.showAscii(mtx, "%.3g");
- }
-
- /**
- *
- */
- @Test
- public void testHtmlVectorTracer() throws IOException {
- Vector vec1 = makeRandomVector(1000);
-
- // Default color mapping.
- Tracer.showHtml(vec1);
-
- // Custom color mapping.
- Tracer.showHtml(vec1, COLOR_MAPPER);
-
- // Default color mapping with sorted vector.
- Tracer.showHtml(vec1.sort());
- }
-
- /**
- *
- */
- @Test
- public void testHtmlMatrixTracer() throws IOException {
- Matrix mtx1 = makeRandomMatrix(100, 100);
-
- // Custom color mapping.
- Tracer.showHtml(mtx1, COLOR_MAPPER);
-
- Matrix mtx2 = new DenseLocalOnHeapMatrix(100, 100);
-
- double MAX = (double)(mtx2.rowSize() * mtx2.columnSize());
-
- mtx2.assign((x, y) -> (double)(x * y) / MAX);
-
- Tracer.showHtml(mtx2);
- }
-
- /** */
- @Test
- public void testWriteVectorToCSVFile() throws IOException {
- DenseLocalOnHeapVector vector = new DenseLocalOnHeapVector(MathTestConstants.STORAGE_SIZE);
-
- for (int i = 0; i < vector.size(); i++)
- vector.set(i, Math.random());
-
- Path file = createTempFile("vector", ".csv");
-
- Tracer.saveAsCsv(vector, DEFAULT_FORMAT, file.toString());
-
- System.out.println("Vector exported: " + file.getFileName());
-
- List<String> strings = Files.readAllLines(file);
- Optional<String> reduce = strings.stream().reduce((s1, s2) -> s1 + s2);
- String[] csvVals = reduce.get().split(",");
-
- for (int i = 0; i < vector.size(); i++) {
- Double csvVal = Double.valueOf(csvVals[i]);
-
- assertEquals("Unexpected value.", csvVal, vector.get(i), DEFAULT_DELTA);
- }
-
- Files.deleteIfExists(file);
- }
-
- /** */
- @Test
- public void testWriteMatrixToCSVFile() throws IOException {
- DenseLocalOnHeapMatrix matrix = new DenseLocalOnHeapMatrix(MathTestConstants.STORAGE_SIZE, MathTestConstants.STORAGE_SIZE);
-
- for (int i = 0; i < matrix.rowSize(); i++)
- for (int j = 0; j < matrix.columnSize(); j++)
- matrix.set(i, j, Math.random());
-
- Path file = createTempFile("matrix", ".csv");
-
- Tracer.saveAsCsv(matrix, DEFAULT_FORMAT, file.toString());
-
- System.out.println("Matrix exported: " + file.getFileName());
-
- List<String> strings = Files.readAllLines(file);
- Optional<String> reduce = strings.stream().reduce((s1, s2) -> s1 + s2);
- String[] csvVals = reduce.get().split(",");
-
- for (int i = 0; i < matrix.rowSize(); i++)
- for (int j = 0; j < matrix.columnSize(); j++) {
- Double csvVal = Double.valueOf(csvVals[i * matrix.rowSize() + j]);
-
- assertEquals("Unexpected value.", csvVal, matrix.get(i, j), DEFAULT_DELTA);
- }
-
- Files.deleteIfExists(file);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/benchmark/MathBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/benchmark/MathBenchmark.java b/modules/ml/src/test/java/org/apache/ignite/math/benchmark/MathBenchmark.java
deleted file mode 100644
index 4c3718a..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/benchmark/MathBenchmark.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * 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.ignite.math.benchmark;
-
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.Locale;
-import java.util.TimeZone;
-
-/** Refer {@link MathBenchmarkSelfTest} for usage examples. */
-class MathBenchmark {
- /** */
- private final boolean outputToConsole;
-
- /** */
- private final String benchmarkName;
-
- /** */
- private final int measurementTimes;
-
- /** */
- private final int warmUpTimes;
-
- /** */
- private final String tag;
-
- /** */
- private final String comments;
-
- /** Constructor strictly for use within this class. */
- private MathBenchmark(String benchmarkName, boolean outputToConsole, int measurementTimes, int warmUpTimes,
- String tag, String comments) {
- this.benchmarkName = benchmarkName;
- this.outputToConsole = outputToConsole;
- this.measurementTimes = measurementTimes;
- this.warmUpTimes = warmUpTimes;
- this.tag = tag;
- this.comments = comments;
- validate();
- }
-
- /**
- * Benchmark with specified name and default parameters, in particular, default output file.
- *
- * @param benchmarkName name
- */
- MathBenchmark(String benchmarkName) {
- this(benchmarkName, false, 100, 1, "", "");
- }
-
- /**
- * Executes the code using config of this benchmark.
- *
- * @param code code to execute
- * @throws Exception if something goes wrong
- */
- void execute(BenchmarkCode code) throws Exception {
- System.out.println("Started benchmark [" + benchmarkName + "].");
-
- for (int cnt = 0; cnt < warmUpTimes; cnt++)
- code.call();
-
- final long start = System.currentTimeMillis();
-
- for (int cnt = 0; cnt < measurementTimes; cnt++)
- code.call();
-
- final long end = System.currentTimeMillis();
-
- writeResults(formatResults(start, end));
-
- System.out.println("Finished benchmark [" + benchmarkName + "].");
- }
-
- /**
- * Set optional output mode for using stdout.
- *
- * @return configured benchmark
- */
- MathBenchmark outputToConsole() {
- return new MathBenchmark(benchmarkName, true, measurementTimes, warmUpTimes, tag, comments);
- }
-
- /**
- * Set optional measurement times.
- *
- * @param param times
- * @return configured benchmark
- */
- MathBenchmark measurementTimes(int param) {
- return new MathBenchmark(benchmarkName, outputToConsole, param, warmUpTimes, tag, comments);
- }
-
- /**
- * Set optional warm-up times.
- *
- * @param param times
- * @return configured benchmark
- */
- MathBenchmark warmUpTimes(int param) {
- return new MathBenchmark(benchmarkName, outputToConsole, measurementTimes, param, tag, comments);
- }
-
- /**
- * Set optional tag to help filtering specific kind of benchmark results.
- *
- * @param param name
- * @return configured benchmark
- */
- MathBenchmark tag(String param) {
- return new MathBenchmark(benchmarkName, outputToConsole, measurementTimes, warmUpTimes, param, comments);
- }
-
- /**
- * Set optional comments.
- *
- * @param param name
- * @return configured benchmark
- */
- MathBenchmark comments(String param) {
- return new MathBenchmark(benchmarkName, outputToConsole, measurementTimes, warmUpTimes, tag, param);
- }
-
- /** */
- private void writeResults(String results) throws Exception {
- if (outputToConsole) {
- System.out.println(results);
-
- return;
- }
-
- new ResultsWriter().append(results);
- }
-
- /** */
- private String formatResults(long start, long end) {
- final String delim = ",";
-
- assert !formatDouble(1000_000_001.1).contains(delim) : "Formatted results contain [" + delim + "].";
-
- final String ts = formatTs(start);
-
- assert !ts.contains(delim) : "Formatted timestamp contains [" + delim + "].";
-
- return benchmarkName +
- delim +
- ts + // IMPL NOTE timestamp
- delim +
- formatDouble((double)(end - start) / measurementTimes) +
- delim +
- measurementTimes +
- delim +
- warmUpTimes +
- delim +
- tag +
- delim +
- comments;
- }
-
- /** */
- private String formatDouble(double val) {
- return String.format(Locale.US, "%f", val);
- }
-
- /** */
- private String formatTs(long ts) {
- final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
-
- sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
-
- return sdf.format(new Date(ts));
- }
-
- /** */
- private void validate() {
- if (benchmarkName == null || benchmarkName.isEmpty())
- throw new IllegalArgumentException("Invalid benchmark name: [" + benchmarkName + "].");
-
- if (measurementTimes < 1)
- throw new IllegalArgumentException("Invalid measurement times: [" + measurementTimes + "].");
- }
-
- /** */
- interface BenchmarkCode {
- // todo find out why Callable<Void> failed to work here
-
- /** */
- void call() throws Exception;
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/benchmark/MathBenchmarkSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/benchmark/MathBenchmarkSelfTest.java b/modules/ml/src/test/java/org/apache/ignite/math/benchmark/MathBenchmarkSelfTest.java
deleted file mode 100644
index 7a86461..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/benchmark/MathBenchmarkSelfTest.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * 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.ignite.math.benchmark;
-
-import org.junit.Ignore;
-import org.junit.Test;
-
-import static org.junit.Assert.assertTrue;
-
-/** */
-public class MathBenchmarkSelfTest {
- /** */
- @Test
- @Ignore("Benchmark tests are intended only for manual execution")
- public void demoTest() throws Exception {
- for (int i = 0; i < 2; i++)
- new MathBenchmark("demo test")
- .outputToConsole() // IMPL NOTE this is to write output into console instead of a file
- .tag(null) // IMPL NOTE try null for tag, expect it to be formatted reasonably
- .comments(null) // IMPL NOTE try null for comments, expect it to be formatted reasonably
- .execute(() -> {
- double seed = 1.1;
-
- for (int cnt = 0; cnt < 1000; cnt++) {
- seed = Math.pow(seed, 2);
-
- assertTrue(seed > 0);
- }
- });
- }
-
- /** */
- @Test
- @Ignore("Benchmark tests are intended only for manual execution")
- public void configTest() throws Exception {
- new MathBenchmark("demo config test")
- .outputToConsole()
- .measurementTimes(2)
- .warmUpTimes(0)
- .tag("demo tag")
- .comments("demo comments")
- .execute(() -> System.out.println("config test"));
- }
-
- /** */
- @Test(expected = IllegalArgumentException.class)
- @Ignore("Benchmark tests are intended only for manual execution")
- public void emptyNameTest() throws Exception {
- new MathBenchmark("")
- .outputToConsole()
- .measurementTimes(1)
- .warmUpTimes(1)
- .tag("empty name test tag")
- .comments("empty name test comments")
- .execute(() -> System.out.println("empty name test"));
- }
-
- /** */
- @Test(expected = IllegalArgumentException.class)
- @Ignore("Benchmark tests are intended only for manual execution")
- public void nullDropboxPathTest() throws Exception {
- new ResultsWriter(null, "whatever", "whatever");
- }
-
- /** */
- @Test(expected = IllegalArgumentException.class)
- @Ignore("Benchmark tests are intended only for manual execution")
- public void nullDropboxUrlTest() throws Exception {
- new ResultsWriter("whatever", null, "whatever");
- }
-
- /** */
- @Test(expected = IllegalArgumentException.class)
- @Ignore("Benchmark tests are intended only for manual execution")
- public void nullDropboxTokenTest() throws Exception {
- new ResultsWriter("whatever", "whatever", null);
- }
-
- /** */
- @Test(expected = IllegalArgumentException.class)
- @Ignore("Benchmark tests are intended only for manual execution")
- public void nullResultsTest() throws Exception {
- new ResultsWriter("whatever", "whatever", "whatever").append(null);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/benchmark/ResultsWriter.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/benchmark/ResultsWriter.java b/modules/ml/src/test/java/org/apache/ignite/math/benchmark/ResultsWriter.java
deleted file mode 100644
index aeec156..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/benchmark/ResultsWriter.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * 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.ignite.math.benchmark;
-
-import com.dropbox.core.DbxException;
-import com.dropbox.core.DbxRequestConfig;
-import com.dropbox.core.v2.DbxClientV2;
-import com.dropbox.core.v2.files.WriteMode;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.nio.file.StandardOpenOption;
-import java.util.UUID;
-
-/** */
-class ResultsWriter {
- /** */
- private static final String DROPBOX_PATH
- = "/benchmarks/math.benchmark.results.csv";
-
- /** */
- private static final String DROPBOX_URL
- = "https://www.dropbox.com/s/r7tcle31r7gaty8/math.benchmark.results.csv";
-
- /** */
- private static final String ACCESS_TOKEN
- = "1MMmQjEyzGAAAAAAAAAAfDFrQ6oBPPi4NX-iU_VrgmXB2JDXqRHGa125cTkkEQ0V";
-
- /** */
- private final String dropboxPath;
- /** */
- private final String dropboxUrl;
- /** */
- private final String accessTok;
-
- /** */
- ResultsWriter(String dropboxPath, String dropboxUrl, String accessTok) {
- this.dropboxPath = dropboxPath;
- this.dropboxUrl = dropboxUrl;
- this.accessTok = accessTok;
-
- if (dropboxPath == null || dropboxUrl == null || accessTok == null)
- throw new IllegalArgumentException("Neither of dropbox path, URL, access token can be null.");
- }
-
- /** **/
- ResultsWriter() {
- this(DROPBOX_PATH, DROPBOX_URL, ACCESS_TOKEN);
- }
-
- /** */
- void append(String res) throws DbxException, IOException {
- if (res == null)
- throw new IllegalArgumentException("benchmark result is null");
-
- if (dropboxPath == null) {
- System.out.println(res);
-
- return;
- }
-
- append(res, client());
- }
-
- /** */
- private void append(String res, DbxClientV2 client) throws DbxException, IOException {
- File tmp = createTmpFile();
-
- try (FileOutputStream out = new FileOutputStream(tmp)) {
- client.files().download(dropboxPath).download(out);
- }
-
- writeResults(res, tmp);
-
- try (FileInputStream in = new FileInputStream(tmp)) {
- client.files().uploadBuilder(dropboxPath).withMode(WriteMode.OVERWRITE).uploadAndFinish(in);
- }
-
- if (!tmp.delete())
- System.out.println("Failed to delete " + tmp.getAbsolutePath());
-
- System.out.println("Uploaded benchmark results to: " + dropboxUrl);
- }
-
- /** */
- private void writeResults(String res, File tmp) throws IOException {
- final String unixLineSeparator = "\n";
-
- try (final PrintWriter writer = new PrintWriter(Files.newBufferedWriter(Paths.get(tmp.toURI()),
- StandardOpenOption.APPEND, StandardOpenOption.CREATE))) {
- writer.write(res + unixLineSeparator);
- }
- }
-
- /** */
- private File createTmpFile() throws IOException {
- File tmp = File.createTempFile(UUID.randomUUID().toString(), ".csv");
-
- tmp.deleteOnExit();
-
- return tmp;
- }
-
- /** */
- private DbxClientV2 client() {
- return new DbxClientV2(DbxRequestConfig.newBuilder("dropbox/MathBenchmark").build(), accessTok);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/benchmark/VectorBenchmarkTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/benchmark/VectorBenchmarkTest.java b/modules/ml/src/test/java/org/apache/ignite/math/benchmark/VectorBenchmarkTest.java
deleted file mode 100644
index 1f7b204..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/benchmark/VectorBenchmarkTest.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * 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.ignite.math.benchmark;
-
-import java.util.function.BiConsumer;
-import java.util.function.Function;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.impls.vector.DenseLocalOffHeapVector;
-import org.apache.ignite.math.impls.vector.DenseLocalOnHeapVector;
-import org.junit.Ignore;
-import org.junit.Test;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-
-/** */
-public class VectorBenchmarkTest {
- // todo add benchmarks for other methods in Vector and for other types of Vector and Matrix
-
- /** */
- @Test
- @Ignore("Benchmark tests are intended only for manual execution")
- public void testDenseLocalOnHeapVector() throws Exception {
- benchmark("DenseLocalOnHeapVector basic mix", DenseLocalOnHeapVector::new, this::basicMix);
-
- benchmark("DenseLocalOnHeapVector fold map", DenseLocalOnHeapVector::new, this::foldMapMix);
- }
-
- /** */
- @Test
- @Ignore("Benchmark tests are intended only for manual execution")
- public void testDenseLocalOffHeapVector() throws Exception {
- benchmark("DenseLocalOffHeapVector basic mix", DenseLocalOffHeapVector::new, this::basicMix);
-
- benchmark("DenseLocalOffHeapVector fold map", DenseLocalOffHeapVector::new, this::foldMapMix);
- }
-
- /** */
- private void benchmark(String namePrefix, Function<Integer, Vector> constructor,
- BiConsumer<Integer, Function<Integer, Vector>> consumer) throws Exception {
- assertNotNull(namePrefix);
-
- new MathBenchmark(namePrefix + " small sizes").execute(() -> {
- for (int size : new int[] {2, 3, 4, 5, 6, 7})
- consumer.accept(size, constructor);
- });
-
- new MathBenchmark(namePrefix + " sizes powers of 2").execute(() -> {
- for (int power : new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14})
- consumer.accept(1 << power, constructor);
- });
-
- new MathBenchmark(namePrefix + " large sizes").execute(() -> {
- for (int power : new int[] {10, 12, 14, 16})
- for (int delta : new int[] {-1, 0, 1})
- consumer.accept((1 << power) + delta, constructor);
- });
-
- new MathBenchmark(namePrefix + " extra large sizes")
- .measurementTimes(10)
- .execute(() -> { // IMPL NOTE trying below with power 22 almost killed my IDEA and laptop
- for (int power : new int[] {17, 18, 19, 20, 21})
- for (int delta : new int[] {-1, 0}) // IMPL NOTE delta +1 is not intended for use here
- consumer.accept((1 << power) + delta, constructor);
- });
- }
-
- /** */
- private void basicMix(int size, Function<Integer, Vector> constructor) {
- final Vector v1 = constructor.apply(size), v2 = constructor.apply(size);
-
- for (int idx = 0; idx < size; idx++) {
- v1.set(idx, idx);
-
- v2.set(idx, size - idx);
- }
-
- assertNotNull(v1.sum());
-
- assertNotNull(v1.copy());
-
- assertFalse(v1.getLengthSquared() < 0);
-
- assertNotNull(v1.normalize());
-
- assertNotNull(v1.logNormalize());
-
- assertFalse(v1.getDistanceSquared(v2) < 0);
-
- assertNotNull(v1.divide(2));
-
- assertNotNull(v1.minus(v2));
-
- assertNotNull(v1.plus(v2));
-
- assertNotNull(v1.dot(v2));
-
- assertNotNull(v1.assign(v2));
-
- assertNotNull(v1.assign(1)); // IMPL NOTE this would better be last test for it sets all values the same
- }
-
- /** */
- private void foldMapMix(int size, Function<Integer, Vector> constructor) {
- final Vector v1 = constructor.apply(size), v2 = constructor.apply(size);
-
- for (int idx = 0; idx < size; idx++) {
- v1.set(idx, idx);
-
- v2.set(idx, size - idx);
- }
-
- assertNotNull(v1.map((val) -> (val + 1)));
-
- assertNotNull(v1.map(v2, (one, other) -> one + other / 2.0));
-
- assertNotNull(v1.map((val, val1) -> (val + val1), 2.0));
-
- assertNotNull(v1.foldMap((sum, val) -> (val + sum), (val) -> val, 0.0));
-
- assertNotNull(v1.foldMap(v2, (sum, val) -> (val + sum), (val1, val2) -> val1 + val2, 0.0));
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/benchmark/package-info.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/benchmark/package-info.java b/modules/ml/src/test/java/org/apache/ignite/math/benchmark/package-info.java
deleted file mode 100644
index cbf5d36..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/benchmark/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * 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.ignite.math.benchmark;
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/decompositions/CholeskyDecompositionTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/decompositions/CholeskyDecompositionTest.java b/modules/ml/src/test/java/org/apache/ignite/math/decompositions/CholeskyDecompositionTest.java
deleted file mode 100644
index fa311e0..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/decompositions/CholeskyDecompositionTest.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * 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.ignite.math.decompositions;
-
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.exceptions.CardinalityException;
-import org.apache.ignite.math.exceptions.NonPositiveDefiniteMatrixException;
-import org.apache.ignite.math.exceptions.NonSymmetricMatrixException;
-import org.apache.ignite.math.impls.matrix.DenseLocalOnHeapMatrix;
-import org.apache.ignite.math.impls.matrix.PivotedMatrixView;
-import org.apache.ignite.math.impls.vector.DenseLocalOnHeapVector;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-/** */
-public class CholeskyDecompositionTest {
- /** */
- @Test
- public void basicTest() {
- basicTest(new DenseLocalOnHeapMatrix(new double[][] {
- {2.0d, -1.0d, 0.0d},
- {-1.0d, 2.0d, -1.0d},
- {0.0d, -1.0d, 2.0d}
- }));
- }
-
- /**
- * Test for {@link DecompositionSupport} features.
- */
- @Test
- public void decompositionSupportTest() {
- basicTest(new PivotedMatrixView(new DenseLocalOnHeapMatrix(new double[][] {
- {2.0d, -1.0d, 0.0d},
- {-1.0d, 2.0d, -1.0d},
- {0.0d, -1.0d, 2.0d}
- })));
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void nullMatrixTest() {
- new CholeskyDecomposition(null);
- }
-
- /** */
- @Test(expected = CardinalityException.class)
- public void wrongMatrixSizeTest() {
- new CholeskyDecomposition(new DenseLocalOnHeapMatrix(2, 3));
- }
-
- /** */
- @Test(expected = NonSymmetricMatrixException.class)
- public void nonSymmetricMatrixTest() {
- new CholeskyDecomposition(new DenseLocalOnHeapMatrix(new double[][] {
- {2.0d, -1.0d, 10.0d},
- {-1.0d, 2.0d, -1.0d},
- {-10.0d, -1.0d, 2.0d}
- }));
- }
-
- /** */
- @Test(expected = NonPositiveDefiniteMatrixException.class)
- public void nonAbsPositiveMatrixTest() {
- new CholeskyDecomposition(new DenseLocalOnHeapMatrix(new double[][] {
- {2.0d, -1.0d, 0.0d},
- {-1.0d, 0.0d, -1.0d},
- {0.0d, -1.0d, 2.0d}
- }));
- }
-
- /** */
- @Test(expected = CardinalityException.class)
- public void solveWrongVectorSizeTest() {
- new CholeskyDecomposition(new DenseLocalOnHeapMatrix(new double[][] {
- {2.0d, -1.0d, 0.0d},
- {-1.0d, 2.0d, -1.0d},
- {0.0d, -1.0d, 2.0d}
- })).solve(new DenseLocalOnHeapVector(2));
- }
-
- /** */
- @Test(expected = CardinalityException.class)
- public void solveWrongMatrixSizeTest() {
- new CholeskyDecomposition(new DenseLocalOnHeapMatrix(new double[][] {
- {2.0d, -1.0d, 0.0d},
- {-1.0d, 2.0d, -1.0d},
- {0.0d, -1.0d, 2.0d}
- })).solve(new DenseLocalOnHeapMatrix(2, 3));
- }
-
- /** */
- private void basicTest(Matrix m) {
- // This decomposition is useful when dealing with systems of linear equations of the form
- // m x = b where m is a Hermitian matrix.
- // For such systems Cholesky decomposition provides
- // more effective method of solving compared to LU decomposition.
- // Suppose we want to solve system
- // m x = b for various bs. Then after we computed Cholesky decomposition, we can feed various bs
- // as a matrix of the form
- // (b1, b2, ..., bm)
- // to the method Cholesky::solve which returns solutions in the form
- // (sol1, sol2, ..., solm)
- CholeskyDecomposition dec = new CholeskyDecomposition(m);
- assertEquals("Unexpected value for decomposition determinant.",
- 4d, dec.getDeterminant(), 0d);
-
- Matrix l = dec.getL();
- Matrix lt = dec.getLT();
-
- assertNotNull("Matrix l is expected to be not null.", l);
- assertNotNull("Matrix lt is expected to be not null.", lt);
-
- for (int row = 0; row < l.rowSize(); row++)
- for (int col = 0; col < l.columnSize(); col++)
- assertEquals("Unexpected value transposed matrix at (" + row + "," + col + ").",
- l.get(row, col), lt.get(col, row), 0d);
-
- Matrix bs = new DenseLocalOnHeapMatrix(new double[][] {
- {4.0, -6.0, 7.0},
- {1.0, 1.0, 1.0}
- }).transpose();
- Matrix sol = dec.solve(bs);
-
- assertNotNull("Solution matrix is expected to be not null.", sol);
- assertEquals("Solution rows are not as expected.", bs.rowSize(), sol.rowSize());
- assertEquals("Solution columns are not as expected.", bs.columnSize(), sol.columnSize());
-
- for (int i = 0; i < sol.columnSize(); i++)
- assertNotNull("Solution matrix column is expected to be not null at index " + i, sol.viewColumn(i));
-
- Vector b = new DenseLocalOnHeapVector(new double[] {4.0, -6.0, 7.0});
- Vector solVec = dec.solve(b);
-
- for (int idx = 0; idx < b.size(); idx++)
- assertEquals("Unexpected value solution vector at " + idx,
- b.get(idx), solVec.get(idx), 0d);
-
- dec.destroy();
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/decompositions/EigenDecompositionTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/decompositions/EigenDecompositionTest.java b/modules/ml/src/test/java/org/apache/ignite/math/decompositions/EigenDecompositionTest.java
deleted file mode 100644
index e4e7b15..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/decompositions/EigenDecompositionTest.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * 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.ignite.math.decompositions;
-
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.impls.matrix.DenseLocalOnHeapMatrix;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-/**
- * Tests for {@link EigenDecomposition}
- */
-public class EigenDecompositionTest {
- /** */
- private static final double EPSILON = 1e-11;
-
- /** */
- @Test
- public void testMatrixWithRealEigenvalues() {
- test(new double[][] {
- {1.0d, 0.0d, 0.0d, 0.0d},
- {0.0d, 1.0d, 0.0d, 0.0d},
- {0.0d, 0.0d, 2.0d, 0.0d},
- {1.0d, 1.0d, 0.0d, 2.0d}},
- new double[] {1, 2, 2, 1});
- }
-
- /** */
- @Test
- public void testSymmetricMatrix() {
- EigenDecomposition decomposition = new EigenDecomposition(new DenseLocalOnHeapMatrix(new double[][] {
- {1.0d, 0.0d, 0.0d, 1.0d},
- {0.0d, 1.0d, 0.0d, 1.0d},
- {0.0d, 0.0d, 2.0d, 0.0d},
- {1.0d, 1.0d, 0.0d, 2.0d}}));
-
- Matrix d = decomposition.getD();
- Matrix v = decomposition.getV();
-
- assertNotNull("Matrix d is expected to be not null.", d);
- assertNotNull("Matrix v is expected to be not null.", v);
-
- assertEquals("Unexpected rows in d matrix.", 4, d.rowSize());
- assertEquals("Unexpected cols in d matrix.", 4, d.columnSize());
-
- assertEquals("Unexpected rows in v matrix.", 4, v.rowSize());
- assertEquals("Unexpected cols in v matrix.", 4, v.columnSize());
-
- assertIsDiagonalNonZero(d);
-
- decomposition.destroy();
- }
-
- /** */
- @Test
- public void testNonSquareMatrix() {
- EigenDecomposition decomposition = new EigenDecomposition(new DenseLocalOnHeapMatrix(new double[][] {
- {1.0d, 0.0d, 0.0d},
- {0.0d, 1.0d, 0.0d},
- {0.0d, 0.0d, 2.0d},
- {1.0d, 1.0d, 0.0d}}));
- // todo find out why decomposition of 3X4 matrix throws row index exception
-
- Matrix d = decomposition.getD();
- Matrix v = decomposition.getV();
-
- assertNotNull("Matrix d is expected to be not null.", d);
- assertNotNull("Matrix v is expected to be not null.", v);
-
- assertEquals("Unexpected rows in d matrix.", 4, d.rowSize());
- assertEquals("Unexpected cols in d matrix.", 4, d.columnSize());
-
- assertEquals("Unexpected rows in v matrix.", 4, v.rowSize());
- assertEquals("Unexpected cols in v matrix.", 3, v.columnSize());
-
- assertIsDiagonal(d, true);
-
- decomposition.destroy();
- }
-
- /** */
- private void test(double[][] mRaw, double[] expRealEigenValues) {
- DenseLocalOnHeapMatrix m = new DenseLocalOnHeapMatrix(mRaw);
- EigenDecomposition decomposition = new EigenDecomposition(m);
-
- Matrix d = decomposition.getD();
- Matrix v = decomposition.getV();
-
- assertIsDiagonalNonZero(d);
-
- // check that d's diagonal consists of eigenvalues of m.
- assertDiagonalConsistsOfEigenvalues(m, d, v);
-
- // m = v d v^{-1} is equivalent to
- // m v = v d
- assertMatricesAreEqual(m.times(v), v.times(d));
-
- assertEigenvalues(decomposition, expRealEigenValues);
-
- decomposition.destroy();
- }
-
- /** */
- private void assertEigenvalues(EigenDecomposition decomposition, double[] expRealEigenValues) {
- Vector real = decomposition.getRealEigenValues();
- Vector imag = decomposition.getImagEigenvalues();
-
- assertEquals("Real values size differs from expected.", expRealEigenValues.length, real.size());
- assertEquals("Imag values size differs from expected.", expRealEigenValues.length, imag.size());
-
- for (int idx = 0; idx < expRealEigenValues.length; idx++) {
- assertEquals("Real eigen value differs from expected at " + idx,
- expRealEigenValues[idx], real.get(idx), 0d);
-
- assertEquals("Imag eigen value differs from expected at " + idx,
- 0d, imag.get(idx), 0d);
- }
-
- }
-
- /** */
- private void assertDiagonalConsistsOfEigenvalues(DenseLocalOnHeapMatrix m, Matrix d, Matrix v) {
- int n = m.columnSize();
- for (int i = 0; i < n; i++) {
- Vector eigenVector = v.viewColumn(i);
- double eigenVal = d.getX(i, i);
- assertVectorsAreEqual(m.times(eigenVector), eigenVector.times(eigenVal));
- }
-
- }
-
- /** */
- private void assertMatricesAreEqual(Matrix exp, Matrix actual) {
- assertTrue("The row sizes of matrices are not equal", exp.rowSize() == actual.rowSize());
- assertTrue("The col sizes of matrices are not equal", exp.columnSize() == actual.columnSize());
-
- // Since matrix is square, we need only one dimension
- int n = exp.columnSize();
-
- for (int i = 0; i < n; i++)
- for (int j = 0; j < n; j++)
- assertEquals("Values should be equal", exp.getX(i, j), actual.getX(i, j), EPSILON);
- }
-
- /** */
- private void assertVectorsAreEqual(Vector exp, Vector actual) {
- assertTrue("Vectors sizes are not equal", exp.size() == actual.size());
-
- // Since matrix is square, we need only one dimension
- int n = exp.size();
-
- for (int i = 0; i < n; i++)
- assertEquals("Values should be equal", exp.getX(i), actual.getX(i), EPSILON);
- }
-
- /** */
- private void assertIsDiagonalNonZero(Matrix m) {
- assertIsDiagonal(m, false);
- }
-
- /** */
- private void assertIsDiagonal(Matrix m, boolean zeroesAllowed) {
- // Since matrix is square, we need only one dimension
- int n = m.columnSize();
-
- assertEquals("Diagonal matrix is not square", n, m.rowSize());
-
- for (int i = 0; i < n; i++)
- for (int j = 0; j < n; j++)
- assertTrue("Matrix is not diagonal, violation at (" + i + "," + j + ")",
- ((i == j) && (zeroesAllowed || m.getX(i, j) != 0))
- || ((i != j) && m.getX(i, j) == 0));
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/decompositions/LUDecompositionTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/decompositions/LUDecompositionTest.java b/modules/ml/src/test/java/org/apache/ignite/math/decompositions/LUDecompositionTest.java
deleted file mode 100644
index 0feb48f..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/decompositions/LUDecompositionTest.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * 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.ignite.math.decompositions;
-
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.exceptions.CardinalityException;
-import org.apache.ignite.math.exceptions.SingularMatrixException;
-import org.apache.ignite.math.impls.matrix.DenseLocalOnHeapMatrix;
-import org.apache.ignite.math.impls.matrix.PivotedMatrixView;
-import org.apache.ignite.math.impls.vector.DenseLocalOnHeapVector;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-/**
- * Tests for {@link LUDecomposition}.
- */
-public class LUDecompositionTest {
- /** */
- private Matrix testL;
- /** */
- private Matrix testU;
- /** */
- private Matrix testP;
- /** */
- private Matrix testMatrix;
- /** */
- private int[] rawPivot;
-
- /** */
- @Before
- public void setUp() {
- double[][] rawMatrix = new double[][] {
- {2.0d, 1.0d, 1.0d, 0.0d},
- {4.0d, 3.0d, 3.0d, 1.0d},
- {8.0d, 7.0d, 9.0d, 5.0d},
- {6.0d, 7.0d, 9.0d, 8.0d}};
- double[][] rawL = {
- {1.0d, 0.0d, 0.0d, 0.0d},
- {3.0d / 4.0d, 1.0d, 0.0d, 0.0d},
- {1.0d / 2.0d, -2.0d / 7.0d, 1.0d, 0.0d},
- {1.0d / 4.0d, -3.0d / 7.0d, 1.0d / 3.0d, 1.0d}};
- double[][] rawU = {
- {8.0d, 7.0d, 9.0d, 5.0d},
- {0.0d, 7.0d / 4.0d, 9.0d / 4.0d, 17.0d / 4.0d},
- {0.0d, 0.0d, -6.0d / 7.0d, -2.0d / 7.0d},
- {0.0d, 0.0d, 0.0d, 2.0d / 3.0d}};
- double[][] rawP = new double[][] {
- {0, 0, 1.0d, 0},
- {0, 0, 0, 1.0d},
- {0, 1.0d, 0, 0},
- {1.0d, 0, 0, 0}};
-
- rawPivot = new int[] {3, 4, 2, 1};
-
- testMatrix = new DenseLocalOnHeapMatrix(rawMatrix);
- testL = new DenseLocalOnHeapMatrix(rawL);
- testU = new DenseLocalOnHeapMatrix(rawU);
- testP = new DenseLocalOnHeapMatrix(rawP);
- }
-
- /** */
- @Test
- public void getL() throws Exception {
- Matrix luDecompositionL = new LUDecomposition(testMatrix).getL();
-
- assertEquals("Unexpected row size.", testL.rowSize(), luDecompositionL.rowSize());
- assertEquals("Unexpected column size.", testL.columnSize(), luDecompositionL.columnSize());
-
- for (int i = 0; i < testL.rowSize(); i++)
- for (int j = 0; j < testL.columnSize(); j++)
- assertEquals("Unexpected value at (" + i + "," + j + ").",
- testL.getX(i, j), luDecompositionL.getX(i, j), 0.0000001d);
-
- luDecompositionL.destroy();
- }
-
- /** */
- @Test
- public void getU() throws Exception {
- Matrix luDecompositionU = new LUDecomposition(testMatrix).getU();
-
- assertEquals("Unexpected row size.", testU.rowSize(), luDecompositionU.rowSize());
- assertEquals("Unexpected column size.", testU.columnSize(), luDecompositionU.columnSize());
-
- for (int i = 0; i < testU.rowSize(); i++)
- for (int j = 0; j < testU.columnSize(); j++)
- assertEquals("Unexpected value at (" + i + "," + j + ").",
- testU.getX(i, j), luDecompositionU.getX(i, j), 0.0000001d);
-
- luDecompositionU.destroy();
- }
-
- /** */
- @Test
- public void getP() throws Exception {
- Matrix luDecompositionP = new LUDecomposition(testMatrix).getP();
-
- assertEquals("Unexpected row size.", testP.rowSize(), luDecompositionP.rowSize());
- assertEquals("Unexpected column size.", testP.columnSize(), luDecompositionP.columnSize());
-
- for (int i = 0; i < testP.rowSize(); i++)
- for (int j = 0; j < testP.columnSize(); j++)
- assertEquals("Unexpected value at (" + i + "," + j + ").",
- testP.getX(i, j), luDecompositionP.getX(i, j), 0.0000001d);
-
- luDecompositionP.destroy();
- }
-
- /** */
- @Test
- public void getPivot() throws Exception {
- Vector pivot = new LUDecomposition(testMatrix).getPivot();
-
- assertEquals("Unexpected pivot size.", rawPivot.length, pivot.size());
-
- for (int i = 0; i < testU.rowSize(); i++)
- assertEquals("Unexpected value at " + i, rawPivot[i], (int)pivot.get(i) + 1);
- }
-
- /**
- * Test for {@link DecompositionSupport} features.
- */
- @Test
- public void decompositionSupportTest() {
- LUDecomposition dec = new LUDecomposition(new PivotedMatrixView(testMatrix));
- Matrix luDecompositionL = dec.getL();
-
- assertEquals("Unexpected L row size.", testL.rowSize(), luDecompositionL.rowSize());
- assertEquals("Unexpected L column size.", testL.columnSize(), luDecompositionL.columnSize());
-
- for (int i = 0; i < testL.rowSize(); i++)
- for (int j = 0; j < testL.columnSize(); j++)
- assertEquals("Unexpected L value at (" + i + "," + j + ").",
- testL.getX(i, j), luDecompositionL.getX(i, j), 0.0000001d);
-
- Matrix luDecompositionU = dec.getU();
-
- assertEquals("Unexpected U row size.", testU.rowSize(), luDecompositionU.rowSize());
- assertEquals("Unexpected U column size.", testU.columnSize(), luDecompositionU.columnSize());
-
- for (int i = 0; i < testU.rowSize(); i++)
- for (int j = 0; j < testU.columnSize(); j++)
- assertEquals("Unexpected U value at (" + i + "," + j + ").",
- testU.getX(i, j), luDecompositionU.getX(i, j), 0.0000001d);
-
- Matrix luDecompositionP = dec.getP();
-
- assertEquals("Unexpected P row size.", testP.rowSize(), luDecompositionP.rowSize());
- assertEquals("Unexpected P column size.", testP.columnSize(), luDecompositionP.columnSize());
-
- for (int i = 0; i < testP.rowSize(); i++)
- for (int j = 0; j < testP.columnSize(); j++)
- assertEquals("Unexpected P value at (" + i + "," + j + ").",
- testP.getX(i, j), luDecompositionP.getX(i, j), 0.0000001d);
-
- dec.destroy();
- }
-
- /** */
- @Test
- public void singularDeterminant() throws Exception {
- assertEquals("Unexpected determinant for singular matrix decomposition.",
- 0d, new LUDecomposition(new DenseLocalOnHeapMatrix(2, 2)).determinant(), 0d);
- }
-
- /** */
- @Test(expected = CardinalityException.class)
- public void solveVecWrongSize() throws Exception {
- new LUDecomposition(testMatrix).solve(new DenseLocalOnHeapVector(testMatrix.rowSize() + 1));
- }
-
- /** */
- @Test(expected = SingularMatrixException.class)
- public void solveVecSingularMatrix() throws Exception {
- new LUDecomposition(new DenseLocalOnHeapMatrix(testMatrix.rowSize(), testMatrix.rowSize()))
- .solve(new DenseLocalOnHeapVector(testMatrix.rowSize()));
- }
-
- /** */
- @Test
- public void solveVec() throws Exception {
- Vector sol = new LUDecomposition(new PivotedMatrixView(testMatrix))
- .solve(new DenseLocalOnHeapVector(testMatrix.rowSize()));
-
- assertEquals("Wrong solution vector size.", testMatrix.rowSize(), sol.size());
-
- for (int i = 0; i < sol.size(); i++)
- assertEquals("Unexpected value at index " + i, 0d, sol.getX(i), 0.0000001d);
- }
-
- /** */
- @Test(expected = CardinalityException.class)
- public void solveMtxWrongSize() throws Exception {
- new LUDecomposition(testMatrix).solve(
- new DenseLocalOnHeapMatrix(testMatrix.rowSize() + 1, testMatrix.rowSize()));
- }
-
- /** */
- @Test(expected = SingularMatrixException.class)
- public void solveMtxSingularMatrix() throws Exception {
- new LUDecomposition(new DenseLocalOnHeapMatrix(testMatrix.rowSize(), testMatrix.rowSize()))
- .solve(new DenseLocalOnHeapMatrix(testMatrix.rowSize(), testMatrix.rowSize()));
- }
-
- /** */
- @Test
- public void solveMtx() throws Exception {
- Matrix sol = new LUDecomposition(new PivotedMatrixView(testMatrix))
- .solve(new DenseLocalOnHeapMatrix(testMatrix.rowSize(), testMatrix.rowSize()));
-
- assertEquals("Wrong solution matrix row size.", testMatrix.rowSize(), sol.rowSize());
-
- assertEquals("Wrong solution matrix column size.", testMatrix.rowSize(), sol.columnSize());
-
- for (int row = 0; row < sol.rowSize(); row++)
- for (int col = 0; col < sol.columnSize(); col++)
- assertEquals("Unexpected P value at (" + row + "," + col + ").",
- 0d, sol.getX(row, col), 0.0000001d);
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void nullMatrixTest() {
- new LUDecomposition(null);
- }
-
- /** */
- @Test(expected = CardinalityException.class)
- public void nonSquareMatrixTest() {
- new LUDecomposition(new DenseLocalOnHeapMatrix(2, 3));
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/decompositions/QRDecompositionTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/decompositions/QRDecompositionTest.java b/modules/ml/src/test/java/org/apache/ignite/math/decompositions/QRDecompositionTest.java
deleted file mode 100644
index 3bb92d1..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/decompositions/QRDecompositionTest.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * 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.ignite.math.decompositions;
-
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.impls.matrix.DenseLocalOnHeapMatrix;
-import org.apache.ignite.math.impls.matrix.PivotedMatrixView;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-/** */
-public class QRDecompositionTest {
- /** */
- @Test
- public void basicTest() {
- basicTest(new DenseLocalOnHeapMatrix(new double[][] {
- {2.0d, -1.0d, 0.0d},
- {-1.0d, 2.0d, -1.0d},
- {0.0d, -1.0d, 2.0d}
- }));
- }
-
- /**
- * Test for {@link DecompositionSupport} features.
- */
- @Test
- public void decompositionSupportTest() {
- basicTest(new PivotedMatrixView(new DenseLocalOnHeapMatrix(new double[][] {
- {2.0d, -1.0d, 0.0d},
- {-1.0d, 2.0d, -1.0d},
- {0.0d, -1.0d, 2.0d}
- })));
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void nullMatrixTest() {
- new QRDecomposition(null);
- }
-
- /** */
- @Test(expected = IllegalArgumentException.class)
- public void solveWrongMatrixSizeTest() {
- new QRDecomposition(new DenseLocalOnHeapMatrix(new double[][] {
- {2.0d, -1.0d, 0.0d},
- {-1.0d, 2.0d, -1.0d},
- {0.0d, -1.0d, 2.0d}
- })).solve(new DenseLocalOnHeapMatrix(2, 3));
- }
-
- /** */
- private void basicTest(Matrix m) {
- QRDecomposition dec = new QRDecomposition(m);
- assertTrue("Unexpected value for full rank in decomposition " + dec, dec.hasFullRank());
-
- Matrix q = dec.getQ();
- Matrix r = dec.getR();
-
- assertNotNull("Matrix q is expected to be not null.", q);
- assertNotNull("Matrix r is expected to be not null.", r);
-
- Matrix qSafeCp = safeCopy(q);
-
- Matrix expIdentity = qSafeCp.times(qSafeCp.transpose());
-
- final double delta = 0.0001;
-
- for (int row = 0; row < expIdentity.rowSize(); row++)
- for (int col = 0; col < expIdentity.columnSize(); col++)
- assertEquals("Unexpected identity matrix value at (" + row + "," + col + ").",
- row == col ? 1d : 0d, expIdentity.get(col, row), delta);
-
- for (int row = 0; row < r.rowSize(); row++)
- for (int col = 0; col < row - 1; col++)
- assertEquals("Unexpected upper triangular matrix value at (" + row + "," + col + ").",
- 0d, r.get(row, col), delta);
-
- Matrix recomposed = qSafeCp.times(r);
-
- for (int row = 0; row < m.rowSize(); row++)
- for (int col = 0; col < m.columnSize(); col++)
- assertEquals("Unexpected recomposed matrix value at (" + row + "," + col + ").",
- m.get(row, col), recomposed.get(row, col), delta);
-
- Matrix sol = dec.solve(new DenseLocalOnHeapMatrix(3, 10));
- assertEquals("Unexpected rows in solution matrix.", 3, sol.rowSize());
- assertEquals("Unexpected cols in solution matrix.", 10, sol.columnSize());
-
- for (int row = 0; row < sol.rowSize(); row++)
- for (int col = 0; col < sol.columnSize(); col++)
- assertEquals("Unexpected solution matrix value at (" + row + "," + col + ").",
- 0d, sol.get(row, col), delta);
-
- dec.destroy();
-
- QRDecomposition dec1 = new QRDecomposition(new DenseLocalOnHeapMatrix(new double[][] {
- {2.0d, -1.0d},
- {-1.0d, 2.0d},
- {0.0d, -1.0d}
- }));
-
- assertTrue("Unexpected value for full rank in decomposition " + dec1, dec1.hasFullRank());
-
- dec1.destroy();
-
- QRDecomposition dec2 = new QRDecomposition(new DenseLocalOnHeapMatrix(new double[][] {
- {2.0d, -1.0d, 0.0d, 0.0d},
- {-1.0d, 2.0d, -1.0d, 0.0d},
- {0.0d, -1.0d, 2.0d, 0.0d}
- }));
-
- assertTrue("Unexpected value for full rank in decomposition " + dec2, dec2.hasFullRank());
-
- dec2.destroy();
- }
-
- /** */
- private Matrix safeCopy(Matrix orig) {
- return new DenseLocalOnHeapMatrix(orig.rowSize(), orig.columnSize()).assign(orig);
- }
-}
[02/67] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math
module to Ignite ML module added missed licenses renamed packages fixed wrong
ml profile activation (cherry picked from commit d78e071)
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/RandomVectorConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/RandomVectorConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/RandomVectorConstructorTest.java
new file mode 100644
index 0000000..49e1a50
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/RandomVectorConstructorTest.java
@@ -0,0 +1,145 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+/** */
+public class RandomVectorConstructorTest {
+ /** */
+ private static final int IMPOSSIBLE_SIZE = -1;
+
+ /** */
+ @Test(expected = UnsupportedOperationException.class)
+ public void mapInvalidArgsTest() {
+ assertEquals("Expect exception due to invalid args.", IMPOSSIBLE_SIZE,
+ new RandomVector(new HashMap<String, Object>() {{
+ put("invalid", 99);
+ }}).size());
+ }
+
+ /** */
+ @Test(expected = UnsupportedOperationException.class)
+ public void mapMissingArgsTest() {
+ final Map<String, Object> test = new HashMap<String, Object>() {{
+ put("paramMissing", "whatever");
+ }};
+
+ assertEquals("Expect exception due to missing args.",
+ -1, new RandomVector(test).size());
+ }
+
+ /** */
+ @Test(expected = ClassCastException.class)
+ public void mapInvalidParamTypeTest() {
+ final Map<String, Object> test = new HashMap<String, Object>() {{
+ put("size", "whatever");
+ put("fastHash", true);
+ }};
+
+ assertEquals("Expect exception due to invalid param type.", IMPOSSIBLE_SIZE,
+ new RandomVector(test).size());
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void mapNullTest() {
+ //noinspection ConstantConditions
+ assertEquals("Null map args.", IMPOSSIBLE_SIZE,
+ new RandomVector(null).size());
+ }
+
+ /** */
+ @Test
+ public void mapTest() {
+ assertEquals("Size from args.", 99,
+ new RandomVector(new HashMap<String, Object>() {{
+ put("size", 99);
+ }}).size());
+
+ final int test = 99;
+
+ assertEquals("Size from args with fastHash false.", test,
+ new RandomVector(new HashMap<String, Object>() {{
+ put("size", test);
+ put("fastHash", false);
+ }}).size());
+
+ assertEquals("Size from args with fastHash true.", test,
+ new RandomVector(new HashMap<String, Object>() {{
+ put("size", test);
+ put("fastHash", true);
+ }}).size());
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void negativeSizeTest() {
+ assertEquals("Negative size.", IMPOSSIBLE_SIZE,
+ new RandomVector(-1).size());
+ }
+
+ /** */
+ @Test
+ public void basicTest() {
+ final int basicSize = 3;
+
+ Vector v1 = new RandomVector(basicSize);
+
+ //noinspection EqualsWithItself
+ assertTrue("Expect vector to be equal to self", v1.equals(v1));
+
+ //noinspection ObjectEqualsNull
+ assertFalse("Expect vector to be not equal to null", v1.equals(null));
+
+ assertEquals("Size differs from expected", basicSize, v1.size());
+
+ verifyValues(v1);
+
+ Vector v2 = new RandomVector(basicSize, true);
+
+ assertEquals("Size differs from expected", basicSize, v2.size());
+
+ verifyValues(v2);
+
+ Vector v3 = new RandomVector(basicSize, false);
+
+ assertEquals("Size differs from expected", basicSize, v3.size());
+
+ verifyValues(v3);
+ }
+
+ /** */
+ private void verifyValues(Vector v) {
+ for (Vector.Element e : v.all()) {
+ double val = e.get();
+
+ assertTrue("Value too small: " + val + " at index " + e.index(), -1d <= val);
+
+ assertTrue("Value too large: " + val + " at index " + e.index(), val <= 1d);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/SingleElementVectorConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/SingleElementVectorConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/SingleElementVectorConstructorTest.java
new file mode 100644
index 0000000..db4d5de
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/SingleElementVectorConstructorTest.java
@@ -0,0 +1,159 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/** */
+public class SingleElementVectorConstructorTest {
+ /** */
+ private static final int IMPOSSIBLE_SIZE = -1;
+
+ /** */
+ @Test(expected = UnsupportedOperationException.class)
+ public void mapInvalidArgsTest() {
+ assertEquals("Expect exception due to invalid args.", IMPOSSIBLE_SIZE,
+ new SingleElementVector(new HashMap<String, Object>() {{
+ put("invalid", 99);
+ }}).size());
+ }
+
+ /** */
+ @Test(expected = UnsupportedOperationException.class)
+ public void mapMissingArgsTest() {
+ final Map<String, Object> test = new HashMap<String, Object>() {{
+ put("size", 1);
+
+ put("paramMissing", "whatever");
+ }};
+
+ assertEquals("Expect exception due to missing args.",
+ -1, new SingleElementVector(test).size());
+ }
+
+ /** */
+ @Test(expected = ClassCastException.class)
+ public void mapInvalidParamTypeTest() {
+ final Map<String, Object> test = new HashMap<String, Object>() {{
+ put("size", "whatever");
+
+ put("index", 0);
+ put("value", 1.0);
+ }};
+
+ assertEquals("Expect exception due to invalid param type.", IMPOSSIBLE_SIZE,
+ new SingleElementVector(test).size());
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void mapNullTest() {
+ //noinspection ConstantConditions
+ assertEquals("Null map args.", IMPOSSIBLE_SIZE,
+ new SingleElementVector(null).size());
+ }
+
+ /** */
+ @Test
+ public void mapTest() {
+ assertEquals("Size from array in args.", 99,
+ new SingleElementVector(new HashMap<String, Object>() {{
+ put("size", 99);
+ put("index", 0);
+ put("value", 1.0);
+ }}).size());
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void negativeSizeTest() {
+ assertEquals("Negative size.", IMPOSSIBLE_SIZE,
+ new SingleElementVector(-1, 0, 1.0).size());
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void zeroSizeTest() {
+ assertEquals("Zero size.", IMPOSSIBLE_SIZE,
+ new SingleElementVector(0, 0, 1.0).size());
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void wrongIndexTest() {
+ //noinspection ConstantConditions
+ assertEquals("Wrong index.", IMPOSSIBLE_SIZE,
+ new SingleElementVector(1, 2, 1.0).size());
+ }
+
+ /** */
+ @Test
+ public void basicTest() {
+ final int[] sizes = new int[] {1, 4, 8};
+
+ for (int size : sizes)
+ for (int idx = 0; idx < size; idx++)
+ basicTest(size, idx);
+ }
+
+ /** */
+ private void basicTest(int size, int idx) {
+ final Double expVal = (double)(size - idx);
+
+ Vector v = new SingleElementVector(size, idx, expVal);
+
+ assertTrue("Expect value " + expVal + " at index " + idx + " for size " + size,
+ expVal.equals(v.get(idx)));
+
+ final double delta = 1.0;
+
+ v.set(idx, expVal - delta);
+
+ assertTrue("Expect value " + expVal + " at index " + idx + " for size " + size,
+ expVal.equals(v.get(idx) + delta));
+
+ final Double zero = 0.0;
+
+ for (int i = 0; i < size; i++) {
+ if (i == idx)
+ continue;
+
+ assertTrue("Expect zero at index " + i + " for size " + size,
+ zero.equals(v.get(i)));
+
+ boolean eCaught = false;
+
+ try {
+ v.set(i, 1.0);
+ }
+ catch (UnsupportedOperationException uoe) {
+ eCaught = true;
+ }
+
+ assertTrue("Expect " + java.lang.UnsupportedOperationException.class.getSimpleName()
+ + " at index " + i + " for size " + size, eCaught);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/SingleElementVectorViewConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/SingleElementVectorViewConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/SingleElementVectorViewConstructorTest.java
new file mode 100644
index 0000000..a693319
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/SingleElementVectorViewConstructorTest.java
@@ -0,0 +1,137 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/** */
+public class SingleElementVectorViewConstructorTest {
+ /** */
+ private static final int IMPOSSIBLE_SIZE = -1;
+
+ /** */
+ private static final SampleHelper helper = new SampleHelper();
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void nullVecParamTest() {
+ assertEquals("Expect exception due to null vector param.", IMPOSSIBLE_SIZE,
+ new SingleElementVectorView(null, helper.idx).size());
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void negativeIdxParamTest() {
+ assertEquals("Expect exception due to negative index param.", IMPOSSIBLE_SIZE,
+ new SingleElementVectorView(helper.vec, -1).size());
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void tooLargeIdxParamTest() {
+ assertEquals("Expect exception due to too large index param.", IMPOSSIBLE_SIZE,
+ new SingleElementVectorView(helper.vec, helper.vec.size()).size());
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void emptyVecParamTest() {
+ assertEquals("Expect exception due to empty vector param.", IMPOSSIBLE_SIZE,
+ new SingleElementVectorView(helper.vecEmpty, 0).size());
+ }
+
+ /** */
+ @Test
+ public void basicTest() {
+ final int[] sizes = new int[] {1, 4, 8};
+
+ for (int size : sizes)
+ for (int idx = 0; idx < size; idx++)
+ basicTest(size, idx);
+ }
+
+ /** */
+ private void basicTest(int size, int idx) {
+ final Double expVal = (double)(size - idx);
+
+ Vector orig = helper.newSample(size, idx, expVal);
+
+ SingleElementVectorView svv = new SingleElementVectorView(orig, idx);
+
+ assertEquals("Size differs from expected", size, svv.size());
+
+ assertTrue("Expect value " + expVal + " at index " + idx + " for size " + size,
+ expVal.equals(svv.get(idx)));
+
+ final double delta = 1.0;
+
+ svv.set(idx, expVal - delta);
+
+ assertTrue("Expect value " + expVal + " at index " + idx + " for size " + size,
+ expVal.equals(orig.get(idx) + delta));
+
+ final Double zero = 0.0;
+
+ for (int i = 0; i < size; i++) {
+ if (i == idx)
+ continue;
+
+ assertTrue("Expect zero at index " + i + " for size " + size,
+ zero.equals(svv.get(i)));
+
+ boolean eCaught = false;
+
+ try {
+ svv.set(i, 1.0);
+ }
+ catch (UnsupportedOperationException uoe) {
+ eCaught = true;
+ }
+
+ assertTrue("Expect " + UnsupportedOperationException.class.getSimpleName()
+ + " at index " + i + " for size " + size, eCaught);
+ }
+ }
+
+ /** */
+ private static class SampleHelper {
+ /** */
+ final double[] data = new double[] {0, 1};
+ /** */
+ final Vector vec = new DenseLocalOnHeapVector(data);
+ /** */
+ final Vector vecEmpty = new DenseLocalOnHeapVector(new double[] {});
+ /** */
+ final int idx = 0;
+
+ /** */
+ Vector newSample(int size, int idx, double expVal) {
+ final Vector v = new DenseLocalOnHeapVector(size);
+
+ for (int i = 0; i < size; i++)
+ v.set(i, i == idx ? expVal : i);
+
+ return v;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/SparseLocalVectorConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/SparseLocalVectorConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/SparseLocalVectorConstructorTest.java
new file mode 100644
index 0000000..912168e
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/SparseLocalVectorConstructorTest.java
@@ -0,0 +1,54 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import org.apache.ignite.ml.math.StorageConstants;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/** */
+public class SparseLocalVectorConstructorTest {
+ /** */
+ private static final int IMPOSSIBLE_SIZE = -1;
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void negativeSizeTest() {
+ assertEquals("Negative size.", IMPOSSIBLE_SIZE,
+ new SparseLocalVector(-1, 1).size());
+ }
+
+ /** */
+ @Test(expected = AssertionError.class)
+ public void zeroSizeTest() {
+ assertEquals("0 size.", IMPOSSIBLE_SIZE,
+ new SparseLocalVector(0, 1).size());
+ }
+
+ /** */
+ @Test
+ public void primitiveTest() {
+ assertEquals("1 size, random access.", 1,
+ new SparseLocalVector(1, StorageConstants.RANDOM_ACCESS_MODE).size());
+
+ assertEquals("1 size, sequential access.", 1,
+ new SparseLocalVector(1, StorageConstants.SEQUENTIAL_ACCESS_MODE).size());
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorAttributesTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorAttributesTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorAttributesTest.java
new file mode 100644
index 0000000..e2f6a40
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorAttributesTest.java
@@ -0,0 +1,217 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.Function;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOffHeapMatrix;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/** */
+public class VectorAttributesTest {
+ /** */
+ private final List<AttrCfg> attrCfgs = Arrays.asList(
+ new AttrCfg("isDense", Vector::isDense,
+ DenseLocalOnHeapVector.class, DenseLocalOffHeapVector.class, RandomVector.class, ConstantVector.class,
+ SingleElementVector.class),
+ new AttrCfg("isArrayBased", Vector::isArrayBased,
+ DenseLocalOnHeapVector.class),
+ new AttrCfg("isSequentialAccess", Vector::isSequentialAccess,
+ DenseLocalOnHeapVector.class, DenseLocalOffHeapVector.class, SparseLocalVectorSequentialAccess.class,
+ RandomVector.class, ConstantVector.class, SingleElementVector.class),
+ new AttrCfg("guidNotNull", v -> v.guid() == null), // IMPL NOTE this is somewhat artificial
+ new AttrCfg("isRandomAccess", Vector::isRandomAccess,
+ DenseLocalOnHeapVector.class, DenseLocalOffHeapVector.class, RandomVector.class, ConstantVector.class,
+ SingleElementVector.class, SparseLocalVectorSequentialAccess.class, SparseLocalVectorRandomAccess.class),
+ new AttrCfg("isDistributed", Vector::isDistributed));
+
+ /** */
+ private final List<Specification> specFixture = Arrays.asList(
+ new Specification(new DenseLocalOnHeapVector(1)),
+ new Specification(new DenseLocalOffHeapVector(1)),
+ new Specification(new DelegatingVector(new DenseLocalOnHeapVector(1)),
+ DenseLocalOnHeapVector.class, "isDense", "isArrayBased", "isSequentialAccess",
+ "isRandomAccess", "isDistributed"),
+ new Specification(new DelegatingVector(new DenseLocalOffHeapVector(1)),
+ DenseLocalOffHeapVector.class, "isDense", "isArrayBased", "isSequentialAccess",
+ "isRandomAccess", "isDistributed"),
+ new Specification(new SparseLocalVectorSequentialAccess(1)),
+ new Specification(new SparseLocalVectorRandomAccess(1)),
+ new Specification(new RandomVector(1)),
+ new Specification(new ConstantVector(1, 1.0)),
+ new Specification(new FunctionVector(1, idx -> (double)idx)),
+ new Specification(new SingleElementVector(1, 0, 1.0)),
+ new Specification(new PivotedVectorView(new DenseLocalOnHeapVector(1), new int[] {0}),
+ DenseLocalOnHeapVector.class, "isDense", "isArrayBased", "isSequentialAccess",
+ "isRandomAccess", "isDistributed"),
+ new Specification(new PivotedVectorView(new DenseLocalOffHeapVector(1), new int[] {0}),
+ DenseLocalOffHeapVector.class, "isDense", "isArrayBased", "isSequentialAccess",
+ "isRandomAccess", "isDistributed"),
+ new Specification(new SingleElementVectorView(new DenseLocalOnHeapVector(1), 0),
+ DenseLocalOnHeapVector.class, "isDense", "isSequentialAccess",
+ "isRandomAccess", "isDistributed"),
+ new Specification(new SingleElementVectorView(new DenseLocalOffHeapVector(1), 0),
+ DenseLocalOffHeapVector.class, "isDense", "isSequentialAccess",
+ "isRandomAccess", "isDistributed"),
+ new Specification(new MatrixVectorView(new DenseLocalOnHeapMatrix(1, 1), 0, 0, 1, 1),
+ DenseLocalOnHeapVector.class, "isDense",
+ "isRandomAccess", "isDistributed"), // todo find out why "isSequentialAccess" fails here
+ new Specification(new MatrixVectorView(new DenseLocalOffHeapMatrix(1, 1), 0, 0, 1, 1),
+ DenseLocalOffHeapVector.class, "isDense",
+ "isRandomAccess", "isDistributed"));
+
+ /** */
+ @Test
+ public void isDenseTest() {
+ assertAttribute("isDense");
+ }
+
+ /** */
+ @Test
+ public void isArrayBasedTest() {
+ assertAttribute("isArrayBased");
+ }
+
+ /** */
+ @Test
+ public void isSequentialAccessTest() {
+ assertAttribute("isSequentialAccess");
+ }
+
+ /** */
+ @Test
+ public void guidTest() {
+ assertAttribute("guidNotNull");
+ }
+
+ /** */
+ @Test
+ public void isRandomAccessTest() {
+ assertAttribute("isRandomAccess");
+ }
+
+ /** */
+ @Test
+ public void isDistributedTest() {
+ assertAttribute("isDistributed");
+ }
+
+ /** */
+ private void assertAttribute(String name) {
+ final AttrCfg attr = attrCfg(name);
+
+ for (Specification spec : specFixture)
+ spec.verify(attr);
+ }
+
+ /** */
+ private AttrCfg attrCfg(String name) {
+ for (AttrCfg attr : attrCfgs)
+ if (attr.name.equals(name))
+ return attr;
+
+ throw new IllegalArgumentException("Undefined attribute " + name);
+ }
+
+ /** See http://en.wikipedia.org/wiki/Specification_pattern */
+ private static class Specification {
+ /** */
+ private final Vector v;
+ /** */
+ private final Class<? extends Vector> underlyingType;
+ /** */
+ private final List<String> attrsFromUnderlying;
+ /** */
+ final String desc;
+
+ /** */
+ Specification(Vector v, Class<? extends Vector> underlyingType, String... attrsFromUnderlying) {
+ this.v = v;
+ this.underlyingType = underlyingType;
+ this.attrsFromUnderlying = Arrays.asList(attrsFromUnderlying);
+ final Class<? extends Vector> clazz = v.getClass();
+ desc = clazz.getSimpleName() + (clazz.equals(underlyingType)
+ ? "" : " (underlying type " + underlyingType.getSimpleName() + ")");
+ }
+
+ /** */
+ Specification(Vector v) {
+ this(v, v.getClass());
+ }
+
+ /** */
+ void verify(AttrCfg attr) {
+ final boolean obtained = attr.obtain.apply(v);
+
+ final Class<? extends Vector> typeToCheck
+ = attrsFromUnderlying.contains(attr.name) ? underlyingType : v.getClass();
+
+ final boolean exp = attr.trueInTypes.contains(typeToCheck);
+
+ assertEquals("Unexpected " + attr.name + " value for " + desc, exp, obtained);
+ }
+ }
+
+ /** */
+ private static class AttrCfg {
+ /** */
+ final String name;
+ /** */
+ final Function<Vector, Boolean> obtain;
+ /** */
+ final List<Class> trueInTypes;
+
+ /** */
+ AttrCfg(String name, Function<Vector, Boolean> obtain, Class... trueInTypes) {
+ this.name = name;
+ this.obtain = obtain;
+ this.trueInTypes = Arrays.asList(trueInTypes);
+ }
+ }
+
+ /** */
+ private static class SparseLocalVectorSequentialAccess extends SparseLocalVector {
+ /** */
+ public SparseLocalVectorSequentialAccess() {
+ // No-op.
+ }
+
+ /** */
+ SparseLocalVectorSequentialAccess(int size) {
+ super(size, SEQUENTIAL_ACCESS_MODE);
+ }
+ }
+
+ /** */
+ private static class SparseLocalVectorRandomAccess extends SparseLocalVector {
+ /** */
+ public SparseLocalVectorRandomAccess() {
+ // No-op.
+ }
+
+ /** */
+ SparseLocalVectorRandomAccess(int size) {
+ super(size, RANDOM_ACCESS_MODE);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorFoldMapTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorFoldMapTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorFoldMapTest.java
new file mode 100644
index 0000000..676bb17
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorFoldMapTest.java
@@ -0,0 +1,122 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import java.util.Arrays;
+import java.util.function.BiConsumer;
+import java.util.function.BiFunction;
+import java.util.function.Function;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.functions.Functions;
+import org.junit.Test;
+
+import static java.util.function.DoubleUnaryOperator.identity;
+import static org.junit.Assert.assertTrue;
+
+/** See also: {@link AbstractVectorTest} and {@link VectorToMatrixTest}. */
+public class VectorFoldMapTest {
+ /** */
+ @Test
+ public void mapVectorTest() {
+ operationVectorTest((operand1, operand2) -> operand1 + operand2, (Vector v1, Vector v2) -> v1.map(v2, Functions.PLUS));
+ }
+
+ /** */
+ @Test
+ public void mapDoubleFunctionTest() {
+ consumeSampleVectors((v, desc) -> operatorTest(v, desc,
+ (vec) -> vec.map(Functions.INV), (val) -> 1.0 / val));
+ }
+
+ /** */
+ @Test
+ public void mapBiFunctionTest() {
+ consumeSampleVectors((v, desc) -> operatorTest(v, desc,
+ (vec) -> vec.map(Functions.PLUS, 1.0), (val) -> 1.0 + val));
+ }
+
+ /** */
+ @Test
+ public void foldMapTest() {
+ toDoubleTest(
+ ref -> Arrays.stream(ref).map(identity()).sum(),
+ (v) -> v.foldMap(Functions.PLUS, Functions.IDENTITY, 0.0));
+ }
+
+ /** */
+ @Test
+ public void foldMapVectorTest() {
+ toDoubleTest(
+ ref -> 2.0 * Arrays.stream(ref).sum(),
+ (v) -> v.foldMap(v, Functions.PLUS, Functions.PLUS, 0.0));
+
+ }
+
+ /** */
+ private void operatorTest(Vector v, String desc, Function<Vector, Vector> op, Function<Double, Double> refOp) {
+ final int size = v.size();
+ final double[] ref = new double[size];
+
+ VectorImplementationsTest.ElementsChecker checker = new VectorImplementationsTest.ElementsChecker(v, ref, desc);
+
+ Vector actual = op.apply(v);
+
+ for (int idx = 0; idx < size; idx++)
+ ref[idx] = refOp.apply(ref[idx]);
+
+ checker.assertCloseEnough(actual, ref);
+ }
+
+ /** */
+ private void toDoubleTest(Function<double[], Double> calcRef, Function<Vector, Double> calcVec) {
+ consumeSampleVectors((v, desc) -> {
+ final int size = v.size();
+ final double[] ref = new double[size];
+
+ new VectorImplementationsTest.ElementsChecker(v, ref, desc); // IMPL NOTE this initialises vector and reference array
+
+ final VectorImplementationsTest.Metric metric = new VectorImplementationsTest.Metric(calcRef.apply(ref), calcVec.apply(v));
+
+ assertTrue("Not close enough at " + desc
+ + ", " + metric, metric.closeEnough());
+ });
+ }
+
+ /** */
+ private void operationVectorTest(BiFunction<Double, Double, Double> operation,
+ BiFunction<Vector, Vector, Vector> vecOperation) {
+ consumeSampleVectors((v, desc) -> {
+ // TODO find out if more elaborate testing scenario is needed or it's okay as is.
+ final int size = v.size();
+ final double[] ref = new double[size];
+
+ final VectorImplementationsTest.ElementsChecker checker = new VectorImplementationsTest.ElementsChecker(v, ref, desc);
+ final Vector operand = v.copy();
+
+ for (int idx = 0; idx < size; idx++)
+ ref[idx] = operation.apply(ref[idx], ref[idx]);
+
+ checker.assertCloseEnough(vecOperation.apply(v, operand), ref);
+ });
+ }
+
+ /** */
+ private void consumeSampleVectors(BiConsumer<Vector, String> consumer) {
+ new VectorImplementationsFixtures().consumeSampleVectors(null, consumer);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorImplementationsFixtures.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorImplementationsFixtures.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorImplementationsFixtures.java
new file mode 100644
index 0000000..be3bb22
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorImplementationsFixtures.java
@@ -0,0 +1,655 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.BiConsumer;
+import java.util.function.BiFunction;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Supplier;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.StorageConstants;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
+import org.apache.ignite.ml.math.impls.storage.vector.FunctionVectorStorage;
+import org.jetbrains.annotations.NotNull;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+/** */
+class VectorImplementationsFixtures {
+ /** */
+ private static final List<Supplier<Iterable<Vector>>> suppliers = Arrays.asList(
+ (Supplier<Iterable<Vector>>)DenseLocalOnHeapVectorFixture::new,
+ (Supplier<Iterable<Vector>>)DenseLocalOffHeapVectorFixture::new,
+ (Supplier<Iterable<Vector>>)SparseLocalVectorFixture::new,
+ (Supplier<Iterable<Vector>>)RandomVectorFixture::new,
+ (Supplier<Iterable<Vector>>)ConstantVectorFixture::new,
+ (Supplier<Iterable<Vector>>)DelegatingVectorFixture::new,
+ (Supplier<Iterable<Vector>>)FunctionVectorFixture::new,
+ (Supplier<Iterable<Vector>>)SingleElementVectorFixture::new,
+ (Supplier<Iterable<Vector>>)PivotedVectorViewFixture::new,
+ (Supplier<Iterable<Vector>>)SingleElementVectorViewFixture::new,
+ (Supplier<Iterable<Vector>>)MatrixVectorViewFixture::new,
+ (Supplier<Iterable<Vector>>)SparseLocalOffHeapVectorFixture::new
+ );
+
+ /** */
+ void consumeSampleVectors(Consumer<Integer> paramsConsumer, BiConsumer<Vector, String> consumer) {
+ for (Supplier<Iterable<Vector>> fixtureSupplier : VectorImplementationsFixtures.suppliers) {
+ final Iterable<Vector> fixture = fixtureSupplier.get();
+
+ for (Vector v : fixture) {
+ if (paramsConsumer != null)
+ paramsConsumer.accept(v.size());
+
+ consumer.accept(v, fixture.toString());
+ }
+ }
+ }
+
+ /** */
+ void selfTest() {
+ new VectorSizesExtraIterator<>("VectorSizesExtraIterator test",
+ (size, shallowCp) -> new DenseLocalOnHeapVector(new double[size], shallowCp),
+ null, "shallow copy", new Boolean[] {false, true, null}).selfTest();
+
+ new VectorSizesIterator("VectorSizesIterator test", DenseLocalOffHeapVector::new, null).selfTest();
+ }
+
+ /** */
+ private static class DenseLocalOnHeapVectorFixture extends VectorSizesExtraFixture<Boolean> {
+ /** */
+ DenseLocalOnHeapVectorFixture() {
+ super("DenseLocalOnHeapVector",
+ (size, shallowCp) -> new DenseLocalOnHeapVector(new double[size], shallowCp),
+ "shallow copy", new Boolean[] {false, true, null});
+ }
+ }
+
+ /** */
+ private static class DenseLocalOffHeapVectorFixture extends VectorSizesFixture {
+ /** */
+ DenseLocalOffHeapVectorFixture() {
+ super("DenseLocalOffHeapVector", DenseLocalOffHeapVector::new);
+ }
+ }
+
+ /** */
+ private static class SparseLocalVectorFixture extends VectorSizesExtraFixture<Integer> {
+ /** */
+ SparseLocalVectorFixture() {
+ super("SparseLocalVector", SparseLocalVector::new, "access mode",
+ new Integer[] {StorageConstants.SEQUENTIAL_ACCESS_MODE, StorageConstants.RANDOM_ACCESS_MODE, null});
+ }
+ }
+
+ /** */
+ private static class RandomVectorFixture extends VectorSizesFixture {
+ /** */
+ RandomVectorFixture() {
+ super("RandomVector", RandomVector::new);
+ }
+ }
+
+ /** */
+ private static class ConstantVectorFixture extends VectorSizesExtraFixture<Double> {
+ /** */
+ ConstantVectorFixture() {
+ super("ConstantVector", ConstantVector::new,
+ "value", new Double[] {-1.0, 0.0, 0.5, 1.0, 2.0, null});
+ }
+ }
+
+ /** */
+ private static class FunctionVectorFixture extends VectorSizesExtraFixture<Double> {
+ /** */
+ FunctionVectorFixture() {
+ super("FunctionVector",
+ (size, scale) -> new FunctionVectorForTest(new double[size], scale),
+ "scale", new Double[] {0.5, 1.0, 2.0, null});
+ }
+ }
+
+ /** */
+ private static class SingleElementVectorFixture implements Iterable<Vector> {
+ /** */
+ private final Supplier<TwoParamsIterator<Integer, Double>> iter;
+
+ /** */
+ private final AtomicReference<String> ctxDescrHolder = new AtomicReference<>("Iterator not started.");
+
+ /** */
+ SingleElementVectorFixture() {
+ iter = () -> new TwoParamsIterator<Integer, Double>("SingleElementVector",
+ null, ctxDescrHolder::set,
+ "size", new Integer[] {1, null},
+ "value", new Double[] {-1.0, 0.0, 0.5, 1.0, 2.0, null}) {
+
+ /** {@inheritDoc} */
+ @Override BiFunction<Integer, Double, Vector> ctor() {
+ return (size, value) -> new SingleElementVector(size, 0, value);
+ }
+ };
+ }
+
+ /** {@inheritDoc} */
+ @NotNull
+ @Override public Iterator<Vector> iterator() {
+ return iter.get();//(
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ // IMPL NOTE index within bounds is expected to be guaranteed by proper code in this class
+ return ctxDescrHolder.get();
+ }
+ }
+
+ /** */
+ private static class PivotedVectorViewFixture extends VectorSizesFixture {
+ /** */
+ PivotedVectorViewFixture() {
+ super("PivotedVectorView", PivotedVectorViewFixture::pivotedVectorView);
+ }
+
+ /** */
+ private static PivotedVectorView pivotedVectorView(int size) {
+ final DenseLocalOnHeapVector vec = new DenseLocalOnHeapVector(size);
+
+ final int[] pivot = new int[size];
+
+ for (int idx = 0; idx < size; idx++)
+ pivot[idx] = size - 1 - idx;
+
+ PivotedVectorView tmp = new PivotedVectorView(vec, pivot);
+
+ final int[] unpivot = new int[size];
+
+ for (int idx = 0; idx < size; idx++)
+ unpivot[idx] = tmp.unpivot(idx);
+
+ final int[] idxRecovery = new int[size];
+
+ for (int idx = 0; idx < size; idx++)
+ idxRecovery[idx] = idx;
+
+ return new PivotedVectorView(new PivotedVectorView(tmp, unpivot), idxRecovery);
+ }
+ }
+
+ /** */
+ private static class SingleElementVectorViewFixture implements Iterable<Vector> {
+ /** */
+ private final Supplier<TwoParamsIterator<Integer, Double>> iter;
+
+ /** */
+ private final AtomicReference<String> ctxDescrHolder = new AtomicReference<>("Iterator not started.");
+
+ /** */
+ SingleElementVectorViewFixture() {
+ iter = () -> new TwoParamsIterator<Integer, Double>("SingleElementVectorView",
+ null, ctxDescrHolder::set,
+ "size", new Integer[] {1, null},
+ "value", new Double[] {-1.0, 0.0, 0.5, 1.0, 2.0, null}) {
+
+ /** {@inheritDoc} */
+ @Override BiFunction<Integer, Double, Vector> ctor() {
+ return (size, value) -> new SingleElementVectorView(new SingleElementVector(size, 0, value), 0);
+ }
+ };
+ }
+
+ /** {@inheritDoc} */
+ @NotNull
+ @Override public Iterator<Vector> iterator() {
+ return iter.get();
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ // IMPL NOTE index within bounds is expected to be guaranteed by proper code in this class
+ return ctxDescrHolder.get();
+ }
+ }
+
+ /** */
+ private static class MatrixVectorViewFixture extends VectorSizesExtraFixture<Integer> {
+ /** */
+ MatrixVectorViewFixture() {
+ super("MatrixVectorView",
+ MatrixVectorViewFixture::newView,
+ "stride kind", new Integer[] {0, 1, 2, null});
+ }
+
+ /** */
+ private static Vector newView(int size, int strideKind) {
+ final Matrix parent = new DenseLocalOnHeapMatrix(size, size);
+
+ return new MatrixVectorView(parent, 0, 0, strideKind != 1 ? 1 : 0, strideKind != 0 ? 1 : 0);
+ }
+ }
+
+ /** */
+ private static class VectorSizesExtraFixture<T> implements Iterable<Vector> {
+ /** */
+ private final Supplier<VectorSizesExtraIterator<T>> iter;
+
+ /** */
+ private final AtomicReference<String> ctxDescrHolder = new AtomicReference<>("Iterator not started.");
+
+ /** */
+ VectorSizesExtraFixture(String vectorKind, BiFunction<Integer, T, Vector> ctor, String extraParamName,
+ T[] extras) {
+ iter = () -> new VectorSizesExtraIterator<>(vectorKind, ctor, ctxDescrHolder::set, extraParamName, extras);
+ }
+
+ /** {@inheritDoc} */
+ @NotNull
+ @Override public Iterator<Vector> iterator() {
+ return iter.get();
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ // IMPL NOTE index within bounds is expected to be guaranteed by proper code in this class
+ return ctxDescrHolder.get();
+ }
+ }
+
+ /** */
+ private static abstract class VectorSizesFixture implements Iterable<Vector> {
+ /** */
+ private final Supplier<VectorSizesIterator> iter;
+
+ /** */
+ private final AtomicReference<String> ctxDescrHolder = new AtomicReference<>("Iterator not started.");
+
+ /** */
+ VectorSizesFixture(String vectorKind, Function<Integer, Vector> ctor) {
+ iter = () -> new VectorSizesIterator(vectorKind, ctor, ctxDescrHolder::set);
+ }
+
+ /** {@inheritDoc} */
+ @NotNull
+ @Override public Iterator<Vector> iterator() {
+ return iter.get();
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ // IMPL NOTE index within bounds is expected to be guaranteed by proper code in this class
+ return ctxDescrHolder.get();
+ }
+ }
+
+ /** */
+ private static class VectorSizesExtraIterator<T> extends VectorSizesIterator {
+ /** */
+ private final T[] extras;
+ /** */
+ private int extraIdx = 0;
+ /** */
+ private final BiFunction<Integer, T, Vector> ctor;
+ /** */
+ private final String extraParamName;
+
+ /**
+ * @param vectorKind Descriptive name to use for context logging.
+ * @param ctor Constructor for objects to iterate over.
+ * @param ctxDescrConsumer Context logging consumer.
+ * @param extraParamName Name of extra parameter to iterate over.
+ * @param extras Array of extra parameter values to iterate over.
+ */
+ VectorSizesExtraIterator(String vectorKind, BiFunction<Integer, T, Vector> ctor,
+ Consumer<String> ctxDescrConsumer, String extraParamName, T[] extras) {
+ super(vectorKind, null, ctxDescrConsumer);
+
+ this.ctor = ctor;
+ this.extraParamName = extraParamName;
+ this.extras = extras;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean hasNext() {
+ return super.hasNext() && hasNextExtra(extraIdx);
+ }
+
+ /** {@inheritDoc} */
+ @Override void nextIdx() {
+ assert extras[extraIdx] != null
+ : "Index(es) out of bound at " + VectorSizesExtraIterator.this;
+
+ if (hasNextExtra(extraIdx + 1)) {
+ extraIdx++;
+
+ return;
+ }
+
+ extraIdx = 0;
+
+ super.nextIdx();
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ // IMPL NOTE index within bounds is expected to be guaranteed by proper code in this class
+ return "{" + super.toString() +
+ ", " + extraParamName + "=" + extras[extraIdx] +
+ '}';
+ }
+
+ /** {@inheritDoc} */
+ @Override BiFunction<Integer, Integer, Vector> ctor() {
+ return (size, delta) -> ctor.apply(size + delta, extras[extraIdx]);
+ }
+
+ /** */
+ void selfTest() {
+ final Set<Integer> extraIdxs = new HashSet<>();
+
+ int cnt = 0;
+
+ while (hasNext()) {
+ assertNotNull("Expect not null vector at " + this, next());
+
+ if (extras[extraIdx] != null)
+ extraIdxs.add(extraIdx);
+
+ cnt++;
+ }
+
+ assertEquals("Extra param tested", extraIdxs.size(), extras.length - 1);
+
+ assertEquals("Combinations tested mismatch.",
+ 7 * 3 * (extras.length - 1), cnt);
+ }
+
+ /** */
+ private boolean hasNextExtra(int idx) {
+ return extras[idx] != null;
+ }
+ }
+
+ /** */
+ private static class VectorSizesIterator extends TwoParamsIterator<Integer, Integer> {
+ /** */
+ private final Function<Integer, Vector> ctor;
+
+ /** */
+ VectorSizesIterator(String vectorKind, Function<Integer, Vector> ctor, Consumer<String> ctxDescrConsumer) {
+ super(vectorKind, null, ctxDescrConsumer,
+ "size", new Integer[] {2, 4, 8, 16, 32, 64, 128, null},
+ "size delta", new Integer[] {-1, 0, 1, null});
+
+ this.ctor = ctor;
+ }
+
+ /** {@inheritDoc} */
+ @Override BiFunction<Integer, Integer, Vector> ctor() {
+ return (size, delta) -> ctor.apply(size + delta);
+ }
+ }
+
+ /** */
+ private static class TwoParamsIterator<T, U> implements Iterator<Vector> {
+ /** */
+ private final T params1[];
+
+ /** */
+ private final U params2[];
+
+ /** */
+ private final String vectorKind;
+
+ /** */
+ private final String param1Name;
+
+ /** */
+ private final String param2Name;
+
+ /** */
+ private final BiFunction<T, U, Vector> ctor;
+
+ /** */
+ private final Consumer<String> ctxDescrConsumer;
+
+ /** */
+ private int param1Idx = 0;
+
+ /** */
+ private int param2Idx = 0;
+
+ /** */
+ TwoParamsIterator(String vectorKind, BiFunction<T, U, Vector> ctor,
+ Consumer<String> ctxDescrConsumer, String param1Name, T[] params1, String param2Name, U[] params2) {
+ this.param1Name = param1Name;
+ this.params1 = params1;
+
+ this.param2Name = param2Name;
+ this.params2 = params2;
+
+ this.vectorKind = vectorKind;
+
+ this.ctor = ctor;
+
+ this.ctxDescrConsumer = ctxDescrConsumer;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean hasNext() {
+ return hasNextParam1(param1Idx) && hasNextParam2(param2Idx);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector next() {
+ if (!hasNext())
+ throw new NoSuchElementException(TwoParamsIterator.this.toString());
+
+ if (ctxDescrConsumer != null)
+ ctxDescrConsumer.accept(toString());
+
+ Vector res = ctor().apply(params1[param1Idx], params2[param2Idx]);
+
+ nextIdx();
+
+ return res;
+ }
+
+ /** */
+ void selfTest() {
+ final Set<Integer> sizeIdxs = new HashSet<>(), deltaIdxs = new HashSet<>();
+
+ int cnt = 0;
+
+ while (hasNext()) {
+ assertNotNull("Expect not null vector at " + this, next());
+
+ if (params1[param1Idx] != null)
+ sizeIdxs.add(param1Idx);
+
+ if (params2[param2Idx] != null)
+ deltaIdxs.add(param2Idx);
+
+ cnt++;
+ }
+
+ assertEquals("Sizes tested mismatch.", sizeIdxs.size(), params1.length - 1);
+
+ assertEquals("Deltas tested", deltaIdxs.size(), params2.length - 1);
+
+ assertEquals("Combinations tested mismatch.",
+ (params1.length - 1) * (params2.length - 1), cnt);
+ }
+
+ /** IMPL NOTE override in subclasses if needed */
+ void nextIdx() {
+ assert params1[param1Idx] != null && params2[param2Idx] != null
+ : "Index(es) out of bound at " + TwoParamsIterator.this;
+
+ if (hasNextParam2(param2Idx + 1)) {
+ param2Idx++;
+
+ return;
+ }
+
+ param2Idx = 0;
+
+ param1Idx++;
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ // IMPL NOTE index within bounds is expected to be guaranteed by proper code in this class
+ return vectorKind + "{" + param1Name + "=" + params1[param1Idx] +
+ ", " + param2Name + "=" + params2[param2Idx] +
+ '}';
+ }
+
+ /** IMPL NOTE override in subclasses if needed */
+ BiFunction<T, U, Vector> ctor() {
+ return ctor;
+ }
+
+ /** */
+ private boolean hasNextParam1(int idx) {
+ return params1[idx] != null;
+ }
+
+ /** */
+ private boolean hasNextParam2(int idx) {
+ return params2[idx] != null;
+ }
+ }
+
+ /** Delegating vector with dense local onheap vector */
+ private static class DelegatingVectorFixture implements Iterable<Vector> {
+
+ /** */
+ private final Supplier<VectorSizesExtraIterator<Boolean>> iter;
+
+ /** */
+ private final AtomicReference<String> ctxDescrHolder = new AtomicReference<>("Iterator not started.");
+
+ /** */
+ DelegatingVectorFixture() {
+ iter = () -> new VectorSizesExtraIterator<>("DelegatingVector with DenseLocalOnHeapVector",
+ (size, shallowCp) -> new DelegatingVector(new DenseLocalOnHeapVector(new double[size], shallowCp)),
+ ctxDescrHolder::set, "shallow copy", new Boolean[] {false, true, null});
+ }
+
+ /** {@inheritDoc} */
+ @NotNull
+ @Override public Iterator<Vector> iterator() {
+ return iter.get();
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ // IMPL NOTE index within bounds is expected to be guaranteed by proper code in this class
+ return ctxDescrHolder.get();
+ }
+ }
+
+ /** Subclass tweaked for serialization */
+ private static class FunctionVectorForTest extends FunctionVector {
+ /** */
+ double[] arr;
+
+ /** */
+ double scale;
+
+ /** */
+ public FunctionVectorForTest() {
+ // No-op.
+ }
+
+ /** */
+ FunctionVectorForTest(double[] arr, double scale) {
+ super(arr.length, idx -> arr[idx] * scale, (idx, value) -> arr[idx] = value / scale);
+
+ this.arr = arr;
+
+ this.scale = scale;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ super.writeExternal(out);
+
+ out.writeObject(arr);
+
+ out.writeDouble(scale);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ super.readExternal(in);
+
+ arr = (double[])in.readObject();
+
+ scale = in.readDouble();
+
+ setStorage(new FunctionVectorStorage(arr.length, idx -> arr[idx] * scale, (idx, value) -> arr[idx] = value / scale));
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ int res = 1;
+
+ res = res * 37 + Double.hashCode(scale);
+ res = res * 37 + Integer.hashCode(getStorage().size());
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object o) {
+ if (this == o)
+ return true;
+
+ if (o == null || getClass() != o.getClass())
+ return false;
+
+ FunctionVectorForTest that = (FunctionVectorForTest)o;
+
+ return new Double(scale).equals(that.scale)
+ && (arr != null ? Arrays.equals(arr, that.arr) : that.arr == null);
+ }
+ }
+
+ /** */
+ private static class SparseLocalOffHeapVectorFixture extends VectorSizesFixture {
+
+ /** */
+ SparseLocalOffHeapVectorFixture() {
+ super("SparseLocalOffHeapVector", SparseLocalOffHeapVector::new);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorImplementationsTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorImplementationsTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorImplementationsTest.java
new file mode 100644
index 0000000..48dcc36
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorImplementationsTest.java
@@ -0,0 +1,861 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import java.util.Arrays;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.BiConsumer;
+import java.util.function.BiFunction;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import org.apache.ignite.IgniteException;
+import org.apache.ignite.ml.math.ExternalizeTest;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.CardinalityException;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.junit.Assert;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+/** See also: {@link AbstractVectorTest} and {@link VectorToMatrixTest}. */
+public class VectorImplementationsTest { // todo split this to smaller cohesive test classes
+ /** */
+ @Test
+ public void vectorImplementationsFixturesTest() {
+ new VectorImplementationsFixtures().selfTest();
+ }
+
+ /** */
+ @Test
+ public void setGetTest() {
+ consumeSampleVectors((v, desc) -> mutateAtIdxTest(v, desc, (vec, idx, val) -> {
+ vec.set(idx, val);
+
+ return val;
+ }));
+ }
+
+ /** */
+ @Test
+ public void setXTest() {
+ consumeSampleVectors((v, desc) -> mutateAtIdxTest(v, desc, (vec, idx, val) -> {
+ vec.setX(idx, val);
+
+ return val;
+ }));
+ }
+
+ /** */
+ @Test
+ public void incrementTest() {
+ consumeSampleVectors((v, desc) -> mutateAtIdxTest(v, desc, (vec, idx, val) -> {
+ double old = vec.get(idx);
+
+ vec.increment(idx, val);
+
+ return old + val;
+ }));
+ }
+
+ /** */
+ @Test
+ public void incrementXTest() {
+ consumeSampleVectors((v, desc) -> mutateAtIdxTest(v, desc, (vec, idx, val) -> {
+ double old = vec.getX(idx);
+
+ vec.incrementX(idx, val);
+
+ return old + val;
+ }));
+ }
+
+ /** */
+ @Test
+ public void operateXOutOfBoundsTest() {
+ consumeSampleVectors((v, desc) -> {
+ if (v instanceof DenseLocalOffHeapVector || v instanceof SparseLocalVector || v instanceof SparseLocalOffHeapVector)
+ return; // todo find out if it's OK to skip by instances here
+
+ boolean expECaught = false;
+
+ try {
+ v.getX(-1);
+ }
+ catch (ArrayIndexOutOfBoundsException | IgniteException e) {
+ expECaught = true;
+ }
+
+ if (!getXOutOfBoundsOK(v))
+ assertTrue("Expect exception at negative index getX in " + desc, expECaught);
+
+ expECaught = false;
+
+ try {
+ v.setX(-1, 0);
+ }
+ catch (ArrayIndexOutOfBoundsException | IgniteException e) {
+ expECaught = true;
+ }
+
+ assertTrue("Expect exception at negative index setX in " + desc, expECaught);
+
+ expECaught = false;
+
+ try {
+ v.incrementX(-1, 1);
+ }
+ catch (ArrayIndexOutOfBoundsException | IgniteException e) {
+ expECaught = true;
+ }
+
+ assertTrue("Expect exception at negative index incrementX in " + desc, expECaught);
+
+ expECaught = false;
+
+ try {
+ v.getX(v.size());
+ }
+ catch (ArrayIndexOutOfBoundsException | IgniteException e) {
+ expECaught = true;
+ }
+
+ if (!getXOutOfBoundsOK(v))
+ assertTrue("Expect exception at too large index getX in " + desc, expECaught);
+
+ expECaught = false;
+
+ try {
+ v.setX(v.size(), 1);
+ }
+ catch (ArrayIndexOutOfBoundsException | IgniteException e) {
+ expECaught = true;
+ }
+
+ assertTrue("Expect exception at too large index setX in " + desc, expECaught);
+
+ expECaught = false;
+
+ try {
+ v.incrementX(v.size(), 1);
+ }
+ catch (ArrayIndexOutOfBoundsException | IgniteException e) {
+ expECaught = true;
+ }
+
+ assertTrue("Expect exception at too large index incrementX in " + desc, expECaught);
+ });
+ }
+
+ /** */
+ @Test
+ public void sizeTest() {
+ final AtomicReference<Integer> expSize = new AtomicReference<>(0);
+
+ consumeSampleVectors(
+ expSize::set,
+ (v, desc) -> Assert.assertEquals("Expected size for " + desc,
+ (int)expSize.get(), v.size())
+ );
+ }
+
+ /** */
+ @Test
+ public void getElementTest() {
+ consumeSampleVectors((v, desc) -> new ElementsChecker(v, desc).assertCloseEnough(v));
+ }
+
+ /** */
+ @Test
+ public void copyTest() {
+ consumeSampleVectors((v, desc) -> new ElementsChecker(v, desc).assertCloseEnough(v.copy()));
+ }
+
+ /** */
+ @Test
+ public void divideTest() {
+ operationTest((val, operand) -> val / operand, Vector::divide);
+ }
+
+ /** */
+ @Test
+ public void likeTest() {
+ for (int card : new int[] {1, 2, 4, 8, 16, 32, 64, 128})
+ consumeSampleVectors((v, desc) -> {
+ Class<? extends Vector> expType = expLikeType(v);
+
+ if (expType == null) {
+ try {
+ v.like(card);
+ }
+ catch (UnsupportedOperationException uoe) {
+ return;
+ }
+
+ fail("Expected exception wasn't caught for " + desc);
+
+ return;
+ }
+
+ Vector vLike = v.like(card);
+
+ assertNotNull("Expect non-null like vector for " + expType.getSimpleName() + " in " + desc, vLike);
+ assertEquals("Expect size equal to cardinality at " + desc, card, vLike.size());
+
+ Class<? extends Vector> actualType = vLike.getClass();
+
+ assertTrue("Actual vector type " + actualType.getSimpleName()
+ + " should be assignable from expected type " + expType.getSimpleName() + " in " + desc,
+ actualType.isAssignableFrom(expType));
+ });
+ }
+
+ /** */
+ @Test
+ public void minusTest() {
+ operationVectorTest((operand1, operand2) -> operand1 - operand2, Vector::minus);
+ }
+
+ /** */
+ @Test
+ public void plusVectorTest() {
+ operationVectorTest((operand1, operand2) -> operand1 + operand2, Vector::plus);
+ }
+
+ /** */
+ @Test
+ public void plusDoubleTest() {
+ operationTest((val, operand) -> val + operand, Vector::plus);
+ }
+
+ /** */
+ @Test
+ public void timesVectorTest() {
+ operationVectorTest((operand1, operand2) -> operand1 * operand2, Vector::times);
+ }
+
+ /** */
+ @Test
+ public void timesDoubleTest() {
+ operationTest((val, operand) -> val * operand, Vector::times);
+ }
+
+ /** */
+ @Test
+ public void viewPartTest() {
+ consumeSampleVectors((v, desc) -> {
+ final int size = v.size();
+ final double[] ref = new double[size];
+ final int delta = size > 32 ? 3 : 1; // IMPL NOTE this is for faster test execution
+
+ final ElementsChecker checker = new ElementsChecker(v, ref, desc);
+
+ for (int off = 0; off < size; off += delta)
+ for (int len = 1; len < size - off; len += delta)
+ checker.assertCloseEnough(v.viewPart(off, len), Arrays.copyOfRange(ref, off, off + len));
+ });
+ }
+
+ /** */
+ @Test
+ public void sumTest() {
+ toDoubleTest(
+ ref -> Arrays.stream(ref).sum(),
+ Vector::sum);
+ }
+
+ /** */
+ @Test
+ public void minValueTest() {
+ toDoubleTest(
+ ref -> Arrays.stream(ref).min().getAsDouble(),
+ Vector::minValue);
+ }
+
+ /** */
+ @Test
+ public void maxValueTest() {
+ toDoubleTest(
+ ref -> Arrays.stream(ref).max().getAsDouble(),
+ Vector::maxValue);
+ }
+
+ /** */
+ @Test
+ public void sortTest() {
+ consumeSampleVectors((v, desc) -> {
+ if (readOnly(v) || !v.isArrayBased()) {
+ boolean expECaught = false;
+
+ try {
+ v.sort();
+ }
+ catch (UnsupportedOperationException uoe) {
+ expECaught = true;
+ }
+
+ assertTrue("Expected exception was not caught for sort in " + desc, expECaught);
+
+ return;
+ }
+
+ final int size = v.size();
+ final double[] ref = new double[size];
+
+ new ElementsChecker(v, ref, desc).assertCloseEnough(v.sort(), Arrays.stream(ref).sorted().toArray());
+ });
+ }
+
+ /** */
+ @Test
+ public void metaAttributesTest() {
+ consumeSampleVectors((v, desc) -> {
+ assertNotNull("Null meta storage in " + desc, v.getMetaStorage());
+
+ final String key = "test key";
+ final String val = "test value";
+ final String details = "key [" + key + "] for " + desc;
+
+ v.setAttribute(key, val);
+ assertTrue("Expect to have meta attribute for " + details, v.hasAttribute(key));
+ assertEquals("Unexpected meta attribute value for " + details, val, v.getAttribute(key));
+
+ v.removeAttribute(key);
+ assertFalse("Expect not to have meta attribute for " + details, v.hasAttribute(key));
+ assertNull("Unexpected meta attribute value for " + details, v.getAttribute(key));
+ });
+ }
+
+ /** */
+ @Test
+ public void assignDoubleTest() {
+ consumeSampleVectors((v, desc) -> {
+ if (readOnly(v))
+ return;
+
+ for (double val : new double[] {0, -1, 0, 1}) {
+ v.assign(val);
+
+ for (int idx = 0; idx < v.size(); idx++) {
+ final Metric metric = new Metric(val, v.get(idx));
+
+ assertTrue("Not close enough at index " + idx + ", val " + val + ", " + metric
+ + ", " + desc, metric.closeEnough());
+ }
+ }
+ });
+ }
+
+ /** */
+ @Test
+ public void assignDoubleArrTest() {
+ consumeSampleVectors((v, desc) -> {
+ if (readOnly(v))
+ return;
+
+ final int size = v.size();
+ final double[] ref = new double[size];
+
+ final ElementsChecker checker = new ElementsChecker(v, ref, desc);
+
+ for (int idx = 0; idx < size; idx++)
+ ref[idx] = -ref[idx];
+
+ v.assign(ref);
+
+ checker.assertCloseEnough(v, ref);
+
+ assignDoubleArrWrongCardinality(v, desc);
+ });
+ }
+
+ /** */
+ @Test
+ public void assignVectorTest() {
+ consumeSampleVectors((v, desc) -> {
+ if (readOnly(v))
+ return;
+
+ final int size = v.size();
+ final double[] ref = new double[size];
+
+ final ElementsChecker checker = new ElementsChecker(v, ref, desc);
+
+ for (int idx = 0; idx < size; idx++)
+ ref[idx] = -ref[idx];
+
+ v.assign(new DenseLocalOnHeapVector(ref));
+
+ checker.assertCloseEnough(v, ref);
+
+ assignVectorWrongCardinality(v, desc);
+ });
+ }
+
+ /** */
+ @Test
+ public void assignFunctionTest() {
+ consumeSampleVectors((v, desc) -> {
+ if (readOnly(v))
+ return;
+
+ final int size = v.size();
+ final double[] ref = new double[size];
+
+ final ElementsChecker checker = new ElementsChecker(v, ref, desc);
+
+ for (int idx = 0; idx < size; idx++)
+ ref[idx] = -ref[idx];
+
+ v.assign((idx) -> ref[idx]);
+
+ checker.assertCloseEnough(v, ref);
+ });
+ }
+
+ /** */
+ @Test
+ public void minElementTest() {
+ consumeSampleVectors((v, desc) -> {
+ final ElementsChecker checker = new ElementsChecker(v, desc);
+
+ final Vector.Element minE = v.minElement();
+
+ final int minEIdx = minE.index();
+
+ assertTrue("Unexpected index from minElement " + minEIdx + ", " + desc,
+ minEIdx >= 0 && minEIdx < v.size());
+
+ final Metric metric = new Metric(minE.get(), v.minValue());
+
+ assertTrue("Not close enough minElement at index " + minEIdx + ", " + metric
+ + ", " + desc, metric.closeEnough());
+
+ checker.assertNewMinElement(v);
+ });
+ }
+
+ /** */
+ @Test
+ public void maxElementTest() {
+ consumeSampleVectors((v, desc) -> {
+ final ElementsChecker checker = new ElementsChecker(v, desc);
+
+ final Vector.Element maxE = v.maxElement();
+
+ final int minEIdx = maxE.index();
+
+ assertTrue("Unexpected index from minElement " + minEIdx + ", " + desc,
+ minEIdx >= 0 && minEIdx < v.size());
+
+ final Metric metric = new Metric(maxE.get(), v.maxValue());
+
+ assertTrue("Not close enough maxElement at index " + minEIdx + ", " + metric
+ + ", " + desc, metric.closeEnough());
+
+ checker.assertNewMaxElement(v);
+ });
+ }
+
+ /** */
+ @Test
+ public void externalizeTest() {
+ (new ExternalizeTest<Vector>() {
+ /** {@inheritDoc} */
+ @Override public void externalizeTest() {
+ consumeSampleVectors((v, desc) -> {
+ if (v instanceof SparseLocalOffHeapVector)
+ return; //TODO: wait till SparseLocalOffHeapVector externalization support.
+
+ externalizeTest(v);
+ });
+ }
+ }).externalizeTest();
+ }
+
+ /** */
+ @Test
+ public void hashCodeTest() {
+ consumeSampleVectors((v, desc) -> assertTrue("Zero hash code for " + desc, v.hashCode() != 0));
+ }
+
+ /** */
+ private boolean getXOutOfBoundsOK(Vector v) {
+ // todo find out if this is indeed OK
+ return v instanceof RandomVector || v instanceof ConstantVector
+ || v instanceof SingleElementVector || v instanceof SingleElementVectorView;
+ }
+
+ /** */
+ private void mutateAtIdxTest(Vector v, String desc, MutateAtIdx operation) {
+ if (readOnly(v)) {
+ if (v.size() < 1)
+ return;
+
+ boolean expECaught = false;
+
+ try {
+ operation.apply(v, 0, 1);
+ }
+ catch (UnsupportedOperationException uoe) {
+ expECaught = true;
+ }
+
+ assertTrue("Expect exception at attempt to mutate element in " + desc, expECaught);
+
+ return;
+ }
+
+ for (double val : new double[] {0, -1, 0, 1})
+ for (int idx = 0; idx < v.size(); idx++) {
+ double exp = operation.apply(v, idx, val);
+
+ final Metric metric = new Metric(exp, v.get(idx));
+
+ assertTrue("Not close enough at index " + idx + ", val " + val + ", " + metric
+ + ", " + desc, metric.closeEnough());
+ }
+ }
+
+ /** */
+ private Class<? extends Vector> expLikeType(Vector v) {
+ Class<? extends Vector> clazz = v.getClass();
+
+ if (clazz.isAssignableFrom(PivotedVectorView.class) || clazz.isAssignableFrom(SingleElementVectorView.class))
+ return null;
+
+ if (clazz.isAssignableFrom(MatrixVectorView.class) || clazz.isAssignableFrom(DelegatingVector.class))
+ return DenseLocalOnHeapVector.class; // IMPL NOTE per fixture
+
+ return clazz;
+ }
+
+ /** */
+ private void toDoubleTest(Function<double[], Double> calcRef, Function<Vector, Double> calcVec) {
+ consumeSampleVectors((v, desc) -> {
+ final int size = v.size();
+ final double[] ref = new double[size];
+
+ new ElementsChecker(v, ref, desc); // IMPL NOTE this initialises vector and reference array
+
+ final Metric metric = new Metric(calcRef.apply(ref), calcVec.apply(v));
+
+ assertTrue("Not close enough at " + desc
+ + ", " + metric, metric.closeEnough());
+ });
+ }
+
+ /** */
+ private void operationVectorTest(BiFunction<Double, Double, Double> operation,
+ BiFunction<Vector, Vector, Vector> vecOperation) {
+ consumeSampleVectors((v, desc) -> {
+ // TODO find out if more elaborate testing scenario is needed or it's okay as is.
+ final int size = v.size();
+ final double[] ref = new double[size];
+
+ final ElementsChecker checker = new ElementsChecker(v, ref, desc);
+ final Vector operand = v.copy();
+
+ for (int idx = 0; idx < size; idx++)
+ ref[idx] = operation.apply(ref[idx], ref[idx]);
+
+ checker.assertCloseEnough(vecOperation.apply(v, operand), ref);
+
+ assertWrongCardinality(v, desc, vecOperation);
+ });
+ }
+
+ /** */
+ private void assignDoubleArrWrongCardinality(Vector v, String desc) {
+ boolean expECaught = false;
+
+ try {
+ v.assign(new double[v.size() + 1]);
+ }
+ catch (CardinalityException ce) {
+ expECaught = true;
+ }
+
+ assertTrue("Expect exception at too large size in " + desc, expECaught);
+
+ if (v.size() < 2)
+ return;
+
+ expECaught = false;
+
+ try {
+ v.assign(new double[v.size() - 1]);
+ }
+ catch (CardinalityException ce) {
+ expECaught = true;
+ }
+
+ assertTrue("Expect exception at too small size in " + desc, expECaught);
+ }
+
+ /** */
+ private void assignVectorWrongCardinality(Vector v, String desc) {
+ boolean expECaught = false;
+
+ try {
+ v.assign(new DenseLocalOnHeapVector(v.size() + 1));
+ }
+ catch (CardinalityException ce) {
+ expECaught = true;
+ }
+
+ assertTrue("Expect exception at too large size in " + desc, expECaught);
+
+ if (v.size() < 2)
+ return;
+
+ expECaught = false;
+
+ try {
+ v.assign(new DenseLocalOnHeapVector(v.size() - 1));
+ }
+ catch (CardinalityException ce) {
+ expECaught = true;
+ }
+
+ assertTrue("Expect exception at too small size in " + desc, expECaught);
+ }
+
+ /** */
+ private void assertWrongCardinality(
+ Vector v, String desc, BiFunction<Vector, Vector, Vector> vecOperation) {
+ boolean expECaught = false;
+
+ try {
+ vecOperation.apply(v, new DenseLocalOnHeapVector(v.size() + 1));
+ }
+ catch (CardinalityException ce) {
+ expECaught = true;
+ }
+
+ assertTrue("Expect exception at too large size in " + desc, expECaught);
+
+ if (v.size() < 2)
+ return;
+
+ expECaught = false;
+
+ try {
+ vecOperation.apply(v, new DenseLocalOnHeapVector(v.size() - 1));
+ }
+ catch (CardinalityException ce) {
+ expECaught = true;
+ }
+
+ assertTrue("Expect exception at too small size in " + desc, expECaught);
+ }
+
+ /** */
+ private void operationTest(BiFunction<Double, Double, Double> operation,
+ BiFunction<Vector, Double, Vector> vecOperation) {
+ for (double val : new double[] {0, 0.1, 1, 2, 10})
+ consumeSampleVectors((v, desc) -> {
+ final int size = v.size();
+ final double[] ref = new double[size];
+
+ final ElementsChecker checker = new ElementsChecker(v, ref, "val " + val + ", " + desc);
+
+ for (int idx = 0; idx < size; idx++)
+ ref[idx] = operation.apply(ref[idx], val);
+
+ checker.assertCloseEnough(vecOperation.apply(v, val), ref);
+ });
+ }
+
+ /** */
+ private void consumeSampleVectors(BiConsumer<Vector, String> consumer) {
+ consumeSampleVectors(null, consumer);
+ }
+
+ /** */
+ private void consumeSampleVectors(Consumer<Integer> paramsConsumer, BiConsumer<Vector, String> consumer) {
+ new VectorImplementationsFixtures().consumeSampleVectors(paramsConsumer, consumer);
+ }
+
+ /** */
+ private static boolean readOnly(Vector v) {
+ return v instanceof RandomVector || v instanceof ConstantVector;
+ }
+
+ /** */
+ private interface MutateAtIdx {
+ /** */
+ double apply(Vector v, int idx, double val);
+ }
+
+ /** */
+ static class ElementsChecker {
+ /** */
+ private final String fixtureDesc;
+
+ /** */
+ private final double[] refReadOnly;
+
+ /** */
+ private final boolean nonNegative;
+
+ /** */
+ ElementsChecker(Vector v, double[] ref, String fixtureDesc, boolean nonNegative) {
+ this.fixtureDesc = fixtureDesc;
+
+ this.nonNegative = nonNegative;
+
+ refReadOnly = readOnly(v) && ref == null ? new double[v.size()] : null;
+
+ init(v, ref);
+ }
+
+ /** */
+ ElementsChecker(Vector v, double[] ref, String fixtureDesc) {
+ this(v, ref, fixtureDesc, false);
+ }
+
+ /** */
+ ElementsChecker(Vector v, String fixtureDesc) {
+ this(v, null, fixtureDesc);
+ }
+
+ /** */
+ void assertCloseEnough(Vector obtained, double[] exp) {
+ final int size = obtained.size();
+
+ for (int i = 0; i < size; i++) {
+ final Vector.Element e = obtained.getElement(i);
+
+ if (refReadOnly != null && exp == null)
+ exp = refReadOnly;
+
+ final Metric metric = new Metric(exp == null ? generated(i) : exp[i], e.get());
+
+ assertEquals("Unexpected vector index at " + fixtureDesc, i, e.index());
+ assertTrue("Not close enough at index " + i + ", size " + size + ", " + metric
+ + ", " + fixtureDesc, metric.closeEnough());
+ }
+ }
+
+ /** */
+ void assertCloseEnough(Vector obtained) {
+ assertCloseEnough(obtained, null);
+ }
+
+ /** */
+ void assertNewMinElement(Vector v) {
+ if (readOnly(v))
+ return;
+
+ int exp = v.size() / 2;
+
+ v.set(exp, -(v.size() * 2 + 1));
+
+ assertEquals("Unexpected minElement index at " + fixtureDesc, exp, v.minElement().index());
+ }
+
+ /** */
+ void assertNewMaxElement(Vector v) {
+ if (readOnly(v))
+ return;
+
+ int exp = v.size() / 2;
+
+ v.set(exp, v.size() * 2 + 1);
+
+ assertEquals("Unexpected minElement index at " + fixtureDesc, exp, v.maxElement().index());
+ }
+
+ /** */
+ private void init(Vector v, double[] ref) {
+ if (readOnly(v)) {
+ initReadonly(v, ref);
+
+ return;
+ }
+
+ for (Vector.Element e : v.all()) {
+ int idx = e.index();
+
+ // IMPL NOTE introduce negative values because their absence
+ // blocked catching an ugly bug in AbstractVector#kNorm
+ int val = generated(idx);
+
+ e.set(val);
+
+ if (ref != null)
+ ref[idx] = val;
+ }
+ }
+
+ /** */
+ private void initReadonly(Vector v, double[] ref) {
+ if (refReadOnly != null)
+ for (Vector.Element e : v.all())
+ refReadOnly[e.index()] = e.get();
+
+ if (ref != null)
+ for (Vector.Element e : v.all())
+ ref[e.index()] = e.get();
+ }
+
+ /** */
+ private int generated(int idx) {
+ return nonNegative || (idx & 1) == 0 ? idx : -idx;
+ }
+ }
+
+ /** */
+ static class Metric { // todo consider if softer tolerance (like say 0.1 or 0.01) would make sense here
+ /** */
+ private final double exp;
+
+ /** */
+ private final double obtained;
+
+ /** **/
+ Metric(double exp, double obtained) {
+ this.exp = exp;
+ this.obtained = obtained;
+ }
+
+ /** */
+ boolean closeEnough() {
+ return new Double(exp).equals(obtained) || closeEnoughToZero();
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return "Metric{" + "expected=" + exp +
+ ", obtained=" + obtained +
+ '}';
+ }
+
+ /** */
+ private boolean closeEnoughToZero() {
+ return (new Double(exp).equals(0.0) && new Double(obtained).equals(-0.0))
+ || (new Double(exp).equals(-0.0) && new Double(obtained).equals(0.0));
+ }
+ }
+}
[20/67] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math
module to Ignite ML module added missed licenses renamed packages fixed wrong
ml profile activation (cherry picked from commit d78e071)
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/RandomMatrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/RandomMatrix.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/RandomMatrix.java
deleted file mode 100644
index 2c3dcb2..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/RandomMatrix.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * 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.ignite.math.impls.matrix;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.MatrixStorage;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.impls.storage.matrix.RandomMatrixStorage;
-import org.apache.ignite.math.impls.vector.RandomVector;
-
-/**
- * Implementation of {@link Matrix} with random values in the elements.
- */
-public class RandomMatrix extends AbstractMatrix {
- /** Whether fast hash is used, see {@link RandomMatrixStorage}. */
- private boolean fastHash;
-
- /**
- * @param rows Amount of rows in the matrix.
- * @param cols Amount of columns in the matrix.
- * @param fastHash Whether fast hash is used.
- */
- private MatrixStorage mkStorage(int rows, int cols, boolean fastHash) {
- this.fastHash = fastHash;
-
- return new RandomMatrixStorage(rows, cols, fastHash);
- }
-
- /**
- * @param rows Amount of rows in the matrix.
- * @param cols Amount of columns in the matrix.
- * @param fastHash Whether fast hash is used.
- */
- public RandomMatrix(int rows, int cols, boolean fastHash) {
- setStorage(mkStorage(rows, cols, fastHash));
- }
-
- /**
- * @param rows Amount of rows in the matrix.
- * @param cols Amount of columns in the matrix.
- */
- public RandomMatrix(int rows, int cols) {
- this(rows, cols, true);
- }
-
- /** */
- public RandomMatrix() {
- // No-op.
- }
-
- /** {@inheritDoc} */
- @Override public Matrix copy() {
- return new RandomMatrix(rowSize(), columnSize(), fastHash);
- }
-
- /** {@inheritDoc} */
- @Override public Matrix like(int rows, int cols) {
- return new RandomMatrix(rows, cols);
- }
-
- /** {@inheritDoc} */
- @Override public Vector likeVector(int crd) {
- return new RandomVector(crd);
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- super.writeExternal(out);
-
- out.writeBoolean(fastHash);
- }
-
- /** {@inheritDoc} */
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- super.readExternal(in);
-
- fastHash = in.readBoolean();
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/SparseDistributedMatrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/SparseDistributedMatrix.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/SparseDistributedMatrix.java
deleted file mode 100644
index 5c40d70..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/SparseDistributedMatrix.java
+++ /dev/null
@@ -1,155 +0,0 @@
-// @java.file.header
-
-/* _________ _____ __________________ _____
- * __ ____/___________(_)______ /__ ____/______ ____(_)_______
- * _ / __ __ ___/__ / _ __ / _ / __ _ __ `/__ / __ __ \
- * / /_/ / _ / _ / / /_/ / / /_/ / / /_/ / _ / _ / / /
- * \____/ /_/ /_/ \_,__/ \____/ \__,_/ /_/ /_/ /_/
- */
-
-/*
- * 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.ignite.math.impls.matrix;
-
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.StorageConstants;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.apache.ignite.math.functions.IgniteDoubleFunction;
-import org.apache.ignite.math.functions.IgniteFunction;
-import org.apache.ignite.math.impls.CacheUtils;
-import org.apache.ignite.math.impls.storage.matrix.SparseDistributedMatrixStorage;
-
-/**
- * Sparse distributed matrix implementation based on data grid.
- *
- * Unlike {@link CacheMatrix} that is based on existing cache, this implementation creates distributed
- * cache internally and doesn't rely on pre-existing cache.
- *
- * You also need to call {@link #destroy()} to remove the underlying cache when you no longer need this
- * matrix.
- *
- * <b>Currently fold supports only commutative operations.<b/>
- */
-public class SparseDistributedMatrix extends AbstractMatrix implements StorageConstants {
- /**
- *
- */
- public SparseDistributedMatrix() {
- // No-op.
- }
-
- /**
- * @param rows
- * @param cols
- * @param stoMode
- * @param acsMode
- */
- public SparseDistributedMatrix(int rows, int cols, int stoMode, int acsMode) {
- assert rows > 0;
- assert cols > 0;
- assertAccessMode(acsMode);
- assertStorageMode(stoMode);
-
- setStorage(new SparseDistributedMatrixStorage(rows, cols, stoMode, acsMode));
- }
-
- /**
- *
- *
- */
- private SparseDistributedMatrixStorage storage() {
- return (SparseDistributedMatrixStorage)getStorage();
- }
-
- /**
- * Return the same matrix with updates values (broken contract).
- *
- * @param d
- */
- @Override public Matrix divide(double d) {
- return mapOverValues((Double v) -> v / d);
- }
-
- /**
- * Return the same matrix with updates values (broken contract).
- *
- * @param x
- */
- @Override public Matrix plus(double x) {
- return mapOverValues((Double v) -> v + x);
- }
-
- /**
- * Return the same matrix with updates values (broken contract).
- *
- * @param x
- */
- @Override public Matrix times(double x) {
- return mapOverValues((Double v) -> v * x);
- }
-
- /** {@inheritDoc} */
- @Override public Matrix assign(double val) {
- return mapOverValues((Double v) -> val);
- }
-
- /** {@inheritDoc} */
- @Override public Matrix map(IgniteDoubleFunction<Double> fun) {
- return mapOverValues(fun::apply);
- }
-
- /**
- * @param mapper
- */
- private Matrix mapOverValues(IgniteFunction<Double, Double> mapper) {
- CacheUtils.sparseMap(storage().cache().getName(), mapper);
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public double sum() {
- return CacheUtils.sparseSum(storage().cache().getName());
- }
-
- /** {@inheritDoc} */
- @Override public double maxValue() {
- return CacheUtils.sparseMax(storage().cache().getName());
- }
-
- /** {@inheritDoc} */
- @Override public double minValue() {
- return CacheUtils.sparseMin(storage().cache().getName());
- }
-
- /** {@inheritDoc} */
- @Override public Matrix copy() {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public Matrix like(int rows, int cols) {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public Vector likeVector(int crd) {
- throw new UnsupportedOperationException();
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/SparseLocalOnHeapMatrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/SparseLocalOnHeapMatrix.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/SparseLocalOnHeapMatrix.java
deleted file mode 100644
index cb08939..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/SparseLocalOnHeapMatrix.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * 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.ignite.math.impls.matrix;
-
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.MatrixStorage;
-import org.apache.ignite.math.StorageConstants;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.impls.storage.matrix.SparseLocalOnHeapMatrixStorage;
-import org.apache.ignite.math.impls.vector.SparseLocalVector;
-
-/**
- * Sparse local onheap matrix with {@link SparseLocalVector} as rows.
- */
-public class SparseLocalOnHeapMatrix extends AbstractMatrix implements StorageConstants {
- /**
- *
- */
- public SparseLocalOnHeapMatrix() {
- // No-op.
- }
-
- /**
- * Construct new {@link SparseLocalOnHeapMatrix}.
- *
- * By default storage sets in row optimized mode and in random access mode.
- */
- public SparseLocalOnHeapMatrix(int rows, int cols) {
- setStorage(mkStorage(rows, cols));
- }
-
- /**
- * Create new {@link SparseLocalOnHeapMatrixStorage}.
- */
- private MatrixStorage mkStorage(int rows, int cols) {
- return new SparseLocalOnHeapMatrixStorage(rows, cols, StorageConstants.RANDOM_ACCESS_MODE, StorageConstants.ROW_STORAGE_MODE);
- }
-
- /** {@inheritDoc} */
- @Override public Matrix like(int rows, int cols) {
- return new SparseLocalOnHeapMatrix(rows, cols);
- }
-
- /** {@inheritDoc} */
- @Override public Vector likeVector(int crd) {
- return new SparseLocalVector(crd, StorageConstants.RANDOM_ACCESS_MODE);
- }
-
- /** {@inheritDoc} */
- @Override public Matrix copy() {
- Matrix cp = like(rowSize(), columnSize());
-
- cp.assign(this);
-
- return cp;
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/TransposedMatrixView.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/TransposedMatrixView.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/TransposedMatrixView.java
deleted file mode 100644
index 9da909b..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/TransposedMatrixView.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * 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.ignite.math.impls.matrix;
-
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.MatrixStorage;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.apache.ignite.math.impls.storage.matrix.MatrixDelegateStorage;
-
-/**
- * Implements transposed view of the parent {@link Matrix}.
- */
-public class TransposedMatrixView extends AbstractMatrix {
- /** */
- public TransposedMatrixView() {
- //No-op.
- }
-
- /**
- * @param mtx Parent matrix.
- */
- public TransposedMatrixView(Matrix mtx) {
- this(mtx == null ? null : mtx.getStorage());
- }
-
- /** */
- private TransposedMatrixView(MatrixStorage sto) {
- super(new MatrixDelegateStorage(sto, 0, 0,
- sto == null ? 0 : sto.rowSize(), sto == null ? 0 : sto.columnSize()));
- }
-
- /** {@inheritDoc} */
- @Override protected void storageSet(int row, int col, double v) {
- super.storageSet(col, row, v);
- }
-
- /** {@inheritDoc} */
- @Override protected double storageGet(int row, int col) {
- return super.storageGet(col, row);
- }
-
- /** {@inheritDoc} */
- @Override public int rowSize() {
- return getStorage().columnSize();
- }
-
- /** {@inheritDoc} */
- @Override public int columnSize() {
- return getStorage().rowSize();
- }
-
- /** {@inheritDoc} */
- @Override public Matrix copy() {
- MatrixDelegateStorage sto = (MatrixDelegateStorage)getStorage();
-
- return new TransposedMatrixView(sto.delegate());
- }
-
- /** {@inheritDoc} */
- @Override public Matrix like(int rows, int cols) {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public Vector likeVector(int crd) {
- throw new UnsupportedOperationException();
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/package-info.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/package-info.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/package-info.java
deleted file mode 100644
index 75d7532..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/package-info.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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 description. -->
- * Contains several matrix implementations.
- */
-package org.apache.ignite.math.impls.matrix;
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/package-info.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/package-info.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/package-info.java
deleted file mode 100644
index f1b2e36..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/package-info.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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 description. -->
- * Contains specific implementations for core algebra.
- */
-package org.apache.ignite.math.impls;
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/ArrayMatrixStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/ArrayMatrixStorage.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/ArrayMatrixStorage.java
deleted file mode 100644
index eb65b1d..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/ArrayMatrixStorage.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.matrix;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.util.Arrays;
-import org.apache.ignite.math.MatrixStorage;
-
-/**
- * Array based {@link MatrixStorage} implementation.
- */
-public class ArrayMatrixStorage implements MatrixStorage {
- /** Backing data array. */
- private double[][] data;
- /** Amount of rows in the matrix. */
- private int rows;
- /** Amount of columns in the matrix. */
- private int cols;
-
- /**
- *
- */
- public ArrayMatrixStorage() {
- // No-op.
- }
-
- /**
- * @param rows Amount of rows in the matrix.
- * @param cols Amount of columns in the matrix.
- */
- public ArrayMatrixStorage(int rows, int cols) {
- assert rows > 0;
- assert cols > 0;
-
- this.data = new double[rows][cols];
- this.rows = rows;
- this.cols = cols;
- }
-
- /**
- * @param data Backing data array.
- */
- public ArrayMatrixStorage(double[][] data) {
- assert data != null;
- assert data[0] != null;
-
- this.data = data;
- this.rows = data.length;
- this.cols = data[0].length;
-
- assert rows > 0;
- assert cols > 0;
- }
-
- /** {@inheritDoc} */
- @Override public double get(int x, int y) {
- return data[x][y];
- }
-
- /** {@inheritDoc} */
- @Override public boolean isSequentialAccess() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDense() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isRandomAccess() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDistributed() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public void set(int x, int y, double v) {
- data[x][y] = v;
- }
-
- /** {@inheritDoc} */
- @Override public int columnSize() {
- return cols;
- }
-
- /** {@inheritDoc} */
- @Override public int rowSize() {
- return rows;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isArrayBased() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public double[][] data() {
- return data;
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- out.writeInt(rows);
- out.writeInt(cols);
-
- out.writeObject(data);
- }
-
- /** {@inheritDoc} */
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- rows = in.readInt();
- cols = in.readInt();
-
- data = (double[][])in.readObject();
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- int res = 1;
-
- res += res * 37 + rows;
- res += res * 37 + cols;
- res += res * 37 + Arrays.deepHashCode(data);
-
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object o) {
- if (this == o)
- return true;
-
- if (o == null || getClass() != o.getClass())
- return false;
-
- ArrayMatrixStorage that = (ArrayMatrixStorage)o;
-
- return Arrays.deepEquals(data, that.data);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/CacheMatrixStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/CacheMatrixStorage.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/CacheMatrixStorage.java
deleted file mode 100644
index 7aefa2c..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/CacheMatrixStorage.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.matrix;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.Ignition;
-import org.apache.ignite.math.MatrixKeyMapper;
-import org.apache.ignite.math.MatrixStorage;
-import org.apache.ignite.math.ValueMapper;
-
-/**
- * Matrix storage based on arbitrary cache and key and value mapping functions.
- */
-public class CacheMatrixStorage<K, V> implements MatrixStorage {
- /** */ private int rows;
- /** */ private int cols;
- /** */ private IgniteCache<K, V> cache;
- /** */ private MatrixKeyMapper<K> keyMapper;
- /** */ private ValueMapper<V> valMapper;
-
- /**
- *
- */
- public CacheMatrixStorage() {
- // No-op.
- }
-
- /**
- * @param rows
- * @param cols
- * @param cache
- * @param keyMapper
- * @param valMapper
- */
- public CacheMatrixStorage(int rows, int cols, IgniteCache<K, V> cache, MatrixKeyMapper<K> keyMapper,
- ValueMapper<V> valMapper) {
- assert rows > 0;
- assert cols > 0;
- assert cache != null;
- assert keyMapper != null;
- assert valMapper != null;
-
- this.rows = rows;
- this.cols = cols;
- this.cache = cache;
- this.keyMapper = keyMapper;
- this.valMapper = valMapper;
- }
-
- /**
- * @return Ignite cache.
- */
- public IgniteCache<K, V> cache() {
- return cache;
- }
-
- /**
- * @return Key mapper.
- */
- public MatrixKeyMapper<K> keyMapper() {
- return keyMapper;
- }
-
- /**
- * @return Value mapper.
- */
- public ValueMapper<V> valueMapper() {
- return valMapper;
- }
-
- /** {@inheritDoc} */
- @Override public double get(int x, int y) {
- return valMapper.toDouble(cache.get(keyMapper.apply(x, y)));
- }
-
- /** {@inheritDoc} */
- @Override public void set(int x, int y, double v) {
- cache.put(keyMapper.apply(x, y), valMapper.fromDouble(v));
- }
-
- /** {@inheritDoc} */
- @Override public int columnSize() {
- return cols;
- }
-
- /** {@inheritDoc} */
- @Override public int rowSize() {
- return rows;
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- out.writeInt(rows);
- out.writeInt(cols);
- out.writeUTF(cache.getName());
- out.writeObject(keyMapper);
- out.writeObject(valMapper);
- }
-
- /** {@inheritDoc} */
- @SuppressWarnings({"unchecked"})
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- rows = in.readInt();
- cols = in.readInt();
- cache = Ignition.localIgnite().getOrCreateCache(in.readUTF());
- keyMapper = (MatrixKeyMapper<K>)in.readObject();
- valMapper = (ValueMapper<V>)in.readObject();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isSequentialAccess() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDense() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isRandomAccess() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDistributed() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isArrayBased() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- int res = 1;
-
- res = res * 37 + rows;
- res = res * 37 + cols;
- res = res * 37 + cache.hashCode();
- res = res * 37 + keyMapper.hashCode();
- res = res * 37 + valMapper.hashCode();
-
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object o) {
- if (this == o)
- return true;
-
- if (o == null || getClass() != o.getClass())
- return false;
-
- CacheMatrixStorage that = (CacheMatrixStorage)o;
-
- return (cache != null ? cache.equals(that.cache) : that.cache == null) &&
- (keyMapper != null ? keyMapper.equals(that.keyMapper) : that.keyMapper == null) &&
- (valMapper != null ? valMapper.equals(that.valMapper) : that.valMapper == null);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/DenseOffHeapMatrixStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/DenseOffHeapMatrixStorage.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/DenseOffHeapMatrixStorage.java
deleted file mode 100644
index 6695bc2..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/DenseOffHeapMatrixStorage.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.matrix;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import org.apache.ignite.internal.util.GridUnsafe;
-import org.apache.ignite.math.MatrixStorage;
-
-/**
- * Local, dense off-heap matrix storage.
- */
-public class DenseOffHeapMatrixStorage implements MatrixStorage {
- /** */ private int rows;
- /** */ private int cols;
- /** */ private transient long ptr;
- //TODO: temp solution.
- /** */ private int ptrInitHash;
-
- /** */
- public DenseOffHeapMatrixStorage() {
- // No-op.
- }
-
- /** */
- public DenseOffHeapMatrixStorage(int rows, int cols) {
- assert rows > 0;
- assert cols > 0;
-
- this.rows = rows;
- this.cols = cols;
-
- allocateMemory(rows, cols);
- }
-
- /** */
- public DenseOffHeapMatrixStorage(double[][] data) {
- assert data != null;
- assert data[0] != null;
-
- this.rows = data.length;
- this.cols = data[0].length;
-
- assert rows > 0;
- assert cols > 0;
-
- allocateMemory(rows, cols);
-
- for (int i = 0; i < rows; i++)
- for (int j = 0; j < cols; j++)
- set(i, j, data[i][j]);
- }
-
- /** {@inheritDoc} */
- @Override public double get(int x, int y) {
- return GridUnsafe.getDouble(pointerOffset(x, y));
- }
-
- /** {@inheritDoc} */
- @Override public void set(int x, int y, double v) {
- GridUnsafe.putDouble(pointerOffset(x, y), v);
- }
-
- /** {@inheritDoc} */
- @Override public int columnSize() {
- return cols;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isSequentialAccess() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDense() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isRandomAccess() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDistributed() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public int rowSize() {
- return rows;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isArrayBased() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public double[][] data() {
- return null;
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- out.writeInt(rows);
- out.writeInt(cols);
- out.writeInt(ptrInitHash);
-
- for (int i = 0; i < rows; i++)
- for (int j = 0; j < cols; j++)
- out.writeDouble(get(i, j));
- }
-
- /** {@inheritDoc} */
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- rows = in.readInt();
- cols = in.readInt();
-
- allocateMemory(rows, cols);
-
- ptrInitHash = in.readInt();
-
- for (int i = 0; i < rows; i++)
- for (int j = 0; j < cols; j++)
- set(i, j, in.readDouble());
- }
-
- /** {@inheritDoc} */
- @Override public void destroy() {
- GridUnsafe.freeMemory(ptr);
- }
-
- /** {@inheritDoc} */
- private long pointerOffset(int x, int y) {
- return ptr + x * cols * Double.BYTES + y * Double.BYTES;
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object obj) {
- return obj != null &&
- getClass().equals(obj.getClass()) &&
- (rows == ((DenseOffHeapMatrixStorage)obj).rows) &&
- (cols == ((DenseOffHeapMatrixStorage)obj).cols) &&
- (rows == 0 || cols == 0 || ptr == ((DenseOffHeapMatrixStorage)obj).ptr || isMemoryEquals((DenseOffHeapMatrixStorage)obj));
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- int res = 1;
-
- res = res * 37 + rows;
- res = res * 37 + cols;
- res = res * 37 + ptrInitHash;
-
- return res;
- }
-
- /** */
- private boolean isMemoryEquals(DenseOffHeapMatrixStorage otherStorage) {
- boolean res = true;
-
- for (int i = 0; i < otherStorage.rows; i++) {
- for (int j = 0; j < otherStorage.cols; j++) {
- if (Double.compare(get(i, j), otherStorage.get(i, j)) != 0) {
- res = false;
- break;
- }
- }
- }
-
- return res;
- }
-
- /** */
- private void allocateMemory(int rows, int cols) {
- ptr = GridUnsafe.allocateMemory(rows * cols * Double.BYTES);
-
- ptrInitHash = Long.hashCode(ptr);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/DiagonalMatrixStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/DiagonalMatrixStorage.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/DiagonalMatrixStorage.java
deleted file mode 100644
index 099db38..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/DiagonalMatrixStorage.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.matrix;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import org.apache.ignite.math.MatrixStorage;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-
-/**
- * {@link MatrixStorage} implementation for diagonal Matrix view.
- */
-public class DiagonalMatrixStorage implements MatrixStorage {
- /** Backing vector for matrix diagonal. */
- private Vector diagonal;
-
- /**
- *
- */
- public DiagonalMatrixStorage() {
- // No-op.
- }
-
- /**
- * @param diagonal Backing {@link Vector} for matrix diagonal.
- */
- public DiagonalMatrixStorage(Vector diagonal) {
- assert diagonal != null;
-
- this.diagonal = diagonal;
- }
-
- /**
- *
- */
- public Vector diagonal() {
- return diagonal;
- }
-
- /** {@inheritDoc} */
- @Override public double get(int x, int y) {
- return x == y ? diagonal.get(x) : 0.0;
- }
-
- /** {@inheritDoc} */
- @Override public void set(int x, int y, double v) {
- if (x == y)
- diagonal.set(x, v);
- else
- throw new UnsupportedOperationException("Can't set off-diagonal element.");
- }
-
- /** {@inheritDoc} */
- @Override public int columnSize() {
- return diagonal.size();
- }
-
- /** {@inheritDoc} */
- @Override public int rowSize() {
- return diagonal.size();
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- out.writeObject(diagonal);
- }
-
- /** {@inheritDoc} */
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- diagonal = (Vector)in.readObject();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isSequentialAccess() {
- return diagonal.isSequentialAccess();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDense() {
- return diagonal.isDense();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isRandomAccess() {
- return diagonal.isRandomAccess();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDistributed() {
- return diagonal.isDistributed();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isArrayBased() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- int res = 1;
-
- res = res * 37 + diagonal.hashCode();
-
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object o) {
- if (this == o)
- return true;
-
- if (o == null || getClass() != o.getClass())
- return false;
-
- DiagonalMatrixStorage that = (DiagonalMatrixStorage)o;
-
- return diagonal.equals(that.diagonal);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/FunctionMatrixStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/FunctionMatrixStorage.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/FunctionMatrixStorage.java
deleted file mode 100644
index 6b0c6b4..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/FunctionMatrixStorage.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.matrix;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import org.apache.ignite.math.MatrixStorage;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.apache.ignite.math.functions.IntIntDoubleToVoidFunction;
-import org.apache.ignite.math.functions.IntIntToDoubleFunction;
-
-/**
- * Read-only or read-write function-based matrix storage.
- */
-public class FunctionMatrixStorage implements MatrixStorage {
- /** */ private int rows;
- /** */ private int cols;
-
- /** */ private IntIntToDoubleFunction getFunc;
- /** */ private IntIntDoubleToVoidFunction setFunc;
-
- /**
- *
- */
- public FunctionMatrixStorage() {
- // No-op.
- }
-
- /**
- * @param rows Amount of rows in the matrix.
- * @param cols Amount of columns in the matrix.
- * @param getFunc Function that returns value corresponding to given row and column index.
- * @param setFunc Set function. If {@code null} - this will be a read-only matrix.
- */
- public FunctionMatrixStorage(int rows, int cols, IntIntToDoubleFunction getFunc,
- IntIntDoubleToVoidFunction setFunc) {
- assert rows > 0;
- assert cols > 0;
- assert getFunc != null;
-
- this.rows = rows;
- this.cols = cols;
- this.getFunc = getFunc;
- this.setFunc = setFunc;
- }
-
- /**
- * @param rows Amount of rows in the matrix.
- * @param cols Amount of columns in the matrix.
- * @param getFunc Function that returns value corresponding to given row and column index.
- */
- public FunctionMatrixStorage(int rows, int cols, IntIntToDoubleFunction getFunc) {
- this(rows, cols, getFunc, null);
- }
-
- /** {@inheritDoc} */
- @Override public double get(int x, int y) {
- return getFunc.apply(x, y);
- }
-
- /** {@inheritDoc} */
- @Override public void set(int x, int y, double v) {
- if (setFunc != null)
- setFunc.apply(x, y, v);
- else
- throw new UnsupportedOperationException("Cannot set into read-only matrix.");
- }
-
- /**
- *
- */
- public IntIntToDoubleFunction getFunction() {
- return getFunc;
- }
-
- /**
- *
- */
- public IntIntDoubleToVoidFunction setFunction() {
- return setFunc;
- }
-
- /** {@inheritDoc} */
- @Override public int columnSize() {
- return cols;
- }
-
- /** {@inheritDoc} */
- @Override public int rowSize() {
- return rows;
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- out.writeObject(setFunc);
- out.writeObject(getFunc);
- out.writeInt(rows);
- out.writeInt(cols);
- }
-
- /** {@inheritDoc} */
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- setFunc = (IntIntDoubleToVoidFunction)in.readObject();
- getFunc = (IntIntToDoubleFunction)in.readObject();
- rows = in.readInt();
- cols = in.readInt();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isSequentialAccess() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDense() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isRandomAccess() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDistributed() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isArrayBased() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object o) {
- if (this == o)
- return true;
-
- if (o == null || getClass() != o.getClass())
- return false;
-
- FunctionMatrixStorage that = (FunctionMatrixStorage)o;
-
- return rows == that.rows && cols == that.cols
- && (getFunc != null ? getFunc.equals(that.getFunc) : that.getFunc == null)
- && (setFunc != null ? setFunc.equals(that.setFunc) : that.setFunc == null);
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- int res = rows;
-
- res = 31 * res + cols;
- res = 31 * res + (getFunc != null ? getFunc.hashCode() : 0);
- res = 31 * res + (setFunc != null ? setFunc.hashCode() : 0);
-
- return res;
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/MatrixDelegateStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/MatrixDelegateStorage.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/MatrixDelegateStorage.java
deleted file mode 100644
index 2e1fc12..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/MatrixDelegateStorage.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.matrix;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import org.apache.ignite.math.MatrixStorage;
-
-/**
- * {@link MatrixStorage} implementation that delegates to parent matrix.
- */
-public class MatrixDelegateStorage implements MatrixStorage {
- /** Parent matrix storage. */
- private MatrixStorage sto;
-
- /** Row offset in the parent matrix. */
- private int rowOff;
- /** Column offset in the parent matrix. */
- private int colOff;
-
- /** Amount of rows in the matrix. */
- private int rows;
- /** Amount of columns in the matrix. */
- private int cols;
-
- /**
- *
- */
- public MatrixDelegateStorage() {
- // No-op.
- }
-
- /**
- * @param sto Backing parent storage.
- * @param rowOff Row offset to parent matrix.
- * @param colOff Column offset to parent matrix.
- * @param rows Amount of rows in the view.
- * @param cols Amount of columns in the view.
- */
- public MatrixDelegateStorage(MatrixStorage sto, int rowOff, int colOff, int rows, int cols) {
- assert sto != null;
- assert rowOff >= 0;
- assert colOff >= 0;
- assert rows > 0;
- assert cols > 0;
-
- this.sto = sto;
-
- this.rowOff = rowOff;
- this.colOff = colOff;
-
- this.rows = rows;
- this.cols = cols;
- }
-
- /**
- *
- */
- public MatrixStorage delegate() {
- return sto;
- }
-
- /**
- *
- */
- public int rowOffset() {
- return rowOff;
- }
-
- /**
- *
- */
- public int columnOffset() {
- return colOff;
- }
-
- /**
- *
- */
- public int rowsLength() {
- return rows;
- }
-
- /**
- *
- */
- public int columnsLength() {
- return cols;
- }
-
- /** {@inheritDoc} */
- @Override public double get(int x, int y) {
- return sto.get(rowOff + x, colOff + y);
- }
-
- /** {@inheritDoc} */
- @Override public void set(int x, int y, double v) {
- sto.set(rowOff + x, colOff + y, v);
- }
-
- /** {@inheritDoc} */
- @Override public int columnSize() {
- return cols;
- }
-
- /** {@inheritDoc} */
- @Override public int rowSize() {
- return rows;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isArrayBased() {
- return sto.isArrayBased() && rowOff == 0 && colOff == 0;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isSequentialAccess() {
- return sto.isSequentialAccess();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDense() {
- return sto.isDense();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isRandomAccess() {
- return sto.isRandomAccess();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDistributed() {
- return sto.isDistributed();
- }
-
- /** {@inheritDoc} */
- @Override public double[][] data() {
- return sto.data();
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- out.writeObject(sto);
-
- out.writeInt(rowOff);
- out.writeInt(colOff);
-
- out.writeInt(rows);
- out.writeInt(cols);
- }
-
- /** {@inheritDoc} */
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- sto = (MatrixStorage)in.readObject();
-
- rowOff = in.readInt();
- colOff = in.readInt();
-
- rows = in.readInt();
- cols = in.readInt();
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- int res = 1;
-
- res = res * 37 + rows;
- res = res * 37 + cols;
- res = res * 37 + rowOff;
- res = res * 37 + colOff;
- res = res * 37 + sto.hashCode();
-
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object o) {
- if (this == o)
- return true;
-
- if (o == null || getClass() != o.getClass())
- return false;
-
- MatrixDelegateStorage that = (MatrixDelegateStorage)o;
-
- return rows == that.rows && cols == that.cols && rowOff == that.rowOff && colOff == that.colOff &&
- (sto != null ? sto.equals(that.sto) : that.sto == null);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/PivotedMatrixStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/PivotedMatrixStorage.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/PivotedMatrixStorage.java
deleted file mode 100644
index 32c8624..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/PivotedMatrixStorage.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.matrix;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.util.Arrays;
-import org.apache.ignite.math.MatrixStorage;
-
-/**
- * Pivoted (index mapped) view over another matrix storage implementation.
- */
-public class PivotedMatrixStorage implements MatrixStorage {
- /** Matrix storage. */
- private MatrixStorage sto;
-
- /** */
- private int[] rowPivot;
- /** */
- private int[] colPivot;
- /** */
- private int[] rowUnpivot;
- /** */
- private int[] colUnpivot;
-
- /**
- *
- */
- public PivotedMatrixStorage() {
- // No-op.
- }
-
- /**
- * @param sto Matrix storage.
- * @param rowPivot Pivot array for rows.
- * @param colPivot Pivot array for columns.
- */
- public PivotedMatrixStorage(MatrixStorage sto, int[] rowPivot, int[] colPivot) {
- assert sto != null;
- assert rowPivot != null;
- assert colPivot != null;
-
- this.sto = sto;
- this.rowPivot = rowPivot;
- this.colPivot = colPivot;
-
- rowUnpivot = invert(rowPivot);
- colUnpivot = invert(colPivot);
- }
-
- /**
- *
- */
- public int[] rowPivot() {
- return rowPivot;
- }
-
- /**
- *
- */
- public int[] columnPivot() {
- return colPivot;
- }
-
- /**
- *
- */
- public int[] rowUnpivot() {
- return rowUnpivot;
- }
-
- /**
- *
- */
- public int[] columnUnpivot() {
- return colUnpivot;
- }
-
- /**
- * @param sto Matrix storage.
- * @param pivot Pivot array.
- */
- public PivotedMatrixStorage(MatrixStorage sto, int[] pivot) {
- this(sto, pivot, pivot == null ? null : java.util.Arrays.copyOf(pivot, pivot.length));
- }
-
- /**
- * @param sto Matrix storage.
- */
- public PivotedMatrixStorage(MatrixStorage sto) {
- this(sto, sto == null ? null : identityPivot(sto.rowSize()), sto == null ? null : identityPivot(sto.columnSize()));
- }
-
- /**
- * @param i First row index to swap.
- * @param j Second row index to swap.
- */
- public void swapRows(int i, int j) {
- if (i != j) {
- int tmp = rowPivot[i];
-
- rowPivot[i] = rowPivot[j];
- rowPivot[j] = tmp;
-
- rowUnpivot[rowPivot[i]] = i;
- rowUnpivot[rowPivot[j]] = j;
- }
- }
-
- /**
- * @param i First column index to swap.
- * @param j Second column index to swap.
- */
- public void swapColumns(int i, int j) {
- if (i != j) {
- int tmp = colPivot[i];
-
- colPivot[i] = colPivot[j];
- colPivot[j] = tmp;
-
- colUnpivot[colPivot[i]] = i;
- colUnpivot[colPivot[j]] = j;
- }
- }
-
- /** {@inheritDoc} */
- @Override public double get(int x, int y) {
- return sto.get(rowPivot[x], colPivot[y]);
- }
-
- /** {@inheritDoc} */
- @Override public void set(int x, int y, double v) {
- sto.set(rowPivot[x], colPivot[y], v);
- }
-
- /** {@inheritDoc} */
- @Override public int columnSize() {
- return sto.columnSize();
- }
-
- /** {@inheritDoc} */
- @Override public int rowSize() {
- return sto.rowSize();
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- out.writeObject(sto);
- out.writeObject(rowPivot);
- out.writeObject(colPivot);
- out.writeObject(rowUnpivot);
- out.writeObject(colUnpivot);
- }
-
- /** {@inheritDoc} */
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- sto = (MatrixStorage)in.readObject();
- rowPivot = (int[])in.readObject();
- colPivot = (int[])in.readObject();
- rowUnpivot = (int[])in.readObject();
- colUnpivot = (int[])in.readObject();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isSequentialAccess() {
- return sto.isSequentialAccess();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDense() {
- return sto.isDense();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isRandomAccess() {
- return sto.isRandomAccess();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDistributed() {
- return sto.isDistributed();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isArrayBased() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- int res = 1;
-
- res = res * 37 + sto.hashCode();
- res = res * 37 + Arrays.hashCode(rowPivot);
- res = res * 37 + Arrays.hashCode(rowUnpivot);
- res = res * 37 + Arrays.hashCode(colPivot);
- res = res * 37 + Arrays.hashCode(colUnpivot);
-
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object obj) {
- if (this == obj)
- return true;
-
- if (obj == null || getClass() != obj.getClass())
- return false;
-
- PivotedMatrixStorage that = (PivotedMatrixStorage)obj;
-
- return Arrays.equals(rowPivot, that.rowPivot) && Arrays.equals(rowUnpivot, that.rowUnpivot)
- && Arrays.equals(colPivot, that.colPivot) && Arrays.equals(colUnpivot, that.colUnpivot)
- && (sto != null ? sto.equals(that.sto) : that.sto == null);
- }
-
- /**
- * @param n Pivot array length.
- */
- private static int[] identityPivot(int n) {
- int[] pivot = new int[n];
-
- for (int i = 0; i < n; i++)
- pivot[i] = i;
-
- return pivot;
- }
-
- /**
- * @param pivot Pivot array to be inverted.
- */
- private static int[] invert(int[] pivot) {
- int[] x = new int[pivot.length];
-
- for (int i = 0; i < pivot.length; i++)
- x[pivot[i]] = i;
-
- return x;
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/RandomMatrixStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/RandomMatrixStorage.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/RandomMatrixStorage.java
deleted file mode 100644
index 8283201..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/RandomMatrixStorage.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.matrix;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.nio.ByteBuffer;
-import org.apache.ignite.math.MatrixStorage;
-import org.apache.ignite.math.MurmurHash;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-
-/**
- * {@link MatrixStorage} implementation with random values in the matrix elements.
- */
-public class RandomMatrixStorage implements MatrixStorage {
- /** */
- private static final int PRIME1 = 104047;
- /** */
- private static final int PRIME2 = 101377;
- /** */
- private static final int PRIME3 = 64661;
- /** */
- private static final long SCALE = 1L << 32;
-
- /** Random generation seed. */
- private int seed;
-
- /** Amount of rows in the matrix. */
- private int rows;
- /** Amount of columns in the matrix. */
- private int cols;
-
- /** Whether fast hash is used, in {@link #get(int, int)}. */
- private boolean fastHash;
-
- /**
- * For externalization.
- */
- public RandomMatrixStorage() {
- // No-op.
- }
-
- /**
- * @param rows Amount of rows in the matrix.
- * @param cols Amount of columns in the matrix.
- * @param fastHash Whether fast hash is used.
- */
- public RandomMatrixStorage(int rows, int cols, boolean fastHash) {
- assert rows > 0;
- assert cols > 0;
-
- this.rows = rows;
- this.cols = cols;
- this.fastHash = fastHash;
- }
-
- /** {@inheritDoc} */
- @Override public double get(int x, int y) {
- if (!fastHash) {
- ByteBuffer buf = ByteBuffer.allocate(8);
-
- buf.putInt(x);
- buf.putInt(y);
- buf.flip();
-
- return (MurmurHash.hash64A(buf, seed) & (SCALE - 1)) / (double)SCALE;
- }
- else
- // This isn't a fantastic random number generator, but it is just fine for random projections.
- return ((((x * PRIME1) + y * PRIME2 + x * y * PRIME3) & 8) * 0.25) - 1;
- }
-
- /**
- *
- */
- public boolean isFastHash() {
- return fastHash;
- }
-
- /** {@inheritDoc} */
- @Override public void set(int x, int y, double v) {
- throw new UnsupportedOperationException("Random matrix storage is a read-only storage.");
- }
-
- /** {@inheritDoc} */
- @Override public int columnSize() {
- return cols;
- }
-
- /** {@inheritDoc} */
- @Override public int rowSize() {
- return rows;
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- out.writeInt(rows);
- out.writeInt(cols);
- out.writeInt(seed);
- out.writeBoolean(fastHash);
- }
-
- /** {@inheritDoc} */
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- rows = in.readInt();
- cols = in.readInt();
- seed = in.readInt();
- fastHash = in.readBoolean();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isSequentialAccess() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDense() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isRandomAccess() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDistributed() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isArrayBased() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- int res = 1;
-
- res = res * 37 + Boolean.hashCode(fastHash);
- res = res * 37 + seed;
- res = res * 37 + cols;
- res = res * 37 + rows;
-
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object o) {
- if (this == o)
- return true;
-
- if (o == null || getClass() != o.getClass())
- return false;
-
- RandomMatrixStorage that = (RandomMatrixStorage)o;
-
- return rows == that.rows && cols == that.cols && seed == that.seed && fastHash == that.fastHash;
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/SparseDistributedMatrixStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/SparseDistributedMatrixStorage.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/SparseDistributedMatrixStorage.java
deleted file mode 100644
index 82807c5..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/SparseDistributedMatrixStorage.java
+++ /dev/null
@@ -1,281 +0,0 @@
-// @java.file.header
-
-/* _________ _____ __________________ _____
- * __ ____/___________(_)______ /__ ____/______ ____(_)_______
- * _ / __ __ ___/__ / _ __ / _ / __ _ __ `/__ / __ __ \
- * / /_/ / _ / _ / / /_/ / / /_/ / / /_/ / _ / _ / / /
- * \____/ /_/ /_/ \_,__/ \____/ \__,_/ /_/ /_/ /_/
- */
-
-package org.apache.ignite.math.impls.storage.matrix;
-
-import it.unimi.dsi.fastutil.ints.Int2DoubleOpenHashMap;
-import it.unimi.dsi.fastutil.ints.Int2DoubleRBTreeMap;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.util.Map;
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.Ignition;
-import org.apache.ignite.cache.CacheAtomicityMode;
-import org.apache.ignite.cache.CacheMode;
-import org.apache.ignite.cache.CachePeekMode;
-import org.apache.ignite.cache.CacheWriteSynchronizationMode;
-import org.apache.ignite.configuration.CacheConfiguration;
-import org.apache.ignite.lang.IgniteUuid;
-import org.apache.ignite.math.MatrixStorage;
-import org.apache.ignite.math.StorageConstants;
-import org.apache.ignite.math.impls.CacheUtils;
-
-/**
- * {@link MatrixStorage} implementation for {@link org.apache.ignite.math.impls.matrix.SparseDistributedMatrix}.
- */
-public class SparseDistributedMatrixStorage extends CacheUtils implements MatrixStorage, StorageConstants {
- /** Amount of rows in the matrix. */
- private int rows;
- /** Amount of columns in the matrix. */
- private int cols;
-
- /** Row or column based storage mode. */
- private int stoMode;
- /** Random or sequential access mode. */
- private int acsMode;
-
- /** Actual distributed storage. */
- private IgniteCache<
- Integer /* Row or column index. */,
- Map<Integer, Double> /* Map-based row or column. */
- > cache = null;
-
- /**
- *
- */
- public SparseDistributedMatrixStorage() {
- // No-op.
- }
-
- /**
- * @param rows Amount of rows in the matrix.
- * @param cols Amount of columns in the matrix.
- * @param stoMode Row or column based storage mode.
- * @param acsMode Random or sequential access mode.
- */
- public SparseDistributedMatrixStorage(int rows, int cols, int stoMode, int acsMode) {
- assert rows > 0;
- assert cols > 0;
- assertAccessMode(acsMode);
- assertStorageMode(stoMode);
-
- this.rows = rows;
- this.cols = cols;
- this.stoMode = stoMode;
- this.acsMode = acsMode;
-
- cache = newCache();
- }
-
- /**
- *
- *
- */
- private IgniteCache<Integer, Map<Integer, Double>> newCache() {
- CacheConfiguration<Integer, Map<Integer, Double>> cfg = new CacheConfiguration<>();
-
- // Assume 10% density.
- cfg.setStartSize(Math.max(1024, (rows * cols) / 10));
-
- // Write to primary.
- cfg.setWriteSynchronizationMode(CacheWriteSynchronizationMode.PRIMARY_SYNC);
-
- // Atomic transactions only.
- cfg.setAtomicityMode(CacheAtomicityMode.ATOMIC);
-
- // No eviction.
- cfg.setEvictionPolicy(null);
-
- // No copying of values.
- cfg.setCopyOnRead(false);
-
- // Cache is partitioned.
- cfg.setCacheMode(CacheMode.PARTITIONED);
-
- // Random cache name.
- cfg.setName(new IgniteUuid().shortString());
-
- return Ignition.localIgnite().getOrCreateCache(cfg);
- }
-
- /**
- *
- *
- */
- public IgniteCache<Integer, Map<Integer, Double>> cache() {
- return cache;
- }
-
- /**
- *
- *
- */
- public int accessMode() {
- return acsMode;
- }
-
- /**
- *
- *
- */
- public int storageMode() {
- return stoMode;
- }
-
- /** {@inheritDoc} */
- @Override public double get(int x, int y) {
- if (stoMode == ROW_STORAGE_MODE)
- return matrixGet(cache.getName(), x, y);
- else
- return matrixGet(cache.getName(), y, x);
- }
-
- /** {@inheritDoc} */
- @Override public void set(int x, int y, double v) {
- if (stoMode == ROW_STORAGE_MODE)
- matrixSet(cache.getName(), x, y, v);
- else
- matrixSet(cache.getName(), y, x, v);
- }
-
- /**
- * Distributed matrix get.
- *
- * @param cacheName Matrix's cache.
- * @param a Row or column index.
- * @param b Row or column index.
- * @return Matrix value at (a, b) index.
- */
- private double matrixGet(String cacheName, int a, int b) {
- // Remote get from the primary node (where given row or column is stored locally).
- return ignite().compute(groupForKey(cacheName, a)).call(() -> {
- IgniteCache<Integer, Map<Integer, Double>> cache = Ignition.localIgnite().getOrCreateCache(cacheName);
-
- // Local get.
- Map<Integer, Double> map = cache.localPeek(a, CachePeekMode.PRIMARY);
-
- return (map == null || !map.containsKey(b)) ? 0.0 : map.get(b);
- });
- }
-
- /**
- * Distributed matrix set.
- *
- * @param cacheName Matrix's cache.
- * @param a Row or column index.
- * @param b Row or column index.
- * @param v New value to set.
- */
- private void matrixSet(String cacheName, int a, int b, double v) {
- // Remote set on the primary node (where given row or column is stored locally).
- ignite().compute(groupForKey(cacheName, a)).run(() -> {
- IgniteCache<Integer, Map<Integer, Double>> cache = Ignition.localIgnite().getOrCreateCache(cacheName);
-
- // Local get.
- Map<Integer, Double> map = cache.localPeek(a, CachePeekMode.PRIMARY);
-
- if (map == null)
- map = acsMode == SEQUENTIAL_ACCESS_MODE ? new Int2DoubleRBTreeMap() : new Int2DoubleOpenHashMap();
-
- if (v != 0.0)
- map.put(b, v);
- else if (map.containsKey(b))
- map.remove(b);
-
- // Local put.
- cache.put(a, map);
- });
- }
-
- /** {@inheritDoc} */
- @Override public int columnSize() {
- return cols;
- }
-
- /** {@inheritDoc} */
- @Override public int rowSize() {
- return rows;
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- out.writeInt(rows);
- out.writeInt(cols);
- out.writeInt(acsMode);
- out.writeInt(stoMode);
- out.writeUTF(cache.getName());
- }
-
- /** {@inheritDoc} */
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- rows = in.readInt();
- cols = in.readInt();
- acsMode = in.readInt();
- stoMode = in.readInt();
- cache = ignite().getOrCreateCache(in.readUTF());
- }
-
- /** {@inheritDoc} */
- @Override public boolean isSequentialAccess() {
- return acsMode == SEQUENTIAL_ACCESS_MODE;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDense() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isRandomAccess() {
- return acsMode == RANDOM_ACCESS_MODE;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDistributed() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isArrayBased() {
- return false;
- }
-
- /** Destroy underlying cache. */
- @Override public void destroy() {
- cache.destroy();
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- int res = 1;
-
- res = res * 37 + cols;
- res = res * 37 + rows;
- res = res * 37 + acsMode;
- res = res * 37 + stoMode;
- res = res * 37 + cache.hashCode();
-
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object obj) {
- if (this == obj)
- return true;
-
- if (obj == null || getClass() != obj.getClass())
- return false;
-
- SparseDistributedMatrixStorage that = (SparseDistributedMatrixStorage)obj;
-
- return rows == that.rows && cols == that.cols && acsMode == that.acsMode && stoMode == that.stoMode
- && (cache != null ? cache.equals(that.cache) : that.cache == null);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/SparseLocalOnHeapMatrixStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/SparseLocalOnHeapMatrixStorage.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/SparseLocalOnHeapMatrixStorage.java
deleted file mode 100644
index e72da70..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/SparseLocalOnHeapMatrixStorage.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.matrix;
-
-import it.unimi.dsi.fastutil.ints.Int2DoubleOpenHashMap;
-import it.unimi.dsi.fastutil.ints.Int2DoubleRBTreeMap;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.util.HashMap;
-import java.util.Map;
-import org.apache.ignite.math.MatrixStorage;
-import org.apache.ignite.math.StorageConstants;
-
-/**
- * Storage for sparse, local, on-heap matrix.
- */
-public class SparseLocalOnHeapMatrixStorage implements MatrixStorage, StorageConstants {
- /** Default zero value. */
- private static final double DEFAULT_VALUE = 0.0;
-
- /** */ private int rows;
- /** */ private int cols;
-
- /** */ private int acsMode;
- /** */ private int stoMode;
-
- /** Actual map storage. */
- private Map<Integer, Map<Integer, Double>> sto;
-
- /** */
- public SparseLocalOnHeapMatrixStorage() {
- // No-op.
- }
-
- /** */
- public SparseLocalOnHeapMatrixStorage(int rows, int cols, int acsMode, int stoMode) {
- assert rows > 0;
- assert cols > 0;
- assertAccessMode(acsMode);
- assertStorageMode(stoMode);
-
- this.rows = rows;
- this.cols = cols;
- this.acsMode = acsMode;
- this.stoMode = stoMode;
-
- sto = new HashMap<>();
- }
-
- /**
- *
- *
- */
- public int getStorageMode() {
- return stoMode;
- }
-
- /**
- *
- *
- */
- public int getAccessMode() {
- return acsMode;
- }
-
- /** {@inheritDoc} */
- @Override public double get(int x, int y) {
- if (stoMode == ROW_STORAGE_MODE) {
- Map<Integer, Double> row = sto.get(x);
-
- if (row != null) {
- Double val = row.get(y);
-
- if (val != null)
- return val;
- }
-
- return DEFAULT_VALUE;
- }
- else {
- Map<Integer, Double> col = sto.get(y);
-
- if (col != null) {
- Double val = col.get(x);
-
- if (val != null)
- return val;
- }
-
- return DEFAULT_VALUE;
- }
- }
-
- /** {@inheritDoc} */
- @Override public void set(int x, int y, double v) {
- // Ignore default values (currently 0.0).
- if (v != DEFAULT_VALUE) {
- if (stoMode == ROW_STORAGE_MODE) {
- Map<Integer, Double> row = sto.computeIfAbsent(x, k ->
- acsMode == SEQUENTIAL_ACCESS_MODE ? new Int2DoubleRBTreeMap() : new Int2DoubleOpenHashMap());
-
- row.put(y, v);
- }
- else {
- Map<Integer, Double> col = sto.computeIfAbsent(y, k ->
- acsMode == SEQUENTIAL_ACCESS_MODE ? new Int2DoubleRBTreeMap() : new Int2DoubleOpenHashMap());
-
- col.put(x, v);
- }
- }
- else {
- if (stoMode == ROW_STORAGE_MODE) {
- if (sto.containsKey(x)) {
- Map<Integer, Double> row = sto.get(x);
-
- if (row.containsKey(y))
- row.remove(y);
- }
-
- }
- else {
- if (sto.containsKey(y)) {
- Map<Integer, Double> col = sto.get(y);
-
- if (col.containsKey(x))
- col.remove(x);
- }
- }
- }
- }
-
- /** {@inheritDoc} */
- @Override public int columnSize() {
- return cols;
- }
-
- /** {@inheritDoc} */
- @Override public int rowSize() {
- return rows;
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- out.writeInt(rows);
- out.writeInt(cols);
- out.writeInt(acsMode);
- out.writeInt(stoMode);
- out.writeObject(sto);
- }
-
- /** {@inheritDoc} */
- @SuppressWarnings({"unchecked"})
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- rows = in.readInt();
- cols = in.readInt();
- acsMode = in.readInt();
- stoMode = in.readInt();
- sto = (Map<Integer, Map<Integer, Double>>)in.readObject();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isSequentialAccess() {
- return acsMode == SEQUENTIAL_ACCESS_MODE;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDense() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isRandomAccess() {
- return acsMode == RANDOM_ACCESS_MODE;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDistributed() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isArrayBased() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- int res = 1;
-
- res = res * 37 + rows;
- res = res * 37 + cols;
- res = res * 37 + sto.hashCode();
-
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object o) {
- if (this == o)
- return true;
-
- if (o == null || getClass() != o.getClass())
- return false;
-
- SparseLocalOnHeapMatrixStorage that = (SparseLocalOnHeapMatrixStorage)o;
-
- return rows == that.rows && cols == that.cols && acsMode == that.acsMode && stoMode == that.stoMode
- && (sto != null ? sto.equals(that.sto) : that.sto == null);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/package-info.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/package-info.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/package-info.java
deleted file mode 100644
index aba47db..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/matrix/package-info.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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 description. -->
- * Contains specific implementations for matrix storage models.
- */
-package org.apache.ignite.math.impls.storage.matrix;
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/ArrayVectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/ArrayVectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/ArrayVectorStorage.java
deleted file mode 100644
index ef59c62..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/storage/vector/ArrayVectorStorage.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.vector;
-
-import java.io.Externalizable;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.util.Arrays;
-import org.apache.ignite.math.VectorStorage;
-
-/**
- * Array based {@link VectorStorage} implementation.
- */
-public class ArrayVectorStorage implements VectorStorage {
- /** Backing data array. */
- private double[] data;
-
- /**
- * IMPL NOTE required by {@link Externalizable}.
- */
- public ArrayVectorStorage() {
- // No-op.
- }
-
- /**
- * @param size Vector size.
- */
- public ArrayVectorStorage(int size) {
- assert size > 0;
-
- data = new double[size];
- }
-
- /**
- * @param data Backing data array.
- */
- public ArrayVectorStorage(double[] data) {
- assert data != null;
-
- this.data = data;
- }
-
- /** {@inheritDoc} */
- @Override public int size() {
- return data == null ? 0 : data.length;
- }
-
- /** {@inheritDoc} */
- @Override public double get(int i) {
- return data[i];
- }
-
- /** {@inheritDoc} */
- @Override public void set(int i, double v) {
- data[i] = v;
- }
-
- /** {@inheritDoc}} */
- @Override public boolean isArrayBased() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public double[] data() {
- return data;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isSequentialAccess() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDense() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isRandomAccess() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDistributed() {
- return false;
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- out.writeObject(data);
- }
-
- /** {@inheritDoc} */
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- data = (double[])in.readObject();
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- int res = 1;
-
- res = res * 37 + Arrays.hashCode(data);
-
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object obj) {
- if (this == obj)
- return true;
-
- if (obj == null || getClass() != obj.getClass())
- return false;
-
- ArrayVectorStorage that = (ArrayVectorStorage)obj;
-
- return Arrays.equals(data, (that.data));
- }
-}
[09/67] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math
module to Ignite ML module added missed licenses renamed packages fixed wrong
ml profile activation (cherry picked from commit d78e071)
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/MatrixImplementationsTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/MatrixImplementationsTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/MatrixImplementationsTest.java
deleted file mode 100644
index 28abab7..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/MatrixImplementationsTest.java
+++ /dev/null
@@ -1,1113 +0,0 @@
-/*
- * 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.ignite.math.impls.matrix;
-
-import java.util.Arrays;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.function.BiConsumer;
-import java.util.function.Supplier;
-import org.apache.ignite.math.ExternalizeTest;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.exceptions.CardinalityException;
-import org.apache.ignite.math.exceptions.ColumnIndexException;
-import org.apache.ignite.math.exceptions.IndexException;
-import org.apache.ignite.math.exceptions.RowIndexException;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.apache.ignite.math.impls.vector.DenseLocalOffHeapVector;
-import org.apache.ignite.math.impls.vector.DenseLocalOnHeapVector;
-import org.apache.ignite.math.impls.vector.RandomVector;
-import org.apache.ignite.math.impls.vector.SparseLocalVector;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-/**
- * Tests for {@link Matrix} implementations.
- */
-public class MatrixImplementationsTest extends ExternalizeTest<Matrix> {
- /** */
- private static final double DEFAULT_DELTA = 0.000000001d;
-
- /** */
- private void consumeSampleMatrix(BiConsumer<Matrix, String> consumer) {
- new MatrixImplementationFixtures().consumeSampleMatrix(consumer);
- }
-
- /** */
- @Test
- public void externalizeTest() {
- consumeSampleMatrix((m, desc) -> externalizeTest(m));
- }
-
- /** */
- @Test
- public void testLike() {
- consumeSampleMatrix((m, desc) -> {
- Class<? extends Matrix> cls = likeMatrixType(m);
-
- if (cls != null) {
- Matrix like = m.like(m.rowSize(), m.columnSize());
-
- assertEquals("Wrong \"like\" matrix for " + desc + "; Unexpected rows.", like.rowSize(), m.rowSize());
- assertEquals("Wrong \"like\" matrix for " + desc + "; Unexpected columns.", like.columnSize(), m.columnSize());
-
- assertEquals("Wrong \"like\" matrix for " + desc
- + "; Unexpected class: " + like.getClass().toString(),
- cls,
- like.getClass());
-
- return;
- }
-
- boolean expECaught = false;
-
- try {
- m.like(1, 1);
- }
- catch (UnsupportedOperationException uoe) {
- expECaught = true;
- }
-
- assertTrue("Expected exception was not caught for " + desc, expECaught);
- });
- }
-
- /** */
- @Test
- public void testCopy() {
- consumeSampleMatrix((m, desc) -> {
- Matrix cp = m.copy();
- assertTrue("Incorrect copy for empty matrix " + desc, cp.equals(m));
-
- if (!readOnly(m))
- fillMatrix(m);
-
- cp = m.copy();
-
- assertTrue("Incorrect copy for matrix " + desc, cp.equals(m));
- });
- }
-
- /** */
- @Test
- public void testHaveLikeVector() throws InstantiationException, IllegalAccessException {
- for (Class<? extends Matrix> key : likeVectorTypesMap().keySet()) {
- Class<? extends Vector> val = likeVectorTypesMap().get(key);
-
- if (val == null && !ignore(key))
- System.out.println("Missing test for implementation of likeMatrix for " + key.getSimpleName());
- }
- }
-
- /** */
- @Test
- public void testLikeVector() {
- consumeSampleMatrix((m, desc) -> {
- if (likeVectorTypesMap().containsKey(m.getClass())) {
- Vector likeVector = m.likeVector(m.columnSize());
-
- assertNotNull(likeVector);
- assertEquals("Unexpected value for " + desc, likeVector.size(), m.columnSize());
-
- return;
- }
-
- boolean expECaught = false;
-
- try {
- m.likeVector(1);
- }
- catch (UnsupportedOperationException uoe) {
- expECaught = true;
- }
-
- assertTrue("Expected exception was not caught for " + desc, expECaught);
- });
- }
-
- /** */
- @Test
- public void testAssignSingleElement() {
- consumeSampleMatrix((m, desc) -> {
- if (ignore(m.getClass()))
- return;
-
- final double assignVal = Math.random();
-
- m.assign(assignVal);
-
- for (int i = 0; i < m.rowSize(); i++)
- for (int j = 0; j < m.columnSize(); j++)
- assertEquals("Unexpected value for " + desc + " at (" + i + "," + j + ")",
- assignVal, m.get(i, j), 0d);
- });
- }
-
- /** */
- @Test
- public void testAssignArray() {
- consumeSampleMatrix((m, desc) -> {
- if (ignore(m.getClass()))
- return;
-
- double[][] data = new double[m.rowSize()][m.columnSize()];
-
- for (int i = 0; i < m.rowSize(); i++)
- for (int j = 0; j < m.columnSize(); j++)
- data[i][j] = Math.random();
-
- m.assign(data);
-
- for (int i = 0; i < m.rowSize(); i++) {
- for (int j = 0; j < m.columnSize(); j++)
- assertEquals("Unexpected value for " + desc + " at (" + i + "," + j + ")",
- data[i][j], m.get(i, j), 0d);
- }
- });
- }
-
- /** */
- @Test
- public void testAssignFunction() {
- consumeSampleMatrix((m, desc) -> {
- if (ignore(m.getClass()))
- return;
-
- m.assign((i, j) -> (double)(i * m.columnSize() + j));
-
- for (int i = 0; i < m.rowSize(); i++) {
- for (int j = 0; j < m.columnSize(); j++)
- assertEquals("Unexpected value for " + desc + " at (" + i + "," + j + ")",
- (double)(i * m.columnSize() + j), m.get(i, j), 0d);
- }
- });
- }
-
- /** */
- @Test
- public void testPlus() {
- consumeSampleMatrix((m, desc) -> {
- if (readOnly(m))
- return;
-
- double[][] data = fillAndReturn(m);
-
- double plusVal = Math.random();
-
- Matrix plus = m.plus(plusVal);
-
- for (int i = 0; i < m.rowSize(); i++)
- for (int j = 0; j < m.columnSize(); j++)
- assertEquals("Unexpected value for " + desc + " at (" + i + "," + j + ")",
- data[i][j] + plusVal, plus.get(i, j), 0d);
- });
- }
-
- /** */
- @Test
- public void testPlusMatrix() {
- consumeSampleMatrix((m, desc) -> {
- if (ignore(m.getClass()))
- return;
-
- double[][] data = fillAndReturn(m);
-
- Matrix plus = m.plus(m);
-
- for (int i = 0; i < m.rowSize(); i++)
- for (int j = 0; j < m.columnSize(); j++)
- assertEquals("Unexpected value for " + desc + " at (" + i + "," + j + ")",
- data[i][j] * 2.0, plus.get(i, j), 0d);
- });
- }
-
- /** */
- @Test
- public void testMinusMatrix() {
- consumeSampleMatrix((m, desc) -> {
- if (ignore(m.getClass()))
- return;
-
- fillMatrix(m);
-
- Matrix minus = m.minus(m);
-
- for (int i = 0; i < m.rowSize(); i++)
- for (int j = 0; j < m.columnSize(); j++)
- assertEquals("Unexpected value for " + desc + " at (" + i + "," + j + ")",
- 0.0, minus.get(i, j), 0d);
- });
- }
-
- /** */
- @Test
- public void testTimes() {
- consumeSampleMatrix((m, desc) -> {
- if (readOnly(m))
- return;
-
- double[][] data = fillAndReturn(m);
-
- double timeVal = Math.random();
- Matrix times = m.times(timeVal);
-
- for (int i = 0; i < m.rowSize(); i++)
- for (int j = 0; j < m.columnSize(); j++)
- assertEquals("Unexpected value for " + desc + " at (" + i + "," + j + ")",
- data[i][j] * timeVal, times.get(i, j), 0d);
- });
- }
-
- /** */
- @Test
- public void testTimesVector() {
- consumeSampleMatrix((m, desc) -> {
- if (ignore(m.getClass()))
- return;
-
- double[][] data = fillAndReturn(m);
-
- double[] arr = fillArray(m.columnSize());
-
- Vector times = m.times(new DenseLocalOnHeapVector(arr));
-
- assertEquals("Unexpected vector size for " + desc, times.size(), m.rowSize());
-
- for (int i = 0; i < m.rowSize(); i++) {
- double exp = 0.0;
-
- for (int j = 0; j < m.columnSize(); j++)
- exp += arr[j] * data[i][j];
-
- assertEquals("Unexpected value for " + desc + " at " + i,
- times.get(i), exp, 0d);
- }
-
- testInvalidCardinality(() -> m.times(new DenseLocalOnHeapVector(m.columnSize() + 1)), desc);
- });
- }
-
- /** */
- @Test
- public void testTimesMatrix() {
- consumeSampleMatrix((m, desc) -> {
- if (ignore(m.getClass()))
- return;
-
- double[][] data = fillAndReturn(m);
-
- double[] arr = fillArray(m.columnSize());
-
- Matrix mult = new DenseLocalOnHeapMatrix(m.columnSize(), 1);
-
- mult.setColumn(0, arr);
-
- Matrix times = m.times(mult);
-
- assertEquals("Unexpected rows for " + desc, times.rowSize(), m.rowSize());
-
- assertEquals("Unexpected cols for " + desc, times.columnSize(), 1);
-
- for (int i = 0; i < m.rowSize(); i++) {
- double exp = 0.0;
-
- for (int j = 0; j < m.columnSize(); j++)
- exp += arr[j] * data[i][j];
-
- assertEquals("Unexpected value for " + desc + " at " + i,
- exp, times.get(i, 0), 0d);
- }
-
- testInvalidCardinality(() -> m.times(new DenseLocalOnHeapMatrix(m.columnSize() + 1, 1)), desc);
- });
- }
-
- /** */
- @Test
- public void testDivide() {
- consumeSampleMatrix((m, desc) -> {
- if (ignore(m.getClass()))
- return;
-
- double[][] data = fillAndReturn(m);
-
- double divVal = Math.random();
-
- Matrix divide = m.divide(divVal);
-
- for (int i = 0; i < m.rowSize(); i++)
- for (int j = 0; j < m.columnSize(); j++)
- assertEquals("Unexpected value for " + desc + " at (" + i + "," + j + ")",
- data[i][j] / divVal, divide.get(i, j), 0d);
- });
- }
-
- /** */
- @Test
- public void testTranspose() {
- consumeSampleMatrix((m, desc) -> {
- if (ignore(m.getClass()))
- return;
-
- fillMatrix(m);
-
- Matrix transpose = m.transpose();
-
- for (int i = 0; i < m.rowSize(); i++)
- for (int j = 0; j < m.columnSize(); j++)
- assertEquals("Unexpected value for " + desc + " at (" + i + "," + j + ")",
- m.get(i, j), transpose.get(j, i), 0d);
- });
- }
-
- /** */
- @Test
- public void testDeterminant() {
- consumeSampleMatrix((m, desc) -> {
- if (m.rowSize() != m.columnSize())
- return;
-
- if (ignore(m.getClass()))
- return;
-
- double[][] doubles = fillIntAndReturn(m);
-
- if (m.rowSize() == 1) {
- assertEquals("Unexpected value " + desc, m.determinant(), doubles[0][0], 0d);
-
- return;
- }
-
- if (m.rowSize() == 2) {
- double det = doubles[0][0] * doubles[1][1] - doubles[0][1] * doubles[1][0];
- assertEquals("Unexpected value " + desc, m.determinant(), det, 0d);
-
- return;
- }
-
- if (m.rowSize() > 512)
- return; // IMPL NOTE if row size >= 30000 it takes unacceptably long for normal test run.
-
- Matrix diagMtx = m.like(m.rowSize(), m.columnSize());
-
- diagMtx.assign(0);
- for (int i = 0; i < m.rowSize(); i++)
- diagMtx.set(i, i, m.get(i, i));
-
- double det = 1;
-
- for (int i = 0; i < diagMtx.rowSize(); i++)
- det *= diagMtx.get(i, i);
-
- try {
- assertEquals("Unexpected value " + desc, det, diagMtx.determinant(), DEFAULT_DELTA);
- }
- catch (Exception e) {
- System.out.println(desc);
- throw e;
- }
- });
- }
-
- /** */
- @Test
- public void testInverse() {
- consumeSampleMatrix((m, desc) -> {
- if (m.rowSize() != m.columnSize())
- return;
-
- if (ignore(m.getClass()))
- return;
-
- if (m.rowSize() > 256)
- return; // IMPL NOTE this is for quicker test run.
-
- fillNonSingularMatrix(m);
-
- assertTrue("Unexpected zero determinant " + desc, Math.abs(m.determinant()) > 0d);
-
- Matrix inverse = m.inverse();
-
- Matrix mult = m.times(inverse);
-
- final double delta = 0.001d;
-
- assertEquals("Unexpected determinant " + desc, 1d, mult.determinant(), delta);
-
- assertEquals("Unexpected top left value " + desc, 1d, mult.get(0, 0), delta);
-
- if (m.rowSize() == 1)
- return;
-
- assertEquals("Unexpected center value " + desc,
- 1d, mult.get(m.rowSize() / 2, m.rowSize() / 2), delta);
-
- assertEquals("Unexpected bottom right value " + desc,
- 1d, mult.get(m.rowSize() - 1, m.rowSize() - 1), delta);
-
- assertEquals("Unexpected top right value " + desc,
- 0d, mult.get(0, m.rowSize() - 1), delta);
-
- assertEquals("Unexpected bottom left value " + desc,
- 0d, mult.get(m.rowSize() - 1, 0), delta);
- });
- }
-
- /** */
- @Test
- public void testMap() {
- consumeSampleMatrix((m, desc) -> {
- if (ignore(m.getClass()))
- return;
-
- fillMatrix(m);
-
- m.map(x -> 10d);
-
- for (int i = 0; i < m.rowSize(); i++)
- for (int j = 0; j < m.columnSize(); j++)
- assertEquals("Unexpected value for " + desc + " at (" + i + "," + j + ")",
- 10d, m.get(i, j), 0d);
- });
- }
-
- /** */
- @Test
- public void testMapMatrix() {
- consumeSampleMatrix((m, desc) -> {
- if (ignore(m.getClass()))
- return;
-
- double[][] doubles = fillAndReturn(m);
-
- testMapMatrixWrongCardinality(m, desc);
-
- Matrix cp = m.copy();
-
- m.map(cp, (m1, m2) -> m1 + m2);
-
- for (int i = 0; i < m.rowSize(); i++)
- for (int j = 0; j < m.columnSize(); j++)
- assertEquals("Unexpected value for " + desc + " at (" + i + "," + j + ")",
- m.get(i, j), doubles[i][j] * 2, 0d);
- });
- }
-
- /** */
- @Test
- public void testViewRow() {
- consumeSampleMatrix((m, desc) -> {
- if (!readOnly(m))
- fillMatrix(m);
-
- for (int i = 0; i < m.rowSize(); i++) {
- Vector vector = m.viewRow(i);
- assert vector != null;
-
- for (int j = 0; j < m.columnSize(); j++)
- assertEquals("Unexpected value for " + desc + " at (" + i + "," + j + ")",
- m.get(i, j), vector.get(j), 0d);
- }
- });
- }
-
- /** */
- @Test
- public void testViewCol() {
- consumeSampleMatrix((m, desc) -> {
- if (!readOnly(m))
- fillMatrix(m);
-
- for (int i = 0; i < m.columnSize(); i++) {
- Vector vector = m.viewColumn(i);
- assert vector != null;
-
- for (int j = 0; j < m.rowSize(); j++)
- assertEquals("Unexpected value for " + desc + " at (" + i + "," + j + ")",
- m.get(j, i), vector.get(j), 0d);
- }
- });
- }
-
- /** */
- @Test
- public void testFoldRow() {
- consumeSampleMatrix((m, desc) -> {
- if (ignore(m.getClass()))
- return;
-
- fillMatrix(m);
-
- Vector foldRows = m.foldRows(Vector::sum);
-
- for (int i = 0; i < m.rowSize(); i++) {
- Double locSum = 0d;
-
- for (int j = 0; j < m.columnSize(); j++)
- locSum += m.get(i, j);
-
- assertEquals("Unexpected value for " + desc + " at " + i,
- foldRows.get(i), locSum, 0d);
- }
- });
- }
-
- /** */
- @Test
- public void testFoldCol() {
- consumeSampleMatrix((m, desc) -> {
- if (ignore(m.getClass()))
- return;
-
- fillMatrix(m);
-
- Vector foldCols = m.foldColumns(Vector::sum);
-
- for (int j = 0; j < m.columnSize(); j++) {
- Double locSum = 0d;
-
- for (int i = 0; i < m.rowSize(); i++)
- locSum += m.get(i, j);
-
- assertEquals("Unexpected value for " + desc + " at " + j,
- foldCols.get(j), locSum, 0d);
- }
- });
- }
-
- /** */
- @Test
- public void testSum() {
- consumeSampleMatrix((m, desc) -> {
- double[][] data = fillAndReturn(m);
-
- double sum = m.sum();
-
- double rawSum = 0;
- for (double[] anArr : data)
- for (int j = 0; j < data[0].length; j++)
- rawSum += anArr[j];
-
- assertEquals("Unexpected value for " + desc,
- rawSum, sum, 0d);
- });
- }
-
- /** */
- @Test
- public void testMax() {
- consumeSampleMatrix((m, desc) -> {
- double[][] doubles = fillAndReturn(m);
- double max = Double.NEGATIVE_INFINITY;
-
- for (int i = 0; i < m.rowSize(); i++)
- for (int j = 0; j < m.columnSize(); j++)
- max = max < doubles[i][j] ? doubles[i][j] : max;
-
- assertEquals("Unexpected value for " + desc, m.maxValue(), max, 0d);
- });
- }
-
- /** */
- @Test
- public void testMin() {
- consumeSampleMatrix((m, desc) -> {
- double[][] doubles = fillAndReturn(m);
- double min = Double.MAX_VALUE;
-
- for (int i = 0; i < m.rowSize(); i++)
- for (int j = 0; j < m.columnSize(); j++)
- min = min > doubles[i][j] ? doubles[i][j] : min;
-
- assertEquals("Unexpected value for " + desc, m.minValue(), min, 0d);
- });
- }
-
- /** */
- @Test
- public void testGetElement() {
- consumeSampleMatrix((m, desc) -> {
- if (!(readOnly(m)))
- fillMatrix(m);
-
- for (int i = 0; i < m.rowSize(); i++)
- for (int j = 0; j < m.columnSize(); j++) {
- final Matrix.Element e = m.getElement(i, j);
-
- final String details = desc + " at [" + i + "," + j + "]";
-
- assertEquals("Unexpected element row " + details, i, e.row());
- assertEquals("Unexpected element col " + details, j, e.column());
-
- final double val = m.get(i, j);
-
- assertEquals("Unexpected value for " + details, val, e.get(), 0d);
-
- boolean expECaught = false;
-
- final double newVal = val * 2.0;
-
- try {
- e.set(newVal);
- }
- catch (UnsupportedOperationException uoe) {
- if (!(readOnly(m)))
- throw uoe;
-
- expECaught = true;
- }
-
- if (readOnly(m)) {
- if (!expECaught)
- fail("Expected exception was not caught for " + details);
-
- continue;
- }
-
- assertEquals("Unexpected value set for " + details, newVal, m.get(i, j), 0d);
- }
- });
- }
-
- /** */
- @Test
- public void testGetX() {
- consumeSampleMatrix((m, desc) -> {
- if (!(readOnly(m)))
- fillMatrix(m);
-
- for (int i = 0; i < m.rowSize(); i++)
- for (int j = 0; j < m.columnSize(); j++)
- assertEquals("Unexpected value for " + desc + " at [" + i + "," + j + "]",
- m.get(i, j), m.getX(i, j), 0d);
- });
- }
-
- /** */
- @Test
- public void testGetMetaStorage() {
- consumeSampleMatrix((m, desc) -> assertNotNull("Null meta storage in " + desc, m.getMetaStorage()));
- }
-
- /** */
- @Test
- public void testGuid() {
- consumeSampleMatrix((m, desc) -> assertNotNull("Null guid in " + desc, m.guid()));
- }
-
- /** */
- @Test
- public void testSwapRows() {
- consumeSampleMatrix((m, desc) -> {
- if (readOnly(m))
- return;
-
- double[][] doubles = fillAndReturn(m);
-
- final int swap_i = m.rowSize() == 1 ? 0 : 1;
- final int swap_j = 0;
-
- Matrix swap = m.swapRows(swap_i, swap_j);
-
- for (int col = 0; col < m.columnSize(); col++) {
- assertEquals("Unexpected value for " + desc + " at col " + col + ", swap_i " + swap_i,
- swap.get(swap_i, col), doubles[swap_j][col], 0d);
-
- assertEquals("Unexpected value for " + desc + " at col " + col + ", swap_j " + swap_j,
- swap.get(swap_j, col), doubles[swap_i][col], 0d);
- }
-
- testInvalidRowIndex(() -> m.swapRows(-1, 0), desc + " negative first swap index");
- testInvalidRowIndex(() -> m.swapRows(0, -1), desc + " negative second swap index");
- testInvalidRowIndex(() -> m.swapRows(m.rowSize(), 0), desc + " too large first swap index");
- testInvalidRowIndex(() -> m.swapRows(0, m.rowSize()), desc + " too large second swap index");
- });
- }
-
- /** */
- @Test
- public void testSwapColumns() {
- consumeSampleMatrix((m, desc) -> {
- if (readOnly(m))
- return;
-
- double[][] doubles = fillAndReturn(m);
-
- final int swap_i = m.columnSize() == 1 ? 0 : 1;
- final int swap_j = 0;
-
- Matrix swap = m.swapColumns(swap_i, swap_j);
-
- for (int row = 0; row < m.rowSize(); row++) {
- assertEquals("Unexpected value for " + desc + " at row " + row + ", swap_i " + swap_i,
- swap.get(row, swap_i), doubles[row][swap_j], 0d);
-
- assertEquals("Unexpected value for " + desc + " at row " + row + ", swap_j " + swap_j,
- swap.get(row, swap_j), doubles[row][swap_i], 0d);
- }
-
- testInvalidColIndex(() -> m.swapColumns(-1, 0), desc + " negative first swap index");
- testInvalidColIndex(() -> m.swapColumns(0, -1), desc + " negative second swap index");
- testInvalidColIndex(() -> m.swapColumns(m.columnSize(), 0), desc + " too large first swap index");
- testInvalidColIndex(() -> m.swapColumns(0, m.columnSize()), desc + " too large second swap index");
- });
- }
-
- /** */
- @Test
- public void testSetRow() {
- consumeSampleMatrix((m, desc) -> {
- if (ignore(m.getClass()))
- return;
-
- fillMatrix(m);
-
- int rowIdx = m.rowSize() / 2;
-
- double[] newValues = fillArray(m.columnSize());
-
- m.setRow(rowIdx, newValues);
-
- for (int col = 0; col < m.columnSize(); col++)
- assertEquals("Unexpected value for " + desc + " at " + col,
- newValues[col], m.get(rowIdx, col), 0d);
-
- testInvalidCardinality(() -> m.setRow(rowIdx, new double[m.columnSize() + 1]), desc);
- });
- }
-
- /** */
- @Test
- public void testSetColumn() {
- consumeSampleMatrix((m, desc) -> {
- if (ignore(m.getClass()))
- return;
-
- fillMatrix(m);
-
- int colIdx = m.columnSize() / 2;
-
- double[] newValues = fillArray(m.rowSize());
-
- m.setColumn(colIdx, newValues);
-
- for (int row = 0; row < m.rowSize(); row++)
- assertEquals("Unexpected value for " + desc + " at " + row,
- newValues[row], m.get(row, colIdx), 0d);
-
- testInvalidCardinality(() -> m.setColumn(colIdx, new double[m.rowSize() + 1]), desc);
- });
- }
-
- /** */
- @Test
- public void testViewPart() {
- consumeSampleMatrix((m, desc) -> {
- if (ignore(m.getClass()))
- return;
-
- fillMatrix(m);
-
- int rowOff = m.rowSize() < 3 ? 0 : 1;
- int rows = m.rowSize() < 3 ? 1 : m.rowSize() - 2;
- int colOff = m.columnSize() < 3 ? 0 : 1;
- int cols = m.columnSize() < 3 ? 1 : m.columnSize() - 2;
-
- Matrix view1 = m.viewPart(rowOff, rows, colOff, cols);
- Matrix view2 = m.viewPart(new int[] {rowOff, colOff}, new int[] {rows, cols});
-
- String details = desc + " view [" + rowOff + ", " + rows + ", " + colOff + ", " + cols + "]";
-
- for (int i = 0; i < rows; i++)
- for (int j = 0; j < cols; j++) {
- assertEquals("Unexpected view1 value for " + details + " at (" + i + "," + j + ")",
- m.get(i + rowOff, j + colOff), view1.get(i, j), 0d);
-
- assertEquals("Unexpected view2 value for " + details + " at (" + i + "," + j + ")",
- m.get(i + rowOff, j + colOff), view2.get(i, j), 0d);
- }
- });
- }
-
- /** */
- @Test
- public void testDensity() {
- consumeSampleMatrix((m, desc) -> {
- if (!readOnly(m))
- fillMatrix(m);
-
- assertTrue("Unexpected density with threshold 0 for " + desc, m.density(0.0));
-
- assertFalse("Unexpected density with threshold 1 for " + desc, m.density(1.0));
- });
- }
-
- /** */
- @Test
- public void testMaxAbsRowSumNorm() {
- consumeSampleMatrix((m, desc) -> {
- if (!readOnly(m))
- fillMatrix(m);
-
- assertEquals("Unexpected value for " + desc,
- maxAbsRowSumNorm(m), m.maxAbsRowSumNorm(), 0d);
- });
- }
-
- /** */
- @Test
- public void testAssignRow() {
- consumeSampleMatrix((m, desc) -> {
- if (ignore(m.getClass()))
- return;
-
- fillMatrix(m);
-
- int rowIdx = m.rowSize() / 2;
-
- double[] newValues = fillArray(m.columnSize());
-
- m.assignRow(rowIdx, new DenseLocalOnHeapVector(newValues));
-
- for (int col = 0; col < m.columnSize(); col++)
- assertEquals("Unexpected value for " + desc + " at " + col,
- newValues[col], m.get(rowIdx, col), 0d);
-
- testInvalidCardinality(() -> m.assignRow(rowIdx, new DenseLocalOnHeapVector(m.columnSize() + 1)), desc);
- });
- }
-
- /** */
- @Test
- public void testAssignColumn() {
- consumeSampleMatrix((m, desc) -> {
- if (ignore(m.getClass()))
- return;
-
- fillMatrix(m);
-
- int colIdx = m.columnSize() / 2;
-
- double[] newValues = fillArray(m.rowSize());
-
- m.assignColumn(colIdx, new DenseLocalOnHeapVector(newValues));
-
- for (int row = 0; row < m.rowSize(); row++)
- assertEquals("Unexpected value for " + desc + " at " + row,
- newValues[row], m.get(row, colIdx), 0d);
- });
- }
-
- /** */
- private double[] fillArray(int len) {
- double[] newValues = new double[len];
-
- for (int i = 0; i < newValues.length; i++)
- newValues[i] = newValues.length - i;
- return newValues;
- }
-
- /** */
- private double maxAbsRowSumNorm(Matrix m) {
- double max = 0.0;
-
- for (int x = 0; x < m.rowSize(); x++) {
- double sum = 0;
-
- for (int y = 0; y < m.columnSize(); y++)
- sum += Math.abs(m.getX(x, y));
-
- if (sum > max)
- max = sum;
- }
-
- return max;
- }
-
- /** */
- private void testInvalidRowIndex(Supplier<Matrix> supplier, String desc) {
- try {
- supplier.get();
- }
- catch (RowIndexException | IndexException ie) {
- return;
- }
-
- fail("Expected exception was not caught for " + desc);
- }
-
- /** */
- private void testInvalidColIndex(Supplier<Matrix> supplier, String desc) {
- try {
- supplier.get();
- }
- catch (ColumnIndexException | IndexException ie) {
- return;
- }
-
- fail("Expected exception was not caught for " + desc);
- }
-
- /** */
- private void testMapMatrixWrongCardinality(Matrix m, String desc) {
- for (int rowDelta : new int[] {-1, 0, 1})
- for (int colDelta : new int[] {-1, 0, 1}) {
- if (rowDelta == 0 && colDelta == 0)
- continue;
-
- int rowNew = m.rowSize() + rowDelta;
- int colNew = m.columnSize() + colDelta;
-
- if (rowNew < 1 || colNew < 1)
- continue;
-
- testInvalidCardinality(() -> m.map(new DenseLocalOnHeapMatrix(rowNew, colNew), (m1, m2) -> m1 + m2),
- desc + " wrong cardinality when mapping to size " + rowNew + "x" + colNew);
- }
- }
-
- /** */
- private void testInvalidCardinality(Supplier<Object> supplier, String desc) {
- try {
- supplier.get();
- }
- catch (CardinalityException ce) {
- return;
- }
-
- fail("Expected exception was not caught for " + desc);
- }
-
- /** */
- private boolean readOnly(Matrix m) {
- return m instanceof RandomMatrix;
- }
-
- /** */
- private double[][] fillIntAndReturn(Matrix m) {
- double[][] data = new double[m.rowSize()][m.columnSize()];
-
- if (readOnly(m)) {
- for (int i = 0; i < m.rowSize(); i++)
- for (int j = 0; j < m.columnSize(); j++)
- data[i][j] = m.get(i, j);
-
- }
- else {
- for (int i = 0; i < m.rowSize(); i++)
- for (int j = 0; j < m.columnSize(); j++)
- data[i][j] = i * m.rowSize() + j + 1;
-
- m.assign(data);
- }
- return data;
- }
-
- /** */
- private double[][] fillAndReturn(Matrix m) {
- double[][] data = new double[m.rowSize()][m.columnSize()];
-
- if (readOnly(m)) {
- for (int i = 0; i < m.rowSize(); i++)
- for (int j = 0; j < m.columnSize(); j++)
- data[i][j] = m.get(i, j);
-
- }
- else {
- for (int i = 0; i < m.rowSize(); i++)
- for (int j = 0; j < m.columnSize(); j++)
- data[i][j] = -0.5d + Math.random();
-
- m.assign(data);
- }
- return data;
- }
-
- /** */
- private void fillNonSingularMatrix(Matrix m) {
- for (int i = 0; i < m.rowSize(); i++) {
- m.set(i, i, 10);
-
- for (int j = 0; j < m.columnSize(); j++)
- if (j != i)
- m.set(i, j, 0.01d);
- }
- }
-
- /** */
- private void fillMatrix(Matrix m) {
- for (int i = 0; i < m.rowSize(); i++)
- for (int j = 0; j < m.columnSize(); j++)
- m.set(i, j, Math.random());
- }
-
- /** Ignore test for given matrix type. */
- private boolean ignore(Class<? extends Matrix> clazz) {
- List<Class<? extends Matrix>> ignoredClasses = Arrays.asList(RandomMatrix.class, PivotedMatrixView.class,
- MatrixView.class, FunctionMatrix.class, TransposedMatrixView.class);
-
- for (Class<? extends Matrix> ignoredClass : ignoredClasses)
- if (ignoredClass.isAssignableFrom(clazz))
- return true;
-
- return false;
- }
-
- /** */
- private Class<? extends Matrix> likeMatrixType(Matrix m) {
- for (Class<? extends Matrix> clazz : likeTypesMap().keySet())
- if (clazz.isAssignableFrom(m.getClass()))
- return likeTypesMap().get(clazz);
-
- return null;
- }
-
- /** */
- private static Map<Class<? extends Matrix>, Class<? extends Vector>> likeVectorTypesMap() {
- return new LinkedHashMap<Class<? extends Matrix>, Class<? extends Vector>>() {{
- put(DenseLocalOnHeapMatrix.class, DenseLocalOnHeapVector.class);
- put(DenseLocalOffHeapMatrix.class, DenseLocalOffHeapVector.class);
- put(RandomMatrix.class, RandomVector.class);
- put(SparseLocalOnHeapMatrix.class, SparseLocalVector.class);
- put(DenseLocalOnHeapMatrix.class, DenseLocalOnHeapVector.class);
- put(DiagonalMatrix.class, DenseLocalOnHeapVector.class); // IMPL NOTE per fixture
- // IMPL NOTE check for presence of all implementations here will be done in testHaveLikeMatrix via Fixture
- }};
- }
-
- /** */
- private static Map<Class<? extends Matrix>, Class<? extends Matrix>> likeTypesMap() {
- return new LinkedHashMap<Class<? extends Matrix>, Class<? extends Matrix>>() {{
- put(DenseLocalOnHeapMatrix.class, DenseLocalOnHeapMatrix.class);
- put(DenseLocalOffHeapMatrix.class, DenseLocalOffHeapMatrix.class);
- put(RandomMatrix.class, RandomMatrix.class);
- put(SparseLocalOnHeapMatrix.class, SparseLocalOnHeapMatrix.class);
- put(DenseLocalOnHeapMatrix.class, DenseLocalOnHeapMatrix.class);
- put(DiagonalMatrix.class, DenseLocalOnHeapMatrix.class); // IMPL NOTE per fixture
- put(FunctionMatrix.class, FunctionMatrix.class);
- // IMPL NOTE check for presence of all implementations here will be done in testHaveLikeMatrix via Fixture
- }};
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/MatrixKeyMapperForTests.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/MatrixKeyMapperForTests.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/MatrixKeyMapperForTests.java
deleted file mode 100644
index 90fbec4..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/MatrixKeyMapperForTests.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * 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.ignite.math.impls.matrix;
-
-import org.apache.ignite.math.MatrixKeyMapper;
-
-/** */
-public class MatrixKeyMapperForTests implements MatrixKeyMapper<Integer> {
- /** */ private int rows;
- /** */ private int cols;
-
- /** */
- public MatrixKeyMapperForTests() {
- // No-op.
- }
-
- /** */
- public MatrixKeyMapperForTests(int rows, int cols) {
- this.rows = rows;
- this.cols = cols;
- }
-
- /** */
- @Override public Integer apply(int x, int y) {
- return x * cols + y;
- }
-
- /** */
- @Override public boolean isValid(Integer integer) {
- return (rows * cols) > integer;
- }
-
- /** */
- @Override public int hashCode() {
- int hash = 1;
-
- hash += hash * 31 + rows;
- hash += hash * 31 + cols;
-
- return hash;
- }
-
- /** */
- @Override public boolean equals(Object obj) {
- if (this == obj)
- return true;
-
- if (obj == null || getClass() != obj.getClass())
- return false;
-
- MatrixKeyMapperForTests that = (MatrixKeyMapperForTests)obj;
-
- return rows == that.rows && cols == that.cols;
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/MatrixViewConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/MatrixViewConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/MatrixViewConstructorTest.java
deleted file mode 100644
index 01278da..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/MatrixViewConstructorTest.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * 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.ignite.math.impls.matrix;
-
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.impls.storage.matrix.MatrixDelegateStorage;
-import org.junit.Test;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-
-/** */
-public class MatrixViewConstructorTest {
- /** */
- @Test
- public void invalidArgsTest() {
- Matrix m = new DenseLocalOnHeapMatrix(1, 1);
-
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new MatrixView((Matrix)null, 0, 0, 1, 1),
- "Null parent matrix.");
-
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new MatrixView(m, -1, 0, 1, 1),
- "Invalid row offset.");
-
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new MatrixView(m, 0, -1, 1, 1),
- "Invalid col offset.");
-
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new MatrixView(m, 0, 0, 0, 1),
- "Invalid rows.");
-
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new MatrixView(m, 0, 0, 1, 0),
- "Invalid cols.");
- }
-
- /** */
- @Test
- public void basicTest() {
- for (Matrix m : new Matrix[] {
- new DenseLocalOnHeapMatrix(3, 3),
- new DenseLocalOnHeapMatrix(3, 4), new DenseLocalOnHeapMatrix(4, 3)})
- for (int rowOff : new int[] {0, 1})
- for (int colOff : new int[] {0, 1})
- for (int rows : new int[] {1, 2})
- for (int cols : new int[] {1, 2})
- basicTest(m, rowOff, colOff, rows, cols);
- }
-
- /** */
- private void basicTest(Matrix parent, int rowOff, int colOff, int rows, int cols) {
- for (int row = 0; row < parent.rowSize(); row++)
- for (int col = 0; col < parent.columnSize(); col++)
- parent.set(row, col, row * parent.columnSize() + col + 1);
-
- Matrix view = new MatrixView(parent, rowOff, colOff, rows, cols);
-
- assertEquals("Rows in view.", rows, view.rowSize());
- assertEquals("Cols in view.", cols, view.columnSize());
-
- for (int row = 0; row < rows; row++)
- for (int col = 0; col < cols; col++)
- assertEquals("Unexpected value at " + row + "x" + col,
- parent.get(row + rowOff, col + colOff), view.get(row, col), 0d);
-
- for (int row = 0; row < rows; row++)
- for (int col = 0; col < cols; col++)
- view.set(row, col, 0d);
-
- for (int row = 0; row < rows; row++)
- for (int col = 0; col < cols; col++)
- assertEquals("Unexpected value set at " + row + "x" + col,
- 0d, parent.get(row + rowOff, col + colOff), 0d);
- }
-
- /** */
- @Test
- public void attributeTest() {
- for (Matrix m : new Matrix[] {
- new DenseLocalOnHeapMatrix(3, 3),
- new DenseLocalOnHeapMatrix(3, 4), new DenseLocalOnHeapMatrix(4, 3)}) {
- MatrixView matrixView = new MatrixView(m, 0, 0, m.rowSize(), m.columnSize());
-
- MatrixDelegateStorage delegateStorage = (MatrixDelegateStorage)matrixView.getStorage();
-
- assertEquals(m.rowSize(), matrixView.rowSize());
- assertEquals(m.columnSize(), matrixView.columnSize());
-
- assertEquals(m.rowSize(), (delegateStorage).rowsLength());
- assertEquals(m.columnSize(), (delegateStorage).columnsLength());
-
- assertEquals(m.isSequentialAccess(), delegateStorage.isSequentialAccess());
- assertEquals(m.isRandomAccess(), delegateStorage.isRandomAccess());
- assertEquals(m.isDistributed(), delegateStorage.isDistributed());
- assertEquals(m.isDense(), delegateStorage.isDense());
- assertEquals(m.isArrayBased(), delegateStorage.isArrayBased());
-
- assertArrayEquals(m.getStorage().data(), delegateStorage.data());
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/PivotedMatrixViewConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/PivotedMatrixViewConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/PivotedMatrixViewConstructorTest.java
deleted file mode 100644
index a495745..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/PivotedMatrixViewConstructorTest.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * 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.ignite.math.impls.matrix;
-
-import java.util.Arrays;
-import org.apache.ignite.math.Matrix;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-/** */
-public class PivotedMatrixViewConstructorTest {
- /** */
- @Test
- public void invalidArgsTest() {
- Matrix m = new DenseLocalOnHeapMatrix(1, 1);
-
- int[] pivot = new int[] {0};
-
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new PivotedMatrixView(null),
- "Null parent matrix.");
-
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new PivotedMatrixView(null, pivot),
- "Null parent matrix, with pivot.");
-
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new PivotedMatrixView(m, null),
- "Null pivot.");
-
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new PivotedMatrixView(m, null, pivot),
- "Null row pivot.");
-
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new PivotedMatrixView(m, pivot, null),
- "Null col pivot.");
- }
-
- /** */
- @Test
- public void basicTest() {
- Matrix m = new DenseLocalOnHeapMatrix(2, 2);
-
- int[] pivot = new int[] {0, 1};
-
- PivotedMatrixView view = new PivotedMatrixView(m, pivot);
-
- assertEquals("Rows in view.", m.rowSize(), view.rowSize());
- assertEquals("Cols in view.", m.columnSize(), view.columnSize());
-
- assertTrue("Row pivot array in view.", Arrays.equals(pivot, view.rowPivot()));
- assertTrue("Col pivot array in view.", Arrays.equals(pivot, view.columnPivot()));
-
- assertEquals("Base matrix in view.", m, view.getBaseMatrix());
-
- assertEquals("Row pivot value in view.", 0, view.rowPivot(0));
- assertEquals("Col pivot value in view.", 0, view.columnPivot(0));
-
- assertEquals("Row unpivot value in view.", 0, view.rowUnpivot(0));
- assertEquals("Col unpivot value in view.", 0, view.columnUnpivot(0));
-
- Matrix swap = view.swap(1, 1);
-
- for (int row = 0; row < view.rowSize(); row++)
- for (int col = 0; col < view.columnSize(); col++)
- assertEquals("Unexpected swap value set at (" + row + "," + col + ").",
- view.get(row, col), swap.get(row, col), 0d);
-
- //noinspection EqualsWithItself
- assertTrue("View is expected to be equal to self.", view.equals(view));
- //noinspection ObjectEqualsNull
- assertFalse("View is expected to be not equal to null.", view.equals(null));
- }
-
- /** */
- @Test
- public void pivotTest() {
- int[] pivot = new int[] {2, 1, 0, 3};
-
- for (Matrix m : new Matrix[] {
- new DenseLocalOnHeapMatrix(3, 3),
- new DenseLocalOnHeapMatrix(3, 4), new DenseLocalOnHeapMatrix(4, 3)})
- pivotTest(m, pivot);
- }
-
- /** */
- private void pivotTest(Matrix parent, int[] pivot) {
- for (int row = 0; row < parent.rowSize(); row++)
- for (int col = 0; col < parent.columnSize(); col++)
- parent.set(row, col, row * parent.columnSize() + col + 1);
-
- Matrix view = new PivotedMatrixView(parent, pivot);
-
- int rows = parent.rowSize();
- int cols = parent.columnSize();
-
- assertEquals("Rows in view.", rows, view.rowSize());
- assertEquals("Cols in view.", cols, view.columnSize());
-
- for (int row = 0; row < rows; row++)
- for (int col = 0; col < cols; col++)
- assertEquals("Unexpected value at " + row + "x" + col,
- parent.get(pivot[row], pivot[col]), view.get(row, col), 0d);
-
- int min = rows < cols ? rows : cols;
-
- for (int idx = 0; idx < min; idx++)
- view.set(idx, idx, 0d);
-
- for (int idx = 0; idx < min; idx++)
- assertEquals("Unexpected value set at " + idx,
- 0d, parent.get(pivot[idx], pivot[idx]), 0d);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/RandomMatrixConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/RandomMatrixConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/RandomMatrixConstructorTest.java
deleted file mode 100644
index e19cfa3..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/RandomMatrixConstructorTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * 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.ignite.math.impls.matrix;
-
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-/** */
-public class RandomMatrixConstructorTest {
- /** */
- @Test
- public void invalidArgsTest() {
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new RandomMatrix(0, 1), "invalid row parameter");
-
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new RandomMatrix(1, 0), "invalid col parameter");
-
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new RandomMatrix(0, 1, true), "invalid row parameter, fastHash true");
-
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new RandomMatrix(1, 0, true), "invalid col parameter, fastHash true");
-
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new RandomMatrix(0, 1, false), "invalid row parameter, fastHash false");
-
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new RandomMatrix(1, 0, false), "invalid col parameter, fastHash false");
- }
-
- /** */
- @Test
- public void basicTest() {
- assertEquals("Expected number of rows, int parameters.", 1,
- new RandomMatrix(1, 2).rowSize());
-
- assertEquals("Expected number of cols, int parameters.", 1,
- new RandomMatrix(2, 1).columnSize());
-
- assertEquals("Expected number of rows, int parameters, fastHash true.", 1,
- new RandomMatrix(1, 2, true).rowSize());
-
- assertEquals("Expected number of cols, int parameters, fastHash true.", 1,
- new RandomMatrix(2, 1, true).columnSize());
-
- assertEquals("Expected number of rows, int parameters, fastHash false.", 1,
- new RandomMatrix(1, 2, false).rowSize());
-
- assertEquals("Expected number of cols, int parameters, fastHash false.", 1,
- new RandomMatrix(2, 1, false).columnSize());
-
- RandomMatrix m = new RandomMatrix(1, 1);
- //noinspection EqualsWithItself
- assertTrue("Matrix is expected to be equal to self.", m.equals(m));
- //noinspection ObjectEqualsNull
- assertFalse("Matrix is expected to be not equal to null.", m.equals(null));
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/SparseDistributedMatrixTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/SparseDistributedMatrixTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/SparseDistributedMatrixTest.java
deleted file mode 100644
index 8218a12..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/SparseDistributedMatrixTest.java
+++ /dev/null
@@ -1,265 +0,0 @@
-// @java.file.header
-
-/* _________ _____ __________________ _____
- * __ ____/___________(_)______ /__ ____/______ ____(_)_______
- * _ / __ __ ___/__ / _ __ / _ / __ _ __ `/__ / __ __ \
- * / /_/ / _ / _ / / /_/ / / /_/ / / /_/ / _ / _ / / /
- * \____/ /_/ /_/ \_,__/ \____/ \__,_/ /_/ /_/ /_/
- */
-
-/*
- * 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.ignite.math.impls.matrix;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.internal.util.IgniteUtils;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.StorageConstants;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.apache.ignite.math.impls.MathTestConstants;
-import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
-import org.apache.ignite.testframework.junits.common.GridCommonTest;
-
-import static org.apache.ignite.math.impls.MathTestConstants.UNEXPECTED_VAL;
-
-/**
- * Tests for {@link SparseDistributedMatrix}.
- */
-@GridCommonTest(group = "Distributed Models")
-public class SparseDistributedMatrixTest extends GridCommonAbstractTest {
- /** Number of nodes in grid */
- private static final int NODE_COUNT = 3;
- /** Cache name. */
- private static final String CACHE_NAME = "test-cache";
- /** Precision. */
- private static final double PRECISION = 0.0;
- /** Grid instance. */
- private Ignite ignite;
- /** Matrix rows */
- private final int rows = MathTestConstants.STORAGE_SIZE;
- /** Matrix cols */
- private final int cols = MathTestConstants.STORAGE_SIZE;
- /** Matrix for tests */
- private SparseDistributedMatrix cacheMatrix;
-
- /**
- * Default constructor.
- */
- public SparseDistributedMatrixTest() {
- super(false);
- }
-
- /** {@inheritDoc} */
- @Override protected void beforeTestsStarted() throws Exception {
- for (int i = 1; i <= NODE_COUNT; i++)
- startGrid(i);
- }
-
- /** {@inheritDoc} */
- @Override protected void afterTestsStopped() throws Exception {
- stopAllGrids();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override protected void beforeTest() throws Exception {
- ignite = grid(NODE_COUNT);
-
- ignite.configuration().setPeerClassLoadingEnabled(true);
- }
-
- /** {@inheritDoc} */
- @Override protected void afterTest() throws Exception {
- ignite.destroyCache(CACHE_NAME);
-
- if (cacheMatrix != null) {
- cacheMatrix.destroy();
- cacheMatrix = null;
- }
- }
-
- /** */
- public void testGetSet() throws Exception {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- cacheMatrix = new SparseDistributedMatrix(rows, cols, StorageConstants.ROW_STORAGE_MODE, StorageConstants.RANDOM_ACCESS_MODE);
-
- for (int i = 0; i < rows; i++) {
- for (int j = 0; j < cols; j++) {
- double v = Math.random();
- cacheMatrix.set(i, j, v);
-
- assert Double.compare(v, cacheMatrix.get(i, j)) == 0;
- }
- }
- }
-
- /** */
- public void testExternalize() throws IOException, ClassNotFoundException {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- cacheMatrix = new SparseDistributedMatrix(rows, cols, StorageConstants.ROW_STORAGE_MODE, StorageConstants.RANDOM_ACCESS_MODE);
-
- cacheMatrix.set(1, 1, 1.0);
-
- ByteArrayOutputStream byteArrOutputStream = new ByteArrayOutputStream();
- ObjectOutputStream objOutputStream = new ObjectOutputStream(byteArrOutputStream);
-
- objOutputStream.writeObject(cacheMatrix);
-
- ByteArrayInputStream byteArrInputStream = new ByteArrayInputStream(byteArrOutputStream.toByteArray());
- ObjectInputStream objInputStream = new ObjectInputStream(byteArrInputStream);
-
- SparseDistributedMatrix objRestored = (SparseDistributedMatrix)objInputStream.readObject();
-
- assertTrue(MathTestConstants.VAL_NOT_EQUALS, cacheMatrix.equals(objRestored));
- assertEquals(MathTestConstants.VAL_NOT_EQUALS, objRestored.get(1, 1), 1.0, 0.0);
- }
-
- /** Test simple math. */
- public void testMath() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- cacheMatrix = new SparseDistributedMatrix(rows, cols, StorageConstants.ROW_STORAGE_MODE, StorageConstants.RANDOM_ACCESS_MODE);
- initMtx(cacheMatrix);
-
- cacheMatrix.assign(2.0);
- for (int i = 0; i < cacheMatrix.rowSize(); i++)
- for (int j = 0; j < cacheMatrix.columnSize(); j++)
- assertEquals(UNEXPECTED_VAL, 2.0, cacheMatrix.get(i, j), PRECISION);
-
- cacheMatrix.plus(3.0);
- for (int i = 0; i < cacheMatrix.rowSize(); i++)
- for (int j = 0; j < cacheMatrix.columnSize(); j++)
- assertEquals(UNEXPECTED_VAL, 5.0, cacheMatrix.get(i, j), PRECISION);
-
- cacheMatrix.times(2.0);
- for (int i = 0; i < cacheMatrix.rowSize(); i++)
- for (int j = 0; j < cacheMatrix.columnSize(); j++)
- assertEquals(UNEXPECTED_VAL, 10.0, cacheMatrix.get(i, j), PRECISION);
-
- cacheMatrix.divide(10.0);
- for (int i = 0; i < cacheMatrix.rowSize(); i++)
- for (int j = 0; j < cacheMatrix.columnSize(); j++)
- assertEquals(UNEXPECTED_VAL, 1.0, cacheMatrix.get(i, j), PRECISION);
-
- assertEquals(UNEXPECTED_VAL, cacheMatrix.rowSize() * cacheMatrix.columnSize(), cacheMatrix.sum(), PRECISION);
- }
-
- /** */
- public void testMinMax() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- cacheMatrix = new SparseDistributedMatrix(rows, cols, StorageConstants.ROW_STORAGE_MODE, StorageConstants.RANDOM_ACCESS_MODE);
-
- for (int i = 0; i < cacheMatrix.rowSize(); i++)
- for (int j = 0; j < cacheMatrix.columnSize(); j++)
- cacheMatrix.set(i, j, i * cols + j + 1);
-
- assertEquals(UNEXPECTED_VAL, 1.0, cacheMatrix.minValue(), PRECISION);
- assertEquals(UNEXPECTED_VAL, rows * cols, cacheMatrix.maxValue(), PRECISION);
-
- for (int i = 0; i < cacheMatrix.rowSize(); i++)
- for (int j = 0; j < cacheMatrix.columnSize(); j++)
- cacheMatrix.set(i, j, -1.0 * (i * cols + j + 1));
-
- assertEquals(UNEXPECTED_VAL, -rows * cols, cacheMatrix.minValue(), PRECISION);
- assertEquals(UNEXPECTED_VAL, -1.0, cacheMatrix.maxValue(), PRECISION);
-
- for (int i = 0; i < cacheMatrix.rowSize(); i++)
- for (int j = 0; j < cacheMatrix.columnSize(); j++)
- cacheMatrix.set(i, j, i * cols + j);
-
- assertEquals(UNEXPECTED_VAL, 1.0, cacheMatrix.minValue(), PRECISION);
- assertEquals(UNEXPECTED_VAL, rows * cols - 1.0, cacheMatrix.maxValue(), PRECISION);
- }
-
- /** */
- public void testMap() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- cacheMatrix = new SparseDistributedMatrix(rows, cols, StorageConstants.ROW_STORAGE_MODE, StorageConstants.RANDOM_ACCESS_MODE);
- initMtx(cacheMatrix);
-
- cacheMatrix.map(i -> 100.0);
- for (int i = 0; i < cacheMatrix.rowSize(); i++)
- for (int j = 0; j < cacheMatrix.columnSize(); j++)
- assertEquals(UNEXPECTED_VAL, 100.0, cacheMatrix.get(i, j), PRECISION);
- }
-
- /** */
- public void testCopy() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- cacheMatrix = new SparseDistributedMatrix(rows, cols, StorageConstants.ROW_STORAGE_MODE, StorageConstants.RANDOM_ACCESS_MODE);
-
- try {
- cacheMatrix.copy();
- fail("UnsupportedOperationException expected.");
- }
- catch (UnsupportedOperationException e) {
- return;
- }
- fail("UnsupportedOperationException expected.");
- }
-
- /** */
- public void testLike() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- cacheMatrix = new SparseDistributedMatrix(rows, cols, StorageConstants.ROW_STORAGE_MODE, StorageConstants.RANDOM_ACCESS_MODE);
-
- try {
- cacheMatrix.like(1, 1);
- fail("UnsupportedOperationException expected.");
- }
- catch (UnsupportedOperationException e) {
- return;
- }
- fail("UnsupportedOperationException expected.");
- }
-
- /** */
- public void testLikeVector() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- cacheMatrix = new SparseDistributedMatrix(rows, cols, StorageConstants.ROW_STORAGE_MODE, StorageConstants.RANDOM_ACCESS_MODE);
-
- try {
- cacheMatrix.likeVector(1);
- fail("UnsupportedOperationException expected.");
- }
- catch (UnsupportedOperationException e) {
- return;
- }
- fail("UnsupportedOperationException expected.");
- }
-
- /** */
- private void initMtx(Matrix m) {
- for (int i = 0; i < m.rowSize(); i++)
- for (int j = 0; j < m.columnSize(); j++)
- m.set(i, j, 1.0);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/SparseLocalOnHeapMatrixConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/SparseLocalOnHeapMatrixConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/SparseLocalOnHeapMatrixConstructorTest.java
deleted file mode 100644
index fc675c1..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/SparseLocalOnHeapMatrixConstructorTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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.ignite.math.impls.matrix;
-
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-/** */
-public class SparseLocalOnHeapMatrixConstructorTest {
- /** */
- @Test
- public void invalidArgsTest() {
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new SparseLocalOnHeapMatrix(0, 1),
- "invalid row parameter");
-
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new SparseLocalOnHeapMatrix(1, 0),
- "invalid col parameter");
- }
-
- /** */
- @Test
- public void basicTest() {
- assertEquals("Expected number of rows.", 1,
- new SparseLocalOnHeapMatrix(1, 2).rowSize());
-
- assertEquals("Expected number of cols, int parameters.", 1,
- new SparseLocalOnHeapMatrix(2, 1).columnSize());
-
- SparseLocalOnHeapMatrix m = new SparseLocalOnHeapMatrix(1, 1);
- //noinspection EqualsWithItself
- assertTrue("Matrix is expected to be equal to self.", m.equals(m));
- //noinspection ObjectEqualsNull
- assertFalse("Matrix is expected to be not equal to null.", m.equals(null));
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/TransposedMatrixViewTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/TransposedMatrixViewTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/TransposedMatrixViewTest.java
deleted file mode 100644
index 5eacfea..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/matrix/TransposedMatrixViewTest.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * 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.ignite.math.impls.matrix;
-
-import org.apache.ignite.math.ExternalizeTest;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.apache.ignite.math.impls.MathTestConstants;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-/**
- * Tests for {@link TransposedMatrixView}.
- */
-public class TransposedMatrixViewTest extends ExternalizeTest<TransposedMatrixView> {
- /** */
- private static final String UNEXPECTED_VALUE = "Unexpected value";
- /** */
- private TransposedMatrixView testMatrix;
- /** */
- private DenseLocalOnHeapMatrix parent;
-
- /** */
- @Before
- public void setup() {
- parent = new DenseLocalOnHeapMatrix(MathTestConstants.STORAGE_SIZE, MathTestConstants.STORAGE_SIZE);
- fillMatrix(parent);
- testMatrix = new TransposedMatrixView(parent);
- }
-
- /** {@inheritDoc} */
- @Override public void externalizeTest() {
- externalizeTest(testMatrix);
- }
-
- /** */
- @Test
- public void testView() {
- assertEquals(UNEXPECTED_VALUE, parent.rowSize(), testMatrix.columnSize());
- assertEquals(UNEXPECTED_VALUE, parent.columnSize(), testMatrix.rowSize());
-
- for (int i = 0; i < parent.rowSize(); i++)
- for (int j = 0; j < parent.columnSize(); j++)
- assertEquals(UNEXPECTED_VALUE, parent.get(i, j), testMatrix.get(j, i), 0d);
- }
-
- /** */
- @Test
- public void testNullParams() {
- DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new TransposedMatrixView(null), "Null Matrix parameter");
- }
-
- /** */
- @Test(expected = UnsupportedOperationException.class)
- public void testLike() {
- testMatrix.like(0, 0);
- }
-
- /** */
- @Test(expected = UnsupportedOperationException.class)
- public void testLikeVector() {
- testMatrix.likeVector(0);
- }
-
- /** */
- private void fillMatrix(DenseLocalOnHeapMatrix mtx) {
- for (int i = 0; i < mtx.rowSize(); i++)
- for (int j = 0; j < mtx.columnSize(); j++)
- mtx.setX(i, j, i * mtx.rowSize() + j);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/matrix/MatrixArrayStorageTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/matrix/MatrixArrayStorageTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/matrix/MatrixArrayStorageTest.java
deleted file mode 100644
index 817dd49..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/matrix/MatrixArrayStorageTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.matrix;
-
-import org.apache.ignite.math.impls.MathTestConstants;
-import org.junit.Test;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-/**
- * Unit tests for {@link ArrayMatrixStorage}.
- */
-public class MatrixArrayStorageTest extends MatrixBaseStorageTest<ArrayMatrixStorage> {
- /** {@inheritDoc} */
- @Override public void setUp() {
- storage = new ArrayMatrixStorage(MathTestConstants.STORAGE_SIZE, MathTestConstants.STORAGE_SIZE);
- }
-
- /** */
- @Test
- public void isSequentialAccess() throws Exception {
- assertFalse(MathTestConstants.UNEXPECTED_VAL, storage.isSequentialAccess());
- }
-
- /** */
- @Test
- public void isDense() throws Exception {
- assertTrue(MathTestConstants.UNEXPECTED_VAL, storage.isDense());
- }
-
- /** */
- @Test
- public void isArrayBased() throws Exception {
- assertTrue(MathTestConstants.UNEXPECTED_VAL, storage.isArrayBased());
- }
-
- /** */
- @Test
- public void data() throws Exception {
- double[][] data = storage.data();
- assertNotNull(MathTestConstants.NULL_VAL, data);
- assertTrue(MathTestConstants.UNEXPECTED_VAL, data.length == MathTestConstants.STORAGE_SIZE);
- assertTrue(MathTestConstants.UNEXPECTED_VAL, data[0].length == MathTestConstants.STORAGE_SIZE);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/matrix/MatrixBaseStorageTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/matrix/MatrixBaseStorageTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/matrix/MatrixBaseStorageTest.java
deleted file mode 100644
index 8df19e4..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/matrix/MatrixBaseStorageTest.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.matrix;
-
-import org.apache.ignite.math.ExternalizeTest;
-import org.apache.ignite.math.MatrixStorage;
-import org.apache.ignite.math.impls.MathTestConstants;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-/**
- * Abstract class with base tests for each matrix storage.
- */
-public abstract class MatrixBaseStorageTest<T extends MatrixStorage> extends ExternalizeTest<T> {
- /** */
- protected T storage;
-
- /** */
- @Before
- public abstract void setUp();
-
- /** */
- @After
- public void tearDown() throws Exception {
- storage.destroy();
- }
-
- /** */
- @Test
- public void getSet() throws Exception {
- int rows = MathTestConstants.STORAGE_SIZE;
- int cols = MathTestConstants.STORAGE_SIZE;
-
- for (int i = 0; i < rows; i++) {
- for (int j = 0; j < cols; j++) {
- double data = Math.random();
-
- storage.set(i, j, data);
-
- Assert.assertEquals(MathTestConstants.VAL_NOT_EQUALS, storage.get(i, j), data, MathTestConstants.NIL_DELTA);
- }
- }
- }
-
- /** */
- @Test
- public void columnSize() throws Exception {
- assertEquals(MathTestConstants.VAL_NOT_EQUALS, storage.columnSize(), MathTestConstants.STORAGE_SIZE);
- }
-
- /** */
- @Test
- public void rowSize() throws Exception {
- assertEquals(MathTestConstants.VAL_NOT_EQUALS, storage.rowSize(), MathTestConstants.STORAGE_SIZE);
- }
-
- /** */
- @Override public void externalizeTest() {
- fillMatrix();
- super.externalizeTest(storage);
- }
-
- /** */
- protected void fillMatrix() {
- for (int i = 0; i < storage.rowSize(); i++) {
- for (int j = 0; j < storage.columnSize(); j++)
- storage.set(i, j, Math.random());
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/matrix/MatrixOffHeapStorageTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/matrix/MatrixOffHeapStorageTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/matrix/MatrixOffHeapStorageTest.java
deleted file mode 100644
index a3b21bb..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/matrix/MatrixOffHeapStorageTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.matrix;
-
-import org.apache.ignite.math.impls.MathTestConstants;
-import org.junit.Test;
-
-import static org.junit.Assert.assertNull;
-
-/**
- * Unit tests for {@link DenseOffHeapMatrixStorage}.
- */
-public class MatrixOffHeapStorageTest extends MatrixBaseStorageTest<DenseOffHeapMatrixStorage> {
- /** {@inheritDoc} */
- @Override public void setUp() {
- storage = new DenseOffHeapMatrixStorage(MathTestConstants.STORAGE_SIZE, MathTestConstants.STORAGE_SIZE);
- }
-
- /** */
- @Test
- public void data() throws Exception {
- assertNull(MathTestConstants.UNEXPECTED_VAL, storage.data());
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/matrix/MatrixStorageFixtures.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/matrix/MatrixStorageFixtures.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/matrix/MatrixStorageFixtures.java
deleted file mode 100644
index 6353c38..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/matrix/MatrixStorageFixtures.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.matrix;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.function.BiConsumer;
-import java.util.function.Supplier;
-import org.apache.ignite.math.MatrixStorage;
-import org.jetbrains.annotations.NotNull;
-
-import static org.apache.ignite.math.StorageConstants.COLUMN_STORAGE_MODE;
-import static org.apache.ignite.math.StorageConstants.RANDOM_ACCESS_MODE;
-import static org.apache.ignite.math.StorageConstants.ROW_STORAGE_MODE;
-import static org.apache.ignite.math.StorageConstants.SEQUENTIAL_ACCESS_MODE;
-
-/**
- *
- */
-class MatrixStorageFixtures {
- /** */
- private static final List<Supplier<Iterable<MatrixStorage>>> suppliers = Collections.singletonList(
- (Supplier<Iterable<MatrixStorage>>) SparseLocalMatrixStorageFixture::new
- );
-
- /** */
- void consumeSampleStorages(BiConsumer<Integer, Integer> paramsConsumer,
- BiConsumer<MatrixStorage, String> consumer) {
- for (Supplier<Iterable<MatrixStorage>> fixtureSupplier : suppliers) {
- final Iterable<MatrixStorage> fixture = fixtureSupplier.get();
-
- for (MatrixStorage matrixStorage : fixture) {
- if (paramsConsumer != null)
- paramsConsumer.accept(matrixStorage.rowSize(), matrixStorage.columnSize());
-
- consumer.accept(matrixStorage, fixture.toString());
- }
- }
- }
-
- /** */
- private static class SparseLocalMatrixStorageFixture implements Iterable<MatrixStorage> {
- /** */
- private final Integer[] rows = new Integer[] {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 512, 1024, null};
- /** */
- private final Integer[] cols = new Integer[] {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 1024, 512, null};
- /** */
- private final Integer[] randomAccess = new Integer[] {SEQUENTIAL_ACCESS_MODE, RANDOM_ACCESS_MODE, null};
- /** */
- private final Integer[] rowStorage = new Integer[] {ROW_STORAGE_MODE, COLUMN_STORAGE_MODE, null};
- /** */
- private int sizeIdx = 0;
- /** */
- private int acsModeIdx = 0;
- /** */
- private int stoModeIdx = 0;
-
- /** {@inheritDoc} */
- @NotNull
- @Override public Iterator<MatrixStorage> iterator() {
- return new Iterator<MatrixStorage>() {
- /** {@inheritDoc} */
- @Override public boolean hasNext() {
- return hasNextCol(sizeIdx) && hasNextRow(sizeIdx)
- && hasNextAcsMode(acsModeIdx) && hasNextStoMode(stoModeIdx);
- }
-
- /** {@inheritDoc} */
- @Override public MatrixStorage next() {
- if (!hasNext())
- throw new NoSuchElementException(SparseLocalMatrixStorageFixture.this.toString());
-
- MatrixStorage storage = new SparseLocalOnHeapMatrixStorage(
- rows[sizeIdx], cols[sizeIdx], randomAccess[acsModeIdx], rowStorage[stoModeIdx]);
-
- nextIdx();
-
- return storage;
- }
-
- private void nextIdx() {
- if (hasNextStoMode(stoModeIdx + 1)) {
- stoModeIdx++;
-
- return;
- }
-
- stoModeIdx = 0;
-
- if (hasNextAcsMode(acsModeIdx + 1)) {
- acsModeIdx++;
-
- return;
- }
-
- acsModeIdx = 0;
- sizeIdx++;
- }
- };
- }
-
- /** {@inheritDoc} */
- @Override public String toString() {
- return "SparseLocalMatrixStorageFixture{ " + "rows=" + rows[sizeIdx] + ", cols=" + cols[sizeIdx] +
- ", access mode=" + randomAccess[acsModeIdx] + ", storage mode=" + rowStorage[stoModeIdx] + "}";
- }
-
- /** */ private boolean hasNextRow(int idx) {
- return rows[idx] != null;
- }
-
- /** */ private boolean hasNextCol(int idx) {
- return cols[idx] != null;
- }
-
- /** */ private boolean hasNextAcsMode(int idx) {
- return randomAccess[idx] != null;
- }
-
- /** */ private boolean hasNextStoMode(int idx) {
- return rowStorage[idx] != null;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/matrix/MatrixStorageImplementationTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/matrix/MatrixStorageImplementationTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/matrix/MatrixStorageImplementationTest.java
deleted file mode 100644
index 6ec09bd..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/matrix/MatrixStorageImplementationTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.matrix;
-
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.function.BiConsumer;
-import org.apache.ignite.math.ExternalizeTest;
-import org.apache.ignite.math.MatrixStorage;
-import org.junit.Test;
-
-import static org.junit.Assert.assertTrue;
-
-/**
- * Unit tests for {@link MatrixStorage} implementations.
- *
- * TODO: add attribute tests.
- */
-public class MatrixStorageImplementationTest extends ExternalizeTest<MatrixStorage> {
- /**
- * The columnSize() and the rowSize() test.
- */
- @Test
- public void sizeTest() {
- final AtomicReference<Integer> expRowSize = new AtomicReference<>(0);
- final AtomicReference<Integer> expColSize = new AtomicReference<>(0);
-
- consumeSampleStorages((x, y) -> {
- expRowSize.set(x);
- expColSize.set(y);
- },
- (ms, desc) -> assertTrue("Expected size for " + desc, expColSize.get().equals(ms.columnSize()) && expRowSize.get().equals(ms.rowSize())));
- }
-
- /** */
- @Test
- public void getSetTest() {
- consumeSampleStorages(null, (ms, desc) -> {
- for (int i = 0; i < ms.rowSize(); i++) {
- for (int j = 0; j < ms.columnSize(); j++) {
- double random = Math.random();
- ms.set(i, j, random);
- assertTrue("Unexpected value for " + desc + " x:" + i + ", y:" + j, Double.compare(random, ms.get(i, j)) == 0);
- }
- }
- });
- }
-
- /** */
- @Override public void externalizeTest() {
- consumeSampleStorages(null, (ms, desc) -> externalizeTest(ms));
- }
-
- /** */
- private void consumeSampleStorages(BiConsumer<Integer, Integer> paramsConsumer,
- BiConsumer<MatrixStorage, String> consumer) {
- new MatrixStorageFixtures().consumeSampleStorages(paramsConsumer, consumer);
- }
-}
[22/67] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math
module to Ignite ML module added missed licenses renamed packages fixed wrong
ml profile activation (cherry picked from commit d78e071)
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/decompositions/EigenDecomposition.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/decompositions/EigenDecomposition.java b/modules/ml/src/main/java/org/apache/ignite/math/decompositions/EigenDecomposition.java
deleted file mode 100644
index 66fe13c..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/decompositions/EigenDecomposition.java
+++ /dev/null
@@ -1,923 +0,0 @@
-/*
- * 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.ignite.math.decompositions;
-
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.functions.Functions;
-
-/**
- * This class provides EigenDecomposition of given matrix. The class is based on
- * class with similar name from <a href="http://mahout.apache.org/">Apache Mahout</a> library.
- *
- * @see <a href=http://mathworld.wolfram.com/EigenDecomposition.html>MathWorld</a>
- */
-public class EigenDecomposition extends DecompositionSupport {
- /** Row and column dimension (square matrix). */
- private final int n;
-
- /** Array for internal storage of eigen vectors. */
- private final Matrix v;
-
- /** Array for internal storage of eigenvalues. */
- private final Vector d;
- /** Array for internal storage of eigenvalues. */
- private final Vector e;
-
- /** */
- public EigenDecomposition(Matrix matrix) {
- this(matrix, isSymmetric(matrix));
- }
-
- /** */
- public EigenDecomposition(Matrix matrix, boolean isSymmetric) {
- n = matrix.columnSize();
-
- d = likeVector(matrix);
- e = likeVector(matrix);
- v = like(matrix);
-
- if (isSymmetric) {
- v.assign(matrix);
-
- // Tridiagonalize.
- tred2();
-
- // Diagonalize.
- tql2();
-
- }
- else
- // Reduce to Hessenberg form.
- // Reduce Hessenberg to real Schur form.
- hqr2(orthes(matrix));
- }
-
- /**
- * Return the eigen vector matrix
- *
- * @return V
- */
- public Matrix getV() {
- return like(v).assign(v);
- }
-
- /**
- * Return the real parts of the eigenvalues
- */
- public Vector getRealEigenValues() {
- return d;
- }
-
- /**
- * Return the imaginary parts of the eigenvalues
- */
- public Vector getImagEigenvalues() {
- return e;
- }
-
- /**
- * Return the block diagonal eigenvalue matrix
- *
- * @return D
- */
- public Matrix getD() {
- Matrix res = like(v, d.size(), d.size());
- res.assign(0);
- res.viewDiagonal().assign(d);
- for (int i = 0; i < n; i++) {
- double v = e.getX(i);
- if (v > 0)
- res.setX(i, i + 1, v);
- else if (v < 0)
- res.setX(i, i - 1, v);
- }
- return res;
- }
-
- /**
- * Destroys decomposition components and other internal components of decomposition.
- */
- @Override public void destroy() {
- e.destroy();
- v.destroy();
- d.destroy();
- }
-
- /** */
- private void tred2() {
- // This is derived from the Algol procedures tred2 by
- // Bowdler, Martin, Reinsch, and Wilkinson, Handbook for
- // Auto. Comp., Vol.ii-Linear Algebra, and the corresponding
- // Fortran subroutine in EISPACK.
-
- d.assign(v.viewColumn(n - 1));
-
- // Householder reduction to tridiagonal form.
-
- for (int i = n - 1; i > 0; i--) {
-
- // Scale to avoid under/overflow.
- double scale = d.viewPart(0, i).kNorm(1);
- double h = 0.0;
-
- if (scale == 0.0) {
- e.setX(i, d.getX(i - 1));
- for (int j = 0; j < i; j++) {
- d.setX(j, v.getX(i - 1, j));
- v.setX(i, j, 0.0);
- v.setX(j, i, 0.0);
- }
- }
- else {
-
- // Generate Householder vector.
-
- for (int k = 0; k < i; k++) {
- d.setX(k, d.getX(k) / scale);
- h += d.getX(k) * d.getX(k);
- }
-
- double f = d.getX(i - 1);
- double g = Math.sqrt(h);
-
- if (f > 0)
- g = -g;
-
- e.setX(i, scale * g);
- h -= f * g;
- d.setX(i - 1, f - g);
-
- for (int j = 0; j < i; j++)
- e.setX(j, 0.0);
-
- // Apply similarity transformation to remaining columns.
-
- for (int j = 0; j < i; j++) {
- f = d.getX(j);
- v.setX(j, i, f);
- g = e.getX(j) + v.getX(j, j) * f;
-
- for (int k = j + 1; k <= i - 1; k++) {
- g += v.getX(k, j) * d.getX(k);
- e.setX(k, e.getX(k) + v.getX(k, j) * f);
- }
-
- e.setX(j, g);
- }
-
- f = 0.0;
-
- for (int j = 0; j < i; j++) {
- e.setX(j, e.getX(j) / h);
- f += e.getX(j) * d.getX(j);
- }
-
- double hh = f / (h + h);
-
- for (int j = 0; j < i; j++)
- e.setX(j, e.getX(j) - hh * d.getX(j));
-
- for (int j = 0; j < i; j++) {
- f = d.getX(j);
- g = e.getX(j);
-
- for (int k = j; k <= i - 1; k++)
- v.setX(k, j, v.getX(k, j) - (f * e.getX(k) + g * d.getX(k)));
-
- d.setX(j, v.getX(i - 1, j));
- v.setX(i, j, 0.0);
- }
- }
-
- d.setX(i, h);
- }
- }
-
- /** */
- private Matrix orthes(Matrix matrix) {
- // Working storage for nonsymmetric algorithm.
- Vector ort = likeVector(matrix);
- Matrix hessenBerg = like(matrix).assign(matrix);
-
- // This is derived from the Algol procedures orthes and ortran,
- // by Martin and Wilkinson, Handbook for Auto. Comp.,
- // Vol.ii-Linear Algebra, and the corresponding
- // Fortran subroutines in EISPACK.
-
- int low = 0;
- int high = n - 1;
-
- for (int m = low + 1; m <= high - 1; m++) {
-
- // Scale column.
-
- Vector hCol = hessenBerg.viewColumn(m - 1).viewPart(m, high - m + 1);
- double scale = hCol.kNorm(1);
-
- if (scale != 0.0) {
- // Compute Householder transformation.
- ort.viewPart(m, high - m + 1).map(hCol, Functions.plusMult(1 / scale));
- double h = ort.viewPart(m, high - m + 1).getLengthSquared();
-
- double g = Math.sqrt(h);
-
- if (ort.getX(m) > 0)
- g = -g;
-
- h -= ort.getX(m) * g;
- ort.setX(m, ort.getX(m) - g);
-
- // Apply Householder similarity transformation
- // H = (I-u*u'/h)*H*(I-u*u')/h)
-
- Vector ortPiece = ort.viewPart(m, high - m + 1);
-
- for (int j = m; j < n; j++) {
- double f = ortPiece.dot(hessenBerg.viewColumn(j).viewPart(m, high - m + 1)) / h;
- hessenBerg.viewColumn(j).viewPart(m, high - m + 1).map(ortPiece, Functions.plusMult(-f));
- }
-
- for (int i = 0; i <= high; i++) {
- double f = ortPiece.dot(hessenBerg.viewRow(i).viewPart(m, high - m + 1)) / h;
- hessenBerg.viewRow(i).viewPart(m, high - m + 1).map(ortPiece, Functions.plusMult(-f));
- }
-
- ort.setX(m, scale * ort.getX(m));
- hessenBerg.setX(m, m - 1, scale * g);
- }
- }
-
- // Accumulate transformations (Algol's ortran).
-
- v.assign(0);
- v.viewDiagonal().assign(1);
-
- for (int m = high - 1; m >= low + 1; m--) {
- if (hessenBerg.getX(m, m - 1) != 0.0) {
- ort.viewPart(m + 1, high - m).assign(hessenBerg.viewColumn(m - 1).viewPart(m + 1, high - m));
-
- for (int j = m; j <= high; j++) {
- double g = ort.viewPart(m, high - m + 1).dot(v.viewColumn(j).viewPart(m, high - m + 1));
-
- // Double division avoids possible underflow
- g = g / ort.getX(m) / hessenBerg.getX(m, m - 1);
- v.viewColumn(j).viewPart(m, high - m + 1).map(ort.viewPart(m, high - m + 1), Functions.plusMult(g));
- }
- }
- }
-
- return hessenBerg;
- }
-
- /** Symmetric tridiagonal QL algorithm. */
- private void tql2() {
- // This is derived from the Algol procedures tql2, by
- // Bowdler, Martin, Reinsch, and Wilkinson, Handbook for
- // Auto. Comp., Vol.ii-Linear Algebra, and the corresponding
- // Fortran subroutine in EISPACK.
-
- e.viewPart(0, n - 1).assign(e.viewPart(1, n - 1));
- e.setX(n - 1, 0.0);
-
- double f = 0.0;
- double tst1 = 0.0;
- double eps = Math.pow(2.0, -52.0);
-
- for (int l = 0; l < n; l++) {
- // Find small subdiagonal element.
-
- tst1 = Math.max(tst1, Math.abs(d.getX(l)) + Math.abs(e.getX(l)));
- int m = l;
-
- while (m < n) {
- if (Math.abs(e.getX(m)) <= eps * tst1)
- break;
-
- m++;
- }
-
- // If m == l, d.getX(l) is an eigenvalue,
- // otherwise, iterate.
-
- if (m > l) {
- do {
- // Compute implicit shift
-
- double g = d.getX(l);
- double p = (d.getX(l + 1) - g) / (2.0 * e.getX(l));
- double r = Math.hypot(p, 1.0);
-
- if (p < 0)
- r = -r;
-
- d.setX(l, e.getX(l) / (p + r));
- d.setX(l + 1, e.getX(l) * (p + r));
- double dl1 = d.getX(l + 1);
- double h = g - d.getX(l);
-
- for (int i = l + 2; i < n; i++)
- d.setX(i, d.getX(i) - h);
-
- f += h;
-
- // Implicit QL transformation.
-
- p = d.getX(m);
- double c = 1.0;
- double c2 = c;
- double c3 = c;
- double el1 = e.getX(l + 1);
- double s = 0.0;
- double s2 = 0.0;
-
- for (int i = m - 1; i >= l; i--) {
- c3 = c2;
- c2 = c;
- s2 = s;
- g = c * e.getX(i);
- h = c * p;
- r = Math.hypot(p, e.getX(i));
- e.setX(i + 1, s * r);
- s = e.getX(i) / r;
- c = p / r;
- p = c * d.getX(i) - s * g;
- d.setX(i + 1, h + s * (c * g + s * d.getX(i)));
-
- // Accumulate transformation.
-
- for (int k = 0; k < n; k++) {
- h = v.getX(k, i + 1);
- v.setX(k, i + 1, s * v.getX(k, i) + c * h);
- v.setX(k, i, c * v.getX(k, i) - s * h);
- }
- }
-
- p = -s * s2 * c3 * el1 * e.getX(l) / dl1;
- e.setX(l, s * p);
- d.setX(l, c * p);
-
- // Check for convergence.
-
- }
- while (Math.abs(e.getX(l)) > eps * tst1);
- }
-
- d.setX(l, d.getX(l) + f);
- e.setX(l, 0.0);
- }
-
- // Sort eigenvalues and corresponding vectors.
-
- for (int i = 0; i < n - 1; i++) {
- int k = i;
- double p = d.getX(i);
-
- for (int j = i + 1; j < n; j++)
- if (d.getX(j) > p) {
- k = j;
- p = d.getX(j);
- }
-
- if (k != i) {
- d.setX(k, d.getX(i));
- d.setX(i, p);
-
- for (int j = 0; j < n; j++) {
- p = v.getX(j, i);
- v.setX(j, i, v.getX(j, k));
- v.setX(j, k, p);
- }
- }
- }
- }
-
- /** */
- private void hqr2(Matrix h) {
- // This is derived from the Algol procedure hqr2,
- // by Martin and Wilkinson, Handbook for Auto. Comp.,
- // Vol.ii-Linear Algebra, and the corresponding
- // Fortran subroutine in EISPACK.
-
- // Initialize
-
- int nn = this.n;
- int n = nn - 1;
- int low = 0;
- int high = nn - 1;
- double eps = Math.pow(2.0, -52.0);
- double exshift = 0.0;
- double p = 0;
- double q = 0;
- double r = 0;
- double s = 0;
- double z = 0;
- double w;
- double x;
- double y;
-
- // Store roots isolated by balanc and compute matrix norm
-
- double norm = h.foldMap(Functions.PLUS, Functions.ABS, 0.0);
-
- // Outer loop over eigenvalue index
-
- int iter = 0;
- while (n >= low) {
- // Look for single small sub-diagonal element
- int l = n;
-
- while (l > low) {
- s = Math.abs(h.getX(l - 1, l - 1)) + Math.abs(h.getX(l, l));
-
- if (s == 0.0)
- s = norm;
-
- if (Math.abs(h.getX(l, l - 1)) < eps * s)
- break;
-
- l--;
- }
-
- // Check for convergence
-
- if (l == n) {
- // One root found
- h.setX(n, n, h.getX(n, n) + exshift);
- d.setX(n, h.getX(n, n));
- e.setX(n, 0.0);
- n--;
- iter = 0;
- }
- else if (l == n - 1) {
- // Two roots found
- w = h.getX(n, n - 1) * h.getX(n - 1, n);
- p = (h.getX(n - 1, n - 1) - h.getX(n, n)) / 2.0;
- q = p * p + w;
- z = Math.sqrt(Math.abs(q));
- h.setX(n, n, h.getX(n, n) + exshift);
- h.setX(n - 1, n - 1, h.getX(n - 1, n - 1) + exshift);
- x = h.getX(n, n);
-
- // Real pair
- if (q >= 0) {
- if (p >= 0)
- z = p + z;
- else
- z = p - z;
-
- d.setX(n - 1, x + z);
- d.setX(n, d.getX(n - 1));
-
- if (z != 0.0)
- d.setX(n, x - w / z);
-
- e.setX(n - 1, 0.0);
- e.setX(n, 0.0);
- x = h.getX(n, n - 1);
- s = Math.abs(x) + Math.abs(z);
- p = x / s;
- q = z / s;
- r = Math.sqrt(p * p + q * q);
- p /= r;
- q /= r;
-
- // Row modification
-
- for (int j = n - 1; j < nn; j++) {
- z = h.getX(n - 1, j);
- h.setX(n - 1, j, q * z + p * h.getX(n, j));
- h.setX(n, j, q * h.getX(n, j) - p * z);
- }
-
- // Column modification
-
- for (int i = 0; i <= n; i++) {
- z = h.getX(i, n - 1);
- h.setX(i, n - 1, q * z + p * h.getX(i, n));
- h.setX(i, n, q * h.getX(i, n) - p * z);
- }
-
- // Accumulate transformations
-
- for (int i = low; i <= high; i++) {
- z = v.getX(i, n - 1);
- v.setX(i, n - 1, q * z + p * v.getX(i, n));
- v.setX(i, n, q * v.getX(i, n) - p * z);
- }
-
- // Complex pair
-
- }
- else {
- d.setX(n - 1, x + p);
- d.setX(n, x + p);
- e.setX(n - 1, z);
- e.setX(n, -z);
- }
-
- n -= 2;
- iter = 0;
-
- // No convergence yet
-
- }
- else {
- // Form shift
- x = h.getX(n, n);
- y = 0.0;
- w = 0.0;
-
- if (l < n) {
- y = h.getX(n - 1, n - 1);
- w = h.getX(n, n - 1) * h.getX(n - 1, n);
- }
-
- // Wilkinson's original ad hoc shift
-
- if (iter == 10) {
- exshift += x;
-
- for (int i = low; i <= n; i++)
- h.setX(i, i, x);
-
- s = Math.abs(h.getX(n, n - 1)) + Math.abs(h.getX(n - 1, n - 2));
- x = y = 0.75 * s;
- w = -0.4375 * s * s;
- }
-
- // MATLAB's new ad hoc shift
-
- if (iter == 30) {
- s = (y - x) / 2.0;
- s = s * s + w;
-
- if (s > 0) {
- s = Math.sqrt(s);
-
- if (y < x)
- s = -s;
-
- s = x - w / ((y - x) / 2.0 + s);
-
- for (int i = low; i <= n; i++)
- h.setX(i, i, h.getX(i, i) - s);
-
- exshift += s;
- x = y = w = 0.964;
- }
- }
-
- iter++; // (Could check iteration count here.)
-
- // Look for two consecutive small sub-diagonal elements
-
- int m = n - 2;
-
- while (m >= l) {
- z = h.getX(m, m);
- r = x - z;
- s = y - z;
- p = (r * s - w) / h.getX(m + 1, m) + h.getX(m, m + 1);
- q = h.getX(m + 1, m + 1) - z - r - s;
- r = h.getX(m + 2, m + 1);
- s = Math.abs(p) + Math.abs(q) + Math.abs(r);
- p /= s;
- q /= s;
- r /= s;
-
- if (m == l)
- break;
-
- double hmag = Math.abs(h.getX(m - 1, m - 1)) + Math.abs(h.getX(m + 1, m + 1));
- double threshold = eps * Math.abs(p) * (Math.abs(z) + hmag);
-
- if (Math.abs(h.getX(m, m - 1)) * (Math.abs(q) + Math.abs(r)) < threshold)
- break;
-
- m--;
- }
-
- for (int i = m + 2; i <= n; i++) {
- h.setX(i, i - 2, 0.0);
-
- if (i > m + 2)
- h.setX(i, i - 3, 0.0);
- }
-
- // Double QR step involving rows l:n and columns m:n
-
- for (int k = m; k <= n - 1; k++) {
- boolean notlast = k != n - 1;
-
- if (k != m) {
- p = h.getX(k, k - 1);
- q = h.getX(k + 1, k - 1);
- r = notlast ? h.getX(k + 2, k - 1) : 0.0;
- x = Math.abs(p) + Math.abs(q) + Math.abs(r);
- if (x != 0.0) {
- p /= x;
- q /= x;
- r /= x;
- }
- }
-
- if (x == 0.0)
- break;
-
- s = Math.sqrt(p * p + q * q + r * r);
-
- if (p < 0)
- s = -s;
-
- if (s != 0) {
- if (k != m)
- h.setX(k, k - 1, -s * x);
- else if (l != m)
- h.setX(k, k - 1, -h.getX(k, k - 1));
-
- p += s;
- x = p / s;
- y = q / s;
- z = r / s;
- q /= p;
- r /= p;
-
- // Row modification
-
- for (int j = k; j < nn; j++) {
- p = h.getX(k, j) + q * h.getX(k + 1, j);
-
- if (notlast) {
- p += r * h.getX(k + 2, j);
- h.setX(k + 2, j, h.getX(k + 2, j) - p * z);
- }
-
- h.setX(k, j, h.getX(k, j) - p * x);
- h.setX(k + 1, j, h.getX(k + 1, j) - p * y);
- }
-
- // Column modification
-
- for (int i = 0; i <= Math.min(n, k + 3); i++) {
- p = x * h.getX(i, k) + y * h.getX(i, k + 1);
-
- if (notlast) {
- p += z * h.getX(i, k + 2);
- h.setX(i, k + 2, h.getX(i, k + 2) - p * r);
- }
-
- h.setX(i, k, h.getX(i, k) - p);
- h.setX(i, k + 1, h.getX(i, k + 1) - p * q);
- }
-
- // Accumulate transformations
-
- for (int i = low; i <= high; i++) {
- p = x * v.getX(i, k) + y * v.getX(i, k + 1);
-
- if (notlast) {
- p += z * v.getX(i, k + 2);
- v.setX(i, k + 2, v.getX(i, k + 2) - p * r);
- }
-
- v.setX(i, k, v.getX(i, k) - p);
- v.setX(i, k + 1, v.getX(i, k + 1) - p * q);
- }
- } // (s != 0)
- } // k loop
- } // check convergence
- } // while (n >= low)
-
- // Back substitute to find vectors of upper triangular form
-
- if (norm == 0.0)
- return;
-
- for (n = nn - 1; n >= 0; n--) {
- p = d.getX(n);
- q = e.getX(n);
-
- // Real vector
-
- double t;
-
- if (q == 0) {
- int l = n;
- h.setX(n, n, 1.0);
-
- for (int i = n - 1; i >= 0; i--) {
- w = h.getX(i, i) - p;
- r = 0.0;
-
- for (int j = l; j <= n; j++)
- r += h.getX(i, j) * h.getX(j, n);
-
- if (e.getX(i) < 0.0) {
- z = w;
- s = r;
- }
- else {
- l = i;
-
- if (e.getX(i) == 0.0) {
- if (w == 0.0)
- h.setX(i, n, -r / (eps * norm));
- else
- h.setX(i, n, -r / w);
-
- // Solve real equations
-
- }
- else {
- x = h.getX(i, i + 1);
- y = h.getX(i + 1, i);
- q = (d.getX(i) - p) * (d.getX(i) - p) + e.getX(i) * e.getX(i);
- t = (x * s - z * r) / q;
- h.setX(i, n, t);
-
- if (Math.abs(x) > Math.abs(z))
- h.setX(i + 1, n, (-r - w * t) / x);
- else
- h.setX(i + 1, n, (-s - y * t) / z);
- }
-
- // Overflow control
-
- t = Math.abs(h.getX(i, n));
-
- if (eps * t * t > 1) {
- for (int j = i; j <= n; j++)
- h.setX(j, n, h.getX(j, n) / t);
- }
- }
- }
-
- // Complex vector
-
- }
- else if (q < 0) {
- int l = n - 1;
-
- // Last vector component imaginary so matrix is triangular
-
- if (Math.abs(h.getX(n, n - 1)) > Math.abs(h.getX(n - 1, n))) {
- h.setX(n - 1, n - 1, q / h.getX(n, n - 1));
- h.setX(n - 1, n, -(h.getX(n, n) - p) / h.getX(n, n - 1));
- }
- else {
- cdiv(0.0, -h.getX(n - 1, n), h.getX(n - 1, n - 1) - p, q);
- h.setX(n - 1, n - 1, cdivr);
- h.setX(n - 1, n, cdivi);
- }
-
- h.setX(n, n - 1, 0.0);
- h.setX(n, n, 1.0);
-
- for (int i = n - 2; i >= 0; i--) {
- double ra = 0.0;
- double sa = 0.0;
-
- for (int j = l; j <= n; j++) {
- ra += h.getX(i, j) * h.getX(j, n - 1);
- sa += h.getX(i, j) * h.getX(j, n);
- }
-
- w = h.getX(i, i) - p;
-
- if (e.getX(i) < 0.0) {
- z = w;
- r = ra;
- s = sa;
- }
- else {
- l = i;
-
- if (e.getX(i) == 0) {
- cdiv(-ra, -sa, w, q);
- h.setX(i, n - 1, cdivr);
- h.setX(i, n, cdivi);
- }
- else {
-
- // Solve complex equations
-
- x = h.getX(i, i + 1);
- y = h.getX(i + 1, i);
-
- double vr = (d.getX(i) - p) * (d.getX(i) - p) + e.getX(i) * e.getX(i) - q * q;
- double vi = (d.getX(i) - p) * 2.0 * q;
-
- if (vr == 0.0 && vi == 0.0) {
- double hmag = Math.abs(x) + Math.abs(y);
- vr = eps * norm * (Math.abs(w) + Math.abs(q) + hmag + Math.abs(z));
- }
-
- cdiv(x * r - z * ra + q * sa, x * s - z * sa - q * ra, vr, vi);
-
- h.setX(i, n - 1, cdivr);
- h.setX(i, n, cdivi);
-
- if (Math.abs(x) > (Math.abs(z) + Math.abs(q))) {
- h.setX(i + 1, n - 1, (-ra - w * h.getX(i, n - 1) + q * h.getX(i, n)) / x);
- h.setX(i + 1, n, (-sa - w * h.getX(i, n) - q * h.getX(i, n - 1)) / x);
- }
- else {
- cdiv(-r - y * h.getX(i, n - 1), -s - y * h.getX(i, n), z, q);
-
- h.setX(i + 1, n - 1, cdivr);
- h.setX(i + 1, n, cdivi);
- }
- }
-
- // Overflow control
-
- t = Math.max(Math.abs(h.getX(i, n - 1)), Math.abs(h.getX(i, n)));
-
- if (eps * t * t > 1)
- for (int j = i; j <= n; j++) {
- h.setX(j, n - 1, h.getX(j, n - 1) / t);
- h.setX(j, n, h.getX(j, n) / t);
- }
- }
- }
- }
- }
-
- // Vectors of isolated roots
-
- for (int i = 0; i < nn; i++)
- if (i < low || i > high) {
- for (int j = i; j < nn; j++)
- v.setX(i, j, h.getX(i, j));
- }
-
- // Back transformation to get eigen vectors of original matrix
-
- for (int j = nn - 1; j >= low; j--)
- for (int i = low; i <= high; i++) {
- z = 0.0;
-
- for (int k = low; k <= Math.min(j, high); k++)
- z += v.getX(i, k) * h.getX(k, j);
-
- v.setX(i, j, z);
- }
- }
-
- /** */
- private static boolean isSymmetric(Matrix matrix) {
- int cols = matrix.columnSize();
- int rows = matrix.rowSize();
-
- if (cols != rows)
- return false;
-
- for (int i = 0; i < cols; i++)
- for (int j = 0; j < rows; j++) {
- if (matrix.getX(i, j) != matrix.get(j, i))
- return false;
- }
-
- return true;
- }
-
- /** Complex scalar division - real part. */
- private double cdivr;
- /** Complex scalar division - imaginary part. */
- private double cdivi;
-
- /** */
- private void cdiv(double xr, double xi, double yr, double yi) {
- double r;
- double d;
-
- if (Math.abs(yr) > Math.abs(yi)) {
- r = yi / yr;
- d = yr + r * yi;
- cdivr = (xr + r * xi) / d;
- cdivi = (xi - r * xr) / d;
- }
- else {
- r = yr / yi;
- d = yi + r * yr;
- cdivr = (r * xr + xi) / d;
- cdivi = (r * xi - xr) / d;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/decompositions/LUDecomposition.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/decompositions/LUDecomposition.java b/modules/ml/src/main/java/org/apache/ignite/math/decompositions/LUDecomposition.java
deleted file mode 100644
index 82c90ec..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/decompositions/LUDecomposition.java
+++ /dev/null
@@ -1,366 +0,0 @@
-/*
- * 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.ignite.math.decompositions;
-
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.exceptions.CardinalityException;
-import org.apache.ignite.math.exceptions.SingularMatrixException;
-
-/**
- * Calculates the LU-decomposition of a square matrix.
- *
- * This class inspired by class from Apache Common Math with similar name.
- *
- * @see <a href="http://mathworld.wolfram.com/LUDecomposition.html">MathWorld</a>
- * @see <a href="http://en.wikipedia.org/wiki/LU_decomposition">Wikipedia</a>
- */
-public class LUDecomposition extends DecompositionSupport {
- /** Default bound to determine effective singularity in LU decomposition. */
- private static final double DEFAULT_TOO_SMALL = 1e-11;
-
- /** Pivot permutation associated with LU decomposition. */
- private final Vector pivot;
- /** Parity of the permutation associated with the LU decomposition. */
- private boolean even;
- /** Singularity indicator. */
- private boolean singular;
- /** Cached value of L. */
- private Matrix cachedL;
- /** Cached value of U. */
- private Matrix cachedU;
- /** Cached value of P. */
- private Matrix cachedP;
- /** Original matrix. */
- private Matrix matrix;
- /** Entries of LU decomposition. */
- private Matrix lu;
-
- /**
- * Calculates the LU-decomposition of the given matrix.
- * This constructor uses 1e-11 as default value for the singularity
- * threshold.
- *
- * @param matrix Matrix to decompose.
- * @throws CardinalityException if matrix is not square.
- */
- public LUDecomposition(Matrix matrix) {
- this(matrix, DEFAULT_TOO_SMALL);
- }
-
- /**
- * Calculates the LUP-decomposition of the given matrix.
- *
- * @param matrix Matrix to decompose.
- * @param singularityThreshold threshold (based on partial row norm).
- * @throws CardinalityException if matrix is not square.
- */
- public LUDecomposition(Matrix matrix, double singularityThreshold) {
- assert matrix != null;
-
- int rows = matrix.rowSize();
- int cols = matrix.columnSize();
-
- if (rows != cols)
- throw new CardinalityException(rows, cols);
-
- this.matrix = matrix;
-
- lu = copy(matrix);
-
- pivot = likeVector(matrix);
-
- for (int i = 0; i < pivot.size(); i++)
- pivot.setX(i, i);
-
- even = true;
- singular = false;
-
- cachedL = null;
- cachedU = null;
- cachedP = null;
-
- for (int col = 0; col < cols; col++) {
-
- //upper
- for (int row = 0; row < col; row++) {
- Vector luRow = lu.viewRow(row);
- double sum = luRow.get(col);
-
- for (int i = 0; i < row; i++)
- sum -= luRow.getX(i) * lu.getX(i, col);
-
- luRow.setX(col, sum);
- }
-
- // permutation row
- int max = col;
-
- double largest = Double.NEGATIVE_INFINITY;
-
- // lower
- for (int row = col; row < rows; row++) {
- Vector luRow = lu.viewRow(row);
- double sum = luRow.getX(col);
-
- for (int i = 0; i < col; i++)
- sum -= luRow.getX(i) * lu.getX(i, col);
-
- luRow.setX(col, sum);
-
- if (Math.abs(sum) > largest) {
- largest = Math.abs(sum);
- max = row;
- }
- }
-
- // Singularity check
- if (Math.abs(lu.getX(max, col)) < singularityThreshold) {
- singular = true;
- return;
- }
-
- // Pivot if necessary
- if (max != col) {
- double tmp;
- Vector luMax = lu.viewRow(max);
- Vector luCol = lu.viewRow(col);
-
- for (int i = 0; i < cols; i++) {
- tmp = luMax.getX(i);
- luMax.setX(i, luCol.getX(i));
- luCol.setX(i, tmp);
- }
-
- int temp = (int)pivot.getX(max);
- pivot.setX(max, pivot.getX(col));
- pivot.setX(col, temp);
-
- even = !even;
- }
-
- // Divide the lower elements by the "winning" diagonal elt.
- final double luDiag = lu.getX(col, col);
-
- for (int row = col + 1; row < cols; row++) {
- double val = lu.getX(row, col) / luDiag;
- lu.setX(row, col, val);
- }
- }
- }
-
- /**
- * Destroys decomposition components and other internal components of decomposition.
- */
- @Override public void destroy() {
- if (cachedL != null)
- cachedL.destroy();
- if (cachedU != null)
- cachedU.destroy();
- if (cachedP != null)
- cachedP.destroy();
- lu.destroy();
- }
-
- /**
- * Returns the matrix L of the decomposition.
- * <p>L is a lower-triangular matrix</p>
- *
- * @return the L matrix (or null if decomposed matrix is singular).
- */
- public Matrix getL() {
- if ((cachedL == null) && !singular) {
- final int m = pivot.size();
-
- cachedL = like(matrix);
- cachedL.assign(0.0);
-
- for (int i = 0; i < m; ++i) {
- for (int j = 0; j < i; ++j)
- cachedL.setX(i, j, lu.getX(i, j));
-
- cachedL.setX(i, i, 1.0);
- }
- }
-
- return cachedL;
- }
-
- /**
- * Returns the matrix U of the decomposition.
- * <p>U is an upper-triangular matrix</p>
- *
- * @return the U matrix (or null if decomposed matrix is singular).
- */
- public Matrix getU() {
- if ((cachedU == null) && !singular) {
- final int m = pivot.size();
-
- cachedU = like(matrix);
- cachedU.assign(0.0);
-
- for (int i = 0; i < m; ++i)
- for (int j = i; j < m; ++j)
- cachedU.setX(i, j, lu.getX(i, j));
- }
-
- return cachedU;
- }
-
- /**
- * Returns the P rows permutation matrix.
- * <p>P is a sparse matrix with exactly one element set to 1.0 in
- * each row and each column, all other elements being set to 0.0.</p>
- * <p>The positions of the 1 elements are given by the {@link #getPivot()
- * pivot permutation vector}.</p>
- *
- * @return the P rows permutation matrix (or null if decomposed matrix is singular).
- * @see #getPivot()
- */
- public Matrix getP() {
- if ((cachedP == null) && !singular) {
- final int m = pivot.size();
-
- cachedP = like(matrix);
- cachedP.assign(0.0);
-
- for (int i = 0; i < m; ++i)
- cachedP.setX(i, (int)pivot.get(i), 1.0);
- }
-
- return cachedP;
- }
-
- /**
- * Returns the pivot permutation vector.
- *
- * @return the pivot permutation vector.
- * @see #getP()
- */
- public Vector getPivot() {
- return pivot.copy();
- }
-
- /**
- * Return the determinant of the matrix.
- *
- * @return determinant of the matrix.
- */
- public double determinant() {
- if (singular)
- return 0;
-
- final int m = pivot.size();
- double determinant = even ? 1 : -1;
-
- for (int i = 0; i < m; i++)
- determinant *= lu.getX(i, i);
-
- return determinant;
- }
-
- /** */
- public Vector solve(Vector b) {
- final int m = pivot.size();
-
- if (b.size() != m)
- throw new CardinalityException(b.size(), m);
-
- if (singular)
- throw new SingularMatrixException();
-
- final double[] bp = new double[m];
-
- // Apply permutations to b
- for (int row = 0; row < m; row++)
- bp[row] = b.get((int)pivot.get(row));
-
- // Solve LY = b
- for (int col = 0; col < m; col++) {
- final double bpCol = bp[col];
-
- for (int i = col + 1; i < m; i++)
- bp[i] -= bpCol * lu.get(i, col);
- }
-
- // Solve UX = Y
- for (int col = m - 1; col >= 0; col--) {
- bp[col] /= lu.get(col, col);
- final double bpCol = bp[col];
-
- for (int i = 0; i < col; i++)
- bp[i] -= bpCol * lu.get(i, col);
- }
-
- return b.like(m).assign(bp);
- }
-
- /** */
- public Matrix solve(Matrix b) {
- final int m = pivot.size();
-
- if (b.rowSize() != m)
- throw new CardinalityException(b.rowSize(), m);
-
- if (singular)
- throw new SingularMatrixException();
-
- final int nColB = b.columnSize();
-
- // Apply permutations to b
- final double[][] bp = new double[m][nColB];
- for (int row = 0; row < m; row++) {
- final double[] bpRow = bp[row];
- final int pRow = (int)pivot.get(row);
-
- for (int col = 0; col < nColB; col++)
- bpRow[col] = b.get(pRow, col);
- }
-
- // Solve LY = b
- for (int col = 0; col < m; col++) {
- final double[] bpCol = bp[col];
- for (int i = col + 1; i < m; i++) {
- final double[] bpI = bp[i];
- final double luICol = lu.get(i, col);
-
- for (int j = 0; j < nColB; j++)
- bpI[j] -= bpCol[j] * luICol;
- }
- }
-
- // Solve UX = Y
- for (int col = m - 1; col >= 0; col--) {
- final double[] bpCol = bp[col];
- final double luDiag = lu.getX(col, col);
-
- for (int j = 0; j < nColB; j++)
- bpCol[j] /= luDiag;
-
- for (int i = 0; i < col; i++) {
- final double[] bpI = bp[i];
- final double luICol = lu.get(i, col);
-
- for (int j = 0; j < nColB; j++)
- bpI[j] -= bpCol[j] * luICol;
- }
- }
-
- return b.like(b.rowSize(), b.columnSize()).assign(bp);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/decompositions/QRDecomposition.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/decompositions/QRDecomposition.java b/modules/ml/src/main/java/org/apache/ignite/math/decompositions/QRDecomposition.java
deleted file mode 100644
index 9608ed5..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/decompositions/QRDecomposition.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * 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.ignite.math.decompositions;
-
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.functions.Functions;
-
-/**
- * For an {@code m x n} matrix {@code A} with {@code m >= n}, the QR decomposition
- * is an {@code m x n} orthogonal matrix {@code Q} and an {@code n x n} upper
- * triangular matrix {@code R} so that {@code A = Q*R}.
- */
-public class QRDecomposition extends DecompositionSupport {
- /** */
- private final Matrix q;
- /** */
- private final Matrix r;
-
- /** */
- private final Matrix mType;
- /** */
- private final boolean fullRank;
-
- /** */
- private final int rows;
- /** */
- private final int cols;
-
- /**
- * @param v Value to be checked for being an ordinary double.
- */
- private void checkDouble(double v) {
- if (Double.isInfinite(v) || Double.isNaN(v))
- throw new ArithmeticException("Invalid intermediate result");
- }
-
- /**
- * Constructs a new QR decomposition object computed by Householder reflections.
- *
- * @param mtx A rectangular matrix.
- */
- public QRDecomposition(Matrix mtx) {
- assert mtx != null;
-
- rows = mtx.rowSize();
-
- int min = Math.min(mtx.rowSize(), mtx.columnSize());
-
- cols = mtx.columnSize();
-
- mType = like(mtx, 1, 1);
-
- Matrix qTmp = copy(mtx);
-
- boolean fullRank = true;
-
- r = like(mtx, min, cols);
-
- for (int i = 0; i < min; i++) {
- Vector qi = qTmp.viewColumn(i);
-
- double alpha = qi.kNorm(2);
-
- if (Math.abs(alpha) > Double.MIN_VALUE)
- qi.map(Functions.div(alpha));
- else {
- checkDouble(alpha);
-
- fullRank = false;
- }
-
- r.set(i, i, alpha);
-
- for (int j = i + 1; j < cols; j++) {
- Vector qj = qTmp.viewColumn(j);
-
- double norm = qj.kNorm(2);
-
- if (Math.abs(norm) > Double.MIN_VALUE) {
- double beta = qi.dot(qj);
-
- r.set(i, j, beta);
-
- if (j < min)
- qj.map(qi, Functions.plusMult(-beta));
- }
- else
- checkDouble(norm);
- }
- }
-
- if (cols > min)
- q = qTmp.viewPart(0, rows, 0, min).copy();
- else
- q = qTmp;
-
- this.fullRank = fullRank;
- }
-
- /** {@inheritDoc} */
- @Override public void destroy() {
- q.destroy();
- r.destroy();
- mType.destroy();
- }
-
- /**
- * Gets orthogonal factor {@code Q}.
- */
- public Matrix getQ() {
- return q;
- }
-
- /**
- * Gets triangular factor {@code R}.
- */
- public Matrix getR() {
- return r;
- }
-
- /**
- * Returns whether the matrix {@code A} has full rank.
- *
- * @return true if {@code R}, and hence {@code A} , has full rank.
- */
- public boolean hasFullRank() {
- return fullRank;
- }
-
- /**
- * Least squares solution of {@code A*X = B}; {@code returns X}.
- *
- * @param mtx A matrix with as many rows as {@code A} and any number of cols.
- * @return {@code X<} that minimizes the two norm of {@code Q*R*X - B}.
- * @throws IllegalArgumentException if {@code B.rows() != A.rows()}.
- */
- public Matrix solve(Matrix mtx) {
- if (mtx.rowSize() != rows)
- throw new IllegalArgumentException("Matrix row dimensions must agree.");
-
- int cols = mtx.columnSize();
-
- Matrix x = like(mType, this.cols, cols);
-
- Matrix qt = getQ().transpose();
- Matrix y = qt.times(mtx);
-
- Matrix r = getR();
-
- for (int k = Math.min(this.cols, rows) - 1; k > 0; k--) {
- // X[k,] = Y[k,] / R[k,k], note that X[k,] starts with 0 so += is same as =
- x.viewRow(k).map(y.viewRow(k), Functions.plusMult(1 / r.get(k, k)));
-
- // Y[0:(k-1),] -= R[0:(k-1),k] * X[k,]
- Vector rCol = r.viewColumn(k).viewPart(0, k);
-
- for (int c = 0; c < cols; c++)
- y.viewColumn(c).viewPart(0, k).map(rCol, Functions.plusMult(-x.get(k, c)));
- }
-
- return x;
- }
-
- /**
- * Returns a rough string rendition of a QR.
- */
- @Override public String toString() {
- return String.format("QR(%d x %d, fullRank=%s)", rows, cols, hasFullRank());
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/decompositions/SingularValueDecomposition.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/decompositions/SingularValueDecomposition.java b/modules/ml/src/main/java/org/apache/ignite/math/decompositions/SingularValueDecomposition.java
deleted file mode 100644
index 75eb206..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/decompositions/SingularValueDecomposition.java
+++ /dev/null
@@ -1,620 +0,0 @@
-/*
- * 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.ignite.math.decompositions;
-
-import org.apache.ignite.math.Algebra;
-import org.apache.ignite.math.Matrix;
-
-/**
- * Compute a singular value decomposition (SVD) of {@code (l x k)} matrix {@code m}.
- * <p>This decomposition can be thought
- * as an extension of {@link EigenDecomposition} to rectangular matrices. The factorization we get is following:</p>
- * <p>{@code m = u * s * v^{*}}, where</p>
- * <ul><li>{@code u} is a real or complex unitary matrix.</li>
- * <li>{@code s} is a rectangular diagonal matrix with non-negative real numbers on diagonal
- * (these numbers are singular values of {@code m}).</li>
- * <li>{@code v} is a real or complex unitary matrix.</li></ul>
- * <p>If {@code m} is real then {@code u} and {@code v} are also real.</p>
- * <p>See also: <a href="https://en.wikipedia.org/wiki/Singular_value_decomposition">Wikipedia article on SVD</a>.</p>
- * <p>Note: complex case is currently not supported.</p>
- */
-public class SingularValueDecomposition extends DecompositionSupport {
- // U and V.
- /** */
- private final double[][] u;
- /** */
- private final double[][] v;
-
- /** Singular values. */
- private final double[] s;
-
- /** Row dimension. */
- private final int m;
- /** Column dimension. */
- private final int n;
-
- /** */
- private Matrix arg;
-
- /** */
- private boolean transpositionNeeded;
-
- /**
- * Singular value decomposition object.
- *
- * @param arg A rectangular matrix.
- */
- public SingularValueDecomposition(Matrix arg) {
- assert arg != null;
-
- this.arg = arg;
-
- if (arg.rowSize() < arg.columnSize())
- transpositionNeeded = true;
-
- double[][] a;
-
- if (transpositionNeeded) {
- // Use the transpose matrix.
- m = arg.columnSize();
- n = arg.rowSize();
-
- a = new double[m][n];
-
- for (int i = 0; i < m; i++)
- for (int j = 0; j < n; j++)
- a[i][j] = arg.get(j, i);
- }
- else {
- m = arg.rowSize();
- n = arg.columnSize();
-
- a = new double[m][n];
-
- for (int i = 0; i < m; i++)
- for (int j = 0; j < n; j++)
- a[i][j] = arg.get(i, j);
- }
-
- int nu = Math.min(m, n);
-
- s = new double[Math.min(m + 1, n)];
- u = new double[m][nu];
- v = new double[n][n];
-
- double[] e = new double[n];
- double[] work = new double[m];
-
- int nct = Math.min(m - 1, n);
- int nrt = Math.max(0, Math.min(n - 2, m));
-
- for (int k = 0; k < Math.max(nct, nrt); k++) {
- if (k < nct) {
- // Compute the transformation for the k-th column and
- // place the k-th diagonal in s[k]. Compute 2-norm of k-th
- // column without under/overflow.
- s[k] = 0;
-
- for (int i = k; i < m; i++)
- s[k] = Algebra.hypot(s[k], a[i][k]);
-
- if (s[k] != 0.0) {
- if (a[k][k] < 0.0)
- s[k] = -s[k];
-
- for (int i = k; i < m; i++)
- a[i][k] /= s[k];
-
- a[k][k] += 1.0;
- }
-
- s[k] = -s[k];
- }
-
- for (int j = k + 1; j < n; j++) {
- if (k < nct && s[k] != 0.0) {
- // Apply the transformation.
- double t = 0;
-
- for (int i = k; i < m; i++)
- t += a[i][k] * a[i][j];
-
- t = -t / a[k][k];
-
- for (int i = k; i < m; i++)
- a[i][j] += t * a[i][k];
- }
-
- // Place the k-th row of A into e for the
- // subsequent calculation of the row transformation.
- e[j] = a[k][j];
- }
-
- if (k < nct)
- // Place the transformation in U for subsequent back
- // multiplication.
- for (int i = k; i < m; i++)
- u[i][k] = a[i][k];
-
- if (k < nrt) {
- // Compute the k-th row transformation and place the
- // k-th super-diagonal in e[k].
- // Compute 2-norm without under/overflow.
- e[k] = 0;
-
- for (int i = k + 1; i < n; i++)
- e[k] = Algebra.hypot(e[k], e[i]);
-
- if (e[k] != 0.0) {
- if (e[k + 1] < 0.0)
- e[k] = -e[k];
-
- for (int i = k + 1; i < n; i++)
- e[i] /= e[k];
-
- e[k + 1] += 1.0;
- }
-
- e[k] = -e[k];
-
- if (k + 1 < m && e[k] != 0.0) {
- // Apply the transformation.
- for (int i = k + 1; i < m; i++)
- work[i] = 0.0;
-
- for (int j = k + 1; j < n; j++)
- for (int i = k + 1; i < m; i++)
- work[i] += e[j] * a[i][j];
-
- for (int j = k + 1; j < n; j++) {
- double t = -e[j] / e[k + 1];
-
- for (int i = k + 1; i < m; i++)
- a[i][j] += t * work[i];
- }
- }
-
- // Place the transformation in V for subsequent
- // back multiplication.
- for (int i = k + 1; i < n; i++)
- v[i][k] = e[i];
- }
- }
-
- // Set up the final bi-diagonal matrix or order p.
- int p = Math.min(n, m + 1);
-
- if (nct < n)
- s[nct] = a[nct][nct];
-
- if (m < p)
- s[p - 1] = 0.0;
-
- if (nrt + 1 < p)
- e[nrt] = a[nrt][p - 1];
-
- e[p - 1] = 0.0;
-
- // Generate U.
- for (int j = nct; j < nu; j++) {
- for (int i = 0; i < m; i++)
- u[i][j] = 0.0;
-
- u[j][j] = 1.0;
- }
-
- for (int k = nct - 1; k >= 0; k--) {
- if (s[k] != 0.0) {
- for (int j = k + 1; j < nu; j++) {
- double t = 0;
-
- for (int i = k; i < m; i++)
- t += u[i][k] * u[i][j];
-
- t = -t / u[k][k];
-
- for (int i = k; i < m; i++)
- u[i][j] += t * u[i][k];
- }
-
- for (int i = k; i < m; i++)
- u[i][k] = -u[i][k];
-
- u[k][k] = 1.0 + u[k][k];
-
- for (int i = 0; i < k - 1; i++)
- u[i][k] = 0.0;
- }
- else {
- for (int i = 0; i < m; i++)
- u[i][k] = 0.0;
-
- u[k][k] = 1.0;
- }
- }
-
- // Generate V.
- for (int k = n - 1; k >= 0; k--) {
- if (k < nrt && e[k] != 0.0) {
- for (int j = k + 1; j < nu; j++) {
- double t = 0;
-
- for (int i = k + 1; i < n; i++)
- t += v[i][k] * v[i][j];
-
- t = -t / v[k + 1][k];
-
- for (int i = k + 1; i < n; i++)
- v[i][j] += t * v[i][k];
- }
- }
-
- for (int i = 0; i < n; i++)
- v[i][k] = 0.0;
-
- v[k][k] = 1.0;
- }
-
- // Main iteration loop for the singular values.
- int pp = p - 1;
- int iter = 0;
-
- double eps = Math.pow(2.0, -52.0);
- double tiny = Math.pow(2.0, -966.0);
-
- while (p > 0) {
- int k;
-
- for (k = p - 2; k >= -1; k--) {
- if (k == -1)
- break;
-
- if (Math.abs(e[k]) <= tiny + eps * (Math.abs(s[k]) + Math.abs(s[k + 1]))) {
- e[k] = 0.0;
-
- break;
- }
- }
-
- int kase;
-
- if (k == p - 2)
- kase = 4;
- else {
- int ks;
-
- for (ks = p - 1; ks >= k; ks--) {
- if (ks == k)
- break;
-
- double t =
- (ks != p ? Math.abs(e[ks]) : 0.) +
- (ks != k + 1 ? Math.abs(e[ks - 1]) : 0.);
-
- if (Math.abs(s[ks]) <= tiny + eps * t) {
- s[ks] = 0.0;
-
- break;
- }
- }
-
- if (ks == k)
- kase = 3;
- else if (ks == p - 1)
- kase = 1;
- else {
- kase = 2;
-
- k = ks;
- }
- }
-
- k++;
-
- // Perform the task indicated by kase.
- switch (kase) {
- // Deflate negligible s(p).
- case 1: {
- double f = e[p - 2];
-
- e[p - 2] = 0.0;
-
- for (int j = p - 2; j >= k; j--) {
- double t = Algebra.hypot(s[j], f);
- double cs = s[j] / t;
- double sn = f / t;
-
- s[j] = t;
-
- if (j != k) {
- f = -sn * e[j - 1];
- e[j - 1] = cs * e[j - 1];
- }
-
- for (int i = 0; i < n; i++) {
- t = cs * v[i][j] + sn * v[i][p - 1];
-
- v[i][p - 1] = -sn * v[i][j] + cs * v[i][p - 1];
- v[i][j] = t;
- }
- }
- }
-
- break;
-
- // Split at negligible s(k).
- case 2: {
- double f = e[k - 1];
- e[k - 1] = 0.0;
-
- for (int j = k; j < p; j++) {
- double t = Algebra.hypot(s[j], f);
- double cs = s[j] / t;
- double sn = f / t;
-
- s[j] = t;
- f = -sn * e[j];
- e[j] = cs * e[j];
-
- for (int i = 0; i < m; i++) {
- t = cs * u[i][j] + sn * u[i][k - 1];
-
- u[i][k - 1] = -sn * u[i][j] + cs * u[i][k - 1];
- u[i][j] = t;
- }
- }
- }
-
- break;
-
- // Perform one qr step.
- case 3: {
- // Calculate the shift.
- double scale = Math.max(Math.max(Math.max(Math.max(
- Math.abs(s[p - 1]), Math.abs(s[p - 2])), Math.abs(e[p - 2])),
- Math.abs(s[k])), Math.abs(e[k]));
-
- double sp = s[p - 1] / scale;
- double spm1 = s[p - 2] / scale;
- double epm1 = e[p - 2] / scale;
- double sk = s[k] / scale;
- double ek = e[k] / scale;
- double b = ((spm1 + sp) * (spm1 - sp) + epm1 * epm1) / 2.0;
- double c = sp * epm1 * sp * epm1;
- double shift = 0.0;
-
- if (b != 0.0 || c != 0.0) {
- shift = Math.sqrt(b * b + c);
-
- if (b < 0.0)
- shift = -shift;
-
- shift = c / (b + shift);
- }
-
- double f = (sk + sp) * (sk - sp) + shift;
- double g = sk * ek;
-
- // Chase zeros.
- for (int j = k; j < p - 1; j++) {
- double t = Algebra.hypot(f, g);
- double cs = f / t;
- double sn = g / t;
-
- if (j != k)
- e[j - 1] = t;
-
- f = cs * s[j] + sn * e[j];
- e[j] = cs * e[j] - sn * s[j];
- g = sn * s[j + 1];
- s[j + 1] = cs * s[j + 1];
-
- for (int i = 0; i < n; i++) {
- t = cs * v[i][j] + sn * v[i][j + 1];
-
- v[i][j + 1] = -sn * v[i][j] + cs * v[i][j + 1];
- v[i][j] = t;
- }
-
- t = Algebra.hypot(f, g);
- cs = f / t;
- sn = g / t;
- s[j] = t;
- f = cs * e[j] + sn * s[j + 1];
- s[j + 1] = -sn * e[j] + cs * s[j + 1];
- g = sn * e[j + 1];
- e[j + 1] = cs * e[j + 1];
-
- if (j < m - 1)
- for (int i = 0; i < m; i++) {
- t = cs * u[i][j] + sn * u[i][j + 1];
-
- u[i][j + 1] = -sn * u[i][j] + cs * u[i][j + 1];
- u[i][j] = t;
- }
- }
-
- e[p - 2] = f;
- iter = iter + 1;
- }
-
- break;
-
- // Convergence.
- case 4: {
- // Make the singular values positive.
- if (s[k] <= 0.0) {
- s[k] = s[k] < 0.0 ? -s[k] : 0.0;
-
- for (int i = 0; i <= pp; i++)
- v[i][k] = -v[i][k];
- }
-
- // Order the singular values.
- while (k < pp) {
- if (s[k] >= s[k + 1])
- break;
-
- double t = s[k];
-
- s[k] = s[k + 1];
- s[k + 1] = t;
-
- if (k < n - 1)
- for (int i = 0; i < n; i++) {
- t = v[i][k + 1];
-
- v[i][k + 1] = v[i][k];
- v[i][k] = t;
- }
-
- if (k < m - 1)
- for (int i = 0; i < m; i++) {
- t = u[i][k + 1];
-
- u[i][k + 1] = u[i][k];
- u[i][k] = t;
- }
-
- k++;
- }
-
- iter = 0;
- p--;
- }
-
- break;
-
- default:
- throw new IllegalStateException();
- }
- }
- }
-
- /**
- * Gets the two norm condition number, which is {@code max(S) / min(S)} .
- */
- public double cond() {
- return s[0] / s[Math.min(m, n) - 1];
- }
-
- /**
- * @return the diagonal matrix of singular values.
- */
- public Matrix getS() {
- double[][] s = new double[n][n];
-
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++)
- s[i][j] = 0.0;
-
- s[i][i] = this.s[i];
- }
-
- return like(arg, n, n).assign(s);
- }
-
- /**
- * Gets the diagonal of {@code S}, which is a one-dimensional array of
- * singular values.
- *
- * @return diagonal of {@code S}.
- */
- public double[] getSingularValues() {
- return s;
- }
-
- /**
- * Gets the left singular vectors {@code U}.
- *
- * @return {@code U}
- */
- public Matrix getU() {
- if (transpositionNeeded)
- return like(arg, v.length, v.length).assign(v);
- else {
- int numCols = Math.min(m + 1, n);
-
- Matrix r = like(arg, m, numCols);
-
- for (int i = 0; i < m; i++)
- for (int j = 0; j < numCols; j++)
- r.set(i, j, u[i][j]);
-
- return r;
- }
- }
-
- /**
- * Gets the right singular vectors {@code V}.
- *
- * @return {@code V}
- */
- public Matrix getV() {
- if (transpositionNeeded) {
- int numCols = Math.min(m + 1, n);
-
- Matrix r = like(arg, m, numCols);
-
- for (int i = 0; i < m; i++)
- for (int j = 0; j < numCols; j++)
- r.set(i, j, u[i][j]);
-
- return r;
- }
- else
- return like(arg, v.length, v.length).assign(v);
- }
-
- /**
- * Gets the two norm, which is {@code max(S)}.
- */
- public double norm2() {
- return s[0];
- }
-
- /**
- * Gets effective numerical matrix rank.
- */
- public int rank() {
- double eps = Math.pow(2.0, -52.0);
- double tol = Math.max(m, n) * s[0] * eps;
- int r = 0;
-
- for (double value : s)
- if (value > tol)
- r++;
-
- return r;
- }
-
- /**
- * Gets [n × n] covariance matrix.
- *
- * @param minSingularVal Value below which singular values are ignored.
- */
- Matrix getCovariance(double minSingularVal) {
- Matrix j = like(arg, s.length, s.length);
- Matrix vMat = like(arg, v.length, v.length).assign(v);
-
- for (int i = 0; i < s.length; i++)
- j.set(i, i, s[i] >= minSingularVal ? 1 / (s[i] * s[i]) : 0.0);
-
- return vMat.times(j).times(vMat.transpose());
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/decompositions/package-info.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/decompositions/package-info.java b/modules/ml/src/main/java/org/apache/ignite/math/decompositions/package-info.java
deleted file mode 100644
index dcfa0f8..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/decompositions/package-info.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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 description. -->
- * Contains matrix decompositions for distributed code algebra.
- */
-package org.apache.ignite.math.decompositions;
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/exceptions/CardinalityException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/exceptions/CardinalityException.java b/modules/ml/src/main/java/org/apache/ignite/math/exceptions/CardinalityException.java
deleted file mode 100644
index fc87a27..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/exceptions/CardinalityException.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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.ignite.math.exceptions;
-
-import org.apache.ignite.IgniteException;
-
-/**
- * Indicates a cardinality mismatch in matrix or vector operations.
- */
-public class CardinalityException extends IgniteException {
- /** */
- private static final long serialVersionUID = 0L;
-
- /**
- * Creates new cardinality violation exception.
- *
- * @param exp Expected cardinality.
- * @param act Actual cardinality.
- */
- public CardinalityException(int exp, int act) {
- super("Cardinality violation [expected=" + exp + ", actual=" + act + "]");
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/exceptions/ColumnIndexException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/exceptions/ColumnIndexException.java b/modules/ml/src/main/java/org/apache/ignite/math/exceptions/ColumnIndexException.java
deleted file mode 100644
index 7670caf..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/exceptions/ColumnIndexException.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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.ignite.math.exceptions;
-
-import org.apache.ignite.IgniteException;
-
-/**
- * This exception is used to indicate any error condition accessing matrix elements by invalid column index.
- */
-public class ColumnIndexException extends IgniteException {
- /** */
- private static final long serialVersionUID = 0L;
-
- /**
- * @param idx Index value that caused this exception.
- */
- public ColumnIndexException(int idx) {
- super("Invalid (out of bound) column index: " + idx);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/exceptions/IndexException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/exceptions/IndexException.java b/modules/ml/src/main/java/org/apache/ignite/math/exceptions/IndexException.java
deleted file mode 100644
index 9ada706..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/exceptions/IndexException.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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.ignite.math.exceptions;
-
-import org.apache.ignite.IgniteException;
-
-/**
- * Indicates an invalid, i.e. out of bound, index on matrix or vector operations.
- */
-public class IndexException extends IgniteException {
- /** */
- private static final long serialVersionUID = 0L;
-
- /**
- * @param idx Index value that caused this exception.
- */
- public IndexException(int idx) {
- super("Invalid (out of bound) index: " + idx);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/exceptions/NonPositiveDefiniteMatrixException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/exceptions/NonPositiveDefiniteMatrixException.java b/modules/ml/src/main/java/org/apache/ignite/math/exceptions/NonPositiveDefiniteMatrixException.java
deleted file mode 100644
index b6017c2..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/exceptions/NonPositiveDefiniteMatrixException.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.apache.ignite.math.exceptions;
-
-import org.apache.ignite.IgniteException;
-
-/**
- * This exception is used to indicate error condition of matrix elements failing the positivity check.
- */
-public class NonPositiveDefiniteMatrixException extends IgniteException {
- /**
- * Construct an exception.
- *
- * @param wrong Value that fails the positivity check.
- * @param idx Row (and column) index.
- * @param threshold Absolute positivity threshold.
- */
- public NonPositiveDefiniteMatrixException(double wrong, int idx, double threshold) {
- super("Matrix must be positive, wrong element located on diagonal with index "
- + idx + " and has value " + wrong + " with this threshold " + threshold);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/exceptions/NonSymmetricMatrixException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/exceptions/NonSymmetricMatrixException.java b/modules/ml/src/main/java/org/apache/ignite/math/exceptions/NonSymmetricMatrixException.java
deleted file mode 100644
index 8b4cbdb..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/exceptions/NonSymmetricMatrixException.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.apache.ignite.math.exceptions;
-
-import org.apache.ignite.IgniteException;
-
-/**
- * This exception is used to indicate error condition of matrix failing the symmetry check.
- */
-public class NonSymmetricMatrixException extends IgniteException {
- /**
- * @param row Row.
- * @param col Column.
- * @param threshold Threshold.
- */
- public NonSymmetricMatrixException(int row, int col, double threshold) {
- super("Symmetric matrix expected, the symmetry is broken on row "
- + row + " and col " + col + " with this threshold " + threshold);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/exceptions/RowIndexException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/exceptions/RowIndexException.java b/modules/ml/src/main/java/org/apache/ignite/math/exceptions/RowIndexException.java
deleted file mode 100644
index f74ae2c..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/exceptions/RowIndexException.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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.ignite.math.exceptions;
-
-import org.apache.ignite.IgniteException;
-
-/**
- * This exception is used to indicate any error condition accessing matrix elements by invalid row index.
- */
-public class RowIndexException extends IgniteException {
- /** */
- private static final long serialVersionUID = 0L;
-
- /**
- * @param idx Index value that caused this exception.
- */
- public RowIndexException(int idx) {
- super("Invalid (out of bound) row index: " + idx);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/exceptions/SingularMatrixException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/exceptions/SingularMatrixException.java b/modules/ml/src/main/java/org/apache/ignite/math/exceptions/SingularMatrixException.java
deleted file mode 100644
index 4ed3410..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/exceptions/SingularMatrixException.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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.ignite.math.exceptions;
-
-import org.apache.ignite.IgniteException;
-
-/**
- * Exception to be thrown when a non-singular matrix is expected.
- */
-public class SingularMatrixException extends IgniteException {
- /** */
- public SingularMatrixException() {
- super("Regular (or non-singular) matrix expected.");
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/exceptions/UnknownProviderException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/exceptions/UnknownProviderException.java b/modules/ml/src/main/java/org/apache/ignite/math/exceptions/UnknownProviderException.java
deleted file mode 100644
index 3e6498a..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/exceptions/UnknownProviderException.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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.ignite.math.exceptions;
-
-import org.apache.ignite.IgniteException;
-
-/**
- * Indicates that no provider has been found for a given vector or matrix flavor.
- */
-public class UnknownProviderException extends IgniteException {
- /** */
- private static final long serialVersionUID = 0L;
-
- /**
- * @param flv Flavor (a.k.a. operation performance hints) that has no registered provider for.
- */
- public UnknownProviderException(String flv) {
- super("No provider has been found for the flavor: " + flv);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/exceptions/UnsupportedOperationException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/exceptions/UnsupportedOperationException.java b/modules/ml/src/main/java/org/apache/ignite/math/exceptions/UnsupportedOperationException.java
deleted file mode 100644
index be5264c..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/exceptions/UnsupportedOperationException.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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.ignite.math.exceptions;
-
-import org.apache.ignite.IgniteException;
-
-/**
- * Indicate that a specific operation is not supported by the underlying implementation.
- * In some cases, an operation may be unsupported only in certain cases where, for example,
- * it could not be deterministically completed in polynomial time.
- */
-public class UnsupportedOperationException extends IgniteException {
- /** */
- private static final long serialVersionUID = 0L;
-
- /**
- * @param errMsg Error message.
- */
- public UnsupportedOperationException(String errMsg) {
- super(errMsg);
- }
-
- /**
- *
- */
- public UnsupportedOperationException() {
- this("Unsupported operation.");
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/exceptions/package-info.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/exceptions/package-info.java b/modules/ml/src/main/java/org/apache/ignite/math/exceptions/package-info.java
deleted file mode 100644
index 83f3fa4..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/exceptions/package-info.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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 description. -->
- * Contains exceptions for distributed code algebra.
- */
-package org.apache.ignite.math.exceptions;
\ No newline at end of file
[30/67] [abbrv] ignite git commit: IGNITE-1439: Implemented Futures
for C++.
Posted by sb...@apache.org.
IGNITE-1439: Implemented Futures for C++.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/f328c4ee
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/f328c4ee
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/f328c4ee
Branch: refs/heads/ignite-5075
Commit: f328c4eeaef59a35bcc7de0ce03b612fe71ea408
Parents: 9ce62e6
Author: Igor Sapego <is...@gridgain.com>
Authored: Mon Apr 24 17:48:27 2017 +0300
Committer: Igor Sapego <is...@gridgain.com>
Committed: Mon Apr 24 17:48:27 2017 +0300
----------------------------------------------------------------------
.../platforms/cpp/common/include/Makefile.am | 5 +-
.../cpp/common/include/ignite/common/promise.h | 201 ++++++++
.../common/include/ignite/common/shared_state.h | 331 +++++++++++++
.../cpp/common/include/ignite/future.h | 236 +++++++++
.../cpp/common/include/ignite/ignite_error.h | 3 +
.../linux/include/ignite/common/concurrent_os.h | 234 ++++++++-
.../win/include/ignite/common/concurrent_os.h | 169 ++++++-
.../common/os/win/src/common/concurrent_os.cpp | 26 +-
.../cpp/common/project/vs/common.vcxproj | 3 +
.../common/project/vs/common.vcxproj.filters | 9 +
modules/platforms/cpp/core-test/Makefile.am | 1 +
.../cpp/core-test/project/vs/core-test.vcxproj | 1 +
.../project/vs/core-test.vcxproj.filters | 4 +
.../cpp/core-test/src/concurrent_test.cpp | 47 ++
.../platforms/cpp/core-test/src/future_test.cpp | 474 +++++++++++++++++++
15 files changed, 1720 insertions(+), 24 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/f328c4ee/modules/platforms/cpp/common/include/Makefile.am
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/common/include/Makefile.am b/modules/platforms/cpp/common/include/Makefile.am
index cba68e9..64f0c46 100644
--- a/modules/platforms/cpp/common/include/Makefile.am
+++ b/modules/platforms/cpp/common/include/Makefile.am
@@ -28,12 +28,15 @@ nobase_include_HEADERS = \
ignite/common/fixed_size_array.h \
ignite/common/utils.h \
ignite/common/platform_utils.h \
+ ignite/common/shared_state.h \
+ ignite/common/promise.h \
ignite/date.h \
ignite/guid.h \
ignite/ignite_error.h \
ignite/timestamp.h \
ignite/time.h \
- ignite/reference.h
+ ignite/reference.h \
+ ignite/future.h
uninstall-hook:
if [ -d ${includedir}/ignite ]; then find ${includedir}/ignite -type d -empty -delete; fi
http://git-wip-us.apache.org/repos/asf/ignite/blob/f328c4ee/modules/platforms/cpp/common/include/ignite/common/promise.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/common/include/ignite/common/promise.h b/modules/platforms/cpp/common/include/ignite/common/promise.h
new file mode 100644
index 0000000..548b76b
--- /dev/null
+++ b/modules/platforms/cpp/common/include/ignite/common/promise.h
@@ -0,0 +1,201 @@
+/*
+ * 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.
+ */
+
+/**
+ * @file
+ * Declares ignite::commom::Promise class template.
+ */
+
+
+#ifndef _IGNITE_PROMISE
+#define _IGNITE_PROMISE
+
+#include <ignite/common/common.h>
+#include <ignite/common/shared_state.h>
+
+#include <ignite/ignite_error.h>
+#include <ignite/future.h>
+
+namespace ignite
+{
+ namespace common
+ {
+ /**
+ * Promise class template. Used to set result of the asynchroniously
+ * started computation.
+ *
+ * @tparam T Promised value type.
+ */
+ template<typename T>
+ class Promise
+ {
+ public:
+ /** Template value type */
+ typedef T ValueType;
+
+ /**
+ * Constructor.
+ */
+ Promise() :
+ state(new SharedState<ValueType>())
+ {
+ // No-op.
+ }
+
+ /**
+ * Destructor.
+ */
+ ~Promise()
+ {
+ SharedState<ValueType>* state0 = state.Get();
+
+ assert(state0 != 0);
+
+ if (!state0->IsSet())
+ state0->SetError(IgniteError(IgniteError::IGNITE_ERR_FUTURE_STATE,
+ "Broken promise. Value will never be set due to internal error."));
+ }
+
+
+ /**
+ * Get future for this promise.
+ *
+ * @return New future instance.
+ */
+ Future<ValueType> GetFuture() const
+ {
+ return Future<ValueType>(state);
+ }
+
+ /**
+ * Set value.
+ *
+ * @throw IgniteError with IgniteError::IGNITE_ERR_FUTURE_STATE if error or value has been set already.
+ * @param val Value to set.
+ */
+ void SetValue(std::auto_ptr<ValueType> val)
+ {
+ SharedState<ValueType>* state0 = state.Get();
+
+ assert(state0 != 0);
+
+ return state.Get()->SetValue(val);
+ }
+
+ /**
+ * Set error.
+ *
+ * @throw IgniteError with IgniteError::IGNITE_ERR_FUTURE_STATE if error or value has been set already.
+ * @param err Error to set.
+ */
+ void SetError(const IgniteError& err)
+ {
+ SharedState<ValueType>* state0 = state.Get();
+
+ assert(state0 != 0);
+
+ state.Get()->SetError(err);
+ }
+
+ private:
+ IGNITE_NO_COPY_ASSIGNMENT(Promise);
+
+ concurrent::SharedPointer< SharedState<ValueType> > state;
+ };
+
+ /**
+ * Specialization for void.
+ */
+ template<>
+ class Promise<void>
+ {
+ public:
+ /** Template value type */
+ typedef void ValueType;
+
+ /**
+ * Constructor.
+ */
+ Promise() :
+ state(new SharedState<ValueType>())
+ {
+ // No-op.
+ }
+
+ /**
+ * Destructor.
+ */
+ ~Promise()
+ {
+ SharedState<ValueType>* state0 = state.Get();
+
+ assert(state0 != 0);
+
+ if (!state0->IsSet())
+ state0->SetError(IgniteError(IgniteError::IGNITE_ERR_FUTURE_STATE,
+ "Broken promise. Value will never be set due to internal error."));
+ }
+
+
+ /**
+ * Get future for this promise.
+ *
+ * @return New future instance.
+ */
+ Future<ValueType> GetFuture() const
+ {
+ return Future<ValueType>(state);
+ }
+
+ /**
+ * Mark as complete.
+ *
+ * @throw IgniteError with IgniteError::IGNITE_ERR_FUTURE_STATE if error or value has been set already.
+ */
+ void SetValue()
+ {
+ SharedState<ValueType>* state0 = state.Get();
+
+ assert(state0 != 0);
+
+ return state.Get()->SetValue();
+ }
+
+ /**
+ * Set error.
+ *
+ * @throw IgniteError with IgniteError::IGNITE_ERR_FUTURE_STATE if error or value has been set already.
+ * @param err Error to set.
+ */
+ void SetError(const IgniteError& err)
+ {
+ SharedState<ValueType>* state0 = state.Get();
+
+ assert(state0 != 0);
+
+ state.Get()->SetError(err);
+ }
+
+ private:
+ IGNITE_NO_COPY_ASSIGNMENT(Promise);
+
+ concurrent::SharedPointer< SharedState<ValueType> > state;
+ };
+ }
+}
+
+#endif //_IGNITE_PROMISE
http://git-wip-us.apache.org/repos/asf/ignite/blob/f328c4ee/modules/platforms/cpp/common/include/ignite/common/shared_state.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/common/include/ignite/common/shared_state.h b/modules/platforms/cpp/common/include/ignite/common/shared_state.h
new file mode 100644
index 0000000..8886532
--- /dev/null
+++ b/modules/platforms/cpp/common/include/ignite/common/shared_state.h
@@ -0,0 +1,331 @@
+/*
+ * 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.
+ */
+
+/**
+ * @file
+ * Declares ignite::commom::SharedState class template.
+ */
+
+#ifndef _IGNITE_SHARED_STATE
+#define _IGNITE_SHARED_STATE
+
+#include <ignite/common/common.h>
+#include <ignite/common/concurrent.h>
+#include <ignite/ignite_error.h>
+
+namespace ignite
+{
+ namespace common
+ {
+ template<typename T>
+ class SharedState
+ {
+ public:
+ /** Template value type */
+ typedef T ValueType;
+
+ /**
+ * Default constructor.
+ * Constructs non-set SharedState instance.
+ */
+ SharedState() :
+ value(),
+ error()
+ {
+ // No-op.
+ }
+
+ /**
+ * Destructor.
+ */
+ ~SharedState()
+ {
+ // No-op.
+ }
+
+ /**
+ * Checks if the value or error set for the state.
+ * @return True if the value or error set for the state.
+ */
+ bool IsSet() const
+ {
+ return value.get() || error.GetCode() != IgniteError::IGNITE_SUCCESS;
+ }
+
+ /**
+ * Set value.
+ *
+ * @throw IgniteError with IgniteError::IGNITE_ERR_FUTURE_STATE if error or value has been set already.
+ * @param val Value to set.
+ */
+ void SetValue(std::auto_ptr<ValueType> val)
+ {
+ concurrent::CsLockGuard guard(mutex);
+
+ if (IsSet())
+ {
+ if (value.get())
+ throw IgniteError(IgniteError::IGNITE_ERR_FUTURE_STATE, "Future value already set");
+
+ if (error.GetCode() != IgniteError::IGNITE_SUCCESS)
+ throw IgniteError(IgniteError::IGNITE_ERR_FUTURE_STATE, "Future error already set");
+ }
+
+ value = val;
+
+ cond.NotifyAll();
+ }
+
+ /**
+ * Set error.
+ *
+ * @throw IgniteError with IgniteError::IGNITE_ERR_FUTURE_STATE if error or value has been set already.
+ * @param err Error to set.
+ */
+ void SetError(const IgniteError& err)
+ {
+ concurrent::CsLockGuard guard(mutex);
+
+ if (IsSet())
+ {
+ if (value.get())
+ throw IgniteError(IgniteError::IGNITE_ERR_FUTURE_STATE, "Future value already set");
+
+ if (error.GetCode() != IgniteError::IGNITE_SUCCESS)
+ throw IgniteError(IgniteError::IGNITE_ERR_FUTURE_STATE, "Future error already set");
+ }
+
+ error = err;
+
+ cond.NotifyAll();
+ }
+
+ /**
+ * Wait for value to be set.
+ * Active thread will be blocked until value or error will be set.
+ */
+ void Wait() const
+ {
+ concurrent::CsLockGuard guard(mutex);
+
+ while (!IsSet())
+ cond.Wait(mutex);
+ }
+
+ /**
+ * Wait for value to be set for specified time.
+ * Active thread will be blocked until value or error will be set or timeout will end.
+ *
+ * @param msTimeout Timeout in milliseconds.
+ * @return True if the object has been triggered and false in case of timeout.
+ */
+ bool WaitFor(int32_t msTimeout) const
+ {
+ concurrent::CsLockGuard guard(mutex);
+
+ if (IsSet())
+ return true;
+
+ return cond.WaitFor(mutex, msTimeout);
+ }
+
+ /**
+ * Get the set value.
+ * Active thread will be blocked until value or error will be set.
+ *
+ * @throw IgniteError if error has been set.
+ * @return Value that has been set on success.
+ */
+ const ValueType& GetValue() const
+ {
+ Wait();
+
+ if (value.get())
+ return *value;
+
+ assert(error.GetCode() != IgniteError::IGNITE_SUCCESS);
+
+ throw error;
+ }
+
+ private:
+ IGNITE_NO_COPY_ASSIGNMENT(SharedState);
+
+ /** Value. */
+ std::auto_ptr<ValueType> value;
+
+ /** Error. */
+ IgniteError error;
+
+ /** Condition variable which serves to signal that value is set. */
+ mutable concurrent::ConditionVariable cond;
+
+ /** Lock that used to prevent double-set of the value. */
+ mutable concurrent::CriticalSection mutex;
+ };
+
+ /**
+ * Specialization for void type.
+ */
+ template<>
+ class SharedState<void>
+ {
+ public:
+ /** Template value type */
+ typedef void ValueType;
+
+ /**
+ * Default constructor.
+ * Constructs non-set SharedState instance.
+ */
+ SharedState() :
+ done(false),
+ error()
+ {
+ // No-op.
+ }
+
+ /**
+ * Destructor.
+ */
+ ~SharedState()
+ {
+ // No-op.
+ }
+
+ /**
+ * Checks if the value or error set for the state.
+ * @return True if the value or error set for the state.
+ */
+ bool IsSet() const
+ {
+ return done || error.GetCode() != IgniteError::IGNITE_SUCCESS;
+ }
+
+ /**
+ * Set value.
+ *
+ * @throw IgniteError with IgniteError::IGNITE_ERR_FUTURE_STATE if error or value has been set already.
+ */
+ void SetValue()
+ {
+ concurrent::CsLockGuard guard(mutex);
+
+ if (IsSet())
+ {
+ if (done)
+ throw IgniteError(IgniteError::IGNITE_ERR_FUTURE_STATE, "Future value already set");
+
+ if (error.GetCode() != IgniteError::IGNITE_SUCCESS)
+ throw IgniteError(IgniteError::IGNITE_ERR_FUTURE_STATE, "Future error already set");
+ }
+
+ done = true;
+
+ cond.NotifyAll();
+ }
+
+ /**
+ * Set error.
+ *
+ * @throw IgniteError with IgniteError::IGNITE_ERR_FUTURE_STATE if error or value has been set already.
+ * @param err Error to set.
+ */
+ void SetError(const IgniteError& err)
+ {
+ concurrent::CsLockGuard guard(mutex);
+
+ if (IsSet())
+ {
+ if (done)
+ throw IgniteError(IgniteError::IGNITE_ERR_FUTURE_STATE, "Future value already set");
+
+ if (error.GetCode() != IgniteError::IGNITE_SUCCESS)
+ throw IgniteError(IgniteError::IGNITE_ERR_FUTURE_STATE, "Future error already set");
+ }
+
+ error = err;
+
+ cond.NotifyAll();
+ }
+
+ /**
+ * Wait for value to be set.
+ * Active thread will be blocked until value or error will be set.
+ */
+ void Wait() const
+ {
+ concurrent::CsLockGuard guard(mutex);
+
+ while (!IsSet())
+ cond.Wait(mutex);
+ }
+
+ /**
+ * Wait for value to be set for specified time.
+ * Active thread will be blocked until value or error will be set or timeout will end.
+ *
+ * @param msTimeout Timeout in milliseconds.
+ * @return True if the object has been triggered and false in case of timeout.
+ */
+ bool WaitFor(int32_t msTimeout) const
+ {
+ concurrent::CsLockGuard guard(mutex);
+
+ if (IsSet())
+ return true;
+
+ return cond.WaitFor(mutex, msTimeout);
+ }
+
+ /**
+ * Get the set value.
+ * Active thread will be blocked until value or error will be set.
+ *
+ * @throw IgniteError if error has been set.
+ */
+ void GetValue() const
+ {
+ Wait();
+
+ if (done)
+ return;
+
+ assert(error.GetCode() != IgniteError::IGNITE_SUCCESS);
+
+ throw error;
+ }
+
+ private:
+ IGNITE_NO_COPY_ASSIGNMENT(SharedState);
+
+ /** Marker. */
+ bool done;
+
+ /** Error. */
+ IgniteError error;
+
+ /** Condition variable which serves to signal that value is set. */
+ mutable concurrent::ConditionVariable cond;
+
+ /** Lock that used to prevent double-set of the value. */
+ mutable concurrent::CriticalSection mutex;
+ };
+ }
+}
+
+#endif //_IGNITE_SHARED_STATE
http://git-wip-us.apache.org/repos/asf/ignite/blob/f328c4ee/modules/platforms/cpp/common/include/ignite/future.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/common/include/ignite/future.h b/modules/platforms/cpp/common/include/ignite/future.h
new file mode 100644
index 0000000..5c42e55
--- /dev/null
+++ b/modules/platforms/cpp/common/include/ignite/future.h
@@ -0,0 +1,236 @@
+/*
+ * 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.
+ */
+
+/**
+ * @file
+ * Declares ignite::Future class template.
+ */
+
+
+#ifndef _IGNITE_FUTURE
+#define _IGNITE_FUTURE
+
+#include <ignite/common/shared_state.h>
+#include <ignite/ignite_error.h>
+
+namespace ignite
+{
+ namespace common
+ {
+ // Forward declaration
+ template<typename T>
+ class Promise;
+ }
+
+ /**
+ * Future class template. Used to get result of the asynchroniously
+ * started computation.
+ *
+ * @tparam T Future value type.
+ */
+ template<typename T>
+ class Future
+ {
+ friend class common::Promise<T>;
+
+ public:
+ /** Template value type */
+ typedef T ValueType;
+
+ /**
+ * Copy constructor.
+ *
+ * @param src Instance to copy.
+ */
+ Future(const Future<ValueType>& src) :
+ state(src.state)
+ {
+ // No-op.
+ }
+
+ /**
+ * Assignment operator.
+ *
+ * @param other Other instance.
+ * @return *this.
+ */
+ Future& operator=(const Future<ValueType>& other)
+ {
+ state = other.state;
+
+ return *this;
+ }
+
+ /**
+ * Wait for value to be set.
+ * Active thread will be blocked until value or error will be set.
+ */
+ void Wait() const
+ {
+ const common::SharedState<ValueType>* state0 = state.Get();
+
+ assert(state0 != 0);
+
+ state.Get()->Wait();
+ }
+
+ /**
+ * Wait for value to be set for specified time.
+ * Active thread will be blocked until value or error will be set or timeout will end.
+ *
+ * @param msTimeout Timeout in milliseconds.
+ * @return True if the object has been triggered and false in case of timeout.
+ */
+ bool WaitFor(int32_t msTimeout) const
+ {
+ const common::SharedState<ValueType>* state0 = state.Get();
+
+ assert(state0 != 0);
+
+ return state.Get()->WaitFor(msTimeout);
+ }
+
+ /**
+ * Get the set value.
+ * Active thread will be blocked until value or error will be set.
+ *
+ * @throw IgniteError if error has been set.
+ * @return Value that has been set on success.
+ */
+ const ValueType& GetValue() const
+ {
+ const common::SharedState<ValueType>* state0 = state.Get();
+
+ assert(state0 != 0);
+
+ return state.Get()->GetValue();
+ }
+
+ private:
+ /**
+ * Constructor.
+ *
+ * @param state0 Shared state instance.
+ */
+ Future(common::concurrent::SharedPointer< common::SharedState<ValueType> > state0) :
+ state(state0)
+ {
+ // No-op.
+ }
+
+ /** Shared state. */
+ common::concurrent::SharedPointer< common::SharedState<ValueType> > state;
+ };
+
+ /**
+ * Specialization for void type.
+ */
+ template<>
+ class Future<void>
+ {
+ friend class common::Promise<void>;
+
+ public:
+ /** Template value type */
+ typedef void ValueType;
+
+ /**
+ * Copy constructor.
+ *
+ * @param src Instance to copy.
+ */
+ Future(const Future<ValueType>& src) :
+ state(src.state)
+ {
+ // No-op.
+ }
+
+ /**
+ * Assignment operator.
+ *
+ * @param other Other instance.
+ * @return *this.
+ */
+ Future& operator=(const Future<ValueType>& other)
+ {
+ state = other.state;
+
+ return *this;
+ }
+
+ /**
+ * Wait for value to be set.
+ * Active thread will be blocked until value or error will be set.
+ */
+ void Wait() const
+ {
+ const common::SharedState<ValueType>* state0 = state.Get();
+
+ assert(state0 != 0);
+
+ state.Get()->Wait();
+ }
+
+ /**
+ * Wait for value to be set for specified time.
+ * Active thread will be blocked until value or error will be set or timeout will end.
+ *
+ * @param msTimeout Timeout in milliseconds.
+ * @return True if the object has been triggered and false in case of timeout.
+ */
+ bool WaitFor(int32_t msTimeout) const
+ {
+ const common::SharedState<ValueType>* state0 = state.Get();
+
+ assert(state0 != 0);
+
+ return state.Get()->WaitFor(msTimeout);
+ }
+
+ /**
+ * Wait for operation complition or error.
+ * Active thread will be blocked until value or error will be set.
+ *
+ * @throw IgniteError if error has been set.
+ */
+ void GetValue() const
+ {
+ const common::SharedState<ValueType>* state0 = state.Get();
+
+ assert(state0 != 0);
+
+ state.Get()->GetValue();
+ }
+
+ private:
+ /**
+ * Constructor.
+ *
+ * @param state0 Shared state instance.
+ */
+ Future(common::concurrent::SharedPointer< common::SharedState<ValueType> > state0) :
+ state(state0)
+ {
+ // No-op.
+ }
+
+ /** Shared state. */
+ common::concurrent::SharedPointer< common::SharedState<ValueType> > state;
+ };
+}
+
+#endif //_IGNITE_FUTURE
http://git-wip-us.apache.org/repos/asf/ignite/blob/f328c4ee/modules/platforms/cpp/common/include/ignite/ignite_error.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/common/include/ignite/ignite_error.h b/modules/platforms/cpp/common/include/ignite/ignite_error.h
index cecaf3f..7818dd2 100644
--- a/modules/platforms/cpp/common/include/ignite/ignite_error.h
+++ b/modules/platforms/cpp/common/include/ignite/ignite_error.h
@@ -195,6 +195,9 @@ namespace ignite
/** Security error. */
static const int IGNITE_ERR_SECURITY = 2023;
+
+ /** Future state error. */
+ static const int IGNITE_ERR_FUTURE_STATE = 2024;
/** Unknown error. */
static const int IGNITE_ERR_UNKNOWN = -1;
http://git-wip-us.apache.org/repos/asf/ignite/blob/f328c4ee/modules/platforms/cpp/common/os/linux/include/ignite/common/concurrent_os.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/common/os/linux/include/ignite/common/concurrent_os.h b/modules/platforms/cpp/common/os/linux/include/ignite/common/concurrent_os.h
index 27ef998..84bc8e6 100644
--- a/modules/platforms/cpp/common/os/linux/include/ignite/common/concurrent_os.h
+++ b/modules/platforms/cpp/common/os/linux/include/ignite/common/concurrent_os.h
@@ -18,11 +18,16 @@
#ifndef _IGNITE_COMMON_CONCURRENT_OS
#define _IGNITE_COMMON_CONCURRENT_OS
-#include <map>
-#include <stdint.h>
#include <pthread.h>
+#include <time.h>
+#include <errno.h>
+
+#include <stdint.h>
-#include "ignite/common/common.h"
+#include <cassert>
+#include <map>
+
+#include <ignite/common/common.h>
namespace ignite
{
@@ -44,7 +49,9 @@ namespace ignite
/**
* Critical section.
*/
- class IGNITE_IMPORT_EXPORT CriticalSection {
+ class IGNITE_IMPORT_EXPORT CriticalSection
+ {
+ friend class ConditionVariable;
public:
/**
* Constructor.
@@ -387,6 +394,225 @@ namespace ignite
/** Index. */
int32_t idx;
};
+
+ /**
+ * Cross-platform wrapper for Condition Variable synchronization
+ * primitive concept.
+ */
+ class ConditionVariable
+ {
+ public:
+ /**
+ * Constructor.
+ */
+ ConditionVariable()
+ {
+ pthread_condattr_t attr;
+ int err = pthread_condattr_init(&attr);
+ assert(!err);
+
+ err = pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
+ assert(!err);
+
+ err = pthread_cond_init(&cond, &attr);
+ assert(!err);
+ }
+
+ /**
+ * Destructor.
+ */
+ ~ConditionVariable()
+ {
+ pthread_cond_destroy(&cond);
+ }
+
+ /**
+ * Wait for Condition Variable to be notified.
+ *
+ * @param cs Critical section in which to wait.
+ */
+ void Wait(CriticalSection& cs)
+ {
+ pthread_cond_wait(&cond, &cs.mux);
+ }
+
+ /**
+ * Wait for Condition Variable to be notified for specified time.
+ *
+ * @param cs Critical section in which to wait.
+ * @param msTimeout Timeout in milliseconds.
+ * @return True if the object has been notified and false in case of timeout.
+ */
+ bool WaitFor(CriticalSection& cs, int32_t msTimeout)
+ {
+ timespec ts;
+ int err = clock_gettime(CLOCK_MONOTONIC, &ts);
+ assert(!err);
+
+ ts.tv_sec += msTimeout / 1000 + (ts.tv_nsec + (msTimeout % 1000) * 1000000) / 1000000000;
+ ts.tv_nsec = (ts.tv_nsec + (msTimeout % 1000) * 1000000) % 1000000000;
+
+ int res = pthread_cond_timedwait(&cond, &cs.mux, &ts);
+
+ return res == 0;
+ }
+
+ /**
+ * Notify single thread waiting for the condition variable.
+ */
+ void NotifyOne()
+ {
+ int err = pthread_cond_signal(&cond);
+ assert(!err);
+ }
+
+ /**
+ * Notify all threads that are waiting on the variable.
+ */
+ void NotifyAll()
+ {
+ int err = pthread_cond_broadcast(&cond);
+ assert(!err);
+ }
+
+ private:
+ IGNITE_NO_COPY_ASSIGNMENT(ConditionVariable);
+
+ /** OS-specific type. */
+ pthread_cond_t cond;
+ };
+
+ /**
+ * Manually triggered event.
+ * Once triggered it stays in passing state until manually reset.
+ */
+ class ManualEvent
+ {
+ public:
+ /**
+ * Constructs manual event.
+ * Initial state is untriggered.
+ */
+ ManualEvent() :
+ cond(),
+ mutex(),
+ state(false)
+ {
+ pthread_condattr_t attr;
+ int err = pthread_condattr_init(&attr);
+ assert(!err);
+
+ err = pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
+ assert(!err);
+
+ err = pthread_cond_init(&cond, &attr);
+ assert(!err);
+
+ err = pthread_mutex_init(&mutex, NULL);
+ assert(!err);
+ }
+
+ /**
+ * Destructor.
+ */
+ ~ManualEvent()
+ {
+ pthread_mutex_destroy(&mutex);
+ pthread_cond_destroy(&cond);
+ }
+
+ /**
+ * Sets event into triggered state.
+ */
+ void Set()
+ {
+ int err = pthread_mutex_lock(&mutex);
+ assert(!err);
+
+ state = true;
+
+ err = pthread_cond_broadcast(&cond);
+ assert(!err);
+
+ err = pthread_mutex_unlock(&mutex);
+ assert(!err);
+ }
+
+ /**
+ * Resets event into non-triggered state.
+ */
+ void Reset()
+ {
+ int err = pthread_mutex_lock(&mutex);
+ assert(!err);
+
+ state = false;
+
+ err = pthread_mutex_unlock(&mutex);
+ assert(!err);
+ }
+
+ /**
+ * Wait for event to be triggered.
+ */
+ void Wait()
+ {
+ int err = pthread_mutex_lock(&mutex);
+ assert(!err);
+
+ while (!state)
+ {
+ err = pthread_cond_wait(&cond, &mutex);
+ assert(!err);
+ }
+
+ err = pthread_mutex_unlock(&mutex);
+ assert(!err);
+ }
+
+ /**
+ * Wait for event to be triggered for specified time.
+ *
+ * @param msTimeout Timeout in milliseconds.
+ * @return True if the object has been triggered and false in case of timeout.
+ */
+ bool WaitFor(int32_t msTimeout)
+ {
+ int res = 0;
+ int err = pthread_mutex_lock(&mutex);
+ assert(!err);
+
+ if (!state)
+ {
+ timespec ts;
+ err = clock_gettime(CLOCK_MONOTONIC, &ts);
+ assert(!err);
+
+ ts.tv_sec += msTimeout / 1000 + (ts.tv_nsec + (msTimeout % 1000) * 1000000) / 1000000000;
+ ts.tv_nsec = (ts.tv_nsec + (msTimeout % 1000) * 1000000) % 1000000000;
+
+ res = pthread_cond_timedwait(&cond, &mutex, &ts);
+ assert(res == 0 || res == ETIMEDOUT);
+ }
+
+ err = pthread_mutex_unlock(&mutex);
+ assert(!err);
+
+ return res == 0;
+ }
+
+ private:
+ IGNITE_NO_COPY_ASSIGNMENT(ManualEvent);
+
+ /** Condition variable. */
+ pthread_cond_t cond;
+
+ /** Mutex. */
+ pthread_mutex_t mutex;
+
+ /** State. */
+ bool state;
+ };
}
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/f328c4ee/modules/platforms/cpp/common/os/win/include/ignite/common/concurrent_os.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/common/os/win/include/ignite/common/concurrent_os.h b/modules/platforms/cpp/common/os/win/include/ignite/common/concurrent_os.h
index 77de4d8..54f611b 100644
--- a/modules/platforms/cpp/common/os/win/include/ignite/common/concurrent_os.h
+++ b/modules/platforms/cpp/common/os/win/include/ignite/common/concurrent_os.h
@@ -18,12 +18,14 @@
#ifndef _IGNITE_COMMON_CONCURRENT_OS
#define _IGNITE_COMMON_CONCURRENT_OS
-#include <map>
#include <stdint.h>
+
+#include <cassert>
+#include <map>
+
#include <windows.h>
#include "ignite/common/common.h"
-
namespace ignite
{
namespace common
@@ -33,7 +35,8 @@ namespace ignite
/**
* Static class to manage memory visibility semantics.
*/
- class IGNITE_IMPORT_EXPORT Memory {
+ class Memory
+ {
public:
/**
* Full fence.
@@ -44,7 +47,9 @@ namespace ignite
/**
* Critical section.
*/
- class IGNITE_IMPORT_EXPORT CriticalSection {
+ class IGNITE_IMPORT_EXPORT CriticalSection
+ {
+ friend class ConditionVariable;
public:
/**
* Constructor.
@@ -67,7 +72,7 @@ namespace ignite
void Leave();
private:
/** Handle. */
- CRITICAL_SECTION* hnd;
+ CRITICAL_SECTION hnd;
IGNITE_NO_COPY_ASSIGNMENT(CriticalSection)
};
@@ -76,7 +81,7 @@ namespace ignite
* Special latch with count = 1.
*/
class IGNITE_IMPORT_EXPORT SingleLatch
- {
+ {
public:
/**
* Constructor.
@@ -99,7 +104,7 @@ namespace ignite
void Await();
private:
/** Handle. */
- void* hnd;
+ HANDLE hnd;
IGNITE_NO_COPY_ASSIGNMENT(SingleLatch)
};
@@ -107,7 +112,7 @@ namespace ignite
/**
* Primitives for atomic access.
*/
- class IGNITE_IMPORT_EXPORT Atomics
+ class Atomics
{
public:
/**
@@ -399,6 +404,154 @@ namespace ignite
/** Index. */
int32_t idx;
};
+
+ /**
+ * Cross-platform wrapper for Condition Variable synchronization
+ * primitive concept.
+ */
+ class ConditionVariable
+ {
+ public:
+ /**
+ * Constructor.
+ */
+ ConditionVariable()
+ {
+ InitializeConditionVariable(&cond);
+ }
+
+ /**
+ * Destructor.
+ */
+ ~ConditionVariable()
+ {
+ // No-op.
+ }
+
+ /**
+ * Wait for Condition Variable to be notified.
+ *
+ * @param cs Critical section in which to wait.
+ */
+ void Wait(CriticalSection& cs)
+ {
+ SleepConditionVariableCS(&cond, &cs.hnd, INFINITE);
+ }
+
+ /**
+ * Wait for Condition Variable to be notified for specified time.
+ *
+ * @param cs Critical section in which to wait.
+ * @param msTimeout Timeout in milliseconds.
+ * @return True if the object has been notified and false in case of timeout.
+ */
+ bool WaitFor(CriticalSection& cs, int32_t msTimeout)
+ {
+ BOOL notified = SleepConditionVariableCS(&cond, &cs.hnd, msTimeout);
+
+ return notified != FALSE;
+ }
+
+ /**
+ * Notify single thread waiting for the condition variable.
+ */
+ void NotifyOne()
+ {
+ WakeConditionVariable(&cond);
+ }
+
+ /**
+ * Notify all threads that are waiting on the variable.
+ */
+ void NotifyAll()
+ {
+ WakeAllConditionVariable(&cond);
+ }
+
+ private:
+ IGNITE_NO_COPY_ASSIGNMENT(ConditionVariable);
+
+ /** OS-specific type. */
+ CONDITION_VARIABLE cond;
+ };
+
+ /**
+ * Manually triggered event.
+ * Once triggered it stays in passing state until manually reset.
+ */
+ class ManualEvent
+ {
+ public:
+ /**
+ * Constructs manual event.
+ * Initial state is untriggered.
+ */
+ ManualEvent()
+ {
+ handle = CreateEvent(NULL, TRUE, FALSE, NULL);
+
+ assert(handle != NULL);
+ }
+
+ /**
+ * Destructor.
+ */
+ ~ManualEvent()
+ {
+ CloseHandle(handle);
+ }
+
+ /**
+ * Sets event into triggered state.
+ */
+ void Set()
+ {
+ BOOL success = SetEvent(handle);
+
+ assert(success);
+ }
+
+ /**
+ * Resets event into non-triggered state.
+ */
+ void Reset()
+ {
+ BOOL success = ResetEvent(handle);
+
+ assert(success);
+ }
+
+ /**
+ * Wait for event to be triggered.
+ */
+ void Wait()
+ {
+ DWORD res = WaitForSingleObject(handle, INFINITE);
+
+ assert(res == WAIT_OBJECT_0);
+ }
+
+ /**
+ * Wait for event to be triggered for specified time.
+ *
+ * @param msTimeout Timeout in milliseconds.
+ * @return True if the object has been triggered and false in case of timeout.
+ */
+ bool WaitFor(int32_t msTimeout)
+ {
+ DWORD res = WaitForSingleObject(handle, static_cast<DWORD>(msTimeout));
+
+ assert(res == WAIT_OBJECT_0 || res == WAIT_TIMEOUT);
+
+ return res == WAIT_OBJECT_0;
+ }
+
+ private:
+ IGNITE_NO_COPY_ASSIGNMENT(ManualEvent);
+
+ /** Event handle. */
+ HANDLE handle;
+ };
}
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/f328c4ee/modules/platforms/cpp/common/os/win/src/common/concurrent_os.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/common/os/win/src/common/concurrent_os.cpp b/modules/platforms/cpp/common/os/win/src/common/concurrent_os.cpp
index 676d8b6..7b42ba4 100644
--- a/modules/platforms/cpp/common/os/win/src/common/concurrent_os.cpp
+++ b/modules/platforms/cpp/common/os/win/src/common/concurrent_os.cpp
@@ -32,31 +32,35 @@ namespace ignite
MemoryBarrier();
}
- CriticalSection::CriticalSection() : hnd(new CRITICAL_SECTION) {
- InitializeCriticalSection(hnd);
+ CriticalSection::CriticalSection() :
+ hnd()
+ {
+ InitializeCriticalSection(&hnd);
Memory::Fence();
}
- CriticalSection::~CriticalSection() {
- Memory::Fence();
-
- delete hnd;
+ CriticalSection::~CriticalSection()
+ {
+ // No-op.
}
- void CriticalSection::Enter() {
+ void CriticalSection::Enter()
+ {
Memory::Fence();
- EnterCriticalSection(hnd);
+ EnterCriticalSection(&hnd);
}
- void CriticalSection::Leave() {
+ void CriticalSection::Leave()
+ {
Memory::Fence();
- LeaveCriticalSection(hnd);
+ LeaveCriticalSection(&hnd);
}
- SingleLatch::SingleLatch() : hnd(CreateEvent(NULL, TRUE, FALSE, NULL))
+ SingleLatch::SingleLatch() :
+ hnd(CreateEvent(NULL, TRUE, FALSE, NULL))
{
Memory::Fence();
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/f328c4ee/modules/platforms/cpp/common/project/vs/common.vcxproj
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/common/project/vs/common.vcxproj b/modules/platforms/cpp/common/project/vs/common.vcxproj
index 3062112..9f32461 100644
--- a/modules/platforms/cpp/common/project/vs/common.vcxproj
+++ b/modules/platforms/cpp/common/project/vs/common.vcxproj
@@ -173,9 +173,12 @@
<ClInclude Include="..\..\include\ignite\common\fixed_size_array.h" />
<ClInclude Include="..\..\include\ignite\common\bits.h" />
<ClInclude Include="..\..\include\ignite\common\platform_utils.h" />
+ <ClInclude Include="..\..\include\ignite\common\promise.h" />
<ClInclude Include="..\..\include\ignite\common\reference_impl.h" />
+ <ClInclude Include="..\..\include\ignite\common\shared_state.h" />
<ClInclude Include="..\..\include\ignite\common\utils.h" />
<ClInclude Include="..\..\include\ignite\date.h" />
+ <ClInclude Include="..\..\include\ignite\future.h" />
<ClInclude Include="..\..\include\ignite\guid.h" />
<ClInclude Include="..\..\include\ignite\ignite_error.h" />
<ClInclude Include="..\..\include\ignite\reference.h" />
http://git-wip-us.apache.org/repos/asf/ignite/blob/f328c4ee/modules/platforms/cpp/common/project/vs/common.vcxproj.filters
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/common/project/vs/common.vcxproj.filters b/modules/platforms/cpp/common/project/vs/common.vcxproj.filters
index ed709f7..4daf3aa 100644
--- a/modules/platforms/cpp/common/project/vs/common.vcxproj.filters
+++ b/modules/platforms/cpp/common/project/vs/common.vcxproj.filters
@@ -67,6 +67,15 @@
<ClInclude Include="..\..\include\ignite\time.h">
<Filter>Code</Filter>
</ClInclude>
+ <ClInclude Include="..\..\include\ignite\future.h">
+ <Filter>Code</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\common\promise.h">
+ <Filter>Code\common</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\include\ignite\common\shared_state.h">
+ <Filter>Code\common</Filter>
+ </ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\src\date.cpp">
http://git-wip-us.apache.org/repos/asf/ignite/blob/f328c4ee/modules/platforms/cpp/core-test/Makefile.am
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/Makefile.am b/modules/platforms/cpp/core-test/Makefile.am
index 25dee58..11f4d1a 100644
--- a/modules/platforms/cpp/core-test/Makefile.am
+++ b/modules/platforms/cpp/core-test/Makefile.am
@@ -77,6 +77,7 @@ ignite_tests_SOURCES = \
src/decimal_test.cpp \
src/dynamic_size_array_test.cpp \
src/fixed_size_array_test.cpp \
+ src/future_test.cpp \
src/transactions_test.cpp \
src/teamcity_messages.cpp \
src/teamcity_boost.cpp \
http://git-wip-us.apache.org/repos/asf/ignite/blob/f328c4ee/modules/platforms/cpp/core-test/project/vs/core-test.vcxproj
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/project/vs/core-test.vcxproj b/modules/platforms/cpp/core-test/project/vs/core-test.vcxproj
index 5d97d20..51ae5d41 100644
--- a/modules/platforms/cpp/core-test/project/vs/core-test.vcxproj
+++ b/modules/platforms/cpp/core-test/project/vs/core-test.vcxproj
@@ -70,6 +70,7 @@
<ClCompile Include="..\..\src\dynamic_size_array_test.cpp" />
<ClCompile Include="..\..\src\fixed_size_array_test.cpp" />
<ClCompile Include="..\..\src\continuous_query_test.cpp" />
+ <ClCompile Include="..\..\src\future_test.cpp" />
<ClCompile Include="..\..\src\ignite_error_test.cpp" />
<ClCompile Include="..\..\src\ignition_test.cpp" />
<ClCompile Include="..\..\src\handle_registry_test.cpp" />
http://git-wip-us.apache.org/repos/asf/ignite/blob/f328c4ee/modules/platforms/cpp/core-test/project/vs/core-test.vcxproj.filters
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/project/vs/core-test.vcxproj.filters b/modules/platforms/cpp/core-test/project/vs/core-test.vcxproj.filters
index 08652d9..ebccc7f 100644
--- a/modules/platforms/cpp/core-test/project/vs/core-test.vcxproj.filters
+++ b/modules/platforms/cpp/core-test/project/vs/core-test.vcxproj.filters
@@ -85,6 +85,9 @@
<ClCompile Include="..\..\src\cache_store_test.cpp">
<Filter>Code</Filter>
</ClCompile>
+ <ClCompile Include="..\..\src\future_test.cpp">
+ <Filter>Code</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\include\teamcity_messages.h">
@@ -178,5 +181,6 @@
<None Include="..\..\config\cache-query-continuous.xml">
<Filter>Configs</Filter>
</None>
+ <None Include="..\..\config\cache-query-continuous.xml" />
</ItemGroup>
</Project>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/f328c4ee/modules/platforms/cpp/core-test/src/concurrent_test.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/src/concurrent_test.cpp b/modules/platforms/cpp/core-test/src/concurrent_test.cpp
index 173973d..bcd7ddf 100644
--- a/modules/platforms/cpp/core-test/src/concurrent_test.cpp
+++ b/modules/platforms/cpp/core-test/src/concurrent_test.cpp
@@ -23,6 +23,7 @@
#include <ignite/common/concurrent.h>
+using namespace ignite;
using namespace ignite::common::concurrent;
BOOST_AUTO_TEST_SUITE(ConcurrentTestSuite)
@@ -276,4 +277,50 @@ BOOST_AUTO_TEST_CASE(TestEnableSharedFromThis)
BOOST_CHECK(deleted);
}
+BOOST_AUTO_TEST_CASE(ConditionVariableBasic)
+{
+ CriticalSection cs;
+ ConditionVariable cv;
+
+ CsLockGuard guard(cs);
+
+ bool notified = cv.WaitFor(cs, 100);
+
+ BOOST_REQUIRE(!notified);
+
+ cv.NotifyOne();
+
+ notified = cv.WaitFor(cs, 100);
+
+ BOOST_REQUIRE(!notified);
+
+ cv.NotifyAll();
+
+ notified = cv.WaitFor(cs, 100);
+
+ BOOST_REQUIRE(!notified);
+}
+
+BOOST_AUTO_TEST_CASE(ManualEventBasic)
+{
+ ManualEvent evt;
+
+ bool triggered = evt.WaitFor(100);
+ BOOST_CHECK(!triggered);
+
+ evt.Set();
+
+ triggered = evt.WaitFor(100);
+ BOOST_REQUIRE(triggered);
+
+ triggered = evt.WaitFor(100);
+ BOOST_REQUIRE(triggered);
+
+ evt.Wait();
+ evt.Reset();
+
+ triggered = evt.WaitFor(100);
+ BOOST_CHECK(!triggered);
+}
+
BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/f328c4ee/modules/platforms/cpp/core-test/src/future_test.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/src/future_test.cpp b/modules/platforms/cpp/core-test/src/future_test.cpp
new file mode 100644
index 0000000..3d5c659
--- /dev/null
+++ b/modules/platforms/cpp/core-test/src/future_test.cpp
@@ -0,0 +1,474 @@
+/*
+ * 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.
+ */
+
+#ifndef _MSC_VER
+ #define BOOST_TEST_DYN_LINK
+#endif
+
+#include <boost/test/unit_test.hpp>
+
+#include <ignite/common/promise.h>
+#include <ignite/future.h>
+
+using namespace ignite;
+using namespace ignite::common;
+
+/**
+ * Utility to make auto pointer from value.
+ *
+ * @param val Value.
+ * @return Auto pointer.
+ */
+template<typename T>
+std::auto_ptr<T> MakeAuto(const T& val)
+{
+ return std::auto_ptr<T>(new T(val));
+}
+
+/**
+ * Checks if the error is of type IgniteError::IGNITE_ERR_FUTURE_STATE.
+ */
+inline bool IsFutureError(const IgniteError& err)
+{
+ return err.GetCode() == IgniteError::IGNITE_ERR_FUTURE_STATE;
+}
+
+/**
+* Checks if the error is of type IgniteError::IGNITE_ERR_UNKNOWN.
+*/
+inline bool IsUnknownError(const IgniteError& err)
+{
+ return err.GetCode() == IgniteError::IGNITE_ERR_UNKNOWN;
+}
+
+BOOST_AUTO_TEST_SUITE(FutureTestSuite)
+
+BOOST_AUTO_TEST_CASE(SharedStateIntValue)
+{
+ SharedState<int> sharedState;
+ int expected = 42;
+
+ bool set = sharedState.WaitFor(100);
+ BOOST_CHECK(!set);
+
+ sharedState.SetValue(MakeAuto(expected));
+
+ set = sharedState.WaitFor(100);
+ BOOST_REQUIRE(set);
+
+ set = sharedState.WaitFor(100);
+ BOOST_REQUIRE(set);
+
+ sharedState.Wait();
+ int val = sharedState.GetValue();
+
+ BOOST_CHECK_EQUAL(val, expected);
+
+ int val2 = sharedState.GetValue();
+
+ BOOST_CHECK_EQUAL(val2, expected);
+
+ BOOST_CHECK_EXCEPTION(sharedState.SetValue(MakeAuto(0)), IgniteError, IsFutureError);
+ BOOST_CHECK_EXCEPTION(sharedState.SetValue(MakeAuto(expected)), IgniteError, IsFutureError);
+ BOOST_CHECK_EXCEPTION(sharedState.SetError(IgniteError()), IgniteError, IsFutureError);
+}
+
+BOOST_AUTO_TEST_CASE(SharedStateStringValue)
+{
+ SharedState<std::string> sharedState;
+ std::string expected = "Lorem ipsum";
+
+ bool ready = sharedState.WaitFor(100);
+ BOOST_CHECK(!ready);
+
+ sharedState.SetValue(MakeAuto(expected));
+
+ ready = sharedState.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ ready = sharedState.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ sharedState.Wait();
+ std::string val = sharedState.GetValue();
+
+ BOOST_CHECK_EQUAL(val, expected);
+
+ std::string val2 = sharedState.GetValue();
+
+ BOOST_CHECK_EQUAL(val2, expected);
+
+ BOOST_CHECK_EXCEPTION(sharedState.SetError(IgniteError()), IgniteError, IsFutureError);
+ BOOST_CHECK_EXCEPTION(sharedState.SetValue(MakeAuto(expected)), IgniteError, IsFutureError);
+ BOOST_CHECK_EXCEPTION(sharedState.SetValue(MakeAuto(std::string("Hello world"))), IgniteError, IsFutureError);
+}
+
+BOOST_AUTO_TEST_CASE(SharedStateVoidValue)
+{
+ SharedState<void> sharedState;
+
+ bool ready = sharedState.WaitFor(100);
+ BOOST_CHECK(!ready);
+
+ sharedState.SetValue();
+
+ ready = sharedState.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ ready = sharedState.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ sharedState.Wait();
+ sharedState.GetValue();
+ sharedState.GetValue();
+
+ BOOST_CHECK_EXCEPTION(sharedState.SetError(IgniteError()), IgniteError, IsFutureError);
+ BOOST_CHECK_EXCEPTION(sharedState.SetValue(), IgniteError, IsFutureError);
+}
+
+BOOST_AUTO_TEST_CASE(SharedStateIntError)
+{
+ SharedState<int> sharedState;
+
+ bool ready = sharedState.WaitFor(100);
+ BOOST_CHECK(!ready);
+
+ sharedState.SetError(IgniteError(IgniteError::IGNITE_ERR_UNKNOWN, "Test"));
+
+ ready = sharedState.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ ready = sharedState.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ sharedState.Wait();
+
+ BOOST_CHECK_EXCEPTION(sharedState.GetValue(), IgniteError, IsUnknownError);
+
+ BOOST_CHECK_EXCEPTION(sharedState.SetValue(MakeAuto(42)), IgniteError, IsFutureError);
+ BOOST_CHECK_EXCEPTION(sharedState.SetError(IgniteError()), IgniteError, IsFutureError);
+}
+
+BOOST_AUTO_TEST_CASE(SharedStateVoidError)
+{
+ SharedState<void> sharedState;
+
+ bool ready = sharedState.WaitFor(100);
+ BOOST_CHECK(!ready);
+
+ sharedState.SetError(IgniteError(IgniteError::IGNITE_ERR_UNKNOWN, "Test"));
+
+ ready = sharedState.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ ready = sharedState.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ sharedState.Wait();
+
+ BOOST_CHECK_EXCEPTION(sharedState.GetValue(), IgniteError, IsUnknownError);
+ BOOST_CHECK_EXCEPTION(sharedState.SetError(IgniteError()), IgniteError, IsFutureError);
+ BOOST_CHECK_EXCEPTION(sharedState.SetValue(), IgniteError, IsFutureError);
+}
+
+BOOST_AUTO_TEST_CASE(FutureIntValue)
+{
+ Promise<int> promise;
+ int expected = 42;
+
+ Future<int> future1 = promise.GetFuture();
+ Future<int> future2 = promise.GetFuture();
+
+ bool ready = future1.WaitFor(100);
+ BOOST_CHECK(!ready);
+
+ ready = future2.WaitFor(100);
+ BOOST_CHECK(!ready);
+
+ promise.SetValue(MakeAuto(expected));
+
+ ready = future1.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ ready = future1.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ ready = future2.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ ready = future2.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ future2.Wait();
+ future1.Wait();
+
+ int val1 = future1.GetValue();
+
+ BOOST_CHECK_EQUAL(val1, expected);
+
+ int val2 = future1.GetValue();
+
+ BOOST_CHECK_EQUAL(val2, expected);
+
+ int val3 = future2.GetValue();
+
+ BOOST_CHECK_EQUAL(val3, expected);
+
+ int val4 = future2.GetValue();
+
+ BOOST_CHECK_EQUAL(val4, expected);
+
+ BOOST_CHECK_EXCEPTION(promise.SetValue(MakeAuto(0)), IgniteError, IsFutureError);
+ BOOST_CHECK_EXCEPTION(promise.SetValue(MakeAuto(expected)), IgniteError, IsFutureError);
+ BOOST_CHECK_EXCEPTION(promise.SetError(IgniteError()), IgniteError, IsFutureError);
+}
+
+BOOST_AUTO_TEST_CASE(FutureStringValue)
+{
+ Promise<std::string> promise;
+ std::string expected = "Lorem Ipsum";
+
+ Future<std::string> future1 = promise.GetFuture();
+ Future<std::string> future2 = promise.GetFuture();
+
+ bool ready = future1.WaitFor(100);
+ BOOST_CHECK(!ready);
+
+ ready = future2.WaitFor(100);
+ BOOST_CHECK(!ready);
+
+ promise.SetValue(MakeAuto(expected));
+
+ ready = future1.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ ready = future1.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ ready = future2.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ ready = future2.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ future2.Wait();
+ future1.Wait();
+
+ std::string val1 = future1.GetValue();
+
+ BOOST_CHECK_EQUAL(val1, expected);
+
+ std::string val2 = future1.GetValue();
+
+ BOOST_CHECK_EQUAL(val2, expected);
+
+ std::string val3 = future2.GetValue();
+
+ BOOST_CHECK_EQUAL(val3, expected);
+
+ std::string val4 = future2.GetValue();
+
+ BOOST_CHECK_EQUAL(val4, expected);
+
+ BOOST_CHECK_EXCEPTION(promise.SetValue(MakeAuto(std::string("Hello Ignite"))), IgniteError, IsFutureError);
+ BOOST_CHECK_EXCEPTION(promise.SetValue(MakeAuto(expected)), IgniteError, IsFutureError);
+ BOOST_CHECK_EXCEPTION(promise.SetError(IgniteError()), IgniteError, IsFutureError);
+}
+
+BOOST_AUTO_TEST_CASE(FutureVoidValue)
+{
+ Promise<void> promise;
+
+ Future<void> future1 = promise.GetFuture();
+ Future<void> future2 = promise.GetFuture();
+
+ bool ready = future1.WaitFor(100);
+ BOOST_CHECK(!ready);
+
+ ready = future2.WaitFor(100);
+ BOOST_CHECK(!ready);
+
+ promise.SetValue();
+
+ ready = future1.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ ready = future1.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ ready = future2.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ ready = future2.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ future2.Wait();
+ future1.Wait();
+
+ future1.GetValue();
+ future1.GetValue();
+ future2.GetValue();
+ future2.GetValue();
+
+ BOOST_CHECK_EXCEPTION(promise.SetValue(), IgniteError, IsFutureError);
+ BOOST_CHECK_EXCEPTION(promise.SetValue(), IgniteError, IsFutureError);
+ BOOST_CHECK_EXCEPTION(promise.SetError(IgniteError()), IgniteError, IsFutureError);
+}
+
+BOOST_AUTO_TEST_CASE(FutureIntError)
+{
+ Promise<int> promise;
+
+ Future<int> future1 = promise.GetFuture();
+ Future<int> future2 = promise.GetFuture();
+
+ bool ready = future1.WaitFor(100);
+ BOOST_CHECK(!ready);
+
+ ready = future2.WaitFor(100);
+ BOOST_CHECK(!ready);
+
+ promise.SetError(IgniteError(IgniteError::IGNITE_ERR_UNKNOWN, "Test"));
+
+ ready = future1.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ ready = future1.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ ready = future2.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ ready = future2.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ future2.Wait();
+ future1.Wait();
+
+ BOOST_CHECK_EXCEPTION(future1.GetValue(), IgniteError, IsUnknownError);
+ BOOST_CHECK_EXCEPTION(future2.GetValue(), IgniteError, IsUnknownError);
+
+ BOOST_CHECK_EXCEPTION(promise.SetValue(MakeAuto(42)), IgniteError, IsFutureError);
+ BOOST_CHECK_EXCEPTION(promise.SetError(IgniteError()), IgniteError, IsFutureError);
+}
+
+BOOST_AUTO_TEST_CASE(FutureVoidError)
+{
+ Promise<void> promise;
+
+ Future<void> future1 = promise.GetFuture();
+ Future<void> future2 = promise.GetFuture();
+
+ bool ready = future1.WaitFor(100);
+ BOOST_CHECK(!ready);
+
+ ready = future2.WaitFor(100);
+ BOOST_CHECK(!ready);
+
+ promise.SetError(IgniteError(IgniteError::IGNITE_ERR_UNKNOWN, "Test"));
+
+ ready = future1.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ ready = future1.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ ready = future2.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ ready = future2.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ future2.Wait();
+ future1.Wait();
+
+ BOOST_CHECK_EXCEPTION(future1.GetValue(), IgniteError, IsUnknownError);
+ BOOST_CHECK_EXCEPTION(future2.GetValue(), IgniteError, IsUnknownError);
+
+ BOOST_CHECK_EXCEPTION(promise.SetValue(), IgniteError, IsFutureError);
+ BOOST_CHECK_EXCEPTION(promise.SetError(IgniteError()), IgniteError, IsFutureError);
+}
+
+BOOST_AUTO_TEST_CASE(FutureIntBroken)
+{
+ Promise<int>* promise = new Promise<int>();
+
+ Future<int> future1 = promise->GetFuture();
+ Future<int> future2 = promise->GetFuture();
+
+ bool ready = future1.WaitFor(100);
+ BOOST_CHECK(!ready);
+
+ ready = future2.WaitFor(100);
+ BOOST_CHECK(!ready);
+
+ delete promise;
+
+ ready = future1.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ ready = future1.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ ready = future2.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ ready = future2.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ future2.Wait();
+ future1.Wait();
+
+ BOOST_CHECK_EXCEPTION(future1.GetValue(), IgniteError, IsFutureError);
+ BOOST_CHECK_EXCEPTION(future2.GetValue(), IgniteError, IsFutureError);
+}
+
+BOOST_AUTO_TEST_CASE(FutureVoidBroken)
+{
+ Promise<void>* promise = new Promise<void>();
+
+ Future<void> future1 = promise->GetFuture();
+ Future<void> future2 = promise->GetFuture();
+
+ bool ready = future1.WaitFor(100);
+ BOOST_CHECK(!ready);
+
+ ready = future2.WaitFor(100);
+ BOOST_CHECK(!ready);
+
+ delete promise;
+
+ ready = future1.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ ready = future1.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ ready = future2.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ ready = future2.WaitFor(100);
+ BOOST_REQUIRE(ready);
+
+ future2.Wait();
+ future1.Wait();
+
+ BOOST_CHECK_EXCEPTION(future1.GetValue(), IgniteError, IsFutureError);
+ BOOST_CHECK_EXCEPTION(future2.GetValue(), IgniteError, IsFutureError);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
[31/67] [abbrv] ignite git commit: Merge branch 'ignite-2.0'
Posted by sb...@apache.org.
Merge branch 'ignite-2.0'
# Conflicts:
# modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorMultiNodeConfigSelfTest.java
# modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorMultiNodeSelfTest.java
# modules/hibernate-4.2/pom.xml
# modules/hibernate-5.1/pom.xml
# modules/ml/src/main/java/org/apache/ignite/ml/math/ValueMapper.java
# modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/RandomVector.java
# modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SingleElementVector.java
# modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixStorageFixtures.java
# pom.xml
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/402154c6
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/402154c6
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/402154c6
Branch: refs/heads/ignite-5075
Commit: 402154c657a06e581e4a0bf24ada42010ec60ac0
Parents: f328c4e 6998785
Author: devozerov <vo...@gridgain.com>
Authored: Wed Apr 26 16:13:13 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Wed Apr 26 16:13:13 2017 +0300
----------------------------------------------------------------------
assembly/dependencies-fabric.xml | 5 +-
assembly/release-fabric-base.xml | 5 -
config/dotnet/default-dotnet.xml | 45 -
examples/pom-standalone-lgpl.xml | 2 +-
examples/pom-standalone.xml | 2 +-
examples/pom.xml | 38 +-
.../hibernate/HibernateL2CacheExample.java | 12 +-
.../examples/datagrid/CacheQueryExample.java | 54 +-
.../streaming/wordcount/QueryWords.java | 3 +-
.../examples/IndexingBridgeMethodTest.java | 93 -
.../IgniteExamplesJ8SelfTestSuite.java | 2 -
.../apache/ignite/gridify/AbstractAopTest.java | 4 +-
.../gridify/ExternalNonSpringAopSelfTest.java | 6 +-
.../benchmarks/jmh/tree/BPlusTreeBenchmark.java | 1 +
.../cassandra/common/PropertyMappingHelper.java | 21 +-
.../persistence/KeyPersistenceSettings.java | 18 +-
.../store/cassandra/persistence/PojoField.java | 21 +-
.../cassandra/persistence/PojoKeyField.java | 7 -
.../cassandra/persistence/PojoValueField.java | 6 -
.../persistence/ValuePersistenceSettings.java | 12 +-
.../org/apache/ignite/tests/pojos/Person.java | 10 +-
.../org/apache/ignite/tests/pojos/Product.java | 7 -
.../apache/ignite/tests/pojos/ProductOrder.java | 8 -
.../jdbc2/JdbcAbstractDmlStatementSelfTest.java | 92 +-
...BinaryMarshallerInsertStatementSelfTest.java | 9 +-
...cBinaryMarshallerMergeStatementSelfTest.java | 9 +-
.../jdbc2/JdbcDynamicIndexAbstractSelfTest.java | 367 ++++
...namicIndexAtomicPartitionedNearSelfTest.java | 26 +
...bcDynamicIndexAtomicPartitionedSelfTest.java | 39 +
...dbcDynamicIndexAtomicReplicatedSelfTest.java | 39 +
...dexTransactionalPartitionedNearSelfTest.java | 26 +
...icIndexTransactionalPartitionedSelfTest.java | 39 +
...micIndexTransactionalReplicatedSelfTest.java | 39 +
.../jdbc2/JdbcInsertStatementSelfTest.java | 4 +-
.../internal/jdbc2/JdbcResultSetSelfTest.java | 2 +-
.../JettyRestProcessorAbstractSelfTest.java | 10 +
.../jdbc/suite/IgniteJdbcDriverTestSuite.java | 8 +
.../clients/src/test/resources/spring-cache.xml | 1 -
.../src/main/java/org/apache/ignite/Ignite.java | 1 -
.../java/org/apache/ignite/IgniteCache.java | 11 -
.../java/org/apache/ignite/IgniteCompute.java | 14 +
.../org/apache/ignite/IgniteFileSystem.java | 6 +-
.../apache/ignite/IgniteSystemProperties.java | 8 +
.../org/apache/ignite/cache/QueryEntity.java | 101 +-
.../org/apache/ignite/cache/QueryIndex.java | 9 +
.../org/apache/ignite/cache/query/Query.java | 48 +
.../ignite/cache/query/SqlFieldsQuery.java | 26 +
.../org/apache/ignite/cache/query/SqlQuery.java | 26 +
.../cache/query/annotations/QuerySqlField.java | 2 +-
.../cache/query/annotations/QueryTextField.java | 4 +-
.../store/jdbc/CacheAbstractJdbcStore.java | 66 +-
.../cache/store/jdbc/CacheJdbcPojoStore.java | 1 -
.../apache/ignite/cluster/ClusterMetrics.java | 4 +-
.../org/apache/ignite/cluster/ClusterNode.java | 11 +-
.../configuration/CacheConfiguration.java | 138 +-
.../configuration/DataPageEvictionMode.java | 10 +-
.../configuration/ExecutorConfiguration.java | 115 +
.../configuration/FileSystemConfiguration.java | 259 +--
.../configuration/IgniteConfiguration.java | 82 +-
.../configuration/MemoryConfiguration.java | 27 +-
.../MemoryPolicyConfiguration.java | 40 +-
.../org/apache/ignite/events/CacheEvent.java | 3 -
.../java/org/apache/ignite/events/Event.java | 1 -
.../org/apache/ignite/events/EventType.java | 111 +-
.../apache/ignite/events/SwapSpaceEvent.java | 105 -
.../org/apache/ignite/igfs/IgfsMetrics.java | 5 +-
.../igfs/secondary/IgfsSecondaryFileSystem.java | 4 +-
.../local/LocalIgfsSecondaryFileSystem.java | 2 +-
.../ignite/internal/ExecutorAwareMessage.java | 31 +
.../apache/ignite/internal/GridComponent.java | 5 +-
.../ignite/internal/GridJobExecuteRequest.java | 32 +-
.../ignite/internal/GridKernalContext.java | 15 +
.../ignite/internal/GridKernalContextImpl.java | 25 +-
.../ignite/internal/GridTaskSessionImpl.java | 15 +-
.../org/apache/ignite/internal/GridTopic.java | 5 +-
.../ignite/internal/IgniteComputeImpl.java | 71 +-
.../org/apache/ignite/internal/IgniteEx.java | 2 +-
.../apache/ignite/internal/IgniteKernal.java | 38 +-
.../org/apache/ignite/internal/IgnitionEx.java | 84 +
.../managers/communication/GridIoManager.java | 25 +-
.../managers/communication/GridIoMessage.java | 13 +
.../communication/GridIoMessageFactory.java | 14 +-
.../managers/communication/GridIoPolicy.java | 3 +
.../managers/indexing/GridIndexingManager.java | 44 -
.../optimized/OptimizedMarshaller.java | 3 +-
.../mem/IgniteOutOfMemoryException.java | 51 +
.../internal/mem/OutOfMemoryException.java | 51 -
.../pagemem/impl/PageMemoryNoStoreImpl.java | 16 +-
.../cache/CacheAffinitySharedManager.java | 3 +-
.../processors/cache/CacheMetricsImpl.java | 21 -
.../cache/CachePartitionExchangeWorkerTask.java | 6 +-
.../cache/DynamicCacheChangeRequest.java | 23 +-
.../cache/DynamicCacheDescriptor.java | 50 +-
.../processors/cache/GridCacheAdapter.java | 29 +-
.../processors/cache/GridCacheAtomicFuture.java | 5 -
.../cache/GridCacheBatchSwapEntry.java | 76 -
.../processors/cache/GridCacheContext.java | 23 -
.../processors/cache/GridCacheEntryEx.java | 36 +-
.../GridCacheEntryInfoCollectSwapListener.java | 70 -
.../cache/GridCacheEvictionManager.java | 95 +-
.../processors/cache/GridCacheMapEntry.java | 92 +-
.../processors/cache/GridCacheMvccManager.java | 10 +-
.../GridCachePartitionExchangeManager.java | 36 +-
.../processors/cache/GridCacheProcessor.java | 156 +-
.../processors/cache/GridCacheProxyImpl.java | 24 -
.../cache/GridCacheSharedContext.java | 8 +-
.../processors/cache/GridCacheSwapEntry.java | 82 -
.../cache/GridCacheSwapEntryImpl.java | 339 ---
.../processors/cache/GridCacheSwapListener.java | 33 -
.../cache/GridCacheTryPutFailedException.java | 28 -
.../processors/cache/GridCacheUtils.java | 209 +-
.../cache/IgniteCacheOffheapManager.java | 3 -
.../cache/IgniteCacheOffheapManagerImpl.java | 5 -
.../processors/cache/IgniteCacheProxy.java | 28 +-
.../processors/cache/IgniteInternalCache.java | 18 -
.../IgniteCacheDatabaseSharedManager.java | 146 +-
.../CacheDataStructuresManager.java | 34 +
.../distributed/GridDistributedLockRequest.java | 14 +-
.../distributed/GridDistributedTxMapping.java | 68 +-
.../GridDistributedTxRemoteAdapter.java | 2 +-
.../cache/distributed/dht/GridDhtGetFuture.java | 37 +-
.../dht/GridDhtTransactionalCacheAdapter.java | 1 -
.../cache/distributed/dht/GridDhtTxLocal.java | 2 +-
.../distributed/dht/GridDhtTxPrepareFuture.java | 28 +-
.../dht/GridPartitionedSingleGetFuture.java | 3 -
.../GridDhtAtomicAbstractUpdateFuture.java | 9 +-
.../dht/atomic/GridDhtAtomicCache.java | 92 +-
.../atomic/GridDhtAtomicSingleUpdateFuture.java | 3 -
.../dht/atomic/GridDhtAtomicUpdateFuture.java | 3 -
.../GridNearAtomicAbstractUpdateFuture.java | 79 +-
.../GridNearAtomicSingleUpdateFuture.java | 134 +-
.../dht/atomic/GridNearAtomicUpdateFuture.java | 159 +-
.../dht/preloader/GridDhtPartitionDemander.java | 12 -
.../GridDhtPartitionsExchangeFuture.java | 5 -
.../dht/preloader/GridDhtPreloader.java | 18 +-
.../distributed/near/GridNearAtomicCache.java | 5 -
.../distributed/near/GridNearCacheAdapter.java | 5 -
.../distributed/near/GridNearCacheEntry.java | 4 +-
...arOptimisticSerializableTxPrepareFuture.java | 218 +-
.../near/GridNearOptimisticTxPrepareFuture.java | 95 +-
.../GridNearPessimisticTxPrepareFuture.java | 186 +-
.../near/GridNearSingleGetRequest.java | 4 +-
.../near/GridNearTxFinishFuture.java | 6 +-
.../cache/distributed/near/GridNearTxLocal.java | 30 +-
.../near/GridNearTxPrepareFutureAdapter.java | 30 +-
.../cache/local/GridLocalLockFuture.java | 3 -
.../local/atomic/GridLocalAtomicCache.java | 35 +-
.../cache/query/GridCacheQueryManager.java | 66 +-
.../cache/query/IgniteQueryErrorCode.java | 27 +-
.../cache/store/CacheOsStoreManager.java | 3 +
.../store/GridCacheStoreManagerAdapter.java | 11 +-
.../cache/store/GridCacheWriteBehindStore.java | 614 +++++-
.../cache/transactions/IgniteTxAdapter.java | 16 +-
.../cache/transactions/IgniteTxEntry.java | 39 +-
.../cache/transactions/IgniteTxHandler.java | 49 +-
.../IgniteTxImplicitSingleStateImpl.java | 6 +
.../transactions/IgniteTxLocalAdapter.java | 7 +-
.../cache/transactions/IgniteTxLocalState.java | 10 +
.../cache/transactions/IgniteTxManager.java | 7 +-
.../cache/transactions/IgniteTxState.java | 2 +-
.../cache/transactions/IgniteTxStateImpl.java | 52 +-
.../closure/GridClosureProcessor.java | 154 +-
.../datastructures/DataStructuresProcessor.java | 64 +-
.../datastructures/GridCacheAtomicLongImpl.java | 626 +++---
.../GridCacheAtomicReferenceImpl.java | 356 +++-
.../GridCacheAtomicSequenceImpl.java | 88 +-
.../GridCacheAtomicStampedImpl.java | 341 +--
.../GridCacheCountDownLatchImpl.java | 58 +-
.../datastructures/GridCacheLockImpl.java | 103 +-
.../datastructures/GridCacheQueueProxy.java | 292 +--
.../datastructures/GridCacheSemaphoreImpl.java | 292 ++-
.../datastructures/GridCacheSetProxy.java | 152 +-
.../GridTransactionalCacheQueueImpl.java | 8 +-
.../internal/processors/igfs/IgfsAsyncImpl.java | 6 +-
.../processors/igfs/IgfsDataManager.java | 36 +-
.../internal/processors/igfs/IgfsImpl.java | 30 +-
.../processors/igfs/IgfsIpcHandler.java | 2 +-
.../processors/igfs/IgfsMetaManager.java | 6 +-
.../processors/igfs/IgfsNoopProcessor.java | 4 +-
.../internal/processors/igfs/IgfsProcessor.java | 30 +-
.../processors/igfs/IgfsProcessorAdapter.java | 4 +-
.../igfs/IgfsSecondaryFileSystemImpl.java | 4 +-
.../internal/processors/igfs/IgfsUtils.java | 3 +
.../igfs/client/IgfsClientSetTimesCallable.java | 2 +-
.../IgfsMetaDirectoryListingAddProcessor.java | 5 +-
.../processors/job/GridJobProcessor.java | 41 +-
.../internal/processors/job/GridJobWorker.java | 15 +-
.../platform/PlatformContextImpl.java | 11 -
.../platform/cache/PlatformCache.java | 33 +-
.../platform/cluster/PlatformClusterGroup.java | 17 +
.../utils/PlatformConfigurationUtils.java | 202 +-
.../internal/processors/pool/PoolProcessor.java | 30 +
.../query/GridQueryIndexDescriptor.java | 5 +
.../processors/query/GridQueryIndexing.java | 62 +-
.../processors/query/GridQueryProcessor.java | 1765 ++++++++++++++--
.../query/GridQueryTypeDescriptor.java | 7 +
.../processors/query/IgniteSQLException.java | 7 +
.../query/QueryIndexDescriptorImpl.java | 42 +-
.../processors/query/QueryIndexKey.java | 85 +
.../internal/processors/query/QuerySchema.java | 166 ++
.../query/QueryTypeDescriptorImpl.java | 150 +-
.../internal/processors/query/QueryUtils.java | 298 ++-
.../query/schema/SchemaExchangeWorkerTask.java | 53 +
.../query/schema/SchemaIndexCacheVisitor.java | 33 +
.../schema/SchemaIndexCacheVisitorClosure.java | 42 +
.../schema/SchemaIndexCacheVisitorImpl.java | 197 ++
.../SchemaIndexOperationCancellationToken.java | 53 +
.../processors/query/schema/SchemaKey.java | 59 +
.../SchemaNodeLeaveExchangeWorkerTask.java | 53 +
.../schema/SchemaOperationClientFuture.java | 52 +
.../query/schema/SchemaOperationException.java | 138 ++
.../query/schema/SchemaOperationManager.java | 292 +++
.../query/schema/SchemaOperationWorker.java | 205 ++
.../message/SchemaAbstractDiscoveryMessage.java | 70 +
.../message/SchemaFinishDiscoveryMessage.java | 98 +
.../message/SchemaOperationStatusMessage.java | 168 ++
.../message/SchemaProposeDiscoveryMessage.java | 133 ++
.../operation/SchemaAbstractOperation.java | 67 +
.../operation/SchemaIndexAbstractOperation.java | 40 +
.../operation/SchemaIndexCreateOperation.java | 91 +
.../operation/SchemaIndexDropOperation.java | 68 +
.../handlers/cache/GridCacheCommandHandler.java | 4 +-
.../session/GridTaskSessionProcessor.java | 10 +-
.../processors/task/GridTaskProcessor.java | 69 +-
.../processors/task/GridTaskWorker.java | 3 +-
.../ignite/internal/util/GridIntIterator.java | 33 +
.../ignite/internal/util/GridIntList.java | 26 +-
.../ignite/internal/util/IgniteUtils.java | 21 +-
.../lang/gridfunc/PredicateCollectionView.java | 7 +-
.../util/lang/gridfunc/PredicateMapView.java | 6 -
.../util/lang/gridfunc/PredicateSetView.java | 6 -
.../lang/gridfunc/ReadOnlyCollectionView.java | 6 -
.../lang/gridfunc/ReadOnlyCollectionView2X.java | 6 -
.../lang/gridfunc/TransformCollectionView.java | 7 +-
.../util/lang/gridfunc/TransformMapView.java | 6 -
.../internal/visor/VisorDataTransferObject.java | 15 +-
.../visor/binary/VisorBinaryMetadata.java | 3 +-
.../visor/cache/VisorCacheConfiguration.java | 3 +-
.../visor/cache/VisorCachePartition.java | 87 -
.../visor/cache/VisorCachePartitions.java | 28 +-
.../visor/cache/VisorCachePartitionsTask.java | 20 +-
.../cache/VisorCachePartitionsTaskArg.java | 72 +
.../visor/compute/VisorGatewayTask.java | 91 +-
.../internal/visor/igfs/VisorIgfsMetrics.java | 3 +-
.../visor/node/VisorIgfsConfiguration.java | 78 -
.../visor/node/VisorNodeDataCollectorTask.java | 4 +-
.../node/VisorNodeDataCollectorTaskResult.java | 4 +-
.../org/apache/ignite/spi/IgniteSpiAdapter.java | 32 +
.../spi/IgniteSpiOperationTimeoutHelper.java | 8 +-
.../jobstealing/JobStealingCollisionSpi.java | 2 +-
.../communication/tcp/TcpCommunicationSpi.java | 6 +-
.../ignite/spi/discovery/tcp/ClientImpl.java | 31 +-
.../ignite/spi/discovery/tcp/ServerImpl.java | 142 +-
.../spi/discovery/tcp/TcpDiscoverySpi.java | 143 +-
.../spi/discovery/tcp/TcpDiscoverySpiMBean.java | 26 +-
.../tcp/internal/TcpDiscoveryNode.java | 33 +-
.../TcpDiscoveryClientHeartbeatMessage.java | 72 -
.../TcpDiscoveryClientMetricsUpdateMessage.java | 72 +
.../messages/TcpDiscoveryHeartbeatMessage.java | 338 ---
.../TcpDiscoveryMetricsUpdateMessage.java | 338 +++
.../apache/ignite/spi/indexing/IndexingSpi.java | 19 -
.../spi/indexing/noop/NoopIndexingSpi.java | 10 -
.../adaptive/AdaptiveLoadBalancingSpi.java | 12 +-
.../resources/META-INF/classnames.properties | 58 +-
.../core/src/test/config/load/dsi-load-base.xml | 3 +-
.../src/test/config/load/merge-sort-base.xml | 7 +-
.../test/config/loaders/grid-cfg-2-grids.xml | 6 +-
.../config/streamer/spring-streamer-base.xml | 5 +-
.../java/org/apache/ignite/GridTestJob.java | 19 +
.../java/org/apache/ignite/GridTestTask.java | 18 +-
.../CacheJdbcPojoStoreAbstractSelfTest.java | 19 +-
...BinaryMarshallerStoreKeepBinarySelfTest.java | 28 +
...lerStoreKeepBinaryWithSqlEscapeSelfTest.java | 28 +
.../store/jdbc/CacheJdbcPojoStoreTest.java | 147 +-
.../internal/ClusterNodeMetricsSelfTest.java | 10 +-
.../ignite/internal/GridAffinityMappedTest.java | 5 +-
.../internal/GridAffinityP2PSelfTest.java | 3 +-
.../ignite/internal/GridAffinitySelfTest.java | 3 +-
.../internal/GridCacheRecreateLockTest.java | 78 -
.../GridCancelledJobsMetricsSelfTest.java | 4 +-
...ridFailFastNodeFailureDetectionSelfTest.java | 4 +-
.../GridJobCollisionCancelSelfTest.java | 2 +-
.../IgniteClientReconnectAtomicsTest.java | 15 +-
.../internal/TestRecordingCommunicationSpi.java | 38 +-
.../GridDiscoveryManagerAliveCacheSelfTest.java | 4 +-
.../pagemem/impl/PageMemoryNoLoadSelfTest.java | 2 +-
...CacheExchangeMessageDuplicatedStateTest.java | 8 +-
.../CacheMemoryPolicyConfigurationTest.java | 6 +-
...sCacheTxNearEnabledRandomOperationsTest.java | 28 +
.../cache/CrossCacheTxRandomOperationsTest.java | 23 +-
.../GridCacheAbstractFailoverSelfTest.java | 4 +-
.../cache/GridCacheAbstractFullApiSelfTest.java | 45 -
.../cache/GridCacheAbstractSelfTest.java | 4 +-
.../cache/GridCacheMvccManagerSelfTest.java | 3 +-
.../processors/cache/GridCacheTestEntryEx.java | 22 +-
.../cache/IgniteCacheAbstractTest.java | 10 +-
.../IgniteCacheBinaryObjectsScanSelfTest.java | 11 +-
.../IgniteCacheConfigVariationsFullApiTest.java | 45 -
.../IgniteCacheEntryListenerAbstractTest.java | 2 +-
.../IgniteCacheStoreValueAbstractTest.java | 4 -
.../cache/IgniteOnePhaseCommitInvokeTest.java | 211 ++
.../IgniteTxExceptionAbstractSelfTest.java | 10 -
.../cache/MemoryPolicyConfigValidationTest.java | 6 +-
.../binary/BinaryMetadataUpdatesFlowTest.java | 4 +-
.../MemoryPolicyInitializationTest.java | 307 +++
...eAbstractDataStructuresFailoverSelfTest.java | 64 +-
...CacheAtomicReferenceApiSelfAbstractTest.java | 4 +-
...IgniteDataStructuresNoClassOnServerTest.java | 30 +
.../CacheLateAffinityAssignmentTest.java | 37 +-
.../CacheNoValueClassOnServerNodeTest.java | 112 +-
...tractDistributedByteArrayValuesSelfTest.java | 43 -
.../GridCacheNodeFailureAbstractTest.java | 3 +-
.../distributed/IgniteCache150ClientsTest.java | 2 +-
...heClientMultiNodeUpdateTopologyLockTest.java | 201 ++
.../distributed/IgniteCacheGetRestartTest.java | 2 +-
.../IgniteCacheNearRestartRollbackSelfTest.java | 2 +-
.../IgniteCacheReadFromBackupTest.java | 15 +-
.../IgniteNoClassOnServerAbstractTest.java | 135 ++
.../IgniteTxCachePrimarySyncTest.java | 17 +-
...dCacheColocatedTxSingleThreadedSelfTest.java | 2 +-
.../dht/GridCacheDhtPreloadDelayedSelfTest.java | 2 +-
.../GridCacheDhtPreloadMessageCountTest.java | 2 +-
.../dht/GridNearCacheTxNodeFailureSelfTest.java | 31 -
.../IgniteCachePutRetryAbstractSelfTest.java | 25 +-
...gniteCachePutRetryTransactionalSelfTest.java | 2 +-
.../dht/IgniteCacheTxRecoveryRollbackTest.java | 17 +-
.../dht/IgniteCrossCacheTxSelfTest.java | 8 +
.../atomic/IgniteCacheAtomicProtocolTest.java | 76 +-
...tomicClientOnlyMultiNodeFullApiSelfTest.java | 51 +-
.../near/GridCacheNearMultiGetSelfTest.java | 2 +-
.../near/GridCacheNearMultiNodeSelfTest.java | 2 +-
...achePartitionedMultiNodeFullApiSelfTest.java | 59 -
.../GridCachePartitionedTxSalvageSelfTest.java | 2 +-
...achePartitionedTxSingleThreadedSelfTest.java | 2 +-
...idCacheReplicatedUnswapAdvancedSelfTest.java | 151 --
.../cache/query/IndexingSpiQuerySelfTest.java | 26 +-
.../cache/query/IndexingSpiQueryTxSelfTest.java | 10 -
...idCacheWriteBehindStoreAbstractSelfTest.java | 24 +-
.../GridCacheWriteBehindStoreAbstractTest.java | 4 +
...heWriteBehindStoreMultithreadedSelfTest.java | 88 +-
.../GridCacheWriteBehindStoreSelfTest.java | 159 +-
...ClientWriteBehindStoreNonCoalescingTest.java | 168 ++
...puteCustomExecutorConfigurationSelfTest.java | 85 +
.../IgniteComputeCustomExecutorSelfTest.java | 245 +++
.../processors/database/BPlusTreeSelfTest.java | 7 +-
.../database/FreeListImplSelfTest.java | 8 +-
.../database/MetadataStorageSelfTest.java | 2 +-
...faultIgfsSecondaryFileSystemTestAdapter.java | 2 +-
.../igfs/IgfsAbstractBaseSelfTest.java | 9 -
.../processors/igfs/IgfsAbstractSelfTest.java | 17 +-
...lockMessageSystemPoolStarvationSelfTest.java | 8 +-
.../igfs/IgfsDualAbstractSelfTest.java | 39 +-
.../processors/igfs/IgfsIgniteMock.java | 2 +-
...IgfsLocalSecondaryFileSystemTestAdapter.java | 2 +-
.../processors/igfs/IgfsMaxSizeSelfTest.java | 121 --
.../internal/processors/igfs/IgfsMock.java | 2 +-
.../processors/igfs/IgfsModesSelfTest.java | 130 --
.../igfs/IgfsProcessorValidationSelfTest.java | 19 +-
...gfsSecondaryFileSystemInjectionSelfTest.java | 2 +-
.../IgfsSecondaryFileSystemTestAdapter.java | 2 +-
.../processors/igfs/IgfsSizeSelfTest.java | 55 +-
.../service/GridServiceClientNodeTest.java | 7 +-
...ServiceProcessorMultiNodeConfigSelfTest.java | 23 +-
.../GridServiceProcessorMultiNodeSelfTest.java | 31 +-
.../loadtests/cache/GridCacheSwapLoadTest.java | 320 ---
...ridSingleSplitsNewNodesAbstractLoadTest.java | 11 +-
...idSingleSplitsNewNodesMulticastLoadTest.java | 9 +-
.../p2p/GridP2PSameClassLoaderSelfTest.java | 2 +-
.../discovery/AbstractDiscoverySelfTest.java | 19 +-
...lientDiscoverySpiFailureTimeoutSelfTest.java | 245 ++-
.../tcp/TcpClientDiscoverySpiSelfTest.java | 79 +-
.../spi/discovery/tcp/TcpDiscoverySelfTest.java | 18 +-
.../tcp/TcpDiscoverySpiConfigSelfTest.java | 4 +-
.../TcpDiscoverySpiFailureTimeoutSelfTest.java | 51 +-
.../ignite/testframework/GridTestNode.java | 7 +
.../testframework/junits/GridAbstractTest.java | 19 +-
.../junits/GridTestKernalContext.java | 6 +-
.../ignite/testframework/junits/IgniteMock.java | 4 +
.../junits/common/GridCommonAbstractTest.java | 189 +-
.../multijvm/IgniteCacheProcessProxy.java | 5 -
.../junits/multijvm/IgniteProcessProxy.java | 2 +-
...ObjectsCacheDataStructuresSelfTestSuite.java | 7 +-
.../IgniteCacheFailoverTestSuite.java | 2 -
.../ignite/testsuites/IgniteCacheTestSuite.java | 4 +
.../testsuites/IgniteCacheTestSuite2.java | 7 +
.../testsuites/IgniteCacheTestSuite3.java | 2 -
.../IgniteCacheWriteBehindTestSuite.java | 2 +
.../testsuites/IgniteComputeGridTestSuite.java | 7 +-
.../ignite/testsuites/IgniteIgfsTestSuite.java | 3 -
.../testsuites/IgniteUtilSelfTestSuite.java | 2 +
.../apache/ignite/util/GridIntListSelfTest.java | 153 ++
.../webapp/META-INF/ignite-webapp-config.xml | 1 -
modules/extdata/p2p/pom.xml | 6 +
.../p2p/NoValueClassOnServerAbstractClient.java | 90 +
.../CacheNoValueClassOnServerTestClient.java | 79 +-
...DataStructuresNoClassOnServerTestClient.java | 181 ++
.../query/h2/opt/GridH2SpatialIndex.java | 32 +-
.../h2/GridBinaryH2IndexingGeoSelfTest.java | 35 -
.../query/h2/GridH2IndexingGeoSelfTest.java | 470 -----
.../h2/GridH2IndexingSegmentedGeoSelfTest.java | 37 -
.../query/h2/H2IndexingAbstractGeoSelfTest.java | 673 ++++++
.../query/h2/H2IndexingBinaryGeoSelfTest.java | 30 +
.../H2IndexingBinarySegmentedGeoSelfTest.java | 30 +
.../query/h2/H2IndexingGeoSelfTest.java | 30 +
.../h2/H2IndexingSegmentedGeoSelfTest.java | 30 +
.../testsuites/GeoSpatialIndexingTestSuite.java | 16 +-
.../fs/IgniteHadoopIgfsSecondaryFileSystem.java | 4 +-
.../org/apache/ignite/hadoop/package-info.java | 22 -
.../hadoop/igfs/HadoopIgfsEndpoint.java | 6 +-
...doopIgfsSecondaryFileSystemDelegateImpl.java | 2 +-
.../hadoop/impl/igfs/HadoopIgfsInProc.java | 2 +-
.../resources/META-INF/classnames.properties | 1 +
.../hadoop/impl/HadoopAbstractSelfTest.java | 4 +-
.../impl/HadoopTaskExecutionSelfTest.java | 16 +-
...opClientProtocolMultipleServersSelfTest.java | 8 +-
.../client/HadoopClientProtocolSelfTest.java | 7 +-
.../igfs/HadoopFIleSystemFactorySelfTest.java | 12 +-
.../HadoopIgfs20FileSystemAbstractSelfTest.java | 1 -
...adoopIgfsSecondaryFileSystemTestAdapter.java | 2 +-
...IgniteHadoopFileSystemHandshakeSelfTest.java | 119 +-
modules/hibernate-4.2/README.txt | 48 +
modules/hibernate-4.2/licenses/apache-2.0.txt | 202 ++
modules/hibernate-4.2/pom.xml | 159 ++
.../HibernateAbstractRegionAccessStrategy.java | 102 +
.../hibernate/HibernateCollectionRegion.java | 100 +
.../cache/hibernate/HibernateEntityRegion.java | 112 +
.../hibernate/HibernateGeneralDataRegion.java | 76 +
.../cache/hibernate/HibernateKeyWrapper.java | 73 +
.../hibernate/HibernateNaturalIdRegion.java | 103 +
.../hibernate/HibernateQueryResultsRegion.java | 70 +
.../ignite/cache/hibernate/HibernateRegion.java | 99 +
.../cache/hibernate/HibernateRegionFactory.java | 179 ++
.../hibernate/HibernateTimestampsRegion.java | 39 +
.../HibernateTransactionalDataRegion.java | 84 +
.../ignite/cache/hibernate/package-info.java | 24 +
.../hibernate/CacheHibernateBlobStore.java | 542 +++++
.../CacheHibernateBlobStoreEntry.hbm.xml | 31 +
.../hibernate/CacheHibernateBlobStoreEntry.java | 89 +
.../CacheHibernateBlobStoreFactory.java | 235 +++
.../CacheHibernateStoreSessionListener.java | 222 ++
.../cache/store/hibernate/package-info.java | 22 +
.../src/test/config/factory-cache.xml | 59 +
.../src/test/config/factory-cache1.xml | 61 +
.../config/factory-incorrect-store-cache.xml | 56 +
.../HibernateL2CacheConfigurationSelfTest.java | 409 ++++
.../hibernate/HibernateL2CacheMultiJvmTest.java | 440 ++++
.../hibernate/HibernateL2CacheSelfTest.java | 1954 +++++++++++++++++
.../HibernateL2CacheTransactionalSelfTest.java | 154 ++
...nateL2CacheTransactionalUseSyncSelfTest.java | 31 +
.../CacheHibernateBlobStoreNodeRestartTest.java | 46 +
.../CacheHibernateBlobStoreSelfTest.java | 113 +
.../CacheHibernateStoreFactorySelfTest.java | 288 +++
...heHibernateStoreSessionListenerSelfTest.java | 238 +++
.../cache/store/hibernate/hibernate.cfg.xml | 42 +
.../cache/store/hibernate/package-info.java | 22 +
.../IgniteBinaryHibernateTestSuite.java | 37 +
.../testsuites/IgniteHibernateTestSuite.java | 57 +
modules/hibernate-5.1/README.txt | 48 +
modules/hibernate-5.1/licenses/apache-2.0.txt | 202 ++
modules/hibernate-5.1/pom.xml | 159 ++
.../HibernateAbstractRegionAccessStrategy.java | 103 +
.../hibernate/HibernateCollectionRegion.java | 114 +
.../cache/hibernate/HibernateEntityRegion.java | 128 ++
.../hibernate/HibernateGeneralDataRegion.java | 79 +
.../cache/hibernate/HibernateKeyWrapper.java | 109 +
.../hibernate/HibernateNaturalIdRegion.java | 113 +
.../hibernate/HibernateQueryResultsRegion.java | 70 +
.../ignite/cache/hibernate/HibernateRegion.java | 99 +
.../cache/hibernate/HibernateRegionFactory.java | 168 ++
.../hibernate/HibernateTimestampsRegion.java | 39 +
.../HibernateTransactionalDataRegion.java | 84 +
.../ignite/cache/hibernate/package-info.java | 24 +
.../hibernate/CacheHibernateBlobStore.java | 543 +++++
.../CacheHibernateBlobStoreEntry.hbm.xml | 31 +
.../hibernate/CacheHibernateBlobStoreEntry.java | 89 +
.../CacheHibernateBlobStoreFactory.java | 235 +++
.../CacheHibernateStoreSessionListener.java | 224 ++
.../cache/store/hibernate/package-info.java | 22 +
.../src/test/config/factory-cache.xml | 59 +
.../src/test/config/factory-cache1.xml | 61 +
.../config/factory-incorrect-store-cache.xml | 56 +
.../HibernateL2CacheConfigurationSelfTest.java | 407 ++++
.../hibernate/HibernateL2CacheMultiJvmTest.java | 429 ++++
.../hibernate/HibernateL2CacheSelfTest.java | 1960 ++++++++++++++++++
.../HibernateL2CacheTransactionalSelfTest.java | 154 ++
...nateL2CacheTransactionalUseSyncSelfTest.java | 31 +
.../CacheHibernateBlobStoreNodeRestartTest.java | 46 +
.../CacheHibernateBlobStoreSelfTest.java | 114 +
.../CacheHibernateStoreFactorySelfTest.java | 256 +++
...heHibernateStoreSessionListenerSelfTest.java | 242 +++
.../cache/store/hibernate/hibernate.cfg.xml | 42 +
.../cache/store/hibernate/package-info.java | 22 +
.../IgniteBinaryHibernate5TestSuite.java | 37 +
.../testsuites/IgniteHibernate5TestSuite.java | 57 +
modules/hibernate-core/pom.xml | 76 +
.../HibernateAccessStrategyAdapter.java | 340 +++
.../HibernateAccessStrategyFactory.java | 235 +++
.../cache/hibernate/HibernateCacheProxy.java | 801 +++++++
.../hibernate/HibernateExceptionConverter.java | 29 +
.../hibernate/HibernateKeyTransformer.java | 29 +
.../HibernateNonStrictAccessStrategy.java | 230 ++
.../HibernateReadOnlyAccessStrategy.java | 105 +
.../HibernateReadWriteAccessStrategy.java | 326 +++
.../HibernateTransactionalAccessStrategy.java | 141 ++
.../ignite/cache/hibernate/package-info.java | 24 +
modules/hibernate/README.txt | 48 -
modules/hibernate/licenses/apache-2.0.txt | 202 --
modules/hibernate/pom.xml | 146 --
.../HibernateAbstractRegionAccessStrategy.java | 98 -
.../HibernateAccessStrategyAdapter.java | 379 ----
.../cache/hibernate/HibernateCacheProxy.java | 811 --------
.../hibernate/HibernateCollectionRegion.java | 100 -
.../cache/hibernate/HibernateEntityRegion.java | 112 -
.../hibernate/HibernateGeneralDataRegion.java | 71 -
.../hibernate/HibernateKeyTransformer.java | 28 -
.../cache/hibernate/HibernateKeyWrapper.java | 72 -
.../hibernate/HibernateNaturalIdRegion.java | 100 -
.../HibernateNonStrictAccessStrategy.java | 222 --
.../hibernate/HibernateQueryResultsRegion.java | 70 -
.../HibernateReadOnlyAccessStrategy.java | 107 -
.../HibernateReadWriteAccessStrategy.java | 328 ---
.../ignite/cache/hibernate/HibernateRegion.java | 99 -
.../cache/hibernate/HibernateRegionFactory.java | 266 ---
.../hibernate/HibernateTimestampsRegion.java | 39 -
.../HibernateTransactionalAccessStrategy.java | 141 --
.../HibernateTransactionalDataRegion.java | 107 -
.../ignite/cache/hibernate/package-info.java | 24 -
.../hibernate/CacheHibernateBlobStore.java | 542 -----
.../CacheHibernateBlobStoreEntry.hbm.xml | 31 -
.../hibernate/CacheHibernateBlobStoreEntry.java | 89 -
.../CacheHibernateBlobStoreFactory.java | 235 ---
.../CacheHibernateStoreSessionListener.java | 222 --
.../cache/store/hibernate/package-info.java | 22 -
.../hibernate/src/test/config/factory-cache.xml | 59 -
.../src/test/config/factory-cache1.xml | 61 -
.../config/factory-incorrect-store-cache.xml | 56 -
.../HibernateL2CacheConfigurationSelfTest.java | 408 ----
.../hibernate/HibernateL2CacheSelfTest.java | 1949 -----------------
.../HibernateL2CacheTransactionalSelfTest.java | 154 --
...nateL2CacheTransactionalUseSyncSelfTest.java | 31 -
.../CacheHibernateBlobStoreNodeRestartTest.java | 46 -
.../CacheHibernateBlobStoreSelfTest.java | 113 -
.../CacheHibernateStoreFactorySelfTest.java | 285 ---
...heHibernateStoreSessionListenerSelfTest.java | 238 ---
.../cache/store/hibernate/hibernate.cfg.xml | 42 -
.../cache/store/hibernate/package-info.java | 22 -
.../IgniteBinaryHibernateTestSuite.java | 37 -
.../testsuites/IgniteHibernateTestSuite.java | 57 -
modules/hibernate5/README.txt | 48 -
modules/hibernate5/licenses/apache-2.0.txt | 202 --
modules/hibernate5/pom.xml | 146 --
.../HibernateAbstractRegionAccessStrategy.java | 99 -
.../HibernateAccessStrategyAdapter.java | 379 ----
.../cache/hibernate/HibernateCacheProxy.java | 811 --------
.../hibernate/HibernateCollectionRegion.java | 114 -
.../cache/hibernate/HibernateEntityRegion.java | 129 --
.../hibernate/HibernateGeneralDataRegion.java | 72 -
.../hibernate/HibernateKeyTransformer.java | 28 -
.../cache/hibernate/HibernateKeyWrapper.java | 108 -
.../hibernate/HibernateNaturalIdRegion.java | 113 -
.../HibernateNonStrictAccessStrategy.java | 222 --
.../hibernate/HibernateQueryResultsRegion.java | 70 -
.../HibernateReadOnlyAccessStrategy.java | 107 -
.../HibernateReadWriteAccessStrategy.java | 328 ---
.../ignite/cache/hibernate/HibernateRegion.java | 99 -
.../cache/hibernate/HibernateRegionFactory.java | 255 ---
.../hibernate/HibernateTimestampsRegion.java | 39 -
.../HibernateTransactionalAccessStrategy.java | 141 --
.../HibernateTransactionalDataRegion.java | 107 -
.../ignite/cache/hibernate/package-info.java | 24 -
.../hibernate/CacheHibernateBlobStore.java | 542 -----
.../CacheHibernateBlobStoreEntry.hbm.xml | 31 -
.../hibernate/CacheHibernateBlobStoreEntry.java | 89 -
.../CacheHibernateBlobStoreFactory.java | 235 ---
.../CacheHibernateStoreSessionListener.java | 223 --
.../cache/store/hibernate/package-info.java | 22 -
.../src/test/config/factory-cache.xml | 59 -
.../src/test/config/factory-cache1.xml | 61 -
.../config/factory-incorrect-store-cache.xml | 56 -
.../HibernateL2CacheConfigurationSelfTest.java | 409 ----
.../hibernate/HibernateL2CacheSelfTest.java | 1948 -----------------
.../HibernateL2CacheTransactionalSelfTest.java | 154 --
...nateL2CacheTransactionalUseSyncSelfTest.java | 31 -
.../CacheHibernateBlobStoreNodeRestartTest.java | 46 -
.../CacheHibernateBlobStoreSelfTest.java | 113 -
.../CacheHibernateStoreFactorySelfTest.java | 326 ---
...heHibernateStoreSessionListenerSelfTest.java | 241 ---
.../cache/store/hibernate/hibernate.cfg.xml | 42 -
.../cache/store/hibernate/package-info.java | 22 -
.../IgniteBinaryHibernate5TestSuite.java | 37 -
.../testsuites/IgniteHibernate5TestSuite.java | 57 -
.../query/h2/DmlStatementsProcessor.java | 49 +-
.../processors/query/h2/IgniteH2Indexing.java | 774 ++++---
.../query/h2/database/H2PkHashIndex.java | 6 +-
.../query/h2/database/H2TreeIndex.java | 6 +-
.../query/h2/database/InlineIndexHelper.java | 14 -
.../query/h2/ddl/DdlStatementsProcessor.java | 211 ++
.../query/h2/opt/GridH2AbstractKeyValueRow.java | 89 +-
.../query/h2/opt/GridH2IndexBase.java | 40 +-
.../query/h2/opt/GridH2KeyValueRowOffheap.java | 70 -
.../query/h2/opt/GridH2MetaTable.java | 8 +-
.../query/h2/opt/GridH2PrimaryScanIndex.java | 90 +
.../processors/query/h2/opt/GridH2Row.java | 2 +-
.../query/h2/opt/GridH2RowDescriptor.java | 11 -
.../query/h2/opt/GridH2ScanIndex.java | 4 +-
.../query/h2/opt/GridH2SystemIndexFactory.java | 38 +
.../processors/query/h2/opt/GridH2Table.java | 472 ++---
.../query/h2/opt/GridH2TreeIndex.java | 7 +-
.../query/h2/opt/GridLuceneIndex.java | 10 +-
.../processors/query/h2/sql/DmlAstUtils.java | 3 -
.../processors/query/h2/sql/GridSqlAlias.java | 20 +-
.../query/h2/sql/GridSqlCreateIndex.java | 121 ++
.../query/h2/sql/GridSqlDropIndex.java | 82 +
.../query/h2/sql/GridSqlQueryParser.java | 127 ++
.../processors/query/h2/sql/GridSqlTable.java | 46 +
.../query/h2/twostep/GridMapQueryExecutor.java | 5 +-
.../query/h2/twostep/GridMergeIndex.java | 1 +
.../query/h2/twostep/GridMergeIndexSorted.java | 6 +-
.../h2/twostep/GridMergeIndexUnsorted.java | 6 +-
.../query/h2/twostep/GridMergeTable.java | 12 +-
.../h2/twostep/GridReduceQueryExecutor.java | 251 ++-
.../query/h2/twostep/GridThreadLocalTable.java | 14 +-
.../h2/twostep/msg/GridH2QueryRequest.java | 64 +-
...ryDuplicateIndexObjectsAbstractSelfTest.java | 159 --
.../cache/GridCacheOffHeapSelfTest.java | 476 -----
.../cache/GridCacheQueryTestValue.java | 2 +-
.../IgniteCacheAbstractFieldsQuerySelfTest.java | 39 +-
.../cache/IgniteCacheDistributedJoinTest.java | 6 +-
...IgniteCacheJoinQueryWithAffinityKeyTest.java | 20 +-
.../IgniteCacheQueryMultiThreadedSelfTest.java | 25 -
.../cache/IgniteCrossCachesJoinsQueryTest.java | 77 +-
...ateIndexObjectPartitionedAtomicSelfTest.java | 38 -
...xObjectPartitionedTransactionalSelfTest.java | 41 -
...stributedPartitionQueryAbstractSelfTest.java | 655 ++++++
...utedPartitionQueryConfigurationSelfTest.java | 92 +
...butedPartitionQueryNodeRestartsSelfTest.java | 114 +
...eCacheDistributedPartitionQuerySelfTest.java | 90 +
.../IgniteCacheQueryNodeRestartSelfTest2.java | 8 +
.../cache/index/AbstractSchemaSelfTest.java | 534 +++++
.../index/DuplicateKeyValueClassesSelfTest.java | 94 +
.../DynamicIndexAbstractBasicSelfTest.java | 1078 ++++++++++
.../DynamicIndexAbstractConcurrentSelfTest.java | 1043 ++++++++++
.../index/DynamicIndexAbstractSelfTest.java | 452 ++++
.../index/DynamicIndexClientBasicSelfTest.java | 28 +
...ndexPartitionedAtomicConcurrentSelfTest.java | 33 +
...titionedTransactionalConcurrentSelfTest.java | 33 +
...IndexReplicatedAtomicConcurrentSelfTest.java | 33 +
...plicatedTransactionalConcurrentSelfTest.java | 33 +
.../index/DynamicIndexServerBasicSelfTest.java | 28 +
...amicIndexServerCoordinatorBasicSelfTest.java | 28 +
...namicIndexServerNodeFIlterBasicSelfTest.java | 28 +
...erverNodeFilterCoordinatorBasicSelfTest.java | 30 +
.../index/H2DynamicIndexAbstractSelfTest.java | 400 ++++
...namicIndexAtomicPartitionedNearSelfTest.java | 26 +
...H2DynamicIndexAtomicPartitionedSelfTest.java | 39 +
.../H2DynamicIndexAtomicReplicatedSelfTest.java | 39 +
...dexTransactionalPartitionedNearSelfTest.java | 26 +
...icIndexTransactionalPartitionedSelfTest.java | 39 +
...micIndexTransactionalReplicatedSelfTest.java | 39 +
.../index/QueryEntityValidationSelfTest.java | 162 ++
.../cache/index/SchemaExchangeSelfTest.java | 632 ++++++
.../local/IgniteCacheLocalQuerySelfTest.java | 2 +-
.../query/IgniteQueryDedicatedPoolTest.java | 11 -
.../query/IgniteSqlSegmentedIndexSelfTest.java | 2 +-
.../query/IgniteSqlSplitterSelfTest.java | 82 +-
.../h2/GridIndexingSpiAbstractSelfTest.java | 109 +-
.../query/h2/IgniteSqlQueryMinMaxTest.java | 16 +-
.../h2/database/InlineIndexHelperTest.java | 11 +-
.../query/h2/opt/GridH2TableSelfTest.java | 171 +-
.../query/h2/sql/GridQueryParsingTest.java | 239 ++-
.../IgniteBinaryCacheQueryTestSuite.java | 5 -
.../IgniteCacheQuerySelfTestSuite.java | 50 +-
.../IgniteCacheQuerySelfTestSuite2.java | 11 +
.../stream/kafka/connect/IgniteSourceTask.java | 4 -
.../java/org/apache/ignite/ml/math/Algebra.java | 107 +-
.../org/apache/ignite/ml/math/Constants.java | 35 +-
.../ignite/ml/math/IdentityValueMapper.java | 3 +-
.../java/org/apache/ignite/ml/math/Matrix.java | 40 +-
.../org/apache/ignite/ml/math/MurmurHash.java | 47 +-
.../java/org/apache/ignite/ml/math/Tracer.java | 4 +-
.../org/apache/ignite/ml/math/ValueMapper.java | 6 +-
.../java/org/apache/ignite/ml/math/Vector.java | 3 +-
.../decompositions/CholeskyDecomposition.java | 10 +-
.../math/decompositions/EigenDecomposition.java | 19 +-
.../ml/math/decompositions/LUDecomposition.java | 18 +-
.../ignite/ml/math/functions/Functions.java | 28 +-
.../functions/IntIntDoubleToVoidFunction.java | 6 +-
.../ml/math/impls/matrix/CacheMatrix.java | 19 +-
.../ml/math/impls/matrix/PivotedMatrixView.java | 38 +-
.../impls/matrix/SparseDistributedMatrix.java | 29 +-
.../storage/matrix/CacheMatrixStorage.java | 25 +-
.../matrix/DenseOffHeapMatrixStorage.java | 23 +-
.../storage/matrix/FunctionMatrixStorage.java | 16 +-
.../matrix/SparseLocalOnHeapMatrixStorage.java | 18 +-
.../storage/vector/CacheVectorStorage.java | 20 +-
.../storage/vector/ConstantVectorStorage.java | 9 +-
.../storage/vector/DelegateVectorStorage.java | 12 +-
.../storage/vector/FunctionVectorStorage.java | 16 +-
.../storage/vector/MatrixVectorStorage.java | 45 +-
.../storage/vector/PivotedVectorStorage.java | 15 +-
.../SingleElementVectorDelegateStorage.java | 12 +-
.../vector/SingleElementVectorStorage.java | 10 +-
.../vector/SparseLocalOffHeapVectorStorage.java | 6 +-
.../vector/SparseLocalOnHeapVectorStorage.java | 9 +-
.../ml/math/impls/vector/AbstractVector.java | 16 +-
.../ml/math/impls/vector/CacheVector.java | 10 +-
.../ml/math/impls/vector/ConstantVector.java | 4 +-
.../ml/math/impls/vector/DelegatingVector.java | 2 +-
.../ml/math/impls/vector/MatrixVectorView.java | 27 +-
.../ml/math/impls/vector/PivotedVectorView.java | 32 +-
.../ml/math/impls/vector/RandomVector.java | 15 +-
.../math/impls/vector/SingleElementVector.java | 10 +-
.../impls/vector/SingleElementVectorView.java | 4 +-
.../ml/math/impls/vector/SparseLocalVector.java | 4 +-
.../org/apache/ignite/ml/math/TracerTest.java | 11 +-
.../ml/math/impls/matrix/CacheMatrixTest.java | 14 +-
.../impls/matrix/MatrixKeyMapperForTests.java | 19 +-
.../storage/matrix/MatrixStorageFixtures.java | 18 +-
.../SparseLocalOffHeapVectorStorageTest.java | 3 +-
.../math/impls/vector/AbstractVectorTest.java | 47 +-
.../ml/math/impls/vector/CacheVectorTest.java | 4 +-
.../osgi-karaf/src/main/resources/features.xml | 2 +-
modules/platforms/cpp/odbc/README.txt | 17 +-
.../ExpiryCacheHolderTest.cs | 10 +
.../Apache.Ignite.Core.Tests.csproj | 9 +
.../Binary/BinaryBuilderSelfTest.cs | 3 +-
.../BinaryBuilderSelfTestDynamicRegistration.cs | 2 +
.../Binary/BinaryBuilderSelfTestSimpleName.cs | 2 +
.../Binary/BinaryCompactFooterInteropTest.cs | 4 +-
.../BinaryConfigurationTest.cs | 4 +-
.../Cache/AddArgCacheEntryProcessor.cs | 91 +
.../Cache/Affinity/AffinityFunctionTest.cs | 3 +-
.../Cache/Affinity/AffinityTest.cs | 10 +-
.../BinarizableAddArgCacheEntryProcessor.cs | 53 +
.../Cache/BinarizableTestException.cs | 51 +
.../Cache/CacheAbstractTest.cs | 476 +----
.../Cache/CacheConfigurationTest.cs | 21 +-
.../Cache/CacheDynamicStartTest.cs | 164 +-
.../Cache/CacheForkedTest.cs | 6 +-
.../Cache/CacheMetricsTest.cs | 3 +-
.../Cache/CacheTestAsyncWrapper.cs | 22 +-
.../Cache/CacheTestKey.cs | 68 +
.../Cache/NonSerializableCacheEntryProcessor.cs | 40 +
.../Cache/NonSerializableException.cs | 40 +
.../Cache/PartitionLossTest.cs | 260 +++
.../Cache/Query/CacheQueriesTest.cs | 35 +-
.../Continuous/ContinuousQueryAbstractTest.cs | 45 +-
.../Continuous/ContinuousQueryJavaFilterTest.cs | 21 +-
.../Query/Continuous/ContinuousQueryTest.cs | 115 +
.../Cache/Store/CacheParallelLoadStoreTest.cs | 9 +-
.../Cache/Store/CacheStoreSessionTest.cs | 15 +-
.../Cache/Store/CacheStoreTest.cs | 17 +-
.../Cache/TestReferenceObject.cs | 40 +
.../Compute/AbstractTaskTest.cs | 29 +-
.../Compute/BinarizableClosureTaskTest.cs | 14 +-
.../Compute/BinarizableTaskTest.cs | 15 -
.../Compute/ComputeApiTest.cs | 9 +-
.../Compute/ComputeApiTestFullFooter.cs | 4 +-
.../Compute/FailoverTaskSelfTest.cs | 6 -
.../Compute/ResourceTaskTest.cs | 60 +-
.../Compute/SerializableClosureTaskTest.cs | 1 +
.../Compute/TaskAdapterTest.cs | 6 -
.../Compute/TaskResultTest.cs | 12 -
.../DataStructures/AtomicReferenceTest.cs | 2 -
.../Dataload/DataStreamerTest.cs | 55 +-
.../Apache.Ignite.Core.Tests/DeploymentTest.cs | 4 +-
.../Apache.Ignite.Core.Tests/EventsTest.cs | 65 +-
.../Apache.Ignite.Core.Tests/ExceptionsTest.cs | 13 +-
.../Apache.Ignite.Core.Tests/ExecutableTest.cs | 57 +-
.../Apache.Ignite.Core.Tests/FutureTest.cs | 18 +-
.../IgniteConfigurationSerializerTest.cs | 58 +-
.../IgniteConfigurationTest.cs | 57 +-
.../IgniteStartStopTest.cs | 55 +-
.../Apache.Ignite.Core.Tests/IgniteTestBase.cs | 51 +-
.../Apache.Ignite.Core.Tests/LifecycleTest.cs | 45 +-
.../Apache.Ignite.Core.Tests/LoadDllTest.cs | 11 +-
.../Apache.Ignite.Core.Tests/MessagingTest.cs | 30 +-
.../Apache.Ignite.Core.Tests/TestUtils.cs | 5 +-
.../Apache.Ignite.Core.csproj | 4 +
.../Cache/Configuration/CacheConfiguration.cs | 35 +
.../Cache/Configuration/DataPageEvictionMode.cs | 59 +
.../Cache/Configuration/MemoryConfiguration.cs | 158 ++
.../Configuration/MemoryPolicyConfiguration.cs | 122 ++
.../Cache/Configuration/PartitionLossPolicy.cs | 68 +
.../dotnet/Apache.Ignite.Core/Cache/ICache.cs | 21 +-
.../Discovery/Tcp/TcpDiscoverySpi.cs | 15 -
.../dotnet/Apache.Ignite.Core/IIgnite.cs | 12 +
.../Apache.Ignite.Core/IgniteConfiguration.cs | 21 +
.../IgniteConfigurationSection.xsd | 112 +-
.../Impl/Binary/BinaryUtils.cs | 207 +-
.../Apache.Ignite.Core/Impl/Cache/CacheImpl.cs | 56 +-
.../Apache.Ignite.Core/Impl/Cache/CacheOp.cs | 6 +-
.../Impl/Cluster/ClusterGroupImpl.cs | 27 +
.../Impl/Common/DelegateConverter.cs | 1 +
.../dotnet/Apache.Ignite.Core/Impl/Ignite.cs | 16 +-
.../Apache.Ignite.Core/Impl/IgniteUtils.cs | 10 +-
.../Apache.Ignite.Core/Impl/NativeMethods.cs | 6 +
.../Impl/Unmanaged/UnmanagedUtils.cs | 8 +-
modules/platforms/dotnet/build.ps1 | 12 +-
.../Datagrid/MultiTieredCacheExample.cs | 2 +-
modules/rocketmq/README.txt | 25 +
modules/rocketmq/pom.xml | 81 +
.../stream/rocketmq/RocketMQStreamer.java | 151 ++
.../ignite/stream/rocketmq/package-info.java | 21 +
.../stream/rocketmq/RocketMQStreamerTest.java | 214 ++
.../rocketmq/RocketMQStreamerTestSuite.java | 37 +
.../stream/rocketmq/TestRocketMQServer.java | 148 ++
.../ignite/stream/rocketmq/package-info.java | 21 +
modules/spring-data/pom.xml | 2 +-
.../support/IgniteRepositoryFactoryBean.java | 7 +
.../apache/ignite/cache/spring/SpringCache.java | 6 +
.../GridSpringResourceInjectionSelfTest.java | 20 +-
.../org/apache/ignite/spring/sprint-exclude.xml | 2 -
.../ignite/p2p/GridP2PDisabledSelfTest.java | 4 +-
modules/web-console/backend/app/mongo.js | 4 -
modules/web-console/backend/index.js | 5 +-
.../list-of-registered-users.column-defs.js | 26 +-
.../list-of-registered-users.controller.js | 163 +-
.../list-of-registered-users.tpl.pug | 25 +-
.../frontend/app/data/event-groups.json | 14 -
.../frontend/app/modules/cluster/Cache.js | 4 -
.../app/modules/cluster/CacheMetrics.js | 4 -
.../generator/AbstractTransformer.js | 5 -
.../generator/ConfigurationGenerator.js | 11 -
.../generator/defaults/IGFS.service.js | 3 -
.../modules/states/configuration/igfs/dual.pug | 42 -
.../modules/states/configuration/igfs/misc.pug | 2 -
.../frontend/app/primitives/badge/index.scss | 1 +
.../frontend/app/primitives/btn/index.scss | 24 +-
.../frontend/app/primitives/dropdown/index.pug | 2 +-
.../frontend/app/primitives/dropdown/index.scss | 26 +-
.../frontend/app/primitives/panel/index.scss | 2 +-
.../app/primitives/ui-grid-header/index.scss | 10 +-
.../app/primitives/ui-grid-header/index.tpl.pug | 10 +-
.../app/primitives/ui-grid-settings/index.scss | 58 +-
.../frontend/app/primitives/ui-grid/index.scss | 149 +-
.../frontend/gulpfile.babel.js/paths.js | 1 +
.../frontend/gulpfile.babel.js/tasks/bundle.js | 2 +-
.../webpack/environments/development.js | 4 +-
.../frontend/public/images/icons/cross.svg | 1 +
.../frontend/public/images/icons/export.svg | 1 +
.../frontend/public/images/icons/gear.svg | 1 +
.../stylesheets/_bootstrap-variables.scss | 4 +-
.../frontend/views/configuration/igfs.tpl.pug | 1 -
.../views/templates/agent-download.tpl.pug | 6 +-
modules/web-console/licenses/cc-by-3.0.txt | 319 +++
modules/web-console/web-agent/pom.xml | 2 +-
.../ignite/console/agent/AgentLauncher.java | 10 +-
.../webapp2/META-INF/ignite-webapp-config.xml | 1 -
.../tcp/ipfinder/zk/ZookeeperIpFinderTest.java | 5 +-
parent/pom.xml | 11 +-
pom.xml | 20 +-
852 files changed, 42002 insertions(+), 29237 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/402154c6/examples/pom.xml
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/402154c6/modules/extdata/p2p/pom.xml
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/402154c6/modules/hibernate-4.2/pom.xml
----------------------------------------------------------------------
diff --cc modules/hibernate-4.2/pom.xml
index 0000000,c597b21..adcf1b1
mode 000000,100644..100644
--- a/modules/hibernate-4.2/pom.xml
+++ b/modules/hibernate-4.2/pom.xml
@@@ -1,0 -1,159 +1,159 @@@
+ <?xml version="1.0" encoding="UTF-8"?>
+
+ <!--
+ 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.
+ -->
+
+ <!--
+ POM file.
+ -->
+ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.ignite</groupId>
+ <artifactId>ignite-parent</artifactId>
+ <version>1</version>
+ <relativePath>../../parent</relativePath>
+ </parent>
+
+ <artifactId>ignite-hibernate_4.2</artifactId>
- <version>2.0.0-SNAPSHOT</version>
++ <version>2.1.0-SNAPSHOT</version>
+ <url>http://ignite.apache.org</url>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.ignite</groupId>
+ <artifactId>ignite-core</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.ignite</groupId>
+ <artifactId>ignite-hibernate-core</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.hibernate</groupId>
+ <artifactId>hibernate-core</artifactId>
+ <version>4.2.21.Final</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.ignite</groupId>
+ <artifactId>ignite-jta</artifactId>
+ <version>${project.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.ow2.jotm</groupId>
+ <artifactId>jotm-core</artifactId>
+ <version>2.1.9</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>commons-dbcp</groupId>
+ <artifactId>commons-dbcp</artifactId>
+ <version>1.4</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>com.h2database</groupId>
+ <artifactId>h2</artifactId>
+ <version>${h2.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>javax.resource</groupId>
+ <artifactId>connector-api</artifactId>
+ <version>1.5</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.ignite</groupId>
+ <artifactId>ignite-core</artifactId>
+ <version>${project.version}</version>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.ignite</groupId>
+ <artifactId>ignite-spring</artifactId>
+ <version>${project.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.ignite</groupId>
+ <artifactId>ignite-log4j</artifactId>
+ <version>${project.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-beans</artifactId>
+ <version>${spring.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-context</artifactId>
+ <version>${spring.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>com.thoughtworks.xstream</groupId>
+ <artifactId>xstream</artifactId>
+ <version>1.4.8</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <testResources>
+ <testResource>
+ <directory>src/main/java</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </testResource>
+ <testResource>
+ <directory>src/test/java</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </testResource>
+ </testResources>
+
+ <plugins>
+ <!-- Generate the OSGi MANIFEST.MF for this bundle. -->
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+ </project>
http://git-wip-us.apache.org/repos/asf/ignite/blob/402154c6/modules/hibernate-5.1/pom.xml
----------------------------------------------------------------------
diff --cc modules/hibernate-5.1/pom.xml
index 0000000,80299bc..8424806
mode 000000,100644..100644
--- a/modules/hibernate-5.1/pom.xml
+++ b/modules/hibernate-5.1/pom.xml
@@@ -1,0 -1,159 +1,159 @@@
+ <?xml version="1.0" encoding="UTF-8"?>
+
+ <!--
+ 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.
+ -->
+
+ <!--
+ POM file.
+ -->
+ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.ignite</groupId>
+ <artifactId>ignite-parent</artifactId>
+ <version>1</version>
+ <relativePath>../../parent</relativePath>
+ </parent>
+
+ <artifactId>ignite-hibernate_5.1</artifactId>
- <version>2.0.0-SNAPSHOT</version>
++ <version>2.1.0-SNAPSHOT</version>
+ <url>http://ignite.apache.org</url>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.ignite</groupId>
+ <artifactId>ignite-core</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.ignite</groupId>
+ <artifactId>ignite-hibernate-core</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.hibernate</groupId>
+ <artifactId>hibernate-core</artifactId>
+ <version>5.1.5.Final</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.ignite</groupId>
+ <artifactId>ignite-jta</artifactId>
+ <version>${project.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.ow2.jotm</groupId>
+ <artifactId>jotm-core</artifactId>
+ <version>2.1.9</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>commons-dbcp</groupId>
+ <artifactId>commons-dbcp</artifactId>
+ <version>1.4</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>com.h2database</groupId>
+ <artifactId>h2</artifactId>
+ <version>${h2.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>javax.resource</groupId>
+ <artifactId>connector-api</artifactId>
+ <version>1.5</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.ignite</groupId>
+ <artifactId>ignite-core</artifactId>
+ <version>${project.version}</version>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.ignite</groupId>
+ <artifactId>ignite-spring</artifactId>
+ <version>${project.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.ignite</groupId>
+ <artifactId>ignite-log4j</artifactId>
+ <version>${project.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-beans</artifactId>
+ <version>${spring.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-context</artifactId>
+ <version>${spring.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>com.thoughtworks.xstream</groupId>
+ <artifactId>xstream</artifactId>
+ <version>1.4.8</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <testResources>
+ <testResource>
+ <directory>src/main/java</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </testResource>
+ <testResource>
+ <directory>src/test/java</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </testResource>
+ </testResources>
+
+ <plugins>
+ <!-- Generate the OSGi MANIFEST.MF for this bundle. -->
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+ </project>
http://git-wip-us.apache.org/repos/asf/ignite/blob/402154c6/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SingleElementVector.java
----------------------------------------------------------------------
diff --cc modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SingleElementVector.java
index cae5ca3,3ec14a2..a5dc64b
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SingleElementVector.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SingleElementVector.java
@@@ -1,102 -1,1 +1,102 @@@
-/*
* 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.ignite.ml.math.impls.vector;
import java.util.Map;
import org.apache.ignite.ml.math.Matrix;
import org.apache.ignite.ml.math.Vector;
import org.apache.ignite.ml.math.except
ions.UnsupportedOperationException;
import org.apache.ignite.ml.math.impls.storage.vector.SingleElementVectorStorage;
/**
* Read-write vector holding a single non-zero value at some index.
*/
public class SingleElementVector extends AbstractVector {
/**
*
*/
public SingleElementVector() {
// No-op
}
/**
* @param size Parent vector size.
* @param idx Index of the parent vector element.
* @param val Value of the vector element.
*/
public SingleElementVector(int size, int idx, double val) {
super(new SingleElementVectorStorage(size, idx, val));
}
/**
* @param args Parameters to create new vector instance.
*/
public SingleElementVector(Map<String, Object> args) {
assert args != null;
if (args.containsKey("size") && args.containsKey("index") && args.containsKey("value")) {
int size = (int)args.get("size");
int idx = (int)args.get("index");
doub
le val = (double)args.get("value");
setStorage(new SingleElementVectorStorage(size, idx, val));
}
else
throw new UnsupportedOperationException("Invalid constructor argument(s).");
}
/**
*
*
*/
private SingleElementVectorStorage storage() {
return (SingleElementVectorStorage)getStorage();
}
/** {@inheritDoc} */
@Override public Element minElement() {
return makeElement(storage().index());
}
/** {@inheritDoc} */
@Override public Element maxElement() {
return makeElement(storage().index());
}
/** {@inheritDoc} */
@Override public double sum() {
return getX(storage().index());
}
/** {@inheritDoc} */
@Override public int nonZeroElements() {
return isZero(get(storage().index())) ? 0 : 1;
}
/** {@inheritDoc} */
@Override public Vector like(int crd) {
int idx = storage().index();
return new SingleElemen
tVector(crd, idx, getX(idx));
}
/** {@inheritDoc} */
@Override public Matrix likeMatrix(int rows, int cols) {
throw new UnsupportedOperationException();
}
}
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import java.util.Map;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.impls.storage.vector.SingleElementVectorStorage;
+
+/**
+ * Read-write vector holding a single non-zero value at some index.
+ */
+public class SingleElementVector extends AbstractVector {
+ /**
+ *
+ */
+ public SingleElementVector() {
+ // No-op
+ }
+
+ /**
- * @param size
- * @param idx
- * @param val
++ * @param size Parent vector size.
++ * @param idx Index of the parent vector element.
++ * @param val Value of the vector element.
+ */
+ public SingleElementVector(int size, int idx, double val) {
+ super(new SingleElementVectorStorage(size, idx, val));
+ }
+
+ /**
- * @param args
++ * @param args Parameters to create new vector instance.
+ */
+ public SingleElementVector(Map<String, Object> args) {
+ assert args != null;
+
+ if (args.containsKey("size") && args.containsKey("index") && args.containsKey("value")) {
+ int size = (int)args.get("size");
+ int idx = (int)args.get("index");
+ double val = (double)args.get("value");
+
+ setStorage(new SingleElementVectorStorage(size, idx, val));
+ }
+ else
+ throw new UnsupportedOperationException("Invalid constructor argument(s).");
+ }
+
+ /**
+ *
+ *
+ */
+ private SingleElementVectorStorage storage() {
+ return (SingleElementVectorStorage)getStorage();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Element minElement() {
+ return makeElement(storage().index());
+ }
+
+ /** {@inheritDoc} */
+ @Override public Element maxElement() {
+ return makeElement(storage().index());
+ }
+
+ /** {@inheritDoc} */
+ @Override public double sum() {
+ return getX(storage().index());
+ }
+
+ /** {@inheritDoc} */
+ @Override public int nonZeroElements() {
+ return isZero(get(storage().index())) ? 0 : 1;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector like(int crd) {
+ int idx = storage().index();
+
+ return new SingleElementVector(crd, idx, getX(idx));
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix likeMatrix(int rows, int cols) {
+ throw new UnsupportedOperationException();
+ }
- }
++}
http://git-wip-us.apache.org/repos/asf/ignite/blob/402154c6/modules/spring-data/pom.xml
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/402154c6/modules/web-console/web-agent/pom.xml
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/402154c6/pom.xml
----------------------------------------------------------------------
[35/67] [abbrv] ignite git commit: master Fixed version.
Posted by sb...@apache.org.
master Fixed version.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/c9a11d45
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/c9a11d45
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/c9a11d45
Branch: refs/heads/ignite-5075
Commit: c9a11d4515559ac68453b8d59a726deaad9c8e0d
Parents: 4787c8b
Author: Alexey Kuznetsov <ak...@apache.org>
Authored: Fri Apr 28 14:01:17 2017 +0700
Committer: Alexey Kuznetsov <ak...@apache.org>
Committed: Fri Apr 28 14:01:55 2017 +0700
----------------------------------------------------------------------
modules/hibernate-core/pom.xml | 2 +-
modules/rocketmq/pom.xml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/c9a11d45/modules/hibernate-core/pom.xml
----------------------------------------------------------------------
diff --git a/modules/hibernate-core/pom.xml b/modules/hibernate-core/pom.xml
index 91ec68b..624dcc8 100644
--- a/modules/hibernate-core/pom.xml
+++ b/modules/hibernate-core/pom.xml
@@ -31,7 +31,7 @@
</parent>
<artifactId>ignite-hibernate-core</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
http://git-wip-us.apache.org/repos/asf/ignite/blob/c9a11d45/modules/rocketmq/pom.xml
----------------------------------------------------------------------
diff --git a/modules/rocketmq/pom.xml b/modules/rocketmq/pom.xml
index 3b317fa..43b1ec4 100644
--- a/modules/rocketmq/pom.xml
+++ b/modules/rocketmq/pom.xml
@@ -32,7 +32,7 @@
</parent>
<artifactId>ignite-rocketmq</artifactId>
- <version>2.0.0-SNAPSHOT</version>
+ <version>2.1.0-SNAPSHOT</version>
<url>http://ignite.apache.org</url>
<dependencies>
[04/67] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math
module to Ignite ML module added missed licenses renamed packages fixed wrong
ml profile activation (cherry picked from commit d78e071)
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixImplementationsTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixImplementationsTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixImplementationsTest.java
new file mode 100644
index 0000000..c827037
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixImplementationsTest.java
@@ -0,0 +1,1113 @@
+/*
+ * 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.ignite.ml.math.impls.matrix;
+
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.BiConsumer;
+import java.util.function.Supplier;
+import org.apache.ignite.ml.math.ExternalizeTest;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.CardinalityException;
+import org.apache.ignite.ml.math.exceptions.ColumnIndexException;
+import org.apache.ignite.ml.math.exceptions.IndexException;
+import org.apache.ignite.ml.math.exceptions.RowIndexException;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.impls.vector.DenseLocalOffHeapVector;
+import org.apache.ignite.ml.math.impls.vector.DenseLocalOnHeapVector;
+import org.apache.ignite.ml.math.impls.vector.RandomVector;
+import org.apache.ignite.ml.math.impls.vector.SparseLocalVector;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+/**
+ * Tests for {@link Matrix} implementations.
+ */
+public class MatrixImplementationsTest extends ExternalizeTest<Matrix> {
+ /** */
+ private static final double DEFAULT_DELTA = 0.000000001d;
+
+ /** */
+ private void consumeSampleMatrix(BiConsumer<Matrix, String> consumer) {
+ new MatrixImplementationFixtures().consumeSampleMatrix(consumer);
+ }
+
+ /** */
+ @Test
+ public void externalizeTest() {
+ consumeSampleMatrix((m, desc) -> externalizeTest(m));
+ }
+
+ /** */
+ @Test
+ public void testLike() {
+ consumeSampleMatrix((m, desc) -> {
+ Class<? extends Matrix> cls = likeMatrixType(m);
+
+ if (cls != null) {
+ Matrix like = m.like(m.rowSize(), m.columnSize());
+
+ assertEquals("Wrong \"like\" matrix for " + desc + "; Unexpected rows.", like.rowSize(), m.rowSize());
+ assertEquals("Wrong \"like\" matrix for " + desc + "; Unexpected columns.", like.columnSize(), m.columnSize());
+
+ assertEquals("Wrong \"like\" matrix for " + desc
+ + "; Unexpected class: " + like.getClass().toString(),
+ cls,
+ like.getClass());
+
+ return;
+ }
+
+ boolean expECaught = false;
+
+ try {
+ m.like(1, 1);
+ }
+ catch (UnsupportedOperationException uoe) {
+ expECaught = true;
+ }
+
+ assertTrue("Expected exception was not caught for " + desc, expECaught);
+ });
+ }
+
+ /** */
+ @Test
+ public void testCopy() {
+ consumeSampleMatrix((m, desc) -> {
+ Matrix cp = m.copy();
+ assertTrue("Incorrect copy for empty matrix " + desc, cp.equals(m));
+
+ if (!readOnly(m))
+ fillMatrix(m);
+
+ cp = m.copy();
+
+ assertTrue("Incorrect copy for matrix " + desc, cp.equals(m));
+ });
+ }
+
+ /** */
+ @Test
+ public void testHaveLikeVector() throws InstantiationException, IllegalAccessException {
+ for (Class<? extends Matrix> key : likeVectorTypesMap().keySet()) {
+ Class<? extends Vector> val = likeVectorTypesMap().get(key);
+
+ if (val == null && !ignore(key))
+ System.out.println("Missing test for implementation of likeMatrix for " + key.getSimpleName());
+ }
+ }
+
+ /** */
+ @Test
+ public void testLikeVector() {
+ consumeSampleMatrix((m, desc) -> {
+ if (likeVectorTypesMap().containsKey(m.getClass())) {
+ Vector likeVector = m.likeVector(m.columnSize());
+
+ assertNotNull(likeVector);
+ assertEquals("Unexpected value for " + desc, likeVector.size(), m.columnSize());
+
+ return;
+ }
+
+ boolean expECaught = false;
+
+ try {
+ m.likeVector(1);
+ }
+ catch (UnsupportedOperationException uoe) {
+ expECaught = true;
+ }
+
+ assertTrue("Expected exception was not caught for " + desc, expECaught);
+ });
+ }
+
+ /** */
+ @Test
+ public void testAssignSingleElement() {
+ consumeSampleMatrix((m, desc) -> {
+ if (ignore(m.getClass()))
+ return;
+
+ final double assignVal = Math.random();
+
+ m.assign(assignVal);
+
+ for (int i = 0; i < m.rowSize(); i++)
+ for (int j = 0; j < m.columnSize(); j++)
+ assertEquals("Unexpected value for " + desc + " at (" + i + "," + j + ")",
+ assignVal, m.get(i, j), 0d);
+ });
+ }
+
+ /** */
+ @Test
+ public void testAssignArray() {
+ consumeSampleMatrix((m, desc) -> {
+ if (ignore(m.getClass()))
+ return;
+
+ double[][] data = new double[m.rowSize()][m.columnSize()];
+
+ for (int i = 0; i < m.rowSize(); i++)
+ for (int j = 0; j < m.columnSize(); j++)
+ data[i][j] = Math.random();
+
+ m.assign(data);
+
+ for (int i = 0; i < m.rowSize(); i++) {
+ for (int j = 0; j < m.columnSize(); j++)
+ assertEquals("Unexpected value for " + desc + " at (" + i + "," + j + ")",
+ data[i][j], m.get(i, j), 0d);
+ }
+ });
+ }
+
+ /** */
+ @Test
+ public void testAssignFunction() {
+ consumeSampleMatrix((m, desc) -> {
+ if (ignore(m.getClass()))
+ return;
+
+ m.assign((i, j) -> (double)(i * m.columnSize() + j));
+
+ for (int i = 0; i < m.rowSize(); i++) {
+ for (int j = 0; j < m.columnSize(); j++)
+ assertEquals("Unexpected value for " + desc + " at (" + i + "," + j + ")",
+ (double)(i * m.columnSize() + j), m.get(i, j), 0d);
+ }
+ });
+ }
+
+ /** */
+ @Test
+ public void testPlus() {
+ consumeSampleMatrix((m, desc) -> {
+ if (readOnly(m))
+ return;
+
+ double[][] data = fillAndReturn(m);
+
+ double plusVal = Math.random();
+
+ Matrix plus = m.plus(plusVal);
+
+ for (int i = 0; i < m.rowSize(); i++)
+ for (int j = 0; j < m.columnSize(); j++)
+ assertEquals("Unexpected value for " + desc + " at (" + i + "," + j + ")",
+ data[i][j] + plusVal, plus.get(i, j), 0d);
+ });
+ }
+
+ /** */
+ @Test
+ public void testPlusMatrix() {
+ consumeSampleMatrix((m, desc) -> {
+ if (ignore(m.getClass()))
+ return;
+
+ double[][] data = fillAndReturn(m);
+
+ Matrix plus = m.plus(m);
+
+ for (int i = 0; i < m.rowSize(); i++)
+ for (int j = 0; j < m.columnSize(); j++)
+ assertEquals("Unexpected value for " + desc + " at (" + i + "," + j + ")",
+ data[i][j] * 2.0, plus.get(i, j), 0d);
+ });
+ }
+
+ /** */
+ @Test
+ public void testMinusMatrix() {
+ consumeSampleMatrix((m, desc) -> {
+ if (ignore(m.getClass()))
+ return;
+
+ fillMatrix(m);
+
+ Matrix minus = m.minus(m);
+
+ for (int i = 0; i < m.rowSize(); i++)
+ for (int j = 0; j < m.columnSize(); j++)
+ assertEquals("Unexpected value for " + desc + " at (" + i + "," + j + ")",
+ 0.0, minus.get(i, j), 0d);
+ });
+ }
+
+ /** */
+ @Test
+ public void testTimes() {
+ consumeSampleMatrix((m, desc) -> {
+ if (readOnly(m))
+ return;
+
+ double[][] data = fillAndReturn(m);
+
+ double timeVal = Math.random();
+ Matrix times = m.times(timeVal);
+
+ for (int i = 0; i < m.rowSize(); i++)
+ for (int j = 0; j < m.columnSize(); j++)
+ assertEquals("Unexpected value for " + desc + " at (" + i + "," + j + ")",
+ data[i][j] * timeVal, times.get(i, j), 0d);
+ });
+ }
+
+ /** */
+ @Test
+ public void testTimesVector() {
+ consumeSampleMatrix((m, desc) -> {
+ if (ignore(m.getClass()))
+ return;
+
+ double[][] data = fillAndReturn(m);
+
+ double[] arr = fillArray(m.columnSize());
+
+ Vector times = m.times(new DenseLocalOnHeapVector(arr));
+
+ assertEquals("Unexpected vector size for " + desc, times.size(), m.rowSize());
+
+ for (int i = 0; i < m.rowSize(); i++) {
+ double exp = 0.0;
+
+ for (int j = 0; j < m.columnSize(); j++)
+ exp += arr[j] * data[i][j];
+
+ assertEquals("Unexpected value for " + desc + " at " + i,
+ times.get(i), exp, 0d);
+ }
+
+ testInvalidCardinality(() -> m.times(new DenseLocalOnHeapVector(m.columnSize() + 1)), desc);
+ });
+ }
+
+ /** */
+ @Test
+ public void testTimesMatrix() {
+ consumeSampleMatrix((m, desc) -> {
+ if (ignore(m.getClass()))
+ return;
+
+ double[][] data = fillAndReturn(m);
+
+ double[] arr = fillArray(m.columnSize());
+
+ Matrix mult = new DenseLocalOnHeapMatrix(m.columnSize(), 1);
+
+ mult.setColumn(0, arr);
+
+ Matrix times = m.times(mult);
+
+ assertEquals("Unexpected rows for " + desc, times.rowSize(), m.rowSize());
+
+ assertEquals("Unexpected cols for " + desc, times.columnSize(), 1);
+
+ for (int i = 0; i < m.rowSize(); i++) {
+ double exp = 0.0;
+
+ for (int j = 0; j < m.columnSize(); j++)
+ exp += arr[j] * data[i][j];
+
+ assertEquals("Unexpected value for " + desc + " at " + i,
+ exp, times.get(i, 0), 0d);
+ }
+
+ testInvalidCardinality(() -> m.times(new DenseLocalOnHeapMatrix(m.columnSize() + 1, 1)), desc);
+ });
+ }
+
+ /** */
+ @Test
+ public void testDivide() {
+ consumeSampleMatrix((m, desc) -> {
+ if (ignore(m.getClass()))
+ return;
+
+ double[][] data = fillAndReturn(m);
+
+ double divVal = Math.random();
+
+ Matrix divide = m.divide(divVal);
+
+ for (int i = 0; i < m.rowSize(); i++)
+ for (int j = 0; j < m.columnSize(); j++)
+ assertEquals("Unexpected value for " + desc + " at (" + i + "," + j + ")",
+ data[i][j] / divVal, divide.get(i, j), 0d);
+ });
+ }
+
+ /** */
+ @Test
+ public void testTranspose() {
+ consumeSampleMatrix((m, desc) -> {
+ if (ignore(m.getClass()))
+ return;
+
+ fillMatrix(m);
+
+ Matrix transpose = m.transpose();
+
+ for (int i = 0; i < m.rowSize(); i++)
+ for (int j = 0; j < m.columnSize(); j++)
+ assertEquals("Unexpected value for " + desc + " at (" + i + "," + j + ")",
+ m.get(i, j), transpose.get(j, i), 0d);
+ });
+ }
+
+ /** */
+ @Test
+ public void testDeterminant() {
+ consumeSampleMatrix((m, desc) -> {
+ if (m.rowSize() != m.columnSize())
+ return;
+
+ if (ignore(m.getClass()))
+ return;
+
+ double[][] doubles = fillIntAndReturn(m);
+
+ if (m.rowSize() == 1) {
+ assertEquals("Unexpected value " + desc, m.determinant(), doubles[0][0], 0d);
+
+ return;
+ }
+
+ if (m.rowSize() == 2) {
+ double det = doubles[0][0] * doubles[1][1] - doubles[0][1] * doubles[1][0];
+ assertEquals("Unexpected value " + desc, m.determinant(), det, 0d);
+
+ return;
+ }
+
+ if (m.rowSize() > 512)
+ return; // IMPL NOTE if row size >= 30000 it takes unacceptably long for normal test run.
+
+ Matrix diagMtx = m.like(m.rowSize(), m.columnSize());
+
+ diagMtx.assign(0);
+ for (int i = 0; i < m.rowSize(); i++)
+ diagMtx.set(i, i, m.get(i, i));
+
+ double det = 1;
+
+ for (int i = 0; i < diagMtx.rowSize(); i++)
+ det *= diagMtx.get(i, i);
+
+ try {
+ assertEquals("Unexpected value " + desc, det, diagMtx.determinant(), DEFAULT_DELTA);
+ }
+ catch (Exception e) {
+ System.out.println(desc);
+ throw e;
+ }
+ });
+ }
+
+ /** */
+ @Test
+ public void testInverse() {
+ consumeSampleMatrix((m, desc) -> {
+ if (m.rowSize() != m.columnSize())
+ return;
+
+ if (ignore(m.getClass()))
+ return;
+
+ if (m.rowSize() > 256)
+ return; // IMPL NOTE this is for quicker test run.
+
+ fillNonSingularMatrix(m);
+
+ assertTrue("Unexpected zero determinant " + desc, Math.abs(m.determinant()) > 0d);
+
+ Matrix inverse = m.inverse();
+
+ Matrix mult = m.times(inverse);
+
+ final double delta = 0.001d;
+
+ assertEquals("Unexpected determinant " + desc, 1d, mult.determinant(), delta);
+
+ assertEquals("Unexpected top left value " + desc, 1d, mult.get(0, 0), delta);
+
+ if (m.rowSize() == 1)
+ return;
+
+ assertEquals("Unexpected center value " + desc,
+ 1d, mult.get(m.rowSize() / 2, m.rowSize() / 2), delta);
+
+ assertEquals("Unexpected bottom right value " + desc,
+ 1d, mult.get(m.rowSize() - 1, m.rowSize() - 1), delta);
+
+ assertEquals("Unexpected top right value " + desc,
+ 0d, mult.get(0, m.rowSize() - 1), delta);
+
+ assertEquals("Unexpected bottom left value " + desc,
+ 0d, mult.get(m.rowSize() - 1, 0), delta);
+ });
+ }
+
+ /** */
+ @Test
+ public void testMap() {
+ consumeSampleMatrix((m, desc) -> {
+ if (ignore(m.getClass()))
+ return;
+
+ fillMatrix(m);
+
+ m.map(x -> 10d);
+
+ for (int i = 0; i < m.rowSize(); i++)
+ for (int j = 0; j < m.columnSize(); j++)
+ assertEquals("Unexpected value for " + desc + " at (" + i + "," + j + ")",
+ 10d, m.get(i, j), 0d);
+ });
+ }
+
+ /** */
+ @Test
+ public void testMapMatrix() {
+ consumeSampleMatrix((m, desc) -> {
+ if (ignore(m.getClass()))
+ return;
+
+ double[][] doubles = fillAndReturn(m);
+
+ testMapMatrixWrongCardinality(m, desc);
+
+ Matrix cp = m.copy();
+
+ m.map(cp, (m1, m2) -> m1 + m2);
+
+ for (int i = 0; i < m.rowSize(); i++)
+ for (int j = 0; j < m.columnSize(); j++)
+ assertEquals("Unexpected value for " + desc + " at (" + i + "," + j + ")",
+ m.get(i, j), doubles[i][j] * 2, 0d);
+ });
+ }
+
+ /** */
+ @Test
+ public void testViewRow() {
+ consumeSampleMatrix((m, desc) -> {
+ if (!readOnly(m))
+ fillMatrix(m);
+
+ for (int i = 0; i < m.rowSize(); i++) {
+ Vector vector = m.viewRow(i);
+ assert vector != null;
+
+ for (int j = 0; j < m.columnSize(); j++)
+ assertEquals("Unexpected value for " + desc + " at (" + i + "," + j + ")",
+ m.get(i, j), vector.get(j), 0d);
+ }
+ });
+ }
+
+ /** */
+ @Test
+ public void testViewCol() {
+ consumeSampleMatrix((m, desc) -> {
+ if (!readOnly(m))
+ fillMatrix(m);
+
+ for (int i = 0; i < m.columnSize(); i++) {
+ Vector vector = m.viewColumn(i);
+ assert vector != null;
+
+ for (int j = 0; j < m.rowSize(); j++)
+ assertEquals("Unexpected value for " + desc + " at (" + i + "," + j + ")",
+ m.get(j, i), vector.get(j), 0d);
+ }
+ });
+ }
+
+ /** */
+ @Test
+ public void testFoldRow() {
+ consumeSampleMatrix((m, desc) -> {
+ if (ignore(m.getClass()))
+ return;
+
+ fillMatrix(m);
+
+ Vector foldRows = m.foldRows(Vector::sum);
+
+ for (int i = 0; i < m.rowSize(); i++) {
+ Double locSum = 0d;
+
+ for (int j = 0; j < m.columnSize(); j++)
+ locSum += m.get(i, j);
+
+ assertEquals("Unexpected value for " + desc + " at " + i,
+ foldRows.get(i), locSum, 0d);
+ }
+ });
+ }
+
+ /** */
+ @Test
+ public void testFoldCol() {
+ consumeSampleMatrix((m, desc) -> {
+ if (ignore(m.getClass()))
+ return;
+
+ fillMatrix(m);
+
+ Vector foldCols = m.foldColumns(Vector::sum);
+
+ for (int j = 0; j < m.columnSize(); j++) {
+ Double locSum = 0d;
+
+ for (int i = 0; i < m.rowSize(); i++)
+ locSum += m.get(i, j);
+
+ assertEquals("Unexpected value for " + desc + " at " + j,
+ foldCols.get(j), locSum, 0d);
+ }
+ });
+ }
+
+ /** */
+ @Test
+ public void testSum() {
+ consumeSampleMatrix((m, desc) -> {
+ double[][] data = fillAndReturn(m);
+
+ double sum = m.sum();
+
+ double rawSum = 0;
+ for (double[] anArr : data)
+ for (int j = 0; j < data[0].length; j++)
+ rawSum += anArr[j];
+
+ assertEquals("Unexpected value for " + desc,
+ rawSum, sum, 0d);
+ });
+ }
+
+ /** */
+ @Test
+ public void testMax() {
+ consumeSampleMatrix((m, desc) -> {
+ double[][] doubles = fillAndReturn(m);
+ double max = Double.NEGATIVE_INFINITY;
+
+ for (int i = 0; i < m.rowSize(); i++)
+ for (int j = 0; j < m.columnSize(); j++)
+ max = max < doubles[i][j] ? doubles[i][j] : max;
+
+ assertEquals("Unexpected value for " + desc, m.maxValue(), max, 0d);
+ });
+ }
+
+ /** */
+ @Test
+ public void testMin() {
+ consumeSampleMatrix((m, desc) -> {
+ double[][] doubles = fillAndReturn(m);
+ double min = Double.MAX_VALUE;
+
+ for (int i = 0; i < m.rowSize(); i++)
+ for (int j = 0; j < m.columnSize(); j++)
+ min = min > doubles[i][j] ? doubles[i][j] : min;
+
+ assertEquals("Unexpected value for " + desc, m.minValue(), min, 0d);
+ });
+ }
+
+ /** */
+ @Test
+ public void testGetElement() {
+ consumeSampleMatrix((m, desc) -> {
+ if (!(readOnly(m)))
+ fillMatrix(m);
+
+ for (int i = 0; i < m.rowSize(); i++)
+ for (int j = 0; j < m.columnSize(); j++) {
+ final Matrix.Element e = m.getElement(i, j);
+
+ final String details = desc + " at [" + i + "," + j + "]";
+
+ assertEquals("Unexpected element row " + details, i, e.row());
+ assertEquals("Unexpected element col " + details, j, e.column());
+
+ final double val = m.get(i, j);
+
+ assertEquals("Unexpected value for " + details, val, e.get(), 0d);
+
+ boolean expECaught = false;
+
+ final double newVal = val * 2.0;
+
+ try {
+ e.set(newVal);
+ }
+ catch (UnsupportedOperationException uoe) {
+ if (!(readOnly(m)))
+ throw uoe;
+
+ expECaught = true;
+ }
+
+ if (readOnly(m)) {
+ if (!expECaught)
+ fail("Expected exception was not caught for " + details);
+
+ continue;
+ }
+
+ assertEquals("Unexpected value set for " + details, newVal, m.get(i, j), 0d);
+ }
+ });
+ }
+
+ /** */
+ @Test
+ public void testGetX() {
+ consumeSampleMatrix((m, desc) -> {
+ if (!(readOnly(m)))
+ fillMatrix(m);
+
+ for (int i = 0; i < m.rowSize(); i++)
+ for (int j = 0; j < m.columnSize(); j++)
+ assertEquals("Unexpected value for " + desc + " at [" + i + "," + j + "]",
+ m.get(i, j), m.getX(i, j), 0d);
+ });
+ }
+
+ /** */
+ @Test
+ public void testGetMetaStorage() {
+ consumeSampleMatrix((m, desc) -> assertNotNull("Null meta storage in " + desc, m.getMetaStorage()));
+ }
+
+ /** */
+ @Test
+ public void testGuid() {
+ consumeSampleMatrix((m, desc) -> assertNotNull("Null guid in " + desc, m.guid()));
+ }
+
+ /** */
+ @Test
+ public void testSwapRows() {
+ consumeSampleMatrix((m, desc) -> {
+ if (readOnly(m))
+ return;
+
+ double[][] doubles = fillAndReturn(m);
+
+ final int swap_i = m.rowSize() == 1 ? 0 : 1;
+ final int swap_j = 0;
+
+ Matrix swap = m.swapRows(swap_i, swap_j);
+
+ for (int col = 0; col < m.columnSize(); col++) {
+ assertEquals("Unexpected value for " + desc + " at col " + col + ", swap_i " + swap_i,
+ swap.get(swap_i, col), doubles[swap_j][col], 0d);
+
+ assertEquals("Unexpected value for " + desc + " at col " + col + ", swap_j " + swap_j,
+ swap.get(swap_j, col), doubles[swap_i][col], 0d);
+ }
+
+ testInvalidRowIndex(() -> m.swapRows(-1, 0), desc + " negative first swap index");
+ testInvalidRowIndex(() -> m.swapRows(0, -1), desc + " negative second swap index");
+ testInvalidRowIndex(() -> m.swapRows(m.rowSize(), 0), desc + " too large first swap index");
+ testInvalidRowIndex(() -> m.swapRows(0, m.rowSize()), desc + " too large second swap index");
+ });
+ }
+
+ /** */
+ @Test
+ public void testSwapColumns() {
+ consumeSampleMatrix((m, desc) -> {
+ if (readOnly(m))
+ return;
+
+ double[][] doubles = fillAndReturn(m);
+
+ final int swap_i = m.columnSize() == 1 ? 0 : 1;
+ final int swap_j = 0;
+
+ Matrix swap = m.swapColumns(swap_i, swap_j);
+
+ for (int row = 0; row < m.rowSize(); row++) {
+ assertEquals("Unexpected value for " + desc + " at row " + row + ", swap_i " + swap_i,
+ swap.get(row, swap_i), doubles[row][swap_j], 0d);
+
+ assertEquals("Unexpected value for " + desc + " at row " + row + ", swap_j " + swap_j,
+ swap.get(row, swap_j), doubles[row][swap_i], 0d);
+ }
+
+ testInvalidColIndex(() -> m.swapColumns(-1, 0), desc + " negative first swap index");
+ testInvalidColIndex(() -> m.swapColumns(0, -1), desc + " negative second swap index");
+ testInvalidColIndex(() -> m.swapColumns(m.columnSize(), 0), desc + " too large first swap index");
+ testInvalidColIndex(() -> m.swapColumns(0, m.columnSize()), desc + " too large second swap index");
+ });
+ }
+
+ /** */
+ @Test
+ public void testSetRow() {
+ consumeSampleMatrix((m, desc) -> {
+ if (ignore(m.getClass()))
+ return;
+
+ fillMatrix(m);
+
+ int rowIdx = m.rowSize() / 2;
+
+ double[] newValues = fillArray(m.columnSize());
+
+ m.setRow(rowIdx, newValues);
+
+ for (int col = 0; col < m.columnSize(); col++)
+ assertEquals("Unexpected value for " + desc + " at " + col,
+ newValues[col], m.get(rowIdx, col), 0d);
+
+ testInvalidCardinality(() -> m.setRow(rowIdx, new double[m.columnSize() + 1]), desc);
+ });
+ }
+
+ /** */
+ @Test
+ public void testSetColumn() {
+ consumeSampleMatrix((m, desc) -> {
+ if (ignore(m.getClass()))
+ return;
+
+ fillMatrix(m);
+
+ int colIdx = m.columnSize() / 2;
+
+ double[] newValues = fillArray(m.rowSize());
+
+ m.setColumn(colIdx, newValues);
+
+ for (int row = 0; row < m.rowSize(); row++)
+ assertEquals("Unexpected value for " + desc + " at " + row,
+ newValues[row], m.get(row, colIdx), 0d);
+
+ testInvalidCardinality(() -> m.setColumn(colIdx, new double[m.rowSize() + 1]), desc);
+ });
+ }
+
+ /** */
+ @Test
+ public void testViewPart() {
+ consumeSampleMatrix((m, desc) -> {
+ if (ignore(m.getClass()))
+ return;
+
+ fillMatrix(m);
+
+ int rowOff = m.rowSize() < 3 ? 0 : 1;
+ int rows = m.rowSize() < 3 ? 1 : m.rowSize() - 2;
+ int colOff = m.columnSize() < 3 ? 0 : 1;
+ int cols = m.columnSize() < 3 ? 1 : m.columnSize() - 2;
+
+ Matrix view1 = m.viewPart(rowOff, rows, colOff, cols);
+ Matrix view2 = m.viewPart(new int[] {rowOff, colOff}, new int[] {rows, cols});
+
+ String details = desc + " view [" + rowOff + ", " + rows + ", " + colOff + ", " + cols + "]";
+
+ for (int i = 0; i < rows; i++)
+ for (int j = 0; j < cols; j++) {
+ assertEquals("Unexpected view1 value for " + details + " at (" + i + "," + j + ")",
+ m.get(i + rowOff, j + colOff), view1.get(i, j), 0d);
+
+ assertEquals("Unexpected view2 value for " + details + " at (" + i + "," + j + ")",
+ m.get(i + rowOff, j + colOff), view2.get(i, j), 0d);
+ }
+ });
+ }
+
+ /** */
+ @Test
+ public void testDensity() {
+ consumeSampleMatrix((m, desc) -> {
+ if (!readOnly(m))
+ fillMatrix(m);
+
+ assertTrue("Unexpected density with threshold 0 for " + desc, m.density(0.0));
+
+ assertFalse("Unexpected density with threshold 1 for " + desc, m.density(1.0));
+ });
+ }
+
+ /** */
+ @Test
+ public void testMaxAbsRowSumNorm() {
+ consumeSampleMatrix((m, desc) -> {
+ if (!readOnly(m))
+ fillMatrix(m);
+
+ assertEquals("Unexpected value for " + desc,
+ maxAbsRowSumNorm(m), m.maxAbsRowSumNorm(), 0d);
+ });
+ }
+
+ /** */
+ @Test
+ public void testAssignRow() {
+ consumeSampleMatrix((m, desc) -> {
+ if (ignore(m.getClass()))
+ return;
+
+ fillMatrix(m);
+
+ int rowIdx = m.rowSize() / 2;
+
+ double[] newValues = fillArray(m.columnSize());
+
+ m.assignRow(rowIdx, new DenseLocalOnHeapVector(newValues));
+
+ for (int col = 0; col < m.columnSize(); col++)
+ assertEquals("Unexpected value for " + desc + " at " + col,
+ newValues[col], m.get(rowIdx, col), 0d);
+
+ testInvalidCardinality(() -> m.assignRow(rowIdx, new DenseLocalOnHeapVector(m.columnSize() + 1)), desc);
+ });
+ }
+
+ /** */
+ @Test
+ public void testAssignColumn() {
+ consumeSampleMatrix((m, desc) -> {
+ if (ignore(m.getClass()))
+ return;
+
+ fillMatrix(m);
+
+ int colIdx = m.columnSize() / 2;
+
+ double[] newValues = fillArray(m.rowSize());
+
+ m.assignColumn(colIdx, new DenseLocalOnHeapVector(newValues));
+
+ for (int row = 0; row < m.rowSize(); row++)
+ assertEquals("Unexpected value for " + desc + " at " + row,
+ newValues[row], m.get(row, colIdx), 0d);
+ });
+ }
+
+ /** */
+ private double[] fillArray(int len) {
+ double[] newValues = new double[len];
+
+ for (int i = 0; i < newValues.length; i++)
+ newValues[i] = newValues.length - i;
+ return newValues;
+ }
+
+ /** */
+ private double maxAbsRowSumNorm(Matrix m) {
+ double max = 0.0;
+
+ for (int x = 0; x < m.rowSize(); x++) {
+ double sum = 0;
+
+ for (int y = 0; y < m.columnSize(); y++)
+ sum += Math.abs(m.getX(x, y));
+
+ if (sum > max)
+ max = sum;
+ }
+
+ return max;
+ }
+
+ /** */
+ private void testInvalidRowIndex(Supplier<Matrix> supplier, String desc) {
+ try {
+ supplier.get();
+ }
+ catch (RowIndexException | IndexException ie) {
+ return;
+ }
+
+ fail("Expected exception was not caught for " + desc);
+ }
+
+ /** */
+ private void testInvalidColIndex(Supplier<Matrix> supplier, String desc) {
+ try {
+ supplier.get();
+ }
+ catch (ColumnIndexException | IndexException ie) {
+ return;
+ }
+
+ fail("Expected exception was not caught for " + desc);
+ }
+
+ /** */
+ private void testMapMatrixWrongCardinality(Matrix m, String desc) {
+ for (int rowDelta : new int[] {-1, 0, 1})
+ for (int colDelta : new int[] {-1, 0, 1}) {
+ if (rowDelta == 0 && colDelta == 0)
+ continue;
+
+ int rowNew = m.rowSize() + rowDelta;
+ int colNew = m.columnSize() + colDelta;
+
+ if (rowNew < 1 || colNew < 1)
+ continue;
+
+ testInvalidCardinality(() -> m.map(new DenseLocalOnHeapMatrix(rowNew, colNew), (m1, m2) -> m1 + m2),
+ desc + " wrong cardinality when mapping to size " + rowNew + "x" + colNew);
+ }
+ }
+
+ /** */
+ private void testInvalidCardinality(Supplier<Object> supplier, String desc) {
+ try {
+ supplier.get();
+ }
+ catch (CardinalityException ce) {
+ return;
+ }
+
+ fail("Expected exception was not caught for " + desc);
+ }
+
+ /** */
+ private boolean readOnly(Matrix m) {
+ return m instanceof RandomMatrix;
+ }
+
+ /** */
+ private double[][] fillIntAndReturn(Matrix m) {
+ double[][] data = new double[m.rowSize()][m.columnSize()];
+
+ if (readOnly(m)) {
+ for (int i = 0; i < m.rowSize(); i++)
+ for (int j = 0; j < m.columnSize(); j++)
+ data[i][j] = m.get(i, j);
+
+ }
+ else {
+ for (int i = 0; i < m.rowSize(); i++)
+ for (int j = 0; j < m.columnSize(); j++)
+ data[i][j] = i * m.rowSize() + j + 1;
+
+ m.assign(data);
+ }
+ return data;
+ }
+
+ /** */
+ private double[][] fillAndReturn(Matrix m) {
+ double[][] data = new double[m.rowSize()][m.columnSize()];
+
+ if (readOnly(m)) {
+ for (int i = 0; i < m.rowSize(); i++)
+ for (int j = 0; j < m.columnSize(); j++)
+ data[i][j] = m.get(i, j);
+
+ }
+ else {
+ for (int i = 0; i < m.rowSize(); i++)
+ for (int j = 0; j < m.columnSize(); j++)
+ data[i][j] = -0.5d + Math.random();
+
+ m.assign(data);
+ }
+ return data;
+ }
+
+ /** */
+ private void fillNonSingularMatrix(Matrix m) {
+ for (int i = 0; i < m.rowSize(); i++) {
+ m.set(i, i, 10);
+
+ for (int j = 0; j < m.columnSize(); j++)
+ if (j != i)
+ m.set(i, j, 0.01d);
+ }
+ }
+
+ /** */
+ private void fillMatrix(Matrix m) {
+ for (int i = 0; i < m.rowSize(); i++)
+ for (int j = 0; j < m.columnSize(); j++)
+ m.set(i, j, Math.random());
+ }
+
+ /** Ignore test for given matrix type. */
+ private boolean ignore(Class<? extends Matrix> clazz) {
+ List<Class<? extends Matrix>> ignoredClasses = Arrays.asList(RandomMatrix.class, PivotedMatrixView.class,
+ MatrixView.class, FunctionMatrix.class, TransposedMatrixView.class);
+
+ for (Class<? extends Matrix> ignoredClass : ignoredClasses)
+ if (ignoredClass.isAssignableFrom(clazz))
+ return true;
+
+ return false;
+ }
+
+ /** */
+ private Class<? extends Matrix> likeMatrixType(Matrix m) {
+ for (Class<? extends Matrix> clazz : likeTypesMap().keySet())
+ if (clazz.isAssignableFrom(m.getClass()))
+ return likeTypesMap().get(clazz);
+
+ return null;
+ }
+
+ /** */
+ private static Map<Class<? extends Matrix>, Class<? extends Vector>> likeVectorTypesMap() {
+ return new LinkedHashMap<Class<? extends Matrix>, Class<? extends Vector>>() {{
+ put(DenseLocalOnHeapMatrix.class, DenseLocalOnHeapVector.class);
+ put(DenseLocalOffHeapMatrix.class, DenseLocalOffHeapVector.class);
+ put(RandomMatrix.class, RandomVector.class);
+ put(SparseLocalOnHeapMatrix.class, SparseLocalVector.class);
+ put(DenseLocalOnHeapMatrix.class, DenseLocalOnHeapVector.class);
+ put(DiagonalMatrix.class, DenseLocalOnHeapVector.class); // IMPL NOTE per fixture
+ // IMPL NOTE check for presence of all implementations here will be done in testHaveLikeMatrix via Fixture
+ }};
+ }
+
+ /** */
+ private static Map<Class<? extends Matrix>, Class<? extends Matrix>> likeTypesMap() {
+ return new LinkedHashMap<Class<? extends Matrix>, Class<? extends Matrix>>() {{
+ put(DenseLocalOnHeapMatrix.class, DenseLocalOnHeapMatrix.class);
+ put(DenseLocalOffHeapMatrix.class, DenseLocalOffHeapMatrix.class);
+ put(RandomMatrix.class, RandomMatrix.class);
+ put(SparseLocalOnHeapMatrix.class, SparseLocalOnHeapMatrix.class);
+ put(DenseLocalOnHeapMatrix.class, DenseLocalOnHeapMatrix.class);
+ put(DiagonalMatrix.class, DenseLocalOnHeapMatrix.class); // IMPL NOTE per fixture
+ put(FunctionMatrix.class, FunctionMatrix.class);
+ // IMPL NOTE check for presence of all implementations here will be done in testHaveLikeMatrix via Fixture
+ }};
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixKeyMapperForTests.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixKeyMapperForTests.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixKeyMapperForTests.java
new file mode 100644
index 0000000..bc628c9
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixKeyMapperForTests.java
@@ -0,0 +1,69 @@
+/*
+ * 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.ignite.ml.math.impls.matrix;
+
+import org.apache.ignite.ml.math.MatrixKeyMapper;
+
+/** */
+public class MatrixKeyMapperForTests implements MatrixKeyMapper<Integer> {
+ /** */ private int rows;
+ /** */ private int cols;
+
+ /** */
+ public MatrixKeyMapperForTests() {
+ // No-op.
+ }
+
+ /** */
+ public MatrixKeyMapperForTests(int rows, int cols) {
+ this.rows = rows;
+ this.cols = cols;
+ }
+
+ /** */
+ @Override public Integer apply(int x, int y) {
+ return x * cols + y;
+ }
+
+ /** */
+ @Override public boolean isValid(Integer integer) {
+ return (rows * cols) > integer;
+ }
+
+ /** */
+ @Override public int hashCode() {
+ int hash = 1;
+
+ hash += hash * 31 + rows;
+ hash += hash * 31 + cols;
+
+ return hash;
+ }
+
+ /** */
+ @Override public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+
+ if (obj == null || getClass() != obj.getClass())
+ return false;
+
+ MatrixKeyMapperForTests that = (MatrixKeyMapperForTests)obj;
+
+ return rows == that.rows && cols == that.cols;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixViewConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixViewConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixViewConstructorTest.java
new file mode 100644
index 0000000..82564cb
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixViewConstructorTest.java
@@ -0,0 +1,114 @@
+/*
+ * 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.ignite.ml.math.impls.matrix;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.impls.storage.matrix.MatrixDelegateStorage;
+import org.junit.Test;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
+/** */
+public class MatrixViewConstructorTest {
+ /** */
+ @Test
+ public void invalidArgsTest() {
+ Matrix m = new DenseLocalOnHeapMatrix(1, 1);
+
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new MatrixView((Matrix)null, 0, 0, 1, 1),
+ "Null parent matrix.");
+
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new MatrixView(m, -1, 0, 1, 1),
+ "Invalid row offset.");
+
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new MatrixView(m, 0, -1, 1, 1),
+ "Invalid col offset.");
+
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new MatrixView(m, 0, 0, 0, 1),
+ "Invalid rows.");
+
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new MatrixView(m, 0, 0, 1, 0),
+ "Invalid cols.");
+ }
+
+ /** */
+ @Test
+ public void basicTest() {
+ for (Matrix m : new Matrix[] {
+ new DenseLocalOnHeapMatrix(3, 3),
+ new DenseLocalOnHeapMatrix(3, 4), new DenseLocalOnHeapMatrix(4, 3)})
+ for (int rowOff : new int[] {0, 1})
+ for (int colOff : new int[] {0, 1})
+ for (int rows : new int[] {1, 2})
+ for (int cols : new int[] {1, 2})
+ basicTest(m, rowOff, colOff, rows, cols);
+ }
+
+ /** */
+ private void basicTest(Matrix parent, int rowOff, int colOff, int rows, int cols) {
+ for (int row = 0; row < parent.rowSize(); row++)
+ for (int col = 0; col < parent.columnSize(); col++)
+ parent.set(row, col, row * parent.columnSize() + col + 1);
+
+ Matrix view = new MatrixView(parent, rowOff, colOff, rows, cols);
+
+ assertEquals("Rows in view.", rows, view.rowSize());
+ assertEquals("Cols in view.", cols, view.columnSize());
+
+ for (int row = 0; row < rows; row++)
+ for (int col = 0; col < cols; col++)
+ assertEquals("Unexpected value at " + row + "x" + col,
+ parent.get(row + rowOff, col + colOff), view.get(row, col), 0d);
+
+ for (int row = 0; row < rows; row++)
+ for (int col = 0; col < cols; col++)
+ view.set(row, col, 0d);
+
+ for (int row = 0; row < rows; row++)
+ for (int col = 0; col < cols; col++)
+ assertEquals("Unexpected value set at " + row + "x" + col,
+ 0d, parent.get(row + rowOff, col + colOff), 0d);
+ }
+
+ /** */
+ @Test
+ public void attributeTest() {
+ for (Matrix m : new Matrix[] {
+ new DenseLocalOnHeapMatrix(3, 3),
+ new DenseLocalOnHeapMatrix(3, 4), new DenseLocalOnHeapMatrix(4, 3)}) {
+ MatrixView matrixView = new MatrixView(m, 0, 0, m.rowSize(), m.columnSize());
+
+ MatrixDelegateStorage delegateStorage = (MatrixDelegateStorage)matrixView.getStorage();
+
+ assertEquals(m.rowSize(), matrixView.rowSize());
+ assertEquals(m.columnSize(), matrixView.columnSize());
+
+ assertEquals(m.rowSize(), (delegateStorage).rowsLength());
+ assertEquals(m.columnSize(), (delegateStorage).columnsLength());
+
+ assertEquals(m.isSequentialAccess(), delegateStorage.isSequentialAccess());
+ assertEquals(m.isRandomAccess(), delegateStorage.isRandomAccess());
+ assertEquals(m.isDistributed(), delegateStorage.isDistributed());
+ assertEquals(m.isDense(), delegateStorage.isDense());
+ assertEquals(m.isArrayBased(), delegateStorage.isArrayBased());
+
+ assertArrayEquals(m.getStorage().data(), delegateStorage.data());
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/PivotedMatrixViewConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/PivotedMatrixViewConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/PivotedMatrixViewConstructorTest.java
new file mode 100644
index 0000000..87bf3ad
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/PivotedMatrixViewConstructorTest.java
@@ -0,0 +1,129 @@
+/*
+ * 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.ignite.ml.math.impls.matrix;
+
+import java.util.Arrays;
+import org.apache.ignite.ml.math.Matrix;
+import org.junit.Assert;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+/** */
+public class PivotedMatrixViewConstructorTest {
+ /** */
+ @Test
+ public void invalidArgsTest() {
+ Matrix m = new DenseLocalOnHeapMatrix(1, 1);
+
+ int[] pivot = new int[] {0};
+
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new PivotedMatrixView(null),
+ "Null parent matrix.");
+
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new PivotedMatrixView(null, pivot),
+ "Null parent matrix, with pivot.");
+
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new PivotedMatrixView(m, null),
+ "Null pivot.");
+
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new PivotedMatrixView(m, null, pivot),
+ "Null row pivot.");
+
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new PivotedMatrixView(m, pivot, null),
+ "Null col pivot.");
+ }
+
+ /** */
+ @Test
+ public void basicTest() {
+ Matrix m = new DenseLocalOnHeapMatrix(2, 2);
+
+ int[] pivot = new int[] {0, 1};
+
+ PivotedMatrixView view = new PivotedMatrixView(m, pivot);
+
+ assertEquals("Rows in view.", m.rowSize(), view.rowSize());
+ assertEquals("Cols in view.", m.columnSize(), view.columnSize());
+
+ assertTrue("Row pivot array in view.", Arrays.equals(pivot, view.rowPivot()));
+ assertTrue("Col pivot array in view.", Arrays.equals(pivot, view.columnPivot()));
+
+ Assert.assertEquals("Base matrix in view.", m, view.getBaseMatrix());
+
+ assertEquals("Row pivot value in view.", 0, view.rowPivot(0));
+ assertEquals("Col pivot value in view.", 0, view.columnPivot(0));
+
+ assertEquals("Row unpivot value in view.", 0, view.rowUnpivot(0));
+ assertEquals("Col unpivot value in view.", 0, view.columnUnpivot(0));
+
+ Matrix swap = view.swap(1, 1);
+
+ for (int row = 0; row < view.rowSize(); row++)
+ for (int col = 0; col < view.columnSize(); col++)
+ assertEquals("Unexpected swap value set at (" + row + "," + col + ").",
+ view.get(row, col), swap.get(row, col), 0d);
+
+ //noinspection EqualsWithItself
+ assertTrue("View is expected to be equal to self.", view.equals(view));
+ //noinspection ObjectEqualsNull
+ assertFalse("View is expected to be not equal to null.", view.equals(null));
+ }
+
+ /** */
+ @Test
+ public void pivotTest() {
+ int[] pivot = new int[] {2, 1, 0, 3};
+
+ for (Matrix m : new Matrix[] {
+ new DenseLocalOnHeapMatrix(3, 3),
+ new DenseLocalOnHeapMatrix(3, 4), new DenseLocalOnHeapMatrix(4, 3)})
+ pivotTest(m, pivot);
+ }
+
+ /** */
+ private void pivotTest(Matrix parent, int[] pivot) {
+ for (int row = 0; row < parent.rowSize(); row++)
+ for (int col = 0; col < parent.columnSize(); col++)
+ parent.set(row, col, row * parent.columnSize() + col + 1);
+
+ Matrix view = new PivotedMatrixView(parent, pivot);
+
+ int rows = parent.rowSize();
+ int cols = parent.columnSize();
+
+ assertEquals("Rows in view.", rows, view.rowSize());
+ assertEquals("Cols in view.", cols, view.columnSize());
+
+ for (int row = 0; row < rows; row++)
+ for (int col = 0; col < cols; col++)
+ assertEquals("Unexpected value at " + row + "x" + col,
+ parent.get(pivot[row], pivot[col]), view.get(row, col), 0d);
+
+ int min = rows < cols ? rows : cols;
+
+ for (int idx = 0; idx < min; idx++)
+ view.set(idx, idx, 0d);
+
+ for (int idx = 0; idx < min; idx++)
+ assertEquals("Unexpected value set at " + idx,
+ 0d, parent.get(pivot[idx], pivot[idx]), 0d);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/RandomMatrixConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/RandomMatrixConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/RandomMatrixConstructorTest.java
new file mode 100644
index 0000000..558e4d8
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/RandomMatrixConstructorTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.ignite.ml.math.impls.matrix;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+/** */
+public class RandomMatrixConstructorTest {
+ /** */
+ @Test
+ public void invalidArgsTest() {
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new RandomMatrix(0, 1), "invalid row parameter");
+
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new RandomMatrix(1, 0), "invalid col parameter");
+
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new RandomMatrix(0, 1, true), "invalid row parameter, fastHash true");
+
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new RandomMatrix(1, 0, true), "invalid col parameter, fastHash true");
+
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new RandomMatrix(0, 1, false), "invalid row parameter, fastHash false");
+
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new RandomMatrix(1, 0, false), "invalid col parameter, fastHash false");
+ }
+
+ /** */
+ @Test
+ public void basicTest() {
+ assertEquals("Expected number of rows, int parameters.", 1,
+ new RandomMatrix(1, 2).rowSize());
+
+ assertEquals("Expected number of cols, int parameters.", 1,
+ new RandomMatrix(2, 1).columnSize());
+
+ assertEquals("Expected number of rows, int parameters, fastHash true.", 1,
+ new RandomMatrix(1, 2, true).rowSize());
+
+ assertEquals("Expected number of cols, int parameters, fastHash true.", 1,
+ new RandomMatrix(2, 1, true).columnSize());
+
+ assertEquals("Expected number of rows, int parameters, fastHash false.", 1,
+ new RandomMatrix(1, 2, false).rowSize());
+
+ assertEquals("Expected number of cols, int parameters, fastHash false.", 1,
+ new RandomMatrix(2, 1, false).columnSize());
+
+ RandomMatrix m = new RandomMatrix(1, 1);
+ //noinspection EqualsWithItself
+ assertTrue("Matrix is expected to be equal to self.", m.equals(m));
+ //noinspection ObjectEqualsNull
+ assertFalse("Matrix is expected to be not equal to null.", m.equals(null));
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedMatrixTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedMatrixTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedMatrixTest.java
new file mode 100644
index 0000000..8985806
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedMatrixTest.java
@@ -0,0 +1,265 @@
+// @java.file.header
+
+/* _________ _____ __________________ _____
+ * __ ____/___________(_)______ /__ ____/______ ____(_)_______
+ * _ / __ __ ___/__ / _ __ / _ / __ _ __ `/__ / __ __ \
+ * / /_/ / _ / _ / / /_/ / / /_/ / / /_/ / _ / _ / / /
+ * \____/ /_/ /_/ \_,__/ \____/ \__,_/ /_/ /_/ /_/
+ */
+
+/*
+ * 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.ignite.ml.math.impls.matrix;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.internal.util.IgniteUtils;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.StorageConstants;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.impls.MathTestConstants;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.apache.ignite.testframework.junits.common.GridCommonTest;
+
+import static org.apache.ignite.ml.math.impls.MathTestConstants.UNEXPECTED_VAL;
+
+/**
+ * Tests for {@link SparseDistributedMatrix}.
+ */
+@GridCommonTest(group = "Distributed Models")
+public class SparseDistributedMatrixTest extends GridCommonAbstractTest {
+ /** Number of nodes in grid */
+ private static final int NODE_COUNT = 3;
+ /** Cache name. */
+ private static final String CACHE_NAME = "test-cache";
+ /** Precision. */
+ private static final double PRECISION = 0.0;
+ /** Grid instance. */
+ private Ignite ignite;
+ /** Matrix rows */
+ private final int rows = MathTestConstants.STORAGE_SIZE;
+ /** Matrix cols */
+ private final int cols = MathTestConstants.STORAGE_SIZE;
+ /** Matrix for tests */
+ private SparseDistributedMatrix cacheMatrix;
+
+ /**
+ * Default constructor.
+ */
+ public SparseDistributedMatrixTest() {
+ super(false);
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void beforeTestsStarted() throws Exception {
+ for (int i = 1; i <= NODE_COUNT; i++)
+ startGrid(i);
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void afterTestsStopped() throws Exception {
+ stopAllGrids();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override protected void beforeTest() throws Exception {
+ ignite = grid(NODE_COUNT);
+
+ ignite.configuration().setPeerClassLoadingEnabled(true);
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void afterTest() throws Exception {
+ ignite.destroyCache(CACHE_NAME);
+
+ if (cacheMatrix != null) {
+ cacheMatrix.destroy();
+ cacheMatrix = null;
+ }
+ }
+
+ /** */
+ public void testGetSet() throws Exception {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ cacheMatrix = new SparseDistributedMatrix(rows, cols, StorageConstants.ROW_STORAGE_MODE, StorageConstants.RANDOM_ACCESS_MODE);
+
+ for (int i = 0; i < rows; i++) {
+ for (int j = 0; j < cols; j++) {
+ double v = Math.random();
+ cacheMatrix.set(i, j, v);
+
+ assert Double.compare(v, cacheMatrix.get(i, j)) == 0;
+ }
+ }
+ }
+
+ /** */
+ public void testExternalize() throws IOException, ClassNotFoundException {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ cacheMatrix = new SparseDistributedMatrix(rows, cols, StorageConstants.ROW_STORAGE_MODE, StorageConstants.RANDOM_ACCESS_MODE);
+
+ cacheMatrix.set(1, 1, 1.0);
+
+ ByteArrayOutputStream byteArrOutputStream = new ByteArrayOutputStream();
+ ObjectOutputStream objOutputStream = new ObjectOutputStream(byteArrOutputStream);
+
+ objOutputStream.writeObject(cacheMatrix);
+
+ ByteArrayInputStream byteArrInputStream = new ByteArrayInputStream(byteArrOutputStream.toByteArray());
+ ObjectInputStream objInputStream = new ObjectInputStream(byteArrInputStream);
+
+ SparseDistributedMatrix objRestored = (SparseDistributedMatrix)objInputStream.readObject();
+
+ assertTrue(MathTestConstants.VAL_NOT_EQUALS, cacheMatrix.equals(objRestored));
+ assertEquals(MathTestConstants.VAL_NOT_EQUALS, objRestored.get(1, 1), 1.0, 0.0);
+ }
+
+ /** Test simple math. */
+ public void testMath() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ cacheMatrix = new SparseDistributedMatrix(rows, cols, StorageConstants.ROW_STORAGE_MODE, StorageConstants.RANDOM_ACCESS_MODE);
+ initMtx(cacheMatrix);
+
+ cacheMatrix.assign(2.0);
+ for (int i = 0; i < cacheMatrix.rowSize(); i++)
+ for (int j = 0; j < cacheMatrix.columnSize(); j++)
+ assertEquals(UNEXPECTED_VAL, 2.0, cacheMatrix.get(i, j), PRECISION);
+
+ cacheMatrix.plus(3.0);
+ for (int i = 0; i < cacheMatrix.rowSize(); i++)
+ for (int j = 0; j < cacheMatrix.columnSize(); j++)
+ assertEquals(UNEXPECTED_VAL, 5.0, cacheMatrix.get(i, j), PRECISION);
+
+ cacheMatrix.times(2.0);
+ for (int i = 0; i < cacheMatrix.rowSize(); i++)
+ for (int j = 0; j < cacheMatrix.columnSize(); j++)
+ assertEquals(UNEXPECTED_VAL, 10.0, cacheMatrix.get(i, j), PRECISION);
+
+ cacheMatrix.divide(10.0);
+ for (int i = 0; i < cacheMatrix.rowSize(); i++)
+ for (int j = 0; j < cacheMatrix.columnSize(); j++)
+ assertEquals(UNEXPECTED_VAL, 1.0, cacheMatrix.get(i, j), PRECISION);
+
+ assertEquals(UNEXPECTED_VAL, cacheMatrix.rowSize() * cacheMatrix.columnSize(), cacheMatrix.sum(), PRECISION);
+ }
+
+ /** */
+ public void testMinMax() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ cacheMatrix = new SparseDistributedMatrix(rows, cols, StorageConstants.ROW_STORAGE_MODE, StorageConstants.RANDOM_ACCESS_MODE);
+
+ for (int i = 0; i < cacheMatrix.rowSize(); i++)
+ for (int j = 0; j < cacheMatrix.columnSize(); j++)
+ cacheMatrix.set(i, j, i * cols + j + 1);
+
+ assertEquals(UNEXPECTED_VAL, 1.0, cacheMatrix.minValue(), PRECISION);
+ assertEquals(UNEXPECTED_VAL, rows * cols, cacheMatrix.maxValue(), PRECISION);
+
+ for (int i = 0; i < cacheMatrix.rowSize(); i++)
+ for (int j = 0; j < cacheMatrix.columnSize(); j++)
+ cacheMatrix.set(i, j, -1.0 * (i * cols + j + 1));
+
+ assertEquals(UNEXPECTED_VAL, -rows * cols, cacheMatrix.minValue(), PRECISION);
+ assertEquals(UNEXPECTED_VAL, -1.0, cacheMatrix.maxValue(), PRECISION);
+
+ for (int i = 0; i < cacheMatrix.rowSize(); i++)
+ for (int j = 0; j < cacheMatrix.columnSize(); j++)
+ cacheMatrix.set(i, j, i * cols + j);
+
+ assertEquals(UNEXPECTED_VAL, 1.0, cacheMatrix.minValue(), PRECISION);
+ assertEquals(UNEXPECTED_VAL, rows * cols - 1.0, cacheMatrix.maxValue(), PRECISION);
+ }
+
+ /** */
+ public void testMap() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ cacheMatrix = new SparseDistributedMatrix(rows, cols, StorageConstants.ROW_STORAGE_MODE, StorageConstants.RANDOM_ACCESS_MODE);
+ initMtx(cacheMatrix);
+
+ cacheMatrix.map(i -> 100.0);
+ for (int i = 0; i < cacheMatrix.rowSize(); i++)
+ for (int j = 0; j < cacheMatrix.columnSize(); j++)
+ assertEquals(UNEXPECTED_VAL, 100.0, cacheMatrix.get(i, j), PRECISION);
+ }
+
+ /** */
+ public void testCopy() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ cacheMatrix = new SparseDistributedMatrix(rows, cols, StorageConstants.ROW_STORAGE_MODE, StorageConstants.RANDOM_ACCESS_MODE);
+
+ try {
+ cacheMatrix.copy();
+ fail("UnsupportedOperationException expected.");
+ }
+ catch (UnsupportedOperationException e) {
+ return;
+ }
+ fail("UnsupportedOperationException expected.");
+ }
+
+ /** */
+ public void testLike() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ cacheMatrix = new SparseDistributedMatrix(rows, cols, StorageConstants.ROW_STORAGE_MODE, StorageConstants.RANDOM_ACCESS_MODE);
+
+ try {
+ cacheMatrix.like(1, 1);
+ fail("UnsupportedOperationException expected.");
+ }
+ catch (UnsupportedOperationException e) {
+ return;
+ }
+ fail("UnsupportedOperationException expected.");
+ }
+
+ /** */
+ public void testLikeVector() {
+ IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+ cacheMatrix = new SparseDistributedMatrix(rows, cols, StorageConstants.ROW_STORAGE_MODE, StorageConstants.RANDOM_ACCESS_MODE);
+
+ try {
+ cacheMatrix.likeVector(1);
+ fail("UnsupportedOperationException expected.");
+ }
+ catch (UnsupportedOperationException e) {
+ return;
+ }
+ fail("UnsupportedOperationException expected.");
+ }
+
+ /** */
+ private void initMtx(Matrix m) {
+ for (int i = 0; i < m.rowSize(); i++)
+ for (int j = 0; j < m.columnSize(); j++)
+ m.set(i, j, 1.0);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/SparseLocalOnHeapMatrixConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/SparseLocalOnHeapMatrixConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/SparseLocalOnHeapMatrixConstructorTest.java
new file mode 100644
index 0000000..bc05eb7
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/SparseLocalOnHeapMatrixConstructorTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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.ignite.ml.math.impls.matrix;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+/** */
+public class SparseLocalOnHeapMatrixConstructorTest {
+ /** */
+ @Test
+ public void invalidArgsTest() {
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new SparseLocalOnHeapMatrix(0, 1),
+ "invalid row parameter");
+
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new SparseLocalOnHeapMatrix(1, 0),
+ "invalid col parameter");
+ }
+
+ /** */
+ @Test
+ public void basicTest() {
+ assertEquals("Expected number of rows.", 1,
+ new SparseLocalOnHeapMatrix(1, 2).rowSize());
+
+ assertEquals("Expected number of cols, int parameters.", 1,
+ new SparseLocalOnHeapMatrix(2, 1).columnSize());
+
+ SparseLocalOnHeapMatrix m = new SparseLocalOnHeapMatrix(1, 1);
+ //noinspection EqualsWithItself
+ assertTrue("Matrix is expected to be equal to self.", m.equals(m));
+ //noinspection ObjectEqualsNull
+ assertFalse("Matrix is expected to be not equal to null.", m.equals(null));
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/TransposedMatrixViewTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/TransposedMatrixViewTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/TransposedMatrixViewTest.java
new file mode 100644
index 0000000..22ec7cc
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/TransposedMatrixViewTest.java
@@ -0,0 +1,87 @@
+/*
+ * 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.ignite.ml.math.impls.matrix;
+
+import org.apache.ignite.ml.math.ExternalizeTest;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.impls.MathTestConstants;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Tests for {@link TransposedMatrixView}.
+ */
+public class TransposedMatrixViewTest extends ExternalizeTest<TransposedMatrixView> {
+ /** */
+ private static final String UNEXPECTED_VALUE = "Unexpected value";
+ /** */
+ private TransposedMatrixView testMatrix;
+ /** */
+ private DenseLocalOnHeapMatrix parent;
+
+ /** */
+ @Before
+ public void setup() {
+ parent = new DenseLocalOnHeapMatrix(MathTestConstants.STORAGE_SIZE, MathTestConstants.STORAGE_SIZE);
+ fillMatrix(parent);
+ testMatrix = new TransposedMatrixView(parent);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void externalizeTest() {
+ externalizeTest(testMatrix);
+ }
+
+ /** */
+ @Test
+ public void testView() {
+ assertEquals(UNEXPECTED_VALUE, parent.rowSize(), testMatrix.columnSize());
+ assertEquals(UNEXPECTED_VALUE, parent.columnSize(), testMatrix.rowSize());
+
+ for (int i = 0; i < parent.rowSize(); i++)
+ for (int j = 0; j < parent.columnSize(); j++)
+ assertEquals(UNEXPECTED_VALUE, parent.get(i, j), testMatrix.get(j, i), 0d);
+ }
+
+ /** */
+ @Test
+ public void testNullParams() {
+ DenseLocalOnHeapMatrixConstructorTest.verifyAssertionError(() -> new TransposedMatrixView(null), "Null Matrix parameter");
+ }
+
+ /** */
+ @Test(expected = UnsupportedOperationException.class)
+ public void testLike() {
+ testMatrix.like(0, 0);
+ }
+
+ /** */
+ @Test(expected = UnsupportedOperationException.class)
+ public void testLikeVector() {
+ testMatrix.likeVector(0);
+ }
+
+ /** */
+ private void fillMatrix(DenseLocalOnHeapMatrix mtx) {
+ for (int i = 0; i < mtx.rowSize(); i++)
+ for (int j = 0; j < mtx.columnSize(); j++)
+ mtx.setX(i, j, i * mtx.rowSize() + j);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixArrayStorageTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixArrayStorageTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixArrayStorageTest.java
new file mode 100644
index 0000000..569ed57
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixArrayStorageTest.java
@@ -0,0 +1,63 @@
+/*
+ * 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.ignite.ml.math.impls.storage.matrix;
+
+import org.apache.ignite.ml.math.impls.MathTestConstants;
+import org.junit.Test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Unit tests for {@link ArrayMatrixStorage}.
+ */
+public class MatrixArrayStorageTest extends MatrixBaseStorageTest<ArrayMatrixStorage> {
+ /** {@inheritDoc} */
+ @Override public void setUp() {
+ storage = new ArrayMatrixStorage(MathTestConstants.STORAGE_SIZE, MathTestConstants.STORAGE_SIZE);
+ }
+
+ /** */
+ @Test
+ public void isSequentialAccess() throws Exception {
+ assertFalse(MathTestConstants.UNEXPECTED_VAL, storage.isSequentialAccess());
+ }
+
+ /** */
+ @Test
+ public void isDense() throws Exception {
+ assertTrue(MathTestConstants.UNEXPECTED_VAL, storage.isDense());
+ }
+
+ /** */
+ @Test
+ public void isArrayBased() throws Exception {
+ assertTrue(MathTestConstants.UNEXPECTED_VAL, storage.isArrayBased());
+ }
+
+ /** */
+ @Test
+ public void data() throws Exception {
+ double[][] data = storage.data();
+ assertNotNull(MathTestConstants.NULL_VAL, data);
+ assertTrue(MathTestConstants.UNEXPECTED_VAL, data.length == MathTestConstants.STORAGE_SIZE);
+ assertTrue(MathTestConstants.UNEXPECTED_VAL, data[0].length == MathTestConstants.STORAGE_SIZE);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixBaseStorageTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixBaseStorageTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixBaseStorageTest.java
new file mode 100644
index 0000000..94e87c2
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixBaseStorageTest.java
@@ -0,0 +1,89 @@
+/*
+ * 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.ignite.ml.math.impls.storage.matrix;
+
+import org.apache.ignite.ml.math.ExternalizeTest;
+import org.apache.ignite.ml.math.MatrixStorage;
+import org.apache.ignite.ml.math.impls.MathTestConstants;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Abstract class with base tests for each matrix storage.
+ */
+public abstract class MatrixBaseStorageTest<T extends MatrixStorage> extends ExternalizeTest<T> {
+ /** */
+ protected T storage;
+
+ /** */
+ @Before
+ public abstract void setUp();
+
+ /** */
+ @After
+ public void tearDown() throws Exception {
+ storage.destroy();
+ }
+
+ /** */
+ @Test
+ public void getSet() throws Exception {
+ int rows = MathTestConstants.STORAGE_SIZE;
+ int cols = MathTestConstants.STORAGE_SIZE;
+
+ for (int i = 0; i < rows; i++) {
+ for (int j = 0; j < cols; j++) {
+ double data = Math.random();
+
+ storage.set(i, j, data);
+
+ Assert.assertEquals(MathTestConstants.VAL_NOT_EQUALS, storage.get(i, j), data, MathTestConstants.NIL_DELTA);
+ }
+ }
+ }
+
+ /** */
+ @Test
+ public void columnSize() throws Exception {
+ assertEquals(MathTestConstants.VAL_NOT_EQUALS, storage.columnSize(), MathTestConstants.STORAGE_SIZE);
+ }
+
+ /** */
+ @Test
+ public void rowSize() throws Exception {
+ assertEquals(MathTestConstants.VAL_NOT_EQUALS, storage.rowSize(), MathTestConstants.STORAGE_SIZE);
+ }
+
+ /** */
+ @Override public void externalizeTest() {
+ fillMatrix();
+ super.externalizeTest(storage);
+ }
+
+ /** */
+ protected void fillMatrix() {
+ for (int i = 0; i < storage.rowSize(); i++) {
+ for (int j = 0; j < storage.columnSize(); j++)
+ storage.set(i, j, Math.random());
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixOffHeapStorageTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixOffHeapStorageTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixOffHeapStorageTest.java
new file mode 100644
index 0000000..52d57fd
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixOffHeapStorageTest.java
@@ -0,0 +1,39 @@
+/*
+ * 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.ignite.ml.math.impls.storage.matrix;
+
+import org.apache.ignite.ml.math.impls.MathTestConstants;
+import org.junit.Test;
+
+import static org.junit.Assert.assertNull;
+
+/**
+ * Unit tests for {@link DenseOffHeapMatrixStorage}.
+ */
+public class MatrixOffHeapStorageTest extends MatrixBaseStorageTest<DenseOffHeapMatrixStorage> {
+ /** {@inheritDoc} */
+ @Override public void setUp() {
+ storage = new DenseOffHeapMatrixStorage(MathTestConstants.STORAGE_SIZE, MathTestConstants.STORAGE_SIZE);
+ }
+
+ /** */
+ @Test
+ public void data() throws Exception {
+ assertNull(MathTestConstants.UNEXPECTED_VAL, storage.data());
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixStorageFixtures.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixStorageFixtures.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixStorageFixtures.java
new file mode 100644
index 0000000..03473cf
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixStorageFixtures.java
@@ -0,0 +1,137 @@
+/*
+ * 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.ignite.ml.math.impls.storage.matrix;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.function.BiConsumer;
+import java.util.function.Supplier;
+import org.apache.ignite.ml.math.MatrixStorage;
+import org.apache.ignite.ml.math.StorageConstants;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ *
+ */
+class MatrixStorageFixtures {
+ /** */
+ private static final List<Supplier<Iterable<MatrixStorage>>> suppliers = Collections.singletonList(
+ (Supplier<Iterable<MatrixStorage>>) SparseLocalMatrixStorageFixture::new
+ );
+
+ /** */
+ void consumeSampleStorages(BiConsumer<Integer, Integer> paramsConsumer,
+ BiConsumer<MatrixStorage, String> consumer) {
+ for (Supplier<Iterable<MatrixStorage>> fixtureSupplier : suppliers) {
+ final Iterable<MatrixStorage> fixture = fixtureSupplier.get();
+
+ for (MatrixStorage matrixStorage : fixture) {
+ if (paramsConsumer != null)
+ paramsConsumer.accept(matrixStorage.rowSize(), matrixStorage.columnSize());
+
+ consumer.accept(matrixStorage, fixture.toString());
+ }
+ }
+ }
+
+ /** */
+ private static class SparseLocalMatrixStorageFixture implements Iterable<MatrixStorage> {
+ /** */
+ private final Integer[] rows = new Integer[] {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 512, 1024, null};
+ /** */
+ private final Integer[] cols = new Integer[] {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 1024, 512, null};
+ /** */
+ private final Integer[] randomAccess = new Integer[] {StorageConstants.SEQUENTIAL_ACCESS_MODE, StorageConstants.RANDOM_ACCESS_MODE, null};
+ /** */
+ private final Integer[] rowStorage = new Integer[] {StorageConstants.ROW_STORAGE_MODE, StorageConstants.COLUMN_STORAGE_MODE, null};
+ /** */
+ private int sizeIdx = 0;
+ /** */
+ private int acsModeIdx = 0;
+ /** */
+ private int stoModeIdx = 0;
+
+ /** {@inheritDoc} */
+ @NotNull
+ @Override public Iterator<MatrixStorage> iterator() {
+ return new Iterator<MatrixStorage>() {
+ /** {@inheritDoc} */
+ @Override public boolean hasNext() {
+ return hasNextCol(sizeIdx) && hasNextRow(sizeIdx)
+ && hasNextAcsMode(acsModeIdx) && hasNextStoMode(stoModeIdx);
+ }
+
+ /** {@inheritDoc} */
+ @Override public MatrixStorage next() {
+ if (!hasNext())
+ throw new NoSuchElementException(SparseLocalMatrixStorageFixture.this.toString());
+
+ MatrixStorage storage = new SparseLocalOnHeapMatrixStorage(
+ rows[sizeIdx], cols[sizeIdx], randomAccess[acsModeIdx], rowStorage[stoModeIdx]);
+
+ nextIdx();
+
+ return storage;
+ }
+
+ private void nextIdx() {
+ if (hasNextStoMode(stoModeIdx + 1)) {
+ stoModeIdx++;
+
+ return;
+ }
+
+ stoModeIdx = 0;
+
+ if (hasNextAcsMode(acsModeIdx + 1)) {
+ acsModeIdx++;
+
+ return;
+ }
+
+ acsModeIdx = 0;
+ sizeIdx++;
+ }
+ };
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return "SparseLocalMatrixStorageFixture{ " + "rows=" + rows[sizeIdx] + ", cols=" + cols[sizeIdx] +
+ ", access mode=" + randomAccess[acsModeIdx] + ", storage mode=" + rowStorage[stoModeIdx] + "}";
+ }
+
+ /** */ private boolean hasNextRow(int idx) {
+ return rows[idx] != null;
+ }
+
+ /** */ private boolean hasNextCol(int idx) {
+ return cols[idx] != null;
+ }
+
+ /** */ private boolean hasNextAcsMode(int idx) {
+ return randomAccess[idx] != null;
+ }
+
+ /** */ private boolean hasNextStoMode(int idx) {
+ return rowStorage[idx] != null;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixStorageImplementationTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixStorageImplementationTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixStorageImplementationTest.java
new file mode 100644
index 0000000..72daeca
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixStorageImplementationTest.java
@@ -0,0 +1,73 @@
+/*
+ * 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.ignite.ml.math.impls.storage.matrix;
+
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.BiConsumer;
+import org.apache.ignite.ml.math.ExternalizeTest;
+import org.apache.ignite.ml.math.MatrixStorage;
+import org.junit.Test;
+
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Unit tests for {@link MatrixStorage} implementations.
+ *
+ * TODO: add attribute tests.
+ */
+public class MatrixStorageImplementationTest extends ExternalizeTest<MatrixStorage> {
+ /**
+ * The columnSize() and the rowSize() test.
+ */
+ @Test
+ public void sizeTest() {
+ final AtomicReference<Integer> expRowSize = new AtomicReference<>(0);
+ final AtomicReference<Integer> expColSize = new AtomicReference<>(0);
+
+ consumeSampleStorages((x, y) -> {
+ expRowSize.set(x);
+ expColSize.set(y);
+ },
+ (ms, desc) -> assertTrue("Expected size for " + desc, expColSize.get().equals(ms.columnSize()) && expRowSize.get().equals(ms.rowSize())));
+ }
+
+ /** */
+ @Test
+ public void getSetTest() {
+ consumeSampleStorages(null, (ms, desc) -> {
+ for (int i = 0; i < ms.rowSize(); i++) {
+ for (int j = 0; j < ms.columnSize(); j++) {
+ double random = Math.random();
+ ms.set(i, j, random);
+ assertTrue("Unexpected value for " + desc + " x:" + i + ", y:" + j, Double.compare(random, ms.get(i, j)) == 0);
+ }
+ }
+ });
+ }
+
+ /** */
+ @Override public void externalizeTest() {
+ consumeSampleStorages(null, (ms, desc) -> externalizeTest(ms));
+ }
+
+ /** */
+ private void consumeSampleStorages(BiConsumer<Integer, Integer> paramsConsumer,
+ BiConsumer<MatrixStorage, String> consumer) {
+ new MatrixStorageFixtures().consumeSampleStorages(paramsConsumer, consumer);
+ }
+}
[39/67] [abbrv] ignite git commit: Merge branches 'ignite-2.0' and
'master' of https://git-wip-us.apache.org/repos/asf/ignite
Posted by sb...@apache.org.
Merge branches 'ignite-2.0' and 'master' of https://git-wip-us.apache.org/repos/asf/ignite
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/fcc41ac4
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/fcc41ac4
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/fcc41ac4
Branch: refs/heads/ignite-5075
Commit: fcc41ac4be7c74890c948ed1d545054dda905f4d
Parents: 7297e1d 6ab579c
Author: Alexey Kuznetsov <ak...@gridgain.com>
Authored: Sat Apr 29 14:51:28 2017 +0700
Committer: Alexey Kuznetsov <ak...@gridgain.com>
Committed: Sat Apr 29 14:51:28 2017 +0700
----------------------------------------------------------------------
RELEASE_NOTES.txt | 36 ++++++++++++++++++++
.../org/apache/ignite/igfs/IgfsMetrics.java | 2 +-
.../visor/query/VisorQueryConfiguration.java | 12 -------
.../CacheMemoryPolicyConfigurationTest.java | 12 +++++--
.../MemoryPolicyInitializationTest.java | 18 ++++++----
.../Cache/Configuration/CacheConfiguration.cs | 3 --
.../IgniteConfigurationSection.xsd | 5 ---
.../commands/cache/VisorCacheCommand.scala | 1 -
.../web-console/backend/app/browsersHandler.js | 4 +--
modules/web-console/backend/app/mongo.js | 3 --
.../app/modules/agent/AgentManager.service.js | 20 +++++------
.../generator/ConfigurationGenerator.js | 3 --
.../generator/PlatformGenerator.js | 3 +-
.../generator/defaults/Cache.service.js | 2 --
.../generator/defaults/IGFS.service.js | 1 -
.../states/configuration/caches/query.pug | 6 ----
.../modules/states/configuration/igfs/misc.pug | 2 --
.../agent/handlers/DatabaseListener.java | 24 ++++++-------
pom.xml | 2 +-
19 files changed, 84 insertions(+), 75 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/fcc41ac4/pom.xml
----------------------------------------------------------------------
[21/67] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math
module to Ignite ML module added missed licenses renamed packages fixed wrong
ml profile activation (cherry picked from commit d78e071)
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/functions/Functions.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/functions/Functions.java b/modules/ml/src/main/java/org/apache/ignite/math/functions/Functions.java
deleted file mode 100644
index 7100908..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/functions/Functions.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * 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.ignite.math.functions;
-
-/**
- * Compatibility with Apache Mahout.
- */
-public final class Functions {
- /** Function that returns {@code Math.abs(a)}. */
- public static final IgniteDoubleFunction<Double> ABS = Math::abs;
-
- /** Function that returns its argument. */
- public static final IgniteDoubleFunction<Double> IDENTITY = (a) -> a;
-
- /** Function that returns {@code Math.log(a) / Math.log(2)}. */
- public static final IgniteDoubleFunction<Double> LOG2 = (a) -> Math.log(a) * 1.4426950408889634;
-
- /** Function that returns {@code -a}. */
- public static final IgniteDoubleFunction<Double> NEGATE = (a) -> -a;
-
- /** Function that returns {@code a < 0 ? -1 : a > 0 ? 1 : 0 }. */
- public static final IgniteDoubleFunction<Double> SIGN = (a) -> a < 0.0 ? -1.0 : a > 0.0 ? 1.0 : 0.0;
-
- /** Function that returns {@code a * a}. */
- public static final IgniteDoubleFunction<Double> SQUARE = (a) -> a * a;
-
- /** Function that returns {@code 1 / (1 + exp(-a) } */
- public static final IgniteDoubleFunction<Double> SIGMOID = (a) -> 1.0 / (1.0 + Math.exp(-a));
-
- /** Function that returns {@code 1 / a } */
- public static final IgniteDoubleFunction<Double> INV = (a) -> 1.0 / a;
-
- /** Function that returns {@code a * (1-a) } */
- public static final IgniteDoubleFunction<Double> SIGMOIDGRADIENT = (a) -> a * (1.0 - a);
-
- /** Function that returns {@code a % b}. */
- public static final IgniteBiFunction<Double, Double, Double> MOD = (a, b) -> a % b;
-
- /** Function that returns {@code a * b}. */
- public static final IgniteBiFunction<Double, Double, Double> MULT = (a, b) -> a * b;
-
- /** Function that returns {@code Math.log(a) / Math.log(b)}. */
- public static final IgniteBiFunction<Double, Double, Double> LG = (a, b) -> Math.log(a) / Math.log(b);
-
- /** Function that returns {@code a + b}. */
- public static final IgniteBiFunction<Double, Double, Double> PLUS = (a, b) -> a + b;
-
- /** Function that returns {@code a - b}. */
- public static final IgniteBiFunction<Double, Double, Double> MINUS = (a, b) -> a - b;
-
- /** Function that returns {@code abs(a - b)}. */
- public static final IgniteBiFunction<Double, Double, Double> MINUS_ABS = (a, b) -> Math.abs(a - b);
-
- /** Function that returns {@code max(abs(a), abs(b))}. */
- public static final IgniteBiFunction<Double, Double, Double> MAX_ABS = (a, b) -> Math.max(Math.abs(a), Math.abs(b));
-
- /** Function that returns {@code min(abs(a), abs(b))}. */
- public static final IgniteBiFunction<Double, Double, Double> MIN_ABS = (a, b) -> Math.min(Math.abs(a), Math.abs(b));
-
- /** Function that returns {@code Math.abs(a) + Math.abs(b)}. */
- public static final IgniteBiFunction<Double, Double, Double> PLUS_ABS = (a, b) -> Math.abs(a) + Math.abs(b);
-
- /** Function that returns {@code (a - b) * (a - b)} */
- public static final IgniteBiFunction<Double, Double, Double> MINUS_SQUARED = (a, b) -> (a - b) * (a - b);
-
- /**
- * Function that returns {@code a < b ? -1 : a > b ? 1 : 0}.
- */
- public static final IgniteBiFunction<Double, Double, Double> COMPARE = (a, b) -> a < b ? -1.0 : a > b ? 1.0 : 0.0;
-
- /**
- * Function that returns {@code a + b}. {@code a} is a variable, {@code b} is fixed.
- *
- * @param b
- */
- public static IgniteDoubleFunction<Double> plus(final double b) {
- return (a) -> a + b;
- }
-
- /**
- * Function that returns {@code a * b}. {@code a} is a variable, {@code b} is fixed.
- *
- * @param b
- */
- public static IgniteDoubleFunction<Double> mult(final double b) {
- return (a) -> a * b;
- }
-
- /** Function that returns {@code a / b}. {@code a} is a variable, {@code b} is fixed. */
- public static IgniteDoubleFunction<Double> div(double b) {
- return mult(1 / b);
- }
-
- /**
- * Function that returns {@code a + b*constant}. {@code a} and {@code b} are variables,
- * {@code constant} is fixed.
- */
- public static IgniteBiFunction<Double, Double, Double> plusMult(double constant) {
- return (a, b) -> a + b * constant;
- }
-
- /**
- * Function that returns {@code a - b*constant}. {@code a} and {@code b} are variables,
- * {@code constant} is fixed.
- */
- public static IgniteBiFunction<Double, Double, Double> minusMult(double constant) {
- return (a, b) -> a - b * constant;
- }
-
- /**
- * @param b
- */
- public static IgniteDoubleFunction<Double> pow(final double b) {
- return (a) -> {
- if (b == 2)
- return a * a;
- else
- return Math.pow(a, b);
- };
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/functions/IgniteBiConsumer.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/functions/IgniteBiConsumer.java b/modules/ml/src/main/java/org/apache/ignite/math/functions/IgniteBiConsumer.java
deleted file mode 100644
index 22e8274..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/functions/IgniteBiConsumer.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.apache.ignite.math.functions;
-
-import java.io.Serializable;
-import java.util.function.BiConsumer;
-
-/**
- * Serializable binary consumer.
- *
- * @see java.util.function.BiConsumer
- */
-public interface IgniteBiConsumer<T, U> extends BiConsumer<T, U>, Serializable {
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/functions/IgniteBiFunction.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/functions/IgniteBiFunction.java b/modules/ml/src/main/java/org/apache/ignite/math/functions/IgniteBiFunction.java
deleted file mode 100644
index 9d9c147..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/functions/IgniteBiFunction.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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.ignite.math.functions;
-
-import java.io.Serializable;
-import java.util.function.BiFunction;
-
-/**
- * Serializable binary function.
- *
- * @see java.util.function.BiFunction
- */
-public interface IgniteBiFunction<A, B, T> extends BiFunction<A, B, T>, Serializable {
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/functions/IgniteConsumer.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/functions/IgniteConsumer.java b/modules/ml/src/main/java/org/apache/ignite/math/functions/IgniteConsumer.java
deleted file mode 100644
index 1f7ca07..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/functions/IgniteConsumer.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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.ignite.math.functions;
-
-import java.io.Serializable;
-import java.util.function.Consumer;
-
-/**
- * Serializable consumer.
- *
- * @see java.util.function.Consumer
- */
-public interface IgniteConsumer<T> extends Consumer<T>, Serializable {
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/functions/IgniteDoubleFunction.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/functions/IgniteDoubleFunction.java b/modules/ml/src/main/java/org/apache/ignite/math/functions/IgniteDoubleFunction.java
deleted file mode 100644
index 7a23d50..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/functions/IgniteDoubleFunction.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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.ignite.math.functions;
-
-import java.io.Serializable;
-import java.util.function.DoubleFunction;
-
-/**
- * Serializable double function.
- *
- * @see java.util.function.DoubleFunction
- */
-public interface IgniteDoubleFunction<Double> extends DoubleFunction<Double>, Serializable {
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/functions/IgniteFunction.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/functions/IgniteFunction.java b/modules/ml/src/main/java/org/apache/ignite/math/functions/IgniteFunction.java
deleted file mode 100644
index cfe89a4..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/functions/IgniteFunction.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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.ignite.math.functions;
-
-import java.io.Serializable;
-import java.util.function.Function;
-
-/**
- * Serializable function.
- *
- * @see java.util.function.Function
- */
-public interface IgniteFunction<T, R> extends Function<T, R>, Serializable {
-
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/functions/IntDoubleToVoidFunction.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/functions/IntDoubleToVoidFunction.java b/modules/ml/src/main/java/org/apache/ignite/math/functions/IntDoubleToVoidFunction.java
deleted file mode 100644
index e5d69c7..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/functions/IntDoubleToVoidFunction.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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.ignite.math.functions;
-
-/**
- * Setter function for the vector.
- */
-public interface IntDoubleToVoidFunction extends IgniteBiConsumer<Integer, Double> {
-
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/functions/IntIntDoubleToVoidFunction.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/functions/IntIntDoubleToVoidFunction.java b/modules/ml/src/main/java/org/apache/ignite/math/functions/IntIntDoubleToVoidFunction.java
deleted file mode 100644
index cad8c3c..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/functions/IntIntDoubleToVoidFunction.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * 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.ignite.math.functions;
-
-import java.io.Serializable;
-
-/**
- * Setter function for matrices.
- */
-public interface IntIntDoubleToVoidFunction extends Serializable {
- /** */
- public void apply(int x, int y, double v);
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/functions/IntIntToDoubleFunction.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/functions/IntIntToDoubleFunction.java b/modules/ml/src/main/java/org/apache/ignite/math/functions/IntIntToDoubleFunction.java
deleted file mode 100644
index b31d9f9..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/functions/IntIntToDoubleFunction.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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.ignite.math.functions;
-
-/**
- * Getters functions for matrices.
- */
-public interface IntIntToDoubleFunction extends IgniteBiFunction<Integer, Integer, Double> {
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/functions/package-info.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/functions/package-info.java b/modules/ml/src/main/java/org/apache/ignite/math/functions/package-info.java
deleted file mode 100644
index 133e62c..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/functions/package-info.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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 description. -->
- * Contains serializable functions for distributed code algebra.
- */
-package org.apache.ignite.math.functions;
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/CacheUtils.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/CacheUtils.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/CacheUtils.java
deleted file mode 100644
index df33895..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/CacheUtils.java
+++ /dev/null
@@ -1,356 +0,0 @@
-/*
- * 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.ignite.math.impls;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Map;
-import javax.cache.Cache;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.Ignition;
-import org.apache.ignite.cache.affinity.Affinity;
-import org.apache.ignite.cache.query.ScanQuery;
-import org.apache.ignite.cluster.ClusterGroup;
-import org.apache.ignite.cluster.ClusterNode;
-import org.apache.ignite.lang.IgniteCallable;
-import org.apache.ignite.lang.IgniteRunnable;
-import org.apache.ignite.math.KeyMapper;
-import org.apache.ignite.math.ValueMapper;
-import org.apache.ignite.math.functions.IgniteBiFunction;
-import org.apache.ignite.math.functions.IgniteConsumer;
-import org.apache.ignite.math.functions.IgniteFunction;
-
-/**
- * Distribution-related misc. support.
- */
-public class CacheUtils {
- /**
- * Cache entry support.
- *
- * @param <K>
- * @param <V>
- */
- public static class CacheEntry<K, V> {
- /** */
- private Cache.Entry<K, V> entry;
- /** */
- private IgniteCache<K, V> cache;
-
- /**
- * @param entry Original cache entry.
- * @param cache Cache instance.
- */
- CacheEntry(Cache.Entry<K, V> entry, IgniteCache<K, V> cache) {
- this.entry = entry;
- this.cache = cache;
- }
-
- /**
- *
- *
- */
- public Cache.Entry<K, V> entry() {
- return entry;
- }
-
- /**
- *
- *
- */
- public IgniteCache<K, V> cache() {
- return cache;
- }
- }
-
- /**
- * Gets local Ignite instance.
- */
- public static Ignite ignite() {
- return Ignition.localIgnite();
- }
-
- /**
- * @param cacheName Cache name.
- * @param k Key into the cache.
- * @param <K> Key type.
- * @return Cluster group for given key.
- */
- public static <K> ClusterGroup groupForKey(String cacheName, K k) {
- return ignite().cluster().forNode(ignite().affinity(cacheName).mapKeyToNode(k));
- }
-
- /**
- * @param cacheName Cache name.
- * @param keyMapper {@link KeyMapper} to validate cache key.
- * @param valMapper {@link ValueMapper} to obtain double value for given cache key.
- * @param <K> Cache key object type.
- * @param <V> Cache value object type.
- * @return Sum of the values obtained for valid keys.
- */
- public static <K, V> double sum(String cacheName, KeyMapper<K> keyMapper, ValueMapper<V> valMapper) {
- Collection<Double> subSums = fold(cacheName, (CacheEntry<K, V> ce, Double acc) -> {
- if (keyMapper.isValid(ce.entry().getKey())) {
- double v = valMapper.toDouble(ce.entry().getValue());
-
- return acc == null ? v : acc + v;
- }
- else
- return acc;
- });
-
- return sum(subSums);
- }
-
- /**
- * @param cacheName Cache name.
- * @return Sum obtained using sparse logic.
- */
- public static <K, V> double sparseSum(String cacheName) {
- Collection<Double> subSums = fold(cacheName, (CacheEntry<Integer, Map<Integer, Double>> ce, Double acc) -> {
- Map<Integer, Double> map = ce.entry().getValue();
-
- double sum = sum(map.values());
-
- return acc == null ? sum : acc + sum;
- });
-
- return sum(subSums);
- }
-
- /**
- * @param c {@link Collection} of double values to sum.
- * @return Sum of the values.
- */
- private static double sum(Collection<Double> c) {
- double sum = 0.0;
-
- for (double d : c)
- sum += d;
-
- return sum;
- }
-
- /**
- * @param cacheName Cache name.
- * @param keyMapper {@link KeyMapper} to validate cache key.
- * @param valMapper {@link ValueMapper} to obtain double value for given cache key.
- * @param <K> Cache key object type.
- * @param <V> Cache value object type.
- * @return Minimum value for valid keys.
- */
- public static <K, V> double min(String cacheName, KeyMapper<K> keyMapper, ValueMapper<V> valMapper) {
- Collection<Double> mins = fold(cacheName, (CacheEntry<K, V> ce, Double acc) -> {
- if (keyMapper.isValid(ce.entry().getKey())) {
- double v = valMapper.toDouble(ce.entry().getValue());
-
- if (acc == null)
- return v;
- else
- return Math.min(acc, v);
- }
- else
- return acc;
- });
-
- return Collections.min(mins);
- }
-
- /**
- * @param cacheName Cache name.
- * @return Minimum value obtained using sparse logic.
- */
- public static <K, V> double sparseMin(String cacheName) {
- Collection<Double> mins = fold(cacheName, (CacheEntry<Integer, Map<Integer, Double>> ce, Double acc) -> {
- Map<Integer, Double> map = ce.entry().getValue();
-
- double min = Collections.min(map.values());
-
- if (acc == null)
- return min;
- else
- return Math.min(acc, min);
- });
-
- return Collections.min(mins);
- }
-
- /**
- * @param cacheName Cache name.
- * @return Maximum value obtained using sparse logic.
- */
- public static <K, V> double sparseMax(String cacheName) {
- Collection<Double> maxes = fold(cacheName, (CacheEntry<Integer, Map<Integer, Double>> ce, Double acc) -> {
- Map<Integer, Double> map = ce.entry().getValue();
-
- double max = Collections.max(map.values());
-
- if (acc == null)
- return max;
- else
- return Math.max(acc, max);
- });
-
- return Collections.max(maxes);
- }
-
- /**
- * @param cacheName Cache name.
- * @param keyMapper {@link KeyMapper} to validate cache key.
- * @param valMapper {@link ValueMapper} to obtain double value for given cache key.
- * @param <K> Cache key object type.
- * @param <V> Cache value object type.
- * @return Maximum value for valid keys.
- */
- public static <K, V> double max(String cacheName, KeyMapper<K> keyMapper, ValueMapper<V> valMapper) {
- Collection<Double> maxes = fold(cacheName, (CacheEntry<K, V> ce, Double acc) -> {
- if (keyMapper.isValid(ce.entry().getKey())) {
- double v = valMapper.toDouble(ce.entry().getValue());
-
- if (acc == null)
- return v;
- else
- return Math.max(acc, v);
- }
- else
- return acc;
- });
-
- return Collections.max(maxes);
- }
-
- /**
- * @param cacheName Cache name.
- * @param keyMapper {@link KeyMapper} to validate cache key.
- * @param valMapper {@link ValueMapper} to obtain double value for given cache key.
- * @param mapper Mapping {@link IgniteFunction}.
- * @param <K> Cache key object type.
- * @param <V> Cache value object type.
- */
- public static <K, V> void map(String cacheName, KeyMapper<K> keyMapper, ValueMapper<V> valMapper,
- IgniteFunction<Double, Double> mapper) {
- foreach(cacheName, (CacheEntry<K, V> ce) -> {
- K k = ce.entry().getKey();
-
- if (keyMapper.isValid(k))
- // Actual assignment.
- ce.cache().put(k, valMapper.fromDouble(mapper.apply(valMapper.toDouble(ce.entry().getValue()))));
- });
- }
-
- /**
- * @param cacheName Cache name.
- * @param mapper Mapping {@link IgniteFunction}.
- */
- public static <K, V> void sparseMap(String cacheName, IgniteFunction<Double, Double> mapper) {
- foreach(cacheName, (CacheEntry<Integer, Map<Integer, Double>> ce) -> {
- Integer k = ce.entry().getKey();
- Map<Integer, Double> v = ce.entry().getValue();
-
- for (Map.Entry<Integer, Double> e : v.entrySet())
- e.setValue(mapper.apply(e.getValue()));
-
- ce.cache().put(k, v);
- });
- }
-
- /**
- * @param cacheName Cache name.
- * @param fun An operation that accepts a cache entry and processes it.
- * @param <K> Cache key object type.
- * @param <V> Cache value object type.
- */
- public static <K, V> void foreach(String cacheName, IgniteConsumer<CacheEntry<K, V>> fun) {
- bcast(cacheName, () -> {
- Ignite ignite = Ignition.localIgnite();
- IgniteCache<K, V> cache = ignite.getOrCreateCache(cacheName);
-
- int partsCnt = ignite.affinity(cacheName).partitions();
-
- // Use affinity in filter for scan query. Otherwise we accept consumer in each node which is wrong.
- Affinity affinity = ignite.affinity(cacheName);
- ClusterNode locNode = ignite.cluster().localNode();
-
- // Iterate over all partitions. Some of them will be stored on that local node.
- for (int part = 0; part < partsCnt; part++) {
- int p = part;
-
- // Iterate over given partition.
- // Query returns an empty cursor if this partition is not stored on this node.
- for (Cache.Entry<K, V> entry : cache.query(new ScanQuery<K, V>(part,
- (k, v) -> affinity.mapPartitionToNode(p) == locNode)))
- fun.accept(new CacheEntry<>(entry, cache));
- }
- });
- }
-
- /**
- * <b>Currently fold supports only commutative operations.<b/>
- *
- * @param cacheName Cache name.
- * @param folder Fold function operating over cache entries.
- * @param <K> Cache key object type.
- * @param <V> Cache value object type.
- * @param <A> Fold result type.
- * @return Fold operation result.
- */
- public static <K, V, A> Collection<A> fold(String cacheName, IgniteBiFunction<CacheEntry<K, V>, A, A> folder) {
- return bcast(cacheName, () -> {
- Ignite ignite = Ignition.localIgnite();
- IgniteCache<K, V> cache = ignite.getOrCreateCache(cacheName);
-
- int partsCnt = ignite.affinity(cacheName).partitions();
-
- // Use affinity in filter for ScanQuery. Otherwise we accept consumer in each node which is wrong.
- Affinity affinity = ignite.affinity(cacheName);
- ClusterNode locNode = ignite.cluster().localNode();
-
- A a = null;
-
- // Iterate over all partitions. Some of them will be stored on that local node.
- for (int part = 0; part < partsCnt; part++) {
- int p = part;
-
- // Iterate over given partition.
- // Query returns an empty cursor if this partition is not stored on this node.
- for (Cache.Entry<K, V> entry : cache.query(new ScanQuery<K, V>(part,
- (k, v) -> affinity.mapPartitionToNode(p) == locNode)))
- a = folder.apply(new CacheEntry<>(entry, cache), a);
- }
-
- return a;
- });
- }
-
- /**
- * @param cacheName Cache name.
- * @param run {@link Runnable} to broadcast to cache nodes for given cache name.
- */
- public static void bcast(String cacheName, IgniteRunnable run) {
- ignite().compute(ignite().cluster().forCacheNodes(cacheName)).broadcast(run);
- }
-
- /**
- * @param cacheName Cache name.
- * @param call {@link IgniteCallable} to broadcast to cache nodes for given cache name.
- * @param <A> Type returned by the callable.
- */
- public static <A> Collection<A> bcast(String cacheName, IgniteCallable<A> call) {
- return ignite().compute(ignite().cluster().forCacheNodes(cacheName)).broadcast(call);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/AbstractMatrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/AbstractMatrix.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/AbstractMatrix.java
deleted file mode 100644
index ca11e81..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/AbstractMatrix.java
+++ /dev/null
@@ -1,880 +0,0 @@
-/*
- * 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.ignite.math.impls.matrix;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Random;
-import org.apache.ignite.lang.IgniteUuid;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.MatrixStorage;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.decompositions.LUDecomposition;
-import org.apache.ignite.math.exceptions.CardinalityException;
-import org.apache.ignite.math.exceptions.ColumnIndexException;
-import org.apache.ignite.math.exceptions.RowIndexException;
-import org.apache.ignite.math.functions.Functions;
-import org.apache.ignite.math.functions.IgniteBiFunction;
-import org.apache.ignite.math.functions.IgniteDoubleFunction;
-import org.apache.ignite.math.functions.IgniteFunction;
-import org.apache.ignite.math.functions.IntIntToDoubleFunction;
-import org.apache.ignite.math.impls.vector.MatrixVectorView;
-
-/**
- * This class provides a helper implementation of the {@link Matrix}
- * interface to minimize the effort required to implement it.
- * Subclasses may override some of the implemented methods if a more
- * specific or optimized implementation is desirable.
- *
- * TODO: add row/column optimization.
- */
-public abstract class AbstractMatrix implements Matrix {
- // Stochastic sparsity analysis.
- /** */
- private static final double Z95 = 1.959964;
- /** */
- private static final double Z80 = 1.281552;
- /** */
- private static final int MAX_SAMPLES = 500;
- /** */
- private static final int MIN_SAMPLES = 15;
-
- /** Cached minimum element. */
- private Element minElm;
- /** Cached maximum element. */
- private Element maxElm = null;
-
- /** Matrix storage implementation. */
- private MatrixStorage sto;
-
- /** Meta attributes storage. */
- private Map<String, Object> meta = new HashMap<>();
-
- /** Matrix's GUID. */
- private IgniteUuid guid = IgniteUuid.randomUuid();
-
- /**
- * @param sto Backing {@link MatrixStorage}.
- */
- public AbstractMatrix(MatrixStorage sto) {
- this.sto = sto;
- }
-
- /**
- *
- */
- public AbstractMatrix() {
- // No-op.
- }
-
- /**
- * @param sto Backing {@link MatrixStorage}.
- */
- protected void setStorage(MatrixStorage sto) {
- assert sto != null;
-
- this.sto = sto;
- }
-
- /**
- * @param row Row index in the matrix.
- * @param col Column index in the matrix.
- * @param v Value to set.
- */
- protected void storageSet(int row, int col, double v) {
- sto.set(row, col, v);
-
- // Reset cached values.
- minElm = maxElm = null;
- }
-
- /**
- * @param row Row index in the matrix.
- * @param col Column index in the matrix.
- */
- protected double storageGet(int row, int col) {
- return sto.get(row, col);
- }
-
- /** {@inheritDoc} */
- @Override public Element maxElement() {
- if (maxElm == null) {
- double max = Double.NEGATIVE_INFINITY;
- int row = 0, col = 0;
-
- int rows = rowSize();
- int cols = columnSize();
-
- for (int x = 0; x < rows; x++)
- for (int y = 0; y < cols; y++) {
- double d = storageGet(x, y);
-
- if (d > max) {
- max = d;
- row = x;
- col = y;
- }
- }
-
- maxElm = mkElement(row, col);
- }
-
- return maxElm;
- }
-
- /** {@inheritDoc} */
- @Override public Element minElement() {
- if (minElm == null) {
- double min = Double.MAX_VALUE;
- int row = 0, col = 0;
-
- int rows = rowSize();
- int cols = columnSize();
-
- for (int x = 0; x < rows; x++)
- for (int y = 0; y < cols; y++) {
- double d = storageGet(x, y);
-
- if (d < min) {
- min = d;
- row = x;
- col = y;
- }
- }
-
- minElm = mkElement(row, col);
- }
-
- return minElm;
- }
-
- /** {@inheritDoc} */
- @Override public double maxValue() {
- return maxElement().get();
- }
-
- /** {@inheritDoc} */
- @Override public double minValue() {
- return minElement().get();
- }
-
- /**
- * @param row Row index in the matrix.
- * @param col Column index in the matrix.
- */
- private Element mkElement(int row, int col) {
- return new Element() {
- /** {@inheritDoc} */
- @Override public double get() {
- return storageGet(row, col);
- }
-
- /** {@inheritDoc} */
- @Override public int row() {
- return row;
- }
-
- /** {@inheritDoc} */
- @Override public int column() {
- return col;
- }
-
- /** {@inheritDoc} */
- @Override public void set(double d) {
- storageSet(row, col, d);
- }
- };
- }
-
- /** {@inheritDoc} */
- @Override public Element getElement(int row, int col) {
- return mkElement(row, col);
- }
-
- /** {@inheritDoc} */
- @Override public Matrix swapRows(int row1, int row2) {
- checkRowIndex(row1);
- checkRowIndex(row2);
-
- int cols = columnSize();
-
- for (int y = 0; y < cols; y++) {
- double v = getX(row1, y);
-
- setX(row1, y, getX(row2, y));
- setX(row2, y, v);
- }
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public Matrix swapColumns(int col1, int col2) {
- checkColumnIndex(col1);
- checkColumnIndex(col2);
-
- int rows = rowSize();
-
- for (int x = 0; x < rows; x++) {
- double v = getX(x, col1);
-
- setX(x, col1, getX(x, col2));
- setX(x, col2, v);
- }
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public MatrixStorage getStorage() {
- return sto;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isSequentialAccess() {
- return sto.isSequentialAccess();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDense() {
- return sto.isDense();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isRandomAccess() {
- return sto.isRandomAccess();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDistributed() {
- return sto.isDistributed();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isArrayBased() {
- return sto.isArrayBased();
- }
-
- /**
- * Check row index bounds.
- *
- * @param row Row index.
- */
- private void checkRowIndex(int row) {
- if (row < 0 || row >= rowSize())
- throw new RowIndexException(row);
- }
-
- /**
- * Check column index bounds.
- *
- * @param col Column index.
- */
- private void checkColumnIndex(int col) {
- if (col < 0 || col >= columnSize())
- throw new ColumnIndexException(col);
- }
-
- /**
- * Check column and row index bounds.
- *
- * @param row Row index.
- * @param col Column index.
- */
- protected void checkIndex(int row, int col) {
- checkRowIndex(row);
- checkColumnIndex(col);
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- out.writeObject(sto);
- out.writeObject(meta);
- out.writeObject(guid);
- }
-
- /** {@inheritDoc} */
- @Override public Map<String, Object> getMetaStorage() {
- return meta;
- }
-
- /** {@inheritDoc} */
- @SuppressWarnings("unchecked")
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- sto = (MatrixStorage)in.readObject();
- meta = (Map<String, Object>)in.readObject();
- guid = (IgniteUuid)in.readObject();
- }
-
- /** {@inheritDoc} */
- @Override public Matrix assign(double val) {
- if (sto.isArrayBased())
- for (double[] column : sto.data())
- Arrays.fill(column, val);
- else {
- int rows = rowSize();
- int cols = columnSize();
-
- for (int x = 0; x < rows; x++)
- for (int y = 0; y < cols; y++)
- storageSet(x, y, val);
- }
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public Matrix assign(IntIntToDoubleFunction fun) {
- int rows = rowSize();
- int cols = columnSize();
-
- for (int x = 0; x < rows; x++)
- for (int y = 0; y < cols; y++)
- storageSet(x, y, fun.apply(x, y));
-
- return this;
- }
-
- /** */
- private void checkCardinality(Matrix mtx) {
- checkCardinality(mtx.rowSize(), mtx.columnSize());
- }
-
- /** */
- private void checkCardinality(int rows, int cols) {
- if (rows != rowSize())
- throw new CardinalityException(rowSize(), rows);
-
- if (cols != columnSize())
- throw new CardinalityException(columnSize(), cols);
- }
-
- /** {@inheritDoc} */
- @Override public Matrix assign(double[][] vals) {
- checkCardinality(vals.length, vals[0].length);
-
- int rows = rowSize();
- int cols = columnSize();
-
- for (int x = 0; x < rows; x++)
- for (int y = 0; y < cols; y++)
- storageSet(x, y, vals[x][y]);
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public Matrix assign(Matrix mtx) {
- checkCardinality(mtx);
-
- int rows = rowSize();
- int cols = columnSize();
-
- for (int x = 0; x < rows; x++)
- for (int y = 0; y < cols; y++)
- storageSet(x, y, mtx.getX(x, y));
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public Matrix map(IgniteDoubleFunction<Double> fun) {
- int rows = rowSize();
- int cols = columnSize();
-
- for (int x = 0; x < rows; x++)
- for (int y = 0; y < cols; y++)
- storageSet(x, y, fun.apply(storageGet(x, y)));
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public Matrix map(Matrix mtx, IgniteBiFunction<Double, Double, Double> fun) {
- checkCardinality(mtx);
-
- int rows = rowSize();
- int cols = columnSize();
-
- for (int x = 0; x < rows; x++)
- for (int y = 0; y < cols; y++)
- storageSet(x, y, fun.apply(storageGet(x, y), mtx.getX(x, y)));
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public Matrix assignColumn(int col, org.apache.ignite.math.Vector vec) {
- checkColumnIndex(col);
-
- int rows = rowSize();
-
- for (int x = 0; x < rows; x++)
- storageSet(x, col, vec.getX(x));
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public Matrix assignRow(int row, Vector vec) {
- checkRowIndex(row);
-
- int cols = columnSize();
-
- if (cols != vec.size())
- throw new CardinalityException(cols, vec.size());
-
- if (sto.isArrayBased() && vec.getStorage().isArrayBased())
- System.arraycopy(vec.getStorage().data(), 0, sto.data()[row], 0, cols);
- else
- for (int y = 0; y < cols; y++)
- storageSet(row, y, vec.getX(y));
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public Vector foldRows(IgniteFunction<Vector, Double> fun) {
- int rows = rowSize();
-
- Vector vec = likeVector(rows);
-
- for (int i = 0; i < rows; i++)
- vec.setX(i, fun.apply(viewRow(i)));
-
- return vec;
- }
-
- /** {@inheritDoc} */
- @Override public Vector foldColumns(IgniteFunction<Vector, Double> fun) {
- int cols = columnSize();
-
- Vector vec = likeVector(cols);
-
- for (int i = 0; i < cols; i++)
- vec.setX(i, fun.apply(viewColumn(i)));
-
- return vec;
- }
-
- /** {@inheritDoc} */
- @Override public <T> T foldMap(IgniteBiFunction<T, Double, T> foldFun, IgniteDoubleFunction<Double> mapFun,
- T zeroVal) {
- T res = zeroVal;
-
- int rows = rowSize();
- int cols = columnSize();
-
- for (int x = 0; x < rows; x++)
- for (int y = 0; y < cols; y++)
- res = foldFun.apply(res, mapFun.apply(storageGet(x, y)));
-
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public int columnSize() {
- return sto.columnSize();
- }
-
- /** {@inheritDoc} */
- @Override public int rowSize() {
- return sto.rowSize();
- }
-
- /** {@inheritDoc} */
- @Override public double determinant() {
- //TODO: This decomposition should be cached
- LUDecomposition dec = new LUDecomposition(this);
- double res = dec.determinant();
- dec.destroy();
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public Matrix inverse() {
- if (rowSize() != columnSize())
- throw new CardinalityException(rowSize(), columnSize());
-
- //TODO: This decomposition should be cached
- LUDecomposition dec = new LUDecomposition(this);
-
- Matrix res = dec.solve(likeIdentity());
- dec.destroy();
-
- return res;
- }
-
- /** */
- protected Matrix likeIdentity() {
- int n = rowSize();
- Matrix res = like(n, n);
-
- for (int i = 0; i < n; i++)
- res.setX(i, i, 1.0);
-
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public Matrix divide(double d) {
- int rows = rowSize();
- int cols = columnSize();
-
- for (int x = 0; x < rows; x++)
- for (int y = 0; y < cols; y++)
- setX(x, y, getX(x, y) / d);
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public double get(int row, int col) {
- checkIndex(row, col);
-
- return storageGet(row, col);
- }
-
- /** {@inheritDoc} */
- @Override public double getX(int row, int col) {
- return storageGet(row, col);
- }
-
- /** {@inheritDoc} */
- @Override public Matrix minus(Matrix mtx) {
- int rows = rowSize();
- int cols = columnSize();
-
- checkCardinality(rows, cols);
-
- Matrix res = like(rows, cols);
-
- for (int x = 0; x < rows; x++)
- for (int y = 0; y < cols; y++)
- res.setX(x, y, getX(x, y) - mtx.getX(x, y));
-
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public Matrix plus(double x) {
- Matrix cp = copy();
-
- cp.map(Functions.plus(x));
-
- return cp;
- }
-
- /** {@inheritDoc} */
- @Override public Matrix plus(Matrix mtx) {
- int rows = rowSize();
- int cols = columnSize();
-
- checkCardinality(rows, cols);
-
- Matrix res = like(rows, cols);
-
- for (int x = 0; x < rows; x++)
- for (int y = 0; y < cols; y++)
- res.setX(x, y, getX(x, y) + mtx.getX(x, y));
-
- return res;
-
- }
-
- /** {@inheritDoc} */
- @Override public IgniteUuid guid() {
- return guid;
- }
-
- /** {@inheritDoc} */
- @Override public Matrix set(int row, int col, double val) {
- checkIndex(row, col);
-
- storageSet(row, col, val);
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public Matrix setRow(int row, double[] data) {
- checkRowIndex(row);
-
- int cols = columnSize();
-
- if (cols != data.length)
- throw new CardinalityException(cols, data.length);
-
- if (sto.isArrayBased())
- System.arraycopy(data, 0, sto.data()[row], 0, cols);
- else
- for (int y = 0; y < cols; y++)
- setX(row, y, data[y]);
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public Matrix setColumn(int col, double[] data) {
- checkColumnIndex(col);
-
- int rows = rowSize();
-
- if (rows != data.length)
- throw new CardinalityException(rows, data.length);
-
- for (int x = 0; x < rows; x++)
- setX(x, col, data[x]);
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public Matrix setX(int row, int col, double val) {
- storageSet(row, col, val);
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public Matrix times(double x) {
- Matrix cp = copy();
-
- cp.map(Functions.mult(x));
-
- return cp;
- }
-
- /** {@inheritDoc} */
- @Override public double maxAbsRowSumNorm() {
- double max = 0.0;
-
- int rows = rowSize();
- int cols = columnSize();
-
- for (int x = 0; x < rows; x++) {
- double sum = 0;
-
- for (int y = 0; y < cols; y++)
- sum += Math.abs(getX(x, y));
-
- if (sum > max)
- max = sum;
- }
-
- return max;
- }
-
- /** {@inheritDoc} */
- @Override public Vector times(Vector vec) {
- int cols = columnSize();
-
- if (cols != vec.size())
- throw new CardinalityException(cols, vec.size());
-
- int rows = rowSize();
-
- Vector res = likeVector(rows);
-
- for (int x = 0; x < rows; x++)
- res.setX(x, vec.dot(viewRow(x)));
-
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public Matrix times(Matrix mtx) {
- int cols = columnSize();
-
- if (cols != mtx.rowSize())
- throw new CardinalityException(cols, mtx.rowSize());
-
- int rows = rowSize();
-
- int mtxCols = mtx.columnSize();
-
- Matrix res = like(rows, mtxCols);
-
- for (int x = 0; x < rows; x++)
- for (int y = 0; y < mtxCols; y++) {
- double sum = 0.0;
-
- for (int k = 0; k < cols; k++)
- sum += getX(x, k) * mtx.getX(k, y);
-
- res.setX(x, y, sum);
- }
-
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public double sum() {
- int rows = rowSize();
- int cols = columnSize();
-
- double sum = 0.0;
-
- for (int x = 0; x < rows; x++)
- for (int y = 0; y < cols; y++)
- sum += getX(x, y);
-
- return sum;
- }
-
- /** {@inheritDoc} */
- @Override public Matrix transpose() {
- int rows = rowSize();
- int cols = columnSize();
-
- Matrix mtx = like(cols, rows);
-
- for (int x = 0; x < rows; x++)
- for (int y = 0; y < cols; y++)
- mtx.setX(y, x, getX(x, y));
-
- return mtx;
- }
-
- /** {@inheritDoc} */
- @Override public boolean density(double threshold) {
- assert threshold >= 0.0 && threshold <= 1.0;
-
- int n = MIN_SAMPLES;
- int rows = rowSize();
- int cols = columnSize();
-
- double mean = 0.0;
- double pq = threshold * (1 - threshold);
-
- Random rnd = new Random();
-
- for (int i = 0; i < MIN_SAMPLES; i++)
- if (getX(rnd.nextInt(rows), rnd.nextInt(cols)) != 0.0)
- mean++;
-
- mean /= MIN_SAMPLES;
-
- double iv = Z80 * Math.sqrt(pq / n);
-
- if (mean < threshold - iv)
- return false; // Sparse.
- else if (mean > threshold + iv)
- return true; // Dense.
-
- while (n < MAX_SAMPLES) {
- // Determine upper bound we may need for 'n' to likely relinquish the uncertainty.
- // Here, we use confidence interval formula but solved for 'n'.
- double ivX = Math.max(Math.abs(threshold - mean), 1e-11);
-
- double stdErr = ivX / Z80;
- double nX = Math.min(Math.max((int)Math.ceil(pq / (stdErr * stdErr)), n), MAX_SAMPLES) - n;
-
- if (nX < 1.0) // IMPL NOTE this can happen with threshold 1.0
- nX = 1.0;
-
- double meanNext = 0.0;
-
- for (int i = 0; i < nX; i++)
- if (getX(rnd.nextInt(rows), rnd.nextInt(cols)) != 0.0)
- meanNext++;
-
- mean = (n * mean + meanNext) / (n + nX);
-
- n += nX;
-
- // Are we good now?
- iv = Z80 * Math.sqrt(pq / n);
-
- if (mean < threshold - iv)
- return false; // Sparse.
- else if (mean > threshold + iv)
- return true; // Dense.
- }
-
- return mean > threshold; // Dense if mean > threshold.
- }
-
- /** {@inheritDoc} */
- @Override public Matrix viewPart(int[] off, int[] size) {
- return new MatrixView(this, off[0], off[1], size[0], size[1]);
- }
-
- /** {@inheritDoc} */
- @Override public Matrix viewPart(int rowOff, int rows, int colOff, int cols) {
- return viewPart(new int[] {rowOff, colOff}, new int[] {rows, cols});
- }
-
- /** {@inheritDoc} */
- @Override public Vector viewRow(int row) {
- return new MatrixVectorView(this, row, 0, 0, 1);
- }
-
- /** {@inheritDoc} */
- @Override public Vector viewColumn(int col) {
- return new MatrixVectorView(this, 0, col, 1, 0);
- }
-
- /** {@inheritDoc} */
- @Override public Vector viewDiagonal() {
- return new MatrixVectorView(this, 0, 0, 1, 1);
- }
-
- /** {@inheritDoc} */
- @Override public Matrix copy() {
- Matrix cp = like(rowSize(), columnSize());
-
- cp.assign(this);
-
- return cp;
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- int res = 1;
-
- res = res * 37 + guid.hashCode();
- res = res * 37 + sto.hashCode();
- res = res * 37 + meta.hashCode();
-
- return res;
- }
-
- /**
- * {@inheritDoc}
- *
- * We ignore guid's for comparisons.
- */
- @Override public boolean equals(Object o) {
- if (this == o)
- return true;
-
- if (o == null || getClass() != o.getClass())
- return false;
-
- AbstractMatrix that = (AbstractMatrix)o;
-
- MatrixStorage sto = getStorage();
-
- return (sto != null ? sto.equals(that.getStorage()) : that.getStorage() == null);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/CacheMatrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/CacheMatrix.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/CacheMatrix.java
deleted file mode 100644
index 8ce1192..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/CacheMatrix.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * 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.ignite.math.impls.matrix;
-
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.MatrixKeyMapper;
-import org.apache.ignite.math.ValueMapper;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.apache.ignite.math.functions.IgniteDoubleFunction;
-import org.apache.ignite.math.functions.IgniteFunction;
-import org.apache.ignite.math.impls.CacheUtils;
-import org.apache.ignite.math.impls.storage.matrix.CacheMatrixStorage;
-
-/**
- * Matrix based on existing cache and key and value mapping functions.
- */
-public class CacheMatrix<K, V> extends AbstractMatrix {
- /**
- *
- */
- public CacheMatrix() {
- // No-op.
- }
-
- /**
- * Creates new matrix over existing cache.
- *
- * @param rows
- * @param cols
- * @param cache
- * @param keyMapper
- * @param valMapper
- */
- public CacheMatrix(
- int rows,
- int cols,
- IgniteCache<K, V> cache,
- MatrixKeyMapper<K> keyMapper,
- ValueMapper<V> valMapper) {
- assert rows > 0;
- assert cols > 0;
- assert cache != null;
- assert keyMapper != null;
- assert valMapper != null;
-
- setStorage(new CacheMatrixStorage<>(rows, cols, cache, keyMapper, valMapper));
- }
-
- /**
- *
- *
- */
- @SuppressWarnings({"unchecked"})
- private CacheMatrixStorage<K, V> storage() {
- return (CacheMatrixStorage<K, V>)getStorage();
- }
-
- /** {@inheritDoc} */
- @Override public Matrix copy() {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public Matrix like(int rows, int cols) {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public Vector likeVector(int crd) {
- throw new UnsupportedOperationException();
- }
-
- /**
- * Return the same matrix with updates values (broken contract).
- *
- * @param d
- */
- @Override public Matrix divide(double d) {
- return mapOverValues((Double v) -> v / d);
- }
-
- /**
- * Return the same matrix with updates values (broken contract).
- *
- * @param x
- */
- @Override public Matrix plus(double x) {
- return mapOverValues((Double v) -> v + x);
- }
-
- /**
- * Return the same matrix with updates values (broken contract).
- *
- * @param x
- */
- @Override public Matrix times(double x) {
- return mapOverValues((Double v) -> v * x);
- }
-
- /** {@inheritDoc} */
- @Override public Matrix assign(double val) {
- return mapOverValues((Double v) -> val);
- }
-
- /** {@inheritDoc} */
- @Override public Matrix map(IgniteDoubleFunction<Double> fun) {
- return mapOverValues(fun::apply);
- }
-
- /** {@inheritDoc} */
- @Override public double sum() {
- CacheMatrixStorage<K, V> sto = storage();
-
- return CacheUtils.sum(sto.cache().getName(), sto.keyMapper(), sto.valueMapper());
- }
-
- /** {@inheritDoc} */
- @Override public double maxValue() {
- CacheMatrixStorage<K, V> sto = storage();
-
- return CacheUtils.max(sto.cache().getName(), sto.keyMapper(), sto.valueMapper());
- }
-
- /** {@inheritDoc} */
- @Override public double minValue() {
- CacheMatrixStorage<K, V> sto = storage();
-
- return CacheUtils.min(sto.cache().getName(), sto.keyMapper(), sto.valueMapper());
- }
-
- /**
- * @param mapper
- */
- private Matrix mapOverValues(IgniteFunction<Double, Double> mapper) {
- CacheMatrixStorage<K, V> sto = storage();
-
- CacheUtils.map(sto.cache().getName(), sto.keyMapper(), sto.valueMapper(), mapper);
-
- return this;
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/DenseLocalOffHeapMatrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/DenseLocalOffHeapMatrix.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/DenseLocalOffHeapMatrix.java
deleted file mode 100644
index d5f8eca..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/DenseLocalOffHeapMatrix.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * 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.ignite.math.impls.matrix;
-
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.impls.storage.matrix.DenseOffHeapMatrixStorage;
-import org.apache.ignite.math.impls.vector.DenseLocalOffHeapVector;
-
-/**
- * Dense local off-heap implementation of the {@link Matrix} interface.
- */
-public class DenseLocalOffHeapMatrix extends AbstractMatrix {
- /** */
- public DenseLocalOffHeapMatrix() {
- // No-op.
- }
-
- /**
- * @param data Backing data array.
- */
- public DenseLocalOffHeapMatrix(double[][] data) {
- assert data != null;
-
- setStorage(new DenseOffHeapMatrixStorage(data));
- }
-
- /**
- * @param rows Amount of rows in matrix.
- * @param cols Amount of columns in matrix.
- */
- public DenseLocalOffHeapMatrix(int rows, int cols) {
- assert rows > 0;
- assert cols > 0;
-
- setStorage(new DenseOffHeapMatrixStorage(rows, cols));
- }
-
- /** {@inheritDoc} */
- @Override public Matrix copy() {
- DenseLocalOffHeapMatrix cp = new DenseLocalOffHeapMatrix(getStorage().rowSize(), getStorage().columnSize());
-
- cp.assign(this);
-
- return cp;
- }
-
- /** {@inheritDoc} */
- @Override public Matrix like(int rows, int cols) {
- return new DenseLocalOffHeapMatrix(rows, cols);
- }
-
- /** {@inheritDoc} */
- @Override public Vector likeVector(int crd) {
- return new DenseLocalOffHeapVector(crd);
- }
-
- /** {@inheritDoc} */
- @Override public void destroy() {
- getStorage().destroy();
- }
-
- /** {@inheritDoc} */
- @Override protected Matrix likeIdentity() {
- int n = rowSize();
- Matrix res = like(n, n);
-
- // IMPL NOTE as opposed to on-heap matrices this one isn't initialized with zeroes
- for (int i = 0; i < n; i++)
- for (int j = 0; j < n; j++)
- res.setX(i, j, i == j ? 1.0 : 0.0);
-
- return res;
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/DenseLocalOnHeapMatrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/DenseLocalOnHeapMatrix.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/DenseLocalOnHeapMatrix.java
deleted file mode 100644
index 3cc3e4f..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/DenseLocalOnHeapMatrix.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * 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.ignite.math.impls.matrix;
-
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.impls.storage.matrix.ArrayMatrixStorage;
-import org.apache.ignite.math.impls.vector.DenseLocalOnHeapVector;
-
-/**
- * Basic implementation for matrix.
- *
- * This is a trivial implementation for matrix assuming dense logic, local on-heap JVM storage
- * based on <code>double[][]</code> array. It is only suitable for data sets where
- * local, non-distributed execution is satisfactory and on-heap JVM storage is enough
- * to keep the entire data set.
- */
-public class DenseLocalOnHeapMatrix extends AbstractMatrix {
- /**
- *
- */
- public DenseLocalOnHeapMatrix() {
- // No-op.
- }
-
- /**
- * @param rows Amount of rows in matrix.
- * @param cols Amount of columns in matrix.
- */
- public DenseLocalOnHeapMatrix(int rows, int cols) {
- assert rows > 0;
- assert cols > 0;
-
- setStorage(new ArrayMatrixStorage(rows, cols));
- }
-
- /**
- * @param mtx Backing data array.
- */
- public DenseLocalOnHeapMatrix(double[][] mtx) {
- assert mtx != null;
-
- setStorage(new ArrayMatrixStorage(mtx));
- }
-
- /**
- * @param orig Original matrix.
- */
- private DenseLocalOnHeapMatrix(DenseLocalOnHeapMatrix orig) {
- assert orig != null;
-
- setStorage(new ArrayMatrixStorage(orig.rowSize(), orig.columnSize()));
-
- assign(orig);
- }
-
- /** {@inheritDoc} */
- @Override public Matrix copy() {
- return new DenseLocalOnHeapMatrix(this);
- }
-
- /** {@inheritDoc} */
- @Override public Matrix like(int rows, int cols) {
- return new DenseLocalOnHeapMatrix(rows, cols);
- }
-
- /** {@inheritDoc} */
- @Override public Vector likeVector(int crd) {
- return new DenseLocalOnHeapVector(crd);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/DiagonalMatrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/DiagonalMatrix.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/DiagonalMatrix.java
deleted file mode 100644
index 0b1f97e..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/DiagonalMatrix.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * 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.ignite.math.impls.matrix;
-
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.impls.storage.matrix.DiagonalMatrixStorage;
-import org.apache.ignite.math.impls.vector.ConstantVector;
-import org.apache.ignite.math.impls.vector.DenseLocalOnHeapVector;
-import org.apache.ignite.math.impls.vector.SingleElementVectorView;
-
-/**
- * Implementation of diagonal view of the {@link Matrix}.
- *
- * <p>See also: <a href="https://en.wikipedia.org/wiki/Diagonal_matrix">Wikipedia article</a>.</p>
- */
-public class DiagonalMatrix extends AbstractMatrix {
- /**
- *
- */
- public DiagonalMatrix() {
- // No-op.
- }
-
- /**
- * @param diagonal Backing {@link Vector}.
- */
- public DiagonalMatrix(Vector diagonal) {
- super(new DiagonalMatrixStorage(diagonal));
- }
-
- /**
- * @param mtx Backing {@link Matrix}.
- */
- public DiagonalMatrix(Matrix mtx) {
- super(new DiagonalMatrixStorage(mtx == null ? null : mtx.viewDiagonal()));
- }
-
- /**
- * @param vals Backing array of values at diagonal.
- */
- public DiagonalMatrix(double[] vals) {
- super(new DiagonalMatrixStorage(new DenseLocalOnHeapVector(vals)));
- }
-
- /**
- *
- *
- */
- private DiagonalMatrixStorage storage() {
- return (DiagonalMatrixStorage)getStorage();
- }
-
- /**
- * @param size Size of diagonal.
- * @param val Constant value at diagonal.
- */
- public DiagonalMatrix(int size, double val) {
- super(new DiagonalMatrixStorage(new ConstantVector(size, val)));
- }
-
- /** {@inheritDoc} */
- @Override public Vector viewRow(int row) {
- return new SingleElementVectorView(storage().diagonal(), row);
- }
-
- /** {@inheritDoc} */
- @Override public Vector viewColumn(int col) {
- return new SingleElementVectorView(storage().diagonal(), col);
- }
-
- /** {@inheritDoc} */
- @Override public Matrix copy() {
- return new DiagonalMatrix(storage().diagonal());
- }
-
- /** {@inheritDoc} */
- @Override public Matrix like(int rows, int cols) {
- return storage().diagonal().likeMatrix(rows, cols);
- }
-
- /** {@inheritDoc} */
- @Override public Vector likeVector(int crd) {
- return storage().diagonal().like(crd);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/FunctionMatrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/FunctionMatrix.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/FunctionMatrix.java
deleted file mode 100644
index b180b5b..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/FunctionMatrix.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * 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.ignite.math.impls.matrix;
-
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.apache.ignite.math.functions.IntIntDoubleToVoidFunction;
-import org.apache.ignite.math.functions.IntIntToDoubleFunction;
-import org.apache.ignite.math.impls.storage.matrix.FunctionMatrixStorage;
-
-/**
- * Implementation of {@link Matrix} that maps row and column index to {@link java.util.function} interfaces.
- */
-public class FunctionMatrix extends AbstractMatrix {
- /**
- *
- */
- public FunctionMatrix() {
- // No-op.
- }
-
- /**
- * Creates read-write or read-only function matrix.
- *
- * @param rows Amount of rows in the matrix.
- * @param cols Amount of columns in the matrix.
- * @param getFunc Function that returns value corresponding to given row and column index.
- * @param setFunc Set function. If {@code null} - this will be a read-only matrix.
- */
- public FunctionMatrix(int rows, int cols, IntIntToDoubleFunction getFunc, IntIntDoubleToVoidFunction setFunc) {
- assert rows > 0;
- assert cols > 0;
- assert getFunc != null;
-
- setStorage(new FunctionMatrixStorage(rows, cols, getFunc, setFunc));
- }
-
- /**
- * Creates read-only function matrix.
- *
- * @param rows Amount of rows in the matrix.
- * @param cols Amount of columns in the matrix.
- * @param getFunc Function that returns value corresponding to given row and column index.
- */
- public FunctionMatrix(int rows, int cols, IntIntToDoubleFunction getFunc) {
- assert rows > 0;
- assert cols > 0;
- assert getFunc != null;
-
- setStorage(new FunctionMatrixStorage(rows, cols, getFunc));
- }
-
- /**
- *
- *
- */
- private FunctionMatrixStorage storage() {
- return (FunctionMatrixStorage)getStorage();
- }
-
- /** {@inheritDoc} */
- @Override public Matrix copy() {
- FunctionMatrixStorage sto = storage();
-
- return new FunctionMatrix(sto.rowSize(), sto.columnSize(), sto.getFunction(), sto.setFunction());
- }
-
- /** {@inheritDoc} */
- @Override public Matrix like(int rows, int cols) {
- FunctionMatrixStorage sto = storage();
-
- return new FunctionMatrix(rows, cols, sto.getFunction(), sto.setFunction());
- }
-
- /** {@inheritDoc} */
- @Override public Vector likeVector(int crd) {
- throw new UnsupportedOperationException();
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/MatrixView.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/MatrixView.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/MatrixView.java
deleted file mode 100644
index 7b04dde..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/MatrixView.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * 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.ignite.math.impls.matrix;
-
-import java.io.Externalizable;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.MatrixStorage;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.apache.ignite.math.impls.storage.matrix.MatrixDelegateStorage;
-
-/**
- * Implements the rectangular view into the parent {@link Matrix}.
- */
-public class MatrixView extends AbstractMatrix {
- /**
- * Constructor for {@link Externalizable} interface.
- */
- public MatrixView() {
- // No-op.
- }
-
- /**
- * @param parent Backing parent {@link Matrix}.
- * @param rowOff Row offset to parent matrix.
- * @param colOff Column offset to parent matrix.
- * @param rows Amount of rows in the view.
- * @param cols Amount of columns in the view.
- */
- public MatrixView(Matrix parent, int rowOff, int colOff, int rows, int cols) {
- this(parent == null ? null : parent.getStorage(), rowOff, colOff, rows, cols);
- }
-
- /**
- * @param sto Backing parent {@link MatrixStorage}.
- * @param rowOff Row offset to parent storage.
- * @param colOff Column offset to parent storage.
- * @param rows Amount of rows in the view.
- * @param cols Amount of columns in the view.
- */
- public MatrixView(MatrixStorage sto, int rowOff, int colOff, int rows, int cols) {
- super(new MatrixDelegateStorage(sto, rowOff, colOff, rows, cols));
- }
-
- /**
- *
- *
- */
- private MatrixDelegateStorage storage() {
- return (MatrixDelegateStorage)getStorage();
- }
-
- /** {@inheritDoc} */
- @Override public Matrix copy() {
- MatrixDelegateStorage sto = storage();
-
- return new MatrixView(sto.delegate(), sto.rowOffset(), sto.columnOffset(), sto.rowSize(), sto.columnSize());
- }
-
- /** {@inheritDoc} */
- @Override public Matrix like(int rows, int cols) {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public Vector likeVector(int crd) {
- throw new UnsupportedOperationException();
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/PivotedMatrixView.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/PivotedMatrixView.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/PivotedMatrixView.java
deleted file mode 100644
index 1f7b008..0000000
--- a/modules/ml/src/main/java/org/apache/ignite/math/impls/matrix/PivotedMatrixView.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * 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.ignite.math.impls.matrix;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.MatrixStorage;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.exceptions.IndexException;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.apache.ignite.math.impls.storage.matrix.PivotedMatrixStorage;
-import org.apache.ignite.math.impls.vector.PivotedVectorView;
-
-/**
- * Pivoted (index mapped) view over another matrix implementation.
- */
-public class PivotedMatrixView extends AbstractMatrix {
- /** Pivoted matrix. */
- private Matrix mtx;
-
- /**
- *
- */
- public PivotedMatrixView() {
- // No-op.
- }
-
- /**
- * @param mtx
- * @param rowPivot
- * @param colPivot
- */
- public PivotedMatrixView(Matrix mtx, int[] rowPivot, int[] colPivot) {
- super(new PivotedMatrixStorage(mtx == null ? null : mtx.getStorage(), rowPivot, colPivot));
-
- this.mtx = mtx;
- }
-
- /**
- * @param mtx
- */
- public PivotedMatrixView(Matrix mtx) {
- super(new PivotedMatrixStorage(mtx == null ? null : mtx.getStorage()));
-
- this.mtx = mtx;
- }
-
- /**
- * @param mtx
- * @param pivot
- */
- public PivotedMatrixView(Matrix mtx, int[] pivot) {
- super(new PivotedMatrixStorage(mtx == null ? null : mtx.getStorage(), pivot));
-
- this.mtx = mtx;
- }
-
- /**
- * Swaps indexes {@code i} and {@code j} for both both row and column.
- *
- * @param i First index to swap.
- * @param j Second index to swap.
- */
- public Matrix swap(int i, int j) {
- swapRows(i, j);
- swapColumns(i, j);
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public Matrix swapRows(int i, int j) {
- if (i < 0 || i >= storage().rowPivot().length)
- throw new IndexException(i);
- if (j < 0 || j >= storage().rowPivot().length)
- throw new IndexException(j);
-
- storage().swapRows(i, j);
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public Matrix swapColumns(int i, int j) {
- if (i < 0 || i >= storage().columnPivot().length)
- throw new IndexException(i);
- if (j < 0 || j >= storage().columnPivot().length)
- throw new IndexException(j);
-
- storage().swapColumns(i, j);
-
- return this;
- }
-
- /** {@inheritDoc} */
- @Override public Vector viewRow(int row) {
- return new PivotedVectorView(
- mtx.viewRow(storage().rowPivot()[row]),
- storage().columnPivot(),
- storage().columnUnpivot()
- );
- }
-
- /** {@inheritDoc} */
- @Override public Vector viewColumn(int col) {
- return new PivotedVectorView(
- mtx.viewColumn(storage().columnPivot()[col]),
- storage().rowPivot(),
- storage().rowUnpivot()
- );
- }
-
- /**
- *
- *
- */
- public Matrix getBaseMatrix() {
- return mtx;
- }
-
- /**
- *
- *
- */
- public int[] rowPivot() {
- return storage().rowPivot();
- }
-
- /**
- *
- *
- */
- public int[] columnPivot() {
- return storage().columnPivot();
- }
-
- /**
- * @param i
- */
- public int rowPivot(int i) {
- return storage().rowPivot()[i];
- }
-
- /**
- * @param i
- */
- public int columnPivot(int i) {
- return storage().columnPivot()[i];
- }
-
- /**
- * @param i
- */
- public int rowUnpivot(int i) {
- return storage().rowUnpivot()[i];
- }
-
- /**
- * @param i
- */
- public int columnUnpivot(int i) {
- return storage().columnUnpivot()[i];
- }
-
- /** {@inheritDoc} */
- @Override public void writeExternal(ObjectOutput out) throws IOException {
- super.writeExternal(out);
-
- out.writeObject(mtx);
- }
-
- /** {@inheritDoc} */
- @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- super.readExternal(in);
-
- mtx = (Matrix)in.readObject();
- }
-
- /**
- *
- *
- */
- private PivotedMatrixStorage storage() {
- return (PivotedMatrixStorage)getStorage();
- }
-
- /** {@inheritDoc} */
- @Override public Matrix copy() {
- return new PivotedMatrixView(mtx, storage().rowPivot(), storage().columnPivot());
- }
-
- /** {@inheritDoc} */
- @Override public Matrix like(int rows, int cols) {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public Vector likeVector(int crd) {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- int res = 1;
-
- res = res * 37 + mtx.hashCode();
- res = res * 37 + getStorage().hashCode();
-
- return res;
- }
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object o) {
- if (this == o)
- return true;
-
- if (o == null || getClass() != o.getClass())
- return false;
-
- PivotedMatrixView that = (PivotedMatrixView)o;
-
- MatrixStorage sto = storage();
-
- return mtx.equals(that.mtx) && sto.equals(that.storage());
- }
-}
[08/67] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math
module to Ignite ML module added missed licenses renamed packages fixed wrong
ml profile activation (cherry picked from commit d78e071)
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/matrix/SparseDistributedMatrixStorageTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/matrix/SparseDistributedMatrixStorageTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/matrix/SparseDistributedMatrixStorageTest.java
deleted file mode 100644
index 66fe9b4..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/matrix/SparseDistributedMatrixStorageTest.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.matrix;
-
-import org.apache.ignite.Ignite;
-import org.apache.ignite.internal.util.IgniteUtils;
-import org.apache.ignite.math.StorageConstants;
-import org.apache.ignite.math.impls.MathTestConstants;
-import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
-import org.apache.ignite.testframework.junits.common.GridCommonTest;
-
-/**
- * Tests for {@link SparseDistributedMatrixStorage}.
- */
-@GridCommonTest(group = "Distributed Models")
-public class SparseDistributedMatrixStorageTest extends GridCommonAbstractTest {
- /** Number of nodes in grid */
- private static final int NODE_COUNT = 3;
- /** Cache name. */
- private static final String CACHE_NAME = "test-cache";
- /** */
- private static final String UNEXPECTED_ATTRIBUTE_VALUE = "Unexpected attribute value.";
- /** Grid instance. */
- private Ignite ignite;
-
- /**
- * Default constructor.
- */
- public SparseDistributedMatrixStorageTest() {
- super(false);
- }
-
- /** {@inheritDoc} */
- @Override protected void beforeTestsStarted() throws Exception {
- for (int i = 1; i <= NODE_COUNT; i++)
- startGrid(i);
- }
-
- /** {@inheritDoc} */
- @Override protected void afterTestsStopped() throws Exception {
- stopAllGrids();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override protected void beforeTest() throws Exception {
- ignite = grid(NODE_COUNT);
-
- ignite.configuration().setPeerClassLoadingEnabled(true);
- }
-
- /** {@inheritDoc} */
- @Override protected void afterTest() throws Exception {
- ignite.destroyCache(CACHE_NAME);
- }
-
- /** */
- public void testCacheCreation() throws Exception {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- final int rows = MathTestConstants.STORAGE_SIZE;
- final int cols = MathTestConstants.STORAGE_SIZE;
-
- SparseDistributedMatrixStorage storage = new SparseDistributedMatrixStorage(rows, cols, StorageConstants.ROW_STORAGE_MODE, StorageConstants.RANDOM_ACCESS_MODE);
-
- assertNotNull("SparseDistributedMatrixStorage cache is null.", storage.cache());
- }
-
- /** */
- public void testSetGet() throws Exception {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- final int rows = MathTestConstants.STORAGE_SIZE;
- final int cols = MathTestConstants.STORAGE_SIZE;
-
- SparseDistributedMatrixStorage storage = new SparseDistributedMatrixStorage(rows, cols, StorageConstants.ROW_STORAGE_MODE, StorageConstants.RANDOM_ACCESS_MODE);
-
- for (int i = 0; i < rows; i++) {
- for (int j = 0; j < cols; j++) {
- double v = Math.random();
- storage.set(i, j, v);
-
- assert Double.compare(v, storage.get(i, j)) == 0;
- assert Double.compare(v, storage.get(i, j)) == 0;
- }
- }
- }
-
- /** */
- public void testAttributes() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- final int rows = MathTestConstants.STORAGE_SIZE;
- final int cols = MathTestConstants.STORAGE_SIZE;
-
- SparseDistributedMatrixStorage storage = new SparseDistributedMatrixStorage(rows, cols, StorageConstants.ROW_STORAGE_MODE, StorageConstants.RANDOM_ACCESS_MODE);
-
- assertEquals(UNEXPECTED_ATTRIBUTE_VALUE, storage.rowSize(), rows);
- assertEquals(UNEXPECTED_ATTRIBUTE_VALUE, storage.columnSize(), cols);
-
- assertFalse(UNEXPECTED_ATTRIBUTE_VALUE, storage.isArrayBased());
- assertFalse(UNEXPECTED_ATTRIBUTE_VALUE, storage.isDense());
- assertTrue(UNEXPECTED_ATTRIBUTE_VALUE, storage.isDistributed());
-
- assertEquals(UNEXPECTED_ATTRIBUTE_VALUE, storage.isRandomAccess(), !storage.isSequentialAccess());
- assertTrue(UNEXPECTED_ATTRIBUTE_VALUE, storage.isRandomAccess());
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/vector/RandomAccessSparseVectorStorageTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/vector/RandomAccessSparseVectorStorageTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/vector/RandomAccessSparseVectorStorageTest.java
deleted file mode 100644
index 8a223fc..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/vector/RandomAccessSparseVectorStorageTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.vector;
-
-import org.apache.ignite.math.StorageConstants;
-import org.apache.ignite.math.impls.MathTestConstants;
-import org.junit.Test;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-
-/**
- * Unit tests for {@link SparseLocalOnHeapVectorStorage}.
- */
-public class RandomAccessSparseVectorStorageTest extends VectorBaseStorageTest<SparseLocalOnHeapVectorStorage> {
- /** */
- @Override public void setUp() {
- storage = new SparseLocalOnHeapVectorStorage(MathTestConstants.STORAGE_SIZE, StorageConstants.RANDOM_ACCESS_MODE);
- }
-
- /** */
- @Test
- public void data() throws Exception {
- assertNull(MathTestConstants.NULL_VAL, storage.data());
- }
-
- /** */
- @Test
- public void isSequentialAccess() throws Exception {
- assertFalse(MathTestConstants.UNEXPECTED_VAL, storage.isSequentialAccess());
- }
-
- /** */
- @Test
- public void isDense() throws Exception {
- assertFalse(MathTestConstants.UNEXPECTED_VAL, storage.isDense());
- }
-
- /** */
- @Test
- public void isArrayBased() throws Exception {
- assertFalse(MathTestConstants.UNEXPECTED_VAL, storage.isArrayBased());
- }
-
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/vector/SparseLocalOffHeapVectorStorageTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/vector/SparseLocalOffHeapVectorStorageTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/vector/SparseLocalOffHeapVectorStorageTest.java
deleted file mode 100644
index a7751d8..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/vector/SparseLocalOffHeapVectorStorageTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.vector;
-
-import org.apache.ignite.math.ExternalizeTest;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.apache.ignite.math.impls.MathTestConstants.STORAGE_SIZE;
-import static org.apache.ignite.math.impls.MathTestConstants.UNEXPECTED_VAL;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-/**
- * Tests for {@link SparseLocalOffHeapVectorStorage}.
- */
-public class SparseLocalOffHeapVectorStorageTest extends ExternalizeTest<SparseLocalOffHeapVectorStorage> {
- /** */ private SparseLocalOffHeapVectorStorage testVectorStorage;
-
- /** */
- @Before
- public void setup() {
- testVectorStorage = new SparseLocalOffHeapVectorStorage(STORAGE_SIZE);
- }
-
- /** */
- @After
- public void teardown() {
- testVectorStorage.destroy();
- testVectorStorage = null;
- }
-
- /** */
- @Test
- public void testBasic() {
- for (int i = 0; i < STORAGE_SIZE; i++) {
- double testVal = Math.random();
- testVectorStorage.set(i, testVal);
- assertEquals(UNEXPECTED_VAL, testVal, testVectorStorage.get(i), 0d);
- }
- }
-
- /** {@inheritDoc} */
- @Test(expected = UnsupportedOperationException.class)
- @Override public void externalizeTest() {
- super.externalizeTest(new SparseLocalOffHeapVectorStorage(STORAGE_SIZE));
- }
-
- /** */
- @Test
- public void testAttributes() {
- SparseLocalOffHeapVectorStorage testVectorStorage = new SparseLocalOffHeapVectorStorage(STORAGE_SIZE);
-
- assertTrue(UNEXPECTED_VAL, testVectorStorage.isRandomAccess());
- assertFalse(UNEXPECTED_VAL, testVectorStorage.isSequentialAccess());
- assertFalse(UNEXPECTED_VAL, testVectorStorage.isDense());
- assertFalse(UNEXPECTED_VAL, testVectorStorage.isArrayBased());
- assertFalse(UNEXPECTED_VAL, testVectorStorage.isDistributed());
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/vector/VectorArrayStorageTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/vector/VectorArrayStorageTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/vector/VectorArrayStorageTest.java
deleted file mode 100644
index 2afc97b..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/vector/VectorArrayStorageTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.vector;
-
-import java.util.Arrays;
-import org.apache.ignite.math.impls.MathTestConstants;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-/**
- * Unit test for {@link ArrayVectorStorage}.
- */
-public class VectorArrayStorageTest extends VectorBaseStorageTest<ArrayVectorStorage> {
- /** */
- @Override public void setUp() {
- storage = new ArrayVectorStorage(MathTestConstants.STORAGE_SIZE);
- }
-
- /** */
- @Test
- public void isArrayBased() throws Exception {
- assertTrue(MathTestConstants.WRONG_ATTRIBUTE_VAL, storage.isArrayBased());
-
- assertTrue(MathTestConstants.WRONG_ATTRIBUTE_VAL, new ArrayVectorStorage().isArrayBased());
- }
-
- /** */
- @Test
- public void data() throws Exception {
- assertNotNull(MathTestConstants.NULL_DATA_STORAGE, storage.data());
-
- assertEquals(MathTestConstants.WRONG_DATA_SIZE, storage.data().length, MathTestConstants.STORAGE_SIZE);
-
- assertTrue(MathTestConstants.UNEXPECTED_DATA_VAL, Arrays.equals(storage.data(), new double[MathTestConstants.STORAGE_SIZE]));
-
- assertNull(MathTestConstants.UNEXPECTED_DATA_VAL, new ArrayVectorStorage().data());
- }
-
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/vector/VectorBaseStorageTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/vector/VectorBaseStorageTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/vector/VectorBaseStorageTest.java
deleted file mode 100644
index 988f8c3..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/vector/VectorBaseStorageTest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.vector;
-
-import org.apache.ignite.math.ExternalizeTest;
-import org.apache.ignite.math.VectorStorage;
-import org.apache.ignite.math.impls.MathTestConstants;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-/**
- * Abstract class with base tests for each vector storage.
- */
-public abstract class VectorBaseStorageTest<T extends VectorStorage> extends ExternalizeTest<T> {
- /** */
- protected T storage;
-
- /** */
- @Before
- public abstract void setUp();
-
- /** */
- @After
- public void tearDown() throws Exception {
- storage.destroy();
- }
-
- /** */
- @Test
- public void getSet() throws Exception {
- for (int i = 0; i < MathTestConstants.STORAGE_SIZE; i++) {
- double random = Math.random();
-
- storage.set(i, random);
-
- assertEquals(MathTestConstants.WRONG_DATA_ELEMENT, storage.get(i), random, MathTestConstants.NIL_DELTA);
- }
- }
-
- /** */
- @Test
- public void size() {
- assertTrue(MathTestConstants.UNEXPECTED_VAL, storage.size() == MathTestConstants.STORAGE_SIZE);
- }
-
- /** */
- @Override public void externalizeTest() {
- super.externalizeTest(storage);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/vector/VectorOffheapStorageTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/vector/VectorOffheapStorageTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/vector/VectorOffheapStorageTest.java
deleted file mode 100644
index 2645926..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/storage/vector/VectorOffheapStorageTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * 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.ignite.math.impls.storage.vector;
-
-import org.apache.ignite.math.impls.MathTestConstants;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-/**
- * Unit tests for {@link DenseLocalOffHeapVectorStorage}.
- */
-public class VectorOffheapStorageTest extends VectorBaseStorageTest<DenseLocalOffHeapVectorStorage> {
- /** */
- @Before
- public void setUp() {
- storage = new DenseLocalOffHeapVectorStorage(MathTestConstants.STORAGE_SIZE);
- }
-
- /** */
- @Test
- public void isArrayBased() throws Exception {
- assertFalse(MathTestConstants.UNEXPECTED_VAL, storage.isArrayBased());
- }
-
- /** */
- @Test
- public void data() throws Exception {
- assertNull(MathTestConstants.NULL_VAL, storage.data());
- }
-
- /** */
- @Test
- public void isSequentialAccess() throws Exception {
- assertTrue(MathTestConstants.UNEXPECTED_VAL, storage.isSequentialAccess());
- }
-
- /** */
- @Test
- public void isDense() throws Exception {
- assertTrue(MathTestConstants.UNEXPECTED_VAL, storage.isDense());
- }
-
- /** */
- @Test
- public void equalsTest() {
- //noinspection EqualsWithItself
- assertTrue(MathTestConstants.VAL_NOT_EQUALS, storage.equals(storage));
-
- //noinspection EqualsBetweenInconvertibleTypes
- assertFalse(MathTestConstants.VALUES_SHOULD_BE_NOT_EQUALS,
- storage.equals(new ArrayVectorStorage(MathTestConstants.STORAGE_SIZE)));
- }
-
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/AbstractVectorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/AbstractVectorTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/AbstractVectorTest.java
deleted file mode 100644
index c7927a5..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/AbstractVectorTest.java
+++ /dev/null
@@ -1,543 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import java.util.Arrays;
-import java.util.stream.StreamSupport;
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.VectorStorage;
-import org.apache.ignite.math.exceptions.IndexException;
-import org.apache.ignite.math.functions.Functions;
-import org.apache.ignite.math.impls.MathTestConstants;
-import org.apache.ignite.math.impls.storage.vector.ArrayVectorStorage;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-/**
- * Unit test for {@link AbstractVector}.
- */
-public class AbstractVectorTest {
- /** */
- private AbstractVector testVector;
-
- /** */
- @Before
- public void setUp() {
- testVector = getAbstractVector();
- }
-
- /** */
- @Test
- public void setStorage() {
- testVector.setStorage(createStorage());
-
- assertTrue(testVector.size() == MathTestConstants.STORAGE_SIZE);
- }
-
- /** */
- @Test
- public void size() {
- testVector.setStorage(createStorage());
- assertTrue(testVector.size() == MathTestConstants.STORAGE_SIZE);
-
- testVector.setStorage(new ArrayVectorStorage(MathTestConstants.STORAGE_SIZE + MathTestConstants.STORAGE_SIZE));
- assertTrue(testVector.size() == MathTestConstants.STORAGE_SIZE + MathTestConstants.STORAGE_SIZE);
-
- testVector = getAbstractVector(createStorage());
- assertTrue(testVector.size() == MathTestConstants.STORAGE_SIZE);
- }
-
- /** */
- @Test
- public void getPositive() {
- testVector = getAbstractVector(createStorage());
-
- for (int i = 0; i < MathTestConstants.STORAGE_SIZE; i++)
- assertNotNull(MathTestConstants.NULL_VALUES, testVector.get(i));
-
- }
-
- /** */
- @Test(expected = NullPointerException.class)
- public void getNegative0() {
- testVector.get(0);
- }
-
- /** */
- @Test(expected = IndexException.class)
- public void getNegative1() {
- testVector.setStorage(createStorage());
-
- testVector.get(-1);
- }
-
- /** */
- @Test(expected = IndexException.class)
- public void getNegative2() {
- testVector.setStorage(createStorage());
-
- testVector.get(testVector.size() + 1);
- }
-
- /** */
- @Test(expected = NullPointerException.class)
- public void getXNegative0() {
- testVector.getX(0);
- }
-
- /** */
- @Test(expected = ArrayIndexOutOfBoundsException.class)
- public void getXNegative1() {
- testVector.setStorage(createStorage());
-
- testVector.getX(-1);
- }
-
- /** */
- @Test(expected = ArrayIndexOutOfBoundsException.class)
- public void getXNegative2() {
- testVector.setStorage(createStorage());
-
- testVector.getX(MathTestConstants.STORAGE_SIZE + 1);
- }
-
- /** */
- @Test
- public void set() {
- double[] data = initVector();
-
- for (int i = 0; i < MathTestConstants.STORAGE_SIZE; i++)
- testVector.set(i, Math.exp(data[i]));
-
- for (int i = 0; i < MathTestConstants.STORAGE_SIZE; i++)
- assertEquals(MathTestConstants.VAL_NOT_EQUALS, testVector.get(i), Math.exp(data[i]), MathTestConstants.NIL_DELTA);
- }
-
- /** */
- @Test(expected = IndexException.class)
- public void setNegative0() {
- testVector.set(-1, -1);
- }
-
- /** */
- @Test(expected = IndexException.class)
- public void setNegative1() {
- initVector();
-
- testVector.set(-1, -1);
- }
-
- /** */
- @Test(expected = IndexException.class)
- public void setNegative2() {
- initVector();
-
- testVector.set(MathTestConstants.STORAGE_SIZE + 1, -1);
- }
-
- /** */
- @Test(expected = IndexOutOfBoundsException.class)
- public void setXNegative0() {
- initVector();
-
- testVector.setX(-1, -1);
- }
-
- /** */
- @Test(expected = IndexOutOfBoundsException.class)
- public void setXNegative1() {
- initVector();
-
- testVector.setX(MathTestConstants.STORAGE_SIZE + 1, -1);
- }
-
- /** */
- @Test(expected = NullPointerException.class)
- public void setXNegative2() {
- testVector.setX(-1, -1);
- }
-
- /** */
- @Test
- public void isZero() {
- assertTrue(MathTestConstants.UNEXPECTED_VAL, testVector.isZero(0d));
-
- assertFalse(MathTestConstants.UNEXPECTED_VAL, testVector.isZero(1d));
- }
-
- /** */
- @Test
- public void guid() {
- assertNotNull(MathTestConstants.NULL_GUID, testVector.guid());
-
- assertEquals(MathTestConstants.UNEXPECTED_GUID_VAL, testVector.guid(), testVector.guid());
-
- assertFalse(MathTestConstants.EMPTY_GUID, testVector.guid().toString().isEmpty());
-
- testVector = getAbstractVector(createStorage());
-
- assertNotNull(MathTestConstants.NULL_GUID, testVector.guid());
-
- assertEquals(MathTestConstants.UNEXPECTED_GUID_VAL, testVector.guid(), testVector.guid());
-
- assertFalse(MathTestConstants.EMPTY_GUID, testVector.guid().toString().isEmpty());
- }
-
- /** */
- @Test
- public void equalsTest() {
- VectorStorage storage = createStorage();
-
- AbstractVector testVector1 = getAbstractVector();
-
- testVector1.setStorage(storage);
-
- AbstractVector testVector2 = getAbstractVector();
-
- assertEquals(MathTestConstants.VAL_NOT_EQUALS, testVector, testVector);
-
- testVector2.setStorage(storage);
-
- assertTrue(MathTestConstants.VAL_NOT_EQUALS, testVector1.equals(testVector2));
-
- assertFalse(MathTestConstants.VALUES_SHOULD_BE_NOT_EQUALS, testVector1.equals(testVector));
- }
-
- /** */
- @Test(expected = NullPointerException.class)
- public void all() {
- assertNotNull(MathTestConstants.NULL_VAL, testVector.all());
-
- assertNotNull(MathTestConstants.NULL_VAL, getAbstractVector(createStorage()).all());
-
- getAbstractVector().all().iterator().next();
- }
-
- /** */
- @Test
- public void nonZeroElements() {
- VectorStorage storage = createStorage();
-
- double[] data = storage.data();
-
- testVector = getAbstractVector(storage);
-
- assertEquals(MathTestConstants.VAL_NOT_EQUALS, testVector.nonZeroElements(), Arrays.stream(data).filter(x -> x != 0d).count());
-
- addNilValues(data);
-
- assertEquals(MathTestConstants.VAL_NOT_EQUALS, testVector.nonZeroElements(), Arrays.stream(data).filter(x -> x != 0d).count());
- }
-
- /** */
- @Test
- public void foldMapWithSecondVector() {
- double[] data0 = initVector();
-
- VectorStorage storage1 = createStorage();
-
- double[] data1 = storage1.data().clone();
-
- AbstractVector testVector1 = getAbstractVector(storage1);
-
- String testVal = "";
-
- for (int i = 0; i < data0.length; i++)
- testVal += data0[i] + data1[i];
-
- assertEquals(MathTestConstants.VAL_NOT_EQUALS, testVector.foldMap(testVector1, (string, xi) -> string.concat(xi.toString()), Functions.PLUS, ""), testVal);
- }
-
- /** */
- @Test
- public void nonZeroes() {
- assertNotNull(MathTestConstants.NULL_VAL, testVector.nonZeroes());
-
- double[] data = initVector();
-
- assertNotNull(MathTestConstants.NULL_VAL, testVector.nonZeroes());
-
- Assert.assertEquals(MathTestConstants.VAL_NOT_EQUALS, StreamSupport.stream(testVector.nonZeroes().spliterator(), false).count(), Arrays.stream(data).filter(x -> x != 0d).count());
-
- addNilValues(data);
-
- Assert.assertEquals(MathTestConstants.VAL_NOT_EQUALS, StreamSupport.stream(testVector.nonZeroes().spliterator(), false).count(), Arrays.stream(data).filter(x -> x != 0d).count());
- }
-
- /** */
- @Test(expected = NullPointerException.class)
- public void nonZeroesEmpty() {
- testVector.nonZeroes().iterator().next();
- }
-
- /** */
- @Test(expected = NullPointerException.class)
- public void assign() {
- testVector.assign(MathTestConstants.TEST_VAL);
- }
-
- /** */
- @Test(expected = NullPointerException.class)
- public void assignArr() {
- testVector.assign(new double[1]);
- }
-
- /** */
- @Test(expected = NullPointerException.class)
- public void assignArrEmpty() {
- testVector.assign(new double[0]);
- }
-
- /** */
- @Test(expected = NullPointerException.class)
- public void dotNegative() {
- testVector.dot(getAbstractVector(createEmptyStorage()));
- }
-
- /** */
- @Test
- public void dotSelf() {
- double[] data = initVector();
-
- assertEquals(MathTestConstants.VAL_NOT_EQUALS, testVector.dotSelf(), Arrays.stream(data).reduce(0, (x, y) -> x + y * y), MathTestConstants.NIL_DELTA);
- }
-
- /** */
- @Test
- public void getStorage() {
- assertNotNull(MathTestConstants.NULL_VAL, getAbstractVector(createEmptyStorage()));
- assertNotNull(MathTestConstants.NULL_VAL, getAbstractVector(createStorage()));
- testVector.setStorage(createStorage());
- assertNotNull(MathTestConstants.NULL_VAL, testVector.getStorage());
- }
-
- /** */
- @Test
- public void getElement() {
- double[] data = initVector();
-
- for (int i = 0; i < data.length; i++) {
- assertNotNull(MathTestConstants.NULL_VAL, testVector.getElement(i));
-
- assertEquals(MathTestConstants.UNEXPECTED_VAL, testVector.getElement(i).get(), data[i], MathTestConstants.NIL_DELTA);
-
- testVector.getElement(i).set(++data[i]);
-
- assertEquals(MathTestConstants.UNEXPECTED_VAL, testVector.getElement(i).get(), data[i], MathTestConstants.NIL_DELTA);
- }
- }
-
- /**
- * Create {@link AbstractVector} with storage for tests.
- *
- * @param storage {@link VectorStorage}
- * @return AbstractVector.
- */
- private AbstractVector getAbstractVector(VectorStorage storage) {
- return new AbstractVector(storage) { // TODO: find out how to fix warning about missing constructor
- /** */
- @Override public boolean isDense() {
- return false;
- }
-
- /** */
- @Override public boolean isSequentialAccess() {
- return false;
- }
-
- /** */
- @Override public Matrix likeMatrix(int rows, int cols) {
- return null;
- }
-
- /** */
- @Override public Vector copy() {
- return getAbstractVector(this.getStorage());
- }
-
- /** */
- @Override public Vector like(int crd) {
- return null;
- }
-
- /** */
- @Override public Vector normalize() {
- return null;
- }
-
- /** */
- @Override public Vector normalize(double power) {
- return null;
- }
-
- /** */
- @Override public Vector logNormalize() {
- return null;
- }
-
- /** */
- @Override public Vector logNormalize(double power) {
- return null;
- }
-
- /** */
- @Override public Vector viewPart(int off, int len) {
- return null;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isRandomAccess() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDistributed() {
- return false;
- }
- };
- }
-
- /**
- * Create empty {@link AbstractVector} for tests.
- *
- * @return AbstractVector.
- */
- private AbstractVector getAbstractVector() {
- return new AbstractVector() { // TODO: find out how to fix warning about missing constructor
- /** */
- @Override public boolean isDense() {
- return false;
- }
-
- /** */
- @Override public Matrix likeMatrix(int rows, int cols) {
- return null;
- }
-
- /** */
- @Override public boolean isSequentialAccess() {
- return false;
- }
-
- /** */
- @Override public Vector copy() {
- return getAbstractVector(this.getStorage());
- }
-
- /** */
- @Override public Vector like(int crd) {
- return null;
- }
-
- /** */
- @Override public Vector normalize() {
- return null;
- }
-
- /** */
- @Override public Vector normalize(double power) {
- return null;
- }
-
- /** */
- @Override public Vector logNormalize() {
- return null;
- }
-
- /** */
- @Override public Vector logNormalize(double power) {
- return null;
- }
-
- /** */
- @Override public Vector viewPart(int off, int len) {
- return null;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isRandomAccess() {
- return true;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDistributed() {
- return false;
- }
- };
- }
-
- /**
- * Create {@link VectorStorage} for tests.
- *
- * @return VectorStorage
- */
- private VectorStorage createEmptyStorage() {
- return new ArrayVectorStorage(MathTestConstants.STORAGE_SIZE);
- }
-
- /**
- * Create filled {@link VectorStorage} for tests.
- *
- * @return VectorStorage.
- */
- private VectorStorage createStorage() {
- ArrayVectorStorage storage = new ArrayVectorStorage(MathTestConstants.STORAGE_SIZE);
-
- for (int i = 0; i < MathTestConstants.STORAGE_SIZE; i++)
- storage.set(i, Math.random());
-
- return storage;
- }
-
- /**
- * Init vector and return initialized values.
- *
- * @return Initial values.
- */
- private double[] initVector() {
- VectorStorage storage = createStorage();
- double[] data = storage.data().clone();
-
- testVector = getAbstractVector(storage);
- return data;
- }
-
- /**
- * Add some zeroes to vector elements.
- */
- private void addNilValues() {
- testVector.set(10, 0);
- testVector.set(50, 0);
- }
-
- /**
- * Add some zeroes to vector elements. Also set zeroes to the same elements in reference array data
- */
- private void addNilValues(double[] testRef) {
- addNilValues();
- testRef[10] = 0;
- testRef[50] = 0;
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/CacheVectorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/CacheVectorTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/CacheVectorTest.java
deleted file mode 100644
index f276820..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/CacheVectorTest.java
+++ /dev/null
@@ -1,417 +0,0 @@
-package org.apache.ignite.math.impls.vector;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.util.stream.IntStream;
-import junit.framework.TestCase;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.configuration.CacheConfiguration;
-import org.apache.ignite.internal.util.IgniteUtils;
-import org.apache.ignite.math.IdentityValueMapper;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.VectorKeyMapper;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.apache.ignite.math.functions.Functions;
-import org.apache.ignite.math.impls.MathTestConstants;
-import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
-import org.apache.ignite.testframework.junits.common.GridCommonTest;
-
-/**
- * Tests for {@link CacheVector}.
- */
-@GridCommonTest(group = "Distributed Models")
-public class CacheVectorTest extends GridCommonAbstractTest {
- /** Number of nodes in grid */
- private static final int NODE_COUNT = 3;
- /** Cache name. */
- private static final String CACHE_NAME = "test-cache";
- /** Cache size. */
- private static final int size = MathTestConstants.STORAGE_SIZE;
- /** Grid instance. */
- private Ignite ignite;
- /** Default key mapper. */
- private VectorKeyMapper<Integer> keyMapper = new TestKeyMapper();
-
- /**
- * Default constructor.
- */
- public CacheVectorTest() {
- super(false);
- }
-
- /** {@inheritDoc} */
- @Override protected void beforeTestsStarted() throws Exception {
- for (int i = 1; i <= NODE_COUNT; i++)
- startGrid(i);
- }
-
- /** {@inheritDoc} */
- @Override protected void afterTestsStopped() throws Exception {
- stopAllGrids();
- }
-
- /** {@inheritDoc} */
- @Override protected void beforeTest() throws Exception {
- ignite = grid(NODE_COUNT);
-
- ignite.configuration().setPeerClassLoadingEnabled(true);
- }
-
- /** {@inheritDoc} */
- @Override protected void afterTest() throws Exception {
- ignite.destroyCache(CACHE_NAME);
- }
-
- /** */
- public void testGetSet() throws Exception {
- IdentityValueMapper valMapper = new IdentityValueMapper();
- CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
-
- for (int i = 0; i < size; i++) {
- double random = Math.random();
- cacheVector.set(i, random);
- assertEquals("Unexpected value.", random, cacheVector.get(i), 0d);
- }
- }
-
- /** */
- public void testMap() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- IdentityValueMapper valMapper = new IdentityValueMapper();
- CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
-
- initVector(cacheVector);
-
- cacheVector.map(value -> 110d);
-
- for (int i = 0; i < size; i++)
- assertEquals("Unexpected value.", cacheVector.get(i), 110d, 0d);
- }
-
- /** */
- public void testMapBiFunc() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- IdentityValueMapper valMapper = new IdentityValueMapper();
- CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
-
- initVector(cacheVector);
-
- cacheVector.map(Functions.PLUS, 1d);
-
- for (int i = 0; i < size; i++)
- assertEquals("Unexpected value.", cacheVector.get(i), 1d, 0d);
- }
-
- /** */
- public void testSum() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- IdentityValueMapper valMapper = new IdentityValueMapper();
- CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
-
- initVector(cacheVector);
-
- assertEquals("Unexpected value.", cacheVector.sum(), 0d, 0d);
-
- cacheVector.assign(1d);
-
- assertEquals("Unexpected value.", cacheVector.sum(), size, 0d);
- }
-
- /** */
- public void testSumNegative() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- IdentityValueMapper valMapper = new IdentityValueMapper();
- CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
-
- try {
- double d = cacheVector.sum();
- fail();
- }
- catch (NullPointerException e) {
- // No-op.
- }
- }
-
- /** */
- public void testAssign() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- IdentityValueMapper valMapper = new IdentityValueMapper();
- CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
-
- initVector(cacheVector);
-
- cacheVector.assign(1d);
-
- for (int i = 0; i < size; i++)
- assertEquals("Unexpected value.", cacheVector.get(i), 1d, 0d);
- }
-
- /** */
- public void testAssignRange() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- IdentityValueMapper valMapper = new IdentityValueMapper();
- CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
-
- cacheVector.assign(IntStream.range(0, size).asDoubleStream().toArray());
-
- for (int i = 0; i < size; i++)
- assertEquals("Unexpected value.", cacheVector.get(i), i, 0d);
- }
-
- /** */
- public void testAssignVector() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- IdentityValueMapper valMapper = new IdentityValueMapper();
- CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
-
- Vector testVec = new DenseLocalOnHeapVector(IntStream.range(0, size).asDoubleStream().toArray());
-
- cacheVector.assign(testVec);
-
- for (int i = 0; i < size; i++)
- assertEquals("Unexpected value.", cacheVector.get(i), testVec.get(i), 0d);
- }
-
- /** */
- public void testAssignFunc() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- IdentityValueMapper valMapper = new IdentityValueMapper();
- CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
-
- cacheVector.assign(idx -> idx);
-
- for (int i = 0; i < size; i++)
- assertEquals("Unexpected value.", cacheVector.get(i), i, 0d);
- }
-
- /** */
- public void testPlus() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- IdentityValueMapper valMapper = new IdentityValueMapper();
- CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
-
- initVector(cacheVector);
-
- cacheVector.plus(1d);
-
- for (int i = 0; i < size; i++)
- assertEquals("Unexpected value.", cacheVector.get(i), 1d, 0d);
- }
-
- /** */
- public void testPlusVec() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- IdentityValueMapper valMapper = new IdentityValueMapper();
- CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
-
- Vector testVec = new DenseLocalOnHeapVector(IntStream.range(0, size).asDoubleStream().toArray());
-
- try {
- cacheVector.plus(testVec);
- TestCase.fail();
- }
- catch (UnsupportedOperationException ignored) {
-
- }
- }
-
- /** */
- public void testDivide() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- final int size = MathTestConstants.STORAGE_SIZE;
-
- IdentityValueMapper valMapper = new IdentityValueMapper();
- CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
-
- initVector(cacheVector);
- cacheVector.assign(1d);
-
- cacheVector.divide(2d);
-
- for (int i = 0; i < size; i++)
- assertEquals("Unexpected value.", cacheVector.get(i), 1d / 2d, 0d);
- }
-
- /** */
- public void testTimes() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- final int size = MathTestConstants.STORAGE_SIZE;
-
- IdentityValueMapper valMapper = new IdentityValueMapper();
- CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
-
- initVector(cacheVector);
- cacheVector.assign(1d);
-
- cacheVector.times(2d);
-
- for (int i = 0; i < size; i++)
- assertEquals("Unexpected value.", cacheVector.get(i), 2d, 0d);
- }
-
- /** */
- public void testTimesVector() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- IdentityValueMapper valMapper = new IdentityValueMapper();
- CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
-
- cacheVector.assign(1d);
- Vector testVec = new DenseLocalOnHeapVector(IntStream.range(0, size).asDoubleStream().toArray());
-
- try {
- cacheVector.times(testVec);
- TestCase.fail();
- }
- catch (UnsupportedOperationException ignored) {
-
- }
-
- }
-
- /** */
- public void testMin() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- IdentityValueMapper valMapper = new IdentityValueMapper();
- CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
-
- Vector testVec = new DenseLocalOnHeapVector(IntStream.range(0, size).asDoubleStream().toArray());
-
- cacheVector.assign(testVec);
-
- assertEquals("Unexpected value.", cacheVector.minValue(), 0d, 0d);
- }
-
- /** */
- public void testMax() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- IdentityValueMapper valMapper = new IdentityValueMapper();
- CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
-
- Vector testVec = new DenseLocalOnHeapVector(IntStream.range(0, size).asDoubleStream().toArray());
-
- cacheVector.assign(testVec);
-
- assertEquals("Unexpected value.", cacheVector.maxValue(), testVec.get(size - 1), 0d);
- }
-
- /** */
- public void testLike() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- IdentityValueMapper valMapper = new IdentityValueMapper();
- CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
-
- try {
- cacheVector.like(size);
- TestCase.fail("Unsupported case");
- }
- catch (UnsupportedOperationException ignored) {
-
- }
- }
-
- /** */
- public void testLikeMatrix() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- IdentityValueMapper valMapper = new IdentityValueMapper();
- CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
-
- try {
- cacheVector.likeMatrix(size, size);
- TestCase.fail("Unsupported case");
- }
- catch (UnsupportedOperationException ignored) {
-
- }
- }
-
- /** */
- public void testCopy() {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- IdentityValueMapper valMapper = new IdentityValueMapper();
- CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
-
- try {
- cacheVector.copy();
- TestCase.fail("Unsupported case");
- }
- catch (UnsupportedOperationException ignored) {
-
- }
- }
-
- /** */
- public void testExternalize() throws IOException, ClassNotFoundException {
- IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
-
- IdentityValueMapper valMapper = new IdentityValueMapper();
- CacheVector<Integer, Double> cacheVector = new CacheVector<>(size, getCache(), keyMapper, valMapper);
-
- cacheVector.set(1, 1.0);
-
- ByteArrayOutputStream byteArrOutputStream = new ByteArrayOutputStream();
- ObjectOutputStream objOutputStream = new ObjectOutputStream(byteArrOutputStream);
-
- objOutputStream.writeObject(cacheVector);
-
- ByteArrayInputStream byteArrInputStream = new ByteArrayInputStream(byteArrOutputStream.toByteArray());
- ObjectInputStream objInputStream = new ObjectInputStream(byteArrInputStream);
-
- CacheVector objRestored = (CacheVector)objInputStream.readObject();
-
- assertTrue(MathTestConstants.VAL_NOT_EQUALS, cacheVector.equals(objRestored));
- assertEquals(MathTestConstants.VAL_NOT_EQUALS, objRestored.get(1), 1.0, 0.0);
- }
-
- /** */
- private void initVector(CacheVector cacheVector) {
- for (int i = 0; i < cacheVector.size(); i++)
- cacheVector.set(i, 0d);
- }
-
- /** */
- private IgniteCache<Integer, Double> getCache() {
- assert ignite != null;
-
- CacheConfiguration cfg = new CacheConfiguration();
- cfg.setName(CACHE_NAME);
-
- IgniteCache<Integer, Double> cache = ignite.getOrCreateCache(CACHE_NAME);
-
- assert cache != null;
- return cache;
- }
-
- /** */ private static class TestKeyMapper implements VectorKeyMapper<Integer> {
- /** {@inheritDoc} */
- @Override public Integer apply(int i) {
- return i;
- }
-
- /** {@inheritDoc} */
- @Override public boolean isValid(Integer i) {
- return i < size;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/ConstantVectorConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/ConstantVectorConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/ConstantVectorConstructorTest.java
deleted file mode 100644
index 2ed42bc..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/ConstantVectorConstructorTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-/** */
-public class ConstantVectorConstructorTest {
- /** */
- private static final int IMPOSSIBLE_SIZE = -1;
-
- /** */
- @Test(expected = AssertionError.class)
- public void negativeSizeTest() {
- assertEquals("Negative size.", IMPOSSIBLE_SIZE,
- new ConstantVector(-1, 1).size());
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void zeroSizeTest() {
- assertEquals("Zero size.", IMPOSSIBLE_SIZE,
- new ConstantVector(0, 1).size());
- }
-
- /** */
- @Test
- public void primitiveTest() {
- assertEquals("1 size.", 1,
- new ConstantVector(1, 1).size());
-
- assertEquals("2 size.", 2,
- new ConstantVector(2, 1).size());
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/DelegatingVectorConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/DelegatingVectorConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/DelegatingVectorConstructorTest.java
deleted file mode 100644
index 82e4e0b..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/DelegatingVectorConstructorTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import org.apache.ignite.math.Vector;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-/** */
-public class DelegatingVectorConstructorTest {
- /** */
- private static final int IMPOSSIBLE_SIZE = -1;
-
- /** */
- @Test
- public void basicTest() {
- final Vector parent = new DenseLocalOnHeapVector(new double[] {0, 1});
-
- final Vector delegate = new DelegatingVector(parent);
-
- final int size = parent.size();
-
- assertEquals("Delegate size differs from expected.", size, delegate.size());
-
- for (int idx = 0; idx < size; idx++)
- assertDelegate(parent, delegate, idx);
- }
-
- /** */
- private void assertDelegate(Vector parent, Vector delegate, int idx) {
- assertValue(parent, delegate, idx);
-
- parent.set(idx, parent.get(idx) + 1);
-
- assertValue(parent, delegate, idx);
-
- delegate.set(idx, delegate.get(idx) + 2);
-
- assertValue(parent, delegate, idx);
- }
-
- /** */
- private void assertValue(Vector parent, Vector delegate, int idx) {
- assertEquals("Unexpected value at index " + idx, parent.get(idx), delegate.get(idx), 0d);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/DenseLocalOffHeapVectorConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/DenseLocalOffHeapVectorConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/DenseLocalOffHeapVectorConstructorTest.java
deleted file mode 100644
index d62f35f..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/DenseLocalOffHeapVectorConstructorTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-/** */
-public class DenseLocalOffHeapVectorConstructorTest {
- /** */
- private static final int IMPOSSIBLE_SIZE = -1;
-
- /** */
- @Test(expected = AssertionError.class)
- public void negativeSizeTest() {
- assertEquals("Negative size.", IMPOSSIBLE_SIZE,
- new DenseLocalOffHeapVector(-1).size());
- }
-
- /** */
- @Test(expected = NullPointerException.class)
- public void nullArrayTest() {
- assertEquals("Null array.", IMPOSSIBLE_SIZE,
- new DenseLocalOffHeapVector(null).size());
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void zeroSizeTest() {
- assertEquals("0 size.", IMPOSSIBLE_SIZE,
- new DenseLocalOffHeapVector(new double[0]).size());
- }
-
- /** */
- @Test
- public void primitiveTest() {
- assertEquals("1 size.", 1,
- new DenseLocalOffHeapVector(new double[1]).size());
-
- assertEquals("2 size.", 2,
- new DenseLocalOffHeapVector(new double[2]).size());
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/DenseLocalOnHeapVectorConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/DenseLocalOnHeapVectorConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/DenseLocalOnHeapVectorConstructorTest.java
deleted file mode 100644
index c10778e..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/DenseLocalOnHeapVectorConstructorTest.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import java.util.HashMap;
-import java.util.Map;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-/** */
-public class DenseLocalOnHeapVectorConstructorTest {
- /** */
- private static final int IMPOSSIBLE_SIZE = -1;
-
- /** */
- @Test(expected = org.apache.ignite.math.exceptions.UnsupportedOperationException.class)
- public void mapInvalidArgsTest() {
- assertEquals("Expect exception due to invalid args.", IMPOSSIBLE_SIZE,
- new DenseLocalOnHeapVector(new HashMap<String, Object>() {{
- put("invalid", 99);
- }}).size());
- }
-
- /** */
- @Test(expected = UnsupportedOperationException.class)
- public void mapMissingArgsTest() {
- final Map<String, Object> test = new HashMap<String, Object>() {{
- put("arr", new double[0]);
- put("shallowCopyMissing", "whatever");
- }};
-
- assertEquals("Expect exception due to missing args.", IMPOSSIBLE_SIZE,
- new DenseLocalOnHeapVector(test).size());
- }
-
- /** */
- @Test(expected = ClassCastException.class)
- public void mapInvalidArrTypeTest() {
- final Map<String, Object> test = new HashMap<String, Object>() {{
- put("size", "whatever");
- }};
-
- assertEquals("Expect exception due to invalid arr type.", IMPOSSIBLE_SIZE,
- new DenseLocalOnHeapVector(test).size());
- }
-
- /** */
- @Test(expected = UnsupportedOperationException.class)
- public void mapInvalidCopyTypeTest() {
- final Map<String, Object> test = new HashMap<String, Object>() {{
- put("arr", new double[0]);
- put("shallowCopy", 0);
- }};
-
- assertEquals("Expect exception due to invalid copy type.", IMPOSSIBLE_SIZE,
- new DenseLocalOnHeapVector(test).size());
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void mapNullTest() {
- //noinspection ConstantConditions
- assertEquals("Null map args.", IMPOSSIBLE_SIZE,
- new DenseLocalOnHeapVector((Map<String, Object>)null).size());
- }
-
- /** */
- @Test
- public void mapTest() {
- assertEquals("Size from args.", 99,
- new DenseLocalOnHeapVector(new HashMap<String, Object>() {{
- put("size", 99);
- }}).size());
-
- final double[] test = new double[99];
-
- assertEquals("Size from array in args.", test.length,
- new DenseLocalOnHeapVector(new HashMap<String, Object>() {{
- put("arr", test);
- put("copy", false);
- }}).size());
-
- assertEquals("Size from array in args, shallow copy.", test.length,
- new DenseLocalOnHeapVector(new HashMap<String, Object>() {{
- put("arr", test);
- put("copy", true);
- }}).size());
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void negativeSizeTest() {
- assertEquals("Negative size.", IMPOSSIBLE_SIZE,
- new DenseLocalOnHeapVector(-1).size());
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void nullCopyTest() {
- assertEquals("Null array to non-shallow copy.", IMPOSSIBLE_SIZE,
- new DenseLocalOnHeapVector(null, false).size());
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void nullDefaultCopyTest() {
- assertEquals("Null array default copy.", IMPOSSIBLE_SIZE,
- new DenseLocalOnHeapVector((double[])null).size());
- }
-
- /** */
- @Test(expected = NullPointerException.class)
- public void defaultConstructorTest() {
- assertEquals("Default constructor.", IMPOSSIBLE_SIZE,
- new DenseLocalOnHeapVector().size());
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void nullArrShallowCopyTest() {
- assertEquals("Null array shallow copy.", IMPOSSIBLE_SIZE,
- new DenseLocalOnHeapVector(null, true).size());
- }
-
- /** */
- @Test
- public void primitiveTest() {
- assertEquals("0 size shallow copy.", 0,
- new DenseLocalOnHeapVector(new double[0], true).size());
-
- assertEquals("0 size.", 0,
- new DenseLocalOnHeapVector(new double[0], false).size());
-
- assertEquals("1 size shallow copy.", 1,
- new DenseLocalOnHeapVector(new double[1], true).size());
-
- assertEquals("1 size.", 1,
- new DenseLocalOnHeapVector(new double[1], false).size());
-
- assertEquals("0 size default copy.", 0,
- new DenseLocalOnHeapVector(new double[0]).size());
-
- assertEquals("1 size default copy.", 1,
- new DenseLocalOnHeapVector(new double[1]).size());
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/FunctionVectorConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/FunctionVectorConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/FunctionVectorConstructorTest.java
deleted file mode 100644
index 57c96d1..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/FunctionVectorConstructorTest.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.function.IntToDoubleFunction;
-import org.apache.ignite.math.exceptions.UnsupportedOperationException;
-import org.apache.ignite.math.functions.IgniteFunction;
-import org.apache.ignite.math.functions.IntDoubleToVoidFunction;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-/** */
-public class FunctionVectorConstructorTest {
- /** */
- private static final int IMPOSSIBLE_SIZE = -1;
-
- /** */
- @Test(expected = org.apache.ignite.math.exceptions.UnsupportedOperationException.class)
- public void mapInvalidArgsTest() {
- assertEquals("Expect exception due to invalid args.", IMPOSSIBLE_SIZE,
- new FunctionVector(new HashMap<String, Object>() {{
- put("invalid", 99);
- }}).size());
- }
-
- /** */
- @Test(expected = UnsupportedOperationException.class)
- public void mapMissingArgsTest() {
- final Map<String, Object> test = new HashMap<String, Object>() {{
- put("size", 1);
- put("paramMissing", "whatever");
- }};
-
- assertEquals("Expect exception due to missing args.",
- -1, new FunctionVector(test).size());
- }
-
- /** */
- @Test(expected = ClassCastException.class)
- public void mapInvalidParamTypeTest() {
- final Map<String, Object> test = new HashMap<String, Object>() {{
- put("size", "whatever");
-
- put("getFunc", (IntToDoubleFunction)i -> i);
- }};
-
- assertEquals("Expect exception due to invalid param type.", IMPOSSIBLE_SIZE,
- new FunctionVector(test).size());
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void mapNullTest() {
- //noinspection ConstantConditions
- assertEquals("Null map args.", IMPOSSIBLE_SIZE,
- new FunctionVector(null).size());
- }
-
- /** */
- @Test
- public void mapTest() {
- assertEquals("Size from args.", 99,
- new FunctionVector(new HashMap<String, Object>() {{
- put("size", 99);
-
- put("getFunc", (IgniteFunction<Integer, Double>)i -> (double)i);
- }}).size());
-
- assertEquals("Size from args with setFunc.", 99,
- new FunctionVector(new HashMap<String, Object>() {{
- put("size", 99);
-
- put("getFunc", (IgniteFunction<Integer, Double>)i -> (double)i);
-
- put("setFunc", (IntDoubleToVoidFunction)(integer, aDouble) -> {
- });
- }}).size());
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void negativeSizeTest() {
- assertEquals("Negative size.", IMPOSSIBLE_SIZE,
- new FunctionVector(-1, (i) -> (double)i).size());
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void zeroSizeTest() {
- assertEquals("0 size.", IMPOSSIBLE_SIZE,
- new FunctionVector(0, (i) -> (double)i).size());
- }
-
- /** */
- @Test
- public void primitiveTest() {
- assertEquals("1 size.", 1,
- new FunctionVector(1, (i) -> (double)i).size());
-
- assertEquals("2 size.", 2,
- new FunctionVector(2, (i) -> (double)i).size());
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/MatrixVectorViewTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/MatrixVectorViewTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/MatrixVectorViewTest.java
deleted file mode 100644
index b7e390e..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/MatrixVectorViewTest.java
+++ /dev/null
@@ -1,209 +0,0 @@
-package org.apache.ignite.math.impls.vector;
-
-import org.apache.ignite.math.Matrix;
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.exceptions.IndexException;
-import org.apache.ignite.math.impls.matrix.DenseLocalOnHeapMatrix;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-/**
- * Tests for {@link MatrixVectorView}.
- */
-public class MatrixVectorViewTest {
- /** */
- private static final String UNEXPECTED_VALUE = "Unexpected value";
- /** */
- private static final int SMALL_SIZE = 3;
- /** */
- private static final int IMPOSSIBLE_SIZE = -1;
-
- /** */
- private Matrix parent;
-
- /** */
- @Before
- public void setup() {
- parent = newMatrix(SMALL_SIZE, SMALL_SIZE);
- }
-
- /** */
- @Test
- public void testDiagonal() {
- Vector vector = parent.viewDiagonal();
-
- for (int i = 0; i < SMALL_SIZE; i++)
- assertView(i, i, vector, i);
- }
-
- /** */
- @Test
- public void testRow() {
- for (int i = 0; i < SMALL_SIZE; i++) {
- Vector viewRow = parent.viewRow(i);
-
- for (int j = 0; j < SMALL_SIZE; j++)
- assertView(i, j, viewRow, j);
- }
- }
-
- /** */
- @Test
- public void testCols() {
- for (int i = 0; i < SMALL_SIZE; i++) {
- Vector viewCol = parent.viewColumn(i);
-
- for (int j = 0; j < SMALL_SIZE; j++)
- assertView(j, i, viewCol, j);
- }
- }
-
- /** */
- @Test
- public void basicTest() {
- for (int rowSize : new int[] {1, 2, 3, 4})
- for (int colSize : new int[] {1, 2, 3, 4})
- for (int row = 0; row < rowSize; row++)
- for (int col = 0; col < colSize; col++)
- for (int rowStride = 0; rowStride < rowSize; rowStride++)
- for (int colStride = 0; colStride < colSize; colStride++)
- if (rowStride != 0 || colStride != 0)
- assertMatrixVectorView(newMatrix(rowSize, colSize), row, col, rowStride, colStride);
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void parentNullTest() {
- //noinspection ConstantConditions
- assertEquals(IMPOSSIBLE_SIZE,
- new MatrixVectorView(null, 1, 1, 1, 1).size());
- }
-
- /** */
- @Test(expected = IndexException.class)
- public void rowNegativeTest() {
- //noinspection ConstantConditions
- assertEquals(IMPOSSIBLE_SIZE,
- new MatrixVectorView(parent, -1, 1, 1, 1).size());
- }
-
- /** */
- @Test(expected = IndexException.class)
- public void colNegativeTest() {
- //noinspection ConstantConditions
- assertEquals(IMPOSSIBLE_SIZE,
- new MatrixVectorView(parent, 1, -1, 1, 1).size());
- }
-
- /** */
- @Test(expected = IndexException.class)
- public void rowTooLargeTest() {
- //noinspection ConstantConditions
- assertEquals(IMPOSSIBLE_SIZE,
- new MatrixVectorView(parent, parent.rowSize() + 1, 1, 1, 1).size());
- }
-
- /** */
- @Test(expected = IndexException.class)
- public void colTooLargeTest() {
- //noinspection ConstantConditions
- assertEquals(IMPOSSIBLE_SIZE,
- new MatrixVectorView(parent, 1, parent.columnSize() + 1, 1, 1).size());
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void rowStrideNegativeTest() {
- //noinspection ConstantConditions
- assertEquals(IMPOSSIBLE_SIZE,
- new MatrixVectorView(parent, 1, 1, -1, 1).size());
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void colStrideNegativeTest() {
- //noinspection ConstantConditions
- assertEquals(IMPOSSIBLE_SIZE,
- new MatrixVectorView(parent, 1, 1, 1, -1).size());
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void rowStrideTooLargeTest() {
- //noinspection ConstantConditions
- assertEquals(IMPOSSIBLE_SIZE,
- new MatrixVectorView(parent, 1, 1, parent.rowSize() + 1, 1).size());
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void colStrideTooLargeTest() {
- //noinspection ConstantConditions
- assertEquals(IMPOSSIBLE_SIZE,
- new MatrixVectorView(parent, 1, 1, 1, parent.columnSize() + 1).size());
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void bothStridesZeroTest() {
- //noinspection ConstantConditions
- assertEquals(IMPOSSIBLE_SIZE,
- new MatrixVectorView(parent, 1, 1, 0, 0).size());
- }
-
- /** */
- private void assertMatrixVectorView(Matrix parent, int row, int col, int rowStride, int colStride) {
- MatrixVectorView view = new MatrixVectorView(parent, row, col, rowStride, colStride);
-
- String desc = "parent [" + parent.rowSize() + "x" + parent.columnSize() + "], view ["
- + row + "x" + col + "], strides [" + rowStride + ", " + colStride + "]";
-
- final int size = view.size();
-
- final int sizeByRows = rowStride == 0 ? IMPOSSIBLE_SIZE : (parent.rowSize() - row) / rowStride;
- final int sizeByCols = colStride == 0 ? IMPOSSIBLE_SIZE : (parent.columnSize() - col) / colStride;
-
- assertTrue("Size " + size + " differs from expected for " + desc,
- size == sizeByRows || size == sizeByCols);
-
- for (int idx = 0; idx < size; idx++) {
- final int rowIdx = row + idx * rowStride;
- final int colIdx = col + idx * colStride;
-
- assertEquals(UNEXPECTED_VALUE + " at view index " + idx + desc,
- parent.get(rowIdx, colIdx), view.get(idx), 0d);
- }
- }
-
- /** */
- private Matrix newMatrix(int rowSize, int colSize) {
- Matrix res = new DenseLocalOnHeapMatrix(rowSize, colSize);
-
- for (int i = 0; i < res.rowSize(); i++)
- for (int j = 0; j < res.columnSize(); j++)
- res.set(i, j, i * res.rowSize() + j);
-
- return res;
- }
-
- /** */
- private void assertView(int row, int col, Vector view, int viewIdx) {
- assertValue(row, col, view, viewIdx);
-
- parent.set(row, col, parent.get(row, col) + 1);
-
- assertValue(row, col, view, viewIdx);
-
- view.set(viewIdx, view.get(viewIdx) + 2);
-
- assertValue(row, col, view, viewIdx);
- }
-
- /** */
- private void assertValue(int row, int col, Vector view, int viewIdx) {
- assertEquals(UNEXPECTED_VALUE + " at row " + row + " col " + col, parent.get(row, col), view.get(viewIdx), 0d);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/PivotedVectorViewConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/PivotedVectorViewConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/PivotedVectorViewConstructorTest.java
deleted file mode 100644
index 91650dc..0000000
--- a/modules/ml/src/test/java/org/apache/ignite/math/impls/vector/PivotedVectorViewConstructorTest.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * 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.ignite.math.impls.vector;
-
-import org.apache.ignite.math.Vector;
-import org.apache.ignite.math.exceptions.CardinalityException;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-/** */
-public class PivotedVectorViewConstructorTest {
- /** */
- private static final int IMPOSSIBLE_SIZE = -1;
-
- /** */
- private static final SampleParams sampleParams = new SampleParams();
-
- /** */
- @Test(expected = NullPointerException.class)
- public void nullVecParamTest() {
- assertEquals("Expect exception due to null vector param.", IMPOSSIBLE_SIZE,
- new PivotedVectorView(null, sampleParams.pivot).size());
- }
-
- /** */
- @Test(expected = NullPointerException.class)
- public void nullVecParam2Test() {
- assertEquals("Expect exception due to null vector param, with unpivot.", IMPOSSIBLE_SIZE,
- new PivotedVectorView(null, sampleParams.pivot, sampleParams.unpivot).size());
- }
-
- /** */
- @Test(expected = NullPointerException.class)
- public void nullPivotParamTest() {
- assertEquals("Expect exception due to null pivot param.", IMPOSSIBLE_SIZE,
- new PivotedVectorView(sampleParams.vec, null).size());
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void nullPivotParam2Test() {
- assertEquals("Expect exception due to null pivot param, with unpivot.", IMPOSSIBLE_SIZE,
- new PivotedVectorView(sampleParams.vec, null, sampleParams.unpivot).size());
- }
-
- /** */
- @Test(expected = AssertionError.class)
- public void nullUnpivotParam2Test() {
- assertEquals("Expect exception due to null unpivot param.", IMPOSSIBLE_SIZE,
- new PivotedVectorView(sampleParams.vec, sampleParams.pivot, null).size());
- }
-
- /** */
- @Test(expected = CardinalityException.class)
- public void emptyPivotTest() {
- assertEquals("Expect exception due to empty pivot param.", IMPOSSIBLE_SIZE,
- new PivotedVectorView(sampleParams.vec, new int[] {}).size());
- }
-
- /** */
- @Test(expected = CardinalityException.class)
- public void emptyPivot2Test() {
- assertEquals("Expect exception due to empty pivot param, with unpivot.", IMPOSSIBLE_SIZE,
- new PivotedVectorView(sampleParams.vec, new int[] {}, sampleParams.unpivot).size());
- }
-
- /** */
- @Test(expected = CardinalityException.class)
- public void wrongPivotTest() {
- assertEquals("Expect exception due to wrong pivot param.", IMPOSSIBLE_SIZE,
- new PivotedVectorView(sampleParams.vec, new int[] {0}).size());
- }
-
- /** */
- @Test(expected = CardinalityException.class)
- public void wrongPivot2Test() {
- assertEquals("Expect exception due to wrong pivot param, with unpivot.", IMPOSSIBLE_SIZE,
- new PivotedVectorView(sampleParams.vec, new int[] {0}, sampleParams.unpivot).size());
- }
-
- /** */
- @Test(expected = CardinalityException.class)
- public void emptyUnpivotTest() {
- assertEquals("Expect exception due to empty unpivot param.", IMPOSSIBLE_SIZE,
- new PivotedVectorView(sampleParams.vec, sampleParams.pivot, new int[] {}).size());
- }
-
- /** */
- @Test(expected = CardinalityException.class)
- public void wrongUnpivotTest() {
- assertEquals("Expect exception due to wrong unpivot param, with unpivot.", IMPOSSIBLE_SIZE,
- new PivotedVectorView(sampleParams.vec, sampleParams.pivot, new int[] {0}).size());
- }
-
- /** */
- @Test
- public void basicPivotTest() {
- final PivotedVectorView pvv = new PivotedVectorView(sampleParams.vec, sampleParams.pivot);
-
- final int size = sampleParams.vec.size();
-
- assertEquals("View size differs from expected.", size, pvv.size());
-
- assertSame("Base vector differs from expected.", sampleParams.vec, pvv.getBaseVector());
-
- for (int idx = 0; idx < size; idx++) {
- assertEquals("Sample pivot and unpivot differ from expected",
- idx, sampleParams.unpivot[sampleParams.pivot[idx]]);
-
- assertEquals("Pivot differs from expected at index " + idx,
- sampleParams.pivot[idx], pvv.pivot(idx));
-
- assertEquals("Default unpivot differs from expected at index " + idx,
- sampleParams.unpivot[idx], pvv.unpivot(idx));
-
- final Metric metric = new Metric(sampleParams.vec.get(idx), pvv.get(pvv.pivot(idx)));
-
- assertTrue("Not close enough at index " + idx + ", " + metric, metric.closeEnough());
- }
-
- for (int idx = 0; idx < size; idx++) {
- sampleParams.vec.set(idx, sampleParams.vec.get(idx) + idx + 1);
-
- final Metric metric = new Metric(sampleParams.vec.get(idx), pvv.get(pvv.pivot(idx)));
-
- assertTrue("Modified value not close enough at index " + idx + ", " + metric, metric.closeEnough());
- }
- }
-
- /** */
- @Test
- public void basicUnpivotTest() {
- final PivotedVectorView pvv = new PivotedVectorView(sampleParams.vec, sampleParams.pivot, sampleParams.unpivot);
-
- final int size = sampleParams.vec.size();
-
- assertEquals("View size differs from expected.", size, pvv.size());
-
- for (int idx = 0; idx < size; idx++) {
- assertEquals("Unpivot differs from expected at index " + idx,
- sampleParams.unpivot[idx], pvv.unpivot(idx));
-
- final Metric metric = new Metric(sampleParams.vec.get(idx), pvv.get(pvv.unpivot(idx)));
-
- assertTrue("Not close enough at index " + idx + ", " + metric, metric.closeEnough());
- }
- }
-
- /** */
- private static class SampleParams {
- /** */
- final double[] data = new double[] {0, 1};
- /** */
- final Vector vec = new DenseLocalOnHeapVector(data);
- /** */
- final int[] pivot = new int[] {1, 0};
- /** */
- final int[] unpivot = new int[] {1, 0};
- }
-
- /** */
- private static class Metric { // todo consider if softer tolerance (like say 0.1 or 0.01) would make sense here
- /** */
- private final double exp;
-
- /** */
- private final double obtained;
-
- /** **/
- Metric(double exp, double obtained) {
- this.exp = exp;
- this.obtained = obtained;
- }
-
- /** */
- boolean closeEnough() {
- return new Double(exp).equals(obtained) || closeEnoughToZero();
- }
-
- /** {@inheritDoc} */
- @Override public String toString() {
- return "Metric{" + "expected=" + exp +
- ", obtained=" + obtained +
- '}';
- }
-
- /** */
- private boolean closeEnoughToZero() {
- return (new Double(exp).equals(0.0) && new Double(obtained).equals(-0.0))
- || (new Double(exp).equals(-0.0) && new Double(obtained).equals(0.0));
- }
- }
-}
[13/67] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math
module to Ignite ML module added missed licenses renamed packages fixed wrong
ml profile activation (cherry picked from commit d78e071)
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/package-info.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/package-info.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/package-info.java
new file mode 100644
index 0000000..e0a760c
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * 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 description. -->
+ * Contains specific implementations for matrix storage models.
+ */
+package org.apache.ignite.ml.math.impls.storage.matrix;
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/ArrayVectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/ArrayVectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/ArrayVectorStorage.java
new file mode 100644
index 0000000..dc23611
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/ArrayVectorStorage.java
@@ -0,0 +1,135 @@
+/*
+ * 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.ignite.ml.math.impls.storage.vector;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.Arrays;
+import org.apache.ignite.ml.math.VectorStorage;
+
+/**
+ * Array based {@link VectorStorage} implementation.
+ */
+public class ArrayVectorStorage implements VectorStorage {
+ /** Backing data array. */
+ private double[] data;
+
+ /**
+ * IMPL NOTE required by {@link Externalizable}.
+ */
+ public ArrayVectorStorage() {
+ // No-op.
+ }
+
+ /**
+ * @param size Vector size.
+ */
+ public ArrayVectorStorage(int size) {
+ assert size > 0;
+
+ data = new double[size];
+ }
+
+ /**
+ * @param data Backing data array.
+ */
+ public ArrayVectorStorage(double[] data) {
+ assert data != null;
+
+ this.data = data;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int size() {
+ return data == null ? 0 : data.length;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double get(int i) {
+ return data[i];
+ }
+
+ /** {@inheritDoc} */
+ @Override public void set(int i, double v) {
+ data[i] = v;
+ }
+
+ /** {@inheritDoc}} */
+ @Override public boolean isArrayBased() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double[] data() {
+ return data;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isSequentialAccess() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDense() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isRandomAccess() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDistributed() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeObject(data);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ data = (double[])in.readObject();
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ int res = 1;
+
+ res = res * 37 + Arrays.hashCode(data);
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+
+ if (obj == null || getClass() != obj.getClass())
+ return false;
+
+ ArrayVectorStorage that = (ArrayVectorStorage)obj;
+
+ return Arrays.equals(data, (that.data));
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/CacheVectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/CacheVectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/CacheVectorStorage.java
new file mode 100644
index 0000000..7aa317c
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/CacheVectorStorage.java
@@ -0,0 +1,175 @@
+/*
+ * 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.ignite.ml.math.impls.storage.vector;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.Ignition;
+import org.apache.ignite.ml.math.ValueMapper;
+import org.apache.ignite.ml.math.VectorKeyMapper;
+import org.apache.ignite.ml.math.VectorStorage;
+
+/**
+ * Vector storage based on existing cache and index and value mapping functions.
+ */
+public class CacheVectorStorage<K, V> implements VectorStorage {
+ /** Storage size. */
+ private int size;
+ /** Key mapper. */
+ private VectorKeyMapper<K> keyMapper;
+ /** Value mapper. */
+ private ValueMapper<V> valMapper;
+ /** Underlying ignite cache. */
+ private IgniteCache<K, V> cache;
+
+ /**
+ *
+ */
+ public CacheVectorStorage() {
+ // No-op.
+ }
+
+ /**
+ * @param size
+ * @param cache
+ * @param keyMapper
+ * @param valMapper
+ */
+ public CacheVectorStorage(int size, IgniteCache<K, V> cache, VectorKeyMapper<K> keyMapper,
+ ValueMapper<V> valMapper) {
+ assert size > 0;
+ assert cache != null;
+ assert keyMapper != null;
+ assert valMapper != null;
+
+ this.size = size;
+ this.cache = cache;
+ this.keyMapper = keyMapper;
+ this.valMapper = valMapper;
+ }
+
+ /**
+ *
+ *
+ */
+ public IgniteCache<K, V> cache() {
+ return cache;
+ }
+
+ /**
+ *
+ *
+ */
+ public VectorKeyMapper<K> keyMapper() {
+ return keyMapper;
+ }
+
+ /**
+ *
+ *
+ */
+ public ValueMapper<V> valueMapper() {
+ return valMapper;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int size() {
+ return size;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double get(int i) {
+ return valMapper.toDouble(cache.get(keyMapper.apply(i)));
+ }
+
+ /** {@inheritDoc} */
+ @Override public void set(int i, double v) {
+ cache.put(keyMapper.apply(i), valMapper.fromDouble(v));
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeInt(size);
+ out.writeObject(keyMapper);
+ out.writeObject(valMapper);
+ out.writeUTF(cache.getName());
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ size = in.readInt();
+ keyMapper = (VectorKeyMapper<K>)in.readObject();
+ valMapper = (ValueMapper<V>)in.readObject();
+ cache = Ignition.localIgnite().getOrCreateCache(in.readUTF());
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isSequentialAccess() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDense() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isRandomAccess() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDistributed() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isArrayBased() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ int res = 1;
+
+ res = res * 37 + size();
+ res = res * 37 + keyMapper.hashCode();
+ res = res * 37 + valMapper.hashCode();
+ res = res * 37 + cache.hashCode();
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+
+ if (obj == null || getClass() != obj.getClass())
+ return false;
+
+ CacheVectorStorage that = (CacheVectorStorage)obj;
+
+ return size == that.size
+ && (keyMapper != null ? keyMapper.getClass().equals(that.keyMapper.getClass()) : that.keyMapper == null)
+ && (valMapper != null ? valMapper.getClass().equals(that.valMapper.getClass()) : that.valMapper == null)
+ && (cache != null ? cache.equals(that.cache) : that.cache == null);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/ConstantVectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/ConstantVectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/ConstantVectorStorage.java
new file mode 100644
index 0000000..31469ea
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/ConstantVectorStorage.java
@@ -0,0 +1,133 @@
+/*
+ * 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.ignite.ml.math.impls.storage.vector;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.ml.math.VectorStorage;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+
+/**
+ * Constant read-only vector storage.
+ */
+public class ConstantVectorStorage implements VectorStorage {
+ /** */ private int size;
+ /** */ private double val;
+
+ /**
+ *
+ */
+ public ConstantVectorStorage() {
+ // No-op.
+ }
+
+ /**
+ * @param size Vector size.
+ * @param val Value to set for vector elements.
+ */
+ public ConstantVectorStorage(int size, double val) {
+ assert size > 0;
+
+ this.size = size;
+ this.val = val;
+ }
+
+ /**
+ *
+ *
+ */
+ public double constant() {
+ return val;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int size() {
+ return size;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double get(int i) {
+ return val;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void set(int i, double v) {
+ throw new UnsupportedOperationException("Can't set value into constant vector.");
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeInt(size);
+ out.writeDouble(val);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ size = in.readInt();
+ val = in.readDouble();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isSequentialAccess() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDense() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isRandomAccess() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDistributed() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isArrayBased() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ int res = 1;
+
+ res = res * 37 + size;
+ res = res * 37 + Double.hashCode(val);
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object o) {
+ if (this == o)
+ return true;
+
+ if (o == null || getClass() != o.getClass())
+ return false;
+
+ ConstantVectorStorage that = (ConstantVectorStorage)o;
+
+ return size == that.size && val == that.val;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/DelegateVectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/DelegateVectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/DelegateVectorStorage.java
new file mode 100644
index 0000000..c431bdb
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/DelegateVectorStorage.java
@@ -0,0 +1,157 @@
+/*
+ * 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.ignite.ml.math.impls.storage.vector;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.ml.math.VectorStorage;
+
+/**
+ * {@link VectorStorage} implementation that delegates to parent matrix.
+ */
+public class DelegateVectorStorage implements VectorStorage {
+ /** Parent vector storage. */
+ private VectorStorage sto;
+
+ /** Offset in the parent vector. */
+ private int off;
+
+ /** Size of the vector. */
+ private int len;
+
+ /**
+ *
+ */
+ public DelegateVectorStorage() {
+ // No-op.
+ }
+
+ /**
+ * @param sto Vector storage to delegate to.
+ * @param off Offset in the parent vector.
+ * @param len Size of the vector.
+ */
+ public DelegateVectorStorage(VectorStorage sto, int off, int len) {
+ assert sto != null;
+ assert off >= 0;
+ assert len > 0;
+
+ this.sto = sto;
+ this.off = off;
+ this.len = len;
+ }
+
+ /** */
+ public VectorStorage delegate() {
+ return sto;
+ }
+
+ /** */
+ public int offset() {
+ return off;
+ }
+
+ /** */
+ public int length() {
+ return len;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int size() {
+ return len;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double get(int i) {
+ return sto.get(off + i);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void set(int i, double v) {
+ sto.set(off + i, v);
+ }
+
+ /** {@inheritDoc} */
+ @Override public double[] data() {
+ return sto.data();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isSequentialAccess() {
+ return sto.isSequentialAccess();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDense() {
+ return sto.isDense();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isRandomAccess() {
+ return sto.isRandomAccess();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDistributed() {
+ return sto.isDistributed();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isArrayBased() {
+ return sto.isArrayBased();
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeObject(sto);
+ out.writeInt(off);
+ out.writeInt(len);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ sto = (VectorStorage)in.readObject();
+ off = in.readInt();
+ len = in.readInt();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object o) {
+ if (this == o)
+ return true;
+
+ if (o == null || getClass() != o.getClass())
+ return false;
+
+ DelegateVectorStorage that = (DelegateVectorStorage)o;
+
+ return len == that.len && off == that.off && (sto != null ? sto.equals(that.sto) : that.sto == null);
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ int res = 1;
+
+ res = res * 37 + off;
+ res = res * 37 + len;
+ res = res * 37 + sto.hashCode();
+
+ return res;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/DenseLocalOffHeapVectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/DenseLocalOffHeapVectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/DenseLocalOffHeapVectorStorage.java
new file mode 100644
index 0000000..a9965cc
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/DenseLocalOffHeapVectorStorage.java
@@ -0,0 +1,172 @@
+/*
+ * 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.ignite.ml.math.impls.storage.vector;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.stream.IntStream;
+import org.apache.ignite.internal.util.GridUnsafe;
+import org.apache.ignite.ml.math.VectorStorage;
+
+/**
+ * Local, dense off-heap vector storage.
+ */
+public class DenseLocalOffHeapVectorStorage implements VectorStorage {
+ /** Vector size. */
+ private int size;
+
+ /** */
+ private transient long ptr;
+ //TODO: temp solution.
+ /** */
+ private int ptrInitHash;
+
+ /**
+ *
+ */
+ public DenseLocalOffHeapVectorStorage() {
+ // No-op.
+ }
+
+ /**
+ * @param size Vector size.
+ */
+ public DenseLocalOffHeapVectorStorage(int size) {
+ assert size > 0;
+
+ this.size = size;
+
+ allocateMemory(size);
+ }
+
+ /** {@inheritDoc} */
+ @Override public int size() {
+ return size;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double get(int i) {
+ return GridUnsafe.getDouble(pointerOffset(i));
+ }
+
+ /** {@inheritDoc} */
+ @Override public void set(int i, double v) {
+ GridUnsafe.putDouble(pointerOffset(i), v);
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isArrayBased() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double[] data() {
+ return null;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isSequentialAccess() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDense() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isRandomAccess() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDistributed() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeInt(size);
+ out.writeInt(ptrInitHash);
+
+ for (int i = 0; i < size; i++)
+ out.writeDouble(get(i));
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ size = in.readInt();
+
+ allocateMemory(size);
+
+ ptrInitHash = in.readInt();
+
+ for (int i = 0; i < size; i++)
+ set(i, in.readDouble());
+ }
+
+ /** {@inheritDoc} */
+ @Override public void destroy() {
+ GridUnsafe.freeMemory(ptr);
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ int res = 1;
+
+ res = res * 37 + size;
+ res = res * 37 + ptrInitHash;
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object o) {
+ if (this == o)
+ return true;
+
+ if (o == null || getClass() != o.getClass())
+ return false;
+
+ DenseLocalOffHeapVectorStorage that = (DenseLocalOffHeapVectorStorage)o;
+
+ return size == that.size && isMemoryEquals(that);
+ }
+
+ /** */
+ private boolean isMemoryEquals(DenseLocalOffHeapVectorStorage otherStorage) {
+ return IntStream.range(0, size).parallel().noneMatch(idx -> Double.compare(get(idx), otherStorage.get(idx)) != 0);
+ }
+
+ /**
+ * Pointer offset for specific index.
+ *
+ * @param i Offset index.
+ */
+ private long pointerOffset(int i) {
+ return ptr + i * Double.BYTES;
+ }
+
+ /** */
+ private void allocateMemory(int size) {
+ ptr = GridUnsafe.allocateMemory(size * Double.BYTES);
+
+ ptrInitHash = Long.hashCode(ptr);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/FunctionVectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/FunctionVectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/FunctionVectorStorage.java
new file mode 100644
index 0000000..0f13bb6
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/FunctionVectorStorage.java
@@ -0,0 +1,141 @@
+/*
+ * 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.ignite.ml.math.impls.storage.vector;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.ml.math.VectorStorage;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.functions.IgniteFunction;
+import org.apache.ignite.ml.math.functions.IntDoubleToVoidFunction;
+
+/**
+ * Read-only or read-write function-based vector storage.
+ */
+public class FunctionVectorStorage implements VectorStorage {
+ /** */ private IgniteFunction<Integer, Double> getFunc;
+ /** */ private IntDoubleToVoidFunction setFunc;
+ /** */ private int size;
+
+ /**
+ *
+ */
+ public FunctionVectorStorage() {
+ // No-op.
+ }
+
+ /**
+ * Creates read-only or read-write storage.
+ *
+ * @param size Cardinality of this vector storage.
+ * @param getFunc Get function.
+ * @param setFunc Optional set function ({@code null} for read-only storage).
+ */
+ public FunctionVectorStorage(int size, IgniteFunction<Integer, Double> getFunc, IntDoubleToVoidFunction setFunc) {
+ assert size > 0;
+ assert getFunc != null; // At least get function is required.
+
+ this.size = size;
+ this.getFunc = getFunc;
+ this.setFunc = setFunc;
+ }
+
+ /**
+ *
+ *
+ */
+ public IgniteFunction<Integer, Double> getFunction() {
+ return getFunc;
+ }
+
+ /**
+ *
+ *
+ */
+ public IntDoubleToVoidFunction setFunction() {
+ return setFunc;
+ }
+
+ /**
+ * Creates read-only storage.
+ *
+ * @param size Cardinality of this vector storage.
+ * @param getFunc Get function.
+ */
+ public FunctionVectorStorage(int size, IgniteFunction<Integer, Double> getFunc) {
+ this(size, getFunc, null);
+ }
+
+ /** {@inheritDoc} */
+ @Override public int size() {
+ return size;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double get(int i) {
+ return getFunc.apply(i);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void set(int i, double v) {
+ if (setFunc != null)
+ setFunc.accept(i, v);
+ else
+ throw new UnsupportedOperationException("Cannot set into read-only vector.");
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeObject(setFunc);
+ out.writeObject(getFunc);
+ out.writeInt(size);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ setFunc = (IntDoubleToVoidFunction)in.readObject();
+ getFunc = (IgniteFunction<Integer, Double>)in.readObject();
+ size = in.readInt();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isSequentialAccess() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDense() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isRandomAccess() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDistributed() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isArrayBased() {
+ return false;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/MatrixVectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/MatrixVectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/MatrixVectorStorage.java
new file mode 100644
index 0000000..a7d7e26
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/MatrixVectorStorage.java
@@ -0,0 +1,185 @@
+/*
+ * 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.ignite.ml.math.impls.storage.vector;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.VectorStorage;
+import org.apache.ignite.ml.math.exceptions.IndexException;
+
+/**
+ * Row, column or diagonal vector-based view of the matrix
+ */
+public class MatrixVectorStorage implements VectorStorage {
+ /** */ private Matrix parent;
+
+ /** */ private int row;
+ /** */ private int col;
+
+ /** */ private int rowStride;
+ /** */ private int colStride;
+
+ /** */ private int size;
+
+ /**
+ *
+ */
+ public MatrixVectorStorage() {
+ // No-op.
+ }
+
+ /**
+ * @param parent
+ * @param row
+ * @param col
+ * @param rowStride
+ * @param colStride
+ */
+ public MatrixVectorStorage(Matrix parent, int row, int col, int rowStride, int colStride) {
+ assert parent != null;
+ assert rowStride >= 0;
+ assert colStride >= 0;
+ assert rowStride > 0 || colStride > 0;
+
+ if (row < 0 || row >= parent.rowSize())
+ throw new IndexException(row);
+ if (col < 0 || col >= parent.columnSize())
+ throw new IndexException(col);
+
+ this.parent = parent;
+
+ this.row = row;
+ this.col = col;
+
+ this.rowStride = rowStride;
+ this.colStride = colStride;
+
+ this.size = getSize();
+ }
+
+ /**
+ *
+ *
+ */
+ int row() {
+ return row;
+ }
+
+ /**
+ *
+ *
+ */
+ int column() {
+ return col;
+ }
+
+ /**
+ *
+ *
+ */
+ int rowStride() {
+ return rowStride;
+ }
+
+ /**
+ *
+ *
+ */
+ int columnStride() {
+ return colStride;
+ }
+
+ /**
+ *
+ *
+ */
+ private int getSize() {
+ if (rowStride != 0 && colStride != 0) {
+ int n1 = (parent.rowSize() - row) / rowStride;
+ int n2 = (parent.columnSize() - col) / colStride;
+
+ return Math.min(n1, n2);
+ }
+ else if (rowStride > 0)
+ return (parent.rowSize() - row) / rowStride;
+ else
+ return (parent.columnSize() - col) / colStride;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int size() {
+ return size;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double get(int i) {
+ return parent.get(row + i * rowStride, col + i * colStride);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void set(int i, double v) {
+ parent.set(row + i * rowStride, col + i * colStride, v);
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isSequentialAccess() {
+ return parent.isSequentialAccess();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDense() {
+ return parent.isDense();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isRandomAccess() {
+ return parent.isRandomAccess();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDistributed() {
+ return parent.isDistributed();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isArrayBased() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeObject(parent);
+ out.writeInt(row);
+ out.writeInt(col);
+ out.writeInt(rowStride);
+ out.writeInt(colStride);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ parent = (Matrix)in.readObject();
+ row = in.readInt();
+ col = in.readInt();
+ rowStride = in.readInt();
+ colStride = in.readInt();
+
+ size = getSize();
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/PivotedVectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/PivotedVectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/PivotedVectorStorage.java
new file mode 100644
index 0000000..a524838
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/PivotedVectorStorage.java
@@ -0,0 +1,175 @@
+/*
+ * 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.ignite.ml.math.impls.storage.vector;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.Arrays;
+import org.apache.ignite.ml.math.VectorStorage;
+
+/**
+ * Pivoted (index mapped) view over another vector storage implementation.
+ */
+public class PivotedVectorStorage implements VectorStorage {
+ /** */ private VectorStorage sto;
+
+ /** */ private int[] pivot;
+ /** */ private int[] unpivot;
+
+ /**
+ * @param pivot Pivot array.
+ */
+ private static int[] reverse(int[] pivot) {
+ int[] res = new int[pivot.length];
+
+ for (int i = 0; i < pivot.length; i++)
+ res[pivot[i]] = i;
+
+ return res;
+ }
+
+ /**
+ *
+ *
+ */
+ public int[] pivot() {
+ return pivot;
+ }
+
+ /**
+ *
+ *
+ */
+ public int[] unpivot() {
+ return unpivot;
+ }
+
+ /**
+ * @param sto Backing vector storage.
+ * @param pivot Mapping from external index to internal.
+ * @param unpivot Mapping from internal index to external.
+ */
+ public PivotedVectorStorage(VectorStorage sto, int[] pivot, int[] unpivot) {
+ assert sto != null;
+ assert pivot != null;
+ assert unpivot != null;
+
+ this.sto = sto;
+ this.pivot = pivot;
+ this.unpivot = unpivot;
+ }
+
+ /**
+ * @param sto Backing vector storage.
+ * @param pivot Mapping from external index to internal.
+ */
+ public PivotedVectorStorage(VectorStorage sto, int[] pivot) {
+ this(sto, pivot, reverse(pivot));
+ }
+
+ /**
+ *
+ */
+ public PivotedVectorStorage() {
+ // No-op.
+ }
+
+ /** {@inheritDoc} */
+ @Override public int size() {
+ return sto.size();
+ }
+
+ /** {@inheritDoc} */
+ @Override public double get(int i) {
+ return sto.get(pivot[i]);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void set(int i, double v) {
+ sto.set(pivot[i], v);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeObject(sto);
+ out.writeObject(pivot);
+ out.writeObject(unpivot);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ sto = (VectorStorage)in.readObject();
+ pivot = (int[])in.readObject();
+ unpivot = (int[])in.readObject();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isSequentialAccess() {
+ return sto.isSequentialAccess();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDense() {
+ return sto.isDense();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isRandomAccess() {
+ return sto.isRandomAccess();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDistributed() {
+ return sto.isDistributed();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isArrayBased() {
+ return sto.isArrayBased();
+ }
+
+ /** {@inheritDoc} */
+ @Override public double[] data() {
+ return isArrayBased() ? sto.data() : null;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object o) {
+ if (this == o)
+ return true;
+
+ if (o == null || getClass() != o.getClass())
+ return false;
+
+ PivotedVectorStorage that = (PivotedVectorStorage)o;
+
+ return (sto != null ? sto.equals(that.sto) : that.sto == null) && Arrays.equals(pivot, that.pivot)
+ && Arrays.equals(unpivot, that.unpivot);
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ int res = sto != null ? sto.hashCode() : 0;
+
+ res = 31 * res + Arrays.hashCode(pivot);
+ res = 31 * res + Arrays.hashCode(unpivot);
+
+ return res;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/RandomVectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/RandomVectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/RandomVectorStorage.java
new file mode 100644
index 0000000..be1ad91
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/RandomVectorStorage.java
@@ -0,0 +1,152 @@
+/*
+ * 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.ignite.ml.math.impls.storage.vector;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.nio.ByteBuffer;
+import java.util.Random;
+import org.apache.ignite.ml.math.MurmurHash;
+import org.apache.ignite.ml.math.VectorStorage;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+
+/**
+ * {@link VectorStorage} implementation with random values in the vector elements.
+ */
+public class RandomVectorStorage implements VectorStorage {
+ /** */
+ private static final long SCALE = 1L << 32;
+ /** */
+ private static final int PRIME = 104047;
+
+ /** Random generation seed. */
+ private int seed;
+
+ /** Vector size. */
+ private int size;
+
+ /** Whether fast hash is used, in {@link #get(int)}. */
+ private boolean fastHash;
+
+ /** */
+ public RandomVectorStorage() {
+ // No-op.
+ }
+
+ /**
+ * @param size Size of the storage.
+ * @param fastHash Whether or not to use fast hashing or Murmur hashing.
+ */
+ public RandomVectorStorage(int size, boolean fastHash) {
+ assert size > 0;
+
+ this.size = size;
+ this.fastHash = fastHash;
+
+ seed = new Random().nextInt();
+ }
+
+ /** {@inheritDoc} */
+ @Override public int size() {
+ return size;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double get(int i) {
+ if (!fastHash) {
+ ByteBuffer buf = ByteBuffer.allocate(4);
+
+ buf.putInt(i);
+ buf.flip();
+
+ return (MurmurHash.hash64A(buf, seed) & (SCALE - 1)) / (double)SCALE;
+ }
+ else
+ // This isn't a fantastic random number generator, but it is just fine for random projections.
+ return (((i * PRIME) & 8) * 0.25) - 1;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void set(int i, double v) {
+ throw new UnsupportedOperationException("Random vector storage is a read-only storage.");
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeInt(size);
+ out.writeInt(seed);
+ out.writeBoolean(fastHash);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ size = in.readInt();
+ seed = in.readInt();
+ fastHash = in.readBoolean();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isSequentialAccess() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDense() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isRandomAccess() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDistributed() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isArrayBased() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ int res = 1;
+
+ res = res * 37 + Boolean.hashCode(fastHash);
+ res = res * 37 + seed;
+ res = res * 37 + size;
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object o) {
+ if (this == o)
+ return true;
+
+ if (o == null || getClass() != o.getClass())
+ return false;
+
+ RandomVectorStorage that = (RandomVectorStorage)o;
+
+ return size == that.size && seed == that.seed && fastHash == that.fastHash;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SingleElementVectorDelegateStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SingleElementVectorDelegateStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SingleElementVectorDelegateStorage.java
new file mode 100644
index 0000000..d472e3a
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SingleElementVectorDelegateStorage.java
@@ -0,0 +1,145 @@
+/*
+ * 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.ignite.ml.math.impls.storage.vector;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.VectorStorage;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+
+/**
+ * Single value view storage over another vector.
+ */
+public class SingleElementVectorDelegateStorage implements VectorStorage {
+ /** */ private int idx;
+ /** */ private Vector vec;
+
+ /**
+ *
+ */
+ public SingleElementVectorDelegateStorage() {
+ // No-op.
+ }
+
+ /**
+ * @param vec Parent vector.
+ * @param idx Element index.
+ */
+ public SingleElementVectorDelegateStorage(Vector vec, int idx) {
+ assert vec != null;
+ assert idx >= 0;
+
+ this.vec = vec;
+ this.idx = idx;
+ }
+
+ /**
+ *
+ *
+ */
+ public int index() {
+ return idx;
+ }
+
+ /**
+ *
+ *
+ */
+ public Vector delegate() {
+ return vec;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int size() {
+ return vec.size();
+ }
+
+ /** {@inheritDoc} */
+ @Override public double get(int i) {
+ return i == idx ? vec.get(i) : 0.0;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void set(int i, double v) {
+ if (i == idx)
+ vec.set(i, v);
+ else
+ throw new UnsupportedOperationException("Can't set element outside of index: " + idx);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeObject(vec);
+ out.writeInt(idx);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ vec = (Vector)in.readObject();
+ idx = in.readInt();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isSequentialAccess() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDense() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isRandomAccess() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDistributed() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isArrayBased() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object o) {
+ if (this == o)
+ return true;
+
+ if (o == null || getClass() != o.getClass())
+ return false;
+
+ SingleElementVectorDelegateStorage that = (SingleElementVectorDelegateStorage)o;
+
+ return idx == that.idx && (vec != null ? vec.equals(that.vec) : that.vec == null);
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ int res = idx;
+
+ res = 31 * res + (vec != null ? vec.hashCode() : 0);
+
+ return res;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SingleElementVectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SingleElementVectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SingleElementVectorStorage.java
new file mode 100644
index 0000000..854b732
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SingleElementVectorStorage.java
@@ -0,0 +1,143 @@
+/*
+ * 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.ignite.ml.math.impls.storage.vector;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.ml.math.VectorStorage;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+
+/**
+ * Vector storage holding a single non-zero value at some index.
+ */
+public class SingleElementVectorStorage implements VectorStorage {
+ /** */ private int idx;
+ /** */ private double val;
+ /** */ private int size;
+
+ /**
+ *
+ */
+ public SingleElementVectorStorage() {
+ // No-op.
+ }
+
+ /**
+ * @param size Parent vector size.
+ * @param idx Element index in the parent vector.
+ * @param val Value of the element.
+ */
+ public SingleElementVectorStorage(int size, int idx, double val) {
+ assert size > 0;
+ assert idx >= 0;
+
+ this.size = size;
+ this.idx = idx;
+ this.val = val;
+ }
+
+ /**
+ *
+ * @return Index of the element in the parent vector.
+ */
+ public int index() {
+ return idx;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int size() {
+ return size;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double get(int i) {
+ return i == idx ? val : 0.0;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void set(int i, double v) {
+ if (i == idx)
+ val = v;
+ else
+ throw new UnsupportedOperationException("Can't set element outside of index: " + idx);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeInt(size);
+ out.writeInt(idx);
+ out.writeDouble(val);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ size = in.readInt();
+ idx = in.readInt();
+ val = in.readDouble();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isSequentialAccess() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDense() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isRandomAccess() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDistributed() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isArrayBased() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object o) {
+ if (this == o)
+ return true;
+
+ if (o == null || getClass() != o.getClass())
+ return false;
+
+ SingleElementVectorStorage that = (SingleElementVectorStorage)o;
+
+ return idx == that.idx && Double.compare(that.val, val) == 0 && size == that.size;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ int res = idx;
+ long temp = Double.doubleToLongBits(val);
+
+ res = 31 * res + (int)(temp ^ (temp >>> 32));
+ res = 31 * res + size;
+
+ return res;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOffHeapVectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOffHeapVectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOffHeapVectorStorage.java
new file mode 100644
index 0000000..7b3da78
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOffHeapVectorStorage.java
@@ -0,0 +1,149 @@
+/*
+ * 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.ignite.ml.math.impls.storage.vector;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.nio.ByteBuffer;
+import org.apache.ignite.internal.util.offheap.GridOffHeapMap;
+import org.apache.ignite.internal.util.offheap.GridOffHeapMapFactory;
+import org.apache.ignite.ml.math.VectorStorage;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.impls.vector.SparseLocalOffHeapVector;
+
+/**
+ * {@link VectorStorage} implementation for {@link SparseLocalOffHeapVector}.
+ */
+public class SparseLocalOffHeapVectorStorage implements VectorStorage {
+ /** Assume 10% density. */
+ private static final int INIT_DENSITY = 10;
+ /** Storage capacity. */
+ private int size;
+ /** Local off heap map. */
+ private GridOffHeapMap gridOffHeapMap;
+
+ /** */
+ public SparseLocalOffHeapVectorStorage() {
+ //No-op.
+ }
+
+ /** */
+ public SparseLocalOffHeapVectorStorage(int cap) {
+ assert cap > 0;
+
+ gridOffHeapMap = GridOffHeapMapFactory.unsafeMap(cap / INIT_DENSITY);
+ size = cap;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int size() {
+ return size;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double get(int i) {
+ byte[] bytes = gridOffHeapMap.get(hash(i), intToByteArray(i));
+ return bytes == null ? 0 : ByteBuffer.wrap(bytes).getDouble();
+ }
+
+ /** {@inheritDoc} */
+ @Override public void set(int i, double v) {
+ if (v != 0.0)
+ gridOffHeapMap.put(hash(i), intToByteArray(i), doubleToByteArray(v));
+ else if (gridOffHeapMap.contains(hash(i), intToByteArray(i)))
+ gridOffHeapMap.remove(hash(i), intToByteArray(i));
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ throw new UnsupportedOperationException(); // TODO: add externalization support.
+ }
+
+ /** {@inheritDoc} */
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isSequentialAccess() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isRandomAccess() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDense() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isArrayBased() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDistributed() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void destroy() {
+ gridOffHeapMap.destruct();
+ }
+
+ /** */
+ private int hash(int h) {
+ // Apply base step of MurmurHash; see http://code.google.com/p/smhasher/
+ // Despite two multiplies, this is often faster than others
+ // with comparable bit-spread properties.
+ h ^= h >>> 16;
+ h *= 0x85ebca6b;
+ h ^= h >>> 13;
+ h *= 0xc2b2ae35;
+
+ return (h >>> 16) ^ h;
+ }
+
+ /** */
+ private byte[] intToByteArray(int val) {
+ return new byte[] {
+ (byte)(val >>> 24),
+ (byte)(val >>> 16),
+ (byte)(val >>> 8),
+ (byte)val};
+ }
+
+ /** */
+ private byte[] doubleToByteArray(double val) {
+ long l = Double.doubleToRawLongBits(val);
+ return new byte[] {
+ (byte)((l >> 56) & 0xff),
+ (byte)((l >> 48) & 0xff),
+ (byte)((l >> 40) & 0xff),
+ (byte)((l >> 32) & 0xff),
+ (byte)((l >> 24) & 0xff),
+ (byte)((l >> 16) & 0xff),
+ (byte)((l >> 8) & 0xff),
+ (byte)((l) & 0xff),
+ };
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOnHeapVectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOnHeapVectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOnHeapVectorStorage.java
new file mode 100644
index 0000000..75318d6
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOnHeapVectorStorage.java
@@ -0,0 +1,152 @@
+/*
+ * 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.ignite.ml.math.impls.storage.vector;
+
+import it.unimi.dsi.fastutil.ints.Int2DoubleOpenHashMap;
+import it.unimi.dsi.fastutil.ints.Int2DoubleRBTreeMap;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.Map;
+import org.apache.ignite.ml.math.StorageConstants;
+import org.apache.ignite.ml.math.VectorStorage;
+
+/**
+ * Sparse, local, on-heap vector storage.
+ */
+public class SparseLocalOnHeapVectorStorage implements VectorStorage, StorageConstants {
+ /** */ private int size;
+ /** */ private int acsMode;
+
+ /** Actual map storage. */
+ private Map<Integer, Double> sto;
+
+ /**
+ *
+ */
+ public SparseLocalOnHeapVectorStorage() {
+ // No-op.
+ }
+
+ /**
+ * @param size Vector size.
+ * @param acsMode Access mode.
+ */
+ public SparseLocalOnHeapVectorStorage(int size, int acsMode) {
+ assert size > 0;
+ assertAccessMode(acsMode);
+
+ this.size = size;
+ this.acsMode = acsMode;
+
+ if (acsMode == SEQUENTIAL_ACCESS_MODE)
+ sto = new Int2DoubleRBTreeMap();
+ else
+ sto = new Int2DoubleOpenHashMap();
+ }
+
+ /**
+ *
+ *
+ */
+ public int getAccessMode() {
+ return acsMode;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int size() {
+ return size;
+ }
+
+ /** {@inheritDoc} */
+ @Override public double get(int i) {
+ return sto.getOrDefault(i, 0.0);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void set(int i, double v) {
+ if (v != 0.0)
+ sto.put(i, v);
+ else if (sto.containsKey(i))
+ sto.remove(i);
+
+ }
+
+ /** {@inheritDoc} */
+ @Override public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeInt(size);
+ out.writeInt(acsMode);
+ out.writeObject(sto);
+ }
+
+ /** {@inheritDoc} */
+ @SuppressWarnings({"unchecked"})
+ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ size = in.readInt();
+ acsMode = in.readInt();
+ sto = (Map<Integer, Double>)in.readObject();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isSequentialAccess() {
+ return acsMode == SEQUENTIAL_ACCESS_MODE;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDense() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isRandomAccess() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDistributed() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isArrayBased() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean equals(Object o) {
+ if (this == o)
+ return true;
+
+ if (o == null || getClass() != o.getClass())
+ return false;
+
+ SparseLocalOnHeapVectorStorage that = (SparseLocalOnHeapVectorStorage)o;
+
+ return size == that.size && acsMode == that.acsMode && (sto != null ? sto.equals(that.sto) : that.sto == null);
+ }
+
+ /** {@inheritDoc} */
+ @Override public int hashCode() {
+ int res = size;
+
+ res = 31 * res + acsMode;
+ res = 31 * res + (sto != null ? sto.hashCode() : 0);
+
+ return res;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/package-info.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/package-info.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/package-info.java
new file mode 100644
index 0000000..a9825b3
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * 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 description. -->
+ * Contains specific implementations for vector storage models.
+ */
+package org.apache.ignite.ml.math.impls.storage.vector;
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/0abf6601/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/AbstractReadOnlyVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/AbstractReadOnlyVector.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/AbstractReadOnlyVector.java
new file mode 100644
index 0000000..e48542b
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/AbstractReadOnlyVector.java
@@ -0,0 +1,125 @@
+/*
+ * 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.ignite.ml.math.impls.vector;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.VectorStorage;
+import org.apache.ignite.ml.math.functions.IgniteBiFunction;
+import org.apache.ignite.ml.math.functions.IgniteDoubleFunction;
+import org.apache.ignite.ml.math.impls.matrix.FunctionMatrix;
+
+/**
+ * This class provides a helper implementation of the read-only implementation of {@link Vector}
+ * interface to minimize the effort required to implement it.
+ * Subclasses may override some of the implemented methods if a more
+ * specific or optimized implementation is desirable.
+ */
+public abstract class AbstractReadOnlyVector extends AbstractVector {
+ /** */
+ public AbstractReadOnlyVector() {
+ // No-op.
+ }
+
+ /**
+ * @param sto Storage.
+ */
+ public AbstractReadOnlyVector(VectorStorage sto) {
+ super(true, sto);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix cross(Vector vec) {
+ return new FunctionMatrix(size(), vec.size(),
+ (row, col) -> vec.get(col) * get(row));
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix toMatrix(boolean rowLike) {
+ return new FunctionMatrix(rowLike ? 1 : size(), rowLike ? size() : 1,
+ (row, col) -> rowLike ? get(col) : get(row));
+ }
+
+ /** {@inheritDoc} */
+ @Override public Matrix toMatrixPlusOne(boolean rowLike, double zeroVal) {
+ return new FunctionMatrix(rowLike ? 1 : size() + 1, rowLike ? size() + 1 : 1, (row, col) -> {
+ if (row == 0 && col == 0)
+ return zeroVal;
+
+ return rowLike ? get(col - 1) : get(row - 1);
+ });
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector copy() {
+ return this; // This exploits read-only feature of this type vector.
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector logNormalize() {
+ return logNormalize(2.0, Math.sqrt(getLengthSquared()));
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector logNormalize(double power) {
+ return logNormalize(power, kNorm(power));
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector map(IgniteDoubleFunction<Double> fun) {
+ return new FunctionVector(size(), (i) -> fun.apply(get(i)));
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector map(Vector vec, IgniteBiFunction<Double, Double, Double> fun) {
+ checkCardinality(vec);
+
+ return new FunctionVector(size(), (i) -> fun.apply(get(i), vec.get(i)));
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector map(IgniteBiFunction<Double, Double, Double> fun, double y) {
+ return new FunctionVector(size(), (i) -> fun.apply(get(i), y));
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector divide(double x) {
+ if (x == 1.0)
+ return this;
+
+ return new FunctionVector(size(), (i) -> get(i) / x);
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector times(double x) {
+ return x == 0 ? new ConstantVector(size(), 0) : new FunctionVector(size(), (i) -> get(i) * x);
+ }
+
+ /**
+ * @param power Power.
+ * @param normLen Normalized length.
+ * @return logNormalized value.
+ */
+ private Vector logNormalize(double power, double normLen) {
+ assert !(Double.isInfinite(power) || power <= 1.0);
+
+ double denominator = normLen * Math.log(power);
+
+ return new FunctionVector(size(), (idx) -> Math.log1p(get(idx)) / denominator);
+ }
+}
[34/67] [abbrv] ignite git commit: Merge branches 'ignite-2.0' and
'master' of https://git-wip-us.apache.org/repos/asf/ignite
Posted by sb...@apache.org.
Merge branches 'ignite-2.0' and 'master' of https://git-wip-us.apache.org/repos/asf/ignite
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/4787c8b9
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/4787c8b9
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/4787c8b9
Branch: refs/heads/ignite-5075
Commit: 4787c8b962618dd67bab1c82e62ce22c686d8ace
Parents: 683303c 14f4b33
Author: Alexey Kuznetsov <ak...@apache.org>
Authored: Fri Apr 28 13:54:31 2017 +0700
Committer: Alexey Kuznetsov <ak...@apache.org>
Committed: Fri Apr 28 13:54:31 2017 +0700
----------------------------------------------------------------------
examples/config/example-cache.xml | 1 +
examples/config/example-memory-policies.xml | 22 +-
.../datagrid/MemoryPoliciesExample.java | 16 +-
.../client/memcache/MemcacheRestExample.java | 2 +-
.../MemcacheRestExampleNodeStartup.java | 1 +
.../ml/math/matrix/CacheMatrixExample.java | 23 +-
.../ml/math/matrix/ExampleMatrixStorage.java | 3 +-
.../math/matrix/MatrixCustomStorageExample.java | 6 +-
.../examples/ml/math/matrix/MatrixExample.java | 4 +-
.../ml/math/matrix/OffHeapMatrixExample.java | 6 +-
.../matrix/SparseDistributedMatrixExample.java | 8 +-
.../ml/math/matrix/SparseMatrixExample.java | 4 +-
.../examples/ml/math/tracer/TracerExample.java | 2 +-
.../ml/math/vector/CacheVectorExample.java | 19 +-
.../ml/math/vector/ExampleVectorStorage.java | 7 +-
.../ml/math/vector/OffHeapVectorExample.java | 2 +-
.../ml/math/vector/SparseVectorExample.java | 4 -
.../math/vector/VectorCustomStorageExample.java | 4 -
.../examples/ml/math/vector/VectorExample.java | 6 +-
.../jmh/cache/JmhCacheAbstractBenchmark.java | 7 +-
.../benchmarks/jmh/tree/BPlusTreeBenchmark.java | 15 +-
.../stream/camel/IgniteCamelStreamerTest.java | 10 +-
.../ignite/ignite-cassandra-server-template.xml | 3 -
.../tests/ignite-cassandra-client-template.xml | 3 -
.../ClientAbstractMultiThreadedSelfTest.java | 37 +-
.../client/ClientDefaultCacheSelfTest.java | 6 +-
.../ClientAbstractMultiNodeSelfTest.java | 25 +-
.../integration/ClientAbstractSelfTest.java | 9 +-
.../jdbc2/JdbcAbstractDmlStatementSelfTest.java | 16 +-
.../jdbc2/JdbcComplexQuerySelfTest.java | 5 +-
.../internal/jdbc2/JdbcConnectionSelfTest.java | 5 +-
.../jdbc2/JdbcDistributedJoinsQueryTest.java | 6 +-
.../jdbc2/JdbcDynamicIndexAbstractSelfTest.java | 14 +-
.../jdbc2/JdbcInsertStatementSelfTest.java | 4 +-
.../jdbc2/JdbcMergeStatementSelfTest.java | 4 +-
.../internal/jdbc2/JdbcMetadataSelfTest.java | 31 +-
.../internal/jdbc2/JdbcNoDefaultCacheTest.java | 45 +-
.../jdbc2/JdbcPreparedStatementSelfTest.java | 4 +-
.../internal/jdbc2/JdbcResultSetSelfTest.java | 4 +-
.../internal/jdbc2/JdbcStatementSelfTest.java | 4 +-
.../internal/jdbc2/JdbcStreamingSelfTest.java | 14 +-
.../rest/AbstractRestProcessorSelfTest.java | 2 +-
.../JettyRestProcessorAbstractSelfTest.java | 341 ++++++++++------
.../rest/JettyRestProcessorSignedSelfTest.java | 4 +-
.../rest/RestBinaryProtocolSelfTest.java | 101 ++---
.../rest/RestMemcacheProtocolSelfTest.java | 47 +--
.../processors/rest/RestProcessorTest.java | 2 +-
.../rest/TaskCommandHandlerSelfTest.java | 7 +-
.../processors/rest/TestBinaryClient.java | 23 +-
.../tcp/redis/RedisProtocolSelfTest.java | 8 +-
.../jdbc/AbstractJdbcPojoQuerySelfTest.java | 2 +-
.../ignite/jdbc/JdbcConnectionSelfTest.java | 5 +-
.../ignite/jdbc/JdbcMetadataSelfTest.java | 8 +-
.../ignite/jdbc/JdbcNoDefaultCacheTest.java | 3 +-
.../ignite/jdbc/JdbcPojoQuerySelfTest.java | 2 +-
.../jdbc/JdbcPreparedStatementSelfTest.java | 2 +-
.../ignite/jdbc/JdbcResultSetSelfTest.java | 2 +-
.../ignite/jdbc/JdbcStatementSelfTest.java | 2 +-
.../clients/src/test/resources/spring-cache.xml | 9 -
.../src/main/java/org/apache/ignite/Ignite.java | 14 +-
.../java/org/apache/ignite/IgniteCompute.java | 8 +-
.../apache/ignite/IgniteSystemProperties.java | 3 +
.../java/org/apache/ignite/MemoryMetrics.java | 89 ++--
.../org/apache/ignite/cache/CacheMetrics.java | 8 -
.../org/apache/ignite/cache/QueryEntity.java | 81 ++++
.../configuration/CacheConfiguration.java | 49 +--
.../configuration/DataPageEvictionMode.java | 21 +-
.../configuration/MemoryConfiguration.java | 117 +++++-
.../MemoryPolicyConfiguration.java | 88 +++-
.../ignite/internal/IgniteComputeImpl.java | 37 +-
.../org/apache/ignite/internal/IgniteEx.java | 12 +-
.../apache/ignite/internal/IgniteKernal.java | 87 ++--
.../internal/cluster/ClusterGroupAdapter.java | 23 +-
.../ignite/internal/cluster/ClusterGroupEx.java | 5 +-
.../managers/communication/GridIoManager.java | 2 +-
.../managers/communication/GridIoMessage.java | 5 +-
.../ignite/internal/mem/DirectMemory.java | 55 ---
.../internal/mem/DirectMemoryProvider.java | 19 +-
.../mem/file/MappedFileMemoryProvider.java | 153 ++-----
.../mem/unsafe/UnsafeMemoryProvider.java | 69 ++--
.../pagemem/impl/PageMemoryNoStoreImpl.java | 408 +++++++++++++------
.../affinity/GridAffinityProcessor.java | 67 +--
.../cache/CacheClusterMetricsMXBeanImpl.java | 5 -
.../cache/CacheLocalMetricsMXBeanImpl.java | 5 -
.../processors/cache/CacheMetricsImpl.java | 5 -
.../processors/cache/CacheMetricsSnapshot.java | 13 -
.../cache/DynamicCacheDescriptor.java | 24 ++
.../processors/cache/GridCacheAdapter.java | 19 +-
.../processors/cache/GridCacheProcessor.java | 201 +++++----
.../cache/GridCacheSharedContext.java | 18 +-
.../processors/cache/GridCacheUtils.java | 30 +-
.../cache/binary/BinaryMetadataHolder.java | 7 +
.../cache/binary/BinaryMetadataTransport.java | 34 +-
.../binary/CacheObjectBinaryProcessorImpl.java | 27 +-
.../binary/ClientMetadataRequestFuture.java | 5 +
.../IgniteCacheDatabaseSharedManager.java | 235 +++++++----
.../cache/database/MemoryMetricsImpl.java | 24 +-
.../cache/database/MemoryMetricsMXBeanImpl.java | 108 +++++
.../cache/database/MemoryMetricsSnapshot.java | 85 ++++
.../processors/cache/database/MemoryPolicy.java | 7 +-
.../evict/FairFifoPageEvictionTracker.java | 6 +-
.../evict/PageAbstractEvictionTracker.java | 92 +----
.../evict/Random2LruPageEvictionTracker.java | 6 +-
.../evict/RandomLruPageEvictionTracker.java | 6 +-
.../distributed/dht/GridDhtLocalPartition.java | 3 +-
.../GridDhtPartitionsAbstractMessage.java | 6 +
.../processors/cache/local/GridLocalCache.java | 3 +-
.../cache/query/GridCacheQueryManager.java | 14 +-
.../cache/transactions/IgniteTxManager.java | 20 +-
.../cache/transactions/TxDeadlock.java | 19 +-
.../cache/transactions/TxLocksResponse.java | 37 +-
.../processors/igfs/IgfsDataManager.java | 2 +-
.../platform/cache/PlatformCache.java | 1 -
.../utils/PlatformConfigurationUtils.java | 35 +-
.../processors/query/GridQueryIndexing.java | 23 +-
.../query/GridQueryTypeDescriptor.java | 12 +
.../query/QueryTypeDescriptorImpl.java | 34 +-
.../internal/processors/query/QueryUtils.java | 134 +++++-
.../redis/GridRedisRestCommandHandler.java | 3 +
.../redis/key/GridRedisDelCommandHandler.java | 1 +
.../key/GridRedisExistsCommandHandler.java | 1 +
.../server/GridRedisDbSizeCommandHandler.java | 1 +
.../string/GridRedisAppendCommandHandler.java | 3 +
.../string/GridRedisGetCommandHandler.java | 1 +
.../string/GridRedisGetRangeCommandHandler.java | 1 +
.../string/GridRedisGetSetCommandHandler.java | 1 +
.../string/GridRedisIncrDecrCommandHandler.java | 2 +
.../string/GridRedisMGetCommandHandler.java | 1 +
.../string/GridRedisMSetCommandHandler.java | 1 +
.../string/GridRedisSetCommandHandler.java | 1 +
.../string/GridRedisSetRangeCommandHandler.java | 2 +
.../string/GridRedisStrlenCommandHandler.java | 1 +
.../tcp/GridTcpMemcachedNioListener.java | 5 +-
.../service/GridServiceProcessor.java | 9 +-
.../ignite/internal/util/IgniteUtils.java | 28 +-
.../visor/binary/VisorBinaryMetadata.java | 8 +-
.../VisorBinaryMetadataCollectorTask.java | 16 +-
.../VisorBinaryMetadataCollectorTaskArg.java | 71 ++++
.../VisorBinaryMetadataCollectorTaskResult.java | 4 +-
.../cache/VisorCacheAffinityConfiguration.java | 8 +-
.../visor/cache/VisorCacheClearTask.java | 19 +-
.../visor/cache/VisorCacheClearTaskArg.java | 72 ++++
.../visor/cache/VisorCacheConfiguration.java | 162 +++++++-
.../VisorCacheConfigurationCollectorJob.java | 12 +-
.../VisorCacheConfigurationCollectorTask.java | 5 +-
...VisorCacheConfigurationCollectorTaskArg.java | 74 ++++
.../visor/cache/VisorCacheLoadTask.java | 5 +-
.../visor/cache/VisorCacheLoadTaskArg.java | 2 +-
.../visor/cache/VisorCacheMetadataTask.java | 14 +-
.../visor/cache/VisorCacheMetadataTaskArg.java | 72 ++++
.../visor/cache/VisorCacheNodesTask.java | 12 +-
.../visor/cache/VisorCacheNodesTaskArg.java | 72 ++++
.../cache/VisorCacheRebalanceConfiguration.java | 26 ++
.../visor/cache/VisorCacheRebalanceTask.java | 13 +-
.../visor/cache/VisorCacheRebalanceTaskArg.java | 73 ++++
.../visor/cache/VisorCacheResetMetricsTask.java | 14 +-
.../cache/VisorCacheResetMetricsTaskArg.java | 72 ++++
.../visor/cache/VisorCacheStartArg.java | 100 -----
.../visor/cache/VisorCacheStopTask.java | 17 +-
.../visor/cache/VisorCacheStopTaskArg.java | 72 ++++
.../cache/VisorCacheStoreConfiguration.java | 14 +
.../internal/visor/cache/VisorPartitionMap.java | 24 +-
.../compute/VisorComputeCancelSessionsTask.java | 13 +-
.../VisorComputeCancelSessionsTaskArg.java | 76 ++++
.../visor/compute/VisorGatewayTask.java | 87 +++-
.../internal/visor/debug/VisorThreadInfo.java | 64 +--
.../visor/debug/VisorThreadMonitorInfo.java | 8 +-
.../internal/visor/file/VisorFileBlockArg.java | 114 ------
.../visor/igfs/VisorIgfsFormatTask.java | 14 +-
.../visor/igfs/VisorIgfsFormatTaskArg.java | 72 ++++
.../visor/igfs/VisorIgfsProfilerClearTask.java | 24 +-
.../igfs/VisorIgfsProfilerClearTaskArg.java | 72 ++++
.../igfs/VisorIgfsProfilerClearTaskResult.java | 6 +-
.../visor/igfs/VisorIgfsProfilerTask.java | 18 +-
.../visor/igfs/VisorIgfsProfilerTaskArg.java | 72 ++++
.../visor/igfs/VisorIgfsResetMetricsTask.java | 13 +-
.../igfs/VisorIgfsResetMetricsTaskArg.java | 73 ++++
.../internal/visor/log/VisorLogSearchArg.java | 114 ------
.../internal/visor/misc/VisorAckTask.java | 14 +-
.../internal/visor/misc/VisorAckTaskArg.java | 72 ++++
.../misc/VisorChangeGridActiveStateTask.java | 12 +-
.../misc/VisorChangeGridActiveStateTaskArg.java | 71 ++++
.../visor/node/VisorBasicConfiguration.java | 224 +++++++++-
.../visor/node/VisorBinaryConfiguration.java | 131 ++++++
.../node/VisorBinaryTypeConfiguration.java | 150 +++++++
.../visor/node/VisorCacheKeyConfiguration.java | 108 +++++
.../visor/node/VisorExecutorConfiguration.java | 108 +++++
.../node/VisorExecutorServiceConfiguration.java | 115 ++++++
.../visor/node/VisorGridConfiguration.java | 110 +++++
.../visor/node/VisorHadoopConfiguration.java | 145 +++++++
.../visor/node/VisorIgfsConfiguration.java | 42 +-
.../visor/node/VisorMemoryConfiguration.java | 2 +-
.../node/VisorMemoryPolicyConfiguration.java | 43 +-
.../internal/visor/node/VisorNodePingTask.java | 13 +-
.../visor/node/VisorNodePingTaskArg.java | 73 ++++
.../visor/node/VisorNodeSuppressedErrors.java | 6 +-
.../node/VisorNodeSuppressedErrorsTask.java | 12 +-
.../node/VisorNodeSuppressedErrorsTaskArg.java | 74 ++++
.../visor/node/VisorOdbcConfiguration.java | 114 ++++++
.../visor/node/VisorRestConfiguration.java | 207 +++++++++-
.../node/VisorSegmentationConfiguration.java | 13 +
.../visor/node/VisorServiceConfiguration.java | 176 ++++++++
.../internal/visor/query/VisorQueryArg.java | 155 -------
.../visor/query/VisorQueryCancelTask.java | 12 +-
.../visor/query/VisorQueryCancelTaskArg.java | 71 ++++
.../visor/query/VisorQueryCleanupTask.java | 10 +-
.../visor/query/VisorQueryCleanupTaskArg.java | 75 ++++
.../VisorQueryDetailMetricsCollectorTask.java | 17 +-
...VisorQueryDetailMetricsCollectorTaskArg.java | 71 ++++
.../query/VisorQueryResetDetailMetricsTask.java | 6 +-
.../visor/query/VisorQueryResetMetricsTask.java | 18 +-
.../query/VisorQueryResetMetricsTaskArg.java | 72 ++++
.../query/VisorRunningQueriesCollectorTask.java | 16 +-
.../VisorRunningQueriesCollectorTaskArg.java | 71 ++++
.../internal/visor/query/VisorScanQueryArg.java | 157 -------
.../visor/service/VisorCancelServiceTask.java | 12 +-
.../service/VisorCancelServiceTaskArg.java | 72 ++++
.../internal/visor/util/VisorTaskUtils.java | 23 ++
.../ignite/mxbean/CacheMetricsMXBean.java | 4 -
.../ignite/mxbean/MemoryMetricsMXBean.java | 94 +++--
.../spi/discovery/tcp/TcpDiscoverySpi.java | 8 +-
.../spi/indexing/IndexingQueryFilter.java | 2 +-
.../resources/META-INF/classnames.properties | 39 +-
.../spring-cache-client-benchmark-1.xml | 3 -
.../spring-cache-client-benchmark-2.xml | 3 -
.../spring-cache-client-benchmark-3.xml | 3 -
.../core/src/test/config/discovery-stress.xml | 2 +-
modules/core/src/test/config/example-cache.xml | 3 -
modules/core/src/test/config/igfs-loopback.xml | 18 -
modules/core/src/test/config/igfs-shmem.xml | 18 -
.../src/test/config/load/cache-benchmark.xml | 4 -
.../test/config/load/cache-client-benchmark.xml | 2 -
.../config/load/dsi-49-server-production.xml | 2 -
.../src/test/config/load/dsi-load-client.xml | 2 -
.../src/test/config/load/dsi-load-server.xml | 2 -
.../core/src/test/config/spring-cache-load.xml | 1 +
.../core/src/test/config/spring-cache-swap.xml | 2 +
.../src/test/config/spring-cache-teststore.xml | 2 +
.../core/src/test/config/spring-multicache.xml | 17 -
.../test/config/store/jdbc/ignite-jdbc-type.xml | 6 +
.../config/websession/example-cache-base.xml | 3 -
.../GridCacheAffinityBackupsSelfTest.java | 2 +-
.../apache/ignite/GridTestStoreNodeStartup.java | 2 +-
.../ignite/IgniteCacheAffinitySelfTest.java | 2 +-
.../cache/IgniteWarmupClosureSelfTest.java | 2 +-
.../ignite/cache/LargeEntryUpdateTest.java | 2 +-
.../affinity/AffinityClientNodeSelfTest.java | 14 +-
...ityFunctionBackupFilterAbstractSelfTest.java | 8 +-
...unctionExcludeNeighborsAbstractSelfTest.java | 4 +-
.../affinity/AffinityHistoryCleanupTest.java | 2 +-
.../local/LocalAffinityFunctionTest.java | 2 +-
...cheStoreSessionListenerAbstractSelfTest.java | 6 +-
.../store/GridCacheBalancingStoreSelfTest.java | 8 +-
.../IgniteCacheExpiryStoreLoadSelfTest.java | 2 +-
.../store/StoreResourceInjectionSelfTest.java | 2 +-
...CacheJdbcBlobStoreMultithreadedSelfTest.java | 8 +-
.../internal/ClusterNodeMetricsSelfTest.java | 6 +-
.../ignite/internal/GridAffinityMappedTest.java | 6 +-
.../internal/GridAffinityP2PSelfTest.java | 6 +-
.../ignite/internal/GridAffinitySelfTest.java | 6 +-
.../ignite/internal/GridDiscoverySelfTest.java | 2 +-
.../GridJobMasterLeaveAwareSelfTest.java | 8 +-
.../GridProjectionForCachesSelfTest.java | 13 +-
...ectionLocalJobMultipleArgumentsSelfTest.java | 4 +-
.../ignite/internal/GridStartStopSelfTest.java | 8 +-
.../GridTaskFailoverAffinityRunTest.java | 4 +-
.../IgniteClientReconnectApiExceptionTest.java | 18 +-
.../IgniteClientReconnectCacheTest.java | 82 ++--
...eClientReconnectContinuousProcessorTest.java | 10 +-
.../IgniteClientReconnectFailoverTest.java | 4 +-
.../internal/IgniteClientReconnectStopTest.java | 2 +-
.../IgniteComputeEmptyClusterGroupTest.java | 8 +-
...eConcurrentEntryProcessorAccessStopTest.java | 2 +-
...ryConfigurationCustomSerializerSelfTest.java | 4 +-
.../internal/binary/BinaryEnumsSelfTest.java | 2 +-
.../BinaryObjectBuilderAdditionalSelfTest.java | 2 +-
.../internal/binary/BinaryTreeSelfTest.java | 4 +-
.../binary/GridBinaryAffinityKeySelfTest.java | 30 +-
...aultBinaryMappersBinaryMetaDataSelfTest.java | 4 +-
.../IgniteVariousConnectionNumberTest.java | 4 +-
.../GridDeploymentMessageCountSelfTest.java | 6 +-
.../GridDiscoveryManagerAliveCacheSelfTest.java | 2 +-
.../OptimizedMarshallerNodeFailoverTest.java | 6 +-
.../pagemem/impl/PageMemoryNoLoadSelfTest.java | 18 +-
.../GridCacheTxLoadFromStoreOnLockSelfTest.java | 2 +-
.../GridAffinityProcessorAbstractSelfTest.java | 2 +-
.../CacheAtomicSingleMessageCountSelfTest.java | 4 +-
.../cache/CacheClientStoreSelfTest.java | 2 +-
.../cache/CacheConcurrentReadThroughTest.java | 2 +-
.../cache/CacheConfigurationLeakTest.java | 4 +-
.../cache/CacheDeferredDeleteQueueTest.java | 4 +-
.../CacheDeferredDeleteSanitySelfTest.java | 4 +-
...cheDhtLocalPartitionAfterRemoveSelfTest.java | 6 +-
.../cache/CacheEnumOperationsAbstractTest.java | 2 +-
...CacheExchangeMessageDuplicatedStateTest.java | 10 +-
.../cache/CacheFutureExceptionSelfTest.java | 2 +-
.../cache/CacheGetEntryAbstractTest.java | 16 +-
.../processors/cache/CacheGetFromJobTest.java | 2 +-
...erceptorPartitionCounterLocalSanityTest.java | 2 +-
...torPartitionCounterRandomOperationsTest.java | 2 +-
.../CacheMemoryPolicyConfigurationTest.java | 20 +-
.../processors/cache/CacheNamesSelfTest.java | 8 +-
.../CacheNamesWithSpecialCharactersTest.java | 4 +-
.../cache/CacheNearReaderUpdateTest.java | 2 +-
...cheNearUpdateTopologyChangeAbstractTest.java | 8 +-
.../cache/CacheOffheapMapEntrySelfTest.java | 2 +-
.../processors/cache/CachePutIfAbsentTest.java | 2 +-
.../cache/CacheReadThroughRestartSelfTest.java | 8 +-
.../cache/CacheRebalancingSelfTest.java | 4 +-
.../cache/CacheRemoveAllSelfTest.java | 4 +-
.../CacheSerializableTransactionsTest.java | 6 +-
.../CacheStartupInDeploymentModesTest.java | 4 +-
.../CacheStoreUsageMultinodeAbstractTest.java | 8 +-
...eUsageMultinodeDynamicStartAbstractTest.java | 4 +-
.../processors/cache/CacheTxFastFinishTest.java | 4 +-
.../processors/cache/CrossCacheLockTest.java | 4 +-
.../cache/CrossCacheTxRandomOperationsTest.java | 2 +-
.../EntryVersionConsistencyReadThroughTest.java | 10 +-
.../GridCacheAbstractFailoverSelfTest.java | 6 +-
.../cache/GridCacheAbstractFullApiSelfTest.java | 114 +++---
.../GridCacheAbstractLocalStoreSelfTest.java | 26 +-
.../cache/GridCacheAbstractMetricsSelfTest.java | 102 ++---
.../GridCacheAbstractRemoveFailureTest.java | 6 +-
.../cache/GridCacheAbstractSelfTest.java | 4 +-
...acheAbstractUsersAffinityMapperSelfTest.java | 7 +-
.../cache/GridCacheAffinityApiSelfTest.java | 26 +-
.../cache/GridCacheAffinityRoutingSelfTest.java | 10 +-
...eAtomicEntryProcessorDeploymentSelfTest.java | 2 +-
.../GridCacheAtomicMessageCountSelfTest.java | 6 +-
.../cache/GridCacheBasicApiAbstractTest.java | 30 +-
.../cache/GridCacheClearLocallySelfTest.java | 8 +-
.../cache/GridCacheConcurrentMapSelfTest.java | 11 +-
.../GridCacheConcurrentTxMultiNodeTest.java | 10 +-
.../GridCacheConditionalDeploymentSelfTest.java | 4 +-
...idCacheConfigurationConsistencySelfTest.java | 2 +-
.../GridCacheDaemonNodeAbstractSelfTest.java | 8 +-
.../cache/GridCacheDeploymentSelfTest.java | 46 +--
.../cache/GridCacheEntryMemorySizeSelfTest.java | 4 +-
.../cache/GridCacheEntryVersionSelfTest.java | 16 +-
.../GridCacheEvictionEventAbstractTest.java | 2 +-
.../GridCacheFinishPartitionsSelfTest.java | 16 +-
...CacheFullTextQueryMultithreadedSelfTest.java | 2 +-
.../cache/GridCacheIncrementTransformTest.java | 4 +-
.../GridCacheInterceptorAbstractSelfTest.java | 8 +-
.../cache/GridCacheIteratorPerformanceTest.java | 6 +-
.../cache/GridCacheKeyCheckSelfTest.java | 6 +-
.../GridCacheMarshallerTxAbstractTest.java | 10 +-
.../GridCacheMarshallingNodeJoinSelfTest.java | 4 +-
.../GridCacheMissingCommitVersionSelfTest.java | 2 +-
...GridCacheMixedPartitionExchangeSelfTest.java | 4 +-
.../cache/GridCacheMultiUpdateLockSelfTest.java | 6 +-
...ridCacheMultinodeUpdateAbstractSelfTest.java | 6 +-
.../cache/GridCacheMvccFlagsTest.java | 4 +-
.../cache/GridCacheMvccManagerSelfTest.java | 6 +-
.../cache/GridCacheMvccPartitionedSelfTest.java | 34 +-
.../processors/cache/GridCacheMvccSelfTest.java | 58 +--
.../cache/GridCacheNestedTxAbstractTest.java | 12 +-
.../cache/GridCacheObjectToStringSelfTest.java | 4 +-
...HeapMultiThreadedUpdateAbstractSelfTest.java | 20 +-
...CacheOffHeapMultiThreadedUpdateSelfTest.java | 14 +-
.../cache/GridCacheOffheapUpdateSelfTest.java | 14 +-
.../cache/GridCachePartitionedGetSelfTest.java | 16 +-
...hePartitionedProjectionAffinitySelfTest.java | 8 +-
.../GridCachePreloadingEvictionsSelfTest.java | 14 +-
.../cache/GridCachePutAllFailoverSelfTest.java | 1 -
.../GridCacheQueryIndexingDisabledSelfTest.java | 2 +-
.../GridCacheQueryInternalKeysSelfTest.java | 6 +-
.../GridCacheReferenceCleanupSelfTest.java | 10 +-
...ridCacheReplicatedSynchronousCommitTest.java | 6 +-
.../GridCacheReturnValueTransferSelfTest.java | 4 +-
.../processors/cache/GridCacheStopSelfTest.java | 8 +-
...ridCacheStoreManagerDeserializationTest.java | 3 +
.../cache/GridCacheStorePutxSelfTest.java | 2 +-
.../cache/GridCacheStoreValueBytesSelfTest.java | 4 +-
.../cache/GridCacheSwapPreloadSelfTest.java | 10 +-
...acheTcpClientDiscoveryMultiThreadedTest.java | 4 +-
...cheTransactionalAbstractMetricsSelfTest.java | 8 +-
.../GridCacheTtlManagerEvictionSelfTest.java | 6 +-
.../cache/GridCacheTtlManagerLoadTest.java | 4 +-
.../GridCacheTtlManagerNotificationTest.java | 8 +-
.../cache/GridCacheTtlManagerSelfTest.java | 12 +-
.../GridCacheValueBytesPreloadingSelfTest.java | 12 +-
...idCacheValueConsistencyAbstractSelfTest.java | 14 +-
.../GridCacheVariableTopologySelfTest.java | 4 +-
.../cache/GridCacheVersionMultinodeTest.java | 2 +-
.../GridCacheVersionTopologyChangeTest.java | 2 +-
...ProjectionForCachesOnDaemonNodeSelfTest.java | 16 +-
.../IgniteCacheAbstractStopBusySelfTest.java | 3 +-
.../cache/IgniteCacheAbstractTest.java | 2 +-
...IgniteCacheBinaryEntryProcessorSelfTest.java | 6 +-
...teCacheConfigurationDefaultTemplateTest.java | 6 +-
.../IgniteCacheConfigurationTemplateTest.java | 29 +-
...niteCacheCopyOnReadDisabledAbstractTest.java | 2 +-
.../cache/IgniteCacheDynamicStopSelfTest.java | 10 +-
.../IgniteCacheEntryListenerAbstractTest.java | 6 +-
...niteCacheEntryListenerExpiredEventsTest.java | 2 +-
.../IgniteCacheEntryProcessorCallTest.java | 8 +-
.../IgniteCacheEntryProcessorNodeJoinTest.java | 16 +-
...niteCacheExpireAndUpdateConsistencyTest.java | 2 +-
...IgniteCacheGetCustomCollectionsSelfTest.java | 2 +-
.../cache/IgniteCacheIncrementTxTest.java | 10 +-
.../cache/IgniteCacheInvokeAbstractTest.java | 2 +-
...gniteCacheInvokeReadThroughAbstractTest.java | 2 +-
...gniteCacheLoadRebalanceEvictionSelfTest.java | 6 +-
.../IgniteCacheManyAsyncOperationsTest.java | 2 +-
.../cache/IgniteCacheObjectPutSelfTest.java | 2 +-
...CacheP2pUnmarshallingRebalanceErrorTest.java | 4 +-
.../IgniteCachePartitionMapUpdateTest.java | 4 +-
.../cache/IgniteCachePeekModesAbstractTest.java | 22 +-
.../IgniteCacheReadThroughStoreCallTest.java | 2 +-
...iteCacheScanPredicateDeploymentSelfTest.java | 2 +-
.../cache/IgniteCacheSerializationSelfTest.java | 4 +-
.../cache/IgniteCacheStartStopLoadTest.java | 2 +-
.../cache/IgniteCacheStoreCollectionTest.java | 4 +-
.../IgniteCacheStoreValueAbstractTest.java | 30 +-
.../cache/IgniteCacheTxPreloadNoWriteTest.java | 12 +-
.../IgniteClientAffinityAssignmentSelfTest.java | 22 +-
.../IgniteDaemonNodeMarshallerCacheTest.java | 2 +-
.../cache/IgniteDynamicCacheAndNodeStop.java | 4 +-
.../cache/IgniteDynamicCacheFilterTest.java | 10 +-
...eDynamicCacheStartNoExchangeTimeoutTest.java | 34 +-
.../cache/IgniteDynamicCacheStartSelfTest.java | 36 +-
...niteDynamicCacheStartStopConcurrentTest.java | 6 +-
.../IgniteDynamicClientCacheStartSelfTest.java | 44 +-
.../cache/IgniteExchangeFutureHistoryTest.java | 2 +-
...iteMarshallerCacheClassNameConflictTest.java | 8 +-
...lerCacheClientRequestsMappingOnMissTest.java | 22 +-
...eMarshallerCacheConcurrentReadWriteTest.java | 8 +-
.../cache/IgniteOnePhaseCommitNearSelfTest.java | 8 +-
.../cache/IgnitePutAllLargeBatchSelfTest.java | 12 +-
...tAllUpdateNonPreloadedPartitionSelfTest.java | 6 +-
.../IgniteStartCacheInTransactionSelfTest.java | 18 +-
.../cache/IgniteStaticCacheStartSelfTest.java | 2 +-
...gniteTopologyValidatorAbstractCacheTest.java | 37 +-
...iteTopologyValidatorAbstractTxCacheTest.java | 20 +-
...niteTopologyValidatorGridSplitCacheTest.java | 2 +-
.../processors/cache/IgniteTxAbstractTest.java | 6 +-
.../IgniteTxConcurrentGetAbstractTest.java | 6 +-
.../cache/IgniteTxConfigCacheSelfTest.java | 2 +-
.../IgniteTxExceptionAbstractSelfTest.java | 36 +-
.../cache/IgniteTxMultiNodeAbstractTest.java | 58 +--
.../IgniteTxMultiThreadedAbstractTest.java | 4 +-
.../cache/IgniteTxReentryAbstractSelfTest.java | 2 +-
.../IgniteTxStoreExceptionAbstractSelfTest.java | 34 +-
.../cache/MemoryPolicyConfigValidationTest.java | 121 +++++-
.../binary/BinaryMetadataUpdatesFlowTest.java | 10 +-
.../CacheKeepBinaryWithInterceptorTest.java | 6 +-
...yAtomicEntryProcessorDeploymentSelfTest.java | 6 +-
...naryObjectMetadataExchangeMultinodeTest.java | 16 +-
...acheBinaryObjectUserClassloaderSelfTest.java | 4 +-
...naryObjectsAbstractDataStreamerSelfTest.java | 4 +-
...aryObjectsAbstractMultiThreadedSelfTest.java | 2 +-
.../GridCacheBinaryObjectsAbstractSelfTest.java | 8 +-
.../GridCacheBinaryStoreAbstractSelfTest.java | 2 +-
...ntNodeBinaryObjectMetadataMultinodeTest.java | 8 +-
...CacheClientNodeBinaryObjectMetadataTest.java | 4 +-
.../GridDataStreamerImplSelfTest.java | 20 +-
...IgniteCacheAbstractExecutionContextTest.java | 4 +-
.../MemoryPolicyInitializationTest.java | 16 +-
...eAbstractDataStructuresFailoverSelfTest.java | 2 +-
...CacheAtomicReferenceApiSelfAbstractTest.java | 2 +-
...idCacheAtomicStampedApiSelfAbstractTest.java | 2 +-
.../GridCacheQueueApiSelfAbstractTest.java | 2 +-
.../GridCacheQueueCleanupSelfTest.java | 10 +-
.../GridCacheSequenceApiSelfAbstractTest.java | 2 +-
.../GridCacheSetAbstractSelfTest.java | 2 +-
.../GridCacheSetFailoverAbstractSelfTest.java | 2 +-
.../IgniteAtomicLongApiAbstractSelfTest.java | 2 +-
.../IgniteCountDownLatchAbstractSelfTest.java | 2 +-
.../IgniteLockAbstractSelfTest.java | 2 +-
.../IgniteSemaphoreAbstractSelfTest.java | 2 +-
...achePartitionedAtomicSequenceTxSelfTest.java | 2 +-
...idCachePartitionedNodeRestartTxSelfTest.java | 24 +-
...PartitionedQueueCreateMultiNodeSelfTest.java | 4 +-
...acheAsyncOperationsFailoverAbstractTest.java | 4 +-
.../distributed/CacheAsyncOperationsTest.java | 2 +-
.../CacheGetFutureHangsSelfTest.java | 4 +-
.../CacheGetInsideLockChangingTopologyTest.java | 2 +-
.../CacheLateAffinityAssignmentTest.java | 9 +-
...CacheLoadingConcurrentGridStartSelfTest.java | 20 +-
.../CacheLockReleaseNodeLeaveTest.java | 26 +-
.../CachePutAllFailoverAbstractTest.java | 2 +-
.../CacheTryLockMultithreadedTest.java | 4 +-
.../GridCacheAbstractJobExecutionTest.java | 14 +-
.../GridCacheAbstractNodeRestartSelfTest.java | 2 +-
...tractPartitionedByteArrayValuesSelfTest.java | 2 +-
.../GridCacheAbstractPrimarySyncSelfTest.java | 6 +-
.../GridCacheBasicOpAbstractTest.java | 26 +-
.../GridCacheClientModesAbstractSelfTest.java | 20 +-
.../GridCacheEntrySetAbstractSelfTest.java | 2 +-
.../distributed/GridCacheLockAbstractTest.java | 6 +-
.../distributed/GridCacheMixedModeSelfTest.java | 4 +-
.../GridCacheMultiNodeAbstractTest.java | 10 +-
.../GridCacheMultiNodeLockAbstractTest.java | 27 +-
...dCacheMultithreadedFailoverAbstractTest.java | 2 +-
.../GridCacheNodeFailureAbstractTest.java | 6 +-
...ridCachePartitionNotLoadedEventSelfTest.java | 4 +-
...chePartitionedReloadAllAbstractSelfTest.java | 8 +-
.../GridCachePreloadEventsAbstractSelfTest.java | 4 +-
...GridCachePreloadRestartAbstractSelfTest.java | 1 -
.../GridCacheTransformEventSelfTest.java | 2 +-
...niteBinaryMetadataUpdateNodeRestartTest.java | 2 +-
.../distributed/IgniteCache150ClientsTest.java | 2 +-
...niteCacheClientNodeChangingTopologyTest.java | 130 +++---
.../IgniteCacheClientNodeConcurrentStart.java | 2 +-
...teCacheClientNodePartitionsExchangeTest.java | 16 +-
.../IgniteCacheClientReconnectTest.java | 2 +-
.../IgniteCacheConnectionRecoveryTest.java | 2 +-
.../distributed/IgniteCacheCreatePutTest.java | 6 +-
.../distributed/IgniteCacheGetRestartTest.java | 2 +-
.../distributed/IgniteCacheManyClientsTest.java | 6 +-
.../IgniteCacheMessageRecoveryAbstractTest.java | 4 +-
...eCacheMessageRecoveryIdleConnectionTest.java | 2 +-
.../IgniteCacheNearRestartRollbackSelfTest.java | 4 +-
.../distributed/IgniteCachePrimarySyncTest.java | 4 +-
.../IgniteCacheReadFromBackupTest.java | 2 +-
.../IgniteCacheServerNodeConcurrentStart.java | 6 +-
.../IgniteCacheSingleGetMessageTest.java | 2 +-
.../IgniteCacheSizeFailoverTest.java | 6 +-
.../IgniteCacheSystemTransactionsSelfTest.java | 6 +-
.../IgniteNoClassOnServerAbstractTest.java | 2 +-
.../IgniteTxCachePrimarySyncTest.java | 45 +-
...teSynchronizationModesMultithreadedTest.java | 15 +-
...iteTxConsistencyRestartAbstractSelfTest.java | 12 +-
...xOriginatingNodeFailureAbstractSelfTest.java | 10 +-
...cOriginatingNodeFailureAbstractSelfTest.java | 22 +-
.../IgniteTxTimeoutAbstractTest.java | 2 +-
...heAbstractTransformWriteThroughSelfTest.java | 2 +-
.../dht/GridCacheAtomicNearCacheSelfTest.java | 50 +--
.../dht/GridCacheColocatedDebugTest.java | 112 ++---
...eColocatedOptimisticTransactionSelfTest.java | 2 +-
.../dht/GridCacheDhtEntrySelfTest.java | 6 +-
...GridCacheDhtEvictionNearReadersSelfTest.java | 8 +-
.../dht/GridCacheDhtMappingSelfTest.java | 4 +-
.../dht/GridCacheDhtPreloadBigDataSelfTest.java | 10 +-
.../dht/GridCacheDhtPreloadDelayedSelfTest.java | 24 +-
.../GridCacheDhtPreloadDisabledSelfTest.java | 10 +-
.../GridCacheDhtPreloadMessageCountTest.java | 6 +-
.../dht/GridCacheDhtPreloadPutGetSelfTest.java | 4 +-
.../dht/GridCacheDhtPreloadSelfTest.java | 18 +-
.../GridCacheDhtPreloadStartStopSelfTest.java | 4 +-
.../dht/GridCacheDhtPreloadUnloadSelfTest.java | 24 +-
...ePartitionedNearDisabledMetricsSelfTest.java | 12 +-
...idCachePartitionedPreloadEventsSelfTest.java | 6 +-
...dCachePartitionedTopologyChangeSelfTest.java | 18 +-
...itionedTxOriginatingNodeFailureSelfTest.java | 10 +-
...ridCachePartitionedUnloadEventsSelfTest.java | 10 +-
.../dht/GridCacheTxNodeFailureSelfTest.java | 12 +-
.../IgniteCacheCommitDelayTxRecoveryTest.java | 22 +-
.../dht/IgniteCacheConcurrentPutGetRemove.java | 2 +-
.../IgniteCacheCrossCacheTxFailoverTest.java | 5 +-
.../dht/IgniteCacheLockFailoverSelfTest.java | 8 +-
.../dht/IgniteCacheMultiTxLockSelfTest.java | 3 +-
...artitionedBackupNodeFailureRecoveryTest.java | 6 +-
...ePrimaryNodeFailureRecoveryAbstractTest.java | 12 +-
.../IgniteCachePutRetryAbstractSelfTest.java | 8 +-
.../dht/IgniteCachePutRetryAtomicSelfTest.java | 4 +-
...gniteCachePutRetryTransactionalSelfTest.java | 6 +-
.../dht/IgniteCacheTxRecoveryRollbackTest.java | 20 +-
.../dht/IgniteTxReentryColocatedSelfTest.java | 2 +-
...eAtomicInvalidPartitionHandlingSelfTest.java | 12 +-
.../atomic/GridCacheAtomicPreloadSelfTest.java | 10 +-
.../atomic/IgniteCacheAtomicProtocolTest.java | 2 +-
...tomicClientOnlyMultiNodeFullApiSelfTest.java | 6 +-
...eAtomicNearOnlyMultiNodeFullApiSelfTest.java | 2 +-
...AtomicPartitionedTckMetricsSelfTestImpl.java | 8 +-
.../near/GridCacheGetStoreErrorSelfTest.java | 4 +-
.../near/GridCacheNearEvictionSelfTest.java | 6 +-
.../near/GridCacheNearMetricsSelfTest.java | 32 +-
.../near/GridCacheNearMultiGetSelfTest.java | 4 +-
.../near/GridCacheNearMultiNodeSelfTest.java | 12 +-
...idCacheNearOnlyMultiNodeFullApiSelfTest.java | 10 +-
.../near/GridCacheNearOnlyTopologySelfTest.java | 16 +-
.../GridCacheNearPartitionedClearSelfTest.java | 2 +-
.../GridCacheNearReaderPreloadSelfTest.java | 2 +-
.../near/GridCacheNearReadersSelfTest.java | 36 +-
.../near/GridCacheNearTxForceKeyTest.java | 8 +-
.../near/GridCacheNearTxMultiNodeSelfTest.java | 18 +-
...AffinityExcludeNeighborsPerformanceTest.java | 2 +-
.../GridCachePartitionedAffinitySelfTest.java | 8 +-
...ionedClientOnlyNoPrimaryFullApiSelfTest.java | 4 +-
.../GridCachePartitionedEvictionSelfTest.java | 2 +-
...titionedExplicitLockNodeFailureSelfTest.java | 4 +-
...GridCachePartitionedFilteredPutSelfTest.java | 2 +-
.../GridCachePartitionedFullApiSelfTest.java | 8 +-
...idCachePartitionedHitsAndMissesSelfTest.java | 5 +-
.../GridCachePartitionedLoadCacheSelfTest.java | 2 +-
...achePartitionedMultiNodeCounterSelfTest.java | 24 +-
...achePartitionedMultiNodeFullApiSelfTest.java | 34 +-
...ePartitionedMultiThreadedPutGetSelfTest.java | 8 +-
.../GridCachePartitionedNodeRestartTest.java | 1 -
...ePartitionedOptimisticTxNodeRestartTest.java | 1 -
.../GridCachePartitionedStorePutSelfTest.java | 6 +-
.../GridCachePartitionedTxSalvageSelfTest.java | 2 +-
.../near/GridCachePutArrayValueSelfTest.java | 2 +-
...idCacheRendezvousAffinityClientSelfTest.java | 2 +-
.../near/GridPartitionedBackupLoadSelfTest.java | 4 +-
.../near/IgniteCacheNearOnlyTxTest.java | 24 +-
.../near/IgniteCacheNearReadCommittedTest.java | 4 +-
.../near/IgniteTxReentryNearSelfTest.java | 2 +-
.../near/NearCacheMultithreadedUpdateTest.java | 8 +-
.../near/NearCachePutAllMultinodeTest.java | 4 +-
.../near/NearCacheSyncUpdateTest.java | 4 +-
.../near/NoneRebalanceModeSelfTest.java | 4 +-
...cingDelayedPartitionMapExchangeSelfTest.java | 8 +-
.../GridCacheRebalancingOrderingTest.java | 2 +-
.../GridCacheRebalancingSyncCheckDataTest.java | 6 +-
.../GridCacheRebalancingSyncSelfTest.java | 10 +-
...eRebalancingUnmarshallingFailedSelfTest.java | 2 +-
...stractReplicatedByteArrayValuesSelfTest.java | 2 +-
.../GridCacheReplicatedNodeRestartSelfTest.java | 2 -
.../GridCacheSyncReplicatedPreloadSelfTest.java | 14 +-
.../GridCacheReplicatedPreloadSelfTest.java | 50 +--
...eplicatedPreloadStartStopEventsSelfTest.java | 2 +-
.../cache/eviction/EvictionAbstractTest.java | 13 +-
...heConcurrentEvictionConsistencySelfTest.java | 2 +-
.../GridCacheConcurrentEvictionsSelfTest.java | 2 +-
.../GridCacheEmptyEntriesAbstractSelfTest.java | 2 +-
.../GridCacheEvictionFilterSelfTest.java | 4 +-
.../GridCacheEvictionTouchSelfTest.java | 8 +-
.../lru/LruNearEvictionPolicySelfTest.java | 7 +-
.../LruNearOnlyNearEvictionPolicySelfTest.java | 9 +-
.../paged/PageEvictionAbstractTest.java | 22 +-
...LruNearEnabledPageEvictionMultinodeTest.java | 28 ++
...LruNearEnabledPageEvictionMultinodeTest.java | 28 ++
.../SortedEvictionPolicyPerformanceTest.java | 2 +-
.../IgniteCacheClientNearCacheExpiryTest.java | 4 +-
.../IgniteCacheExpiryPolicyAbstractTest.java | 10 +-
...eCacheExpiryPolicyWithStoreAbstractTest.java | 6 +-
.../expiry/IgniteCacheLargeValueExpireTest.java | 4 +-
...eCacheOnlyOneTtlCleanupThreadExistsTest.java | 5 +-
.../expiry/IgniteCacheTtlCleanupSelfTest.java | 8 +-
.../IgniteCacheLoadAllAbstractTest.java | 2 +-
.../IgniteCacheStoreSessionAbstractTest.java | 5 +-
...acheStoreSessionWriteBehindAbstractTest.java | 2 +-
.../IgniteCacheTxStoreSessionTest.java | 22 +-
...dCacheAtomicLocalTckMetricsSelfTestImpl.java | 8 +-
.../GridCacheLocalByteArrayValuesSelfTest.java | 2 +-
.../local/GridCacheLocalFullApiSelfTest.java | 4 +-
.../cache/local/GridCacheLocalLockSelfTest.java | 6 +-
.../GridCacheLocalMultithreadedSelfTest.java | 2 +-
.../local/GridCacheLocalTxTimeoutSelfTest.java | 2 +-
.../BinaryTxCacheLocalEntriesSelfTest.java | 2 +-
.../continuous/CacheContinuousBatchAckTest.java | 2 +-
...eContinuousQueryAsyncFilterListenerTest.java | 2 +-
...acheContinuousQueryExecuteInPrimaryTest.java | 2 +-
...ContinuousQueryFailoverAbstractSelfTest.java | 85 ++--
...ontinuousQueryOperationFromCallbackTest.java | 2 +-
.../CacheContinuousQueryOperationP2PTest.java | 2 +-
.../CacheContinuousQueryOrderingEventTest.java | 2 +-
...acheContinuousQueryRandomOperationsTest.java | 2 +-
.../CacheKeepBinaryIterationTest.java | 2 +-
.../ClientReconnectContinuousQueryTest.java | 4 +-
...yRemoteFilterMissingInClassPathSelfTest.java | 2 +-
...ridCacheContinuousQueryAbstractSelfTest.java | 68 ++--
...dCacheContinuousQueryNodesFilteringTest.java | 2 +-
...dCacheContinuousQueryReplicatedSelfTest.java | 8 +-
...eContinuousQueryReplicatedTxOneNodeTest.java | 4 +-
...CacheContinuousQueryClientReconnectTest.java | 6 +-
.../IgniteCacheContinuousQueryClientTest.java | 18 +-
...eCacheContinuousQueryImmutableEntryTest.java | 10 +-
...teCacheContinuousQueryNoUnsubscribeTest.java | 14 +-
...IgniteCacheContinuousQueryReconnectTest.java | 8 +-
...BehindStorePartitionedMultiNodeSelfTest.java | 6 +-
.../IgniteCacheWriteBehindNoUpdateSelfTest.java | 2 +-
...CacheClientWriteBehindStoreAbstractTest.java | 2 +-
...ClientWriteBehindStoreNonCoalescingTest.java | 2 +-
...DeadlockDetectionMessageMarshallingTest.java | 116 ++++++
.../TxDeadlockDetectionUnmasrhalErrorsTest.java | 225 ++++++++++
...simisticDeadlockDetectionCrossCacheTest.java | 3 +-
.../TxPessimisticDeadlockDetectionTest.java | 2 +-
.../CacheVersionedEntryAbstractTest.java | 10 +-
.../processors/database/BPlusTreeSelfTest.java | 26 +-
.../database/FreeListImplSelfTest.java | 26 +-
.../database/IgniteDbAbstractTest.java | 2 +-
.../database/IgniteDbDynamicCacheSelfTest.java | 6 +-
.../database/IgniteDbPutGetAbstractTest.java | 64 +--
.../database/MemoryMetricsSelfTest.java | 5 +-
.../database/MetadataStorageSelfTest.java | 21 +-
.../DataStreamProcessorSelfTest.java | 58 +--
.../datastreamer/DataStreamerImplSelfTest.java | 10 +-
.../DataStreamerMultiThreadedSelfTest.java | 2 +-
.../DataStreamerUpdateAfterLoadTest.java | 5 +-
.../IgniteDataStreamerPerformanceTest.java | 3 +-
...lockMessageSystemPoolStarvationSelfTest.java | 4 +-
.../processors/igfs/IgfsCacheSelfTest.java | 3 +-
.../igfs/IgfsDataManagerSelfTest.java | 3 +-
.../processors/igfs/IgfsIgniteMock.java | 7 -
.../igfs/IgfsMetaManagerSelfTest.java | 3 +-
.../processors/igfs/IgfsOneClientNodeTest.java | 7 +-
.../processors/igfs/IgfsProcessorSelfTest.java | 3 +-
.../processors/igfs/IgfsSizeSelfTest.java | 2 +-
.../processors/igfs/IgfsStartCacheTest.java | 4 +-
.../processors/igfs/IgfsStreamsSelfTest.java | 3 +-
.../processors/igfs/IgfsTaskSelfTest.java | 4 +-
.../IgfsAbstractRecordResolverSelfTest.java | 4 +-
.../cache/GridCacheCommandHandlerSelfTest.java | 4 +
.../query/GridQueryCommandHandlerTest.java | 2 +-
.../GridServiceProcessorAbstractSelfTest.java | 2 +-
.../ServicePredicateAccessCacheTest.java | 2 +-
.../IgniteOffheapReadWriteLockSelfTest.java | 18 +-
.../loadtests/GridCacheMultiNodeLoadTest.java | 1 -
.../cache/GridCacheAbstractLoadTest.java | 5 +-
.../cache/GridCacheDataStructuresLoadTest.java | 2 +-
.../loadtests/cache/GridCacheLoadTest.java | 4 +-
.../capacity/GridCapacityLoadTest.java | 2 +-
.../capacity/spring-capacity-cache.xml | 5 +-
.../loadtests/colocation/spring-colocation.xml | 5 -
.../GridContinuousOperationsLoadTest.java | 2 +-
.../GridCachePartitionedAtomicLongLoadTest.java | 3 +-
.../loadtests/discovery/GridGcTimeoutTest.java | 2 +-
.../marshaller/GridMarshallerAbstractTest.java | 10 +-
.../platform/PlatformCacheWriteMetricsTask.java | 5 -
.../platform/PlatformComputeEchoTask.java | 11 +-
.../ignite/platform/PlatformSqlQueryTask.java | 2 +-
.../CacheCheckpointSpiSecondCacheSelfTest.java | 7 +-
.../communication/GridCacheMessageSelfTest.java | 2 +-
.../tcp/GridCacheDhtLockBackupSelfTest.java | 6 +-
...gniteClientReconnectMassiveShutdownTest.java | 4 +-
.../tcp/TcpDiscoveryMultiThreadedTest.java | 12 +-
.../spi/discovery/tcp/TcpDiscoverySelfTest.java | 16 +-
.../GridInternalTasksLoadBalancingSelfTest.java | 7 +-
.../stream/socket/SocketStreamerSelfTest.java | 6 +-
.../ignite/testframework/GridTestUtils.java | 2 +-
.../configvariations/ConfigVariations.java | 2 -
.../testframework/junits/GridAbstractTest.java | 12 +-
.../junits/common/GridCommonAbstractTest.java | 23 +-
.../multijvm/IgniteClusterProcessProxy.java | 9 +-
.../junits/multijvm/IgniteProcessProxy.java | 5 -
.../testframework/test/ParametersTest.java | 7 +-
.../IgniteCacheEvictionSelfTestSuite.java | 4 +
.../ignite/testsuites/IgniteIgfsTestSuite.java | 2 +-
.../TxDeadlockDetectionTestSuite.java | 4 +
.../webapp/META-INF/ignite-webapp-config.xml | 12 -
.../tests/p2p/CacheDeploymentTestTask1.java | 2 +-
.../tests/p2p/CacheDeploymentTestTask3.java | 2 +-
.../p2p/GridP2PContinuousDeploymentTask1.java | 2 +-
.../CacheNoValueClassOnServerTestClient.java | 2 +-
.../sink/flink/FlinkIgniteSinkSelfTest.java | 4 +-
.../query/h2/H2IndexingAbstractGeoSelfTest.java | 3 +-
.../hadoop/impl/HadoopAbstractSelfTest.java | 4 +-
.../HibernateL2CacheConfigurationSelfTest.java | 2 +-
.../hibernate/HibernateL2CacheSelfTest.java | 4 +-
.../CacheHibernateStoreFactorySelfTest.java | 2 +-
.../CacheHibernateStoreFactorySelfTest.java | 2 +-
.../query/h2/DmlStatementsProcessor.java | 17 +-
.../processors/query/h2/IgniteH2Indexing.java | 223 ++++++++--
.../query/h2/dml/UpdatePlanBuilder.java | 32 +-
.../query/h2/opt/GridH2AbstractKeyValueRow.java | 78 ++--
.../query/h2/opt/GridH2CollocationModel.java | 4 +-
.../query/h2/opt/GridH2IndexBase.java | 15 +-
.../query/h2/opt/GridH2KeyValueRowOffheap.java | 6 +-
.../query/h2/opt/GridH2KeyValueRowOnheap.java | 6 +-
.../query/h2/opt/GridH2ProxyIndex.java | 204 ++++++++++
.../query/h2/opt/GridH2ProxySpatialIndex.java | 70 ++++
.../query/h2/opt/GridH2RowDescriptor.java | 67 +++
.../processors/query/h2/opt/GridH2Table.java | 114 +++++-
.../query/h2/opt/GridLuceneIndex.java | 4 +-
.../processors/query/h2/sql/DmlAstUtils.java | 36 +-
.../cache/BinarySerializationQuerySelfTest.java | 5 +-
.../CacheBinaryKeyConcurrentQueryTest.java | 2 +-
.../cache/CacheIndexStreamerTest.java | 4 +-
.../CacheOffheapBatchIndexingBaseTest.java | 2 +-
.../CacheOperationsWithExpirationTest.java | 2 +-
.../cache/CacheQueryBuildValueTest.java | 4 +-
.../cache/CacheQueryEvictDataLostTest.java | 2 +-
.../cache/CacheQueryFilterExpiredTest.java | 2 +-
.../CacheRandomOperationsMultithreadedTest.java | 2 +-
...CacheScanPartitionQueryFallbackSelfTest.java | 12 +-
.../cache/CacheSqlQueryValueCopySelfTest.java | 18 +-
.../cache/GridCacheOffHeapSelfTest.java | 4 +-
.../GridCacheOffheapIndexEntryEvictTest.java | 4 +-
.../cache/GridCacheQuerySimpleBenchmark.java | 2 +-
.../cache/GridIndexingWithNoopSwapSelfTest.java | 2 +-
.../IgniteBinaryObjectFieldsQuerySelfTest.java | 9 +-
.../IgniteBinaryObjectQueryArgumentsTest.java | 8 +-
...eBinaryWrappedObjectFieldsQuerySelfTest.java | 3 +-
.../IgniteCacheAbstractFieldsQuerySelfTest.java | 17 +-
...niteCacheAbstractInsertSqlQuerySelfTest.java | 2 +-
.../cache/IgniteCacheAbstractQuerySelfTest.java | 6 +-
.../IgniteCacheAbstractSqlDmlQuerySelfTest.java | 2 +-
.../IgniteCacheCollocatedQuerySelfTest.java | 6 +-
...acheConfigurationPrimitiveTypesSelfTest.java | 14 +-
.../IgniteCacheCrossCacheJoinRandomTest.java | 2 +-
.../IgniteCacheDeleteSqlQuerySelfTest.java | 6 +-
...acheDistributedJoinCollocatedAndNotTest.java | 2 +-
...acheDistributedJoinCustomAffinityMapper.java | 2 +-
.../IgniteCacheDistributedJoinNoIndexTest.java | 2 +-
...ributedJoinPartitionedAndReplicatedTest.java | 2 +-
...CacheDistributedJoinQueryConditionsTest.java | 2 +-
.../cache/IgniteCacheDistributedJoinTest.java | 6 +-
.../IgniteCacheFieldsQueryNoDataSelfTest.java | 2 +-
...teCacheFullTextQueryNodeJoiningSelfTest.java | 6 +-
...PartitionedAndReplicatedCollocationTest.java | 2 +-
...teCacheJoinPartitionedAndReplicatedTest.java | 2 +-
...IgniteCacheJoinQueryWithAffinityKeyTest.java | 2 +-
.../cache/IgniteCacheLargeResultSelfTest.java | 4 +-
...eLockPartitionOnAffinityRunAbstractTest.java | 4 +
.../IgniteCacheMultipleIndexedTypesTest.java | 2 +-
.../IgniteCacheObjectKeyIndexingSelfTest.java | 6 +-
.../cache/IgniteCacheOffheapEvictQueryTest.java | 2 +-
.../cache/IgniteCacheOffheapIndexScanTest.java | 4 +-
...hePartitionedQueryMultiThreadedSelfTest.java | 4 +-
.../cache/IgniteCacheQueriesLoadTest1.java | 2 +-
.../IgniteCacheQueryH2IndexingLeakTest.java | 4 +-
.../cache/IgniteCacheQueryIndexSelfTest.java | 4 +-
.../cache/IgniteCacheQueryLoadSelfTest.java | 14 +-
.../IgniteCacheQueryMultiThreadedSelfTest.java | 15 +-
...gniteCacheSqlQueryMultiThreadedSelfTest.java | 6 +-
.../IgniteCacheStarvationOnRebalanceTest.java | 2 +-
.../IgniteCacheUpdateSqlQuerySelfTest.java | 8 +-
...ClientReconnectCacheQueriesFailoverTest.java | 10 +-
.../cache/IgniteCrossCachesJoinsQueryTest.java | 2 +-
.../cache/QueryEntityCaseMismatchTest.java | 2 +-
.../cache/SqlFieldsQuerySelfTest.java | 2 +-
...stributedPartitionQueryAbstractSelfTest.java | 5 +-
...niteCacheDistributedQueryCancelSelfTest.java | 6 +-
...butedQueryStopOnCancelOrTimeoutSelfTest.java | 6 +-
.../IgniteCachePartitionedQuerySelfTest.java | 2 +-
.../IgniteCacheQueryNoRebalanceSelfTest.java | 4 +-
.../near/IgniteCacheQueryNodeFailTest.java | 4 +-
.../IgniteCacheQueryNodeRestartSelfTest.java | 2 +-
.../IgniteCacheQueryNodeRestartSelfTest2.java | 7 +-
.../cache/index/AbstractSchemaSelfTest.java | 3 +
.../DynamicIndexAbstractConcurrentSelfTest.java | 5 +-
.../index/DynamicIndexAbstractSelfTest.java | 9 +-
...eCacheLocalQueryCancelOrTimeoutSelfTest.java | 6 +-
.../cache/ttl/CacheTtlAbstractSelfTest.java | 6 +-
.../query/IgniteQueryDedicatedPoolTest.java | 2 +-
.../query/IgniteSqlDistributedJoinSelfTest.java | 2 +-
.../query/IgniteSqlKeyValueFieldsTest.java | 392 ++++++++++++++++++
.../query/IgniteSqlSchemaIndexingTest.java | 2 +-
.../query/IgniteSqlSplitterSelfTest.java | 10 +-
.../h2/GridIndexingSpiAbstractSelfTest.java | 14 +-
.../query/h2/IgniteSqlQueryMinMaxTest.java | 4 +-
.../h2/database/InlineIndexHelperTest.java | 40 +-
.../query/h2/sql/GridQueryParsingTest.java | 9 +-
.../IgniteCacheQuerySelfTestSuite.java | 2 +
.../stream/jms11/IgniteJmsStreamerTest.java | 28 +-
...CacheJtaConfigurationValidationSelfTest.java | 2 +-
...CacheJtaFactoryConfigValidationSelfTest.java | 2 +-
...titionedCacheJtaLookupClassNameSelfTest.java | 2 +-
.../kafka/KafkaIgniteStreamerSelfTest.java | 8 +-
.../java/org/apache/ignite/ml/math/Tracer.java | 57 +--
.../matrix/SparseDistributedMatrixStorage.java | 3 -
.../stream/mqtt/IgniteMqttStreamerTest.java | 12 +-
modules/osgi/README.txt | 30 --
.../cpp/core-test/config/cache-identity-32.xml | 7 +-
.../cpp/core-test/config/cache-query-32.xml | 6 +-
.../config/cache-query-continuous-32.xml | 6 +-
.../config/cache-query-continuous-default.xml | 1 -
.../core-test/config/cache-query-default.xml | 6 +
.../cpp/core-test/config/cache-store-32.xml | 6 +-
.../cpp/core-test/config/cache-test-32.xml | 6 +-
.../cpp/core-test/src/cache_query_test.cpp | 82 ++++
.../cpp/odbc-test/config/queries-default.xml | 5 +
.../cpp/odbc-test/config/queries-test-32.xml | 6 +-
.../odbc-test/config/queries-test-noodbc-32.xml | 6 +-
.../cpp/odbc-test/include/complex_type.h | 25 ++
.../cpp/odbc-test/src/queries_test.cpp | 148 +++++++
.../Config/ignite-config.xml | 1 -
.../Binary/BinaryCompactFooterInteropTest.cs | 2 +-
.../Binary/BinaryDynamicRegistrationTest.cs | 18 +-
.../Binary/JavaBinaryInteropTest.cs | 6 +-
.../BinaryConfigurationTest.cs | 2 +-
.../Cache/Affinity/AffinityFieldTest.cs | 4 +-
.../Cache/Affinity/AffinityTest.cs | 4 +-
.../Cache/CacheConfigurationTest.cs | 24 +-
.../Cache/CacheForkedTest.cs | 2 +-
.../Cache/CacheMetricsTest.cs | 1 -
.../Cache/CacheNearTest.cs | 34 +-
.../Cache/Query/CacheLinqTest.cs | 30 +-
.../Cache/Query/CacheQueriesTest.cs | 52 +++
.../Compute/CancellationTest.cs | 4 +-
.../Compute/ComputeApiTest.cs | 30 +-
.../Config/Compute/compute-grid1.xml | 4 +-
.../Config/Compute/compute-grid2.xml | 1 -
.../Config/Compute/compute-standalone.xml | 4 +-
.../Config/Dynamic/dynamic-data.xml | 2 -
.../Config/cache-binarizables.xml | 4 +-
.../Config/cache-query-continuous.xml | 4 -
.../native-client-test-cache-affinity.xml | 1 +
.../Config/native-client-test-cache.xml | 9 -
.../Config/spring-test.xml | 14 +
.../Apache.Ignite.Core.Tests/EventsTest.cs | 13 +-
.../IgniteConfigurationSerializerTest.cs | 25 +-
.../IgniteConfigurationTest.cs | 40 +-
.../IgniteStartStopTest.cs | 2 +-
.../Apache.Ignite.Core.Tests/MarshallerTest.cs | 24 +-
.../Apache.Ignite.Core.Tests/TestUtils.cs | 4 +-
.../Cache/Configuration/CacheConfiguration.cs | 12 -
.../Cache/Configuration/DataPageEvictionMode.cs | 4 +-
.../Cache/Configuration/MemoryConfiguration.cs | 28 +-
.../Configuration/MemoryPolicyConfiguration.cs | 34 +-
.../Configuration/NearCacheConfiguration.cs | 2 +-
.../Cache/Configuration/QueryEntity.cs | 20 +
.../Apache.Ignite.Core/Cache/ICacheMetrics.cs | 8 -
.../Discovery/Tcp/TcpDiscoverySpi.cs | 28 --
.../dotnet/Apache.Ignite.Core/IIgnite.cs | 3 +-
.../Apache.Ignite.Core/IgniteConfiguration.cs | 21 +
.../IgniteConfigurationSection.xsd | 52 ++-
.../Impl/Cache/CacheMetricsImpl.cs | 7 -
.../Apache.Ignite.Core/Impl/Compute/Compute.cs | 12 +
.../Impl/Compute/ComputeImpl.cs | 2 +
.../dotnet/Apache.Ignite.Core/Impl/Ignite.cs | 14 +
.../Apache.Ignite.Core/Impl/NativeMethods.cs | 44 ++
.../Impl/CacheQueryExpressionVisitor.cs | 14 +-
.../Impl/CacheQueryModelVisitor.cs | 12 +-
.../http/jetty/GridJettyObjectMapper.java | 13 +-
modules/rocketmq/licenses/apache-2.0.txt | 202 +++++++++
.../stream/rocketmq/RocketMQStreamerTest.java | 8 +-
.../scala/org/apache/ignite/scalar/scalar.scala | 19 +-
.../scalar/src/test/resources/spring-cache.xml | 4 +-
.../scalar/tests/ScalarCacheQueriesSpec.scala | 2 +-
.../spark/JavaEmbeddedIgniteRDDSelfTest.java | 2 +-
.../spark/JavaStandaloneIgniteRDDSelfTest.java | 2 +-
.../spring/GridSpringCacheManagerSelfTest.java | 6 +-
.../jdbc/CacheJdbcBlobStoreFactorySelfTest.java | 2 +-
.../jdbc/CacheJdbcPojoStoreFactorySelfTest.java | 4 +-
.../internal/IgniteDynamicCacheConfigTest.java | 2 +-
.../java/org/apache/ignite/internal/cache.xml | 3 -
.../apache/ignite/internal/filtered-cache.xml | 3 -
.../apache/ignite/internal/invalid-cache.xml | 6 -
.../GridTransformSpringInjectionSelfTest.java | 2 +-
.../p2p/GridP2PUserVersionChangeSelfTest.java | 8 +-
.../IgniteStartFromStreamConfigurationTest.java | 4 +-
.../GridSpringTransactionManagerSelfTest.java | 2 +-
.../twitter/IgniteTwitterStreamerTest.java | 8 +-
.../visor/commands/ack/VisorAckCommand.scala | 5 +-
.../commands/cache/VisorCacheClearCommand.scala | 5 +-
.../commands/cache/VisorCacheCommand.scala | 1 -
.../commands/cache/VisorCacheResetCommand.scala | 4 +-
.../commands/cache/VisorCacheStopCommand.scala | 4 +-
.../config/VisorConfigurationCommand.scala | 2 +-
.../scala/org/apache/ignite/visor/visor.scala | 5 +-
.../cache/VisorCacheClearCommandSpec.scala | 24 +-
.../commands/cache/VisorCacheCommandSpec.scala | 2 +-
.../cache/VisorCacheResetCommandSpec.scala | 8 +-
.../web-console/backend/app/browsersHandler.js | 3 +-
modules/web-console/backend/app/mongo.js | 73 +++-
.../app/modules/agent/AgentManager.service.js | 3 +-
.../modules/configuration/Version.service.js | 2 +-
.../generator/ConfigurationGenerator.js | 11 +-
.../generator/PlatformGenerator.js | 7 +-
.../generator/defaults/Cache.service.js | 1 -
.../generator/defaults/Cluster.service.js | 4 +-
.../frontend/app/modules/demo/Demo.module.js | 4 +-
.../frontend/app/modules/sql/sql.controller.js | 2 +-
.../states/configuration/caches/memory.pug | 9 -
.../states/configuration/clusters/discovery.pug | 8 +-
.../demo/service/DemoCachesLoadService.java | 1 -
.../service/DemoRandomCacheLoadService.java | 1 -
.../webapp2/META-INF/ignite-webapp-config.xml | 12 -
.../config/ignite-base-load-config.xml | 31 ++
.../stream/zeromq/IgniteZeroMqStreamerTest.java | 12 +-
parent/pom.xml | 1 +
956 files changed, 11657 insertions(+), 5647 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/4787c8b9/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheJoinPartitionedAndReplicatedTest.java
----------------------------------------------------------------------
[46/67] [abbrv] ignite git commit: IGNITE-5134: Fixed
ClassCastException in IgniteCacheDatabaseSharedManager. This closes #1895.
Posted by sb...@apache.org.
IGNITE-5134: Fixed ClassCastException in IgniteCacheDatabaseSharedManager. This closes #1895.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/4c1dab4e
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/4c1dab4e
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/4c1dab4e
Branch: refs/heads/ignite-5075
Commit: 4c1dab4e6be1490887144cc2ff1042aa4d650363
Parents: e7826aa
Author: Ivan Rakov <iv...@gmail.com>
Authored: Wed May 3 11:24:01 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Wed May 3 11:24:01 2017 +0300
----------------------------------------------------------------------
.../IgniteCacheDatabaseSharedManager.java | 21 +++++++++++++-------
.../pagemem/impl/PageMemoryNoLoadSelfTest.java | 3 ++-
.../database/IgniteDbDynamicCacheSelfTest.java | 1 +
.../database/MetadataStorageSelfTest.java | 3 ++-
.../processors/igfs/IgfsSizeSelfTest.java | 2 +-
5 files changed, 20 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/4c1dab4e/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/IgniteCacheDatabaseSharedManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/IgniteCacheDatabaseSharedManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/IgniteCacheDatabaseSharedManager.java
index 5062d0f..7151b2f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/IgniteCacheDatabaseSharedManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/IgniteCacheDatabaseSharedManager.java
@@ -715,7 +715,8 @@ public class IgniteCacheDatabaseSharedManager extends GridCacheSharedManagerAdap
* @param memMetrics {@link MemoryMetrics} object to collect memory usage metrics.
* @return Memory policy instance.
*/
- private MemoryPolicy initMemory(MemoryConfiguration memCfg, MemoryPolicyConfiguration plcCfg, MemoryMetricsImpl memMetrics) {
+ private MemoryPolicy initMemory(MemoryConfiguration memCfg, MemoryPolicyConfiguration plcCfg,
+ MemoryMetricsImpl memMetrics) {
File allocPath = buildAllocPath(plcCfg);
DirectMemoryProvider memProvider = allocPath == null ?
@@ -726,23 +727,29 @@ public class IgniteCacheDatabaseSharedManager extends GridCacheSharedManagerAdap
PageMemory pageMem = createPageMemory(memProvider, memCfg, plcCfg, memMetrics);
- return new MemoryPolicy(pageMem, plcCfg, memMetrics, createPageEvictionTracker(plcCfg,
- (PageMemoryNoStoreImpl)pageMem));
+ return new MemoryPolicy(pageMem, plcCfg, memMetrics, createPageEvictionTracker(plcCfg, pageMem));
}
/**
* @param plc Memory Policy Configuration.
* @param pageMem Page memory.
*/
- private PageEvictionTracker createPageEvictionTracker(MemoryPolicyConfiguration plc, PageMemoryNoStoreImpl pageMem) {
+ private PageEvictionTracker createPageEvictionTracker(MemoryPolicyConfiguration plc, PageMemory pageMem) {
+ if (plc.getPageEvictionMode() == DataPageEvictionMode.DISABLED)
+ return new NoOpPageEvictionTracker();
+
+ assert pageMem instanceof PageMemoryNoStoreImpl : pageMem.getClass();
+
+ PageMemoryNoStoreImpl pageMem0 = (PageMemoryNoStoreImpl)pageMem;
+
if (Boolean.getBoolean("override.fair.fifo.page.eviction.tracker"))
- return new FairFifoPageEvictionTracker(pageMem, plc, cctx);
+ return new FairFifoPageEvictionTracker(pageMem0, plc, cctx);
switch (plc.getPageEvictionMode()) {
case RANDOM_LRU:
- return new RandomLruPageEvictionTracker(pageMem, plc, cctx);
+ return new RandomLruPageEvictionTracker(pageMem0, plc, cctx);
case RANDOM_2_LRU:
- return new Random2LruPageEvictionTracker(pageMem, plc, cctx);
+ return new Random2LruPageEvictionTracker(pageMem0, plc, cctx);
default:
return new NoOpPageEvictionTracker();
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/4c1dab4e/modules/core/src/test/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoLoadSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoLoadSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoLoadSelfTest.java
index 84db565..0a283ed 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoLoadSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoLoadSelfTest.java
@@ -280,7 +280,8 @@ public class PageMemoryNoLoadSelfTest extends GridCommonAbstractTest {
protected PageMemory memory() throws Exception {
File memDir = U.resolveWorkDirectory(U.defaultWorkDirectory(), "pagemem", false);
- MemoryPolicyConfiguration plcCfg = new MemoryPolicyConfiguration().setMaxSize(10 * 1024 * 1024);
+ MemoryPolicyConfiguration plcCfg = new MemoryPolicyConfiguration()
+ .setInitialSize(10 * 1024 * 1024).setMaxSize(10 * 1024 * 1024);
DirectMemoryProvider provider = new MappedFileMemoryProvider(log(), memDir);
http://git-wip-us.apache.org/repos/asf/ignite/blob/4c1dab4e/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbDynamicCacheSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbDynamicCacheSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbDynamicCacheSelfTest.java
index 3b3e1de..8655ba9 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbDynamicCacheSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbDynamicCacheSelfTest.java
@@ -44,6 +44,7 @@ public class IgniteDbDynamicCacheSelfTest extends GridCommonAbstractTest {
MemoryPolicyConfiguration plc = new MemoryPolicyConfiguration();
plc.setName("dfltPlc");
+ plc.setInitialSize(200 * 1024 * 1024);
plc.setMaxSize(200 * 1024 * 1024);
dbCfg.setDefaultMemoryPolicyName("dfltPlc");
http://git-wip-us.apache.org/repos/asf/ignite/blob/4c1dab4e/modules/core/src/test/java/org/apache/ignite/internal/processors/database/MetadataStorageSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/MetadataStorageSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/MetadataStorageSelfTest.java
index af0b849..b98f429 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/MetadataStorageSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/MetadataStorageSelfTest.java
@@ -157,7 +157,8 @@ public class MetadataStorageSelfTest extends GridCommonAbstractTest {
protected PageMemory memory(boolean clean) throws Exception {
DirectMemoryProvider provider = new MappedFileMemoryProvider(log(), allocationPath);
- MemoryPolicyConfiguration plcCfg = new MemoryPolicyConfiguration().setMaxSize(30 * 1024 * 1024);
+ MemoryPolicyConfiguration plcCfg = new MemoryPolicyConfiguration()
+ .setMaxSize(30 * 1024 * 1024).setInitialSize(30 * 1024 * 1024);
return new PageMemoryNoStoreImpl(
log,
http://git-wip-us.apache.org/repos/asf/ignite/blob/4c1dab4e/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsSizeSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsSizeSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsSizeSelfTest.java
index 456971a..597efe1 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsSizeSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsSizeSelfTest.java
@@ -397,7 +397,7 @@ public class IgfsSizeSelfTest extends IgfsCommonAbstractTest {
String memPlcName = "igfsDataMemPlc";
cfg.setMemoryConfiguration(new MemoryConfiguration().setMemoryPolicies(
- new MemoryPolicyConfiguration().setMaxSize(maxSize).setName(memPlcName)));
+ new MemoryPolicyConfiguration().setMaxSize(maxSize).setInitialSize(maxSize).setName(memPlcName)));
FileSystemConfiguration igfsCfg = cfg.getFileSystemConfiguration()[0];