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/04/20 07:48:34 UTC

[01/70] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math module to Ignite ML module added missed licenses renamed packages fixed wrong ml profile activation

Repository: ignite
Updated Branches:
  refs/heads/ignite-2893 63724350c -> 89bfbad19


http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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);
+    }
+
+}


[65/70] [abbrv] ignite git commit: ignite-1561 Fixed tx prepare for cross cache tx with near + colocated cache

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/TransformCollectionView.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/TransformCollectionView.java b/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/TransformCollectionView.java
index 2c317df..10e9ec5 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/TransformCollectionView.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/TransformCollectionView.java
@@ -21,7 +21,6 @@ import java.util.Collection;
 import java.util.Iterator;
 import org.apache.ignite.internal.util.GridSerializableCollection;
 import org.apache.ignite.internal.util.typedef.F;
-import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.lang.IgniteClosure;
 import org.apache.ignite.lang.IgnitePredicate;
 import org.jetbrains.annotations.NotNull;
@@ -50,6 +49,7 @@ public class TransformCollectionView<T1, T2> extends GridSerializableCollection<
      * @param clos Transformation closure.
      * @param preds Optional predicated. If predicates are not provided - all elements will be in the view.
      */
+    @SafeVarargs
     public TransformCollectionView(Collection<? extends T2> col,
         IgniteClosure<? super T2, T1> clos, IgnitePredicate<? super T2>... preds) {
         this.col = col;
@@ -71,9 +71,4 @@ public class TransformCollectionView<T1, T2> extends GridSerializableCollection<
     @Override public boolean isEmpty() {
         return F.isEmpty(preds) ? col.isEmpty() : !iterator().hasNext();
     }
-
-    /** {@inheritDoc} */
-    @Override public String toString() {
-        return S.toString(TransformCollectionView.class, this);
-    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/TransformMapView.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/TransformMapView.java b/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/TransformMapView.java
index 91b8302..a089f67 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/TransformMapView.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/TransformMapView.java
@@ -24,7 +24,6 @@ import org.apache.ignite.internal.util.GridSerializableMap;
 import org.apache.ignite.internal.util.GridSerializableSet;
 import org.apache.ignite.internal.util.lang.GridFunc;
 import org.apache.ignite.internal.util.typedef.F;
-import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.lang.IgniteClosure;
 import org.apache.ignite.lang.IgnitePredicate;
 import org.jetbrains.annotations.NotNull;
@@ -160,9 +159,4 @@ public class TransformMapView<K, V1, V> extends GridSerializableMap<K, V1> {
     @Override public boolean containsKey(Object key) {
         return GridFunc.isAll((K)key, preds) && map.containsKey(key);
     }
-
-    /** {@inheritDoc} */
-    @Override public String toString() {
-        return S.toString(TransformMapView.class, this);
-    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CrossCacheTxNearEnabledRandomOperationsTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CrossCacheTxNearEnabledRandomOperationsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CrossCacheTxNearEnabledRandomOperationsTest.java
new file mode 100644
index 0000000..73985a0
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CrossCacheTxNearEnabledRandomOperationsTest.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.internal.processors.cache;
+
+/**
+ *
+ */
+public class CrossCacheTxNearEnabledRandomOperationsTest extends CrossCacheTxRandomOperationsTest {
+    /** {@inheritDoc} */
+    @Override protected boolean nearCacheEnabled() {
+        return true;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CrossCacheTxRandomOperationsTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CrossCacheTxRandomOperationsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CrossCacheTxRandomOperationsTest.java
index 1194a27..abd126c 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CrossCacheTxRandomOperationsTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CrossCacheTxRandomOperationsTest.java
@@ -33,6 +33,7 @@ import org.apache.ignite.cache.CacheWriteSynchronizationMode;
 import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.configuration.NearCacheConfiguration;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
@@ -106,6 +107,13 @@ public class CrossCacheTxRandomOperationsTest extends GridCommonAbstractTest {
     }
 
     /**
+     * @return Test near cache flag.
+     */
+    protected boolean nearCacheEnabled() {
+        return false;
+    }
+
+    /**
      * @throws Exception If failed.
      */
     public void testTxOperations() throws Exception {
@@ -144,11 +152,13 @@ public class CrossCacheTxRandomOperationsTest extends GridCommonAbstractTest {
      * @param name Cache name.
      * @param cacheMode Cache mode.
      * @param writeSync Write synchronization mode.
+     * @param nearCache Near cache flag.
      * @return Cache configuration.
      */
     protected CacheConfiguration cacheConfiguration(String name,
         CacheMode cacheMode,
-        CacheWriteSynchronizationMode writeSync) {
+        CacheWriteSynchronizationMode writeSync,
+        boolean nearCache) {
         CacheConfiguration ccfg = new CacheConfiguration();
 
         ccfg.setName(name);
@@ -161,20 +171,25 @@ public class CrossCacheTxRandomOperationsTest extends GridCommonAbstractTest {
 
         ccfg.setAffinity(new RendezvousAffinityFunction());
 
+        if (nearCache)
+            ccfg.setNearConfiguration(new NearCacheConfiguration());
+
         return ccfg;
     }
 
     /**
      * @param cacheMode Cache mode.
      * @param writeSync Write synchronization mode.
+     * @param nearCache Near cache flag.
      * @param ignite Node to use.
      * @param name Cache name.
      */
     protected void createCache(CacheMode cacheMode,
         CacheWriteSynchronizationMode writeSync,
+        boolean nearCache,
         Ignite ignite,
         String name) {
-        ignite.createCache(cacheConfiguration(name, cacheMode, writeSync));
+        ignite.createCache(cacheConfiguration(name, cacheMode, writeSync, nearCache));
     }
 
     /**
@@ -189,8 +204,8 @@ public class CrossCacheTxRandomOperationsTest extends GridCommonAbstractTest {
         Ignite ignite = ignite(0);
 
         try {
-            createCache(cacheMode, writeSync, ignite, CACHE1);
-            createCache(cacheMode, writeSync, ignite, CACHE2);
+            createCache(cacheMode, writeSync, nearCacheEnabled(), ignite, CACHE1);
+            createCache(cacheMode, writeSync, false, ignite, CACHE2);
 
             txOperations(PESSIMISTIC, REPEATABLE_READ, crossCacheTx, false);
             txOperations(PESSIMISTIC, REPEATABLE_READ, crossCacheTx, true);

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridNearCacheTxNodeFailureSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridNearCacheTxNodeFailureSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridNearCacheTxNodeFailureSelfTest.java
deleted file mode 100644
index 2e29e3d..0000000
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridNearCacheTxNodeFailureSelfTest.java
+++ /dev/null
@@ -1,31 +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.internal.processors.cache.distributed.dht;
-
-import org.apache.ignite.configuration.CacheConfiguration;
-import org.apache.ignite.configuration.NearCacheConfiguration;
-
-/**
- *
- */
-public class GridNearCacheTxNodeFailureSelfTest extends GridCacheTxNodeFailureSelfTest {
-    /** {@inheritDoc} */
-    @Override protected CacheConfiguration cacheConfiguration(String igniteInstanceName) {
-        return super.cacheConfiguration(igniteInstanceName).setNearConfiguration(new NearCacheConfiguration());
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCrossCacheTxSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCrossCacheTxSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCrossCacheTxSelfTest.java
index bfbafdb..d9529da 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCrossCacheTxSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCrossCacheTxSelfTest.java
@@ -40,6 +40,7 @@ import static org.apache.ignite.transactions.TransactionConcurrency.OPTIMISTIC;
 import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC;
 import static org.apache.ignite.transactions.TransactionIsolation.READ_COMMITTED;
 import static org.apache.ignite.transactions.TransactionIsolation.REPEATABLE_READ;
+import static org.apache.ignite.transactions.TransactionIsolation.SERIALIZABLE;
 
 /**
  * Tests specific combinations of cross-cache transactions.
@@ -137,6 +138,13 @@ public class IgniteCrossCacheTxSelfTest extends GridCommonAbstractTest {
     }
 
     /**
+     * @throws Exception If failed.
+     */
+    public void testOptimisticSerializable() throws Exception {
+        checkTxsSingleOp(OPTIMISTIC, SERIALIZABLE);
+    }
+
+    /**
      * @param concurrency Concurrency.
      * @param isolation Isolation.
      * @throws Exception If failed.

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFailoverTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFailoverTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFailoverTestSuite.java
index 046e6b5..34eb295 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFailoverTestSuite.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFailoverTestSuite.java
@@ -29,7 +29,6 @@ import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtA
 import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtClientRemoveFailureTest;
 import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtRemoveFailureTest;
 import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheTxNodeFailureSelfTest;
-import org.apache.ignite.internal.processors.cache.distributed.dht.GridNearCacheTxNodeFailureSelfTest;
 import org.apache.ignite.internal.processors.cache.distributed.dht.IgniteAtomicLongChangingTopologySelfTest;
 import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.AtomicPutAllChangingTopologyTest;
 import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridCacheAtomicClientInvalidPartitionHandlingSelfTest;
@@ -88,7 +87,6 @@ public class IgniteCacheFailoverTestSuite extends TestSuite {
         suite.addTestSuite(IgniteAtomicLongChangingTopologySelfTest.class);
 
         suite.addTestSuite(GridCacheTxNodeFailureSelfTest.class);
-        suite.addTestSuite(GridNearCacheTxNodeFailureSelfTest.class);
 
         suite.addTestSuite(AtomicPutAllChangingTopologyTest.class);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite2.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite2.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite2.java
index e9cf028..62e6b78 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite2.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite2.java
@@ -29,6 +29,7 @@ import org.apache.ignite.internal.processors.cache.CacheEnumOperationsSingleNode
 import org.apache.ignite.internal.processors.cache.CacheEnumOperationsTest;
 import org.apache.ignite.internal.processors.cache.CacheExchangeMessageDuplicatedStateTest;
 import org.apache.ignite.internal.processors.cache.CacheMemoryPolicyConfigurationTest;
+import org.apache.ignite.internal.processors.cache.CrossCacheTxNearEnabledRandomOperationsTest;
 import org.apache.ignite.internal.processors.cache.CrossCacheTxRandomOperationsTest;
 import org.apache.ignite.internal.processors.cache.GridCacheAtomicMessageCountSelfTest;
 import org.apache.ignite.internal.processors.cache.GridCacheFinishPartitionsSelfTest;
@@ -242,6 +243,7 @@ public class IgniteCacheTestSuite2 extends TestSuite {
         suite.addTest(new TestSuite(IgniteAtomicCacheEntryProcessorNodeJoinTest.class));
         suite.addTest(new TestSuite(GridCacheNearTxForceKeyTest.class));
         suite.addTest(new TestSuite(CrossCacheTxRandomOperationsTest.class));
+        suite.addTest(new TestSuite(CrossCacheTxNearEnabledRandomOperationsTest.class));
         suite.addTest(new TestSuite(IgniteDynamicCacheAndNodeStop.class));
         suite.addTest(new TestSuite(CacheLockReleaseNodeLeaveTest.class));
         suite.addTest(new TestSuite(NearCacheSyncUpdateTest.class));


[05/70] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math module to Ignite ML module added missed licenses renamed packages fixed wrong ml profile activation

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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;
+        }
+    }
+}


[42/70] [abbrv] ignite git commit: IGNITE-3523 IGFS: Remove "initialize default path modes" feature. This closes #1786.

Posted by sb...@apache.org.
IGNITE-3523 IGFS: Remove "initialize default path modes" feature. This closes #1786.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/22d5e55b
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/22d5e55b
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/22d5e55b

Branch: refs/heads/ignite-2893
Commit: 22d5e55bee69403c4f9f8da9c113751ce110aa2d
Parents: 36e7e19
Author: tledkov-gridgain <tl...@gridgain.com>
Authored: Wed Apr 19 12:54:14 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Wed Apr 19 12:54:14 2017 +0300

----------------------------------------------------------------------
 .../configuration/FileSystemConfiguration.java  |  54 +-------
 .../internal/processors/igfs/IgfsImpl.java      |  22 +---
 .../igfs/IgfsAbstractBaseSelfTest.java          |   9 --
 .../igfs/IgfsDualAbstractSelfTest.java          |  33 -----
 .../processors/igfs/IgfsModesSelfTest.java      | 130 -------------------
 .../igfs/HadoopFIleSystemFactorySelfTest.java   |  12 +-
 6 files changed, 14 insertions(+), 246 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/22d5e55b/modules/core/src/main/java/org/apache/ignite/configuration/FileSystemConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/FileSystemConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/FileSystemConfiguration.java
index 337506c..d667fe8 100644
--- a/modules/core/src/main/java/org/apache/ignite/configuration/FileSystemConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/configuration/FileSystemConfiguration.java
@@ -76,9 +76,6 @@ public class FileSystemConfiguration {
     /** Default IPC endpoint enabled flag. */
     public static final boolean DFLT_IPC_ENDPOINT_ENABLED = true;
 
-    /** Default value of whether to initialize default path modes. */
-    public static final boolean DFLT_INIT_DFLT_PATH_MODES = false;
-
     /** Default value of metadata co-location flag. */
     public static final boolean DFLT_COLOCATE_META = true;
 
@@ -145,9 +142,6 @@ public class FileSystemConfiguration {
     /** Maximum range length. */
     private long maxTaskRangeLen;
 
-    /** Whether to initialize default path modes. */
-    private boolean initDfltPathModes = DFLT_INIT_DFLT_PATH_MODES;
-
     /** Metadata co-location flag. */
     private boolean colocateMeta = DFLT_COLOCATE_META;
 
@@ -191,7 +185,6 @@ public class FileSystemConfiguration {
         fragmentizerThrottlingBlockLen = cfg.getFragmentizerThrottlingBlockLength();
         fragmentizerThrottlingDelay = cfg.getFragmentizerThrottlingDelay();
         secondaryFs = cfg.getSecondaryFileSystem();
-        initDfltPathModes = cfg.isInitializeDefaultPathModes();
         ipcEndpointCfg = cfg.getIpcEndpointConfiguration();
         ipcEndpointEnabled = cfg.isIpcEndpointEnabled();
         maxSpace = cfg.getMaxSpaceSize();
@@ -579,15 +572,6 @@ public class FileSystemConfiguration {
      * <p>
      * If path doesn't correspond to any specified prefix or mappings are not provided, then
      * {@link #getDefaultMode()} is used.
-     * <p>
-     * If {@link #isInitializeDefaultPathModes()} is set to {@code true}, the following path modes will be created
-     * by default:
-     * <li>{@code /ignite/primary} and all it's sub-folders will always work in {@code PRIMARY} mode.</li>
-     * <p>
-     * And in case secondary file system URI is provided:
-     * <li>{@code /ignite/proxy} and all it's sub-folders will always work in {@code PROXY} mode.</li>
-     * <li>{@code /ignite/sync} and all it's sub-folders will always work in {@code DUAL_SYNC} mode.</li>
-     * <li>{@code /ignite/async} and all it's sub-folders will always work in {@code DUAL_ASYNC} mode.</li>
      *
      * @return Map of paths to {@code IGFS} modes.
      */
@@ -644,6 +628,7 @@ public class FileSystemConfiguration {
      * Sets delay in milliseconds for which fragmentizer is paused.
      *
      * @param fragmentizerThrottlingDelay Delay in milliseconds.
+     * @return {@code this} for chaining.
      */
     public FileSystemConfiguration setFragmentizerThrottlingDelay(long fragmentizerThrottlingDelay) {
         this.fragmentizerThrottlingDelay = fragmentizerThrottlingDelay;
@@ -759,43 +744,6 @@ public class FileSystemConfiguration {
     }
 
     /**
-     * Get whether to initialize default path modes.
-     * <p>
-     * When set to {@code true} Ignite will automatically create the following path modes:
-     * <ul>
-     *     <li>{@code /ignite/primary} - will work in {@link IgfsMode#PRIMARY} mode;</li>
-     *     <li>{@code /ignite/sync} - will work in {@link IgfsMode#DUAL_SYNC} mode (only if secondary file system
-     *         is set);</li>
-     *     <li>{@code /ignite/async} - will work in {@link IgfsMode#DUAL_ASYNC} mode (only if secondary file system
-     *         is set);</li>
-     *     <li>{@code /ignite/proxy} - will work in {@link IgfsMode#PROXY} mode (only if secondary file system
-     *         is set).</li>
-     * </ul>
-     * See {@link #getPathModes()} for more information about path modes.
-     * <p>
-     * Defaults to {@link #DFLT_INIT_DFLT_PATH_MODES}.
-     *
-     * @return {@code True} if default path modes will be initialized.
-     */
-    public boolean isInitializeDefaultPathModes() {
-        return initDfltPathModes;
-    }
-
-    /**
-     * Set whether to initialize default path modes.
-     * <p>
-     * See {@link #isInitializeDefaultPathModes()} for more information.
-     *
-     * @param initDfltPathModes Whether to initialize default path modes.
-     * @return {@code this} for chaining.
-     */
-    public FileSystemConfiguration setInitializeDefaultPathModes(boolean initDfltPathModes) {
-        this.initDfltPathModes = initDfltPathModes;
-
-        return this;
-    }
-
-    /**
      * Get whether to co-locate metadata on a single node.
      * <p>
      * Normally Ignite spread ownership of particular keys among all cache nodes. Transaction with keys owned by

http://git-wip-us.apache.org/repos/asf/ignite/blob/22d5e55b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsImpl.java
index 1c0fbc2..6a7400c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsImpl.java
@@ -199,28 +199,10 @@ public final class IgfsImpl implements IgfsEx {
             dfltMode = cfg.getDefaultMode();
 
         Map<String, IgfsMode> cfgModes = new LinkedHashMap<>();
-        Map<String, IgfsMode> dfltModes = new LinkedHashMap<>(4, 1.0f);
-
-        if (cfg.isInitializeDefaultPathModes() && IgfsUtils.isDualMode(dfltMode)) {
-            dfltModes.put("/ignite/primary", PRIMARY);
-
-            if (secondaryFs != null) {
-                dfltModes.put("/ignite/proxy", PROXY);
-                dfltModes.put("/ignite/sync", DUAL_SYNC);
-                dfltModes.put("/ignite/async", DUAL_ASYNC);
-            }
-        }
-
-        cfgModes.putAll(dfltModes);
 
         if (cfg.getPathModes() != null) {
-            for (Map.Entry<String, IgfsMode> e : cfg.getPathModes().entrySet()) {
-                if (!dfltModes.containsKey(e.getKey()))
-                    cfgModes.put(e.getKey(), e.getValue());
-                else
-                    U.warn(log, "Ignoring path mode because it conflicts with Ignite reserved path " +
-                        "(use another path) [mode=" + e.getValue() + ", path=" + e.getKey() + ']');
-            }
+            for (Map.Entry<String, IgfsMode> e : cfg.getPathModes().entrySet())
+                cfgModes.put(e.getKey(), e.getValue());
         }
 
         ArrayList<T2<IgfsPath, IgfsMode>> modes = null;

http://git-wip-us.apache.org/repos/asf/ignite/blob/22d5e55b/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsAbstractBaseSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsAbstractBaseSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsAbstractBaseSelfTest.java
index 47a768e..d215815 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsAbstractBaseSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsAbstractBaseSelfTest.java
@@ -211,13 +211,6 @@ public abstract class IgfsAbstractBaseSelfTest extends IgfsCommonAbstractTest {
     }
 
     /**
-     * @return Relaxed consistency flag.
-     */
-    protected boolean initializeDefaultPathModes() {
-        return false;
-    }
-
-    /**
      * @return Client flag.
      */
     protected boolean client() {
@@ -369,8 +362,6 @@ public abstract class IgfsAbstractBaseSelfTest extends IgfsCommonAbstractTest {
         igfsCfg.setRelaxedConsistency(relaxedConsistency());
         igfsCfg.setFragmentizerEnabled(fragmentizerEnabled());
 
-        igfsCfg.setInitializeDefaultPathModes(initializeDefaultPathModes());
-
         CacheConfiguration dataCacheCfg = defaultCacheConfiguration();
 
         dataCacheCfg.setNearConfiguration(null);

http://git-wip-us.apache.org/repos/asf/ignite/blob/22d5e55b/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsDualAbstractSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsDualAbstractSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsDualAbstractSelfTest.java
index 7b83cfc..12f46da 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsDualAbstractSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsDualAbstractSelfTest.java
@@ -51,39 +51,6 @@ public abstract class IgfsDualAbstractSelfTest extends IgfsAbstractSelfTest {
         super(mode);
     }
 
-    /** {@inheritDoc} */
-    @Override protected boolean initializeDefaultPathModes() {
-        // Enable default modes in order to test various modes.
-        return true;
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    public void testDefaultDirectories() throws Exception {
-        IgfsPath gg = new IgfsPath("/ignite");
-        IgfsPath[] paths = paths(
-            gg, new IgfsPath(gg, "sync"), new IgfsPath(gg, "async"), new IgfsPath(gg, "primary"));
-
-        create(igfs, paths, null);
-
-        for (IgfsPath p : paths)
-            assert igfs.exists(p);
-
-        assert igfs.modeResolver().resolveMode(gg) == mode;
-
-        if (mode != PROXY) {
-            assert igfs.modeResolver().resolveMode(new IgfsPath(gg, "sync")) == IgfsMode.DUAL_SYNC;
-            assert igfs.modeResolver().resolveMode(new IgfsPath(gg, "async")) == IgfsMode.DUAL_ASYNC;
-            assert igfs.modeResolver().resolveMode(new IgfsPath(gg, "primary")) == IgfsMode.PRIMARY;
-            assert !igfsSecondary.exists("/ignite/primary"); // PRIMARY mode path must exist in upper level fs only.
-        }
-
-        // All the child paths of "/ignite/" must be visible in listings:
-        assert igfs.listFiles(gg).size() == 3;
-        assert igfs.listPaths(gg).size() == 3;
-    }
-
     /**
      * Test existence check when the path exists only remotely.
      *

http://git-wip-us.apache.org/repos/asf/ignite/blob/22d5e55b/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsModesSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsModesSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsModesSelfTest.java
index 40ac0e1..0720d55 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsModesSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsModesSelfTest.java
@@ -100,7 +100,6 @@ public class IgfsModesSelfTest extends IgfsCommonAbstractTest {
 
         igfsCfg.setName("igfs");
         igfsCfg.setBlockSize(512 * 1024);
-        igfsCfg.setInitializeDefaultPathModes(true);
 
         if (setNullMode)
             igfsCfg.setDefaultMode(null);
@@ -217,135 +216,6 @@ public class IgfsModesSelfTest extends IgfsCommonAbstractTest {
     }
 
     /**
-     * Test predefined path modes for PRIMARY mode.
-     *
-     * @throws Exception If failed.
-     */
-    public void testDefaultFoldersPrimary() throws Exception {
-        setSecondaryFs = true;
-
-        mode = DUAL_ASYNC;
-
-        startUp();
-
-        checkMode("/ignite/primary", PRIMARY);
-        checkMode("/ignite/primary/", PRIMARY);
-        checkMode("/ignite/primary/subfolder", PRIMARY);
-        checkMode("/ignite/primary/folder/file.txt", PRIMARY);
-        checkMode("/ignite/primaryx", DUAL_ASYNC);
-        checkMode("/ignite/primaryx/", DUAL_ASYNC);
-        checkMode("/ignite/primaryx/subfolder", DUAL_ASYNC);
-        checkMode("/ignite/primaryx/folder/file.txt", DUAL_ASYNC);
-    }
-
-    /**
-     * Test predefined path modes for all modes except of PRIMARY mode.
-     *
-     * @throws Exception If failed.
-     */
-    public void testDefaultFoldersNonPrimary() throws Exception {
-        setSecondaryFs = true;
-
-        mode = DUAL_ASYNC;
-
-        startUp();
-
-        checkMode("/ignite/proxy", PROXY);
-        checkMode("/ignite/proxy/", PROXY);
-        checkMode("/ignite/proxy/subfolder", PROXY);
-        checkMode("/ignite/proxy/folder/file.txt", PROXY);
-        checkMode("/ignite/proxyx", mode);
-        checkMode("/ignite/proxyx/", mode);
-        checkMode("/ignite/proxyx/subfolder", mode);
-        checkMode("/ignite/proxyx/folder/file.txt", mode);
-
-        checkMode("/userdir/ignite/proxy", mode);
-        checkMode("/userdir/ignite/proxy/", mode);
-        checkMode("/userdir/ignite/proxy/subfolder", mode);
-        checkMode("/userdir/ignite/proxy/folder/file.txt", mode);
-
-        checkMode("/ignite/sync", DUAL_SYNC);
-        checkMode("/ignite/sync/", DUAL_SYNC);
-        checkMode("/ignite/sync/subfolder", DUAL_SYNC);
-        checkMode("/ignite/sync/folder/file.txt", DUAL_SYNC);
-
-        checkMode("/ignite/syncx", mode);
-        checkMode("/ignite/syncx/", mode);
-        checkMode("/ignite/syncx/subfolder", mode);
-        checkMode("/ignite/syncx/folder/file.txt", mode);
-
-        checkMode("/userdir/ignite/sync", mode);
-        checkMode("/userdir/ignite/sync/", mode);
-        checkMode("/userdir/ignite/sync/subfolder", mode);
-        checkMode("/userdir/ignite/sync/folder/file.txt", mode);
-
-        checkMode("/ignite/async", DUAL_ASYNC);
-        checkMode("/ignite/async/", DUAL_ASYNC);
-        checkMode("/ignite/async/subfolder", DUAL_ASYNC);
-        checkMode("/ignite/async/folder/file.txt", DUAL_ASYNC);
-
-        checkMode("/ignite/asyncx", mode);
-        checkMode("/ignite/asyncx/", mode);
-        checkMode("/ignite/asyncx/subfolder", mode);
-        checkMode("/ignite/asyncx/folder/file.txt", mode);
-
-        checkMode("/userdir/ignite/async", mode);
-        checkMode("/userdir/ignite/async/", mode);
-        checkMode("/userdir/ignite/async/subfolder", mode);
-        checkMode("/userdir/ignite/async/folder/file.txt", mode);
-    }
-
-    /**
-     * Ensure that in case secondary file system URI is not provided, all predefined have no special mappings. This test
-     * doesn't make sense for PRIMARY mode since in case URI is not provided DUAL_* modes automatically transforms to
-     * PRIMARY and for PROXY mode we will have an exception during startup.
-     *
-     * @throws Exception If failed.
-     */
-    public void testDefaultsNoSecondaryUriNonPrimary() throws Exception {
-        startUp();
-
-        checkMode("/ignite/proxy", PRIMARY);
-        checkMode("/ignite/proxy/", PRIMARY);
-        checkMode("/ignite/proxy/subfolder", PRIMARY);
-        checkMode("/ignite/proxy/folder/file.txt", PRIMARY);
-
-        checkMode("/ignite/sync", PRIMARY);
-        checkMode("/ignite/sync/", PRIMARY);
-        checkMode("/ignite/sync/subfolder", PRIMARY);
-        checkMode("/ignite/sync/folder/file.txt", PRIMARY);
-
-        checkMode("/ignite/async", PRIMARY);
-        checkMode("/ignite/async/", PRIMARY);
-        checkMode("/ignite/async/subfolder", PRIMARY);
-        checkMode("/ignite/async/folder/file.txt", PRIMARY);
-    }
-
-    /**
-     * Ensure that it is impossible to override mappings for /ignite/* folders.
-     *
-     * @throws Exception If failed.
-     */
-    public void testDefaultFoldersOverride() throws Exception {
-        setSecondaryFs = true;
-
-        mode = DUAL_ASYNC;
-
-        pathModes(
-            F.t("/ignite/primary", PROXY),
-            F.t("/ignite/proxy", DUAL_SYNC),
-            F.t("/ignite/sync", DUAL_ASYNC),
-            F.t("/ignite/async", PRIMARY));
-
-        startUp();
-
-        checkMode("/ignite/primary", PRIMARY);
-        checkMode("/ignite/proxy", PROXY);
-        checkMode("/ignite/sync", DUAL_SYNC);
-        checkMode("/ignite/async", DUAL_ASYNC);
-    }
-
-    /**
      * Ensure that DUAL_ASYNC mode is set by default.
      *
      * @throws Exception If failed.

http://git-wip-us.apache.org/repos/asf/ignite/blob/22d5e55b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/igfs/HadoopFIleSystemFactorySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/igfs/HadoopFIleSystemFactorySelfTest.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/igfs/HadoopFIleSystemFactorySelfTest.java
index 1793a05..04ef263 100644
--- a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/igfs/HadoopFIleSystemFactorySelfTest.java
+++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/igfs/HadoopFIleSystemFactorySelfTest.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.internal.processors.hadoop.impl.igfs;
 
+import java.util.HashMap;
+import java.util.Map;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
@@ -224,7 +226,6 @@ public class HadoopFIleSystemFactorySelfTest extends IgfsCommonAbstractTest {
         igfsCfg.setDefaultMode(dfltMode);
         igfsCfg.setIpcEndpointConfiguration(endpointCfg);
         igfsCfg.setSecondaryFileSystem(secondaryFs);
-        igfsCfg.setInitializeDefaultPathModes(true);
 
         CacheConfiguration dataCacheCfg = defaultCacheConfiguration();
 
@@ -243,6 +244,15 @@ public class HadoopFIleSystemFactorySelfTest extends IgfsCommonAbstractTest {
         igfsCfg.setDataCacheConfiguration(dataCacheCfg);
         igfsCfg.setMetaCacheConfiguration(metaCacheCfg);
 
+        if (secondaryFs != null) {
+            Map<String, IgfsMode> modes = new HashMap<>();
+            modes.put("/ignite/sync/", IgfsMode.DUAL_SYNC);
+            modes.put("/ignite/async/", IgfsMode.DUAL_ASYNC);
+            modes.put("/ignite/proxy/", IgfsMode.PROXY);
+
+            igfsCfg.setPathModes(modes);
+        }
+
         IgniteConfiguration cfg = new IgniteConfiguration();
 
         cfg.setIgniteInstanceName(name);


[04/70] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math module to Ignite ML module added missed licenses renamed packages fixed wrong ml profile activation

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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);
+    }
+}


[47/70] [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/fb1dea79
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/fb1dea79
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/fb1dea79

Branch: refs/heads/ignite-2893
Commit: fb1dea79e6bbdadd5152818276d71b77c5f18942
Parents: 15359bc
Author: Andrey V. Mashenkov <an...@gmail.com>
Authored: Wed Apr 19 06:45:08 2017 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Wed Apr 19 14:03:21 2017 +0300

----------------------------------------------------------------------
 .../repository/support/IgniteRepositoryFactory.java          | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/fb1dea79/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+\\.)?+\\*.*");
     }
 }
 


[22/70] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math module to Ignite ML module added missed licenses renamed packages fixed wrong ml profile activation

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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


[51/70] [abbrv] ignite git commit: IGNITE-5028 .NET: Remove default-dotnet.xml

Posted by sb...@apache.org.
IGNITE-5028 .NET: Remove default-dotnet.xml


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/52bb84db
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/52bb84db
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/52bb84db

Branch: refs/heads/ignite-2893
Commit: 52bb84dba83916ea0b22b793f4359f82e8ee4573
Parents: d76a729
Author: Pavel Tupitsyn <pt...@apache.org>
Authored: Wed Apr 19 15:07:41 2017 +0300
Committer: Pavel Tupitsyn <pt...@apache.org>
Committed: Wed Apr 19 15:07:41 2017 +0300

----------------------------------------------------------------------
 assembly/release-fabric-base.xml |  5 ----
 config/dotnet/default-dotnet.xml | 45 -----------------------------------
 2 files changed, 50 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/52bb84db/assembly/release-fabric-base.xml
----------------------------------------------------------------------
diff --git a/assembly/release-fabric-base.xml b/assembly/release-fabric-base.xml
index b374ab4..5007785 100644
--- a/assembly/release-fabric-base.xml
+++ b/assembly/release-fabric-base.xml
@@ -59,11 +59,6 @@
             <destName>NOTICE</destName>
             <outputDirectory>/</outputDirectory>
         </file>
-
-        <file>
-            <source>config/dotnet/default-dotnet.xml</source>
-            <outputDirectory>/config/dotnet</outputDirectory>
-        </file>
     </files>
 
     <fileSets>

http://git-wip-us.apache.org/repos/asf/ignite/blob/52bb84db/config/dotnet/default-dotnet.xml
----------------------------------------------------------------------
diff --git a/config/dotnet/default-dotnet.xml b/config/dotnet/default-dotnet.xml
deleted file mode 100644
index 897c4e5..0000000
--- a/config/dotnet/default-dotnet.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?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.
--->
-
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xsi:schemaLocation="
-       http://www.springframework.org/schema/beans
-       http://www.springframework.org/schema/beans/spring-beans.xsd">
-    <!--
-        Default configuration that .NET nodes use.
-    -->
-    <bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
-		<property name="binaryConfiguration">
-			<bean class="org.apache.ignite.configuration.BinaryConfiguration">
-				<property name="idMapper">
-					<bean class="org.apache.ignite.binary.BinaryBasicIdMapper">
-						<property name="lowerCase" value="true"/>
-					</bean>
-				</property>
-				<property name="nameMapper">
-					<bean class="org.apache.ignite.binary.BinaryBasicNameMapper">
-						<property name="simpleName" value="true"/>
-					</bean>
-				</property>
-				<property name="compactFooter" value="true"/>
-			</bean>
-		</property>
-	</bean>
-</beans>


[63/70] [abbrv] ignite git commit: IGNITE-5033: Improved CREATE/DROP INDEX tests. This closes #1835.

Posted by sb...@apache.org.
IGNITE-5033: Improved CREATE/DROP INDEX tests. This closes #1835.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/2c37effe
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/2c37effe
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/2c37effe

Branch: refs/heads/ignite-2893
Commit: 2c37effe46de8afd22378c71bd7260fd0f79cddd
Parents: 0cb2c92
Author: devozerov <pp...@gmail.com>
Authored: Wed Apr 19 21:43:44 2017 +0300
Committer: devozerov <pp...@gmail.com>
Committed: Wed Apr 19 21:43:44 2017 +0300

----------------------------------------------------------------------
 .../processors/query/h2/IgniteH2Indexing.java   |   2 +-
 .../query/h2/ddl/DdlStatementsProcessor.java    |  19 +-
 .../cache/index/AbstractSchemaSelfTest.java     |   8 +-
 .../DynamicIndexAbstractBasicSelfTest.java      | 186 +++++++++++++++----
 .../index/DynamicIndexAbstractSelfTest.java     |  35 +---
 5 files changed, 177 insertions(+), 73 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/2c37effe/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
index 4f0a9f9..87b0d00 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
@@ -1717,7 +1717,7 @@ public class IgniteH2Indexing implements GridQueryIndexing {
 
                     if (DdlStatementsProcessor.isDdlStatement(prepared)) {
                         try {
-                            return ddlProc.runDdlStatement(stmt);
+                            return ddlProc.runDdlStatement(sqlQry, stmt);
                         }
                         catch (IgniteCheckedException e) {
                             throw new IgniteSQLException("Failed to execute DDL statement [stmt=" + sqlQry + ']', e);

http://git-wip-us.apache.org/repos/asf/ignite/blob/2c37effe/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/ddl/DdlStatementsProcessor.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/ddl/DdlStatementsProcessor.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/ddl/DdlStatementsProcessor.java
index 5b4b494..949ea6a 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/ddl/DdlStatementsProcessor.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/ddl/DdlStatementsProcessor.java
@@ -71,10 +71,11 @@ public class DdlStatementsProcessor {
     /**
      * Execute DDL statement.
      *
+     * @param sql SQL.
      * @param stmt H2 statement to parse and execute.
      */
     @SuppressWarnings("unchecked")
-    public QueryCursor<List<?>> runDdlStatement(PreparedStatement stmt)
+    public QueryCursor<List<?>> runDdlStatement(String sql, PreparedStatement stmt)
         throws IgniteCheckedException {
         assert stmt instanceof JdbcPreparedStatement;
 
@@ -99,8 +100,8 @@ public class DdlStatementsProcessor {
                 GridH2Table tbl = idx.dataTable(createIdx.schemaName(), createIdx.tableName());
 
                 if (tbl == null)
-                    throw new IgniteSQLException("Table not found [schemaName=" + createIdx.schemaName() + ", " +
-                        "tblName=" + createIdx.tableName() + ']', IgniteQueryErrorCode.TABLE_NOT_FOUND);
+                    throw new SchemaOperationException(SchemaOperationException.CODE_TABLE_NOT_FOUND,
+                        createIdx.tableName());
 
                 assert tbl.rowDescriptor() != null;
 
@@ -111,8 +112,7 @@ public class DdlStatementsProcessor {
                     GridQueryProperty prop = typeDesc.property(e.getKey());
 
                     if (prop == null)
-                        throw new IgniteSQLException("Property not found [typeName=" + typeDesc.name() + ", propName=" +
-                            e.getKey() + ']');
+                        throw new SchemaOperationException(SchemaOperationException.CODE_COLUMN_NOT_FOUND, e.getKey());
 
                     flds.put(prop.name(), e.getValue());
                 }
@@ -129,8 +129,8 @@ public class DdlStatementsProcessor {
                 fut = ctx.query().dynamicIndexDrop(spaceName, dropIdx.name(), dropIdx.ifExists());
             }
             else
-                throw new IgniteSQLException("Unexpected DDL operation [type=" + gridStmt.getClass() + ']',
-                    IgniteQueryErrorCode.UNEXPECTED_OPERATION);
+                throw new IgniteSQLException("Unsupported DDL operation: " + sql,
+                    IgniteQueryErrorCode.UNSUPPORTED_OPERATION);
 
             fut.get();
 
@@ -144,8 +144,11 @@ public class DdlStatementsProcessor {
         catch (SchemaOperationException e) {
             throw convert(e);
         }
+        catch (IgniteSQLException e) {
+            throw e;
+        }
         catch (Exception e) {
-            throw new IgniteSQLException("DLL operation failed.", e);
+            throw new IgniteSQLException("Unexpected DLL operation failure: " + e.getMessage(), e);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/2c37effe/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/AbstractSchemaSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/AbstractSchemaSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/AbstractSchemaSelfTest.java
index a865b18..e228026 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/AbstractSchemaSelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/AbstractSchemaSelfTest.java
@@ -204,7 +204,8 @@ public class AbstractSchemaSelfTest extends GridCommonAbstractTest {
             }
         }
 
-        fail("Index not found [cacheName=" + cacheName + ", tlbName=" + tblName + ", idxName=" + idxName + ']');
+        fail("Index not found [node=" + node.name() + ", cacheName=" + cacheName + ", tlbName=" + tblName +
+            ", idxName=" + idxName + ']');
     }
 
     /**
@@ -263,7 +264,7 @@ public class AbstractSchemaSelfTest extends GridCommonAbstractTest {
      * @param idxName Index name.
      */
     protected static void assertNoIndex(IgniteEx node, String cacheName, String tblName, String idxName) {
-        assertNoIndexDescriptor(node, cacheName, tblName, idxName);
+        assertNoIndexDescriptor(node, cacheName, idxName);
 
         if (affinityNode(node, cacheName)) {
             QueryTypeDescriptorImpl typeDesc = typeExisting(node, cacheName, tblName);
@@ -277,10 +278,9 @@ public class AbstractSchemaSelfTest extends GridCommonAbstractTest {
      *
      * @param node Node.
      * @param cacheName Cache name.
-     * @param tblName Table name.
      * @param idxName Index name.
      */
-    protected static void assertNoIndexDescriptor(IgniteEx node, String cacheName, String tblName, String idxName) {
+    protected static void assertNoIndexDescriptor(IgniteEx node, String cacheName, String idxName) {
         awaitCompletion();
 
         DynamicCacheDescriptor desc = node.context().cache().cacheDescriptor(cacheName);

http://git-wip-us.apache.org/repos/asf/ignite/blob/2c37effe/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractBasicSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractBasicSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractBasicSelfTest.java
index 6bc1576..fc3529b 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractBasicSelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractBasicSelfTest.java
@@ -22,14 +22,21 @@ import org.apache.ignite.Ignition;
 import org.apache.ignite.cache.CacheAtomicityMode;
 import org.apache.ignite.cache.CacheMode;
 import org.apache.ignite.cache.QueryIndex;
+import org.apache.ignite.cache.query.SqlFieldsQuery;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.configuration.NearCacheConfiguration;
 import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode;
+import org.apache.ignite.internal.processors.query.IgniteSQLException;
 import org.apache.ignite.internal.processors.query.schema.SchemaOperationException;
+import org.apache.ignite.internal.util.GridStringBuilder;
+import org.apache.ignite.internal.util.typedef.internal.SB;
 
+import javax.cache.CacheException;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
 
 import static org.apache.ignite.cache.CacheAtomicityMode.ATOMIC;
 import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL;
@@ -182,20 +189,18 @@ public abstract class DynamicIndexAbstractBasicSelfTest extends DynamicIndexAbst
     private void checkCreate(CacheMode mode, CacheAtomicityMode atomicityMode, boolean near) throws Exception {
         initialize(mode, atomicityMode, near);
 
-        final IgniteEx node = node();
-
         final QueryIndex idx = index(IDX_NAME_1, field(FIELD_NAME_1));
 
-        queryProcessor(node).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, false).get();
+        dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, false);
         assertIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1, field(FIELD_NAME_1));
 
         assertSchemaException(new RunnableX() {
             @Override public void run() throws Exception {
-                queryProcessor(node).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, false).get();
+                dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, false);
             }
-        }, SchemaOperationException.CODE_INDEX_EXISTS);
+        }, IgniteQueryErrorCode.INDEX_ALREADY_EXISTS);
 
-        queryProcessor(node).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, true).get();
+        dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, true);
         assertIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1, field(FIELD_NAME_1));
 
         assertSimpleIndexOperations(SQL_SIMPLE_FIELD_1);
@@ -270,7 +275,7 @@ public abstract class DynamicIndexAbstractBasicSelfTest extends DynamicIndexAbst
 
         final QueryIndex idx = index(IDX_NAME_1, field(FIELD_NAME_1), field(alias(FIELD_NAME_2)));
 
-        queryProcessor(node()).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, false).get();
+        dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, false);
         assertIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1, field(FIELD_NAME_1), field(alias(FIELD_NAME_2)));
 
         assertCompositeIndexOperations(SQL_COMPOSITE);
@@ -345,13 +350,21 @@ public abstract class DynamicIndexAbstractBasicSelfTest extends DynamicIndexAbst
 
         final QueryIndex idx = index(IDX_NAME_1, field(FIELD_NAME_1));
 
-        assertSchemaException(new RunnableX() {
-            @Override public void run() throws Exception {
-                queryProcessor(node()).dynamicIndexCreate(randomString(), TBL_NAME, idx, false).get();
-            }
-        }, SchemaOperationException.CODE_CACHE_NOT_FOUND);
+        try {
+            queryProcessor(node()).dynamicIndexCreate(randomString(), TBL_NAME, idx, false).get();
+        }
+        catch (SchemaOperationException e) {
+            assertEquals(SchemaOperationException.CODE_CACHE_NOT_FOUND, e.code());
 
-        assertNoIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1);
+            assertNoIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1);
+
+            return;
+        }
+        catch (Exception e) {
+            fail("Unexpected exception: " + e);
+        }
+
+        fail(SchemaOperationException.class.getSimpleName() +  " is not thrown.");
     }
 
     /**
@@ -423,9 +436,9 @@ public abstract class DynamicIndexAbstractBasicSelfTest extends DynamicIndexAbst
 
         assertSchemaException(new RunnableX() {
             @Override public void run() throws Exception {
-                queryProcessor(node()).dynamicIndexCreate(CACHE_NAME, randomString(), idx, false).get();
+                dynamicIndexCreate(CACHE_NAME, randomString(), idx, false);
             }
-        }, SchemaOperationException.CODE_TABLE_NOT_FOUND);
+        }, IgniteQueryErrorCode.TABLE_NOT_FOUND);
 
         assertNoIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1);
     }
@@ -499,9 +512,9 @@ public abstract class DynamicIndexAbstractBasicSelfTest extends DynamicIndexAbst
 
         assertSchemaException(new RunnableX() {
             @Override public void run() throws Exception {
-                queryProcessor(node()).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, false).get();
+                dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, false);
             }
-        }, SchemaOperationException.CODE_COLUMN_NOT_FOUND);
+        }, IgniteQueryErrorCode.COLUMN_NOT_FOUND);
 
         assertNoIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1);
     }
@@ -576,15 +589,15 @@ public abstract class DynamicIndexAbstractBasicSelfTest extends DynamicIndexAbst
             @Override public void run() throws Exception {
                 QueryIndex idx = index(IDX_NAME_1, field(FIELD_NAME_2));
 
-                queryProcessor(node()).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, false).get();
+                dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, false);
             }
-        }, SchemaOperationException.CODE_COLUMN_NOT_FOUND);
+        }, IgniteQueryErrorCode.COLUMN_NOT_FOUND);
 
         assertNoIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1);
 
         QueryIndex idx = index(IDX_NAME_1, field(alias(FIELD_NAME_2)));
 
-        queryProcessor(node()).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, false).get();
+        dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, false);
         assertIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1, field(alias(FIELD_NAME_2)));
 
         assertSimpleIndexOperations(SQL_SIMPLE_FIELD_2);
@@ -659,7 +672,7 @@ public abstract class DynamicIndexAbstractBasicSelfTest extends DynamicIndexAbst
 
         QueryIndex idx = index(IDX_NAME_1, field(FIELD_NAME_1));
 
-        queryProcessor(node()).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, false).get();
+        dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, false);
         assertIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1, field(FIELD_NAME_1));
 
         assertIndexUsed(IDX_NAME_1, SQL_SIMPLE_FIELD_1, SQL_ARG_1);
@@ -668,7 +681,7 @@ public abstract class DynamicIndexAbstractBasicSelfTest extends DynamicIndexAbst
 
         loadInitialData();
 
-        queryProcessor(node()).dynamicIndexDrop(CACHE_NAME, IDX_NAME_1, false).get();
+        dynamicIndexDrop(CACHE_NAME, IDX_NAME_1, false);
         assertNoIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1);
 
         assertSimpleIndexOperations(SQL_SIMPLE_FIELD_1);
@@ -743,11 +756,11 @@ public abstract class DynamicIndexAbstractBasicSelfTest extends DynamicIndexAbst
 
         assertSchemaException(new RunnableX() {
             @Override public void run() throws Exception {
-                queryProcessor(node()).dynamicIndexDrop(CACHE_NAME, IDX_NAME_1, false).get();
+                dynamicIndexDrop(CACHE_NAME, IDX_NAME_1, false);
             }
-        }, SchemaOperationException.CODE_INDEX_NOT_FOUND);
+        }, IgniteQueryErrorCode.INDEX_NOT_FOUND);
 
-        queryProcessor(node()).dynamicIndexDrop(CACHE_NAME, IDX_NAME_1, true).get();
+        dynamicIndexDrop(CACHE_NAME, IDX_NAME_1, true);
         assertNoIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1);
     }
 
@@ -818,13 +831,21 @@ public abstract class DynamicIndexAbstractBasicSelfTest extends DynamicIndexAbst
     private void checkDropNoCache(CacheMode mode, CacheAtomicityMode atomicityMode, boolean near) throws Exception {
         initialize(mode, atomicityMode, near);
 
-        assertSchemaException(new RunnableX() {
-            @Override public void run() throws Exception {
-                queryProcessor(node()).dynamicIndexDrop(randomString(), "my_idx", false).get();
-            }
-        }, SchemaOperationException.CODE_CACHE_NOT_FOUND);
+        try {
+            queryProcessor(node()).dynamicIndexDrop(randomString(), "my_idx", false).get();
+        }
+        catch (SchemaOperationException e) {
+            assertEquals(SchemaOperationException.CODE_CACHE_NOT_FOUND, e.code());
 
-        assertNoIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1);
+            assertNoIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1);
+
+            return;
+        }
+        catch (Exception e) {
+            fail("Unexpected exception: " + e);
+        }
+
+        fail(SchemaOperationException.class.getSimpleName() +  " is not thrown.");
     }
 
     /**
@@ -842,17 +863,17 @@ public abstract class DynamicIndexAbstractBasicSelfTest extends DynamicIndexAbst
 
         assertSchemaException(new RunnableX() {
             @Override public void run() throws Exception {
-                queryProcessor(node()).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, true).get();
+                dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, true);
             }
-        }, SchemaOperationException.CODE_GENERIC);
+        }, IgniteQueryErrorCode.UNSUPPORTED_OPERATION);
 
         assertNoIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1);
 
         assertSchemaException(new RunnableX() {
             @Override public void run() throws Exception {
-                queryProcessor(node()).dynamicIndexDrop(CACHE_NAME, IDX_NAME_1, true).get();
+                dynamicIndexDrop(CACHE_NAME, IDX_NAME_1, true);
             }
-        }, SchemaOperationException.CODE_GENERIC);
+        }, IgniteQueryErrorCode.UNSUPPORTED_OPERATION);
     }
 
     /**
@@ -947,4 +968,99 @@ public abstract class DynamicIndexAbstractBasicSelfTest extends DynamicIndexAbst
         for (Ignite node : Ignition.allGrids())
             assertSqlCompositeData(node, sql, 0);
     }
+
+    /**
+     * Ensure that schema exception is thrown.
+     *
+     * @param r Runnable.
+     * @param expCode Error code.
+     */
+    protected static void assertSchemaException(RunnableX r, int expCode) {
+        try {
+            r.run();
+        }
+        catch (CacheException e) {
+            Throwable cause = e.getCause();
+
+            assertTrue(cause != null);
+            assertTrue("Unexpected cause: " + cause.getClass().getName(), cause instanceof IgniteSQLException);
+
+            IgniteSQLException cause0 = (IgniteSQLException)cause;
+
+            int code = cause0.statusCode();
+
+            assertEquals("Unexpected error code [expected=" + expCode + ", actual=" + code +
+                ", msg=" + cause.getMessage() + ']', expCode, code);
+
+            return;
+        }
+        catch (Exception e) {
+            fail("Unexpected exception: " + e);
+        }
+
+        fail(IgniteSQLException.class.getSimpleName() +  " is not thrown.");
+    }
+
+    /**
+     * Synchronously create index.
+     *
+     * @param space Space.
+     * @param tblName Table name.
+     * @param idx Index.
+     * @param ifNotExists When set to true operation will fail if index already exists.
+     * @throws Exception If failed.
+     */
+    private void dynamicIndexCreate(String space, String tblName, QueryIndex idx, boolean ifNotExists)
+        throws Exception {
+        GridStringBuilder sql = new SB("CREATE INDEX ")
+            .a(ifNotExists ? "IF NOT EXISTS " : "")
+            .a("\"" + idx.getName() + "\"")
+            .a(" ON ")
+            .a(tblName)
+            .a(" (");
+
+        boolean first = true;
+
+        for (Map.Entry<String, Boolean> fieldEntry : idx.getFields().entrySet()) {
+            if (first)
+                first = false;
+            else
+                sql.a(", ");
+
+            String name = fieldEntry.getKey();
+            boolean asc = fieldEntry.getValue();
+
+            sql.a("\"" + name + "\"").a(" ").a(asc ? "ASC" : "DESC");
+        }
+
+        sql.a(')');
+
+        executeSql(space, sql.toString());
+    }
+
+    /**
+     * Synchronously drop index.
+     *
+     * @param space Space.
+     * @param idxName Index name.
+     * @param ifExists When set to true operation fill fail if index doesn't exists.
+     * @throws Exception if failed.
+     */
+    private void dynamicIndexDrop(String space, String idxName, boolean ifExists) throws Exception {
+        String sql = "DROP INDEX " + (ifExists ? "IF EXISTS " : "") + "\"" + idxName + "\"";
+
+        executeSql(space, sql);
+    }
+
+    /**
+     * Execute SQL.
+     *
+     * @param space Space.
+     * @param sql SQL.
+     */
+    private void executeSql(String space, String sql) {
+        log.info("Executing DDL: " + sql);
+
+        node().cache(space).query(new SqlFieldsQuery(sql)).getAll();
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/2c37effe/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractSelfTest.java
index e52e0d3..1ed7426 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractSelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractSelfTest.java
@@ -29,9 +29,10 @@ import org.apache.ignite.cache.query.SqlQuery;
 import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.configuration.MemoryConfiguration;
+import org.apache.ignite.configuration.MemoryPolicyConfiguration;
 import org.apache.ignite.internal.IgniteEx;
 import org.apache.ignite.internal.binary.BinaryMarshaller;
-import org.apache.ignite.internal.processors.query.schema.SchemaOperationException;
 import org.apache.ignite.internal.util.typedef.T2;
 import org.apache.ignite.lang.IgnitePredicate;
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
@@ -135,6 +136,13 @@ public abstract class DynamicIndexAbstractSelfTest extends AbstractSchemaSelfTes
 
         cfg.setMarshaller(new BinaryMarshaller());
 
+        MemoryConfiguration memCfg = new MemoryConfiguration()
+            .setDefaultMemoryPolicyName("default")
+            .setMemoryPolicies(new MemoryPolicyConfiguration().setName("default").setSize(32 * 1024 * 1024L)
+        );
+
+        cfg.setMemoryConfiguration(memCfg);
+
         return optimize(cfg);
     }
 
@@ -168,29 +176,6 @@ public abstract class DynamicIndexAbstractSelfTest extends AbstractSchemaSelfTes
     }
 
     /**
-     * Ensure that schema exception is thrown.
-     *
-     * @param r Runnable.
-     * @param expCode Error code.
-     */
-    protected static void assertSchemaException(RunnableX r, int expCode) {
-        try {
-            r.run();
-        }
-        catch (SchemaOperationException e) {
-            assertEquals("Unexpected error code [expected=" + expCode + ", actual=" + e.code() + ']',
-                expCode, e.code());
-
-            return;
-        }
-        catch (Exception e) {
-            fail("Unexpected exception: " + e);
-        }
-
-        fail(SchemaOperationException.class.getSimpleName() +  " is not thrown.");
-    }
-
-    /**
      * Ensure index is used in plan.
      *
      * @param idxName Index name.
@@ -374,7 +359,7 @@ public abstract class DynamicIndexAbstractSelfTest extends AbstractSchemaSelfTes
      * @return Random string.
      */
     protected static String randomString() {
-        return UUID.randomUUID().toString();
+        return "random" + UUID.randomUUID().toString().replace("-", "");
     }
 
     /**


[32/70] [abbrv] ignite git commit: IGNITE-4565: Implemented CREATE INDEX and DROP INDEX. This closes #1773. This closes #1804.

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
index 98d227c..a9c1a20 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
@@ -17,12 +17,10 @@
 
 package org.apache.ignite.internal.processors.query.h2.opt;
 
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.sql.Statement;
 import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Set;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.concurrent.locks.Lock;
@@ -35,11 +33,9 @@ import org.apache.ignite.internal.processors.cache.GridCacheContext;
 import org.apache.ignite.internal.processors.cache.KeyCacheObject;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
 import org.apache.ignite.internal.processors.query.h2.database.H2RowFactory;
-import org.apache.ignite.internal.processors.query.h2.database.H2TreeIndex;
 import org.apache.ignite.internal.util.offheap.unsafe.GridUnsafeMemory;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.lang.IgniteBiTuple;
-import org.h2.api.TableEngine;
 import org.h2.command.ddl.CreateTableData;
 import org.h2.engine.Session;
 import org.h2.index.Index;
@@ -50,7 +46,6 @@ import org.h2.result.SearchRow;
 import org.h2.result.SortOrder;
 import org.h2.table.IndexColumn;
 import org.h2.table.TableBase;
-import org.h2.table.TableFilter;
 import org.h2.value.Value;
 import org.jetbrains.annotations.Nullable;
 import org.jsr166.ConcurrentHashMap8;
@@ -72,7 +67,10 @@ public class GridH2Table extends TableBase {
     private final GridH2RowDescriptor desc;
 
     /** */
-    private final ArrayList<Index> idxs;
+    private volatile ArrayList<Index> idxs;
+
+    /** */
+    private final Map<String, GridH2IndexBase> tmpIdxs = new HashMap<>();
 
     /** */
     private final ReadWriteLock lock;
@@ -81,7 +79,7 @@ public class GridH2Table extends TableBase {
     private boolean destroyed;
 
     /** */
-    private final Set<Session> sessions = Collections.newSetFromMap(new ConcurrentHashMap8<Session,Boolean>());
+    private final ConcurrentMap<Session, Boolean> sessions = new ConcurrentHashMap8<>();
 
     /** */
     private final AtomicReference<Object[]> actualSnapshot = new AtomicReference<>();
@@ -106,11 +104,12 @@ public class GridH2Table extends TableBase {
      *
      * @param createTblData Table description.
      * @param desc Row descriptor.
+     * @param rowFactory Row factory.
      * @param idxsFactory Indexes factory.
      * @param spaceName Space name.
      */
-    public GridH2Table(CreateTableData createTblData, @Nullable GridH2RowDescriptor desc, IndexesFactory idxsFactory,
-        @Nullable String spaceName) {
+    public GridH2Table(CreateTableData createTblData, @Nullable GridH2RowDescriptor desc, H2RowFactory rowFactory,
+        GridH2SystemIndexFactory idxsFactory, @Nullable String spaceName) {
         super(createTblData);
 
         assert idxsFactory != null;
@@ -143,18 +142,18 @@ public class GridH2Table extends TableBase {
             }
         }
 
+        this.rowFactory = rowFactory;
+
         // Indexes must be created in the end when everything is ready.
-        rowFactory = idxsFactory.createRowFactory(this);
-        idxs = idxsFactory.createIndexes(this);
+        idxs = idxsFactory.createSystemIndexes(this);
 
         assert idxs != null;
 
         // Add scan index at 0 which is required by H2.
-        if (idxs.size() >= 2
-                && index(0).getIndexType().isHash())
-            idxs.add(0, new ScanIndex(index(1), index(0)));
+        if (idxs.size() >= 2 && index(0).getIndexType().isHash())
+            idxs.add(0, new GridH2PrimaryScanIndex(this, index(1), index(0)));
         else
-            idxs.add(0, new ScanIndex(index(0), null));
+            idxs.add(0, new GridH2PrimaryScanIndex(this, index(0), null));
 
         snapshotEnabled = desc == null || desc.snapshotableIndex();
 
@@ -238,6 +237,8 @@ public class GridH2Table extends TableBase {
             desc.guard().begin();
 
         try {
+            ensureNotDestroyed();
+
             GridH2AbstractKeyValueRow row = (GridH2AbstractKeyValueRow)pk.findOne(searchRow);
 
             if (row == null)
@@ -266,13 +267,21 @@ public class GridH2Table extends TableBase {
     }
 
     /** {@inheritDoc} */
-    @SuppressWarnings({"LockAcquiredButNotSafelyReleased", "SynchronizationOnLocalVariableOrMethodParameter", "unchecked"})
-    @Override public boolean lock(@Nullable final Session ses, boolean exclusive, boolean force) {
-        if (ses != null) {
-            if (!sessions.add(ses))
-                return false;
+    @Override public boolean lock(Session ses, boolean exclusive, boolean force) {
+        Boolean putRes = sessions.putIfAbsent(ses, exclusive);
+
+        // In accordance with base method semantics, we'll return true if we were already exclusively locked
+        if (putRes != null)
+            return putRes;
+
+        ses.addLock(this);
+
+        lock(exclusive);
+
+        if (destroyed) {
+            unlock(exclusive);
 
-            ses.addLock(this);
+            throw new IllegalStateException("Table " + identifier() + " already destroyed.");
         }
 
         if (snapshotInLock())
@@ -320,6 +329,8 @@ public class GridH2Table extends TableBase {
         }
 
         try {
+            ensureNotDestroyed();
+
             // Try again inside of the lock.
             snapshots = actualSnapshot.get();
 
@@ -362,12 +373,6 @@ public class GridH2Table extends TableBase {
 
             throw new IgniteInterruptedException("Thread got interrupted while trying to acquire table lock.", e);
         }
-
-        if (destroyed) {
-            unlock(exclusive);
-
-            throw new IllegalStateException("Table " + identifier() + " already destroyed.");
-        }
     }
 
     /**
@@ -388,12 +393,6 @@ public class GridH2Table extends TableBase {
             throw new IgniteInterruptedException("Thread got interrupted while trying to acquire table lock.", e);
         }
 
-        if (destroyed) {
-            unlock(exclusive);
-
-            throw new IllegalStateException("Table " + identifier() + " already destroyed.");
-        }
-
         return true;
     }
 
@@ -409,6 +408,14 @@ public class GridH2Table extends TableBase {
     }
 
     /**
+     * Check if table is not destroyed.
+     */
+    private void ensureNotDestroyed() {
+        if (destroyed)
+            throw new IllegalStateException("Table " + identifier() + " already destroyed.");
+    }
+
+    /**
      * Must be called inside of write lock because when using multiple indexes we have to ensure that all of them have
      * the same contents at snapshot taking time.
      *
@@ -462,6 +469,8 @@ public class GridH2Table extends TableBase {
         lock(true);
 
         try {
+            ensureNotDestroyed();
+
             assert sessions.isEmpty() : sessions;
 
             destroyed = true;
@@ -475,12 +484,16 @@ public class GridH2Table extends TableBase {
     }
 
     /** {@inheritDoc} */
-    @Override public void unlock(@Nullable Session ses) {
-        if (ses != null && !sessions.remove(ses))
+    @Override public void unlock(Session ses) {
+        Boolean exclusive = sessions.remove(ses);
+
+        if (exclusive == null)
             return;
 
         if (snapshotInLock())
             releaseSnapshots();
+
+        unlock(exclusive);
     }
 
     /**
@@ -599,6 +612,8 @@ public class GridH2Table extends TableBase {
             desc.guard().begin();
 
         try {
+            ensureNotDestroyed();
+
             GridH2IndexBase pk = pk();
 
             if (!del) {
@@ -623,18 +638,11 @@ public class GridH2Table extends TableBase {
                 while (++i < len) {
                     GridH2IndexBase idx = index(i);
 
-                    assert !idx.getIndexType().isUnique() : "Unique indexes are not supported: " + idx;
-
-                    GridH2Row old2 = idx.put(row);
-
-                    if (old2 != null) { // Row was replaced in index.
-                        if (!eq(pk, old2, old))
-                            throw new IllegalStateException("Row conflict should never happen, unique indexes are " +
-                                "not supported [idx=" + idx + ", old=" + old + ", old2=" + old2 + ']');
-                    }
-                    else if (old != null) // Row was not replaced, need to remove manually.
-                        idx.removex(old);
+                    addToIndex(idx, pk, row, old, false);
                 }
+
+                for (GridH2IndexBase idx : tmpIdxs.values())
+                    addToIndex(idx, pk, row, old, true);
             }
             else {
                 //  index(1) is PK, get full row from there (search row here contains only key but no other columns).
@@ -656,6 +664,9 @@ public class GridH2Table extends TableBase {
                         assert eq(pk, res, old) : "\n" + old + "\n" + res + "\n" + i + " -> " + index(i).getName();
                     }
 
+                    for (GridH2IndexBase idx : tmpIdxs.values())
+                        idx.remove(old);
+
                     size.decrement();
                 }
                 else
@@ -676,6 +687,31 @@ public class GridH2Table extends TableBase {
     }
 
     /**
+     * Add row to index.
+     *
+     * @param idx Index to add row to.
+     * @param pk Primary key index.
+     * @param row Row to add to index.
+     * @param old Previous row state, if any.
+     * @param tmp {@code True} if this is proposed index which may be not consistent yet.
+     */
+    private void addToIndex(GridH2IndexBase idx, Index pk, GridH2Row row, GridH2Row old, boolean tmp) {
+        assert !idx.getIndexType().isUnique() : "Unique indexes are not supported: " + idx;
+
+        GridH2Row old2 = idx.put(row);
+
+        if (old2 != null) { // Row was replaced in index.
+            if (!tmp) {
+                if (!eq(pk, old2, old))
+                    throw new IllegalStateException("Row conflict should never happen, unique indexes are " +
+                        "not supported [idx=" + idx + ", old=" + old + ", old2=" + old2 + ']');
+            }
+        }
+        else if (old != null) // Row was not replaced, need to remove manually.
+            idx.removex(old);
+    }
+
+    /**
      * Check row equality.
      *
      * @param pk Primary key index.
@@ -716,9 +752,119 @@ public class GridH2Table extends TableBase {
     }
 
     /** {@inheritDoc} */
-    @Override public Index addIndex(Session ses, String s, int i, IndexColumn[] idxCols, IndexType idxType,
-        boolean b, String s1) {
-        throw DbException.getUnsupportedException("addIndex");
+    @Override public Index addIndex(Session ses, String idxName, int idxId, IndexColumn[] cols, IndexType idxType,
+        boolean create, String idxComment) {
+        return commitUserIndex(ses, idxName);
+    }
+
+    /**
+     * Add index that is in an intermediate state and is still being built, thus is not used in queries until it is
+     * promoted.
+     *
+     * @param idx Index to add.
+     * @throws IgniteCheckedException If failed.
+     */
+    public void proposeUserIndex(Index idx) throws IgniteCheckedException {
+        assert idx instanceof GridH2IndexBase;
+
+        lock(true);
+
+        try {
+            ensureNotDestroyed();
+
+            for (Index oldIdx : idxs) {
+                if (F.eq(oldIdx.getName(), idx.getName()))
+                    throw new IgniteCheckedException("Index already exists: " + idx.getName());
+            }
+
+            Index oldTmpIdx = tmpIdxs.put(idx.getName(), (GridH2IndexBase)idx);
+
+            assert oldTmpIdx == null;
+        }
+        finally {
+            unlock(true);
+        }
+    }
+
+    /**
+     * Promote temporary index to make it usable in queries.
+     *
+     * @param ses H2 session.
+     * @param idxName Index name.
+     * @return Temporary index with given name.
+     */
+    private Index commitUserIndex(Session ses, String idxName) {
+        lock(true);
+
+        try {
+            ensureNotDestroyed();
+
+            Index idx = tmpIdxs.remove(idxName);
+
+            assert idx != null;
+
+            ArrayList<Index> newIdxs = new ArrayList<>(idxs.size() + 1);
+
+            newIdxs.addAll(idxs);
+
+            newIdxs.add(idx);
+
+            idxs = newIdxs;
+
+            database.addSchemaObject(ses, idx);
+
+            setModified();
+
+            return idx;
+        }
+        finally {
+            unlock(true);
+        }
+    }
+
+    /**
+     * Remove user index without promoting it.
+     *
+     * @param idxName Index name.
+     */
+    public void rollbackUserIndex(String idxName) {
+        lock(true);
+
+        try {
+            ensureNotDestroyed();
+
+            GridH2IndexBase rmvIdx = tmpIdxs.remove(idxName);
+
+            assert rmvIdx != null;
+        }
+        finally {
+            unlock(true);
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override public void removeIndex(Index h2Idx) {
+        lock(true);
+
+        try {
+            ArrayList<Index> idxs = new ArrayList<>(this.idxs);
+
+            for (int i = 2; i < idxs.size(); i++) {
+                GridH2IndexBase idx = (GridH2IndexBase)idxs.get(i);
+
+                if (idx != h2Idx)
+                    continue;
+
+                idxs.remove(i);
+
+                this.idxs = idxs;
+
+                return;
+            }
+        }
+        finally {
+            unlock(true);
+        }
     }
 
     /** {@inheritDoc} */
@@ -848,136 +994,4 @@ public class GridH2Table extends TableBase {
         return rowFactory;
     }
 
-    /**
-     * H2 Table engine.
-     */
-    @SuppressWarnings({"PublicInnerClass", "FieldAccessedSynchronizedAndUnsynchronized"})
-    public static class Engine implements TableEngine {
-        /** */
-        private static GridH2RowDescriptor rowDesc;
-
-        /** */
-        private static IndexesFactory idxsFactory;
-
-        /** */
-        private static GridH2Table resTbl;
-
-        /** */
-        private static String spaceName;
-
-        /** {@inheritDoc} */
-        @Override public TableBase createTable(CreateTableData createTblData) {
-            resTbl = new GridH2Table(createTblData, rowDesc, idxsFactory, spaceName);
-
-            return resTbl;
-        }
-
-        /**
-         * Creates table using given connection, DDL clause for given type descriptor and list of indexes.
-         *
-         * @param conn Connection.
-         * @param sql DDL clause.
-         * @param desc Row descriptor.
-         * @param factory Indexes factory.
-         * @param space Space name.
-         * @throws SQLException If failed.
-         * @return Created table.
-         */
-        public static synchronized GridH2Table createTable(Connection conn, String sql,
-            @Nullable GridH2RowDescriptor desc, IndexesFactory factory, String space)
-            throws SQLException {
-            rowDesc = desc;
-            idxsFactory = factory;
-            spaceName = space;
-
-            try {
-                try (Statement s = conn.createStatement()) {
-                    s.execute(sql + " engine \"" + Engine.class.getName() + "\"");
-                }
-
-                return resTbl;
-            }
-            finally {
-                resTbl = null;
-                idxsFactory = null;
-                rowDesc = null;
-            }
-        }
-    }
-
-    /**
-     * Type which can create indexes list for given table.
-     */
-    @SuppressWarnings({"PackageVisibleInnerClass", "PublicInnerClass"})
-    public static interface IndexesFactory {
-        /**
-         * Create list of indexes. First must be primary key, after that all unique indexes and
-         * only then non-unique indexes.
-         * All indexes must be subtypes of {@link H2TreeIndex}.
-         *
-         * @param tbl Table to create indexes for.
-         * @return List of indexes.
-         */
-        ArrayList<Index> createIndexes(GridH2Table tbl);
-
-        /**
-         * @param tbl Table.
-         * @return Data store.
-         */
-        H2RowFactory createRowFactory(GridH2Table tbl);
-    }
-
-    /**
-     * Wrapper type for primary key.
-     */
-    @SuppressWarnings("PackageVisibleInnerClass")
-    class ScanIndex extends GridH2ScanIndex<GridH2IndexBase> {
-        /** */
-        static final String SCAN_INDEX_NAME_SUFFIX = "__SCAN_";
-
-        /** */
-        private final GridH2IndexBase hashIdx;
-
-        /**
-         * Constructor.
-         */
-        private ScanIndex(GridH2IndexBase treeIdx, GridH2IndexBase hashIdx) {
-            super(treeIdx);
-
-            this.hashIdx = hashIdx;
-        }
-
-        /**
-         *
-         */
-        @Override protected GridH2IndexBase delegate() {
-            if (hashIdx != null)
-                return rebuildFromHashInProgress ? hashIdx : super.delegate();
-            else {
-                assert !rebuildFromHashInProgress;
-
-                return super.delegate();
-            }
-        }
-
-        /** {@inheritDoc} */
-        @Override public double getCost(Session ses, int[] masks, TableFilter[] filters, int filter,
-            SortOrder sortOrder) {
-            long rows = getRowCountApproximation();
-            double baseCost = getCostRangeIndex(masks, rows, filters, filter, sortOrder, true);
-            int mul = delegate().getDistributedMultiplier(ses, filters, filter);
-
-            return mul * baseCost;
-        }
-
-        /** {@inheritDoc} */
-        @Override public String getPlanSQL() {
-            return delegate().getTable().getSQL() + "." + SCAN_INDEX_NAME_SUFFIX;
-        }
-
-        /** {@inheritDoc} */
-        @Override public String getName() {
-            return delegate().getName() + SCAN_INDEX_NAME_SUFFIX;
-        }
-    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridLuceneIndex.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridLuceneIndex.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridLuceneIndex.java
index b73bb96..4395024 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridLuceneIndex.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridLuceneIndex.java
@@ -116,15 +116,7 @@ public class GridLuceneIndex implements AutoCloseable {
             throw new IgniteCheckedException(e);
         }
 
-        GridQueryIndexDescriptor idx = null;
-
-        for (GridQueryIndexDescriptor descriptor : type.indexes().values()) {
-            if (descriptor.type() == QueryIndexType.FULLTEXT) {
-                idx = descriptor;
-
-                break;
-            }
-        }
+        GridQueryIndexDescriptor idx = type.textIndex();
 
         if (idx != null) {
             Collection<String> fields = idx.fields();

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlCreateIndex.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlCreateIndex.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlCreateIndex.java
new file mode 100644
index 0000000..50d455c
--- /dev/null
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlCreateIndex.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.internal.processors.query.h2.sql;
+
+import java.util.Map;
+import org.apache.ignite.cache.QueryIndex;
+import org.apache.ignite.cache.QueryIndexType;
+import org.h2.command.Parser;
+
+/**
+ * CREATE INDEX statement.
+ */
+public class GridSqlCreateIndex extends GridSqlStatement {
+    /** Schema name. */
+    private String schemaName;
+
+    /** Table name. */
+    private String tblName;
+
+    /** Attempt to create the index only if it does not exist. */
+    private boolean ifNotExists;
+
+    /** Index to create. */
+    private QueryIndex idx;
+
+    /**
+     * @return Schema name for new index.
+     */
+    public String schemaName() {
+        return schemaName;
+    }
+
+    /**
+     * @param schemaName Schema name for new index.
+     */
+    public void schemaName(String schemaName) {
+        this.schemaName = schemaName;
+    }
+
+    /**
+     * @return Table name.
+     */
+    public String tableName() {
+        return tblName;
+    }
+
+    /**
+     * @param tblName Table name.
+     */
+    public void tableName(String tblName) {
+        this.tblName = tblName;
+    }
+
+    /**
+     * @return whether attempt to create the index should be made only if it does not exist.
+     */
+    public boolean ifNotExists() {
+        return ifNotExists;
+    }
+
+    /**
+     * @param ifNotExists whether attempt to create the index should be made only if it does not exist.
+     */
+    public void ifNotExists(boolean ifNotExists) {
+        this.ifNotExists = ifNotExists;
+    }
+
+    /**
+     * @return Index to create.
+     */
+    public QueryIndex index() {
+        return idx;
+    }
+
+    /**
+     * @param idx Index to create.
+     */
+    public void index(QueryIndex idx) {
+        this.idx = idx;
+    }
+
+    /** {@inheritDoc} */
+    @Override public String getSQL() {
+        StringBuilder sb = new StringBuilder("CREATE ")
+            .append(idx.getIndexType() == QueryIndexType.GEOSPATIAL ? "SPATIAL " : "")
+            .append("INDEX ").append(ifNotExists ? "IF NOT EXISTS " : "")
+            .append(Parser.quoteIdentifier(schemaName)).append('.')
+            .append(Parser.quoteIdentifier(idx.getName())).append(" ON ")
+            .append(Parser.quoteIdentifier(tblName)).append(" (");
+
+        boolean first = true;
+
+        for (Map.Entry<String, Boolean> e : idx.getFields().entrySet()) {
+            if (first)
+                first = false;
+            else
+                sb.append(", ");
+
+            sb.append(Parser.quoteIdentifier(e.getKey())).append(e.getValue() ? " ASC" : " DESC");
+        }
+
+        sb.append(')');
+
+        return sb.toString();
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlDropIndex.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlDropIndex.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlDropIndex.java
new file mode 100644
index 0000000..c844b49
--- /dev/null
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlDropIndex.java
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.query.h2.sql;
+
+import org.h2.command.Parser;
+
+/**
+ * DROP INDEX statement.
+ */
+public class GridSqlDropIndex extends GridSqlStatement {
+    /** Index name. */
+    private String name;
+
+    /** Schema name. */
+    private String schemaName;
+
+    /** Attempt to drop the index only if it exists. */
+    private boolean ifExists;
+
+    /**
+     * @return Index name.
+     */
+    public String name() {
+        return name;
+    }
+
+    /**
+     * @param name Index name.
+     */
+    public void name(String name) {
+        this.name = name;
+    }
+
+    /**
+     * @return Schema name.
+     */
+    public String schemaName() {
+        return schemaName;
+    }
+
+    /**
+     * @param schemaName Schema name.
+     */
+    public void schemaName(String schemaName) {
+        this.schemaName = schemaName;
+    }
+
+    /**
+     * @return whether attempt to drop the index should be made only if it exists.
+     */
+    public boolean ifExists() {
+        return ifExists;
+    }
+
+    /**
+     * @param ifExists whether attempt to drop the index should be made only if it exists.
+     */
+    public void ifExists(boolean ifExists) {
+        this.ifExists = ifExists;
+    }
+
+    /** {@inheritDoc} */
+    @Override public String getSQL() {
+        return "DROP INDEX " + (ifExists ? "IF EXISTS " : "") + Parser.quoteIdentifier(schemaName) + '.' +
+            Parser.quoteIdentifier(name);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQueryParser.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQueryParser.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQueryParser.java
index 0f940e9..199a157 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQueryParser.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQueryParser.java
@@ -28,9 +28,16 @@ import java.util.List;
 import java.util.Map;
 import javax.cache.CacheException;
 import org.apache.ignite.IgniteException;
+import org.apache.ignite.cache.QueryIndex;
+import org.apache.ignite.cache.QueryIndexType;
+import org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode;
+import org.apache.ignite.internal.processors.query.IgniteSQLException;
 import org.h2.command.Command;
 import org.h2.command.CommandContainer;
 import org.h2.command.Prepared;
+import org.h2.command.ddl.CreateIndex;
+import org.h2.command.ddl.DropIndex;
+import org.h2.command.ddl.SchemaCommand;
 import org.h2.command.dml.Delete;
 import org.h2.command.dml.Explain;
 import org.h2.command.dml.Insert;
@@ -63,8 +70,10 @@ import org.h2.expression.ValueExpression;
 import org.h2.index.ViewIndex;
 import org.h2.jdbc.JdbcPreparedStatement;
 import org.h2.result.SortOrder;
+import org.h2.schema.Schema;
 import org.h2.table.Column;
 import org.h2.table.FunctionTable;
+import org.h2.table.IndexColumn;
 import org.h2.table.RangeTable;
 import org.h2.table.Table;
 import org.h2.table.TableBase;
@@ -302,6 +311,48 @@ public class GridSqlQueryParser {
         GridSqlQueryParser.<Command, Prepared>getter(CommandContainer.class, "prepared");
 
     /** */
+    private static final Getter<CreateIndex, String> CREATE_INDEX_NAME = getter(CreateIndex.class, "indexName");
+
+    /** */
+    private static final Getter<CreateIndex, String> CREATE_INDEX_TABLE_NAME = getter(CreateIndex.class, "tableName");
+
+    /** */
+    private static final Getter<CreateIndex, IndexColumn[]> CREATE_INDEX_COLUMNS = getter(CreateIndex.class,
+        "indexColumns");
+
+    /** */
+    private static final Getter<CreateIndex, Boolean> CREATE_INDEX_SPATIAL = getter(CreateIndex.class, "spatial");
+
+    /** */
+    private static final Getter<CreateIndex, Boolean> CREATE_INDEX_PRIMARY_KEY = getter(CreateIndex.class,
+        "primaryKey");
+
+    /** */
+    private static final Getter<CreateIndex, Boolean> CREATE_INDEX_UNIQUE = getter(CreateIndex.class, "unique");
+
+    /** */
+    private static final Getter<CreateIndex, Boolean> CREATE_INDEX_HASH = getter(CreateIndex.class, "hash");
+
+    /** */
+    private static final Getter<CreateIndex, Boolean> CREATE_INDEX_IF_NOT_EXISTS = getter(CreateIndex.class,
+        "ifNotExists");
+
+    /** */
+    private static final Getter<IndexColumn, String> INDEX_COLUMN_NAME = getter(IndexColumn.class, "columnName");
+
+    /** */
+    private static final Getter<IndexColumn, Integer> INDEX_COLUMN_SORT_TYPE = getter(IndexColumn.class, "sortType");
+
+    /** */
+    private static final Getter<DropIndex, String> DROP_INDEX_NAME = getter(DropIndex.class, "indexName");
+
+    /** */
+    private static final Getter<DropIndex, Boolean> DROP_INDEX_IF_EXISTS = getter(DropIndex.class, "ifExists");
+
+    /** */
+    private static final Getter<SchemaCommand, Schema> SCHEMA_COMMAND_SCHEMA = getter(SchemaCommand.class, "schema");
+
+    /** */
     private final IdentityHashMap<Object, Object> h2ObjToGridObj = new IdentityHashMap<>();
 
     /** */
@@ -659,6 +710,72 @@ public class GridSqlQueryParser {
         return res;
     }
 
+
+
+    /**
+     * Parse {@code DROP INDEX} statement.
+     *
+     * @param dropIdx {@code DROP INDEX} statement.
+     * @see <a href="http://h2database.com/html/grammar.html#drop_index">H2 {@code DROP INDEX} spec.</a>
+     */
+    private GridSqlDropIndex parseDropIndex(DropIndex dropIdx) {
+        GridSqlDropIndex res = new GridSqlDropIndex();
+
+        res.name(DROP_INDEX_NAME.get(dropIdx));
+        res.schemaName(SCHEMA_COMMAND_SCHEMA.get(dropIdx).getName());
+        res.ifExists(DROP_INDEX_IF_EXISTS.get(dropIdx));
+
+        return res;
+    }
+
+    /**
+     * Parse {@code CREATE INDEX} statement.
+     *
+     * @param createIdx {@code CREATE INDEX} statement.
+     * @see <a href="http://h2database.com/html/grammar.html#create_index">H2 {@code CREATE INDEX} spec.</a>
+     */
+    private GridSqlCreateIndex parseCreateIndex(CreateIndex createIdx) {
+        if (CREATE_INDEX_HASH.get(createIdx) || CREATE_INDEX_PRIMARY_KEY.get(createIdx) ||
+            CREATE_INDEX_UNIQUE.get(createIdx))
+            throw new IgniteSQLException("Only SPATIAL modifier is supported for CREATE INDEX",
+                IgniteQueryErrorCode.UNSUPPORTED_OPERATION);
+
+        GridSqlCreateIndex res = new GridSqlCreateIndex();
+
+        Schema schema = SCHEMA_COMMAND_SCHEMA.get(createIdx);
+
+        String tblName = CREATE_INDEX_TABLE_NAME.get(createIdx);
+
+        res.schemaName(schema.getName());
+        res.tableName(tblName);
+        res.ifNotExists(CREATE_INDEX_IF_NOT_EXISTS.get(createIdx));
+
+        QueryIndex idx = new QueryIndex();
+
+        idx.setName(CREATE_INDEX_NAME.get(createIdx));
+        idx.setIndexType(CREATE_INDEX_SPATIAL.get(createIdx) ? QueryIndexType.GEOSPATIAL : QueryIndexType.SORTED);
+
+        IndexColumn[] cols = CREATE_INDEX_COLUMNS.get(createIdx);
+
+        LinkedHashMap<String, Boolean> flds = new LinkedHashMap<>(cols.length);
+
+        for (IndexColumn col : CREATE_INDEX_COLUMNS.get(createIdx)) {
+            int sortType = INDEX_COLUMN_SORT_TYPE.get(col);
+
+            if ((sortType & SortOrder.NULLS_FIRST) != 0 || (sortType & SortOrder.NULLS_LAST) != 0)
+                throw new IgniteSQLException("NULLS FIRST and NULLS LAST modifiers are not supported for index columns",
+                    IgniteQueryErrorCode.UNSUPPORTED_OPERATION);
+
+            flds.put(INDEX_COLUMN_NAME.get(col), (sortType & SortOrder.DESCENDING) == 0);
+        }
+
+        idx.setFields(flds);
+
+        res.index(idx);
+
+        return res;
+    }
+
     /**
      * @param sortOrder Sort order.
      * @param qry Query.
@@ -722,6 +839,12 @@ public class GridSqlQueryParser {
         if (stmt instanceof Explain)
             return parse(EXPLAIN_COMMAND.get((Explain)stmt)).explain(true);
 
+        if (stmt instanceof CreateIndex)
+            return parseCreateIndex((CreateIndex)stmt);
+
+        if (stmt instanceof DropIndex)
+            return parseDropIndex((DropIndex)stmt);
+
         throw new CacheException("Unsupported SQL statement: " + stmt);
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/AbstractSchemaSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/AbstractSchemaSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/AbstractSchemaSelfTest.java
new file mode 100644
index 0000000..a865b18
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/AbstractSchemaSelfTest.java
@@ -0,0 +1,512 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache.index;
+
+import org.apache.ignite.Ignite;
+import org.apache.ignite.Ignition;
+import org.apache.ignite.cache.QueryEntity;
+import org.apache.ignite.cache.QueryIndex;
+import org.apache.ignite.cache.QueryIndexType;
+import org.apache.ignite.cache.query.annotations.QuerySqlField;
+import org.apache.ignite.cluster.ClusterNode;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.internal.IgniteInterruptedCheckedException;
+import org.apache.ignite.internal.processors.cache.DynamicCacheDescriptor;
+import org.apache.ignite.internal.processors.query.GridQueryProcessor;
+import org.apache.ignite.internal.processors.query.GridQueryTypeDescriptor;
+import org.apache.ignite.internal.processors.query.QueryIndexDescriptorImpl;
+import org.apache.ignite.internal.processors.query.QueryTypeDescriptorImpl;
+import org.apache.ignite.internal.processors.query.QueryUtils;
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.lang.IgniteBiTuple;
+import org.apache.ignite.lang.IgnitePredicate;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Tests for dynamic schema changes.
+ */
+@SuppressWarnings("unchecked")
+public class AbstractSchemaSelfTest extends GridCommonAbstractTest {
+    /** Cache. */
+    protected static final String CACHE_NAME = "cache";
+
+    /** Table name. */
+    protected static final String TBL_NAME = tableName(ValueClass.class);
+
+    /** Table name 2. */
+    protected static final String TBL_NAME_2 = tableName(ValueClass2.class);
+
+    /** Index name 1. */
+    protected static final String IDX_NAME_1 = "idx_1";
+
+    /** Index name 2. */
+    protected static final String IDX_NAME_2 = "idx_2";
+
+    /** Index name 3. */
+    protected static final String IDX_NAME_3 = "idx_3";
+
+    /** Key ID field. */
+    protected static final String FIELD_KEY = "id";
+
+    /** Field 1. */
+    protected static final String FIELD_NAME_1 = "field1";
+
+    /** Field 1. */
+    protected static final String FIELD_NAME_2 = "field2";
+
+    /** Field 3. */
+    protected static final String FIELD_NAME_3 = "field3";
+
+    /**
+     * Get type on the given node for the given cache and table name. Type must exist.
+     *
+     * @param node Node.
+     * @param cacheName Cache name.
+     * @param tblName Table name.
+     * @return Type.
+     */
+    protected static QueryTypeDescriptorImpl typeExisting(IgniteEx node, String cacheName, String tblName) {
+        QueryTypeDescriptorImpl res = type(node, cacheName, tblName);
+
+        assertNotNull(res);
+
+        return res;
+    }
+
+    /**
+     * Get type on the given node for the given cache and table name.
+     *
+     * @param node Node.
+     * @param cacheName Cache name.
+     * @param tblName Table name.
+     * @return Type.
+     */
+    @Nullable protected static QueryTypeDescriptorImpl type(IgniteEx node, String cacheName, String tblName) {
+        return types(node, cacheName).get(tblName);
+    }
+
+    /**
+     * Get available types on the given node for the given cache.
+     *
+     * @param node Node.
+     * @param cacheName Cache name.
+     * @return Map from table name to type.
+     */
+    protected static Map<String, QueryTypeDescriptorImpl> types(IgniteEx node, String cacheName) {
+        Map<String, QueryTypeDescriptorImpl> res = new HashMap<>();
+
+        Collection<GridQueryTypeDescriptor> descs = node.context().query().types(cacheName);
+
+        for (GridQueryTypeDescriptor desc : descs) {
+            QueryTypeDescriptorImpl desc0 = (QueryTypeDescriptorImpl)desc;
+
+            res.put(desc0.tableName(), desc0);
+        }
+
+        return res;
+    }
+
+    /**
+     * Assert index state on all nodes.
+     *
+     * @param cacheName Cache name.
+     * @param tblName Table name.
+     * @param idxName Index name.
+     * @param fields Fields.
+     */
+    protected static void assertIndex(String cacheName, String tblName, String idxName,
+        IgniteBiTuple<String, Boolean>... fields) {
+        for (Ignite node : Ignition.allGrids())
+            assertIndex((IgniteEx)node, cacheName, tblName, idxName, fields);
+    }
+
+    /**
+     * Assert index state on particular node.
+     *
+     * @param node Node.
+     * @param cacheName Cache name.
+     * @param tblName Table name.
+     * @param idxName Index name.
+     * @param fields Fields.
+     */
+    protected static void assertIndex(IgniteEx node, String cacheName, String tblName, String idxName,
+        IgniteBiTuple<String, Boolean>... fields) {
+        assertIndexDescriptor(node, cacheName, tblName, idxName, fields);
+
+        if (affinityNode(node, cacheName)) {
+            QueryTypeDescriptorImpl typeDesc = typeExisting(node, cacheName, tblName);
+
+            assertIndex(typeDesc, idxName, fields);
+        }
+    }
+
+    /**
+     * Make sure index exists in cache descriptor.
+     *
+     * @param node Node.
+     * @param cacheName Cache name.
+     * @param tblName Table name.
+     * @param idxName Index name.
+     * @param fields Fields.
+     */
+    protected static void assertIndexDescriptor(IgniteEx node, String cacheName, String tblName, String idxName,
+        IgniteBiTuple<String, Boolean>... fields) {
+        awaitCompletion();
+
+        DynamicCacheDescriptor desc = node.context().cache().cacheDescriptor(cacheName);
+
+        assert desc != null;
+
+        for (QueryEntity entity : desc.schema().entities()) {
+            if (F.eq(tblName, QueryUtils.tableName(entity))) {
+                for (QueryIndex idx : entity.getIndexes()) {
+                    if (F.eq(QueryUtils.indexName(entity, idx), idxName)) {
+                        LinkedHashMap<String, Boolean> idxFields = idx.getFields();
+
+                        assertEquals(idxFields.size(), fields.length);
+
+                        int i = 0;
+
+                        for (String idxField : idxFields.keySet()) {
+                            assertEquals(idxField, fields[i].get1());
+                            assertEquals(idxFields.get(idxField), fields[i].get2());
+
+                            i++;
+                        }
+
+                        return;
+                    }
+                }
+            }
+        }
+
+        fail("Index not found [cacheName=" + cacheName + ", tlbName=" + tblName + ", idxName=" + idxName + ']');
+    }
+
+    /**
+     * Assert index state.
+     *
+     * @param typeDesc Type descriptor.
+     * @param idxName Index name.
+     * @param fields Fields (order is important).
+     */
+    protected static void assertIndex(QueryTypeDescriptorImpl typeDesc, String idxName,
+        IgniteBiTuple<String, Boolean>... fields) {
+        QueryIndexDescriptorImpl idxDesc = typeDesc.index(idxName);
+
+        assertNotNull(idxDesc);
+
+        assertEquals(idxName, idxDesc.name());
+        assertEquals(typeDesc, idxDesc.typeDescriptor());
+        assertEquals(QueryIndexType.SORTED, idxDesc.type());
+
+        List<String> fieldNames = new ArrayList<>(idxDesc.fields());
+
+        assertEquals(fields.length, fieldNames.size());
+
+        for (int i = 0; i < fields.length; i++) {
+            String expFieldName = fields[i].get1();
+            boolean expFieldAsc = fields[i].get2();
+
+            assertEquals("Index field mismatch [pos=" + i + ", expField=" + expFieldName +
+                ", actualField=" + fieldNames.get(i) + ']', expFieldName, fieldNames.get(i));
+
+            boolean fieldAsc = !idxDesc.descending(expFieldName);
+
+            assertEquals("Index field sort mismatch [pos=" + i + ", field=" + expFieldName +
+                ", expAsc=" + expFieldAsc + ", actualAsc=" + fieldAsc + ']', expFieldAsc, fieldAsc);
+        }
+    }
+
+    /**
+     * Assert index doesn't exist on all nodes.
+     *
+     * @param cacheName Cache name.
+     * @param tblName Table name.
+     * @param idxName Index name.
+     */
+    protected static void assertNoIndex(String cacheName, String tblName, String idxName) {
+        for (Ignite node : Ignition.allGrids())
+            assertNoIndex((IgniteEx)node, cacheName, tblName, idxName);
+    }
+
+    /**
+     * Assert index doesn't exist on particular node.
+     *
+     * @param node Node.
+     * @param cacheName Cache name.
+     * @param tblName Table name.
+     * @param idxName Index name.
+     */
+    protected static void assertNoIndex(IgniteEx node, String cacheName, String tblName, String idxName) {
+        assertNoIndexDescriptor(node, cacheName, tblName, idxName);
+
+        if (affinityNode(node, cacheName)) {
+            QueryTypeDescriptorImpl typeDesc = typeExisting(node, cacheName, tblName);
+
+            assertNoIndex(typeDesc, idxName);
+        }
+    }
+
+    /**
+     * Assert index doesn't exist in particular node's cache descriptor.
+     *
+     * @param node Node.
+     * @param cacheName Cache name.
+     * @param tblName Table name.
+     * @param idxName Index name.
+     */
+    protected static void assertNoIndexDescriptor(IgniteEx node, String cacheName, String tblName, String idxName) {
+        awaitCompletion();
+
+        DynamicCacheDescriptor desc = node.context().cache().cacheDescriptor(cacheName);
+
+        if (desc == null)
+            return;
+
+        for (QueryEntity entity : desc.schema().entities()) {
+            for (QueryIndex idx : entity.getIndexes()) {
+                if (F.eq(idxName, QueryUtils.indexName(entity, idx)))
+                    fail("Index exists: " + idxName);
+            }
+        }
+    }
+
+    /**
+     * Await completion (hopefully) of pending operations.
+     */
+    private static void awaitCompletion() {
+        try {
+            U.sleep(100);
+        }
+        catch (IgniteInterruptedCheckedException e) {
+            fail();
+        }
+    }
+
+    /**
+     * Assert index doesn't exist.
+     *
+     * @param typeDesc Type descriptor.
+     * @param idxName Index name.
+     */
+    protected static void assertNoIndex(QueryTypeDescriptorImpl typeDesc, String idxName) {
+        assertNull(typeDesc.index(idxName));
+    }
+
+    /**
+     * Check whether this is affinity node for cache.
+     *
+     * @param node Node.
+     * @param cacheName Cache name.
+     * @return {@code True} if affinity node.
+     */
+    private static boolean affinityNode(IgniteEx node, String cacheName) {
+        if (node.configuration().isClientMode())
+            return false;
+
+        DynamicCacheDescriptor cacheDesc = node.context().cache().cacheDescriptor(cacheName);
+
+        IgnitePredicate<ClusterNode> filter = cacheDesc.cacheConfiguration().getNodeFilter();
+
+        return filter == null || filter.apply(node.localNode());
+    }
+
+    /**
+     * Get table name for class.
+     *
+     * @param cls Class.
+     * @return Table name.
+     */
+    protected static String tableName(Class cls) {
+        return cls.getSimpleName();
+    }
+
+    /**
+     * Convenient method for index creation.
+     *
+     * @param name Name.
+     * @param fields Fields.
+     * @return Index.
+     */
+    protected static QueryIndex index(String name, IgniteBiTuple<String, Boolean>... fields) {
+        QueryIndex idx = new QueryIndex();
+
+        idx.setName(name);
+
+        LinkedHashMap<String, Boolean> fields0 = new LinkedHashMap<>();
+
+        for (IgniteBiTuple<String, Boolean> field : fields)
+            fields0.put(field.getKey(), field.getValue());
+
+        idx.setFields(fields0);
+
+        return idx;
+    }
+
+    /**
+     * Get query processor.
+     *
+     * @param node Node.
+     * @return Query processor.
+     */
+    protected static GridQueryProcessor queryProcessor(Ignite node) {
+        return ((IgniteEx)node).context().query();
+    }
+
+    /**
+     * Field for index state check (ascending).
+     *
+     * @param name Name.
+     * @return Field.
+     */
+    protected static IgniteBiTuple<String, Boolean> field(String name) {
+        return field(name, true);
+    }
+
+    /**
+     * Field for index state check.
+     *
+     * @param name Name.
+     * @param asc Ascending flag.
+     * @return Field.
+     */
+    protected static IgniteBiTuple<String, Boolean> field(String name, boolean asc) {
+        return F.t(name, asc);
+    }
+
+    /**
+     * @param fieldName Field name.
+     * @return Alias.
+     */
+    protected static String alias(String fieldName) {
+        return fieldName + "_alias";
+    }
+
+    /**
+     * Key class.
+     */
+    public static class KeyClass {
+        /** ID. */
+        @QuerySqlField
+        private long id;
+
+        /**
+         * Constructor.
+         *
+         * @param id ID.
+         */
+        public KeyClass(long id) {
+            this.id = id;
+        }
+
+        /**
+         * @return ID.
+         */
+        public long id() {
+            return id;
+        }
+
+        /** {@inheritDoc} */
+        @Override public boolean equals(Object o) {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+
+            KeyClass keyClass = (KeyClass) o;
+
+            return id == keyClass.id;
+
+        }
+
+        /** {@inheritDoc} */
+        @Override public int hashCode() {
+            return (int) (id ^ (id >>> 32));
+        }
+    }
+
+    /**
+     * Key class.
+     */
+    public static class ValueClass {
+        /** Field 1. */
+        @QuerySqlField
+        private String field1;
+
+        /**
+         * Constructor.
+         *
+         * @param field1 Field 1.
+         */
+        public ValueClass(String field1) {
+            this.field1 = field1;
+        }
+
+        /**
+         * @return Field 1
+         */
+        public String field1() {
+            return field1;
+        }
+    }
+
+    /**
+     * Key class.
+     */
+    public static class ValueClass2 {
+        /** Field 1. */
+        @QuerySqlField(name = "field1")
+        private String field;
+
+        /**
+         * Constructor.
+         *
+         * @param field Field 1.
+         */
+        public ValueClass2(String field) {
+            this.field = field;
+        }
+
+        /**
+         * @return Field 1
+         */
+        public String field() {
+            return field;
+        }
+    }
+
+    /**
+     * Runnable which can throw checked exceptions.
+     */
+    protected interface RunnableX {
+        /**
+         * Do run.
+         *
+         * @throws Exception If failed.
+         */
+        public void run() throws Exception;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractBasicSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractBasicSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractBasicSelfTest.java
new file mode 100644
index 0000000..6bc1576
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractBasicSelfTest.java
@@ -0,0 +1,950 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache.index;
+
+import org.apache.ignite.Ignite;
+import org.apache.ignite.Ignition;
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.cache.QueryIndex;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.configuration.NearCacheConfiguration;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.internal.processors.query.schema.SchemaOperationException;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static org.apache.ignite.cache.CacheAtomicityMode.ATOMIC;
+import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL;
+import static org.apache.ignite.cache.CacheMode.LOCAL;
+import static org.apache.ignite.cache.CacheMode.PARTITIONED;
+import static org.apache.ignite.cache.CacheMode.REPLICATED;
+
+/**
+ * Tests for dynamic index creation.
+ */
+@SuppressWarnings({"unchecked", "ThrowableResultOfMethodCallIgnored"})
+public abstract class DynamicIndexAbstractBasicSelfTest extends DynamicIndexAbstractSelfTest {
+    /** Node index for regular server (coordinator). */
+    protected static final int IDX_SRV_CRD = 0;
+
+    /** Node index for regular server (not coordinator). */
+    protected static final int IDX_SRV_NON_CRD = 1;
+
+    /** Node index for regular client. */
+    protected static final int IDX_CLI = 2;
+
+    /** Node index for server which doesn't pass node filter. */
+    protected static final int IDX_SRV_FILTERED = 3;
+
+    /** Node index for client with near-only cache. */
+    protected static final int IDX_CLI_NEAR_ONLY = 4;
+
+    /** {@inheritDoc} */
+    @Override protected void beforeTestsStarted() throws Exception {
+        super.beforeTestsStarted();
+
+        for (IgniteConfiguration cfg : configurations())
+            Ignition.start(cfg);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        node().destroyCache(CACHE_NAME);
+
+        super.afterTest();
+    }
+
+    /**
+     * Initialize cache for tests.
+     *
+     * @param mode Mode.
+     * @param atomicityMode Atomicity mode.
+     * @param near Near flag.
+     */
+    private void initialize(CacheMode mode, CacheAtomicityMode atomicityMode, boolean near) {
+        node().getOrCreateCache(cacheConfiguration(mode, atomicityMode, near));
+
+        grid(IDX_CLI_NEAR_ONLY).getOrCreateNearCache(CACHE_NAME, new NearCacheConfiguration<>());
+
+        assertNoIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1);
+
+        loadInitialData();
+    }
+
+    /**
+     * Create cache with the given cache mode and atomicity mode.
+     *
+     * @param mode Mode.
+     * @param atomicityMode Atomicity mode.
+     * @param near Whether near cache should be initialized.
+     * @return Cache configuration.
+     */
+    private CacheConfiguration<KeyClass, ValueClass> cacheConfiguration(CacheMode mode,
+        CacheAtomicityMode atomicityMode, boolean near) {
+        CacheConfiguration<KeyClass, ValueClass> ccfg = cacheConfiguration();
+
+        ccfg.setCacheMode(mode);
+        ccfg.setAtomicityMode(atomicityMode);
+
+        if (near)
+            ccfg.setNearConfiguration(new NearCacheConfiguration<KeyClass, ValueClass>());
+
+        return ccfg;
+    }
+
+    /**
+     * Load initial data.
+     */
+    private void loadInitialData() {
+        put(node(), 0, KEY_BEFORE);
+    }
+
+    /**
+     * Test simple index create for PARTITIONED ATOMIC cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreatePartitionedAtomic() throws Exception {
+        checkCreate(PARTITIONED, ATOMIC, false);
+    }
+
+    /**
+     * Test simple index create for PARTITIONED ATOMIC cache with near cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreatePartitionedAtomicNear() throws Exception {
+        checkCreate(PARTITIONED, ATOMIC, true);
+    }
+
+    /**
+     * Test simple index create for PARTITIONED TRANSACTIONAL cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreatePartitionedTransactional() throws Exception {
+        checkCreate(PARTITIONED, TRANSACTIONAL, false);
+    }
+
+    /**
+     * Test simple index create for PARTITIONED TRANSACTIONAL cache with near cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreatePartitionedTransactionalNear() throws Exception {
+        checkCreate(PARTITIONED, TRANSACTIONAL, true);
+    }
+
+    /**
+     * Test simple index create for REPLICATED ATOMIC cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateReplicatedAtomic() throws Exception {
+        checkCreate(REPLICATED, ATOMIC, false);
+    }
+
+    /**
+     * Test simple index create for REPLICATED TRANSACTIONAL cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateReplicatedTransactional() throws Exception {
+        checkCreate(REPLICATED, TRANSACTIONAL, false);
+    }
+
+    /**
+     * Check normal create operation.
+     *
+     * @param mode Mode.
+     * @param atomicityMode Atomicity mode.
+     * @param near Near flag.
+     * @throws Exception If failed.
+     */
+    private void checkCreate(CacheMode mode, CacheAtomicityMode atomicityMode, boolean near) throws Exception {
+        initialize(mode, atomicityMode, near);
+
+        final IgniteEx node = node();
+
+        final QueryIndex idx = index(IDX_NAME_1, field(FIELD_NAME_1));
+
+        queryProcessor(node).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, false).get();
+        assertIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1, field(FIELD_NAME_1));
+
+        assertSchemaException(new RunnableX() {
+            @Override public void run() throws Exception {
+                queryProcessor(node).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, false).get();
+            }
+        }, SchemaOperationException.CODE_INDEX_EXISTS);
+
+        queryProcessor(node).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, true).get();
+        assertIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1, field(FIELD_NAME_1));
+
+        assertSimpleIndexOperations(SQL_SIMPLE_FIELD_1);
+
+        assertIndexUsed(IDX_NAME_1, SQL_SIMPLE_FIELD_1, SQL_ARG_1);
+    }
+
+    /**
+     * Test composite index creation for PARTITIONED ATOMIC cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateCompositePartitionedAtomic() throws Exception {
+        checkCreateComposite(PARTITIONED, ATOMIC, false);
+    }
+
+    /**
+     * Test composite index creation for PARTITIONED ATOMIC cache with near cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateCompositePartitionedAtomicNear() throws Exception {
+        checkCreateComposite(PARTITIONED, ATOMIC, true);
+    }
+
+    /**
+     * Test composite index creation for PARTITIONED TRANSACTIONAL cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateCompositePartitionedTransactional() throws Exception {
+        checkCreateComposite(PARTITIONED, TRANSACTIONAL, false);
+    }
+
+    /**
+     * Test composite index creation for PARTITIONED TRANSACTIONAL cache with near cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateCompositePartitionedTransactionalNear() throws Exception {
+        checkCreateComposite(PARTITIONED, TRANSACTIONAL, true);
+    }
+
+    /**
+     * Test composite index creation for REPLICATED ATOMIC cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateCompositeReplicatedAtomic() throws Exception {
+        checkCreateComposite(REPLICATED, ATOMIC, false);
+    }
+
+    /**
+     * Test composite index creation for REPLICATED TRANSACTIONAL cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateCompositeReplicatedTransactional() throws Exception {
+        checkCreateComposite(REPLICATED, TRANSACTIONAL, false);
+    }
+
+    /**
+     * Check composite index creation.
+     *
+     * @param mode Mode.
+     * @param atomicityMode Atomicity mode.
+     * @param near Near flag.
+     * @throws Exception If failed.
+     */
+    private void checkCreateComposite(CacheMode mode, CacheAtomicityMode atomicityMode, boolean near) throws Exception {
+        initialize(mode, atomicityMode, near);
+
+        final QueryIndex idx = index(IDX_NAME_1, field(FIELD_NAME_1), field(alias(FIELD_NAME_2)));
+
+        queryProcessor(node()).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, false).get();
+        assertIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1, field(FIELD_NAME_1), field(alias(FIELD_NAME_2)));
+
+        assertCompositeIndexOperations(SQL_COMPOSITE);
+
+        assertIndexUsed(IDX_NAME_1, SQL_COMPOSITE, SQL_ARG_1, SQL_ARG_2);
+    }
+
+    /**
+     * Test create when cache doesn't exist for PARTITIONED ATOMIC cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateNoCachePartitionedAtomic() throws Exception {
+        checkCreateNotCache(PARTITIONED, ATOMIC, false);
+    }
+
+    /**
+     * Test create when cache doesn't exist for PARTITIONED ATOMIC cache with near cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateNoCachePartitionedAtomicNear() throws Exception {
+        checkCreateNotCache(PARTITIONED, ATOMIC, true);
+    }
+
+    /**
+     * Test create when cache doesn't exist for PARTITIONED TRANSACTIONAL cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateNoCachePartitionedTransactional() throws Exception {
+        checkCreateNotCache(PARTITIONED, TRANSACTIONAL, false);
+    }
+
+    /**
+     * Test create when cache doesn't exist for PARTITIONED TRANSACTIONAL cache with near cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateNoCachePartitionedTransactionalNear() throws Exception {
+        checkCreateNotCache(PARTITIONED, TRANSACTIONAL, true);
+    }
+
+    /**
+     * Test create when cache doesn't exist for REPLICATED ATOMIC cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateNoCacheReplicatedAtomic() throws Exception {
+        checkCreateNotCache(REPLICATED, ATOMIC, false);
+    }
+
+    /**
+     * Test create when cache doesn't exist for REPLICATED TRANSACTIONAL cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateNoCacheReplicatedTransactional() throws Exception {
+        checkCreateNotCache(REPLICATED, TRANSACTIONAL, false);
+    }
+
+    /**
+     * Check create when cache doesn't exist.
+     *
+     * @param mode Mode.
+     * @param atomicityMode Atomicity mode.
+     * @param near Near flag.
+     * @throws Exception If failed.
+     */
+    private void checkCreateNotCache(CacheMode mode, CacheAtomicityMode atomicityMode, boolean near) throws Exception {
+        initialize(mode, atomicityMode, near);
+
+        final QueryIndex idx = index(IDX_NAME_1, field(FIELD_NAME_1));
+
+        assertSchemaException(new RunnableX() {
+            @Override public void run() throws Exception {
+                queryProcessor(node()).dynamicIndexCreate(randomString(), TBL_NAME, idx, false).get();
+            }
+        }, SchemaOperationException.CODE_CACHE_NOT_FOUND);
+
+        assertNoIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1);
+    }
+
+    /**
+     * Test create when table doesn't exist for PARTITIONED ATOMIC cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateNoTablePartitionedAtomic() throws Exception {
+        checkCreateNoTable(PARTITIONED, ATOMIC, false);
+    }
+
+    /**
+     * Test create when table doesn't exist for PARTITIONED ATOMIC cache with near cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateNoTablePartitionedAtomicNear() throws Exception {
+        checkCreateNoTable(PARTITIONED, ATOMIC, true);
+    }
+
+    /**
+     * Test create when table doesn't exist for PARTITIONED TRANSACTIONAL cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateNoTablePartitionedTransactional() throws Exception {
+        checkCreateNoTable(PARTITIONED, TRANSACTIONAL, false);
+    }
+
+    /**
+     * Test create when table doesn't exist for PARTITIONED TRANSACTIONAL cache with near cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateNoTablePartitionedTransactionalNear() throws Exception {
+        checkCreateNoTable(PARTITIONED, TRANSACTIONAL, true);
+    }
+
+    /**
+     * Test create when table doesn't exist for REPLICATED ATOMIC cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateNoTableReplicatedAtomic() throws Exception {
+        checkCreateNoTable(REPLICATED, ATOMIC, false);
+    }
+
+    /**
+     * Test create when table doesn't exist for REPLICATED TRANSACTIONAL cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateNoTableReplicatedTransactional() throws Exception {
+        checkCreateNoTable(REPLICATED, TRANSACTIONAL, false);
+    }
+
+    /**
+     * Check create when table doesn't exist.
+     *
+     * @param mode Mode.
+     * @param atomicityMode Atomicity mode.
+     * @param near Near flag.
+     * @throws Exception If failed.
+     */
+    private void checkCreateNoTable(CacheMode mode, CacheAtomicityMode atomicityMode, boolean near) throws Exception {
+        initialize(mode, atomicityMode, near);
+
+        final QueryIndex idx = index(IDX_NAME_1, field(FIELD_NAME_1));
+
+        assertSchemaException(new RunnableX() {
+            @Override public void run() throws Exception {
+                queryProcessor(node()).dynamicIndexCreate(CACHE_NAME, randomString(), idx, false).get();
+            }
+        }, SchemaOperationException.CODE_TABLE_NOT_FOUND);
+
+        assertNoIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1);
+    }
+
+    /**
+     * Test create when table doesn't exist for PARTITIONED ATOMIC cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateNoColumnPartitionedAtomic() throws Exception {
+        checkCreateNoColumn(PARTITIONED, ATOMIC, false);
+    }
+
+    /**
+     * Test create when table doesn't exist for PARTITIONED ATOMIC cache with near cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateNoColumnPartitionedAtomicNear() throws Exception {
+        checkCreateNoColumn(PARTITIONED, ATOMIC, true);
+    }
+
+    /**
+     * Test create when table doesn't exist for PARTITIONED TRANSACTIONAL cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateNoColumnPartitionedTransactional() throws Exception {
+        checkCreateNoColumn(PARTITIONED, TRANSACTIONAL, false);
+    }
+
+    /**
+     * Test create when table doesn't exist for PARTITIONED TRANSACTIONAL cache with near cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateNoColumnPartitionedTransactionalNear() throws Exception {
+        checkCreateNoColumn(PARTITIONED, TRANSACTIONAL, true);
+    }
+
+    /**
+     * Test create when table doesn't exist for REPLICATED ATOMIC cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateNoColumnReplicatedAtomic() throws Exception {
+        checkCreateNoColumn(REPLICATED, ATOMIC, false);
+    }
+
+    /**
+     * Test create when table doesn't exist for REPLICATED TRANSACTIONAL cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateNoColumnReplicatedTransactional() throws Exception {
+        checkCreateNoColumn(REPLICATED, TRANSACTIONAL, false);
+    }
+
+    /**
+     * Check create when table doesn't exist.
+     *
+     * @param mode Mode.
+     * @param atomicityMode Atomicity mode.
+     * @param near Near flag.
+     * @throws Exception If failed.
+     */
+    private void checkCreateNoColumn(CacheMode mode, CacheAtomicityMode atomicityMode, boolean near) throws Exception {
+        initialize(mode, atomicityMode, near);
+
+        final QueryIndex idx = index(IDX_NAME_1, field(randomString()));
+
+        assertSchemaException(new RunnableX() {
+            @Override public void run() throws Exception {
+                queryProcessor(node()).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, false).get();
+            }
+        }, SchemaOperationException.CODE_COLUMN_NOT_FOUND);
+
+        assertNoIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1);
+    }
+
+    /**
+     * Test index creation on aliased column for PARTITIONED ATOMIC cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateColumnWithAliasPartitionedAtomic() throws Exception {
+        checkCreateColumnWithAlias(PARTITIONED, ATOMIC, false);
+    }
+
+    /**
+     * Test index creation on aliased column for PARTITIONED ATOMIC cache with near cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateColumnWithAliasPartitionedAtomicNear() throws Exception {
+        checkCreateColumnWithAlias(PARTITIONED, ATOMIC, true);
+    }
+
+    /**
+     * Test index creation on aliased column for PARTITIONED TRANSACTIONAL cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateColumnWithAliasPartitionedTransactional() throws Exception {
+        checkCreateColumnWithAlias(PARTITIONED, TRANSACTIONAL, false);
+    }
+
+    /**
+     * Test index creation on aliased column for PARTITIONED TRANSACTIONAL cache with near cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateColumnWithAliasPartitionedTransactionalNear() throws Exception {
+        checkCreateColumnWithAlias(PARTITIONED, TRANSACTIONAL, true);
+    }
+
+    /**
+     * Test index creation on aliased column for REPLICATED ATOMIC cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateColumnWithAliasReplicatedAtomic() throws Exception {
+        checkCreateColumnWithAlias(REPLICATED, ATOMIC, false);
+    }
+
+    /**
+     * Test index creation on aliased column for REPLICATED TRANSACTIONAL cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCreateColumnWithAliasReplicatedTransactional() throws Exception {
+        checkCreateColumnWithAlias(REPLICATED, TRANSACTIONAL, false);
+    }
+
+    /**
+     * Check index creation on aliased column.
+     *
+     * @param mode Mode.
+     * @param atomicityMode Atomicity mode.
+     * @param near Near flag.
+     * @throws Exception If failed.
+     */
+    private void checkCreateColumnWithAlias(CacheMode mode, CacheAtomicityMode atomicityMode, boolean near)
+        throws Exception {
+        initialize(mode, atomicityMode, near);
+
+        assertSchemaException(new RunnableX() {
+            @Override public void run() throws Exception {
+                QueryIndex idx = index(IDX_NAME_1, field(FIELD_NAME_2));
+
+                queryProcessor(node()).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, false).get();
+            }
+        }, SchemaOperationException.CODE_COLUMN_NOT_FOUND);
+
+        assertNoIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1);
+
+        QueryIndex idx = index(IDX_NAME_1, field(alias(FIELD_NAME_2)));
+
+        queryProcessor(node()).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, false).get();
+        assertIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1, field(alias(FIELD_NAME_2)));
+
+        assertSimpleIndexOperations(SQL_SIMPLE_FIELD_2);
+
+        assertIndexUsed(IDX_NAME_1, SQL_SIMPLE_FIELD_2, SQL_ARG_1);
+    }
+
+    /**
+     * Test simple index drop for PARTITIONED ATOMIC cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testDropPartitionedAtomic() throws Exception {
+        checkDrop(PARTITIONED, ATOMIC, false);
+    }
+
+    /**
+     * Test simple index drop for PARTITIONED ATOMIC cache with near cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testDropPartitionedAtomicNear() throws Exception {
+        checkDrop(PARTITIONED, ATOMIC, true);
+    }
+
+    /**
+     * Test simple index drop for PARTITIONED TRANSACTIONAL cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testDropPartitionedTransactional() throws Exception {
+        checkDrop(PARTITIONED, TRANSACTIONAL, false);
+    }
+
+    /**
+     * Test simple index drop for PARTITIONED TRANSACTIONAL cache with near cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testDropPartitionedTransactionalNear() throws Exception {
+        checkDrop(PARTITIONED, TRANSACTIONAL, true);
+    }
+
+    /**
+     * Test simple index drop for REPLICATED ATOMIC cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testDropReplicatedAtomic() throws Exception {
+        checkDrop(REPLICATED, ATOMIC, false);
+    }
+
+    /**
+     * Test simple index drop for REPLICATED TRANSACTIONAL cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testDropReplicatedTransactional() throws Exception {
+        checkDrop(REPLICATED, TRANSACTIONAL, false);
+    }
+
+    /**
+     * Check simple index drop.
+     *
+     * @param mode Mode.
+     * @param atomicityMode Atomicity mode.
+     * @param near Near flag.
+     * @throws Exception If failed.
+     */
+    public void checkDrop(CacheMode mode, CacheAtomicityMode atomicityMode, boolean near) throws Exception {
+        initialize(mode, atomicityMode, near);
+
+        QueryIndex idx = index(IDX_NAME_1, field(FIELD_NAME_1));
+
+        queryProcessor(node()).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, false).get();
+        assertIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1, field(FIELD_NAME_1));
+
+        assertIndexUsed(IDX_NAME_1, SQL_SIMPLE_FIELD_1, SQL_ARG_1);
+
+        assertSimpleIndexOperations(SQL_SIMPLE_FIELD_1);
+
+        loadInitialData();
+
+        queryProcessor(node()).dynamicIndexDrop(CACHE_NAME, IDX_NAME_1, false).get();
+        assertNoIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1);
+
+        assertSimpleIndexOperations(SQL_SIMPLE_FIELD_1);
+
+        assertIndexNotUsed(IDX_NAME_1, SQL_SIMPLE_FIELD_1, SQL_ARG_1);
+    }
+
+    /**
+     * Test drop when there is no index for PARTITIONED ATOMIC cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testDropNoIndexPartitionedAtomic() throws Exception {
+        checkDropNoIndex(PARTITIONED, ATOMIC, false);
+    }
+
+    /**
+     * Test drop when there is no index for PARTITIONED ATOMIC cache with near cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testDropNoIndexPartitionedAtomicNear() throws Exception {
+        checkDropNoIndex(PARTITIONED, ATOMIC, true);
+    }
+
+    /**
+     * Test drop when there is no index for PARTITIONED TRANSACTIONAL cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testDropNoIndexPartitionedTransactional() throws Exception {
+        checkDropNoIndex(PARTITIONED, TRANSACTIONAL, false);
+    }
+
+    /**
+     * Test drop when there is no index for PARTITIONED TRANSACTIONAL cache with near cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testDropNoIndexPartitionedTransactionalNear() throws Exception {
+        checkDropNoIndex(PARTITIONED, TRANSACTIONAL, true);
+    }
+
+    /**
+     * Test drop when there is no index for REPLICATED ATOMIC cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testDropNoIndexReplicatedAtomic() throws Exception {
+        checkDropNoIndex(REPLICATED, ATOMIC, false);
+    }
+
+    /**
+     * Test drop when there is no index for REPLICATED TRANSACTIONAL cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testDropNoIndexReplicatedTransactional() throws Exception {
+        checkDropNoIndex(REPLICATED, TRANSACTIONAL, false);
+    }
+
+    /**
+     * Check drop when there is no index.
+     *
+     * @param mode Mode.
+     * @param atomicityMode Atomicity mode.
+     * @param near Near flag.
+     * @throws Exception If failed.
+     */
+    private void checkDropNoIndex(CacheMode mode, CacheAtomicityMode atomicityMode, boolean near) throws Exception {
+        initialize(mode, atomicityMode, near);
+
+        assertSchemaException(new RunnableX() {
+            @Override public void run() throws Exception {
+                queryProcessor(node()).dynamicIndexDrop(CACHE_NAME, IDX_NAME_1, false).get();
+            }
+        }, SchemaOperationException.CODE_INDEX_NOT_FOUND);
+
+        queryProcessor(node()).dynamicIndexDrop(CACHE_NAME, IDX_NAME_1, true).get();
+        assertNoIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1);
+    }
+
+    /**
+     * Test drop when cache doesn't exist for PARTITIONED ATOMIC cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testDropNoCachePartitionedAtomic() throws Exception {
+        checkDropNoCache(PARTITIONED, ATOMIC, false);
+    }
+
+    /**
+     * Test drop when cache doesn't exist for PARTITIONED ATOMIC cache with near cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testDropNoCachePartitionedAtomicNear() throws Exception {
+        checkDropNoCache(PARTITIONED, ATOMIC, true);
+    }
+
+    /**
+     * Test drop when cache doesn't exist for PARTITIONED TRANSACTIONAL cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testDropNoCachePartitionedTransactional() throws Exception {
+        checkDropNoCache(PARTITIONED, TRANSACTIONAL, false);
+    }
+
+    /**
+     * Test drop when cache doesn't exist for PARTITIONED TRANSACTIONAL cache with near cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testDropNoCachePartitionedTransactionalNear() throws Exception {
+        checkDropNoCache(PARTITIONED, TRANSACTIONAL, true);
+    }
+
+    /**
+     * Test drop when cache doesn't exist for REPLICATED ATOMIC cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testDropNoCacheReplicatedAtomic() throws Exception {
+        checkDropNoCache(REPLICATED, ATOMIC, false);
+    }
+
+    /**
+     * Test drop when cache doesn't exist for REPLICATED TRANSACTIONAL cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testDropNoCacheReplicatedTransactional() throws Exception {
+        checkDropNoCache(REPLICATED, TRANSACTIONAL, false);
+    }
+
+    /**
+     * Check drop when cache doesn't exist.
+     *
+     * Check drop when there is no index.
+     *
+     * @param mode Mode.
+     * @param atomicityMode Atomicity mode.
+     * @param near Near flag.
+     * @throws Exception If failed.
+     */
+    private void checkDropNoCache(CacheMode mode, CacheAtomicityMode atomicityMode, boolean near) throws Exception {
+        initialize(mode, atomicityMode, near);
+
+        assertSchemaException(new RunnableX() {
+            @Override public void run() throws Exception {
+                queryProcessor(node()).dynamicIndexDrop(randomString(), "my_idx", false).get();
+            }
+        }, SchemaOperationException.CODE_CACHE_NOT_FOUND);
+
+        assertNoIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1);
+    }
+
+    /**
+     * Test that operations fail on LOCAL cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testFailOnLocalCache() throws Exception {
+        for (Ignite node : Ignition.allGrids()) {
+            if (!node.configuration().isClientMode())
+                node.getOrCreateCache(cacheConfiguration().setCacheMode(LOCAL));
+        }
+
+        final QueryIndex idx = index(IDX_NAME_1, field(FIELD_NAME_1));
+
+        assertSchemaException(new RunnableX() {
+            @Override public void run() throws Exception {
+                queryProcessor(node()).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, true).get();
+            }
+        }, SchemaOperationException.CODE_GENERIC);
+
+        assertNoIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1);
+
+        assertSchemaException(new RunnableX() {
+            @Override public void run() throws Exception {
+                queryProcessor(node()).dynamicIndexDrop(CACHE_NAME, IDX_NAME_1, true).get();
+            }
+        }, SchemaOperationException.CODE_GENERIC);
+    }
+
+    /**
+     * Get node which should be used to start operations.
+     *
+     * @return If failed.
+     */
+    protected IgniteEx node() {
+        return grid(nodeIndex());
+    }
+
+    /**
+     * Get index of the node which should be used to start operations.
+     *
+     * @return If failed.
+     */
+    protected abstract int nodeIndex();
+
+    /**
+     * Get configurations to be used in test.
+     *
+     * @return Configurations.
+     * @throws Exception If failed.
+     */
+    protected List<IgniteConfiguration> configurations() throws Exception {
+        return Arrays.asList(
+            serverCoordinatorConfiguration(IDX_SRV_CRD),
+            serverConfiguration(IDX_SRV_NON_CRD),
+            clientConfiguration(IDX_CLI),
+            serverConfiguration(IDX_SRV_FILTERED, true),
+            clientConfiguration(IDX_CLI_NEAR_ONLY)
+        );
+    }
+
+    /**
+     * Get server coordinator configuration.
+     *
+     * @param idx Index.
+     * @return Configuration.
+     * @throws Exception If failed.
+     */
+    protected IgniteConfiguration serverCoordinatorConfiguration(int idx) throws Exception {
+        return serverConfiguration(idx);
+    }
+
+    /**
+     * Assert FIELD_1 index usage.
+     *
+     * @param sql Simple SQL.
+     */
+    private void assertSimpleIndexOperations(String sql) {
+        for (Ignite node : Ignition.allGrids())
+            assertSqlSimpleData(node, sql, KEY_BEFORE - SQL_ARG_1);
+
+        put(node(), KEY_BEFORE, KEY_AFTER);
+
+        for (Ignite node : Ignition.allGrids())
+            assertSqlSimpleData(node, sql, KEY_AFTER - SQL_ARG_1);
+
+        remove(node(), 0, KEY_BEFORE);
+
+        for (Ignite node : Ignition.allGrids())
+            assertSqlSimpleData(node, sql, KEY_AFTER - KEY_BEFORE);
+
+        remove(node(), KEY_BEFORE, KEY_AFTER);
+
+        for (Ignite node : Ignition.allGrids())
+            assertSqlSimpleData(node, sql, 0);
+    }
+
+    /**
+     * Assert composite index usage.
+     *
+     * @param sql Simple SQL.
+     */
+    private void assertCompositeIndexOperations(String sql) {
+        for (Ignite node : Ignition.allGrids())
+            assertSqlCompositeData(node, sql, KEY_BEFORE - SQL_ARG_2);
+
+        put(node(), KEY_BEFORE, KEY_AFTER);
+
+        for (Ignite node : Ignition.allGrids())
+            assertSqlCompositeData(node, sql, KEY_AFTER - SQL_ARG_2);
+
+        remove(node(), 0, KEY_BEFORE);
+
+        for (Ignite node : Ignition.allGrids())
+            assertSqlCompositeData(node, sql, KEY_AFTER - KEY_BEFORE);
+
+        remove(node(), KEY_BEFORE, KEY_AFTER);
+
+        for (Ignite node : Ignition.allGrids())
+            assertSqlCompositeData(node, sql, 0);
+    }
+}


[29/70] [abbrv] ignite git commit: Merge branch 'master' into ignite-2.0

Posted by sb...@apache.org.
Merge branch 'master' into 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/9e7421f2
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/9e7421f2
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/9e7421f2

Branch: refs/heads/ignite-2893
Commit: 9e7421f261354b28119094b3b53b9490fd817b24
Parents: 8ea9f83 735ce60
Author: devozerov <vo...@gridgain.com>
Authored: Tue Apr 18 17:04:43 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Tue Apr 18 17:04:43 2017 +0300

----------------------------------------------------------------------
 .../store/cassandra/datasource/DataSource.java  | 50 ++++++++++++++------
 .../cassandra/session/CassandraSessionImpl.java | 23 +++++----
 .../cassandra/session/pool/SessionPool.java     |  6 +--
 .../cassandra/session/pool/SessionWrapper.java  | 15 +++---
 4 files changed, 62 insertions(+), 32 deletions(-)
----------------------------------------------------------------------



[61/70] [abbrv] ignite git commit: IGNITE-5027: Fixed issue with duplicate names on quto-generated indexes. This closes #1831.

Posted by sb...@apache.org.
IGNITE-5027: Fixed issue with duplicate names on quto-generated indexes. This closes #1831.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/1cd3cac5
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/1cd3cac5
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/1cd3cac5

Branch: refs/heads/ignite-2893
Commit: 1cd3cac534403172145481310b597b6175306222
Parents: 130b1fd
Author: devozerov <vo...@gridgain.com>
Authored: Wed Apr 19 19:44:30 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Wed Apr 19 19:44:30 2017 +0300

----------------------------------------------------------------------
 .../configuration/CacheConfiguration.java       | 17 ++--
 .../processors/query/GridQueryProcessor.java    | 10 +--
 .../query/h2/H2IndexingAbstractGeoSelfTest.java |  8 +-
 .../IgniteCacheAbstractFieldsQuerySelfTest.java | 10 ++-
 .../index/DuplicateKeyValueClassesSelfTest.java | 94 ++++++++++++++++++++
 .../IgniteCacheQuerySelfTestSuite.java          |  4 +
 6 files changed, 126 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/1cd3cac5/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java
index a2f7cc8..d378343 100644
--- a/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java
@@ -2145,7 +2145,7 @@ public class CacheConfiguration<K, V> extends MutableConfiguration<K, V> {
                     // properties override will happen properly (first parent, then children).
                     type.addProperty(prop, key, true);
 
-                    processAnnotation(key, sqlAnn, txtAnn, field.getType(), prop, type);
+                    processAnnotation(key, sqlAnn, txtAnn, cls, c, field.getType(), prop, type);
                 }
             }
 
@@ -2171,7 +2171,7 @@ public class CacheConfiguration<K, V> extends MutableConfiguration<K, V> {
                     // properties override will happen properly (first parent, then children).
                     type.addProperty(prop, key, true);
 
-                    processAnnotation(key, sqlAnn, txtAnn, mtd.getReturnType(), prop, type);
+                    processAnnotation(key, sqlAnn, txtAnn, cls, c, mtd.getReturnType(), prop, type);
                 }
             }
         }
@@ -2183,20 +2183,25 @@ public class CacheConfiguration<K, V> extends MutableConfiguration<K, V> {
      * @param key If given class relates to key.
      * @param sqlAnn SQL annotation, can be {@code null}.
      * @param txtAnn H2 text annotation, can be {@code null}.
-     * @param cls Class of field or return type for method.
+     * @param cls Entity class.
+     * @param curCls Current entity class.
+     * @param fldCls Class of field or return type for method.
      * @param prop Current property.
      * @param desc Class description.
      */
     private static void processAnnotation(boolean key, QuerySqlField sqlAnn, QueryTextField txtAnn,
-        Class<?> cls, ClassProperty prop, TypeDescriptor desc) {
+        Class<?> cls, Class<?> curCls, Class<?> fldCls, ClassProperty prop, TypeDescriptor desc) {
         if (sqlAnn != null) {
-            processAnnotationsInClass(key, cls, desc, prop);
+            processAnnotationsInClass(key, fldCls, desc, prop);
 
             if (!sqlAnn.name().isEmpty())
                 prop.alias(sqlAnn.name());
 
             if (sqlAnn.index()) {
-                String idxName = prop.alias() + "_idx";
+                String idxName = curCls.getSimpleName() + "_" + prop.alias() + "_idx";
+
+                if (cls != curCls)
+                    idxName = cls.getSimpleName() + "_" + idxName;
 
                 desc.addIndex(idxName, QueryUtils.isGeometryClass(prop.type()) ?
                     QueryIndexType.GEOSPATIAL : QueryIndexType.SORTED);

http://git-wip-us.apache.org/repos/asf/ignite/blob/1cd3cac5/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
index ceb139a..8381882 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
@@ -685,15 +685,15 @@ public class GridQueryProcessor extends GridProcessorAdapter {
             QueryTypeDescriptorImpl oldDesc = tblTypMap.put(desc.tableName(), desc);
 
             if (oldDesc != null)
-                throw new IgniteException("Duplicate table name [tblName=" + desc.tableName() +
-                    ", type1=" + desc.name() + ", type2=" + oldDesc.name() + ']');
+                throw new IgniteException("Duplicate table name [cache=" + space +
+                    ", tblName=" + desc.tableName() + ", type1=" + desc.name() + ", type2=" + oldDesc.name() + ']');
 
             for (String idxName : desc.indexes().keySet()) {
                 oldDesc = idxTypMap.put(idxName, desc);
 
                 if (oldDesc != null)
-                    throw new IgniteException("Duplicate index name [idxName=" + idxName +
-                        ", type1=" + desc.name() + ", type2=" + oldDesc.name() + ']');
+                    throw new IgniteException("Duplicate index name [cache=" + space +
+                        ", idxName=" + idxName + ", type1=" + desc.name() + ", type2=" + oldDesc.name() + ']');
             }
         }
 
@@ -1290,7 +1290,7 @@ public class GridQueryProcessor extends GridProcessorAdapter {
                         QueryIndexDescriptorImpl oldIdx = idxs.putIfAbsent(idxKey, idx);
 
                         if (oldIdx != null) {
-                            throw new IgniteException("Duplicate index name [space=" + space +
+                            throw new IgniteException("Duplicate index name [cache=" + space +
                                 ", idxName=" + idx.name() + ", existingTable=" + oldIdx.typeDescriptor().tableName() +
                                 ", table=" + desc.tableName() + ']');
                         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/1cd3cac5/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingAbstractGeoSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingAbstractGeoSelfTest.java b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingAbstractGeoSelfTest.java
index 914bb62..80e9f93 100644
--- a/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingAbstractGeoSelfTest.java
+++ b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingAbstractGeoSelfTest.java
@@ -179,7 +179,7 @@ public abstract class H2IndexingAbstractGeoSelfTest extends GridCacheAbstractSel
         GridStringBuilder sb = new SB("CREATE ")
             .a(spatial ? "SPATIAL " : "")
             .a("INDEX ")
-            .a(idx.getName())
+            .a("\"" + idx.getName() + "\"")
             .a(" ON ")
             .a(QueryUtils.tableName(entity))
             .a(" (");
@@ -333,7 +333,7 @@ public abstract class H2IndexingAbstractGeoSelfTest extends GridCacheAbstractSel
             assertTrue("__ explain: " + plan, plan.contains("coords_idx"));
 
             if (dynamic)
-                cache.query(new SqlFieldsQuery("DROP INDEX coords_idx")).getAll();
+                cache.query(new SqlFieldsQuery("DROP INDEX \"EnemyCamp_coords_idx\"")).getAll();
         }
         finally {
             cache.destroy();
@@ -582,8 +582,8 @@ public abstract class H2IndexingAbstractGeoSelfTest extends GridCacheAbstractSel
             }
         }
 
-        final SqlFieldsQuery query = new SqlFieldsQuery("select e._val, c._val from \"enemy\".Enemy e, \"camp\".EnemyCamp c " +
-            "where e.campId = c._key and c.coords && ?").setArgs(lethalArea);
+        final SqlFieldsQuery query = new SqlFieldsQuery("select e._val, c._val from \"enemy\".Enemy e, " +
+            "\"camp\".EnemyCamp c where e.campId = c._key and c.coords && ?").setArgs(lethalArea);
 
         List<List<?>> result = c1.query(query.setDistributedJoins(true)).getAll();
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/1cd3cac5/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractFieldsQuerySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractFieldsQuerySelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractFieldsQuerySelfTest.java
index b40dd78..8c8828d 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractFieldsQuerySelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractFieldsQuerySelfTest.java
@@ -26,6 +26,7 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.Callable;
 import javax.cache.CacheException;
@@ -270,6 +271,8 @@ public abstract class IgniteCacheAbstractFieldsQuerySelfTest extends GridCommonA
                     assertNotNull("Indexes should be defined", indexes);
                     assertEquals(2, indexes.size());
 
+                    Set<String> idxFields = new HashSet<>();
+
                     Iterator<GridCacheSqlIndexMetadata> it = indexes.iterator();
 
                     Collection<String> indFlds = it.next().fields();
@@ -279,7 +282,7 @@ public abstract class IgniteCacheAbstractFieldsQuerySelfTest extends GridCommonA
 
                     Iterator<String> indFldIt = indFlds.iterator();
 
-                    assertEquals(indFldIt.next(), "AGE");
+                    idxFields.add(indFldIt.next());
 
                     indFlds = it.next().fields();
 
@@ -288,7 +291,10 @@ public abstract class IgniteCacheAbstractFieldsQuerySelfTest extends GridCommonA
 
                     indFldIt = indFlds.iterator();
 
-                    assertEquals(indFldIt.next(), "ORGID");
+                    idxFields.add(indFldIt.next());
+
+                    assertTrue(idxFields.contains("AGE"));
+                    assertTrue(idxFields.contains("ORGID"));
                 }
                 else if (orgCache.getName().equals(meta.cacheName())) {
                     assertEquals("Invalid types size", 1, types.size());

http://git-wip-us.apache.org/repos/asf/ignite/blob/1cd3cac5/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DuplicateKeyValueClassesSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DuplicateKeyValueClassesSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DuplicateKeyValueClassesSelfTest.java
new file mode 100644
index 0000000..4ee884f
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DuplicateKeyValueClassesSelfTest.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache.index;
+
+import org.apache.ignite.cache.query.annotations.QuerySqlField;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+
+import java.util.UUID;
+
+/**
+ * Make sure that cache can start with multiple key-value classes of the same type.
+ */
+@SuppressWarnings("unchecked")
+public class DuplicateKeyValueClassesSelfTest extends GridCommonAbstractTest {
+    /** Cache name. */
+    private static final String CACHE_NAME = "cache";
+
+    /** {@inheritDoc} */
+    @Override protected void beforeTestsStarted() throws Exception {
+        super.beforeTestsStarted();
+
+        startGrid(0);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        grid(0).destroyCache(CACHE_NAME);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTestsStopped() throws Exception {
+        stopAllGrids();
+    }
+
+    /**
+     * Test duplicate key class.
+     *
+     * @throws Exception If failed.
+     */
+    public void testDuplicateKeyClass() throws Exception {
+        CacheConfiguration ccfg = new CacheConfiguration()
+            .setName(CACHE_NAME)
+            .setIndexedTypes(UUID.class, Clazz1.class, UUID.class, Clazz2.class);
+
+        grid(0).createCache(ccfg);
+    }
+
+    /**
+     * Test duplicate value class.
+     *
+     * @throws Exception If failed.
+     */
+    public void testDuplicateValueClass() throws Exception {
+        CacheConfiguration ccfg = new CacheConfiguration()
+            .setName(CACHE_NAME)
+            .setIndexedTypes(UUID.class, Clazz1.class, String.class, Clazz1.class);
+
+        grid(0).createCache(ccfg);
+    }
+
+    /**
+     * Class 1.
+     */
+    private static class Clazz1 {
+        /** ID. */
+        @QuerySqlField(index = true)
+        int id;
+    }
+
+    /**
+     * Class 2.
+     */
+    private static class Clazz2 {
+        /** ID. */
+        @QuerySqlField(index = true)
+        int id;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/1cd3cac5/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java
index b61affe..405e1f6 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java
@@ -81,6 +81,7 @@ import org.apache.ignite.internal.processors.cache.distributed.replicated.Ignite
 import org.apache.ignite.internal.processors.cache.distributed.replicated.IgniteCacheReplicatedFieldsQuerySelfTest;
 import org.apache.ignite.internal.processors.cache.distributed.replicated.IgniteCacheReplicatedQueryP2PDisabledSelfTest;
 import org.apache.ignite.internal.processors.cache.distributed.replicated.IgniteCacheReplicatedQuerySelfTest;
+import org.apache.ignite.internal.processors.cache.index.DuplicateKeyValueClassesSelfTest;
 import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexAtomicPartitionedNearSelfTest;
 import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexAtomicPartitionedSelfTest;
 import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexAtomicReplicatedSelfTest;
@@ -128,6 +129,9 @@ public class IgniteCacheQuerySelfTestSuite extends TestSuite {
     public static TestSuite suite() throws Exception {
         IgniteTestSuite suite = new IgniteTestSuite("Ignite Cache Queries Test Suite");
 
+        // Misc tests.
+        suite.addTest(new TestSuite(DuplicateKeyValueClassesSelfTest.class));
+
         // Dynamic index create/drop tests.
         suite.addTest(new TestSuite(SchemaExchangeSelfTest.class));
 


[34/70] [abbrv] ignite git commit: IGNITE-4565: Implemented CREATE INDEX and DROP INDEX. This closes #1773. This closes #1804.

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java
index 7677d0d..119a389 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java
@@ -23,7 +23,10 @@ import org.apache.ignite.internal.util.tostring.GridToStringExclude;
 import org.apache.ignite.internal.util.tostring.GridToStringInclude;
 import org.apache.ignite.internal.util.typedef.internal.A;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.jetbrains.annotations.Nullable;
 
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
@@ -33,6 +36,9 @@ import java.util.Map;
  * Descriptor of type.
  */
 public class QueryTypeDescriptorImpl implements GridQueryTypeDescriptor {
+    /** Space. */
+    private final String space;
+
     /** */
     private String name;
 
@@ -50,9 +56,15 @@ public class QueryTypeDescriptorImpl implements GridQueryTypeDescriptor {
     /** Map with upper cased property names to help find properties based on SQL INSERT and MERGE queries. */
     private final Map<String, GridQueryProperty> uppercaseProps = new HashMap<>();
 
+    /** Mutex for operations on indexes. */
+    private final Object idxMux = new Object();
+
     /** */
     @GridToStringInclude
-    private final Map<String, QueryIndexDescriptorImpl> indexes = new HashMap<>();
+    private final Map<String, QueryIndexDescriptorImpl> idxs = new HashMap<>();
+
+    /** Aliases. */
+    private Map<String, String> aliases;
 
     /** */
     private QueryIndexDescriptorImpl fullTextIdx;
@@ -78,6 +90,25 @@ public class QueryTypeDescriptorImpl implements GridQueryTypeDescriptor {
     /** */
     private String affKey;
 
+    /** Obsolete. */
+    private volatile boolean obsolete;
+
+    /**
+     * Constructor.
+     *
+     * @param space Cache name.
+     */
+    public QueryTypeDescriptorImpl(String space) {
+        this.space = space;
+    }
+
+    /**
+     * @return Space.
+     */
+    public String space() {
+        return space;
+    }
+
     /** {@inheritDoc} */
     @Override public String name() {
         return name;
@@ -97,7 +128,7 @@ public class QueryTypeDescriptorImpl implements GridQueryTypeDescriptor {
      * @return Table name.
      */
     @Override public String tableName() {
-        return tblName;
+        return tblName != null ? tblName : name;
     }
 
     /**
@@ -160,7 +191,9 @@ public class QueryTypeDescriptorImpl implements GridQueryTypeDescriptor {
 
     /** {@inheritDoc} */
     @Override public Map<String, GridQueryIndexDescriptor> indexes() {
-        return Collections.<String, GridQueryIndexDescriptor>unmodifiableMap(indexes);
+        synchronized (idxMux) {
+            return Collections.<String, GridQueryIndexDescriptor>unmodifiableMap(idxs);
+        }
     }
 
     /** {@inheritDoc} */
@@ -176,59 +209,74 @@ public class QueryTypeDescriptorImpl implements GridQueryTypeDescriptor {
     }
 
     /**
-     * Adds index.
+     * Get index by name.
      *
-     * @param idxName Index name.
-     * @param type Index type.
-     * @param inlineSize Inline size.
-     * @return Index descriptor.
-     * @throws IgniteCheckedException In case of error.
+     * @param name Name.
+     * @return Index.
      */
-    public QueryIndexDescriptorImpl addIndex(String idxName, QueryIndexType type, int inlineSize) throws IgniteCheckedException {
-        QueryIndexDescriptorImpl idx = new QueryIndexDescriptorImpl(type, inlineSize);
+    @Nullable public QueryIndexDescriptorImpl index(String name) {
+        synchronized (idxMux) {
+            return idxs.get(name);
+        }
+    }
 
-        if (indexes.put(idxName, idx) != null)
-            throw new IgniteCheckedException("Index with name '" + idxName + "' already exists.");
+    /**
+     * @return Raw index descriptors.
+     */
+    public Collection<QueryIndexDescriptorImpl> indexes0() {
+        synchronized (idxMux) {
+            return new ArrayList<>(idxs.values());
+        }
+    }
 
-        return idx;
+    /** {@inheritDoc} */
+    @Override public GridQueryIndexDescriptor textIndex() {
+        return fullTextIdx;
     }
 
     /**
-     * Adds field to index.
+     * Add index.
      *
-     * @param idxName Index name.
-     * @param field Field name.
-     * @param orderNum Fields order number in index.
-     * @param inlineSize Inline size.
-     * @param descending Sorting order.
+     * @param idx Index.
      * @throws IgniteCheckedException If failed.
      */
-    public void addFieldToIndex(
-        String idxName,
-        String field,
-        int orderNum,
-        int inlineSize,
-        boolean descending
-    ) throws IgniteCheckedException {
-        QueryIndexDescriptorImpl desc = indexes.get(idxName);
+    public void addIndex(QueryIndexDescriptorImpl idx) throws IgniteCheckedException {
+        synchronized (idxMux) {
+            if (idxs.put(idx.name(), idx) != null)
+                throw new IgniteCheckedException("Index with name '" + idx.name() + "' already exists.");
+        }
+    }
 
-        if (desc == null)
-            desc = addIndex(idxName, QueryIndexType.SORTED, inlineSize);
+    /**
+     * Drop index.
+     *
+     * @param idxName Index name.
+     */
+    public void dropIndex(String idxName) {
+        synchronized (idxMux) {
+            idxs.remove(idxName);
+        }
+    }
 
-        desc.addField(field, orderNum, descending);
+    /**
+     * Chedk if particular field exists.
+     *
+     * @param field Field.
+     * @return {@code True} if exists.
+     */
+    public boolean hasField(String field) {
+        return props.containsKey(field) || QueryUtils._VAL.equalsIgnoreCase(field);
     }
 
     /**
      * Adds field to text index.
      *
      * @param field Field name.
+     * @throws IgniteCheckedException If failed.
      */
-    public void addFieldToTextIndex(String field) {
-        if (fullTextIdx == null) {
-            fullTextIdx = new QueryIndexDescriptorImpl(QueryIndexType.FULLTEXT, 0);
-
-            indexes.put(null, fullTextIdx);
-        }
+    public void addFieldToTextIndex(String field) throws IgniteCheckedException {
+        if (fullTextIdx == null)
+            fullTextIdx = new QueryIndexDescriptorImpl(this, null, QueryIndexType.FULLTEXT, 0);
 
         fullTextIdx.addField(field, 0, false);
     }
@@ -335,6 +383,34 @@ public class QueryTypeDescriptorImpl implements GridQueryTypeDescriptor {
         this.affKey = affKey;
     }
 
+    /**
+     * @return Aliases.
+     */
+    public Map<String, String> aliases() {
+        return aliases != null ? aliases : Collections.<String, String>emptyMap();
+    }
+
+    /**
+     * @param aliases Aliases.
+     */
+    public void aliases(Map<String, String> aliases) {
+        this.aliases = aliases;
+    }
+
+    /**
+     * @return {@code True} if obsolete.
+     */
+    public boolean obsolete() {
+        return obsolete;
+    }
+
+    /**
+     * Mark index as obsolete.
+     */
+    public void markObsolete() {
+        obsolete = true;
+    }
+
     /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(QueryTypeDescriptorImpl.class, this);

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java
index f00cbd6..3a7437b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java
@@ -29,6 +29,7 @@ import org.apache.ignite.internal.processors.cache.CacheObjectContext;
 import org.apache.ignite.internal.processors.cache.GridCacheContext;
 import org.apache.ignite.internal.processors.cache.GridCacheDefaultAffinityKeyMapper;
 import org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl;
+import org.apache.ignite.internal.processors.query.schema.SchemaOperationException;
 import org.apache.ignite.internal.processors.query.property.QueryBinaryProperty;
 import org.apache.ignite.internal.processors.query.property.QueryClassProperty;
 import org.apache.ignite.internal.processors.query.property.QueryFieldAccessor;
@@ -44,7 +45,6 @@ import java.lang.reflect.Method;
 import java.math.BigDecimal;
 import java.sql.Time;
 import java.sql.Timestamp;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -52,6 +52,9 @@ import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 
+import static org.apache.ignite.IgniteSystemProperties.IGNITE_INDEXING_DISCOVERY_HISTORY_SIZE;
+import static org.apache.ignite.IgniteSystemProperties.getInteger;
+
 /**
  * Utility methods for queries.
  */
@@ -59,6 +62,9 @@ public class QueryUtils {
     /** */
     public static final String _VAL = "_val";
 
+    /** Discovery history size. */
+    private static final int DISCO_HIST_SIZE = getInteger(IGNITE_INDEXING_DISCOVERY_HISTORY_SIZE, 1000);
+
     /** */
     private static final Class<?> GEOMETRY_CLASS = U.classForName("com.vividsolutions.jts.geom.Geometry", null);
 
@@ -82,6 +88,69 @@ public class QueryUtils {
     ));
 
     /**
+     * Get table name for entity.
+     *
+     * @param entity Entity.
+     * @return Table name.
+     */
+    public static String tableName(QueryEntity entity) {
+        String res = entity.getTableName();
+
+        if (res == null)
+            res = typeName(entity.getValueType());
+
+        return res;
+    }
+
+    /**
+     * Get index name.
+     *
+     * @param entity Query entity.
+     * @param idx Index.
+     * @return Index name.
+     */
+    public static String indexName(QueryEntity entity, QueryIndex idx) {
+        return indexName(tableName(entity), idx);
+    }
+
+    /**
+     * Get index name.
+     *
+     * @param tblName Table name.
+     * @param idx Index.
+     * @return Index name.
+     */
+    public static String indexName(String tblName, QueryIndex idx) {
+        String res = idx.getName();
+
+        if (res == null) {
+            StringBuilder idxName = new StringBuilder(tblName + "_");
+
+            for (Map.Entry<String, Boolean> field : idx.getFields().entrySet()) {
+                idxName.append(field.getKey());
+
+                idxName.append('_');
+                idxName.append(field.getValue() ? "asc_" : "desc_");
+            }
+
+            for (int i = 0; i < idxName.length(); i++) {
+                char ch = idxName.charAt(i);
+
+                if (Character.isWhitespace(ch))
+                    idxName.setCharAt(i, '_');
+                else
+                    idxName.setCharAt(i, Character.toLowerCase(ch));
+            }
+
+            idxName.append("idx");
+
+            return idxName.toString();
+        }
+
+        return res;
+    }
+
+    /**
      * Create type candidate for query entity.
      *
      * @param space Space.
@@ -103,7 +172,9 @@ public class QueryUtils {
 
         CacheObjectContext coCtx = binaryEnabled ? ctx.cacheObjects().contextForCache(ccfg) : null;
 
-        QueryTypeDescriptorImpl desc = new QueryTypeDescriptorImpl();
+        QueryTypeDescriptorImpl desc = new QueryTypeDescriptorImpl(space);
+
+        desc.aliases(qryEntity.getAliases());
 
         // Key and value classes still can be available if they are primitive or JDK part.
         // We need that to set correct types for _key and _val columns.
@@ -206,11 +277,6 @@ public class QueryUtils {
      */
     public static void processBinaryMeta(GridKernalContext ctx, QueryEntity qryEntity, QueryTypeDescriptorImpl d)
         throws IgniteCheckedException {
-        Map<String,String> aliases = qryEntity.getAliases();
-
-        if (aliases == null)
-            aliases = Collections.emptyMap();
-
         Set<String> keyFields = qryEntity.getKeyFields();
 
         // We have to distinguish between empty and null keyFields when the key is not of SQL type -
@@ -239,7 +305,7 @@ public class QueryUtils {
                 isKeyField = (hasKeyFields ? keyFields.contains(entry.getKey()) : null);
 
             QueryBinaryProperty prop = buildBinaryProperty(ctx, entry.getKey(),
-                U.classForName(entry.getValue(), Object.class, true), aliases, isKeyField);
+                U.classForName(entry.getValue(), Object.class, true), d.aliases(), isKeyField);
 
             d.addProperty(prop, false);
         }
@@ -256,18 +322,13 @@ public class QueryUtils {
      */
     public static void processClassMeta(QueryEntity qryEntity, QueryTypeDescriptorImpl d, CacheObjectContext coCtx)
         throws IgniteCheckedException {
-        Map<String,String> aliases = qryEntity.getAliases();
-
-        if (aliases == null)
-            aliases = Collections.emptyMap();
-
         for (Map.Entry<String, String> entry : qryEntity.getFields().entrySet()) {
             QueryClassProperty prop = buildClassProperty(
                 d.keyClass(),
                 d.valueClass(),
                 entry.getKey(),
                 U.classForName(entry.getValue(), Object.class),
-                aliases,
+                d.aliases(),
                 coCtx);
 
             d.addProperty(prop, false);
@@ -275,7 +336,7 @@ public class QueryUtils {
 
         processIndexes(qryEntity, d);
     }
-    
+
     /**
      * Processes indexes based on query entity.
      *
@@ -285,53 +346,90 @@ public class QueryUtils {
      */
     private static void processIndexes(QueryEntity qryEntity, QueryTypeDescriptorImpl d) throws IgniteCheckedException {
         if (!F.isEmpty(qryEntity.getIndexes())) {
-            Map<String, String> aliases = qryEntity.getAliases();
+            for (QueryIndex idx : qryEntity.getIndexes())
+                processIndex(idx, d);
+        }
+    }
 
-            if (aliases == null)
-                aliases = Collections.emptyMap();
+    /**
+     * Process dynamic index change.
+     *
+     * @param idx Index.
+     * @param d Type descriptor to populate.
+     * @throws IgniteCheckedException If failed to build index information.
+     */
+    public static void processDynamicIndexChange(String idxName, @Nullable QueryIndex idx, QueryTypeDescriptorImpl d)
+        throws IgniteCheckedException {
+        d.dropIndex(idxName);
 
-            for (QueryIndex idx : qryEntity.getIndexes()) {
-                String idxName = idx.getName();
+        if (idx != null)
+            processIndex(idx, d);
+    }
 
-                if (idxName == null)
-                    idxName = QueryEntity.defaultIndexName(idx);
+    /**
+     * Create index descriptor.
+     *
+     * @param typeDesc Type descriptor.
+     * @param idx Index.
+     * @return Index descriptor.
+     * @throws IgniteCheckedException If failed.
+     */
+    public static QueryIndexDescriptorImpl createIndexDescriptor(QueryTypeDescriptorImpl typeDesc, QueryIndex idx)
+        throws IgniteCheckedException {
+        String idxName = indexName(typeDesc.tableName(), idx);
+        QueryIndexType idxTyp = idx.getIndexType();
 
-                QueryIndexType idxTyp = idx.getIndexType();
+        assert idxTyp == QueryIndexType.SORTED || idxTyp == QueryIndexType.GEOSPATIAL;
 
-                if (idxTyp == QueryIndexType.SORTED || idxTyp == QueryIndexType.GEOSPATIAL) {
-                    d.addIndex(idxName, idxTyp, idx.getInlineSize());
+        QueryIndexDescriptorImpl res = new QueryIndexDescriptorImpl(typeDesc, idxName, idxTyp, idx.getInlineSize());
 
-                    int i = 0;
+        int i = 0;
 
-                    for (Map.Entry<String, Boolean> entry : idx.getFields().entrySet()) {
-                        String field = entry.getKey();
-                        boolean asc = entry.getValue();
+        for (Map.Entry<String, Boolean> entry : idx.getFields().entrySet()) {
+            String field = entry.getKey();
+            boolean asc = entry.getValue();
 
-                        String alias = aliases.get(field);
+            String alias = typeDesc.aliases().get(field);
 
-                        if (alias != null)
-                            field = alias;
+            if (alias != null)
+                field = alias;
 
-                        d.addFieldToIndex(idxName, field, i++, idx.getInlineSize(), !asc);
-                    }
-                }
-                else if (idxTyp == QueryIndexType.FULLTEXT){
-                    for (String field : idx.getFields().keySet()) {
-                        String alias = aliases.get(field);
+            res.addField(field, i++, !asc);
+        }
 
-                        if (alias != null)
-                            field = alias;
+        return res;
+    }
 
-                        d.addFieldToTextIndex(field);
-                    }
-                }
-                else if (idxTyp != null)
-                    throw new IllegalArgumentException("Unsupported index type [idx=" + idx.getName() +
-                        ", typ=" + idxTyp + ']');
-                else
-                    throw new IllegalArgumentException("Index type is not set: " + idx.getName());
+    /**
+     * Process single index.
+     *
+     * @param idx Index.
+     * @param d Type descriptor to populate.
+     * @throws IgniteCheckedException If failed to build index information.
+     */
+    private static void processIndex(QueryIndex idx, QueryTypeDescriptorImpl d) throws IgniteCheckedException {
+        QueryIndexType idxTyp = idx.getIndexType();
+
+        if (idxTyp == QueryIndexType.SORTED || idxTyp == QueryIndexType.GEOSPATIAL) {
+            QueryIndexDescriptorImpl idxDesc = createIndexDescriptor(d, idx);
+
+            d.addIndex(idxDesc);
+        }
+        else if (idxTyp == QueryIndexType.FULLTEXT){
+            for (String field : idx.getFields().keySet()) {
+                String alias = d.aliases().get(field);
+
+                if (alias != null)
+                    field = alias;
+
+                d.addFieldToTextIndex(field);
             }
         }
+        else if (idxTyp != null)
+            throw new IllegalArgumentException("Unsupported index type [idx=" + idx.getName() +
+                ", typ=" + idxTyp + ']');
+        else
+            throw new IllegalArgumentException("Index type is not set: " + idx.getName());
     }
     
     /**
@@ -674,6 +772,31 @@ public class QueryUtils {
     }
 
     /**
+     * Discovery history size.
+     *
+     * @return Discovery history size.
+     */
+    public static int discoveryHistorySize() {
+        return DISCO_HIST_SIZE;
+    }
+
+    /**
+     * Wrap schema exception if needed.
+     *
+     * @param e Original exception.
+     * @return Schema exception.
+     */
+    @Nullable public static SchemaOperationException wrapIfNeeded(@Nullable Exception e) {
+        if (e == null)
+            return null;
+
+        if (e instanceof SchemaOperationException)
+            return (SchemaOperationException)e;
+
+        return new SchemaOperationException("Unexpected exception.", e);
+    }
+
+    /**
      * Private constructor.
      */
     private QueryUtils() {

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaExchangeWorkerTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaExchangeWorkerTask.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaExchangeWorkerTask.java
new file mode 100644
index 0000000..f97f931
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaExchangeWorkerTask.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.internal.processors.query.schema;
+
+import org.apache.ignite.internal.processors.cache.CachePartitionExchangeWorkerTask;
+import org.apache.ignite.internal.processors.query.schema.message.SchemaAbstractDiscoveryMessage;
+import org.apache.ignite.internal.util.typedef.internal.S;
+
+/**
+ * Cache schema change task for exchange worker.
+ */
+public class SchemaExchangeWorkerTask implements CachePartitionExchangeWorkerTask {
+    /** Message. */
+    private final SchemaAbstractDiscoveryMessage msg;
+
+    /**
+     * Constructor.
+     *
+     * @param msg Message.
+     */
+    public SchemaExchangeWorkerTask(SchemaAbstractDiscoveryMessage msg) {
+        assert msg != null;
+
+        this.msg = msg;
+    }
+
+    /**
+     * @return Message.
+     */
+    public SchemaAbstractDiscoveryMessage message() {
+        return msg;
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(SchemaExchangeWorkerTask.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaIndexCacheVisitor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaIndexCacheVisitor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaIndexCacheVisitor.java
new file mode 100644
index 0000000..3321e66
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaIndexCacheVisitor.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.internal.processors.query.schema;
+
+import org.apache.ignite.IgniteCheckedException;
+
+/**
+ * Closure that internally applies given {@link SchemaIndexCacheVisitorClosure} to some set of entries.
+ */
+public interface SchemaIndexCacheVisitor {
+    /**
+     * Visit cache entries and pass them to closure.
+     *
+     * @param clo Closure.
+     * @throws IgniteCheckedException If failed.
+     */
+    public void visit(SchemaIndexCacheVisitorClosure clo) throws IgniteCheckedException;
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaIndexCacheVisitorClosure.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaIndexCacheVisitorClosure.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaIndexCacheVisitorClosure.java
new file mode 100644
index 0000000..7f50089
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaIndexCacheVisitorClosure.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.
+ */
+
+package org.apache.ignite.internal.processors.query.schema;
+
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.internal.processors.cache.CacheObject;
+import org.apache.ignite.internal.processors.cache.KeyCacheObject;
+import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
+
+/**
+ * Index closure accepting current entry state.
+ */
+public interface SchemaIndexCacheVisitorClosure {
+    /**
+     * Apply closure.
+     *
+     * @param key Key.
+     * @param part Partition.
+     * @param val Value.
+     * @param ver Version.
+     * @param expiration Expiration.
+     * @param link Link.
+     * @throws IgniteCheckedException If failed.
+     */
+    public void apply(KeyCacheObject key, int part, CacheObject val, GridCacheVersion ver, long expiration, long link)
+        throws IgniteCheckedException;
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaIndexCacheVisitorImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaIndexCacheVisitorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaIndexCacheVisitorImpl.java
new file mode 100644
index 0000000..58c909d
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaIndexCacheVisitorImpl.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.internal.processors.query.schema;
+
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
+import org.apache.ignite.internal.processors.cache.CacheObject;
+import org.apache.ignite.internal.processors.cache.GridCacheContext;
+import org.apache.ignite.internal.processors.cache.GridCacheEntryEx;
+import org.apache.ignite.internal.processors.cache.GridCacheEntryRemovedException;
+import org.apache.ignite.internal.processors.cache.KeyCacheObject;
+import org.apache.ignite.internal.processors.cache.database.CacheDataRow;
+import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLocalPartition;
+import org.apache.ignite.internal.processors.cache.distributed.near.GridNearCacheAdapter;
+import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
+import org.apache.ignite.internal.processors.query.GridQueryProcessor;
+import org.apache.ignite.internal.util.lang.GridCursor;
+import org.apache.ignite.internal.util.typedef.internal.S;
+
+import java.util.Collection;
+
+import static org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionState.EVICTED;
+import static org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionState.OWNING;
+import static org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionState.RENTING;
+
+/**
+ * Traversor operating all primary and backup partitions of given cache.
+ */
+public class SchemaIndexCacheVisitorImpl implements SchemaIndexCacheVisitor {
+    /** Query procssor. */
+    private final GridQueryProcessor qryProc;
+
+    /** Cache context. */
+    private final GridCacheContext cctx;
+
+    /** Space name. */
+    private final String spaceName;
+
+    /** Table name. */
+    private final String tblName;
+
+    /** Cancellation token. */
+    private final SchemaIndexOperationCancellationToken cancel;
+
+    /**
+     * Constructor.
+     *
+     * @param cctx Cache context.
+     * @param spaceName Space name.
+     * @param tblName Table name.
+     * @param cancel Cancellation token.
+     */
+    public SchemaIndexCacheVisitorImpl(GridQueryProcessor qryProc, GridCacheContext cctx, String spaceName,
+        String tblName, SchemaIndexOperationCancellationToken cancel) {
+        this.qryProc = qryProc;
+        this.spaceName = spaceName;
+        this.tblName = tblName;
+        this.cancel = cancel;
+
+        if (cctx.isNear())
+            cctx = ((GridNearCacheAdapter)cctx.cache()).dht().context();
+
+        this.cctx = cctx;
+    }
+
+    /** {@inheritDoc} */
+    @Override public void visit(SchemaIndexCacheVisitorClosure clo) throws IgniteCheckedException {
+        assert clo != null;
+
+        FilteringVisitorClosure filterClo = new FilteringVisitorClosure(clo);
+
+        Collection<GridDhtLocalPartition> parts = cctx.topology().localPartitions();
+
+        for (GridDhtLocalPartition part : parts)
+            processPartition(part, filterClo);
+    }
+
+    /**
+     * Process partition.
+     *
+     * @param part Partition.
+     * @param clo Index closure.
+     * @throws IgniteCheckedException If failed.
+     */
+    private void processPartition(GridDhtLocalPartition part, FilteringVisitorClosure clo)
+        throws IgniteCheckedException {
+        checkCancelled();
+
+        boolean reserved = false;
+
+        if (part != null && part.state() != EVICTED)
+            reserved = (part.state() == OWNING || part.state() == RENTING) && part.reserve();
+
+        if (!reserved)
+            return;
+
+        try {
+            GridCursor<? extends CacheDataRow> cursor = part.dataStore().cursor();
+
+            while (cursor.next()) {
+                CacheDataRow row = cursor.get();
+
+                KeyCacheObject key = row.key();
+
+                processKey(key, row.link(), clo);
+            }
+        }
+        finally {
+            part.release();
+        }
+    }
+
+    /**
+     * Process single key.
+     *
+     * @param key Key.
+     * @param link Link.
+     * @param clo Closure.
+     * @throws IgniteCheckedException If failed.
+     */
+    private void processKey(KeyCacheObject key, long link, FilteringVisitorClosure clo) throws IgniteCheckedException {
+        while (true) {
+            try {
+                checkCancelled();
+
+                GridCacheEntryEx entry = cctx.cache().entryEx(key);
+
+                try {
+                    entry.updateIndex(clo, link);
+                }
+                finally {
+                    cctx.evicts().touch(entry, AffinityTopologyVersion.NONE);
+                }
+
+                break;
+            }
+            catch (GridCacheEntryRemovedException ignored) {
+                // No-op.
+            }
+        }
+    }
+
+    /**
+     * Check if visit process is not cancelled.
+     *
+     * @throws IgniteCheckedException If cancelled.
+     */
+    private void checkCancelled() throws IgniteCheckedException {
+        if (cancel.isCancelled())
+            throw new IgniteCheckedException("Index creation was cancelled.");
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(SchemaIndexCacheVisitorImpl.class, this);
+    }
+
+    /**
+     * Filtering visitor closure.
+     */
+    private class FilteringVisitorClosure implements SchemaIndexCacheVisitorClosure {
+
+        /** Target closure. */
+        private final SchemaIndexCacheVisitorClosure target;
+
+        /**
+         * Constructor.
+         *
+         * @param target Target.
+         */
+        public FilteringVisitorClosure(SchemaIndexCacheVisitorClosure target) {
+            this.target = target;
+        }
+
+        /** {@inheritDoc} */
+        @Override public void apply(KeyCacheObject key, int part, CacheObject val, GridCacheVersion ver,
+            long expiration, long link) throws IgniteCheckedException {
+            if (qryProc.belongsToTable(cctx, spaceName, tblName, key, val))
+                target.apply(key, part, val, ver, expiration, link);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaIndexOperationCancellationToken.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaIndexOperationCancellationToken.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaIndexOperationCancellationToken.java
new file mode 100644
index 0000000..1bc3434
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaIndexOperationCancellationToken.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.internal.processors.query.schema;
+
+import org.apache.ignite.internal.util.typedef.internal.S;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * Index operation cancellation token.
+ */
+public class SchemaIndexOperationCancellationToken {
+    /** Cancel flag. */
+    private final AtomicBoolean flag = new AtomicBoolean();
+
+    /**
+     * Get cancel state.
+     *
+     * @return {@code True} if cancelled.
+     */
+    public boolean isCancelled() {
+        return flag.get();
+    }
+
+    /**
+     * Do cancel.
+     *
+     * @return {@code True} if cancel flag was set by this call.
+     */
+    public boolean cancel() {
+        return flag.compareAndSet(false, true);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(SchemaIndexOperationCancellationToken.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaKey.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaKey.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaKey.java
new file mode 100644
index 0000000..3f12b77
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaKey.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.internal.processors.query.schema;
+
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.lang.IgniteUuid;
+
+/**
+ * Schema key.
+ */
+public class SchemaKey {
+    /** Space. */
+    private final String space;
+
+    /** Deployment ID. */
+    private final IgniteUuid depId;
+
+    /**
+     * Constructor.
+     *
+     * @param space Space.
+     * @param depId Deployment ID.
+     */
+    public SchemaKey(String space, IgniteUuid depId) {
+        this.space = space;
+        this.depId = depId;
+    }
+
+    /** {@inheritDoc} */
+    @Override public int hashCode() {
+        return 31 * (space != null ? space.hashCode() : 0) + depId.hashCode();
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean equals(Object obj) {
+        if (obj instanceof SchemaKey) {
+            SchemaKey other = (SchemaKey)obj;
+
+            return F.eq(space, other.space) && F.eq(depId, other.depId);
+        }
+
+        return false;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaNodeLeaveExchangeWorkerTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaNodeLeaveExchangeWorkerTask.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaNodeLeaveExchangeWorkerTask.java
new file mode 100644
index 0000000..79fbfcd
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaNodeLeaveExchangeWorkerTask.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.internal.processors.query.schema;
+
+import org.apache.ignite.cluster.ClusterNode;
+import org.apache.ignite.internal.processors.cache.CachePartitionExchangeWorkerTask;
+import org.apache.ignite.internal.util.tostring.GridToStringInclude;
+import org.apache.ignite.internal.util.typedef.internal.S;
+
+/**
+ * Node leave exchange worker task.
+ */
+public class SchemaNodeLeaveExchangeWorkerTask implements CachePartitionExchangeWorkerTask {
+    /** Node. */
+    @GridToStringInclude
+    private final ClusterNode node;
+
+    /**
+     * Constructor.
+     *
+     * @param node Node.
+     */
+    public SchemaNodeLeaveExchangeWorkerTask(ClusterNode node) {
+        this.node = node;
+    }
+
+    /**
+     * @return Node.
+     */
+    public ClusterNode node() {
+        return node;
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(SchemaNodeLeaveExchangeWorkerTask.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaOperationClientFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaOperationClientFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaOperationClientFuture.java
new file mode 100644
index 0000000..6c47aff
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaOperationClientFuture.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.internal.processors.query.schema;
+
+import org.apache.ignite.internal.util.future.GridFutureAdapter;
+import org.apache.ignite.internal.util.typedef.internal.S;
+
+import java.util.UUID;
+
+/**
+ * Schema operation client future.
+ */
+public class SchemaOperationClientFuture extends GridFutureAdapter<Object> {
+    /** Operation ID. */
+    private final UUID opId;
+
+    /**
+     * Constructor.
+     *
+     * @param opId Operation ID.
+     */
+    public SchemaOperationClientFuture(UUID opId) {
+        this.opId = opId;
+    }
+
+    /**
+     * @return Operation ID.
+     */
+    public UUID operationId() {
+        return opId;
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(SchemaOperationClientFuture.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaOperationException.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaOperationException.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaOperationException.java
new file mode 100644
index 0000000..f0db026
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaOperationException.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.internal.processors.query.schema;
+
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.internal.util.typedef.internal.S;
+
+/**
+ * Schema operation exception.
+ */
+public class SchemaOperationException extends IgniteCheckedException {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Code: generic error. */
+    public static final int CODE_GENERIC = 0;
+
+    /** Code: cache not found. */
+    public static final int CODE_CACHE_NOT_FOUND = 1;
+
+    /** Code: table not found. */
+    public static final int CODE_TABLE_NOT_FOUND = 2;
+
+    /** Code: table already exists. */
+    public static final int CODE_TABLE_EXISTS = 3;
+
+    /** Code: column not found. */
+    public static final int CODE_COLUMN_NOT_FOUND = 4;
+
+    /** Code: column already exists. */
+    public static final int CODE_COLUMN_EXISTS = 5;
+
+    /** Code: index not found. */
+    public static final int CODE_INDEX_NOT_FOUND = 6;
+
+    /** Code: index already exists. */
+    public static final int CODE_INDEX_EXISTS = 7;
+
+    /** Error code. */
+    private final int code;
+
+    /**
+     * Constructor for specific error type.
+     *
+     * @param code Code.
+     * @param objName Object name.
+     */
+    public SchemaOperationException(int code, String objName) {
+        super(message(code, objName));
+
+        this.code = code;
+    }
+
+    /**
+     * Constructor for generic error.
+     *
+     * @param msg Message.
+     */
+    public SchemaOperationException(String msg) {
+        this(msg, null);
+    }
+
+    /**
+     * Constructor for generic error.
+     *
+     * @param msg Message.
+     * @param cause Cause.
+     */
+    public SchemaOperationException(String msg, Throwable cause) {
+        super(msg, cause);
+
+        code = CODE_GENERIC;
+    }
+
+    /**
+     * @return Code.
+     */
+    public int code() {
+        return code;
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(SchemaOperationException.class, this, "msg", getMessage());
+    }
+
+    /**
+     * Create message for specific code and object name.
+     *
+     * @param code Code.
+     * @param objName Object name.
+     * @return Message.
+     */
+    private static String message(int code, String objName) {
+        switch (code) {
+            case CODE_CACHE_NOT_FOUND:
+                return "Cache doesn't exist: " + objName;
+
+            case CODE_TABLE_NOT_FOUND:
+                return "Table doesn't exist: " + objName;
+
+            case CODE_TABLE_EXISTS:
+                return "Table already exists: " + objName;
+
+            case CODE_COLUMN_NOT_FOUND:
+                return "Column doesn't exist: " + objName;
+
+            case CODE_COLUMN_EXISTS:
+                return "Column already exists: " + objName;
+
+            case CODE_INDEX_NOT_FOUND:
+                return "Index doesn't exist: " + objName;
+
+            case CODE_INDEX_EXISTS:
+                return "Index already exists: " + objName;
+
+            default:
+                assert false;
+
+                return null;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaOperationManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaOperationManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaOperationManager.java
new file mode 100644
index 0000000..eb0f3cd
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaOperationManager.java
@@ -0,0 +1,292 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.query.schema;
+
+import org.apache.ignite.IgniteLogger;
+import org.apache.ignite.cluster.ClusterNode;
+import org.apache.ignite.internal.GridKernalContext;
+import org.apache.ignite.internal.IgniteInternalFuture;
+import org.apache.ignite.internal.processors.query.GridQueryProcessor;
+import org.apache.ignite.internal.processors.query.QueryUtils;
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.lang.IgniteInClosure;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * Schema operation manager.
+ */
+@SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+public class SchemaOperationManager {
+    /** Kernal context. */
+    private final GridKernalContext ctx;
+
+    /** Query processor. */
+    private final GridQueryProcessor qryProc;
+
+    /** Logger. */
+    private final IgniteLogger log;
+
+    /** Operation handler. */
+    private final SchemaOperationWorker worker;
+
+    /** Mutex for concurrency control. */
+    private final Object mux = new Object();
+
+    /** Participants. */
+    private Collection<UUID> nodeIds;
+
+    /** Node results. */
+    private Map<UUID, SchemaOperationException> nodeRess;
+
+    /** Current coordinator node. */
+    private ClusterNode crd;
+
+    /** Whether coordinator state is mapped. */
+    private boolean crdMapped;
+
+    /** Coordinator finished flag. */
+    private boolean crdFinished;
+
+    /**
+     * Constructor.
+     *
+     * @param ctx Context.
+     * @param qryProc Query processor.
+     * @param worker Operation handler.
+     * @param crd Coordinator node.
+     */
+    public SchemaOperationManager(GridKernalContext ctx, GridQueryProcessor qryProc, SchemaOperationWorker worker,
+        @Nullable ClusterNode crd) {
+        assert !ctx.clientNode() || crd == null;
+
+        this.ctx = ctx;
+
+        log = ctx.log(SchemaOperationManager.class);
+
+        this.qryProc = qryProc;
+        this.worker = worker;
+
+        synchronized (mux) {
+            this.crd = crd;
+
+            prepareCoordinator();
+        }
+    }
+
+    /**
+     * Map operation handling.
+     */
+    @SuppressWarnings("unchecked")
+    public void start() {
+        worker.start();
+
+        synchronized (mux) {
+            worker.future().listen(new IgniteInClosure<IgniteInternalFuture>() {
+                @Override public void apply(IgniteInternalFuture fut) {
+                    onLocalNodeFinished(fut);
+                }
+            });
+        }
+    }
+
+    /**
+     * Handle local node finish.
+     *
+     * @param fut Future.
+     */
+    private void onLocalNodeFinished(IgniteInternalFuture fut) {
+        assert fut.isDone();
+
+        if (ctx.clientNode())
+            return;
+
+        SchemaOperationException err;
+
+        try {
+            fut.get();
+
+            err = null;
+        }
+        catch (Exception e) {
+            err = QueryUtils.wrapIfNeeded(e);
+        }
+
+        synchronized (mux) {
+            if (isLocalCoordinator())
+                onNodeFinished(ctx.localNodeId(), err);
+            else
+                qryProc.sendStatusMessage(crd.id(), operationId(), err);
+        }
+    }
+
+    /**
+     * Handle node finish.
+     *
+     * @param nodeId Node ID.
+     * @param err Error.
+     */
+    public void onNodeFinished(UUID nodeId, @Nullable SchemaOperationException err) {
+        synchronized (mux) {
+            assert isLocalCoordinator();
+
+            if (nodeRess.containsKey(nodeId)) {
+                if (log.isDebugEnabled())
+                    log.debug("Received duplicate result [opId=" + operationId() + ", nodeId=" + nodeId +
+                        ", err=" + err + ']');
+
+                return;
+            }
+
+            if (nodeIds.contains(nodeId)) {
+                if (log.isDebugEnabled())
+                    log.debug("Received result [opId=" + operationId() + ", nodeId=" + nodeId + ", err=" + err + ']');
+
+                nodeRess.put(nodeId, err);
+            }
+            else {
+                if (log.isDebugEnabled())
+                    log.debug("Received result from non-tracked node (joined after operation started, will ignore) " +
+                        "[opId=" + operationId() + ", nodeId=" + nodeId + ", err=" + err + ']');
+            }
+
+            checkFinished();
+        }
+    }
+
+    /**
+     * Handle node leave event.
+     *
+     * @param nodeId ID of the node that has left the grid.
+     * @param curCrd Current coordinator node.
+     */
+    public void onNodeLeave(UUID nodeId, ClusterNode curCrd) {
+        synchronized (mux) {
+            assert crd != null;
+
+            if (F.eq(nodeId, crd.id())) {
+                // Coordinator has left!
+                crd = curCrd;
+
+                prepareCoordinator();
+            }
+            else if (isLocalCoordinator()) {
+                // Other node has left, remove it from the coordinator's wait set.
+                // Handle this as success.
+                if (nodeIds.remove(nodeId))
+                    nodeRess.remove(nodeId);
+            }
+
+            IgniteInternalFuture fut = worker().future();
+
+            if (fut.isDone())
+                onLocalNodeFinished(fut);
+
+            checkFinished();
+        }
+    }
+
+    /**
+     * Check if operation finished.
+     */
+    private void checkFinished() {
+        assert Thread.holdsLock(mux);
+
+        if (isLocalCoordinator()) {
+            if (crdFinished)
+                return;
+
+            if (nodeIds.size() == nodeRess.size()) {
+                // Initiate finish request.
+                SchemaOperationException err = null;
+
+                for (Map.Entry<UUID, SchemaOperationException> nodeRes : nodeRess.entrySet()) {
+                    if (nodeRes.getValue() != null) {
+                        err = nodeRes.getValue();
+
+                        break;
+                    }
+                }
+
+                if (log.isDebugEnabled())
+                    log.debug("Collected all results, about to send finish message [opId=" + operationId() +
+                        ", err=" + err + ']');
+
+                crdFinished = true;
+
+                qryProc.onCoordinatorFinished(worker.operation(), err);
+            }
+        }
+    }
+
+    /**
+     * Prepare topology state in case local node is coordinator.
+     *
+     * @return {@code True} if state was changed by this call.
+     */
+    private boolean prepareCoordinator() {
+        if (isLocalCoordinator() && !crdMapped) {
+            // Initialize local structures.
+            nodeIds = new HashSet<>();
+            nodeRess = new HashMap<>();
+
+            for (ClusterNode alive : ctx.discovery().aliveServerNodes())
+                nodeIds.add(alive.id());
+
+            if (log.isDebugEnabled())
+                log.debug("Mapped participating nodes on coordinator [opId=" + operationId() +
+                    ", crdNodeId=" + ctx.localNodeId() + ", nodes=" + nodeIds + ']');
+
+            crdMapped = true;
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Check if current node is local coordinator.
+     *
+     * @return {@code True} if coordinator.
+     */
+    private boolean isLocalCoordinator() {
+        assert Thread.holdsLock(mux);
+
+        return crd != null && crd.isLocal();
+    }
+
+    /**
+     * @return Worker.
+     */
+    public SchemaOperationWorker worker() {
+        return worker;
+    }
+
+    /**
+     * @return Operation ID.
+     */
+    private UUID operationId() {
+        return worker.operation().id();
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaOperationWorker.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaOperationWorker.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaOperationWorker.java
new file mode 100644
index 0000000..06feecb
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/SchemaOperationWorker.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.internal.processors.query.schema;
+
+import org.apache.ignite.internal.GridKernalContext;
+import org.apache.ignite.internal.IgniteInternalFuture;
+import org.apache.ignite.internal.IgniteInterruptedCheckedException;
+import org.apache.ignite.internal.processors.query.GridQueryProcessor;
+import org.apache.ignite.internal.processors.query.QueryTypeDescriptorImpl;
+import org.apache.ignite.internal.processors.query.QueryUtils;
+import org.apache.ignite.internal.processors.query.schema.operation.SchemaAbstractOperation;
+import org.apache.ignite.internal.util.future.GridFutureAdapter;
+import org.apache.ignite.internal.util.worker.GridWorker;
+import org.apache.ignite.lang.IgniteInClosure;
+import org.apache.ignite.lang.IgniteUuid;
+import org.apache.ignite.thread.IgniteThread;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * Schema operation executor.
+ */
+public class SchemaOperationWorker extends GridWorker {
+    /** Query processor */
+    private final GridQueryProcessor qryProc;
+
+    /** Deployment ID. */
+    private final IgniteUuid depId;
+
+    /** Target operation. */
+    private final SchemaAbstractOperation op;
+
+    /** No-op flag. */
+    private final boolean nop;
+
+    /** Whether cache started. */
+    private final boolean cacheRegistered;
+
+    /** Type descriptor. */
+    private final QueryTypeDescriptorImpl type;
+
+    /** Operation future. */
+    private final GridFutureAdapter fut;
+
+    /** Public operation future. */
+    private final GridFutureAdapter pubFut;
+
+    /** Start guard. */
+    private final AtomicBoolean startGuard = new AtomicBoolean();
+
+    /** Cancellation token. */
+    private final SchemaIndexOperationCancellationToken cancelToken = new SchemaIndexOperationCancellationToken();
+
+    /**
+     * Constructor.
+     *
+     * @param ctx Context.
+     * @param qryProc Query processor.
+     * @param depId Deployment ID.
+     * @param op Target operation.
+     * @param nop No-op flag.
+     * @param err Predefined error.
+     * @param cacheRegistered Whether cache is registered in indexing at this point.
+     * @param type Type descriptor (if available).
+     */
+    public SchemaOperationWorker(GridKernalContext ctx, GridQueryProcessor qryProc, IgniteUuid depId,
+        SchemaAbstractOperation op, boolean nop, @Nullable SchemaOperationException err, boolean cacheRegistered,
+        @Nullable QueryTypeDescriptorImpl type) {
+        super(ctx.igniteInstanceName(), workerName(op), ctx.log(SchemaOperationWorker.class));
+
+        this.qryProc = qryProc;
+        this.depId = depId;
+        this.op = op;
+        this.nop = nop;
+        this.cacheRegistered = cacheRegistered;
+        this.type = type;
+
+        fut = new GridFutureAdapter();
+
+        if (err != null)
+            fut.onDone(err);
+        else if (nop || !cacheRegistered)
+            fut.onDone();
+
+        pubFut = publicFuture(fut);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void body() throws InterruptedException, IgniteInterruptedCheckedException {
+        try {
+            // Execute.
+            qryProc.processIndexOperationLocal(op, type, depId, cancelToken);
+
+            fut.onDone();
+        }
+        catch (Exception e) {
+            fut.onDone(QueryUtils.wrapIfNeeded(e));
+        }
+    }
+
+    /**
+     * Perform initialization routine.
+     *
+     * @return This instance.
+     */
+    public SchemaOperationWorker start() {
+        if (startGuard.compareAndSet(false, true)) {
+            if (!fut.isDone())
+                new IgniteThread(this).start();
+        }
+
+        return this;
+    }
+
+    /**
+     * Chain the future making sure that operation is completed after local schema is updated.
+     *
+     * @param fut Current future.
+     * @return Chained future.
+     */
+    @SuppressWarnings("unchecked")
+    private GridFutureAdapter<?> publicFuture(GridFutureAdapter fut) {
+        final GridFutureAdapter<?> chainedFut = new GridFutureAdapter<>();
+
+        fut.listen(new IgniteInClosure<IgniteInternalFuture>() {
+            @Override public void apply(IgniteInternalFuture fut) {
+                Exception err = null;
+
+                try {
+                    fut.get();
+
+                    if (cacheRegistered && !nop)
+                        qryProc.onLocalOperationFinished(op, type);
+                }
+                catch (Exception e) {
+                    err = e;
+                }
+                finally {
+                    chainedFut.onDone(null, err);
+                }
+            }
+        });
+
+        return chainedFut;
+    }
+
+    /**
+     * @return No-op flag.
+     */
+    public boolean nop() {
+        return nop;
+    }
+
+    /**
+     * @return Whether cache is registered.
+     */
+    public boolean cacheRegistered() {
+        return cacheRegistered;
+    }
+
+    /**
+     * Cancel operation.
+     */
+    public void cancel() {
+        if (cancelToken.cancel())
+            super.cancel();
+    }
+
+    /**
+     * @return Operation.
+     */
+    public SchemaAbstractOperation operation() {
+        return op;
+    }
+
+    /**
+     * @return Future completed when operation is ready.
+     */
+    public IgniteInternalFuture future() {
+        return pubFut;
+    }
+
+    /**
+     * @return Worker name.
+     */
+    private static String workerName(SchemaAbstractOperation op) {
+        return "schema-op-worker-" + op.id();
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaAbstractDiscoveryMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaAbstractDiscoveryMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaAbstractDiscoveryMessage.java
new file mode 100644
index 0000000..9fdc6c3
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaAbstractDiscoveryMessage.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.query.schema.message;
+
+import org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage;
+import org.apache.ignite.internal.processors.query.schema.operation.SchemaAbstractOperation;
+import org.apache.ignite.internal.util.tostring.GridToStringInclude;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.lang.IgniteUuid;
+
+/**
+ * Abstract discovery message for schema operations.
+ */
+public abstract class SchemaAbstractDiscoveryMessage implements DiscoveryCustomMessage {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** ID */
+    private final IgniteUuid id = IgniteUuid.randomUuid();
+
+    /** Operation. */
+    @GridToStringInclude
+    protected final SchemaAbstractOperation op;
+
+    /**
+     * Constructor.
+     *
+     * @param op Operation.
+     */
+    protected SchemaAbstractDiscoveryMessage(SchemaAbstractOperation op) {
+        this.op = op;
+    }
+
+    /** {@inheritDoc} */
+    @Override public IgniteUuid id() {
+        return id;
+    }
+
+    /**
+     * @return Operation.
+     */
+    public SchemaAbstractOperation operation() {
+        return op;
+    }
+
+    /**
+     * @return Whether request must be propagated to exchange thread.
+     */
+    public abstract boolean exchange();
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(SchemaAbstractDiscoveryMessage.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaFinishDiscoveryMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaFinishDiscoveryMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaFinishDiscoveryMessage.java
new file mode 100644
index 0000000..2245b24
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaFinishDiscoveryMessage.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.query.schema.message;
+
+import org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage;
+import org.apache.ignite.internal.processors.query.schema.SchemaOperationException;
+import org.apache.ignite.internal.processors.query.schema.operation.SchemaAbstractOperation;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Schema change finish discovery message.
+ */
+public class SchemaFinishDiscoveryMessage extends SchemaAbstractDiscoveryMessage {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Error. */
+    private final SchemaOperationException err;
+
+    /** Original propose message. */
+    private transient SchemaProposeDiscoveryMessage proposeMsg;
+
+    /**
+     * Constructor.
+     *
+     * @param op Original operation.
+     * @param err Error.
+     */
+    public SchemaFinishDiscoveryMessage(SchemaAbstractOperation op, SchemaOperationException err) {
+        super(op);
+
+        this.err = err;
+    }
+
+    /** {@inheritDoc} */
+    @Nullable @Override public DiscoveryCustomMessage ackMessage() {
+        return null;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean isMutable() {
+        return false;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean exchange() {
+        return false;
+    }
+
+    /**
+     * @return {@code True} if error was reported during init.
+     */
+    public boolean hasError() {
+        return err != null;
+    }
+
+    /**
+     * @return Error message (if any).
+     */
+    @Nullable public SchemaOperationException error() {
+        return err;
+    }
+
+    /**
+     * @return Propose message.
+     */
+    public SchemaProposeDiscoveryMessage proposeMessage() {
+        return proposeMsg;
+    }
+
+    /**
+     * @param proposeMsg Propose message.
+     */
+    public void proposeMessage(SchemaProposeDiscoveryMessage proposeMsg) {
+        this.proposeMsg = proposeMsg;
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(SchemaFinishDiscoveryMessage.class, this, "parent", super.toString());
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaOperationStatusMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaOperationStatusMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaOperationStatusMessage.java
new file mode 100644
index 0000000..5f75e60
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaOperationStatusMessage.java
@@ -0,0 +1,168 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.query.schema.message;
+
+import org.apache.ignite.internal.GridDirectTransient;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.plugin.extensions.communication.Message;
+import org.apache.ignite.plugin.extensions.communication.MessageReader;
+import org.apache.ignite.plugin.extensions.communication.MessageWriter;
+import org.jetbrains.annotations.Nullable;
+
+import java.nio.ByteBuffer;
+import java.util.UUID;
+
+/**
+ * Schema operation status message.
+ */
+public class SchemaOperationStatusMessage implements Message {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Operation ID. */
+    private UUID opId;
+
+    /** Error bytes (if any). */
+    private byte[] errBytes;
+
+    /** Sender node ID. */
+    @GridDirectTransient
+    private UUID sndNodeId;
+
+    /**
+     * Default constructor.
+     */
+    public SchemaOperationStatusMessage() {
+        // No-op.
+    }
+
+    /**
+     * Constructor.
+     *
+     * @param opId Operation ID.
+     * @param errBytes Error bytes.
+     */
+    public SchemaOperationStatusMessage(UUID opId, byte[] errBytes) {
+        this.opId = opId;
+        this.errBytes = errBytes;
+    }
+
+    /**
+     * @return Operation ID.
+     */
+    public UUID operationId() {
+        return opId;
+    }
+
+    /**
+     * @return Error bytes.
+     */
+    @Nullable public byte[] errorBytes() {
+        return errBytes;
+    }
+
+    /**
+     * @return Sender node ID.
+     */
+    public UUID senderNodeId() {
+        return sndNodeId;
+    }
+
+    /**
+     * @param sndNodeId Sender node ID.
+     */
+    public void senderNodeId(UUID sndNodeId) {
+        this.sndNodeId = sndNodeId;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
+        writer.setBuffer(buf);
+
+        if (!writer.isHeaderWritten()) {
+            if (!writer.writeHeader(directType(), fieldsCount()))
+                return false;
+
+            writer.onHeaderWritten();
+        }
+
+        switch (writer.state()) {
+            case 0:
+                if (!writer.writeUuid("opId", opId))
+                    return false;
+
+                writer.incrementState();
+
+            case 1:
+                if (!writer.writeByteArray("errBytes", errBytes))
+                    return false;
+
+                writer.incrementState();
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean readFrom(ByteBuffer buf, MessageReader reader) {
+        reader.setBuffer(buf);
+
+        if (!reader.beforeMessageRead())
+            return false;
+
+        switch (reader.state()) {
+            case 0:
+                opId = reader.readUuid("opId");
+
+                if (!reader.isLastRead())
+                    return false;
+
+                reader.incrementState();
+
+            case 1:
+                errBytes = reader.readByteArray("errBytes");
+
+                if (!reader.isLastRead())
+                    return false;
+
+                reader.incrementState();
+        }
+
+        return reader.afterMessageRead(SchemaOperationStatusMessage.class);
+    }
+
+    /** {@inheritDoc} */
+    @Override public short directType() {
+        return -53;
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte fieldsCount() {
+        return 2;
+    }
+
+    /** {@inheritDoc} */
+    @Override public void onAckReceived() {
+        // No-op.
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(SchemaOperationStatusMessage.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaProposeDiscoveryMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaProposeDiscoveryMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaProposeDiscoveryMessage.java
new file mode 100644
index 0000000..664ee03
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaProposeDiscoveryMessage.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.internal.processors.query.schema.message;
+
+import org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage;
+import org.apache.ignite.internal.processors.query.schema.SchemaKey;
+import org.apache.ignite.internal.processors.query.schema.SchemaOperationException;
+import org.apache.ignite.internal.processors.query.schema.operation.SchemaAbstractOperation;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.lang.IgniteUuid;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Schema change propose discovery message.
+ */
+public class SchemaProposeDiscoveryMessage extends SchemaAbstractDiscoveryMessage {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Cache deployment ID. */
+    private IgniteUuid depId;
+
+    /** Error. */
+    private SchemaOperationException err;
+
+    /** Whether to perform exchange. */
+    private transient boolean exchange;
+
+    /**
+     * Constructor.
+     *
+     * @param op Operation.
+     */
+    public SchemaProposeDiscoveryMessage(SchemaAbstractOperation op) {
+        super(op);
+    }
+
+    /** {@inheritDoc} */
+    @Nullable @Override public DiscoveryCustomMessage ackMessage() {
+        return null;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean isMutable() {
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean exchange() {
+        return exchange;
+    }
+
+    /**
+     * @param exchange Whether to perform exchange.
+     */
+    public void exchange(boolean exchange) {
+        this.exchange = exchange;
+    }
+
+    /**
+     * @return Deployment ID.
+     */
+    @Nullable public IgniteUuid deploymentId() {
+        return depId;
+    }
+
+    /**
+     * @param depId Deployment ID.
+     */
+    public void deploymentId(IgniteUuid depId) {
+        this.depId = depId;
+    }
+
+    /**
+     *
+     * @return {@code True} if message is initialized.
+     */
+    public boolean initialized() {
+        return deploymentId() != null || hasError();
+    }
+
+    /**
+     * Set error.
+     *
+     * @param err Error.
+     */
+    public void onError(SchemaOperationException err) {
+        if (!hasError()) {
+            this.err = err;
+        }
+    }
+
+    /**
+     * @return {@code True} if error was reported during init.
+     */
+    public boolean hasError() {
+        return err != null;
+    }
+
+    /**
+     * @return Error message (if any).
+     */
+    @Nullable public SchemaOperationException error() {
+        return err;
+    }
+
+    /**
+     * @return Schema key.
+     */
+    public SchemaKey schemaKey() {
+        return new SchemaKey(operation().space(), depId);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(SchemaProposeDiscoveryMessage.class, this, "parent", super.toString());
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaAbstractOperation.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaAbstractOperation.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaAbstractOperation.java
new file mode 100644
index 0000000..8418ece
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaAbstractOperation.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.query.schema.operation;
+
+import org.apache.ignite.internal.util.typedef.internal.S;
+
+import java.io.Serializable;
+import java.util.UUID;
+
+/**
+ * Abstract operation on schema.
+ */
+public abstract class SchemaAbstractOperation implements Serializable {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Operation ID. */
+    private final UUID opId;
+
+    /** Space. */
+    private final String space;
+
+    /**
+     * Constructor.
+     *
+     * @param opId Operation ID.
+     * @param space Space.
+     */
+    public SchemaAbstractOperation(UUID opId, String space) {
+        this.opId = opId;
+        this.space = space;
+    }
+
+    /**
+     * @return Operation id.
+     */
+    public UUID id() {
+        return opId;
+    }
+
+    /**
+     * @return Space.
+     */
+    public String space() {
+        return space;
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(SchemaAbstractOperation.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaIndexAbstractOperation.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaIndexAbstractOperation.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaIndexAbstractOperation.java
new file mode 100644
index 0000000..fc4a9ff
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaIndexAbstractOperation.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.query.schema.operation;
+
+import java.util.UUID;
+
+/**
+ * Schema index abstract operation.
+ */
+public abstract class SchemaIndexAbstractOperation extends SchemaAbstractOperation {
+    /**
+     * Constructor.
+     *
+     * @param opId Operation ID.
+     * @param space Space.
+     */
+    public SchemaIndexAbstractOperation(UUID opId, String space) {
+        super(opId, space);
+    }
+
+    /**
+     * @return Index name.
+     */
+    public abstract String indexName();
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaIndexCreateOperation.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaIndexCreateOperation.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaIndexCreateOperation.java
new file mode 100644
index 0000000..9281f2a
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaIndexCreateOperation.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.query.schema.operation;
+
+import org.apache.ignite.cache.QueryIndex;
+import org.apache.ignite.internal.processors.query.QueryUtils;
+import org.apache.ignite.internal.util.tostring.GridToStringInclude;
+import org.apache.ignite.internal.util.typedef.internal.S;
+
+import java.util.UUID;
+
+/**
+ * Schema index create operation.
+ */
+public class SchemaIndexCreateOperation extends SchemaIndexAbstractOperation {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Table name. */
+    private final String tblName;
+
+    /** Index. */
+    @GridToStringInclude
+    private final QueryIndex idx;
+
+    /** Ignore operation if index exists. */
+    private final boolean ifNotExists;
+
+    /**
+     * Constructor.
+     *
+     * @param opId Operation id.
+     * @param space Space.
+     * @param tblName Table name.
+     * @param idx Index params.
+     * @param ifNotExists Ignore operation if index exists.
+     */
+    public SchemaIndexCreateOperation(UUID opId, String space, String tblName, QueryIndex idx, boolean ifNotExists) {
+        super(opId, space);
+
+        this.tblName = tblName;
+        this.idx = idx;
+        this.ifNotExists = ifNotExists;
+    }
+
+    /** {@inheritDoc} */
+    @Override public String indexName() {
+        return QueryUtils.indexName(tblName, idx);
+    }
+
+    /**
+     * @return Table name.
+     */
+    public String tableName() {
+        return tblName;
+    }
+
+    /**
+     * @return Index params.
+     */
+    public QueryIndex index() {
+        return idx;
+    }
+
+    /**
+     * @return Ignore operation if index exists.
+     */
+    public boolean ifNotExists() {
+        return ifNotExists;
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(SchemaIndexCreateOperation.class, this, "parent", super.toString());
+    }
+}


[23/70] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math module to Ignite ML module added missed licenses renamed packages fixed wrong ml profile activation

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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 &times; X = B for matrices A.
-     *
-     * @param b right-hand side of the equation A &times; X = B
-     * @return a vector X that minimizes the two norm of A &times; 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 &times; X = B for matrices A.
-     *
-     * @param b right-hand side of the equation A &times; X = B
-     * @return a matrix X that minimizes the two norm of A &times; 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/d78e071a/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;
-    }
-}


[45/70] [abbrv] ignite git commit: IGNITE-4925 Fix IgniteCacheBinaryObjectsScanSelfTest.testScanNoClasses - Fixes #1750.

Posted by sb...@apache.org.
IGNITE-4925 Fix IgniteCacheBinaryObjectsScanSelfTest.testScanNoClasses - Fixes #1750.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/b47f29d8
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/b47f29d8
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/b47f29d8

Branch: refs/heads/ignite-2893
Commit: b47f29d83f25037c5bf3cfe489b7120a238c7120
Parents: 800b8bd
Author: Evgenii Zhuravlev <ez...@gridgain.com>
Authored: Wed Apr 19 14:01:21 2017 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Wed Apr 19 14:01:21 2017 +0300

----------------------------------------------------------------------
 .../cache/IgniteCacheBinaryObjectsScanSelfTest.java      | 11 +++++++++--
 .../cache/IgniteCacheEntryListenerAbstractTest.java      |  2 +-
 2 files changed, 10 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/b47f29d8/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheBinaryObjectsScanSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheBinaryObjectsScanSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheBinaryObjectsScanSelfTest.java
index 666505b..e0da1f6 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheBinaryObjectsScanSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheBinaryObjectsScanSelfTest.java
@@ -17,10 +17,12 @@
 
 package org.apache.ignite.internal.processors.cache;
 
+import java.util.ArrayList;
 import java.util.List;
 import javax.cache.Cache;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
+import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction;
 import org.apache.ignite.cache.query.ScanQuery;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
@@ -127,9 +129,14 @@ public class IgniteCacheBinaryObjectsScanSelfTest extends GridCommonAbstractTest
             assertEquals(PERSON_CLS_NAME, entry.getValue().getClass().getName());
         }
 
-        entries = cache.query(new ScanQuery<>(1023)).getAll();
+        entries = new ArrayList<>();
 
-        assertFalse(entries.isEmpty());
+        int partCnt = client.affinity("testCache").partitions();
+
+        for (int i = 0; i < partCnt; i++)
+            entries.addAll(cache.query(new ScanQuery<>(i)).getAll());
+
+        assertEquals(100, entries.size());
 
         for (Cache.Entry<Object, Object> entry : entries) {
             assertEquals(PERSON_KEY_CLS_NAME, entry.getKey().getClass().getName());

http://git-wip-us.apache.org/repos/asf/ignite/blob/b47f29d8/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheEntryListenerAbstractTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheEntryListenerAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheEntryListenerAbstractTest.java
index e0e2771..ef2f156 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheEntryListenerAbstractTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheEntryListenerAbstractTest.java
@@ -329,7 +329,7 @@ public abstract class IgniteCacheEntryListenerAbstractTest extends IgniteCacheAb
                 if (!eagerTtl()) {
                     U.sleep(1100);
 
-                    assertNull(primaryCache(key, cache.getName()).get(key(key)));
+                    assertNull(primaryCache(key(key), cache.getName()).get(key(key)));
 
                     evtsLatch.await(5000, MILLISECONDS);
 


[59/70] [abbrv] ignite git commit: IGNITE-5010: DDL: additional tests for spatial dynamic indexes.

Posted by sb...@apache.org.
IGNITE-5010: DDL: additional tests for spatial dynamic indexes.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/f923bc91
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/f923bc91
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/f923bc91

Branch: refs/heads/ignite-2893
Commit: f923bc91fec38ad4e024ae1b395c5bf9a0a50e12
Parents: b1822da
Author: devozerov <vo...@gridgain.com>
Authored: Wed Apr 19 17:54:53 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Wed Apr 19 17:54:53 2017 +0300

----------------------------------------------------------------------
 .../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 +-
 9 files changed, 802 insertions(+), 549 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/f923bc91/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/GridBinaryH2IndexingGeoSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/GridBinaryH2IndexingGeoSelfTest.java b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/GridBinaryH2IndexingGeoSelfTest.java
deleted file mode 100644
index e271712..0000000
--- a/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/GridBinaryH2IndexingGeoSelfTest.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.internal.processors.query.h2;
-
-import org.apache.ignite.configuration.IgniteConfiguration;
-import org.apache.ignite.internal.binary.BinaryMarshaller;
-
-/**
- * Geo-indexing test for binary mode.
- */
-public class GridBinaryH2IndexingGeoSelfTest extends GridH2IndexingGeoSelfTest {
-    /** {@inheritDoc} */
-    @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
-        IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
-
-        cfg.setMarshaller(new BinaryMarshaller());
-
-        return cfg;
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/f923bc91/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/GridH2IndexingGeoSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/GridH2IndexingGeoSelfTest.java b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/GridH2IndexingGeoSelfTest.java
deleted file mode 100644
index 4404e9c..0000000
--- a/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/GridH2IndexingGeoSelfTest.java
+++ /dev/null
@@ -1,470 +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.internal.processors.query.h2;
-
-import com.vividsolutions.jts.geom.Geometry;
-import com.vividsolutions.jts.io.ParseException;
-import com.vividsolutions.jts.io.WKTReader;
-import java.io.Serializable;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ThreadLocalRandom;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicReference;
-import javax.cache.Cache;
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.cache.CacheAtomicityMode;
-import org.apache.ignite.cache.CacheMode;
-import org.apache.ignite.cache.query.SqlFieldsQuery;
-import org.apache.ignite.cache.query.SqlQuery;
-import org.apache.ignite.cache.query.annotations.QuerySqlField;
-import org.apache.ignite.configuration.CacheConfiguration;
-import org.apache.ignite.internal.IgniteInternalFuture;
-import org.apache.ignite.internal.processors.cache.GridCacheAbstractSelfTest;
-import org.apache.ignite.internal.util.typedef.F;
-import org.apache.ignite.internal.util.typedef.internal.U;
-import org.apache.ignite.testframework.GridTestUtils;
-
-/**
- * Geo-indexing test.
- */
-public class GridH2IndexingGeoSelfTest extends GridCacheAbstractSelfTest {
-    /** */
-    private static final int CNT = 100;
-
-    /** */
-    private static final long DUR = 60000L;
-
-    /** Number of generated samples. */
-    public static final int ENEMYCAMP_SAMPLES_COUNT = 500;
-
-    /** Number of generated samples. */
-    public static final int ENEMY_SAMPLES_COUNT = 1000;
-
-    /** {@inheritDoc} */
-    @Override protected int gridCount() {
-        return 3;
-    }
-
-    /** {@inheritDoc} */
-    @Override protected long getTestTimeout() {
-        return DUR * 3;
-    }
-
-    /**
-     * @param name Cache name.
-     * @param partitioned Partition or replicated cache.
-     * @param idxTypes Indexed types.
-     * @return Cache configuration.
-     */
-    protected <K, V> CacheConfiguration<K, V> cacheConfig(String name, boolean partitioned,
-        Class<?>... idxTypes) throws Exception {
-        return new CacheConfiguration<K, V>(name)
-            .setName(name)
-            .setCacheMode(partitioned ? CacheMode.PARTITIONED : CacheMode.REPLICATED)
-            .setAtomicityMode(CacheAtomicityMode.ATOMIC)
-            .setIndexedTypes(idxTypes);
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    public void testPrimitiveGeometry() throws Exception {
-        IgniteCache<Long, Geometry> cache = grid(0).getOrCreateCache(
-            this.<Long, Geometry>cacheConfig("geom", true, Long.class, Geometry.class));
-
-        try {
-            WKTReader r = new WKTReader();
-
-            for (long i = 0; i < 100; i++)
-                cache.put(i, r.read("POINT(" + i + " " + i + ")"));
-
-            List<List<?>> res = cache.query(new SqlFieldsQuery("explain select _key from Geometry where _val && ?")
-                .setArgs(r.read("POLYGON((5 70, 5 80, 30 80, 30 70, 5 70))")).setLocal(true)).getAll();
-
-            assertTrue("__ explain: " + res, res.get(0).get(0).toString().toLowerCase().contains("_val_idx"));
-        }
-        finally {
-            cache.destroy();
-        }
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    @SuppressWarnings("unchecked")
-    public void testGeo() throws Exception {
-        IgniteCache<Integer, EnemyCamp> cache = grid(0).getOrCreateCache(
-            this.<Integer, EnemyCamp>cacheConfig("camp", true, Integer.class, EnemyCamp.class));
-
-        try {
-            WKTReader r = new WKTReader();
-
-            cache.getAndPut(0, new EnemyCamp(r.read("POINT(25 75)"), "A"));
-            cache.getAndPut(1, new EnemyCamp(r.read("POINT(70 70)"), "B"));
-            cache.getAndPut(2, new EnemyCamp(r.read("POINT(70 30)"), "C"));
-            cache.getAndPut(3, new EnemyCamp(r.read("POINT(75 25)"), "D"));
-
-            SqlQuery<Integer, EnemyCamp> qry = new SqlQuery(EnemyCamp.class, "coords && ?");
-
-            Collection<Cache.Entry<Integer, EnemyCamp>> res = cache.query(
-                qry.setArgs(r.read("POLYGON((5 70, 5 80, 30 80, 30 70, 5 70))"))).getAll();
-
-            checkPoints(res, "A");
-
-            res = cache.query(
-                qry.setArgs(r.read("POLYGON((10 5, 10 35, 70 30, 75 25, 10 5))"))).getAll();
-
-            checkPoints(res, "C", "D");
-
-            // Move B to the first polygon.
-            cache.getAndPut(1, new EnemyCamp(r.read("POINT(20 75)"), "B"));
-
-            res = cache.query(
-                qry.setArgs(r.read("POLYGON((5 70, 5 80, 30 80, 30 70, 5 70))"))).getAll();
-
-            checkPoints(res, "A", "B");
-
-            // Move B to the second polygon.
-            cache.getAndPut(1, new EnemyCamp(r.read("POINT(30 30)"), "B"));
-
-            res = cache.query(
-                qry.setArgs(r.read("POLYGON((10 5, 10 35, 70 30, 75 25, 10 5))"))).getAll();
-
-            checkPoints(res, "B", "C", "D");
-
-            // Remove B.
-            cache.getAndRemove(1);
-
-            res = cache.query(
-                qry.setArgs(r.read("POLYGON((5 70, 5 80, 30 80, 30 70, 5 70))"))).getAll();
-
-            checkPoints(res, "A");
-
-            res = cache.query(
-                qry.setArgs(r.read("POLYGON((10 5, 10 35, 70 30, 75 25, 10 5))"))).getAll();
-
-            checkPoints(res, "C", "D");
-
-            // Check explaint request.
-            assertTrue(F.first(cache.query(new SqlFieldsQuery("explain select * from EnemyCamp " +
-                "where coords && 'POINT(25 75)'")).getAll()).get(0).toString().toLowerCase().contains("coords_idx"));
-        }
-        finally {
-            cache.destroy();
-        }
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    @SuppressWarnings("unchecked")
-    public void testGeoMultithreaded() throws Exception {
-        final CacheConfiguration<Integer, EnemyCamp> ccfg = cacheConfig("camp", true, Integer.class, EnemyCamp.class);
-
-        final IgniteCache<Integer, EnemyCamp> cache1 = grid(0).getOrCreateCache(ccfg);
-        final IgniteCache<Integer, EnemyCamp> cache2 = grid(1).cache("camp");
-        final IgniteCache<Integer, EnemyCamp> cache3 = grid(2).cache("camp");
-
-        try {
-            final String[] points = new String[CNT];
-
-            WKTReader r = new WKTReader();
-
-            ThreadLocalRandom rnd = ThreadLocalRandom.current();
-
-            for (int idx = 0; idx < CNT; idx++) {
-                int x = rnd.nextInt(1, 100);
-                int y = rnd.nextInt(1, 100);
-
-                cache1.getAndPut(idx, new EnemyCamp(r.read("POINT(" + x + " " + y + ")"), Integer.toString(idx)));
-
-                points[idx] = Integer.toString(idx);
-            }
-
-            Thread.sleep(200);
-
-            final AtomicBoolean stop = new AtomicBoolean();
-            final AtomicReference<Exception> err = new AtomicReference<>();
-
-            IgniteInternalFuture<?> putFut = GridTestUtils.runMultiThreadedAsync(new Callable<Void>() {
-                @Override public Void call() throws Exception {
-                    WKTReader r = new WKTReader();
-
-                    ThreadLocalRandom rnd = ThreadLocalRandom.current();
-
-                    while (!stop.get()) {
-                        int cacheIdx = rnd.nextInt(0, 3);
-
-                        IgniteCache<Integer, EnemyCamp> cache = cacheIdx == 0 ? cache1 : cacheIdx == 1 ? cache2 : cache3;
-
-                        int idx = rnd.nextInt(CNT);
-                        int x = rnd.nextInt(1, 100);
-                        int y = rnd.nextInt(1, 100);
-
-                        cache.getAndPut(idx, new EnemyCamp(r.read("POINT(" + x + " " + y + ")"), Integer.toString(idx)));
-
-                        U.sleep(50);
-                    }
-
-                    return null;
-                }
-            }, Runtime.getRuntime().availableProcessors(), "put-thread");
-
-            IgniteInternalFuture<?> qryFut = GridTestUtils.runMultiThreadedAsync(new Callable<Void>() {
-                @Override public Void call() throws Exception {
-                    WKTReader r = new WKTReader();
-
-                    ThreadLocalRandom rnd = ThreadLocalRandom.current();
-
-                    while (!stop.get()) {
-                        try {
-                            int cacheIdx = rnd.nextInt(0, 3);
-
-                            IgniteCache<Integer, EnemyCamp> cache = cacheIdx == 0 ? cache1 : cacheIdx == 1 ? cache2 : cache3;
-
-                            SqlQuery<Integer, EnemyCamp> qry = new SqlQuery<>(
-                                EnemyCamp.class, "coords && ?");
-
-                            Collection<Cache.Entry<Integer, EnemyCamp>> res = cache.query(qry.setArgs(
-                                r.read("POLYGON((0 0, 0 100, 100 100, 100 0, 0 0))"))).getAll();
-
-                            checkPoints(res, points);
-
-                            U.sleep(5);
-                        }
-                        catch (Exception e) {
-                            err.set(e);
-
-                            stop.set(true);
-
-                            break;
-                        }
-                    }
-
-                    return null;
-                }
-            }, 4, "qry-thread");
-
-            U.sleep(6000L);
-
-            stop.set(true);
-
-            putFut.get();
-            qryFut.get();
-
-            Exception err0 = err.get();
-
-            if (err0 != null)
-                throw err0;
-        }
-        finally {
-            cache1.destroy();
-        }
-    }
-
-    /**
-     * Check whether result contains all required points.
-     *
-     * @param res Result.
-     * @param points Expected points.
-     */
-    private void checkPoints(Collection<Cache.Entry<Integer, EnemyCamp>> res, String... points) {
-        Set<String> set = new HashSet<>(Arrays.asList(points));
-
-        assertEquals(set.size(), res.size());
-
-        for (Cache.Entry<Integer, EnemyCamp> e : res)
-            assertTrue(set.remove(e.getValue().name));
-    }
-
-    /**
-     * @throws Exception if fails.
-     */
-    public void testSegmentedGeoIndexJoin() throws Exception {
-        IgniteCache<Integer, Enemy> c1 = ignite(0).getOrCreateCache(
-            this.<Integer, Enemy>cacheConfig("enemy", true, Integer.class, Enemy.class));
-        IgniteCache<Integer, EnemyCamp> c2 = ignite(0).getOrCreateCache(
-            this.<Integer, EnemyCamp>cacheConfig("camp", true, Integer.class, EnemyCamp.class));
-
-        try {
-            fillCache();
-
-            checkDistributedQuery();
-
-            checkLocalQuery();
-        }
-        finally {
-            c1.destroy();
-            c2.destroy();
-        }
-    }
-
-    /**
-     * @throws Exception if fails.
-     */
-    public void testSegmentedGeoIndexJoin2() throws Exception {
-        IgniteCache<Integer, Enemy> c1 = ignite(0).getOrCreateCache(
-            this.<Integer, Enemy>cacheConfig("enemy", true, Integer.class, Enemy.class));
-        IgniteCache<Integer, EnemyCamp> c2 = ignite(0).getOrCreateCache(
-            this.<Integer, EnemyCamp>cacheConfig("camp", false, Integer.class, EnemyCamp.class));
-
-        try {
-            fillCache();
-
-            checkDistributedQuery();
-
-            checkLocalQuery();
-        }
-        finally {
-            c1.destroy();
-            c2.destroy();
-        }
-    }
-
-    /** */
-    private void checkDistributedQuery() throws ParseException {
-        IgniteCache<Integer, Enemy> c1 = ignite(0).cache("enemy");
-        IgniteCache<Integer, EnemyCamp> c2 = ignite(0).cache("camp");
-
-        final Geometry lethalArea = new WKTReader().read("POLYGON((30 30, 30 70, 70 70, 70 30, 30 30))");
-
-        int expectedEnemies = 0;
-
-        for (Cache.Entry<Integer, Enemy> e : c1) {
-            final Integer campID = e.getValue().campId;
-
-            if (30 <= campID && campID < ENEMYCAMP_SAMPLES_COUNT) {
-                final EnemyCamp camp = c2.get(campID);
-
-                if (lethalArea.covers(camp.coords))
-                    expectedEnemies++;
-            }
-        }
-
-        final SqlFieldsQuery query = new SqlFieldsQuery("select e._val, c._val from \"enemy\".Enemy e, \"camp\".EnemyCamp c " +
-            "where e.campId = c._key and c.coords && ?").setArgs(lethalArea);
-
-        List<List<?>> result = c1.query(query.setDistributedJoins(true)).getAll();
-
-        assertEquals(expectedEnemies, result.size());
-    }
-
-    /** */
-    private void checkLocalQuery() throws ParseException {
-        IgniteCache<Integer, Enemy> c1 = ignite(0).cache("enemy");
-        IgniteCache<Integer, EnemyCamp> c2 = ignite(0).cache("camp");
-
-        final Geometry lethalArea = new WKTReader().read("POLYGON((30 30, 30 70, 70 70, 70 30, 30 30))");
-
-        Set<Integer> localCampsIDs = new HashSet<>();
-
-        for(Cache.Entry<Integer, EnemyCamp> e : c2.localEntries())
-            localCampsIDs.add(e.getKey());
-
-        int expectedEnemies = 0;
-
-        for (Cache.Entry<Integer, Enemy> e : c1.localEntries()) {
-            final Integer campID = e.getValue().campId;
-
-            if (localCampsIDs.contains(campID)) {
-                final EnemyCamp camp = c2.get(campID);
-
-                if (lethalArea.covers(camp.coords))
-                    expectedEnemies++;
-            }
-        }
-
-        final SqlFieldsQuery query = new SqlFieldsQuery("select e._val, c._val from \"enemy\".Enemy e, \"camp\".EnemyCamp c " +
-            "where e.campId = c._key and c.coords && ?").setArgs(lethalArea);
-
-        List<List<?>> result = c1.query(query.setLocal(true)).getAll();
-
-        assertEquals(expectedEnemies, result.size());
-    }
-
-    /** */
-    private void fillCache() throws ParseException {
-        IgniteCache<Integer, Enemy> c1 = ignite(0).cache("enemy");
-        IgniteCache<Integer, EnemyCamp> c2 = ignite(0).cache("camp");
-
-        final ThreadLocalRandom rnd = ThreadLocalRandom.current();
-
-        WKTReader r = new WKTReader();
-
-        for (int i = 0; i < ENEMYCAMP_SAMPLES_COUNT; i++) {
-            final String point = String.format("POINT(%d %d)", rnd.nextInt(100), rnd.nextInt(100));
-
-            c2.put(i, new EnemyCamp(r.read(point), "camp-" + i));
-        }
-
-        for (int i = 0; i < ENEMY_SAMPLES_COUNT; i++) {
-            int campID = 30 + rnd.nextInt(ENEMYCAMP_SAMPLES_COUNT + 10);
-
-            c1.put(i, new Enemy(campID, "enemy-" + i));
-        }
-    }
-
-    /**
-     *
-     */
-    private static class Enemy {
-        /** */
-        @QuerySqlField
-        int campId;
-
-        /** */
-        @QuerySqlField
-        String name;
-
-        /**
-         * @param campId Camp ID.
-         * @param name Name.
-         */
-        public Enemy(int campId, String name) {
-            this.campId = campId;
-            this.name = name;
-        }
-    }
-
-    /**
-     *
-     */
-    protected static class EnemyCamp implements Serializable {
-        /** */
-        @QuerySqlField(index = true)
-        Geometry coords;
-
-        /** */
-        @QuerySqlField
-        private String name;
-
-        /**
-         * @param coords Coordinates.
-         * @param name Name.
-         */
-        EnemyCamp(Geometry coords, String name) {
-            this.coords = coords;
-            this.name = name;
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/f923bc91/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/GridH2IndexingSegmentedGeoSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/GridH2IndexingSegmentedGeoSelfTest.java b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/GridH2IndexingSegmentedGeoSelfTest.java
deleted file mode 100644
index eb0fd0f..0000000
--- a/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/GridH2IndexingSegmentedGeoSelfTest.java
+++ /dev/null
@@ -1,37 +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.internal.processors.query.h2;
-
-import org.apache.ignite.configuration.CacheConfiguration;
-
-/**
- * Test for segmented geo index.
- */
-public class GridH2IndexingSegmentedGeoSelfTest extends GridH2IndexingGeoSelfTest {
-    /** */
-    private static int QRY_PARALLELISM_LVL = 7;
-
-    /** {@inheritDoc} */
-    @Override
-    protected <K, V> CacheConfiguration<K, V> cacheConfig(String name, boolean partitioned,
-        Class<?>... idxTypes) throws Exception {
-        final CacheConfiguration<K, V> ccfg = super.cacheConfig(name, partitioned, idxTypes);
-
-        return ccfg.setQueryParallelism(partitioned ? QRY_PARALLELISM_LVL : 1);
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/f923bc91/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingAbstractGeoSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingAbstractGeoSelfTest.java b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingAbstractGeoSelfTest.java
new file mode 100644
index 0000000..914bb62
--- /dev/null
+++ b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingAbstractGeoSelfTest.java
@@ -0,0 +1,673 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.query.h2;
+
+import com.vividsolutions.jts.geom.Geometry;
+import com.vividsolutions.jts.io.ParseException;
+import com.vividsolutions.jts.io.WKTReader;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.cache.QueryEntity;
+import org.apache.ignite.cache.QueryIndex;
+import org.apache.ignite.cache.QueryIndexType;
+import org.apache.ignite.cache.query.SqlFieldsQuery;
+import org.apache.ignite.cache.query.SqlQuery;
+import org.apache.ignite.cache.query.annotations.QuerySqlField;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.IgniteInternalFuture;
+import org.apache.ignite.internal.binary.BinaryMarshaller;
+import org.apache.ignite.internal.processors.cache.GridCacheAbstractSelfTest;
+import org.apache.ignite.internal.processors.query.QueryUtils;
+import org.apache.ignite.internal.util.GridStringBuilder;
+import org.apache.ignite.internal.util.typedef.internal.SB;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.testframework.GridTestUtils;
+
+import javax.cache.Cache;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * Geo-indexing test.
+ */
+public abstract class H2IndexingAbstractGeoSelfTest extends GridCacheAbstractSelfTest {
+    /** */
+    private static final int CNT = 100;
+
+    /** */
+    private static final long DUR = 60000L;
+
+    /** Number of generated samples. */
+    public static final int ENEMYCAMP_SAMPLES_COUNT = 500;
+
+    /** Number of generated samples. */
+    public static final int ENEMY_SAMPLES_COUNT = 1000;
+
+    /** */
+    private static final int QRY_PARALLELISM_LVL = 7;
+
+    /** Binary marshaller flag. */
+    private final boolean binary;
+
+    /** Segmented index flag. */
+    private final boolean segmented;
+
+    /**
+     * Constructor.
+     *
+     * @param binary Binary marshaller flag.
+     * @param segmented Segmented index flag.
+     */
+    protected H2IndexingAbstractGeoSelfTest(boolean binary, boolean segmented) {
+        this.binary = binary;
+        this.segmented = segmented;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected int gridCount() {
+        return 3;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected long getTestTimeout() {
+        return DUR * 3;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
+        IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
+
+        if (binary)
+            cfg.setMarshaller(new BinaryMarshaller());
+
+        return cfg;
+    }
+
+    /**
+     * Create cache.
+     *
+     * @param name Name.
+     * @param partitioned Partitioned flag.
+     * @param keyCls Key class.
+     * @param valCls Value class.
+     * @return Cache.
+     * @throws Exception If failed.
+     */
+    @SuppressWarnings("unchecked")
+    protected <K, V> IgniteCache<K, V> createCache(String name, boolean partitioned, Class<?> keyCls, Class<?> valCls)
+        throws Exception {
+        return createCache(name, partitioned, keyCls, valCls, false);
+    }
+
+    /**
+     * Create cache.
+     *
+     * @param name Name.
+     * @param partitioned Partitioned flag.
+     * @param keyCls Key class.
+     * @param valCls Value class.
+     * @param dynamicIdx Whether index should be created dynamically.
+     * @return Cache.
+     * @throws Exception If failed.
+     */
+    @SuppressWarnings("unchecked")
+    protected <K, V> IgniteCache<K, V> createCache(String name, boolean partitioned, Class<?> keyCls, Class<?> valCls,
+        boolean dynamicIdx) throws Exception {
+        CacheConfiguration<K, V> ccfg = cacheConfig(name, partitioned, keyCls, valCls);
+
+        if (dynamicIdx) {
+            Collection<QueryEntity> entities = ccfg.getQueryEntities();
+
+            assertEquals(1, entities.size());
+
+            QueryEntity entity = entities.iterator().next();
+
+            Collection<QueryIndex> idxs = new ArrayList<>(entity.getIndexes());
+
+            entity.clearIndexes();
+
+            IgniteCache<K, V> cache = grid(0).getOrCreateCache(ccfg);
+
+            // Process indexes dynamically.
+            for (QueryIndex idx : idxs)
+                createDynamicIndex(cache, entity, idx);
+
+            return cache;
+        }
+        else
+            return grid(0).getOrCreateCache(ccfg);
+    }
+
+    /**
+     * Create dynamic index.
+     *
+     * @param cache Cache.
+     * @param entity Entity.
+     * @param idx Index.
+     * @throws Exception If failed.
+     */
+    private void createDynamicIndex(IgniteCache cache, QueryEntity entity, QueryIndex idx) throws Exception {
+        boolean spatial = idx.getIndexType() == QueryIndexType.GEOSPATIAL;
+
+        GridStringBuilder sb = new SB("CREATE ")
+            .a(spatial ? "SPATIAL " : "")
+            .a("INDEX ")
+            .a(idx.getName())
+            .a(" ON ")
+            .a(QueryUtils.tableName(entity))
+            .a(" (");
+
+        boolean first = true;
+
+        for (Map.Entry<String, Boolean> fieldEntry : idx.getFields().entrySet()) {
+            if (first)
+                first = false;
+            else
+                sb.a(", ");
+
+            String name = fieldEntry.getKey();
+            boolean asc = fieldEntry.getValue();
+
+            sb.a("\"" + name + "\"").a(" ").a(asc ? "ASC" : "DESC");
+        }
+
+        sb.a(')');
+
+        String sql = sb.toString();
+
+        cache.query(new SqlFieldsQuery(sql)).getAll();
+    }
+
+    /**
+     * @param name Cache name.
+     * @param partitioned Partition or replicated cache.
+     * @param keyCls Key class.
+     * @param valCls Value class.
+     * @return Cache configuration.
+     */
+    private <K, V> CacheConfiguration<K, V> cacheConfig(String name, boolean partitioned, Class<?> keyCls,
+        Class<?> valCls) throws Exception {
+        CacheConfiguration<K, V> ccfg = new CacheConfiguration<K, V>(name)
+            .setName(name)
+            .setCacheMode(partitioned ? CacheMode.PARTITIONED : CacheMode.REPLICATED)
+            .setAtomicityMode(CacheAtomicityMode.ATOMIC)
+            .setIndexedTypes(keyCls, valCls);
+
+        if (segmented)
+            ccfg.setQueryParallelism(partitioned ? QRY_PARALLELISM_LVL : 1);
+
+        return ccfg;
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testPrimitiveGeometry() throws Exception {
+        IgniteCache<Long, Geometry> cache = createCache("geom", true, Long.class, Geometry.class);
+
+        try {
+            WKTReader r = new WKTReader();
+
+            for (long i = 0; i < 100; i++)
+                cache.put(i, r.read("POINT(" + i + " " + i + ")"));
+
+            String plan = cache.query(new SqlFieldsQuery("explain select _key from Geometry where _val && ?")
+                .setArgs(r.read("POLYGON((5 70, 5 80, 30 80, 30 70, 5 70))")).setLocal(true))
+                .getAll().get(0).get(0).toString().toLowerCase();
+
+            assertTrue("__ explain: " + plan, plan.contains("_val_idx"));
+        }
+        finally {
+            cache.destroy();
+        }
+    }
+
+    /**
+     * Test geo-index (static).
+     *
+     * @throws Exception If failed.
+     */
+    public void testGeo() throws Exception {
+        checkGeo(false);
+    }
+
+    /**
+     * Test geo-index (dynamic).
+     *
+     * @throws Exception If failed.
+     */
+    public void testGeoDynamic() throws Exception {
+        checkGeo(true);
+    }
+
+    /**
+     * Check geo-index (dynamic).
+     *
+     * @param dynamic Whether index should be created dynamically.
+     * @throws Exception If failed.
+     */
+    @SuppressWarnings({"unchecked", "ConstantConditions"})
+    private void checkGeo(boolean dynamic) throws Exception {
+        IgniteCache<Integer, EnemyCamp> cache = createCache("camp", true, Integer.class, EnemyCamp.class, dynamic);
+
+        try {
+            WKTReader r = new WKTReader();
+
+            cache.getAndPut(0, new EnemyCamp(r.read("POINT(25 75)"), "A"));
+            cache.getAndPut(1, new EnemyCamp(r.read("POINT(70 70)"), "B"));
+            cache.getAndPut(2, new EnemyCamp(r.read("POINT(70 30)"), "C"));
+            cache.getAndPut(3, new EnemyCamp(r.read("POINT(75 25)"), "D"));
+
+            SqlQuery<Integer, EnemyCamp> qry = new SqlQuery(EnemyCamp.class, "coords && ?");
+
+            Collection<Cache.Entry<Integer, EnemyCamp>> res = cache.query(
+                qry.setArgs(r.read("POLYGON((5 70, 5 80, 30 80, 30 70, 5 70))"))).getAll();
+
+            checkPoints(res, "A");
+
+            res = cache.query(
+                qry.setArgs(r.read("POLYGON((10 5, 10 35, 70 30, 75 25, 10 5))"))).getAll();
+
+            checkPoints(res, "C", "D");
+
+            // Move B to the first polygon.
+            cache.getAndPut(1, new EnemyCamp(r.read("POINT(20 75)"), "B"));
+
+            res = cache.query(
+                qry.setArgs(r.read("POLYGON((5 70, 5 80, 30 80, 30 70, 5 70))"))).getAll();
+
+            checkPoints(res, "A", "B");
+
+            // Move B to the second polygon.
+            cache.getAndPut(1, new EnemyCamp(r.read("POINT(30 30)"), "B"));
+
+            res = cache.query(
+                qry.setArgs(r.read("POLYGON((10 5, 10 35, 70 30, 75 25, 10 5))"))).getAll();
+
+            checkPoints(res, "B", "C", "D");
+
+            // Remove B.
+            cache.getAndRemove(1);
+
+            res = cache.query(
+                qry.setArgs(r.read("POLYGON((5 70, 5 80, 30 80, 30 70, 5 70))"))).getAll();
+
+            checkPoints(res, "A");
+
+            res = cache.query(
+                qry.setArgs(r.read("POLYGON((10 5, 10 35, 70 30, 75 25, 10 5))"))).getAll();
+
+            checkPoints(res, "C", "D");
+
+            // Check explain request.
+            String plan = cache.query(new SqlFieldsQuery("explain select * from EnemyCamp " +
+                "where coords && 'POINT(25 75)'")).getAll().get(0).get(0).toString().toLowerCase();
+
+            assertTrue("__ explain: " + plan, plan.contains("coords_idx"));
+
+            if (dynamic)
+                cache.query(new SqlFieldsQuery("DROP INDEX coords_idx")).getAll();
+        }
+        finally {
+            cache.destroy();
+        }
+    }
+
+    /**
+     * Test geo indexing multithreaded.
+     *
+     * @throws Exception If failed.
+     */
+    public void testGeoMultithreaded() throws Exception {
+        checkGeoMultithreaded(false);
+    }
+
+    /**
+     * Test geo indexing multithreaded with dynamic index creation.
+     *
+     * @throws Exception If failed.
+     */
+    public void testGeoMultithreadedDynamic() throws Exception {
+        checkGeoMultithreaded(true);
+    }
+
+    /**
+     * Check geo indexing multithreaded with dynamic index creation.
+     *
+     * @param dynamic Whether index should be created dynamically.
+     * @throws Exception If failed.
+     */
+    @SuppressWarnings("unchecked")
+    private void checkGeoMultithreaded(boolean dynamic) throws Exception {
+        final IgniteCache<Integer, EnemyCamp> cache1 =
+            createCache("camp", true, Integer.class, EnemyCamp.class, dynamic);
+
+        final IgniteCache<Integer, EnemyCamp> cache2 = grid(1).cache("camp");
+        final IgniteCache<Integer, EnemyCamp> cache3 = grid(2).cache("camp");
+
+        try {
+            final String[] points = new String[CNT];
+
+            WKTReader r = new WKTReader();
+
+            ThreadLocalRandom rnd = ThreadLocalRandom.current();
+
+            for (int idx = 0; idx < CNT; idx++) {
+                int x = rnd.nextInt(1, 100);
+                int y = rnd.nextInt(1, 100);
+
+                cache1.getAndPut(idx, new EnemyCamp(r.read("POINT(" + x + " " + y + ")"), Integer.toString(idx)));
+
+                points[idx] = Integer.toString(idx);
+            }
+
+            Thread.sleep(200);
+
+            final AtomicBoolean stop = new AtomicBoolean();
+            final AtomicReference<Exception> err = new AtomicReference<>();
+
+            IgniteInternalFuture<?> putFut = GridTestUtils.runMultiThreadedAsync(new Callable<Void>() {
+                @Override public Void call() throws Exception {
+                    WKTReader r = new WKTReader();
+
+                    ThreadLocalRandom rnd = ThreadLocalRandom.current();
+
+                    while (!stop.get()) {
+                        int cacheIdx = rnd.nextInt(0, 3);
+
+                        IgniteCache<Integer, EnemyCamp> cache = cacheIdx == 0 ? cache1 : cacheIdx == 1 ? cache2 : cache3;
+
+                        int idx = rnd.nextInt(CNT);
+                        int x = rnd.nextInt(1, 100);
+                        int y = rnd.nextInt(1, 100);
+
+                        cache.getAndPut(idx, new EnemyCamp(r.read("POINT(" + x + " " + y + ")"), Integer.toString(idx)));
+
+                        U.sleep(50);
+                    }
+
+                    return null;
+                }
+            }, Runtime.getRuntime().availableProcessors(), "put-thread");
+
+            IgniteInternalFuture<?> qryFut = GridTestUtils.runMultiThreadedAsync(new Callable<Void>() {
+                @Override public Void call() throws Exception {
+                    WKTReader r = new WKTReader();
+
+                    ThreadLocalRandom rnd = ThreadLocalRandom.current();
+
+                    while (!stop.get()) {
+                        try {
+                            int cacheIdx = rnd.nextInt(0, 3);
+
+                            IgniteCache<Integer, EnemyCamp> cache = cacheIdx == 0 ? cache1 : cacheIdx == 1 ? cache2 : cache3;
+
+                            SqlQuery<Integer, EnemyCamp> qry = new SqlQuery<>(
+                                EnemyCamp.class, "coords && ?");
+
+                            Collection<Cache.Entry<Integer, EnemyCamp>> res = cache.query(qry.setArgs(
+                                r.read("POLYGON((0 0, 0 100, 100 100, 100 0, 0 0))"))).getAll();
+
+                            checkPoints(res, points);
+
+                            U.sleep(5);
+                        }
+                        catch (Exception e) {
+                            err.set(e);
+
+                            stop.set(true);
+
+                            break;
+                        }
+                    }
+
+                    return null;
+                }
+            }, 4, "qry-thread");
+
+            U.sleep(6000L);
+
+            stop.set(true);
+
+            putFut.get();
+            qryFut.get();
+
+            Exception err0 = err.get();
+
+            if (err0 != null)
+                throw err0;
+        }
+        finally {
+            cache1.destroy();
+        }
+    }
+
+    /**
+     * Check whether result contains all required points.
+     *
+     * @param res Result.
+     * @param points Expected points.
+     */
+    private void checkPoints(Collection<Cache.Entry<Integer, EnemyCamp>> res, String... points) {
+        Set<String> set = new HashSet<>(Arrays.asList(points));
+
+        assertEquals(set.size(), res.size());
+
+        for (Cache.Entry<Integer, EnemyCamp> e : res)
+            assertTrue(set.remove(e.getValue().name));
+    }
+
+    /**
+     * Test segmented geo-index join on PARTITIONED cache.
+     *
+     * @throws Exception if fails.
+     */
+    public void testSegmentedGeoIndexJoinPartitioned() throws Exception {
+        checkSegmentedGeoIndexJoin(true, false);
+    }
+
+    /**
+     * Test segmented geo-index join on PARTITIONED cache with dynamically created index.
+     *
+     * @throws Exception if fails.
+     */
+    public void testSegmentedGeoIndexJoinPartitionedDynamic() throws Exception {
+        checkSegmentedGeoIndexJoin(true, true);
+    }
+
+    /**
+     * Test segmented geo-index join on REPLICATED cache.
+     *
+     * @throws Exception if fails.
+     */
+    public void testSegmentedGeoIndexJoinReplicated() throws Exception {
+        checkSegmentedGeoIndexJoin(false, false);
+    }
+
+    /**
+     * Test segmented geo-index join on REPLICATED cache with dynamically created index.
+     *
+     * @throws Exception if fails.
+     */
+    public void testSegmentedGeoIndexJoinReplicatedDynamic() throws Exception {
+        checkSegmentedGeoIndexJoin(false, true);
+    }
+
+    /**
+     * Check segmented geo-index join.
+     *
+     * @param partitioned Partitioned flag.
+     * @param dynamic Whether index should be created dynamically.
+     * @throws Exception If failed.
+     */
+    private void checkSegmentedGeoIndexJoin(boolean partitioned, boolean dynamic) throws Exception {
+        IgniteCache<Integer, Enemy> c1 = createCache("enemy", true, Integer.class, Enemy.class);
+        IgniteCache<Integer, EnemyCamp> c2 = createCache("camp", partitioned, Integer.class, EnemyCamp.class, dynamic);
+
+        try {
+            final ThreadLocalRandom rnd = ThreadLocalRandom.current();
+
+            WKTReader r = new WKTReader();
+
+            for (int i = 0; i < ENEMYCAMP_SAMPLES_COUNT; i++) {
+                final String point = String.format("POINT(%d %d)", rnd.nextInt(100), rnd.nextInt(100));
+
+                c2.put(i, new EnemyCamp(r.read(point), "camp-" + i));
+            }
+
+            for (int i = 0; i < ENEMY_SAMPLES_COUNT; i++) {
+                int campID = 30 + rnd.nextInt(ENEMYCAMP_SAMPLES_COUNT + 10);
+
+                c1.put(i, new Enemy(campID, "enemy-" + i));
+            }
+
+            checkDistributedQuery();
+
+            checkLocalQuery();
+        }
+        finally {
+            c1.destroy();
+            c2.destroy();
+        }
+    }
+
+    /**
+     * Check distributed query.
+     *
+     * @throws ParseException If failed.
+     */
+    private void checkDistributedQuery() throws ParseException {
+        IgniteCache<Integer, Enemy> c1 = grid(0).cache("enemy");
+        IgniteCache<Integer, EnemyCamp> c2 = grid(0).cache("camp");
+
+        final Geometry lethalArea = new WKTReader().read("POLYGON((30 30, 30 70, 70 70, 70 30, 30 30))");
+
+        int expectedEnemies = 0;
+
+        for (Cache.Entry<Integer, Enemy> e : c1) {
+            final Integer campID = e.getValue().campId;
+
+            if (30 <= campID && campID < ENEMYCAMP_SAMPLES_COUNT) {
+                final EnemyCamp camp = c2.get(campID);
+
+                if (lethalArea.covers(camp.coords))
+                    expectedEnemies++;
+            }
+        }
+
+        final SqlFieldsQuery query = new SqlFieldsQuery("select e._val, c._val from \"enemy\".Enemy e, \"camp\".EnemyCamp c " +
+            "where e.campId = c._key and c.coords && ?").setArgs(lethalArea);
+
+        List<List<?>> result = c1.query(query.setDistributedJoins(true)).getAll();
+
+        assertEquals(expectedEnemies, result.size());
+    }
+
+    /**
+     * Check local query.
+     *
+     * @throws ParseException If failed.
+     */
+    private void checkLocalQuery() throws ParseException {
+        IgniteCache<Integer, Enemy> c1 = grid(0).cache("enemy");
+        IgniteCache<Integer, EnemyCamp> c2 = grid(0).cache("camp");
+
+        final Geometry lethalArea = new WKTReader().read("POLYGON((30 30, 30 70, 70 70, 70 30, 30 30))");
+
+        Set<Integer> localCampsIDs = new HashSet<>();
+
+        for(Cache.Entry<Integer, EnemyCamp> e : c2.localEntries())
+            localCampsIDs.add(e.getKey());
+
+        int expectedEnemies = 0;
+
+        for (Cache.Entry<Integer, Enemy> e : c1.localEntries()) {
+            final Integer campID = e.getValue().campId;
+
+            if (localCampsIDs.contains(campID)) {
+                final EnemyCamp camp = c2.get(campID);
+
+                if (lethalArea.covers(camp.coords))
+                    expectedEnemies++;
+            }
+        }
+
+        final SqlFieldsQuery query = new SqlFieldsQuery("select e._val, c._val from \"enemy\".Enemy e, " +
+            "\"camp\".EnemyCamp c where e.campId = c._key and c.coords && ?").setArgs(lethalArea);
+
+        List<List<?>> result = c1.query(query.setLocal(true)).getAll();
+
+        assertEquals(expectedEnemies, result.size());
+    }
+
+    /**
+     *
+     */
+    private static class Enemy {
+        /** */
+        @QuerySqlField
+        int campId;
+
+        /** */
+        @QuerySqlField
+        String name;
+
+        /**
+         * @param campId Camp ID.
+         * @param name Name.
+         */
+        public Enemy(int campId, String name) {
+            this.campId = campId;
+            this.name = name;
+        }
+    }
+
+    /**
+     *
+     */
+    protected static class EnemyCamp implements Serializable {
+        /** */
+        @QuerySqlField(index = true)
+        Geometry coords;
+
+        /** */
+        @QuerySqlField
+        private String name;
+
+        /**
+         * @param coords Coordinates.
+         * @param name Name.
+         */
+        EnemyCamp(Geometry coords, String name) {
+            this.coords = coords;
+            this.name = name;
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/f923bc91/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingBinaryGeoSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingBinaryGeoSelfTest.java b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingBinaryGeoSelfTest.java
new file mode 100644
index 0000000..eb3ec6e
--- /dev/null
+++ b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingBinaryGeoSelfTest.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.internal.processors.query.h2;
+
+/**
+ * Geo-indexing test for binary mode.
+ */
+public class H2IndexingBinaryGeoSelfTest extends H2IndexingAbstractGeoSelfTest {
+    /**
+     * Constructor.
+     */
+    public H2IndexingBinaryGeoSelfTest() {
+        super(true, false);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/f923bc91/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingBinarySegmentedGeoSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingBinarySegmentedGeoSelfTest.java b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingBinarySegmentedGeoSelfTest.java
new file mode 100644
index 0000000..fe94a3d
--- /dev/null
+++ b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingBinarySegmentedGeoSelfTest.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.internal.processors.query.h2;
+
+/**
+ * Geo-indexing test for binary mode and segmented cache.
+ */
+public class H2IndexingBinarySegmentedGeoSelfTest extends H2IndexingAbstractGeoSelfTest {
+    /**
+     * Constructor.
+     */
+    public H2IndexingBinarySegmentedGeoSelfTest() {
+        super(true, true);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/f923bc91/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingGeoSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingGeoSelfTest.java b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingGeoSelfTest.java
new file mode 100644
index 0000000..280c946
--- /dev/null
+++ b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingGeoSelfTest.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.internal.processors.query.h2;
+
+/**
+ * Geo-indexing test.
+ */
+public class H2IndexingGeoSelfTest extends H2IndexingAbstractGeoSelfTest {
+    /**
+     * Constructor.
+     */
+    public H2IndexingGeoSelfTest() {
+        super(false, false);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/f923bc91/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingSegmentedGeoSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingSegmentedGeoSelfTest.java b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingSegmentedGeoSelfTest.java
new file mode 100644
index 0000000..b2cf781
--- /dev/null
+++ b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/H2IndexingSegmentedGeoSelfTest.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.internal.processors.query.h2;
+
+/**
+ * Test for segmented geo index.
+ */
+public class H2IndexingSegmentedGeoSelfTest extends H2IndexingAbstractGeoSelfTest {
+    /**
+     * Constructor.
+     */
+    public H2IndexingSegmentedGeoSelfTest() {
+        super(false, true);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/f923bc91/modules/geospatial/src/test/java/org/apache/ignite/testsuites/GeoSpatialIndexingTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/geospatial/src/test/java/org/apache/ignite/testsuites/GeoSpatialIndexingTestSuite.java b/modules/geospatial/src/test/java/org/apache/ignite/testsuites/GeoSpatialIndexingTestSuite.java
index 3907b9e..2395b93 100644
--- a/modules/geospatial/src/test/java/org/apache/ignite/testsuites/GeoSpatialIndexingTestSuite.java
+++ b/modules/geospatial/src/test/java/org/apache/ignite/testsuites/GeoSpatialIndexingTestSuite.java
@@ -18,9 +18,10 @@
 package org.apache.ignite.testsuites;
 
 import junit.framework.TestSuite;
-import org.apache.ignite.internal.processors.query.h2.GridBinaryH2IndexingGeoSelfTest;
-import org.apache.ignite.internal.processors.query.h2.GridH2IndexingGeoSelfTest;
-import org.apache.ignite.internal.processors.query.h2.GridH2IndexingSegmentedGeoSelfTest;
+import org.apache.ignite.internal.processors.query.h2.H2IndexingBinaryGeoSelfTest;
+import org.apache.ignite.internal.processors.query.h2.H2IndexingBinarySegmentedGeoSelfTest;
+import org.apache.ignite.internal.processors.query.h2.H2IndexingGeoSelfTest;
+import org.apache.ignite.internal.processors.query.h2.H2IndexingSegmentedGeoSelfTest;
 
 /**
  * Geospatial indexing tests.
@@ -33,10 +34,11 @@ public class GeoSpatialIndexingTestSuite extends TestSuite {
     public static TestSuite suite() throws Exception {
         TestSuite suite = new TestSuite("H2 Geospatial Indexing Test Suite");
 
-        // Geo.
-        suite.addTestSuite(GridH2IndexingGeoSelfTest.class);
-        suite.addTestSuite(GridBinaryH2IndexingGeoSelfTest.class);
-        suite.addTestSuite(GridH2IndexingSegmentedGeoSelfTest.class);
+        suite.addTestSuite(H2IndexingGeoSelfTest.class);
+        suite.addTestSuite(H2IndexingSegmentedGeoSelfTest.class);
+
+        suite.addTestSuite(H2IndexingBinaryGeoSelfTest.class);
+        suite.addTestSuite(H2IndexingBinarySegmentedGeoSelfTest.class);
 
         return suite;
     }


[31/70] [abbrv] ignite git commit: IGNITE-4565: Implemented CREATE INDEX and DROP INDEX. This closes #1773. This closes #1804.

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractConcurrentSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractConcurrentSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractConcurrentSelfTest.java
new file mode 100644
index 0000000..d2a2f49
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractConcurrentSelfTest.java
@@ -0,0 +1,921 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache.index;
+
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.Ignition;
+import org.apache.ignite.binary.BinaryObject;
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.cache.QueryIndex;
+import org.apache.ignite.cache.query.SqlQuery;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.internal.IgniteInternalFuture;
+import org.apache.ignite.internal.processors.query.GridQueryProcessor;
+import org.apache.ignite.internal.processors.query.QueryIndexDescriptorImpl;
+import org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing;
+import org.apache.ignite.internal.processors.query.schema.SchemaIndexCacheVisitor;
+import org.apache.ignite.internal.processors.query.schema.SchemaOperationException;
+import org.apache.ignite.internal.util.typedef.T2;
+import org.jetbrains.annotations.Nullable;
+
+import javax.cache.Cache;
+import java.util.*;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Concurrency tests for dynamic index create/drop.
+ */
+@SuppressWarnings("unchecked")
+public abstract class DynamicIndexAbstractConcurrentSelfTest extends DynamicIndexAbstractSelfTest {
+    /** Test duration. */
+    private static final long TEST_DUR = 10_000L;
+
+    /** Large cache size. */
+    private static final int LARGE_CACHE_SIZE = 100_000;
+
+    /** Latches to block certain index operations. */
+    private static final ConcurrentHashMap<UUID, T2<CountDownLatch, AtomicBoolean>> BLOCKS = new ConcurrentHashMap<>();
+
+    /** Cache mode. */
+    private final CacheMode cacheMode;
+
+    /** Atomicity mode. */
+    private final CacheAtomicityMode atomicityMode;
+
+    /**
+     * Constructor.
+     *
+     * @param cacheMode Cache mode.
+     * @param atomicityMode Atomicity mode.
+     */
+    protected DynamicIndexAbstractConcurrentSelfTest(CacheMode cacheMode, CacheAtomicityMode atomicityMode) {
+        this.cacheMode = cacheMode;
+        this.atomicityMode = atomicityMode;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void beforeTest() throws Exception {
+        super.beforeTest();
+
+        GridQueryProcessor.idxCls = BlockingIndexing.class;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        GridQueryProcessor.idxCls = null;
+
+        for (T2<CountDownLatch, AtomicBoolean> block : BLOCKS.values())
+            block.get1().countDown();
+
+        BLOCKS.clear();
+
+        stopAllGrids();
+
+        super.afterTest();
+    }
+
+    /** {@inheritDoc} */
+    @Override protected long getTestTimeout() {
+        return 5 * 60 * 1000L;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected CacheConfiguration<KeyClass, ValueClass> cacheConfiguration() {
+        CacheConfiguration<KeyClass, ValueClass> ccfg =  super.cacheConfiguration();
+
+        return ccfg.setCacheMode(cacheMode).setAtomicityMode(atomicityMode);
+    }
+
+    /**
+     * Make sure that coordinator migrates correctly between nodes.
+     *
+     * @throws Exception If failed.
+     */
+    public void testCoordinatorChange() throws Exception {
+        // Start servers.
+        Ignite srv1 = Ignition.start(serverConfiguration(1));
+        Ignite srv2 = Ignition.start(serverConfiguration(2));
+        Ignition.start(serverConfiguration(3, true));
+        Ignition.start(serverConfiguration(4));
+
+        UUID srv1Id = srv1.cluster().localNode().id();
+        UUID srv2Id = srv2.cluster().localNode().id();
+
+        // Start client which will execute operations.
+        Ignite cli = Ignition.start(clientConfiguration(5));
+
+        cli.getOrCreateCache(cacheConfiguration());
+
+        put(srv1, 0, KEY_AFTER);
+
+        // Test migration between normal servers.
+        blockIndexing(srv1Id);
+
+        QueryIndex idx1 = index(IDX_NAME_1, field(FIELD_NAME_1));
+
+        IgniteInternalFuture<?> idxFut1 = queryProcessor(cli).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx1, false);
+
+        Thread.sleep(100);
+
+        //srv1.close();
+        Ignition.stop(srv1.name(), true);
+
+        unblockIndexing(srv1Id);
+
+        idxFut1.get();
+
+        assertIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1, field(FIELD_NAME_1));
+        assertIndexUsed(IDX_NAME_1, SQL_SIMPLE_FIELD_1, SQL_ARG_1);
+        assertSqlSimpleData(SQL_SIMPLE_FIELD_1, KEY_AFTER - SQL_ARG_1);
+
+        // Test migration from normal server to non-affinity server.
+        blockIndexing(srv2Id);
+
+        QueryIndex idx2 = index(IDX_NAME_2, field(alias(FIELD_NAME_2)));
+
+        IgniteInternalFuture<?> idxFut2 = queryProcessor(cli).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx2, false);
+
+        Thread.sleep(100);
+
+        //srv2.close();
+        Ignition.stop(srv2.name(), true);
+
+        unblockIndexing(srv2Id);
+
+        idxFut2.get();
+
+        assertIndex(CACHE_NAME, TBL_NAME, IDX_NAME_2, field(alias(FIELD_NAME_2)));
+        assertIndexUsed(IDX_NAME_2, SQL_SIMPLE_FIELD_2, SQL_ARG_1);
+        assertSqlSimpleData(SQL_SIMPLE_FIELD_2, KEY_AFTER - SQL_ARG_1);
+    }
+
+    /**
+     * Test operations join.
+     *
+     * @throws Exception If failed.
+     */
+    public void testOperationChaining() throws Exception {
+        Ignite srv1 = Ignition.start(serverConfiguration(1));
+
+        Ignition.start(serverConfiguration(2));
+        Ignition.start(serverConfiguration(3, true));
+        Ignition.start(clientConfiguration(4));
+
+        srv1.getOrCreateCache(cacheConfiguration());
+
+        blockIndexing(srv1);
+
+        QueryIndex idx1 = index(IDX_NAME_1, field(FIELD_NAME_1));
+        QueryIndex idx2 = index(IDX_NAME_2, field(alias(FIELD_NAME_2)));
+
+        IgniteInternalFuture<?> idxFut1 = queryProcessor(srv1).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx1, false);
+        IgniteInternalFuture<?> idxFut2 = queryProcessor(srv1).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx2, false);
+
+        // Start even more nodes of different flavors
+        Ignition.start(serverConfiguration(5));
+        Ignition.start(serverConfiguration(6, true));
+        Ignition.start(clientConfiguration(7));
+
+        assert !idxFut1.isDone();
+        assert !idxFut2.isDone();
+
+        unblockIndexing(srv1);
+
+        idxFut1.get();
+        idxFut2.get();
+
+        assertIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1, field(FIELD_NAME_1));
+        assertIndex(CACHE_NAME, TBL_NAME, IDX_NAME_2, field(alias(FIELD_NAME_2)));
+
+        Thread.sleep(100);
+
+        put(srv1, 0, KEY_AFTER);
+
+        assertIndexUsed(IDX_NAME_1, SQL_SIMPLE_FIELD_1, SQL_ARG_1);
+        assertIndexUsed(IDX_NAME_2, SQL_SIMPLE_FIELD_2, SQL_ARG_1);
+
+        assertSqlSimpleData(SQL_SIMPLE_FIELD_1, KEY_AFTER - SQL_ARG_1);
+        assertSqlSimpleData(SQL_SIMPLE_FIELD_2, KEY_AFTER - SQL_ARG_1);
+    }
+
+    /**
+     * Test node join on pending operation.
+     *
+     * @throws Exception If failed.
+     */
+    public void testNodeJoinOnPendingOperation() throws Exception {
+        Ignite srv1 = Ignition.start(serverConfiguration(1));
+
+        srv1.getOrCreateCache(cacheConfiguration());
+
+        blockIndexing(srv1);
+
+        QueryIndex idx = index(IDX_NAME_1, field(FIELD_NAME_1));
+
+        IgniteInternalFuture<?> idxFut = queryProcessor(srv1).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, false);
+
+        Ignition.start(serverConfiguration(2));
+        Ignition.start(serverConfiguration(3, true));
+        Ignition.start(clientConfiguration(4));
+
+        assert !idxFut.isDone();
+
+        unblockIndexing(srv1);
+
+        idxFut.get();
+
+        Thread.sleep(100L);
+
+        assertIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1, field(FIELD_NAME_1));
+
+        put(srv1, 0, KEY_AFTER);
+
+        assertIndexUsed(IDX_NAME_1, SQL_SIMPLE_FIELD_1, SQL_ARG_1);
+        assertSqlSimpleData(SQL_SIMPLE_FIELD_1, KEY_AFTER - SQL_ARG_1);
+    }
+
+    /**
+     * PUT/REMOVE data from cache and build index concurrently.
+     *
+     * @throws Exception If failed,
+     */
+    public void testConcurrentPutRemove() throws Exception {
+        // Start several nodes.
+        Ignite srv1 = Ignition.start(serverConfiguration(1));
+        Ignition.start(serverConfiguration(2));
+        Ignition.start(serverConfiguration(3));
+        Ignition.start(serverConfiguration(4));
+
+        awaitPartitionMapExchange();
+
+        IgniteCache<BinaryObject, BinaryObject> cache = srv1.createCache(cacheConfiguration()).withKeepBinary();
+
+        // Start data change operations from several threads.
+        final AtomicBoolean stopped = new AtomicBoolean();
+
+        IgniteInternalFuture updateFut = multithreadedAsync(new Callable<Void>() {
+            @Override public Void call() throws Exception {
+                while (!stopped.get()) {
+                    Ignite node = grid(ThreadLocalRandom.current().nextInt(1, 5));
+
+                    int key = ThreadLocalRandom.current().nextInt(0, LARGE_CACHE_SIZE);
+                    int val = ThreadLocalRandom.current().nextInt();
+
+                    BinaryObject keyObj = key(node, key);
+
+                    if (ThreadLocalRandom.current().nextBoolean()) {
+                        BinaryObject valObj = value(node, val);
+
+                        node.cache(CACHE_NAME).put(keyObj, valObj);
+                    }
+                    else
+                        node.cache(CACHE_NAME).remove(keyObj);
+                }
+
+                return null;
+            }
+        }, 4);
+
+        // Let some to arrive.
+        Thread.sleep(500L);
+
+        // Create index.
+        QueryIndex idx = index(IDX_NAME_1, field(FIELD_NAME_1));
+
+        queryProcessor(srv1).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, false).get();
+
+        // Stop updates once index is ready.
+        stopped.set(true);
+
+        updateFut.get();
+
+        // Make sure index is there.
+        assertIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1, field(FIELD_NAME_1));
+        assertIndexUsed(IDX_NAME_1, SQL_SIMPLE_FIELD_1, SQL_ARG_1);
+
+        // Get expected values.
+        Map<Long, Long> expKeys = new HashMap<>();
+
+        for (int i = 0; i < LARGE_CACHE_SIZE; i++) {
+            BinaryObject val = cache.get(key(srv1, i));
+
+            if (val != null) {
+                long fieldVal = val.field(FIELD_NAME_1);
+
+                if (fieldVal >= SQL_ARG_1)
+                    expKeys.put((long)i, fieldVal);
+            }
+        }
+
+        // Validate query result.
+        for (Ignite node : Ignition.allGrids()) {
+            IgniteCache<BinaryObject, BinaryObject> nodeCache = node.cache(CACHE_NAME).withKeepBinary();
+
+            SqlQuery qry = new SqlQuery(tableName(ValueClass.class), SQL_SIMPLE_FIELD_1).setArgs(SQL_ARG_1);
+
+            List<Cache.Entry<BinaryObject, BinaryObject>> res = nodeCache.query(qry).getAll();
+
+            assertEquals("Cache size mismatch [exp=" + expKeys.size() + ", actual=" + res.size() + ']',
+                expKeys.size(), res.size());
+
+            for (Cache.Entry<BinaryObject, BinaryObject> entry : res) {
+                long key = entry.getKey().field(FIELD_KEY);
+                Long fieldVal = entry.getValue().field(FIELD_NAME_1);
+
+                assertTrue("Expected key is not in result set: " + key, expKeys.containsKey(key));
+
+                assertEquals("Unexpected value [key=" + key + ", expVal=" + expKeys.get(key) +
+                    ", actualVal=" + fieldVal + ']', expKeys.get(key), fieldVal);
+            }
+
+        }
+    }
+
+    /**
+     * Test index consistency on re-balance.
+     *
+     * @throws Exception If failed.
+     */
+    public void testConcurrentRebalance() throws Exception {
+        // Start cache and populate it with data.
+        Ignite srv1 = Ignition.start(serverConfiguration(1));
+        Ignite srv2 = Ignition.start(serverConfiguration(2));
+
+        srv1.createCache(cacheConfiguration());
+
+        awaitPartitionMapExchange();
+
+        put(srv1, 0, LARGE_CACHE_SIZE);
+
+        // Start index operation in blocked state.
+        blockIndexing(srv1);
+        blockIndexing(srv2);
+
+        QueryIndex idx = index(IDX_NAME_1, field(FIELD_NAME_1));
+
+        final IgniteInternalFuture<?> idxFut =
+            queryProcessor(srv1).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, false);
+
+        Thread.sleep(100);
+
+        // Start two more nodes and unblock index operation in the middle.
+        Ignition.start(serverConfiguration(3));
+
+        unblockIndexing(srv1);
+        unblockIndexing(srv2);
+
+        Ignition.start(serverConfiguration(4));
+
+        awaitPartitionMapExchange();
+
+        // Validate index state.
+        idxFut.get();
+
+        assertIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1, field(FIELD_NAME_1));
+
+        assertIndexUsed(IDX_NAME_1, SQL_SIMPLE_FIELD_1, SQL_ARG_1);
+        assertSqlSimpleData(SQL_SIMPLE_FIELD_1, LARGE_CACHE_SIZE - SQL_ARG_1);
+    }
+
+    /**
+     * Check what happen in case cache is destroyed before operation is started.
+     *
+     * @throws Exception If failed.
+     */
+    public void testConcurrentCacheDestroy() throws Exception {
+        // Start complex topology.
+        Ignite srv1 = Ignition.start(serverConfiguration(1));
+
+        Ignition.start(serverConfiguration(2));
+        Ignition.start(serverConfiguration(3, true));
+
+        Ignite cli = Ignition.start(clientConfiguration(4));
+
+        // Start cache and populate it with data.
+        IgniteCache cache = cli.getOrCreateCache(cacheConfiguration());
+
+        put(cli, KEY_AFTER);
+
+        // Start index operation and block it on coordinator.
+        blockIndexing(srv1);
+
+        QueryIndex idx = index(IDX_NAME_1, field(FIELD_NAME_1));
+
+        final IgniteInternalFuture<?> idxFut =
+            queryProcessor(srv1).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, false);
+
+        Thread.sleep(100);
+
+        // Destroy cache.
+        cache.destroy();
+
+        // Unblock indexing and see what happens.
+        unblockIndexing(srv1);
+
+        try {
+            idxFut.get();
+
+            fail("Exception has not been thrown.");
+        }
+        catch (SchemaOperationException e) {
+            // No-op.
+        }
+    }
+
+    /**
+     * Make sure that contended operations on the same index from different nodes do not hang.
+     *
+     * @throws Exception If failed.
+     */
+    public void testConcurrentOperationsMultithreaded() throws Exception {
+        // Start complex topology.
+        Ignition.start(serverConfiguration(1));
+        Ignition.start(serverConfiguration(2));
+        Ignition.start(serverConfiguration(3, true));
+
+        Ignite cli = Ignition.start(clientConfiguration(4));
+
+        cli.createCache(cacheConfiguration());
+
+        final AtomicBoolean stopped = new AtomicBoolean();
+
+        // Start several threads which will mess around indexes.
+        final QueryIndex idx = index(IDX_NAME_1, field(FIELD_NAME_1));
+
+        IgniteInternalFuture idxFut = multithreadedAsync(new Callable<Void>() {
+            @Override public Void call() throws Exception {
+                boolean exists = false;
+
+                while (!stopped.get()) {
+                    Ignite node = grid(ThreadLocalRandom.current().nextInt(1, 5));
+
+                    IgniteInternalFuture fut;
+
+                    if (exists) {
+                        fut = queryProcessor(node).dynamicIndexDrop(CACHE_NAME, IDX_NAME_1, true);
+
+                        exists = false;
+                    }
+                    else {
+                        fut = queryProcessor(node).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, true);
+
+                        exists = true;
+                    }
+
+                    try {
+                        fut.get();
+                    }
+                    catch (SchemaOperationException e) {
+                        // No-op.
+                    }
+                    catch (Exception e) {
+                        fail("Unexpected exception: " + e);
+                    }
+                }
+
+                return null;
+            }
+        }, 8);
+
+        Thread.sleep(TEST_DUR);
+
+        stopped.set(true);
+
+        // Make sure nothing hanged.
+        idxFut.get();
+
+        queryProcessor(cli).dynamicIndexDrop(CACHE_NAME, IDX_NAME_1, true).get();
+        queryProcessor(cli).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, true).get();
+
+        assertIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1, field(FIELD_NAME_1));
+
+        put(cli, 0, KEY_AFTER);
+
+        assertIndexUsed(IDX_NAME_1, SQL_SIMPLE_FIELD_1, SQL_ARG_1);
+        assertSqlSimpleData(SQL_SIMPLE_FIELD_1, KEY_AFTER - SQL_ARG_1);
+    }
+
+    /**
+     * Make sure that contended operations on the same index from different nodes do not hang when we issue both
+     * CREATE/DROP and SELECT statements.
+     *
+     * @throws Exception If failed.
+     */
+    public void testQueryConsistencyMultithreaded() throws Exception {
+        // Start complex topology.
+        Ignition.start(serverConfiguration(1));
+        Ignition.start(serverConfiguration(2));
+        Ignition.start(serverConfiguration(3, true));
+
+        Ignite cli = Ignition.start(clientConfiguration(4));
+
+        cli.createCache(cacheConfiguration());
+
+        put(cli, 0, KEY_AFTER);
+
+        final AtomicBoolean stopped = new AtomicBoolean();
+
+        // Thread which will mess around indexes.
+        final QueryIndex idx = index(IDX_NAME_1, field(FIELD_NAME_1));
+
+        IgniteInternalFuture idxFut = multithreadedAsync(new Callable<Void>() {
+            @Override public Void call() throws Exception {
+                boolean exists = false;
+
+                while (!stopped.get()) {
+                    Ignite node = grid(ThreadLocalRandom.current().nextInt(1, 5));
+
+                    IgniteInternalFuture fut;
+
+                    if (exists) {
+                        fut = queryProcessor(node).dynamicIndexDrop(CACHE_NAME, IDX_NAME_1, true);
+
+                        exists = false;
+                    }
+                    else {
+                        fut = queryProcessor(node).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, true);
+
+                        exists = true;
+                    }
+
+                    try {
+                        fut.get();
+                    }
+                    catch (SchemaOperationException e) {
+                        // No-op.
+                    }
+                    catch (Exception e) {
+                        fail("Unexpected exception: " + e);
+                    }
+                }
+
+                return null;
+            }
+        }, 1);
+
+        IgniteInternalFuture qryFut = multithreadedAsync(new Callable<Void>() {
+            @Override public Void call() throws Exception {
+                while (!stopped.get()) {
+                    Ignite node = grid(ThreadLocalRandom.current().nextInt(1, 5));
+
+                    assertSqlSimpleData(node, SQL_SIMPLE_FIELD_1, KEY_AFTER - SQL_ARG_1);
+                }
+
+                return null;
+            }
+        }, 8);
+
+        Thread.sleep(TEST_DUR);
+
+        stopped.set(true);
+
+        // Make sure nothing hanged.
+        idxFut.get();
+        qryFut.get();
+    }
+
+    /**
+     * Test concurrent node start/stop along with index operations. Nothing should hang.
+     *
+     * @throws Exception If failed.
+     */
+    public void testConcurrentOperationsAndNodeStartStopMultithreaded() throws Exception {
+        // Start several stable nodes.
+        Ignition.start(serverConfiguration(1));
+        Ignition.start(serverConfiguration(2));
+        Ignition.start(serverConfiguration(3, true));
+
+        final Ignite cli = Ignition.start(clientConfiguration(4));
+
+        cli.createCache(cacheConfiguration());
+
+        final AtomicBoolean stopped = new AtomicBoolean();
+
+        // Start node start/stop worker.
+        final AtomicInteger nodeIdx = new AtomicInteger(4);
+
+        IgniteInternalFuture startStopFut = multithreadedAsync(new Callable<Void>() {
+            @Override public Void call() throws Exception {
+                boolean exists = false;
+
+                int lastIdx = 0;
+
+                while (!stopped.get()) {
+                    if (exists) {
+                        stopGrid(lastIdx);
+
+                        exists = false;
+                    }
+                    else {
+                        lastIdx = nodeIdx.incrementAndGet();
+
+                        IgniteConfiguration cfg;
+
+                        switch (ThreadLocalRandom.current().nextInt(0, 3)) {
+                            case 1:
+                                cfg = serverConfiguration(lastIdx, false);
+
+                                break;
+
+                            case 2:
+
+                                cfg = serverConfiguration(lastIdx, true);
+
+                                break;
+
+                            default:
+                                cfg = clientConfiguration(lastIdx);
+                        }
+
+                        Ignition.start(cfg);
+
+                        exists = true;
+                    }
+
+                    Thread.sleep(ThreadLocalRandom.current().nextLong(500L, 1500L));
+                }
+
+                return null;
+            }
+        }, 1);
+
+        // Start several threads which will mess around indexes.
+        final QueryIndex idx = index(IDX_NAME_1, field(FIELD_NAME_1));
+
+        IgniteInternalFuture idxFut = multithreadedAsync(new Callable<Void>() {
+            @Override public Void call() throws Exception {
+                boolean exists = false;
+
+                while (!stopped.get()) {
+                    Ignite node = grid(ThreadLocalRandom.current().nextInt(1, 5));
+
+                    IgniteInternalFuture fut;
+
+                    if (exists) {
+                        fut = queryProcessor(node).dynamicIndexDrop(CACHE_NAME, IDX_NAME_1, true);
+
+                        exists = false;
+                    }
+                    else {
+                        fut = queryProcessor(node).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, true);
+
+                        exists = true;
+                    }
+
+                    try {
+                        fut.get();
+                    }
+                    catch (SchemaOperationException e) {
+                        // No-op.
+                    }
+                    catch (Exception e) {
+                        fail("Unexpected exception: " + e);
+                    }
+                }
+
+                return null;
+            }
+        }, 1);
+
+        Thread.sleep(TEST_DUR);
+
+        stopped.set(true);
+
+        // Make sure nothing hanged.
+        startStopFut.get();
+        idxFut.get();
+
+        // Make sure cache is operational at this point.
+        cli.getOrCreateCache(cacheConfiguration());
+
+        queryProcessor(cli).dynamicIndexDrop(CACHE_NAME, IDX_NAME_1, true).get();
+        queryProcessor(cli).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, true).get();
+
+        assertIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1, field(FIELD_NAME_1));
+
+        put(cli, 0, KEY_AFTER);
+
+        assertIndexUsed(IDX_NAME_1, SQL_SIMPLE_FIELD_1, SQL_ARG_1);
+        assertSqlSimpleData(SQL_SIMPLE_FIELD_1, KEY_AFTER - SQL_ARG_1);
+    }
+
+    /**
+     * Multithreaded cache start/stop along with index operations. Nothing should hang.
+     *
+     * @throws Exception If failed.
+     */
+    public void testConcurrentOperationsAndCacheStartStopMultithreaded() throws Exception {
+        // Start complex topology.
+        Ignition.start(serverConfiguration(1));
+        Ignition.start(serverConfiguration(2));
+        Ignition.start(serverConfiguration(3, true));
+
+        Ignite cli = Ignition.start(clientConfiguration(4));
+
+        final AtomicBoolean stopped = new AtomicBoolean();
+
+        // Start cache create/destroy worker.
+        IgniteInternalFuture startStopFut = multithreadedAsync(new Callable<Void>() {
+            @Override public Void call() throws Exception {
+                boolean exists = false;
+
+                while (!stopped.get()) {
+                    Ignite node = grid(ThreadLocalRandom.current().nextInt(1, 5));
+
+                    if (exists) {
+                        node.destroyCache(CACHE_NAME);
+
+                        exists = false;
+                    }
+                    else {
+                        node.createCache(cacheConfiguration());
+
+                        exists = true;
+                    }
+
+                    Thread.sleep(ThreadLocalRandom.current().nextLong(200L, 400L));
+                }
+
+                return null;
+            }
+        }, 1);
+
+        // Start several threads which will mess around indexes.
+        final QueryIndex idx = index(IDX_NAME_1, field(FIELD_NAME_1));
+
+        IgniteInternalFuture idxFut = multithreadedAsync(new Callable<Void>() {
+            @Override public Void call() throws Exception {
+                boolean exists = false;
+
+                while (!stopped.get()) {
+                    Ignite node = grid(ThreadLocalRandom.current().nextInt(1, 5));
+
+                    IgniteInternalFuture fut;
+
+                    if (exists) {
+                        fut = queryProcessor(node).dynamicIndexDrop(CACHE_NAME, IDX_NAME_1, true);
+
+                        exists = false;
+                    }
+                    else {
+                        fut = queryProcessor(node).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, true);
+
+                        exists = true;
+                    }
+
+                    try {
+                        fut.get();
+                    }
+                    catch (SchemaOperationException e) {
+                        // No-op.
+                    }
+                    catch (Exception e) {
+                        fail("Unexpected exception: " + e);
+                    }
+                }
+
+                return null;
+            }
+        }, 8);
+
+        Thread.sleep(TEST_DUR);
+
+        stopped.set(true);
+
+        // Make sure nothing hanged.
+        startStopFut.get();
+        idxFut.get();
+
+        // Make sure cache is operational at this point.
+        cli.getOrCreateCache(cacheConfiguration());
+
+        queryProcessor(cli).dynamicIndexDrop(CACHE_NAME, IDX_NAME_1, true).get();
+        queryProcessor(cli).dynamicIndexCreate(CACHE_NAME, TBL_NAME, idx, true).get();
+
+        assertIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1, field(FIELD_NAME_1));
+
+        put(cli, 0, KEY_AFTER);
+
+        assertIndexUsed(IDX_NAME_1, SQL_SIMPLE_FIELD_1, SQL_ARG_1);
+        assertSqlSimpleData(SQL_SIMPLE_FIELD_1, KEY_AFTER - SQL_ARG_1);
+    }
+
+    /**
+     * Block indexing.
+     *
+     * @param node Node.
+     */
+    @SuppressWarnings("SuspiciousMethodCalls")
+    private static void blockIndexing(Ignite node) {
+        UUID nodeId = ((IgniteEx)node).localNode().id();
+
+        blockIndexing(nodeId);
+    }
+
+    /**
+     * Block indexing.
+     *
+     * @param nodeId Node.
+     */
+    @SuppressWarnings("SuspiciousMethodCalls")
+    private static void blockIndexing(UUID nodeId) {
+        assertFalse(BLOCKS.contains(nodeId));
+
+        BLOCKS.put(nodeId, new T2<>(new CountDownLatch(1), new AtomicBoolean()));
+    }
+
+    /**
+     * Unblock indexing.
+     *
+     * @param node Node.
+     */
+    private static void unblockIndexing(Ignite node) {
+        UUID nodeId = ((IgniteEx)node).localNode().id();
+
+        unblockIndexing(nodeId);
+    }
+
+    /**
+     * Unblock indexing.
+     *
+     * @param nodeId Node ID.
+     */
+    private static void unblockIndexing(UUID nodeId) {
+        T2<CountDownLatch, AtomicBoolean> blocker = BLOCKS.remove(nodeId);
+
+        assertNotNull(blocker);
+
+        blocker.get1().countDown();
+    }
+
+    /**
+     * Await indexing.
+     *
+     * @param nodeId Node ID.
+     */
+    private static void awaitIndexing(UUID nodeId) {
+        T2<CountDownLatch, AtomicBoolean> blocker = BLOCKS.get(nodeId);
+
+        if (blocker != null) {
+            assertTrue(blocker.get2().compareAndSet(false, true));
+
+            while (true) {
+                try {
+                    blocker.get1().await();
+
+                    break;
+                }
+                catch (InterruptedException e) {
+                    // No-op.
+                }
+            }
+        }
+    }
+
+    /**
+     * Blocking indexing processor.
+     */
+    private static class BlockingIndexing extends IgniteH2Indexing {
+        /** {@inheritDoc} */
+        @Override public void dynamicIndexCreate(@Nullable String spaceName, String tblName,
+            QueryIndexDescriptorImpl idxDesc, boolean ifNotExists, SchemaIndexCacheVisitor cacheVisitor)
+            throws IgniteCheckedException {
+            awaitIndexing(ctx.localNodeId());
+
+            super.dynamicIndexCreate(spaceName, tblName, idxDesc, ifNotExists, cacheVisitor);
+        }
+
+        /** {@inheritDoc} */
+        @Override public void dynamicIndexDrop(@Nullable String spaceName, String idxName, boolean ifExists)
+            throws IgniteCheckedException{
+            awaitIndexing(ctx.localNodeId());
+
+            super.dynamicIndexDrop(spaceName, idxName, ifExists);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractSelfTest.java
new file mode 100644
index 0000000..e52e0d3
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractSelfTest.java
@@ -0,0 +1,467 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache.index;
+
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.IgniteDataStreamer;
+import org.apache.ignite.Ignition;
+import org.apache.ignite.binary.BinaryObject;
+import org.apache.ignite.cache.CacheWriteSynchronizationMode;
+import org.apache.ignite.cache.QueryEntity;
+import org.apache.ignite.cache.query.SqlFieldsQuery;
+import org.apache.ignite.cache.query.SqlQuery;
+import org.apache.ignite.cluster.ClusterNode;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.internal.binary.BinaryMarshaller;
+import org.apache.ignite.internal.processors.query.schema.SchemaOperationException;
+import org.apache.ignite.internal.util.typedef.T2;
+import org.apache.ignite.lang.IgnitePredicate;
+import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
+
+import javax.cache.Cache;
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+
+/**
+ * Tests for dynamic index creation.
+ */
+@SuppressWarnings({"unchecked", "ThrowableResultOfMethodCallIgnored"})
+public abstract class DynamicIndexAbstractSelfTest extends AbstractSchemaSelfTest {
+    /** Attribute to filter node out of cache data nodes. */
+    protected static final String ATTR_FILTERED = "FILTERED";
+
+    /** Key range limit for "before" step. */
+    protected static final int KEY_BEFORE = 100;
+
+    /** Key range limit for "after" step. */
+    protected static final int KEY_AFTER = 200;
+
+    /** SQL to check index on the field 1. */
+    protected static final String SQL_SIMPLE_FIELD_1 = "SELECT * FROM " + TBL_NAME + " WHERE " + FIELD_NAME_1 + " >= ?";
+
+    /** SQL to check composite index */
+    protected static final String SQL_COMPOSITE = "SELECT * FROM " + TBL_NAME + " WHERE " + FIELD_NAME_1 +
+        " >= ? AND " + alias(FIELD_NAME_2) + " >= ?";
+
+    /** SQL to check index on the field 2. */
+    protected static final String SQL_SIMPLE_FIELD_2 =
+        "SELECT * FROM " + TBL_NAME + " WHERE " + alias(FIELD_NAME_2) + " >= ?";
+
+    /** Argument for simple SQL (1). */
+    protected static final int SQL_ARG_1 = 40;
+
+    /** Argument for simple SQL (2). */
+    protected static final int SQL_ARG_2 = 80;
+
+    /** {@inheritDoc} */
+    @Override protected void afterTestsStopped() throws Exception {
+        stopAllGrids();
+
+        super.afterTestsStopped();
+    }
+
+    /**
+     * Create server configuration.
+     *
+     * @param idx Index.
+     * @return Configuration.
+     * @throws Exception If failed.
+     */
+    protected IgniteConfiguration serverConfiguration(int idx) throws Exception {
+        return serverConfiguration(idx, false);
+    }
+
+    /**
+     * Create server configuration.
+     *
+     * @param idx Index.
+     * @param filter Whether to filter the node out of cache.
+     * @return Configuration.
+     * @throws Exception If failed.
+     */
+    protected IgniteConfiguration serverConfiguration(int idx, boolean filter) throws Exception {
+        IgniteConfiguration cfg = commonConfiguration(idx);
+
+        if (filter)
+            cfg.setUserAttributes(Collections.singletonMap(ATTR_FILTERED, true));
+
+        return cfg;
+    }
+
+    /**
+     * Create client configuration.
+     *
+     * @param idx Index.
+     * @return Configuration.
+     * @throws Exception If failed.
+     */
+    protected IgniteConfiguration clientConfiguration(int idx) throws Exception {
+        return commonConfiguration(idx).setClientMode(true);
+    }
+
+    /**
+     * Create common node configuration.
+     *
+     * @param idx Index.
+     * @return Configuration.
+     * @throws Exception If failed.
+     */
+    protected IgniteConfiguration commonConfiguration(int idx) throws Exception {
+        IgniteConfiguration cfg = super.getConfiguration(getTestIgniteInstanceName(idx));
+
+        cfg.setDiscoverySpi(new TcpDiscoverySpi());
+
+        cfg.setMarshaller(new BinaryMarshaller());
+
+        return optimize(cfg);
+    }
+
+    /**
+     * @return Default cache configuration.
+     */
+    protected CacheConfiguration<KeyClass, ValueClass> cacheConfiguration() {
+        CacheConfiguration ccfg = new CacheConfiguration().setName(CACHE_NAME);
+
+        QueryEntity entity = new QueryEntity();
+
+        entity.setKeyType(KeyClass.class.getName());
+        entity.setValueType(ValueClass.class.getName());
+
+        entity.addQueryField(FIELD_KEY, Long.class.getName(), null);
+        entity.addQueryField(FIELD_NAME_1, Long.class.getName(), null);
+        entity.addQueryField(FIELD_NAME_2, Long.class.getName(), null);
+
+        entity.setKeyFields(Collections.singleton(FIELD_KEY));
+
+        entity.setAliases(Collections.singletonMap(FIELD_NAME_2, alias(FIELD_NAME_2)));
+
+        ccfg.setQueryEntities(Collections.singletonList(entity));
+
+        ccfg.setNodeFilter(new NodeFilter());
+
+        ccfg.setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC);
+        ccfg.setBackups(1);
+
+        return ccfg;
+    }
+
+    /**
+     * Ensure that schema exception is thrown.
+     *
+     * @param r Runnable.
+     * @param expCode Error code.
+     */
+    protected static void assertSchemaException(RunnableX r, int expCode) {
+        try {
+            r.run();
+        }
+        catch (SchemaOperationException e) {
+            assertEquals("Unexpected error code [expected=" + expCode + ", actual=" + e.code() + ']',
+                expCode, e.code());
+
+            return;
+        }
+        catch (Exception e) {
+            fail("Unexpected exception: " + e);
+        }
+
+        fail(SchemaOperationException.class.getSimpleName() +  " is not thrown.");
+    }
+
+    /**
+     * Ensure index is used in plan.
+     *
+     * @param idxName Index name.
+     * @param sql SQL.
+     * @param args Arguments.
+     */
+    protected static void assertIndexUsed(String idxName, String sql, Object... args) {
+        for (Ignite node : Ignition.allGrids())
+            assertIndexUsed((IgniteEx)node, idxName, sql, args);
+    }
+
+    /**
+     * Ensure index is used in plan.
+     *
+     * @param node Node.
+     * @param idxName Index name.
+     * @param sql SQL.
+     * @param args Arguments.
+     */
+    protected static void assertIndexUsed(IgniteEx node, String idxName, String sql, Object... args) {
+        SqlFieldsQuery qry = new SqlFieldsQuery("EXPLAIN " + sql);
+
+        if (args != null && args.length > 0)
+            qry.setArgs(args);
+
+        String plan = (String)node.cache(CACHE_NAME).query(qry).getAll().get(0).get(0);
+
+        assertTrue("Index is not used: " + plan, plan.toLowerCase().contains(idxName.toLowerCase()));
+    }
+
+    /**
+     * Ensure index is not used in plan.
+     *
+     * @param idxName Index name.
+     * @param sql SQL.
+     * @param args Arguments.
+     */
+    protected static void assertIndexNotUsed(String idxName, String sql, Object... args) {
+        for (Ignite node : Ignition.allGrids())
+            assertIndexNotUsed((IgniteEx)node, idxName, sql, args);
+    }
+
+    /**
+     * Ensure index is not used in plan.
+     *
+     * @param node Node.
+     * @param idxName Index name.
+     * @param sql SQL.
+     * @param args Arguments.
+     */
+    protected static void assertIndexNotUsed(IgniteEx node, String idxName, String sql, Object... args) {
+        SqlFieldsQuery qry = new SqlFieldsQuery("EXPLAIN " + sql);
+
+        if (args != null && args.length > 0)
+            qry.setArgs(args);
+
+        String plan = (String)node.cache(CACHE_NAME).query(qry).getAll().get(0).get(0);
+
+        assertFalse("Index is used: " + plan, plan.contains(idxName));
+    }
+
+    /**
+     * Create key object.
+     *
+     * @param ignite Ignite instance.
+     * @param id ID.
+     * @return Key object.
+     */
+    protected static BinaryObject key(Ignite ignite, long id) {
+        return ignite.binary().builder(KeyClass.class.getName()).setField(FIELD_KEY, id).build();
+    }
+
+    /**
+     * Create value object.
+     *
+     * @param ignite Ignite instance.
+     * @param id ID.
+     * @return Value object.
+     */
+    protected static BinaryObject value(Ignite ignite, long id) {
+        return ignite.binary().builder(ValueClass.class.getName())
+            .setField(FIELD_NAME_1, id)
+            .setField(FIELD_NAME_2, id)
+            .build();
+    }
+
+    /**
+     * Create key/value entry for the given key.
+     *
+     * @param ignite Ignite instance.
+     * @param id ID.
+     * @return Entry.
+     */
+    protected static T2<BinaryObject, BinaryObject> entry(Ignite ignite, long id) {
+        return new T2<>(key(ignite, id), value(ignite, id));
+    }
+
+    /**
+     * Get common cache.
+     *
+     * @param node Node.
+     * @return Cache.
+     */
+    protected static IgniteCache<BinaryObject, BinaryObject> cache(Ignite node) {
+        return node.cache(CACHE_NAME).withKeepBinary();
+    }
+
+    /**
+     * Get key.
+     *
+     * @param node Node.
+     * @param id ID.
+     */
+    protected static BinaryObject get(Ignite node, int id) {
+        BinaryObject key = key(node, id);
+
+        return cache(node).get(key);
+    }
+
+    /**
+     * Put key range.
+     *
+     * @param node Node.
+     * @param from From key.
+     * @param to To key.
+     */
+    protected static void put(Ignite node, int from, int to) {
+        try (IgniteDataStreamer streamer = node.dataStreamer(CACHE_NAME)) {
+            streamer.allowOverwrite(true);
+            streamer.keepBinary(true);
+
+            for (int i = from; i < to; i++) {
+                BinaryObject key = key(node, i);
+                BinaryObject val = value(node, i);
+
+                streamer.addData(key, val);
+            }
+
+            streamer.flush();
+        }
+    }
+
+    /**
+     * Put key to cache.
+     *
+     * @param node Node.
+     * @param id ID.
+     */
+    protected static void put(Ignite node, long id) {
+        BinaryObject key = key(node, id);
+        BinaryObject val = value(node, id);
+
+        cache(node).put(key, val);
+    }
+
+    /**
+     * Remove key range.
+     *
+     * @param node Node.
+     * @param from From key.
+     * @param to To key.
+     */
+    protected static void remove(Ignite node, int from, int to) {
+        for (int i = from; i < to; i++)
+            remove(node, i);
+    }
+
+    /**
+     * Remove key form cache.
+     *
+     * @param node Node.
+     * @param id ID.
+     */
+    protected static void remove(Ignite node, long id) {
+        BinaryObject key = key(node, id);
+
+        cache(node).remove(key);
+    }
+
+    /**
+     * @return Random string.
+     */
+    protected static String randomString() {
+        return UUID.randomUUID().toString();
+    }
+
+    /**
+     * Assert SQL simple data state.
+     *
+     * @param sql SQL query.
+     * @param expSize Expected size.
+     */
+    protected static void assertSqlSimpleData(String sql, int expSize) {
+        for (Ignite node : Ignition.allGrids())
+            assertSqlSimpleData(node, sql, expSize);
+    }
+
+    /**
+     * Assert SQL simple data state.
+     *
+     * @param node Node.
+     * @param sql SQL query.
+     * @param expSize Expected size.
+     */
+    protected static void assertSqlSimpleData(Ignite node, String sql, int expSize) {
+        SqlQuery qry = new SqlQuery(tableName(ValueClass.class), sql).setArgs(SQL_ARG_1);
+
+        List<Cache.Entry<BinaryObject, BinaryObject>> res = node.cache(CACHE_NAME).withKeepBinary().query(qry).getAll();
+
+        Set<Long> ids = new HashSet<>();
+
+        for (Cache.Entry<BinaryObject, BinaryObject> entry : res) {
+            long id = entry.getKey().field(FIELD_KEY);
+
+            long field1 = entry.getValue().field(FIELD_NAME_1);
+            long field2 = entry.getValue().field(FIELD_NAME_2);
+
+            assertTrue(field1 >= SQL_ARG_1);
+
+            assertEquals(id, field1);
+            assertEquals(id, field2);
+
+            assertTrue(ids.add(id));
+        }
+
+        assertEquals("Size mismatch [node=" + node.name() + ", exp=" + expSize + ", actual=" + res.size() +
+            ", ids=" + ids + ']', expSize, res.size());
+    }
+
+    /**
+     * Assert SQL simple data state.
+     *
+     * @param node Node.
+     * @param sql SQL query.
+     * @param expSize Expected size.
+     */
+    protected static void assertSqlCompositeData(Ignite node, String sql, int expSize) {
+        SqlQuery qry = new SqlQuery(tableName(ValueClass.class), sql).setArgs(SQL_ARG_1, SQL_ARG_2);
+
+        List<Cache.Entry<BinaryObject, BinaryObject>> res = node.cache(CACHE_NAME).withKeepBinary().query(qry).getAll();
+
+        Set<Long> ids = new HashSet<>();
+
+        for (Cache.Entry<BinaryObject, BinaryObject> entry : res) {
+            long id = entry.getKey().field(FIELD_KEY);
+
+            long field1 = entry.getValue().field(FIELD_NAME_1);
+            long field2 = entry.getValue().field(FIELD_NAME_2);
+
+            assertTrue(field1 >= SQL_ARG_2);
+
+            assertEquals(id, field1);
+            assertEquals(id, field2);
+
+            assertTrue(ids.add(id));
+        }
+
+        assertEquals("Size mismatch [exp=" + expSize + ", actual=" + res.size() + ", ids=" + ids + ']',
+            expSize, res.size());
+    }
+
+    /**
+     * Node filter.
+     */
+    protected static class NodeFilter implements IgnitePredicate<ClusterNode>, Serializable {
+        /** */
+        private static final long serialVersionUID = 0L;
+
+        /** {@inheritDoc} */
+        @Override public boolean apply(ClusterNode node) {
+            return node.attribute(ATTR_FILTERED) == null;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexClientBasicSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexClientBasicSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexClientBasicSelfTest.java
new file mode 100644
index 0000000..10f4f85
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexClientBasicSelfTest.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.internal.processors.cache.index;
+
+/**
+ * Test dynamic schema operations from client node.
+ */
+public class DynamicIndexClientBasicSelfTest extends DynamicIndexAbstractBasicSelfTest {
+    /** {@inheritDoc} */
+    @Override protected int nodeIndex() {
+        return IDX_CLI;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexPartitionedAtomicConcurrentSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexPartitionedAtomicConcurrentSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexPartitionedAtomicConcurrentSelfTest.java
new file mode 100644
index 0000000..497ec39
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexPartitionedAtomicConcurrentSelfTest.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.internal.processors.cache.index;
+
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
+
+/**
+ * Concurrency tests for dynamic index create/drop for PARTITIONED/ATOMIC cache.
+ */
+public class DynamicIndexPartitionedAtomicConcurrentSelfTest extends DynamicIndexAbstractConcurrentSelfTest {
+    /**
+     * Constructor.
+     */
+    public DynamicIndexPartitionedAtomicConcurrentSelfTest() {
+        super(CacheMode.PARTITIONED, CacheAtomicityMode.ATOMIC);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexPartitionedTransactionalConcurrentSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexPartitionedTransactionalConcurrentSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexPartitionedTransactionalConcurrentSelfTest.java
new file mode 100644
index 0000000..fed0149
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexPartitionedTransactionalConcurrentSelfTest.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.internal.processors.cache.index;
+
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
+
+/**
+ * Concurrency tests for dynamic index create/drop for PARTITIONED/TRANSACTIONAL cache.
+ */
+public class DynamicIndexPartitionedTransactionalConcurrentSelfTest extends DynamicIndexAbstractConcurrentSelfTest {
+    /**
+     * Constructor.
+     */
+    public DynamicIndexPartitionedTransactionalConcurrentSelfTest() {
+        super(CacheMode.PARTITIONED, CacheAtomicityMode.TRANSACTIONAL);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexReplicatedAtomicConcurrentSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexReplicatedAtomicConcurrentSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexReplicatedAtomicConcurrentSelfTest.java
new file mode 100644
index 0000000..2c6c9a9
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexReplicatedAtomicConcurrentSelfTest.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.internal.processors.cache.index;
+
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
+
+/**
+ * Concurrency tests for dynamic index create/drop for REPLICATED/ATOMIC cache.
+ */
+public class DynamicIndexReplicatedAtomicConcurrentSelfTest extends DynamicIndexAbstractConcurrentSelfTest {
+    /**
+     * Constructor.
+     */
+    public DynamicIndexReplicatedAtomicConcurrentSelfTest() {
+        super(CacheMode.REPLICATED, CacheAtomicityMode.ATOMIC);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexReplicatedTransactionalConcurrentSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexReplicatedTransactionalConcurrentSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexReplicatedTransactionalConcurrentSelfTest.java
new file mode 100644
index 0000000..9dc92a4
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexReplicatedTransactionalConcurrentSelfTest.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.internal.processors.cache.index;
+
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
+
+/**
+ * Concurrency tests for dynamic index create/drop for REPLICATED/TRANSACTIONAL cache.
+ */
+public class DynamicIndexReplicatedTransactionalConcurrentSelfTest extends DynamicIndexAbstractConcurrentSelfTest {
+    /**
+     * Constructor.
+     */
+    public DynamicIndexReplicatedTransactionalConcurrentSelfTest() {
+        super(CacheMode.REPLICATED, CacheAtomicityMode.TRANSACTIONAL);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexServerBasicSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexServerBasicSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexServerBasicSelfTest.java
new file mode 100644
index 0000000..c014229
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexServerBasicSelfTest.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.internal.processors.cache.index;
+
+/**
+ * Test dynamic schema operations from non-coordinator node.
+ */
+public class DynamicIndexServerBasicSelfTest extends DynamicIndexAbstractBasicSelfTest {
+    /** {@inheritDoc} */
+    @Override protected int nodeIndex() {
+        return IDX_SRV_NON_CRD;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexServerCoordinatorBasicSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexServerCoordinatorBasicSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexServerCoordinatorBasicSelfTest.java
new file mode 100644
index 0000000..7427a4c
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexServerCoordinatorBasicSelfTest.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.internal.processors.cache.index;
+
+/**
+ * Test dynamic schema operations from coordinator node.
+ */
+public class DynamicIndexServerCoordinatorBasicSelfTest extends DynamicIndexAbstractBasicSelfTest {
+    /** {@inheritDoc} */
+    @Override protected int nodeIndex() {
+        return IDX_SRV_CRD;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexServerNodeFIlterBasicSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexServerNodeFIlterBasicSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexServerNodeFIlterBasicSelfTest.java
new file mode 100644
index 0000000..b8acd1d
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexServerNodeFIlterBasicSelfTest.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.internal.processors.cache.index;
+
+/**
+ * Test dynamic schema operations from server node which do not pass node filter.
+ */
+public class DynamicIndexServerNodeFIlterBasicSelfTest extends DynamicIndexAbstractBasicSelfTest {
+    /** {@inheritDoc} */
+    @Override protected int nodeIndex() {
+        return IDX_SRV_FILTERED;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexServerNodeFilterCoordinatorBasicSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexServerNodeFilterCoordinatorBasicSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexServerNodeFilterCoordinatorBasicSelfTest.java
new file mode 100644
index 0000000..e297fe1
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexServerNodeFilterCoordinatorBasicSelfTest.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.internal.processors.cache.index;
+
+import org.apache.ignite.configuration.IgniteConfiguration;
+
+/**
+ * Test dynamic schema operations from server node which do not pass node filter and which is coordinator.
+ */
+public class DynamicIndexServerNodeFilterCoordinatorBasicSelfTest extends DynamicIndexServerCoordinatorBasicSelfTest {
+    /** {@inheritDoc} */
+    @Override protected IgniteConfiguration serverCoordinatorConfiguration(int idx) throws Exception {
+        return serverConfiguration(idx, true);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexAbstractSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexAbstractSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexAbstractSelfTest.java
new file mode 100644
index 0000000..cf563cc
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexAbstractSelfTest.java
@@ -0,0 +1,400 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache.index;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import javax.cache.CacheException;
+import org.apache.ignite.Ignite;
+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.CacheWriteSynchronizationMode;
+import org.apache.ignite.cache.QueryEntity;
+import org.apache.ignite.cache.query.SqlFieldsQuery;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.configuration.NearCacheConfiguration;
+import org.apache.ignite.internal.binary.BinaryMarshaller;
+import org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode;
+import org.apache.ignite.internal.processors.query.IgniteSQLException;
+import org.apache.ignite.internal.util.typedef.F;
+
+/**
+ * Test that checks indexes handling on H2 side.
+ */
+public abstract class H2DynamicIndexAbstractSelfTest extends AbstractSchemaSelfTest {
+    /** Client node index. */
+    private final static int CLIENT = 2;
+
+    /** {@inheritDoc} */
+    @Override protected void beforeTestsStarted() throws Exception {
+        super.beforeTestsStarted();
+
+        for (IgniteConfiguration cfg : configurations())
+            Ignition.start(cfg);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTestsStopped() throws Exception {
+        stopAllGrids();
+
+        super.afterTestsStopped();
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void beforeTest() throws Exception {
+        super.beforeTest();
+
+        client().getOrCreateCache(cacheConfiguration());
+
+        assertNoIndex(CACHE_NAME, TBL_NAME, IDX_NAME_1);
+
+        IgniteCache<KeyClass, ValueClass> cache = client().cache(CACHE_NAME);
+
+        cache.put(new KeyClass(1), new ValueClass("val1"));
+        cache.put(new KeyClass(2), new ValueClass("val2"));
+        cache.put(new KeyClass(3), new ValueClass("val3"));
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        client().destroyCache(CACHE_NAME);
+
+        super.afterTest();
+    }
+
+    /**
+     * Test that after index creation index is used by queries.
+     */
+    public void testCreateIndex() throws Exception {
+        IgniteCache<KeyClass, ValueClass> cache = cache();
+
+        assertSize(3);
+
+        cache.query(new SqlFieldsQuery("CREATE INDEX \"" + IDX_NAME_1 + "\" ON \"" + TBL_NAME + "\"(\""
+            + FIELD_NAME_1 + "\" ASC)")).getAll();
+
+        // Test that local queries on all nodes use new index.
+        for (int i = 0 ; i < 4; i++) {
+            List<List<?>> locRes = ignite(i).cache("cache").query(new SqlFieldsQuery("explain select \"id\" from " +
+                "\"cache\".\"ValueClass\" where \"field1\" = 'A'").setLocal(true)).getAll();
+
+            assertEquals(F.asList(
+                Collections.singletonList("SELECT\n" +
+                    "    \"id\"\n" +
+                    "FROM \"cache\".\"ValueClass\"\n" +
+                    "    /* \"cache\".\"idx_1\": \"field1\" = 'A' */\n" +
+                    "WHERE \"field1\" = 'A'")
+            ), locRes);
+        }
+
+        assertSize(3);
+
+        cache.remove(new KeyClass(2));
+
+        assertSize(2);
+
+        cache.put(new KeyClass(4), new ValueClass("someVal"));
+
+        assertSize(3);
+    }
+
+    /**
+     * Test that creating an index with duplicate name yields an error.
+     */
+    public void testCreateIndexWithDuplicateName() {
+        final IgniteCache<KeyClass, ValueClass> cache = cache();
+
+        cache.query(new SqlFieldsQuery("CREATE INDEX \"" + IDX_NAME_1 + "\" ON \"" + TBL_NAME + "\"(\""
+            + FIELD_NAME_1 + "\" ASC)"));
+
+        assertSqlException(new RunnableX() {
+            @Override public void run() throws Exception {
+                cache.query(new SqlFieldsQuery("CREATE INDEX \"" + IDX_NAME_1 + "\" ON \"" + TBL_NAME + "\"(\"id\" ASC)"));
+            }
+        }, IgniteQueryErrorCode.INDEX_ALREADY_EXISTS);
+    }
+
+    /**
+     * Test that creating an index with duplicate name does not yield an error with {@code IF NOT EXISTS}.
+     */
+    public void testCreateIndexIfNotExists() {
+        final IgniteCache<KeyClass, ValueClass> cache = cache();
+
+        cache.query(new SqlFieldsQuery("CREATE INDEX \"" + IDX_NAME_1 + "\" ON \"" + TBL_NAME + "\"(\""
+            + FIELD_NAME_1 + "\" ASC)"));
+
+        cache.query(new SqlFieldsQuery("CREATE INDEX IF NOT EXISTS \"" + IDX_NAME_1 + "\" ON \"" + TBL_NAME +
+            "\"(\"id\" ASC)"));
+    }
+
+    /**
+     * Test that after index drop there are no attempts to use it, and data state remains intact.
+     */
+    public void testDropIndex() {
+        IgniteCache<KeyClass, ValueClass> cache = cache();
+
+        assertSize(3);
+
+        cache.query(new SqlFieldsQuery("CREATE INDEX \"" + IDX_NAME_1 + "\" ON \"" + TBL_NAME + "\"(\""
+            + FIELD_NAME_1 + "\" ASC)"));
+
+        assertSize(3);
+
+        cache.query(new SqlFieldsQuery("DROP INDEX \"" + IDX_NAME_1 + "\""));
+
+        // Test that no local queries on all nodes use new index.
+        for (int i = 0 ; i < 4; i++) {
+            List<List<?>> locRes = ignite(i).cache("cache").query(new SqlFieldsQuery("explain select \"id\" from " +
+                "\"cache\".\"ValueClass\" where \"field1\" = 'A'").setLocal(true)).getAll();
+
+            assertEquals(F.asList(
+                Collections.singletonList("SELECT\n" +
+                    "    \"id\"\n" +
+                    "FROM \"cache\".\"ValueClass\"\n" +
+                    "    /* \"cache\".\"ValueClass\".__SCAN_ */\n" +
+                    "WHERE \"field1\" = 'A'")
+            ), locRes);
+        }
+
+        assertSize(3);
+    }
+
+    /**
+     * Test that dropping a non-existent index yields an error.
+     */
+    public void testDropMissingIndex() {
+        final IgniteCache<KeyClass, ValueClass> cache = cache();
+
+        assertSqlException(new RunnableX() {
+            @Override public void run() throws Exception {
+                cache.query(new SqlFieldsQuery("DROP INDEX \"" + IDX_NAME_1 + "\""));
+            }
+        }, IgniteQueryErrorCode.INDEX_NOT_FOUND);
+    }
+
+    /**
+     * Test that dropping a non-existent index does not yield an error with {@code IF EXISTS}.
+     */
+    public void testDropMissingIndexIfExists() {
+        final IgniteCache<KeyClass, ValueClass> cache = cache();
+
+        cache.query(new SqlFieldsQuery("DROP INDEX IF EXISTS \"" + IDX_NAME_1 + "\""));
+    }
+
+    /**
+     * Test that changes in cache affect index, and vice versa.
+     */
+    public void testIndexState() {
+        IgniteCache<KeyClass, ValueClass> cache = cache();
+
+        assertColumnValues("val1", "val2", "val3");
+
+        cache.query(new SqlFieldsQuery("CREATE INDEX \"" + IDX_NAME_1 + "\" ON \"" + TBL_NAME + "\"(\""
+            + FIELD_NAME_1 + "\" ASC)"));
+
+        assertColumnValues("val1", "val2", "val3");
+
+        cache.remove(new KeyClass(2));
+
+        assertColumnValues("val1", "val3");
+
+        cache.put(new KeyClass(0), new ValueClass("someVal"));
+
+        assertColumnValues("someVal", "val1", "val3");
+
+        cache.query(new SqlFieldsQuery("DROP INDEX \"" + IDX_NAME_1 + "\""));
+
+        assertColumnValues("someVal", "val1", "val3");
+    }
+
+    /**
+     * Check that values of {@code field1} match what we expect.
+     * @param vals Expected values.
+     */
+    private void assertColumnValues(String... vals) {
+        List<List<?>> expRes = new ArrayList<>(vals.length);
+
+        for (String v : vals)
+            expRes.add(Collections.singletonList(v));
+
+        assertEquals(expRes, cache().query(new SqlFieldsQuery("SELECT \"" + FIELD_NAME_1 + "\" FROM \"" + TBL_NAME +
+            "\" ORDER BY \"id\""))
+            .getAll());
+    }
+
+    /**
+     * Do a {@code SELECT COUNT(*)} query to check index state correctness.
+     * @param expSize Expected number of items in table.
+     */
+    private void assertSize(long expSize) {
+        assertEquals(expSize, cache().size());
+
+        assertEquals(expSize, cache().query(new SqlFieldsQuery("SELECT COUNT(*) from \"ValueClass\""))
+            .getAll().get(0).get(0));
+    }
+
+    /**
+     * Get configurations to be used in test.
+     *
+     * @return Configurations.
+     * @throws Exception If failed.
+     */
+    private List<IgniteConfiguration> configurations() throws Exception {
+        return Arrays.asList(
+            serverConfiguration(0),
+            serverConfiguration(1),
+            clientConfiguration(2),
+            serverConfiguration(3)
+        );
+    }
+
+    /**
+     * @return Client node.
+     */
+    private Ignite client() {
+        return ignite(CLIENT);
+    }
+
+    /**
+     * @return Cache.
+     */
+    private IgniteCache<KeyClass, ValueClass> cache() {
+        return client().cache(CACHE_NAME);
+    }
+
+    /**
+     * Create server configuration.
+     *
+     * @param idx Index.
+     * @return Configuration.
+     * @throws Exception If failed.
+     */
+    private IgniteConfiguration serverConfiguration(int idx) throws Exception {
+        return commonConfiguration(idx);
+    }
+
+    /**
+     * Create client configuration.
+     *
+     * @param idx Index.
+     * @return Configuration.
+     * @throws Exception If failed.
+     */
+    private IgniteConfiguration clientConfiguration(int idx) throws Exception {
+        return commonConfiguration(idx).setClientMode(true);
+    }
+
+    /**
+     * Create common node configuration.
+     *
+     * @param idx Index.
+     * @return Configuration.
+     * @throws Exception If failed.
+     */
+    private IgniteConfiguration commonConfiguration(int idx) throws Exception {
+        IgniteConfiguration cfg = super.getConfiguration(getTestIgniteInstanceName(idx));
+
+        cfg.setMarshaller(new BinaryMarshaller());
+
+        return optimize(cfg);
+    }
+
+    /**
+     * @return Default cache configuration.
+     */
+    private CacheConfiguration cacheConfiguration() {
+        CacheConfiguration<KeyClass, ValueClass> ccfg = new CacheConfiguration<KeyClass, ValueClass>()
+            .setName(CACHE_NAME);
+
+        QueryEntity entity = new QueryEntity();
+
+        entity.setKeyType(KeyClass.class.getName());
+        entity.setValueType(ValueClass.class.getName());
+
+        entity.addQueryField("id", Long.class.getName(), null);
+        entity.addQueryField(FIELD_NAME_1, String.class.getName(), null);
+        entity.addQueryField(FIELD_NAME_2, String.class.getName(), null);
+
+        entity.setKeyFields(Collections.singleton("id"));
+
+        entity.setAliases(Collections.singletonMap(FIELD_NAME_2, alias(FIELD_NAME_2)));
+
+        ccfg.setQueryEntities(Collections.singletonList(entity));
+
+        ccfg.setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC);
+        ccfg.setSqlEscapeAll(true);
+        ccfg.setAtomicityMode(atomicityMode());
+        ccfg.setCacheMode(cacheMode());
+
+        if (nearCache())
+            ccfg.setNearConfiguration(new NearCacheConfiguration<KeyClass, ValueClass>());
+
+        return ccfg;
+    }
+
+    /**
+     * @return Cache mode to use.
+     */
+    protected abstract CacheMode cacheMode();
+
+    /**
+     * @return Cache atomicity mode to use.
+     */
+    protected abstract CacheAtomicityMode atomicityMode();
+
+    /**
+     * @return Whether to use near cache.
+     */
+    protected abstract boolean nearCache();
+
+    /**
+     * Ensure that SQL exception is thrown.
+     *
+     * @param r Runnable.
+     * @param expCode Error code.
+     */
+    private static void assertSqlException(DynamicIndexAbstractBasicSelfTest.RunnableX r, int expCode) {
+        try {
+            try {
+                r.run();
+            }
+            catch (CacheException e) {
+                if (e.getCause() != null)
+                    throw (Exception)e.getCause();
+                else
+                    throw e;
+            }
+        }
+        catch (IgniteSQLException e) {
+            assertEquals("Unexpected error code [expected=" + expCode + ", actual=" + e.statusCode() + ']',
+                expCode, e.statusCode());
+
+            return;
+        }
+        catch (Exception e) {
+            fail("Unexpected exception: " + e);
+        }
+
+        fail(IgniteSQLException.class.getSimpleName() +  " is not thrown.");
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexAtomicPartitionedNearSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexAtomicPartitionedNearSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexAtomicPartitionedNearSelfTest.java
new file mode 100644
index 0000000..96a7c14
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexAtomicPartitionedNearSelfTest.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache.index;
+
+/** */
+public class H2DynamicIndexAtomicPartitionedNearSelfTest extends H2DynamicIndexAtomicPartitionedSelfTest {
+    /** {@inheritDoc} */
+    @Override protected boolean nearCache() {
+        return true;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexAtomicPartitionedSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexAtomicPartitionedSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexAtomicPartitionedSelfTest.java
new file mode 100644
index 0000000..0a4c48c
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexAtomicPartitionedSelfTest.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.internal.processors.cache.index;
+
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
+
+/** */
+public class H2DynamicIndexAtomicPartitionedSelfTest extends H2DynamicIndexAbstractSelfTest {
+    /** {@inheritDoc} */
+    @Override protected CacheMode cacheMode() {
+        return CacheMode.PARTITIONED;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected CacheAtomicityMode atomicityMode() {
+        return CacheAtomicityMode.ATOMIC;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected boolean nearCache() {
+        return false;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexAtomicReplicatedSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexAtomicReplicatedSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexAtomicReplicatedSelfTest.java
new file mode 100644
index 0000000..fc9f9e7
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexAtomicReplicatedSelfTest.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.internal.processors.cache.index;
+
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
+
+/** */
+public class H2DynamicIndexAtomicReplicatedSelfTest extends H2DynamicIndexAbstractSelfTest {
+    /** {@inheritDoc} */
+    @Override protected CacheMode cacheMode() {
+        return CacheMode.REPLICATED;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected CacheAtomicityMode atomicityMode() {
+        return CacheAtomicityMode.ATOMIC;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected boolean nearCache() {
+        return false;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexTransactionalPartitionedNearSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexTransactionalPartitionedNearSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexTransactionalPartitionedNearSelfTest.java
new file mode 100644
index 0000000..e8c4fb2
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexTransactionalPartitionedNearSelfTest.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache.index;
+
+/** */
+public class H2DynamicIndexTransactionalPartitionedNearSelfTest extends H2DynamicIndexTransactionalPartitionedSelfTest {
+    /** {@inheritDoc} */
+    @Override protected boolean nearCache() {
+        return true;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexTransactionalPartitionedSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexTransactionalPartitionedSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexTransactionalPartitionedSelfTest.java
new file mode 100644
index 0000000..ad61412
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexTransactionalPartitionedSelfTest.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.internal.processors.cache.index;
+
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
+
+/** */
+public class H2DynamicIndexTransactionalPartitionedSelfTest extends H2DynamicIndexAbstractSelfTest {
+    /** {@inheritDoc} */
+    @Override protected CacheMode cacheMode() {
+        return CacheMode.PARTITIONED;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected CacheAtomicityMode atomicityMode() {
+        return CacheAtomicityMode.TRANSACTIONAL;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected boolean nearCache() {
+        return false;
+    }
+}


[10/70] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math module to Ignite ML module added missed licenses renamed packages fixed wrong ml profile activation

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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;
-        }
-    }
-}


[44/70] [abbrv] ignite git commit: IGNITE-4993 - Fixing distributed joins on segmented index.

Posted by sb...@apache.org.
IGNITE-4993 - Fixing distributed joins on segmented index.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/800b8bd9
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/800b8bd9
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/800b8bd9

Branch: refs/heads/ignite-2893
Commit: 800b8bd90033ab64f4299ba242cc89b1f4c98417
Parents: 2ded758
Author: Alexey Goncharuk <al...@gmail.com>
Authored: Wed Apr 19 13:55:02 2017 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Wed Apr 19 13:55:35 2017 +0300

----------------------------------------------------------------------
 .../query/h2/opt/GridH2IndexBase.java           | 31 +++++++++++---------
 .../query/IgniteSqlSegmentedIndexSelfTest.java  |  2 +-
 2 files changed, 18 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/800b8bd9/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java
index 7163834..0eac559 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java
@@ -413,9 +413,7 @@ public abstract class GridH2IndexBase extends BaseIndex {
 
         GridCacheContext<?, ?> cctx = getTable().rowDescriptor().context();
 
-        boolean isLocal = qctx.distributedJoinMode() == LOCAL_ONLY;
-
-        return new DistributedLookupBatch(cctx, ucast, affColId, isLocal);
+        return new DistributedLookupBatch(cctx, ucast, affColId);
     }
 
     /**
@@ -1086,9 +1084,6 @@ public abstract class GridH2IndexBase extends BaseIndex {
         final int affColId;
 
         /** */
-        private final boolean localQuery;
-
-        /** */
         GridH2QueryContext qctx;
 
         /** */
@@ -1113,13 +1108,11 @@ public abstract class GridH2IndexBase extends BaseIndex {
          * @param cctx Cache Cache context.
          * @param ucast Unicast or broadcast query.
          * @param affColId Affinity column ID.
-         * @param localQuery Local query flag.
          */
-        DistributedLookupBatch(GridCacheContext<?, ?> cctx, boolean ucast, int affColId, boolean localQuery) {
+        DistributedLookupBatch(GridCacheContext<?, ?> cctx, boolean ucast, int affColId) {
             this.cctx = cctx;
             this.ucast = ucast;
             this.affColId = affColId;
-            this.localQuery = localQuery;
         }
 
         /**
@@ -1191,25 +1184,26 @@ public abstract class GridH2IndexBase extends BaseIndex {
 
             Object affKey = affColId == -1 ? null : getAffinityKey(firstRow, lastRow);
 
+            boolean locQry = localQuery();
+
             List<SegmentKey> segmentKeys;
-            Future<Cursor> fut;
 
             if (affKey != null) {
                 // Affinity key is provided.
                 if (affKey == EXPLICIT_NULL) // Affinity key is explicit null, we will not find anything.
                     return false;
 
-                segmentKeys = F.asList(rangeSegment(cctx, qctx, affKey, localQuery));
+                segmentKeys = F.asList(rangeSegment(cctx, qctx, affKey, locQry));
             }
             else {
                 // Affinity key is not provided or is not the same in upper and lower bounds, we have to broadcast.
                 if (broadcastSegments == null)
-                    broadcastSegments = broadcastSegments(qctx, cctx, localQuery);
+                    broadcastSegments = broadcastSegments(qctx, cctx, locQry);
 
                 segmentKeys = broadcastSegments;
             }
 
-            if (localQuery && segmentKeys.isEmpty())
+            if (locQry && segmentKeys.isEmpty())
                 return false; // Nothing to do
 
             assert !F.isEmpty(segmentKeys) : segmentKeys;
@@ -1250,7 +1244,7 @@ public abstract class GridH2IndexBase extends BaseIndex {
                     batchFull = true;
             }
 
-            fut = new DoneFuture<>(segmentKeys.size() == 1 ?
+            Future<Cursor> fut = new DoneFuture<>(segmentKeys.size() == 1 ?
                 new UnicastCursor(rangeId, segmentKeys, rangeStreams) :
                 new BroadcastCursor(rangeId, segmentKeys, rangeStreams));
 
@@ -1265,6 +1259,15 @@ public abstract class GridH2IndexBase extends BaseIndex {
         }
 
         /**
+         * @return {@code True} if local query execution is enforced.
+         */
+        private boolean localQuery() {
+            assert qctx != null : "Missing query context: " + this;
+
+            return qctx.distributedJoinMode() == LOCAL_ONLY;
+        }
+
+        /**
          *
          */
         private void startStreams() {

http://git-wip-us.apache.org/repos/asf/ignite/blob/800b8bd9/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlSegmentedIndexSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlSegmentedIndexSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlSegmentedIndexSelfTest.java
index 1715a56..586b81e 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlSegmentedIndexSelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlSegmentedIndexSelfTest.java
@@ -90,7 +90,7 @@ public class IgniteSqlSegmentedIndexSelfTest extends GridCommonAbstractTest {
 
     /** {@inheritDoc} */
     @Override protected void beforeTestsStarted() throws Exception {
-        startGridsMultiThreaded(nodesCount(), false);
+        startGrids(nodesCount());
     }
 
     /** {@inheritDoc} */


[52/70] [abbrv] ignite git commit: IGNITE-4898: Added ODBC installers paths to README. This closes #1753.

Posted by sb...@apache.org.
IGNITE-4898: Added ODBC installers paths to README. This closes #1753.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/f278dc96
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/f278dc96
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/f278dc96

Branch: refs/heads/ignite-2893
Commit: f278dc969a69ad3c166fc863de5b0ffcd46a19c6
Parents: 5dab5fb
Author: isapego <ig...@gmail.com>
Authored: Wed Apr 19 15:12:42 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Wed Apr 19 15:12:42 2017 +0300

----------------------------------------------------------------------
 modules/platforms/cpp/odbc/README.txt | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/f278dc96/modules/platforms/cpp/odbc/README.txt
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/odbc/README.txt b/modules/platforms/cpp/odbc/README.txt
index fe40a5c..3a83f84 100644
--- a/modules/platforms/cpp/odbc/README.txt
+++ b/modules/platforms/cpp/odbc/README.txt
@@ -19,13 +19,13 @@ arguments:
 
 1. Address of the node to connect to:
    SERVER=<host_name_or_IP_address>;
-   
+
 2. Port on which OdbcProcessor of the node is listening:
    PORT=<TCP_port>;
-   
+
 3. Datagrid cache to connect to:
    CACHE=<cache_name>;
-   
+
 All arguments are case-insensitive so "SERVER", "Server" and "server" all are
 valid server address arguments.
 
@@ -46,11 +46,11 @@ ODBC driver you should perfrom the following steps:
    $ ldd /usr/local/lib/libignite-odbc.so.
    If there is unresolved links to other libraries you may want to add
    directories with these libraries to the LD_LIBRARY_PATH.
-   
+
 2. Edit file $IGNITE_HOME/platforms/cpp/odbc/install/ignite-odbc-install.ini
    and ensure that "Driver" parameter of the "Apache Ignite" section points
    to the right location where libignite-odbc.so is located.
-   
+
 3. To install Apache Ignite ODBC driver use the following command:
    $ odbcinst -i -d -f $IGNITE_HOME/platforms/cpp/odbc/install/ignite-odbc-install.ini
    To perform this command you most likely will need root privileges.
@@ -67,9 +67,12 @@ There are two ways to install ODBC driver currently. The first one is to use
 32-bit or 64-bit installer. This is the most simple way and you are recommended
 to stick to it by default.
 
+32-bit installer : $IGNITE_HOME/platforms/cpp/bin/odbc/ignite-odbc-x86.msi
+64-bit installer : $IGNITE_HOME/platforms/cpp/bin/odbc/ignite-odbc-amd64.msi
+
 However there is also another way to install driver manually using scripts. If
 you choose this method you should first choose a directory on your filesystem
-where your driver or drivers will be located. Once you have choosen the place
+where your driver or drivers will be located. Once you have chosen the place
 you should put your driver there and ensure that all driver dependencies can be
 resolved i.e. they can be found either in the %PATH% or in the same directory
 as the driver.
@@ -88,7 +91,7 @@ Thats it. Your driver/drivers are installed.
 
 After the installation
 =======================================
-   
+
 Now Apache Ignite ODBC driver is installed and ready for use. You can connect
 to it and use it like to any other ODBC driver.
 


[27/70] [abbrv] ignite git commit: master Fixed Visor tests. (cherry picked from commit 36a6cd0)

Posted by sb...@apache.org.
master Fixed Visor tests.
(cherry picked from commit 36a6cd0)


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/8ea9f83c
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/8ea9f83c
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/8ea9f83c

Branch: refs/heads/ignite-2893
Commit: 8ea9f83ce7f21f6ba50c0c644f62319f25b56ebd
Parents: 43d6d7e
Author: Alexey Kuznetsov <ak...@gridgain.com>
Authored: Tue Apr 18 20:39:58 2017 +0700
Committer: Alexey Kuznetsov <ak...@gridgain.com>
Committed: Tue Apr 18 20:56:23 2017 +0700

----------------------------------------------------------------------
 .../ignite/visor/commands/open/VisorOpenCommandSpec.scala      | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/8ea9f83c/modules/visor-console/src/test/scala/org/apache/ignite/visor/commands/open/VisorOpenCommandSpec.scala
----------------------------------------------------------------------
diff --git a/modules/visor-console/src/test/scala/org/apache/ignite/visor/commands/open/VisorOpenCommandSpec.scala b/modules/visor-console/src/test/scala/org/apache/ignite/visor/commands/open/VisorOpenCommandSpec.scala
index 4cf2204..f00ff55 100644
--- a/modules/visor-console/src/test/scala/org/apache/ignite/visor/commands/open/VisorOpenCommandSpec.scala
+++ b/modules/visor-console/src/test/scala/org/apache/ignite/visor/commands/open/VisorOpenCommandSpec.scala
@@ -29,10 +29,8 @@ class VisorOpenCommandSpec extends VisorRuntimeBaseSpec(3) {
             visor.mlist()
         }
 
-        it("should print error message when already connected") {
-            intercept[IgniteException] {
-                openVisor()
-            }
+        it("should reopen when already connected") {
+            openVisor()
         }
     }
 }


[35/70] [abbrv] ignite git commit: IGNITE-4565: Implemented CREATE INDEX and DROP INDEX. This closes #1773. This closes #1804.

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
index 2b957be..ceb139a 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
@@ -17,34 +17,29 @@
 
 package org.apache.ignite.internal.processors.query;
 
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentMap;
-import javax.cache.Cache;
-import javax.cache.CacheException;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteDataStreamer;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.binary.Binarylizable;
+import org.apache.ignite.cache.CacheMode;
 import org.apache.ignite.cache.QueryEntity;
+import org.apache.ignite.cache.QueryIndex;
 import org.apache.ignite.cache.query.QueryCursor;
 import org.apache.ignite.cache.query.SqlFieldsQuery;
 import org.apache.ignite.cache.query.SqlQuery;
+import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.events.CacheQueryExecutedEvent;
 import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.IgniteInternalFuture;
+import org.apache.ignite.internal.managers.communication.GridMessageListener;
 import org.apache.ignite.internal.NodeStoppingException;
 import org.apache.ignite.internal.processors.GridProcessorAdapter;
 import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.processors.cache.CacheObject;
 import org.apache.ignite.internal.processors.cache.CacheObjectContext;
+import org.apache.ignite.internal.processors.cache.DynamicCacheDescriptor;
+import org.apache.ignite.internal.processors.cache.GridCacheAdapter;
 import org.apache.ignite.internal.processors.cache.GridCacheContext;
 import org.apache.ignite.internal.processors.cache.IgniteCacheProxy;
 import org.apache.ignite.internal.processors.cache.KeyCacheObject;
@@ -54,7 +49,23 @@ import org.apache.ignite.internal.processors.cache.query.CacheQueryType;
 import org.apache.ignite.internal.processors.cache.query.GridCacheQueryType;
 import org.apache.ignite.internal.processors.cache.query.QueryCursorEx;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
+import org.apache.ignite.internal.processors.query.schema.SchemaIndexCacheVisitor;
+import org.apache.ignite.internal.processors.query.schema.SchemaIndexCacheVisitorImpl;
+import org.apache.ignite.internal.processors.query.schema.SchemaIndexOperationCancellationToken;
+import org.apache.ignite.internal.processors.query.schema.SchemaKey;
+import org.apache.ignite.internal.processors.query.schema.SchemaOperationClientFuture;
+import org.apache.ignite.internal.processors.query.schema.SchemaOperationException;
+import org.apache.ignite.internal.processors.query.schema.SchemaOperationManager;
+import org.apache.ignite.internal.processors.query.schema.SchemaOperationWorker;
+import org.apache.ignite.internal.processors.query.schema.message.SchemaAbstractDiscoveryMessage;
+import org.apache.ignite.internal.processors.query.schema.message.SchemaFinishDiscoveryMessage;
+import org.apache.ignite.internal.processors.query.schema.message.SchemaOperationStatusMessage;
+import org.apache.ignite.internal.processors.query.schema.message.SchemaProposeDiscoveryMessage;
+import org.apache.ignite.internal.processors.query.schema.operation.SchemaAbstractOperation;
+import org.apache.ignite.internal.processors.query.schema.operation.SchemaIndexCreateOperation;
+import org.apache.ignite.internal.processors.query.schema.operation.SchemaIndexDropOperation;
 import org.apache.ignite.internal.processors.timeout.GridTimeoutProcessor;
+import org.apache.ignite.internal.util.GridBoundedConcurrentLinkedHashSet;
 import org.apache.ignite.internal.util.GridSpinBusyLock;
 import org.apache.ignite.internal.util.future.GridCompoundFuture;
 import org.apache.ignite.internal.util.future.GridFinishedFuture;
@@ -63,17 +74,45 @@ import org.apache.ignite.internal.util.lang.GridClosureException;
 import org.apache.ignite.internal.util.lang.IgniteOutClosureX;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.CU;
+import org.apache.ignite.internal.util.typedef.T2;
+import org.apache.ignite.internal.util.typedef.T3;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.internal.util.worker.GridWorker;
 import org.apache.ignite.internal.util.worker.GridWorkerFuture;
 import org.apache.ignite.lang.IgniteBiTuple;
 import org.apache.ignite.lang.IgniteFuture;
+import org.apache.ignite.lang.IgniteInClosure;
+import org.apache.ignite.lang.IgniteUuid;
+import org.apache.ignite.marshaller.jdk.JdkMarshaller;
+import org.apache.ignite.spi.discovery.DiscoveryDataBag;
 import org.apache.ignite.spi.indexing.IndexingQueryFilter;
+import org.apache.ignite.thread.IgniteThread;
 import org.jetbrains.annotations.Nullable;
-import org.jsr166.ConcurrentHashMap8;
+
+import javax.cache.Cache;
+import javax.cache.CacheException;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import static org.apache.ignite.events.EventType.EVT_CACHE_QUERY_EXECUTED;
+import static org.apache.ignite.internal.GridTopic.TOPIC_SCHEMA;
 import static org.apache.ignite.internal.IgniteComponentType.INDEXING;
+import static org.apache.ignite.internal.managers.communication.GridIoPolicy.SCHEMA_POOL;
 
 /**
  * Indexing processor.
@@ -82,26 +121,70 @@ public class GridQueryProcessor extends GridProcessorAdapter {
     /** Queries detail metrics eviction frequency. */
     private static final int QRY_DETAIL_METRICS_EVICTION_FREQ = 3_000;
 
+    /** */
+    private static final ThreadLocal<AffinityTopologyVersion> requestTopVer = new ThreadLocal<>();
+
     /** For tests. */
     public static Class<? extends GridQueryIndexing> idxCls;
 
+    /** JDK marshaller to serialize errors. */
+    private final JdkMarshaller marsh = new JdkMarshaller();
+
     /** */
     private final GridSpinBusyLock busyLock = new GridSpinBusyLock();
 
+    /** */
+    private GridTimeoutProcessor.CancelableTask qryDetailMetricsEvictTask;
+
     /** Type descriptors. */
-    private final Map<QueryTypeIdKey, QueryTypeDescriptorImpl> types = new ConcurrentHashMap8<>();
+    private final Map<QueryTypeIdKey, QueryTypeDescriptorImpl> types = new ConcurrentHashMap<>();
 
     /** Type descriptors. */
-    private final ConcurrentMap<QueryTypeNameKey, QueryTypeDescriptorImpl> typesByName = new ConcurrentHashMap8<>();
+    private final ConcurrentMap<QueryTypeNameKey, QueryTypeDescriptorImpl> typesByName = new ConcurrentHashMap<>();
 
     /** */
     private final GridQueryIndexing idx;
 
-    /** */
-    private GridTimeoutProcessor.CancelableTask qryDetailMetricsEvictTask;
+    /** All indexes. */
+    private final ConcurrentMap<QueryIndexKey, QueryIndexDescriptorImpl> idxs = new ConcurrentHashMap<>();
 
-    /** */
-    private static final ThreadLocal<AffinityTopologyVersion> requestTopVer = new ThreadLocal<>();
+    /** Schema operation futures created on client side. */
+    private final ConcurrentMap<UUID, SchemaOperationClientFuture> schemaCliFuts = new ConcurrentHashMap<>();
+
+    /** IO message listener. */
+    private final GridMessageListener ioLsnr;
+
+    /** Schema operations. */
+    private final ConcurrentHashMap<SchemaKey, SchemaOperation> schemaOps = new ConcurrentHashMap<>();
+
+    /** Active propose messages. */
+    private final LinkedHashMap<UUID, SchemaProposeDiscoveryMessage> activeProposals = new LinkedHashMap<>();
+
+    /** General state mutex. */
+    private final Object stateMux = new Object();
+
+    /** Coordinator node (initialized lazily). */
+    private ClusterNode crd;
+
+    /** Registered spaces. */
+    private final Collection<String> spaces = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());
+
+    /** ID history for index create/drop discovery messages. */
+    private final GridBoundedConcurrentLinkedHashSet<IgniteUuid> dscoMsgIdHist =
+        new GridBoundedConcurrentLinkedHashSet<>(QueryUtils.discoveryHistorySize());
+
+    /** History of already completed operations. */
+    private final GridBoundedConcurrentLinkedHashSet<UUID> completedOpIds =
+        new GridBoundedConcurrentLinkedHashSet<>(QueryUtils.discoveryHistorySize());
+
+    /** Pending status messages. */
+    private final LinkedList<SchemaOperationStatusMessage> pendingMsgs = new LinkedList<>();
+
+    /** Disconnected flag. */
+    private boolean disconnected;
+
+    /** Whether exchange thread is ready to process further requests. */
+    private boolean exchangeReady;
 
     /** */
     private boolean skipFieldLookup;
@@ -119,6 +202,20 @@ public class GridQueryProcessor extends GridProcessorAdapter {
         }
         else
             idx = INDEXING.inClassPath() ? U.<GridQueryIndexing>newInstance(INDEXING.className()) : null;
+
+        ioLsnr = new GridMessageListener() {
+            @Override public void onMessage(UUID nodeId, Object msg) {
+                if (msg instanceof SchemaOperationStatusMessage) {
+                    SchemaOperationStatusMessage msg0 = (SchemaOperationStatusMessage)msg;
+
+                    msg0.senderNodeId(nodeId);
+
+                    processStatusMessage(msg0);
+                }
+                else
+                    U.warn(log, "Unsupported IO message: " + msg);
+            }
+        };
     }
 
     /** {@inheritDoc} */
@@ -131,6 +228,8 @@ public class GridQueryProcessor extends GridProcessorAdapter {
             idx.start(ctx, busyLock);
         }
 
+        ctx.io().addMessageListener(TOPIC_SCHEMA, ioLsnr);
+
         // Schedule queries detail metrics eviction.
         qryDetailMetricsEvictTask = ctx.timeout().schedule(new Runnable() {
             @Override public void run() {
@@ -140,6 +239,401 @@ public class GridQueryProcessor extends GridProcessorAdapter {
         }, QRY_DETAIL_METRICS_EVICTION_FREQ, QRY_DETAIL_METRICS_EVICTION_FREQ);
     }
 
+    /** {@inheritDoc} */
+    @Override public void onKernalStop(boolean cancel) {
+        super.onKernalStop(cancel);
+
+        if (cancel && idx != null) {
+            try {
+                while (!busyLock.tryBlock(500))
+                    idx.cancelAllQueries();
+
+                return;
+            } catch (InterruptedException ignored) {
+                U.warn(log, "Interrupted while waiting for active queries cancellation.");
+
+                Thread.currentThread().interrupt();
+            }
+        }
+
+        busyLock.block();
+    }
+
+    /** {@inheritDoc} */
+    @Override public void stop(boolean cancel) throws IgniteCheckedException {
+        super.stop(cancel);
+
+        ctx.io().removeMessageListener(TOPIC_SCHEMA, ioLsnr);
+
+        if (idx != null)
+            idx.stop();
+
+        U.closeQuiet(qryDetailMetricsEvictTask);
+    }
+
+    /**
+     * Handle cache kernal start. At this point discovery and IO managers are operational, caches are not started yet.
+     *
+     * @throws IgniteCheckedException If failed.
+     */
+    public void onCacheKernalStart() throws IgniteCheckedException {
+        synchronized (stateMux) {
+            exchangeReady = true;
+
+            // Re-run pending top-level proposals.
+            for (SchemaOperation schemaOp : schemaOps.values())
+                onSchemaPropose(schemaOp.proposeMessage());
+        }
+    }
+
+    /**
+     * Handle cache reconnect.
+     *
+     * @throws IgniteCheckedException If failed.
+     */
+    public void onCacheReconnect() throws IgniteCheckedException {
+        synchronized (stateMux) {
+            assert disconnected;
+
+            disconnected = false;
+
+            onCacheKernalStart();
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Nullable @Override public DiscoveryDataExchangeType discoveryDataType() {
+        return DiscoveryDataExchangeType.QUERY_PROC;
+    }
+
+    /** {@inheritDoc} */
+    @Override public void collectGridNodeData(DiscoveryDataBag dataBag) {
+        // Collect active proposals.
+        synchronized (stateMux) {
+            LinkedHashMap<UUID, SchemaProposeDiscoveryMessage> data = new LinkedHashMap<>(activeProposals);
+
+            dataBag.addGridCommonData(DiscoveryDataExchangeType.QUERY_PROC.ordinal(), data);
+        }
+    }
+
+    /** {@inheritDoc} */
+    @SuppressWarnings("unchecked")
+    @Override public void onGridDataReceived(DiscoveryDataBag.GridDiscoveryData data) {
+        synchronized (stateMux) {
+            // Preserve proposals.
+            LinkedHashMap<UUID, SchemaProposeDiscoveryMessage> data0 =
+                (LinkedHashMap<UUID, SchemaProposeDiscoveryMessage>)data.commonData();
+
+            // Process proposals as if they were received as regular discovery messages.
+            if (data0 != null) {
+                for (SchemaProposeDiscoveryMessage activeProposal : data0.values())
+                    onSchemaProposeDiscovery0(activeProposal);
+            }
+        }
+    }
+
+    /**
+     * Process schema propose message from discovery thread.
+     *
+     * @param msg Message.
+     * @return {@code True} if exchange should be triggered.
+     */
+    private boolean onSchemaProposeDiscovery(SchemaProposeDiscoveryMessage msg) {
+        UUID opId = msg.operation().id();
+        String space = msg.operation().space();
+
+        if (!msg.initialized()) {
+            // Ensure cache exists on coordinator node.
+            DynamicCacheDescriptor cacheDesc = ctx.cache().cacheDescriptor(space);
+
+            if (cacheDesc == null) {
+                if (log.isDebugEnabled())
+                    log.debug("Received schema propose discovery message, but cache doesn't exist " +
+                        "(will report error) [opId=" + opId + ", msg=" + msg + ']');
+
+                msg.onError(new SchemaOperationException(SchemaOperationException.CODE_CACHE_NOT_FOUND, space));
+            }
+            else {
+                CacheConfiguration ccfg = cacheDesc.cacheConfiguration();
+
+                if (ccfg.getCacheMode() == CacheMode.LOCAL) {
+                    // Distributed operation is not allowed on LOCAL caches.
+                    if (log.isDebugEnabled())
+                        log.debug("Received schema propose discovery message, but cache is LOCAL " +
+                            "(will report error) [opId=" + opId + ", msg=" + msg + ']');
+
+                    msg.onError(new SchemaOperationException("Schema changes are not supported for LOCAL cache."));
+                }
+                else {
+                    // Preserve deployment ID so that we can distinguish between different caches with the same name.
+                    if (msg.deploymentId() == null)
+                        msg.deploymentId(cacheDesc.deploymentId());
+
+                    assert F.eq(cacheDesc.deploymentId(), msg.deploymentId());
+                }
+            }
+        }
+
+        // Complete client future and exit immediately in case of error.
+        if (msg.hasError()) {
+            SchemaOperationClientFuture cliFut = schemaCliFuts.remove(opId);
+
+            if (cliFut != null)
+                cliFut.onDone(msg.error());
+
+            return false;
+        }
+
+        return onSchemaProposeDiscovery0(msg);
+    }
+
+    /**
+     * Process schema propose message from discovery thread (or from cache start routine).
+     *
+     * @param msg Message.
+     * @return {@code True} if exchange should be triggered.
+     */
+    private boolean onSchemaProposeDiscovery0(SchemaProposeDiscoveryMessage msg) {
+        UUID opId = msg.operation().id();
+
+        synchronized (stateMux) {
+            if (disconnected) {
+                if (log.isDebugEnabled())
+                    log.debug("Processing discovery schema propose message, but node is disconnected (will ignore) " +
+                        "[opId=" + opId + ", msg=" + msg + ']');
+
+                return false;
+            }
+
+            if (log.isDebugEnabled())
+                log.debug("Processing discovery schema propose message [opId=" + opId + ", msg=" + msg + ']');
+
+            // Put message to active operations set.
+            SchemaProposeDiscoveryMessage oldDesc = activeProposals.put(msg.operation().id(), msg);
+
+            assert oldDesc == null;
+
+            // Create schema operation and either trigger it immediately from exchange thread or append to already
+            // running operation.
+            SchemaOperation schemaOp = new SchemaOperation(msg);
+
+            SchemaKey key = msg.schemaKey();
+
+            SchemaOperation prevSchemaOp = schemaOps.get(key);
+
+            if (prevSchemaOp != null) {
+                prevSchemaOp = prevSchemaOp.unwind();
+
+                if (log.isDebugEnabled())
+                    log.debug("Schema change is enqueued and will be executed after previous operation is completed " +
+                        "[opId=" + opId + ", prevOpId=" + prevSchemaOp.id() + ']');
+
+                prevSchemaOp.next(schemaOp);
+
+                return false;
+            }
+            else {
+                schemaOps.put(key, schemaOp);
+
+                return exchangeReady;
+            }
+        }
+    }
+
+    /**
+     * Handle schema propose from exchange thread.
+     *
+     * @param msg Discovery message.
+     */
+    @SuppressWarnings("ThrowableInstanceNeverThrown")
+    public void onSchemaPropose(SchemaProposeDiscoveryMessage msg) {
+        UUID opId = msg.operation().id();
+
+        if (log.isDebugEnabled())
+            log.debug("Processing schema propose message (exchange) [opId=" + opId + ']');
+
+        synchronized (stateMux) {
+            if (disconnected)
+                return;
+
+            SchemaOperation curOp = schemaOps.get(msg.schemaKey());
+
+            assert curOp != null;
+            assert F.eq(opId, curOp.id());
+            assert !curOp.started();
+
+            startSchemaChange(curOp);
+        }
+    }
+
+    /**
+     * Process schema finish message from discovery thread.
+     *
+     * @param msg Message.
+     */
+    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+    private void onSchemaFinishDiscovery(SchemaFinishDiscoveryMessage msg) {
+        UUID opId = msg.operation().id();
+
+        if (log.isDebugEnabled())
+            log.debug("Received schema finish message (discovery) [opId=" + opId + ", msg=" + msg + ']');
+
+        synchronized (stateMux) {
+            if (disconnected)
+                return;
+
+            boolean completedOpAdded = completedOpIds.add(opId);
+
+            assert completedOpAdded;
+
+            // Remove propose message so that it will not be shared with joining nodes.
+            SchemaProposeDiscoveryMessage proposeMsg = activeProposals.remove(opId);
+
+            assert proposeMsg != null;
+
+            // Apply changes to public cache schema if operation is successful and original cache is still there.
+            if (!msg.hasError()) {
+                DynamicCacheDescriptor cacheDesc = ctx.cache().cacheDescriptor(msg.operation().space());
+
+                if (cacheDesc != null && F.eq(cacheDesc.deploymentId(), proposeMsg.deploymentId()))
+                    cacheDesc.schemaChangeFinish(msg);
+            }
+
+            // Propose message will be used from exchange thread to
+            msg.proposeMessage(proposeMsg);
+
+            if (exchangeReady) {
+                SchemaOperation op = schemaOps.get(proposeMsg.schemaKey());
+
+                if (F.eq(op.id(), opId)) {
+                    // Completed top operation.
+                    op.finishMessage(msg);
+
+                    if (op.started())
+                        op.doFinish();
+                }
+                else {
+                    // Completed operation in the middle, will schedule completion later.
+                    while (op != null) {
+                        if (F.eq(op.id(), opId))
+                            break;
+
+                        op = op.next();
+                    }
+
+                    assert op != null;
+                    assert !op.started();
+
+                    op.finishMessage(msg);
+                }
+            }
+            else {
+                // Set next operation as top-level one.
+                SchemaKey schemaKey = proposeMsg.schemaKey();
+
+                SchemaOperation op = schemaOps.remove(schemaKey);
+
+                assert op != null;
+                assert F.eq(op.id(), opId);
+
+                // Chain to the next operation (if any).
+                SchemaOperation nextOp = op.next();
+
+                if (nextOp != null)
+                    schemaOps.put(schemaKey, nextOp);
+            }
+
+            // Clean stale IO messages from just-joined nodes.
+            cleanStaleStatusMessages(opId);
+        }
+
+        // Complete client future (if any).
+        SchemaOperationClientFuture cliFut = schemaCliFuts.remove(opId);
+
+        if (cliFut != null) {
+            if (msg.hasError())
+                cliFut.onDone(msg.error());
+            else
+                cliFut.onDone();
+        }
+    }
+
+    /**
+     * Initiate actual schema change operation.
+     *
+     * @param schemaOp Schema operation.
+     */
+    @SuppressWarnings({"unchecked", "ThrowableInstanceNeverThrown"})
+    private void startSchemaChange(SchemaOperation schemaOp) {
+        assert Thread.holdsLock(stateMux);
+        assert !schemaOp.started();
+
+        // Get current cache state.
+        SchemaProposeDiscoveryMessage msg = schemaOp.proposeMessage();
+
+        String space = msg.operation().space();
+
+        DynamicCacheDescriptor cacheDesc = ctx.cache().cacheDescriptor(space);
+
+        boolean cacheExists = cacheDesc != null && F.eq(msg.deploymentId(), cacheDesc.deploymentId());
+
+        boolean cacheRegistered = cacheExists && spaces.contains(CU.mask(space));
+
+        // Validate schema state and decide whether we should proceed or not.
+        SchemaAbstractOperation op = msg.operation();
+
+        QueryTypeDescriptorImpl type = null;
+        SchemaOperationException err;
+
+        boolean nop = false;
+
+        if (cacheExists) {
+            if (cacheRegistered) {
+                // If cache is started, we perform validation against real schema.
+                T3<QueryTypeDescriptorImpl, Boolean, SchemaOperationException> res = prepareChangeOnStartedCache(op);
+
+                assert res.get2() != null;
+
+                type = res.get1();
+                nop = res.get2();
+                err = res.get3();
+            }
+            else {
+                // If cache is not started yet, there is no schema. Take schema from cache descriptor and validate.
+                QuerySchema schema = cacheDesc.schema();
+
+                T2<Boolean, SchemaOperationException> res = prepareChangeOnNotStartedCache(op, schema);
+
+                assert res.get1() != null;
+
+                type = null;
+                nop = res.get1();
+                err = res.get2();
+            }
+        }
+        else
+            err = new SchemaOperationException(SchemaOperationException.CODE_CACHE_NOT_FOUND, op.space());
+
+        // Start operation.
+        SchemaOperationWorker worker =
+            new SchemaOperationWorker(ctx, this, msg.deploymentId(), op, nop, err, cacheRegistered, type);
+
+        SchemaOperationManager mgr = new SchemaOperationManager(ctx, this, worker,
+            ctx.clientNode() ? null : coordinator());
+
+        schemaOp.manager(mgr);
+
+        mgr.start();
+
+        // Unwind pending IO messages.
+        if (!ctx.clientNode() && coordinator().isLocal())
+            unwindPendingMessages(schemaOp.id(), mgr);
+
+        // Schedule operation finish handling if needed.
+        if (schemaOp.hasFinishMessage())
+            schemaOp.doFinish();
+    }
+
     /**
      * @return {@code true} If indexing module is in classpath and successfully initialized.
      */
@@ -148,55 +642,115 @@ public class GridQueryProcessor extends GridProcessorAdapter {
     }
 
     /**
+     * @return Indexing.
+     * @throws IgniteException If module is not enabled.
+     */
+    public GridQueryIndexing getIndexing() throws IgniteException {
+        checkxEnabled();
+
+        return idx;
+    }
+
+    /**
      * @param cctx Cache context.
+     * @param schema Initial schema.
      * @throws IgniteCheckedException If failed.
      */
-    @SuppressWarnings("deprecation")
-    private void initializeCache(GridCacheContext<?, ?> cctx) throws IgniteCheckedException {
+    @SuppressWarnings({"deprecation", "ThrowableResultOfMethodCallIgnored"})
+    private void initializeCache(GridCacheContext<?, ?> cctx, QuerySchema schema) throws IgniteCheckedException {
         String space = cctx.name();
 
-        CacheConfiguration<?,?> ccfg = cctx.config();
-
         // Prepare candidates.
         List<Class<?>> mustDeserializeClss = new ArrayList<>();
 
         Collection<QueryTypeCandidate> cands = new ArrayList<>();
 
-        if (!F.isEmpty(ccfg.getQueryEntities())) {
-            for (QueryEntity qryEntity : ccfg.getQueryEntities()) {
+        Collection<QueryEntity> qryEntities = schema.entities();
+
+        if (!F.isEmpty(qryEntities)) {
+            for (QueryEntity qryEntity : qryEntities) {
                 QueryTypeCandidate cand = QueryUtils.typeForQueryEntity(space, cctx, qryEntity, mustDeserializeClss);
 
                 cands.add(cand);
             }
         }
 
-        // Register candidates.
-        idx.registerCache(space, cctx, cctx.config());
+        // Ensure that candidates has unique index names. Otherwise we will not be able to apply pending operations.
+        Map<String, QueryTypeDescriptorImpl> tblTypMap = new HashMap<>();
+        Map<String, QueryTypeDescriptorImpl> idxTypMap = new HashMap<>();
 
-        try {
-            for (QueryTypeCandidate cand : cands) {
-                QueryTypeIdKey typeId = cand.typeId();
-                QueryTypeIdKey altTypeId = cand.alternativeTypeId();
-                QueryTypeDescriptorImpl desc = cand.descriptor();
+        for (QueryTypeCandidate cand : cands) {
+            QueryTypeDescriptorImpl desc = cand.descriptor();
 
-                if (typesByName.putIfAbsent(new QueryTypeNameKey(space, desc.name()), desc) != null)
-                    throw new IgniteCheckedException("Type with name '" + desc.name() + "' already indexed " +
-                        "in cache '" + space + "'.");
+            QueryTypeDescriptorImpl oldDesc = tblTypMap.put(desc.tableName(), desc);
 
-                types.put(typeId, desc);
+            if (oldDesc != null)
+                throw new IgniteException("Duplicate table name [tblName=" + desc.tableName() +
+                    ", type1=" + desc.name() + ", type2=" + oldDesc.name() + ']');
 
-                if (altTypeId != null)
-                    types.put(altTypeId, desc);
+            for (String idxName : desc.indexes().keySet()) {
+                oldDesc = idxTypMap.put(idxName, desc);
 
-                idx.registerType(space, desc);
+                if (oldDesc != null)
+                    throw new IgniteException("Duplicate index name [idxName=" + idxName +
+                        ", type1=" + desc.name() + ", type2=" + oldDesc.name() + ']');
             }
         }
-        catch (IgniteCheckedException | RuntimeException e) {
-            unregisterCache0(space);
 
-            throw e;
+        // Apply pending operation which could have been completed as no-op at this point. There could be only one
+        // in-flight operation for a cache.
+        synchronized (stateMux) {
+            if (disconnected)
+                return;
+
+            for (SchemaOperation op : schemaOps.values()) {
+                if (F.eq(op.proposeMessage().deploymentId(), cctx.dynamicDeploymentId())) {
+                    if (op.started()) {
+                        SchemaOperationWorker worker = op.manager().worker();
+
+                        assert !worker.cacheRegistered();
+
+                        if (!worker.nop()) {
+                            IgniteInternalFuture fut = worker.future();
+
+                            assert fut.isDone();
+
+                            if (fut.error() == null) {
+                                SchemaAbstractOperation op0 = op.proposeMessage().operation();
+
+                                if (op0 instanceof SchemaIndexCreateOperation) {
+                                    SchemaIndexCreateOperation opCreate = (SchemaIndexCreateOperation)op0;
+
+                                    QueryTypeDescriptorImpl typeDesc = tblTypMap.get(opCreate.tableName());
+
+                                    assert typeDesc != null;
+
+                                    QueryUtils.processDynamicIndexChange(opCreate.indexName(), opCreate.index(),
+                                        typeDesc);
+                                }
+                                else if (op0 instanceof SchemaIndexDropOperation) {
+                                    SchemaIndexDropOperation opDrop = (SchemaIndexDropOperation)op0;
+
+                                    QueryTypeDescriptorImpl typeDesc = idxTypMap.get(opDrop.indexName());
+
+                                    assert typeDesc != null;
+
+                                    QueryUtils.processDynamicIndexChange(opDrop.indexName(), null, typeDesc);
+                                }
+                                else
+                                    assert false;
+                            }
+                        }
+                    }
+
+                    break;
+                }
+            }
         }
 
+        // Ready to register at this point.
+        registerCache0(space, cctx, cands);
+
         // Warn about possible implicit deserialization.
         if (!mustDeserializeClss.isEmpty()) {
             U.warn(log, "Some classes in query configuration cannot be written in binary format " +
@@ -209,46 +763,41 @@ public class GridQueryProcessor extends GridProcessorAdapter {
     }
 
     /** {@inheritDoc} */
-    @Override public void onKernalStop(boolean cancel) {
-        super.onKernalStop(cancel);
-
-        if (cancel && idx != null)
-            try {
-                while (!busyLock.tryBlock(500))
-                    idx.cancelAllQueries();
-
-                return;
-            }
-            catch (InterruptedException ignored) {
-                U.warn(log, "Interrupted while waiting for active queries cancellation.");
+    @Override public void onDisconnected(IgniteFuture<?> reconnectFut) throws IgniteCheckedException {
+        Collection<SchemaOperationClientFuture> futs;
 
-                Thread.currentThread().interrupt();
-            }
+        synchronized (stateMux) {
+            disconnected = true;
+            exchangeReady = false;
 
-        busyLock.block();
-    }
+            // Clear client futures.
+            futs = new ArrayList<>(schemaCliFuts.values());
 
-    /** {@inheritDoc} */
-    @Override public void stop(boolean cancel) throws IgniteCheckedException {
-        super.stop(cancel);
+            schemaCliFuts.clear();
 
-        if (idx != null)
-            idx.stop();
+            // Clear operations data.
+            activeProposals.clear();
+            schemaOps.clear();
+        }
 
-        U.closeQuiet(qryDetailMetricsEvictTask);
-    }
+        // Complete client futures outside of synchonized block because they may have listeners/chains.
+        for (SchemaOperationClientFuture fut : futs)
+            fut.onDone(new SchemaOperationException("Client node is disconnected (operation result is unknown)."));
 
-    /** {@inheritDoc} */
-    @Override public void onDisconnected(IgniteFuture<?> reconnectFut) throws IgniteCheckedException {
         if (idx != null)
             idx.onDisconnected(reconnectFut);
     }
 
     /**
+     * Handle cache start. Invoked either from GridCacheProcessor.onKernalStart() method or from exchange worker.
+     * When called for the first time, we initialize topology thus understanding whether current node is coordinator
+     * or not.
+     *
      * @param cctx Cache context.
+     * @param schema Index states.
      * @throws IgniteCheckedException If failed.
      */
-    public void onCacheStart(GridCacheContext cctx) throws IgniteCheckedException {
+    public void onCacheStart(GridCacheContext cctx, QuerySchema schema) throws IgniteCheckedException {
         if (idx == null)
             return;
 
@@ -258,45 +807,506 @@ public class GridQueryProcessor extends GridProcessorAdapter {
         cctx.shared().database().checkpointReadLock();
 
         try {
-            initializeCache(cctx);
+            initializeCache(cctx, schema);
         }
         finally {
             cctx.shared().database().checkpointReadUnlock();
 
-            busyLock.leaveBusy();
+            busyLock.leaveBusy();
+        }
+    }
+
+    /**
+     * @param cctx Cache context.
+     */
+    public void onCacheStop(GridCacheContext cctx) {
+        if (idx == null)
+            return;
+
+        if (!busyLock.enterBusy())
+            return;
+
+        try {
+            unregisterCache0(cctx.name());
+        }
+        finally {
+            busyLock.leaveBusy();
+        }
+    }
+
+    /**
+     * @return Skip field lookup flag.
+     */
+    public boolean skipFieldLookup() {
+        return skipFieldLookup;
+    }
+
+    /**
+     * @param skipFieldLookup Skip field lookup flag.
+     */
+    public void skipFieldLookup(boolean skipFieldLookup) {
+        this.skipFieldLookup = skipFieldLookup;
+    }
+
+    /**
+     * Handle custom discovery message.
+     *
+     * @param msg Message.
+     */
+    public void onDiscovery(SchemaAbstractDiscoveryMessage msg) {
+        IgniteUuid id = msg.id();
+
+        if (!dscoMsgIdHist.add(id)) {
+            U.warn(log, "Received duplicate schema custom discovery message (will ignore) [opId=" +
+                msg.operation().id() + ", msg=" + msg  +']');
+
+            return;
+        }
+
+        if (msg instanceof SchemaProposeDiscoveryMessage) {
+            SchemaProposeDiscoveryMessage msg0 = (SchemaProposeDiscoveryMessage)msg;
+
+            boolean exchange = onSchemaProposeDiscovery(msg0);
+
+            msg0.exchange(exchange);
+        }
+        else if (msg instanceof SchemaFinishDiscoveryMessage) {
+            SchemaFinishDiscoveryMessage msg0 = (SchemaFinishDiscoveryMessage)msg;
+
+            onSchemaFinishDiscovery(msg0);
+        }
+        else
+            U.warn(log, "Received unsupported schema custom discovery message (will ignore) [opId=" +
+                msg.operation().id() + ", msg=" + msg  +']');
+    }
+
+    /**
+     * Prepare change on started cache.
+     *
+     * @param op Operation.
+     * @return Result: affected type, nop flag, error.
+     */
+    private T3<QueryTypeDescriptorImpl, Boolean, SchemaOperationException> prepareChangeOnStartedCache(
+        SchemaAbstractOperation op) {
+        QueryTypeDescriptorImpl type = null;
+        boolean nop = false;
+        SchemaOperationException err = null;
+
+        String space = op.space();
+
+        if (op instanceof SchemaIndexCreateOperation) {
+            SchemaIndexCreateOperation op0 = (SchemaIndexCreateOperation) op;
+
+            QueryIndex idx = op0.index();
+
+            // Make sure table exists.
+            String tblName = op0.tableName();
+
+            type = type(space, tblName);
+
+            if (type == null)
+                err = new SchemaOperationException(SchemaOperationException.CODE_TABLE_NOT_FOUND, tblName);
+            else {
+                // Make sure that index can be applied to the given table.
+                for (String idxField : idx.getFieldNames()) {
+                    if (!type.fields().containsKey(idxField)) {
+                        err = new SchemaOperationException(SchemaOperationException.CODE_COLUMN_NOT_FOUND,
+                            idxField);
+
+                        break;
+                    }
+                }
+            }
+
+            // Check conflict with other indexes.
+            if (err == null) {
+                String idxName = op0.index().getName();
+
+                QueryIndexKey idxKey = new QueryIndexKey(space, idxName);
+
+                if (idxs.get(idxKey) != null) {
+                    if (op0.ifNotExists())
+                        nop = true;
+                    else
+                        err = new SchemaOperationException(SchemaOperationException.CODE_INDEX_EXISTS, idxName);
+                }
+            }
+        }
+        else if (op instanceof SchemaIndexDropOperation) {
+            SchemaIndexDropOperation op0 = (SchemaIndexDropOperation) op;
+
+            String idxName = op0.indexName();
+
+            QueryIndexDescriptorImpl oldIdx = idxs.get(new QueryIndexKey(space, idxName));
+
+            if (oldIdx == null) {
+                if (op0.ifExists())
+                    nop = true;
+                else
+                    err = new SchemaOperationException(SchemaOperationException.CODE_INDEX_NOT_FOUND, idxName);
+            }
+            else
+                type = oldIdx.typeDescriptor();
+        }
+        else
+            err = new SchemaOperationException("Unsupported operation: " + op);
+
+        return new T3<>(type, nop, err);
+    }
+
+    /**
+     * Prepare operation on non-started cache.
+     *
+     * @param op Operation.
+     * @param schema Known cache schema.
+     * @return Result: nop flag, error.
+     */
+    private T2<Boolean, SchemaOperationException> prepareChangeOnNotStartedCache(SchemaAbstractOperation op,
+        QuerySchema schema) {
+        boolean nop = false;
+        SchemaOperationException err = null;
+
+        // Build table and index maps.
+        Map<String, QueryEntity> tblMap = new HashMap<>();
+        Map<String, T2<QueryEntity, QueryIndex>> idxMap = new HashMap<>();
+
+        for (QueryEntity entity : schema.entities()) {
+            String tblName = QueryUtils.tableName(entity);
+
+            QueryEntity oldEntity = tblMap.put(tblName, entity);
+
+            if (oldEntity != null) {
+                err = new SchemaOperationException("Invalid schema state (duplicate table found): " + tblName);
+
+                break;
+            }
+
+            for (QueryIndex entityIdx : entity.getIndexes()) {
+                String idxName = QueryUtils.indexName(entity, entityIdx);
+
+                T2<QueryEntity, QueryIndex> oldIdxEntity = idxMap.put(idxName, new T2<>(entity, entityIdx));
+
+                if (oldIdxEntity != null) {
+                    err = new SchemaOperationException("Invalid schema state (duplicate index found): " +
+                        idxName);
+
+                    break;
+                }
+            }
+
+            if (err != null)
+                break;
+        }
+
+        // Now check whether operation can be applied to schema.
+        if (op instanceof SchemaIndexCreateOperation) {
+            SchemaIndexCreateOperation op0 = (SchemaIndexCreateOperation)op;
+
+            String idxName = op0.indexName();
+
+            T2<QueryEntity, QueryIndex> oldIdxEntity = idxMap.get(idxName);
+
+            if (oldIdxEntity == null) {
+                String tblName = op0.tableName();
+
+                QueryEntity oldEntity = tblMap.get(tblName);
+
+                if (oldEntity == null)
+                    err = new SchemaOperationException(SchemaOperationException.CODE_TABLE_NOT_FOUND, tblName);
+                else {
+                    for (String fieldName : op0.index().getFields().keySet()) {
+                        Set<String> oldEntityFields = new HashSet<>(oldEntity.getFields().keySet());
+
+                        for (Map.Entry<String, String> alias : oldEntity.getAliases().entrySet()) {
+                            oldEntityFields.remove(alias.getKey());
+                            oldEntityFields.add(alias.getValue());
+                        }
+
+                        if (!oldEntityFields.contains(fieldName)) {
+                            err = new SchemaOperationException(SchemaOperationException.CODE_COLUMN_NOT_FOUND,
+                                fieldName);
+
+                            break;
+                        }
+                    }
+                }
+            }
+            else {
+                if (op0.ifNotExists())
+                    nop = true;
+                else
+                    err = new SchemaOperationException(SchemaOperationException.CODE_INDEX_EXISTS, idxName);
+            }
+        }
+        else if (op instanceof SchemaIndexDropOperation) {
+            SchemaIndexDropOperation op0 = (SchemaIndexDropOperation)op;
+
+            String idxName = op0.indexName();
+
+            T2<QueryEntity, QueryIndex> oldIdxEntity = idxMap.get(idxName);
+
+            if (oldIdxEntity == null) {
+                if (op0.ifExists())
+                    nop = true;
+                else
+                    err = new SchemaOperationException(SchemaOperationException.CODE_INDEX_NOT_FOUND, idxName);
+            }
+        }
+        else
+            err = new SchemaOperationException("Unsupported operation: " + op);
+
+        return new T2<>(nop, err);
+    }
+
+    /**
+     * Invoked when coordinator finished ensuring that all participants are ready.
+     *
+     * @param op Operation.
+     * @param err Error (if any).
+     */
+    public void onCoordinatorFinished(SchemaAbstractOperation op, @Nullable SchemaOperationException err) {
+        synchronized (stateMux) {
+            SchemaFinishDiscoveryMessage msg = new SchemaFinishDiscoveryMessage(op, err);
+
+            try {
+                ctx.discovery().sendCustomEvent(msg);
+            }
+            catch (Exception e) {
+                // Failed to send finish message over discovery. This is something unrecoverable.
+                U.warn(log, "Failed to send schema finish discovery message [opId=" + op.id() + ']', e);
+            }
+        }
+    }
+
+    /**
+     * Get current coordinator node.
+     *
+     * @return Coordinator node.
+     */
+    private ClusterNode coordinator() {
+        assert !ctx.clientNode();
+
+        synchronized (stateMux) {
+            if (crd == null) {
+                ClusterNode crd0 = null;
+
+                for (ClusterNode node : ctx.discovery().aliveServerNodes()) {
+                    if (crd0 == null || crd0.order() > node.order())
+                        crd0 = node;
+                }
+
+                assert crd0 != null;
+
+                crd = crd0;
+            }
+
+            return crd;
+        }
+    }
+
+    /**
+     * Get rid of stale IO message received from other nodes which joined when operation had been in progress.
+     *
+     * @param opId Operation ID.
+     */
+    private void cleanStaleStatusMessages(UUID opId) {
+        Iterator<SchemaOperationStatusMessage> it = pendingMsgs.iterator();
+
+        while (it.hasNext()) {
+            SchemaOperationStatusMessage statusMsg = it.next();
+
+            if (F.eq(opId, statusMsg.operationId())) {
+                it.remove();
+
+                if (log.isDebugEnabled())
+                    log.debug("Dropped operation status message because it is already completed [opId=" + opId +
+                        ", rmtNode=" + statusMsg.senderNodeId() + ']');
+            }
+        }
+    }
+
+    /**
+     * Apply positive index operation result.
+     *
+     * @param op Operation.
+     * @param type Type descriptor (if available),
+     */
+    public void onLocalOperationFinished(SchemaAbstractOperation op, @Nullable QueryTypeDescriptorImpl type) {
+        synchronized (stateMux) {
+            if (disconnected)
+                return;
+
+            // No need to apply anything to obsolete type.
+            if (type == null || type.obsolete()) {
+                if (log.isDebugEnabled())
+                    log.debug("Local operation finished, but type descriptor is either missing or obsolete " +
+                        "(will ignore) [opId=" + op.id() + ']');
+
+                return;
+            }
+
+            if (log.isDebugEnabled())
+                log.debug("Local operation finished successfully [opId=" + op.id() + ']');
+
+            try {
+                if (op instanceof SchemaIndexCreateOperation) {
+                    SchemaIndexCreateOperation op0 = (SchemaIndexCreateOperation)op;
+
+                    QueryUtils.processDynamicIndexChange(op0.indexName(), op0.index(), type);
+
+                    QueryIndexDescriptorImpl idxDesc = type.index(op0.indexName());
+
+                    QueryIndexKey idxKey = new QueryIndexKey(op.space(), op0.indexName());
+
+                    idxs.put(idxKey, idxDesc);
+                }
+                else {
+                    assert op instanceof SchemaIndexDropOperation;
+
+                    SchemaIndexDropOperation op0 = (SchemaIndexDropOperation) op;
+
+                    QueryUtils.processDynamicIndexChange(op0.indexName(), null, type);
+
+                    QueryIndexKey idxKey = new QueryIndexKey(op.space(), op0.indexName());
+
+                    idxs.remove(idxKey);
+                }
+            }
+            catch (IgniteCheckedException e) {
+                U.warn(log, "Failed to finish index operation [opId=" + op.id() + " op=" + op + ']', e);
+            }
+        }
+    }
+
+    /**
+     * Handle node leave.
+     *
+     * @param node Node.
+     */
+    public void onNodeLeave(ClusterNode node) {
+        synchronized (stateMux) {
+            // Clients do not send status messages and are never coordinators.
+            if (ctx.clientNode())
+                return;
+
+            ClusterNode crd0 = coordinator();
+
+            if (F.eq(node.id(), crd0.id())) {
+                crd = null;
+
+                crd0 = coordinator();
+            }
+
+            for (SchemaOperation op : schemaOps.values()) {
+                if (op.started()) {
+                    op.manager().onNodeLeave(node.id(), crd0);
+
+                    if (crd0.isLocal())
+                        unwindPendingMessages(op.id(), op.manager());
+                }
+            }
+        }
+    }
+
+    /**
+     * Process index operation.
+     *
+     * @param op Operation.
+     * @param type Type descriptor.
+     * @param depId Cache deployment ID.
+     * @param cancelTok Cancel token.
+     * @throws SchemaOperationException If failed.
+     */
+    public void processIndexOperationLocal(SchemaAbstractOperation op, QueryTypeDescriptorImpl type, IgniteUuid depId,
+        SchemaIndexOperationCancellationToken cancelTok) throws SchemaOperationException {
+        if (log.isDebugEnabled())
+            log.debug("Started local index operation [opId=" + op.id() + ']');
+
+        String space = op.space();
+
+        GridCacheAdapter cache = ctx.cache().internalCache(op.space());
+
+        if (cache == null || !F.eq(depId, cache.context().dynamicDeploymentId()))
+            throw new SchemaOperationException(SchemaOperationException.CODE_CACHE_NOT_FOUND, op.space());
+
+        try {
+            if (op instanceof SchemaIndexCreateOperation) {
+                SchemaIndexCreateOperation op0 = (SchemaIndexCreateOperation) op;
+
+                QueryIndexDescriptorImpl idxDesc = QueryUtils.createIndexDescriptor(type, op0.index());
+
+                SchemaIndexCacheVisitor visitor =
+                    new SchemaIndexCacheVisitorImpl(this, cache.context(), space, op0.tableName(), cancelTok);
+
+                idx.dynamicIndexCreate(space, op0.tableName(), idxDesc, op0.ifNotExists(), visitor);
+            }
+            else if (op instanceof SchemaIndexDropOperation) {
+                SchemaIndexDropOperation op0 = (SchemaIndexDropOperation) op;
+
+                idx.dynamicIndexDrop(space, op0.indexName(), op0.ifExists());
+            }
+            else
+                throw new SchemaOperationException("Unsupported operation: " + op);
+        }
+        catch (Exception e) {
+            if (e instanceof SchemaOperationException)
+                throw (SchemaOperationException)e;
+            else
+                throw new SchemaOperationException("Schema change operation failed: " + e.getMessage(), e);
         }
     }
 
     /**
+     * Register cache in indexing SPI.
+     *
+     * @param space Space.
      * @param cctx Cache context.
+     * @param cands Candidates.
+     * @throws IgniteCheckedException If failed.
      */
-    public void onCacheStop(GridCacheContext cctx) {
-        if (idx == null)
-            return;
+    private void registerCache0(String space, GridCacheContext<?, ?> cctx, Collection<QueryTypeCandidate> cands)
+        throws IgniteCheckedException {
+        synchronized (stateMux) {
+            idx.registerCache(space, cctx, cctx.config());
 
-        if (!busyLock.enterBusy())
-            return;
+            try {
+                for (QueryTypeCandidate cand : cands) {
+                    QueryTypeIdKey typeId = cand.typeId();
+                    QueryTypeIdKey altTypeId = cand.alternativeTypeId();
+                    QueryTypeDescriptorImpl desc = cand.descriptor();
 
-        try {
-            unregisterCache0(cctx.name());
-        }
-        finally {
-            busyLock.leaveBusy();
-        }
-    }
+                    if (typesByName.putIfAbsent(new QueryTypeNameKey(space, desc.name()), desc) != null)
+                        throw new IgniteCheckedException("Type with name '" + desc.name() + "' already indexed " +
+                            "in cache '" + space + "'.");
 
-    /**
-     * @return Skip field lookup flag.
-     */
-    public boolean skipFieldLookup() {
-        return skipFieldLookup;
-    }
+                    types.put(typeId, desc);
 
-    /**
-     * @param skipFieldLookup Skip field lookup flag.
-     */
-    public void skipFieldLookup(boolean skipFieldLookup) {
-        this.skipFieldLookup = skipFieldLookup;
+                    if (altTypeId != null)
+                        types.put(altTypeId, desc);
+
+                    for (QueryIndexDescriptorImpl idx : desc.indexes0()) {
+                        QueryIndexKey idxKey = new QueryIndexKey(space, idx.name());
+
+                        QueryIndexDescriptorImpl oldIdx = idxs.putIfAbsent(idxKey, idx);
+
+                        if (oldIdx != null) {
+                            throw new IgniteException("Duplicate index name [space=" + space +
+                                ", idxName=" + idx.name() + ", existingTable=" + oldIdx.typeDescriptor().tableName() +
+                                ", table=" + desc.tableName() + ']');
+                        }
+                    }
+
+                    idx.registerType(space, desc);
+                }
+
+                spaces.add(CU.mask(space));
+            }
+            catch (IgniteCheckedException | RuntimeException e) {
+                unregisterCache0(space);
+
+                throw e;
+            }
+        }
     }
 
     /**
@@ -307,13 +1317,8 @@ public class GridQueryProcessor extends GridProcessorAdapter {
     private void unregisterCache0(String space) {
         assert idx != null;
 
-        try {
-            idx.unregisterCache(space);
-        }
-        catch (Exception e) {
-            U.error(log, "Failed to clear indexing on cache unregister (will ignore): " + space, e);
-        }
-        finally {
+        synchronized (stateMux) {
+            // Clear types.
             Iterator<Map.Entry<QueryTypeIdKey, QueryTypeDescriptorImpl>> it = types.entrySet().iterator();
 
             while (it.hasNext()) {
@@ -323,9 +1328,79 @@ public class GridQueryProcessor extends GridProcessorAdapter {
                     it.remove();
 
                     typesByName.remove(new QueryTypeNameKey(space, entry.getValue().name()));
+
+                    entry.getValue().markObsolete();
                 }
             }
+
+            // Clear indexes.
+            Iterator<Map.Entry<QueryIndexKey, QueryIndexDescriptorImpl>> idxIt = idxs.entrySet().iterator();
+
+            while (idxIt.hasNext()) {
+                Map.Entry<QueryIndexKey, QueryIndexDescriptorImpl> idxEntry = idxIt.next();
+
+                QueryIndexKey idxKey = idxEntry.getKey();
+
+                if (F.eq(space, idxKey.space()))
+                    idxIt.remove();
+            }
+
+            // Notify in-progress index operations.
+            for (SchemaOperation op : schemaOps.values()) {
+                if (op.started())
+                    op.manager().worker().cancel();
+            }
+
+            // Notify indexing.
+            try {
+                idx.unregisterCache(space);
+            }
+            catch (Exception e) {
+                U.error(log, "Failed to clear indexing on cache unregister (will ignore): " + space, e);
+            }
+
+            spaces.remove(CU.mask(space));
+        }
+    }
+
+    /**
+     * Check whether provided key and value belongs to expected space and table.
+     *
+     * @param cctx Target cache context.
+     * @param expSpace Expected space.
+     * @param expTblName Expected table name.
+     * @param key Key.
+     * @param val Value.
+     * @return {@code True} if this key-value pair belongs to expected space/table, {@code false} otherwise or
+     *     if space or table doesn't exist.
+     * @throws IgniteCheckedException If failed.
+     */
+    @SuppressWarnings("ConstantConditions")
+    public boolean belongsToTable(GridCacheContext cctx, String expSpace, String expTblName, KeyCacheObject key,
+        CacheObject val) throws IgniteCheckedException {
+        QueryTypeDescriptorImpl desc = type(expSpace, val);
+
+        if (desc == null)
+            return false;
+
+        if (!F.eq(expTblName, desc.tableName()))
+            return false;
+
+        if (!cctx.cacheObjects().isBinaryObject(val)) {
+            Class<?> valCls = val.value(cctx.cacheObjectContext(), false).getClass();
+
+            if (!desc.valueClass().isAssignableFrom(valCls))
+                return false;
         }
+
+        if (!cctx.cacheObjects().isBinaryObject(key)) {
+            Class<?> keyCls = key.value(cctx.cacheObjectContext(), false).getClass();
+
+            if (!desc.keyClass().isAssignableFrom(keyCls))
+                return false;
+        }
+
+        return true;
     }
 
     /**
@@ -457,7 +1532,7 @@ public class GridQueryProcessor extends GridProcessorAdapter {
             if (desc == null)
                 return;
 
-            idx.store(space, desc, key, partId, val, ver, expirationTime, link);
+            idx.store(space, desc.name(), key, partId, val, ver, expirationTime, link);
         }
         finally {
             busyLock.leaveBusy();
@@ -518,6 +1593,30 @@ public class GridQueryProcessor extends GridProcessorAdapter {
     }
 
     /**
+     * Gets type descriptor for space by given object's type.
+     *
+     * @param space Space name.
+     * @param val Object to determine type for.
+     * @return Type descriptor.
+     * @throws IgniteCheckedException If failed.
+     */
+    @SuppressWarnings("ConstantConditions")
+    private QueryTypeDescriptorImpl type(@Nullable String space, CacheObject val) throws IgniteCheckedException {
+        CacheObjectContext coctx = cacheObjectContext(space);
+
+        QueryTypeIdKey id;
+
+        boolean binaryVal = ctx.cacheObjects().isBinaryObject(val);
+
+        if (binaryVal)
+            id = new QueryTypeIdKey(space, ctx.cacheObjects().typeId(val));
+        else
+            id = new QueryTypeIdKey(space, val.value(coctx, false).getClass());
+
+        return types.get(id);
+    }
+
+    /**
      * @throws IgniteCheckedException If failed.
      */
     private void checkEnabled() throws IgniteCheckedException {
@@ -637,9 +1736,9 @@ public class GridQueryProcessor extends GridProcessorAdapter {
                     @Override public QueryCursor<Cache.Entry<K, V>> applyx() throws IgniteCheckedException {
                         String type = qry.getType();
 
-                        QueryTypeDescriptorImpl typeDesc = type(cctx.name(), type);
+                        String typeName = typeName(cctx.name(), type);
 
-                        qry.setType(typeDesc.name());
+                        qry.setType(typeName);
 
                         sendQueryExecutedEvent(
                             qry.getSql(),
@@ -682,6 +1781,80 @@ public class GridQueryProcessor extends GridProcessorAdapter {
     }
 
     /**
+     * Entry point for index procedure.
+     *
+     * @param space Space name.
+     * @param tblName Table name.
+     * @param idx Index.
+     * @param ifNotExists When set to {@code true} operation will fail if index already exists.
+     * @return Future completed when index is created.
+     */
+    public IgniteInternalFuture<?> dynamicIndexCreate(String space, String tblName, QueryIndex idx,
+        boolean ifNotExists) {
+        SchemaAbstractOperation op = new SchemaIndexCreateOperation(UUID.randomUUID(), space, tblName, idx, ifNotExists);
+
+        return startIndexOperationDistributed(op);
+    }
+
+    /**
+     * Entry point for index drop procedure
+     *
+     * @param idxName Index name.
+     * @param ifExists When set to {@code true} operation fill fail if index doesn't exists.
+     * @return Future completed when index is created.
+     */
+    public IgniteInternalFuture<?> dynamicIndexDrop(String space, String idxName, boolean ifExists) {
+        SchemaAbstractOperation op = new SchemaIndexDropOperation(UUID.randomUUID(), space, idxName, ifExists);
+
+        return startIndexOperationDistributed(op);
+    }
+
+    /**
+     * Start distributed index change operation.
+     *
+     * @param op Operation.
+     * @return Future.
+     */
+    private IgniteInternalFuture<?> startIndexOperationDistributed(SchemaAbstractOperation op) {
+        SchemaOperationClientFuture fut = new SchemaOperationClientFuture(op.id());
+
+        SchemaOperationClientFuture oldFut = schemaCliFuts.put(op.id(), fut);
+
+        assert oldFut == null;
+
+        try {
+            ctx.discovery().sendCustomEvent(new SchemaProposeDiscoveryMessage(op));
+
+            if (log.isDebugEnabled())
+                log.debug("Sent schema propose discovery message [opId=" + op.id() + ", op=" + op + ']');
+
+            boolean disconnected0;
+
+            synchronized (stateMux) {
+                disconnected0 = disconnected;
+            }
+
+            if (disconnected0) {
+                fut.onDone(new SchemaOperationException("Client node is disconnected (operation result is unknown)."));
+
+                schemaCliFuts.remove(op.id());
+            }
+        }
+        catch (Exception e) {
+            if (e instanceof SchemaOperationException)
+                fut.onDone(e);
+            else {
+                fut.onDone(new SchemaOperationException("Failed to start schema change operation due to " +
+                    "unexpected exception [opId=" + op.id() + ", op=" + op + ']', e));
+            }
+
+            schemaCliFuts.remove(op.id());
+        }
+
+        return fut;
+    }
+
+    /**
      * @param sqlQry Sql query.
      * @param params Params.
      */
@@ -704,14 +1877,15 @@ public class GridQueryProcessor extends GridProcessorAdapter {
     }
 
     /**
-     * @param schema Schema.
+     *
+     * @param space Space name.
      * @param sql Query.
      * @return {@link PreparedStatement} from underlying engine to supply metadata to Prepared - most likely H2.
      */
-    public PreparedStatement prepareNativeStatement(String schema, String sql) throws SQLException {
+    public PreparedStatement prepareNativeStatement(String space, String sql) throws SQLException {
         checkxEnabled();
 
-        return idx.prepareNativeStatement(schema, sql);
+        return idx.prepareNativeStatement(space, sql);
     }
 
     /**
@@ -838,9 +2012,9 @@ public class GridQueryProcessor extends GridProcessorAdapter {
             return executeQuery(GridCacheQueryType.TEXT, clause, cctx,
                 new IgniteOutClosureX<GridCloseableIterator<IgniteBiTuple<K, V>>>() {
                     @Override public GridCloseableIterator<IgniteBiTuple<K, V>> applyx() throws IgniteCheckedException {
-                        QueryTypeDescriptorImpl type = type(space, resType);
+                        String typeName = typeName(space, resType);
 
-                        return idx.queryLocalText(space, clause, type, filters);
+                        return idx.queryLocalText(space, clause, typeName, filters);
                     }
                 }, true);
         }
@@ -924,20 +2098,35 @@ public class GridQueryProcessor extends GridProcessorAdapter {
     }
 
     /**
-     * Gets type descriptor for space and type name.
+     * Get type descriptor for the given space and table name.
+     * @param space Space.
+     * @param tblName Table name.
+     * @return Type (if any).
+     */
+    @Nullable private QueryTypeDescriptorImpl type(@Nullable String space, String tblName) {
+        for (QueryTypeDescriptorImpl type : types.values()) {
+            if (F.eq(space, type.space()) && F.eq(tblName, type.tableName()))
+                return type;
+        }
+
+        return null;
+    }
+
+    /**
+     * Gets type name for provided space and type name if type is still valid.
      *
      * @param space Space name.
      * @param typeName Type name.
      * @return Type descriptor.
      * @throws IgniteCheckedException If failed.
      */
-    public QueryTypeDescriptorImpl type(@Nullable String space, String typeName) throws IgniteCheckedException {
+    private String typeName(@Nullable String space, String typeName) throws IgniteCheckedException {
         QueryTypeDescriptorImpl type = typesByName.get(new QueryTypeNameKey(space, typeName));
 
         if (type == null)
             throw new IgniteCheckedException("Failed to find SQL table for type: " + typeName);
 
-        return type;
+        return type.name();
     }
 
     /**
@@ -972,7 +2161,7 @@ public class GridQueryProcessor extends GridProcessorAdapter {
 
             throw (IgniteCheckedException)err;
         }
-        catch (CacheException e) {
+        catch (CacheException | IgniteException e) {
             err = e;
 
             throw e;
@@ -998,6 +2187,146 @@ public class GridQueryProcessor extends GridProcessorAdapter {
     }
 
     /**
+     * Send status message to coordinator node.
+     *
+     * @param destNodeId Destination node ID.
+     * @param opId Operation ID.
+     * @param err Error.
+     */
+    public void sendStatusMessage(UUID destNodeId, UUID opId, SchemaOperationException err) {
+        if (log.isDebugEnabled())
+            log.debug("Sending schema operation status message [opId=" + opId + ", crdNode=" + destNodeId +
+                ", err=" + err + ']');
+
+        try {
+            byte[] errBytes = marshalSchemaError(opId, err);
+
+            SchemaOperationStatusMessage msg = new SchemaOperationStatusMessage(opId, errBytes);
+
+            // Messages must go to dedicated schema pool. We cannot push them to query pool because in this case
+            // they could be blocked with other query requests.
+            ctx.io().sendToGridTopic(destNodeId, TOPIC_SCHEMA, msg, SCHEMA_POOL);
+        }
+        catch (IgniteCheckedException e) {
+            if (log.isDebugEnabled())
+                log.debug("Failed to send schema status response [opId=" + opId + ", destNodeId=" + destNodeId +
+                    ", err=" + e + ']');
+        }
+    }
+
+    /**
+     * Process status message.
+     *
+     * @param msg Status message.
+     */
+    private void processStatusMessage(SchemaOperationStatusMessage msg) {
+        synchronized (stateMux) {
+            if (completedOpIds.contains(msg.operationId())) {
+                // Received message from a node which joined topology in the middle of operation execution.
+                if (log.isDebugEnabled())
+                    log.debug("Received status message for completed operation (will ignore) [" +
+                        "opId=" + msg.operationId() + ", sndNodeId=" + msg.senderNodeId() + ']');
+
+                return;
+            }
+
+            UUID opId = msg.operationId();
+
+            SchemaProposeDiscoveryMessage proposeMsg = activeProposals.get(opId);
+
+            if (proposeMsg != null) {
+                SchemaOperation op = schemaOps.get(proposeMsg.schemaKey());
+
+                if (op != null && F.eq(op.id(), opId) && op.started() && coordinator().isLocal()) {
+                    if (log.isDebugEnabled())
+                        log.debug("Received status message [opId=" + msg.operationId() +
+                            ", sndNodeId=" + msg.senderNodeId() + ']');
+
+                    op.manager().onNodeFinished(msg.senderNodeId(), unmarshalSchemaError(msg.errorBytes()));
+
+                    return;
+                }
+            }
+
+            // Put to pending set if operation is not visible/ready yet.
+            pendingMsgs.add(msg);
+
+            if (log.isDebugEnabled())
+                log.debug("Received status message (added to pending set) [opId=" + msg.operationId() +
+                    ", sndNodeId=" + msg.senderNodeId() + ']');
+        }
+    }
+
+    /**
+     * Unwind pending messages for particular operation.
+     *
+     * @param opId Operation ID.
+     * @param mgr Manager.
+     */
+    private void unwindPendingMessages(UUID opId, SchemaOperationManager mgr) {
+        assert Thread.holdsLock(stateMux);
+
+        Iterator<SchemaOperationStatusMessage> it = pendingMsgs.iterator();
+
+        while (it.hasNext()) {
+            SchemaOperationStatusMessage msg = it.next();
+
+            if (F.eq(msg.operationId(), opId)) {
+                mgr.onNodeFinished(msg.senderNodeId(), unmarshalSchemaError(msg.errorBytes()));
+
+                it.remove();
+            }
+        }
+    }
+
+    /**
+     * Marshal schema error.
+     *
+     * @param err Error.
+     * @return Error bytes.
+     */
+    @Nullable private byte[] marshalSchemaError(UUID opId, @Nullable SchemaOperationException err) {
+        if (err == null)
+            return null;
+
+        try {
+            return U.marshal(marsh, err);
+        }
+        catch (Exception e) {
+            U.warn(log, "Failed to marshal schema operation error [opId=" + opId + ", err=" + err + ']', e);
+
+            try {
+                return U.marshal(marsh, new SchemaOperationException("Operation failed, but error cannot be " +
+                    "serialized (see local node log for more details) [opId=" + opId + ", nodeId=" +
+                    ctx.localNodeId() + ']'));
+            }
+            catch (Exception e0) {
+                assert false; // Impossible situation.
+
+                return null;
+            }
+        }
+    }
+
+    /**
+     * Unmarshal schema error.
+     *
+     * @param errBytes Error bytes.
+     * @return Error.
+     */
+    @Nullable private SchemaOperationException unmarshalSchemaError(@Nullable byte[] errBytes) {
+        if (errBytes == null)
+            return null;
+
+        try {
+            return U.unmarshal(marsh, errBytes, U.resolveClassLoader(ctx.config()));
+        }
+        catch (Exception e) {
+            return new SchemaOperationException("Operation failed, but error cannot be deserialized.");
+        }
+    }
+
+    /**
      * @param ver Version.
      */
     public static void setRequestAffinityTopologyVersion(AffinityTopologyVersion ver) {
@@ -1010,4 +2339,160 @@ public class GridQueryProcessor extends GridProcessorAdapter {
     public static AffinityTopologyVersion getRequestAffinityTopologyVersion() {
         return requestTopVer.get();
     }
+
+    /**
+     * Schema operation.
+     */
+    private class SchemaOperation {
+        /** Original propose msg. */
+        private final SchemaProposeDiscoveryMessage proposeMsg;
+
+        /** Next schema operation. */
+        private SchemaOperation next;
+
+        /** Operation manager. */
+        private SchemaOperationManager mgr;
+
+        /** Finish message. */
+        private SchemaFinishDiscoveryMessage finishMsg;
+
+        /** Finish guard. */
+        private final AtomicBoolean finishGuard = new AtomicBoolean();
+
+        /**
+         * Constructor.
+         *
+         * @param proposeMsg Original propose message.
+         */
+        public SchemaOperation(SchemaProposeDiscoveryMessage proposeMsg) {
+            this.proposeMsg = proposeMsg;
+        }
+
+        /**
+         * @return Operation ID.
+         */
+        public UUID id() {
+            return proposeMsg.operation().id();
+        }
+
+        /**
+         * @return Original propose message.
+         */
+        public SchemaProposeDiscoveryMessage proposeMessage() {
+            return proposeMsg;
+        }
+
+        /**
+         * @return Next schema operation.
+         */
+        @Nullable public SchemaOperation next() {
+            return next;
+        }
+
+        /**
+         * @param next Next schema operation.
+         */
+        public void next(SchemaOperation next) {
+            this.next = next;
+        }
+
+        /**
+         * @param finishMsg Finish message.
+         */
+        public void finishMessage(SchemaFinishDiscoveryMessage finishMsg) {
+            this.finishMsg = finishMsg;
+        }
+
+        /**
+         * @return {@code True} if finish request already received.
+         */
+        public boolean hasFinishMessage() {
+            return finishMsg != null;
+        }
+
+        /**
+         * Handle finish message.
+         */
+        @SuppressWarnings("unchecked")
+        public void doFinish() {
+            assert started();
+
+            if (!finishGuard.compareAndSet(false, true))
+                return;
+
+            final UUID opId = id();
+            final SchemaKey key = proposeMsg.schemaKey();
+
+            // Operation might be still in progress on client nodes which are not tracked by coordinator,
+            // so we chain to operation future instead of doing synchronous unwind.
+            mgr.worker().future().listen(new IgniteInClosure<IgniteInternalFuture>() {
+                @Override public void apply(IgniteInternalFuture fut) {
+                    synchronized (stateMux) {
+                        SchemaOperation op = schemaOps.remove(key);
+
+                        assert op != null;
+                        assert F.eq(op.id(), opId);
+
+                        // Chain to the next operation (if any).
+                        final SchemaOperation nextOp = op.next();
+
+                        if (nextOp != null) {
+                            schemaOps.put(key, nextOp);
+
+                            if (log.isDebugEnabled())
+                                log.debug("Next schema change operation started [opId=" + nextOp.id() + ']');
+
+                            assert !nextOp.started();
+
+                            // Cannot execute operation synchronously because it may cause starvation in exchange
+                            // thread under load. Hence, moving short-lived operation to separate worker.
+                            new IgniteThread(ctx.igniteInstanceName(), "schema-circuit-breaker-" + op.id(),
+                                new Runnable() {
+                                @Override public void run() {
+                                    onSchemaPropose(nextOp.proposeMessage());
+                                }
+                            }).start();
+                        }
+                    }
+                }
+            });
+        }
+
+        /**
+         * Unwind operation queue and get tail operation.
+         *
+         * @return Tail operation.
+         */
+        public SchemaOperation unwind() {
+            if (next == null)
+                return this;
+            else
+                return next.unwind();
+        }
+
+        /**
+         * Whether operation started.
+         *
+         * @return {@code True} if started.
+         */
+        public boolean started() {
+            return mgr != null;
+        }
+
+        /**
+         * @return Operation manager.
+         */
+        public SchemaOperationManager manager() {
+            return mgr;
+        }
+
+        /**
+         * @param mgr Operation manager.
+         */
+        public void manager(SchemaOperationManager mgr) {
+            assert this.mgr == null;
+
+            this.mgr = mgr;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryTypeDescriptor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryTypeDescriptor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryTypeDescriptor.java
index 44c41c1..b7434d3 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryTypeDescriptor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryTypeDescriptor.java
@@ -81,6 +81,13 @@ public interface GridQueryTypeDescriptor {
     public Map<String, GridQueryIndexDescriptor> indexes();
 
     /**
+     * Get text index for this type (if any).
+     *
+     * @return Text index or {@code null}.
+     */
+    public GridQueryIndexDescriptor textIndex();
+
+    /**
      * Gets value class.
      *
      * @return Value class.

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/IgniteSQLException.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/IgniteSQLException.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/IgniteSQLException.java
index b15007e..0666493 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/IgniteSQLException.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/IgniteSQLException.java
@@ -81,6 +81,13 @@ public class IgniteSQLException extends IgniteException {
     }
 
     /**
+     * @return Ignite SQL error code.
+     */
+    public int statusCode() {
+        return statusCode;
+    }
+
+    /**
      * @return JDBC exception containing details from this instance.
      */
     public SQLException toJdbcException() {

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexDescriptorImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexDescriptorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexDescriptorImpl.java
index 9d2d20c..1b85af5 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexDescriptorImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexDescriptorImpl.java
@@ -17,7 +17,9 @@
 
 package org.apache.ignite.internal.processors.query;
 
+import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.cache.QueryIndexType;
+import org.apache.ignite.internal.util.tostring.GridToStringExclude;
 import org.apache.ignite.internal.util.typedef.T2;
 import org.apache.ignite.internal.util.typedef.internal.S;
 
@@ -45,22 +47,48 @@ public class QueryIndexDescriptorImpl implements GridQueryIndexDescriptor {
     /** Fields which should be indexed in descending order. */
     private Collection<String> descendings;
 
+    /** Type descriptor. */
+    @GridToStringExclude
+    private final QueryTypeDescriptorImpl typDesc;
+
+    /** Index name. */
+    private final String name;
+
     /** */
     private final QueryIndexType type;
 
     /** */
-    private int inlineSize;
+    private final int inlineSize;
 
     /**
+     * Constructor.
+     *
+     * @param typDesc Type descriptor.
+     * @param name Index name.
      * @param type Type.
+     * @param inlineSize Inline size.
      */
-    public QueryIndexDescriptorImpl(QueryIndexType type, int inlineSize) {
+    public QueryIndexDescriptorImpl(QueryTypeDescriptorImpl typDesc, String name, QueryIndexType type, int inlineSize) {
         assert type != null;
 
+        this.typDesc = typDesc;
+        this.name = name;
         this.type = type;
         this.inlineSize = inlineSize;
     }
 
+    /**
+     * @return Type descriptor.
+     */
+    public QueryTypeDescriptorImpl typeDescriptor() {
+        return typDesc;
+    }
+
+    /** {@inheritDoc} */
+    @Override public String name() {
+        return name;
+    }
+
     /** {@inheritDoc} */
     @Override public Collection<String> fields() {
         Collection<String> res = new ArrayList<>(fields.size());
@@ -87,8 +115,14 @@ public class QueryIndexDescriptorImpl implements GridQueryIndexDescriptor {
      * @param field Field name.
      * @param orderNum Field order number in this index.
      * @param descending Sort order.
+     * @return This instance for chaining.
+     * @throws IgniteCheckedException If failed.
      */
-    public void addField(String field, int orderNum, boolean descending) {
+    public QueryIndexDescriptorImpl addField(String field, int orderNum, boolean descending)
+        throws IgniteCheckedException {
+        if (!typDesc.hasField(field))
+            throw new IgniteCheckedException("Field not found: " + field);
+
         fields.add(new T2<>(field, orderNum));
 
         if (descending) {
@@ -97,6 +131,8 @@ public class QueryIndexDescriptorImpl implements GridQueryIndexDescriptor {
 
             descendings.add(field);
         }
+
+        return this;
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexKey.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexKey.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexKey.java
new file mode 100644
index 0000000..f580111
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexKey.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.internal.processors.query;
+
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.internal.S;
+
+import java.io.Serializable;
+
+/**
+ * Index key.
+ */
+public class QueryIndexKey implements Serializable {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Space. */
+    private final String space;
+
+    /** Name. */
+    private final String name;
+
+    /**
+     * Constructor.
+     *
+     * @param space Space.
+     * @param name Name.
+     */
+    public QueryIndexKey(String space, String name) {
+        this.space = space;
+        this.name = name;
+    }
+
+    /**
+     * @return Space.
+     */
+    public String space() {
+        return space;
+    }
+
+    /**
+     * @return Name.
+     */
+    public String name() {
+        return name;
+    }
+
+    /** {@inheritDoc} */
+    @Override public int hashCode() {
+        return 31 * (space != null ? space.hashCode() : 0) + (name != null ? name.hashCode() : 0);
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean equals(Object o) {
+        if (this == o)
+            return true;
+
+        if (o == null || getClass() != o.getClass())
+            return false;
+
+        QueryIndexKey other = (QueryIndexKey)o;
+
+        return F.eq(name, other.name) && F.eq(space, other.space);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(QueryIndexKey.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QuerySchema.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QuerySchema.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QuerySchema.java
new file mode 100644
index 0000000..395f077
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QuerySchema.java
@@ -0,0 +1,168 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.query;
+
+import org.apache.ignite.cache.QueryEntity;
+import org.apache.ignite.cache.QueryIndex;
+import org.apache.ignite.internal.processors.query.schema.message.SchemaFinishDiscoveryMessage;
+import org.apache.ignite.internal.processors.query.schema.operation.SchemaAbstractOperation;
+import org.apache.ignite.internal.processors.query.schema.operation.SchemaIndexCreateOperation;
+import org.apache.ignite.internal.processors.query.schema.operation.SchemaIndexDropOperation;
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.internal.S;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Dynamic cache schema.
+ */
+public class QuerySchema implements Serializable {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Query entities. */
+    private final Collection<QueryEntity> entities = new LinkedList<>();
+
+    /** Mutex for state synchronization. */
+    private final Object mux = new Object();
+
+    /**
+     * Default constructor.
+     */
+    public QuerySchema() {
+        // No-op.
+    }
+
+    /**
+     * Constructor.
+     *
+     * @param entities Query entities.
+     */
+    public QuerySchema(Collection<QueryEntity> entities) {
+        assert entities != null;
+
+        for (QueryEntity qryEntity : entities)
+            this.entities.add(new QueryEntity(qryEntity));
+    }
+
+    /**
+     * Copy object.
+     *
+     * @return Copy.
+     */
+    public QuerySchema copy() {
+        synchronized (mux) {
+            QuerySchema res = new QuerySchema();
+
+            for (QueryEntity qryEntity : entities)
+                res.entities.add(new QueryEntity(qryEntity));
+
+            return res;
+        }
+    }
+
+    /**
+     * Process finish message.
+     *
+     * @param msg Message.
+     */
+    public void finish(SchemaFinishDiscoveryMessage msg) {
+        synchronized (mux) {
+            SchemaAbstractOperation op = msg.operation();
+
+            if (op instanceof SchemaIndexCreateOperation) {
+                SchemaIndexCreateOperation op0 = (SchemaIndexCreateOperation)op;
+
+                for (QueryEntity entity : entities) {
+                    String tblName = QueryUtils.tableName(entity);
+
+                    if (F.eq(tblName, op0.tableName())) {
+                        boolean exists = false;
+
+                        for (QueryIndex idx : entity.getIndexes()) {
+                            if (F.eq(idx.getName(), op0.indexName())) {
+                                exists = true;
+
+                                break;
+                            }
+                        }
+
+                        if (!exists) {
+                            List<QueryIndex> idxs = new ArrayList<>(entity.getIndexes());
+
+                            idxs.add(op0.index());
+
+                            entity.clearIndexes();
+                            entity.setIndexes(idxs);
+                        }
+
+                        break;
+                    }
+                }
+            }
+            else {
+                assert op instanceof SchemaIndexDropOperation;
+
+                SchemaIndexDropOperation op0 = (SchemaIndexDropOperation)op;
+
+                for (QueryEntity entity : entities) {
+                    Collection<QueryIndex> idxs = entity.getIndexes();
+
+                    QueryIndex victim = null;
+
+                    for (QueryIndex idx : idxs) {
+                        if (F.eq(idx.getName(), op0.indexName())) {
+                            victim = idx;
+
+                            break;
+                        }
+                    }
+
+                    if (victim != null) {
+                        List<QueryIndex> newIdxs = new ArrayList<>(entity.getIndexes());
+
+                        newIdxs.remove(victim);
+
+                        entity.clearIndexes();
+                        entity.setIndexes(idxs);
+
+                        break;
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * @return Query entities.
+     */
+    public Collection<QueryEntity> entities() {
+        synchronized (mux) {
+            return new ArrayList<>(entities);
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(QuerySchema.class, this);
+    }
+}


[50/70] [abbrv] ignite git commit: IGNITE-5001 .NET: Tests cleanup

Posted by sb...@apache.org.
IGNITE-5001 .NET: Tests cleanup


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/d76a7299
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/d76a7299
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/d76a7299

Branch: refs/heads/ignite-2893
Commit: d76a7299a209c0282b9d7c1c97ea9f8c783d9ce6
Parents: 5dab5fb
Author: Pavel Tupitsyn <pt...@apache.org>
Authored: Wed Apr 19 15:02:59 2017 +0300
Committer: Pavel Tupitsyn <pt...@apache.org>
Committed: Wed Apr 19 15:02:59 2017 +0300

----------------------------------------------------------------------
 .../Apache.Ignite.Core.Tests.csproj             |   7 +
 .../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      |   1 -
 .../Cache/Affinity/AffinityTest.cs              |  10 +-
 .../BinarizableAddArgCacheEntryProcessor.cs     |  53 +++
 .../Cache/BinarizableTestException.cs           |  51 +++
 .../Cache/CacheAbstractTest.cs                  | 422 ++++---------------
 .../Cache/CacheDynamicStartTest.cs              | 164 +++----
 .../Cache/CacheForkedTest.cs                    |   6 +-
 .../Cache/CacheTestKey.cs                       |  68 +++
 .../Cache/NonSerializableCacheEntryProcessor.cs |  40 ++
 .../Cache/NonSerializableException.cs           |  40 ++
 .../Cache/Query/CacheQueriesTest.cs             |  35 +-
 .../Continuous/ContinuousQueryAbstractTest.cs   |  45 +-
 .../Continuous/ContinuousQueryJavaFilterTest.cs |  21 +-
 .../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 -
 .../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 +-
 .../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 +-
 .../Impl/Binary/BinaryUtils.cs                  | 207 +++------
 46 files changed, 748 insertions(+), 1169 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj
index a13878a..232b033 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj
@@ -85,10 +85,16 @@
     <Compile Include="Binary\Serializable\SqlDmlTest.cs" />
     <Compile Include="Binary\TypeNameParserTest.cs" />
     <Compile Include="Binary\TypeResolverTest.cs" />
+    <Compile Include="Cache\AddArgCacheEntryProcessor.cs" />
     <Compile Include="Cache\Affinity\AffinityKeyTest.cs" />
     <Compile Include="Cache\Affinity\AffinityTopologyVersionTest.cs" />
+    <Compile Include="Cache\BinarizableAddArgCacheEntryProcessor.cs" />
+    <Compile Include="Cache\BinarizableTestException.cs" />
     <Compile Include="Cache\CacheMetricsTest.cs" />
     <Compile Include="Cache\CacheResultTest.cs" />
+    <Compile Include="Cache\CacheTestKey.cs" />
+    <Compile Include="Cache\NonSerializableCacheEntryProcessor.cs" />
+    <Compile Include="Cache\NonSerializableException.cs" />
     <Compile Include="Cache\Query\CacheDmlQueriesTest.cs" />
     <Compile Include="Cache\CacheAbstractTransactionalTest.cs" />
     <Compile Include="Cache\Query\CacheDmlQueriesTestSimpleName.cs" />
@@ -96,6 +102,7 @@
     <Compile Include="Cache\Query\CacheQueriesTestSimpleName.cs" />
     <Compile Include="Cache\Store\CacheStoreAdapterTest.cs" />
     <Compile Include="Cache\Store\NamedNodeCacheStoreTest.cs" />
+    <Compile Include="Cache\TestReferenceObject.cs" />
     <Compile Include="Collections\MultiValueDictionaryTest.cs" />
     <Compile Include="Collections\ReadOnlyCollectionTest.cs" />
     <Compile Include="Collections\ReadOnlyDictionaryTest.cs" />

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTest.cs
index e8d0049..951f5d2 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTest.cs
@@ -135,8 +135,7 @@ namespace Apache.Ignite.Core.Tests.Binary
         [TestFixtureTearDown]
         public void TearDown()
         {
-            if (_grid != null)
-                Ignition.Stop(_grid.Name, true);
+            Ignition.StopAll(true);
 
             _grid = null;
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTestDynamicRegistration.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTestDynamicRegistration.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTestDynamicRegistration.cs
index 3f37833..591a12f 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTestDynamicRegistration.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTestDynamicRegistration.cs
@@ -19,10 +19,12 @@ namespace Apache.Ignite.Core.Tests.Binary
 {
     using System.Collections.Generic;
     using Apache.Ignite.Core.Binary;
+    using NUnit.Framework;
 
     /// <summary>
     /// Binary builder self test with dynamic type registration.
     /// </summary>
+    [TestFixture]
     public class BinaryBuilderSelfTestDynamicRegistration : BinaryBuilderSelfTest
     {
         /** <inheritdoc /> */

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTestSimpleName.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTestSimpleName.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTestSimpleName.cs
index 918f82d..5f09584 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTestSimpleName.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTestSimpleName.cs
@@ -18,10 +18,12 @@
 namespace Apache.Ignite.Core.Tests.Binary
 {
     using Apache.Ignite.Core.Binary;
+    using NUnit.Framework;
 
     /// <summary>
     /// Builder test with simple names.
     /// </summary>
+    [TestFixture]
     public class BinaryBuilderSelfTestSimpleName : BinaryBuilderSelfTest
     {
         /** <inheritdoc /> */

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryCompactFooterInteropTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryCompactFooterInteropTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryCompactFooterInteropTest.cs
index bda3438..2ee7cad 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryCompactFooterInteropTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryCompactFooterInteropTest.cs
@@ -133,11 +133,9 @@ namespace Apache.Ignite.Core.Tests.Binary
         /// </summary>
         private static IgniteConfiguration Config(string springUrl)
         {
-            return new IgniteConfiguration
+            return new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
                 SpringConfigUrl = springUrl,
-                JvmOptions = TestUtils.TestJavaOptions(),
-                JvmClasspath = TestUtils.CreateTestClasspath(),
                 BinaryConfiguration = new BinaryConfiguration(
                     typeof (PlatformComputeBinarizable),
                     typeof (PlatformComputeNetBinarizable))

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/BinaryConfigurationTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/BinaryConfigurationTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/BinaryConfigurationTest.cs
index 4f6bf02..496f46f 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/BinaryConfigurationTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/BinaryConfigurationTest.cs
@@ -69,11 +69,9 @@ namespace Apache.Ignite.Core.Tests
         {
             Ignition.StopAll(true);
 
-            var grid = Ignition.Start(new IgniteConfiguration
+            var grid = Ignition.Start(new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
                 SpringConfigUrl = "config\\cache-binarizables.xml",
-                JvmClasspath = TestUtils.CreateTestClasspath(),
-                JvmOptions = TestUtils.TestJavaOptions(),
                 BinaryConfiguration = binaryConfiguration
             });
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/AddArgCacheEntryProcessor.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/AddArgCacheEntryProcessor.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/AddArgCacheEntryProcessor.cs
new file mode 100644
index 0000000..5187627
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/AddArgCacheEntryProcessor.cs
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Tests.Cache
+{
+    using System;
+    using Apache.Ignite.Core.Cache;
+    using NUnit.Framework;
+
+    /// <summary>
+    /// Cache entry processor that adds argument value to the entry value.
+    /// </summary>
+    [Serializable]
+    public class AddArgCacheEntryProcessor : ICacheEntryProcessor<int, int, int, int>
+    {
+        // Expected exception text
+        public const string ExceptionText = "Exception from AddArgCacheEntryProcessor.";
+
+        // Error flag
+        public bool ThrowErr { get; set; }
+
+        // Error flag
+        public bool ThrowErrBinarizable { get; set; }
+
+        // Error flag
+        public bool ThrowErrNonSerializable { get; set; }
+
+        // Key value to throw error on
+        public int ThrowOnKey { get; set; }
+
+        // Remove flag
+        public bool Remove { get; set; }
+
+        // Exists flag
+        public bool Exists { get; set; }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="AddArgCacheEntryProcessor"/> class.
+        /// </summary>
+        public AddArgCacheEntryProcessor()
+        {
+            Exists = true;
+            ThrowOnKey = -1;
+        }
+
+        /** <inheritdoc /> */
+        int ICacheEntryProcessor<int, int, int, int>.Process(IMutableCacheEntry<int, int> entry, int arg)
+        {
+            if (ThrowOnKey < 0 || ThrowOnKey == entry.Key)
+            {
+                if (ThrowErr)
+                    throw new Exception(ExceptionText);
+
+                if (ThrowErrBinarizable)
+                    throw new BinarizableTestException {Info = ExceptionText};
+
+                if (ThrowErrNonSerializable)
+                    throw new NonSerializableException();
+            }
+
+            Assert.AreEqual(Exists, entry.Exists);
+
+            if (Remove)
+                entry.Remove();
+            else
+                entry.Value = entry.Value + arg;
+            
+            return entry.Value;
+        }
+
+        /** <inheritdoc /> */
+        public int Process(IMutableCacheEntry<int, int> entry, int arg)
+        {
+            throw new Exception("Invalid method");
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Affinity/AffinityFunctionTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Affinity/AffinityFunctionTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Affinity/AffinityFunctionTest.cs
index 5456ba4..22810da 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Affinity/AffinityFunctionTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Affinity/AffinityFunctionTest.cs
@@ -27,7 +27,6 @@ namespace Apache.Ignite.Core.Tests.Cache.Affinity
     using Apache.Ignite.Core.Cache.Affinity.Rendezvous;
     using Apache.Ignite.Core.Cache.Configuration;
     using Apache.Ignite.Core.Cluster;
-    using Apache.Ignite.Core.Common;
     using Apache.Ignite.Core.Resource;
     using NUnit.Framework;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Affinity/AffinityTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Affinity/AffinityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Affinity/AffinityTest.cs
index 9bd639b..1ae46c5 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Affinity/AffinityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Affinity/AffinityTest.cs
@@ -28,19 +28,15 @@ namespace Apache.Ignite.Core.Tests.Cache.Affinity
     public sealed class AffinityTest
     {
         /// <summary>
-        ///
+        /// Test set up.
         /// </summary>
         [TestFixtureSetUp]
         public void StartGrids()
         {
-            TestUtils.KillProcesses();
-
             for (int i = 0; i < 3; i++)
             {
-                var cfg = new IgniteConfiguration
+                var cfg = new IgniteConfiguration(TestUtils.GetTestConfiguration())
                 {
-                    JvmClasspath = TestUtils.CreateTestClasspath(),
-                    JvmOptions = TestUtils.TestJavaOptions(),
                     SpringConfigUrl = "config\\native-client-test-cache-affinity.xml",
                     IgniteInstanceName = "grid-" + i
                 };
@@ -100,7 +96,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Affinity
         /// <summary>
         /// Affinity key.
         /// </summary>
-        public class AffinityTestKey
+        private class AffinityTestKey
         {
             /** ID. */
             private readonly int _id;

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/BinarizableAddArgCacheEntryProcessor.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/BinarizableAddArgCacheEntryProcessor.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/BinarizableAddArgCacheEntryProcessor.cs
new file mode 100644
index 0000000..1199e54
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/BinarizableAddArgCacheEntryProcessor.cs
@@ -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.
+ */
+
+namespace Apache.Ignite.Core.Tests.Cache
+{
+    using Apache.Ignite.Core.Binary;
+
+    /// <summary>
+    /// Binary add processor.
+    /// </summary>
+    public class BinarizableAddArgCacheEntryProcessor : AddArgCacheEntryProcessor, IBinarizable
+    {
+        /** <inheritdoc /> */
+        public void WriteBinary(IBinaryWriter writer)
+        {
+            var w = writer.GetRawWriter();
+
+            w.WriteBoolean(ThrowErr);
+            w.WriteBoolean(ThrowErrBinarizable);
+            w.WriteBoolean(ThrowErrNonSerializable);
+            w.WriteInt(ThrowOnKey);
+            w.WriteBoolean(Remove);
+            w.WriteBoolean(Exists);
+        }
+
+        /** <inheritdoc /> */
+        public void ReadBinary(IBinaryReader reader)
+        {
+            var r = reader.GetRawReader();
+
+            ThrowErr = r.ReadBoolean();
+            ThrowErrBinarizable = r.ReadBoolean();
+            ThrowErrNonSerializable = r.ReadBoolean();
+            ThrowOnKey = r.ReadInt();
+            Remove = r.ReadBoolean();
+            Exists = r.ReadBoolean();
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/BinarizableTestException.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/BinarizableTestException.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/BinarizableTestException.cs
new file mode 100644
index 0000000..5f76eef
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/BinarizableTestException.cs
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Tests.Cache
+{
+    using System;
+    using Apache.Ignite.Core.Binary;
+
+    /// <summary>
+    /// Binary exception.
+    /// </summary>
+    public class BinarizableTestException : Exception, IBinarizable
+    {
+        /// <summary>
+        /// Gets or sets exception info.
+        /// </summary>
+        public string Info { get; set; }
+
+        /** <inheritdoc /> */
+        public override string Message
+        {
+            get { return Info; }
+        }
+
+        /** <inheritdoc /> */
+        public void WriteBinary(IBinaryWriter writer)
+        {
+            writer.GetRawWriter().WriteString(Info);
+        }
+
+        /** <inheritdoc /> */
+        public void ReadBinary(IBinaryReader reader)
+        {
+            Info = reader.GetRawReader().ReadString();
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheAbstractTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheAbstractTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheAbstractTest.cs
index 490a26a..d629331 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheAbstractTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheAbstractTest.cs
@@ -22,7 +22,6 @@ namespace Apache.Ignite.Core.Tests.Cache
     using System.Collections.Generic;
     using System.Diagnostics.CodeAnalysis;
     using System.Linq;
-    using System.Text;
     using System.Threading;
     using System.Threading.Tasks;
     using System.Transactions;
@@ -38,294 +37,32 @@ namespace Apache.Ignite.Core.Tests.Cache
     using NUnit.Framework;
 
     /// <summary>
-    ///
+    /// Base cache test.
     /// </summary>
-    class CacheTestKey
-    {
-        /// <summary>
-        /// Constructor.
-        /// </summary>
-        /// <param name="id">ID.</param>
-        public CacheTestKey(int id)
-        {
-            Id = id;
-        }
-
-        /// <summary>
-        /// ID.
-        /// </summary>
-        public int Id
-        {
-            get;
-            set;
-        }
-
-        /** <inheritdoc /> */
-        public override bool Equals(object obj)
-        {
-            CacheTestKey other = obj as CacheTestKey;
-
-            return other != null && Id == other.Id;
-        }
-
-        /** <inheritdoc /> */
-        public override int GetHashCode()
-        {
-            return Id;
-        }
-
-        /** <inheritdoc /> */
-        public override string ToString()
-        {
-            return new StringBuilder()
-                .Append(typeof(CacheTestKey).Name)
-                .Append(" [id=").Append(Id)
-                .Append(']').ToString();
-        }
-    }
-
-    /// <summary>
-    ///
-    /// </summary>
-    class TestReferenceObject
+    [SuppressMessage("ReSharper", "UnusedVariable")]
+    public abstract class CacheAbstractTest 
     {
-        public TestReferenceObject Obj;
-
         /// <summary>
-        /// Default constructor.
+        /// Fixture setup.
         /// </summary>
-        public TestReferenceObject()
-        {
-            // No-op.
-        }
-
-        public TestReferenceObject(TestReferenceObject obj)
-        {
-            Obj = obj;
-        }
-    }
-
-    [Serializable]
-    public class TestSerializableObject
-    {
-        public string Name { get; set; }
-        public int Id { get; set; }
-
-        public override bool Equals(object obj)
+        [TestFixtureSetUp]
+        public void StartGrids()
         {
-            if (ReferenceEquals(null, obj)) return false;
-            if (ReferenceEquals(this, obj)) return true;
-
-            var other = (TestSerializableObject) obj;
-            return obj.GetType() == GetType() && (string.Equals(Name, other.Name) && Id == other.Id);
-        }
+            TestUtils.KillProcesses();
 
-        public override int GetHashCode()
-        {
-            unchecked
+            IgniteConfiguration cfg = new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
-                return ((Name != null ? Name.GetHashCode() : 0) * 397) ^ Id;
-            }
-        }
-    }
-
-    /// <summary>
-    /// Cache entry processor that adds argument value to the entry value.
-    /// </summary>
-    [Serializable]
-    public class AddArgCacheEntryProcessor : ICacheEntryProcessor<int, int, int, int>
-    {
-        // Expected exception text
-        public const string ExceptionText = "Exception from AddArgCacheEntryProcessor.";
-
-        // Error flag
-        public bool ThrowErr { get; set; }
-
-        // Error flag
-        public bool ThrowErrBinarizable { get; set; }
-
-        // Error flag
-        public bool ThrowErrNonSerializable { get; set; }
-
-        // Key value to throw error on
-        public int ThrowOnKey { get; set; }
-
-        // Remove flag
-        public bool Remove { get; set; }
-
-        // Exists flag
-        public bool Exists { get; set; }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="AddArgCacheEntryProcessor"/> class.
-        /// </summary>
-        public AddArgCacheEntryProcessor()
-        {
-            Exists = true;
-            ThrowOnKey = -1;
-        }
+                BinaryConfiguration = new BinaryConfiguration(
+                    typeof(BinarizablePerson),
+                    typeof(CacheTestKey),
+                    typeof(TestReferenceObject),
+                    typeof(BinarizableAddArgCacheEntryProcessor),
+                    typeof(BinarizableTestException)),
+                SpringConfigUrl = "config\\native-client-test-cache.xml"
+            };
 
-        /** <inheritdoc /> */
-        int ICacheEntryProcessor<int, int, int, int>.Process(IMutableCacheEntry<int, int> entry, int arg)
-        {
-            if (ThrowOnKey < 0 || ThrowOnKey == entry.Key)
+            for (int i = 0; i < GridCount(); i++)
             {
-                if (ThrowErr)
-                    throw new Exception(ExceptionText);
-
-                if (ThrowErrBinarizable)
-                    throw new BinarizableTestException {Info = ExceptionText};
-
-                if (ThrowErrNonSerializable)
-                    throw new NonSerializableException();
-            }
-
-            Assert.AreEqual(Exists, entry.Exists);
-
-            if (Remove)
-                entry.Remove();
-            else
-                entry.Value = entry.Value + arg;
-            
-            return entry.Value;
-        }
-
-        /** <inheritdoc /> */
-        public int Process(IMutableCacheEntry<int, int> entry, int arg)
-        {
-            throw new Exception("Invalid method");
-        }
-    }
-
-    /// <summary>
-    /// Binary add processor.
-    /// </summary>
-    public class BinarizableAddArgCacheEntryProcessor : AddArgCacheEntryProcessor, IBinarizable
-    {
-        /** <inheritdoc /> */
-        public void WriteBinary(IBinaryWriter writer)
-        {
-            var w = writer.GetRawWriter();
-
-            w.WriteBoolean(ThrowErr);
-            w.WriteBoolean(ThrowErrBinarizable);
-            w.WriteBoolean(ThrowErrNonSerializable);
-            w.WriteInt(ThrowOnKey);
-            w.WriteBoolean(Remove);
-            w.WriteBoolean(Exists);
-        }
-
-        /** <inheritdoc /> */
-        public void ReadBinary(IBinaryReader reader)
-        {
-            var r = reader.GetRawReader();
-
-            ThrowErr = r.ReadBoolean();
-            ThrowErrBinarizable = r.ReadBoolean();
-            ThrowErrNonSerializable = r.ReadBoolean();
-            ThrowOnKey = r.ReadInt();
-            Remove = r.ReadBoolean();
-            Exists = r.ReadBoolean();
-        }
-    }
-
-    /// <summary>
-    /// Non-serializable processor.
-    /// </summary>
-    public class NonSerializableCacheEntryProcessor : AddArgCacheEntryProcessor, IBinarizable
-    {
-        /** <inheritdoc /> */
-        public void WriteBinary(IBinaryWriter writer)
-        {
-            throw new Exception("ExpectedException");
-        }
-
-        /** <inheritdoc /> */
-        public void ReadBinary(IBinaryReader reader)
-        {
-            throw new Exception("ExpectedException");
-        }
-    }
-
-    /// <summary>
-    /// Binary exception.
-    /// </summary>
-    public class BinarizableTestException : Exception, IBinarizable
-    {
-        /// <summary>
-        /// Gets or sets exception info.
-        /// </summary>
-        public string Info { get; set; }
-
-        /** <inheritdoc /> */
-        public override string Message
-        {
-            get { return Info; }
-        }
-
-        /** <inheritdoc /> */
-        public void WriteBinary(IBinaryWriter writer)
-        {
-            writer.GetRawWriter().WriteString(Info);
-        }
-
-        /** <inheritdoc /> */
-        public void ReadBinary(IBinaryReader reader)
-        {
-            Info = reader.GetRawReader().ReadString();
-        }
-    }
-
-    /// <summary>
-    /// Non-serializable exception.
-    /// </summary>
-    public class NonSerializableException : Exception, IBinarizable
-    {
-        /** <inheritdoc /> */
-        public void WriteBinary(IBinaryWriter writer)
-        {
-            throw new Exception("ExpectedException");
-        }
-
-        /** <inheritdoc /> */
-        public void ReadBinary(IBinaryReader reader)
-        {
-            throw new Exception("ExpectedException");
-        }
-    }
-
-    /// <summary>
-    ///
-    /// </summary>
-    [SuppressMessage("ReSharper", "UnusedVariable")]
-    public abstract class CacheAbstractTest {
-        /// <summary>
-        ///
-        /// </summary>
-        [TestFixtureSetUp]
-        public virtual void StartGrids() {
-            TestUtils.KillProcesses();
-
-            IgniteConfiguration cfg = new IgniteConfiguration();
-
-            BinaryConfiguration portCfg = new BinaryConfiguration();
-
-            ICollection<BinaryTypeConfiguration> portTypeCfgs = new List<BinaryTypeConfiguration>();
-
-            portTypeCfgs.Add(new BinaryTypeConfiguration(typeof(BinarizablePerson)));
-            portTypeCfgs.Add(new BinaryTypeConfiguration(typeof(CacheTestKey)));
-            portTypeCfgs.Add(new BinaryTypeConfiguration(typeof(TestReferenceObject)));
-            portTypeCfgs.Add(new BinaryTypeConfiguration(typeof(BinarizableAddArgCacheEntryProcessor)));
-            portTypeCfgs.Add(new BinaryTypeConfiguration(typeof(BinarizableTestException)));
-
-            portCfg.TypeConfigurations = portTypeCfgs;
-
-            cfg.BinaryConfiguration = portCfg;
-            cfg.JvmClasspath = TestUtils.CreateTestClasspath();
-            cfg.JvmOptions = TestUtils.TestJavaOptions();
-            cfg.SpringConfigUrl = "config\\native-client-test-cache.xml";
-
-            for (int i = 0; i < GridCount(); i++) {
                 cfg.IgniteInstanceName = "grid-" + i;
 
                 Ignition.Start(cfg);
@@ -335,19 +72,19 @@ namespace Apache.Ignite.Core.Tests.Cache
         }
 
         /// <summary>
-        ///
+        /// Fixture teardown.
         /// </summary>
         [TestFixtureTearDown]
-        public virtual void StopGrids() {
-            for (int i = 0; i < GridCount(); i++)
-                Ignition.Stop("grid-" + i, true);
+        public void StopGrids()
+        {
+            Ignition.StopAll(true);
         }
 
         /// <summary>
         ///
         /// </summary>
         [SetUp]
-        public virtual void BeforeTest()
+        public void BeforeTest()
         {
             Console.WriteLine("Test started: " + TestContext.CurrentContext.Test.Name);
         }
@@ -356,7 +93,7 @@ namespace Apache.Ignite.Core.Tests.Cache
         ///
         /// </summary>
         [TearDown]
-        public virtual void AfterTest() {
+        public void AfterTest() {
             for (int i = 0; i < GridCount(); i++) 
                 Cache(i).WithKeepBinary<object, object>().RemoveAll();
 
@@ -378,35 +115,35 @@ namespace Apache.Ignite.Core.Tests.Cache
             Console.WriteLine("Test finished: " + TestContext.CurrentContext.Test.Name);
         }
 
-        public IIgnite GetIgnite(int idx)
+        protected static IIgnite GetIgnite(int idx)
         {
             return Ignition.GetIgnite("grid-" + idx);
         }
 
-        public ICache<int, int> Cache(int idx) {
+        private ICache<int, int> Cache(int idx) {
             return Cache<int, int>(idx);
         }
 
-        public ICache<TK, TV> Cache<TK, TV>(int idx) {
+        private ICache<TK, TV> Cache<TK, TV>(int idx) {
             return GetIgnite(idx).GetCache<TK, TV>(CacheName());
         }
 
-        public ICache<int, int> Cache()
+        protected ICache<int, int> Cache()
         {
             return Cache<int, int>(0);
         }
 
-        public ICache<TK, TV> Cache<TK, TV>()
+        private ICache<TK, TV> Cache<TK, TV>()
         {
             return Cache<TK, TV>(0);
         }
 
-        public ICacheAffinity Affinity()
+        private ICacheAffinity Affinity()
         {
             return GetIgnite(0).GetAffinity(CacheName());
         }
 
-        public ITransactions Transactions
+        protected ITransactions Transactions
         {
             get { return GetIgnite(0).GetTransactions(); }
         }
@@ -452,7 +189,7 @@ namespace Apache.Ignite.Core.Tests.Cache
             {
                 var cache = Cache(i);
 
-                cache.Put(PrimaryKeyForCache(cache), 1);
+                cache.Put(GetPrimaryKeyForCache(cache), 1);
             }
 
             for (int i = 0; i < GridCount(); i++)
@@ -468,7 +205,7 @@ namespace Apache.Ignite.Core.Tests.Cache
         {
             var cache = Cache();
 
-            int key = PrimaryKeyForCache(cache);
+            int key = GetPrimaryKeyForCache(cache);
 
             cache.Put(key, 1);
 
@@ -481,7 +218,7 @@ namespace Apache.Ignite.Core.Tests.Cache
         {
             var cache = Cache();
 
-            var keys = PrimaryKeysForCache(cache, 5);
+            var keys = GetPrimaryKeysForCache(cache, 5);
 
             Assert.IsFalse(cache.ContainsKeys(keys));
 
@@ -497,7 +234,7 @@ namespace Apache.Ignite.Core.Tests.Cache
         {
             var cache = Cache();
 
-            int key1 = PrimaryKeyForCache(cache);
+            int key1 = GetPrimaryKeyForCache(cache);
 
             cache.Put(key1, 1);
 
@@ -912,7 +649,7 @@ namespace Apache.Ignite.Core.Tests.Cache
         /// <summary>
         /// Expiry policy tests.
         /// </summary>
-        public void TestWithExpiryPolicy(Func<ICache<int, int>, IExpiryPolicy, ICache<int, int>> withPolicyFunc, 
+        private void TestWithExpiryPolicy(Func<ICache<int, int>, IExpiryPolicy, ICache<int, int>> withPolicyFunc, 
             bool origCache)
         {
             ICache<int, int> cache0 = Cache(0);
@@ -927,8 +664,8 @@ namespace Apache.Ignite.Core.Tests.Cache
             }
             else
             {
-                key0 = PrimaryKeyForCache(cache0);
-                key1 = PrimaryKeyForCache(Cache(1));
+                key0 = GetPrimaryKeyForCache(cache0);
+                key1 = GetPrimaryKeyForCache(Cache(1));
             }
             
             // Test unchanged expiration.
@@ -1039,8 +776,8 @@ namespace Apache.Ignite.Core.Tests.Cache
             }
             else
             {
-                key0 = PrimaryKeyForCache(cache0);
-                key1 = PrimaryKeyForCache(Cache(1));
+                key0 = GetPrimaryKeyForCache(cache0);
+                key1 = GetPrimaryKeyForCache(Cache(1));
             }
 
             // Test zero expiration.
@@ -1103,7 +840,7 @@ namespace Apache.Ignite.Core.Tests.Cache
         {
             var cache = Cache();
 
-            int key = PrimaryKeyForCache(cache);
+            int key = GetPrimaryKeyForCache(cache);
 
             cache.Put(key, 1);
 
@@ -1128,7 +865,7 @@ namespace Apache.Ignite.Core.Tests.Cache
         {
             var cache = Cache();
 
-            List<int> keys = PrimaryKeysForCache(cache, 3);
+            List<int> keys = GetPrimaryKeysForCache(cache, 3);
 
             cache.Put(keys[0], 1);
             cache.Put(keys[1], 2);
@@ -1163,7 +900,7 @@ namespace Apache.Ignite.Core.Tests.Cache
             {
                 var cache = Cache(i);
 
-                cache.Put(PrimaryKeyForCache(cache, 500), 1);
+                cache.Put(GetPrimaryKeyForCache(cache, 500), 1);
 
                 Assert.IsFalse(cache.IsEmpty());
             }
@@ -1178,7 +915,7 @@ namespace Apache.Ignite.Core.Tests.Cache
         public void TestClearKey()
         {
             var cache = Cache();
-            var keys = PrimaryKeysForCache(cache, 10);
+            var keys = GetPrimaryKeysForCache(cache, 10);
 
             foreach (var key in keys)
                 cache.Put(key, 3);
@@ -1202,7 +939,7 @@ namespace Apache.Ignite.Core.Tests.Cache
         public void TestClearKeys()
         {
             var cache = Cache();
-            var keys = PrimaryKeysForCache(cache, 10);
+            var keys = GetPrimaryKeysForCache(cache, 10);
 
             foreach (var key in keys)
                 cache.Put(key, 3);
@@ -1216,7 +953,7 @@ namespace Apache.Ignite.Core.Tests.Cache
         public void TestLocalClearKey()
         {
             var cache = Cache();
-            var keys = PrimaryKeysForCache(cache, 10);
+            var keys = GetPrimaryKeysForCache(cache, 10);
 
             foreach (var key in keys)
                 cache.Put(key, 3);
@@ -1242,7 +979,7 @@ namespace Apache.Ignite.Core.Tests.Cache
         public void TestLocalClearKeys()
         {
             var cache = Cache();
-            var keys = PrimaryKeysForCache(cache, 10);
+            var keys = GetPrimaryKeysForCache(cache, 10);
 
             foreach (var key in keys)
                 cache.Put(key, 3);
@@ -1350,7 +1087,7 @@ namespace Apache.Ignite.Core.Tests.Cache
         {
             var cache = Cache();
 
-            var keys = PrimaryKeysForCache(cache, 2);
+            var keys = GetPrimaryKeysForCache(cache, 2);
 
             cache.Put(keys[0], 1);
             cache.Put(keys[1], 2);
@@ -1370,7 +1107,7 @@ namespace Apache.Ignite.Core.Tests.Cache
         {
             var cache = Cache().WrapAsync();
 
-            List<int> keys = PrimaryKeysForCache(cache, 2);
+            List<int> keys = GetPrimaryKeysForCache(cache, 2);
 
             cache.Put(keys[0], 1);
             cache.Put(keys[1], 2);
@@ -1438,7 +1175,7 @@ namespace Apache.Ignite.Core.Tests.Cache
             {
                 var cache = Cache(i);
 
-                List<int> keys = PrimaryKeysForCache(cache, 2);
+                List<int> keys = GetPrimaryKeysForCache(cache, 2);
 
                 foreach (int key in keys)
                     cache.Put(key, 1);
@@ -1465,7 +1202,7 @@ namespace Apache.Ignite.Core.Tests.Cache
         public void TestLocalSize()
         {
             var cache = Cache();
-            var keys = PrimaryKeysForCache(cache, 3);
+            var keys = GetPrimaryKeysForCache(cache, 3);
 
             cache.Put(keys[0], 1);
             cache.Put(keys[1], 2);
@@ -1474,7 +1211,7 @@ namespace Apache.Ignite.Core.Tests.Cache
 
             cache.LocalEvict(keys.Take(2).ToArray());
 
-            //Assert.AreEqual(0, cache.GetLocalSize(CachePeekMode.Onheap));  // TODO: IGNITE-4535
+            Assert.AreEqual(0, cache.GetLocalSize(CachePeekMode.Onheap));
             Assert.AreEqual(localSize, cache.GetLocalSize(CachePeekMode.All));
 
             cache.Put(keys[2], 3);
@@ -1492,7 +1229,7 @@ namespace Apache.Ignite.Core.Tests.Cache
         public void TestEnumerators()
         {
             var cache = Cache();
-            var keys = PrimaryKeysForCache(cache, 2);
+            var keys = GetPrimaryKeysForCache(cache, 2);
 
             cache.Put(keys[0], keys[0] + 1);
             cache.Put(keys[1], keys[1] + 1);
@@ -1581,7 +1318,7 @@ namespace Apache.Ignite.Core.Tests.Cache
         {
             var cache = Cache();
 
-            int key = PrimaryKeyForCache(cache);
+            int key = GetPrimaryKeyForCache(cache);
 
             cache.Put(key, 1);
 
@@ -1606,7 +1343,7 @@ namespace Apache.Ignite.Core.Tests.Cache
         {
             var cache = Cache();
 
-            List<int> keys = PrimaryKeysForCache(cache, 3);
+            List<int> keys = GetPrimaryKeysForCache(cache, 3);
 
             cache.Put(keys[0], 1);
             cache.Put(keys[1], 2);
@@ -1839,8 +1576,8 @@ namespace Apache.Ignite.Core.Tests.Cache
             }, threads);
         }
 
-        //[Test]
-        //[Category(TestUtils.CATEGORY_INTENSIVE)]
+        [Test]
+        [Category(TestUtils.CategoryIntensive)]
         public void TestAsyncMultithreadedKeepBinary()
         {
             var cache = Cache().WithKeepBinary<CacheTestKey, BinarizablePerson>();
@@ -2457,7 +2194,7 @@ namespace Apache.Ignite.Core.Tests.Cache
             }
         }
 
-        public void TestInvokeAll<T>(bool async, int entryCount) where T : AddArgCacheEntryProcessor, new()
+        private void TestInvokeAll<T>(bool async, int entryCount) where T : AddArgCacheEntryProcessor, new()
         {
             var cache = async ? Cache().WrapAsync() : Cache();
 
@@ -2740,22 +2477,22 @@ namespace Apache.Ignite.Core.Tests.Cache
             Assert.AreEqual(expAge, person.Age);
         }
 
-        protected static int PrimaryKeyForCache(ICache<int, int> cache)
+        private static int GetPrimaryKeyForCache(ICache<int, int> cache)
         {
-            return PrimaryKeysForCache(cache, 1, 0).First();
+            return GetPrimaryKeysForCacheFrom(cache, 0).First();
         }
 
-        protected static int PrimaryKeyForCache(ICache<int, int> cache, int startFrom)
+        private static int GetPrimaryKeyForCache(ICache<int, int> cache, int startFrom)
         {
-            return PrimaryKeysForCache(cache, 1, startFrom).First();
+            return GetPrimaryKeysForCacheFrom(cache, startFrom).First();
         }
 
-        protected static List<int> PrimaryKeysForCache(ICache<int, int> cache, int cnt)
+        private static List<int> GetPrimaryKeysForCache(ICache<int, int> cache, int cnt)
         {
-            return PrimaryKeysForCache(cache, cnt, 0).Take(cnt).ToList();
+            return GetPrimaryKeysForCacheFrom(cache, 0).Take(cnt).ToList();
         }
 
-        protected static IEnumerable<int> PrimaryKeysForCache(ICache<int, int> cache, int cnt, int startFrom)
+        private static IEnumerable<int> GetPrimaryKeysForCacheFrom(ICache<int, int> cache, int startFrom)
         {
             IClusterNode node = cache.Ignite.GetCluster().GetLocalNode();
 
@@ -2764,7 +2501,7 @@ namespace Apache.Ignite.Core.Tests.Cache
             return Enumerable.Range(startFrom, int.MaxValue - startFrom).Where(x => aff.IsPrimary(node, x));
         }
 
-        protected static int NearKeyForCache(ICache<int, int> cache)
+        private static int NearKeyForCache(ICache<int, int> cache)
         {
             IClusterNode node = cache.Ignite.GetCluster().GetLocalNode();
 
@@ -2781,7 +2518,7 @@ namespace Apache.Ignite.Core.Tests.Cache
             return 0;
         }
 
-        protected static string GetKeyAffinity(ICache<int, int> cache, int key)
+        private static string GetKeyAffinity(ICache<int, int> cache, int key)
         {
             if (cache.Ignite.GetAffinity(cache.Name).IsPrimary(cache.Ignite.GetCluster().GetLocalNode(), key))
                 return "primary";
@@ -2835,5 +2572,32 @@ namespace Apache.Ignite.Core.Tests.Cache
 
             return val;
         }
+
+        /// <summary>
+        /// Test serializable object.
+        /// </summary>
+        [Serializable]
+        private class TestSerializableObject
+        {
+            public string Name { get; set; }
+            public int Id { get; set; }
+
+            public override bool Equals(object obj)
+            {
+                if (ReferenceEquals(null, obj)) return false;
+                if (ReferenceEquals(this, obj)) return true;
+
+                var other = (TestSerializableObject)obj;
+                return obj.GetType() == GetType() && (string.Equals(Name, other.Name) && Id == other.Id);
+            }
+
+            public override int GetHashCode()
+            {
+                unchecked
+                {
+                    return ((Name != null ? Name.GetHashCode() : 0) * 397) ^ Id;
+                }
+            }
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheDynamicStartTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheDynamicStartTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheDynamicStartTest.cs
index 7f6e824..155375d 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheDynamicStartTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheDynamicStartTest.cs
@@ -18,9 +18,7 @@
 namespace Apache.Ignite.Core.Tests.Cache
 {
     using System;
-    using System.Collections.Generic;
     using Apache.Ignite.Core.Binary;
-    using Apache.Ignite.Core.Cache;
     using Apache.Ignite.Core.Tests.Query;
     using NUnit.Framework;
 
@@ -68,9 +66,7 @@ namespace Apache.Ignite.Core.Tests.Cache
         [TearDown]
         public void StopGrids()
         {
-            Ignition.Stop(GridData, true);
-            Ignition.Stop(GridDataNoCfg, true);
-            Ignition.Stop(GridClient, true);
+            Ignition.StopAll(true);
         }
 
         /// <summary>
@@ -81,24 +77,12 @@ namespace Apache.Ignite.Core.Tests.Cache
         /// <returns>Configuration.</returns>
         private static IgniteConfiguration CreateConfiguration(string name, string springCfg)
         {
-            var cfg = new IgniteConfiguration();
-
-            BinaryConfiguration portCfg = new BinaryConfiguration();
-
-            ICollection<BinaryTypeConfiguration> portTypeCfgs = new List<BinaryTypeConfiguration>();
-
-            portTypeCfgs.Add(new BinaryTypeConfiguration(typeof(DynamicTestKey)));
-            portTypeCfgs.Add(new BinaryTypeConfiguration(typeof(DynamicTestValue)));
-
-            portCfg.TypeConfigurations = portTypeCfgs;
-
-            cfg.IgniteInstanceName = name;
-            cfg.BinaryConfiguration = portCfg;
-            cfg.JvmClasspath = TestUtils.CreateTestClasspath();
-            cfg.JvmOptions = TestUtils.TestJavaOptions();
-            cfg.SpringConfigUrl = springCfg;
-
-            return cfg;
+            return new IgniteConfiguration(TestUtils.GetTestConfiguration())
+            {
+                IgniteInstanceName = name,
+                BinaryConfiguration = new BinaryConfiguration(typeof(DynamicTestKey), typeof(DynamicTestValue)),
+                SpringConfigUrl = springCfg
+            };
         }
 
         /// <summary>
@@ -145,16 +129,14 @@ namespace Apache.Ignite.Core.Tests.Cache
         /// Check routine.
         /// </summary>
         /// <param name="cacheName">Cache name.</param>
-        private void Check(string cacheName)
+        private static void Check(string cacheName)
         {
-            ICache<DynamicTestKey, DynamicTestValue> cacheData =
-                Ignition.GetIgnite(GridData).GetCache<DynamicTestKey, DynamicTestValue>(cacheName);
+            var cacheData = Ignition.GetIgnite(GridData).GetCache<DynamicTestKey, DynamicTestValue>(cacheName);
 
-            ICache<DynamicTestKey, DynamicTestValue> cacheDataNoCfg =
+            var cacheDataNoCfg = 
                 Ignition.GetIgnite(GridDataNoCfg).GetCache<DynamicTestKey, DynamicTestValue>(cacheName);
 
-            ICache<DynamicTestKey, DynamicTestValue> cacheClient =
-                Ignition.GetIgnite(GridClient).GetCache<DynamicTestKey, DynamicTestValue>(cacheName);
+            var cacheClient = Ignition.GetIgnite(GridClient).GetCache<DynamicTestKey, DynamicTestValue>(cacheName);
 
             DynamicTestKey key1 = new DynamicTestKey(1);
             DynamicTestKey key2 = new DynamicTestKey(2);
@@ -186,97 +168,73 @@ namespace Apache.Ignite.Core.Tests.Cache
 
             Assert.AreEqual(0, sizeClient);
         }
-    }
-
-    /// <summary>
-    /// Key for dynamic cache start tests.
-    /// </summary>
-    class DynamicTestKey
-    {
-        /// <summary>
-        /// Default constructor.
-        /// </summary>
-        public DynamicTestKey()
-        {
-            // No-op.
-        }
-
-        /// <summary>
-        /// Constructor.
-        /// </summary>
-        /// <param name="id">ID.</param>
-        public DynamicTestKey(int id)
-        {
-            Id = id;
-        }
 
         /// <summary>
-        /// ID.
+        /// Key for dynamic cache start tests.
         /// </summary>
-        public int Id
+        private class DynamicTestKey
         {
-            get;
-            set;
-        }
+            /// <summary>
+            /// Constructor.
+            /// </summary>
+            /// <param name="id">ID.</param>
+            public DynamicTestKey(int id)
+            {
+                Id = id;
+            }
 
-        /** <inheritdoc /> */
-        public override bool Equals(object obj)
-        {
-            DynamicTestKey other = obj as DynamicTestKey;
+            /// <summary>
+            /// ID.
+            /// </summary>
+            public int Id { get; set; }
 
-            return other != null && Id == other.Id;
-        }
+            /** <inheritdoc /> */
+            public override bool Equals(object obj)
+            {
+                DynamicTestKey other = obj as DynamicTestKey;
 
-        /** <inheritdoc /> */
-        public override int GetHashCode()
-        {
-            return Id;
-        }
-    }
+                return other != null && Id == other.Id;
+            }
 
-    /// <summary>
-    /// Value for dynamic cache start tests.
-    /// </summary>
-    class DynamicTestValue
-    {
-        /// <summary>
-        /// Default constructor.
-        /// </summary>
-        public DynamicTestValue()
-        {
-            // No-op.
+            /** <inheritdoc /> */
+            public override int GetHashCode()
+            {
+                return Id;
+            }
         }
 
         /// <summary>
-        /// Constructor.
+        /// Value for dynamic cache start tests.
         /// </summary>
-        /// <param name="id">ID.</param>
-        public DynamicTestValue(int id)
+        private class DynamicTestValue
         {
-            Id = id;
-        }
+            /// <summary>
+            /// Constructor.
+            /// </summary>
+            /// <param name="id">ID.</param>
+            public DynamicTestValue(int id)
+            {
+                Id = id;
+            }
 
-        /// <summary>
-        /// ID.
-        /// </summary>
-        public int Id
-        {
-            get;
-            set;
-        }
+            /// <summary>
+            /// ID.
+            /// </summary>
+            public int Id { get; set; }
 
-        /** <inheritdoc /> */
-        public override bool Equals(object obj)
-        {
-            DynamicTestValue other = obj as DynamicTestValue;
+            /** <inheritdoc /> */
+            public override bool Equals(object obj)
+            {
+                DynamicTestValue other = obj as DynamicTestValue;
 
-            return other != null && Id == other.Id;
-        }
+                return other != null && Id == other.Id;
+            }
 
-        /** <inheritdoc /> */
-        public override int GetHashCode()
-        {
-            return Id;
+            /** <inheritdoc /> */
+            public override int GetHashCode()
+            {
+                return Id;
+            }
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheForkedTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheForkedTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheForkedTest.cs
index 46c54e6..3401b79 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheForkedTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheForkedTest.cs
@@ -48,14 +48,12 @@ namespace Apache.Ignite.Core.Tests.Cache
                 "-J-DIGNITE_QUIET=false"
                 );
 
-            _grid = Ignition.Start(new IgniteConfiguration
+            _grid = Ignition.Start(new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
-                JvmClasspath = TestUtils.CreateTestClasspath(),
-                JvmOptions = TestUtils.TestJavaOptions(),
                 SpringConfigUrl = springConfigUrl
             });
 
-            Assert.IsTrue(_grid.WaitTopology(2, 30000));
+            Assert.IsTrue(_grid.WaitTopology(2));
         }
 
         /// <summary>

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheTestKey.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheTestKey.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheTestKey.cs
new file mode 100644
index 0000000..6e8a261
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheTestKey.cs
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Tests.Cache
+{
+    using System.Text;
+
+    /// <summary>
+    /// Test key.
+    /// </summary>
+    internal class CacheTestKey
+    {
+        /// <summary>
+        /// Constructor.
+        /// </summary>
+        /// <param name="id">ID.</param>
+        public CacheTestKey(int id)
+        {
+            Id = id;
+        }
+
+        /// <summary>
+        /// ID.
+        /// </summary>
+        public int Id
+        {
+            get;
+            set;
+        }
+
+        /** <inheritdoc /> */
+        public override bool Equals(object obj)
+        {
+            CacheTestKey other = obj as CacheTestKey;
+
+            return other != null && Id == other.Id;
+        }
+
+        /** <inheritdoc /> */
+        public override int GetHashCode()
+        {
+            return Id;
+        }
+
+        /** <inheritdoc /> */
+        public override string ToString()
+        {
+            return new StringBuilder()
+                .Append(typeof(CacheTestKey).Name)
+                .Append(" [id=").Append(Id)
+                .Append(']').ToString();
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/NonSerializableCacheEntryProcessor.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/NonSerializableCacheEntryProcessor.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/NonSerializableCacheEntryProcessor.cs
new file mode 100644
index 0000000..61bf03b
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/NonSerializableCacheEntryProcessor.cs
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Tests.Cache
+{
+    using System;
+    using Apache.Ignite.Core.Binary;
+
+    /// <summary>
+    /// Non-serializable processor.
+    /// </summary>
+    public class NonSerializableCacheEntryProcessor : AddArgCacheEntryProcessor, IBinarizable
+    {
+        /** <inheritdoc /> */
+        public void WriteBinary(IBinaryWriter writer)
+        {
+            throw new Exception("ExpectedException");
+        }
+
+        /** <inheritdoc /> */
+        public void ReadBinary(IBinaryReader reader)
+        {
+            throw new Exception("ExpectedException");
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/NonSerializableException.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/NonSerializableException.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/NonSerializableException.cs
new file mode 100644
index 0000000..30e84a1
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/NonSerializableException.cs
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Tests.Cache
+{
+    using System;
+    using Apache.Ignite.Core.Binary;
+
+    /// <summary>
+    /// Non-serializable exception.
+    /// </summary>
+    public class NonSerializableException : Exception, IBinarizable
+    {
+        /** <inheritdoc /> */
+        public void WriteBinary(IBinaryWriter writer)
+        {
+            throw new Exception("ExpectedException");
+        }
+
+        /** <inheritdoc /> */
+        public void ReadBinary(IBinaryReader reader)
+        {
+            throw new Exception("ExpectedException");
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheQueriesTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheQueriesTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheQueriesTest.cs
index 5cbec0d..0b13bf9 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheQueriesTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheQueriesTest.cs
@@ -16,6 +16,7 @@
  */
 
 // ReSharper disable UnusedAutoPropertyAccessor.Global
+// ReSharper disable MemberCanBePrivate.Global
 namespace Apache.Ignite.Core.Tests.Cache.Query
 {
     using System;
@@ -50,35 +51,22 @@ namespace Apache.Ignite.Core.Tests.Cache.Query
         private const int MaxItemCnt = 100;
 
         /// <summary>
-        /// 
+        /// Fixture setup.
         /// </summary>
         [TestFixtureSetUp]
         public void StartGrids()
         {
-            TestUtils.KillProcesses();
-
-            IgniteConfiguration cfg = new IgniteConfiguration
+            for (int i = 0; i < GridCnt; i++)
             {
-                BinaryConfiguration = new BinaryConfiguration
+                Ignition.Start(new IgniteConfiguration(TestUtils.GetTestConfiguration())
                 {
-                    TypeConfigurations = new[]
+                    BinaryConfiguration = new BinaryConfiguration
                     {
-                        new BinaryTypeConfiguration(typeof (QueryPerson)),
-                        new BinaryTypeConfiguration(typeof (BinarizableScanQueryFilter<QueryPerson>)),
-                        new BinaryTypeConfiguration(typeof (BinarizableScanQueryFilter<BinaryObject>))
+                        NameMapper = GetNameMapper()
                     },
-                    NameMapper = GetNameMapper()
-                },
-                JvmClasspath = TestUtils.CreateTestClasspath(),
-                JvmOptions = TestUtils.TestJavaOptions(),
-                SpringConfigUrl = CfgPath
-            };
-
-            for (int i = 0; i < GridCnt; i++)
-            {
-                cfg.IgniteInstanceName = "grid-" + i;
-
-                Ignition.Start(cfg);
+                    SpringConfigUrl = CfgPath,
+                    IgniteInstanceName = "grid-" + i
+                });
             }
         }
         
@@ -91,13 +79,12 @@ namespace Apache.Ignite.Core.Tests.Cache.Query
         }
 
         /// <summary>
-        /// 
+        /// Fixture teardown.
         /// </summary>
         [TestFixtureTearDown]
         public void StopGrids()
         {
-            for (int i = 0; i < GridCnt; i++)
-                Ignition.Stop("grid-" + i, true);
+            Ignition.StopAll(true);
         }
 
         /// <summary>

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Continuous/ContinuousQueryAbstractTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Continuous/ContinuousQueryAbstractTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Continuous/ContinuousQueryAbstractTest.cs
index a6b68bb..2df2f35 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Continuous/ContinuousQueryAbstractTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Continuous/ContinuousQueryAbstractTest.cs
@@ -390,36 +390,10 @@ namespace Apache.Ignite.Core.Tests.Cache.Query.Continuous
             using (cache1.QueryContinuous(qry))
             {
                 // Put from local node.
-                try
-                {
-                    cache1.GetAndPut(PrimaryKey(cache1), Entry(1));
-
-                    Assert.Fail("Should not reach this place.");
-                }
-                catch (IgniteException)
-                {
-                    // No-op.
-                }
-                catch (Exception)
-                {
-                    Assert.Fail("Unexpected error.");
-                }
+                Assert.Throws<IgniteException>(() => cache1.GetAndPut(PrimaryKey(cache1), Entry(1)));
 
                 // Put from remote node.
-                try
-                {
-                    cache1.GetAndPut(PrimaryKey(cache2), Entry(1));
-
-                    Assert.Fail("Should not reach this place.");
-                }
-                catch (IgniteException)
-                {
-                    // No-op.
-                }
-                catch (Exception)
-                {
-                    Assert.Fail("Unexpected error.");
-                }
+                Assert.Throws<IgniteException>(() => cache1.GetAndPut(PrimaryKey(cache2), Entry(1)));
             }
         }
 
@@ -552,20 +526,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Query.Continuous
                 CheckFilterSingle(key1, null, Entry(key1));
                 
                 // Remote put must fail.
-                try
-                {
-                    cache1.GetAndPut(PrimaryKey(cache2), Entry(1));
-
-                    Assert.Fail("Should not reach this place.");
-                }
-                catch (IgniteException)
-                {
-                    // No-op.
-                }
-                catch (Exception)
-                {
-                    Assert.Fail("Unexpected error.");
-                }
+                Assert.Throws<IgniteException>(() => cache1.GetAndPut(PrimaryKey(cache2), Entry(1)));
             }
         }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Continuous/ContinuousQueryJavaFilterTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Continuous/ContinuousQueryJavaFilterTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Continuous/ContinuousQueryJavaFilterTest.cs
index 4b5db93..b70f61d 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Continuous/ContinuousQueryJavaFilterTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Continuous/ContinuousQueryJavaFilterTest.cs
@@ -23,7 +23,6 @@ namespace Apache.Ignite.Core.Tests.Cache.Query.Continuous
     using System.Collections.Generic;
     using System.Linq;
     using System.Threading;
-    using Apache.Ignite.Core.Binary;
     using Apache.Ignite.Core.Cache.Event;
     using Apache.Ignite.Core.Cache.Query.Continuous;
     using Apache.Ignite.Core.Common;
@@ -33,6 +32,7 @@ namespace Apache.Ignite.Core.Tests.Cache.Query.Continuous
     /// <summary>
     /// Tests query in a cluster with Java-only and .NET nodes.
     /// </summary>
+    [Category(TestUtils.CategoryIntensive)]
     public class ContinuousQueryJavaFilterTest
     {
         /** */
@@ -68,28 +68,15 @@ namespace Apache.Ignite.Core.Tests.Cache.Query.Continuous
         [TestFixtureSetUp]
         public void FixtureSetUp()
         {
-            // Main .NET nodes
-            var jvmOpts = TestUtils.TestJavaOptions();
-
-            _ignite = Ignition.Start(new IgniteConfiguration
+            // Main .NET node
+            _ignite = Ignition.Start(new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
-                JvmClasspath = TestUtils.CreateTestClasspath(),
-                JvmOptions = jvmOpts,
                 SpringConfigUrl = SpringConfig,
-                BinaryConfiguration = new BinaryConfiguration
-                {
-                    TypeConfigurations = new List<BinaryTypeConfiguration>
-                    {
-                        new BinaryTypeConfiguration(typeof(TestBinary)) 
-                    }
-                }
             });
 
             // Second .NET node
-            Ignition.Start(new IgniteConfiguration
+            Ignition.Start(new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
-                JvmClasspath = TestUtils.CreateTestClasspath(),
-                JvmOptions = jvmOpts,
                 SpringConfigUrl = SpringConfig2,
                 IgniteInstanceName = "dotNet2"
             });

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheParallelLoadStoreTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheParallelLoadStoreTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheParallelLoadStoreTest.cs
index 2e74b3f..52db794 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheParallelLoadStoreTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheParallelLoadStoreTest.cs
@@ -18,7 +18,6 @@
 namespace Apache.Ignite.Core.Tests.Cache.Store
 {
     using System;
-    using Apache.Ignite.Core.Binary;
     using Apache.Ignite.Core.Cache;
     using NUnit.Framework;
 
@@ -36,15 +35,9 @@ namespace Apache.Ignite.Core.Tests.Cache.Store
         [TestFixtureSetUp]
         public void BeforeTests()
         {
-            Ignition.Start(new IgniteConfiguration
+            Ignition.Start(new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
-                JvmClasspath = TestUtils.CreateTestClasspath(),
-                JvmOptions = TestUtils.TestJavaOptions(),
                 SpringConfigUrl = "config\\native-client-test-cache-parallel-store.xml",
-                BinaryConfiguration = new BinaryConfiguration
-                {
-                    Types = new[] {typeof (CacheTestParallelLoadStore.Record).FullName}
-                }
             });
         }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreSessionTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreSessionTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreSessionTest.cs
index 6f9d791..315e285 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreSessionTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreSessionTest.cs
@@ -48,22 +48,11 @@ namespace Apache.Ignite.Core.Tests.Cache.Store
         [TestFixtureSetUp]
         public void BeforeTests()
         {
-            //TestUtils.JVM_DEBUG = true;
-
-            TestUtils.KillProcesses();
-
-            TestUtils.JvmDebug = true;
-
-            IgniteConfiguration cfg = new IgniteConfiguration
+            Ignition.Start(new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
                 IgniteInstanceName = IgniteName,
-                JvmClasspath = TestUtils.CreateTestClasspath(),
-                JvmOptions = TestUtils.TestJavaOptions(),
                 SpringConfigUrl = @"config\cache\store\cache-store-session.xml"
-            };
-
-
-            Ignition.Start(cfg);
+            });
         }
 
         /// <summary>

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreTest.cs
index 309c77e..12c442d 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreTest.cs
@@ -50,16 +50,11 @@ namespace Apache.Ignite.Core.Tests.Cache.Store
         [TestFixtureSetUp]
         public virtual void BeforeTests()
         {
-            var cfg = new IgniteConfiguration
+            Ignition.Start(new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
                 IgniteInstanceName = GridName,
-                JvmClasspath = TestUtils.CreateTestClasspath(),
-                JvmOptions = TestUtils.TestJavaOptions(),
                 SpringConfigUrl = "config\\native-client-test-cache-store.xml",
-                BinaryConfiguration = new BinaryConfiguration(typeof (Key), typeof (Value))
-            };
-
-            Ignition.Start(cfg);
+            });
         }
 
         /// <summary>
@@ -695,12 +690,4 @@ namespace Apache.Ignite.Core.Tests.Cache.Store
             throw new Exception("Expected exception in ExceptionalEntryFilter");
         }
     }
-
-    /// <summary>
-    /// Filter that can't be serialized.
-    /// </summary>
-    public class InvalidCacheEntryFilter : CacheEntryFilter
-    {
-        // No-op.
-    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/TestReferenceObject.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/TestReferenceObject.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/TestReferenceObject.cs
new file mode 100644
index 0000000..c8c433e
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/TestReferenceObject.cs
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Tests.Cache
+{
+    /// <summary>
+    /// Test object with self-reference.
+    /// </summary>
+    public class TestReferenceObject
+    {
+        public TestReferenceObject Obj;
+
+        /// <summary>
+        /// Default constructor.
+        /// </summary>
+        public TestReferenceObject()
+        {
+            // No-op.
+        }
+
+        public TestReferenceObject(TestReferenceObject obj)
+        {
+            Obj = obj;
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/AbstractTaskTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/AbstractTaskTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/AbstractTaskTest.cs
index 65bb369..e60ad4a 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/AbstractTaskTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/AbstractTaskTest.cs
@@ -84,7 +84,7 @@ namespace Apache.Ignite.Core.Tests.Compute
 
             if (_fork)
             {
-                Grid1 = Ignition.Start(Configuration("config\\compute\\compute-standalone.xml"));
+                Grid1 = Ignition.Start(GetConfiguration("config\\compute\\compute-standalone.xml"));
 
                 _proc2 = Fork("config\\compute\\compute-standalone.xml");
 
@@ -114,9 +114,9 @@ namespace Apache.Ignite.Core.Tests.Compute
             }
             else
             {
-                Grid1 = Ignition.Start(Configuration("config\\compute\\compute-grid1.xml"));
-                _grid2 = Ignition.Start(Configuration("config\\compute\\compute-grid2.xml"));
-                _grid3 = Ignition.Start(Configuration("config\\compute\\compute-grid3.xml"));
+                Grid1 = Ignition.Start(GetConfiguration("config\\compute\\compute-grid1.xml"));
+                _grid2 = Ignition.Start(GetConfiguration("config\\compute\\compute-grid2.xml"));
+                _grid3 = Ignition.Start(GetConfiguration("config\\compute\\compute-grid3.xml"));
             }
         }
 
@@ -138,20 +138,11 @@ namespace Apache.Ignite.Core.Tests.Compute
         /// </summary>
         /// <param name="path">Path to Java XML configuration.</param>
         /// <returns>Node configuration.</returns>
-        private IgniteConfiguration Configuration(string path)
+        private static IgniteConfiguration GetConfiguration(string path)
         {
-            return new IgniteConfiguration
+            return new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
-                JvmClasspath = TestUtils.CreateTestClasspath(),
-                JvmOptions = TestUtils.TestJavaOptions(),
                 SpringConfigUrl = path,
-                BinaryConfiguration = _fork
-                    ? null
-                    : new BinaryConfiguration
-                    {
-                        TypeConfigurations =
-                            (GetBinaryTypes() ?? new Type[0]).Select(t => new BinaryTypeConfiguration(t)).ToList()
-                    }
             };
         }
 
@@ -174,14 +165,6 @@ namespace Apache.Ignite.Core.Tests.Compute
         }
 
         /// <summary>
-        /// Define binary types.
-        /// </summary>
-        protected virtual ICollection<Type> GetBinaryTypes()
-        {
-            return null;
-        }
-
-        /// <summary>
         /// Gets the server count.
         /// </summary>
         protected int GetServerCount()

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/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 c169f1e..051917b 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/BinarizableClosureTaskTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/BinarizableClosureTaskTest.cs
@@ -18,7 +18,6 @@
 namespace Apache.Ignite.Core.Tests.Compute
 {
     using System;
-    using System.Collections.Generic;
     using Apache.Ignite.Core.Binary;
     using Apache.Ignite.Core.Compute;
     using NUnit.Framework;
@@ -26,6 +25,7 @@ namespace Apache.Ignite.Core.Tests.Compute
     /// <summary>
     /// Closure execution tests for binary objects.
     /// </summary>
+    [TestFixture]
     public class BinarizableClosureTaskTest : ClosureTaskTest
     {
         /// <summary>
@@ -40,18 +40,6 @@ namespace Apache.Ignite.Core.Tests.Compute
         protected BinarizableClosureTaskTest(bool fork) : base(fork) { }
 
         /** <inheritDoc /> */
-        protected override ICollection<Type> GetBinaryTypes()
-        {
-            return new []
-            {
-                typeof(BinarizableOutFunc),
-                typeof(BinarizableFunc),
-                typeof(BinarizableResult),
-                typeof(BinarizableException)
-            };
-        }
-
-        /** <inheritDoc /> */
         protected override IComputeFunc<object> OutFunc(bool err)
         {
             return new BinarizableOutFunc(err);

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/BinarizableTaskTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/BinarizableTaskTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/BinarizableTaskTest.cs
index 6bdfd9c..8399fba 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/BinarizableTaskTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/BinarizableTaskTest.cs
@@ -17,7 +17,6 @@
 
 namespace Apache.Ignite.Core.Tests.Compute
 {
-    using System;
     using System.Collections.Generic;
     using Apache.Ignite.Core.Binary;
     using Apache.Ignite.Core.Cluster;
@@ -71,20 +70,6 @@ namespace Apache.Ignite.Core.Tests.Compute
             return (IBinaryObject) cache.Get(1);
         }
 
-        /** <inheritDoc /> */
-        protected override ICollection<Type> GetBinaryTypes()
-        {
-            return new[]
-            {
-                typeof(BinarizableJobResult),
-                typeof(BinarizableTaskArgument),
-                typeof(BinarizableTaskResult),
-                typeof(BinarizableJobArgument),
-                typeof(BinarizableJob),
-                typeof(BinarizableWrapper)
-            };
-        }
-
         /// <summary>
         /// Test task.
         /// </summary>

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/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 316e5d0..d675d14 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTest.cs
@@ -169,14 +169,7 @@ namespace Apache.Ignite.Core.Tests.Compute
         [TestFixtureTearDown]
         public void StopClient()
         {
-            if (_grid1 != null)
-                Ignition.Stop(_grid1.Name, true);
-
-            if (_grid2 != null)
-                Ignition.Stop(_grid2.Name, true);
-
-            if (_grid3 != null)
-                Ignition.Stop(_grid3.Name, true);
+            Ignition.StopAll(true);
         }
 
         [TearDown]

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTestFullFooter.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTestFullFooter.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTestFullFooter.cs
index 1b1f98a..a0d54e4 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTestFullFooter.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTestFullFooter.cs
@@ -19,10 +19,12 @@ namespace Apache.Ignite.Core.Tests.Compute
 {
     using System;
     using System.IO;
+    using NUnit.Framework;
 
     /// <summary>
     /// Compute API test with compact footers disabled.
     /// </summary>
+    [TestFixture]
     public class ComputeApiTestFullFooter : ComputeApiTest
     {
         /// <summary>
@@ -49,7 +51,7 @@ namespace Apache.Ignite.Core.Tests.Compute
         /// <summary>
         /// Replaces the footer setting.
         /// </summary>
-        public static string ReplaceFooterSetting(string path)
+        internal static string ReplaceFooterSetting(string path)
         {
             var text = File.ReadAllText(path).Replace(
                 "property name=\"compactFooter\" value=\"true\"",

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/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 1987245..9eb87c0 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/FailoverTaskSelfTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/FailoverTaskSelfTest.cs
@@ -109,12 +109,6 @@ namespace Apache.Ignite.Core.Tests.Compute
             _gridName = null;
         }
 
-        /** <inheritDoc /> */
-        protected override ICollection<Type> GetBinaryTypes()
-        {
-            return new[] {typeof(TestBinarizableJob)};
-        }
-
         /// <summary>
         /// Test task.
         /// </summary>

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ResourceTaskTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ResourceTaskTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ResourceTaskTest.cs
index c693a8b..546ca58 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ResourceTaskTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ResourceTaskTest.cs
@@ -15,6 +15,12 @@
  * limitations under the License.
  */
 
+// ReSharper disable UnusedMember.Local
+// ReSharper disable UnusedMember.Global
+// ReSharper disable UnusedAutoPropertyAccessor.Global
+// ReSharper disable MemberCanBePrivate.Global
+// ReSharper disable UnusedAutoPropertyAccessor.Local
+// ReSharper disable UnassignedField.Global
 namespace Apache.Ignite.Core.Tests.Compute
 {
     using System;
@@ -98,12 +104,6 @@ namespace Apache.Ignite.Core.Tests.Compute
             Assert.AreEqual(GetServerCount(), res);
         }
 
-        /** <inheritdoc /> */
-        protected override ICollection<Type> GetBinaryTypes()
-        {
-            return new[] {typeof(InjectionJobBinarizable)};
-        }
-
         /// <summary>
         /// Injection task.
         /// </summary>
@@ -191,7 +191,7 @@ namespace Apache.Ignite.Core.Tests.Compute
             /// </summary>
             /// <param name="info"></param>
             /// <param name="context"></param>
-            public InjectionJob(SerializationInfo info, StreamingContext context) : base(info, context)
+            protected InjectionJob(SerializationInfo info, StreamingContext context) : base(info, context)
             {
                 // No-op.
             }
@@ -264,24 +264,6 @@ namespace Apache.Ignite.Core.Tests.Compute
                 StaticGrid2 = grid;
             }
 
-            /// <summary>
-            ///
-            /// </summary>
-            public InjectionClosure()
-            {
-                // No-op.
-            }
-
-            /// <summary>
-            ///
-            /// </summary>
-            /// <param name="info"></param>
-            /// <param name="context"></param>
-            public InjectionClosure(SerializationInfo info, StreamingContext context)
-            {
-                // No-op.
-            }
-
             /** */
             [InstanceResource]
             private readonly IIgnite _grid1 = null;
@@ -355,12 +337,6 @@ namespace Apache.Ignite.Core.Tests.Compute
             }
 
             /** <inheritDoc /> */
-            public void GetObjectData(SerializationInfo info, StreamingContext context)
-            {
-                // No-op.
-            }
-
-            /** <inheritDoc /> */
             public int Invoke(int arg)
             {
                 CheckInjection();
@@ -459,7 +435,7 @@ namespace Apache.Ignite.Core.Tests.Compute
             /// <summary>
             ///
             /// </summary>
-            public Injectee()
+            protected Injectee()
             {
                 // No-op.
             }
@@ -469,7 +445,7 @@ namespace Apache.Ignite.Core.Tests.Compute
             /// </summary>
             /// <param name="info"></param>
             /// <param name="context"></param>
-            public Injectee(SerializationInfo info, StreamingContext context)
+            protected Injectee(SerializationInfo info, StreamingContext context)
             {
                 // No-op.
             }
@@ -595,24 +571,6 @@ namespace Apache.Ignite.Core.Tests.Compute
         [Serializable]
         public class NoResultCacheJob : IComputeJob<int>
         {
-            /// <summary>
-            ///
-            /// </summary>
-            public NoResultCacheJob()
-            {
-                // No-op.
-            }
-
-            /// <summary>
-            ///
-            /// </summary>
-            /// <param name="info"></param>
-            /// <param name="context"></param>
-            public NoResultCacheJob(SerializationInfo info, StreamingContext context)
-            {
-                // No-op.
-            }
-
             /** <inheritDoc /> */
             public int Execute()
             {


[02/70] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math module to Ignite ML module added missed licenses renamed packages fixed wrong ml profile activation

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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));
+        }
+    }
+}


[37/70] [abbrv] ignite git commit: IGNITE-4565: Implemented CREATE INDEX and DROP INDEX. This closes #1773. This closes #1804.

Posted by sb...@apache.org.
IGNITE-4565: Implemented CREATE INDEX and DROP INDEX. This closes #1773. This closes #1804.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/2edb935c
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/2edb935c
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/2edb935c

Branch: refs/heads/ignite-2893
Commit: 2edb935cbf87198993c403724e26efc655710c25
Parents: 9e7421f
Author: devozerov <vo...@gridgain.com>
Authored: Tue Apr 18 17:11:34 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Tue Apr 18 17:11:36 2017 +0300

----------------------------------------------------------------------
 .../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 +-
 .../jdbc/suite/IgniteJdbcDriverTestSuite.java   |    8 +
 .../apache/ignite/IgniteSystemProperties.java   |    8 +
 .../org/apache/ignite/cache/QueryEntity.java    |   82 +-
 .../org/apache/ignite/cache/QueryIndex.java     |    9 +
 .../configuration/CacheConfiguration.java       |    7 +-
 .../apache/ignite/internal/GridComponent.java   |    5 +-
 .../ignite/internal/GridKernalContext.java      |    7 +
 .../ignite/internal/GridKernalContextImpl.java  |   13 +-
 .../org/apache/ignite/internal/GridTopic.java   |    5 +-
 .../apache/ignite/internal/IgniteKernal.java    |   27 +-
 .../org/apache/ignite/internal/IgnitionEx.java  |   18 +
 .../managers/communication/GridIoManager.java   |    2 +
 .../communication/GridIoMessageFactory.java     |    6 +
 .../managers/communication/GridIoPolicy.java    |    3 +
 .../cache/CacheAffinitySharedManager.java       |    3 +-
 .../cache/CachePartitionExchangeWorkerTask.java |    6 +-
 .../cache/DynamicCacheChangeRequest.java        |   23 +-
 .../cache/DynamicCacheDescriptor.java           |   50 +-
 .../processors/cache/GridCacheEntryEx.java      |   13 +-
 .../processors/cache/GridCacheMapEntry.java     |   17 +
 .../GridCachePartitionExchangeManager.java      |   36 +-
 .../processors/cache/GridCacheProcessor.java    |  135 +-
 .../cache/GridCacheSharedContext.java           |    2 +
 .../GridDhtPartitionsExchangeFuture.java        |    5 -
 .../cache/query/GridCacheQueryManager.java      |    7 +-
 .../cache/query/IgniteQueryErrorCode.java       |   27 +-
 .../internal/processors/pool/PoolProcessor.java |    5 +
 .../query/GridQueryIndexDescriptor.java         |    5 +
 .../processors/query/GridQueryIndexing.java     |   43 +-
 .../processors/query/GridQueryProcessor.java    | 1707 ++++++++++++++++--
 .../query/GridQueryTypeDescriptor.java          |    7 +
 .../processors/query/IgniteSQLException.java    |    7 +
 .../query/QueryIndexDescriptorImpl.java         |   42 +-
 .../processors/query/QueryIndexKey.java         |   85 +
 .../internal/processors/query/QuerySchema.java  |  168 ++
 .../query/QueryTypeDescriptorImpl.java          |  150 +-
 .../internal/processors/query/QueryUtils.java   |  219 ++-
 .../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 +
 .../processors/cache/GridCacheTestEntryEx.java  |    7 +
 .../junits/GridTestKernalContext.java           |    1 +
 .../query/h2/GridH2IndexingGeoSelfTest.java     |    4 +-
 .../query/h2/DmlStatementsProcessor.java        |   49 +-
 .../processors/query/h2/IgniteH2Indexing.java   |  678 +++++--
 .../query/h2/ddl/DdlStatementsProcessor.java    |  208 +++
 .../query/h2/opt/GridH2IndexBase.java           |    2 +-
 .../query/h2/opt/GridH2PrimaryScanIndex.java    |   87 +
 .../query/h2/opt/GridH2SystemIndexFactory.java  |   38 +
 .../processors/query/h2/opt/GridH2Table.java    |  382 ++--
 .../query/h2/opt/GridLuceneIndex.java           |   10 +-
 .../query/h2/sql/GridSqlCreateIndex.java        |  121 ++
 .../query/h2/sql/GridSqlDropIndex.java          |   82 +
 .../query/h2/sql/GridSqlQueryParser.java        |  123 ++
 .../cache/index/AbstractSchemaSelfTest.java     |  512 ++++++
 .../DynamicIndexAbstractBasicSelfTest.java      |  950 ++++++++++
 .../DynamicIndexAbstractConcurrentSelfTest.java |  921 ++++++++++
 .../index/DynamicIndexAbstractSelfTest.java     |  467 +++++
 .../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 +
 .../cache/index/SchemaExchangeSelfTest.java     |  589 ++++++
 .../local/IgniteCacheLocalQuerySelfTest.java    |    2 +-
 .../query/IgniteQueryDedicatedPoolTest.java     |    1 -
 .../query/IgniteSqlSplitterSelfTest.java        |    2 +-
 .../h2/GridIndexingSpiAbstractSelfTest.java     |  109 +-
 .../query/h2/IgniteSqlQueryMinMaxTest.java      |   16 +-
 .../query/h2/opt/GridH2TableSelfTest.java       |  171 +-
 .../query/h2/sql/GridQueryParsingTest.java      |  212 ++-
 .../IgniteCacheQuerySelfTestSuite.java          |   37 +-
 .../IgniteCacheQuerySelfTestSuite2.java         |   11 +
 111 files changed, 11221 insertions(+), 1016 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcAbstractDmlStatementSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcAbstractDmlStatementSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcAbstractDmlStatementSelfTest.java
index 440f6d0..f23dde7 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcAbstractDmlStatementSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcAbstractDmlStatementSelfTest.java
@@ -21,17 +21,10 @@ import java.io.Serializable;
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.util.Collections;
-import org.apache.ignite.cache.CachePeekMode;
 import org.apache.ignite.cache.QueryEntity;
 import org.apache.ignite.cache.query.annotations.QuerySqlField;
 import org.apache.ignite.configuration.CacheConfiguration;
-import org.apache.ignite.configuration.ConnectorConfiguration;
-import org.apache.ignite.configuration.IgniteConfiguration;
-import org.apache.ignite.internal.binary.BinaryMarshaller;
 import org.apache.ignite.internal.util.typedef.F;
-import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
-import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
-import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 
 import static org.apache.ignite.IgniteJdbcDriver.CFG_URL_PREFIX;
@@ -42,9 +35,6 @@ import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
  * Statement test.
  */
 public abstract class JdbcAbstractDmlStatementSelfTest extends GridCommonAbstractTest {
-    /** IP finder. */
-    private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
-
     /** JDBC URL. */
     private static final String BASE_URL = CFG_URL_PREFIX + "modules/clients/src/test/config/jdbc-config.xml";
 
@@ -58,18 +48,28 @@ public abstract class JdbcAbstractDmlStatementSelfTest extends GridCommonAbstrac
     protected Connection conn;
 
     /** {@inheritDoc} */
-    @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
-        return getConfiguration0(igniteInstanceName);
+    @Override protected void beforeTestsStarted() throws Exception {
+        startGridsMultiThreaded(3);
+
+        Class.forName("org.apache.ignite.IgniteJdbcDriver");
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTestsStopped() throws Exception {
+        stopAllGrids();
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void beforeTest() throws Exception {
+        conn = DriverManager.getConnection(getCfgUrl());
+
+        ignite(0).getOrCreateCache(cacheConfig());
     }
 
     /**
-     * @param igniteInstanceName Ignite instance name.
-     * @return Grid configuration used for starting the grid.
-     * @throws Exception If failed.
+     * @return Cache configuration for non binary marshaller tests.
      */
-    private IgniteConfiguration getConfiguration0(String igniteInstanceName) throws Exception {
-        IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
-
+    private CacheConfiguration nonBinCacheConfig() {
         CacheConfiguration<?,?> cache = defaultCacheConfiguration();
 
         cache.setCacheMode(PARTITIONED);
@@ -79,32 +79,18 @@ public abstract class JdbcAbstractDmlStatementSelfTest extends GridCommonAbstrac
             String.class, Person.class
         );
 
-        cfg.setCacheConfiguration(cache);
-
-        TcpDiscoverySpi disco = new TcpDiscoverySpi();
-
-        disco.setIpFinder(IP_FINDER);
-
-        cfg.setDiscoverySpi(disco);
-
-        cfg.setConnectorConfiguration(new ConnectorConfiguration());
-
-        return cfg;
+        return cache;
     }
 
     /**
-     * @param igniteInstanceName Ignite instance name.
-     * @return Grid configuration used for starting the grid ready for manipulating binary objects.
-     * @throws Exception If failed.
+     * @return Cache configuration for binary marshaller tests.
      */
-    IgniteConfiguration getBinaryConfiguration(String igniteInstanceName) throws Exception {
-        IgniteConfiguration cfg = getConfiguration0(igniteInstanceName);
-
-        cfg.setMarshaller(new BinaryMarshaller());
-
-        CacheConfiguration ccfg = cfg.getCacheConfiguration()[0];
+    final CacheConfiguration binaryCacheConfig() {
+        CacheConfiguration<?,?> cache = defaultCacheConfiguration();
 
-        ccfg.getQueryEntities().clear();
+        cache.setCacheMode(PARTITIONED);
+        cache.setBackups(1);
+        cache.setWriteSynchronizationMode(FULL_SYNC);
 
         QueryEntity e = new QueryEntity();
 
@@ -116,26 +102,16 @@ public abstract class JdbcAbstractDmlStatementSelfTest extends GridCommonAbstrac
         e.addQueryField("firstName", String.class.getName(), null);
         e.addQueryField("lastName", String.class.getName(), null);
 
-        ccfg.setQueryEntities(Collections.singletonList(e));
-
-        return cfg;
-    }
-
-    /** {@inheritDoc} */
-    @Override protected void beforeTestsStarted() throws Exception {
-        startGridsMultiThreaded(3);
+        cache.setQueryEntities(Collections.singletonList(e));
 
-        Class.forName("org.apache.ignite.IgniteJdbcDriver");
+        return cache;
     }
 
-    /** {@inheritDoc} */
-    @Override protected void afterTestsStopped() throws Exception {
-        stopAllGrids();
-    }
-
-    /** {@inheritDoc} */
-    @Override protected void beforeTest() throws Exception {
-        conn = DriverManager.getConnection(getCfgUrl());
+    /**
+     * @return Configuration of cache to create.
+     */
+    CacheConfiguration cacheConfig() {
+        return nonBinCacheConfig();
     }
 
     /**
@@ -147,9 +123,7 @@ public abstract class JdbcAbstractDmlStatementSelfTest extends GridCommonAbstrac
 
     /** {@inheritDoc} */
     @Override protected void afterTest() throws Exception {
-        grid(0).cache(null).clear();
-
-        assertEquals(0, grid(0).cache(null).size(CachePeekMode.ALL));
+        grid(0).destroyCache(null);
 
         conn.close();
         assertTrue(conn.isClosed());

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcBinaryMarshallerInsertStatementSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcBinaryMarshallerInsertStatementSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcBinaryMarshallerInsertStatementSelfTest.java
index e8a09d9..878e4de 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcBinaryMarshallerInsertStatementSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcBinaryMarshallerInsertStatementSelfTest.java
@@ -17,7 +17,9 @@
 
 package org.apache.ignite.internal.jdbc2;
 
+import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.binary.BinaryMarshaller;
 
 /**
  * JDBC test of INSERT statement w/binary marshaller - no nodes know about classes.
@@ -30,6 +32,11 @@ public class JdbcBinaryMarshallerInsertStatementSelfTest extends JdbcInsertState
 
     /** {@inheritDoc} */
     @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
-        return getBinaryConfiguration(igniteInstanceName);
+        return super.getConfiguration(igniteInstanceName).setMarshaller(new BinaryMarshaller());
+    }
+
+    /** {@inheritDoc} */
+    @Override CacheConfiguration cacheConfig() {
+        return binaryCacheConfig();
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcBinaryMarshallerMergeStatementSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcBinaryMarshallerMergeStatementSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcBinaryMarshallerMergeStatementSelfTest.java
index 5e4b559..8b4d3c7 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcBinaryMarshallerMergeStatementSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcBinaryMarshallerMergeStatementSelfTest.java
@@ -17,7 +17,9 @@
 
 package org.apache.ignite.internal.jdbc2;
 
+import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.binary.BinaryMarshaller;
 
 /**
  * JDBC test of MERGE statement w/binary marshaller - no nodes know about classes.
@@ -30,6 +32,11 @@ public class JdbcBinaryMarshallerMergeStatementSelfTest extends JdbcMergeStateme
 
     /** {@inheritDoc} */
     @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
-        return getBinaryConfiguration(igniteInstanceName);
+        return super.getConfiguration(igniteInstanceName).setMarshaller(new BinaryMarshaller());
+    }
+
+    /** {@inheritDoc} */
+    @Override CacheConfiguration cacheConfig() {
+        return binaryCacheConfig();
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexAbstractSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexAbstractSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexAbstractSelfTest.java
new file mode 100644
index 0000000..84ffc28
--- /dev/null
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexAbstractSelfTest.java
@@ -0,0 +1,367 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.jdbc2;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Collections;
+import java.util.List;
+import javax.cache.CacheException;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.cache.CacheWriteSynchronizationMode;
+import org.apache.ignite.cache.query.SqlFieldsQuery;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.NearCacheConfiguration;
+import org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode;
+import org.apache.ignite.internal.processors.query.IgniteSQLException;
+import org.apache.ignite.internal.util.typedef.F;
+
+/**
+ * Test that checks indexes handling with JDBC.
+ */
+public abstract class JdbcDynamicIndexAbstractSelfTest extends JdbcAbstractDmlStatementSelfTest {
+    /** */
+    private final static String CREATE_INDEX = "create index idx on Person (id desc)";
+
+    /** */
+    private final static String DROP_INDEX = "drop index idx";
+
+    /** */
+    private final static String CREATE_INDEX_IF_NOT_EXISTS = "create index if not exists idx on Person (id desc)";
+
+    /** */
+    private final static String DROP_INDEX_IF_EXISTS = "drop index idx if exists";
+
+    /** {@inheritDoc} */
+    @Override protected void beforeTest() throws Exception {
+        super.beforeTest();
+
+        try (PreparedStatement ps =
+            conn.prepareStatement("INSERT INTO Person (_key, id, age, firstName, lastName) values (?, ?, ?, ?, ?)")) {
+
+            ps.setString(1, "j");
+            ps.setInt(2, 1);
+            ps.setInt(3, 10);
+            ps.setString(4, "John");
+            ps.setString(5, "Smith");
+            ps.executeUpdate();
+
+            ps.setString(1, "m");
+            ps.setInt(2, 2);
+            ps.setInt(3, 20);
+            ps.setString(4, "Mark");
+            ps.setString(5, "Stone");
+            ps.executeUpdate();
+
+            ps.setString(1, "s");
+            ps.setInt(2, 3);
+            ps.setInt(3, 30);
+            ps.setString(4, "Sarah");
+            ps.setString(5, "Pazzi");
+            ps.executeUpdate();
+        }
+    }
+
+    /** {@inheritDoc} */
+    @SuppressWarnings("unchecked")
+    @Override CacheConfiguration cacheConfig() {
+        CacheConfiguration ccfg = super.cacheConfig();
+
+        ccfg.setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC);
+
+        ccfg.setCacheMode(cacheMode());
+        ccfg.setAtomicityMode(atomicityMode());
+
+        if (nearCache())
+            ccfg.setNearConfiguration(new NearCacheConfiguration());
+
+        return ccfg;
+    }
+
+    /**
+     * @return Cache mode to use.
+     */
+    protected abstract CacheMode cacheMode();
+
+    /**
+     * @return Cache atomicity mode to use.
+     */
+    protected abstract CacheAtomicityMode atomicityMode();
+
+    /**
+     * @return Whether to use near cache.
+     */
+    protected abstract boolean nearCache();
+
+    /**
+     * Execute given SQL statement.
+     * @param sql Statement.
+     * @throws SQLException if failed.
+     */
+    private void jdbcRun(String sql) throws SQLException {
+        try (Statement stmt = conn.createStatement()) {
+            stmt.execute(sql);
+        }
+    }
+
+    /** */
+    private Object getSingleValue(ResultSet rs) throws SQLException {
+        assertEquals(1, rs.getMetaData().getColumnCount());
+
+        assertTrue(rs.next());
+
+        Object res = rs.getObject(1);
+
+        assertTrue(rs.isLast());
+
+        return res;
+    }
+
+    /**
+     * Test that after index creation index is used by queries.
+     */
+    public void testCreateIndex() throws SQLException {
+        assertSize(3);
+
+        assertColumnValues(30, 20, 10);
+
+        jdbcRun(CREATE_INDEX);
+
+        // Test that local queries on all server nodes use new index.
+        for (int i = 0 ; i < 3; i++) {
+            List<List<?>> locRes = ignite(i).cache(null).query(new SqlFieldsQuery("explain select id from " +
+                "Person where id = 5").setLocal(true)).getAll();
+
+            assertEquals(F.asList(
+                Collections.singletonList("SELECT\n" +
+                    "    ID\n" +
+                    "FROM \"\".PERSON\n" +
+                    "    /* \"\".IDX: ID = 5 */\n" +
+                    "WHERE ID = 5")
+            ), locRes);
+        }
+
+        assertSize(3);
+
+        assertColumnValues(30, 20, 10);
+    }
+
+    /**
+     * Test that creating an index with duplicate name yields an error.
+     */
+    public void testCreateIndexWithDuplicateName() throws SQLException {
+        jdbcRun(CREATE_INDEX);
+
+        assertSqlException(new RunnableX() {
+            /** {@inheritDoc} */
+            @Override public void run() throws Exception {
+                jdbcRun(CREATE_INDEX);
+            }
+        }, IgniteQueryErrorCode.INDEX_ALREADY_EXISTS);
+    }
+
+    /**
+     * Test that creating an index with duplicate name does not yield an error with {@code IF NOT EXISTS}.
+     */
+    public void testCreateIndexIfNotExists() throws SQLException {
+        jdbcRun(CREATE_INDEX);
+
+        // Despite duplicate name, this does not yield an error.
+        jdbcRun(CREATE_INDEX_IF_NOT_EXISTS);
+    }
+
+    /**
+     * Test that after index drop there are no attempts to use it, and data state remains intact.
+     */
+    public void testDropIndex() throws SQLException {
+        assertSize(3);
+
+        jdbcRun(CREATE_INDEX);
+
+        assertSize(3);
+
+        jdbcRun(DROP_INDEX);
+
+        // Test that no local queries on server nodes use new index.
+        for (int i = 0 ; i < 3; i++) {
+            List<List<?>> locRes = ignite(i).cache(null).query(new SqlFieldsQuery("explain select id from " +
+                "Person where id = 5").setLocal(true)).getAll();
+
+            assertEquals(F.asList(
+                Collections.singletonList("SELECT\n" +
+                    "    ID\n" +
+                    "FROM \"\".PERSON\n" +
+                    "    /* \"\".PERSON.__SCAN_ */\n" +
+                    "WHERE ID = 5")
+            ), locRes);
+        }
+
+        assertSize(3);
+    }
+
+    /**
+     * Test that dropping a non-existent index yields an error.
+     */
+    public void testDropMissingIndex() {
+        assertSqlException(new RunnableX() {
+            /** {@inheritDoc} */
+            @Override public void run() throws Exception {
+                jdbcRun(DROP_INDEX);
+            }
+        }, IgniteQueryErrorCode.INDEX_NOT_FOUND);
+    }
+
+    /**
+     * Test that dropping a non-existent index does not yield an error with {@code IF EXISTS}.
+     */
+    public void testDropMissingIndexIfExists() throws SQLException {
+        // Despite index missing, this does not yield an error.
+        jdbcRun(DROP_INDEX_IF_EXISTS);
+    }
+
+    /**
+     * Test that changes in cache affect index, and vice versa.
+     */
+    public void testIndexState() throws SQLException {
+        IgniteCache<String, Person> cache = cache();
+
+        assertSize(3);
+
+        assertColumnValues(30, 20, 10);
+
+        jdbcRun(CREATE_INDEX);
+
+        assertSize(3);
+
+        assertColumnValues(30, 20, 10);
+
+        cache.remove("m");
+
+        assertColumnValues(30, 10);
+
+        cache.put("a", new Person(4, "someVal", "a", 5));
+
+        assertColumnValues(5, 30, 10);
+
+        jdbcRun(DROP_INDEX);
+
+        assertColumnValues(5, 30, 10);
+    }
+
+    /**
+     * Check that values of {@code field1} match what we expect.
+     * @param vals Expected values.
+     */
+    private void assertColumnValues(int... vals) throws SQLException {
+        try (Statement stmt = conn.createStatement()) {
+            try (ResultSet rs = stmt.executeQuery("SELECT age FROM Person ORDER BY id desc")) {
+                assertEquals(1, rs.getMetaData().getColumnCount());
+
+                for (int i = 0; i < vals.length; i++) {
+                    assertTrue("Result set must have " + vals.length + " rows, got " + i, rs.next());
+
+                    assertEquals(vals[i], rs.getInt(1));
+                }
+
+                assertFalse("Result set must have exactly " + vals.length + " rows", rs.next());
+            }
+        }
+    }
+
+    /**
+     * Do a {@code SELECT COUNT(*)} query to check index state correctness.
+     * @param expSize Expected number of items in table.
+     */
+    private void assertSize(long expSize) throws SQLException {
+        assertEquals(expSize, cache().size());
+
+        try (Statement stmt = conn.createStatement()) {
+            try (ResultSet rs = stmt.executeQuery("SELECT COUNT(*) from Person")) {
+                assertEquals(expSize, getSingleValue(rs));
+            }
+        }
+    }
+
+    /**
+     * @return Cache.
+     */
+    private IgniteCache<String, Person> cache() {
+        return grid(0).cache(null);
+    }
+
+    /**
+     * Ensure that SQL exception is thrown.
+     *
+     * @param r Runnable.
+     * @param expCode Error code.
+     */
+    private static void assertSqlException(RunnableX r, int expCode) {
+        // We expect IgniteSQLException with given code inside CacheException inside JDBC SQLException.
+
+        try {
+            r.run();
+        }
+        catch (SQLException ex) {
+            if (ex.getCause() != null) {
+                try {
+                    throw ex.getCause();
+                }
+                catch (CacheException ex1) {
+                    if (ex1.getCause() != null) {
+                        try {
+                            throw ex1.getCause();
+                        }
+                        catch (IgniteSQLException e) {
+                            assertEquals("Unexpected error code [expected=" + expCode + ", actual=" + e.statusCode() + ']',
+                                expCode, e.statusCode());
+
+                            return;
+                        }
+                        catch (Throwable t) {
+                            fail("Unexpected exception: " + t);
+                        }
+                    }
+                }
+                catch (Throwable t) {
+                    fail("Unexpected exception: " + t);
+                }
+            }
+        }
+        catch (Exception e) {
+            fail("Unexpected exception: " + e);
+        }
+
+        fail(IgniteSQLException.class.getSimpleName() +  " is not thrown.");
+    }
+
+    /**
+     * Runnable which can throw checked exceptions.
+     */
+    private interface RunnableX {
+        /**
+         * Do run.
+         *
+         * @throws Exception If failed.
+         */
+        public void run() throws Exception;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexAtomicPartitionedNearSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexAtomicPartitionedNearSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexAtomicPartitionedNearSelfTest.java
new file mode 100644
index 0000000..c2b5011
--- /dev/null
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexAtomicPartitionedNearSelfTest.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.jdbc2;
+
+/** */
+public class JdbcDynamicIndexAtomicPartitionedNearSelfTest extends JdbcDynamicIndexAtomicPartitionedSelfTest {
+    /** {@inheritDoc} */
+    @Override protected boolean nearCache() {
+        return true;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexAtomicPartitionedSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexAtomicPartitionedSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexAtomicPartitionedSelfTest.java
new file mode 100644
index 0000000..41e07e7
--- /dev/null
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexAtomicPartitionedSelfTest.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.internal.jdbc2;
+
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
+
+/** */
+public class JdbcDynamicIndexAtomicPartitionedSelfTest extends JdbcDynamicIndexAbstractSelfTest {
+    /** {@inheritDoc} */
+    @Override protected CacheMode cacheMode() {
+        return CacheMode.PARTITIONED;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected CacheAtomicityMode atomicityMode() {
+        return CacheAtomicityMode.ATOMIC;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected boolean nearCache() {
+        return false;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexAtomicReplicatedSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexAtomicReplicatedSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexAtomicReplicatedSelfTest.java
new file mode 100644
index 0000000..7a5b015
--- /dev/null
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexAtomicReplicatedSelfTest.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.internal.jdbc2;
+
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
+
+/** */
+public class JdbcDynamicIndexAtomicReplicatedSelfTest extends JdbcDynamicIndexAbstractSelfTest {
+    /** {@inheritDoc} */
+    @Override protected CacheMode cacheMode() {
+        return CacheMode.REPLICATED;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected CacheAtomicityMode atomicityMode() {
+        return CacheAtomicityMode.ATOMIC;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected boolean nearCache() {
+        return false;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexTransactionalPartitionedNearSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexTransactionalPartitionedNearSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexTransactionalPartitionedNearSelfTest.java
new file mode 100644
index 0000000..2815dff
--- /dev/null
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexTransactionalPartitionedNearSelfTest.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.jdbc2;
+
+/** */
+public class JdbcDynamicIndexTransactionalPartitionedNearSelfTest extends JdbcDynamicIndexTransactionalPartitionedSelfTest {
+    /** {@inheritDoc} */
+    @Override protected boolean nearCache() {
+        return true;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexTransactionalPartitionedSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexTransactionalPartitionedSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexTransactionalPartitionedSelfTest.java
new file mode 100644
index 0000000..47b257f
--- /dev/null
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexTransactionalPartitionedSelfTest.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.internal.jdbc2;
+
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
+
+/** */
+public class JdbcDynamicIndexTransactionalPartitionedSelfTest extends JdbcDynamicIndexAbstractSelfTest {
+    /** {@inheritDoc} */
+    @Override protected CacheMode cacheMode() {
+        return CacheMode.PARTITIONED;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected CacheAtomicityMode atomicityMode() {
+        return CacheAtomicityMode.TRANSACTIONAL;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected boolean nearCache() {
+        return false;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexTransactionalReplicatedSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexTransactionalReplicatedSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexTransactionalReplicatedSelfTest.java
new file mode 100644
index 0000000..9b135d8
--- /dev/null
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcDynamicIndexTransactionalReplicatedSelfTest.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.internal.jdbc2;
+
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
+
+/** */
+public class JdbcDynamicIndexTransactionalReplicatedSelfTest extends JdbcDynamicIndexAbstractSelfTest {
+    /** {@inheritDoc} */
+    @Override protected CacheMode cacheMode() {
+        return CacheMode.REPLICATED;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected CacheAtomicityMode atomicityMode() {
+        return CacheAtomicityMode.TRANSACTIONAL;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected boolean nearCache() {
+        return false;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcInsertStatementSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcInsertStatementSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcInsertStatementSelfTest.java
index 1bd6d34..9e01bc7 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcInsertStatementSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcInsertStatementSelfTest.java
@@ -24,8 +24,8 @@ import java.sql.Statement;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.concurrent.Callable;
-import org.apache.ignite.IgniteException;
 import org.apache.ignite.cache.CachePeekMode;
+import org.apache.ignite.internal.processors.query.IgniteSQLException;
 import org.apache.ignite.testframework.GridTestUtils;
 
 /**
@@ -164,7 +164,7 @@ public class JdbcInsertStatementSelfTest extends JdbcAbstractDmlStatementSelfTes
 
         assertNotNull(reason);
 
-        assertEquals(IgniteException.class, reason.getClass());
+        assertEquals(IgniteSQLException.class, reason.getClass());
 
         assertEquals("Failed to INSERT some keys because they are already in cache [keys=[p2]]", reason.getMessage());
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/clients/src/test/java/org/apache/ignite/jdbc/suite/IgniteJdbcDriverTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/suite/IgniteJdbcDriverTestSuite.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/suite/IgniteJdbcDriverTestSuite.java
index 2489de9..75671de 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/suite/IgniteJdbcDriverTestSuite.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/suite/IgniteJdbcDriverTestSuite.java
@@ -73,6 +73,14 @@ public class IgniteJdbcDriverTestSuite extends TestSuite {
         suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcDeleteStatementSelfTest.class));
         suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcStreamingSelfTest.class));
 
+        // DDL tests.
+        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexAtomicPartitionedNearSelfTest.class));
+        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexAtomicPartitionedSelfTest.class));
+        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexAtomicReplicatedSelfTest.class));
+        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexTransactionalPartitionedNearSelfTest.class));
+        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexTransactionalPartitionedSelfTest.class));
+        suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexTransactionalReplicatedSelfTest.class));
+
         return suite;
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
index 1216db8..37e8c6b 100644
--- a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
+++ b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
@@ -575,6 +575,14 @@ public final class IgniteSystemProperties {
      */
     public static final String IGNITE_MAX_INDEX_PAYLOAD_SIZE = "IGNITE_MAX_INDEX_PAYLOAD_SIZE";
 
+    /**
+     * Indexing discovery history size. Protects from duplicate messages maintaining the list of IDs of recently
+     * arrived discovery messages.
+     * <p>
+     * Defaults to {@code 1000}.
+     */
+    public static final String IGNITE_INDEXING_DISCOVERY_HISTORY_SIZE = "IGNITE_INDEXING_DISCOVERY_HISTORY_SIZE";
+
     /** Returns true for system properties only avoiding sending sensitive information. */
     private static final IgnitePredicate<Map.Entry<String, String>> PROPS_FILTER = new IgnitePredicate<Map.Entry<String, String>>() {
         @Override public boolean apply(final Map.Entry<String, String> entry) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/cache/QueryEntity.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/cache/QueryEntity.java b/modules/core/src/main/java/org/apache/ignite/cache/QueryEntity.java
index 9f4313e..31fe264 100644
--- a/modules/core/src/main/java/org/apache/ignite/cache/QueryEntity.java
+++ b/modules/core/src/main/java/org/apache/ignite/cache/QueryEntity.java
@@ -20,9 +20,12 @@ package org.apache.ignite.cache;
 import java.io.Serializable;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Set;
+
+import org.apache.ignite.internal.processors.query.QueryUtils;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.A;
 
@@ -63,6 +66,24 @@ public class QueryEntity implements Serializable {
     }
 
     /**
+     * Copy constructor.
+     *
+     * @param other Other entity.
+     */
+    public QueryEntity(QueryEntity other) {
+        keyType = other.keyType;
+        valType = other.valType;
+
+        fields = new LinkedHashMap<>(other.fields);
+        keyFields = other.keyFields != null ? new HashSet<>(other.keyFields) : null;
+
+        aliases = new HashMap<>(other.aliases);
+        idxs = new HashMap<>(other.idxs);
+
+        tableName = other.tableName;
+    }
+
+    /**
      * Creates a query entity with the given key and value types.
      *
      * @param keyType Key type.
@@ -204,7 +225,7 @@ public class QueryEntity implements Serializable {
         for (QueryIndex idx : idxs) {
             if (!F.isEmpty(idx.getFields())) {
                 if (idx.getName() == null)
-                    idx.setName(defaultIndexName(idx));
+                    idx.setName(QueryUtils.indexName(this, idx));
 
                 if (idx.getIndexType() == null)
                     throw new IllegalArgumentException("Index type is not set " + idx.getName());
@@ -220,6 +241,13 @@ public class QueryEntity implements Serializable {
     }
 
     /**
+     * Clear indexes.
+     */
+    public void clearIndexes() {
+        this.idxs.clear();
+    }
+
+    /**
      * Gets table name for this query entity.
      *
      * @return table name
@@ -254,56 +282,4 @@ public class QueryEntity implements Serializable {
 
         return this;
     }
-
-    /**
-     * Ensures that index with the given name exists.
-     *
-     * @param idxName Index name.
-     * @param idxType Index type.
-     */
-    public void ensureIndex(String idxName, QueryIndexType idxType) {
-        QueryIndex idx = idxs.get(idxName);
-
-        if (idx == null) {
-            idx = new QueryIndex();
-
-            idx.setName(idxName);
-            idx.setIndexType(idxType);
-
-            idxs.put(idxName, idx);
-        }
-        else
-            throw new IllegalArgumentException("An index with the same name and of a different type already exists " +
-                "[idxName=" + idxName + ", existingIdxType=" + idx.getIndexType() + ", newIdxType=" + idxType + ']');
-    }
-
-    /**
-     * Generates default index name by concatenating all index field names.
-     *
-     * @param idx Index to build name for.
-     * @return Index name.
-     */
-    public static String defaultIndexName(QueryIndex idx) {
-        StringBuilder idxName = new StringBuilder();
-
-        for (Map.Entry<String, Boolean> field : idx.getFields().entrySet()) {
-            idxName.append(field.getKey());
-
-            idxName.append('_');
-            idxName.append(field.getValue() ? "asc_" : "desc_");
-        }
-
-        for (int i = 0; i < idxName.length(); i++) {
-            char ch = idxName.charAt(i);
-
-            if (Character.isWhitespace(ch))
-                idxName.setCharAt(i, '_');
-            else
-                idxName.setCharAt(i, Character.toLowerCase(ch));
-        }
-
-        idxName.append("idx");
-
-        return idxName.toString();
-    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/cache/QueryIndex.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/cache/QueryIndex.java b/modules/core/src/main/java/org/apache/ignite/cache/QueryIndex.java
index 750d3e1..555a006 100644
--- a/modules/core/src/main/java/org/apache/ignite/cache/QueryIndex.java
+++ b/modules/core/src/main/java/org/apache/ignite/cache/QueryIndex.java
@@ -16,6 +16,9 @@
  */
 package org.apache.ignite.cache;
 
+import org.apache.ignite.internal.util.tostring.GridToStringInclude;
+import org.apache.ignite.internal.util.typedef.internal.S;
+
 import java.io.Serializable;
 import java.util.Arrays;
 import java.util.Collection;
@@ -38,6 +41,7 @@ public class QueryIndex implements Serializable {
     private String name;
 
     /** */
+    @GridToStringInclude
     private LinkedHashMap<String, Boolean> fields;
 
     /** */
@@ -260,4 +264,9 @@ public class QueryIndex implements Serializable {
     public void setInlineSize(int inlineSize) {
         this.inlineSize = inlineSize;
     }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(QueryIndex.class, this);
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java
index 2308a10..a2f7cc8 100644
--- a/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java
@@ -2096,7 +2096,7 @@ public class CacheConfiguration<K, V> extends MutableConfiguration<K, V> {
         @Nullable ClassProperty parent) {
         if (U.isJdk(cls) || QueryUtils.isGeometryClass(cls)) {
             if (parent == null && !key && QueryUtils.isSqlType(cls)) { // We have to index primitive _val.
-                String idxName = QueryUtils._VAL + "_idx";
+                String idxName = cls.getSimpleName() + "_" + QueryUtils._VAL + "_idx";
 
                 type.addIndex(idxName, QueryUtils.isGeometryClass(cls) ?
                     QueryIndexType.GEOSPATIAL : QueryIndexType.SORTED);
@@ -2527,6 +2527,11 @@ public class CacheConfiguration<K, V> extends MutableConfiguration<K, V> {
         }
 
         /** {@inheritDoc} */
+        @Override public String name() {
+            return null;
+        }
+
+        /** {@inheritDoc} */
         @Override public Collection<String> fields() {
             Collection<String> res = new ArrayList<>(fields.size());
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/GridComponent.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridComponent.java b/modules/core/src/main/java/org/apache/ignite/internal/GridComponent.java
index be9a1d6..98edf0f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/GridComponent.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/GridComponent.java
@@ -58,7 +58,10 @@ public interface GridComponent {
         MARSHALLER_PROC,
 
         /** */
-        BINARY_PROC
+        BINARY_PROC,
+
+        /** Query processor. */
+        QUERY_PROC
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java
index 6fefb68..8462e5f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java
@@ -564,6 +564,13 @@ public interface GridKernalContext extends Iterable<GridComponent> {
     public ExecutorService getQueryExecutorService();
 
     /**
+     * Executor service that is in charge of processing schema change messages.
+     *
+     * @return Executor service that is in charge of processing schema change messages.
+     */
+    public ExecutorService getSchemaExecutorService();
+
+    /**
      * Gets exception registry.
      *
      * @return Exception registry.

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java
index 664e47c..213cf86 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java
@@ -340,6 +340,10 @@ public class GridKernalContextImpl implements GridKernalContext, Externalizable
 
     /** */
     @GridToStringExclude
+    protected ExecutorService schemaExecSvc;
+
+    /** */
+    @GridToStringExclude
     private Map<String, Object> attrs = new HashMap<>();
 
     /** */
@@ -396,8 +400,8 @@ public class GridKernalContextImpl implements GridKernalContext, Externalizable
      * @param idxExecSvc Indexing executor service.
      * @param callbackExecSvc Callback executor service.
      * @param qryExecSvc Query executor service.
+     * @param schemaExecSvc Schema executor service.
      * @param plugins Plugin providers.
-     * @throws IgniteCheckedException In case of error.
      */
     @SuppressWarnings("TypeMayBeWeakened")
     protected GridKernalContextImpl(
@@ -419,6 +423,7 @@ public class GridKernalContextImpl implements GridKernalContext, Externalizable
         @Nullable ExecutorService idxExecSvc,
         IgniteStripedThreadPoolExecutor callbackExecSvc,
         ExecutorService qryExecSvc,
+        ExecutorService schemaExecSvc,
         List<PluginProvider> plugins
     ) {
         assert grid != null;
@@ -442,6 +447,7 @@ public class GridKernalContextImpl implements GridKernalContext, Externalizable
         this.idxExecSvc = idxExecSvc;
         this.callbackExecSvc = callbackExecSvc;
         this.qryExecSvc = qryExecSvc;
+        this.schemaExecSvc = schemaExecSvc;
 
         marshCtx = new MarshallerContextImpl(plugins);
 
@@ -987,6 +993,11 @@ public class GridKernalContextImpl implements GridKernalContext, Externalizable
     }
 
     /** {@inheritDoc} */
+    @Override public ExecutorService getSchemaExecutorService() {
+        return schemaExecSvc;
+    }
+
+    /** {@inheritDoc} */
     @Override public IgniteExceptionRegistry exceptionRegistry() {
         return IgniteExceptionRegistry.get();
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/GridTopic.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridTopic.java b/modules/core/src/main/java/org/apache/ignite/internal/GridTopic.java
index 7acc070..c382999 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/GridTopic.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/GridTopic.java
@@ -108,7 +108,10 @@ public enum GridTopic {
     TOPIC_HADOOP_MSG,
 
     /** */
-    TOPIC_METADATA_REQ;
+    TOPIC_METADATA_REQ,
+
+    /** */
+    TOPIC_SCHEMA;
 
     /** Enum values. */
     private static final GridTopic[] VALS = values();

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
index 9b41b58..922dd55 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
@@ -311,6 +311,10 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable {
 
     /** */
     @GridToStringExclude
+    private ObjectName schemaExecSvcMBean;
+
+    /** */
+    @GridToStringExclude
     private ObjectName stripedExecSvcMBean;
 
     /** Kernal start timestamp. */
@@ -694,6 +698,7 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable {
      * @param idxExecSvc Indexing executor service.
      * @param callbackExecSvc Callback executor service.
      * @param qryExecSvc Query executor service.
+     * @param schemaExecSvc Schema executor service.
      * @param errHnd Error handler to use for notification about startup problems.
      * @throws IgniteCheckedException Thrown in case of any errors.
      */
@@ -714,6 +719,7 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable {
         @Nullable ExecutorService idxExecSvc,
         IgniteStripedThreadPoolExecutor callbackExecSvc,
         ExecutorService qryExecSvc,
+        ExecutorService schemaExecSvc,
         GridAbsClosure errHnd
     )
         throws IgniteCheckedException
@@ -828,6 +834,7 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable {
                 idxExecSvc,
                 callbackExecSvc,
                 qryExecSvc,
+                schemaExecSvc,
                 plugins
             );
 
@@ -1019,7 +1026,9 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable {
             // Register MBeans.
             registerKernalMBean();
             registerLocalNodeMBean();
-            registerExecutorMBeans(execSvc, sysExecSvc, p2pExecSvc, mgmtExecSvc, restExecSvc, qryExecSvc);
+            registerExecutorMBeans(execSvc, sysExecSvc, p2pExecSvc, mgmtExecSvc, restExecSvc, qryExecSvc,
+                schemaExecSvc);
+
             registerStripedExecutorMBean(stripedExecSvc);
 
             // Lifecycle bean notifications.
@@ -1611,11 +1620,12 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable {
     }
 
     /**
-     * @param execSvc
-     * @param sysExecSvc
-     * @param p2pExecSvc
-     * @param mgmtExecSvc
-     * @param restExecSvc
+     * @param execSvc Public executor service.
+     * @param sysExecSvc System executor service.
+     * @param p2pExecSvc P2P executor service.
+     * @param mgmtExecSvc Management executor service.
+     * @param restExecSvc Query executor service.
+     * @param schemaExecSvc Schema executor service.
      * @throws IgniteCheckedException If failed.
      */
     private void registerExecutorMBeans(ExecutorService execSvc,
@@ -1623,12 +1633,14 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable {
         ExecutorService p2pExecSvc,
         ExecutorService mgmtExecSvc,
         ExecutorService restExecSvc,
-        ExecutorService qryExecSvc) throws IgniteCheckedException {
+        ExecutorService qryExecSvc,
+        ExecutorService schemaExecSvc) throws IgniteCheckedException {
         pubExecSvcMBean = registerExecutorMBean(execSvc, "GridExecutionExecutor");
         sysExecSvcMBean = registerExecutorMBean(sysExecSvc, "GridSystemExecutor");
         mgmtExecSvcMBean = registerExecutorMBean(mgmtExecSvc, "GridManagementExecutor");
         p2PExecSvcMBean = registerExecutorMBean(p2pExecSvc, "GridClassLoadingExecutor");
         qryExecSvcMBean = registerExecutorMBean(qryExecSvc, "GridQueryExecutor");
+        schemaExecSvcMBean = registerExecutorMBean(schemaExecSvc, "GridSchemaExecutor");
 
         ConnectorConfiguration clientCfg = cfg.getConnectorConfiguration();
 
@@ -2151,6 +2163,7 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable {
                     unregisterMBean(locNodeMBean) &
                     unregisterMBean(restExecSvcMBean) &
                     unregisterMBean(qryExecSvcMBean) &
+                    unregisterMBean(schemaExecSvcMBean) &
                     unregisterMBean(stripedExecSvcMBean)
             ))
                 errOnStop = false;

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/IgnitionEx.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgnitionEx.java b/modules/core/src/main/java/org/apache/ignite/internal/IgnitionEx.java
index 61e93cf..2eda01c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgnitionEx.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgnitionEx.java
@@ -1527,6 +1527,9 @@ public class IgnitionEx {
         /** Query executor service. */
         private ThreadPoolExecutor qryExecSvc;
 
+        /** Query executor service. */
+        private ThreadPoolExecutor schemaExecSvc;
+
         /** Grid state. */
         private volatile IgniteState state = STOPPED;
 
@@ -1845,6 +1848,16 @@ public class IgnitionEx {
 
             qryExecSvc.allowCoreThreadTimeOut(true);
 
+            schemaExecSvc = new IgniteThreadPoolExecutor(
+                "schema",
+                cfg.getIgniteInstanceName(),
+                2,
+                2,
+                DFLT_THREAD_KEEP_ALIVE_TIME,
+                new LinkedBlockingQueue<Runnable>());
+
+            schemaExecSvc.allowCoreThreadTimeOut(true);
+
             // Register Ignite MBean for current grid instance.
             registerFactoryMbean(myCfg.getMBeanServer());
 
@@ -1872,6 +1885,7 @@ public class IgnitionEx {
                     idxExecSvc,
                     callbackExecSvc,
                     qryExecSvc,
+                    schemaExecSvc,
                     new CA() {
                         @Override public void apply() {
                             startLatch.countDown();
@@ -2464,6 +2478,10 @@ public class IgnitionEx {
 
             qryExecSvc = null;
 
+            U.shutdownNow(getClass(), schemaExecSvc, log);
+
+            schemaExecSvc = null;
+
             U.shutdownNow(getClass(), stripedExecSvc, log);
 
             stripedExecSvc = null;

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java
index b615c35..83fc3b5 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java
@@ -97,6 +97,7 @@ import static org.apache.ignite.internal.managers.communication.GridIoPolicy.IGF
 import static org.apache.ignite.internal.managers.communication.GridIoPolicy.MANAGEMENT_POOL;
 import static org.apache.ignite.internal.managers.communication.GridIoPolicy.P2P_POOL;
 import static org.apache.ignite.internal.managers.communication.GridIoPolicy.PUBLIC_POOL;
+import static org.apache.ignite.internal.managers.communication.GridIoPolicy.SCHEMA_POOL;
 import static org.apache.ignite.internal.managers.communication.GridIoPolicy.SERVICE_POOL;
 import static org.apache.ignite.internal.managers.communication.GridIoPolicy.SYSTEM_POOL;
 import static org.apache.ignite.internal.managers.communication.GridIoPolicy.UTILITY_CACHE_POOL;
@@ -700,6 +701,7 @@ public class GridIoManager extends GridManagerAdapter<CommunicationSpi<Serializa
                 case IGFS_POOL:
                 case DATA_STREAMER_POOL:
                 case QUERY_POOL:
+                case SCHEMA_POOL:
                 case SERVICE_POOL:
                 {
                     if (msg.isOrdered())

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java
index b972a31..17e4a01 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java
@@ -137,6 +137,7 @@ import org.apache.ignite.internal.processors.igfs.IgfsFragmentizerResponse;
 import org.apache.ignite.internal.processors.igfs.IgfsSyncMessage;
 import org.apache.ignite.internal.processors.marshaller.MissingMappingRequestMessage;
 import org.apache.ignite.internal.processors.marshaller.MissingMappingResponseMessage;
+import org.apache.ignite.internal.processors.query.schema.message.SchemaOperationStatusMessage;
 import org.apache.ignite.internal.processors.query.h2.twostep.messages.GridQueryCancelRequest;
 import org.apache.ignite.internal.processors.query.h2.twostep.messages.GridQueryFailResponse;
 import org.apache.ignite.internal.processors.query.h2.twostep.messages.GridQueryNextPageRequest;
@@ -177,6 +178,11 @@ public class GridIoMessageFactory implements MessageFactory {
         Message msg = null;
 
         switch (type) {
+            case -53:
+                msg = new SchemaOperationStatusMessage();
+
+                break;
+
             case -52:
                 msg = new GridIntList();
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoPolicy.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoPolicy.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoPolicy.java
index e848633..13bc4c4 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoPolicy.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoPolicy.java
@@ -55,6 +55,9 @@ public class GridIoPolicy {
     /** Pool for service proxy executions. */
     public static final byte SERVICE_POOL = 11;
 
+    /** Schema pool.  */
+    public static final byte SCHEMA_POOL = 12;
+
     /**
      * Defines the range of reserved pools that are not available for plugins.
      * @param key The key.

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java
index 77e832e..0958208 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java
@@ -346,7 +346,8 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
                     req.startCacheConfiguration(),
                     req.cacheType(),
                     false,
-                    req.deploymentId());
+                    req.deploymentId(),
+                    req.schema());
 
                 DynamicCacheDescriptor old = registeredCaches.put(cacheId, desc);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CachePartitionExchangeWorkerTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CachePartitionExchangeWorkerTask.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CachePartitionExchangeWorkerTask.java
index ca99511..ad0dcc9 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CachePartitionExchangeWorkerTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CachePartitionExchangeWorkerTask.java
@@ -21,9 +21,5 @@ package org.apache.ignite.internal.processors.cache;
  * Cache partition exchange worker task marker interface.
  */
 public interface CachePartitionExchangeWorkerTask {
-    /**
-     * @return {@code True} if task denotes standard exchange task, {@code false} if this is a custom task which
-     * must be executed from within exchange thread.
-     */
-    boolean isExchange();
+    // No-op.
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeRequest.java
index 1e5ab88..9d2563d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeRequest.java
@@ -17,16 +17,18 @@
 
 package org.apache.ignite.internal.processors.cache;
 
-import java.io.Serializable;
-import java.util.UUID;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.NearCacheConfiguration;
 import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
+import org.apache.ignite.internal.processors.query.QuerySchema;
 import org.apache.ignite.internal.util.tostring.GridToStringExclude;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.lang.IgniteUuid;
 import org.jetbrains.annotations.Nullable;
 
+import java.io.Serializable;
+import java.util.UUID;
+
 /**
  * Cache start/stop request.
  */
@@ -83,6 +85,9 @@ public class DynamicCacheChangeRequest implements Serializable {
     /** Reset lost partitions flag. */
     private boolean resetLostPartitions;
 
+    /** Dynamic schema. */
+    private QuerySchema schema;
+
     /** */
     private transient boolean exchangeNeeded;
 
@@ -353,6 +358,20 @@ public class DynamicCacheChangeRequest implements Serializable {
         return rcvdFrom;
     }
 
+    /**
+     * @return Dynamic schema.
+     */
+    public QuerySchema schema() {
+        return schema;
+    }
+
+    /**
+     * @param schema Dynamic schema.
+     */
+    public void schema(QuerySchema schema) {
+        this.schema = schema != null ? schema.copy() : null;
+    }
+
     /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(DynamicCacheChangeRequest.class, this, "cacheName", cacheName());

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/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 5938785..92a7af3 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
@@ -24,6 +24,8 @@ import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.processors.plugin.CachePluginManager;
+import org.apache.ignite.internal.processors.query.QuerySchema;
+import org.apache.ignite.internal.processors.query.schema.message.SchemaFinishDiscoveryMessage;
 import org.apache.ignite.internal.util.tostring.GridToStringExclude;
 import org.apache.ignite.internal.util.typedef.internal.CU;
 import org.apache.ignite.internal.util.typedef.internal.S;
@@ -84,6 +86,12 @@ public class DynamicCacheDescriptor {
     /** */
     private transient AffinityTopologyVersion clientCacheStartVer;
 
+    /** Mutex to control schema. */
+    private final Object schemaMux = new Object();
+
+    /** Current schema. */
+    private QuerySchema schema;
+
     /**
      * @param ctx Context.
      * @param cacheCfg Cache configuration.
@@ -91,12 +99,15 @@ public class DynamicCacheDescriptor {
      * @param template {@code True} if this is template configuration.
      * @param deploymentId Deployment ID.
      */
+    @SuppressWarnings("unchecked")
     public DynamicCacheDescriptor(GridKernalContext ctx,
         CacheConfiguration cacheCfg,
         CacheType cacheType,
         boolean template,
-        IgniteUuid deploymentId) {
+        IgniteUuid deploymentId,
+        QuerySchema schema) {
         assert cacheCfg != null;
+        assert schema != null;
 
         this.cacheCfg = cacheCfg;
         this.cacheType = cacheType;
@@ -106,6 +117,10 @@ public class DynamicCacheDescriptor {
         pluginMgr = new CachePluginManager(ctx, cacheCfg);
 
         cacheId = CU.cacheId(cacheCfg.getName());
+
+        synchronized (schemaMux) {
+            this.schema = schema.copy();
+        }
     }
 
     /**
@@ -319,6 +334,39 @@ public class DynamicCacheDescriptor {
         this.clientCacheStartVer = clientCacheStartVer;
     }
 
+    /**
+     * @return Schema.
+     */
+    public QuerySchema schema() {
+        synchronized (schemaMux) {
+            return schema.copy();
+        }
+    }
+
+    /**
+     * Set schema
+     *
+     * @param schema Schema.
+     */
+    public void schema(QuerySchema schema) {
+        assert schema != null;
+
+        synchronized (schemaMux) {
+            this.schema = schema.copy();
+        }
+    }
+
+    /**
+     * Try applying finish message.
+     *
+     * @param msg Message.
+     */
+    public void schemaChangeFinish(SchemaFinishDiscoveryMessage msg) {
+        synchronized (schemaMux) {
+            schema.finish(msg);
+        }
+    }
+
     /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(DynamicCacheDescriptor.class, this, "cacheName", U.maskName(cacheCfg.getName()));

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryEx.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryEx.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryEx.java
index 2066342..1eab04e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryEx.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryEx.java
@@ -33,8 +33,8 @@ import org.apache.ignite.internal.processors.cache.transactions.IgniteTxKey;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersionedEntryEx;
 import org.apache.ignite.internal.processors.dr.GridDrType;
+import org.apache.ignite.internal.processors.query.schema.SchemaIndexCacheVisitorClosure;
 import org.apache.ignite.internal.util.lang.GridTuple3;
-import org.apache.ignite.internal.util.typedef.T2;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -902,6 +902,17 @@ public interface GridCacheEntryEx {
         throws IgniteCheckedException, GridCacheEntryRemovedException;
 
     /**
+     * Update index from within entry lock, passing key, value, and expiration time to provided closure.
+     *
+     * @param clo Closure to apply to key, value, and expiration time.
+     * @param link Link.
+     * @throws IgniteCheckedException If failed.
+     * @throws GridCacheEntryRemovedException If entry was removed.
+     */
+    public void updateIndex(SchemaIndexCacheVisitorClosure clo, long link) throws IgniteCheckedException,
+        GridCacheEntryRemovedException;
+
+    /**
      * @return Expire time, without accounting for transactions or removals.
      */
     public long rawExpireTime();

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java
index f4d4258..ddec684 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java
@@ -63,6 +63,7 @@ import org.apache.ignite.internal.processors.cache.version.GridCacheVersionEx;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersionedEntryEx;
 import org.apache.ignite.internal.processors.dr.GridDrType;
 import org.apache.ignite.internal.util.IgniteTree;
+import org.apache.ignite.internal.processors.query.schema.SchemaIndexCacheVisitorClosure;
 import org.apache.ignite.internal.util.lang.GridClosureException;
 import org.apache.ignite.internal.util.lang.GridMetadataAwareAdapter;
 import org.apache.ignite.internal.util.lang.GridTuple;
@@ -3374,6 +3375,22 @@ public abstract class GridCacheMapEntry extends GridMetadataAwareAdapter impleme
     }
 
     /** {@inheritDoc} */
+    @Override public void updateIndex(SchemaIndexCacheVisitorClosure clo, long link) throws IgniteCheckedException,
+        GridCacheEntryRemovedException {
+        synchronized (this) {
+            if (isInternal())
+                return;
+
+            checkObsolete();
+
+            unswap(false);
+
+            if (val != null)
+                clo.apply(key, partition(), val, ver, expireTimeUnlocked(), link);
+        }
+    }
+
+    /** {@inheritDoc} */
     @Override public <K, V> EvictableEntry<K, V> wrapEviction() {
         return new CacheEvictableEntryImpl<>(this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
index 2775aa7..4775ea1 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
@@ -78,6 +78,7 @@ import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.Gri
 import org.apache.ignite.internal.processors.cache.transactions.IgniteInternalTx;
 import org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
+import org.apache.ignite.internal.processors.query.schema.SchemaNodeLeaveExchangeWorkerTask;
 import org.apache.ignite.internal.processors.timeout.GridTimeoutObject;
 import org.apache.ignite.internal.util.GridListSet;
 import org.apache.ignite.internal.util.future.GridFutureAdapter;
@@ -309,6 +310,10 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
                     if (log.isDebugEnabled())
                         log.debug("Do not start exchange for discovery event: " + evt);
                 }
+
+                // Notify indexing engine about node leave so that we can re-map coordinator accordingly.
+                if (evt.type() == EVT_NODE_LEFT || evt.type() == EVT_NODE_FAILED)
+                    exchWorker.addCustomTask(new SchemaNodeLeaveExchangeWorkerTask(evt.eventNode()));
             }
             finally {
                 leaveBusy();
@@ -752,17 +757,6 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
     }
 
     /**
-     * Add custom task.
-     *
-     * @param task Task.
-     */
-    public void addCustomTask(CachePartitionExchangeWorkerTask task) {
-        assert !task.isExchange();
-
-        exchWorker.addCustomTask(task);
-    }
-
-    /**
      * @param evt Discovery event.
      * @return Affinity topology version.
      */
@@ -1536,6 +1530,16 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
     }
 
     /**
+     * Check if provided task from exchange queue is exchange task.
+     *
+     * @param task Task.
+     * @return {@code True} if this is exchange task.
+     */
+    private static boolean isExchangeTask(CachePartitionExchangeWorkerTask task) {
+        return task instanceof GridDhtPartitionsExchangeFuture;
+    }
+
+    /**
      * @param exchTopVer Exchange topology version.
      */
     private void dumpPendingObjects(@Nullable AffinityTopologyVersion exchTopVer) {
@@ -1682,7 +1686,7 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
         void addCustomTask(CachePartitionExchangeWorkerTask task) {
             assert task != null;
 
-            assert !task.isExchange();
+            assert !isExchangeTask(task);
 
             futQ.offer(task);
         }
@@ -1693,6 +1697,8 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
          * @param task Task.
          */
         void processCustomTask(CachePartitionExchangeWorkerTask task) {
+            assert !isExchangeTask(task);
+
             try {
                 cctx.cache().processCustomExchangeTask(task);
             }
@@ -1707,7 +1713,7 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
         boolean hasPendingExchange() {
             if (!futQ.isEmpty()) {
                 for (CachePartitionExchangeWorkerTask task : futQ) {
-                    if (task.isExchange())
+                    if (isExchangeTask(task))
                         return true;
                 }
             }
@@ -1722,7 +1728,7 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
             U.warn(log, "Pending exchange futures:");
 
             for (CachePartitionExchangeWorkerTask task: futQ) {
-                if (task.isExchange())
+                if (isExchangeTask(task))
                     U.warn(log, ">>> " + task);
             }
         }
@@ -1773,7 +1779,7 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
                     if (task == null)
                         continue; // Main while loop.
 
-                    if (!task.isExchange()) {
+                    if (!isExchangeTask(task)) {
                         processCustomTask(task);
 
                         continue;


[43/70] [abbrv] ignite git commit: Merge remote-tracking branch 'origin/ignite-2.0' into ignite-2.0

Posted by sb...@apache.org.
Merge remote-tracking branch 'origin/ignite-2.0' into 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/2ded758a
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/2ded758a
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/2ded758a

Branch: refs/heads/ignite-2893
Commit: 2ded758ad1f1663aea05ca943ecf509b1574c0bf
Parents: 22d5e55 d383484
Author: devozerov <vo...@gridgain.com>
Authored: Wed Apr 19 12:54:34 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Wed Apr 19 12:54:34 2017 +0300

----------------------------------------------------------------------
 .../junits/common/GridCommonAbstractTest.java   | 34 ++++++++++++++++++++
 1 file changed, 34 insertions(+)
----------------------------------------------------------------------



[46/70] [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/15359bc0
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/15359bc0
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/15359bc0

Branch: refs/heads/ignite-2893
Commit: 15359bc0b048c1a6a4093ea8998b343374667d43
Parents: b47f29d
Author: Andrey V. Mashenkov <an...@gmail.com>
Authored: Wed Apr 19 06:30:30 2017 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Wed Apr 19 14:03:12 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/15359bc0/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/15359bc0/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/15359bc0/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


[69/70] [abbrv] ignite git commit: Merge remote-tracking branch 'remotes/origin/ignite-2.0' into ignite-2893

Posted by sb...@apache.org.
Merge remote-tracking branch 'remotes/origin/ignite-2.0' into ignite-2893

# Conflicts:
#	modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java
#	modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheAtomicLongImpl.java
#	modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheAtomicReferenceImpl.java
#	modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheSemaphoreImpl.java
#	modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteOnePhaseCommitInvokeTest.java
#	modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
#	modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite2.java


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/81835e48
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/81835e48
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/81835e48

Branch: refs/heads/ignite-2893
Commit: 81835e48dcaeeb3d899cb054570bec511dbc60dc
Parents: 6372435 a4c3970
Author: sboikov <sb...@gridgain.com>
Authored: Thu Apr 20 10:38:34 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Thu Apr 20 10:38:34 2017 +0300

----------------------------------------------------------------------
 .gitignore                                      |   31 +-
 DEVNOTES.txt                                    |    3 -
 assembly/dependencies-fabric-lgpl.xml           |    3 -
 assembly/dependencies-fabric.xml                |    4 +-
 assembly/dependencies-schema-import.xml         |   57 -
 assembly/libs/README.txt                        |    1 +
 assembly/release-base.xml                       |    2 -
 assembly/release-fabric-base.xml                |   20 +-
 assembly/release-schema-import.xml              |   50 -
 bin/control.bat                                 |  229 +
 bin/control.sh                                  |  180 +
 bin/ignite-schema-import.bat                    |  110 -
 bin/ignite-schema-import.sh                     |   87 -
 config/dotnet/default-dotnet.xml                |   45 -
 doap_Ignite.rdf                                 |   11 +-
 examples/README-LGPL.txt                        |    4 +-
 examples/README.txt                             |   12 +-
 examples/config/example-memory-policies.xml     |  105 +
 examples/config/filesystem/example-igfs.xml     |    7 -
 examples/pom-standalone-lgpl.xml                |   26 +-
 examples/pom-standalone.xml                     |   26 +-
 examples/pom.xml                                |   37 +-
 examples/schema-import/README.txt               |   38 -
 examples/schema-import/bin/db-init.sql          |   28 -
 examples/schema-import/bin/h2-server.bat        |   80 -
 examples/schema-import/bin/h2-server.sh         |   66 -
 .../schema-import/bin/schema-import.properties  |   28 -
 examples/schema-import/pom-standalone.xml       |   90 -
 examples/schema-import/pom.xml                  |  101 -
 .../org/apache/ignite/schema/CacheConfig.java   |   36 -
 .../java/org/apache/ignite/schema/Demo.java     |  134 -
 .../java/org/apache/ignite/schema/DemoNode.java |   38 -
 .../ignite/schema/H2DataSourceFactory.java      |   35 -
 .../java/org/apache/ignite/schema/Person.java   |   44 -
 .../org/apache/ignite/schema/PersonKey.java     |   37 -
 .../datagrid/MemoryPoliciesExample.java         |  114 +
 .../starschema/CacheStarSchemaExample.java      |   59 +-
 .../MemcacheRestExampleNodeStartup.java         |    7 -
 .../examples/springdata/PersonRepository.java   |   59 +
 .../examples/springdata/SpringAppCfg.java       |   69 +
 .../examples/springdata/SpringDataExample.java  |  154 +
 .../CholeskyDecompositionExample.java           |   80 +
 .../EigenDecompositionExample.java              |   69 +
 .../decompositions/LUDecompositionExample.java  |   83 +
 .../SingularValueDecompositionExample.java      |   70 +
 .../ml/math/decompositions/package-info.java    |   22 +
 .../ml/math/matrix/CacheMatrixExample.java      |   91 +
 .../ml/math/matrix/ExampleMatrixStorage.java    |  162 +
 .../math/matrix/MatrixCustomStorageExample.java |  141 +
 .../examples/ml/math/matrix/MatrixExample.java  |   79 +
 .../ml/math/matrix/MatrixExampleUtil.java       |   52 +
 .../ml/math/matrix/OffHeapMatrixExample.java    |   84 +
 .../matrix/SparseDistributedMatrixExample.java  |   66 +
 .../ml/math/matrix/SparseMatrixExample.java     |   84 +
 .../examples/ml/math/matrix/package-info.java   |   22 +
 .../ignite/examples/ml/math/package-info.java   |   22 +
 .../examples/ml/math/tracer/TracerExample.java  |   63 +
 .../examples/ml/math/tracer/package-info.java   |   22 +
 .../ml/math/vector/CacheVectorExample.java      |  102 +
 .../ml/math/vector/ExampleVectorStorage.java    |  126 +
 .../ml/math/vector/OffHeapVectorExample.java    |   78 +
 .../ml/math/vector/SparseVectorExample.java     |   80 +
 .../math/vector/VectorCustomStorageExample.java |  124 +
 .../examples/ml/math/vector/VectorExample.java  |   75 +
 .../examples/ml/math/vector/package-info.java   |   22 +
 .../examples/ScalarCacheAffinityExample.scala   |    2 +-
 .../ignite/examples/CacheExamplesSelfTest.java  |    8 +
 .../examples/SpringDataExampleSelfTest.java     |   32 +
 .../testsuites/IgniteExamplesSelfTestSuite.java |    2 +
 .../optimized/OptimizedMarshallerAopTest.java   |  105 +
 .../optimized/OptimizedMarshallerAopTest.java   |  104 -
 modules/aws/pom.xml                             |    6 +-
 .../jmh/future/JmhFutureAdapterBenchmark.java   |  145 +
 .../benchmarks/jmh/tree/BPlusTreeBenchmark.java |  326 ++
 .../store/cassandra/datasource/DataSource.java  |   50 +-
 .../cassandra/session/CassandraSessionImpl.java |   23 +-
 .../cassandra/session/pool/SessionPool.java     |    6 +-
 .../cassandra/session/pool/SessionWrapper.java  |   15 +-
 .../ignite/ignite-cassandra-server-template.xml |    6 -
 .../tests/ignite-cassandra-client-template.xml  |    6 -
 modules/clients/src/test/config/jdbc-config.xml |    2 +-
 .../integration/ClientAbstractSelfTest.java     |    6 -
 .../jdbc2/JdbcAbstractDmlStatementSelfTest.java |   92 +-
 ...BinaryMarshallerInsertStatementSelfTest.java |    9 +-
 ...cBinaryMarshallerMergeStatementSelfTest.java |    9 +-
 .../jdbc2/JdbcComplexQuerySelfTest.java         |   82 +-
 .../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/JdbcLocalCachesSelfTest.java |   30 +-
 .../internal/jdbc2/JdbcMetadataSelfTest.java    |   96 +-
 .../jdbc2/JdbcPreparedStatementSelfTest.java    |   53 +-
 .../rest/ChangeStateCommandHandlerTest.java     |  125 +
 .../JettyRestProcessorAbstractSelfTest.java     |  166 +-
 .../ignite/jdbc/JdbcComplexQuerySelfTest.java   |   44 +-
 .../ignite/jdbc/JdbcMetadataSelfTest.java       |  103 +-
 .../jdbc/suite/IgniteJdbcDriverTestSuite.java   |    8 +
 .../ignite/codegen/MessageCodeGenerator.java    |    6 +
 modules/core/pom.xml                            |    3 +
 .../src/main/java/org/apache/ignite/Ignite.java |   31 +-
 .../java/org/apache/ignite/IgniteCache.java     |  302 +-
 .../apache/ignite/IgniteCheckedException.java   |   12 +
 .../java/org/apache/ignite/IgniteCluster.java   |   52 -
 .../org/apache/ignite/IgniteFileSystem.java     |    2 +-
 .../apache/ignite/IgniteSystemProperties.java   |   61 +-
 .../java/org/apache/ignite/MemoryMetrics.java   |   95 +
 .../binary/BinaryAbstractIdentityResolver.java  |   53 -
 .../binary/BinaryArrayIdentityResolver.java     |  224 -
 .../ignite/binary/BinaryBasicNameMapper.java    |    3 +
 .../binary/BinaryFieldIdentityResolver.java     |  307 --
 .../ignite/binary/BinaryIdentityResolver.java   |   42 -
 .../ignite/binary/BinaryTypeConfiguration.java  |   25 -
 .../ignite/cache/CacheAtomicWriteOrderMode.java |   64 -
 .../org/apache/ignite/cache/CacheEntry.java     |   12 -
 .../apache/ignite/cache/CacheMemoryMode.java    |   63 -
 .../org/apache/ignite/cache/CacheMetrics.java   |   70 -
 .../org/apache/ignite/cache/CachePeekMode.java  |    6 +-
 .../cache/CacheWriteSynchronizationMode.java    |    4 +-
 .../ignite/cache/PartitionLossPolicy.java       |   80 +
 .../org/apache/ignite/cache/QueryEntity.java    |   82 +-
 .../org/apache/ignite/cache/QueryIndex.java     |   30 +
 .../org/apache/ignite/cache/QueryIndexType.java |   17 +-
 .../cache/affinity/AffinityKeyMapped.java       |   14 +-
 .../AffinityNodeAddressHashResolver.java        |   44 -
 .../affinity/AffinityNodeHashResolver.java      |   47 -
 .../affinity/AffinityNodeIdHashResolver.java    |   45 -
 .../affinity/fair/FairAffinityFunction.java     | 1158 -----
 .../cache/affinity/fair/package-info.java       |   21 -
 .../rendezvous/RendezvousAffinityFunction.java  |  359 +-
 .../ignite/cache/query/SqlFieldsQuery.java      |   25 +
 .../org/apache/ignite/cache/query/SqlQuery.java |   31 +-
 .../store/jdbc/CacheAbstractJdbcStore.java      |   48 +-
 .../cache/store/jdbc/CacheJdbcPojoStore.java    |    1 -
 .../configuration/CacheConfiguration.java       |  596 +--
 .../configuration/CollectionConfiguration.java  |   22 -
 .../configuration/DataPageEvictionMode.java     |   53 +
 .../configuration/FileSystemConfiguration.java  |  234 +-
 .../configuration/IgniteConfiguration.java      |  180 +-
 .../configuration/MemoryConfiguration.java      |  214 +
 .../MemoryPolicyConfiguration.java              |  216 +
 .../configuration/NearCacheConfiguration.java   |   57 +-
 .../org/apache/ignite/hadoop/package-info.java  |   22 +
 .../java/org/apache/ignite/igfs/IgfsPath.java   |   31 +-
 .../ignite/internal/GridCachePluginContext.java |   13 +-
 .../apache/ignite/internal/GridComponent.java   |   15 +-
 .../internal/GridEventConsumeHandler.java       |    5 +-
 .../ignite/internal/GridKernalContext.java      |   47 +-
 .../ignite/internal/GridKernalContextImpl.java  |   80 +-
 .../internal/GridMessageListenHandler.java      |    5 +-
 .../ignite/internal/GridPluginComponent.java    |    4 +-
 .../org/apache/ignite/internal/GridTopic.java   |    7 +-
 .../ignite/internal/IgniteEventsImpl.java       |    8 +-
 .../org/apache/ignite/internal/IgniteEx.java    |    2 +-
 .../ignite/internal/IgniteInternalFuture.java   |   15 -
 .../apache/ignite/internal/IgniteKernal.java    |  352 +-
 .../ignite/internal/IgniteNodeAttributes.java   |    3 +
 .../org/apache/ignite/internal/IgnitionEx.java  |   63 +-
 .../apache/ignite/internal/LessNamingBean.java  |   28 -
 .../ignite/internal/MarshallerContextImpl.java  |   14 +-
 .../binary/BinaryAbstractIdentityResolver.java  |   56 +
 .../binary/BinaryArrayIdentityResolver.java     |  222 +
 .../internal/binary/BinaryClassDescriptor.java  |    2 +-
 .../ignite/internal/binary/BinaryContext.java   |   20 +-
 .../internal/binary/BinaryEnumObjectImpl.java   |   39 +-
 .../ignite/internal/binary/BinaryFieldEx.java   |   45 +
 .../ignite/internal/binary/BinaryFieldImpl.java |  173 +-
 .../internal/binary/BinaryIdentityResolver.java |   43 +
 .../ignite/internal/binary/BinaryMetadata.java  |    1 +
 .../internal/binary/BinaryObjectExImpl.java     |   11 +-
 .../internal/binary/BinaryObjectImpl.java       |  137 +
 .../binary/BinaryObjectOffheapImpl.java         |   26 +
 .../internal/binary/BinaryReaderExImpl.java     |    2 +-
 .../ignite/internal/binary/BinarySchema.java    |   11 +
 .../ignite/internal/binary/BinaryUtils.java     |   14 +-
 .../internal/binary/BinaryWriterExImpl.java     |    1 -
 .../binary/builder/BinaryBuilderReader.java     |    8 +
 .../binary/builder/BinaryObjectBuilderImpl.java |   36 +-
 .../streams/BinaryByteBufferInputStream.java    |  301 ++
 .../ignite/internal/client/GridClient.java      |    9 +
 .../internal/client/GridClientClusterState.java |   33 +
 .../client/impl/GridClientClusterStateImpl.java |   75 +
 .../internal/client/impl/GridClientImpl.java    |   11 +
 .../impl/connection/GridClientConnection.java   |   17 +
 .../connection/GridClientNioTcpConnection.java  |   21 +
 .../GridClientOptimizedMarshaller.java          |    2 +-
 .../GridClientZipOptimizedMarshaller.java       |    2 +-
 .../router/impl/GridRouterClientImpl.java       |    6 +
 .../cluster/IgniteClusterAsyncImpl.java         |   11 -
 .../internal/cluster/IgniteClusterImpl.java     |   38 -
 .../internal/commandline/CommandHandler.java    |   89 +
 .../igfs/common/IgfsControlResponse.java        |   28 +
 .../internal/igfs/common/IgfsIpcCommand.java    |    5 +-
 .../ignite/internal/igfs/common/IgfsLogger.java |   60 +-
 .../internal/igfs/common/IgfsMarshaller.java    |   12 +
 .../igfs/common/IgfsModeResolverRequest.java    |   35 +
 .../ignite/internal/jdbc2/JdbcQueryTask.java    |   41 +-
 .../ignite/internal/jdbc2/JdbcQueryTaskV2.java  |  406 --
 .../ignite/internal/jdbc2/JdbcResultSet.java    |   64 +-
 .../ignite/internal/jdbc2/JdbcStatement.java    |   12 +-
 .../internal/managers/GridManagerAdapter.java   |   38 +-
 .../checkpoint/GridCheckpointManager.java       |    2 +-
 .../collision/GridCollisionManager.java         |    2 +-
 .../managers/communication/GridIoManager.java   |   28 +-
 .../communication/GridIoMessageFactory.java     |   72 +-
 .../managers/communication/GridIoPolicy.java    |    3 +
 .../communication/IgniteIoTestMessage.java      |   11 +-
 .../deployment/GridDeploymentManager.java       |    2 +-
 .../discovery/GridDiscoveryManager.java         |   76 +-
 .../eventstorage/GridEventStorageManager.java   |  355 +-
 .../managers/failover/GridFailoverManager.java  |    2 +-
 .../managers/indexing/GridIndexingManager.java  |    2 +-
 .../loadbalancer/GridLoadBalancerManager.java   |    2 +-
 .../swapspace/GridSwapSpaceManager.java         |  417 --
 .../managers/swapspace/package-info.java        |   22 -
 .../optimized/OptimizedClassDescriptor.java     | 1141 +++++
 .../optimized/OptimizedFieldType.java           |   50 +
 .../optimized/OptimizedMarshaller.java          |  313 ++
 .../optimized/OptimizedMarshallerIdMapper.java  |   33 +
 .../optimized/OptimizedMarshallerUtils.java     |  551 ++
 .../optimized/OptimizedObjectInputStream.java   | 1231 +++++
 .../optimized/OptimizedObjectOutputStream.java  |  875 ++++
 .../OptimizedObjectStreamRegistry.java          |  244 +
 .../ignite/internal/mem/DirectMemory.java       |   55 +
 .../internal/mem/DirectMemoryProvider.java      |   25 +
 .../ignite/internal/mem/DirectMemoryRegion.java |   41 +
 .../mem/IgniteOutOfMemoryException.java         |   51 +
 .../apache/ignite/internal/mem/UnsafeChunk.java |   66 +
 .../ignite/internal/mem/file/MappedFile.java    |  152 +
 .../mem/file/MappedFileMemoryProvider.java      |  225 +
 .../mem/unsafe/UnsafeMemoryProvider.java        |   89 +
 .../ignite/internal/pagemem/FullPageId.java     |  157 +
 .../internal/pagemem/PageIdAllocator.java       |   53 +
 .../ignite/internal/pagemem/PageIdUtils.java    |  201 +
 .../ignite/internal/pagemem/PageMemory.java     |   46 +
 .../ignite/internal/pagemem/PageSupport.java    |  114 +
 .../ignite/internal/pagemem/PageUtils.java      |  185 +
 .../pagemem/impl/PageMemoryNoStoreImpl.java     |  675 +++
 .../snapshot/SnapshotFinishedMessage.java       |  136 +
 .../snapshot/SnapshotProgressMessage.java       |  135 +
 .../StartFullSnapshotAckDiscoveryMessage.java   |  147 +
 .../StartFullSnapshotDiscoveryMessage.java      |  160 +
 .../pagemem/store/IgnitePageStoreManager.java   |  192 +
 .../internal/pagemem/store/PageStore.java       |   96 +
 .../pagemem/wal/IgniteWriteAheadLogManager.java |   86 +
 .../internal/pagemem/wal/StorageException.java  |   44 +
 .../internal/pagemem/wal/WALIterator.java       |   29 +
 .../ignite/internal/pagemem/wal/WALPointer.java |   28 +
 .../internal/pagemem/wal/record/CacheState.java |   96 +
 .../pagemem/wal/record/CheckpointRecord.java    |  112 +
 .../internal/pagemem/wal/record/DataEntry.java  |  171 +
 .../internal/pagemem/wal/record/DataRecord.java |   70 +
 .../pagemem/wal/record/LazyDataEntry.java       |  116 +
 .../wal/record/MemoryRecoveryRecord.java        |   44 +
 .../pagemem/wal/record/PageSnapshot.java        |   81 +
 .../wal/record/StoreOperationRecord.java        |  118 +
 .../internal/pagemem/wal/record/TxRecord.java   |  111 +
 .../internal/pagemem/wal/record/WALRecord.java  |  257 +
 .../delta/DataPageInsertFragmentRecord.java     |   84 +
 .../wal/record/delta/DataPageInsertRecord.java  |   66 +
 .../wal/record/delta/DataPageRemoveRecord.java  |   67 +
 .../delta/DataPageSetFreeListPageRecord.java    |   62 +
 .../wal/record/delta/DataPageUpdateRecord.java  |   79 +
 .../record/delta/DeltaApplicationException.java |   35 +
 .../wal/record/delta/FixCountRecord.java        |   57 +
 .../record/delta/FixLeftmostChildRecord.java    |   58 +
 .../pagemem/wal/record/delta/FixRemoveId.java   |   62 +
 .../wal/record/delta/InitNewPageRecord.java     |   98 +
 .../wal/record/delta/InnerReplaceRecord.java    |   96 +
 .../pagemem/wal/record/delta/InsertRecord.java  |  110 +
 .../pagemem/wal/record/delta/MergeRecord.java   |   97 +
 .../wal/record/delta/MetaPageAddRootRecord.java |   57 +
 .../wal/record/delta/MetaPageCutRootRecord.java |   48 +
 .../wal/record/delta/MetaPageInitRecord.java    |   93 +
 .../delta/MetaPageInitRootInlineRecord.java     |   62 +
 .../record/delta/MetaPageInitRootRecord.java    |   61 +
 .../delta/MetaPageUpdateLastAllocatedIndex.java |   62 +
 ...aPageUpdateLastSuccessfulFullSnapshotId.java |   59 +
 .../MetaPageUpdateLastSuccessfulSnapshotId.java |   70 +
 .../delta/MetaPageUpdateNextSnapshotId.java     |   59 +
 .../MetaPageUpdatePartitionDataRecord.java      |  107 +
 .../wal/record/delta/NewRootInitRecord.java     |  115 +
 .../wal/record/delta/PageDeltaRecord.java       |   77 +
 .../delta/PageListMetaResetCountRecord.java     |   47 +
 .../record/delta/PagesListAddPageRecord.java    |   73 +
 .../delta/PagesListInitNewPageRecord.java       |  100 +
 .../record/delta/PagesListRemovePageRecord.java |   74 +
 .../record/delta/PagesListSetNextRecord.java    |   60 +
 .../delta/PagesListSetPreviousRecord.java       |   60 +
 .../record/delta/PartitionMetaStateRecord.java  |   82 +
 .../pagemem/wal/record/delta/RecycleRecord.java |   55 +
 .../pagemem/wal/record/delta/RemoveRecord.java  |   82 +
 .../pagemem/wal/record/delta/ReplaceRecord.java |   86 +
 .../record/delta/SplitExistingPageRecord.java   |   76 +
 .../record/delta/SplitForwardPageRecord.java    |  115 +
 .../record/delta/TrackingPageDeltaRecord.java   |   85 +
 .../processors/GridProcessorAdapter.java        |    4 +-
 .../affinity/GridAffinityProcessor.java         |    2 +-
 .../cache/CacheAffinitySharedManager.java       |   38 +-
 .../cache/CacheClusterMetricsMXBeanImpl.java    |   50 -
 .../processors/cache/CacheEntryImplEx.java      |    8 +-
 .../cache/CacheEntryPredicateAdapter.java       |    7 +-
 .../cache/CacheEvictableEntryImpl.java          |   18 +-
 .../processors/cache/CacheEvictionManager.java  |   63 +
 .../cache/CacheInvalidStateException.java       |   65 +
 .../processors/cache/CacheLazyEntry.java        |    2 +-
 .../cache/CacheLocalMetricsMXBeanImpl.java      |   50 -
 .../processors/cache/CacheMetricsImpl.java      |  157 +-
 .../processors/cache/CacheMetricsSnapshot.java  |  120 -
 .../internal/processors/cache/CacheObject.java  |   33 +
 .../processors/cache/CacheObjectAdapter.java    |  123 +
 .../cache/CacheObjectByteArrayImpl.java         |   26 +-
 .../processors/cache/CacheObjectImpl.java       |   16 +-
 .../cache/CacheOffheapEvictionManager.java      |   72 +
 .../processors/cache/CacheOperationContext.java |   50 +-
 .../cache/CacheOsConflictResolutionManager.java |    2 +-
 .../cache/CachePartitionExchangeWorkerTask.java |    6 +-
 .../cache/ChangeGlobalStateMessage.java         |  120 +
 .../internal/processors/cache/ClusterState.java |   38 +
 .../cache/DynamicCacheChangeRequest.java        |   94 +-
 .../cache/DynamicCacheDescriptor.java           |   67 +-
 .../processors/cache/GridCacheAdapter.java      |  865 ++--
 .../cache/GridCacheAffinityManager.java         |    2 +-
 .../processors/cache/GridCacheAtomicFuture.java |    2 +-
 .../cache/GridCacheAtomicVersionComparator.java |   24 +-
 .../processors/cache/GridCacheAttributes.java   |   37 -
 .../cache/GridCacheClearAllRunnable.java        |   54 +-
 .../cache/GridCacheCompoundFuture.java          |   63 +
 .../cache/GridCacheCompoundIdentityFuture.java  |   63 +
 .../cache/GridCacheConcurrentMap.java           |    9 +-
 .../cache/GridCacheConcurrentMapImpl.java       |  234 +-
 .../processors/cache/GridCacheContext.java      |  180 +-
 .../GridCacheDefaultAffinityKeyMapper.java      |   38 +-
 .../cache/GridCacheDeploymentManager.java       |    6 +-
 .../processors/cache/GridCacheEntryEx.java      |   71 +-
 .../cache/GridCacheEvictionManager.java         | 1822 +------
 .../cache/GridCacheEvictionRequest.java         |  248 -
 .../cache/GridCacheEvictionResponse.java        |  225 -
 .../processors/cache/GridCacheFuture.java       |   15 +
 .../cache/GridCacheFutureAdapter.java           |   61 +
 .../processors/cache/GridCacheIoManager.java    |   14 -
 .../cache/GridCacheLocalConcurrentMap.java      |   54 +
 .../processors/cache/GridCacheManager.java      |    3 +-
 .../cache/GridCacheManagerAdapter.java          |    7 +-
 .../processors/cache/GridCacheMapEntry.java     | 2902 ++++++-----
 .../processors/cache/GridCacheMvcc.java         |   23 +-
 .../processors/cache/GridCacheMvccManager.java  |   84 +-
 .../cache/GridCacheOffheapSwapEntry.java        |  191 -
 .../GridCachePartitionExchangeManager.java      |  218 +-
 .../processors/cache/GridCachePreloader.java    |    5 +-
 .../cache/GridCachePreloaderAdapter.java        |    5 +-
 .../processors/cache/GridCacheProcessor.java    | 1155 +++--
 .../processors/cache/GridCacheProxyImpl.java    |   95 +-
 .../cache/GridCacheSharedContext.java           |  114 +-
 .../cache/GridCacheSharedManagerAdapter.java    |    7 +
 .../cache/GridCacheSharedTtlCleanupManager.java |    9 +
 .../cache/GridCacheSwapEntryImpl.java           |    4 +-
 .../processors/cache/GridCacheSwapManager.java  | 2616 ----------
 .../processors/cache/GridCacheTtlManager.java   |  120 +-
 .../cache/GridCacheUpdateAtomicResult.java      |   96 +-
 .../processors/cache/GridCacheUtils.java        |  120 +-
 .../GridChangeGlobalStateMessageResponse.java   |  177 +
 .../cache/GridDeferredAckMessageSender.java     |   11 +-
 .../processors/cache/GridNoStorageCacheMap.java |   11 +-
 .../cache/IgniteCacheOffheapManager.java        |  408 ++
 .../cache/IgniteCacheOffheapManagerImpl.java    | 2007 ++++++++
 .../processors/cache/IgniteCacheProxy.java      |  143 +-
 .../processors/cache/IgniteInternalCache.java   |  100 +-
 .../cache/IgniteRebalanceIterator.java          |   31 +
 .../processors/cache/IncompleteCacheObject.java |   84 +
 .../processors/cache/IncompleteObject.java      |   89 +
 .../binary/CacheObjectBinaryProcessorImpl.java  |   22 +-
 .../cache/binary/MetadataRequestMessage.java    |    2 +
 .../cache/binary/MetadataResponseMessage.java   |   36 +-
 .../processors/cache/database/CacheDataRow.java |   62 +
 .../cache/database/CacheDataRowAdapter.java     |  578 +++
 .../cache/database/CacheSearchRow.java          |   40 +
 .../cache/database/DataStructure.java           |  384 ++
 .../IgniteCacheDatabaseSharedManager.java       |  723 +++
 .../cache/database/MemoryMetricsImpl.java       |  314 ++
 .../processors/cache/database/MemoryPolicy.java |   84 +
 .../processors/cache/database/MetaStore.java    |   51 +
 .../cache/database/MetadataStorage.java         |  417 ++
 .../processors/cache/database/RootPage.java     |   62 +
 .../processors/cache/database/RowStore.java     |   91 +
 .../evict/FairFifoPageEvictionTracker.java      |   74 +
 .../database/evict/NoOpPageEvictionTracker.java |   50 +
 .../evict/PageAbstractEvictionTracker.java      |  243 +
 .../database/evict/PageEvictionTracker.java     |   52 +
 .../evict/Random2LruPageEvictionTracker.java    |  180 +
 .../evict/RandomLruPageEvictionTracker.java     |  157 +
 .../cache/database/freelist/FreeList.java       |   51 +
 .../cache/database/freelist/FreeListImpl.java   |  595 +++
 .../cache/database/freelist/PagesList.java      | 1450 ++++++
 .../database/freelist/io/PagesListMetaIO.java   |  186 +
 .../database/freelist/io/PagesListNodeIO.java   |  231 +
 .../cache/database/tree/BPlusTree.java          | 4754 ++++++++++++++++++
 .../cache/database/tree/io/BPlusIO.java         |  403 ++
 .../cache/database/tree/io/BPlusInnerIO.java    |  180 +
 .../cache/database/tree/io/BPlusLeafIO.java     |   56 +
 .../cache/database/tree/io/BPlusMetaIO.java     |  182 +
 .../cache/database/tree/io/CacheVersionIO.java  |  184 +
 .../cache/database/tree/io/DataPageIO.java      | 1450 ++++++
 .../cache/database/tree/io/DataPagePayload.java |   64 +
 .../cache/database/tree/io/IOVersions.java      |   99 +
 .../cache/database/tree/io/PageIO.java          |  510 ++
 .../cache/database/tree/io/PageMetaIO.java      |  217 +
 .../database/tree/io/PagePartitionMetaIO.java   |  123 +
 .../cache/database/tree/io/TrackingPageIO.java  |  334 ++
 .../cache/database/tree/reuse/ReuseBag.java     |   33 +
 .../cache/database/tree/reuse/ReuseList.java    |   43 +
 .../database/tree/reuse/ReuseListImpl.java      |   95 +
 .../cache/database/tree/util/PageHandler.java   |  512 ++
 .../database/tree/util/PageLockListener.java    |   69 +
 .../distributed/GridCacheTxRecoveryFuture.java  |    9 +-
 .../GridDistributedCacheAdapter.java            |   76 +-
 .../distributed/GridDistributedTxMapping.java   |   68 +-
 .../GridDistributedTxRemoteAdapter.java         |  444 +-
 .../dht/CacheDistributedGetFutureAdapter.java   |   11 +-
 .../dht/GridCachePartitionedConcurrentMap.java  |   20 +-
 .../dht/GridClientPartitionTopology.java        |  166 +-
 .../distributed/dht/GridDhtCacheAdapter.java    |   80 +-
 .../distributed/dht/GridDhtCacheEntry.java      |   35 +-
 .../cache/distributed/dht/GridDhtGetFuture.java |   13 +-
 .../distributed/dht/GridDhtGetSingleFuture.java |   13 +-
 .../distributed/dht/GridDhtLocalPartition.java  |  752 ++-
 .../distributed/dht/GridDhtLockFuture.java      |   42 +-
 .../dht/GridDhtOffHeapCacheEntry.java           |   71 -
 .../distributed/dht/GridDhtPartitionState.java  |    5 +-
 .../dht/GridDhtPartitionTopology.java           |   63 +-
 .../dht/GridDhtPartitionTopologyImpl.java       |  652 ++-
 .../distributed/dht/GridDhtTopologyFuture.java  |   13 +-
 .../dht/GridDhtTransactionalCacheAdapter.java   |    2 -
 .../distributed/dht/GridDhtTxFinishFuture.java  |   11 +-
 .../cache/distributed/dht/GridDhtTxLocal.java   |    2 +-
 .../distributed/dht/GridDhtTxLocalAdapter.java  |   26 +-
 .../distributed/dht/GridDhtTxPrepareFuture.java |   38 +-
 .../dht/GridPartitionedGetFuture.java           |   30 +-
 .../dht/GridPartitionedSingleGetFuture.java     |   36 +-
 .../GridDhtAtomicAbstractUpdateFuture.java      |    8 +-
 .../GridDhtAtomicAbstractUpdateRequest.java     |   14 +
 .../dht/atomic/GridDhtAtomicCache.java          |  400 +-
 .../dht/atomic/GridDhtAtomicNearResponse.java   |    2 +-
 .../atomic/GridDhtAtomicOffHeapCacheEntry.java  |   71 -
 .../GridDhtAtomicSingleUpdateRequest.java       |   21 +-
 .../dht/atomic/GridDhtAtomicUpdateRequest.java  |   52 +-
 ...idNearAtomicAbstractSingleUpdateRequest.java |    3 +-
 .../GridNearAtomicAbstractUpdateFuture.java     |   14 +-
 .../GridNearAtomicAbstractUpdateRequest.java    |   20 +
 .../GridNearAtomicCheckUpdateRequest.java       |    2 +-
 .../atomic/GridNearAtomicFullUpdateRequest.java |    6 +-
 ...GridNearAtomicSingleUpdateFilterRequest.java |    5 +-
 .../GridNearAtomicSingleUpdateFuture.java       |   52 +-
 ...GridNearAtomicSingleUpdateInvokeRequest.java |    5 +-
 .../GridNearAtomicSingleUpdateRequest.java      |    5 +-
 .../dht/atomic/GridNearAtomicUpdateFuture.java  |   52 +-
 .../atomic/GridNearAtomicUpdateResponse.java    |    3 +
 .../dht/atomic/NearCacheUpdates.java            |    2 +-
 .../distributed/dht/atomic/UpdateErrors.java    |    2 +-
 .../dht/colocated/GridDhtColocatedCache.java    |   37 +-
 .../colocated/GridDhtColocatedLockFuture.java   |   62 +-
 .../GridDhtColocatedOffHeapCacheEntry.java      |   71 -
 .../colocated/GridDhtDetachedCacheEntry.java    |   18 +-
 .../dht/preloader/GridDhtForceKeysFuture.java   |   10 +-
 .../GridDhtPartitionDemandMessage.java          |   49 +-
 .../dht/preloader/GridDhtPartitionDemander.java |   89 +-
 .../dht/preloader/GridDhtPartitionMap.java      |   13 +-
 .../dht/preloader/GridDhtPartitionSupplier.java |  624 +--
 .../GridDhtPartitionSupplyMessage.java          |  103 +-
 .../GridDhtPartitionSupplyMessageV2.java        |  384 --
 .../GridDhtPartitionsAbstractMessage.java       |   12 +-
 .../GridDhtPartitionsExchangeFuture.java        |  590 ++-
 .../preloader/GridDhtPartitionsFullMessage.java |   83 +-
 .../GridDhtPartitionsSingleMessage.java         |   81 +-
 .../GridDhtPartitionsSingleRequest.java         |    8 +
 .../dht/preloader/GridDhtPreloader.java         |   80 +-
 .../distributed/near/GridNearAtomicCache.java   |   18 +-
 .../distributed/near/GridNearCacheAdapter.java  |   63 +-
 .../distributed/near/GridNearCacheEntry.java    |   22 +-
 .../distributed/near/GridNearGetFuture.java     |   22 +-
 .../distributed/near/GridNearGetRequest.java    |   50 +-
 .../distributed/near/GridNearLockFuture.java    |   34 +-
 .../near/GridNearOffHeapCacheEntry.java         |   60 -
 ...arOptimisticSerializableTxPrepareFuture.java |  220 +-
 .../near/GridNearOptimisticTxPrepareFuture.java |  106 +-
 ...ridNearOptimisticTxPrepareFutureAdapter.java |   20 +-
 .../GridNearPessimisticTxPrepareFuture.java     |  191 +-
 .../near/GridNearSingleGetRequest.java          |   24 +-
 .../near/GridNearTransactionalCache.java        |   13 +-
 .../near/GridNearTxFinishFuture.java            |   19 +-
 .../cache/distributed/near/GridNearTxLocal.java |  111 +-
 .../near/GridNearTxPrepareFutureAdapter.java    |   34 +-
 .../distributed/near/GridNearTxRemote.java      |    8 +-
 .../cache/dr/GridOsCacheDrManager.java          |    2 +-
 .../extras/GridCacheAttributesEntryExtras.java  |    7 +-
 .../GridCacheAttributesMvccEntryExtras.java     |    5 +-
 ...dCacheAttributesMvccObsoleteEntryExtras.java |    5 +-
 ...cheAttributesMvccObsoleteTtlEntryExtras.java |    7 +-
 .../GridCacheAttributesMvccTtlEntryExtras.java  |    7 +-
 .../GridCacheAttributesObsoleteEntryExtras.java |    5 +-
 ...idCacheAttributesObsoleteTtlEntryExtras.java |    7 +-
 .../GridCacheAttributesTtlEntryExtras.java      |    7 +-
 .../cache/extras/GridCacheMvccEntryExtras.java  |    3 +-
 .../GridCacheMvccObsoleteEntryExtras.java       |    5 +-
 .../GridCacheMvccObsoleteTtlEntryExtras.java    |    7 +-
 .../extras/GridCacheMvccTtlEntryExtras.java     |    7 +-
 .../extras/GridCacheObsoleteEntryExtras.java    |    3 +-
 .../extras/GridCacheObsoleteTtlEntryExtras.java |    7 +-
 .../cache/extras/GridCacheTtlEntryExtras.java   |    5 +-
 .../processors/cache/local/GridLocalCache.java  |   22 +
 .../cache/local/GridLocalCacheEntry.java        |   18 -
 .../cache/local/GridLocalLockFuture.java        |    6 +-
 .../local/atomic/GridLocalAtomicCache.java      |   93 +-
 .../query/GridCacheDistributedQueryFuture.java  |   25 +-
 .../query/GridCacheQueryFutureAdapter.java      |   31 +-
 .../cache/query/GridCacheQueryManager.java      |  783 +--
 .../cache/query/GridCacheQueryResponse.java     |   49 +-
 .../cache/query/GridCacheSqlIndexMetadata.java  |    3 +-
 .../cache/query/GridCacheSqlMetadata.java       |    3 +-
 .../cache/query/GridCacheSqlQuery.java          |  114 +-
 .../cache/query/IgniteQueryErrorCode.java       |   27 +-
 .../continuous/CacheContinuousQueryEntry.java   |    4 +-
 .../continuous/CacheContinuousQueryEvent.java   |    3 +-
 .../continuous/CacheContinuousQueryHandler.java |   40 +-
 .../continuous/CacheContinuousQueryManager.java |    7 +-
 .../cache/store/CacheStoreManager.java          |   15 +-
 .../store/GridCacheStoreManagerAdapter.java     |   49 +-
 .../cache/store/GridCacheWriteBehindStore.java  |  614 ++-
 .../transactions/IgniteTransactionsImpl.java    |    4 +-
 .../cache/transactions/IgniteTxAdapter.java     |   25 +-
 .../cache/transactions/IgniteTxEntry.java       |   21 +-
 .../cache/transactions/IgniteTxHandler.java     |  177 +-
 .../IgniteTxImplicitSingleStateImpl.java        |   24 +-
 .../transactions/IgniteTxLocalAdapter.java      |   49 +-
 .../cache/transactions/IgniteTxLocalState.java  |   10 +
 .../cache/transactions/IgniteTxManager.java     |   16 +-
 .../IgniteTxRemoteSingleStateImpl.java          |    2 +-
 .../IgniteTxRemoteStateAdapter.java             |    8 +-
 .../cache/transactions/IgniteTxState.java       |   11 +-
 .../cache/transactions/IgniteTxStateImpl.java   |   93 +-
 .../cache/transactions/TxDeadlockDetection.java |    5 +-
 .../processors/cache/transactions/TxLock.java   |    2 +
 .../version/GridCachePlainVersionedEntry.java   |    5 -
 .../version/GridCacheRawVersionedEntry.java     |    5 -
 .../cache/version/GridCacheVersion.java         |   47 +-
 .../cache/version/GridCacheVersionEx.java       |   19 +-
 .../cache/version/GridCacheVersionManager.java  |   12 +-
 .../cache/version/GridCacheVersionedEntry.java  |    7 -
 .../cacheobject/IgniteCacheObjectProcessor.java |   40 +-
 .../IgniteCacheObjectProcessorImpl.java         |  111 +-
 .../clock/GridClockDeltaSnapshot.java           |  235 -
 .../clock/GridClockDeltaSnapshotMessage.java    |  154 -
 .../processors/clock/GridClockDeltaVersion.java |  194 -
 .../processors/clock/GridClockMessage.java      |  171 -
 .../processors/clock/GridClockServer.java       |  222 -
 .../processors/clock/GridClockSource.java       |   30 -
 .../clock/GridClockSyncProcessor.java           |  481 --
 .../processors/clock/GridJvmClockSource.java    |   28 -
 .../closure/GridClosureProcessor.java           |    2 +-
 .../processors/cluster/ClusterProcessor.java    |    2 +-
 .../cluster/GridClusterStateProcessor.java      |  947 ++++
 .../cluster/IgniteChangeGlobalStateSupport.java |   42 +
 .../continuous/GridContinuousHandler.java       |    5 +-
 .../continuous/GridContinuousProcessor.java     |    7 +-
 .../StartRoutineAckDiscoveryMessage.java        |   13 +-
 .../StartRoutineDiscoveryMessage.java           |   19 +-
 .../datastreamer/DataStreamProcessor.java       |    2 +-
 .../datastreamer/DataStreamerImpl.java          |  102 +-
 .../datastructures/DataStructuresProcessor.java |  136 +-
 .../datastructures/GridCacheAtomicLongImpl.java |   14 +-
 .../GridCacheAtomicReferenceImpl.java           |   16 +-
 .../GridCacheAtomicSequenceImpl.java            |   14 +-
 .../GridCacheAtomicStampedImpl.java             |   14 +-
 .../GridCacheCountDownLatchImpl.java            |   14 +-
 .../datastructures/GridCacheLockImpl.java       |   17 +-
 .../datastructures/GridCacheQueueAdapter.java   |   49 +-
 .../datastructures/GridCacheSemaphoreImpl.java  |  100 +-
 .../datastructures/GridCacheSemaphoreState.java |   22 +
 .../datastructures/GridCacheSetImpl.java        |   54 +-
 .../internal/processors/hadoop/HadoopJobId.java |   10 +-
 .../processors/hadoop/HadoopPayloadAware.java   |   28 -
 .../shuffle/HadoopDirectShuffleMessage.java     |   22 +-
 .../hadoop/shuffle/HadoopShuffleAck.java        |   10 +-
 .../hadoop/shuffle/HadoopShuffleMessage.java    |   18 +-
 .../internal/processors/igfs/IgfsAsyncImpl.java |    7 +-
 .../ignite/internal/processors/igfs/IgfsEx.java |    7 -
 .../processors/igfs/IgfsHandshakeResponse.java  |   22 +-
 .../internal/processors/igfs/IgfsImpl.java      |   47 +-
 .../processors/igfs/IgfsIpcHandler.java         |   20 +-
 .../processors/igfs/IgfsModeResolver.java       |   91 +-
 .../processors/igfs/IgfsNoopProcessor.java      |    4 +-
 .../internal/processors/igfs/IgfsPaths.java     |  152 -
 .../internal/processors/igfs/IgfsProcessor.java |   52 +-
 .../processors/igfs/IgfsProcessorAdapter.java   |    4 +-
 .../internal/processors/igfs/IgfsUtils.java     |    5 +-
 .../IgfsMetaDirectoryListingAddProcessor.java   |    5 +-
 .../processors/job/GridJobProcessor.java        |    2 +-
 .../jobmetrics/GridJobMetricsProcessor.java     |    2 +-
 .../GridMarshallerMappingProcessor.java         |    3 +-
 .../marshaller/MarshallerMappingTransport.java  |   14 +-
 .../MissingMappingRequestMessage.java           |    4 +
 .../MissingMappingResponseMessage.java          |   15 +-
 .../internal/processors/odbc/OdbcProcessor.java |   11 +-
 .../platform/PlatformProcessorImpl.java         |    2 +-
 .../platform/cache/PlatformCache.java           |   10 -
 .../callback/PlatformCallbackGateway.java       |   68 -
 .../platform/compute/PlatformCompute.java       |   10 -
 .../PlatformDotNetConfigurationClosure.java     |   66 +-
 .../cache/PlatformCachePluginConfiguration.java |    7 -
 .../cache/PlatformCachePluginProvider.java      |  123 -
 .../utils/PlatformConfigurationUtils.java       |  211 +-
 .../processors/plugin/CachePluginManager.java   |   20 +-
 .../plugin/IgnitePluginProcessor.java           |    5 +-
 .../internal/processors/pool/PoolProcessor.java |    5 +
 .../processors/port/GridPortProcessor.java      |    2 +-
 .../query/GridQueryIndexDescriptor.java         |   12 +
 .../processors/query/GridQueryIndexing.java     |   84 +-
 .../processors/query/GridQueryProcessor.java    | 1952 ++++++-
 .../query/GridQueryTypeDescriptor.java          |   12 +
 .../processors/query/IgniteSQLException.java    |    7 +
 .../query/QueryIndexDescriptorImpl.java         |   49 +-
 .../processors/query/QueryIndexKey.java         |   85 +
 .../internal/processors/query/QuerySchema.java  |  168 +
 .../query/QueryTypeDescriptorImpl.java          |  160 +-
 .../internal/processors/query/QueryUtils.java   |  224 +-
 .../twostep/messages/GridQueryFailResponse.java |   10 +-
 .../query/property/QueryBinaryProperty.java     |    4 +-
 .../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 +
 .../resource/GridResourceProcessor.java         |    3 +-
 .../processors/rest/GridRestCommand.java        |   11 +-
 .../processors/rest/GridRestProcessor.java      |   26 +-
 .../rest/client/message/GridClientNodeBean.java |    2 +-
 .../client/message/GridClientStateRequest.java  |   80 +
 .../cluster/GridChangeStateCommandHandler.java  |   90 +
 .../top/GridTopologyCommandHandler.java         |    4 +
 .../tcp/GridTcpMemcachedNioListener.java        |   20 +-
 .../protocols/tcp/GridTcpRestNioListener.java   |   20 +
 .../request/GridRestChangeStateRequest.java     |   57 +
 .../service/GridServiceProcessor.java           |  224 +-
 .../session/GridTaskSessionProcessor.java       |    2 +-
 .../processors/task/GridTaskProcessor.java      |    6 +-
 .../timeout/GridTimeoutProcessor.java           |    2 +-
 .../org/apache/ignite/internal/util/F0.java     |  196 +-
 .../apache/ignite/internal/util/GridArrays.java |  116 +
 .../util/GridCursorIteratorWrapper.java         |   52 +
 .../apache/ignite/internal/util/GridDebug.java  |    2 +-
 .../ignite/internal/util/GridIntList.java       |  586 +++
 .../util/GridMultiCollectionWrapper.java        |  186 +
 .../ignite/internal/util/GridStringBuilder.java |   19 +
 .../apache/ignite/internal/util/GridUnsafe.java |   67 +-
 .../internal/util/IgniteExceptionRegistry.java  |    3 +-
 .../apache/ignite/internal/util/IgniteTree.java |  134 +
 .../ignite/internal/util/IgniteUtils.java       |  220 +-
 .../internal/util/OffheapReadWriteLock.java     |  661 +++
 .../util/future/GridCompoundFuture.java         |   45 +-
 .../util/future/GridFinishedFuture.java         |   13 -
 .../internal/util/future/GridFutureAdapter.java |  479 +-
 .../internal/util/future/IgniteFutureImpl.java  |   10 -
 .../util/future/IgniteRemoteMapTask.java        |  142 +
 .../ignite/internal/util/lang/GridCursor.java   |   41 +
 .../ignite/internal/util/lang/GridFunc.java     | 1799 +------
 .../internal/util/lang/GridTreePrinter.java     |   81 +
 .../ignite/internal/util/lang/GridTupleV.java   |  195 -
 .../lang/gridfunc/AlwaysFalsePredicate.java     |   46 +
 .../util/lang/gridfunc/AlwaysTruePredicate.java |   46 +
 .../util/lang/gridfunc/AlwaysTrueReducer.java   |   56 +
 .../gridfunc/AtomicIntegerFactoryCallable.java  |   40 +
 .../gridfunc/CacheEntryGetValueClosure.java     |   42 +
 .../gridfunc/CacheEntryHasPeekPredicate.java    |   41 +
 .../lang/gridfunc/ClusterNodeGetIdClosure.java  |   41 +
 .../ConcurrentDequeFactoryCallable.java         |   40 +
 .../ConcurrentHashSetFactoryCallable.java       |   40 +
 .../gridfunc/ConcurrentMapFactoryCallable.java  |   41 +
 .../lang/gridfunc/ContainsNodeIdsPredicate.java |   52 +
 .../util/lang/gridfunc/ContainsPredicate.java   |   55 +
 .../gridfunc/EntryByKeyEvaluationPredicate.java |   53 +
 .../gridfunc/EqualsClusterNodeIdPredicate.java  |   51 +
 .../util/lang/gridfunc/EqualsUuidPredicate.java |   50 +
 .../lang/gridfunc/FlatCollectionWrapper.java    |   66 +
 .../util/lang/gridfunc/FlatIterator.java        |  104 +
 .../util/lang/gridfunc/HasEqualIdPredicate.java |   51 +
 .../lang/gridfunc/HasNotEqualIdPredicate.java   |   51 +
 .../util/lang/gridfunc/IdentityClosure.java     |   39 +
 .../util/lang/gridfunc/IntSumReducer.java       |   51 +
 .../util/lang/gridfunc/IsAllPredicate.java      |   52 +
 .../util/lang/gridfunc/IsNotAllPredicate.java   |   52 +
 .../util/lang/gridfunc/IsNotNullPredicate.java  |   44 +
 .../util/lang/gridfunc/LongSumReducer.java      |   51 +
 .../util/lang/gridfunc/MapFactoryCallable.java  |   41 +
 .../util/lang/gridfunc/MultipleIterator.java    |  106 +
 .../util/lang/gridfunc/NoOpClosure.java         |   39 +
 .../lang/gridfunc/NotContainsPredicate.java     |   54 +
 .../util/lang/gridfunc/NotEqualPredicate.java   |   53 +
 .../lang/gridfunc/PredicateCollectionView.java  |   73 +
 .../util/lang/gridfunc/PredicateMapView.java    |  115 +
 .../util/lang/gridfunc/PredicateSetView.java    |  147 +
 .../lang/gridfunc/ReadOnlyCollectionView.java   |   89 +
 .../lang/gridfunc/ReadOnlyCollectionView2X.java |   94 +
 .../lang/gridfunc/RunnableWrapperClosure.java   |   51 +
 .../util/lang/gridfunc/SetFactoryCallable.java  |   41 +
 .../util/lang/gridfunc/StringConcatReducer.java |   79 +
 .../util/lang/gridfunc/ToStringClosure.java     |   42 +
 .../lang/gridfunc/TransformCollectionView.java  |   74 +
 .../gridfunc/TransformFilteringIterator.java    |  138 +
 .../util/lang/gridfunc/TransformMapView.java    |  162 +
 .../util/lang/gridfunc/TransformMapView2.java   |  165 +
 .../util/lang/gridfunc/package-info.java        |   22 +
 .../util/nio/GridNioBackPressureControl.java    |   39 +-
 .../util/nio/GridNioMessageTracker.java         |    7 +
 .../util/nio/GridNioRecoveryDescriptor.java     |    1 +
 .../offheap/unsafe/GridOffHeapSnapTreeMap.java  |   11 +-
 .../internal/util/snaptree/SnapTreeMap.java     |   10 +-
 .../ignite/internal/util/worker/GridWorker.java |    2 +-
 .../internal/visor/VisorDataTransferObject.java |   87 +
 .../visor/VisorDataTransferObjectInput.java     |  156 +
 .../visor/VisorDataTransferObjectOutput.java    |  141 +
 .../ignite/internal/visor/VisorEither.java      |  103 +
 .../internal/visor/VisorMultiNodeTask.java      |    6 +-
 .../ignite/internal/visor/VisorOneNodeTask.java |    5 +-
 .../internal/visor/VisorTaskArgument.java       |   53 +-
 .../visor/binary/VisorBinaryMetadata.java       |  139 +
 .../VisorBinaryMetadataCollectorTask.java       |   70 +
 .../VisorBinaryMetadataCollectorTaskResult.java |   87 +
 .../visor/binary/VisorBinaryMetadataField.java  |  101 +
 .../ignite/internal/visor/cache/VisorCache.java |  305 +-
 .../cache/VisorCacheAffinityConfiguration.java  |   91 +-
 .../visor/cache/VisorCacheAffinityNodeTask.java |   13 +-
 .../cache/VisorCacheAffinityNodeTaskArg.java    |   86 +
 .../cache/VisorCacheAggregatedMetrics.java      |  205 +-
 .../visor/cache/VisorCacheClearTask.java        |  100 +-
 .../visor/cache/VisorCacheClearTaskResult.java  |   85 +
 .../visor/cache/VisorCacheConfiguration.java    |  302 +-
 .../VisorCacheConfigurationCollectorJob.java    |    4 +-
 .../cache/VisorCacheDefaultConfiguration.java   |   58 -
 .../cache/VisorCacheEvictionConfiguration.java  |   97 +-
 .../visor/cache/VisorCacheJdbcType.java         |  189 +
 .../visor/cache/VisorCacheJdbcTypeField.java    |  117 +
 .../visor/cache/VisorCacheLoadTask.java         |   20 +-
 .../visor/cache/VisorCacheLoadTaskArg.java      |  101 +
 .../visor/cache/VisorCacheMetadataTask.java     |   18 +-
 .../internal/visor/cache/VisorCacheMetrics.java |  214 +-
 .../cache/VisorCacheMetricsCollectorTask.java   |   29 +-
 .../VisorCacheMetricsCollectorTaskArg.java      |   87 +
 .../cache/VisorCacheNearConfiguration.java      |   59 +-
 .../visor/cache/VisorCachePartition.java        |   90 -
 .../visor/cache/VisorCachePartitions.java       |   57 +-
 .../visor/cache/VisorCachePartitionsTask.java   |   42 +-
 .../cache/VisorCachePartitionsTaskArg.java      |   72 +
 .../cache/VisorCacheQueryConfiguration.java     |  123 -
 .../cache/VisorCacheQueryDetailMetrics.java     |  167 -
 ...sorCacheQueryDetailMetricsCollectorTask.java |  146 -
 .../visor/cache/VisorCacheQueryMetrics.java     |  102 -
 .../cache/VisorCacheRebalanceConfiguration.java |   71 +-
 .../VisorCacheResetQueryDetailMetricsTask.java  |   71 -
 .../cache/VisorCacheResetQueryMetricsTask.java  |   69 -
 .../visor/cache/VisorCacheSqlIndexMetadata.java |  115 +
 .../visor/cache/VisorCacheSqlMetadata.java      |  162 +
 .../visor/cache/VisorCacheStartArg.java         |  100 +
 .../visor/cache/VisorCacheStartTask.java        |   68 +-
 .../visor/cache/VisorCacheStartTaskArg.java     |  100 +
 .../cache/VisorCacheStoreConfiguration.java     |   77 +-
 .../visor/cache/VisorCacheSwapBackupsTask.java  |  102 -
 .../cache/VisorCacheTypeFieldMetadata.java      |   92 -
 .../visor/cache/VisorCacheTypeMetadata.java     |  294 --
 .../internal/visor/cache/VisorPartitionMap.java |   90 +
 .../compute/VisorComputeMonitoringHolder.java   |    8 +-
 .../VisorComputeToggleMonitoringTask.java       |   52 +-
 .../VisorComputeToggleMonitoringTaskArg.java    |   86 +
 .../visor/compute/VisorGatewayTask.java         |  107 +-
 .../visor/debug/VisorThreadDumpTask.java        |   13 +-
 .../visor/debug/VisorThreadDumpTaskResult.java  |   88 +
 .../internal/visor/debug/VisorThreadInfo.java   |  234 +-
 .../visor/debug/VisorThreadLockInfo.java        |   51 +-
 .../visor/debug/VisorThreadMonitorInfo.java     |   76 +-
 .../visor/event/VisorGridDeploymentEvent.java   |   43 +-
 .../visor/event/VisorGridDiscoveryEvent.java    |   59 +-
 .../internal/visor/event/VisorGridEvent.java    |   66 +-
 .../visor/event/VisorGridEventsLost.java        |   15 +-
 .../internal/visor/event/VisorGridJobEvent.java |   61 +-
 .../visor/event/VisorGridTaskEvent.java         |   61 +-
 .../internal/visor/file/VisorFileBlock.java     |   60 +-
 .../internal/visor/file/VisorFileBlockArg.java  |  114 +
 .../internal/visor/file/VisorFileBlockTask.java |   68 +-
 .../visor/file/VisorFileBlockTaskArg.java       |  114 +
 .../visor/file/VisorLatestTextFilesTask.java    |   17 +-
 .../visor/file/VisorLatestTextFilesTaskArg.java |   86 +
 .../ignite/internal/visor/igfs/VisorIgfs.java   |   78 +-
 .../internal/visor/igfs/VisorIgfsEndpoint.java  |   72 +-
 .../internal/visor/igfs/VisorIgfsMetrics.java   |  118 +-
 .../internal/visor/igfs/VisorIgfsProfiler.java  |   24 +-
 .../visor/igfs/VisorIgfsProfilerClearTask.java  |   11 +-
 .../igfs/VisorIgfsProfilerClearTaskResult.java  |   85 +
 .../visor/igfs/VisorIgfsProfilerEntry.java      |  106 +-
 .../visor/igfs/VisorIgfsProfilerTask.java       |   41 +-
 .../VisorIgfsProfilerUniformityCounters.java    |   38 +-
 .../visor/igfs/VisorIgfsSamplingStateTask.java  |   17 +-
 .../igfs/VisorIgfsSamplingStateTaskArg.java     |   86 +
 .../ignite/internal/visor/log/VisorLogFile.java |   43 +-
 .../internal/visor/log/VisorLogSearchArg.java   |  114 +
 .../visor/log/VisorLogSearchResult.java         |   80 +-
 .../internal/visor/log/VisorLogSearchTask.java  |   81 +-
 .../visor/log/VisorLogSearchTaskArg.java        |  114 +
 .../visor/log/VisorLogSearchTaskResult.java     |   92 +
 .../misc/VisorChangeGridActiveStateTask.java    |   65 +
 .../visor/node/VisorAtomicConfiguration.java    |   49 +-
 .../visor/node/VisorBasicConfiguration.java     |  163 +-
 .../node/VisorExecutorServiceConfiguration.java |   81 +-
 .../visor/node/VisorGridConfiguration.java      |  133 +-
 .../visor/node/VisorIgfsConfiguration.java      |  252 +-
 .../visor/node/VisorLifecycleConfiguration.java |   39 +-
 .../visor/node/VisorMemoryConfiguration.java    |  141 +
 .../node/VisorMemoryPolicyConfiguration.java    |  105 +
 .../visor/node/VisorMetricsConfiguration.java   |   50 +-
 .../VisorNodeConfigurationCollectorJob.java     |    4 +-
 .../visor/node/VisorNodeDataCollectorJob.java   |   63 +-
 .../node/VisorNodeDataCollectorJobResult.java   |  115 +-
 .../visor/node/VisorNodeDataCollectorTask.java  |   42 +-
 .../node/VisorNodeDataCollectorTaskArg.java     |   54 +-
 .../node/VisorNodeDataCollectorTaskResult.java  |  127 +-
 .../node/VisorNodeEventsCollectorTask.java      |  133 +-
 .../node/VisorNodeEventsCollectorTaskArg.java   |  163 +
 .../internal/visor/node/VisorNodeGcTask.java    |   18 +-
 .../visor/node/VisorNodeGcTaskResult.java       |   85 +
 .../internal/visor/node/VisorNodePingTask.java  |   15 +-
 .../visor/node/VisorNodePingTaskResult.java     |   99 +
 .../visor/node/VisorNodeSuppressedErrors.java   |   89 +
 .../node/VisorNodeSuppressedErrorsTask.java     |   23 +-
 .../node/VisorPeerToPeerConfiguration.java      |   57 +-
 .../visor/node/VisorRestConfiguration.java      |   93 +-
 .../node/VisorSegmentationConfiguration.java    |   67 +-
 .../visor/node/VisorSpiDescription.java         |   89 +
 .../visor/node/VisorSpisConfiguration.java      |  139 +-
 .../visor/node/VisorSuppressedError.java        |  147 +
 .../node/VisorTransactionConfiguration.java     |  104 +-
 .../visor/query/VisorCancelQueriesTask.java     |   72 -
 .../query/VisorCollectRunningQueriesTask.java   |   96 -
 .../internal/visor/query/VisorQueryArg.java     |   81 +-
 .../visor/query/VisorQueryCancelTask.java       |   72 +
 .../visor/query/VisorQueryCleanupTask.java      |    6 +-
 .../visor/query/VisorQueryConfiguration.java    |  142 +
 .../visor/query/VisorQueryDetailMetrics.java    |  205 +
 .../VisorQueryDetailMetricsCollectorTask.java   |  146 +
 .../internal/visor/query/VisorQueryEntity.java  |  188 +
 .../internal/visor/query/VisorQueryField.java   |   42 +-
 .../internal/visor/query/VisorQueryIndex.java   |  105 +
 .../visor/query/VisorQueryIndexField.java       |  106 +
 .../internal/visor/query/VisorQueryJob.java     |  274 -
 .../internal/visor/query/VisorQueryMetrics.java |  125 +
 .../visor/query/VisorQueryNextPageTask.java     |   33 +-
 .../visor/query/VisorQueryNextPageTaskArg.java  |   86 +
 .../query/VisorQueryResetDetailMetricsTask.java |   71 +
 .../visor/query/VisorQueryResetMetricsTask.java |   69 +
 .../internal/visor/query/VisorQueryResult.java  |   97 +-
 .../visor/query/VisorQueryResultEx.java         |   89 -
 .../visor/query/VisorQueryScanRegexFilter.java  |   59 +
 .../query/VisorQueryScanSubstringFilter.java    |   64 -
 .../internal/visor/query/VisorQueryTask.java    |  103 +-
 .../internal/visor/query/VisorQueryTaskArg.java |  155 +
 .../internal/visor/query/VisorQueryUtils.java   |   43 +-
 .../query/VisorRunningQueriesCollectorTask.java |   96 +
 .../internal/visor/query/VisorRunningQuery.java |   47 +-
 .../internal/visor/query/VisorScanQueryArg.java |  157 +
 .../visor/query/VisorScanQueryTask.java         |  185 +
 .../visor/query/VisorScanQueryTaskArg.java      |  157 +
 .../visor/service/VisorServiceDescriptor.java   |   40 +-
 .../internal/visor/util/VisorMimeTypes.java     |   12 +-
 .../internal/visor/util/VisorTaskUtils.java     |   46 +-
 .../org/apache/ignite/lang/IgniteFuture.java    |   15 -
 .../apache/ignite/marshaller/Marshaller.java    |    3 +-
 .../ignite/marshaller/jdk/JdkMarshaller.java    |    3 +-
 .../optimized/OptimizedClassDescriptor.java     | 1141 -----
 .../optimized/OptimizedFieldType.java           |   50 -
 .../optimized/OptimizedMarshaller.java          |  313 --
 .../optimized/OptimizedMarshallerIdMapper.java  |   33 -
 .../optimized/OptimizedMarshallerUtils.java     |  551 --
 .../optimized/OptimizedObjectInputStream.java   | 1231 -----
 .../optimized/OptimizedObjectOutputStream.java  |  875 ----
 .../OptimizedObjectStreamRegistry.java          |  244 -
 .../marshaller/optimized/package-info.java      |   22 -
 .../ignite/mxbean/CacheMetricsMXBean.java       |   40 -
 .../org/apache/ignite/mxbean/IgniteMXBean.java  |   29 +-
 .../ignite/mxbean/MemoryMetricsMXBean.java      |   89 +
 .../ignite/plugin/CachePluginConfiguration.java |    7 -
 .../ignite/plugin/CachePluginContext.java       |    5 -
 .../ignite/plugin/CachePluginProvider.java      |    4 +-
 .../apache/ignite/plugin/PluginProvider.java    |   11 +-
 .../ignite/plugin/platform/package-info.java    |   22 +
 .../plugin/security/SecurityPermissionSet.java  |    3 +-
 .../ignite/plugin/security/SecuritySubject.java |    3 +-
 .../plugin/segmentation/SegmentationPolicy.java |   18 +-
 .../org/apache/ignite/spi/IgniteSpiAdapter.java |    9 +
 .../communication/tcp/TcpCommunicationSpi.java  |  174 +-
 .../tcp/TcpCommunicationSpiMBean.java           |   54 -
 .../deployment/local/LocalDeploymentSpi.java    |    5 +-
 .../ignite/spi/discovery/DiscoverySpi.java      |   11 +-
 .../spi/discovery/DiscoverySpiListener.java     |    9 +
 .../ignite/spi/discovery/tcp/ClientImpl.java    |    6 +-
 .../ignite/spi/discovery/tcp/ServerImpl.java    |   52 +-
 .../spi/discovery/tcp/TcpDiscoveryImpl.java     |   10 +
 .../spi/discovery/tcp/TcpDiscoverySpi.java      |   92 +-
 .../tcp/internal/TcpDiscoveryNode.java          |   15 +-
 .../tcp/internal/TcpDiscoveryNodesRing.java     |    3 +-
 .../spi/eventstorage/NoopEventStorageSpi.java   |   53 +
 .../ignite/spi/swapspace/SwapContext.java       |   47 -
 .../apache/ignite/spi/swapspace/SwapKey.java    |  128 -
 .../ignite/spi/swapspace/SwapSpaceSpi.java      |  225 -
 .../spi/swapspace/SwapSpaceSpiListener.java     |   35 -
 .../spi/swapspace/file/FileSwapArray.java       |  188 -
 .../spi/swapspace/file/FileSwapSpaceSpi.java    | 2025 --------
 .../swapspace/file/FileSwapSpaceSpiMBean.java   |   67 -
 .../ignite/spi/swapspace/file/package-info.java |   22 -
 .../spi/swapspace/noop/NoopSwapSpaceSpi.java    |  159 -
 .../ignite/spi/swapspace/noop/package-info.java |   22 -
 .../ignite/spi/swapspace/package-info.java      |   22 -
 .../ignite/startup/BasicWarmupClosure.java      |    4 +-
 .../TransactionDeadlockException.java           |    4 +-
 .../transactions/TransactionException.java      |   80 +
 .../TransactionHeuristicException.java          |    4 +-
 .../TransactionOptimisticException.java         |    4 +-
 .../TransactionRollbackException.java           |    4 +-
 .../TransactionTimeoutException.java            |    4 +-
 .../org/jsr166/ConcurrentLinkedHashMap.java     |    2 +-
 .../resources/META-INF/classnames.properties    |  392 +-
 modules/core/src/test/config/example-cache.xml  |    2 +-
 modules/core/src/test/config/igfs-loopback.xml  |    2 +-
 modules/core/src/test/config/igfs-shmem.xml     |    2 +-
 .../test/config/loaders/grid-cfg-2-grids.xml    |    6 +-
 .../core/src/test/config/spring-multicache.xml  |   16 +
 .../src/test/config/spring-start-nodes-attr.xml |    2 +-
 .../core/src/test/config/spring-start-nodes.xml |    2 +-
 .../test/config/store/jdbc/ignite-jdbc-type.xml |    2 +-
 .../config/websession/example-cache-base.xml    |    3 +-
 .../config/websession/example-cache-client.xml  |    4 +
 .../test/config/websession/spring-cache-1.xml   |    6 -
 .../test/config/websession/spring-cache-2.xml   |    6 -
 .../test/config/websession/spring-cache-3.xml   |    6 -
 .../org.apache.ignite.plugin.PluginProvider     |    3 +-
 .../GridCacheAffinityBackupsSelfTest.java       |   20 +-
 .../ignite/IgniteCacheAffinitySelfTest.java     |   12 +-
 .../IgniteExternalizableAbstractTest.java       |    2 +-
 .../ignite/cache/LargeEntryUpdateTest.java      |  176 +
 .../affinity/AffinityClientNodeSelfTest.java    |   15 +-
 .../affinity/AffinityHistoryCleanupTest.java    |    3 +-
 .../fair/FairAffinityDynamicCacheSelfTest.java  |   86 -
 ...airAffinityFunctionBackupFilterSelfTest.java |   44 -
 ...ffinityFunctionExcludeNeighborsSelfTest.java |   31 -
 .../fair/FairAffinityFunctionNodesSelfTest.java |  247 -
 .../fair/FairAffinityFunctionSelfTest.java      |   31 -
 .../affinity/fair/FairAffinityNodesRestart.java |  130 -
 .../local/LocalAffinityFunctionTest.java        |    4 +-
 ...inityFunctionFastPowerOfTwoHashSelfTest.java |   33 +
 ...ndezvousAffinityFunctionSimpleBenchmark.java | 1054 ++++
 ...ousAffinityFunctionStandardHashSelfTest.java |   33 +
 .../IgniteCacheExpiryStoreLoadSelfTest.java     |   14 +-
 .../CacheJdbcPojoStoreAbstractSelfTest.java     |    1 -
 ...dbcPojoStoreOptimizedMarshallerSelfTest.java |    2 +-
 .../store/jdbc/CacheJdbcPojoStoreTest.java      |  136 +-
 ...eJdbcStoreAbstractMultithreadedSelfTest.java |    1 -
 ...CacheJdbcBlobStoreMultithreadedSelfTest.java |    1 -
 .../cache/store/jdbc/model/Organization.java    |    2 -
 .../cache/store/jdbc/model/OrganizationKey.java |    2 -
 .../ignite/cache/store/jdbc/model/Person.java   |    2 -
 .../store/jdbc/model/PersonComplexKey.java      |    4 +-
 .../cache/store/jdbc/model/PersonKey.java       |    2 -
 .../apache/ignite/igfs/IgfsPathSelfTest.java    |    2 +-
 .../internal/ClusterNodeMetricsSelfTest.java    |   71 +-
 .../internal/GridAffinityNoCacheSelfTest.java   |   21 +
 .../GridEventStorageDefaultExceptionTest.java   |   94 +
 .../internal/GridLifecycleAwareSelfTest.java    |    2 +-
 .../internal/GridMultipleJobsSelfTest.java      |   12 +-
 .../IgniteClientReconnectCacheTest.java         |  103 +-
 .../IgniteSlowClientDetectionSelfTest.java      |    6 +
 .../MarshallerContextLockingSelfTest.java       |   33 +-
 .../internal/TestRecordingCommunicationSpi.java |   16 +-
 .../BinaryArrayIdentityResolverSelfTest.java    |    4 -
 ...ryConfigurationCustomSerializerSelfTest.java |  147 +
 .../internal/binary/BinaryEnumsSelfTest.java    |    2 +
 .../binary/BinaryFieldExtractionSelfTest.java   |  161 +
 .../BinaryFieldIdentityResolverSelfTest.java    |  333 --
 ...ryIdentityResolverConfigurationSelfTest.java |  138 -
 .../BinaryObjectBuilderAdditionalSelfTest.java  |    1 -
 ...naryObjectBuilderDefaultMappersSelfTest.java |    1 -
 .../binary/BinaryObjectExceptionSelfTest.java   |  209 -
 .../mutabletest/GridBinaryTestClasses.java      |    9 +
 ...GridManagerLocalMessageListenerSelfTest.java |    8 +-
 .../managers/GridManagerStopSelfTest.java       |   20 +-
 .../managers/GridNoopManagerSelfTest.java       |    2 +-
 .../GridCommunicationSendMessageSelfTest.java   |    3 -
 .../GridDeploymentMessageCountSelfTest.java     |   10 +
 .../GridDiscoveryManagerAttributesSelfTest.java |    2 +-
 .../GridSwapSpaceCustomLocalValue.java          |   85 -
 .../swapspace/GridSwapSpaceManagerSelfTest.java |  170 -
 .../managers/swapspace/package-info.java        |   22 -
 .../OptimizedMarshallerEnumSelfTest.java        |   87 +
 .../OptimizedMarshallerNodeFailoverTest.java    |  358 ++
 .../OptimizedMarshallerPooledSelfTest.java      |   46 +
 .../optimized/OptimizedMarshallerSelfTest.java  |  284 ++
 ...arshallerSerialPersistentFieldsSelfTest.java |  116 +
 .../optimized/OptimizedMarshallerTest.java      |  790 +++
 .../OptimizedObjectStreamSelfTest.java          | 2162 ++++++++
 .../TestTcpDiscoveryIpFinderAdapter.java        |   43 +
 .../pagemem/impl/PageIdUtilsSelfTest.java       |  146 +
 .../pagemem/impl/PageMemoryNoLoadSelfTest.java  |  346 ++
 .../BinaryObjectOffHeapUnswapTemporaryTest.java |  367 --
 .../CacheAtomicSingleMessageCountSelfTest.java  |    2 -
 .../cache/CacheClientStoreSelfTest.java         |   35 +-
 .../cache/CacheConfigurationLeakTest.java       |   27 +-
 .../cache/CacheDeferredDeleteQueueTest.java     |    2 +-
 ...cheDhtLocalPartitionAfterRemoveSelfTest.java |    2 +-
 .../cache/CacheEnumOperationsAbstractTest.java  |   54 +-
 ...CacheExchangeMessageDuplicatedStateTest.java |   74 +-
 .../cache/CacheGetEntryAbstractTest.java        |    8 +-
 ...erceptorPartitionCounterLocalSanityTest.java |   25 +-
 ...torPartitionCounterRandomOperationsTest.java |  113 -
 .../cache/CacheKeepBinaryTransactionTest.java   |  121 +
 .../CacheMemoryPolicyConfigurationTest.java     |  164 +
 .../cache/CacheNearReaderUpdateTest.java        |   24 -
 .../cache/CacheOffheapMapEntrySelfTest.java     |   61 +-
 .../CachePutEventListenerErrorSelfTest.java     |   41 +-
 .../cache/CacheRebalancingSelfTest.java         |    5 +-
 .../cache/CacheRemoveAllSelfTest.java           |    1 -
 .../CacheSerializableTransactionsTest.java      |   63 +-
 .../CacheStartupInDeploymentModesTest.java      |    2 +-
 .../cache/CacheStopAndDestroySelfTest.java      |   48 +-
 .../CacheStoreUsageMultinodeAbstractTest.java   |    2 -
 .../cache/CacheSwapUnswapGetTest.java           |  313 --
 .../CacheSwapUnswapGetTestSmallQueueSize.java   |   35 -
 .../cache/ClusterStateAbstractTest.java         |  439 ++
 .../cache/ClusterStatePartitionedSelfTest.java  |   41 +
 .../cache/ClusterStateReplicatedSelfTest.java   |   42 +
 ...sCacheTxNearEnabledRandomOperationsTest.java |   28 +
 .../cache/CrossCacheTxRandomOperationsTest.java |   47 +-
 .../EntryVersionConsistencyReadThroughTest.java |    8 +-
 ...idAbstractCacheInterceptorRebalanceTest.java |   36 +-
 ...ridCacheAbstractByteArrayValuesSelfTest.java |    6 -
 .../GridCacheAbstractFailoverSelfTest.java      |    4 +
 .../cache/GridCacheAbstractFullApiSelfTest.java |  220 +-
 .../GridCacheAbstractLocalStoreSelfTest.java    |   40 +-
 .../cache/GridCacheAbstractMetricsSelfTest.java |   36 +-
 .../GridCacheAbstractRemoveFailureTest.java     |   38 +-
 .../cache/GridCacheAbstractSelfTest.java        |   35 +-
 .../cache/GridCacheAbstractTxReadTest.java      |    2 -
 .../GridCacheAtomicMessageCountSelfTest.java    |   54 +-
 .../cache/GridCacheBasicStoreAbstractTest.java  |    6 +-
 ...acheBasicStoreMultithreadedAbstractTest.java |    1 -
 .../cache/GridCacheClearSelfTest.java           |  125 +-
 ...GridCacheConcurrentGetCacheOnClientTest.java |  129 +
 .../cache/GridCacheConcurrentMapTest.java       |  138 -
 .../GridCacheConcurrentTxMultiNodeTest.java     |   12 +-
 .../GridCacheConditionalDeploymentSelfTest.java |   19 +-
 ...idCacheConfigurationConsistencySelfTest.java |   55 +-
 ...ridCacheConfigurationValidationSelfTest.java |   13 -
 .../GridCacheDeploymentOffHeapSelfTest.java     |   41 -
 ...ridCacheDeploymentOffHeapValuesSelfTest.java |   41 -
 .../cache/GridCacheDeploymentSelfTest.java      |    2 +-
 .../cache/GridCacheEntryMemorySizeSelfTest.java |  100 +-
 .../cache/GridCacheEntryVersionSelfTest.java    |    2 -
 .../GridCacheEvictionEventAbstractTest.java     |    8 +-
 ...idCacheGetAndTransformStoreAbstractTest.java |    1 -
 .../cache/GridCacheIncrementTransformTest.java  |    2 -
 .../GridCacheInterceptorAbstractSelfTest.java   |   24 +-
 ...heInterceptorAtomicOffheapRebalanceTest.java |   30 -
 ...erceptorAtomicPrimaryWriteOrderSelfTest.java |   47 -
 ...GridCacheInterceptorAtomicRebalanceTest.java |    6 -
 ...omicReplicatedPrimaryWriteOrderSelfTest.java |   48 -
 ...acheInterceptorAtomicReplicatedSelfTest.java |    8 -
 .../GridCacheInterceptorAtomicSelfTest.java     |    8 -
 ...GridCacheInterceptorLocalAtomicSelfTest.java |    8 -
 ...ceptorTransactionalOffheapRebalanceTest.java |   35 -
 ...heInterceptorTransactionalRebalanceTest.java |    6 -
 .../cache/GridCacheLifecycleAwareSelfTest.java  |    1 +
 .../cache/GridCacheMemoryModeSelfTest.java      |  289 --
 .../cache/GridCacheMvccFlagsTest.java           |    4 +-
 .../cache/GridCacheMvccPartitionedSelfTest.java |   24 +-
 .../processors/cache/GridCacheMvccSelfTest.java |    8 +-
 .../cache/GridCacheObjectToStringSelfTest.java  |    1 +
 .../cache/GridCacheOffHeapCleanupTest.java      |  169 -
 ...HeapMultiThreadedUpdateAbstractSelfTest.java |    9 +-
 .../GridCacheOffHeapTieredAbstractSelfTest.java |  675 ---
 .../GridCacheOffHeapTieredAtomicSelfTest.java   |   32 -
 ...heOffHeapTieredEvictionAbstractSelfTest.java |  364 --
 ...acheOffHeapTieredEvictionAtomicSelfTest.java |   32 -
 .../GridCacheOffHeapTieredEvictionSelfTest.java |   33 -
 .../cache/GridCacheOffHeapTieredSelfTest.java   |   33 -
 .../GridCacheOffHeapValuesEvictionSelfTest.java |  210 -
 .../cache/GridCacheOffheapUpdateSelfTest.java   |    3 -
 .../GridCacheOrderedPreloadingSelfTest.java     |   48 +-
 .../cache/GridCacheP2PUndeploySelfTest.java     |   29 +-
 .../GridCachePartitionedAffinitySpreadTest.java |  169 -
 .../cache/GridCachePartitionedGetSelfTest.java  |    2 -
 ...chePartitionedOffHeapLocalStoreSelfTest.java |   44 -
 .../cache/GridCachePartitionedWritesTest.java   |    1 -
 .../GridCachePreloadingEvictionsSelfTest.java   |   11 +-
 .../cache/GridCachePutAllFailoverSelfTest.java  |   58 -
 .../cache/GridCacheQueryEmbeddedValue.java      |   37 +
 .../cache/GridCacheReloadSelfTest.java          |    4 +-
 ...ridCacheReplicatedSynchronousCommitTest.java |    2 +-
 .../GridCacheReturnValueTransferSelfTest.java   |   15 +-
 .../processors/cache/GridCacheStopSelfTest.java |    2 -
 ...ridCacheStoreManagerDeserializationTest.java |   23 +-
 .../cache/GridCacheStoreValueBytesSelfTest.java |    7 +-
 .../cache/GridCacheSwapCleanupTest.java         |   99 -
 .../cache/GridCacheSwapPreloadSelfTest.java     |    2 -
 .../cache/GridCacheSwapReloadSelfTest.java      |  260 -
 ...ridCacheSwapSpaceSpiConsistencySelfTest.java |  146 -
 .../processors/cache/GridCacheTestEntryEx.java  |   34 +-
 .../GridCacheTtlManagerEvictionSelfTest.java    |   52 +-
 .../GridCacheValueBytesPreloadingSelfTest.java  |   61 +-
 ...idCacheValueConsistencyAbstractSelfTest.java |   61 +-
 .../cache/GridCacheVersionMultinodeTest.java    |   46 +-
 .../cache/GridCacheVersionSelfTest.java         |    6 +-
 .../GridCacheVersionTopologyChangeTest.java     |    7 -
 .../processors/cache/H2CacheStoreStrategy.java  |   37 +-
 .../cache/IgniteCacheAbstractTest.java          |   21 +-
 .../cache/IgniteCacheAtomicInvokeTest.java      |    7 -
 .../cache/IgniteCacheAtomicPeekModesTest.java   |    7 -
 ...eCacheAtomicPrimaryWriteOrderInvokeTest.java |   57 -
 ...maryWriteOrderNearEnabledStoreValueTest.java |   31 -
 ...heAtomicPrimaryWriteOrderStoreValueTest.java |   32 -
 ...micPrimaryWriteOrderWithStoreInvokeTest.java |   32 -
 ...IgniteCacheAtomicPutAllFailoverSelfTest.java |    5 -
 .../cache/IgniteCacheAtomicStoreValueTest.java  |    7 -
 .../IgniteCacheAtomicWithStoreInvokeTest.java   |   32 +
 .../IgniteCacheBinaryObjectsScanSelfTest.java   |   11 +-
 .../IgniteCacheConfigVariationsFullApiTest.java |  288 +-
 .../IgniteCacheEntryListenerAbstractTest.java   |   13 +-
 ...cheEntryListenerAtomicOffheapTieredTest.java |   32 -
 ...cheEntryListenerAtomicOffheapValuesTest.java |   32 -
 .../IgniteCacheEntryListenerAtomicTest.java     |    7 -
 ...niteCacheEntryListenerExpiredEventsTest.java |   28 +-
 ...teCacheEntryListenerTxOffheapTieredTest.java |   32 -
 ...teCacheEntryListenerTxOffheapValuesTest.java |   32 -
 .../IgniteCacheEntryProcessorCallTest.java      |    3 -
 ...niteCacheExpireAndUpdateConsistencyTest.java |   37 +-
 .../IgniteCacheInterceptorSelfTestSuite.java    |   14 +-
 .../cache/IgniteCacheInvokeAbstractTest.java    |    2 +-
 ...gniteCacheInvokeReadThroughAbstractTest.java |    6 -
 ...iteCacheInvokeReadThroughSingleNodeTest.java |   32 +-
 .../cache/IgniteCacheInvokeReadThroughTest.java |   92 +-
 ...gniteCacheLoadRebalanceEvictionSelfTest.java |    3 +-
 .../cache/IgniteCacheObjectPutSelfTest.java     |  179 +
 .../IgniteCacheP2pUnmarshallingErrorTest.java   |    6 -
 ...gniteCacheP2pUnmarshallingNearErrorTest.java |    4 +-
 .../cache/IgniteCachePeekModesAbstractTest.java |  249 +-
 .../IgniteCacheReadThroughEvictionSelfTest.java |   12 +-
 .../IgniteCacheReadThroughStoreCallTest.java    |    2 -
 .../IgniteCacheStoreValueAbstractTest.java      |    9 -
 .../IgniteCacheTopologySafeGetSelfTest.java     |    2 +-
 .../cache/IgniteCacheTxNearPeekModesTest.java   |    5 +-
 .../cache/IgniteCacheTxPeekModesTest.java       |   12 +-
 .../IgniteClientAffinityAssignmentSelfTest.java |   20 +-
 ...eDynamicCacheStartNoExchangeTimeoutTest.java |   11 +-
 .../cache/IgniteExchangeFutureHistoryTest.java  |    6 -
 .../IgniteIncompleteCacheObjectSelfTest.java    |  186 +
 ...iteMarshallerCacheClassNameConflictTest.java |    5 +
 ...lerCacheClientRequestsMappingOnMissTest.java |   94 +-
 .../cache/IgniteOnePhaseCommitInvokeTest.java   |   20 +-
 ...logyValidatorPartitionedAtomicCacheTest.java |    7 -
 ...ologyValidatorReplicatedAtomicCacheTest.java |    7 -
 .../IgniteTxStoreExceptionAbstractSelfTest.java |    4 +-
 .../cache/MemoryPolicyConfigValidationTest.java |  241 +
 .../cache/OffHeapTieredTransactionSelfTest.java |  135 -
 ...heapCacheMetricsForClusterGroupSelfTest.java |    3 -
 .../cache/OffheapCacheOnClientsTest.java        |  143 -
 ...sExchangeOnDiscoveryHistoryOverflowTest.java |    7 -
 .../GridCacheBinaryObjectsAbstractSelfTest.java |   84 +-
 ...ntNodeBinaryObjectMetadataMultinodeTest.java |    2 +
 .../GridDataStreamerImplSelfTest.java           |    8 +-
 ...AtomicNearDisabledOffheapTieredSelfTest.java |   29 -
 ...ObjectsAtomicNearDisabledOnheapSelfTest.java |   25 +
 ...inaryObjectsAtomicOffheapTieredSelfTest.java |   29 -
 ...dCacheBinaryObjectsAtomicOnheapSelfTest.java |   25 +
 ...tionedNearDisabledOffheapTieredSelfTest.java |   30 -
 ...tsPartitionedNearDisabledOnheapSelfTest.java |   25 +
 ...ObjectsPartitionedOffheapTieredSelfTest.java |   30 -
 ...eBinaryObjectsPartitionedOnheapSelfTest.java |   25 +
 .../dht/GridCacheMemoryModeBinarySelfTest.java  |   36 -
 ...dCacheOffHeapTieredAtomicBinarySelfTest.java |   48 -
 .../GridCacheOffHeapTieredBinarySelfTest.java   |   48 -
 ...fHeapTieredEvictionAtomicBinarySelfTest.java |   96 -
 ...acheOffHeapTieredEvictionBinarySelfTest.java |   96 -
 ...BinaryObjectsLocalOffheapTieredSelfTest.java |   29 -
 ...idCacheBinaryObjectsLocalOnheapSelfTest.java |   26 +
 .../IgniteCacheAtomicExecutionContextTest.java  |    7 -
 ...iteCachePartitionedExecutionContextTest.java |    7 -
 ...niteCacheReplicatedExecutionContextTest.java |    7 -
 .../IgniteCacheTxExecutionContextTest.java      |    7 -
 .../database/tree/io/TrackingPageIOTest.java    |  283 ++
 ...eAbstractDataStructuresFailoverSelfTest.java |   23 +-
 ...actQueueFailoverDataConsistencySelfTest.java |   17 +-
 .../GridCacheQueueCleanupSelfTest.java          |    7 -
 ...dCacheQueueMultiNodeConsistencySelfTest.java |    7 -
 .../IgniteCollectionAbstractTest.java           |    7 -
 .../IgniteDataStructureUniqueNameTest.java      |    7 -
 ...SemaphoreFailoverSafeReleasePermitsTest.java |    9 +-
 .../GridCacheLocalAtomicOffheapSetSelfTest.java |   32 -
 .../GridCacheLocalAtomicQueueApiSelfTest.java   |    6 -
 .../local/GridCacheLocalAtomicSetSelfTest.java  |    7 -
 .../GridCacheLocalOffheapQueueApiSelfTest.java  |   31 -
 .../local/GridCacheLocalQueueApiSelfTest.java   |    7 -
 .../local/GridCacheLocalSetSelfTest.java        |    7 -
 ...artitionedAtomicOffheapQueueApiSelfTest.java |   32 -
 ...omicOffheapQueueCreateMultiNodeSelfTest.java |   32 -
 ...onedAtomicOffheapQueueMultiNodeSelfTest.java |   32 -
 ...dCachePartitionedAtomicQueueApiSelfTest.java |    7 -
 ...ionedAtomicQueueCreateMultiNodeSelfTest.java |    7 -
 ...micQueueFailoverDataConsistencySelfTest.java |    7 -
 ...PartitionedAtomicQueueMultiNodeSelfTest.java |    7 -
 ...itionedAtomicQueueRotativeMultiNodeTest.java |    7 -
 ...chePartitionedAtomicSetFailoverSelfTest.java |    7 -
 ...rtitionedDataStructuresFailoverSelfTest.java |    7 -
 ...artitionedOffHeapValuesQueueApiSelfTest.java |   35 -
 ...achePartitionedOffHeapValuesSetSelfTest.java |   32 -
 ...edOffheapDataStructuresFailoverSelfTest.java |   33 -
 ...hePartitionedOffheapSetFailoverSelfTest.java |   32 -
 .../GridCachePartitionedQueueApiSelfTest.java   |    7 -
 ...PartitionedQueueCreateMultiNodeSelfTest.java |    7 -
 ...dCachePartitionedQueueEntryMoveSelfTest.java |    9 +-
 ...nedQueueFailoverDataConsistencySelfTest.java |    7 -
 ...CachePartitionedQueueJoinedNodeSelfTest.java |    7 -
 ...dCachePartitionedQueueMultiNodeSelfTest.java |    7 -
 ...hePartitionedQueueRotativeMultiNodeTest.java |    7 -
 ...GridCachePartitionedSetFailoverSelfTest.java |    7 -
 .../GridCachePartitionedSetSelfTest.java        |    7 -
 .../IgnitePartitionedQueueNoBackupsTest.java    |    7 -
 ...eplicatedDataStructuresFailoverSelfTest.java |    7 -
 .../GridCacheReplicatedQueueApiSelfTest.java    |    7 -
 ...idCacheReplicatedQueueMultiNodeSelfTest.java |    7 -
 ...cheReplicatedQueueRotativeMultiNodeTest.java |    7 -
 .../GridCacheReplicatedSetSelfTest.java         |    7 -
 .../distributed/CacheAffinityEarlyTest.java     |    2 +-
 ...CacheAtomicNearUpdateTopologyChangeTest.java |    7 -
 .../CacheAtomicPrimarySyncBackPressureTest.java |  165 +
 .../CacheGetFutureHangsSelfTest.java            |    2 +-
 ...eLateAffinityAssignmentFairAffinityTest.java |   32 -
 .../CacheLateAffinityAssignmentTest.java        |   13 +-
 ...CacheLoadingConcurrentGridStartSelfTest.java |   22 +-
 ...NearDisabledAtomicInvokeRestartSelfTest.java |    6 -
 ...tractDistributedByteArrayValuesSelfTest.java |  130 +-
 .../GridCacheAbstractNodeRestartSelfTest.java   |  116 +-
 ...tractPartitionedByteArrayValuesSelfTest.java |   35 +-
 .../GridCacheClientModesAbstractSelfTest.java   |    4 +-
 ...acheEntrySetIterationPreloadingSelfTest.java |    6 +-
 .../distributed/GridCacheEventAbstractTest.java |  103 +-
 ...heExpiredEntriesPreloadAbstractSelfTest.java |  122 -
 ...dCacheMultithreadedFailoverAbstractTest.java |   19 +-
 ...ridCachePartitionNotLoadedEventSelfTest.java |   21 +-
 ...chePartitionedReloadAllAbstractSelfTest.java |   11 -
 ...GridCachePreloadRestartAbstractSelfTest.java |   12 +-
 .../GridCacheTransformEventSelfTest.java        |    2 -
 ...ActiveOnStartNodeJoinValidationSelfTest.java |  134 +
 .../IgniteCacheAtomicNodeJoinTest.java          |    6 -
 .../IgniteCacheAtomicNodeRestartTest.java       |    5 -
 ...niteCacheClientNodeChangingTopologyTest.java |  144 +-
 ...teCacheClientNodePartitionsExchangeTest.java |   18 +-
 .../IgniteCacheCreatePutMultiNodeSelfTest.java  |    2 +-
 .../distributed/IgniteCacheCreatePutTest.java   |    2 +-
 .../IgniteCacheMessageRecoveryAbstractTest.java |    2 -
 .../IgniteCacheNearOffheapGetSelfTest.java      |  136 -
 .../IgniteCachePartitionLossPolicySelfTest.java |  352 ++
 .../IgniteCacheReadFromBackupTest.java          |    6 +-
 .../IgniteCacheTxFairAffinityNodeJoinTest.java  |   35 -
 .../IgniteCacheTxIteratorSelfTest.java          |   34 +-
 ...arDisabledFairAffinityPutGetRestartTest.java |   35 -
 .../IgniteTxCachePrimarySyncTest.java           |    2 +
 ...teSynchronizationModesMultithreadedTest.java |    5 +-
 ...xOriginatingNodeFailureAbstractSelfTest.java |    3 +-
 ...cOriginatingNodeFailureAbstractSelfTest.java |    5 +-
 ...tPartitionedOnlyByteArrayValuesSelfTest.java |   60 +-
 ...acheAtomicExpiredEntriesPreloadSelfTest.java |   46 -
 .../dht/GridCacheAtomicFullApiSelfTest.java     |   19 -
 .../dht/GridCacheAtomicNearCacheSelfTest.java   |  112 +-
 ...EnabledPrimaryWriteOrderFullApiSelfTest.java |   31 -
 ...eAtomicPrimaryWriteOrderFullApiSelfTest.java |   32 -
 ...tomicPrimaryWriteOrderReloadAllSelfTest.java |   32 -
 .../dht/GridCacheColocatedDebugTest.java        |    1 -
 ...eColocatedOptimisticTransactionSelfTest.java |    4 -
 .../GridCacheDhtAtomicRemoveFailureTest.java    |    7 -
 .../dht/GridCacheDhtEntrySelfTest.java          |   14 +-
 ...GridCacheDhtEvictionNearReadersSelfTest.java |    7 +-
 .../dht/GridCacheDhtEvictionSelfTest.java       |  357 --
 .../GridCacheDhtEvictionsDisabledSelfTest.java  |    6 +-
 ...idCacheDhtExpiredEntriesPreloadSelfTest.java |   39 -
 .../dht/GridCacheDhtPreloadDelayedSelfTest.java |    2 +-
 .../GridCacheDhtPreloadDisabledSelfTest.java    |   11 +-
 .../dht/GridCacheDhtPreloadOffHeapSelfTest.java |   38 -
 .../dht/GridCacheDhtPreloadOnheapSelfTest.java  |   26 +
 .../dht/GridCacheDhtPreloadSelfTest.java        |   43 +-
 ...icOffHeapTieredMultiNodeFullApiSelfTest.java |   43 -
 ...NearDisabledAtomicOnheapFullApiSelfTest.java |   38 +
 ...ledAtomicOnheapMultiNodeFullApiSelfTest.java |   38 +
 ...ledFairAffinityMultiNodeFullApiSelfTest.java |   36 -
 ...ionedNearDisabledOffHeapFullApiSelfTest.java |   33 -
 ...DisabledOffHeapMultiNodeFullApiSelfTest.java |   33 -
 ...abledOffHeapTieredAtomicFullApiSelfTest.java |   57 -
 ...earDisabledOffHeapTieredFullApiSelfTest.java |   33 -
 ...edOffHeapTieredMultiNodeFullApiSelfTest.java |   33 -
 ...tionedNearDisabledOnheapFullApiSelfTest.java |   27 +
 ...rDisabledOnheapMultiNodeFullApiSelfTest.java |   27 +
 .../dht/GridCacheTxNodeFailureSelfTest.java     |   13 +-
 .../dht/GridNearCacheTxNodeFailureSelfTest.java |   31 -
 .../dht/IgniteCacheConcurrentPutGetRemove.java  |   29 +-
 .../IgniteCacheCrossCacheTxFailoverTest.java    |   49 +-
 .../dht/IgniteCacheMultiTxLockSelfTest.java     |    3 +
 ...artitionedBackupNodeFailureRecoveryTest.java |   23 +-
 .../IgniteCachePutRetryAbstractSelfTest.java    |   97 +-
 .../dht/IgniteCachePutRetryAtomicSelfTest.java  |    2 +-
 ...gniteCachePutRetryTransactionalSelfTest.java |   30 +-
 .../dht/IgniteCrossCacheTxSelfTest.java         |    8 +
 .../AtomicPutAllChangingTopologyTest.java       |    4 +-
 .../atomic/GridCacheAtomicFailoverSelfTest.java |    3 -
 ...eAtomicInvalidPartitionHandlingSelfTest.java |  110 +-
 ...AtomicPrimaryWriteOrderFailoverSelfTest.java |   36 -
 ...tomicPrimaryWriteOrderRemoveFailureTest.java |   53 -
 .../GridCacheAtomicRemoveFailureTest.java       |    7 -
 ...micPrimaryWriteOrderNearEnabledSelfTest.java |   39 -
 ...sistencyAtomicPrimaryWriteOrderSelfTest.java |   32 -
 .../atomic/IgniteCacheAtomicProtocolTest.java   |    3 +-
 ...PutRetryAtomicPrimaryWriteOrderSelfTest.java |   32 -
 ...nlyFairAffinityMultiNodeFullApiSelfTest.java |   36 -
 ...tomicClientOnlyMultiNodeFullApiSelfTest.java |  116 +-
 ...micFairAffinityMultiNodeFullApiSelfTest.java |   35 -
 ...LateAffDisabledMultiNodeFullApiSelfTest.java |   35 +
 ...imaryWriteOrderMultiNodeFullApiSelfTest.java |   35 -
 ...GridCacheAtomicMultiNodeFullApiSelfTest.java |   10 -
 ...omicMultiNodeP2PDisabledFullApiSelfTest.java |   19 -
 ...ledFairAffinityMultiNodeFullApiSelfTest.java |   36 -
 ...imaryWriteOrderMultiNodeFullApiSelfTest.java |   31 -
 ...eAtomicNearOnlyMultiNodeFullApiSelfTest.java |   52 -
 .../GridCacheAtomicNearRemoveFailureTest.java   |    7 -
 .../GridCacheAtomicOffHeapFullApiSelfTest.java  |   67 -
 ...heAtomicOffHeapMultiNodeFullApiSelfTest.java |   68 -
 ...CacheAtomicOffHeapTieredFullApiSelfTest.java |   32 -
 ...icOffHeapTieredMultiNodeFullApiSelfTest.java |   33 -
 .../GridCacheAtomicOnheapFullApiSelfTest.java   |   28 +
 ...cheAtomicOnheapMultiNodeFullApiSelfTest.java |   26 +
 ...idCacheAtomicPartitionedMetricsSelfTest.java |    2 -
 ...derFairAffinityMultiNodeFullApiSelfTest.java |   36 -
 ...imaryWriteOrderMultiNodeFullApiSelfTest.java |   32 -
 ...rderMultiNodeP2PDisabledFullApiSelfTest.java |   33 -
 ...cPrimaryWriteOrderNearRemoveFailureTest.java |   52 -
 ...PrimaryWriteOrderOffHeapFullApiSelfTest.java |   32 -
 ...yWriteOrderOffHeapTieredFullApiSelfTest.java |   33 -
 ...ityOrderOffHeapMultiNodeFullApiSelfTest.java |   33 -
 ...erOffHeapTieredMultiNodeFullApiSelfTest.java |   33 -
 .../near/GridCacheNearEvictionSelfTest.java     |    2 -
 ...dCacheNearExpiredEntriesPreloadSelfTest.java |   33 -
 .../near/GridCacheNearMultiNodeSelfTest.java    |   36 +-
 .../near/GridCacheNearOneNodeSelfTest.java      |    2 +-
 ...nlyFairAffinityMultiNodeFullApiSelfTest.java |   35 -
 ...idCacheNearOnlyMultiNodeFullApiSelfTest.java |   12 +-
 .../near/GridCacheNearReadersSelfTest.java      |   36 +-
 .../near/GridCacheNearTxForceKeyTest.java       |   14 +-
 ...rtitionedAffinityHashIdResolverSelfTest.java |  102 -
 ...ePartitionedAtomicOnheapFullApiSelfTest.java |   38 +
 ...nedAtomicOnheapMultiNodeFullApiSelfTest.java |   38 +
 ...ePartitionedBasicStoreMultiNodeSelfTest.java |    1 -
 .../GridCachePartitionedEvictionSelfTest.java   |    3 +-
 .../GridCachePartitionedFullApiSelfTest.java    |    3 -
 ...achePartitionedMultiNodeCounterSelfTest.java |   12 +-
 ...achePartitionedMultiNodeFullApiSelfTest.java |   45 -
 ...ePartitionedMultiThreadedPutGetSelfTest.java |    3 +-
 ...dCachePartitionedOffHeapFullApiSelfTest.java |   32 -
 ...titionedOffHeapMultiNodeFullApiSelfTest.java |   32 -
 ...PartitionedOffHeapTieredFullApiSelfTest.java |   32 -
 ...edOffHeapTieredMultiNodeFullApiSelfTest.java |   73 -
 ...idCachePartitionedOnheapFullApiSelfTest.java |   26 +
 ...rtitionedOnheapMultiNodeFullApiSelfTest.java |   26 +
 ...achePartitionedPreloadLifecycleSelfTest.java |    1 -
 .../GridNearOffheapCacheStoreUpdateTest.java    |   35 -
 .../near/GridPartitionedBackupLoadSelfTest.java |    4 +-
 .../near/IgniteCacheNearOnlyTxTest.java         |   12 +-
 .../near/NearCachePutAllMultinodeTest.java      |    1 -
 .../near/NearCacheSyncUpdateTest.java           |   27 +-
 .../near/NoneRebalanceModeSelfTest.java         |    4 +-
 .../GridCacheRebalancingOrderingTest.java       |    2 -
 ...cheRebalancingPartitionDistributionTest.java |    4 +-
 .../GridCacheRebalancingSyncSelfTest.java       |   26 +-
 ...eRebalancingUnmarshallingFailedSelfTest.java |    6 +-
 ...xcludeNeighborsMultiNodeFullApiSelfTest.java |   36 -
 ...tedFairAffinityMultiNodeFullApiSelfTest.java |   35 -
 ...stractReplicatedByteArrayValuesSelfTest.java |   30 -
 ...ridCacheAtomicReplicatedMetricsSelfTest.java |    2 -
 ...nedFairAffinityMultiNodeFullApiSelfTest.java |   37 -
 ...eplicatedAtomicMultiNodeFullApiSelfTest.java |   19 -
 ...imaryWriteOrderMultiNodeFullApiSelfTest.java |   33 -
 .../GridCacheReplicatedEvictionSelfTest.java    |  135 -
 .../GridCacheReplicatedFullApiSelfTest.java     |    9 -
 ...idCacheReplicatedOffHeapFullApiSelfTest.java |   32 -
 ...plicatedOffHeapMultiNodeFullApiSelfTest.java |   32 -
 ...eReplicatedOffHeapTieredFullApiSelfTest.java |   33 -
 ...edOffHeapTieredMultiNodeFullApiSelfTest.java |   33 -
 ...ridCacheReplicatedOnheapFullApiSelfTest.java |   26 +
 ...eplicatedOnheapMultiNodeFullApiSelfTest.java |   26 +
 ...idCacheReplicatedUnswapAdvancedSelfTest.java |    6 +-
 ...CacheReplicatedPreloadLifecycleSelfTest.java |    1 -
 ...idCacheReplicatedPreloadOffHeapSelfTest.java |   37 -
 .../GridCacheReplicatedPreloadSelfTest.java     |   25 +-
 .../cache/eviction/EvictionAbstractTest.java    |   38 +-
 .../GridCacheBatchEvictUnswapSelfTest.java      |  200 -
 ...heConcurrentEvictionConsistencySelfTest.java |    8 +-
 .../GridCacheConcurrentEvictionsSelfTest.java   |    3 +-
 .../GridCacheDistributedEvictionsSelfTest.java  |  237 -
 .../GridCacheEmptyEntriesAbstractSelfTest.java  |    6 +-
 .../GridCacheEvictableEntryEqualsSelfTest.java  |    1 +
 .../GridCacheEvictionFilterSelfTest.java        |    3 +-
 .../GridCacheEvictionLockUnlockSelfTest.java    |    1 +
 .../GridCacheEvictionTouchSelfTest.java         |   14 +-
 ...cheSynchronousEvictionsFailoverSelfTest.java |  167 -
 .../lru/LruNearEvictionPolicySelfTest.java      |   28 -
 .../LruNearOnlyNearEvictionPolicySelfTest.java  |   55 -
 .../paged/PageEvictionAbstractTest.java         |  124 +
 .../paged/PageEvictionMultinodeTest.java        |  110 +
 .../paged/PageEvictionReadThroughTest.java      |  140 +
 .../paged/PageEvictionTouchOrderTest.java       |  109 +
 .../paged/PageEvictionWithRebalanceTest.java    |   81 +
 .../Random2LruPageEvictionMultinodeTest.java    |   30 +
 ...Random2LruPageEvictionWithRebalanceTest.java |   30 +
 .../RandomLruPageEvictionMultinodeTest.java     |   30 +
 .../RandomLruPageEvictionWithRebalanceTest.java |   30 +
 .../cache/eviction/paged/TestObject.java        |   78 +
 .../SortedEvictionPolicyPerformanceTest.java    |    2 +-
 .../IgniteCacheAtomicExpiryPolicyTest.java      |    7 -
 ...iteCacheAtomicExpiryPolicyWithStoreTest.java |    7 -
 ...CacheAtomicLocalOffheapExpiryPolicyTest.java |   30 -
 ...eCacheAtomicLocalOnheapExpiryPolicyTest.java |   26 +
 ...gniteCacheAtomicOffheapExpiryPolicyTest.java |   30 -
 ...IgniteCacheAtomicOnheapExpiryPolicyTest.java |   26 +
 ...AtomicPrimaryWriteOrderExpiryPolicyTest.java |   32 -
 ...rimaryWriteOrderOffheapExpiryPolicyTest.java |   31 -
 ...maryWriteOrderWithStoreExpiryPolicyTest.java |   32 -
 ...teOrderWithStoreOffheapExpiryPolicyTest.java |   31 -
 ...AtomicReplicatedOffheapExpiryPolicyTest.java |   30 -
 ...eAtomicWithStoreOffheapExpiryPolicyTest.java |   30 -
 .../IgniteCacheClientNearCacheExpiryTest.java   |   28 +-
 .../IgniteCacheExpiryPolicyAbstractTest.java    |  132 +-
 .../IgniteCacheExpiryPolicyTestSuite.java       |   17 +-
 ...eCacheExpiryPolicyWithStoreAbstractTest.java |   22 +-
 .../expiry/IgniteCacheLargeValueExpireTest.java |  175 +
 ...niteCacheTxLocalOffheapExpiryPolicyTest.java |   30 -
 .../IgniteCacheTxOffheapExpiryPolicyTest.java   |   30 -
 ...acheTxReplicatedOffheapExpiryPolicyTest.java |   30 -
 ...CacheTxWithStoreOffheapExpiryPolicyTest.java |   30 -
 .../IgniteCacheAtomicLoadAllTest.java           |    7 -
 .../IgniteCacheAtomicLoaderWriterTest.java      |    7 -
 ...gniteCacheAtomicNoLoadPreviousValueTest.java |    7 -
 .../IgniteCacheAtomicNoReadThroughTest.java     |    7 -
 .../IgniteCacheAtomicNoWriteThroughTest.java    |    7 -
 .../IgniteCacheAtomicStoreSessionTest.java      |    7 -
 ...eCacheAtomicStoreSessionWriteBehindTest.java |    7 -
 ...IgniteCacheJdbcBlobStoreNodeRestartTest.java |    8 -
 .../IgniteCacheLoadAllAbstractTest.java         |    9 +-
 .../GridCacheAtomicLocalMetricsSelfTest.java    |    2 -
 ...dCacheLocalAtomicOffHeapFullApiSelfTest.java |   42 -
 ...LocalAtomicOffHeapTieredFullApiSelfTest.java |   32 -
 ...cheLocalBasicStoreMultithreadedSelfTest.java |    1 +
 .../GridCacheLocalByteArrayValuesSelfTest.java  |   71 +-
 .../local/GridCacheLocalFullApiSelfTest.java    |    9 -
 .../GridCacheLocalOffHeapFullApiSelfTest.java   |   30 -
 ...dCacheLocalOffHeapTieredFullApiSelfTest.java |   32 -
 ...LocalCacheOffHeapAndSwapMetricsSelfTest.java |  621 ---
 ...OnlyFairAffinityMultiJvmFullApiSelfTest.java |   31 -
 ...omicFairAffinityMultiJvmFullApiSelfTest.java |   31 -
 ...bledFairAffinityMultiJvmFullApiSelfTest.java |   36 -
 ...rimaryWriteOrderMultiJvmFullApiSelfTest.java |   31 -
 ...cheAtomicOffHeapMultiJvmFullApiSelfTest.java |   31 -
 ...micOffHeapTieredMultiJvmFullApiSelfTest.java |   36 -
 ...acheAtomicOnheapMultiJvmFullApiSelfTest.java |   28 +
 ...rderFairAffinityMultiJvmFullApiSelfTest.java |   31 -
 ...rimaryWriteOrderMultiJvmFullApiSelfTest.java |   31 -
 ...OrderMultiJvmP2PDisabledFullApiSelfTest.java |   31 -
 ...rityOrderOffHeapMultiJvmFullApiSelfTest.java |   31 -
 ...derOffHeapTieredMultiJvmFullApiSelfTest.java |   36 -
 ...OnlyFairAffinityMultiJvmFullApiSelfTest.java |   31 -
 ...onedFairAffinityMultiJvmFullApiSelfTest.java |   31 -
 ...micOffHeapTieredMultiJvmFullApiSelfTest.java |   36 -
 ...bledAtomicOnheapMultiJvmFullApiSelfTest.java |   28 +
 ...bledFairAffinityMultiJvmFullApiSelfTest.java |   31 -
 ...rDisabledOffHeapMultiJvmFullApiSelfTest.java |   31 -
 ...ledOffHeapTieredMultiJvmFullApiSelfTest.java |   36 -
 ...arDisabledOnheapMultiJvmFullApiSelfTest.java |   28 +
 ...rtitionedOffHeapMultiJvmFullApiSelfTest.java |   31 -
 ...nedOffHeapTieredMultiJvmFullApiSelfTest.java |   36 -
 ...artitionedOnheapMultiJvmFullApiSelfTest.java |   28 +
 ...rimaryWriteOrderMultiJvmFullApiSelfTest.java |   31 -
 ...eplicatedOffHeapMultiJvmFullApiSelfTest.java |   31 -
 ...tedOffHeapTieredMultiJvmFullApiSelfTest.java |   36 -
 ...ReplicatedOnheapMultiJvmFullApiSelfTest.java |   28 +
 .../GridCacheSwapScanQueryAbstractSelfTest.java |  435 --
 .../query/GridCacheSwapScanQuerySelfTest.java   |   25 -
 .../IgniteCacheQueryCacheDestroySelfTest.java   |    2 -
 .../continuous/CacheContinuousBatchAckTest.java |   73 +-
 ...FailoverAtomicPrimaryWriteOrderSelfTest.java |   50 -
 ...tinuousQueryAsyncFailoverAtomicSelfTest.java |   43 +
 ...eContinuousQueryAsyncFilterListenerTest.java |  182 +-
 ...acheContinuousQueryExecuteInPrimaryTest.java |    4 -
 ...usQueryFactoryFilterRandomOperationTest.java |    2 -
 ...ContinuousQueryFailoverAbstractSelfTest.java |   26 +-
 ...ryFailoverAtomicNearEnabledSelfSelfTest.java |    9 +-
 ...tomicPrimaryWriteOrderOffheapTieredTest.java |   33 -
 ...FailoverAtomicPrimaryWriteOrderSelfTest.java |   44 -
 ...usQueryFailoverAtomicReplicatedSelfTest.java |    9 +-
 ...heContinuousQueryFailoverAtomicSelfTest.java |   36 +
 ...tinuousQueryFailoverTxOffheapTieredTest.java |   32 -
 ...ontinuousQueryOperationFromCallbackTest.java |    2 -
 .../CacheContinuousQueryOperationP2PTest.java   |   33 +-
 .../CacheContinuousQueryOrderingEventTest.java  |  130 +-
 ...acheContinuousQueryRandomOperationsTest.java |  325 +-
 .../CacheEntryProcessorNonSerializableTest.java |    2 +-
 ...CacheKeepBinaryIterationNearEnabledTest.java |    6 +-
 ...acheKeepBinaryIterationStoreEnabledTest.java |    6 +-
 ...CacheKeepBinaryIterationSwapEnabledTest.java |   56 -
 .../CacheKeepBinaryIterationTest.java           |  105 +-
 ...ridCacheContinuousQueryAbstractSelfTest.java |   10 -
 ...eContinuousQueryAtomicOffheapTieredTest.java |   32 -
 ...eContinuousQueryAtomicOffheapValuesTest.java |   32 -
 .../GridCacheContinuousQueryConcurrentTest.java |   47 +-
 ...CacheContinuousQueryTxOffheapTieredTest.java |   32 -
 ...CacheContinuousQueryTxOffheapValuesTest.java |   32 -
 ...niteCacheContinuousQueryBackupQueueTest.java |    6 +
 .../IgniteCacheContinuousQueryClientTest.java   |   23 +-
 ...teCacheContinuousQueryNoUnsubscribeTest.java |    2 +
 ...idCacheWriteBehindStoreAbstractSelfTest.java |   24 +-
 .../GridCacheWriteBehindStoreAbstractTest.java  |    5 +-
 ...heWriteBehindStoreMultithreadedSelfTest.java |   88 +-
 .../GridCacheWriteBehindStoreSelfTest.java      |  159 +-
 ...teCacheClientWriteBehindStoreAtomicTest.java |    7 -
 ...ClientWriteBehindStoreNonCoalescingTest.java |  168 +
 .../transactions/DepthFirstSearchTest.java      |   18 +-
 .../TxOptimisticDeadlockDetectionTest.java      |   12 +-
 .../TxPessimisticDeadlockDetectionTest.java     |   17 +
 .../CacheVersionedEntryAbstractTest.java        |   17 +-
 ...edEntryPartitionedAtomicOffHeapSelfTest.java |   35 -
 ...PartitionedTransactionalOffHeapSelfTest.java |   36 -
 ...nedEntryReplicatedAtomicOffHeapSelfTest.java |   35 -
 ...yReplicatedTransactionalOffHeapSelfTest.java |   36 -
 .../clock/GridTimeSyncProcessorSelfTest.java    |  224 -
 .../continuous/GridEventConsumeSelfTest.java    |    3 +-
 .../database/BPlusTreeFakeReuseSelfTest.java    |   63 +
 .../database/BPlusTreeReuseSelfTest.java        |  131 +
 .../processors/database/BPlusTreeSelfTest.java  | 1762 +++++++
 .../database/FreeListImplSelfTest.java          |  563 +++
 .../database/IgniteDbAbstractTest.java          |  367 ++
 .../database/IgniteDbDynamicCacheSelfTest.java  |  152 +
 .../IgniteDbMemoryLeakAbstractTest.java         |  263 +
 .../IgniteDbMemoryLeakLargeObjectsTest.java     |   56 +
 .../IgniteDbMemoryLeakLargePagesTest.java       |   33 +
 .../IgniteDbMemoryLeakNonTransactionalTest.java |   31 +
 .../database/IgniteDbMemoryLeakTest.java        |   46 +
 .../IgniteDbMemoryLeakWithExpirationTest.java   |   44 +
 .../database/IgniteDbMultiNodePutGetTest.java   |   33 +
 .../database/IgniteDbPutGetAbstractTest.java    | 1212 +++++
 .../database/IgniteDbSingleNodePutGetTest.java  |   33 +
 .../IgniteDbSingleNodeTinyPutGetTest.java       |  151 +
 .../database/MemoryMetricsSelfTest.java         |  313 ++
 .../database/MetadataStorageSelfTest.java       |  166 +
 .../DataStreamProcessorSelfTest.java            |    8 +-
 .../datastreamer/DataStreamerImplSelfTest.java  |   36 -
 .../DataStreamerUpdateAfterLoadTest.java        |   18 +-
 .../IgniteDataStreamerPerformanceTest.java      |    1 -
 .../igfs/IgfsAbstractBaseSelfTest.java          |   29 +-
 .../processors/igfs/IgfsAbstractSelfTest.java   |   11 -
 .../IgfsAtomicPrimaryOffheapTieredSelfTest.java |   39 -
 .../IgfsAtomicPrimaryOffheapValuesSelfTest.java |   39 -
 ...lockMessageSystemPoolStarvationSelfTest.java |    8 +-
 ...sCachePerBlockLruEvictionPolicySelfTest.java |    1 +
 .../igfs/IgfsDualAbstractSelfTest.java          |   33 -
 .../processors/igfs/IgfsFileInfoSelfTest.java   |    2 +-
 .../processors/igfs/IgfsIgniteMock.java         |   27 +-
 ...fsLocalSecondaryFileSystemProxySelfTest.java |    1 -
 .../processors/igfs/IgfsMaxSizeSelfTest.java    |    1 -
 .../internal/processors/igfs/IgfsMock.java      |    7 -
 .../processors/igfs/IgfsModesSelfTest.java      |  130 -
 .../igfs/IgfsPrimaryOffheapTieredSelfTest.java  |   33 -
 .../igfs/IgfsPrimaryOffheapValuesSelfTest.java  |   33 -
 .../processors/igfs/IgfsProcessorSelfTest.java  |    2 +-
 .../igfs/IgfsProcessorValidationSelfTest.java   |   19 +-
 .../processors/igfs/IgfsSizeSelfTest.java       |    5 -
 .../odbc/OdbcProcessorValidationSelfTest.java   |   23 +-
 .../service/ClosureServiceClientsNodesTest.java |    2 +-
 .../GridServiceProcessorAbstractSelfTest.java   |   28 +
 ...ServiceProcessorMultiNodeConfigSelfTest.java |  156 +-
 .../GridServiceProcessorMultiNodeSelfTest.java  |  188 +-
 .../GridServiceProcessorProxySelfTest.java      |   24 +-
 ...gniteServiceConfigVariationsFullApiTest.java |    9 +-
 ...ent2ClassLoadersOptimizedMarshallerTest.java |    2 +-
 ...mentClassLoadingOptimizedMarshallerTest.java |    2 +-
 .../IgniteServiceDynamicCachesSelfTest.java     |   14 +-
 .../ServicePredicateAccessCacheTest.java        |    4 +-
 .../internal/util/GridArraysSelfTest.java       |  129 +
 .../util/future/IgniteFutureImplTest.java       |   38 -
 .../unsafe/GridUnsafeMemorySelfTest.java        |   35 +
 .../apache/ignite/lang/GridTupleSelfTest.java   |   35 -
 .../IgniteOffheapReadWriteLockSelfTest.java     |  479 ++
 ...idFileSwapSpaceSpiMultithreadedLoadTest.java |  252 -
 .../loadtests/GridCacheMultiNodeLoadTest.java   |    2 +-
 .../GridCacheWriteBehindStoreLoadTest.java      |    1 -
 .../loadtests/colocation/GridTestKey.java       |   28 +-
 .../communication/GridIoManagerBenchmark0.java  |    1 -
 .../GridCachePartitionedAtomicLongLoadTest.java |    2 +-
 .../ignite/loadtests/dsi/GridDsiPerfJob.java    |    7 +-
 .../loadtests/hashmap/GridCacheTestContext.java |   12 +-
 .../swap/GridSwapEvictAllBenchmark.java         |  309 --
 ...namicProxySerializationMultiJvmSelfTest.java |    2 +-
 .../GridMarshallerPerformanceTest.java          |    2 +-
 .../marshaller/MarshallerContextSelfTest.java   |   10 +-
 .../OptimizedMarshallerEnumSelfTest.java        |   87 -
 .../OptimizedMarshallerNodeFailoverTest.java    |  357 --
 .../OptimizedMarshallerPooledSelfTest.java      |   44 -
 .../optimized/OptimizedMarshallerSelfTest.java  |  283 --
 ...arshallerSerialPersistentFieldsSelfTest.java |  114 -
 .../optimized/OptimizedMarshallerTest.java      |  790 ---
 .../OptimizedObjectStreamSelfTest.java          | 2157 --------
 .../TestTcpDiscoveryIpFinderAdapter.java        |   43 -
 .../marshaller/optimized/package-info.java      |   22 -
 .../ignite/messaging/GridMessagingSelfTest.java |   13 +-
 .../IgniteMessagingWithClientTest.java          |    2 +-
 .../platform/PlatformCacheWriteMetricsTask.java |  126 +-
 .../platform/PlatformEventsWriteEventTask.java  |   14 +-
 .../plugin/PlatformTestPluginProvider.java      |    6 +
 .../PlatformTestCachePluginConfiguration.java   |    5 -
 ...tCachePluginConfigurationClosureFactory.java |    2 +-
 .../cache/PlatformTestCachePluginProvider.java  |    5 +-
 .../communication/GridCacheMessageSelfTest.java |    2 +-
 ...cpCommunicationSpiMultithreadedSelfTest.java |    4 +-
 .../tcp/TcpCommunicationSpiDropNodesTest.java   |    1 -
 .../TcpCommunicationSpiFaultyClientTest.java    |    1 -
 .../discovery/AbstractDiscoverySelfTest.java    |   15 +
 ...gniteClientReconnectMassiveShutdownTest.java |    3 -
 ...pClientDiscoveryMarshallerCheckSelfTest.java |    2 +-
 .../tcp/TcpClientDiscoverySpiSelfTest.java      |    2 +-
 .../TcpDiscoveryMarshallerCheckSelfTest.java    |    2 +-
 .../tcp/TestReconnectPluginProvider.java        |    7 +
 .../GridInternalTasksLoadBalancingSelfTest.java |   21 +-
 .../GridSwapSpaceSpiAbstractSelfTest.java       |  652 ---
 .../GridSwapSpaceSpiConsistencySelfTest.java    |  131 -
 .../file/GridFileSwapCompactionSelfTest.java    |  131 -
 .../file/GridFileSwapSpaceSpiSelfTest.java      |  456 --
 .../inmemory/GridTestSwapSpaceSpi.java          |  518 --
 .../noop/GridNoopSwapSpaceSpiSelfTest.java      |   61 -
 .../ignite/spi/swapspace/package-info.java      |   22 -
 .../ignite/testframework/GridTestNode.java      |   12 +-
 .../ignite/testframework/GridTestUtils.java     |  210 +-
 .../configvariations/ConfigVariations.java      |   36 +-
 .../testframework/junits/GridAbstractTest.java  |   71 +-
 .../junits/GridTestKernalContext.java           |    3 +-
 ...IgniteCacheConfigVariationsAbstractTest.java |   59 +-
 .../ignite/testframework/junits/IgniteMock.java |   25 +
 .../junits/IgniteTestResources.java             |    2 +-
 .../junits/common/GridCommonAbstractTest.java   |  413 +-
 .../multijvm/IgniteCacheProcessProxy.java       |   42 +-
 .../multijvm/IgniteClusterProcessProxy.java     |   11 -
 .../junits/multijvm/IgniteNodeRunner.java       |    5 +-
 .../junits/multijvm/IgniteProcessProxy.java     |   37 +-
 .../ConfigVariationsTestSuiteBuilderTest.java   |    4 +-
 .../ignite/testsuites/IgniteBasicTestSuite.java |   16 +-
 .../testsuites/IgniteBinaryBasicTestSuite.java  |   14 +-
 .../testsuites/IgniteBinaryCacheTestSuite.java  |   22 +-
 .../IgniteBinaryObjectsTestSuite.java           |   21 +-
 .../IgniteCacheDataStructuresSelfTestSuite.java |   18 -
 .../IgniteCacheEvictionSelfTestSuite.java       |   21 +-
 .../IgniteCacheFailoverTestSuite.java           |   10 -
 .../IgniteCacheFailoverTestSuite2.java          |    2 -
 .../IgniteCacheFailoverTestSuite3.java          |    2 -
 ...IgniteCacheFullApiMultiJvmSelfTestSuite.java |   60 +-
 .../IgniteCacheFullApiSelfTestSuite.java        |  116 +-
 .../IgniteCacheMetricsSelfTestSuite.java        |    2 -
 .../ignite/testsuites/IgniteCacheTestSuite.java |   70 +-
 .../testsuites/IgniteCacheTestSuite2.java       |   42 +-
 .../testsuites/IgniteCacheTestSuite3.java       |   16 +-
 .../testsuites/IgniteCacheTestSuite4.java       |   52 +-
 .../testsuites/IgniteCacheTestSuite5.java       |   28 +-
 .../IgniteCacheWriteBehindTestSuite.java        |    2 +
 .../testsuites/IgniteComputeGridTestSuite.java  |    3 +-
 .../testsuites/IgniteDatabaseTestSuite.java     |   40 +
 .../testsuites/IgniteDbMemoryLeakTestSuite.java |   49 +
 .../ignite/testsuites/IgniteIgfsTestSuite.java  |    9 -
 .../testsuites/IgniteKernalSelfTestSuite.java   |    2 -
 .../IgniteMarshallerSelfTestSuite.java          |   14 +-
 .../IgniteSpiSwapSpaceSelfTestSuite.java        |   44 -
 .../ignite/testsuites/IgniteSpiTestSuite.java   |    3 -
 .../testsuites/IgniteUtilSelfTestSuite.java     |    8 +
 .../apache/ignite/util/GridIntListSelfTest.java |  153 +
 .../org.apache.ignite.plugin.PluginProvider     |    1 -
 .../webapp/META-INF/ignite-webapp-config.xml    |    2 +-
 ...CacheDeploymentCachePluginConfiguration.java |   10 +-
 .../apache/ignite/tests/p2p/cache/Person.java   |   41 +
 .../query/h2/opt/GridH2SpatialIndex.java        |   29 +-
 .../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 |    9 +-
 .../hadoop/fs/v1/IgniteHadoopFileSystem.java    |  698 +--
 .../hadoop/fs/v2/IgniteHadoopFileSystem.java    |  481 +-
 .../ignite/hadoop/planner/package-info.java     |   22 +
 .../processors/hadoop/HadoopProcessor.java      |    6 +-
 .../hadoop/igfs/HadoopIgfsEndpoint.java         |    6 +-
 ...doopIgfsSecondaryFileSystemDelegateImpl.java |   11 +-
 .../hadoop/impl/igfs/HadoopIgfsEx.java          |    8 +
 .../hadoop/impl/igfs/HadoopIgfsInProc.java      |   23 +-
 .../hadoop/impl/igfs/HadoopIgfsOutProc.java     |   12 +
 .../hadoop/impl/igfs/HadoopIgfsWrapper.java     |   14 +
 .../hadoop/impl/v1/HadoopV1ReduceTask.java      |    2 +-
 .../external/HadoopExternalTaskExecutor.java    |    2 +-
 .../resources/META-INF/classnames.properties    |   16 +-
 .../test/config/hadoop-fs-open-test/grid-0.xml  |    2 +-
 .../test/config/hadoop-fs-open-test/grid-1.xml  |    2 +-
 .../test/config/hadoop-fs-open-test/grid-2.xml  |    2 +-
 .../test/config/igfs-cli-config-dual-async.xml  |    2 +-
 .../test/config/igfs-cli-config-dual-sync.xml   |    2 +-
 .../src/test/config/igfs-cli-config-primary.xml |    2 +-
 .../src/test/config/igfs-cli-config-proxy.xml   |    2 +-
 .../impl/HadoopAbstractMapReduceTest.java       |    1 -
 .../hadoop/impl/HadoopAbstractSelfTest.java     |    4 +-
 .../impl/HadoopTaskExecutionSelfTest.java       |   16 +-
 ...opClientProtocolMultipleServersSelfTest.java |    8 +-
 .../client/HadoopClientProtocolSelfTest.java    |    7 +-
 .../igfs/HadoopFIleSystemFactorySelfTest.java   |   27 +-
 .../igfs/HadoopIgfsDualAbstractSelfTest.java    |    1 -
 .../IgniteHadoopFileSystemAbstractSelfTest.java |   12 +-
 ...IgniteHadoopFileSystemHandshakeSelfTest.java |  119 +-
 .../IgniteHadoopFileSystemLoggerSelfTest.java   |   32 +-
 ...condaryFileSystemInitializationSelfTest.java |  213 -
 .../testsuites/IgniteHadoopTestSuite.java       |    3 -
 .../HibernateAccessStrategyAdapter.java         |    8 +-
 .../cache/hibernate/HibernateCacheProxy.java    |  811 +++
 .../hibernate/HibernateCollectionRegion.java    |    3 +-
 .../cache/hibernate/HibernateEntityRegion.java  |    3 +-
 .../hibernate/HibernateGeneralDataRegion.java   |    3 +-
 .../hibernate/HibernateKeyTransformer.java      |   28 +
 .../cache/hibernate/HibernateKeyWrapper.java    |   72 +
 .../hibernate/HibernateNaturalIdRegion.java     |    3 +-
 .../HibernateNonStrictAccessStrategy.java       |    5 +-
 .../hibernate/HibernateQueryResultsRegion.java  |    3 +-
 .../HibernateReadOnlyAccessStrategy.java        |    3 +-
 .../HibernateReadWriteAccessStrategy.java       |    3 +-
 .../ignite/cache/hibernate/HibernateRegion.java |    6 +-
 .../cache/hibernate/HibernateRegionFactory.java |   30 +-
 .../hibernate/HibernateTimestampsRegion.java    |    3 +-
 .../HibernateTransactionalAccessStrategy.java   |    2 +-
 .../HibernateTransactionalDataRegion.java       |    3 +-
 .../hibernate/HibernateL2CacheSelfTest.java     |    2 +-
 .../CacheHibernateBlobStoreNodeRestartTest.java |    8 -
 .../IgniteBinaryHibernateTestSuite.java         |   37 +
 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 +
 .../cache/query/GridCacheTwoStepQuery.java      |   26 +-
 .../query/h2/DmlStatementsProcessor.java        |   51 +-
 .../internal/processors/query/h2/H2Cursor.java  |  108 +
 .../processors/query/h2/IgniteH2Indexing.java   |  973 +++-
 .../query/h2/database/H2PkHashIndex.java        |  323 ++
 .../query/h2/database/H2RowFactory.java         |   80 +
 .../processors/query/h2/database/H2Tree.java    |  250 +
 .../query/h2/database/H2TreeIndex.java          |  420 ++
 .../query/h2/database/InlineIndexHelper.java    |  572 +++
 .../query/h2/database/io/H2ExtrasInnerIO.java   |  140 +
 .../query/h2/database/io/H2ExtrasLeafIO.java    |  135 +
 .../query/h2/database/io/H2InnerIO.java         |   74 +
 .../query/h2/database/io/H2LeafIO.java          |   74 +
 .../query/h2/database/io/H2RowLinkIO.java       |   30 +
 .../query/h2/database/util/CompareUtils.java    |  332 ++
 .../query/h2/ddl/DdlStatementsProcessor.java    |  211 +
 .../query/h2/opt/GridH2AbstractKeyValueRow.java |    8 +-
 .../query/h2/opt/GridH2IndexBase.java           |  248 +-
 .../query/h2/opt/GridH2KeyValueRowOffheap.java  |    2 +-
 .../query/h2/opt/GridH2KeyValueRowOnheap.java   |    8 +
 .../query/h2/opt/GridH2MetaTable.java           |    5 +
 .../query/h2/opt/GridH2PrimaryScanIndex.java    |   87 +
 .../processors/query/h2/opt/GridH2Row.java      |   66 +-
 .../query/h2/opt/GridH2RowDescriptor.java       |   13 +-
 .../query/h2/opt/GridH2RowFactory.java          |   15 +
 .../query/h2/opt/GridH2ScanIndex.java           |   55 +-
 .../query/h2/opt/GridH2SystemIndexFactory.java  |   38 +
 .../processors/query/h2/opt/GridH2Table.java    |  545 +-
 .../query/h2/opt/GridH2TreeIndex.java           |  221 +-
 .../query/h2/opt/GridLuceneIndex.java           |   15 +-
 .../query/h2/sql/GridSqlCreateIndex.java        |  121 +
 .../query/h2/sql/GridSqlDropIndex.java          |   82 +
 .../query/h2/sql/GridSqlQueryParser.java        |  123 +
 .../query/h2/sql/GridSqlQuerySplitter.java      |   85 +-
 .../query/h2/twostep/GridMapQueryExecutor.java  |   68 +-
 .../h2/twostep/GridReduceQueryExecutor.java     |  130 +-
 .../h2/twostep/msg/GridH2QueryRequest.java      |  109 +-
 .../cache/CacheIndexStreamerTest.java           |    6 -
 .../cache/CacheIndexingOffheapCleanupTest.java  |  157 -
 .../CacheOffheapBatchIndexingBaseTest.java      |    6 +-
 .../CacheOffheapBatchIndexingMultiTypeTest.java |   17 +-
 ...CacheOffheapBatchIndexingSingleTypeTest.java |   20 +-
 .../CacheOperationsWithExpirationTest.java      |   71 +-
 .../cache/CacheQueryEvictDataLostTest.java      |  120 +
 .../cache/CacheQueryFilterExpiredTest.java      |  111 +
 .../CacheQueryOffheapEvictDataLostTest.java     |  138 -
 .../CacheRandomOperationsMultithreadedTest.java |   66 +-
 .../ClientReconnectAfterClusterRestartTest.java |   16 +-
 .../cache/GridCacheCrossCacheQuerySelfTest.java |   36 +-
 .../cache/GridCacheOffHeapAndSwapSelfTest.java  |  570 ---
 .../cache/GridCacheOffHeapSelfTest.java         |   16 +-
 .../GridCacheOffheapIndexEntryEvictTest.java    |    7 -
 .../cache/GridCacheOffheapIndexGetSelfTest.java |   38 +-
 .../GridCacheQueryIndexDisabledSelfTest.java    |   16 +-
 .../cache/GridCacheQuerySimpleBenchmark.java    |    4 -
 .../processors/cache/GridCacheSwapSelfTest.java |  724 ---
 .../cache/GridIndexingWithNoopSwapSelfTest.java |    7 +-
 .../IgniteBinaryObjectFieldsQuerySelfTest.java  |    5 +-
 ...aryObjectQueryArgumentsOffheapLocalTest.java |   28 -
 ...teBinaryObjectQueryArgumentsOffheapTest.java |   30 -
 .../IgniteBinaryObjectQueryArgumentsTest.java   |   11 -
 .../IgniteCacheAbstractFieldsQuerySelfTest.java |  523 +-
 ...niteCacheAbstractInsertSqlQuerySelfTest.java |  129 -
 .../cache/IgniteCacheAbstractQuerySelfTest.java |  273 +-
 .../IgniteCacheCollocatedQuerySelfTest.java     |    1 -
 ...acheConfigurationPrimitiveTypesSelfTest.java |   50 +-
 .../IgniteCacheCrossCacheJoinRandomTest.java    |    4 +-
 ...acheDistributedJoinCollocatedAndNotTest.java |    2 -
 ...acheDistributedJoinCustomAffinityMapper.java |    2 -
 .../IgniteCacheDistributedJoinNoIndexTest.java  |    2 -
 ...ributedJoinPartitionedAndReplicatedTest.java |    2 -
 ...CacheDistributedJoinQueryConditionsTest.java |   18 -
 .../IgniteCacheInsertSqlQuerySelfTest.java      |   36 -
 ...PartitionedAndReplicatedCollocationTest.java |    7 +-
 ...teCacheJoinPartitionedAndReplicatedTest.java |   14 +-
 .../cache/IgniteCacheLargeResultSelfTest.java   |    1 -
 ...PartitionOnAffinityRunAtomicCacheOpTest.java |   46 +-
 ...niteCacheLockPartitionOnAffinityRunTest.java |   35 +-
 .../cache/IgniteCacheMergeSqlQuerySelfTest.java |   34 -
 .../IgniteCacheMultipleIndexedTypesTest.java    |  200 +
 .../cache/IgniteCacheNoClassQuerySelfTest.java  |    2 +-
 .../cache/IgniteCacheOffheapEvictQueryTest.java |   10 -
 .../cache/IgniteCacheOffheapIndexScanTest.java  |    3 -
 ...CacheOffheapTieredMultithreadedSelfTest.java |  302 --
 .../cache/IgniteCacheQueriesLoadTest1.java      |    2 -
 ...QueryMultiThreadedOffHeapTieredSelfTest.java |   38 -
 .../IgniteCacheQueryMultiThreadedSelfTest.java  |  122 +-
 ...QueryOffheapEvictsMultiThreadedSelfTest.java |   28 -
 ...eCacheQueryOffheapMultiThreadedSelfTest.java |   28 -
 .../cache/IgniteCacheUnionDuplicatesTest.java   |   21 +-
 .../cache/IgniteCrossCachesJoinsQueryTest.java  |   25 +-
 .../cache/IncorrectQueryEntityTest.java         |    8 +-
 .../cache/SqlFieldsQuerySelfTest.java           |   23 -
 ...niteCachePartitionedFieldsQuerySelfTest.java |   13 +-
 .../IgniteCachePartitionedQuerySelfTest.java    |    8 +-
 ...QueryNodeRestartDistributedJoinSelfTest.java |  165 +-
 .../IgniteCacheQueryNodeRestartSelfTest.java    |    3 +-
 ...iteCacheReplicatedFieldsQueryROSelfTest.java |   27 +
 ...gniteCacheReplicatedFieldsQuerySelfTest.java |    6 +-
 .../IgniteCacheReplicatedQuerySelfTest.java     |   25 +-
 .../cache/index/AbstractSchemaSelfTest.java     |  512 ++
 .../index/DuplicateKeyValueClassesSelfTest.java |   94 +
 .../DynamicIndexAbstractBasicSelfTest.java      | 1066 ++++
 .../DynamicIndexAbstractConcurrentSelfTest.java |  921 ++++
 .../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 +
 .../cache/index/SchemaExchangeSelfTest.java     |  589 +++
 .../IgniteCacheLocalFieldsQuerySelfTest.java    |    4 +-
 .../local/IgniteCacheLocalQuerySelfTest.java    |    4 +-
 .../cache/ttl/CacheTtlAbstractSelfTest.java     |   31 +-
 .../ttl/CacheTtlAtomicAbstractSelfTest.java     |   29 +
 .../cache/ttl/CacheTtlAtomicLocalSelfTest.java  |   34 +
 .../ttl/CacheTtlAtomicPartitionedSelfTest.java  |   34 +
 .../ttl/CacheTtlOffheapAbstractSelfTest.java    |   29 -
 .../CacheTtlOffheapAtomicAbstractSelfTest.java  |   29 -
 .../ttl/CacheTtlOffheapAtomicLocalSelfTest.java |   34 -
 ...acheTtlOffheapAtomicPartitionedSelfTest.java |   34 -
 ...TtlOffheapTransactionalAbstractSelfTest.java |   29 -
 ...cheTtlOffheapTransactionalLocalSelfTest.java |   34 -
 ...OffheapTransactionalPartitionedSelfTest.java |   34 -
 .../ttl/CacheTtlOnheapAbstractSelfTest.java     |   29 -
 .../CacheTtlOnheapAtomicAbstractSelfTest.java   |   29 -
 .../ttl/CacheTtlOnheapAtomicLocalSelfTest.java  |   34 -
 ...CacheTtlOnheapAtomicPartitionedSelfTest.java |   34 -
 ...eTtlOnheapTransactionalAbstractSelfTest.java |   29 -
 ...acheTtlOnheapTransactionalLocalSelfTest.java |   34 -
 ...lOnheapTransactionalPartitionedSelfTest.java |   34 -
 .../CacheTtlTransactionalAbstractSelfTest.java  |   29 +
 .../ttl/CacheTtlTransactionalLocalSelfTest.java |   34 +
 ...acheTtlTransactionalPartitionedSelfTest.java |   34 +
 .../database/IgniteDbMemoryLeakIndexedTest.java |   33 +
 .../IgniteDbMemoryLeakSqlQueryTest.java         |   76 +
 ...IgniteDbMultiNodeWithIndexingPutGetTest.java |   28 +
 ...gniteDbSingleNodeWithIndexingPutGetTest.java |  251 +
 .../query/IgniteQueryDedicatedPoolTest.java     |    1 -
 .../query/IgniteSqlDistributedJoinSelfTest.java |  199 +
 .../query/IgniteSqlSchemaIndexingTest.java      |   17 +-
 ...gniteSqlSegmentedIndexMultiNodeSelfTest.java |   28 +
 .../query/IgniteSqlSegmentedIndexSelfTest.java  |  159 +-
 .../query/IgniteSqlSplitterSelfTest.java        |  219 +-
 .../h2/GridIndexingSpiAbstractSelfTest.java     |  365 +-
 .../query/h2/IgniteSqlQueryMinMaxTest.java      |  376 ++
 .../h2/database/InlineIndexHelperTest.java      |  367 ++
 .../query/h2/opt/GridH2TableSelfTest.java       |  244 +-
 .../h2/sql/AbstractH2CompareQueryTest.java      |   77 +-
 .../query/h2/sql/BaseH2CompareQueryTest.java    |  346 +-
 .../query/h2/sql/GridQueryParsingTest.java      |  380 +-
 .../query/h2/sql/H2CompareBigQueryTest.java     |  114 +-
 .../FetchingQueryCursorStressTest.java          |    2 +-
 .../IgniteCacheQuerySelfTestSuite.java          |   76 +-
 .../IgniteCacheQuerySelfTestSuite2.java         |   21 +-
 .../IgniteCacheQuerySelfTestSuite3.java         |   12 +-
 .../IgniteCacheQuerySelfTestSuite4.java         |   12 +-
 .../IgniteCacheWithIndexingTestSuite.java       |   32 +-
 ...IgniteDbMemoryLeakWithIndexingTestSuite.java |   40 +
 .../IgniteDistributedJoinTestSuite.java         |   55 +
 .../processors/query/h2/sql/bigQuery.sql        |   14 +-
 .../ignite/stream/kafka/TestKafkaBroker.java    |    2 +-
 modules/log4j2/pom.xml                          |    4 +-
 .../ignite/logger/log4j2/Log4J2Logger.java      |   23 +-
 modules/ml/README.txt                           |   15 +
 modules/ml/licenses/apache-2.0.txt              |  202 +
 modules/ml/licenses/mit.txt                     |    7 +
 modules/ml/pom.xml                              |  103 +
 .../java/org/apache/ignite/ml/math/Algebra.java |  573 +++
 .../org/apache/ignite/ml/math/Constants.java    |   59 +
 .../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   |  247 +
 .../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  |   37 +
 .../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 |  932 ++++
 .../ml/math/decompositions/LUDecomposition.java |  372 ++
 .../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     |  137 +
 .../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   |   32 +
 .../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       |  159 +
 .../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 |  241 +
 .../ml/math/impls/matrix/RandomMatrix.java      |   97 +
 .../impls/matrix/SparseDistributedMatrix.java   |  156 +
 .../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       |  202 +
 .../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   |  163 +
 .../vector/DenseLocalOffHeapVectorStorage.java  |  172 +
 .../storage/vector/FunctionVectorStorage.java   |  141 +
 .../storage/vector/MatrixVectorStorage.java     |  178 +
 .../storage/vector/PivotedVectorStorage.java    |  175 +
 .../storage/vector/RandomVectorStorage.java     |  152 +
 .../SingleElementVectorDelegateStorage.java     |  145 +
 .../vector/SingleElementVectorStorage.java      |  143 +
 .../vector/SparseLocalOffHeapVectorStorage.java |  151 +
 .../vector/SparseLocalOnHeapVectorStorage.java  |  152 +
 .../math/impls/storage/vector/package-info.java |   22 +
 .../impls/vector/AbstractReadOnlyVector.java    |  125 +
 .../ml/math/impls/vector/AbstractVector.java    |  907 ++++
 .../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 |  162 +
 .../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 +
 .../ignite/ml/math/d3-matrix-template.html      |  128 +
 .../ignite/ml/math/d3-vector-template.html      |  111 +
 .../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   |  367 ++
 .../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 +
 .../osgi-karaf/src/main/resources/features.xml  |    9 +-
 modules/osgi/pom.xml                            |    1 -
 modules/platforms/.gitignore                    |   31 +
 modules/platforms/cpp/binary/Makefile.am        |    1 -
 .../platforms/cpp/binary/include/Makefile.am    |    3 -
 .../binary/binary_array_identity_resolver.h     |   64 -
 .../include/ignite/binary/binary_consts.h       |   86 +-
 .../include/ignite/binary/binary_containers.h   |   12 +-
 .../ignite/binary/binary_identity_resolver.h    |   61 -
 .../include/ignite/binary/binary_object.h       |   12 +-
 .../include/ignite/binary/binary_raw_reader.h   |    6 +-
 .../include/ignite/binary/binary_raw_writer.h   |   16 +-
 .../include/ignite/binary/binary_reader.h       |    6 +-
 .../binary/include/ignite/binary/binary_type.h  |  137 +-
 .../include/ignite/binary/binary_writer.h       |   13 +-
 .../ignite/impl/binary/binary_id_resolver.h     |   33 +-
 .../ignite/impl/binary/binary_object_impl.h     |    3 +-
 .../ignite/impl/binary/binary_reader_impl.h     |  111 +-
 .../include/ignite/impl/binary/binary_schema.h  |   19 +-
 .../ignite/impl/binary/binary_type_impl.h       |  149 -
 .../include/ignite/impl/binary/binary_utils.h   |    7 +-
 .../ignite/impl/binary/binary_writer_impl.h     |   41 +-
 .../cpp/binary/project/vs/binary.vcxproj        |    4 -
 .../binary/project/vs/binary.vcxproj.filters    |   12 -
 .../binary/binary_array_identity_resolver.cpp   |   42 -
 .../cpp/binary/src/binary/binary_raw_reader.cpp |    2 +-
 .../cpp/binary/src/binary/binary_reader.cpp     |    2 +-
 .../src/impl/binary/binary_reader_impl.cpp      |   50 +-
 .../binary/src/impl/binary/binary_schema.cpp    |   17 +-
 .../src/impl/binary/binary_writer_impl.cpp      |   14 +-
 modules/platforms/cpp/common/configure.ac       |   62 +
 .../cpp/core-test/config/cache-identity-32.xml  |   50 +
 .../core-test/config/cache-identity-default.xml |  154 +
 .../cpp/core-test/config/cache-identity.xml     |  124 +-
 .../cpp/core-test/config/cache-query-32.xml     |   50 +
 .../config/cache-query-continuous-32.xml        |   46 +
 .../config/cache-query-continuous-default.xml   |   87 +
 .../core-test/config/cache-query-continuous.xml |   61 +-
 .../core-test/config/cache-query-default.xml    |  153 +
 .../cpp/core-test/config/cache-query.xml        |  123 +-
 .../cpp/core-test/config/cache-store-32.xml     |   50 +
 .../core-test/config/cache-store-default.xml    |   71 +
 .../cpp/core-test/config/cache-store.xml        |   41 +-
 .../cpp/core-test/config/cache-test-32.xml      |   50 +
 .../cpp/core-test/config/cache-test-default.xml |  133 +
 .../cpp/core-test/config/cache-test.xml         |  106 +-
 modules/platforms/cpp/core-test/configure.ac    |   62 +
 .../core-test/include/ignite/binary_test_defs.h |  130 +-
 .../cpp/core-test/include/ignite/complex_type.h |   32 +-
 .../cpp/core-test/include/ignite/test_type.h    |   38 +-
 .../cpp/core-test/project/vs/core-test.vcxproj  |   15 +
 .../project/vs/core-test.vcxproj.filters        |   33 +
 .../src/binary_identity_resolver_test.cpp       |  300 +-
 .../cpp/core-test/src/binary_object_test.cpp    |   12 +-
 .../src/binary_reader_writer_raw_test.cpp       |   34 +-
 .../core-test/src/binary_reader_writer_test.cpp |   96 +-
 .../cpp/core-test/src/binary_test_defs.cpp      |    5 +
 .../cpp/core-test/src/cache_invoke_test.cpp     |   25 +-
 .../cpp/core-test/src/cache_query_test.cpp      |   18 +-
 .../cpp/core-test/src/cache_store_test.cpp      |   17 +-
 .../platforms/cpp/core-test/src/cache_test.cpp  |  120 +-
 .../cpp/core-test/src/cluster_test.cpp          |    4 +
 .../cpp/core-test/src/continuous_query_test.cpp |   58 +-
 .../cpp/core-test/src/ignition_test.cpp         |    4 +
 .../cpp/core-test/src/interop_test.cpp          |    4 +
 .../cpp/core-test/src/transactions_test.cpp     |   80 +-
 modules/platforms/cpp/core/configure.ac         |   62 +
 .../cpp/core/include/ignite/cache/cache.h       |   12 +-
 .../core/include/ignite/cache/cache_peek_mode.h |   67 +-
 .../cpp/core/include/ignite/ignite_binding.h    |   10 +-
 .../cpp/core/include/ignite/impl/bindings.h     |    4 +-
 .../impl/cache/cache_entry_processor_holder.h   |   70 +-
 .../include/ignite/impl/ignite_binding_impl.h   |   11 +-
 .../ignite/impl/interop/interop_target.h        |   21 +-
 .../core/include/ignite/impl/module_manager.h   |   26 +
 .../ignite/impl/transactions/transaction_impl.h |    4 +-
 .../impl/transactions/transactions_impl.h       |   10 +-
 .../include/ignite/transactions/transaction.h   |   12 +-
 .../ignite/transactions/transaction_consts.h    |  181 +-
 .../include/ignite/transactions/transactions.h  |   16 +-
 .../impl/binary/binary_type_updater_impl.cpp    |   17 +-
 .../continuous/continuous_query_handle_impl.cpp |   13 +-
 .../src/impl/cluster/cluster_group_impl.cpp     |    9 +-
 .../cpp/core/src/impl/ignite_environment.cpp    |   42 +-
 .../core/src/impl/interop/interop_target.cpp    |   12 +-
 .../src/impl/transactions/transaction_impl.cpp  |   18 +-
 .../src/impl/transactions/transactions_impl.cpp |   92 +-
 .../cpp/core/src/transactions/transaction.cpp   |    8 +-
 .../cpp/core/src/transactions/transactions.cpp  |   20 +-
 .../examples/include/ignite/examples/address.h  |   26 +-
 .../include/ignite/examples/organization.h      |   26 +-
 .../examples/include/ignite/examples/person.h   |   17 +-
 modules/platforms/cpp/ignite/configure.ac       |   62 +
 .../cpp/odbc-test/config/queries-test-32.xml    |   47 +
 .../odbc-test/config/queries-test-default.xml   |   38 +
 .../odbc-test/config/queries-test-noodbc-32.xml |   47 +
 .../cpp/odbc-test/config/queries-test.xml       |   11 +-
 .../cpp/odbc-test/include/complex_type.h        |   28 +-
 .../platforms/cpp/odbc-test/include/test_type.h |   38 +-
 .../cpp/odbc-test/project/vs/odbc-test.vcxproj  |    3 +
 .../project/vs/odbc-test.vcxproj.filters        |    6 +
 .../cpp/odbc-test/src/api_robustness_test.cpp   |   20 +-
 .../src/application_data_buffer_test.cpp        |   94 +-
 .../platforms/cpp/odbc-test/src/column_test.cpp |   56 +-
 .../cpp/odbc-test/src/connection_info_test.cpp  |   72 +-
 .../cpp/odbc-test/src/queries_test.cpp          |    8 +
 .../platforms/cpp/odbc-test/src/row_test.cpp    |   16 +-
 .../odbc-test/src/sql_test_suite_fixture.cpp    |    6 +-
 modules/platforms/cpp/odbc/README.txt           |   17 +-
 .../ignite/odbc/app/application_data_buffer.h   |    6 +-
 .../cpp/odbc/include/ignite/odbc/column.h       |    2 +-
 .../cpp/odbc/include/ignite/odbc/common_types.h |  350 +-
 .../ignite/odbc/config/connection_info.h        |    2 +-
 .../cpp/odbc/include/ignite/odbc/connection.h   |   18 +-
 .../ignite/odbc/diagnostic/diagnosable.h        |    4 +-
 .../odbc/diagnostic/diagnosable_adapter.h       |    8 +-
 .../ignite/odbc/diagnostic/diagnostic_record.h  |    4 +-
 .../odbc/diagnostic/diagnostic_record_storage.h |    8 +-
 .../cpp/odbc/include/ignite/odbc/environment.h  |   10 +-
 .../cpp/odbc/include/ignite/odbc/message.h      |   56 +-
 .../ignite/odbc/query/column_metadata_query.h   |   10 +-
 .../odbc/include/ignite/odbc/query/data_query.h |   23 +-
 .../ignite/odbc/query/foreign_keys_query.h      |    8 +-
 .../ignite/odbc/query/primary_keys_query.h      |    8 +-
 .../cpp/odbc/include/ignite/odbc/query/query.h  |   32 +-
 .../ignite/odbc/query/special_columns_query.h   |    8 +-
 .../ignite/odbc/query/table_metadata_query.h    |   10 +-
 .../include/ignite/odbc/query/type_info_query.h |    8 +-
 .../cpp/odbc/include/ignite/odbc/row.h          |    2 +-
 .../cpp/odbc/include/ignite/odbc/statement.h    |   52 +-
 .../odbc/system/ui/dsn_configuration_window.h   |   35 +-
 .../cpp/odbc/include/ignite/odbc/type_traits.h  |   91 +-
 .../ignite/odbc/system/ui/custom_window.h       |   12 +-
 .../odbc/os/win/src/system/ui/custom_window.cpp |    4 +-
 .../src/system/ui/dsn_configuration_window.cpp  |   42 +-
 .../cpp/odbc/os/win/src/system_dsn.cpp          |    2 +-
 .../odbc/src/app/application_data_buffer.cpp    |  386 +-
 .../platforms/cpp/odbc/src/app/parameter.cpp    |    6 +-
 modules/platforms/cpp/odbc/src/column.cpp       |   14 +-
 modules/platforms/cpp/odbc/src/common_types.cpp |   54 +-
 .../cpp/odbc/src/config/connection_info.cpp     |   12 +-
 modules/platforms/cpp/odbc/src/connection.cpp   |   74 +-
 .../odbc/src/diagnostic/diagnosable_adapter.cpp |    4 +-
 .../odbc/src/diagnostic/diagnostic_record.cpp   |   46 +-
 .../diagnostic/diagnostic_record_storage.cpp    |   78 +-
 modules/platforms/cpp/odbc/src/environment.cpp  |   62 +-
 modules/platforms/cpp/odbc/src/odbc.cpp         |   20 +-
 .../odbc/src/query/column_metadata_query.cpp    |  123 +-
 .../platforms/cpp/odbc/src/query/data_query.cpp |  102 +-
 .../cpp/odbc/src/query/foreign_keys_query.cpp   |   26 +-
 .../cpp/odbc/src/query/primary_keys_query.cpp   |   71 +-
 .../odbc/src/query/special_columns_query.cpp    |   26 +-
 .../cpp/odbc/src/query/table_metadata_query.cpp |   81 +-
 .../cpp/odbc/src/query/type_info_query.cpp      |  231 +-
 modules/platforms/cpp/odbc/src/row.cpp          |    4 +-
 modules/platforms/cpp/odbc/src/statement.cpp    |  258 +-
 modules/platforms/cpp/odbc/src/type_traits.cpp  |   46 +-
 .../Apache.Ignite.Core.Tests.csproj             |   18 +-
 .../Binary/BinaryBuilderSelfTest.cs             |  127 +-
 .../BinaryBuilderSelfTestDynamicRegistration.cs |    2 +
 .../Binary/BinaryBuilderSelfTestSimpleName.cs   |   35 +
 .../Binary/BinaryCompactFooterInteropTest.cs    |    7 +-
 .../Binary/BinaryDynamicRegistrationTest.cs     |   21 +-
 .../Binary/BinaryEqualityComparerTest.cs        |  220 +-
 .../Binary/BinaryNameMapperTest.cs              |  108 +
 .../Binary/BinarySelfTest.cs                    |   44 +-
 .../Binary/BinarySelfTestSimpleName.cs          |   33 +
 .../Binary/Serializable/SqlDmlTest.cs           |    3 +
 .../Binary/TypeNameParserTest.cs                |  232 +
 .../BinaryConfigurationTest.cs                  |    4 +-
 .../Cache/AddArgCacheEntryProcessor.cs          |   91 +
 .../Affinity/AffinityFunctionSpringTest.cs      |    6 +-
 .../Cache/Affinity/AffinityFunctionTest.cs      |  121 +-
 .../Cache/Affinity/AffinityTest.cs              |   10 +-
 .../BinarizableAddArgCacheEntryProcessor.cs     |   53 +
 .../Cache/BinarizableTestException.cs           |   51 +
 .../Cache/CacheAbstractTest.cs                  |  435 +-
 .../Cache/CacheAbstractTransactionalTest.cs     |    1 +
 .../Cache/CacheConfigurationTest.cs             |   56 +-
 .../Cache/CacheDynamicStartTest.cs              |  168 +-
 .../Cache/CacheForkedTest.cs                    |    6 +-
 .../Cache/CacheMetricsTest.cs                   |   96 +-
 .../Cache/CacheSwapSpaceTest.cs                 |  122 -
 .../Cache/CacheTestKey.cs                       |   68 +
 .../Cache/NonSerializableCacheEntryProcessor.cs |   40 +
 .../Cache/NonSerializableException.cs           |   40 +
 .../Cache/Query/CacheDmlQueriesTest.cs          |   24 +-
 .../Query/CacheDmlQueriesTestSimpleName.cs      |   35 +
 .../Cache/Query/CacheLinqTest.cs                |   32 +-
 .../Cache/Query/CacheLinqTestSimpleName.cs      |   35 +
 .../Query/CacheQueriesCodeConfigurationTest.cs  |   10 +-
 .../Cache/Query/CacheQueriesTest.cs             |   46 +-
 .../Cache/Query/CacheQueriesTestSimpleName.cs   |   35 +
 .../Continuous/ContinuousQueryAbstractTest.cs   |  122 +-
 .../Continuous/ContinuousQueryJavaFilterTest.cs |   21 +-
 .../Cache/Store/CacheParallelLoadStoreTest.cs   |    9 +-
 .../Cache/Store/CacheStoreSessionTest.cs        |   15 +-
 .../Cache/Store/CacheStoreTest.cs               |   41 +-
 .../Cache/TestReferenceObject.cs                |   40 +
 .../Compute/AbstractTaskTest.cs                 |   29 +-
 .../Compute/BinarizableClosureTaskTest.cs       |   14 +-
 .../Compute/BinarizableTaskTest.cs              |   15 -
 .../Compute/ComputeApiTest.cs                   |   20 +-
 .../Compute/ComputeApiTestFullFooter.cs         |    4 +-
 .../Compute/FailoverTaskSelfTest.cs             |    6 -
 .../Compute/ResourceTaskTest.cs                 |   60 +-
 .../Compute/SerializableClosureTaskTest.cs      |    1 +
 .../Compute/TaskAdapterTest.cs                  |    6 -
 .../Compute/TaskResultTest.cs                   |   12 -
 .../Config/Cache/Affinity/affinity-function.xml |    4 +-
 .../Config/Compute/compute-grid2.xml            |   10 -
 .../Config/cache-binarizables.xml               |   16 +-
 .../Config/cache-query-continuous.xml           |    8 +-
 .../Config/cache-query.xml                      |    2 +-
 .../Config/marshaller-invalid.xml               |    2 +-
 .../Config/native-client-test-cache.xml         |    8 -
 .../ConsoleRedirectTest.cs                      |    5 +-
 .../DataStructures/AtomicLongTest.cs            |    1 +
 .../Dataload/DataStreamerTest.cs                |   55 +-
 .../Apache.Ignite.Core.Tests/DeploymentTest.cs  |    4 +-
 .../Apache.Ignite.Core.Tests/EventsTest.cs      |  157 +-
 .../Apache.Ignite.Core.Tests/ExceptionsTest.cs  |   13 +-
 .../Apache.Ignite.Core.Tests/ExecutableTest.cs  |   62 +-
 .../Apache.Ignite.Core.Tests/FutureTest.cs      |   18 +-
 .../IgniteConfigurationSerializerTest.cs        |  103 +-
 .../IgniteConfigurationTest.cs                  |   44 +-
 .../IgniteStartStopTest.cs                      |   75 +-
 .../Apache.Ignite.Core.Tests/IgniteTestBase.cs  |   51 +-
 .../Apache.Ignite.Core.Tests/LifecycleTest.cs   |   58 +-
 .../Apache.Ignite.Core.Tests/LoadDllTest.cs     |   11 +-
 .../Log/CustomLoggerTest.cs                     |    8 +-
 .../Apache.Ignite.Core.Tests/MessagingTest.cs   |   43 +-
 .../Plugin/Cache/CachePlugin.cs                 |  127 -
 .../Plugin/Cache/CachePluginConfiguration.cs    |   64 -
 .../Plugin/Cache/CachePluginTest.cs             |  218 -
 .../Services/ServicesTest.cs                    |    3 +
 .../Apache.Ignite.Core.Tests/TestUtils.cs       |   25 +-
 .../Apache.Ignite.Core.csproj                   |   30 +-
 .../Binary/BinaryArrayEqualityComparer.cs       |  160 -
 .../Binary/BinaryBasicNameMapper.cs             |  129 +
 .../Binary/BinaryConfiguration.cs               |   24 +-
 .../Binary/BinaryTypeConfiguration.cs           |   14 -
 .../Cache/Affinity/Fair/FairAffinityFunction.cs |   32 -
 .../Cache/Affinity/Fair/Package-Info.cs         |   26 -
 .../Cache/Affinity/IAffinityFunction.cs         |    3 +-
 .../Apache.Ignite.Core/Cache/CachePeekMode.cs   |    7 +-
 .../Configuration/CacheAtomicWriteOrderMode.cs  |   43 -
 .../Cache/Configuration/CacheConfiguration.cs   |  143 +-
 .../Cache/Configuration/CacheMemoryMode.cs      |   60 -
 .../Cache/Configuration/QueryEntity.cs          |    4 +-
 .../Cache/Configuration/QueryField.cs           |    2 +-
 .../Apache.Ignite.Core/Cache/ICacheMetrics.cs   |   80 -
 .../Apache.Ignite.Core/Events/EventReader.cs    |    1 -
 .../Apache.Ignite.Core/Events/EventType.cs      |   57 -
 .../Events/IEventStorageSpi.cs                  |   33 +
 .../Events/MemoryEventStorageSpi.cs             |  100 +
 .../Events/NoopEventStorageSpi.cs               |   27 +
 .../Apache.Ignite.Core/Events/SwapSpaceEvent.cs |   51 -
 .../Apache.Ignite.Core/IgniteConfiguration.cs   |  124 +-
 .../IgniteConfigurationSection.xsd              |  119 +-
 .../dotnet/Apache.Ignite.Core/Ignition.cs       |  101 +-
 .../Apache.Ignite.Core/Impl/Binary/Binary.cs    |   10 +-
 .../Impl/Binary/BinaryArrayEqualityComparer.cs  |  159 +
 .../Binary/BinaryEqualityComparerSerializer.cs  |  100 +-
 .../Impl/Binary/BinaryFieldEqualityComparer.cs  |  138 -
 .../Impl/Binary/BinaryFullTypeDescriptor.cs     |   20 -
 .../Impl/Binary/BinaryObject.cs                 |    4 +-
 .../Impl/Binary/BinaryObjectBuilder.cs          |   11 +-
 .../Binary/BinarySurrogateTypeDescriptor.cs     |   29 +-
 .../Impl/Binary/BinarySystemHandlers.cs         |   10 +
 .../Impl/Binary/BinaryUtils.cs                  |  350 +-
 .../Impl/Binary/BinaryWriter.cs                 |    6 +-
 .../Impl/Binary/IBinaryEqualityComparer.cs      |   63 -
 .../Impl/Binary/IBinaryTypeDescriptor.cs        |    5 -
 .../Impl/Binary/Marshaller.cs                   |  126 +-
 .../Impl/Binary/TypeNameParser.cs               |  384 ++
 .../Impl/Binary/TypeResolver.cs                 |   95 +-
 .../Affinity/AffinityFunctionSerializer.cs      |   18 +-
 .../Impl/Cache/CacheMetricsImpl.cs              |   70 -
 .../Impl/Compute/ComputeFunc.cs                 |    2 +-
 .../Impl/Compute/ComputeJob.cs                  |    2 +-
 .../Impl/Compute/ComputeOutFunc.cs              |    2 +-
 .../dotnet/Apache.Ignite.Core/Impl/Ignite.cs    |   30 +-
 .../Apache.Ignite.Core/Impl/IgniteProxy.cs      |  464 --
 .../Impl/LifecycleBeanHolder.cs                 |   66 -
 .../Impl/LifecycleHandlerHolder.cs              |   66 +
 .../Impl/Plugin/Cache/CachePluginContext.cs     |   82 -
 .../Impl/Plugin/Cache/CachePluginProcessor.cs   |   77 -
 .../Plugin/Cache/CachePluginProviderProxy.cs    |   75 -
 .../Plugin/Cache/ICachePluginProviderProxy.cs   |   52 -
 .../Impl/Resource/ResourceProcessor.cs          |   10 -
 .../Impl/Resource/ResourceTypeDescriptor.cs     |   12 +-
 .../Impl/SwapSpace/SwapSpaceSerializer.cs       |   99 -
 .../Impl/Unmanaged/UnmanagedCallbackOp.cs       |    4 -
 .../Impl/Unmanaged/UnmanagedCallbacks.cs        |   58 +-
 .../Lifecycle/ILifecycleBean.cs                 |   64 -
 .../Lifecycle/ILifecycleHandler.cs              |   64 +
 .../Lifecycle/LifecycleEventType.cs             |    2 +-
 .../Cache/CachePluginProviderTypeAttribute.cs   |   52 -
 .../Plugin/Cache/ICachePluginConfiguration.cs   |   21 -
 .../Plugin/Cache/ICachePluginContext.cs         |   47 -
 .../Plugin/Cache/ICachePluginProvider.cs        |   52 -
 .../Plugin/IPluginConfiguration.cs              |    4 +-
 .../SwapSpace/File/FileSwapSpaceSpi.cs          |  105 -
 .../SwapSpace/ISwapSpaceSpi.cs                  |   35 -
 .../Impl/CacheFieldsQueryProvider.cs            |   24 +-
 .../Impl/CacheQueryExpressionVisitor.cs         |    4 +-
 .../Impl/CacheQueryModelVisitor.cs              |   15 +
 .../Apache.Ignite/Service/IgniteService.cs      |    6 +-
 .../Datagrid/MultiTieredCacheExample.cs         |   26 +-
 .../Misc/LifecycleExample.cs                    |   12 +-
 .../http/jetty/GridJettyObjectMapper.java       |  119 +-
 .../schedule/IgniteScheduleProcessor.java       |    2 +-
 .../processors/schedule/ScheduleFutureImpl.java |   20 -
 modules/schema-import-db/README.txt             |    4 -
 modules/schema-import-db/pom.xml                |   55 -
 .../apache/ignite/schema/parser/DbColumn.java   |   88 -
 .../ignite/schema/parser/DbMetadataReader.java  |  147 -
 .../apache/ignite/schema/parser/DbTable.java    |   82 -
 .../parser/dialect/DB2MetadataDialect.java      |   33 -
 .../parser/dialect/DatabaseMetadataDialect.java |  102 -
 .../parser/dialect/JdbcMetadataDialect.java     |  199 -
 .../parser/dialect/MySQLMetadataDialect.java    |   82 -
 .../parser/dialect/OracleMetadataDialect.java   |  360 --
 modules/schema-import/README.txt                |  216 -
 modules/schema-import/pom.xml                   |  119 -
 .../main/java/media/data_connection_48x48.png   |  Bin 4443 -> 0 bytes
 .../src/main/java/media/error_48x48.png         |  Bin 4349 -> 0 bytes
 .../src/main/java/media/ignite_128x128.png      |  Bin 4917 -> 0 bytes
 .../src/main/java/media/ignite_16x16.png        |  Bin 608 -> 0 bytes
 .../src/main/java/media/ignite_24x24.png        |  Bin 930 -> 0 bytes
 .../src/main/java/media/ignite_32x32.png        |  Bin 1203 -> 0 bytes
 .../src/main/java/media/ignite_48x48.png        |  Bin 1868 -> 0 bytes
 .../src/main/java/media/ignite_64x64.png        |  Bin 2453 -> 0 bytes
 .../src/main/java/media/information_48x48.png   |  Bin 4102 -> 0 bytes
 .../src/main/java/media/question_48x48.png      |  Bin 3857 -> 0 bytes
 .../src/main/java/media/sign_warning_48x48.png  |  Bin 2988 -> 0 bytes
 .../schema-import/src/main/java/media/style.css |  134 -
 .../src/main/java/media/text_tree_48x48.png     |  Bin 2567 -> 0 bytes
 .../ignite/schema/generator/CodeGenerator.java  |  831 ---
 .../ignite/schema/generator/GeneratorUtils.java |   70 -
 .../ignite/schema/generator/XmlGenerator.java   |  446 --
 .../ignite/schema/model/PojoDescriptor.java     |  497 --
 .../apache/ignite/schema/model/PojoField.java   |  461 --
 .../ignite/schema/model/SchemaDescriptor.java   |   62 -
 .../schema/parser/DatabaseMetadataParser.java   |  115 -
 .../ignite/schema/ui/ConfirmCallable.java       |   83 -
 .../org/apache/ignite/schema/ui/Controls.java   |  697 ---
 .../org/apache/ignite/schema/ui/GridPaneEx.java |  180 -
 .../org/apache/ignite/schema/ui/MessageBox.java |  274 -
 .../apache/ignite/schema/ui/ModalDialog.java    |   50 -
 .../ignite/schema/ui/SchemaImportApp.java       | 2115 --------
 .../ignite/schema/ui/TextColumnValidator.java   |   32 -
 .../schema/test/AbstractSchemaImportTest.java   |  181 -
 .../test/generator/CodeGeneratorTest.java       |   81 -
 .../schema/test/generator/XmlGeneratorTest.java |   42 -
 .../ignite/schema/test/model/CacheConfig.txt    |  409 --
 .../apache/ignite/schema/test/model/Objects.txt |  531 --
 .../ignite/schema/test/model/ObjectsKey.txt     |   96 -
 .../ignite/schema/test/model/Primitives.txt     |  535 --
 .../ignite/schema/test/model/PrimitivesKey.txt  |   96 -
 .../org/apache/ignite/schema/test/model/Tst.txt |  535 --
 .../apache/ignite/schema/test/model/TstKey.txt  |   96 -
 .../schema/test/model/ignite-type-metadata.xml  |  666 ---
 .../test/parser/DbMetadataParserTest.java       |  134 -
 .../testsuites/IgniteSchemaImportTestSuite.java |   42 -
 .../spark/JavaStandaloneIgniteRDDSelfTest.java  |   41 +-
 .../org/apache/ignite/spark/IgniteRDDSpec.scala |   84 +-
 modules/spring-data/README.txt                  |   32 +
 modules/spring-data/licenses/apache-2.0.txt     |  202 +
 modules/spring-data/pom.xml                     |   79 +
 .../springdata/repository/IgniteRepository.java |   58 +
 .../config/EnableIgniteRepositories.java        |  119 +
 .../config/IgniteRepositoriesRegistar.java      |   36 +
 .../IgniteRepositoryConfigurationExtension.java |   49 +
 .../springdata/repository/config/Query.java     |   37 +
 .../repository/config/RepositoryConfig.java     |   39 +
 .../repository/config/package-info.java         |   22 +
 .../springdata/repository/package-info.java     |   22 +
 .../repository/query/IgniteQuery.java           |   83 +
 .../repository/query/IgniteQueryGenerator.java  |  243 +
 .../repository/query/IgniteRepositoryQuery.java |  306 ++
 .../repository/query/package-info.java          |   22 +
 .../support/IgniteRepositoryFactory.java        |  168 +
 .../support/IgniteRepositoryFactoryBean.java    |   85 +
 .../support/IgniteRepositoryImpl.java           |  160 +
 .../repository/support/package-info.java        |   22 +
 .../IgniteSpringDataCrudSelfTest.java           |  233 +
 .../IgniteSpringDataQueriesSelfTest.java        |  291 ++
 .../misc/ApplicationConfiguration.java          |   46 +
 .../apache/ignite/springdata/misc/Person.java   |   97 +
 .../springdata/misc/PersonRepository.java       |   92 +
 .../springdata/misc/PersonSecondRepository.java |   40 +
 .../testsuites/IgniteSpringDataTestSuite.java   |   41 +
 .../org/apache/ignite/IgniteSpringBean.java     |   38 +-
 .../apache/ignite/cache/spring/SpringCache.java |    6 +
 .../ignite/internal/GridFactorySelfTest.java    |    3 +
 .../GridSpringBeanSerializationSelfTest.java    |    2 +-
 .../GridSpringResourceInjectionSelfTest.java    |   20 +-
 .../ant/beautifier/GridJavadocAntTask.java      |   18 +-
 .../ignite/visor/commands/VisorConsole.scala    |    1 -
 .../commands/cache/VisorCacheClearCommand.scala |    2 +-
 .../commands/cache/VisorCacheCommand.scala      |  340 +-
 .../commands/cache/VisorCacheScanCommand.scala  |   19 +-
 .../commands/cache/VisorCacheSwapCommand.scala  |  145 -
 .../config/VisorConfigurationCommand.scala      |  184 +-
 .../commands/disco/VisorDiscoveryCommand.scala  |   24 +-
 .../commands/events/VisorEventsCommand.scala    |   38 +-
 .../visor/commands/gc/VisorGcCommand.scala      |    4 +-
 .../commands/tasks/VisorTasksCommand.scala      |   61 +-
 .../scala/org/apache/ignite/visor/visor.scala   |   34 +-
 .../commands/cache/VisorCacheCommandSpec.scala  |    4 +
 .../cswap/VisorCacheSwapCommandSpec.scala       |   89 -
 .../commands/open/VisorOpenCommandSpec.scala    |    6 +-
 .../testsuites/VisorConsoleSelfTestSuite.scala  |    2 -
 modules/web-console/backend/app/agent.js        |  934 ----
 modules/web-console/backend/app/agentSocket.js  |  249 +
 .../web-console/backend/app/agentsHandler.js    |  400 ++
 modules/web-console/backend/app/apiServer.js    |   68 +
 modules/web-console/backend/app/app.js          |   63 -
 modules/web-console/backend/app/browser.js      |  523 --
 .../web-console/backend/app/browsersHandler.js  |  279 +
 modules/web-console/backend/app/mongo.js        |   36 +-
 modules/web-console/backend/app/routes.js       |    6 +-
 modules/web-console/backend/index.js            |   44 +-
 modules/web-console/backend/package.json        |   52 +-
 modules/web-console/backend/routes/agent.js     |   57 -
 modules/web-console/backend/routes/demo.js      |   14 +-
 modules/web-console/backend/routes/downloads.js |   57 +
 modules/web-console/backend/services/agents.js  |   83 -
 .../web-console/backend/services/downloads.js   |   80 +
 modules/web-console/backend/services/users.js   |   10 +-
 .../web-console/backend/test/app/httpAgent.js   |    6 +-
 .../web-console/backend/test/routes/clusters.js |    4 +-
 modules/web-console/frontend/.eslintrc          |    2 +-
 modules/web-console/frontend/app/app.config.js  |    1 +
 modules/web-console/frontend/app/app.js         |   15 +-
 .../components/activities-user-dialog/index.js  |    1 -
 .../cluster-select/cluster-select.controller.js |   55 +
 .../cluster-select/cluster-select.pug           |   40 +
 .../app/components/cluster-select/index.js      |   28 +
 .../form-field-datepicker.pug                   |   59 -
 .../form-field-datepicker.scss                  |   20 -
 .../input-dialog/input-dialog.service.js        |    1 -
 .../list-of-registered-users.categories.js      |    4 +-
 .../list-of-registered-users.column-defs.js     |   46 +-
 .../list-of-registered-users.controller.js      |  141 +-
 .../list-of-registered-users.scss               |    4 +
 .../list-of-registered-users.tpl.pug            |   76 +-
 .../ui-grid-header/ui-grid-header.scss          |   91 -
 .../ui-grid-header/ui-grid-header.tpl.pug       |   29 -
 .../ui-grid-settings/ui-grid-settings.pug       |   33 -
 .../ui-grid-settings/ui-grid-settings.scss      |  144 -
 .../frontend/app/data/pom-dependencies.json     |    1 +
 .../app/helpers/jade/form/form-field-text.pug   |   55 +-
 .../frontend/app/helpers/jade/mixins.pug        |   29 +-
 .../app/modules/agent/AgentManager.service.js   |  529 ++
 .../app/modules/agent/AgentModal.service.js     |   89 +
 .../frontend/app/modules/agent/agent.module.js  |  312 +-
 .../frontend/app/modules/cluster/Cache.js       |   59 +
 .../app/modules/cluster/CacheMetrics.js         |   59 +
 .../frontend/app/modules/cluster/Node.js        |   54 +
 .../frontend/app/modules/cluster/NodeMetrics.js |   19 +
 .../generator/AbstractTransformer.js            |   10 -
 .../generator/ConfigurationGenerator.js         |   74 +-
 .../generator/JavaTransformer.service.js        |    3 +
 .../generator/PlatformGenerator.js              |   11 +-
 .../defaults/Cache.platform.service.js          |    9 -
 .../generator/defaults/Cache.service.js         |   13 +-
 .../generator/defaults/Cluster.service.js       |    9 +-
 .../generator/defaults/IGFS.service.js          |    5 +-
 .../frontend/app/modules/demo/Demo.module.js    |    5 +-
 .../app/modules/dialog/dialog.factory.js        |    1 -
 .../getting-started/GettingStarted.provider.js  |    2 +-
 .../app/modules/navbar/userbar.directive.js     |    4 +-
 .../frontend/app/modules/nodes/Nodes.service.js |    1 -
 .../app/modules/sql/notebook.controller.js      |    2 +-
 .../frontend/app/modules/sql/sql.controller.js  |  101 +-
 .../frontend/app/modules/states/admin.state.js  |   13 +-
 .../app/modules/states/configuration.state.js   |   17 +-
 .../states/configuration/caches/affinity.pug    |    2 +-
 .../states/configuration/caches/concurrency.pug |   11 -
 .../states/configuration/caches/general.pug     |   25 +
 .../states/configuration/caches/memory.pug      |   64 +-
 .../states/configuration/caches/query.pug       |    3 +
 .../states/configuration/clusters/events.pug    |    6 +-
 .../states/configuration/clusters/general.pug   |    3 +
 .../clusters/general/discovery/kubernetes.pug   |   37 +
 .../configuration/clusters/marshaller.pug       |    6 -
 .../states/configuration/clusters/swap.pug      |   72 -
 .../states/configuration/clusters/time.pug      |   10 +-
 .../modules/states/configuration/igfs/dual.pug  |   42 -
 .../modules/states/configuration/igfs/misc.pug  |    4 +-
 .../configuration/summary/summary.controller.js |    3 +
 .../configuration/summary/summary.worker.js     |   22 +
 .../app/modules/states/profile.state.js         |    2 +-
 .../frontend/app/modules/user/Auth.service.js   |    6 +-
 .../frontend/app/primitives/badge/index.scss    |    4 +
 .../frontend/app/primitives/btn-group/index.pug |   35 +
 .../frontend/app/primitives/btn/index.scss      |   41 +
 .../app/primitives/datepicker/index.pug         |   60 +
 .../app/primitives/datepicker/index.scss        |   64 +
 .../frontend/app/primitives/dropdown/index.pug  |   43 +
 .../frontend/app/primitives/dropdown/index.scss |   82 +
 .../frontend/app/primitives/index.js            |    8 +
 .../frontend/app/primitives/page/index.scss     |   35 +
 .../frontend/app/primitives/panel/index.scss    |   51 +
 .../frontend/app/primitives/tabs/index.scss     |   15 +
 .../app/primitives/ui-grid-header/index.scss    |   91 +
 .../app/primitives/ui-grid-header/index.tpl.pug |   29 +
 .../app/primitives/ui-grid-settings/index.pug   |   33 +
 .../app/primitives/ui-grid-settings/index.scss  |  171 +
 .../frontend/app/primitives/ui-grid/index.scss  |  329 ++
 .../frontend/app/services/Confirm.service.js    |    2 +-
 .../app/services/ConfirmBatch.service.js        |    1 -
 .../frontend/controllers/caches-controller.js   |   31 +-
 .../frontend/controllers/clusters-controller.js |   41 +-
 .../frontend/controllers/domains-controller.js  |   20 +-
 modules/web-console/frontend/package.json       |   62 +-
 .../stylesheets/_bootstrap-variables.scss       |    2 +-
 .../stylesheets/_font-awesome-custom.scss       |    5 +
 .../frontend/public/stylesheets/style.scss      |   62 +-
 modules/web-console/frontend/views/base2.pug    |   22 +
 .../views/configuration/clusters.tpl.pug        |    1 -
 .../views/configuration/domains-import.tpl.pug  |    2 +-
 .../views/configuration/domains.tpl.pug         |    1 -
 .../frontend/views/configuration/igfs.tpl.pug   |    1 -
 .../frontend/views/includes/header.pug          |   23 +-
 .../frontend/views/settings/admin.tpl.pug       |    3 +-
 .../web-console/frontend/views/sql/sql.tpl.pug  |   13 +-
 .../views/templates/agent-download.tpl.pug      |   45 +-
 .../frontend/views/templates/demo-info.tpl.pug  |    2 +-
 modules/web-console/web-agent/pom.xml           |   28 +-
 .../console/agent/AgentConfiguration.java       |   47 +-
 .../ignite/console/agent/AgentLauncher.java     |  196 +-
 .../apache/ignite/console/agent/AgentUtils.java |    6 +-
 .../ignite/console/agent/db/DbColumn.java       |   88 +
 .../console/agent/db/DbMetadataReader.java      |  142 +
 .../apache/ignite/console/agent/db/DbTable.java |   82 +
 .../agent/db/dialect/DB2MetadataDialect.java    |   33 +
 .../db/dialect/DatabaseMetadataDialect.java     |  102 +
 .../agent/db/dialect/JdbcMetadataDialect.java   |  199 +
 .../agent/db/dialect/MySQLMetadataDialect.java  |   82 +
 .../agent/db/dialect/OracleMetadataDialect.java |  359 ++
 .../console/agent/handlers/ClusterListener.java |  266 +
 .../agent/handlers/DatabaseListener.java        |   24 +-
 .../console/agent/handlers/DemoListener.java    |  131 +
 .../console/agent/handlers/RestListener.java    |  229 +-
 .../ignite/console/agent/rest/RestExecutor.java |  197 +
 .../ignite/console/agent/rest/RestResult.java   |   81 +
 .../ignite/console/demo/AgentClusterDemo.java   |  180 +-
 .../ignite/console/demo/AgentDemoUtils.java     |    2 +-
 .../demo/service/DemoCachesLoadService.java     |   35 +-
 .../src/main/resources/log4j.properties         |    1 -
 .../cache/websession/WebSessionFilter.java      |   22 +-
 .../internal/websession/WebSessionSelfTest.java |    4 +
 .../webapp2/META-INF/ignite-webapp-config.xml   |    2 +-
 modules/yardstick/README.txt                    |    3 -
 .../config/benchmark-atomic-win.properties      |    8 +-
 .../config/benchmark-atomic.properties          |    6 -
 .../config/benchmark-client-mode.properties     |    9 -
 .../yardstick/config/benchmark-h2.properties    |   56 +
 .../config/benchmark-multicast.properties       |    9 -
 .../yardstick/config/benchmark-mysql.properties |   56 +
 .../yardstick/config/benchmark-pgsql.properties |   57 +
 .../config/benchmark-query-win.properties       |    5 +-
 .../yardstick/config/benchmark-query.properties |    3 -
 .../config/benchmark-tx-win.properties          |    6 +-
 .../yardstick/config/benchmark-tx.properties    |    4 -
 modules/yardstick/config/benchmark.properties   |   11 +-
 modules/yardstick/config/h2-schema.sql          |   11 +
 modules/yardstick/config/ignite-base-config.xml |  110 +-
 .../config/ignite-base-load-config.xml          |   91 -
 .../config/ignite-cache-load-config.xml         |    5 -
 .../config/ignite-failover-base-config.xml      |   43 -
 .../ignite-int-max-values-offheap-config.xml    |   89 -
 .../ignite-int-max-values-onheap-config.xml     |    3 +-
 .../ignite-int-max-values-swap-config.xml       |   93 -
 modules/yardstick/config/ignite-jdbc-config.xml |    2 +-
 .../config/ignite-localhost-config.xml          |    6 +
 .../yardstick/config/ignite-store-config.xml    |    2 -
 modules/yardstick/config/mysql-schema.sql       |   11 +
 modules/yardstick/config/pgsql-schema.sql       |   18 +
 .../test-max-int-values-offheap.properties      |   65 -
 .../config/test-max-int-values-swap.properties  |   64 -
 modules/yardstick/pom.xml                       |   14 +
 .../yardstick/IgniteAbstractBenchmark.java      |    8 +-
 .../yardstick/IgniteBenchmarkArguments.java     |   93 +-
 .../ignite/yardstick/IgniteBenchmarkUtils.java  |    7 +-
 .../org/apache/ignite/yardstick/IgniteNode.java |   26 +-
 .../yardstick/cache/IgniteGetBenchmark.java     |    5 +-
 .../cache/IgniteGetOffHeapBenchmark.java        |   32 -
 .../cache/IgniteGetOffHeapValuesBenchmark.java  |   32 -
 .../cache/IgniteIoTestAbstractBenchmark.java    |   61 +
 .../cache/IgniteIoTestSendAllBenchmark.java     |   32 +
 .../cache/IgniteIoTestSendRandomBenchmark.java  |   35 +
 .../yardstick/cache/IgnitePutAllBenchmark.java  |   95 +-
 .../cache/IgnitePutAllTxBenchmark.java          |   43 +-
 .../cache/IgnitePutGetOffHeapBenchmark.java     |   32 -
 .../IgnitePutGetOffHeapValuesBenchmark.java     |   32 -
 .../cache/IgnitePutGetTxOffHeapBenchmark.java   |   32 -
 .../IgnitePutGetTxOffHeapValuesBenchmark.java   |   32 -
 .../cache/IgnitePutOffHeapBenchmark.java        |   32 -
 .../cache/IgnitePutOffHeapValuesBenchmark.java  |   32 -
 .../IgnitePutRandomValueSizeBenchmark.java      |    2 +-
 .../cache/IgnitePutTxOffHeapBenchmark.java      |   32 -
 .../IgnitePutTxOffHeapValuesBenchmark.java      |   32 -
 .../IgniteSqlQueryJoinOffHeapBenchmark.java     |   32 -
 .../cache/IgniteSqlQueryOffHeapBenchmark.java   |   32 -
 .../IgniteSqlQueryPutOffHeapBenchmark.java      |   32 -
 .../dml/IgniteSqlDeleteFilteredBenchmark.java   |    5 +-
 .../dml/IgniteSqlUpdateFilteredBenchmark.java   |    5 +-
 ...IgniteAtomicOffHeapInvokeRetryBenchmark.java |   31 -
 .../IgniteAtomicOffHeapRetriesBenchmark.java    |   31 -
 ...ransactionalOffHeapInvokeRetryBenchmark.java |   33 -
 ...ransactionalOffHeapWriteInvokeBenchmark.java |   37 -
 ...eTransactionalOffHeapWriteReadBenchmark.java |   32 -
 .../cache/jdbc/JdbcAbstractBenchmark.java       |  163 +
 .../yardstick/cache/jdbc/JdbcPutBenchmark.java  |   89 +
 .../cache/jdbc/JdbcPutGetBenchmark.java         |   62 +
 .../jdbc/JdbcPutIndexedValue8Benchmark.java     |  104 +
 .../cache/jdbc/JdbcSqlQueryBenchmark.java       |   94 +
 .../cache/jdbc/JdbcSqlQueryJoinBenchmark.java   |  111 +
 .../IgniteCacheRandomOperationBenchmark.java    |    7 -
 parent/pom.xml                                  |    9 +-
 pom.xml                                         |  159 +-
 scripts/git-remoteless-branches.sh              |   35 +
 2788 files changed, 160942 insertions(+), 96529 deletions(-)
----------------------------------------------------------------------



[17/70] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math module to Ignite ML module added missed licenses renamed packages fixed wrong ml profile activation

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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 &times; X = B for matrices A.
+     *
+     * @param b right-hand side of the equation A &times; X = B
+     * @return a vector X that minimizes the two norm of A &times; 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 &times; X = B for matrices A.
+     *
+     * @param b right-hand side of the equation A &times; X = B
+     * @return a matrix X that minimizes the two norm of A &times; 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;
+    }
+}


[16/70] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math module to Ignite ML module added missed licenses renamed packages fixed wrong ml profile activation

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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);
+    }
+}


[48/70] [abbrv] ignite git commit: Minor corrections in tests.

Posted by sb...@apache.org.
Minor corrections in tests.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/5dab5fb6
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/5dab5fb6
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/5dab5fb6

Branch: refs/heads/ignite-2893
Commit: 5dab5fb65d97921d7e28e04283a3d47d00c44a25
Parents: fb1dea7
Author: Alexey Goncharuk <al...@gmail.com>
Authored: Wed Apr 19 14:22:00 2017 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Wed Apr 19 14:22:00 2017 +0300

----------------------------------------------------------------------
 ...ServiceProcessorMultiNodeConfigSelfTest.java | 23 ++++++++-------
 .../GridServiceProcessorMultiNodeSelfTest.java  | 31 ++++++++++----------
 2 files changed, 27 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/5dab5fb6/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 16e5e30..bd47b53 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
@@ -55,7 +55,6 @@ public class GridServiceProcessorMultiNodeConfigSelfTest extends GridServiceProc
 
     /** {@inheritDoc} */
     @Override protected ServiceConfiguration[] services() {
-        List<ServiceConfiguration> cfgs = new ArrayList<>();
 
         ServiceConfiguration cfg = new ServiceConfiguration();
 
@@ -64,6 +63,8 @@ public class GridServiceProcessorMultiNodeConfigSelfTest extends GridServiceProc
         cfg.setTotalCount(1);
         cfg.setService(new DummyService());
 
+        List<ServiceConfiguration> cfgs = new ArrayList<>();
+
         cfgs.add(cfg);
 
         cfg = new ServiceConfiguration();
@@ -201,12 +202,12 @@ public class GridServiceProcessorMultiNodeConfigSelfTest extends GridServiceProc
 
         checkCount(name, g.services().serviceDescriptors(), nodeCount());
 
-        int extraNodes = 2;
-
         CountDownLatch latch = new CountDownLatch(1);
 
         DummyService.exeLatch(name, latch);
 
+        int extraNodes = 2;
+
         startExtraNodes(extraNodes);
 
         try {
@@ -270,10 +271,10 @@ public class GridServiceProcessorMultiNodeConfigSelfTest extends GridServiceProc
 
             waitForDeployment(name, nodeCount() + newNodes);
 
+            // Since we start extra nodes, there may be extra start and cancel events,
+            // so we check only the difference between start and cancel and
+            // not start and cancel events individually.
             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);
         }
@@ -294,12 +295,13 @@ public class GridServiceProcessorMultiNodeConfigSelfTest extends GridServiceProc
         Ignite g = randomGrid();
 
         int servers = 2;
-        int clients = 2;
 
         CountDownLatch latch = new CountDownLatch(servers);
 
         DummyService.exeLatch(name, latch);
 
+        int clients = 2;
+
         startExtraNodes(servers, clients);
 
         try {
@@ -307,11 +309,10 @@ public class GridServiceProcessorMultiNodeConfigSelfTest extends GridServiceProc
 
             waitForDeployment(name, nodeCount() + servers);
 
+            // Since we start extra nodes, there may be extra start and cancel events,
+            // so we check only the difference between start and cancel and
+            // not start and cancel events individually.
             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/5dab5fb6/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 32d1462..df7ddf1 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
@@ -152,12 +152,13 @@ public class GridServiceProcessorMultiNodeSelfTest extends GridServiceProcessorA
             assertEquals(name, 0, DummyService.cancelled(name));
 
             int servers = 2;
-            int clients = 2;
 
             latch = new CountDownLatch(servers);
 
             DummyService.exeLatch(name, latch);
 
+            int clients = 2;
+
             startExtraNodes(servers, clients);
 
             try {
@@ -165,12 +166,11 @@ public class GridServiceProcessorMultiNodeSelfTest extends GridServiceProcessorA
 
                 waitForDeployment(name, servers);
 
+                // Since we start extra nodes, there may be extra start and cancel events,
+                // so we check only the difference between start and cancel and
+                // not start and cancel events individually.
                 assertEquals(name, nodeCount() + servers,  DummyService.started(name) - 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);
             }
             finally {
@@ -241,13 +241,12 @@ public class GridServiceProcessorMultiNodeSelfTest extends GridServiceProcessorA
 
                 waitForDeployment(name, prestartedNodes + extraNodes);
 
+                // Since we start extra nodes, there may be extra start and cancel events,
+                // so we check only the difference between start and cancel and
+                // not start and cancel events individually.
                 assertEquals(name, prestartedNodes + extraNodes,
                     DummyService.started(name) - 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);
             }
             finally {
@@ -262,6 +261,7 @@ public class GridServiceProcessorMultiNodeSelfTest extends GridServiceProcessorA
     /**
      * @throws Exception If failed.
      */
+    @SuppressWarnings("deprecation")
     public void testDeployLimits() throws Exception {
         final String name = "serviceWithLimitsUpdateTopology";
 
@@ -299,25 +299,24 @@ public class GridServiceProcessorMultiNodeSelfTest extends GridServiceProcessorA
 
         checkCount(name, g.services().serviceDescriptors(), nodeCount());
 
-        int extraNodes = 2;
-
         latch = new CountDownLatch(1);
 
         DummyService.exeLatch(name, latch);
 
-        startExtraNodes(2);
+        int extraNodes = 2;
+
+        startExtraNodes(extraNodes);
 
         try {
             latch.await();
 
             waitForDeployment(name, totalInstances);
 
+            // Since we start extra nodes, there may be extra start and cancel events,
+            // so we check only the difference between start and cancel and
+            // not start and cancel events individually.
             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 {


[09/70] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math module to Ignite ML module added missed licenses renamed packages fixed wrong ml profile activation

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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);
-    }
-}


[30/70] [abbrv] ignite git commit: IGNITE-4565: Implemented CREATE INDEX and DROP INDEX. This closes #1773. This closes #1804.

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexTransactionalReplicatedSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexTransactionalReplicatedSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexTransactionalReplicatedSelfTest.java
new file mode 100644
index 0000000..85a8837
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicIndexTransactionalReplicatedSelfTest.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.internal.processors.cache.index;
+
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
+
+/** */
+public class H2DynamicIndexTransactionalReplicatedSelfTest extends H2DynamicIndexAbstractSelfTest {
+    /** {@inheritDoc} */
+    @Override protected CacheMode cacheMode() {
+        return CacheMode.REPLICATED;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected CacheAtomicityMode atomicityMode() {
+        return CacheAtomicityMode.TRANSACTIONAL;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected boolean nearCache() {
+        return false;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/SchemaExchangeSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/SchemaExchangeSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/SchemaExchangeSelfTest.java
new file mode 100644
index 0000000..95ad2f1
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/SchemaExchangeSelfTest.java
@@ -0,0 +1,589 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache.index;
+
+import org.apache.ignite.IgniteClientDisconnectedException;
+import org.apache.ignite.Ignition;
+import org.apache.ignite.cache.query.annotations.QuerySqlField;
+import org.apache.ignite.cluster.ClusterNode;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.internal.processors.query.QueryTypeDescriptorImpl;
+import org.apache.ignite.internal.util.lang.GridAbsPredicate;
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.lang.IgniteFuture;
+import org.apache.ignite.lang.IgnitePredicate;
+import org.apache.ignite.testframework.GridTestUtils;
+
+import java.util.Collections;
+import java.util.Map;
+
+/**
+ * Tests for schema exchange between nodes.
+ */
+public class SchemaExchangeSelfTest extends AbstractSchemaSelfTest {
+    /** Node on which filter should be applied (if any). */
+    private static String filterNodeName;
+
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        stopAllGrids();
+
+        filterNodeName = null;
+
+        super.afterTest();
+    }
+
+    /**
+     * Test propagation of empty query schema for static cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testEmptyStatic() throws Exception {
+        checkEmpty(false);
+    }
+
+    /**
+     * Test propagation of empty query schema for dynamic cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testEmptyDynamic() throws Exception {
+        checkEmpty(true);
+    }
+
+    /**
+     * Check empty metadata propagation.
+     *
+     * @param dynamic Dynamic start flag.
+     * @throws Exception If failed.
+     */
+    private void checkEmpty(boolean dynamic) throws Exception {
+        IgniteEx node1;
+
+        if (dynamic) {
+            node1 = startNoCache(1);
+
+            node1.getOrCreateCache(cacheConfiguration());
+        }
+        else
+            node1 = start(1);
+
+        assertTypes(node1);
+
+        IgniteEx node2 = start(2, KeyClass.class, ValueClass.class);
+
+        assertTypes(node1);
+        assertTypes(node2);
+
+        IgniteEx node3 = start(3, KeyClass.class, ValueClass.class, KeyClass2.class, ValueClass2.class);
+
+        assertTypes(node1);
+        assertTypes(node2);
+        assertTypes(node3);
+    }
+
+    /**
+     * Test propagation of non-empty query schema for static cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testNonEmptyStatic() throws Exception {
+        checkNonEmpty(false);
+    }
+
+    /**
+     * Test propagation of non-empty query schema for dynamic cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testNonEmptyDynamic() throws Exception {
+        checkNonEmpty(true);
+    }
+
+    /**
+     * Check \u0442\u0449\u0442-empty metadata propagation.
+     *
+     * @param dynamic Dynamic start flag.
+     * @throws Exception If failed.
+     */
+    private void checkNonEmpty(boolean dynamic) throws Exception {
+        IgniteEx node1;
+
+        if (dynamic) {
+            node1 = startNoCache(1);
+
+            node1.getOrCreateCache(cacheConfiguration(KeyClass.class, ValueClass.class));
+        }
+        else
+            node1 = start(1, KeyClass.class, ValueClass.class);
+
+        assertTypes(node1, ValueClass.class);
+
+        IgniteEx node2 = start(2);
+
+        assertTypes(node1, ValueClass.class);
+        assertTypes(node2, ValueClass.class);
+
+        IgniteEx node3 = start(3, KeyClass.class, ValueClass.class, KeyClass2.class, ValueClass2.class);
+
+        assertTypes(node1, ValueClass.class);
+        assertTypes(node2, ValueClass.class);
+        assertTypes(node3, ValueClass.class);
+    }
+
+    /**
+     * Make sure that new metadata can be propagated after destroy.
+     *
+     * @throws Exception If failed.
+     */
+    public void testDynamicRestarts() throws Exception {
+        IgniteEx node1 = start(1, KeyClass.class, ValueClass.class);
+        IgniteEx node2 = startNoCache(2);
+        IgniteEx node3 = startClientNoCache(3);
+        IgniteEx node4 = startClientNoCache(4);
+
+        assertTypes(node1, ValueClass.class);
+        assertTypes(node2, ValueClass.class);
+
+        assertTypes(node3);
+
+        node3.cache(CACHE_NAME);
+        assertTypes(node3, ValueClass.class);
+
+        // Check restarts from the first node.
+        node1.destroyCache(CACHE_NAME);
+
+        node1.getOrCreateCache(cacheConfiguration());
+
+        assertTypes(node1);
+        assertTypes(node2);
+        assertTypes(node3);
+
+        node1.destroyCache(CACHE_NAME);
+
+        node1.getOrCreateCache(cacheConfiguration(KeyClass.class, ValueClass.class,
+            KeyClass2.class, ValueClass2.class));
+
+        assertTypes(node1, ValueClass.class, ValueClass2.class);
+        assertTypes(node2, ValueClass.class, ValueClass2.class);
+
+        assertTypes(node3);
+
+        node3.cache(CACHE_NAME);
+        assertTypes(node3, ValueClass.class, ValueClass2.class);
+
+        // Check restarts from the second node.
+        node2.destroyCache(CACHE_NAME);
+
+        node2.getOrCreateCache(cacheConfiguration());
+
+        assertTypes(node1);
+        assertTypes(node2);
+        assertTypes(node3);
+
+        node2.destroyCache(CACHE_NAME);
+
+        node2.getOrCreateCache(cacheConfiguration(KeyClass.class, ValueClass.class,
+            KeyClass2.class, ValueClass2.class));
+
+        assertTypes(node1, ValueClass.class, ValueClass2.class);
+        assertTypes(node2, ValueClass.class, ValueClass2.class);
+
+        assertTypes(node3);
+
+        node3.cache(CACHE_NAME);
+        assertTypes(node3, ValueClass.class, ValueClass2.class);
+
+        assertTypes(node4);
+
+        node4.cache(CACHE_NAME);
+        assertTypes(node4, ValueClass.class, ValueClass2.class);
+
+        // Make sure that joining node observes correct state.
+        assertTypes(start(5), ValueClass.class, ValueClass2.class);
+        assertTypes(startNoCache(6), ValueClass.class, ValueClass2.class);
+
+        assertTypes(startClient(7), ValueClass.class, ValueClass2.class);
+
+        IgniteEx node8 = startClientNoCache(8);
+
+        assertTypes(node8);
+
+        node8.cache(CACHE_NAME);
+        assertTypes(node8, ValueClass.class, ValueClass2.class);
+    }
+
+    /**
+     * Test client join for static cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testClientJoinStatic() throws Exception {
+        checkClientJoin(false);
+    }
+
+    /**
+     * Test client join for dynamic cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testClientJoinDynamic() throws Exception {
+        checkClientJoin(true);
+    }
+
+    /**
+     * Check client join.
+     *
+     * @throws Exception If failed.
+     */
+    private void checkClientJoin(boolean dynamic) throws Exception {
+        IgniteEx node1;
+
+        if (dynamic) {
+            node1 = startNoCache(1);
+
+            node1.getOrCreateCache(cacheConfiguration(KeyClass.class, ValueClass.class));
+        }
+        else
+            node1 = start(1, KeyClass.class, ValueClass.class);
+
+        IgniteEx node2 = startClient(2);
+
+        assertTypes(node1, ValueClass.class);
+        assertTypes(node2, ValueClass.class);
+
+        IgniteEx node3 = startClient(3, KeyClass.class, ValueClass.class,
+            KeyClass2.class, ValueClass2.class);
+
+        assertTypes(node1, ValueClass.class);
+        assertTypes(node2, ValueClass.class);
+        assertTypes(node3, ValueClass.class);
+
+        IgniteEx node4 = startClientNoCache(4);
+
+        assertTypes(node1, ValueClass.class);
+        assertTypes(node2, ValueClass.class);
+        assertTypes(node3, ValueClass.class);
+
+        assertTypes(node4);
+
+        node4.cache(CACHE_NAME);
+        assertTypes(node4, ValueClass.class);
+    }
+
+    /**
+     * Test client cache start (static).
+     *
+     * @throws Exception If failed.
+     */
+    public void testClientCacheStartStatic() throws Exception {
+        checkClientCacheStart(false);
+    }
+
+    /**
+     * Test client cache start (dynamic).
+     *
+     * @throws Exception If failed.
+     */
+    public void testClientCacheStartDynamic() throws Exception {
+        checkClientCacheStart(true);
+    }
+
+    /**
+     * Check client cache start.
+     *
+     * @throws Exception If failed.
+     */
+    private void checkClientCacheStart(boolean dynamic) throws Exception {
+        IgniteEx node1 = startNoCache(1);
+
+        IgniteEx node2;
+
+        if (dynamic) {
+            node2 = startClientNoCache(2);
+
+            node2.getOrCreateCache(cacheConfiguration(KeyClass.class, ValueClass.class));
+        }
+        else
+            node2 = startClient(2, KeyClass.class, ValueClass.class);
+
+        assertTypes(node1, ValueClass.class);
+        assertTypes(node2, ValueClass.class);
+
+        IgniteEx node3 = start(3);
+        IgniteEx node4 = start(4,  KeyClass.class, ValueClass.class, KeyClass2.class, ValueClass2.class);
+        IgniteEx node5 = startNoCache(5);
+
+        IgniteEx node6 = startClient(6);
+        IgniteEx node7 = startClient(7,  KeyClass.class, ValueClass.class, KeyClass2.class, ValueClass2.class);
+        IgniteEx node8 = startClientNoCache(8);
+
+        assertTypes(node1, ValueClass.class);
+        assertTypes(node2, ValueClass.class);
+        assertTypes(node3, ValueClass.class);
+        assertTypes(node4, ValueClass.class);
+        assertTypes(node5, ValueClass.class);
+        assertTypes(node6, ValueClass.class);
+        assertTypes(node7, ValueClass.class);
+
+        assertTypes(node8);
+        node8.cache(CACHE_NAME);
+        assertTypes(node8, ValueClass.class);
+
+        node2.destroyCache(CACHE_NAME);
+        node2.getOrCreateCache(
+            cacheConfiguration(KeyClass.class, ValueClass.class, KeyClass2.class, ValueClass2.class));
+
+        assertTypes(node1, ValueClass.class, ValueClass2.class);
+        assertTypes(node2, ValueClass.class, ValueClass2.class);
+        assertTypes(node3, ValueClass.class, ValueClass2.class);
+        assertTypes(node4, ValueClass.class, ValueClass2.class);
+        assertTypes(node5, ValueClass.class, ValueClass2.class);
+
+        assertTypes(node6);
+        assertTypes(node7);
+        assertTypes(node8);
+
+        node6.cache(CACHE_NAME);
+        node7.cache(CACHE_NAME);
+        node8.cache(CACHE_NAME);
+
+        assertTypes(node6, ValueClass.class, ValueClass2.class);
+        assertTypes(node7, ValueClass.class, ValueClass2.class);
+        assertTypes(node8, ValueClass.class, ValueClass2.class);
+    }
+
+    /**
+     * Test behavior when node filter is set.
+     *
+     * @throws Exception If failed.
+     */
+    public void testNodeFilter() throws Exception {
+        filterNodeName = getTestIgniteInstanceName(1);
+
+        IgniteEx node1 = start(1, KeyClass.class, ValueClass.class);
+        assertTypes(node1, ValueClass.class);
+
+        IgniteEx node2 = start(2, KeyClass.class, ValueClass.class);
+        assertTypes(node1, ValueClass.class);
+        assertTypes(node2, ValueClass.class);
+
+        IgniteEx node3 = startNoCache(3);
+        assertTypes(node1, ValueClass.class);
+        assertTypes(node2, ValueClass.class);
+
+        assertTypes(node3);
+
+        node3.cache(CACHE_NAME);
+        assertTypes(node3, ValueClass.class);
+    }
+
+    /**
+     * Test client reconnect.
+     *
+     * @throws Exception If failed.
+     */
+    public void testClientReconnect() throws Exception {
+        IgniteEx node1 = start(1, KeyClass.class, ValueClass.class);
+        assertTypes(node1, ValueClass.class);
+
+        IgniteEx node2 = startClientNoCache(2);
+        assertTypes(node2);
+
+        node2.cache(CACHE_NAME);
+        assertTypes(node2, ValueClass.class);
+
+        stopGrid(1);
+
+        assert GridTestUtils.waitForCondition(new GridAbsPredicate() {
+            @Override public boolean apply() {
+                return grid(2).context().clientDisconnected();
+            }
+        }, 10_000L);
+
+        IgniteFuture reconnFut = null;
+
+        try {   
+            node2.cache(CACHE_NAME);
+
+            fail();
+        }
+        catch (IgniteClientDisconnectedException e) {
+            reconnFut = e.reconnectFuture();
+        }
+
+        node1 = start(1, KeyClass.class, ValueClass.class, KeyClass2.class, ValueClass2.class);
+        assertTypes(node1, ValueClass.class, ValueClass2.class);
+
+        reconnFut.get();
+
+        assertTypes(node2);
+
+        node2.cache(CACHE_NAME);
+        assertTypes(node2, ValueClass.class, ValueClass2.class);
+    }
+
+    /**
+     * Ensure that only provided types exists for the given cache.
+     *
+     * @param node Node.
+     * @param clss Classes.
+     */
+    private static void assertTypes(IgniteEx node, Class... clss) {
+        Map<String, QueryTypeDescriptorImpl> types = types(node, CACHE_NAME);
+
+        if (clss == null || clss.length == 0)
+            assert types.isEmpty();
+        else {
+            assertEquals(clss.length, types.size());
+
+            for (Class cls : clss) {
+                String tblName = tableName(cls);
+
+                assert types.containsKey(tblName);
+            }
+        }
+    }
+
+    /**
+     * Start node with the given cache configuration.
+     *
+     * @param clss Key-value classes.
+     * @return Node.
+     */
+    private IgniteEx start(int idx, Class... clss) throws Exception {
+        return start(idx, false, clss);
+    }
+
+    /**
+     * Start client node with the given cache configuration.
+     *
+     * @param clss Key-value classes.
+     * @return Node.
+     */
+    private IgniteEx startClient(int idx, Class... clss) throws Exception {
+        return start(idx, true, clss);
+    }
+
+    /**
+     * Start node with the given cache configuration.
+     *
+     * @param idx Index.
+     * @param client Client flag.
+     * @param clss Key-value classes.
+     * @return Node.
+     */
+    private IgniteEx start(int idx, boolean client, Class... clss) throws Exception {
+        String name = getTestIgniteInstanceName(idx);
+
+        IgniteConfiguration cfg = getConfiguration(name);
+
+        cfg.setClientMode(client);
+        cfg.setLocalHost("127.0.0.1");
+        cfg.setCacheConfiguration(cacheConfiguration(clss));
+
+        if (filterNodeName != null && F.eq(name, filterNodeName))
+            cfg.setUserAttributes(Collections.singletonMap("AFF_NODE", true));
+
+        return (IgniteEx)Ignition.start(cfg);
+    }
+
+    /**
+     * Start node without cache.
+     *
+     * @param idx Index.
+     * @return Node.
+     * @throws Exception If failed.
+     */
+    private IgniteEx startNoCache(int idx) throws Exception {
+        return startNoCache(idx, false);
+    }
+
+    /**
+     * Start client node without cache.
+     *
+     * @param idx Index.
+     * @return Node.
+     * @throws Exception If failed.
+     */
+    private IgniteEx startClientNoCache(int idx) throws Exception {
+        return startNoCache(idx, true);
+    }
+
+    /**
+     * Start node without cache.
+     *
+     * @param idx Index.
+     * @param client Client mode flag.
+     * @return Node.
+     * @throws Exception If failed.
+     */
+    private IgniteEx startNoCache(int idx, boolean client) throws Exception {
+        String name = getTestIgniteInstanceName(idx);
+
+        IgniteConfiguration cfg = getConfiguration(name);
+
+        cfg.setClientMode(client);
+        cfg.setLocalHost("127.0.0.1");
+
+        return (IgniteEx)Ignition.start(cfg);
+    }
+
+    /**
+     * Get cache configuration.
+     *
+     * @param clss QUery classes.
+     * @return Configuration.
+     */
+    @SuppressWarnings("unchecked")
+    private static CacheConfiguration cacheConfiguration(Class... clss) {
+        CacheConfiguration ccfg = new CacheConfiguration().setName(CACHE_NAME).setIndexedTypes(clss);
+
+        if (filterNodeName != null) {
+            ccfg.setNodeFilter(new IgnitePredicate<ClusterNode>() {
+                @Override public boolean apply(ClusterNode node) {
+                    return node.attribute("AFF_NODE") != null;
+                }
+            });
+        }
+
+        return ccfg;
+    }
+
+    // TODO: Start/stop many nodes with static configs and dynamic start/stop.
+
+    /**
+     * Key class 2.
+     */
+    @SuppressWarnings("unused")
+    private static class KeyClass2 {
+        @QuerySqlField
+        private String keyField2;
+    }
+
+    /**
+     * Value class 2.
+     */
+    @SuppressWarnings("unused")
+    private static class ValueClass2 {
+        @QuerySqlField
+        private String valField2;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/local/IgniteCacheLocalQuerySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/local/IgniteCacheLocalQuerySelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/local/IgniteCacheLocalQuerySelfTest.java
index 6013b80..e0c6396 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/local/IgniteCacheLocalQuerySelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/local/IgniteCacheLocalQuerySelfTest.java
@@ -85,6 +85,6 @@ public class IgniteCacheLocalQuerySelfTest extends IgniteCacheAbstractQuerySelfT
         List<List<?>> res = cache.query(new SqlFieldsQuery(
             "explain select _key from String where _val > 'value1'").setLocal(true)).getAll();
 
-        assertTrue("__ explain: \n" + res, ((String)res.get(0).get(0)).contains("_val_idx"));
+        assertTrue("__ explain: \n" + res, ((String)res.get(0).get(0)).toLowerCase().contains("_val_idx"));
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteQueryDedicatedPoolTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteQueryDedicatedPoolTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteQueryDedicatedPoolTest.java
index 711db2f..fe966f9 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteQueryDedicatedPoolTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteQueryDedicatedPoolTest.java
@@ -83,7 +83,6 @@ public class IgniteQueryDedicatedPoolTest extends GridCommonAbstractTest {
         if ("client".equals(gridName))
             cfg.setClientMode(true);
 
-
         cfg.setIndexingSpi(new TestIndexingSpi());
 
         return cfg;

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlSplitterSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlSplitterSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlSplitterSelfTest.java
index b180eba..2a03796 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlSplitterSelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlSplitterSelfTest.java
@@ -413,7 +413,7 @@ public class IgniteSqlSplitterSelfTest extends GridCommonAbstractTest {
 
             info("Plan: " + plan);
 
-            assertTrue(plan.contains("grpIdx"));
+            assertTrue("_explain: " + plan, plan.toLowerCase().contains("grpidx"));
 
             // Sorted list
             List<GroupIndexTestValue> list = F.asList(

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java
index 1c30412..e62199a 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java
@@ -87,7 +87,7 @@ public abstract class GridIndexingSpiAbstractSelfTest extends GridCommonAbstract
         return cfg;
     }
 
-    /**
+    /*
      * Fields initialization.
      */
     static {
@@ -246,22 +246,22 @@ public abstract class GridIndexingSpiAbstractSelfTest extends GridCommonAbstract
     public void testSpi() throws Exception {
         IgniteH2Indexing spi = getIndexing();
 
-        assertEquals(-1, spi.size(typeAA.space(), typeAA));
-        assertEquals(-1, spi.size(typeAB.space(), typeAB));
-        assertEquals(-1, spi.size(typeBA.space(), typeBA));
+        assertEquals(-1, spi.size(typeAA.space(), typeAA.name()));
+        assertEquals(-1, spi.size(typeAB.space(), typeAB.name()));
+        assertEquals(-1, spi.size(typeBA.space(), typeBA.name()));
 
         IgniteCache<Integer, BinaryObject> cacheA = ignite0.createCache(cacheACfg());
 
-        assertEquals(0, spi.size(typeAA.space(), typeAA));
-        assertEquals(0, spi.size(typeAB.space(), typeAB));
-        assertEquals(-1, spi.size(typeBA.space(), typeBA));
+        assertEquals(0, spi.size(typeAA.space(), typeAA.name()));
+        assertEquals(0, spi.size(typeAB.space(), typeAB.name()));
+        assertEquals(-1, spi.size(typeBA.space(), typeBA.name()));
 
         IgniteCache<Integer, BinaryObject> cacheB = ignite0.createCache(cacheBCfg());
 
         // Initially all is empty.
-        assertEquals(0, spi.size(typeAA.space(), typeAA));
-        assertEquals(0, spi.size(typeAB.space(), typeAB));
-        assertEquals(0, spi.size(typeBA.space(), typeBA));
+        assertEquals(0, spi.size(typeAA.space(), typeAA.name()));
+        assertEquals(0, spi.size(typeAB.space(), typeAB.name()));
+        assertEquals(0, spi.size(typeBA.space(), typeBA.name()));
 
         assertFalse(spi.queryLocalSql(typeAA.space(), "select * from A.A", null, Collections.emptySet(), typeAA.name(), null, null).hasNext());
         assertFalse(spi.queryLocalSql(typeAB.space(), "select * from A.B", null, Collections.emptySet(), typeAB.name(), null, null).hasNext());
@@ -288,48 +288,48 @@ public abstract class GridIndexingSpiAbstractSelfTest extends GridCommonAbstract
 
         cacheA.put(1, aa("A", 1, "Vasya", 10).build());
 
-        assertEquals(1, spi.size(typeAA.space(), typeAA));
-        assertEquals(0, spi.size(typeAB.space(), typeAB));
-        assertEquals(0, spi.size(typeBA.space(), typeBA));
+        assertEquals(1, spi.size(typeAA.space(), typeAA.name()));
+        assertEquals(0, spi.size(typeAB.space(), typeAB.name()));
+        assertEquals(0, spi.size(typeBA.space(), typeBA.name()));
 
         cacheA.put(1, ab(1, "Vasya", 20, "Some text about Vasya goes here.").build());
 
         // In one space all keys must be unique.
-        assertEquals(0, spi.size(typeAA.space(), typeAA));
-        assertEquals(1, spi.size(typeAB.space(), typeAB));
-        assertEquals(0, spi.size(typeBA.space(), typeBA));
+        assertEquals(0, spi.size(typeAA.space(), typeAA.name()));
+        assertEquals(1, spi.size(typeAB.space(), typeAB.name()));
+        assertEquals(0, spi.size(typeBA.space(), typeBA.name()));
 
         cacheB.put(1, ba(2, "Petya", 25, true).build());
 
         // No replacement because of different space.
-        assertEquals(0, spi.size(typeAA.space(), typeAA));
-        assertEquals(1, spi.size(typeAB.space(), typeAB));
-        assertEquals(1, spi.size(typeBA.space(), typeBA));
+        assertEquals(0, spi.size(typeAA.space(), typeAA.name()));
+        assertEquals(1, spi.size(typeAB.space(), typeAB.name()));
+        assertEquals(1, spi.size(typeBA.space(), typeBA.name()));
 
         cacheB.put(1, ba(2, "Kolya", 25, true).build());
 
         // Replacement in the same table.
-        assertEquals(0, spi.size(typeAA.space(), typeAA));
-        assertEquals(1, spi.size(typeAB.space(), typeAB));
-        assertEquals(1, spi.size(typeBA.space(), typeBA));
+        assertEquals(0, spi.size(typeAA.space(), typeAA.name()));
+        assertEquals(1, spi.size(typeAB.space(), typeAB.name()));
+        assertEquals(1, spi.size(typeBA.space(), typeBA.name()));
 
         cacheA.put(2, aa("A", 2, "Valera", 19).build());
 
-        assertEquals(1, spi.size(typeAA.space(), typeAA));
-        assertEquals(1, spi.size(typeAB.space(), typeAB));
-        assertEquals(1, spi.size(typeBA.space(), typeBA));
+        assertEquals(1, spi.size(typeAA.space(), typeAA.name()));
+        assertEquals(1, spi.size(typeAB.space(), typeAB.name()));
+        assertEquals(1, spi.size(typeBA.space(), typeBA.name()));
 
         cacheA.put(3, aa("A", 3, "Borya", 18).build());
 
-        assertEquals(2, spi.size(typeAA.space(), typeAA));
-        assertEquals(1, spi.size(typeAB.space(), typeAB));
-        assertEquals(1, spi.size(typeBA.space(), typeBA));
+        assertEquals(2, spi.size(typeAA.space(), typeAA.name()));
+        assertEquals(1, spi.size(typeAB.space(), typeAB.name()));
+        assertEquals(1, spi.size(typeBA.space(), typeBA.name()));
 
         cacheA.put(4, ab(4, "Vitalya", 20, "Very Good guy").build());
 
-        assertEquals(2, spi.size(typeAA.space(), typeAA));
-        assertEquals(2, spi.size(typeAB.space(), typeAB));
-        assertEquals(1, spi.size(typeBA.space(), typeBA));
+        assertEquals(2, spi.size(typeAA.space(), typeAA.name()));
+        assertEquals(2, spi.size(typeAB.space(), typeAB.name()));
+        assertEquals(1, spi.size(typeBA.space(), typeBA.name()));
 
         // Query data.
         Iterator<IgniteBiTuple<Integer, BinaryObjectImpl>> res =
@@ -376,7 +376,7 @@ public abstract class GridIndexingSpiAbstractSelfTest extends GridCommonAbstract
 
         // Text queries
         Iterator<IgniteBiTuple<Integer, BinaryObjectImpl>> txtRes = spi.queryLocalText(typeAB.space(), "good",
-            typeAB, null);
+            typeAB.name(), null);
 
         assertTrue(txtRes.hasNext());
         assertEquals(ab(4, "Vitalya", 20, "Very Good guy").build(), value(txtRes.next()));
@@ -410,32 +410,32 @@ public abstract class GridIndexingSpiAbstractSelfTest extends GridCommonAbstract
         // Remove
         cacheA.remove(2);
 
-        assertEquals(1, spi.size(typeAA.space(), typeAA));
-        assertEquals(2, spi.size(typeAB.space(), typeAB));
-        assertEquals(1, spi.size(typeBA.space(), typeBA));
+        assertEquals(1, spi.size(typeAA.space(), typeAA.name()));
+        assertEquals(2, spi.size(typeAB.space(), typeAB.name()));
+        assertEquals(1, spi.size(typeBA.space(), typeBA.name()));
 
         cacheB.remove(1);
 
-        assertEquals(1, spi.size(typeAA.space(), typeAA));
-        assertEquals(2, spi.size(typeAB.space(), typeAB));
-        assertEquals(0, spi.size(typeBA.space(), typeBA));
+        assertEquals(1, spi.size(typeAA.space(), typeAA.name()));
+        assertEquals(2, spi.size(typeAB.space(), typeAB.name()));
+        assertEquals(0, spi.size(typeBA.space(), typeBA.name()));
 
         // Unregister.
-        spi.unregisterType(typeAA.space(), typeAA);
+        spi.unregisterType(typeAA.space(), typeAA.name());
 
-        assertEquals(-1, spi.size(typeAA.space(), typeAA));
-        assertEquals(2, spi.size(typeAB.space(), typeAB));
-        assertEquals(0, spi.size(typeBA.space(), typeBA));
+        assertEquals(-1, spi.size(typeAA.space(), typeAA.name()));
+        assertEquals(2, spi.size(typeAB.space(), typeAB.name()));
+        assertEquals(0, spi.size(typeBA.space(), typeBA.name()));
 
-        spi.unregisterType(typeAB.space(), typeAB);
+        spi.unregisterType(typeAB.space(), typeAB.name());
 
-        assertEquals(-1, spi.size(typeAA.space(), typeAA));
-        assertEquals(-1, spi.size(typeAB.space(), typeAB));
-        assertEquals(0, spi.size(typeBA.space(), typeBA));
+        assertEquals(-1, spi.size(typeAA.space(), typeAA.name()));
+        assertEquals(-1, spi.size(typeAB.space(), typeAB.name()));
+        assertEquals(0, spi.size(typeBA.space(), typeBA.name()));
 
-        spi.unregisterType(typeBA.space(), typeBA);
+        spi.unregisterType(typeBA.space(), typeBA.name());
 
-        assertEquals(-1, spi.size(typeAA.space(), typeAA));
+        assertEquals(-1, spi.size(typeAA.space(), typeAA.name()));
     }
 
     /**
@@ -500,6 +500,11 @@ public abstract class GridIndexingSpiAbstractSelfTest extends GridCommonAbstract
         }
 
         /** {@inheritDoc} */
+        @Override public String name() {
+            return null;
+        }
+
+        /** {@inheritDoc} */
         @Override public Collection<String> fields() {
             return fields;
         }
@@ -640,8 +645,12 @@ public abstract class GridIndexingSpiAbstractSelfTest extends GridCommonAbstract
 
         /** */
         @Override public Map<String, GridQueryIndexDescriptor> indexes() {
-            return textIdx == null ? Collections.<String, GridQueryIndexDescriptor>emptyMap() :
-                Collections.singletonMap("index", textIdx);
+            return Collections.emptyMap();
+        }
+
+        /** */
+        @Override public GridQueryIndexDescriptor textIndex() {
+            return textIdx;
         }
 
         /** */

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/IgniteSqlQueryMinMaxTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/IgniteSqlQueryMinMaxTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/IgniteSqlQueryMinMaxTest.java
index 0f50d7e..e78b695 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/IgniteSqlQueryMinMaxTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/IgniteSqlQueryMinMaxTest.java
@@ -142,8 +142,8 @@ public class IgniteSqlQueryMinMaxTest extends GridCommonAbstractTest {
             QueryCursor<List<?>> cursor = cache.query(new SqlFieldsQuery("explain select min(_key), max(_key) from ValueObj"));
             List<List<?>> result = cursor.getAll();
             assertEquals(2, result.size());
-            assertTrue(((String) result.get(0).get(0)).contains("_key_PK"));
-            assertTrue(((String) result.get(0).get(0)).contains("direct lookup"));
+            assertTrue(((String) result.get(0).get(0)).toLowerCase().contains("_key_pk"));
+            assertTrue(((String) result.get(0).get(0)).toLowerCase().contains("direct lookup"));
         }
     }
 
@@ -158,8 +158,8 @@ public class IgniteSqlQueryMinMaxTest extends GridCommonAbstractTest {
             QueryCursor<List<?>> cursor = cache.query(new SqlFieldsQuery("explain select min(idxVal), max(idxVal) from ValueObj"));
             List<List<?>> result = cursor.getAll();
             assertEquals(2, result.size());
-            assertTrue(((String)result.get(0).get(0)).contains("idxVal_idx"));
-            assertTrue(((String)result.get(0).get(0)).contains("direct lookup"));
+            assertTrue(((String)result.get(0).get(0)).toLowerCase().contains("idxval_idx"));
+            assertTrue(((String)result.get(0).get(0)).toLowerCase().contains("direct lookup"));
         }
     }
 
@@ -174,8 +174,8 @@ public class IgniteSqlQueryMinMaxTest extends GridCommonAbstractTest {
             QueryCursor<List<?>> cursor = cache.query(new SqlFieldsQuery("explain select min(_key), max(_key) from Integer"));
             List<List<?>> result = cursor.getAll();
             assertEquals(2, result.size());
-            assertTrue(((String)result.get(0).get(0)).contains("_key_PK"));
-            assertTrue(((String)result.get(0).get(0)).contains("direct lookup"));
+            assertTrue(((String)result.get(0).get(0)).toLowerCase().contains("_key_pk"));
+            assertTrue(((String)result.get(0).get(0)).toLowerCase().contains("direct lookup"));
         }
     }
 
@@ -190,8 +190,8 @@ public class IgniteSqlQueryMinMaxTest extends GridCommonAbstractTest {
             QueryCursor<List<?>> cursor = cache.query(new SqlFieldsQuery("explain select min(_val), max(_val) from Integer"));
             List<List<?>> result = cursor.getAll();
             assertEquals(2, result.size());
-            assertTrue(((String)result.get(0).get(0)).contains("_val_idx"));
-            assertTrue(((String)result.get(0).get(0)).contains("direct lookup"));
+            assertTrue(((String)result.get(0).get(0)).toLowerCase().contains("_val_idx"));
+            assertTrue(((String)result.get(0).get(0)).toLowerCase().contains("direct lookup"));
         }
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TableSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TableSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TableSelfTest.java
index 4bd9302..88ff61e 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TableSelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TableSelfTest.java
@@ -79,7 +79,7 @@ public class GridH2TableSelfTest extends GridCommonAbstractTest {
     private static final String NON_UNIQUE_IDX_NAME = "__GG_IDX_";
 
     /** */
-    private static final String SCAN_IDX_NAME = GridH2Table.ScanIndex.SCAN_INDEX_NAME_SUFFIX;
+    private static final String SCAN_IDX_NAME = GridH2PrimaryScanIndex.SCAN_INDEX_NAME_SUFFIX;
 
     /** */
     private Connection conn;
@@ -89,31 +89,36 @@ public class GridH2TableSelfTest extends GridCommonAbstractTest {
 
     /** {@inheritDoc} */
     @Override protected void beforeTest() throws Exception {
-        Driver.load();
-
-        conn = DriverManager.getConnection(DB_URL);
-
-        tbl = GridH2Table.Engine.createTable(conn, CREATE_TABLE_SQL, null, new GridH2Table.IndexesFactory() {
-            @Override public H2RowFactory createRowFactory(GridH2Table tbl) {
-                return null;
-            }
-
-            @Override public ArrayList<Index> createIndexes(GridH2Table tbl) {
-                ArrayList<Index> idxs = new ArrayList<>();
-
-                IndexColumn id = tbl.indexColumn(0, SortOrder.ASCENDING);
-                IndexColumn t = tbl.indexColumn(1, SortOrder.ASCENDING);
-                IndexColumn str = tbl.indexColumn(2, SortOrder.DESCENDING);
-                IndexColumn x = tbl.indexColumn(3, SortOrder.DESCENDING);
-
-                idxs.add(new H2PkHashIndex(null, tbl, HASH, F.asList(id)));
-                idxs.add(new GridH2TreeIndex(PK_NAME, tbl, true, F.asList(id)));
-                idxs.add(new GridH2TreeIndex(NON_UNIQUE_IDX_NAME, tbl, false, F.asList(x, t, id)));
-                idxs.add(new GridH2TreeIndex(STR_IDX_NAME, tbl, false, F.asList(str, id)));
-
-                return idxs;
-            }
-        }, null);
+        // TODO: IGNITE-4994: Restore mock.
+//        Driver.load();
+//
+//        conn = DriverManager.getConnection(DB_URL);
+//
+//        tbl = GridH2Table.Engine.createTable(conn, CREATE_TABLE_SQL, null, new GridH2Table.IndexesFactory() {
+//            @Override public void onTableCreated(GridH2Table tbl) {
+//                // No-op.
+//            }
+//
+//            @Override public H2RowFactory createRowFactory(GridH2Table tbl) {
+//                return null;
+//            }
+//
+//            @Override public ArrayList<Index> createIndexes(GridH2Table tbl) {
+//                ArrayList<Index> idxs = new ArrayList<>();
+//
+//                IndexColumn id = tbl.indexColumn(0, SortOrder.ASCENDING);
+//                IndexColumn t = tbl.indexColumn(1, SortOrder.ASCENDING);
+//                IndexColumn str = tbl.indexColumn(2, SortOrder.DESCENDING);
+//                IndexColumn x = tbl.indexColumn(3, SortOrder.DESCENDING);
+//
+//                idxs.add(new H2PkHashIndex(null, tbl, HASH, F.asList(id)));
+//                idxs.add(new GridH2TreeIndex(PK_NAME, tbl, true, F.asList(id)));
+//                idxs.add(new GridH2TreeIndex(NON_UNIQUE_IDX_NAME, tbl, false, F.asList(x, t, id)));
+//                idxs.add(new GridH2TreeIndex(STR_IDX_NAME, tbl, false, F.asList(str, id)));
+//
+//                return idxs;
+//            }
+//        }, null);
     }
 
     /** {@inheritDoc} */
@@ -285,120 +290,6 @@ public class GridH2TableSelfTest extends GridCommonAbstractTest {
     }
 
     /**
-     * Multithreaded indexes consistency test.
-     *
-     * @throws Exception If failed.
-     */
-    public void testIndexesMultiThreadedConsistency() throws Exception {
-        fail("https://issues.apache.org/jira/browse/IGNITE-3484");
-
-        final int threads = 19;
-        final int iterations = 1500;
-
-        multithreaded(new Callable<Void>() {
-            @Override public Void call() throws Exception {
-                Random rnd = new Random();
-
-                PreparedStatement ps1 = null;
-
-                for (int i = 0; i < iterations; i++) {
-                    UUID id = UUID.randomUUID();
-
-                    int x = rnd.nextInt(50);
-
-                    long t = System.currentTimeMillis();
-
-                    GridH2Row row = row(id, t, rnd.nextBoolean() ? id.toString() : UUID.randomUUID().toString(), x);
-
-                    assertTrue(tbl.doUpdate(row, false));
-
-                    if (rnd.nextInt(100) == 0) {
-                        tbl.lock(null, false, false);
-
-                        long cnt = 0;
-
-                        try {
-                            ArrayList<Index> idxs = tbl.getIndexes();
-
-                            // Consistency check.
-                            Set<Row> rowSet = checkIndexesConsistent(idxs, null);
-
-                            // Order check.
-                            checkOrdered(idxs);
-
-                            checkIndexesConsistent(idxs, rowSet);
-
-                            cnt = idxs.get(0).getRowCount(null);
-                        }
-                        finally {
-                            tbl.unlock(null);
-                        }
-
-                        // Row count is valid.
-                        ResultSet rs = conn.createStatement().executeQuery("select count(*) from t");
-
-                        assertTrue(rs.next());
-
-                        int cnt2 = rs.getInt(1);
-
-                        rs.close();
-
-                        assertTrue(cnt2 + " must be >= " + cnt, cnt2 >= cnt);
-                        assertTrue(cnt2 <= threads * iterations);
-
-                        // Search by ID.
-                        rs = conn.createStatement().executeQuery("select * from t where id = '" + id.toString() + "'");
-
-                        assertTrue(rs.next());
-                        assertFalse(rs.next());
-
-                        rs.close();
-
-                        // Scan search.
-                        if (ps1 == null)
-                            ps1 = conn.prepareStatement("select id from t where x = ? order by t desc");
-
-                        ps1.setInt(1, x);
-
-                        rs = ps1.executeQuery();
-
-                        for (;;) {
-                            assertTrue(rs.next());
-
-                            if (rs.getObject(1).equals(id))
-                                break;
-                        }
-
-                        rs.close();
-                    }
-                }
-                return null;
-            }
-        }, threads);
-    }
-
-    /**
-     * Run test in endless loop.
-     *
-     * @param args Arguments.
-     * @throws Exception If failed.
-     */
-    @SuppressWarnings("InfiniteLoopStatement")
-    public static void main(String ... args) throws Exception {
-        for (int i = 0;;) {
-            GridH2TableSelfTest t = new GridH2TableSelfTest();
-
-            t.beforeTest();
-
-            t.testDataLoss();
-
-            t.afterTest();
-
-            System.out.println("..." + ++i);
-        }
-    }
-
-    /**
       * @throws Exception If failed.
      */
     public void testRangeQuery() throws Exception {

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/sql/GridQueryParsingTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/sql/GridQueryParsingTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/sql/GridQueryParsingTest.java
index 1d8893e..631adeb 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/sql/GridQueryParsingTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/sql/GridQueryParsingTest.java
@@ -22,9 +22,15 @@ import java.sql.Connection;
 import java.sql.Date;
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.concurrent.Callable;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.cache.CacheAtomicityMode;
 import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.cache.QueryIndex;
+import org.apache.ignite.cache.QueryIndexType;
 import org.apache.ignite.cache.query.annotations.QuerySqlField;
 import org.apache.ignite.cache.query.annotations.QuerySqlFunction;
 import org.apache.ignite.configuration.CacheConfiguration;
@@ -32,15 +38,19 @@ import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.IgniteEx;
 import org.apache.ignite.internal.processors.query.GridQueryProcessor;
+import org.apache.ignite.internal.processors.query.IgniteSQLException;
 import org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing;
+import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
+import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.h2.command.Prepared;
 import org.h2.engine.Session;
 import org.h2.jdbc.JdbcConnection;
+import org.h2.message.DbException;
 
 import static org.apache.ignite.cache.CacheRebalanceMode.SYNC;
 import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
@@ -453,6 +463,206 @@ public class GridQueryParsingTest extends GridCommonAbstractTest {
     /**
      *
      */
+    public void testParseCreateIndex() throws Exception {
+        assertCreateIndexEquals(
+            buildCreateIndex(null, "Person", "sch1", false, QueryIndexType.SORTED, "name", true),
+            "create index on Person (name)");
+
+        assertCreateIndexEquals(
+            buildCreateIndex("idx", "Person", "sch1", false, QueryIndexType.SORTED, "name", true),
+            "create index idx on Person (name ASC)");
+
+        assertCreateIndexEquals(
+            buildCreateIndex("idx", "Person", "sch1", false, QueryIndexType.GEOSPATIAL, "name", true),
+            "create spatial index sch1.idx on sch1.Person (name ASC)");
+
+        assertCreateIndexEquals(
+            buildCreateIndex("idx", "Person", "sch1", true, QueryIndexType.SORTED, "name", true),
+            "create index if not exists sch1.idx on sch1.Person (name)");
+
+        // When we specify schema for the table and don't specify it for the index, resulting schema is table's
+        assertCreateIndexEquals(
+            buildCreateIndex("idx", "Person", "sch1", true, QueryIndexType.SORTED, "name", false),
+            "create index if not exists idx on sch1.Person (name dEsC)");
+
+        assertCreateIndexEquals(
+            buildCreateIndex("idx", "Person", "sch1", true, QueryIndexType.GEOSPATIAL, "old", true, "name", false),
+            "create spatial index if not exists idx on Person (old, name desc)");
+
+        // Schemas for index and table must match
+        assertParseThrows("create index if not exists sch2.idx on sch1.Person (name)",
+            DbException.class, "Schema name must match [90080-191]");
+
+        assertParseThrows("create hash index if not exists idx on Person (name)",
+            IgniteSQLException.class, "Only SPATIAL modifier is supported for CREATE INDEX");
+
+        assertParseThrows("create unique index if not exists idx on Person (name)",
+            IgniteSQLException.class, "Only SPATIAL modifier is supported for CREATE INDEX");
+
+        assertParseThrows("create primary key on Person (name)",
+            IgniteSQLException.class, "Only SPATIAL modifier is supported for CREATE INDEX");
+
+        assertParseThrows("create primary key hash on Person (name)",
+            IgniteSQLException.class, "Only SPATIAL modifier is supported for CREATE INDEX");
+
+        assertParseThrows("create index on Person (name nulls first)",
+            IgniteSQLException.class, "NULLS FIRST and NULLS LAST modifiers are not supported for index columns");
+
+        assertParseThrows("create index on Person (name desc nulls last)",
+            IgniteSQLException.class, "NULLS FIRST and NULLS LAST modifiers are not supported for index columns");
+    }
+
+    /**
+     *
+     */
+    public void testParseDropIndex() throws Exception {
+        // Schema that is not set defaults to default schema of connection which is empty string
+        assertDropIndexEquals(buildDropIndex("idx", "sch1", false), "drop index idx");
+        assertDropIndexEquals(buildDropIndex("idx", "sch1", true), "drop index if exists idx");
+        assertDropIndexEquals(buildDropIndex("idx", "sch1", true), "drop index if exists sch1.idx");
+        assertDropIndexEquals(buildDropIndex("idx", "sch1", false), "drop index sch1.idx");
+
+        // Message is null as long as it may differ from system to system, so we just check for exceptions
+        assertParseThrows("drop index schema2.", DbException.class, null);
+        assertParseThrows("drop index", DbException.class, null);
+        assertParseThrows("drop index if exists", DbException.class, null);
+        assertParseThrows("drop index if exists schema2.", DbException.class, null);
+    }
+
+    /**
+     * @param sql Statement.
+     * @param exCls Exception class.
+     * @param msg Expected message.
+     */
+    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
+    private void assertParseThrows(final String sql, Class<? extends Exception> exCls, String msg) {
+        GridTestUtils.assertThrows(null, new Callable<Object>() {
+            @Override public Object call() throws Exception {
+                Prepared p = parse(sql);
+
+                return new GridSqlQueryParser(false).parse(p);
+            }
+        }, exCls, msg);
+    }
+
+    /**
+     * Parse SQL and compare it to expected instance.
+     */
+    private void assertCreateIndexEquals(GridSqlCreateIndex exp, String sql) throws Exception {
+        Prepared prepared = parse(sql);
+
+        GridSqlStatement stmt = new GridSqlQueryParser(false).parse(prepared);
+
+        assertTrue(stmt instanceof GridSqlCreateIndex);
+
+        assertCreateIndexEquals(exp, (GridSqlCreateIndex) stmt);
+    }
+
+    /**
+     * Parse SQL and compare it to expected instance of DROP INDEX.
+     */
+    private void assertDropIndexEquals(GridSqlDropIndex exp, String sql) throws Exception {
+        Prepared prepared = parse(sql);
+
+        GridSqlStatement stmt = new GridSqlQueryParser(false).parse(prepared);
+
+        assertTrue(stmt instanceof GridSqlDropIndex);
+
+        assertDropIndexEquals(exp, (GridSqlDropIndex) stmt);
+    }
+
+    /**
+     * Test two instances of {@link GridSqlDropIndex} for equality.
+     */
+    private static void assertDropIndexEquals(GridSqlDropIndex exp, GridSqlDropIndex actual) {
+        assertEqualsIgnoreCase(exp.name(), actual.name());
+        assertEqualsIgnoreCase(exp.schemaName(), actual.schemaName());
+        assertEquals(exp.ifExists(), actual.ifExists());
+    }
+
+    /**
+     *
+     */
+    private static GridSqlDropIndex buildDropIndex(String name, String schema, boolean ifExists) {
+        GridSqlDropIndex res = new GridSqlDropIndex();
+
+        res.name(name);
+        res.schemaName(schema);
+        res.ifExists(ifExists);
+
+        return res;
+    }
+
+    /**
+     * Test two instances of {@link GridSqlCreateIndex} for equality.
+     */
+    private static void assertCreateIndexEquals(GridSqlCreateIndex exp, GridSqlCreateIndex actual) {
+        assertEquals(exp.ifNotExists(), actual.ifNotExists());
+        assertEqualsIgnoreCase(exp.schemaName(), actual.schemaName());
+        assertEqualsIgnoreCase(exp.tableName(), actual.tableName());
+
+        assertEqualsIgnoreCase(exp.index().getName(), actual.index().getName());
+
+        Iterator<Map.Entry<String, Boolean>> expFldsIt = exp.index().getFields().entrySet().iterator();
+        Iterator<Map.Entry<String, Boolean>> actualFldsIt = actual.index().getFields().entrySet().iterator();
+
+        while (expFldsIt.hasNext()) {
+            assertTrue(actualFldsIt.hasNext());
+
+            Map.Entry<String, Boolean> expEntry = expFldsIt.next();
+            Map.Entry<String, Boolean> actualEntry = actualFldsIt.next();
+
+            assertEqualsIgnoreCase(expEntry.getKey(), actualEntry.getKey());
+            assertEquals(expEntry.getValue(), actualEntry.getValue());
+        }
+
+        assertFalse(actualFldsIt.hasNext());
+
+        assertEquals(exp.index().getIndexType(), actual.index().getIndexType());
+    }
+
+    /**
+     *
+     */
+    private static void assertEqualsIgnoreCase(String exp, String actual) {
+        assertEquals((exp == null), (actual == null));
+
+        if (exp != null)
+            assertTrue(exp.equalsIgnoreCase(actual));
+    }
+
+    /**
+     *
+     */
+    private static GridSqlCreateIndex buildCreateIndex(String name, String tblName, String schemaName, boolean ifNotExists,
+        QueryIndexType type, Object... flds) {
+        QueryIndex idx = new QueryIndex();
+
+        idx.setName(name);
+
+        assert !F.isEmpty(flds) && flds.length % 2 == 0;
+
+        LinkedHashMap<String, Boolean> trueFlds = new LinkedHashMap<>();
+
+        for (int i = 0; i < flds.length / 2; i++)
+            trueFlds.put((String)flds[i * 2], (Boolean)flds[i * 2 + 1]);
+
+        idx.setFields(trueFlds);
+        idx.setIndexType(type);
+
+        GridSqlCreateIndex res = new GridSqlCreateIndex();
+
+        res.schemaName(schemaName);
+        res.tableName(tblName);
+        res.ifNotExists(ifNotExists);
+        res.index(idx);
+
+        return res;
+    }
+
+    /**
+     *
+     */
     private JdbcConnection connection() throws Exception {
         GridKernalContext ctx = ((IgniteEx)ignite).context();
 
@@ -508,7 +718,7 @@ public class GridQueryParsingTest extends GridCommonAbstractTest {
 
         System.out.println(normalizeSql(res));
 
-        assertSqlEquals(prepared.getPlanSQL(), res);
+        assertSqlEquals(U.firstNotNull(prepared.getPlanSQL(), prepared.getSQL()), res);
     }
 
     @QuerySqlFunction

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java
index de341d0..b61affe 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java
@@ -81,6 +81,18 @@ import org.apache.ignite.internal.processors.cache.distributed.replicated.Ignite
 import org.apache.ignite.internal.processors.cache.distributed.replicated.IgniteCacheReplicatedFieldsQuerySelfTest;
 import org.apache.ignite.internal.processors.cache.distributed.replicated.IgniteCacheReplicatedQueryP2PDisabledSelfTest;
 import org.apache.ignite.internal.processors.cache.distributed.replicated.IgniteCacheReplicatedQuerySelfTest;
+import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexAtomicPartitionedNearSelfTest;
+import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexAtomicPartitionedSelfTest;
+import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexAtomicReplicatedSelfTest;
+import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexTransactionalPartitionedNearSelfTest;
+import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexTransactionalPartitionedSelfTest;
+import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexTransactionalReplicatedSelfTest;
+import org.apache.ignite.internal.processors.cache.index.DynamicIndexClientBasicSelfTest;
+import org.apache.ignite.internal.processors.cache.index.DynamicIndexServerCoordinatorBasicSelfTest;
+import org.apache.ignite.internal.processors.cache.index.DynamicIndexServerNodeFIlterBasicSelfTest;
+import org.apache.ignite.internal.processors.cache.index.DynamicIndexServerNodeFilterCoordinatorBasicSelfTest;
+import org.apache.ignite.internal.processors.cache.index.DynamicIndexServerBasicSelfTest;
+import org.apache.ignite.internal.processors.cache.index.SchemaExchangeSelfTest;
 import org.apache.ignite.internal.processors.cache.local.IgniteCacheLocalAtomicQuerySelfTest;
 import org.apache.ignite.internal.processors.cache.local.IgniteCacheLocalFieldsQuerySelfTest;
 import org.apache.ignite.internal.processors.cache.local.IgniteCacheLocalQueryCancelOrTimeoutSelfTest;
@@ -98,7 +110,6 @@ import org.apache.ignite.internal.processors.query.IgniteSqlSplitterSelfTest;
 import org.apache.ignite.internal.processors.query.h2.GridH2IndexingInMemSelfTest;
 import org.apache.ignite.internal.processors.query.h2.GridH2IndexingOffheapSelfTest;
 import org.apache.ignite.internal.processors.query.h2.IgniteSqlQueryMinMaxTest;
-import org.apache.ignite.internal.processors.query.h2.opt.GridH2TableSelfTest;
 import org.apache.ignite.internal.processors.query.h2.sql.BaseH2CompareQueryTest;
 import org.apache.ignite.internal.processors.query.h2.sql.GridQueryParsingTest;
 import org.apache.ignite.internal.processors.query.h2.sql.H2CompareBigQueryDistributedJoinsTest;
@@ -117,8 +128,20 @@ public class IgniteCacheQuerySelfTestSuite extends TestSuite {
     public static TestSuite suite() throws Exception {
         IgniteTestSuite suite = new IgniteTestSuite("Ignite Cache Queries Test Suite");
 
+        // Dynamic index create/drop tests.
+        suite.addTest(new TestSuite(SchemaExchangeSelfTest.class));
+
+        suite.addTest(new TestSuite(DynamicIndexServerCoordinatorBasicSelfTest.class));
+        suite.addTest(new TestSuite(DynamicIndexServerBasicSelfTest.class));
+        suite.addTest(new TestSuite(DynamicIndexServerNodeFilterCoordinatorBasicSelfTest.class));
+        suite.addTest(new TestSuite(DynamicIndexServerNodeFIlterBasicSelfTest.class));
+        suite.addTest(new TestSuite(DynamicIndexClientBasicSelfTest.class));
+
         // H2 tests.
-        suite.addTest(new TestSuite(GridH2TableSelfTest.class));
+
+        // TODO: IGNITE-4994: Restore mock.
+        // suite.addTest(new TestSuite(GridH2TableSelfTest.class));
+
         suite.addTest(new TestSuite(GridH2IndexingInMemSelfTest.class));
         suite.addTest(new TestSuite(GridH2IndexingOffheapSelfTest.class));
 
@@ -171,6 +194,7 @@ public class IgniteCacheQuerySelfTestSuite extends TestSuite {
 
         suite.addTestSuite(IgniteCacheMultipleIndexedTypesTest.class);
 
+        // DML.
         suite.addTestSuite(IgniteCacheMergeSqlQuerySelfTest.class);
         suite.addTestSuite(IgniteCacheInsertSqlQuerySelfTest.class);
         suite.addTestSuite(IgniteCacheUpdateSqlQuerySelfTest.class);
@@ -185,6 +209,14 @@ public class IgniteCacheQuerySelfTestSuite extends TestSuite {
         suite.addTestSuite(IgniteCacheMultipleIndexedTypesTest.class);
         suite.addTestSuite(IgniteSqlQueryMinMaxTest.class);
 
+        // DDL.
+        suite.addTestSuite(H2DynamicIndexTransactionalReplicatedSelfTest.class);
+        suite.addTestSuite(H2DynamicIndexTransactionalPartitionedSelfTest.class);
+        suite.addTestSuite(H2DynamicIndexTransactionalPartitionedNearSelfTest.class);
+        suite.addTestSuite(H2DynamicIndexAtomicReplicatedSelfTest.class);
+        suite.addTestSuite(H2DynamicIndexAtomicPartitionedSelfTest.class);
+        suite.addTestSuite(H2DynamicIndexAtomicPartitionedNearSelfTest.class);
+
         // Fields queries.
         suite.addTestSuite(SqlFieldsQuerySelfTest.class);
         suite.addTestSuite(IgniteCacheLocalFieldsQuerySelfTest.class);
@@ -227,7 +259,6 @@ public class IgniteCacheQuerySelfTestSuite extends TestSuite {
         suite.addTestSuite(IgniteCacheNoClassQuerySelfTest.class);
 
         // Cancellation.
-
         suite.addTestSuite(IgniteCacheDistributedQueryCancelSelfTest.class);
         suite.addTestSuite(IgniteCacheLocalQueryCancelOrTimeoutSelfTest.class);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite2.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite2.java b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite2.java
index 416f150..5085cd5 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite2.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite2.java
@@ -30,6 +30,10 @@ import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheD
 import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheQueryNodeFailTest;
 import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheQueryNodeRestartSelfTest;
 import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheQueryNodeRestartSelfTest2;
+import org.apache.ignite.internal.processors.cache.index.DynamicIndexPartitionedAtomicConcurrentSelfTest;
+import org.apache.ignite.internal.processors.cache.index.DynamicIndexPartitionedTransactionalConcurrentSelfTest;
+import org.apache.ignite.internal.processors.cache.index.DynamicIndexReplicatedAtomicConcurrentSelfTest;
+import org.apache.ignite.internal.processors.cache.index.DynamicIndexReplicatedTransactionalConcurrentSelfTest;
 import org.apache.ignite.testframework.IgniteTestSuite;
 
 /**
@@ -43,6 +47,13 @@ public class IgniteCacheQuerySelfTestSuite2 extends TestSuite {
     public static TestSuite suite() throws Exception {
         TestSuite suite = new IgniteTestSuite("Ignite Cache Queries Test Suite 2");
 
+        // Dynamic index create/drop tests.
+        suite.addTestSuite(DynamicIndexPartitionedAtomicConcurrentSelfTest.class);
+        suite.addTestSuite(DynamicIndexPartitionedTransactionalConcurrentSelfTest.class);
+        suite.addTestSuite(DynamicIndexReplicatedAtomicConcurrentSelfTest.class);
+        suite.addTestSuite(DynamicIndexReplicatedTransactionalConcurrentSelfTest.class);
+
+        // Other tests.
         suite.addTestSuite(IgniteCacheQueryMultiThreadedSelfTest.class);
 
         suite.addTestSuite(IgniteCacheQueryEvictsMultiThreadedSelfTest.class);


[26/70] [abbrv] ignite git commit: Merge remote-tracking branch 'origin/ignite-2.0' into ignite-2.0

Posted by sb...@apache.org.
Merge remote-tracking branch 'origin/ignite-2.0' into 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/43d6d7e7
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/43d6d7e7
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/43d6d7e7

Branch: refs/heads/ignite-2893
Commit: 43d6d7e7eb9eb146c48b843293849ac687ead216
Parents: d60cf53 d78e071
Author: sboikov <sb...@gridgain.com>
Authored: Tue Apr 18 16:50:45 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Tue Apr 18 16:50:45 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(-)
----------------------------------------------------------------------



[56/70] [abbrv] ignite git commit: Rename OutOfMemoryException

Posted by sb...@apache.org.
Rename OutOfMemoryException


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/67d3358d
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/67d3358d
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/67d3358d

Branch: refs/heads/ignite-2893
Commit: 67d3358d030a2e40262a7a344ef95fee607b274e
Parents: a51477c
Author: Sergey Chugunov <se...@gmail.com>
Authored: Wed Apr 19 16:45:53 2017 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Wed Apr 19 16:45:53 2017 +0300

----------------------------------------------------------------------
 .../benchmarks/jmh/tree/BPlusTreeBenchmark.java |  1 +
 .../MemoryPolicyConfiguration.java              |  4 +-
 .../mem/IgniteOutOfMemoryException.java         | 51 ++++++++++++++++++++
 .../internal/mem/OutOfMemoryException.java      | 51 --------------------
 .../pagemem/impl/PageMemoryNoStoreImpl.java     | 16 +++++-
 .../IgniteCacheDatabaseSharedManager.java       | 12 +++--
 .../pagemem/impl/PageMemoryNoLoadSelfTest.java  |  2 +-
 .../CacheMemoryPolicyConfigurationTest.java     |  6 +--
 .../processors/database/BPlusTreeSelfTest.java  |  7 ++-
 .../database/FreeListImplSelfTest.java          |  8 ++-
 .../database/MetadataStorageSelfTest.java       |  2 +-
 .../h2/database/InlineIndexHelperTest.java      |  3 ++
 12 files changed, 98 insertions(+), 65 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/67d3358d/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/tree/BPlusTreeBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/tree/BPlusTreeBenchmark.java b/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/tree/BPlusTreeBenchmark.java
index 5d02235..5833e1f 100644
--- a/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/tree/BPlusTreeBenchmark.java
+++ b/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/tree/BPlusTreeBenchmark.java
@@ -213,6 +213,7 @@ public class BPlusTreeBenchmark extends JmhAbstractBenchmark {
             new UnsafeMemoryProvider(sizes),
             null,
             PAGE_SIZE,
+            null,
             new MemoryMetricsImpl(null),
             false);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/67d3358d/modules/core/src/main/java/org/apache/ignite/configuration/MemoryPolicyConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/MemoryPolicyConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/MemoryPolicyConfiguration.java
index 2cd6d02..810ecaa 100644
--- a/modules/core/src/main/java/org/apache/ignite/configuration/MemoryPolicyConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/configuration/MemoryPolicyConfiguration.java
@@ -17,7 +17,7 @@
 package org.apache.ignite.configuration;
 
 import java.io.Serializable;
-import org.apache.ignite.internal.mem.OutOfMemoryException;
+import org.apache.ignite.internal.mem.IgniteOutOfMemoryException;
 
 /**
  * This class allows defining custom memory policies' configurations with various parameters for Apache Ignite
@@ -86,7 +86,7 @@ public final class MemoryPolicyConfiguration implements Serializable {
      * it will take empty page from the pool instead of allocating a new one.
      * Increase this parameter if cache can contain very big entries (total size of pages in the pool should be enough
      * to contain largest cache entry).
-     * Increase this parameter if {@link OutOfMemoryException} occurred with enabled page eviction.
+     * Increase this parameter if {@link IgniteOutOfMemoryException} occurred with enabled page eviction.
      */
     private int emptyPagesPoolSize = 100;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/67d3358d/modules/core/src/main/java/org/apache/ignite/internal/mem/IgniteOutOfMemoryException.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/mem/IgniteOutOfMemoryException.java b/modules/core/src/main/java/org/apache/ignite/internal/mem/IgniteOutOfMemoryException.java
new file mode 100644
index 0000000..22ef795
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/mem/IgniteOutOfMemoryException.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.mem;
+
+import java.io.IOException;
+import org.apache.ignite.IgniteException;
+
+/**
+ *
+ */
+public class IgniteOutOfMemoryException extends IgniteException {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /**
+     *
+     */
+    public IgniteOutOfMemoryException() {
+        // No-op.
+    }
+
+    /**
+     * @param msg Error message.
+     */
+    public IgniteOutOfMemoryException(String msg) {
+        super(msg);
+    }
+
+    /**
+     * @param msg Error message.
+     * @param e Cause exception.
+     */
+    public IgniteOutOfMemoryException(String msg, IOException e) {
+        super(msg, e);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/67d3358d/modules/core/src/main/java/org/apache/ignite/internal/mem/OutOfMemoryException.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/mem/OutOfMemoryException.java b/modules/core/src/main/java/org/apache/ignite/internal/mem/OutOfMemoryException.java
deleted file mode 100644
index 8219807..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/mem/OutOfMemoryException.java
+++ /dev/null
@@ -1,51 +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.internal.mem;
-
-import java.io.IOException;
-import org.apache.ignite.IgniteException;
-
-/**
- *
- */
-public class OutOfMemoryException extends IgniteException {
-    /** */
-    private static final long serialVersionUID = 0L;
-
-    /**
-     *
-     */
-    public OutOfMemoryException() {
-        // No-op.
-    }
-
-    /**
-     * @param msg Error message.
-     */
-    public OutOfMemoryException(String msg) {
-        super(msg);
-    }
-
-    /**
-     * @param msg Error message.
-     * @param e Cause exception.
-     */
-    public OutOfMemoryException(String msg, IOException e) {
-        super(msg, e);
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/67d3358d/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoStoreImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoStoreImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoStoreImpl.java
index 7134cff..872e496 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoStoreImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoStoreImpl.java
@@ -24,10 +24,11 @@ import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.IgniteLogger;
+import org.apache.ignite.configuration.MemoryPolicyConfiguration;
 import org.apache.ignite.internal.mem.DirectMemory;
 import org.apache.ignite.internal.mem.DirectMemoryProvider;
 import org.apache.ignite.internal.mem.DirectMemoryRegion;
-import org.apache.ignite.internal.mem.OutOfMemoryException;
+import org.apache.ignite.internal.mem.IgniteOutOfMemoryException;
 import org.apache.ignite.internal.pagemem.PageIdUtils;
 import org.apache.ignite.internal.pagemem.PageMemory;
 import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
@@ -36,6 +37,7 @@ import org.apache.ignite.internal.processors.cache.database.tree.io.PageIO;
 import org.apache.ignite.internal.util.GridUnsafe;
 import org.apache.ignite.internal.util.OffheapReadWriteLock;
 import org.apache.ignite.internal.util.offheap.GridOffHeapOutOfMemoryException;
+import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lifecycle.LifecycleAware;
 
 import static org.apache.ignite.internal.util.GridUnsafe.wrapPointer;
@@ -105,6 +107,9 @@ public class PageMemoryNoStoreImpl implements PageMemory {
     /** Direct memory allocator. */
     private final DirectMemoryProvider directMemoryProvider;
 
+    /** Name of MemoryPolicy this PageMemory is associated with. */
+    private final MemoryPolicyConfiguration memoryPolicyCfg;
+
     /** Object to collect memory usage metrics. */
     private final MemoryMetricsImpl memMetrics;
 
@@ -137,6 +142,7 @@ public class PageMemoryNoStoreImpl implements PageMemory {
      * @param directMemoryProvider Memory allocator to use.
      * @param sharedCtx Cache shared context.
      * @param pageSize Page size.
+     * @param memPlcCfg Memory Policy configuration.
      * @param memMetrics Memory Metrics.
      * @param trackAcquiredPages If {@code true} tracks number of allocated pages (for tests purpose only).
      */
@@ -145,6 +151,7 @@ public class PageMemoryNoStoreImpl implements PageMemory {
         DirectMemoryProvider directMemoryProvider,
         GridCacheSharedContext<?, ?> sharedCtx,
         int pageSize,
+        MemoryPolicyConfiguration memPlcCfg,
         MemoryMetricsImpl memMetrics,
         boolean trackAcquiredPages
     ) {
@@ -155,6 +162,7 @@ public class PageMemoryNoStoreImpl implements PageMemory {
         this.directMemoryProvider = directMemoryProvider;
         this.trackAcquiredPages = trackAcquiredPages;
         this.memMetrics = memMetrics;
+        memoryPolicyCfg = memPlcCfg;
 
         sysPageSize = pageSize + PAGE_OVERHEAD;
 
@@ -252,7 +260,11 @@ public class PageMemoryNoStoreImpl implements PageMemory {
         }
 
         if (relPtr == INVALID_REL_PTR)
-            throw new OutOfMemoryException();
+            throw new IgniteOutOfMemoryException("Not enough memory allocated " +
+                "(consider increasing memory policy size or enabling evictions) " +
+                "[policyName=" + memoryPolicyCfg.getName() +
+                ", size=" + U.readableSize(memoryPolicyCfg.getSize(), true) + "]"
+            );
 
         assert (relPtr & ~PageIdUtils.PAGE_IDX_MASK) == 0;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/67d3358d/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 a34aed2..e6fe7cd 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
@@ -608,7 +608,7 @@ public class IgniteCacheDatabaseSharedManager extends GridCacheSharedManagerAdap
                 true,
                 sizes);
 
-        PageMemory pageMem = createPageMemory(memProvider, dbCfg.getPageSize(), memMetrics);
+        PageMemory pageMem = createPageMemory(memProvider, dbCfg.getPageSize(), plc, memMetrics);
 
         return new MemoryPolicy(pageMem, plc, memMetrics, createPageEvictionTracker(plc, pageMem));
     }
@@ -676,11 +676,17 @@ public class IgniteCacheDatabaseSharedManager extends GridCacheSharedManagerAdap
      *
      * @param memProvider Memory provider.
      * @param pageSize Page size.
+     * @param memPlcCfg Memory policy configuration.
      * @param memMetrics MemoryMetrics to collect memory usage metrics.
      * @return PageMemory instance.
      */
-    protected PageMemory createPageMemory(DirectMemoryProvider memProvider, int pageSize, MemoryMetricsImpl memMetrics) {
-        return new PageMemoryNoStoreImpl(log, memProvider, cctx, pageSize, memMetrics, false);
+    protected PageMemory createPageMemory(
+        DirectMemoryProvider memProvider,
+        int pageSize,
+        MemoryPolicyConfiguration memPlcCfg,
+        MemoryMetricsImpl memMetrics
+    ) {
+        return new PageMemoryNoStoreImpl(log, memProvider, cctx, pageSize, memPlcCfg, memMetrics, false);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/67d3358d/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 c1ce8b7..0fe90cd 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
@@ -287,7 +287,7 @@ public class PageMemoryNoLoadSelfTest extends GridCommonAbstractTest {
         DirectMemoryProvider provider = new MappedFileMemoryProvider(log(), memDir, true,
             sizes);
 
-        return new PageMemoryNoStoreImpl(log(), provider, null, PAGE_SIZE, new MemoryMetricsImpl(null), true);
+        return new PageMemoryNoStoreImpl(log(), provider, null, PAGE_SIZE, null, new MemoryMetricsImpl(null), true);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/67d3358d/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheMemoryPolicyConfigurationTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheMemoryPolicyConfigurationTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheMemoryPolicyConfigurationTest.java
index 630d4be..d88723c 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheMemoryPolicyConfigurationTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheMemoryPolicyConfigurationTest.java
@@ -23,7 +23,7 @@ import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.configuration.MemoryConfiguration;
 import org.apache.ignite.configuration.MemoryPolicyConfiguration;
 import org.apache.ignite.internal.IgniteEx;
-import org.apache.ignite.internal.mem.OutOfMemoryException;
+import org.apache.ignite.internal.mem.IgniteOutOfMemoryException;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 
 /**
@@ -77,7 +77,7 @@ public class CacheMemoryPolicyConfigurationTest extends GridCommonAbstractTest {
     }
 
     /**
-     * Verifies that {@link OutOfMemoryException} is thrown when cache is configured with too small MemoryPolicy.
+     * Verifies that {@link IgniteOutOfMemoryException} is thrown when cache is configured with too small MemoryPolicy.
      */
     public void testTooSmallMemoryPolicy() throws Exception {
         memCfg = new MemoryConfiguration();
@@ -109,7 +109,7 @@ public class CacheMemoryPolicyConfigurationTest extends GridCommonAbstractTest {
             Throwable cause = e;
 
             do {
-                if (cause instanceof OutOfMemoryException) {
+                if (cause instanceof IgniteOutOfMemoryException) {
                     oomeThrown = true;
                     break;
                 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/67d3358d/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 dd89406..32c6675 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
@@ -1704,7 +1704,12 @@ public class BPlusTreeSelfTest extends GridCommonAbstractTest {
         for (int i = 0; i < sizes.length; i++)
             sizes[i] = 1024 * MB / CPUS;
 
-        PageMemory pageMem = new PageMemoryNoStoreImpl(log, new UnsafeMemoryProvider(sizes), null, PAGE_SIZE, new MemoryMetricsImpl(null), true);
+        PageMemory pageMem = new PageMemoryNoStoreImpl(log,
+            new UnsafeMemoryProvider(sizes),
+            null,
+            PAGE_SIZE,
+            null,
+            new MemoryMetricsImpl(null), true);
 
         pageMem.start();
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/67d3358d/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImplSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImplSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImplSelfTest.java
index a3bce8b..1cede9b 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImplSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImplSelfTest.java
@@ -319,7 +319,13 @@ public class FreeListImplSelfTest extends GridCommonAbstractTest {
         for (int i = 0; i < sizes.length; i++)
             sizes[i] = 1024 * MB / CPUS;
 
-        PageMemory pageMem = new PageMemoryNoStoreImpl(log, new UnsafeMemoryProvider(sizes), null, pageSize, new MemoryMetricsImpl(null), true);
+        PageMemory pageMem = new PageMemoryNoStoreImpl(log,
+            new UnsafeMemoryProvider(sizes),
+            null,
+            pageSize,
+            null,
+            new MemoryMetricsImpl(null),
+            true);
 
         pageMem.start();
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/67d3358d/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 8b49d03..61c8ad9 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
@@ -161,6 +161,6 @@ public class MetadataStorageSelfTest extends GridCommonAbstractTest {
 
         DirectMemoryProvider provider = new MappedFileMemoryProvider(log(), allocationPath, clean, sizes);
 
-        return new PageMemoryNoStoreImpl(log, provider, null, PAGE_SIZE, new MemoryMetricsImpl(null), true);
+        return new PageMemoryNoStoreImpl(log, provider, null, PAGE_SIZE, null, new MemoryMetricsImpl(null), true);
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/67d3358d/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/database/InlineIndexHelperTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/database/InlineIndexHelperTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/database/InlineIndexHelperTest.java
index 361bad3..f34deae 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/database/InlineIndexHelperTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/database/InlineIndexHelperTest.java
@@ -140,6 +140,7 @@ public class InlineIndexHelperTest extends TestCase {
             new UnsafeMemoryProvider(sizes),
             null,
             PAGE_SIZE,
+            null,
             new MemoryMetricsImpl(null),
             false);
 
@@ -186,6 +187,7 @@ public class InlineIndexHelperTest extends TestCase {
             new UnsafeMemoryProvider(sizes),
             null,
             PAGE_SIZE,
+            null,
             new MemoryMetricsImpl(null),
             false);
 
@@ -308,6 +310,7 @@ public class InlineIndexHelperTest extends TestCase {
             new UnsafeMemoryProvider(sizes),
             null,
             PAGE_SIZE,
+            null,
             new MemoryMetricsImpl(null),
             false);
 


[19/70] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math module to Ignite ML module added missed licenses renamed packages fixed wrong ml profile activation

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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);
-    }
-}


[15/70] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math module to Ignite ML module added missed licenses renamed packages fixed wrong ml profile activation

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/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/d78e071a/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/d78e071a/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 &lt; b ? -1 : a &gt; 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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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();
+    }
+}


[06/70] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math module to Ignite ML module added missed licenses renamed packages fixed wrong ml profile activation

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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();
+    }
+}


[54/70] [abbrv] ignite git commit: IGNITE-3524 IGFS: Null file system names are no longer allowed. This closes #1789.

Posted by sb...@apache.org.
IGNITE-3524 IGFS: Null file system names are no longer allowed. This closes #1789.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/1a9b38df
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/1a9b38df
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/1a9b38df

Branch: refs/heads/ignite-2893
Commit: 1a9b38df5eb083c1b03fe1ba381587594f6e79f7
Parents: 3ab6e48
Author: tledkov-gridgain <tl...@gridgain.com>
Authored: Wed Apr 19 15:39:26 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Wed Apr 19 15:39:26 2017 +0300

----------------------------------------------------------------------
 .../org/apache/ignite/IgniteFileSystem.java     |   2 +-
 .../configuration/FileSystemConfiguration.java  |   8 +-
 .../org/apache/ignite/internal/IgniteEx.java    |   2 +-
 .../apache/ignite/internal/IgniteKernal.java    |   8 +-
 .../internal/processors/igfs/IgfsAsyncImpl.java |   2 +-
 .../internal/processors/igfs/IgfsImpl.java      |   2 +-
 .../processors/igfs/IgfsNoopProcessor.java      |   4 +-
 .../internal/processors/igfs/IgfsProcessor.java |  30 ++---
 .../processors/igfs/IgfsProcessorAdapter.java   |   4 +-
 .../internal/processors/igfs/IgfsUtils.java     |   3 +
 ...lockMessageSystemPoolStarvationSelfTest.java |   8 +-
 .../processors/igfs/IgfsIgniteMock.java         |   2 +-
 .../igfs/IgfsProcessorValidationSelfTest.java   |  19 ++-
 .../junits/multijvm/IgniteProcessProxy.java     |   2 +-
 .../hadoop/igfs/HadoopIgfsEndpoint.java         |   6 +-
 .../hadoop/impl/HadoopAbstractSelfTest.java     |   4 +-
 .../impl/HadoopTaskExecutionSelfTest.java       |  16 +--
 ...opClientProtocolMultipleServersSelfTest.java |   8 +-
 .../client/HadoopClientProtocolSelfTest.java    |   7 +-
 ...IgniteHadoopFileSystemHandshakeSelfTest.java | 119 +------------------
 20 files changed, 90 insertions(+), 166 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/1a9b38df/modules/core/src/main/java/org/apache/ignite/IgniteFileSystem.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteFileSystem.java b/modules/core/src/main/java/org/apache/ignite/IgniteFileSystem.java
index 0100c7b..9c3f9dd 100644
--- a/modules/core/src/main/java/org/apache/ignite/IgniteFileSystem.java
+++ b/modules/core/src/main/java/org/apache/ignite/IgniteFileSystem.java
@@ -74,7 +74,7 @@ public interface IgniteFileSystem extends IgniteAsyncSupport {
     /**
      * Gets IGFS name.
      *
-     * @return IGFS name, or {@code null} for default file system.
+     * @return IGFS name.
      */
     public String name();
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/1a9b38df/modules/core/src/main/java/org/apache/ignite/configuration/FileSystemConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/FileSystemConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/FileSystemConfiguration.java
index d667fe8..af5be3c 100644
--- a/modules/core/src/main/java/org/apache/ignite/configuration/FileSystemConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/configuration/FileSystemConfiguration.java
@@ -202,12 +202,11 @@ public class FileSystemConfiguration {
     }
 
     /**
-     * Gets IGFS instance name. If {@code null}, then instance with default
-     * name will be used.
+     * Gets IGFS instance name.
      *
      * @return IGFS instance name.
      */
-    @Nullable public String getName() {
+    public String getName() {
         return name;
     }
 
@@ -218,6 +217,9 @@ public class FileSystemConfiguration {
      * @return {@code this} for chaining.
      */
     public FileSystemConfiguration setName(String name) {
+        if (name == null)
+            throw new IllegalArgumentException("IGFS name cannot be null");
+
         this.name = name;
 
         return this;

http://git-wip-us.apache.org/repos/asf/ignite/blob/1a9b38df/modules/core/src/main/java/org/apache/ignite/internal/IgniteEx.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteEx.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteEx.java
index e3859c5..164839e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteEx.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteEx.java
@@ -108,7 +108,7 @@ public interface IgniteEx extends Ignite {
      * @param name IGFS name.
      * @return IGFS.
      */
-    @Nullable public IgniteFileSystem igfsx(@Nullable String name);
+    @Nullable public IgniteFileSystem igfsx(String name);
 
     /**
      * Get Hadoop facade.

http://git-wip-us.apache.org/repos/asf/ignite/blob/1a9b38df/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
index 922dd55..50f39fa 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
@@ -3221,6 +3221,9 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable {
 
     /** {@inheritDoc} */
     @Override public IgniteFileSystem fileSystem(String name) {
+        if (name == null)
+            throw new IllegalArgumentException("IGFS name cannot be null");
+
         guard();
 
         try {
@@ -3239,7 +3242,10 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable {
     }
 
     /** {@inheritDoc} */
-    @Nullable @Override public IgniteFileSystem igfsx(@Nullable String name) {
+    @Nullable @Override public IgniteFileSystem igfsx(String name) {
+        if (name == null)
+            throw new IllegalArgumentException("IGFS name cannot be null");
+
         guard();
 
         try {

http://git-wip-us.apache.org/repos/asf/ignite/blob/1a9b38df/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsAsyncImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsAsyncImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsAsyncImpl.java
index c4e2fe7..4df6f59 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsAsyncImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsAsyncImpl.java
@@ -215,7 +215,7 @@ public class IgfsAsyncImpl extends AsyncSupportAdapter<IgniteFileSystem> impleme
     }
 
     /** {@inheritDoc} */
-    @Nullable @Override public String name() {
+    @Override public String name() {
         return igfs.name();
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/1a9b38df/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsImpl.java
index 6a7400c..2057c71 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsImpl.java
@@ -391,7 +391,7 @@ public final class IgfsImpl implements IgfsEx {
     }
 
     /** {@inheritDoc} */
-    @Nullable @Override public String name() {
+    @Override public String name() {
         return cfg.getName();
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/1a9b38df/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsNoopProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsNoopProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsNoopProcessor.java
index 68bb1bc..2dfac90 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsNoopProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsNoopProcessor.java
@@ -55,12 +55,12 @@ public class IgfsNoopProcessor extends IgfsProcessorAdapter {
     }
 
     /** {@inheritDoc} */
-    @Nullable @Override public IgniteFileSystem igfs(@Nullable String name) {
+    @Nullable @Override public IgniteFileSystem igfs(String name) {
         return null;
     }
 
     /** {@inheritDoc} */
-    @Override public Collection<IpcServerEndpoint> endpoints(@Nullable String name) {
+    @Override public Collection<IpcServerEndpoint> endpoints(String name) {
         return Collections.emptyList();
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/1a9b38df/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsProcessor.java
index 57ae7c6..d848d2f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsProcessor.java
@@ -21,7 +21,6 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
@@ -57,9 +56,6 @@ import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_IGFS;
  * Fully operational Ignite file system processor.
  */
 public class IgfsProcessor extends IgfsProcessorAdapter {
-    /** Null IGFS name. */
-    private static final String NULL_NAME = UUID.randomUUID().toString();
-
     /** Converts context to IGFS. */
     private static final IgniteClosure<IgfsContext,IgniteFileSystem> CTX_TO_IGFS = new C1<IgfsContext, IgniteFileSystem>() {
         @Override public IgniteFileSystem apply(IgfsContext igfsCtx) {
@@ -91,6 +87,8 @@ public class IgfsProcessor extends IgfsProcessorAdapter {
 
         // Start IGFS instances.
         for (FileSystemConfiguration cfg : cfgs) {
+            assert cfg.getName() != null;
+
             FileSystemConfiguration cfg0 = new FileSystemConfiguration(cfg);
 
             boolean metaClient = true;
@@ -124,7 +122,7 @@ public class IgfsProcessor extends IgfsProcessorAdapter {
             for (IgfsManager mgr : igfsCtx.managers())
                 mgr.start(igfsCtx);
 
-            igfsCache.put(maskName(cfg0.getName()), igfsCtx);
+            igfsCache.put(cfg0.getName(), igfsCtx);
         }
 
         if (log.isDebugEnabled())
@@ -250,15 +248,21 @@ public class IgfsProcessor extends IgfsProcessorAdapter {
     }
 
     /** {@inheritDoc} */
-    @Override @Nullable public IgniteFileSystem igfs(@Nullable String name) {
-        IgfsContext igfsCtx = igfsCache.get(maskName(name));
+    @Override @Nullable public IgniteFileSystem igfs(String name) {
+        if (name == null)
+            throw new IllegalArgumentException("IGFS name cannot be null");
+
+        IgfsContext igfsCtx = igfsCache.get(name);
 
         return igfsCtx == null ? null : igfsCtx.igfs();
     }
 
     /** {@inheritDoc} */
-    @Override @Nullable public Collection<IpcServerEndpoint> endpoints(@Nullable String name) {
-        IgfsContext igfsCtx = igfsCache.get(maskName(name));
+    @Override @Nullable public Collection<IpcServerEndpoint> endpoints(String name) {
+        if (name == null)
+            throw new IllegalArgumentException("IGFS name cannot be null");
+
+        IgfsContext igfsCtx = igfsCache.get(name);
 
         return igfsCtx == null ? Collections.<IpcServerEndpoint>emptyList() : igfsCtx.server().endpoints();
     }
@@ -270,14 +274,6 @@ public class IgfsProcessor extends IgfsProcessorAdapter {
     }
 
     /**
-     * @param name Cache name.
-     * @return Masked name accounting for {@code nulls}.
-     */
-    private String maskName(@Nullable String name) {
-        return name == null ? NULL_NAME : name;
-    }
-
-    /**
      * Check IGFS config on remote node.
      *
      * @param rmtNode Remote node.

http://git-wip-us.apache.org/repos/asf/ignite/blob/1a9b38df/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsProcessorAdapter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsProcessorAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsProcessorAdapter.java
index 6648c7f..8b7f662 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsProcessorAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsProcessorAdapter.java
@@ -54,7 +54,7 @@ public abstract class IgfsProcessorAdapter extends GridProcessorAdapter {
      * @param name (Nullable) IGFS name.
      * @return IGFS instance.
      */
-    @Nullable public abstract IgniteFileSystem igfs(@Nullable String name);
+    @Nullable public abstract IgniteFileSystem igfs(String name);
 
     /**
      * Gets server endpoints for particular IGFS.
@@ -62,7 +62,7 @@ public abstract class IgfsProcessorAdapter extends GridProcessorAdapter {
      * @param name IGFS name.
      * @return Collection of endpoints or {@code null} in case IGFS is not defined.
      */
-    public abstract Collection<IpcServerEndpoint> endpoints(@Nullable String name);
+    public abstract Collection<IpcServerEndpoint> endpoints(String name);
 
     /**
      * Create compute job for the given IGFS job.

http://git-wip-us.apache.org/repos/asf/ignite/blob/1a9b38df/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsUtils.java
index bb11b7f..832f68d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsUtils.java
@@ -466,6 +466,9 @@ public class IgfsUtils {
         for (FileSystemConfiguration cfg : igniteCfg.getFileSystemConfiguration()) {
             String name = cfg.getName();
 
+            if (name == null)
+                throw new IgniteCheckedException("IGFS name cannot be null");
+
             if (cfgNames.contains(name))
                 throw new IgniteCheckedException("Duplicate IGFS name found (check configuration and " +
                     "assign unique name to each): " + name);

http://git-wip-us.apache.org/repos/asf/ignite/blob/1a9b38df/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsBlockMessageSystemPoolStarvationSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsBlockMessageSystemPoolStarvationSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsBlockMessageSystemPoolStarvationSelfTest.java
index 16596ed..e6bdc8e 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsBlockMessageSystemPoolStarvationSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsBlockMessageSystemPoolStarvationSelfTest.java
@@ -57,6 +57,9 @@ public class IgfsBlockMessageSystemPoolStarvationSelfTest extends IgfsCommonAbst
     /** Second node name. */
     private static final String NODE_2_NAME = "node2";
 
+    /** IGFS name. */
+    private static final String IGFS_NAME = "test";
+
     /** Key in data caceh we will use to reproduce the issue. */
     private static final Integer DATA_KEY = 1;
 
@@ -183,7 +186,7 @@ public class IgfsBlockMessageSystemPoolStarvationSelfTest extends IgfsCommonAbst
     private IgniteInternalFuture<Void> createFileAsync(final IgfsPath path, final CountDownLatch writeStartLatch) {
         return GridTestUtils.runAsync(new Callable<Void>() {
             @Override public Void call() throws Exception {
-                IgniteFileSystem igfs = attacker.fileSystem(null);
+                IgniteFileSystem igfs = attacker.fileSystem(IGFS_NAME);
 
                 try (IgfsOutputStream out = igfs.create(path, true)) {
                     writeStartLatch.await();
@@ -206,7 +209,7 @@ public class IgfsBlockMessageSystemPoolStarvationSelfTest extends IgfsCommonAbst
      * @throws Exception If failed.
      */
     private GridCacheAdapter dataCache(Ignite node) throws Exception  {
-        return ((IgniteKernal)node).internalCache(((IgniteKernal)node).igfsx(null).configuration()
+        return ((IgniteKernal)node).internalCache(((IgniteKernal)node).igfsx(IGFS_NAME).configuration()
             .getDataCacheConfiguration().getName());
     }
 
@@ -243,6 +246,7 @@ public class IgfsBlockMessageSystemPoolStarvationSelfTest extends IgfsCommonAbst
         igfsCfg.setBlockSize(1024);
         igfsCfg.setDataCacheConfiguration(dataCcfg);
         igfsCfg.setMetaCacheConfiguration(metaCcfg);
+        igfsCfg.setName(IGFS_NAME);
 
         // Ignite configuration.
         IgniteConfiguration cfg = getConfiguration(name);

http://git-wip-us.apache.org/repos/asf/ignite/blob/1a9b38df/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsIgniteMock.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsIgniteMock.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsIgniteMock.java
index cb988e3..e4faa41 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsIgniteMock.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsIgniteMock.java
@@ -142,7 +142,7 @@ public class IgfsIgniteMock implements IgniteEx {
     }
 
     /** {@inheritDoc} */
-    @Nullable @Override public IgniteFileSystem igfsx(@Nullable String name) {
+    @Nullable @Override public IgniteFileSystem igfsx(String name) {
         return F.eq(name, igfs.name()) ? igfs : null;
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/1a9b38df/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsProcessorValidationSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsProcessorValidationSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsProcessorValidationSelfTest.java
index 001696a..7484c59 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsProcessorValidationSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/igfs/IgfsProcessorValidationSelfTest.java
@@ -164,10 +164,23 @@ public class IgfsProcessorValidationSelfTest extends IgfsCommonAbstractTest {
      * @throws Exception If failed.
      */
     @SuppressWarnings("NullableProblems")
-    public void testLocalNullIgfsNameIsSupported() throws Exception {
-        g1IgfsCfg1.setName(null);
+    public void testLocalNullIgfsNameIsNotSupported() throws Exception {
+        try {
+            g1IgfsCfg1.setName(null);
+
+            fail("IGFS name cannot be null");
+        }
+        catch (IllegalArgumentException e) {
+            // No-op.
+        }
+
+        ArrayList<FileSystemConfiguration> fsCfgs = new ArrayList<>(Arrays.asList(g1Cfg.getFileSystemConfiguration()));
+
+        fsCfgs.add(new FileSystemConfiguration()); // IGFS doesn't have default name (name == null).
+
+        g1Cfg.setFileSystemConfiguration(fsCfgs.toArray(new FileSystemConfiguration[fsCfgs.size()]));
 
-        assertFalse(G.start(g1Cfg).cluster().nodes().isEmpty());
+        checkGridStartFails(g1Cfg, "IGFS name cannot be null", true);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/1a9b38df/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteProcessProxy.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteProcessProxy.java b/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteProcessProxy.java
index ca65890..dc76852 100644
--- a/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteProcessProxy.java
+++ b/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteProcessProxy.java
@@ -387,7 +387,7 @@ public class IgniteProcessProxy implements IgniteEx {
     }
 
     /** {@inheritDoc} */
-    @Nullable @Override public IgniteFileSystem igfsx(@Nullable String name) {
+    @Nullable @Override public IgniteFileSystem igfsx(String name) {
         throw new UnsupportedOperationException("Operation isn't supported yet.");
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/1a9b38df/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/igfs/HadoopIgfsEndpoint.java
----------------------------------------------------------------------
diff --git a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/igfs/HadoopIgfsEndpoint.java b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/igfs/HadoopIgfsEndpoint.java
index c0751fa..b29dcb7 100644
--- a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/igfs/HadoopIgfsEndpoint.java
+++ b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/igfs/HadoopIgfsEndpoint.java
@@ -123,6 +123,10 @@ public class HadoopIgfsEndpoint {
         else
             throw new IgniteCheckedException("Invalid connection string format: " + connStr);
 
+        if (igfsName == null)
+            throw new IgniteCheckedException("Invalid connection string format (IGFS name cannot be empty): "
+                + connStr);
+
         host = hostPort.get1();
 
         assert hostPort.get2() != null;
@@ -172,7 +176,7 @@ public class HadoopIgfsEndpoint {
     /**
      * @return IGFS name.
      */
-    @Nullable public String igfs() {
+    public String igfs() {
         return igfsName;
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/1a9b38df/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/HadoopAbstractSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/HadoopAbstractSelfTest.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/HadoopAbstractSelfTest.java
index bf17d05..eb8caa2 100644
--- a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/HadoopAbstractSelfTest.java
+++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/HadoopAbstractSelfTest.java
@@ -51,7 +51,7 @@ public abstract class HadoopAbstractSelfTest extends GridCommonAbstractTest {
     protected static final int REST_PORT = ConnectorConfiguration.DFLT_TCP_PORT;
 
     /** IGFS name. */
-    protected static final String igfsName = null;
+    protected static final String igfsName = "test";
 
     /** IGFS block size. */
     protected static final int igfsBlockSize = 1024;
@@ -236,6 +236,6 @@ public abstract class HadoopAbstractSelfTest extends GridCommonAbstractTest {
      * @return IGFS scheme for test.
      */
     protected String igfsScheme() {
-        return "igfs://@/";
+        return "igfs://" + igfsName + "@/";
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/1a9b38df/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/HadoopTaskExecutionSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/HadoopTaskExecutionSelfTest.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/HadoopTaskExecutionSelfTest.java
index f25d78a..c27a67f 100644
--- a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/HadoopTaskExecutionSelfTest.java
+++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/HadoopTaskExecutionSelfTest.java
@@ -137,8 +137,8 @@ public class HadoopTaskExecutionSelfTest extends HadoopAbstractSelfTest {
 
         job.setInputFormatClass(TextInputFormat.class);
 
-        FileInputFormat.setInputPaths(job, new Path("igfs://@/"));
-        FileOutputFormat.setOutputPath(job, new Path("igfs://@/output/"));
+        FileInputFormat.setInputPaths(job, new Path("igfs://" + igfsName + "@/"));
+        FileOutputFormat.setOutputPath(job, new Path("igfs://" + igfsName  + "@/output/"));
 
         job.setJarByClass(getClass());
 
@@ -181,8 +181,8 @@ public class HadoopTaskExecutionSelfTest extends HadoopAbstractSelfTest {
 
         job.setInputFormatClass(TextInputFormat.class);
 
-        FileInputFormat.setInputPaths(job, new Path("igfs://@/"));
-        FileOutputFormat.setOutputPath(job, new Path("igfs://@/output"));
+        FileInputFormat.setInputPaths(job, new Path("igfs://" + igfsName + "@/"));
+        FileOutputFormat.setOutputPath(job, new Path("igfs://" + igfsName  + "@/output/"));
 
         job.setJarByClass(getClass());
 
@@ -220,8 +220,8 @@ public class HadoopTaskExecutionSelfTest extends HadoopAbstractSelfTest {
 
         job.setInputFormatClass(TextInputFormat.class);
 
-        FileInputFormat.setInputPaths(job, new Path("igfs://@/"));
-        FileOutputFormat.setOutputPath(job, new Path("igfs://@/output/"));
+        FileInputFormat.setInputPaths(job, new Path("igfs://" + igfsName + "@/"));
+        FileOutputFormat.setOutputPath(job, new Path("igfs://" + igfsName  + "@/output/"));
 
         job.setJarByClass(getClass());
 
@@ -282,8 +282,8 @@ public class HadoopTaskExecutionSelfTest extends HadoopAbstractSelfTest {
 
         job.setInputFormatClass(InFormat.class);
 
-        FileInputFormat.setInputPaths(job, new Path("igfs://@/"));
-        FileOutputFormat.setOutputPath(job, new Path("igfs://@/output/"));
+        FileInputFormat.setInputPaths(job, new Path("igfs://" + igfsName + "@/"));
+        FileOutputFormat.setOutputPath(job, new Path("igfs://" + igfsName  + "@/output/"));
 
         job.setJarByClass(getClass());
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/1a9b38df/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/client/HadoopClientProtocolMultipleServersSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/client/HadoopClientProtocolMultipleServersSelfTest.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/client/HadoopClientProtocolMultipleServersSelfTest.java
index 7767ec1..0e5ad03 100644
--- a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/client/HadoopClientProtocolMultipleServersSelfTest.java
+++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/client/HadoopClientProtocolMultipleServersSelfTest.java
@@ -131,7 +131,7 @@ public class HadoopClientProtocolMultipleServersSelfTest extends HadoopAbstractS
 
             job.setNumReduceTasks(0);
 
-            FileInputFormat.setInputPaths(job, new Path(PATH_INPUT));
+            FileInputFormat.setInputPaths(job, new Path("igfs://" + igfsName + "@" + PATH_INPUT));
 
             job.submit();
 
@@ -219,7 +219,7 @@ public class HadoopClientProtocolMultipleServersSelfTest extends HadoopAbstractS
         conf.set(MRConfig.FRAMEWORK_NAME, IgniteHadoopClientProtocolProvider.FRAMEWORK_NAME);
         conf.set(MRConfig.MASTER_ADDRESS, "127.0.0.1:" + REST_PORT);
 
-        conf.set("fs.defaultFS", "igfs:///");
+        conf.set("fs.defaultFS", "igfs://" + igfsName + "@/");
 
         return conf;
     }
@@ -242,7 +242,7 @@ public class HadoopClientProtocolMultipleServersSelfTest extends HadoopAbstractS
 
         conf.set(MRConfig.MASTER_ADDRESS, F.concat(addrs, ","));
 
-        conf.set("fs.defaultFS", "igfs:///");
+        conf.set("fs.defaultFS", "igfs://" + igfsName + "@/");
 
         return conf;
     }
@@ -264,7 +264,7 @@ public class HadoopClientProtocolMultipleServersSelfTest extends HadoopAbstractS
 
         conf.set(MRConfig.MASTER_ADDRESS, F.concat(addrs, ","));
 
-        conf.set("fs.defaultFS", "igfs:///");
+        conf.set("fs.defaultFS", "igfs://" + igfsName + "@/");
 
         return conf;
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/1a9b38df/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/client/HadoopClientProtocolSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/client/HadoopClientProtocolSelfTest.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/client/HadoopClientProtocolSelfTest.java
index 7241506..a8d58c2 100644
--- a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/client/HadoopClientProtocolSelfTest.java
+++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/client/HadoopClientProtocolSelfTest.java
@@ -200,8 +200,8 @@ public class HadoopClientProtocolSelfTest extends HadoopAbstractSelfTest {
             job.setReducerClass(TestCountingReducer.class);
             job.setCombinerClass(TestCountingCombiner.class);
 
-            FileInputFormat.setInputPaths(job, new Path(PATH_INPUT));
-            FileOutputFormat.setOutputPath(job, new Path(PATH_OUTPUT));
+            FileInputFormat.setInputPaths(job, new Path("igfs://" + igfsName + "@" + PATH_INPUT));
+            FileOutputFormat.setOutputPath(job, new Path("igfs://" + igfsName + "@" + PATH_OUTPUT));
 
             job.submit();
 
@@ -231,6 +231,9 @@ public class HadoopClientProtocolSelfTest extends HadoopAbstractSelfTest {
             assertEquals("wrong counter value", 3, counters.findCounter(TestCounter.COUNTER2).getValue());
             assertEquals("wrong counter value", 3, counters.findCounter(TestCounter.COUNTER3).getValue());
         }
+        catch (Throwable t) {
+            log.error("Unexpected exception", t);
+        }
         finally {
             job.getCluster().close();
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/1a9b38df/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/igfs/IgniteHadoopFileSystemHandshakeSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/igfs/IgniteHadoopFileSystemHandshakeSelfTest.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/igfs/IgniteHadoopFileSystemHandshakeSelfTest.java
index 9839ad5..02c708b 100644
--- a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/igfs/IgniteHadoopFileSystemHandshakeSelfTest.java
+++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/igfs/IgniteHadoopFileSystemHandshakeSelfTest.java
@@ -96,13 +96,6 @@ public class IgniteHadoopFileSystemHandshakeSelfTest extends IgfsCommonAbstractT
         checkValid(IGFS_NAME + "@127.0.0.1");
         checkValid(IGFS_NAME + "@127.0.0.1:" + DFLT_IPC_PORT);
 
-        checkValid(":" + IGNITE_INSTANCE_NAME + "@");
-        checkValid(":" + IGNITE_INSTANCE_NAME + "@127.0.0.1");
-        checkValid(":" + IGNITE_INSTANCE_NAME + "@127.0.0.1:" + DFLT_IPC_PORT);
-
-        checkValid("");
-        checkValid("127.0.0.1");
-        checkValid("127.0.0.1:" + DFLT_IPC_PORT);
 
         tcp = false; // Embedded mode:
 
@@ -111,12 +104,6 @@ public class IgniteHadoopFileSystemHandshakeSelfTest extends IgfsCommonAbstractT
 
         checkValid(IGFS_NAME + "@"); // Embedded mode fails, but remote tcp succeeds.
         checkValid(IGFS_NAME + "@" + HOST_PORT_UNUSED);
-
-        checkValid(":" + IGNITE_INSTANCE_NAME + "@"); // Embedded mode fails, but remote tcp succeeds.
-        checkInvalid(":" + IGNITE_INSTANCE_NAME + "@" + HOST_PORT_UNUSED);
-
-        checkValid("@"); // Embedded mode fails, but remote tcp succeeds.
-        checkInvalid("@" + HOST_PORT_UNUSED);
     }
 
     /**
@@ -137,13 +124,6 @@ public class IgniteHadoopFileSystemHandshakeSelfTest extends IgfsCommonAbstractT
         checkValid(IGFS_NAME + "@127.0.0.1");
         checkValid(IGFS_NAME + "@127.0.0.1:" + DFLT_IPC_PORT);
 
-        checkValid(":" + IGNITE_INSTANCE_NAME + "@");
-        checkValid(":" + IGNITE_INSTANCE_NAME + "@127.0.0.1");
-        checkValid(":" + IGNITE_INSTANCE_NAME + "@127.0.0.1:" + DFLT_IPC_PORT);
-
-        checkValid("");
-        checkValid("127.0.0.1");
-        checkValid("127.0.0.1:" + DFLT_IPC_PORT);
 
         tcp = false; // Embedded mode:
 
@@ -152,94 +132,6 @@ public class IgniteHadoopFileSystemHandshakeSelfTest extends IgfsCommonAbstractT
 
         checkValid(IGFS_NAME + "@");
         checkValid(IGFS_NAME + "@" + HOST_PORT_UNUSED);
-
-        checkValid(":" + IGNITE_INSTANCE_NAME + "@");
-        checkInvalid(":" + IGNITE_INSTANCE_NAME + "@" + HOST_PORT_UNUSED);
-
-        checkValid("@"); // Embedded mode fails, but remote tcp succeeds.
-        checkInvalid("@" + HOST_PORT_UNUSED);
-    }
-
-    /**
-     * Tests for Grid having normal name and IGFS having {@code null} name.
-     *
-     * @throws Exception If failed.
-     */
-    public void testHandshakeDefaultIgfs() throws Exception {
-        startUp(false/*Ignite instance name*/, true/*default igfs*/);
-
-        tcp = true;
-
-        checkInvalid(IGFS_NAME + ":" + IGNITE_INSTANCE_NAME + "@");
-        checkInvalid(IGFS_NAME + ":" + IGNITE_INSTANCE_NAME + "@127.0.0.1");
-        checkInvalid(IGFS_NAME + ":" + IGNITE_INSTANCE_NAME + "@127.0.0.1:" + DFLT_IPC_PORT);
-
-        checkInvalid(IGFS_NAME + "@");
-        checkInvalid(IGFS_NAME + "@127.0.0.1");
-        checkInvalid(IGFS_NAME + "@127.0.0.1:" + DFLT_IPC_PORT);
-
-        checkValid(":" + IGNITE_INSTANCE_NAME + "@");
-        checkValid(":" + IGNITE_INSTANCE_NAME + "@127.0.0.1");
-        checkValid(":" + IGNITE_INSTANCE_NAME + "@127.0.0.1:" + DFLT_IPC_PORT);
-
-        checkValid("");
-        checkValid("127.0.0.1");
-        checkValid("127.0.0.1:" + DFLT_IPC_PORT);
-
-        tcp = false; // Embedded mode:
-
-        checkInvalid(IGFS_NAME + ":" + IGNITE_INSTANCE_NAME + "@");
-        checkInvalid(IGFS_NAME + ":" + IGNITE_INSTANCE_NAME + "@" + HOST_PORT_UNUSED);
-
-        checkInvalid(IGFS_NAME + "@");
-        checkInvalid(IGFS_NAME + "@" + HOST_PORT_UNUSED);
-
-        checkValid(":" + IGNITE_INSTANCE_NAME + "@");
-        checkValid(":" + IGNITE_INSTANCE_NAME + "@" + HOST_PORT_UNUSED);
-
-        checkValid("@"); // NB: in embedded mode this fails, but remote TCP still succeeds.
-        checkValid("@" + HOST_PORT_UNUSED);
-    }
-
-    /**
-     * Tests for Grid having {@code null} name and IGFS having {@code null} name.
-     *
-     * @throws Exception If failed.
-     */
-    public void testHandshakeDefaultGridDefaultIgfs() throws Exception {
-        startUp(true, true);
-
-        tcp = true;
-
-        checkInvalid(IGFS_NAME + ":" + IGNITE_INSTANCE_NAME + "@");
-        checkInvalid(IGFS_NAME + ":" + IGNITE_INSTANCE_NAME + "@127.0.0.1");
-        checkInvalid(IGFS_NAME + ":" + IGNITE_INSTANCE_NAME + "@127.0.0.1:" + DFLT_IPC_PORT);
-
-        checkInvalid(IGFS_NAME + "@");
-        checkInvalid(IGFS_NAME + "@127.0.0.1");
-        checkInvalid(IGFS_NAME + "@127.0.0.1:" + DFLT_IPC_PORT);
-
-        checkValid(":" + IGNITE_INSTANCE_NAME + "@");
-        checkValid(":" + IGNITE_INSTANCE_NAME + "@127.0.0.1");
-        checkValid(":" + IGNITE_INSTANCE_NAME + "@127.0.0.1:" + DFLT_IPC_PORT);
-
-        checkValid("");
-        checkValid("127.0.0.1");
-        checkValid("127.0.0.1:" + DFLT_IPC_PORT);
-
-        tcp = false; // Embedded mode:
-
-        checkInvalid(IGFS_NAME + ":" + IGNITE_INSTANCE_NAME + "@");
-        checkInvalid(IGFS_NAME + ":" + IGNITE_INSTANCE_NAME + "@" + HOST_PORT_UNUSED);
-
-        checkInvalid(IGFS_NAME + "@");
-        checkInvalid(IGFS_NAME + "@" + HOST_PORT_UNUSED);
-
-        checkValid(":" + IGNITE_INSTANCE_NAME + "@");
-        checkValid(":" + IGNITE_INSTANCE_NAME + "@" + HOST_PORT_UNUSED);
-
-        checkValid("@");
-        checkValid("@" + HOST_PORT_UNUSED);
     }
 
     /**
@@ -250,9 +142,9 @@ public class IgniteHadoopFileSystemHandshakeSelfTest extends IgfsCommonAbstractT
      * @throws Exception If failed.
      */
     private void startUp(boolean dfltIgniteInstanceName, boolean dfltIgfsName) throws Exception {
-        Ignite ignite = G.start(gridConfiguration(dfltIgniteInstanceName, dfltIgfsName));
+        Ignite ignite = G.start(gridConfiguration(dfltIgniteInstanceName));
 
-        IgniteFileSystem igfs = ignite.fileSystem(dfltIgfsName ? null : IGFS_NAME);
+        IgniteFileSystem igfs = ignite.fileSystem(dfltIgfsName ? "" : IGFS_NAME);
 
         igfs.mkdirs(PATH);
     }
@@ -261,11 +153,10 @@ public class IgniteHadoopFileSystemHandshakeSelfTest extends IgfsCommonAbstractT
      * Create Grid configuration.
      *
      * @param dfltIgniteInstanceName Default Ignite instance name.
-     * @param dfltIgfsName Default IGFS name.
      * @return Grid configuration.
      * @throws Exception If failed.
      */
-    private IgniteConfiguration gridConfiguration(boolean dfltIgniteInstanceName, boolean dfltIgfsName)
+    private IgniteConfiguration gridConfiguration(boolean dfltIgniteInstanceName)
         throws Exception {
         IgniteConfiguration cfg = super.getConfiguration(dfltIgniteInstanceName ? null : IGNITE_INSTANCE_NAME);
 
@@ -301,7 +192,7 @@ public class IgniteHadoopFileSystemHandshakeSelfTest extends IgfsCommonAbstractT
 
         FileSystemConfiguration igfsCfg = new FileSystemConfiguration();
 
-        igfsCfg.setName(dfltIgfsName ? null : IGFS_NAME);
+        igfsCfg.setName(IGFS_NAME);
         igfsCfg.setPrefetchBlocks(1);
         igfsCfg.setDefaultMode(PRIMARY);
         igfsCfg.setDataCacheConfiguration(dataCacheCfg);
@@ -355,6 +246,7 @@ public class IgniteHadoopFileSystemHandshakeSelfTest extends IgfsCommonAbstractT
      * Gets the file system using authority and tcp flag.
      *
      * @param authority Authority.
+     * @param tcp Use TCP endpoint.
      * @return File system.
      * @throws Exception If failed.
      */
@@ -366,6 +258,7 @@ public class IgniteHadoopFileSystemHandshakeSelfTest extends IgfsCommonAbstractT
      * Create configuration for test.
      *
      * @param authority Authority.
+     * @param tcp Use TCP endpoint.
      * @return Configuration.
      */
     private static Configuration configuration(String authority, boolean tcp) {


[40/70] [abbrv] ignite git commit: IGNITE-4988 Cleanup code.

Posted by sb...@apache.org.
IGNITE-4988 Cleanup code.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/36e7e198
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/36e7e198
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/36e7e198

Branch: refs/heads/ignite-2893
Commit: 36e7e19830dc53c0ed02a0d83806b2cb5a7c7ce5
Parents: f82ed01
Author: Alexey Kuznetsov <ak...@apache.org>
Authored: Wed Apr 19 11:34:16 2017 +0700
Committer: Alexey Kuznetsov <ak...@apache.org>
Committed: Wed Apr 19 11:34:16 2017 +0700

----------------------------------------------------------------------
 .../JettyRestProcessorAbstractSelfTest.java     | 10 +++
 .../visor/cache/VisorCachePartition.java        | 87 -------------------
 .../visor/cache/VisorCachePartitions.java       | 28 +++---
 .../visor/cache/VisorCachePartitionsTask.java   | 20 +++--
 .../cache/VisorCachePartitionsTaskArg.java      | 72 ++++++++++++++++
 .../visor/compute/VisorGatewayTask.java         | 91 ++++++++++++--------
 .../resources/META-INF/classnames.properties    |  2 +-
 7 files changed, 164 insertions(+), 146 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/36e7e198/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java
index e5d9997..1321929 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java
@@ -66,6 +66,8 @@ import org.apache.ignite.internal.visor.cache.VisorCacheMetadataTask;
 import org.apache.ignite.internal.visor.cache.VisorCacheMetricsCollectorTask;
 import org.apache.ignite.internal.visor.cache.VisorCacheMetricsCollectorTaskArg;
 import org.apache.ignite.internal.visor.cache.VisorCacheNodesTask;
+import org.apache.ignite.internal.visor.cache.VisorCachePartitionsTask;
+import org.apache.ignite.internal.visor.cache.VisorCachePartitionsTaskArg;
 import org.apache.ignite.internal.visor.cache.VisorCacheRebalanceTask;
 import org.apache.ignite.internal.visor.cache.VisorCacheResetMetricsTask;
 import org.apache.ignite.internal.visor.cache.VisorCacheStartTaskArg;
@@ -1283,6 +1285,14 @@ public abstract class JettyRestProcessorAbstractSelfTest extends AbstractRestPro
 
         jsonTaskResult(ret);
 
+        ret = content(new VisorGatewayArgument(VisorCachePartitionsTask.class)
+            .forNode(locNode)
+            .argument(VisorCachePartitionsTaskArg.class, "person"));
+
+        info("VisorCachePartitionsTask result: " + ret);
+
+        jsonTaskResult(ret);
+
         ret = content(new VisorGatewayArgument(VisorCacheLoadTask.class)
             .forNode(locNode)
             .argument(VisorCacheLoadTaskArg.class, "person", 0, "null"));

http://git-wip-us.apache.org/repos/asf/ignite/blob/36e7e198/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartition.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartition.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartition.java
deleted file mode 100644
index b57bc53..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartition.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.internal.visor.cache;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import org.apache.ignite.internal.util.typedef.internal.S;
-import org.apache.ignite.internal.visor.VisorDataTransferObject;
-
-/**
- * Data transfer object for information about keys in cache partition.
- */
-public class VisorCachePartition extends VisorDataTransferObject {
-    /** */
-    private static final long serialVersionUID = 0L;
-
-    /** */
-    private int partId;
-
-    /** */
-    private long cnt;
-
-    /**
-     * Default constructor.
-     */
-    public VisorCachePartition() {
-        // No-op.
-    }
-
-    /**
-     * Full constructor.
-     *
-     * @param partId Partition id.
-     * @param cnt Number of keys in partition.
-     */
-    public VisorCachePartition(int partId, long cnt) {
-        this.partId = partId;
-        this.cnt = cnt;
-    }
-
-    /**
-     * @return Partition id.
-     */
-    public int getPartitionId() {
-        return partId;
-    }
-
-    /**
-     * @return Number of keys in partition.
-     */
-    public long getCount() {
-        return cnt;
-    }
-
-    /** {@inheritDoc} */
-    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
-        out.writeInt(partId);
-        out.writeLong(cnt);
-    }
-
-    /** {@inheritDoc} */
-    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
-        partId = in.readInt();
-        cnt = in.readLong();
-    }
-
-    /** {@inheritDoc} */
-    @Override public String toString() {
-        return S.toString(VisorCachePartition.class, this);
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/36e7e198/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartitions.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartitions.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartitions.java
index 2713179..505d98e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartitions.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartitions.java
@@ -20,8 +20,8 @@ package org.apache.ignite.internal.visor.cache;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.HashMap;
+import java.util.Map;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.internal.visor.VisorDataTransferObject;
@@ -34,17 +34,17 @@ public class VisorCachePartitions extends VisorDataTransferObject {
     private static final long serialVersionUID = 0L;
 
     /** */
-    private List<VisorCachePartition> primary;
+    private Map<Integer, Long> primary;
 
     /** */
-    private List<VisorCachePartition> backup;
+    private Map<Integer, Long> backup;
 
     /**
      * Default constructor.
      */
     public VisorCachePartitions() {
-        primary = new ArrayList<>();
-        backup = new ArrayList<>();
+        primary = new HashMap<>();
+        backup = new HashMap<>();
     }
 
     /**
@@ -54,7 +54,7 @@ public class VisorCachePartitions extends VisorDataTransferObject {
      * @param cnt Number of primary keys in partition.
      */
     public void addPrimary(int partId, long cnt) {
-       primary.add(new VisorCachePartition(partId, cnt));
+       primary.put(partId, cnt);
     }
 
     /**
@@ -64,33 +64,33 @@ public class VisorCachePartitions extends VisorDataTransferObject {
      * @param cnt Number of backup keys in partition.
      */
     public void addBackup(int partId, long cnt) {
-       backup.add(new VisorCachePartition(partId, cnt));
+       backup.put(partId, cnt);
     }
 
     /**
      * @return Get list of primary partitions.
      */
-    public List<VisorCachePartition> getPrimary() {
+    public Map<Integer, Long> getPrimary() {
         return primary;
     }
 
     /**
      * @return Get list of backup partitions.
      */
-    public List<VisorCachePartition> getBackup() {
+    public Map<Integer, Long> getBackup() {
         return backup;
     }
 
     /** {@inheritDoc} */
     @Override protected void writeExternalData(ObjectOutput out) throws IOException {
-        U.writeCollection(out, primary);
-        U.writeCollection(out, backup);
+        U.writeMap(out, primary);
+        U.writeMap(out, backup);
     }
 
     /** {@inheritDoc} */
     @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
-        primary = U.readList(in);
-        backup = U.readList(in);
+        primary = U.readMap(in);
+        backup = U.readMap(in);
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/36e7e198/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartitionsTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartitionsTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartitionsTask.java
index b7ca975..c9339b7 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartitionsTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartitionsTask.java
@@ -45,13 +45,13 @@ import static org.apache.ignite.internal.visor.util.VisorTaskUtils.escapeName;
  * Task that collect keys distribution in partitions.
  */
 @GridInternal
-public class VisorCachePartitionsTask extends VisorMultiNodeTask<String,
+public class VisorCachePartitionsTask extends VisorMultiNodeTask<VisorCachePartitionsTaskArg,
     Map<UUID, VisorCachePartitions>, VisorCachePartitions> {
     /** */
     private static final long serialVersionUID = 0L;
 
     /** {@inheritDoc} */
-    @Override protected VisorCachePartitionsJob job(String arg) {
+    @Override protected VisorCachePartitionsJob job(VisorCachePartitionsTaskArg arg) {
         return new VisorCachePartitionsJob(arg, debug);
     }
 
@@ -72,22 +72,24 @@ public class VisorCachePartitionsTask extends VisorMultiNodeTask<String,
     /**
      * Job that collect cache metrics from node.
      */
-    private static class VisorCachePartitionsJob extends VisorJob<String, VisorCachePartitions> {
+    private static class VisorCachePartitionsJob extends VisorJob<VisorCachePartitionsTaskArg, VisorCachePartitions> {
         /** */
         private static final long serialVersionUID = 0L;
 
         /**
          * Create job with given argument.
          *
-         * @param cacheName Cache name.
+         * @param arg Tasks arguments.
          * @param debug Debug flag.
          */
-        private VisorCachePartitionsJob(String cacheName, boolean debug) {
-            super(cacheName, debug);
+        private VisorCachePartitionsJob(VisorCachePartitionsTaskArg arg, boolean debug) {
+            super(arg, debug);
         }
 
         /** {@inheritDoc} */
-        @Override protected VisorCachePartitions run(final String cacheName) throws IgniteException {
+        @Override protected VisorCachePartitions run(VisorCachePartitionsTaskArg arg) throws IgniteException {
+            String cacheName = arg.getCacheName();
+
             if (debug)
                 log(ignite.log(), "Collecting partitions for cache: " + escapeName(cacheName));
 
@@ -122,9 +124,9 @@ public class VisorCachePartitionsTask extends VisorMultiNodeTask<String,
                     for (GridDhtLocalPartition part : locParts) {
                         int p = part.id();
 
-                        int sz = part.publicSize();
+                        long sz = part.publicSize();
 
-                        // Pass -1 as topology version in order not to wait for topology version.
+                        // Pass NONE as topology version in order not to wait for topology version.
                         if (part.primary(AffinityTopologyVersion.NONE))
                             parts.addPrimary(p, sz);
                         else if (part.state() == GridDhtPartitionState.OWNING && part.backup(AffinityTopologyVersion.NONE))

http://git-wip-us.apache.org/repos/asf/ignite/blob/36e7e198/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartitionsTaskArg.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartitionsTaskArg.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartitionsTaskArg.java
new file mode 100644
index 0000000..957f071
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartitionsTaskArg.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.internal.visor.cache;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.internal.visor.VisorDataTransferObject;
+
+/**
+ * Arguments for {@link VisorCachePartitionsTask}.
+ */
+public class VisorCachePartitionsTaskArg extends VisorDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** */
+    private String cacheName;
+
+    /**
+     * Default constructor.
+     */
+    public VisorCachePartitionsTaskArg() {
+        // No-op.
+    }
+
+    /**
+     * @param cacheName Cache name.
+     */
+    public VisorCachePartitionsTaskArg(String cacheName) {
+        this.cacheName = cacheName;
+    }
+
+    /**
+     * @return Cache name.
+     */
+    public String getCacheName() {
+        return cacheName;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
+        U.writeString(out, cacheName);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
+        cacheName = U.readString(in);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(VisorCachePartitionsTaskArg.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/36e7e198/modules/core/src/main/java/org/apache/ignite/internal/visor/compute/VisorGatewayTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/compute/VisorGatewayTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/compute/VisorGatewayTask.java
index 05112ed..658d6a1 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/compute/VisorGatewayTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/compute/VisorGatewayTask.java
@@ -43,6 +43,7 @@ import org.apache.ignite.internal.processors.task.GridInternal;
 import org.apache.ignite.internal.util.lang.GridTuple3;
 import org.apache.ignite.internal.util.typedef.CI1;
 import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.visor.VisorOneNodeTask;
 import org.apache.ignite.internal.visor.VisorTaskArgument;
 import org.apache.ignite.lang.IgniteBiTuple;
 import org.apache.ignite.lang.IgniteFuture;
@@ -59,6 +60,9 @@ public class VisorGatewayTask implements ComputeTask<Object[], Object> {
     /** */
     private static final long serialVersionUID = 0L;
 
+    /** */
+    private static final int JOB_ARG_IDX = 3;
+
     /** Auto-injected grid instance. */
     @IgniteInstanceResource
     protected transient IgniteEx ignite;
@@ -133,24 +137,23 @@ public class VisorGatewayTask implements ComputeTask<Object[], Object> {
         }
 
         /**
-         * Cast argument to target class.
+         * Construct job argument.
          *
          * @param cls Class.
-         * @param idx Argument index.
          */
-        @Nullable private Object toObject(Class cls, int idx) throws ClassNotFoundException {
-            String arg = argument(idx);
+        @Nullable private Object toJobArgument(Class cls) throws ClassNotFoundException {
+            String arg = argument(JOB_ARG_IDX);
 
             if (cls == Collection.class || cls == Set.class) {
                 Class<?> itemsCls = Class.forName(arg);
 
                 Collection<Object> res = cls == Collection.class ? new ArrayList<>() : new HashSet<>();
 
-                String items = argument(idx + 1);
+                String items = argument(JOB_ARG_IDX + 1);
 
                 if (items != null) {
                     for (String item : items.split(";"))
-                        res.add(toSimpleObject(itemsCls, item));
+                        res.add(toObject(itemsCls, item));
                 }
 
                 return res;
@@ -159,20 +162,20 @@ public class VisorGatewayTask implements ComputeTask<Object[], Object> {
             if (cls == IgniteBiTuple.class) {
                 Class<?> keyCls = Class.forName(arg);
 
-                String valClsName = argument(idx + 1);
+                String valClsName = argument(JOB_ARG_IDX + 1);
 
                 assert valClsName != null;
 
                 Class<?> valCls = Class.forName(valClsName);
 
-                return new IgniteBiTuple<>(toSimpleObject(keyCls, (String)argument(idx + 2)),
-                    toSimpleObject(valCls, (String)argument(idx + 3)));
+                return new IgniteBiTuple<>(toObject(keyCls, (String)argument(JOB_ARG_IDX + 2)),
+                    toObject(valCls, (String)argument(JOB_ARG_IDX + 3)));
             }
 
             if (cls == Map.class) {
                 Class<?> keyCls = Class.forName(arg);
 
-                String valClsName = argument(idx + 1);
+                String valClsName = argument(JOB_ARG_IDX + 1);
 
                 assert valClsName != null;
 
@@ -180,7 +183,7 @@ public class VisorGatewayTask implements ComputeTask<Object[], Object> {
 
                 Map<Object, Object> res = new HashMap<>();
 
-                String entries = argument(idx + 2);
+                String entries = argument(JOB_ARG_IDX + 2);
 
                 if (entries != null) {
                     for (String entry : entries.split(";")) {
@@ -189,8 +192,8 @@ public class VisorGatewayTask implements ComputeTask<Object[], Object> {
 
                             assert values.length >= 1;
 
-                            res.put(toSimpleObject(keyCls, values[0]),
-                                values.length > 1 ? toSimpleObject(valCls, values[1]) : null);
+                            res.put(toObject(keyCls, values[0]),
+                                values.length > 1 ? toObject(valCls, values[1]) : null);
                         }
                     }
                 }
@@ -199,8 +202,8 @@ public class VisorGatewayTask implements ComputeTask<Object[], Object> {
             }
 
             if (cls == GridTuple3.class) {
-                String v2ClsName = argument(idx + 1);
-                String v3ClsName = argument(idx + 2);
+                String v2ClsName = argument(JOB_ARG_IDX + 1);
+                String v3ClsName = argument(JOB_ARG_IDX + 2);
 
                 assert v2ClsName != null;
                 assert v3ClsName != null;
@@ -209,20 +212,20 @@ public class VisorGatewayTask implements ComputeTask<Object[], Object> {
                 Class<?> v2Cls = Class.forName(v2ClsName);
                 Class<?> v3Cls = Class.forName(v3ClsName);
 
-                return new GridTuple3<>(toSimpleObject(v1Cls, (String)argument(idx + 3)), toSimpleObject(v2Cls,
-                    (String)argument(idx + 4)), toSimpleObject(v3Cls, (String)argument(idx + 5)));
+                return new GridTuple3<>(toObject(v1Cls, (String)argument(JOB_ARG_IDX + 3)), toObject(v2Cls,
+                    (String)argument(JOB_ARG_IDX + 4)), toObject(v3Cls, (String)argument(JOB_ARG_IDX + 5)));
             }
 
-            return toSimpleObject(cls, arg);
+            return toObject(cls, arg);
         }
 
         /**
-         * Cast from string representation to target class.
+         * Construct from string representation to target class.
          *
          * @param cls Target class.
          * @return Object constructed from string.
          */
-        @Nullable private Object toSimpleObject(Class cls, String val) {
+        @Nullable private Object toObject(Class cls, String val) {
             if (val == null  || "null".equals(val))
                 return null;
 
@@ -297,6 +300,7 @@ public class VisorGatewayTask implements ComputeTask<Object[], Object> {
         }
 
         /** {@inheritDoc} */
+        @SuppressWarnings("unchecked")
         @Override public Object execute() throws IgniteException {
             if (fut != null)
                 return fut.get();
@@ -317,46 +321,63 @@ public class VisorGatewayTask implements ComputeTask<Object[], Object> {
                     if (argCls == Void.class)
                         jobArgs = null;
                     else if (isBuildInObject(argCls))
-                        jobArgs = toObject(argCls, 3);
+                        jobArgs = toJobArgument(argCls);
                     else {
-                        int beanArgsCnt = argsCnt - 3;
+                        int beanArgsCnt = argsCnt - JOB_ARG_IDX;
 
                         for (Constructor ctor : argCls.getDeclaredConstructors()) {
                             Class[] types = ctor.getParameterTypes();
 
                             if (types.length == beanArgsCnt) {
-                                Object[] initargs = new Object[beanArgsCnt];
+                                Object[] initArgs = new Object[beanArgsCnt];
 
                                 for (int i = 0; i < beanArgsCnt; i++) {
-                                    String val = argument(i + 3);
+                                    String val = argument(i + JOB_ARG_IDX);
 
-                                    initargs[i] = toSimpleObject(types[i], val);
+                                    initArgs[i] = toObject(types[i], val);
                                 }
 
-                                jobArgs = ctor.newInstance(initargs);
+                                jobArgs = ctor.newInstance(initArgs);
 
                                 break;
                             }
                         }
 
-                        if (jobArgs == null)
-                            throw new IgniteException("Failed to execute task [task name=" + taskName + "]");
+                        if (jobArgs == null) {
+                            Object[] args = new Object[beanArgsCnt];
+
+                            for (int i = 0; i < beanArgsCnt; i++)
+                                args[i] = argument(i + JOB_ARG_IDX);
+
+                            throw new IgniteException("Failed to find constructor for task argument " +
+                                "[taskName=" + taskName + ", argsCnt=" + args.length +
+                                ", args=" + Arrays.toString(args) + "]");
+                        }
                     }
                 }
                 catch (Exception e) {
-                    throw new IgniteException("Failed to execute task [task name=" + taskName + "]", e);
+                    throw new IgniteException("Failed to construct job argument [taskName=" + taskName + "]", e);
                 }
             }
 
             final List<UUID> nids;
 
-            if (nidsArg == null || "null".equals(nidsArg) || nidsArg.isEmpty()) {
-                Collection<ClusterNode> nodes = ignite.cluster().nodes();
+            if (F.isEmpty(nidsArg) || "null".equals(nidsArg)) {
+                try {
+                    if (VisorOneNodeTask.class.isAssignableFrom(Class.forName(taskName)))
+                        nids = Collections.singletonList(ignite.localNode().id());
+                    else {
+                        Collection<ClusterNode> nodes = ignite.cluster().nodes();
 
-                nids = new ArrayList<>(nodes.size());
+                        nids = new ArrayList<>(nodes.size());
 
-                for (ClusterNode node : nodes)
-                    nids.add(node.id());
+                        for (ClusterNode node : nodes)
+                            nids.add(node.id());
+                    }
+                }
+                catch (ClassNotFoundException e) {
+                    throw new IgniteException("Failed to find task class:" + taskName, e);
+                }
             }
             else {
                 String[] items = nidsArg.split(";");
@@ -367,7 +388,7 @@ public class VisorGatewayTask implements ComputeTask<Object[], Object> {
                     try {
                         nids.add(UUID.fromString(item));
                     } catch (IllegalArgumentException ignore) {
-                        // No-op.
+                        ignite.log().warning("Failed to parse node id [taskName=" + taskName + ", nid=" + item + "]");
                     }
                 }
             }

http://git-wip-us.apache.org/repos/asf/ignite/blob/36e7e198/modules/core/src/main/resources/META-INF/classnames.properties
----------------------------------------------------------------------
diff --git a/modules/core/src/main/resources/META-INF/classnames.properties b/modules/core/src/main/resources/META-INF/classnames.properties
index 58679ea..6b548c7 100644
--- a/modules/core/src/main/resources/META-INF/classnames.properties
+++ b/modules/core/src/main/resources/META-INF/classnames.properties
@@ -1686,10 +1686,10 @@ org.apache.ignite.internal.visor.cache.VisorCacheMetricsCollectorTaskArg
 org.apache.ignite.internal.visor.cache.VisorCacheNearConfiguration
 org.apache.ignite.internal.visor.cache.VisorCacheNodesTask
 org.apache.ignite.internal.visor.cache.VisorCacheNodesTask$VisorCacheNodesJob
-org.apache.ignite.internal.visor.cache.VisorCachePartition
 org.apache.ignite.internal.visor.cache.VisorCachePartitions
 org.apache.ignite.internal.visor.cache.VisorCachePartitionsTask
 org.apache.ignite.internal.visor.cache.VisorCachePartitionsTask$VisorCachePartitionsJob
+org.apache.ignite.internal.visor.cache.VisorCachePartitionsTaskArg
 org.apache.ignite.internal.visor.cache.VisorCacheRebalanceConfiguration
 org.apache.ignite.internal.visor.cache.VisorCacheRebalanceTask
 org.apache.ignite.internal.visor.cache.VisorCacheRebalanceTask$VisorCachesRebalanceJob


[53/70] [abbrv] ignite git commit: Merge remote-tracking branch 'origin/ignite-2.0' into ignite-2.0

Posted by sb...@apache.org.
Merge remote-tracking branch 'origin/ignite-2.0' into 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/3ab6e481
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/3ab6e481
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/3ab6e481

Branch: refs/heads/ignite-2893
Commit: 3ab6e481abb4f19389ed51448a596e5dd6d1f232
Parents: f278dc9 52bb84d
Author: devozerov <vo...@gridgain.com>
Authored: Wed Apr 19 15:13:03 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Wed Apr 19 15:13:03 2017 +0300

----------------------------------------------------------------------
 assembly/release-fabric-base.xml                |   5 -
 config/dotnet/default-dotnet.xml                |  45 --
 .../Apache.Ignite.Core.Tests.csproj             |   7 +
 .../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      |   1 -
 .../Cache/Affinity/AffinityTest.cs              |  10 +-
 .../BinarizableAddArgCacheEntryProcessor.cs     |  53 +++
 .../Cache/BinarizableTestException.cs           |  51 +++
 .../Cache/CacheAbstractTest.cs                  | 422 ++++---------------
 .../Cache/CacheDynamicStartTest.cs              | 164 +++----
 .../Cache/CacheForkedTest.cs                    |   6 +-
 .../Cache/CacheTestKey.cs                       |  68 +++
 .../Cache/NonSerializableCacheEntryProcessor.cs |  40 ++
 .../Cache/NonSerializableException.cs           |  40 ++
 .../Cache/Query/CacheQueriesTest.cs             |  35 +-
 .../Continuous/ContinuousQueryAbstractTest.cs   |  45 +-
 .../Continuous/ContinuousQueryJavaFilterTest.cs |  21 +-
 .../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 -
 .../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 +-
 .../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 +-
 .../Impl/Binary/BinaryUtils.cs                  | 207 +++------
 48 files changed, 748 insertions(+), 1219 deletions(-)
----------------------------------------------------------------------



[66/70] [abbrv] ignite git commit: ignite-1561 Fixed tx prepare for cross cache tx with near + colocated cache

Posted by sb...@apache.org.
ignite-1561 Fixed tx prepare for cross cache tx with near + colocated cache


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/a5088265
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/a5088265
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/a5088265

Branch: refs/heads/ignite-2893
Commit: a5088265d7927aab702425249b3f0d6996cb989e
Parents: badf49c
Author: sboikov <sb...@gridgain.com>
Authored: Thu Apr 20 08:29:42 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Thu Apr 20 08:29:42 2017 +0300

----------------------------------------------------------------------
 .../cache/GridCacheSharedContext.java           |   6 +-
 .../processors/cache/GridCacheUtils.java        |  83 +++++--
 .../distributed/GridDistributedTxMapping.java   |  68 +++++-
 .../GridDistributedTxRemoteAdapter.java         |   2 +-
 .../cache/distributed/dht/GridDhtTxLocal.java   |   2 +-
 .../distributed/dht/GridDhtTxPrepareFuture.java |   2 +
 ...arOptimisticSerializableTxPrepareFuture.java | 218 ++++++++++++-------
 .../near/GridNearOptimisticTxPrepareFuture.java |  95 ++++++--
 .../GridNearPessimisticTxPrepareFuture.java     | 186 ++++++++++------
 .../near/GridNearTxFinishFuture.java            |   6 +-
 .../cache/distributed/near/GridNearTxLocal.java |  30 +--
 .../near/GridNearTxPrepareFutureAdapter.java    |  30 +--
 .../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 +++--
 .../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 -
 ...sCacheTxNearEnabledRandomOperationsTest.java |  28 +++
 .../cache/CrossCacheTxRandomOperationsTest.java |  23 +-
 .../dht/GridNearCacheTxNodeFailureSelfTest.java |  31 ---
 .../dht/IgniteCrossCacheTxSelfTest.java         |   8 +
 .../IgniteCacheFailoverTestSuite.java           |   2 -
 .../testsuites/IgniteCacheTestSuite2.java       |   2 +
 32 files changed, 631 insertions(+), 368 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSharedContext.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSharedContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSharedContext.java
index 34bb321..79083e0 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSharedContext.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSharedContext.java
@@ -52,7 +52,7 @@ import org.apache.ignite.internal.processors.cache.transactions.TransactionMetri
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersionManager;
 import org.apache.ignite.internal.processors.timeout.GridTimeoutProcessor;
-import org.apache.ignite.internal.util.GridLongList;
+import org.apache.ignite.internal.util.GridIntList;
 import org.apache.ignite.internal.util.future.GridCompoundFuture;
 import org.apache.ignite.internal.util.future.GridFinishedFuture;
 import org.apache.ignite.internal.util.tostring.GridToStringExclude;
@@ -742,7 +742,7 @@ public class GridCacheSharedContext<K, V> {
      * @param cacheCtx Cache context.
      * @return Error message if transactions are incompatible.
      */
-    @Nullable public String verifyTxCompatibility(IgniteInternalTx tx, GridLongList activeCacheIds,
+    @Nullable public String verifyTxCompatibility(IgniteInternalTx tx, GridIntList activeCacheIds,
         GridCacheContext<K, V> cacheCtx) {
         if (cacheCtx.systemTx() && !tx.system())
             return "system cache can be enlisted only in system transaction";
@@ -751,7 +751,7 @@ public class GridCacheSharedContext<K, V> {
             return "non-system cache can't be enlisted in system transaction";
 
         for (int i = 0; i < activeCacheIds.size(); i++) {
-            int cacheId = (int)activeCacheIds.get(i);
+            int cacheId = activeCacheIds.get(i);
 
             GridCacheContext<K, V> activeCacheCtx = cacheContext(cacheId);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
index d20a782..51a95a6 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
@@ -211,14 +211,6 @@ public class GridCacheUtils {
     /** Default transaction config. */
     private static final TransactionConfiguration DEFAULT_TX_CFG = new TransactionConfiguration();
 
-    /** Partition to state transformer. */
-    private static final IgniteClosure PART2STATE =
-        new C1<GridDhtLocalPartition, GridDhtPartitionState>() {
-            @Override public GridDhtPartitionState apply(GridDhtLocalPartition p) {
-                return p.state();
-            }
-        };
-
     /** Empty predicate array. */
     private static final IgnitePredicate[] EMPTY_FILTER = new IgnitePredicate[0];
 
@@ -247,24 +239,79 @@ public class GridCacheUtils {
     private static final CacheEntryPredicate[] ALWAYS_FALSE0_ARR = new CacheEntryPredicate[] {ALWAYS_FALSE0};
 
     /** Read filter. */
-    private static final IgnitePredicate READ_FILTER = new P1<Object>() {
-        @Override public boolean apply(Object e) {
-            return ((IgniteTxEntry)e).op() == READ;
+    public static final IgnitePredicate READ_FILTER = new P1<IgniteTxEntry>() {
+        @Override public boolean apply(IgniteTxEntry e) {
+            return e.op() == READ;
+        }
+
+        @Override public String toString() {
+            return "READ_FILTER";
+        }
+    };
+
+    /** Read filter. */
+    public static final IgnitePredicate READ_FILTER_NEAR = new P1<IgniteTxEntry>() {
+        @Override public boolean apply(IgniteTxEntry e) {
+            return e.op() == READ && e.context().isNear();
+        }
+
+        @Override public String toString() {
+            return "READ_FILTER_NEAR";
+        }
+    };
+
+    /** Read filter. */
+    public static final IgnitePredicate READ_FILTER_COLOCATED = new P1<IgniteTxEntry>() {
+        @Override public boolean apply(IgniteTxEntry e) {
+            return e.op() == READ && !e.context().isNear();
+        }
+
+        @Override public String toString() {
+            return "READ_FILTER_COLOCATED";
+        }
+    };
+
+    /** Write filter. */
+    public static final IgnitePredicate WRITE_FILTER = new P1<IgniteTxEntry>() {
+        @Override public boolean apply(IgniteTxEntry e) {
+            return e.op() != READ;
+        }
+
+        @Override public String toString() {
+            return "WRITE_FILTER";
+        }
+    };
+
+    /** Write filter. */
+    public static final IgnitePredicate WRITE_FILTER_NEAR = new P1<IgniteTxEntry>() {
+        @Override public boolean apply(IgniteTxEntry e) {
+            return e.op() != READ && e.context().isNear();
+        }
+
+        @Override public String toString() {
+            return "WRITE_FILTER_NEAR";
+        }
+    };
+
+    /** Write filter. */
+    public static final IgnitePredicate WRITE_FILTER_COLOCATED = new P1<IgniteTxEntry>() {
+        @Override public boolean apply(IgniteTxEntry e) {
+            return e.op() != READ && !e.context().isNear();
         }
 
         @Override public String toString() {
-            return "Cache transaction read filter";
+            return "WRITE_FILTER_COLOCATED";
         }
     };
 
     /** Write filter. */
-    private static final IgnitePredicate WRITE_FILTER = new P1<Object>() {
-        @Override public boolean apply(Object e) {
-            return ((IgniteTxEntry)e).op() != READ;
+    public static final IgnitePredicate FILTER_NEAR_CACHE_ENTRY = new P1<IgniteTxEntry>() {
+        @Override public boolean apply(IgniteTxEntry e) {
+            return e.context().isNear();
         }
 
         @Override public String toString() {
-            return "Cache transaction write filter";
+            return "FILTER_NEAR_CACHE_ENTRY";
         }
     };
 
@@ -613,7 +660,7 @@ public class GridCacheUtils {
      * @return Filter for transaction reads.
      */
     @SuppressWarnings({"unchecked"})
-    public static <K, V> IgnitePredicate<IgniteTxEntry> reads() {
+    public static IgnitePredicate<IgniteTxEntry> reads() {
         return READ_FILTER;
     }
 
@@ -621,7 +668,7 @@ public class GridCacheUtils {
      * @return Filter for transaction writes.
      */
     @SuppressWarnings({"unchecked"})
-    public static <K, V> IgnitePredicate<IgniteTxEntry> writes() {
+    public static IgnitePredicate<IgniteTxEntry> writes() {
         return WRITE_FILTER;
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxMapping.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxMapping.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxMapping.java
index f8cec50..45903aa 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxMapping.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxMapping.java
@@ -52,8 +52,8 @@ public class GridDistributedTxMapping {
     /** {@code True} if this is last mapping for node. */
     private boolean last;
 
-    /** {@code True} if mapping is for near caches, {@code false} otherwise. */
-    private boolean near;
+    /** Near cache entries count. */
+    private int nearEntries;
 
     /** {@code True} if this is first mapping for optimistic tx on client node. */
     private boolean clientFirst;
@@ -96,17 +96,17 @@ public class GridDistributedTxMapping {
     }
 
     /**
-     * @return {@code True} if mapping is for near caches, {@code false} otherwise.
+     * @return {@code True} if has colocated cache entries.
      */
-    public boolean near() {
-        return near;
+    public boolean hasColocatedCacheEntries() {
+        return entries.size() > nearEntries;
     }
 
     /**
-     * @param near {@code True} if mapping is for near caches, {@code false} otherwise.
+     * @return {@code True} if has near cache entries.
      */
-    public void near(boolean near) {
-        this.near = near;
+    public boolean hasNearCacheEntries() {
+        return nearEntries > 0;
     }
 
     /**
@@ -124,6 +124,15 @@ public class GridDistributedTxMapping {
     }
 
     /**
+     * @return Near cache entries.
+     */
+    @Nullable public Collection<IgniteTxEntry> nearCacheEntries() {
+        assert nearEntries > 0;
+
+        return F.view(entries, CU.FILTER_NEAR_CACHE_ENTRY);
+    }
+
+    /**
      * @return {@code True} if lock is explicit.
      */
     public boolean explicitLock() {
@@ -159,21 +168,58 @@ public class GridDistributedTxMapping {
      * @return Reads.
      */
     public Collection<IgniteTxEntry> reads() {
-        return F.view(entries, CU.reads());
+        return F.view(entries, CU.READ_FILTER);
     }
 
     /**
      * @return Writes.
      */
     public Collection<IgniteTxEntry> writes() {
-        return F.view(entries, CU.writes());
+        return F.view(entries, CU.WRITE_FILTER);
+    }
+
+    /**
+     * @return Near cache reads.
+     */
+    public Collection<IgniteTxEntry> nearEntriesReads() {
+        assert hasNearCacheEntries();
+
+        return F.view(entries, CU.READ_FILTER_NEAR);
+    }
+
+    /**
+     * @return Near cache writes.
+     */
+    public Collection<IgniteTxEntry> nearEntriesWrites() {
+        assert hasNearCacheEntries();
+
+        return F.view(entries, CU.WRITE_FILTER_NEAR);
+    }
+
+    /**
+     * @return Colocated cache reads.
+     */
+    public Collection<IgniteTxEntry> colocatedEntriesReads() {
+        assert hasColocatedCacheEntries();
+
+        return F.view(entries, CU.READ_FILTER_COLOCATED);
+    }
+
+    /**
+     * @return Colocated cache writes.
+     */
+    public Collection<IgniteTxEntry> colocatedEntriesWrites() {
+        assert hasColocatedCacheEntries();
+
+        return F.view(entries, CU.WRITE_FILTER_COLOCATED);
     }
 
     /**
      * @param entry Adds entry.
      */
     public void add(IgniteTxEntry entry) {
-        entries.add(entry);
+        if (entries.add(entry) && entry.context().isNear())
+            nearEntries++;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxRemoteAdapter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxRemoteAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxRemoteAdapter.java
index de8b29e..9cb04d4 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxRemoteAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxRemoteAdapter.java
@@ -387,7 +387,7 @@ public abstract class GridDistributedTxRemoteAdapter extends IgniteTxAdapter
         }
 
         try {
-            cctx.tm().prepareTx(this);
+            cctx.tm().prepareTx(this, null);
 
             if (pessimistic() || isSystemInvalidate())
                 state(PREPARED);

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxLocal.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxLocal.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxLocal.java
index b1c7e5b..26f08fa 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxLocal.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxLocal.java
@@ -399,7 +399,7 @@ public class GridDhtTxLocal extends GridDhtTxLocalAdapter implements GridCacheMa
                     addEntry(msgId, e);
             }
 
-            userPrepare();
+            userPrepare(null);
 
             // Make sure to add future before calling prepare on it.
             cctx.mvcc().addFuture(fut);

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java
index 6e7b324..464df6e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java
@@ -920,6 +920,8 @@ public final class GridDhtTxPrepareFuture extends GridCacheCompoundFuture<Ignite
             if (res.hasOwnedValue(ver.getKey()))
                 continue;
 
+            assert txEntry != null : ver;
+
             GridCacheContext cacheCtx = txEntry.context();
 
             while (true) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticSerializableTxPrepareFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticSerializableTxPrepareFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticSerializableTxPrepareFuture.java
index cbd9d23..6060729 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticSerializableTxPrepareFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticSerializableTxPrepareFuture.java
@@ -55,7 +55,6 @@ import org.apache.ignite.internal.util.typedef.P1;
 import org.apache.ignite.internal.util.typedef.X;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.U;
-import org.apache.ignite.lang.IgniteBiTuple;
 import org.apache.ignite.lang.IgniteReducer;
 import org.jetbrains.annotations.Nullable;
 
@@ -199,7 +198,7 @@ public class GridNearOptimisticSerializableTxPrepareFuture extends GridNearOptim
             MiniFuture mini = miniFuture(res.miniId());
 
             if (mini != null)
-                mini.onResult(res);
+                mini.onResult(res, true);
         }
     }
 
@@ -339,11 +338,17 @@ public class GridNearOptimisticSerializableTxPrepareFuture extends GridNearOptim
 
         GridDhtTxMapping txMapping = new GridDhtTxMapping();
 
-        Map<IgniteBiTuple<ClusterNode, Boolean>, GridDistributedTxMapping> mappings = new HashMap<>();
+        Map<UUID, GridDistributedTxMapping> mappings = new HashMap<>();
 
-        for (IgniteTxEntry write : writes)
+        boolean hasNearCache = false;
+
+        for (IgniteTxEntry write : writes) {
             map(write, topVer, mappings, txMapping, remap, topLocked);
 
+            if (write.context().isNear())
+                hasNearCache = true;
+        }
+
         for (IgniteTxEntry read : reads)
             map(read, topVer, mappings, txMapping, remap, topLocked);
 
@@ -363,12 +368,26 @@ public class GridNearOptimisticSerializableTxPrepareFuture extends GridNearOptim
 
         tx.transactionNodes(txMapping.transactionNodes());
 
-        checkOnePhase(txMapping);
+        if (!hasNearCache)
+            checkOnePhase(txMapping);
 
+        MiniFuture locNearEntriesFut = null;
+
+        // Create futures in advance to have all futures when process {@link GridNearTxPrepareResponse#clientRemapVersion}.
         for (GridDistributedTxMapping m : mappings.values()) {
             assert !m.empty();
 
-            add(new MiniFuture(this, m, ++miniId));
+            MiniFuture fut = new MiniFuture(this, m, ++miniId);
+
+            add(fut);
+
+            if (m.primary().isLocal() && m.hasNearCacheEntries() && m.hasColocatedCacheEntries()) {
+                assert locNearEntriesFut == null;
+
+                locNearEntriesFut = fut;
+
+                add(new MiniFuture(this, m, ++miniId));
+            }
         }
 
         Collection<IgniteInternalFuture<?>> futs = (Collection)futures();
@@ -383,7 +402,7 @@ public class GridNearOptimisticSerializableTxPrepareFuture extends GridNearOptim
 
             MiniFuture fut = (MiniFuture)fut0;
 
-            IgniteCheckedException err = prepare(fut, txMapping);
+            IgniteCheckedException err = prepare(fut, txMapping.transactionNodes(), locNearEntriesFut);
 
             if (err != null) {
                 while (it.hasNext()) {
@@ -417,9 +436,13 @@ public class GridNearOptimisticSerializableTxPrepareFuture extends GridNearOptim
 
     /**
      * @param fut Mini future.
+     * @param txNodes Tx nodes.
+     * @param locNearEntriesFut Local future for near cache entries prepare.
      * @return Prepare error if any.
      */
-    @Nullable private IgniteCheckedException prepare(final MiniFuture fut, GridDhtTxMapping txMapping) {
+    @Nullable private IgniteCheckedException prepare(final MiniFuture fut,
+        Map<UUID, Collection<UUID>> txNodes,
+        @Nullable MiniFuture locNearEntriesFut) {
         GridDistributedTxMapping m = fut.mapping();
 
         final ClusterNode primary = m.primary();
@@ -434,36 +457,10 @@ public class GridNearOptimisticSerializableTxPrepareFuture extends GridNearOptim
             return err;
         }
 
-        GridNearTxPrepareRequest req = new GridNearTxPrepareRequest(
-            futId,
-            tx.topologyVersion(),
-            tx,
-            timeout,
-            m.reads(),
-            m.writes(),
-            m.near(),
-            txMapping.transactionNodes(),
-            m.last(),
-            tx.onePhaseCommit(),
-            tx.needReturnValue() && tx.implicit(),
-            tx.implicitSingle(),
-            m.explicitLock(),
-            tx.subjectId(),
-            tx.taskNameHash(),
-            m.clientFirst(),
-            tx.activeCachesDeploymentEnabled());
-
-        for (IgniteTxEntry txEntry : m.entries()) {
-            if (txEntry.op() == TRANSFORM)
-                req.addDhtVersion(txEntry.txKey(), null);
-        }
-
         // Must lock near entries separately.
-        if (m.near()) {
+        if (m.hasNearCacheEntries()) {
             try {
-                tx.optimisticLockEntries(m.entries());
-
-                tx.userPrepare();
+                cctx.tm().prepareTx(tx, m.nearCacheEntries());
             }
             catch (IgniteCheckedException e) {
                 fut.onResult(e);
@@ -472,27 +469,36 @@ public class GridNearOptimisticSerializableTxPrepareFuture extends GridNearOptim
             }
         }
 
-        req.miniId(fut.futureId());
-
-        // If this is the primary node for the keys.
         if (primary.isLocal()) {
-            IgniteInternalFuture<GridNearTxPrepareResponse> prepFut = cctx.tm().txHandler().prepareTx(primary.id(),
-                tx,
-                req);
-
-            prepFut.listen(new CI1<IgniteInternalFuture<GridNearTxPrepareResponse>>() {
-                @Override public void apply(IgniteInternalFuture<GridNearTxPrepareResponse> prepFut) {
-                    try {
-                        fut.onResult(prepFut.get());
-                    }
-                    catch (IgniteCheckedException e) {
-                        fut.onResult(e);
-                    }
-                }
-            });
+            if (locNearEntriesFut != null) {
+                boolean nearEntries = fut == locNearEntriesFut;
+
+                GridNearTxPrepareRequest req = createRequest(txNodes,
+                    fut,
+                    timeout,
+                    nearEntries ? m.nearEntriesReads() : m.colocatedEntriesReads(),
+                    nearEntries ? m.nearEntriesWrites() : m.colocatedEntriesWrites());
+
+                prepareLocal(req, fut, nearEntries);
+            }
+            else {
+                GridNearTxPrepareRequest req = createRequest(txNodes,
+                    fut,
+                    timeout,
+                    m.reads(),
+                    m.writes());
+
+                prepareLocal(req, fut, m.hasNearCacheEntries());
+            }
         }
         else {
             try {
+                GridNearTxPrepareRequest req = createRequest(txNodes,
+                    fut,
+                    timeout,
+                    m.reads(),
+                    m.writes());
+
                 cctx.io().send(primary, req, tx.ioPolicy());
             }
             catch (ClusterTopologyCheckedException e) {
@@ -513,16 +519,86 @@ public class GridNearOptimisticSerializableTxPrepareFuture extends GridNearOptim
     }
 
     /**
+     * @param txNodes Tx nodes.
+     * @param fut Future.
+     * @param timeout Timeout.
+     * @param reads Read entries.
+     * @param writes Write entries.
+     * @return Request.
+     */
+    private GridNearTxPrepareRequest createRequest(
+        Map<UUID, Collection<UUID>> txNodes,
+        MiniFuture fut,
+        long timeout,
+        Collection<IgniteTxEntry> reads,
+        Collection<IgniteTxEntry> writes) {
+        GridDistributedTxMapping m = fut.mapping();
+
+        GridNearTxPrepareRequest req = new GridNearTxPrepareRequest(
+            futId,
+            tx.topologyVersion(),
+            tx,
+            timeout,
+            reads,
+            writes,
+            m.hasNearCacheEntries(),
+            txNodes,
+            m.last(),
+            tx.onePhaseCommit(),
+            tx.needReturnValue() && tx.implicit(),
+            tx.implicitSingle(),
+            m.explicitLock(),
+            tx.subjectId(),
+            tx.taskNameHash(),
+            m.clientFirst(),
+            tx.activeCachesDeploymentEnabled());
+
+        for (IgniteTxEntry txEntry : writes) {
+            if (txEntry.op() == TRANSFORM)
+                req.addDhtVersion(txEntry.txKey(), null);
+        }
+
+        req.miniId(fut.futureId());
+
+        return req;
+    }
+
+    /**
+     * @param req Request.
+     * @param fut Future.
+     * @param nearEntries {@code True} if prepare near cache entries.
+     */
+    private void prepareLocal(GridNearTxPrepareRequest req,
+        final MiniFuture fut,
+        final boolean nearEntries) {
+        IgniteInternalFuture<GridNearTxPrepareResponse> prepFut = nearEntries ?
+            cctx.tm().txHandler().prepareNearTx(cctx.localNodeId(), req, true) :
+            cctx.tm().txHandler().prepareColocatedTx(tx, req);
+
+        prepFut.listen(new CI1<IgniteInternalFuture<GridNearTxPrepareResponse>>() {
+            @Override public void apply(IgniteInternalFuture<GridNearTxPrepareResponse> prepFut) {
+                try {
+                    fut.onResult(prepFut.get(), nearEntries);
+                }
+                catch (IgniteCheckedException e) {
+                    fut.onResult(e);
+                }
+            }
+        });
+    }
+
+    /**
      * @param entry Transaction entry.
      * @param topVer Topology version.
      * @param curMapping Current mapping.
+     * @param txMapping Mapping.
      * @param remap Remap flag.
      * @param topLocked Topology locked flag.
      */
     private void map(
         IgniteTxEntry entry,
         AffinityTopologyVersion topVer,
-        Map<IgniteBiTuple<ClusterNode, Boolean>, GridDistributedTxMapping> curMapping,
+        Map<UUID, GridDistributedTxMapping> curMapping,
         GridDhtTxMapping txMapping,
         boolean remap,
         boolean topLocked
@@ -565,30 +641,25 @@ public class GridNearOptimisticSerializableTxPrepareFuture extends GridNearOptim
             }
         }
 
-        IgniteBiTuple<ClusterNode, Boolean> key = F.t(primary, cacheCtx.isNear());
-
-        GridDistributedTxMapping cur = curMapping.get(key);
+        GridDistributedTxMapping cur = curMapping.get(primary.id());
 
         if (cur == null) {
             cur = new GridDistributedTxMapping(primary);
 
-            curMapping.put(key, cur);
-
-            if (primary.isLocal()) {
-                if (entry.context().isNear())
-                    tx.nearLocallyMapped(true);
-                else if (entry.context().isColocated())
-                    tx.colocatedLocallyMapped(true);
-            }
-
-            // Initialize near flag right away.
-            cur.near(cacheCtx.isNear());
+            curMapping.put(primary.id(), cur);
 
             cur.clientFirst(!topLocked && cctx.kernalContext().clientNode());
 
             cur.last(true);
         }
 
+        if (primary.isLocal()) {
+            if (cacheCtx.isNear())
+                tx.nearLocallyMapped(true);
+            else if (cacheCtx.isColocated())
+                tx.colocatedLocallyMapped(true);
+        }
+
         cur.add(entry);
 
         if (entry.explicitVersion() != null) {
@@ -683,9 +754,6 @@ public class GridNearOptimisticSerializableTxPrepareFuture extends GridNearOptim
      *
      */
     private static class MiniFuture extends GridFutureAdapter<GridNearTxPrepareResponse> {
-        /** */
-        private static final long serialVersionUID = 0L;
-
         /** Receive result flag updater. */
         private static AtomicIntegerFieldUpdater<MiniFuture> RCV_RES_UPD =
             AtomicIntegerFieldUpdater.newUpdater(MiniFuture.class, "rcvRes");
@@ -773,9 +841,10 @@ public class GridNearOptimisticSerializableTxPrepareFuture extends GridNearOptim
 
         /**
          * @param res Result callback.
+         * @param updateMapping Update mapping flag.
          */
         @SuppressWarnings({"unchecked", "ThrowableResultOfMethodCallIgnored"})
-        void onResult(final GridNearTxPrepareResponse res) {
+        void onResult(final GridNearTxPrepareResponse res, boolean updateMapping) {
             if (isDone())
                 return;
 
@@ -878,7 +947,7 @@ public class GridNearOptimisticSerializableTxPrepareFuture extends GridNearOptim
                             onDone(res);
                     }
                     else {
-                        parent.onPrepareResponse(m, res);
+                        parent.onPrepareResponse(m, res, updateMapping);
 
                         // Finish this mini future (need result only on client node).
                         onDone(parent.cctx.kernalContext().clientNode() ? res : null);
@@ -892,8 +961,7 @@ public class GridNearOptimisticSerializableTxPrepareFuture extends GridNearOptim
          */
         private void remap(final GridNearTxPrepareResponse res) {
             parent.prepareOnTopology(true, new Runnable() {
-                @Override
-                public void run() {
+                @Override public void run() {
                     onDone(res);
                 }
             });

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticTxPrepareFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticTxPrepareFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticTxPrepareFuture.java
index bc47c13..f4ce1ac 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticTxPrepareFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticTxPrepareFuture.java
@@ -345,6 +345,7 @@ public class GridNearOptimisticTxPrepareFuture extends GridNearOptimisticTxPrepa
     /**
      * @param write Write.
      * @param topLocked {@code True} if thread already acquired lock preventing topology change.
+     * @param remap Remap flag.
      */
     private void prepareSingle(IgniteTxEntry write, boolean topLocked, boolean remap) {
         write.clearEntryReadVersion();
@@ -382,7 +383,10 @@ public class GridNearOptimisticTxPrepareFuture extends GridNearOptimisticTxPrepa
 
         tx.transactionNodes(txMapping.transactionNodes());
 
-        checkOnePhase(txMapping);
+        if (!write.context().isNear())
+            checkOnePhase(txMapping);
+
+        assert !(mapping.hasColocatedCacheEntries() && mapping.hasNearCacheEntries()) : mapping;
 
         proceedPrepare(mapping, null);
     }
@@ -390,6 +394,7 @@ public class GridNearOptimisticTxPrepareFuture extends GridNearOptimisticTxPrepa
     /**
      * @param writes Write entries.
      * @param topLocked {@code True} if thread already acquired lock preventing topology change.
+     * @param remap Remap flag.
      */
     private void prepare(
         Iterable<IgniteTxEntry> writes,
@@ -402,24 +407,37 @@ public class GridNearOptimisticTxPrepareFuture extends GridNearOptimisticTxPrepa
 
         txMapping = new GridDhtTxMapping();
 
-        Map<UUID, GridDistributedTxMapping> map = new HashMap<>();
+        Map<Object, GridDistributedTxMapping> map = new HashMap<>();
 
         // Assign keys to primary nodes.
         GridDistributedTxMapping cur = null;
 
         Queue<GridDistributedTxMapping> mappings = new ArrayDeque<>();
 
+        boolean hasNearCache = false;
+
         for (IgniteTxEntry write : writes) {
             write.clearEntryReadVersion();
 
             GridDistributedTxMapping updated = map(write, topVer, cur, topLocked, remap);
 
+            if (write.context().isNear())
+                hasNearCache = true;
+
             if (cur != updated) {
                 mappings.offer(updated);
 
                 updated.last(true);
 
-                GridDistributedTxMapping prev = map.put(updated.primary().id(), updated);
+                ClusterNode primary = updated.primary();
+
+                assert !primary.isLocal() || !cctx.kernalContext().clientNode();
+
+                // Minor optimization to not create MappingKey: on client node can not have mapping for local node.
+                Object key =  cctx.kernalContext().clientNode() ? primary.id() :
+                    new MappingKey(primary.id(), primary.isLocal() && updated.hasNearCacheEntries());
+
+                GridDistributedTxMapping prev = map.put(key, updated);
 
                 if (prev != null)
                     prev.last(false);
@@ -451,7 +469,8 @@ public class GridNearOptimisticTxPrepareFuture extends GridNearOptimisticTxPrepa
 
         tx.transactionNodes(txMapping.transactionNodes());
 
-        checkOnePhase(txMapping);
+        if (!hasNearCache)
+            checkOnePhase(txMapping);
 
         proceedPrepare(mappings);
     }
@@ -497,7 +516,7 @@ public class GridNearOptimisticTxPrepareFuture extends GridNearOptimisticTxPrepa
                     timeout,
                     null,
                     m.writes(),
-                    m.near(),
+                    m.hasNearCacheEntries(),
                     txMapping.transactionNodes(),
                     m.last(),
                     tx.onePhaseCommit(),
@@ -515,14 +534,14 @@ public class GridNearOptimisticTxPrepareFuture extends GridNearOptimisticTxPrepa
                 }
 
                 // Must lock near entries separately.
-                if (m.near()) {
+                if (m.hasNearCacheEntries()) {
                     try {
-                        tx.optimisticLockEntries(req.writes());
-
-                        tx.userPrepare();
+                        cctx.tm().prepareTx(tx, m.nearCacheEntries());
                     }
                     catch (IgniteCheckedException e) {
                         onError(e, false);
+
+                        return;
                     }
                 }
 
@@ -532,13 +551,12 @@ public class GridNearOptimisticTxPrepareFuture extends GridNearOptimisticTxPrepa
 
                 add(fut); // Append new future.
 
-                // If this is the primary node for the keys.
                 if (n.isLocal()) {
-                    // At this point, if any new node joined, then it is
-                    // waiting for this transaction to complete, so
-                    // partition reassignments are not possible here.
+                    assert !(m.hasColocatedCacheEntries() && m.hasNearCacheEntries()) : m;
+
                     IgniteInternalFuture<GridNearTxPrepareResponse> prepFut =
-                        cctx.tm().txHandler().prepareTx(n.id(), tx, req);
+                        m.hasNearCacheEntries() ? cctx.tm().txHandler().prepareNearTx(n.id(), req, true)
+                        : cctx.tm().txHandler().prepareColocatedTx(tx, req);
 
                     prepFut.listen(new CI1<IgniteInternalFuture<GridNearTxPrepareResponse>>() {
                         @Override public void apply(IgniteInternalFuture<GridNearTxPrepareResponse> prepFut) {
@@ -590,6 +608,7 @@ public class GridNearOptimisticTxPrepareFuture extends GridNearOptimisticTxPrepa
      * @param topVer Topology version.
      * @param cur Current mapping.
      * @param topLocked {@code True} if thread already acquired lock preventing topology change.
+     * @param remap Remap flag.
      * @return Mapping.
      */
     private GridDistributedTxMapping map(
@@ -644,14 +663,12 @@ public class GridNearOptimisticTxPrepareFuture extends GridNearOptimisticTxPrepa
             }
         }
 
-        if (cur == null || !cur.primary().id().equals(primary.id()) || cur.near() != cacheCtx.isNear()) {
+        if (cur == null || !cur.primary().id().equals(primary.id()) ||
+            (primary.isLocal() && cur.hasNearCacheEntries() != cacheCtx.isNear())) {
             boolean clientFirst = cur == null && !topLocked && cctx.kernalContext().clientNode();
 
             cur = new GridDistributedTxMapping(primary);
 
-            // Initialize near flag right away.
-            cur.near(cacheCtx.isNear());
-
             cur.clientFirst(clientFirst);
         }
 
@@ -908,7 +925,7 @@ public class GridNearOptimisticTxPrepareFuture extends GridNearOptimisticTxPrepa
                             remap();
                     }
                     else {
-                        parent.onPrepareResponse(m, res);
+                        parent.onPrepareResponse(m, res, m.hasNearCacheEntries());
 
                         // Proceed prepare before finishing mini future.
                         if (mappings != null)
@@ -937,4 +954,44 @@ public class GridNearOptimisticTxPrepareFuture extends GridNearOptimisticTxPrepa
             return S.toString(MiniFuture.class, this, "done", isDone(), "cancelled", isCancelled(), "err", error());
         }
     }
+
+    /**
+     *
+     */
+    private static class MappingKey {
+        /** */
+        private final UUID nodeId;
+
+        /** */
+        private final boolean nearEntries;
+
+        /**
+         * @param nodeId Node ID.
+         * @param nearEntries Near cache entries flag (should be true only for local node).
+         */
+        MappingKey(UUID nodeId, boolean nearEntries) {
+            this.nodeId = nodeId;
+            this.nearEntries = nearEntries;
+        }
+
+        /** {@inheritDoc} */
+        @SuppressWarnings("EqualsWhichDoesntCheckParameterClass")
+        @Override public boolean equals(Object o) {
+            MappingKey that = (MappingKey) o;
+
+            return nearEntries == that.nearEntries && nodeId.equals(that.nodeId);
+        }
+
+        /** {@inheritDoc} */
+        @Override public int hashCode() {
+            int res = nodeId.hashCode();
+            res = 31 * res + (nearEntries ? 1 : 0);
+            return res;
+        }
+
+        /** {@inheritDoc} */
+        @Override public String toString() {
+            return S.toString(MappingKey.class, this);
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearPessimisticTxPrepareFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearPessimisticTxPrepareFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearPessimisticTxPrepareFuture.java
index cb15bca..e934319 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearPessimisticTxPrepareFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearPessimisticTxPrepareFuture.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.processors.cache.distributed.near;
 
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -44,7 +45,6 @@ import org.apache.ignite.internal.util.typedef.CI1;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.U;
-import org.apache.ignite.lang.IgniteBiTuple;
 import org.jetbrains.annotations.Nullable;
 
 import static org.apache.ignite.internal.processors.cache.GridCacheOperation.TRANSFORM;
@@ -102,7 +102,7 @@ public class GridNearPessimisticTxPrepareFuture extends GridNearTxPrepareFutureA
             if (f != null) {
                 assert f.primary().id().equals(nodeId);
 
-                f.onResult(res);
+                f.onResult(res, true);
             }
             else {
                 if (msgLog.isDebugEnabled()) {
@@ -169,7 +169,7 @@ public class GridNearPessimisticTxPrepareFuture extends GridNearTxPrepareFutureA
         }
 
         try {
-            tx.userPrepare();
+            tx.userPrepare(Collections.<IgniteTxEntry>emptyList());
 
             cctx.mvcc().addFuture(this);
 
@@ -181,20 +181,97 @@ public class GridNearPessimisticTxPrepareFuture extends GridNearTxPrepareFutureA
     }
 
     /**
+     * @param txNodes Tx nodes.
+     * @param m Mapping.
+     * @param timeout Timeout.
+     * @param reads Reads.
+     * @param writes Writes.
+     * @return Request.
+     */
+    private GridNearTxPrepareRequest createRequest(Map<UUID, Collection<UUID>> txNodes,
+        GridDistributedTxMapping m,
+        long timeout,
+        Collection<IgniteTxEntry> reads,
+        Collection<IgniteTxEntry> writes) {
+        GridNearTxPrepareRequest req = new GridNearTxPrepareRequest(
+            futId,
+            tx.topologyVersion(),
+            tx,
+            timeout,
+            reads,
+            writes,
+            m.hasNearCacheEntries(),
+            txNodes,
+            true,
+            tx.onePhaseCommit(),
+            tx.needReturnValue() && tx.implicit(),
+            tx.implicitSingle(),
+            m.explicitLock(),
+            tx.subjectId(),
+            tx.taskNameHash(),
+            false,
+            tx.activeCachesDeploymentEnabled());
+
+        for (IgniteTxEntry txEntry : writes) {
+            if (txEntry.op() == TRANSFORM)
+                req.addDhtVersion(txEntry.txKey(), null);
+        }
+
+        return req;
+    }
+
+    /**
+     * @param req Request.
+     * @param m Mapping.
+     * @param miniId Mini future ID.
+     * @param nearEntries {@code True} if prepare near cache entries.
+     */
+    private void prepareLocal(GridNearTxPrepareRequest req,
+        GridDistributedTxMapping m,
+        int miniId,
+        final boolean nearEntries) {
+        final MiniFuture fut = new MiniFuture(m, miniId);
+
+        req.miniId(fut.futureId());
+
+        add(fut);
+
+        IgniteInternalFuture<GridNearTxPrepareResponse> prepFut = nearEntries ?
+            cctx.tm().txHandler().prepareNearTx(cctx.localNodeId(), req, true) :
+            cctx.tm().txHandler().prepareColocatedTx(tx, req);
+
+        prepFut.listen(new CI1<IgniteInternalFuture<GridNearTxPrepareResponse>>() {
+            @Override public void apply(IgniteInternalFuture<GridNearTxPrepareResponse> prepFut) {
+                try {
+                    fut.onResult(prepFut.get(), nearEntries);
+                }
+                catch (IgniteCheckedException e) {
+                    fut.onError(e);
+                }
+            }
+        });
+    }
+
+    /**
      *
      */
     private void preparePessimistic() {
-        Map<IgniteBiTuple<ClusterNode, Boolean>, GridDistributedTxMapping> mappings = new HashMap<>();
+        Map<UUID, GridDistributedTxMapping> mappings = new HashMap<>();
 
         AffinityTopologyVersion topVer = tx.topologyVersion();
 
         GridDhtTxMapping txMapping = new GridDhtTxMapping();
 
+        boolean hasNearCache = false;
+
         for (IgniteTxEntry txEntry : tx.allEntries()) {
             txEntry.clearEntryReadVersion();
 
             GridCacheContext cacheCtx = txEntry.context();
 
+            if (cacheCtx.isNear())
+                hasNearCache = true;
+
             List<ClusterNode> nodes;
 
             if (!cacheCtx.isLocal()) {
@@ -205,21 +282,14 @@ public class GridNearPessimisticTxPrepareFuture extends GridNearTxPrepareFutureA
             else
                 nodes = cacheCtx.affinity().nodesByKey(txEntry.key(), topVer);
 
-            ClusterNode primary = F.first(nodes);
-
-            boolean near = cacheCtx.isNear();
+            assert !nodes.isEmpty();
 
-            IgniteBiTuple<ClusterNode, Boolean> key = F.t(primary, near);
+            ClusterNode primary = nodes.get(0);
 
-            GridDistributedTxMapping nodeMapping = mappings.get(key);
+            GridDistributedTxMapping nodeMapping = mappings.get(primary.id());
 
-            if (nodeMapping == null) {
-                nodeMapping = new GridDistributedTxMapping(primary);
-
-                nodeMapping.near(cacheCtx.isNear());
-
-                mappings.put(key, nodeMapping);
-            }
+            if (nodeMapping == null)
+                mappings.put(primary.id(), nodeMapping = new GridDistributedTxMapping(primary));
 
             txEntry.nodeId(primary.id());
 
@@ -230,7 +300,8 @@ public class GridNearPessimisticTxPrepareFuture extends GridNearTxPrepareFutureA
 
         tx.transactionNodes(txMapping.transactionNodes());
 
-        checkOnePhase(txMapping);
+        if (!hasNearCache)
+            checkOnePhase(txMapping);
 
         long timeout = tx.remainingTime();
 
@@ -242,56 +313,48 @@ public class GridNearPessimisticTxPrepareFuture extends GridNearTxPrepareFutureA
 
         int miniId = 0;
 
+        Map<UUID, Collection<UUID>> txNodes = txMapping.transactionNodes();
+
         for (final GridDistributedTxMapping m : mappings.values()) {
             final ClusterNode primary = m.primary();
 
-            GridNearTxPrepareRequest req = new GridNearTxPrepareRequest(
-                futId,
-                tx.topologyVersion(),
-                tx,
-                timeout,
-                m.reads(),
-                m.writes(),
-                m.near(),
-                txMapping.transactionNodes(),
-                true,
-                tx.onePhaseCommit(),
-                tx.needReturnValue() && tx.implicit(),
-                tx.implicitSingle(),
-                m.explicitLock(),
-                tx.subjectId(),
-                tx.taskNameHash(),
-                false,
-                tx.activeCachesDeploymentEnabled());
-
-            for (IgniteTxEntry txEntry : m.entries()) {
-                if (txEntry.op() == TRANSFORM)
-                    req.addDhtVersion(txEntry.txKey(), null);
+            if (primary.isLocal()) {
+                if (m.hasNearCacheEntries() && m.hasColocatedCacheEntries()) {
+                    GridNearTxPrepareRequest nearReq = createRequest(txMapping.transactionNodes(),
+                        m,
+                        timeout,
+                        m.nearEntriesReads(),
+                        m.nearEntriesWrites());
+
+                    prepareLocal(nearReq, m, ++miniId, true);
+
+                    GridNearTxPrepareRequest colocatedReq = createRequest(txNodes,
+                        m,
+                        timeout,
+                        m.colocatedEntriesReads(),
+                        m.colocatedEntriesWrites());
+
+                    prepareLocal(colocatedReq, m, ++miniId, false);
+                }
+                else {
+                    GridNearTxPrepareRequest req = createRequest(txNodes, m, timeout, m.reads(), m.writes());
+
+                    prepareLocal(req, m, ++miniId, m.hasNearCacheEntries());
+                }
             }
+            else {
+                GridNearTxPrepareRequest req = createRequest(txNodes,
+                    m,
+                    timeout,
+                    m.reads(),
+                    m.writes());
 
-            final MiniFuture fut = new MiniFuture(m, ++miniId);
+                final MiniFuture fut = new MiniFuture(m, ++miniId);
 
-            req.miniId(fut.futureId());
+                req.miniId(fut.futureId());
 
-            add(fut);
+                add(fut);
 
-            if (primary.isLocal()) {
-                IgniteInternalFuture<GridNearTxPrepareResponse> prepFut = cctx.tm().txHandler().prepareTx(primary.id(),
-                    tx,
-                    req);
-
-                prepFut.listen(new CI1<IgniteInternalFuture<GridNearTxPrepareResponse>>() {
-                    @Override public void apply(IgniteInternalFuture<GridNearTxPrepareResponse> prepFut) {
-                        try {
-                            fut.onResult(prepFut.get());
-                        }
-                        catch (IgniteCheckedException e) {
-                            fut.onError(e);
-                        }
-                    }
-                });
-            }
-            else {
                 try {
                     cctx.io().send(primary, req, tx.ioPolicy());
 
@@ -395,12 +458,13 @@ public class GridNearPessimisticTxPrepareFuture extends GridNearTxPrepareFutureA
 
         /**
          * @param res Response.
+         * @param updateMapping Update mapping flag.
          */
-        void onResult(GridNearTxPrepareResponse res) {
+        void onResult(GridNearTxPrepareResponse res, boolean updateMapping) {
             if (res.error() != null)
                 onError(res.error());
             else {
-                onPrepareResponse(m, res);
+                onPrepareResponse(m, res, updateMapping);
 
                 onDone(res);
             }

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishFuture.java
index 37be0fb..89874ab 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishFuture.java
@@ -642,7 +642,7 @@ public final class GridNearTxFinishFuture<K, V> extends GridCacheCompoundIdentit
      * @param mapping Mapping to finish.
      */
     private void readyNearMappingFromBackup(GridDistributedTxMapping mapping) {
-        if (mapping.near()) {
+        if (mapping.hasNearCacheEntries()) {
             GridCacheVersion xidVer = tx.xidVersion();
 
             mapping.dhtVersion(xidVer, xidVer);
@@ -676,7 +676,7 @@ public final class GridNearTxFinishFuture<K, V> extends GridCacheCompoundIdentit
     private void finish(int miniId, GridDistributedTxMapping m, boolean commit) {
         ClusterNode n = m.primary();
 
-        assert !m.empty();
+        assert !m.empty() : m;
 
         CacheWriteSynchronizationMode syncMode = tx.syncMode();
 
@@ -698,7 +698,7 @@ public final class GridNearTxFinishFuture<K, V> extends GridCacheCompoundIdentit
             m.explicitLock(),
             tx.storeEnabled(),
             tx.topologyVersion(),
-            completedVer, // Reuse 'baseVersion'  to do not add new fields in message.
+            completedVer, // Reuse 'baseVersion' to do not add new fields in message.
             null,
             null,
             tx.size(),

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java
index 62af536..f795ddc 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java
@@ -151,9 +151,6 @@ public class GridNearTxLocal extends GridDhtTxLocalAdapter implements AutoClosea
     @GridToStringExclude
     private volatile GridNearTxFinishFuture rollbackFut;
 
-    /** Entries to lock on next step of prepare stage. */
-    private Collection<IgniteTxEntry> optimisticLockEntries = Collections.emptyList();
-
     /** True if transaction contains near cache entries mapped to local node. */
     private boolean nearLocallyMapped;
 
@@ -2425,14 +2422,9 @@ public class GridNearTxLocal extends GridDhtTxLocalAdapter implements AutoClosea
 
     /** {@inheritDoc} */
     @Override public Collection<IgniteTxEntry> optimisticLockEntries() {
-        return optimisticLockEntries;
-    }
+        assert false : "Should not be called";
 
-    /**
-     * @param optimisticLockEntries Optimistic lock entries.
-     */
-    void optimisticLockEntries(Collection<IgniteTxEntry> optimisticLockEntries) {
-        this.optimisticLockEntries = optimisticLockEntries;
+        throw new UnsupportedOperationException();
     }
 
     /**
@@ -2862,8 +2854,6 @@ public class GridNearTxLocal extends GridDhtTxLocalAdapter implements AutoClosea
                 if (m == null) {
                     mappings.put(m = new GridDistributedTxMapping(primary));
 
-                    m.near(map.near());
-
                     if (map.explicitLock())
                         m.markExplicitLock();
                 }
@@ -2889,8 +2879,6 @@ public class GridNearTxLocal extends GridDhtTxLocalAdapter implements AutoClosea
 
         mappings.put(m);
 
-        m.near(map.near());
-
         if (map.explicitLock())
             m.markExplicitLock();
 
@@ -2933,14 +2921,16 @@ public class GridNearTxLocal extends GridDhtTxLocalAdapter implements AutoClosea
         Collection<GridCacheVersion> committedVers,
         Collection<GridCacheVersion> rolledbackVers)
     {
+        assert mapping.hasNearCacheEntries() : mapping;
+
         // Process writes, then reads.
         for (IgniteTxEntry txEntry : mapping.entries()) {
-            if (CU.writes().apply(txEntry))
+            if (CU.WRITE_FILTER_NEAR.apply(txEntry))
                 readyNearLock(txEntry, mapping.dhtVersion(), pendingVers, committedVers, rolledbackVers);
         }
 
         for (IgniteTxEntry txEntry : mapping.entries()) {
-            if (CU.reads().apply(txEntry))
+            if (CU.READ_FILTER_NEAR.apply(txEntry))
                 readyNearLock(txEntry, mapping.dhtVersion(), pendingVers, committedVers, rolledbackVers);
         }
     }
@@ -2952,7 +2942,7 @@ public class GridNearTxLocal extends GridDhtTxLocalAdapter implements AutoClosea
      * @param committedVers Committed versions.
      * @param rolledbackVers Rolled back versions.
      */
-    void readyNearLock(IgniteTxEntry txEntry,
+    private void readyNearLock(IgniteTxEntry txEntry,
         GridCacheVersion dhtVer,
         Collection<GridCacheVersion> pendingVers,
         Collection<GridCacheVersion> committedVers,
@@ -3333,11 +3323,7 @@ public class GridNearTxLocal extends GridDhtTxLocalAdapter implements AutoClosea
             needReturnValue() && implicit());
 
         try {
-            // At this point all the entries passed in must be enlisted in transaction because this is an
-            // optimistic transaction.
-            optimisticLockEntries = (serializable() && optimistic()) ? F.concat(false, writes, reads) : writes;
-
-            userPrepare();
+            userPrepare((serializable() && optimistic()) ? F.concat(false, writes, reads) : writes);
 
             // Make sure to add future before calling prepare on it.
             cctx.mvcc().addFuture(fut);

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxPrepareFutureAdapter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxPrepareFutureAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxPrepareFutureAdapter.java
index 7f1f5a2..004e4da 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxPrepareFutureAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxPrepareFutureAdapter.java
@@ -172,7 +172,7 @@ public abstract class GridNearTxPrepareFutureAdapter extends
 
             Collection<UUID> backups = entry.getValue();
 
-            if (backups.size() <= 1)
+            if (backups.size() <= 1 && !tx.txState().hasNearCacheConfigured(cctx, tx.topologyVersion()))
                 tx.onePhaseCommit(true);
         }
     }
@@ -180,9 +180,12 @@ public abstract class GridNearTxPrepareFutureAdapter extends
     /**
      * @param m Mapping.
      * @param res Response.
+     * @param updateMapping Update mapping flag.
      */
     @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
-    final void onPrepareResponse(GridDistributedTxMapping m, GridNearTxPrepareResponse res) {
+    final void onPrepareResponse(GridDistributedTxMapping m,
+        GridNearTxPrepareResponse res,
+        boolean updateMapping) {
         if (res == null)
             return;
 
@@ -245,24 +248,25 @@ public abstract class GridNearTxPrepareFutureAdapter extends
         }
 
         if (!m.empty()) {
-            GridCacheVersion writeVer = res.writeVersion();
-
-            if (writeVer == null)
-                writeVer = res.dhtVersion();
-
             // This step is very important as near and DHT versions grow separately.
             cctx.versions().onReceived(nodeId, res.dhtVersion());
 
-            // Register DHT version.
-            m.dhtVersion(res.dhtVersion(), writeVer);
+            if (updateMapping && m.hasNearCacheEntries()) {
+                GridCacheVersion writeVer = res.writeVersion();
+
+                if (writeVer == null)
+                    writeVer = res.dhtVersion();
 
-            GridDistributedTxMapping map = tx.mappings().get(nodeId);
+                // Register DHT version.
+                m.dhtVersion(res.dhtVersion(), writeVer);
 
-            if (map != null)
-                map.dhtVersion(res.dhtVersion(), writeVer);
+                GridDistributedTxMapping map = tx.mappings().get(nodeId);
+
+                if (map != null)
+                    map.dhtVersion(res.dhtVersion(), writeVer);
 
-            if (m.near())
                 tx.readyNearLocks(m, res.pending(), res.committedVersions(), res.rolledbackVersions());
+            }
         }
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java
index 153ad04..a591517 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java
@@ -111,20 +111,17 @@ public class IgniteTxHandler {
     /**
      * @param nearNodeId Node ID.
      * @param req Request.
-     * @return Prepare future.
      */
-    private IgniteInternalFuture<?> processNearTxPrepareRequest(final UUID nearNodeId, GridNearTxPrepareRequest req) {
+    private void processNearTxPrepareRequest(final UUID nearNodeId, GridNearTxPrepareRequest req) {
         if (txPrepareMsgLog.isDebugEnabled()) {
             txPrepareMsgLog.debug("Received near prepare request [txId=" + req.version() +
                 ", node=" + nearNodeId + ']');
         }
 
-        IgniteInternalFuture<GridNearTxPrepareResponse> fut = prepareTx(nearNodeId, null, req);
+        IgniteInternalFuture<GridNearTxPrepareResponse> fut = prepareNearTx(nearNodeId, req, false);
 
         assert req.txState() != null || fut == null || fut.error() != null ||
             (ctx.tm().tx(req.version()) == null && ctx.tm().nearTx(req.version()) == null);
-
-        return fut;
     }
 
     /**
@@ -209,41 +206,13 @@ public class IgniteTxHandler {
     }
 
     /**
-     * @param nearNodeId Near node ID that initiated transaction.
-     * @param locTx Optional local transaction.
-     * @param req Near prepare request.
-     * @return Future for transaction.
-     */
-    public IgniteInternalFuture<GridNearTxPrepareResponse> prepareTx(
-        UUID nearNodeId,
-        @Nullable GridNearTxLocal locTx,
-        GridNearTxPrepareRequest req
-    ) {
-        assert nearNodeId != null;
-        assert req != null;
-
-        if (locTx != null) {
-            if (req.near()) {
-                // Make sure not to provide Near entries to DHT cache.
-                req.cloneEntries();
-
-                return prepareNearTx(nearNodeId, req);
-            }
-            else
-                return prepareColocatedTx(locTx, req);
-        }
-        else
-            return prepareNearTx(nearNodeId, req);
-    }
-
-    /**
      * Prepares local colocated tx.
      *
      * @param locTx Local transaction.
      * @param req Near prepare request.
      * @return Prepare future.
      */
-    private IgniteInternalFuture<GridNearTxPrepareResponse> prepareColocatedTx(
+    public IgniteInternalFuture<GridNearTxPrepareResponse> prepareColocatedTx(
         final GridNearTxLocal locTx,
         final GridNearTxPrepareRequest req
     ) {
@@ -308,16 +277,20 @@ public class IgniteTxHandler {
     }
 
     /**
-     * Prepares near transaction.
-     *
      * @param nearNodeId Near node ID that initiated transaction.
      * @param req Near prepare request.
+     * @param locReq Local request flag.
      * @return Prepare future.
      */
-    private IgniteInternalFuture<GridNearTxPrepareResponse> prepareNearTx(
+    public IgniteInternalFuture<GridNearTxPrepareResponse> prepareNearTx(
         final UUID nearNodeId,
-        final GridNearTxPrepareRequest req
+        final GridNearTxPrepareRequest req,
+        boolean locReq
     ) {
+        // Make sure not to provide Near entries to DHT cache.
+        if (locReq)
+            req.cloneEntries();
+
         ClusterNode nearNode = ctx.node(nearNodeId);
 
         if (nearNode == null) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxImplicitSingleStateImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxImplicitSingleStateImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxImplicitSingleStateImpl.java
index 5743bfb..36f5f2f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxImplicitSingleStateImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxImplicitSingleStateImpl.java
@@ -26,6 +26,7 @@ import java.util.Set;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.cache.CacheWriteSynchronizationMode;
 import org.apache.ignite.internal.cluster.ClusterTopologyServerNotFoundException;
+import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.processors.cache.GridCacheContext;
 import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
 import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTopologyFuture;
@@ -293,6 +294,11 @@ public class IgniteTxImplicitSingleStateImpl extends IgniteTxLocalStateAdapter {
     }
 
     /** {@inheritDoc} */
+    @Override public boolean hasNearCacheConfigured(GridCacheSharedContext ctx, AffinityTopologyVersion topVer) {
+        return cacheCtx != null ? ctx.discovery().hasNearCache(cacheCtx.cacheId(), topVer) : false;
+    }
+
+    /** {@inheritDoc} */
     public String toString() {
         return S.toString(IgniteTxImplicitSingleStateImpl.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java
index a59ff51..5a708d7 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java
@@ -225,7 +225,7 @@ public abstract class IgniteTxLocalAdapter extends IgniteTxAdapter implements Ig
     }
 
     /** {@inheritDoc} */
-    @Override public IgniteTxState txState() {
+    @Override public IgniteTxLocalState txState() {
         return txState;
     }
 
@@ -401,10 +401,11 @@ public abstract class IgniteTxLocalAdapter extends IgniteTxAdapter implements Ig
     }
 
     /**
+     * @param entries Entries to lock or {@code null} if use default {@link IgniteInternalTx#optimisticLockEntries()}.
      * @throws IgniteCheckedException If prepare step failed.
      */
     @SuppressWarnings({"CatchGenericClass"})
-    public void userPrepare() throws IgniteCheckedException {
+    public void userPrepare(@Nullable Collection<IgniteTxEntry> entries) throws IgniteCheckedException {
         if (state() != PREPARING) {
             if (remainingTime() == -1)
                 throw new IgniteTxTimeoutCheckedException("Transaction timed out: " + this);
@@ -420,7 +421,7 @@ public abstract class IgniteTxLocalAdapter extends IgniteTxAdapter implements Ig
         checkValid();
 
         try {
-            cctx.tm().prepareTx(this);
+            cctx.tm().prepareTx(this, entries);
         }
         catch (IgniteCheckedException e) {
             throw e;

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalState.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalState.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalState.java
index 123d396..fe9fcbd 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalState.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalState.java
@@ -17,6 +17,9 @@
 
 package org.apache.ignite.internal.processors.cache.transactions;
 
+import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
+import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
+
 /**
  *
  */
@@ -41,4 +44,11 @@ public interface IgniteTxLocalState extends IgniteTxState {
      *
      */
     public void seal();
+
+    /**
+     * @param ctx Context.
+     * @param topVer Topology version.
+     * @return {@code True} if tx has cache with created near cache.
+     */
+    public boolean hasNearCacheConfigured(GridCacheSharedContext ctx, AffinityTopologyVersion topVer);
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxManager.java
index da49c06..2da8dee 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxManager.java
@@ -774,12 +774,13 @@ public class IgniteTxManager extends GridCacheSharedManagerAdapter {
     }
 
     /**
-     * Handles prepare stage of 2PC.
+     * Handles prepare stage.
      *
      * @param tx Transaction to prepare.
+     * @param entries Entries to lock or {@code null} if use default {@link IgniteInternalTx#optimisticLockEntries()}.
      * @throws IgniteCheckedException If preparation failed.
      */
-    public void prepareTx(IgniteInternalTx tx) throws IgniteCheckedException {
+    public void prepareTx(IgniteInternalTx tx, @Nullable Collection<IgniteTxEntry> entries) throws IgniteCheckedException {
         if (tx.state() == MARKED_ROLLBACK) {
             if (tx.remainingTime() == -1)
                 throw new IgniteTxTimeoutCheckedException("Transaction timed out: " + this);
@@ -799,7 +800,7 @@ public class IgniteTxManager extends GridCacheSharedManagerAdapter {
         // Optimistic.
         assert tx.optimistic() || !tx.local();
 
-        if (!lockMultiple(tx, tx.optimisticLockEntries())) {
+        if (!lockMultiple(tx, entries != null ? entries : tx.optimisticLockEntries())) {
             tx.setRollbackOnly();
 
             throw new IgniteTxOptimisticCheckedException("Failed to prepare transaction (lock conflict): " + tx);

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxState.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxState.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxState.java
index 7a45b6e..ed2526e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxState.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxState.java
@@ -85,7 +85,7 @@ public interface IgniteTxState {
     public boolean hasNearCache(GridCacheSharedContext cctx);
 
     /**
-     * @param cacheCtx Ccntext.
+     * @param cacheCtx Context.
      * @param tx Transaction.
      * @throws IgniteCheckedException If cache check failed.
      */

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxStateImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxStateImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxStateImpl.java
index 304473e..3679208 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxStateImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxStateImpl.java
@@ -28,12 +28,14 @@ import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.cache.CacheInterceptor;
 import org.apache.ignite.cache.CacheWriteSynchronizationMode;
 import org.apache.ignite.internal.cluster.ClusterTopologyServerNotFoundException;
+import org.apache.ignite.internal.managers.discovery.DiscoCache;
+import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.processors.cache.GridCacheContext;
 import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
 import org.apache.ignite.internal.processors.cache.KeyCacheObject;
 import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTopologyFuture;
 import org.apache.ignite.internal.processors.cache.store.CacheStoreManager;
-import org.apache.ignite.internal.util.GridLongList;
+import org.apache.ignite.internal.util.GridIntList;
 import org.apache.ignite.internal.util.future.GridFutureAdapter;
 import org.apache.ignite.internal.util.tostring.GridToStringExclude;
 import org.apache.ignite.internal.util.tostring.GridToStringInclude;
@@ -52,7 +54,7 @@ import static org.apache.ignite.cache.CacheWriteSynchronizationMode.PRIMARY_SYNC
  */
 public class IgniteTxStateImpl extends IgniteTxLocalStateAdapter {
     /** Active cache IDs. */
-    private GridLongList activeCacheIds = new GridLongList();
+    private GridIntList activeCacheIds = new GridIntList();
 
     /** Per-transaction read map. */
     @GridToStringInclude
@@ -77,13 +79,13 @@ public class IgniteTxStateImpl extends IgniteTxLocalStateAdapter {
 
     /** {@inheritDoc} */
     @Nullable @Override public Integer firstCacheId() {
-        return activeCacheIds.isEmpty() ? null : (int)activeCacheIds.get(0);
+        return activeCacheIds.isEmpty() ? null : activeCacheIds.get(0);
     }
 
     /** {@inheritDoc} */
     @Override public void unwindEvicts(GridCacheSharedContext cctx) {
         for (int i = 0; i < activeCacheIds.size(); i++) {
-            int cacheId = (int) activeCacheIds.get(i);
+            int cacheId = activeCacheIds.get(i);
 
             GridCacheContext ctx = cctx.cacheContext(cacheId);
 
@@ -95,7 +97,7 @@ public class IgniteTxStateImpl extends IgniteTxLocalStateAdapter {
     /** {@inheritDoc} */
     @Nullable @Override public GridCacheContext singleCacheContext(GridCacheSharedContext cctx) {
         if (activeCacheIds.size() == 1) {
-            int cacheId = (int)activeCacheIds.get(0);
+            int cacheId = activeCacheIds.get(0);
 
             return cctx.cacheContext(cacheId);
         }
@@ -106,7 +108,7 @@ public class IgniteTxStateImpl extends IgniteTxLocalStateAdapter {
     /** {@inheritDoc} */
     @Override public void awaitLastFut(GridCacheSharedContext cctx) {
         for (int i = 0; i < activeCacheIds.size(); i++) {
-            int cacheId = (int)activeCacheIds.get(i);
+            int cacheId = activeCacheIds.get(i);
 
             cctx.cacheContext(cacheId).cache().awaitLastFut();
         }
@@ -157,7 +159,7 @@ public class IgniteTxStateImpl extends IgniteTxLocalStateAdapter {
         }
 
         for (int i = 0; i < activeCacheIds.size(); i++) {
-            int cacheId = (int)activeCacheIds.get(i);
+            int cacheId = activeCacheIds.get(i);
 
             GridCacheContext<?, ?> cacheCtx = cctx.cacheContext(cacheId);
 
@@ -175,7 +177,7 @@ public class IgniteTxStateImpl extends IgniteTxLocalStateAdapter {
         CacheWriteSynchronizationMode syncMode = CacheWriteSynchronizationMode.FULL_ASYNC;
 
         for (int i = 0; i < activeCacheIds.size(); i++) {
-            int cacheId = (int)activeCacheIds.get(i);
+            int cacheId = activeCacheIds.get(i);
 
             CacheWriteSynchronizationMode cacheSyncMode =
                 cctx.cacheContext(cacheId).config().getWriteSynchronizationMode();
@@ -202,7 +204,7 @@ public class IgniteTxStateImpl extends IgniteTxLocalStateAdapter {
     /** {@inheritDoc} */
     @Override public boolean hasNearCache(GridCacheSharedContext cctx) {
         for (int i = 0; i < activeCacheIds.size(); i++) {
-            int cacheId = (int)activeCacheIds.get(i);
+            int cacheId = activeCacheIds.get(i);
 
             GridCacheContext cacheCtx = cctx.cacheContext(cacheId);
 
@@ -236,7 +238,7 @@ public class IgniteTxStateImpl extends IgniteTxLocalStateAdapter {
                 int idx = 0;
 
                 for (int i = 0; i < activeCacheIds.size(); i++) {
-                    int activeCacheId = (int)activeCacheIds.get(i);
+                    int activeCacheId = activeCacheIds.get(i);
 
                     cacheNames.append(cctx.cacheContext(activeCacheId).name());
 
@@ -267,7 +269,7 @@ public class IgniteTxStateImpl extends IgniteTxLocalStateAdapter {
         GridCacheContext<?, ?> nonLocCtx = null;
 
         for (int i = 0; i < activeCacheIds.size(); i++) {
-            int cacheId = (int)activeCacheIds.get(i);
+            int cacheId = activeCacheIds.get(i);
 
             GridCacheContext<?, ?> cacheCtx = cctx.cacheContext(cacheId);
 
@@ -299,7 +301,7 @@ public class IgniteTxStateImpl extends IgniteTxLocalStateAdapter {
             GridCacheContext<?, ?> nonLocCtx = null;
 
             for (int i = 0; i < activeCacheIds.size(); i++) {
-                int cacheId = (int)activeCacheIds.get(i);
+                int cacheId = activeCacheIds.get(i);
 
                 GridCacheContext<?, ?> cacheCtx = cctx.cacheContext(cacheId);
 
@@ -319,7 +321,7 @@ public class IgniteTxStateImpl extends IgniteTxLocalStateAdapter {
     @Override public boolean storeWriteThrough(GridCacheSharedContext cctx) {
         if (!activeCacheIds.isEmpty()) {
             for (int i = 0; i < activeCacheIds.size(); i++) {
-                int cacheId = (int)activeCacheIds.get(i);
+                int cacheId = activeCacheIds.get(i);
 
                 CacheStoreManager store = cctx.cacheContext(cacheId).store();
 
@@ -334,7 +336,7 @@ public class IgniteTxStateImpl extends IgniteTxLocalStateAdapter {
     /** {@inheritDoc} */
     @Override public boolean hasInterceptor(GridCacheSharedContext cctx) {
         for (int i = 0; i < activeCacheIds.size(); i++) {
-            int cacheId = (int)activeCacheIds.get(i);
+            int cacheId = activeCacheIds.get(i);
 
             CacheInterceptor interceptor = cctx.cacheContext(cacheId).config().getInterceptor();
 
@@ -347,13 +349,13 @@ public class IgniteTxStateImpl extends IgniteTxLocalStateAdapter {
 
     /** {@inheritDoc} */
     @Override public Collection<CacheStoreManager> stores(GridCacheSharedContext cctx) {
-        GridLongList cacheIds = activeCacheIds;
+        GridIntList cacheIds = activeCacheIds;
 
         if (!cacheIds.isEmpty()) {
             Collection<CacheStoreManager> stores = new ArrayList<>(cacheIds.size());
 
             for (int i = 0; i < cacheIds.size(); i++) {
-                int cacheId = (int)cacheIds.get(i);
+                int cacheId = cacheIds.get(i);
 
                 CacheStoreManager store = cctx.cacheContext(cacheId).store();
 
@@ -370,7 +372,7 @@ public class IgniteTxStateImpl extends IgniteTxLocalStateAdapter {
     /** {@inheritDoc} */
     @Override public void onTxEnd(GridCacheSharedContext cctx, IgniteInternalTx tx, boolean commit) {
         for (int i = 0; i < activeCacheIds.size(); i++) {
-            int cacheId = (int)activeCacheIds.get(i);
+            int cacheId = activeCacheIds.get(i);
 
             GridCacheContext cacheCtx = cctx.cacheContext(cacheId);
 
@@ -474,6 +476,22 @@ public class IgniteTxStateImpl extends IgniteTxLocalStateAdapter {
     }
 
     /** {@inheritDoc} */
+    @Override public boolean hasNearCacheConfigured(GridCacheSharedContext ctx, AffinityTopologyVersion topVer) {
+        DiscoCache discoCache = ctx.discovery().discoCache(topVer);
+
+        assert discoCache != null : topVer;
+
+        for (int i = 0; i < activeCacheIds.size(); i++) {
+            int cacheId = activeCacheIds.get(i);
+
+            if (discoCache.hasNearCache(cacheId))
+                return true;
+        }
+
+        return false;
+    }
+
+    /** {@inheritDoc} */
     public String toString() {
         return S.toString(IgniteTxStateImpl.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/PredicateCollectionView.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/PredicateCollectionView.java b/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/PredicateCollectionView.java
index b4785a7..ff0105b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/PredicateCollectionView.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/PredicateCollectionView.java
@@ -22,7 +22,6 @@ import java.util.Iterator;
 import org.apache.ignite.internal.util.GridSerializableCollection;
 import org.apache.ignite.internal.util.lang.GridFunc;
 import org.apache.ignite.internal.util.typedef.F;
-import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.lang.IgnitePredicate;
 import org.jetbrains.annotations.NotNull;
 
@@ -45,6 +44,7 @@ public class PredicateCollectionView<T> extends GridSerializableCollection<T> {
      * @param col Input col that serves as a base for the view.
      * @param preds Optional preds. If preds are not provided - all elements will be in the view.
      */
+    @SafeVarargs
     public PredicateCollectionView(Collection<T> col, IgnitePredicate<? super T>... preds) {
         this.col = col;
         this.preds = preds;
@@ -70,9 +70,4 @@ public class PredicateCollectionView<T> extends GridSerializableCollection<T> {
     @Override public boolean isEmpty() {
         return F.isEmpty(preds) ? col.isEmpty() : !iterator().hasNext();
     }
-
-    /** {@inheritDoc} */
-    @Override public String toString() {
-        return S.toString(PredicateCollectionView.class, this);
-    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/PredicateMapView.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/PredicateMapView.java b/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/PredicateMapView.java
index d5b97a6..01e6d8a 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/PredicateMapView.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/PredicateMapView.java
@@ -24,7 +24,6 @@ import org.apache.ignite.internal.util.GridSerializableMap;
 import org.apache.ignite.internal.util.GridSerializableSet;
 import org.apache.ignite.internal.util.lang.GridFunc;
 import org.apache.ignite.internal.util.typedef.F;
-import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.lang.IgnitePredicate;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
@@ -113,9 +112,4 @@ public class PredicateMapView<K, V> extends GridSerializableMap<K, V> {
     @Override public boolean containsKey(Object key) {
         return GridFunc.isAll((K)key, preds) && map.containsKey(key);
     }
-
-    /** {@inheritDoc} */
-    @Override public String toString() {
-        return S.toString(PredicateMapView.class, this);
-    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/PredicateSetView.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/PredicateSetView.java b/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/PredicateSetView.java
index 99fc2fd..8937107 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/PredicateSetView.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/PredicateSetView.java
@@ -23,7 +23,6 @@ import org.apache.ignite.internal.util.GridSerializableMap;
 import org.apache.ignite.internal.util.GridSerializableSet;
 import org.apache.ignite.internal.util.lang.GridFunc;
 import org.apache.ignite.internal.util.typedef.F;
-import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.lang.IgniteClosure;
 import org.apache.ignite.lang.IgnitePredicate;
 import org.jetbrains.annotations.NotNull;
@@ -145,9 +144,4 @@ public class PredicateSetView<K, V> extends GridSerializableMap<K, V> {
     @Override public boolean containsKey(Object key) {
         return GridFunc.isAll((K)key, preds) && set.contains(key);
     }
-
-    /** {@inheritDoc} */
-    @Override public String toString() {
-        return S.toString(PredicateSetView.class, this);
-    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/ReadOnlyCollectionView.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/ReadOnlyCollectionView.java b/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/ReadOnlyCollectionView.java
index 8186914..d8aa1d3 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/ReadOnlyCollectionView.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/ReadOnlyCollectionView.java
@@ -22,7 +22,6 @@ import java.util.Iterator;
 import org.apache.ignite.internal.util.GridSerializableCollection;
 import org.apache.ignite.internal.util.GridSerializableIterator;
 import org.apache.ignite.internal.util.lang.GridFunc;
-import org.apache.ignite.internal.util.typedef.internal.S;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -87,9 +86,4 @@ public class ReadOnlyCollectionView<T> extends GridSerializableCollection<T> {
     @Override public boolean equals(Object obj) {
         return obj instanceof Collection && GridFunc.eqNotOrdered(this, (Collection)obj);
     }
-
-    /** {@inheritDoc} */
-    @Override public String toString() {
-        return S.toString(ReadOnlyCollectionView.class, this);
-    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/a5088265/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/ReadOnlyCollectionView2X.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/ReadOnlyCollectionView2X.java b/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/ReadOnlyCollectionView2X.java
index 82ec651..7a60e17 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/ReadOnlyCollectionView2X.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/lang/gridfunc/ReadOnlyCollectionView2X.java
@@ -22,7 +22,6 @@ import java.util.Iterator;
 import org.apache.ignite.internal.util.GridSerializableCollection;
 import org.apache.ignite.internal.util.GridSerializableIterator;
 import org.apache.ignite.internal.util.lang.GridFunc;
-import org.apache.ignite.internal.util.typedef.internal.S;
 import org.jetbrains.annotations.NotNull;
 
 /**
@@ -92,9 +91,4 @@ public class ReadOnlyCollectionView2X<T> extends GridSerializableCollection<T> {
     @Override public boolean equals(Object obj) {
         return obj instanceof Collection && GridFunc.eqNotOrdered(this, (Collection<?>)obj);
     }
-
-    /** {@inheritDoc} */
-    @Override public String toString() {
-        return S.toString(ReadOnlyCollectionView2X.class, this);
-    }
 }


[08/70] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math module to Ignite ML module added missed licenses renamed packages fixed wrong ml profile activation

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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));
-        }
-    }
-}


[36/70] [abbrv] ignite git commit: IGNITE-4565: Implemented CREATE INDEX and DROP INDEX. This closes #1773. This closes #1804.

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/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 7841f06..da6ebc1 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
@@ -60,7 +60,12 @@ import org.apache.ignite.configuration.NearCacheConfiguration;
 import org.apache.ignite.configuration.TransactionConfiguration;
 import org.apache.ignite.events.EventType;
 import org.apache.ignite.internal.GridKernalContext;
+import org.apache.ignite.internal.processors.query.QuerySchema;
 import org.apache.ignite.internal.processors.query.QueryUtils;
+import org.apache.ignite.internal.processors.query.schema.message.SchemaAbstractDiscoveryMessage;
+import org.apache.ignite.internal.processors.query.schema.SchemaExchangeWorkerTask;
+import org.apache.ignite.internal.processors.query.schema.SchemaNodeLeaveExchangeWorkerTask;
+import org.apache.ignite.internal.processors.query.schema.message.SchemaProposeDiscoveryMessage;
 import org.apache.ignite.internal.suggestions.GridPerformanceSuggestions;
 import org.apache.ignite.internal.IgniteClientDisconnectedCheckedException;
 import org.apache.ignite.internal.IgniteComponentType;
@@ -343,6 +348,13 @@ public class GridCacheProcessor extends GridProcessorAdapter {
      * @return Task or {@code null} if message doesn't require any special processing.
      */
     public CachePartitionExchangeWorkerTask exchangeTaskForCustomDiscoveryMessage(DiscoveryCustomMessage msg) {
+        if (msg instanceof SchemaAbstractDiscoveryMessage) {
+            SchemaAbstractDiscoveryMessage msg0 = (SchemaAbstractDiscoveryMessage)msg;
+
+            if (msg0.exchange())
+                return new SchemaExchangeWorkerTask(msg0);
+        }
+
         return null;
     }
 
@@ -352,7 +364,24 @@ public class GridCacheProcessor extends GridProcessorAdapter {
      * @param task Task.
      */
     public void processCustomExchangeTask(CachePartitionExchangeWorkerTask task) {
-        // No-op.
+        if (task instanceof SchemaExchangeWorkerTask) {
+            SchemaAbstractDiscoveryMessage msg = ((SchemaExchangeWorkerTask)task).message();
+
+            if (msg instanceof SchemaProposeDiscoveryMessage) {
+                SchemaProposeDiscoveryMessage msg0 = (SchemaProposeDiscoveryMessage)msg;
+
+                ctx.query().onSchemaPropose(msg0);
+            }
+            else
+                U.warn(log, "Unsupported schema discovery message: " + msg);
+        }
+        else if (task instanceof SchemaNodeLeaveExchangeWorkerTask) {
+            SchemaNodeLeaveExchangeWorkerTask task0 = (SchemaNodeLeaveExchangeWorkerTask)task;
+
+            ctx.query().onNodeLeave(task0.node());
+        }
+        else
+            U.warn(log, "Unsupported custom exchange task: " + task);
     }
 
     /**
@@ -719,7 +748,8 @@ public class GridCacheProcessor extends GridProcessorAdapter {
             cfg,
             cacheType,
             template,
-            IgniteUuid.randomUuid());
+            IgniteUuid.randomUuid(),
+            new QuerySchema(cfg.getQueryEntities()));
 
         desc.locallyConfigured(true);
         desc.staticallyConfigured(true);
@@ -755,7 +785,8 @@ public class GridCacheProcessor extends GridProcessorAdapter {
                 cfg,
                 cacheType,
                 true,
-                IgniteUuid.randomUuid());
+                IgniteUuid.randomUuid(),
+                new QuerySchema(cfg.getQueryEntities()));
 
             desc0.locallyConfigured(true);
             desc0.staticallyConfigured(true);
@@ -831,6 +862,8 @@ public class GridCacheProcessor extends GridProcessorAdapter {
             // Must start database before start first cache.
             sharedCtx.database().onKernalStart(false);
 
+            ctx.query().onCacheKernalStart();
+
             // Start dynamic caches received from collect discovery data.
             for (DynamicCacheDescriptor desc : cacheDescriptors()) {
                 if (ctx.config().isDaemon())
@@ -866,7 +899,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
 
                     caches.put(maskNull(name), cache);
 
-                    startCache(cache);
+                    startCache(cache, desc.schema());
 
                     jCacheProxies.put(maskNull(name), new IgniteCacheProxy(ctx, cache, null, false));
                 }
@@ -1177,10 +1210,11 @@ public class GridCacheProcessor extends GridProcessorAdapter {
 
     /**
      * @param cache Cache to start.
+     * @param schema Cache schema.
      * @throws IgniteCheckedException If failed to start cache.
      */
     @SuppressWarnings({"TypeMayBeWeakened", "unchecked"})
-    private void startCache(GridCacheAdapter<?, ?> cache) throws IgniteCheckedException {
+    private void startCache(GridCacheAdapter<?, ?> cache, QuerySchema schema) throws IgniteCheckedException {
         GridCacheContext<?, ?> cacheCtx = cache.context();
 
         ctx.continuous().onCacheStart(cacheCtx);
@@ -1220,7 +1254,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
 
         cacheCtx.cache().start();
 
-        ctx.query().onCacheStart(cacheCtx);
+        ctx.query().onCacheStart(cacheCtx, schema);
 
         cacheCtx.onStarted();
 
@@ -1779,6 +1813,11 @@ public class GridCacheProcessor extends GridProcessorAdapter {
         assert req.start() : req;
         assert req.cacheType() != null : req;
 
+        DynamicCacheDescriptor desc = cacheDescriptor(req.cacheName());
+
+        if (desc != null)
+            desc.onStart();
+
         prepareCacheStart(
             req.startCacheConfiguration(),
             req.nearCacheConfiguration(),
@@ -1786,13 +1825,9 @@ public class GridCacheProcessor extends GridProcessorAdapter {
             req.clientStartOnly(),
             req.initiatingNodeId(),
             req.deploymentId(),
-            topVer
+            topVer,
+            desc != null ? desc.schema() : null
         );
-
-        DynamicCacheDescriptor desc = cacheDescriptor(req.cacheName());
-
-        if (desc != null)
-            desc.onStart();
     }
 
     /**
@@ -1828,7 +1863,8 @@ public class GridCacheProcessor extends GridProcessorAdapter {
                         false,
                         null,
                         desc.deploymentId(),
-                        topVer
+                        topVer,
+                        desc.schema()
                     );
                 }
             }
@@ -1845,6 +1881,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
      * @param initiatingNodeId Initiating node ID.
      * @param deploymentId Deployment ID.
      * @param topVer Topology version.
+     * @param schema Query schema.
      * @throws IgniteCheckedException If failed.
      */
     private void prepareCacheStart(
@@ -1854,7 +1891,8 @@ public class GridCacheProcessor extends GridProcessorAdapter {
         boolean clientStartOnly,
         UUID initiatingNodeId,
         IgniteUuid deploymentId,
-        AffinityTopologyVersion topVer
+        AffinityTopologyVersion topVer,
+        @Nullable QuerySchema schema
     ) throws IgniteCheckedException {
         CacheConfiguration ccfg = new CacheConfiguration(cfg);
 
@@ -1890,7 +1928,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
 
             caches.put(maskNull(cacheCtx.name()), cache);
 
-            startCache(cache);
+            startCache(cache, schema != null ? schema : new QuerySchema());
 
             onKernalStart(cache);
         }
@@ -2137,6 +2175,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
             req.cacheType(desc.cacheType());
             req.deploymentId(desc.deploymentId());
             req.receivedFrom(desc.receivedFrom());
+            req.schema(desc.schema());
 
             reqs.add(req);
         }
@@ -2149,6 +2188,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
                 null);
 
             req.startCacheConfiguration(desc.cacheConfiguration());
+            req.schema(desc.schema());
 
             req.template(true);
 
@@ -2178,6 +2218,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
             req.cacheType(desc.cacheType());
             req.deploymentId(desc.deploymentId());
             req.receivedFrom(desc.receivedFrom());
+            req.schema(desc.schema());
 
             reqs.add(req);
 
@@ -2199,7 +2240,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
                 onDiscoDataReceived(
                         data.joiningNodeId(),
                         data.joiningNodeId(),
-                        (DynamicCacheChangeBatch) joiningNodeData);
+                        (DynamicCacheChangeBatch) joiningNodeData, true);
         }
     }
 
@@ -2212,7 +2253,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
                 if (e.getValue() != null && e.getValue() instanceof DynamicCacheChangeBatch) {
                     DynamicCacheChangeBatch batch = (DynamicCacheChangeBatch) e.getValue();
 
-                    onDiscoDataReceived(data.joiningNodeId(), e.getKey(), batch);
+                    onDiscoDataReceived(data.joiningNodeId(), e.getKey(), batch, false);
                 }
             }
         }
@@ -2222,8 +2263,9 @@ public class GridCacheProcessor extends GridProcessorAdapter {
      * @param joiningNodeId Joining node id.
      * @param rmtNodeId Rmt node id.
      * @param batch Batch.
+     * @param join Whether this is data from joining node.
      */
-    private void onDiscoDataReceived(UUID joiningNodeId, UUID rmtNodeId, DynamicCacheChangeBatch batch) {
+    private void onDiscoDataReceived(UUID joiningNodeId, UUID rmtNodeId, DynamicCacheChangeBatch batch, boolean join) {
         if (batch.clientReconnect()) {
             if (ctx.clientDisconnected()) {
                 if (clientReconnectReqs == null)
@@ -2253,7 +2295,8 @@ public class GridCacheProcessor extends GridProcessorAdapter {
                                 ccfg,
                                 req.cacheType(),
                                 true,
-                                req.deploymentId());
+                                req.deploymentId(),
+                                req.schema());
 
                         registeredTemplates.put(maskNull(req.cacheName()), desc);
                     }
@@ -2275,6 +2318,10 @@ public class GridCacheProcessor extends GridProcessorAdapter {
                         if (existing.locallyConfigured()) {
                             existing.addRemoteConfiguration(rmtNodeId, req.startCacheConfiguration());
 
+                            if (!join)
+                                // Overwrite existing with remote.
+                                existing.schema(req.schema());
+
                             ctx.discovery().setCacheFilter(
                                     req.cacheName(),
                                     ccfg.getNodeFilter(),
@@ -2290,7 +2337,8 @@ public class GridCacheProcessor extends GridProcessorAdapter {
                                 ccfg,
                                 req.cacheType(),
                                 false,
-                                req.deploymentId());
+                                req.deploymentId(),
+                                req.schema());
 
                         // Received statically configured cache.
                         if (req.initiatingNodeId() == null)
@@ -2791,12 +2839,10 @@ public class GridCacheProcessor extends GridProcessorAdapter {
             UUID.randomUUID(), cacheName, ctx.localNodeId());
 
         req.startCacheConfiguration(cfg);
-
         req.template(cfg.getName() != null && cfg.getName().endsWith("*"));
-
         req.nearCacheConfiguration(cfg.getNearConfiguration());
-
         req.deploymentId(IgniteUuid.randomUuid());
+        req.schema(new QuerySchema(cfg.getQueryEntities()));
 
         if (CU.isUtilityCache(cacheName))
             req.cacheType(CacheType.UTILITY);
@@ -2923,10 +2969,13 @@ public class GridCacheProcessor extends GridProcessorAdapter {
      * @param topVer Current topology version.
      * @return {@code True} if minor topology version should be increased.
      */
-    public boolean onCustomEvent(
-        DiscoveryCustomMessage msg,
-        AffinityTopologyVersion topVer
-    ) {
+    public boolean onCustomEvent(DiscoveryCustomMessage msg, AffinityTopologyVersion topVer) {
+        if (msg instanceof SchemaAbstractDiscoveryMessage) {
+            ctx.query().onDiscovery((SchemaAbstractDiscoveryMessage)msg);
+
+            return false;
+        }
+
         if (msg instanceof CacheAffinityChangeMessage)
             return sharedCtx.affinity().onCustomEvent(((CacheAffinityChangeMessage)msg));
 
@@ -2964,8 +3013,8 @@ public class GridCacheProcessor extends GridProcessorAdapter {
                 DynamicCacheDescriptor desc = registeredTemplates.get(maskNull(req.cacheName()));
 
                 if (desc == null) {
-                    DynamicCacheDescriptor templateDesc =
-                        new DynamicCacheDescriptor(ctx, ccfg, req.cacheType(), true, req.deploymentId());
+                    DynamicCacheDescriptor templateDesc = new DynamicCacheDescriptor(ctx, ccfg, req.cacheType(), true,
+                        req.deploymentId(), req.schema());
 
                     DynamicCacheDescriptor old = registeredTemplates.put(maskNull(ccfg.getName()), templateDesc);
 
@@ -3008,8 +3057,8 @@ public class GridCacheProcessor extends GridProcessorAdapter {
                         assert req.cacheType() != null : req;
                         assert F.eq(ccfg.getName(), req.cacheName()) : req;
 
-                        DynamicCacheDescriptor startDesc =
-                            new DynamicCacheDescriptor(ctx, ccfg, req.cacheType(), false, req.deploymentId());
+                        DynamicCacheDescriptor startDesc = new DynamicCacheDescriptor(ctx, ccfg, req.cacheType(), false,
+                            req.deploymentId(), req.schema());
 
                         if (newTopVer == null) {
                             newTopVer = new AffinityTopologyVersion(topVer.topologyVersion(),
@@ -3605,6 +3654,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
         req.template(true);
 
         req.startCacheConfiguration(cfg);
+        req.schema(new QuerySchema(cfg.getQueryEntities()));
 
         req.deploymentId(IgniteUuid.randomUuid());
 
@@ -3769,16 +3819,28 @@ public class GridCacheProcessor extends GridProcessorAdapter {
      *
      * @throws IgniteCheckedException In case of error.
      */
-    public void createMissingCaches() throws IgniteCheckedException {
+    public void createMissingQueryCaches() throws IgniteCheckedException {
         for (Map.Entry<String, DynamicCacheDescriptor> e : registeredCaches.entrySet()) {
-            CacheConfiguration ccfg = e.getValue().cacheConfiguration();
+            DynamicCacheDescriptor desc = e.getValue();
 
-            if (!caches.containsKey(maskNull(ccfg.getName())) && QueryUtils.isEnabled(ccfg))
-                dynamicStartCache(null, ccfg.getName(), null, false, true, true).get();
+            if (isMissingQueryCache(desc))
+                dynamicStartCache(null, desc.cacheConfiguration().getName(), null, false, true, true).get();
         }
     }
 
     /**
+     * Whether cache defined by provided descriptor is not yet started and has queries enabled.
+     *
+     * @param desc Descriptor.
+     * @return {@code True} if this is missing query cache.
+     */
+    private boolean isMissingQueryCache(DynamicCacheDescriptor desc) {
+        CacheConfiguration ccfg = desc.cacheConfiguration();
+
+        return !caches.containsKey(maskNull(ccfg.getName())) && QueryUtils.isEnabled(ccfg);
+    }
+
+    /**
      * Registers MBean for cache components.
      *
      * @param obj Cache component.
@@ -4008,6 +4070,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
 
                     req.deploymentId(desc.deploymentId());
                     req.startCacheConfiguration(descCfg);
+                    req.schema(desc.schema());
                 }
             }
             else {
@@ -4020,6 +4083,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
                 initialize(cfg, cacheObjCtx);
 
                 req.startCacheConfiguration(cfg);
+                req.schema(new QuerySchema(cfg.getQueryEntities()));
             }
         }
         else {
@@ -4039,6 +4103,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
 
             req.deploymentId(desc.deploymentId());
             req.startCacheConfiguration(ccfg);
+            req.schema(desc.schema());
         }
 
         if (nearCfg != null)

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSharedContext.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSharedContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSharedContext.java
index ad9eeb1..34bb321 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSharedContext.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSharedContext.java
@@ -293,6 +293,8 @@ public class GridCacheSharedContext<K, V> {
                 mgr.start(this);
         }
 
+        kernalCtx.query().onCacheReconnect();
+
         for (GridCacheSharedManager<?, ?> mgr : mgrs)
             mgr.onKernalStart(true);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
index f6827ab..654d306 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
@@ -2077,11 +2077,6 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
     }
 
     /** {@inheritDoc} */
-    @Override public boolean isExchange() {
-        return true;
-    }
-
-    /** {@inheritDoc} */
     @Override public int compareTo(GridDhtPartitionsExchangeFuture fut) {
         return exchId.compareTo(fut.exchId);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java
index e1ed3c5..94ff0d2 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java
@@ -2145,10 +2145,11 @@ public abstract class GridCacheQueryManager<K, V> extends GridCacheManagerAdapte
 
                         fields.put(type.name(), fieldsMap);
 
-                        Collection<GridCacheSqlIndexMetadata> indexesCol =
-                            new ArrayList<>(type.indexes().size());
+                        Map<String, GridQueryIndexDescriptor> idxs = type.indexes();
 
-                        for (Map.Entry<String, GridQueryIndexDescriptor> e : type.indexes().entrySet()) {
+                        Collection<GridCacheSqlIndexMetadata> indexesCol = new ArrayList<>(idxs.size());
+
+                        for (Map.Entry<String, GridQueryIndexDescriptor> e : idxs.entrySet()) {
                             GridQueryIndexDescriptor desc = e.getValue();
 
                             // Add only SQL indexes.

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/IgniteQueryErrorCode.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/IgniteQueryErrorCode.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/IgniteQueryErrorCode.java
index 93b8d47..d05c9fd 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/IgniteQueryErrorCode.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/IgniteQueryErrorCode.java
@@ -33,7 +33,7 @@ public final class IgniteQueryErrorCode {
     /** General parsing error - for the cases when there's no more specific code available. */
     public final static int PARSING = 1001;
 
-    /** Code encountered unexpected type of SQL operation - like {@code EXPLAIN MERGE}. */
+    /** Requested operation is not supported. */
     public final static int UNSUPPORTED_OPERATION = 1002;
 
     /* 2xxx - analysis errors */
@@ -58,9 +58,24 @@ public final class IgniteQueryErrorCode {
     /** Statement type does not match that declared by JDBC driver. */
     public final static int STMT_TYPE_MISMATCH = 3003;
 
-    /** Statement type does not match that declared by JDBC driver. */
+    /** DROP TABLE failed. */
     public final static int TABLE_DROP_FAILED = 3004;
 
+    /** Index already exists. */
+    public final static int INDEX_ALREADY_EXISTS = 3005;
+
+    /** Index does not exist. */
+    public final static int INDEX_NOT_FOUND = 3006;
+
+    /** Required table already exists. */
+    public final static int TABLE_ALREADY_EXISTS = 3007;
+
+    /** Required column not found. */
+    public final static int COLUMN_NOT_FOUND = 3008;
+
+    /** Required column already exists. */
+    public final static int COLUMN_ALREADY_EXISTS = 3009;
+
     /* 4xxx - cache related runtime errors */
 
     /** Attempt to INSERT a key that is already in cache. */
@@ -78,6 +93,14 @@ public final class IgniteQueryErrorCode {
     /** {@link EntryProcessor} has thrown an exception during {@link IgniteCache#invokeAll}. */
     public final static int ENTRY_PROCESSING = 4005;
 
+    /** Cache not found. */
+    public final static int CACHE_NOT_FOUND = 4006;
+
+    /** */
+    private IgniteQueryErrorCode() {
+        // No-op.
+    }
+
     /**
      * Create a {@link SQLException} for given code and message with null state.
      *

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/pool/PoolProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/pool/PoolProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/pool/PoolProcessor.java
index f6c8b2e..37bbb54 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/pool/PoolProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/pool/PoolProcessor.java
@@ -137,6 +137,11 @@ public class PoolProcessor extends GridProcessorAdapter {
 
                 return ctx.getQueryExecutorService();
 
+            case GridIoPolicy.SCHEMA_POOL:
+                assert ctx.getSchemaExecutorService() != null : "Query pool is not configured.";
+
+                return ctx.getSchemaExecutorService();
+
             default: {
                 if (plc < 0)
                     throw new IgniteCheckedException("Policy cannot be negative: " + plc);

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexDescriptor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexDescriptor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexDescriptor.java
index 7f64dd7..69130fb 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexDescriptor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexDescriptor.java
@@ -29,6 +29,11 @@ import java.util.Collection;
  */
 public interface GridQueryIndexDescriptor {
     /**
+     * @return Name.
+     */
+    public String name();
+
+    /**
      * Gets all fields to be indexed.
      *
      * @return Fields to be indexed.

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java
index d49ea57..7746ba5 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java
@@ -24,6 +24,7 @@ import java.util.List;
 import javax.cache.Cache;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteDataStreamer;
+import org.apache.ignite.cache.QueryIndex;
 import org.apache.ignite.cache.query.QueryCursor;
 import org.apache.ignite.cache.query.SqlFieldsQuery;
 import org.apache.ignite.cache.query.SqlQuery;
@@ -36,6 +37,7 @@ import org.apache.ignite.internal.processors.cache.KeyCacheObject;
 import org.apache.ignite.internal.processors.cache.database.CacheDataRow;
 import org.apache.ignite.internal.processors.cache.database.tree.BPlusTree;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
+import org.apache.ignite.internal.processors.query.schema.SchemaIndexCacheVisitor;
 import org.apache.ignite.internal.util.GridSpinBusyLock;
 import org.apache.ignite.internal.util.lang.GridCloseableIterator;
 import org.apache.ignite.lang.IgniteBiTuple;
@@ -128,13 +130,38 @@ public interface GridQueryIndexing {
      *
      * @param spaceName Space name.
      * @param qry Text query.
-     * @param type Query return type.
+     * @param typeName Type name.
      * @param filter Space name and key filter.
      * @return Queried rows.
      * @throws IgniteCheckedException If failed.
      */
     public <K, V> GridCloseableIterator<IgniteBiTuple<K, V>> queryLocalText(@Nullable String spaceName, String qry,
-        GridQueryTypeDescriptor type, IndexingQueryFilter filter) throws IgniteCheckedException;
+        String typeName, IndexingQueryFilter filter) throws IgniteCheckedException;
+
+    /**
+     * Create new index locally.
+     *
+     * @param spaceName Space name.
+     * @param tblName Table name.
+     * @param idxDesc Index descriptor.
+     * @param ifNotExists Ignore operation if index exists (instead of throwing an error).
+     * @param cacheVisitor Cache visitor
+     * @throws IgniteCheckedException if failed.
+     */
+    public void dynamicIndexCreate(@Nullable String spaceName, String tblName, QueryIndexDescriptorImpl idxDesc,
+        boolean ifNotExists, SchemaIndexCacheVisitor cacheVisitor) throws IgniteCheckedException;
+
+    /**
+     * Remove index from the space.
+     *
+     * @param spaceName Space name.
+     * @param idxName Index name.
+     * @param ifExists Ignore operation if index does not exist (instead of throwing an error).
+     * @throws IgniteCheckedException If failed.
+     */
+    @SuppressWarnings("SynchronizationOnLocalVariableOrMethodParameter")
+    public void dynamicIndexDrop(@Nullable String spaceName, String idxName, boolean ifExists)
+        throws IgniteCheckedException;
 
     /**
      * Registers cache.
@@ -169,17 +196,17 @@ public interface GridQueryIndexing {
      * Unregisters type and removes all corresponding data.
      *
      * @param spaceName Space name.
-     * @param type Type descriptor.
+     * @param typeName Type name.
      * @throws IgniteCheckedException If failed.
      */
-    public void unregisterType(@Nullable String spaceName, GridQueryTypeDescriptor type) throws IgniteCheckedException;
+    public void unregisterType(@Nullable String spaceName, String typeName) throws IgniteCheckedException;
 
     /**
      * Updates index. Note that key is unique for space, so if space contains multiple indexes
      * the key should be removed from indexes other than one being updated.
      *
      * @param spaceName Space name.
-     * @param type Value type.
+     * @param typeName Type name.
      * @param key Key.
      * @param val Value.
      * @param ver Version.
@@ -187,7 +214,7 @@ public interface GridQueryIndexing {
      * @throws IgniteCheckedException If failed.
      */
     public void store(@Nullable String spaceName,
-        GridQueryTypeDescriptor type,
+        String typeName,
         KeyCacheObject key,
         int partId,
         CacheObject val,
@@ -266,11 +293,11 @@ public interface GridQueryIndexing {
     /**
      * Prepare native statement to retrieve JDBC metadata from.
      *
-     * @param schema Schema.
+     * @param space Schema.
      * @param sql Query.
      * @return {@link PreparedStatement} from underlying engine to supply metadata to Prepared - most likely H2.
      */
-    public PreparedStatement prepareNativeStatement(String schema, String sql) throws SQLException;
+    public PreparedStatement prepareNativeStatement(String space, String sql) throws SQLException;
 
     /**
      * Gets space name from database schema.


[20/70] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math module to Ignite ML module added missed licenses renamed packages fixed wrong ml profile activation

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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));
-    }
-}


[12/70] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math module to Ignite ML module added missed licenses renamed packages fixed wrong ml profile activation

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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


[25/70] [abbrv] ignite git commit: ignite-4982 Fixed GridIntList.

Posted by sb...@apache.org.
ignite-4982 Fixed GridIntList.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/d60cf53b
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/d60cf53b
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/d60cf53b

Branch: refs/heads/ignite-2893
Commit: d60cf53bbfae162ac96ec1525bcd1772b8249a79
Parents: 58a8cb2
Author: Konstantin Dudkov <kd...@ya.ru>
Authored: Tue Apr 18 16:50:16 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Tue Apr 18 16:50:16 2017 +0300

----------------------------------------------------------------------
 .../communication/GridIoMessageFactory.java     |   8 +-
 .../ignite/internal/util/GridIntList.java       |   5 +-
 ...ClientWriteBehindStoreNonCoalescingTest.java |  13 +-
 .../testsuites/IgniteUtilSelfTestSuite.java     |   2 +
 .../apache/ignite/util/GridIntListSelfTest.java | 153 +++++++++++++++++++
 5 files changed, 167 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/d60cf53b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java
index e1c9511..b972a31 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java
@@ -36,7 +36,6 @@ import org.apache.ignite.internal.managers.eventstorage.GridEventStorageMessage;
 import org.apache.ignite.internal.pagemem.snapshot.SnapshotFinishedMessage;
 import org.apache.ignite.internal.pagemem.snapshot.SnapshotProgressMessage;
 import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
-import org.apache.ignite.internal.processors.cache.GridChangeGlobalStateMessageResponse;
 import org.apache.ignite.internal.processors.cache.CacheEntryInfoCollection;
 import org.apache.ignite.internal.processors.cache.CacheEntryPredicateContainsValue;
 import org.apache.ignite.internal.processors.cache.CacheEntrySerializablePredicate;
@@ -46,6 +45,7 @@ import org.apache.ignite.internal.processors.cache.CacheObjectByteArrayImpl;
 import org.apache.ignite.internal.processors.cache.CacheObjectImpl;
 import org.apache.ignite.internal.processors.cache.GridCacheEntryInfo;
 import org.apache.ignite.internal.processors.cache.GridCacheReturn;
+import org.apache.ignite.internal.processors.cache.GridChangeGlobalStateMessageResponse;
 import org.apache.ignite.internal.processors.cache.KeyCacheObjectImpl;
 import org.apache.ignite.internal.processors.cache.binary.MetadataRequestMessage;
 import org.apache.ignite.internal.processors.cache.binary.MetadataResponseMessage;
@@ -144,6 +144,7 @@ import org.apache.ignite.internal.processors.query.h2.twostep.messages.GridQuery
 import org.apache.ignite.internal.processors.rest.handlers.task.GridTaskResultRequest;
 import org.apache.ignite.internal.processors.rest.handlers.task.GridTaskResultResponse;
 import org.apache.ignite.internal.util.GridByteArrayList;
+import org.apache.ignite.internal.util.GridIntList;
 import org.apache.ignite.internal.util.GridLongList;
 import org.apache.ignite.internal.util.GridMessageCollection;
 import org.apache.ignite.internal.util.UUIDCollectionMessage;
@@ -176,6 +177,11 @@ public class GridIoMessageFactory implements MessageFactory {
         Message msg = null;
 
         switch (type) {
+            case -52:
+                msg = new GridIntList();
+
+                break;
+
             case -51:
                 msg = new NearCacheUpdates();
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/d60cf53b/modules/core/src/main/java/org/apache/ignite/internal/util/GridIntList.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/GridIntList.java b/modules/core/src/main/java/org/apache/ignite/internal/util/GridIntList.java
index 1de8106..968b88e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/GridIntList.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/GridIntList.java
@@ -132,8 +132,7 @@ public class GridIntList implements Message, Externalizable {
 
         for (int i = 0; i < idx; i++) {
             int element  = arr[i];
-            int elementHash = (int)(element ^ (element >>> 32));
-            res = 31 * res + elementHash;
+            res = 31 * res + element;
         }
 
         return res;
@@ -577,7 +576,7 @@ public class GridIntList implements Message, Externalizable {
 
     /** {@inheritDoc} */
     @Override public short directType() {
-        return 85;
+        return -52;
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/d60cf53b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/store/IgnteCacheClientWriteBehindStoreNonCoalescingTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/store/IgnteCacheClientWriteBehindStoreNonCoalescingTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/store/IgnteCacheClientWriteBehindStoreNonCoalescingTest.java
index 8ea109d..1d44a98 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/store/IgnteCacheClientWriteBehindStoreNonCoalescingTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/store/IgnteCacheClientWriteBehindStoreNonCoalescingTest.java
@@ -29,7 +29,6 @@ import javax.cache.processor.EntryProcessorException;
 import javax.cache.processor.MutableEntry;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
-import org.apache.ignite.cache.CacheAtomicWriteOrderMode;
 import org.apache.ignite.cache.CacheAtomicityMode;
 import org.apache.ignite.cache.CacheMode;
 import org.apache.ignite.cache.store.CacheStore;
@@ -40,7 +39,6 @@ import org.apache.ignite.internal.processors.cache.IgniteCacheAbstractTest;
 import org.apache.ignite.lang.IgniteBiInClosure;
 import org.apache.ignite.lang.IgniteFuture;
 
-import static org.apache.ignite.cache.CacheAtomicWriteOrderMode.CLOCK;
 import static org.apache.ignite.cache.CacheAtomicityMode.ATOMIC;
 
 /**
@@ -63,11 +61,6 @@ public class IgnteCacheClientWriteBehindStoreNonCoalescingTest extends IgniteCac
     }
 
     /** {@inheritDoc} */
-    @Override protected CacheAtomicWriteOrderMode atomicWriteOrderMode() {
-        return CLOCK;
-    }
-
-    /** {@inheritDoc} */
     @Override protected NearCacheConfiguration nearConfiguration() {
         return null;
     }
@@ -155,10 +148,10 @@ public class IgnteCacheClientWriteBehindStoreNonCoalescingTest extends IgniteCac
 
         /** {@inheritDoc} */
         @Override public void write(Cache.Entry<? extends Object, ? extends Object> entry) {
-            Object oldValue = storeMap.put(entry.getKey(), entry.getValue());
+            Object oldVal = storeMap.put(entry.getKey(), entry.getValue());
 
-            if (oldValue instanceof Integer && entry.getValue() instanceof Integer) {
-                Integer oldInt = (Integer)oldValue;
+            if (oldVal instanceof Integer && entry.getValue() instanceof Integer) {
+                Integer oldInt = (Integer) oldVal;
                 Integer newInt = (Integer)entry.getValue();
 
                 assertTrue(

http://git-wip-us.apache.org/repos/asf/ignite/blob/d60cf53b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteUtilSelfTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteUtilSelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteUtilSelfTestSuite.java
index 066f8ea..64a94fd 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteUtilSelfTestSuite.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteUtilSelfTestSuite.java
@@ -39,6 +39,7 @@ import org.apache.ignite.spi.discovery.ClusterMetricsSnapshotSerializeSelfTest;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.thread.GridThreadPoolExecutorServiceSelfTest;
 import org.apache.ignite.thread.IgniteThreadPoolSizeTest;
+import org.apache.ignite.util.GridIntListSelfTest;
 import org.apache.ignite.util.GridLongListSelfTest;
 import org.apache.ignite.util.GridMessageCollectionTest;
 import org.apache.ignite.util.GridQueueSelfTest;
@@ -76,6 +77,7 @@ public class IgniteUtilSelfTestSuite extends TestSuite {
         suite.addTestSuite(GridByteArrayListSelfTest.class);
         suite.addTestSuite(GridMBeanSelfTest.class);
         suite.addTestSuite(GridLongListSelfTest.class);
+        suite.addTestSuite(GridIntListSelfTest.class);
         suite.addTestSuite(GridArraysSelfTest.class);
         suite.addTestSuite(GridCacheUtilsSelfTest.class);
         suite.addTestSuite(IgniteExceptionRegistrySelfTest.class);

http://git-wip-us.apache.org/repos/asf/ignite/blob/d60cf53b/modules/core/src/test/java/org/apache/ignite/util/GridIntListSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/util/GridIntListSelfTest.java b/modules/core/src/test/java/org/apache/ignite/util/GridIntListSelfTest.java
new file mode 100644
index 0000000..cc48fa8
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/util/GridIntListSelfTest.java
@@ -0,0 +1,153 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.util;
+
+import junit.framework.TestCase;
+import org.apache.ignite.internal.util.GridIntList;
+
+import static org.apache.ignite.internal.util.GridIntList.asList;
+
+/**
+ *
+ */
+public class GridIntListSelfTest extends TestCase {
+    /**
+     * @throws Exception If failed.
+     */
+    @SuppressWarnings("ZeroLengthArrayAllocation")
+    public void testCopyWithout() throws Exception {
+        assertCopy(
+            new GridIntList(new int[] {}),
+            new GridIntList(new int[] {}));
+
+        assertCopy(
+            new GridIntList(new int[] {}),
+            new GridIntList(new int[] {1}));
+
+        assertCopy(
+            new GridIntList(new int[] {1}),
+            new GridIntList(new int[] {}));
+
+        assertCopy(
+            new GridIntList(new int[] {1, 2, 3}),
+            new GridIntList(new int[] {4, 5, 6}));
+
+        assertCopy(
+            new GridIntList(new int[] {1, 2, 3}),
+            new GridIntList(new int[] {1, 2, 3}));
+
+        assertCopy(
+            new GridIntList(new int[] {1, 2, 3, 4, 5, 1}),
+            new GridIntList(new int[] {1, 1}));
+
+        assertCopy(
+            new GridIntList(new int[] {1, 1, 1, 2, 3, 4, 5, 1, 1, 1}),
+            new GridIntList(new int[] {1, 1}));
+
+        assertCopy(
+            new GridIntList(new int[] {1, 2, 3}),
+            new GridIntList(new int[] {1, 1, 2, 2, 3, 3}));
+    }
+
+    /**
+     *
+     */
+    public void testTruncate() {
+        GridIntList list = asList(1, 2, 3, 4, 5, 6, 7, 8);
+
+        list.truncate(4, true);
+
+        assertEquals(asList(1, 2, 3, 4), list);
+
+        list.truncate(2, false);
+
+        assertEquals(asList(3, 4), list);
+
+        list = new GridIntList();
+
+        list.truncate(0, false);
+        list.truncate(0, true);
+
+        assertEquals(new GridIntList(), list);
+    }
+
+    /**
+     * Assert {@link GridIntList#copyWithout(GridIntList)} on given lists.
+     *
+     * @param lst Source lists.
+     * @param rmv Exclude list.
+     */
+    private void assertCopy(GridIntList lst, GridIntList rmv) {
+        GridIntList res = lst.copyWithout(rmv);
+
+        for (int i = 0; i < lst.size(); i++) {
+            int v = lst.get(i);
+
+            if (rmv.contains(v))
+                assertFalse(res.contains(v));
+            else
+                assertTrue(res.contains(v));
+        }
+    }
+
+    /**
+     *
+     */
+    public void testRemove() {
+        GridIntList list = asList(1, 2, 3, 4, 5, 6);
+
+        assertEquals(2, list.removeValue(0, 3));
+        assertEquals(asList(1, 2, 4, 5, 6), list);
+
+        assertEquals(-1, list.removeValue(1, 1));
+        assertEquals(-1, list.removeValue(0, 3));
+
+        assertEquals(4, list.removeValue(0, 6));
+        assertEquals(asList(1, 2, 4, 5), list);
+
+        assertEquals(2, list.removeIndex(1));
+        assertEquals(asList(1, 4, 5), list);
+
+        assertEquals(1, list.removeIndex(0));
+        assertEquals(asList(4, 5), list);
+    }
+
+    /**
+     *
+     */
+    public void testSort() {
+        assertEquals(new GridIntList(), new GridIntList().sort());
+        assertEquals(asList(1), asList(1).sort());
+        assertEquals(asList(1, 2), asList(2, 1).sort());
+        assertEquals(asList(1, 2, 3), asList(2, 1, 3).sort());
+
+        GridIntList list = new GridIntList();
+
+        list.add(4);
+        list.add(3);
+        list.add(5);
+        list.add(1);
+
+        assertEquals(asList(1, 3, 4, 5), list.sort());
+
+        list.add(0);
+
+        assertEquals(asList(1, 3, 4, 5, 0), list);
+        assertEquals(asList(0, 1, 3, 4, 5), list.sort());
+    }
+}


[38/70] [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/9b21c85d
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/9b21c85d
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/9b21c85d

Branch: refs/heads/ignite-2893
Commit: 9b21c85d6ec0cdbba8cbf2382559a8ef5a82e15c
Parents: 2edb935
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:43:21 2017 +0300

----------------------------------------------------------------------
 .../cache/IgniteCacheJoinPartitionedAndReplicatedTest.java         | 2 ++
 1 file changed, 2 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/9b21c85d/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 d4772c1..37b21c9 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
@@ -161,6 +161,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);


[57/70] [abbrv] ignite git commit: IGNITE-5018 review and improve javadocs in ML module

Posted by sb...@apache.org.
IGNITE-5018 review and improve javadocs in ML module


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/7b2e3888
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/7b2e3888
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/7b2e3888

Branch: refs/heads/ignite-2893
Commit: 7b2e38882010776c3ea29662fa25e71da97bd946
Parents: 67d3358
Author: Oleg Ignatenko <oi...@gridgain.com>
Authored: Wed Apr 19 17:03:40 2017 +0300
Committer: Anton Vinogradov <av...@apache.org>
Committed: Wed Apr 19 17:03:40 2017 +0300

----------------------------------------------------------------------
 .../java/org/apache/ignite/ml/math/Algebra.java | 18 +++++-----
 .../org/apache/ignite/ml/math/Constants.java    | 35 +++++++++++++-----
 .../java/org/apache/ignite/ml/math/Matrix.java  |  8 ++---
 .../org/apache/ignite/ml/math/MurmurHash.java   | 31 ++++++++--------
 .../org/apache/ignite/ml/math/ValueMapper.java  |  6 ++--
 .../decompositions/CholeskyDecomposition.java   |  2 +-
 .../math/decompositions/EigenDecomposition.java | 23 ++++++++----
 .../ml/math/decompositions/LUDecomposition.java | 16 ++++++---
 .../ignite/ml/math/functions/Functions.java     |  7 ++--
 .../functions/IntIntDoubleToVoidFunction.java   |  6 +++-
 .../ml/math/impls/matrix/CacheMatrix.java       | 19 +++++-----
 .../ml/math/impls/matrix/PivotedMatrixView.java | 38 ++++++++++----------
 .../impls/matrix/SparseDistributedMatrix.java   | 17 ++++-----
 .../storage/matrix/CacheMatrixStorage.java      | 10 +++---
 .../matrix/DenseOffHeapMatrixStorage.java       |  9 +++--
 .../storage/vector/CacheVectorStorage.java      |  8 ++---
 .../storage/vector/DelegateVectorStorage.java   | 12 +++++--
 .../storage/vector/MatrixVectorStorage.java     | 27 ++++++--------
 .../vector/SparseLocalOffHeapVectorStorage.java |  4 ++-
 .../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  | 12 +++----
 .../ml/math/impls/vector/PivotedVectorView.java | 23 ++++++------
 .../ml/math/impls/vector/RandomVector.java      | 10 +++---
 .../math/impls/vector/SingleElementVector.java  |  8 ++---
 .../impls/vector/SingleElementVectorView.java   |  4 +--
 .../ml/math/impls/vector/SparseLocalVector.java |  4 +--
 .../ml/math/impls/matrix/CacheMatrixTest.java   |  4 +--
 .../math/impls/vector/AbstractVectorTest.java   |  6 ++--
 31 files changed, 224 insertions(+), 175 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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
index a31503f..b13d9fc 100644
--- 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
@@ -250,8 +250,8 @@ public class Algebra extends Constants {
      * <li>else: {@code (n * n-1 * ... * n-k+1 ) / ( 1 * 2 * ... * k)}.</li>
      * </ul>
      *
-     * @param n
-     * @param k
+     * @param n Size of set.
+     * @param k Size of subset.
      * @return Binomial coefficient.
      */
     public static double binomial(double n, long k) {
@@ -281,8 +281,8 @@ public class Algebra extends Constants {
      * <ul> <li>{@code k&lt;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
+     * @param n Size of set.
+     * @param k Size of subset.
      * @return Binomial coefficient.
      */
     public static double binomial(long n, long k) {
@@ -328,7 +328,8 @@ public class Algebra extends Constants {
      * <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
+     * @param val Value for ceil.
+     * @return Ceil of the given value.
      */
     public static long ceil(double val) {
         return Math.round(Math.ceil(val));
@@ -428,7 +429,7 @@ public class Algebra extends Constants {
 
     /**
      * Returns {@code log(k!)}. Tries to avoid overflows. For {@code k&lt;30} simply looks up a table in O(1).
-     * For {@code k&gt;=30} uses stirlings approximation.
+     * For {@code k&gt;=30} uses Stirling's approximation.
      *
      * @param k must hold {@code k &gt;= 0}.
      */
@@ -549,8 +550,9 @@ public class Algebra extends Constants {
     /**
      * Gets <code>sqrt(a^2 + b^2)</code> without under/overflow.
      *
-     * @param a
-     * @param b
+     * @param a First side value.
+     * @param b Second side value.
+     * @return Hypotenuse value.
      */
     public static double hypot(double a, double b) {
         double r;

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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
index e20c139..f9b6c88 100644
--- 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
@@ -30,13 +30,30 @@ 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;
+    /** Constant for {@code 2**-53}. */
+    public static final double MACHEP = 1.11022302462515654042E-16;
+
+    /** Constant for {@code log(2**1024)}. */
+    public static final double MAXLOG = 7.09782712893383996732E2;
+
+    /** Constant for {@code log(2**-1022)}. */
+    public static final double MINLOG = -7.451332191019412076235E2;
+
+    /** Constant for gamma function. */
+    public static final double MAXGAM = 171.624376956302725;
+
+    /** Constant for {@code 1/(sqrt(2*pi))}. */
+    public static final double SQTPI = 2.50662827463100050242E0;
+
+    /** Constant for {@code sqrt(2)/2}. */
+    public static final double SQRTH = 7.07106781186547524401E-1;
+
+    /** Constant for {@code log(Pi)}. */
+    public static final double LOGPI = 1.14472988584940017414;
+
+    /** Constant for big value. */
+    public static final double BIG = 4.503599627370496e15;
+
+    /** Constant for inverse of big value. */
+    public static final double BIGINV = 2.22044604925031308085e-16;
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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
index 1039484..cc858b7 100644
--- 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
@@ -474,10 +474,10 @@ public interface Matrix extends MetaAttributes, Externalizable, StorageOpsMetric
     /**
      * Creates new view into this matrix. Changes to the view will be propagated to this matrix.
      *
-     * @param rowOff
-     * @param rows
-     * @param colOff
-     * @param cols
+     * @param rowOff View offset in rows.
+     * @param rows Amount of rows in the view.
+     * @param colOff View offset in columns.
+     * @param cols Amount of columns in the view.
      * @return New view.
      * @throws CardinalityException Thrown if cardinalities mismatch.
      * @throws IndexException Thrown in case of offset is out of bound.

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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
index 0cbcbdf..c7dd36b 100644
--- 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
@@ -41,10 +41,10 @@ public class MurmurHash {
      *
      * See also http://github.com/yonik/java_util for future updates to this method.
      *
-     * @param data
-     * @param off
-     * @param len
-     * @param seed
+     * @param data Data to hash.
+     * @param off Where to start munging.
+     * @param len How many bytes to process.
+     * @param seed The seed to start with.
      * @return 32 bit hash platform compatible with C++ MurmurHash3 implementation on x86.
      */
     public static int hash3X86(byte[] data, int off, int len, int seed) {
@@ -101,7 +101,7 @@ public class MurmurHash {
      * Hashes an int.
      *
      * @param data The int to hash.
-     * @param seed The seed for the hash.
+     * @param seed The seed to start with.
      * @return The 32 bit hash of the bytes in question.
      */
     public static int hash(int data, int seed) {
@@ -119,7 +119,7 @@ public class MurmurHash {
      * Hashes bytes in an array.
      *
      * @param data The bytes to hash.
-     * @param seed The seed for the hash.
+     * @param seed The seed to start with.
      * @return The 32 bit hash of the bytes in question.
      */
     public static int hash(byte[] data, int seed) {
@@ -143,7 +143,7 @@ public class MurmurHash {
      * 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.
+     * @param seed The seed to start with.
      * @return The 32 bit murmur hash of the bytes in the buffer.
      */
     public static int hash(ByteBuffer buf, int seed) {
@@ -185,26 +185,27 @@ public class MurmurHash {
     }
 
     /**
-     * @param data
-     * @param seed
+     * @param data The data to hash.
+     * @param seed The seed to start with.
+     * @return Hash value for given data and seed.
      */
     public static long hash64A(byte[] data, int seed) {
         return hash64A(ByteBuffer.wrap(data), seed);
     }
 
     /**
-     * @param data
-     * @param off
-     * @param len
-     * @param seed
+     * @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.
      */
     public static long hash64A(byte[] data, int off, int len, int seed) {
         return hash64A(ByteBuffer.wrap(data, off, len), seed);
     }
 
     /**
-     * @param buf
-     * @param seed
+     * @param buf The data to hash.
+     * @param seed The seed to start with.
      */
     public static long hash64A(ByteBuffer buf, int seed) {
         ByteOrder byteOrder = buf.order();

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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
index 2b62c0b..f0776a3 100644
--- 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
@@ -24,12 +24,14 @@ import java.io.Serializable;
  */
 public interface ValueMapper<V> extends Serializable {
     /**
-     * @param v
+     * @param v Value to map from double.
+     * @return Mapped value.
      */
     public V fromDouble(double v);
 
     /**
-     * @param v
+     * @param v Value to map to double.
+     * @return Mapped value.
      */
     public double toDouble(V v);
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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 bc18307..59ebbe0 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
@@ -138,7 +138,7 @@ public class CholeskyDecomposition extends DecompositionSupport {
         }
     }
 
-    /** */
+    /** {@inheritDoc} */
     @Override public void destroy() {
         if (cachedL != null)
             cachedL.destroy();

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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 01af989..0353bff 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
@@ -24,8 +24,8 @@ 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>
+ * <p>
+ * @see <a href=http://mathworld.wolfram.com/EigenDecomposition.html>MathWorld</a></p>
  */
 public class EigenDecomposition extends DecompositionSupport {
     /** Row and column dimension (square matrix). */
@@ -39,12 +39,17 @@ public class EigenDecomposition extends DecompositionSupport {
     /** Array for internal storage of eigenvalues. */
     private final Vector e;
 
-    /** */
+    /**
+     * @param matrix Matrix to decompose.
+     */
     public EigenDecomposition(Matrix matrix) {
         this(matrix, isSymmetric(matrix));
     }
 
-    /** */
+    /**
+     * @param matrix Matrix to decompose.
+     * @param isSymmetric {@code true} if matrix passes symmetry check, {@code false otherwise}.
+     */
     public EigenDecomposition(Matrix matrix, boolean isSymmetric) {
         n = matrix.columnSize();
 
@@ -69,7 +74,7 @@ public class EigenDecomposition extends DecompositionSupport {
     }
 
     /**
-     * Return the eigen vector matrix
+     * Return the eigen vector matrix.
      *
      * @return V
      */
@@ -85,7 +90,9 @@ public class EigenDecomposition extends DecompositionSupport {
     }
 
     /**
-     * Return the imaginary parts of the eigenvalues
+     * Return the imaginary parts of the eigenvalues.
+     *
+     * @return Vector of imaginary parts.
      */
     public Vector getImagEigenvalues() {
         return e;
@@ -285,7 +292,9 @@ public class EigenDecomposition extends DecompositionSupport {
         return hessenBerg;
     }
 
-    /** Symmetric tridiagonal QL algorithm. */
+    /**
+     * Symmetric tridiagonal QL algorithm.
+     */
     private void tql2() {
         //  This is derived from the Algol procedures tql2, by
         //  Bowdler, Martin, Reinsch, and Wilkinson, Handbook for

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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 b1efc09..4e9730c 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
@@ -24,9 +24,9 @@ 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.
- *
+ * <p>
+ * This class is inspired by class from Apache Common Math with similar name.
+ * </p>
  * @see <a href="http://mathworld.wolfram.com/LUDecomposition.html">MathWorld</a>
  * @see <a href="http://en.wikipedia.org/wiki/LU_decomposition">Wikipedia</a>
  */
@@ -274,7 +274,10 @@ public class LUDecomposition extends DecompositionSupport {
         return determinant;
     }
 
-    /** */
+    /**
+     * @param b Vector to solve using this decomposition.
+     * @return Solution vector.
+     */
     public Vector solve(Vector b) {
         final int m = pivot.size();
 
@@ -310,7 +313,10 @@ public class LUDecomposition extends DecompositionSupport {
         return b.like(m).assign(bp);
     }
 
-    /** */
+    /**
+     * @param b Matrix to solve using this decomposition.
+     * @return Solution matrix.
+     */
     public Matrix solve(Matrix b) {
         final int m = pivot.size();
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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 cd48daa..2693fce 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
@@ -86,7 +86,7 @@ public final class Functions {
     /**
      * Function that returns {@code a + b}. {@code a} is a variable, {@code b} is fixed.
      *
-     * @param b
+     * @param b Value to add.
      */
     public static IgniteDoubleFunction<Double> plus(final double b) {
         return (a) -> a + b;
@@ -95,7 +95,7 @@ public final class Functions {
     /**
      * Function that returns {@code a * b}. {@code a} is a variable, {@code b} is fixed.
      *
-     * @param b
+     * @param b Value to multiply to.
      */
     public static IgniteDoubleFunction<Double> mult(final double b) {
         return (a) -> a * b;
@@ -123,7 +123,8 @@ public final class Functions {
     }
 
     /**
-     * @param b
+     * @param b Power value.
+     * @return Function for given power.
      */
     public static IgniteDoubleFunction<Double> pow(final double b) {
         return (a) -> {

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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
index a9b3f9c..7487a54 100644
--- 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
@@ -23,6 +23,10 @@ import java.io.Serializable;
  * Setter function for matrices.
  */
 public interface IntIntDoubleToVoidFunction extends Serializable {
-    /** */
+    /**
+     * @param x Row index in the matrix.
+     * @param y Column index in the matrix.
+     * @param v Value to set at given row and column.
+     */
     public void apply(int x, int y, double v);
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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
index 73a3493..a7f0afc 100644
--- 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
@@ -42,11 +42,11 @@ public class CacheMatrix<K, V> extends AbstractMatrix {
     /**
      * Creates new matrix over existing cache.
      *
-     * @param rows
-     * @param cols
-     * @param cache
-     * @param keyMapper
-     * @param valMapper
+     * @param rows Amount of rows in matrix.
+     * @param cols Amount of columns in matrix.
+     * @param cache Ignite cache.
+     * @param keyMapper {@link MatrixKeyMapper} to validate cache key.
+     * @param valMapper {@link ValueMapper} to obtain value for given cache key.
      */
     public CacheMatrix(
         int rows,
@@ -90,7 +90,7 @@ public class CacheMatrix<K, V> extends AbstractMatrix {
     /**
      * Return the same matrix with updates values (broken contract).
      *
-     * @param d
+     * @param d Value to divide to.
      */
     @Override public Matrix divide(double d) {
         return mapOverValues((Double v) -> v / d);
@@ -99,7 +99,7 @@ public class CacheMatrix<K, V> extends AbstractMatrix {
     /**
      * Return the same matrix with updates values (broken contract).
      *
-     * @param x
+     * @param x Value to add.
      */
     @Override public Matrix plus(double x) {
         return mapOverValues((Double v) -> v + x);
@@ -108,7 +108,7 @@ public class CacheMatrix<K, V> extends AbstractMatrix {
     /**
      * Return the same matrix with updates values (broken contract).
      *
-     * @param x
+     * @param x Value to multiply to.
      */
     @Override public Matrix times(double x) {
         return mapOverValues((Double v) -> v * x);
@@ -146,7 +146,8 @@ public class CacheMatrix<K, V> extends AbstractMatrix {
     }
 
     /**
-     * @param mapper
+     * @param mapper Mapping function.
+     * @return Matrix with mapped values.
      */
     private Matrix mapOverValues(IgniteFunction<Double, Double> mapper) {
         CacheMatrixStorage<K, V> sto = storage();

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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
index b9a3b17..334291e 100644
--- 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
@@ -43,9 +43,9 @@ public class PivotedMatrixView extends AbstractMatrix {
     }
 
     /**
-     * @param mtx
-     * @param rowPivot
-     * @param colPivot
+     * @param mtx Parent matrix.
+     * @param rowPivot Pivot array for rows.
+     * @param colPivot Pivot array for columns.
      */
     public PivotedMatrixView(Matrix mtx, int[] rowPivot, int[] colPivot) {
         super(new PivotedMatrixStorage(mtx == null ? null : mtx.getStorage(), rowPivot, colPivot));
@@ -54,7 +54,7 @@ public class PivotedMatrixView extends AbstractMatrix {
     }
 
     /**
-     * @param mtx
+     * @param mtx Parent matrix.
      */
     public PivotedMatrixView(Matrix mtx) {
         super(new PivotedMatrixStorage(mtx == null ? null : mtx.getStorage()));
@@ -63,8 +63,8 @@ public class PivotedMatrixView extends AbstractMatrix {
     }
 
     /**
-     * @param mtx
-     * @param pivot
+     * @param mtx  Parent matrix.
+     * @param pivot Pivot array for rows and columns.
      */
     public PivotedMatrixView(Matrix mtx, int[] pivot) {
         super(new PivotedMatrixStorage(mtx == null ? null : mtx.getStorage(), pivot));
@@ -128,52 +128,53 @@ public class PivotedMatrixView extends AbstractMatrix {
     }
 
     /**
-     *
-     *
+     * @return Parent matrix.
      */
     public Matrix getBaseMatrix() {
         return mtx;
     }
 
     /**
-     *
-     *
+     * @return Pivot array for rows.
      */
     public int[] rowPivot() {
         return storage().rowPivot();
     }
 
     /**
-     *
-     *
+     * @return Pivot array for columns.
      */
     public int[] columnPivot() {
         return storage().columnPivot();
     }
 
     /**
-     * @param i
+     * @param i Index for row pivot.
+     * @return Row pivot for given index.
      */
     public int rowPivot(int i) {
         return storage().rowPivot()[i];
     }
 
     /**
-     * @param i
+     * @param i Index for column pivot.
+     * @return Column pivot for given index.
      */
     public int columnPivot(int i) {
         return storage().columnPivot()[i];
     }
 
     /**
-     * @param i
+     * @param i Index for row unpivot.
+     * @return Row unpivot for given index.
      */
     public int rowUnpivot(int i) {
         return storage().rowUnpivot()[i];
     }
 
     /**
-     * @param i
+     * @param i Index for column unpivot.
+     * @return Column unpivot for given index.
      */
     public int columnUnpivot(int i) {
         return storage().columnUnpivot()[i];
@@ -193,10 +194,7 @@ public class PivotedMatrixView extends AbstractMatrix {
         mtx = (Matrix)in.readObject();
     }
 
-    /**
-     *
-     *
-     */
+    /** */
     private PivotedMatrixStorage storage() {
         return (PivotedMatrixStorage)getStorage();
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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
index 8a7cffe..cd75b83 100644
--- 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
@@ -55,10 +55,10 @@ public class SparseDistributedMatrix extends AbstractMatrix implements StorageCo
     }
 
     /**
-     * @param rows
-     * @param cols
-     * @param stoMode
-     * @param acsMode
+     * @param rows Amount of rows in the matrix.
+     * @param cols Amount of columns in the matrix.
+     * @param stoMode Matrix storage mode.
+     * @param acsMode Matrix elements access mode.
      */
     public SparseDistributedMatrix(int rows, int cols, int stoMode, int acsMode) {
         assert rows > 0;
@@ -80,7 +80,7 @@ public class SparseDistributedMatrix extends AbstractMatrix implements StorageCo
     /**
      * Return the same matrix with updates values (broken contract).
      *
-     * @param d
+     * @param d Value to divide to.
      */
     @Override public Matrix divide(double d) {
         return mapOverValues((Double v) -> v / d);
@@ -89,7 +89,7 @@ public class SparseDistributedMatrix extends AbstractMatrix implements StorageCo
     /**
      * Return the same matrix with updates values (broken contract).
      *
-     * @param x
+     * @param x Value to add.
      */
     @Override public Matrix plus(double x) {
         return mapOverValues((Double v) -> v + x);
@@ -98,7 +98,7 @@ public class SparseDistributedMatrix extends AbstractMatrix implements StorageCo
     /**
      * Return the same matrix with updates values (broken contract).
      *
-     * @param x
+     * @param x Value to multiply.
      */
     @Override public Matrix times(double x) {
         return mapOverValues((Double v) -> v * x);
@@ -115,7 +115,8 @@ public class SparseDistributedMatrix extends AbstractMatrix implements StorageCo
     }
 
     /**
-     * @param mapper
+     * @param mapper Mapping function.
+     * @return Matrix with mapped values.
      */
     private Matrix mapOverValues(IgniteFunction<Double, Double> mapper) {
         CacheUtils.sparseMap(storage().cache().getName(), mapper);

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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
index 510c4cf..1eec6f5 100644
--- 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
@@ -44,11 +44,11 @@ public class CacheMatrixStorage<K, V> implements MatrixStorage {
     }
 
     /**
-     * @param rows
-     * @param cols
-     * @param cache
-     * @param keyMapper
-     * @param valMapper
+     * @param rows Amount of rows in matrix.
+     * @param cols Amount of columns in matrix.
+     * @param cache Ignite cache.
+     * @param keyMapper {@link MatrixKeyMapper} to validate cache key.
+     * @param valMapper {@link ValueMapper} to obtain value for given cache key.
      */
     public CacheMatrixStorage(int rows, int cols, IgniteCache<K, V> cache, MatrixKeyMapper<K> keyMapper,
         ValueMapper<V> valMapper) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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
index 74952a9..c9e8de8 100644
--- 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
@@ -38,7 +38,10 @@ public class DenseOffHeapMatrixStorage implements MatrixStorage {
         // No-op.
     }
 
-    /** */
+    /**
+     * @param rows Amount of rows in the matrix.
+     * @param cols Amount of columns in the matrix.
+     */
     public DenseOffHeapMatrixStorage(int rows, int cols) {
         assert rows > 0;
         assert cols > 0;
@@ -49,7 +52,9 @@ public class DenseOffHeapMatrixStorage implements MatrixStorage {
         allocateMemory(rows, cols);
     }
 
-    /** */
+    /**
+     * @param data Backing data array.
+     */
     public DenseOffHeapMatrixStorage(double[][] data) {
         assert data != null;
         assert data[0] != null;

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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
index 7aa317c..f99a216 100644
--- 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
@@ -47,10 +47,10 @@ public class CacheVectorStorage<K, V> implements VectorStorage {
     }
 
     /**
-     * @param size
-     * @param cache
-     * @param keyMapper
-     * @param valMapper
+     * @param size Vector size.
+     * @param cache Ignite cache.
+     * @param keyMapper {@link VectorKeyMapper} to validate cache key.
+     * @param valMapper {@link ValueMapper} to obtain value for given cache key.
      */
     public CacheVectorStorage(int size, IgniteCache<K, V> cache, VectorKeyMapper<K> keyMapper,
         ValueMapper<V> valMapper) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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
index c431bdb..6775d44 100644
--- 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
@@ -57,17 +57,23 @@ public class DelegateVectorStorage implements VectorStorage {
         this.len = len;
     }
 
-    /** */
+    /**
+     * @return Backing vector storage.
+     */
     public VectorStorage delegate() {
         return sto;
     }
 
-    /** */
+    /**
+     * @return Offset into the backing vector.
+     */
     public int offset() {
         return off;
     }
 
-    /** */
+    /**
+     * @return Vector length.
+     */
     public int length() {
         return len;
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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
index a7d7e26..66aa049 100644
--- 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
@@ -46,11 +46,11 @@ public class MatrixVectorStorage implements VectorStorage {
     }
 
     /**
-     * @param parent
-     * @param row
-     * @param col
-     * @param rowStride
-     * @param colStride
+     * @param parent Parent matrix.
+     * @param row Starting row in the view.
+     * @param col Starting column in the view.
+     * @param rowStride Rows stride in the view.
+     * @param colStride Columns stride in the view.
      */
     public MatrixVectorStorage(Matrix parent, int row, int col, int rowStride, int colStride) {
         assert parent != null;
@@ -75,41 +75,34 @@ public class MatrixVectorStorage implements VectorStorage {
     }
 
     /**
-     *
-     *
+     * @return Starting row in the view.
      */
     int row() {
         return row;
     }
 
     /**
-     *
-     *
+     * @return Starting column in the view.
      */
     int column() {
         return col;
     }
 
     /**
-     *
-     *
+     * @return Rows stride in the view.
      */
     int rowStride() {
         return rowStride;
     }
 
     /**
-     *
-     *
+     * @return Columns stride in the view.
      */
     int columnStride() {
         return colStride;
     }
 
-    /**
-     *
-     *
-     */
+    /** */
     private int getSize() {
         if (rowStride != 0 && colStride != 0) {
             int n1 = (parent.rowSize() - row) / rowStride;

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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
index 7b3da78..035a565 100644
--- 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
@@ -43,7 +43,9 @@ public class SparseLocalOffHeapVectorStorage implements VectorStorage {
         //No-op.
     }
 
-    /** */
+    /**
+     * @param cap Initial capacity.
+     */
     public SparseLocalOffHeapVectorStorage(int cap) {
         assert cap > 0;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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
index 3c075f4..83ac837 100644
--- 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
@@ -71,9 +71,7 @@ public abstract class AbstractVector implements Vector {
     /** Read-only error message. */
     private static final String RO_MSG = "Vector is read-only.";
 
-    /**
-     *
-     */
+    /** */
     private void ensureReadOnly() {
         if (readOnly)
             throw new UnsupportedOperationException(RO_MSG);
@@ -707,19 +705,25 @@ public abstract class AbstractVector implements Vector {
             return foldMap(vec, Functions.PLUS, Functions.MINUS_SQUARED, 0d);
     }
 
-    /** */
+    /**
+     * @param vec Vector to check for valid cardinality.
+     */
     protected void checkCardinality(Vector vec) {
         if (vec.size() != size())
             throw new CardinalityException(size(), vec.size());
     }
 
-    /** */
+    /**
+     * @param vec Array to check for valid cardinality.
+     */
     protected void checkCardinality(double[] vec) {
         if (vec.length != size())
             throw new CardinalityException(size(), vec.length);
     }
 
-    /** */
+    /**
+     * @param arr Array to check for valid cardinality.
+     */
     protected void checkCardinality(int[] arr) {
         if (arr.length != size())
             throw new CardinalityException(size(), arr.length);

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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
index 7e23791..f78113c 100644
--- 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
@@ -43,10 +43,10 @@ public class CacheVector<K, V> extends AbstractVector {
     /**
      * Creates new vector over existing cache.
      *
-     * @param size
-     * @param cache
-     * @param keyFunc
-     * @param valMapper
+     * @param size Vector size.
+     * @param cache Ignite cache.
+     * @param keyFunc {@link VectorKeyMapper} to validate cache key.
+     * @param valMapper {@link ValueMapper} to obtain value for given cache key.
      */
     public CacheVector(
         int size,
@@ -57,7 +57,7 @@ public class CacheVector<K, V> extends AbstractVector {
     }
 
     /**
-     * @param mapper
+     * @param mapper Mapping function.
      */
     private Vector mapOverCache(IgniteFunction<Double, Double> mapper) {
         CacheVectorStorage<K, V> sto = storage();

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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
index 71c9c3e..5038f13 100644
--- 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
@@ -35,8 +35,8 @@ public class ConstantVector extends AbstractReadOnlyVector {
     }
 
     /**
-     * @param size
-     * @param val
+     * @param size Vector size.
+     * @param val Value of the constant.
      */
     public ConstantVector(int size, double val) {
         super(new ConstantVectorStorage(size, val));

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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
index 891eb8e..c868160 100644
--- 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
@@ -51,7 +51,7 @@ public class DelegatingVector implements Vector {
     }
 
     /**
-     * @param dlg
+     * @param dlg Parent vector.
      */
     public DelegatingVector(Vector dlg) {
         assert dlg != null;

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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
index 723c585..1eda7d8 100644
--- 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
@@ -33,7 +33,7 @@ public class MatrixVectorView extends AbstractVector {
 
     /** */ private int row;
     /** */ private int col;
-    
+
     /** */ private int rowStride;
     /** */ private int colStride;
 
@@ -45,11 +45,11 @@ public class MatrixVectorView extends AbstractVector {
     }
 
     /**
-     * @param parent
-     * @param row
-     * @param col
-     * @param rowStride
-     * @param colStride
+     * @param parent Parent matrix.
+     * @param row Starting row in the view.
+     * @param col Starting column in the view.
+     * @param rowStride Rows stride in the view.
+     * @param colStride Columns stride in the view.
      */
     public MatrixVectorView(Matrix parent, int row, int col, int rowStride, int colStride) {
         assert parent != null;

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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
index 607bb72..5ad6b89 100644
--- 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
@@ -33,7 +33,7 @@ public class PivotedVectorView extends AbstractVector {
     /** */ private Vector vec;
 
     /**
-     * @param vec
+     * @param vec Parent vector.
      * @param pivot Mapping from external index to internal.
      * @param unpivot Mapping from internal index to external.
      */
@@ -47,8 +47,8 @@ public class PivotedVectorView extends AbstractVector {
     }
 
     /**
-     * @param vec
-     * @param pivot
+     * @param vec  Parent vector.
+     * @param pivot Mapping from external index to internal.
      */
     public PivotedVectorView(Vector vec, int[] pivot) {
         setStorage(new PivotedVectorStorage(vec.getStorage(), pivot));
@@ -58,10 +58,7 @@ public class PivotedVectorView extends AbstractVector {
         this.vec = vec;
     }
 
-    /**
-     *
-     *
-     */
+    /** */
     private PivotedVectorStorage storage() {
         return (PivotedVectorStorage)getStorage();
     }
@@ -74,29 +71,31 @@ public class PivotedVectorView extends AbstractVector {
     }
 
     /**
-     *
-     *
+     * @return Parent vector.
      */
     public Vector getBaseVector() {
         return vec;
     }
 
     /**
-     * @param i
+     * @param i Index to pivot.
+     * @return  Mapping from external index to internal for given index.
      */
     public int pivot(int i) {
         return storage().pivot()[i];
     }
 
     /**
-     * @param i
+     * @param i Index to unpivot.
+     * @return Mapping from internal index to external for given index.
      */
     public int unpivot(int i) {
         return storage().unpivot()[i];
     }
 
     /**
-     * @param idx
+     * @param idx Index of vector element.
+     * @return Vector element at given index.
      */
     protected Vector.Element makeElement(int idx) {
         checkIndex(idx);

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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
index 08292eb..d216a90 100644
--- 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
@@ -37,7 +37,7 @@ public class RandomVector extends AbstractReadOnlyVector {
 
     /**
      * @param size Vector cardinality.
-     * @param fastHash
+     * @param fastHash Whether or not to use fast hashing or Murmur hashing.
      */
     private VectorStorage mkStorage(int size, boolean fastHash) {
         this.fastHash = fastHash;
@@ -46,22 +46,22 @@ public class RandomVector extends AbstractReadOnlyVector {
     }
 
     /**
-     * @param size
-     * @param fastHash
+     * @param size Vector cardinality.
+     * @param fastHash Whether or not to use fast hashing or Murmur hashing.
      */
     public RandomVector(int size, boolean fastHash) {
         setStorage(mkStorage(size, fastHash));
     }
 
     /**
-     * @param size
+     * @param size Vector cardinality.
      */
     public RandomVector(int size) {
         this(size, true);
     }
 
     /**
-     * @param args
+     * @param args Parameters to create new vector instance.
      */
     public RandomVector(Map<String, Object> args) {
         assert args != null;

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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
index cae5ca3..b47dad8 100644
--- 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
@@ -35,16 +35,16 @@ public class SingleElementVector extends AbstractVector {
     }
 
     /**
-     * @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;

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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
index 0fb4105..c2c648b 100644
--- 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
@@ -35,8 +35,8 @@ public class SingleElementVectorView extends AbstractVector {
     }
 
     /**
-     * @param vec
-     * @param idx
+     * @param vec Parent vector.
+     * @param idx Index of the parent vector element.
      */
     public SingleElementVectorView(Vector vec, int idx) {
         super(new SingleElementVectorDelegateStorage(vec, idx));

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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
index d60eea8..e188f70 100644
--- 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
@@ -35,8 +35,8 @@ public class SparseLocalVector extends AbstractVector implements StorageConstant
     }
 
     /**
-     * @param size
-     * @param acsMode
+     * @param size Vector size.
+     * @param acsMode Vector elements access mode.
      */
     public SparseLocalVector(int size, int acsMode) {
         assertAccessMode(acsMode);

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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
index 3d4d05e..52badbc 100644
--- 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
@@ -210,13 +210,11 @@ public class CacheMatrixTest extends GridCommonAbstractTest {
     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;
+        double sum;
 
         initMatrix(cacheMatrix);
         sum = cacheMatrix.sum();

http://git-wip-us.apache.org/repos/asf/ignite/blob/7b2e3888/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
index fa66769..7d12773 100644
--- 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
@@ -262,12 +262,12 @@ public class AbstractVectorTest {
 
         AbstractVector testVector1 = getAbstractVector(storage1);
 
-        String testVal = "";
+        StringBuilder testVal = new StringBuilder();
 
         for (int i = 0; i < data0.length; i++)
-            testVal += data0[i] + data1[i];
+            testVal.append(data0[i] + data1[i]);
 
-        assertEquals(MathTestConstants.VAL_NOT_EQUALS, testVector.foldMap(testVector1, (string, xi) -> string.concat(xi.toString()), Functions.PLUS, ""), testVal);
+        assertEquals(MathTestConstants.VAL_NOT_EQUALS, testVector.foldMap(testVector1, (string, xi) -> string.concat(xi.toString()), Functions.PLUS, ""), testVal.toString());
     }
 
     /** */


[03/70] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math module to Ignite ML module added missed licenses renamed packages fixed wrong ml profile activation

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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));
+        }
+    }
+}


[67/70] [abbrv] ignite git commit: ignite-4929 Fixed issue with incorrect return value on backup for one-phase tx invoke (anyway old value is sent on backups on changed topology, use this value on backup for invoke)

Posted by sb...@apache.org.
ignite-4929 Fixed issue with incorrect return value on backup for one-phase tx invoke (anyway old value is sent on backups on changed topology, use this value on backup for invoke)


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/a4c39707
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/a4c39707
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/a4c39707

Branch: refs/heads/ignite-2893
Commit: a4c397076954d10cfb200fe30060ed0d118a3fc1
Parents: a508826
Author: sboikov <sb...@gridgain.com>
Authored: Thu Apr 20 10:26:09 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Thu Apr 20 10:26:09 2017 +0300

----------------------------------------------------------------------
 .../processors/cache/GridCacheUtils.java        |   9 -
 .../distributed/GridDistributedLockRequest.java |  14 +-
 .../distributed/dht/GridDhtTxPrepareFuture.java |  26 +--
 .../near/GridNearSingleGetRequest.java          |   4 +-
 .../cache/transactions/IgniteTxAdapter.java     |  16 +-
 .../cache/transactions/IgniteTxEntry.java       |  39 ++--
 .../IgfsMetaDirectoryListingAddProcessor.java   |   5 +-
 .../internal/TestRecordingCommunicationSpi.java |   9 +
 .../cache/IgniteOnePhaseCommitInvokeTest.java   | 213 +++++++++++++++++++
 .../IgniteCachePutRetryAbstractSelfTest.java    |  25 +--
 ...gniteCachePutRetryTransactionalSelfTest.java |   2 +-
 .../atomic/IgniteCacheAtomicProtocolTest.java   |  16 +-
 .../testframework/junits/GridAbstractTest.java  |   9 +-
 .../junits/common/GridCommonAbstractTest.java   |  79 +++++++
 .../testsuites/IgniteCacheTestSuite2.java       |   3 +
 15 files changed, 360 insertions(+), 109 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/a4c39707/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
index 51a95a6..5abb6de 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
@@ -196,15 +196,6 @@ public class GridCacheUtils {
     /** Expire time: must be calculated based on TTL value. */
     public static final long EXPIRE_TIME_CALCULATE = -1L;
 
-    /** Skip store flag bit mask. */
-    public static final int SKIP_STORE_FLAG_MASK = 0x1;
-
-    /** Keep serialized flag. */
-    public static final int KEEP_BINARY_FLAG_MASK = 0x2;
-
-    /** Flag indicating that old value for 'invoke' operation was non null on primary node. */
-    public static final int OLD_VAL_ON_PRIMARY = 0x4;
-
     /** Empty predicate array. */
     private static final IgnitePredicate[] EMPTY = new IgnitePredicate[0];
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/a4c39707/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedLockRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedLockRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedLockRequest.java
index b1c2c27..74f34a9 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedLockRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedLockRequest.java
@@ -38,9 +38,6 @@ import org.apache.ignite.plugin.extensions.communication.MessageWriter;
 import org.apache.ignite.transactions.TransactionIsolation;
 import org.jetbrains.annotations.Nullable;
 
-import static org.apache.ignite.internal.processors.cache.GridCacheUtils.KEEP_BINARY_FLAG_MASK;
-import static org.apache.ignite.internal.processors.cache.GridCacheUtils.SKIP_STORE_FLAG_MASK;
-
 /**
  * Lock request message.
  */
@@ -48,6 +45,12 @@ public class GridDistributedLockRequest extends GridDistributedBaseMessage {
     /** */
     private static final long serialVersionUID = 0L;
 
+    /** Skip store flag bit mask. */
+    private static final int SKIP_STORE_FLAG_MASK = 0x01;
+
+    /** Keep binary flag. */
+    private static final int KEEP_BINARY_FLAG_MASK = 0x02;
+
     /** Sender node ID. */
     private UUID nodeId;
 
@@ -90,10 +93,7 @@ public class GridDistributedLockRequest extends GridDistributedBaseMessage {
     /** Key count. */
     private int txSize;
 
-    /**
-     * Additional flags.
-     * GridCacheUtils.SKIP_STORE_FLAG_MASK - for skipStore flag value.
-     */
+    /** Additional flags. */
     private byte flags;
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/a4c39707/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java
index 464df6e..e2b7803 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java
@@ -67,7 +67,6 @@ import org.apache.ignite.internal.processors.timeout.GridTimeoutObjectAdapter;
 import org.apache.ignite.internal.transactions.IgniteTxHeuristicCheckedException;
 import org.apache.ignite.internal.transactions.IgniteTxOptimisticCheckedException;
 import org.apache.ignite.internal.transactions.IgniteTxTimeoutCheckedException;
-import org.apache.ignite.internal.util.F0;
 import org.apache.ignite.internal.util.GridLeanSet;
 import org.apache.ignite.internal.util.future.GridCompoundFuture;
 import org.apache.ignite.internal.util.future.GridFutureAdapter;
@@ -373,8 +372,6 @@ public final class GridDhtTxPrepareFuture extends GridCacheCompoundFuture<Ignite
                     tx.nearOnOriginatingNode() || tx.hasInterceptor();
 
                 if (readOld) {
-                    cached.unswap(retVal);
-
                     boolean readThrough = !txEntry.skipStore() &&
                         (txEntry.op() == TRANSFORM || ((retVal || hasFilters) && cacheCtx.config().isLoadPreviousValue()));
 
@@ -482,7 +479,8 @@ public final class GridDhtTxPrepareFuture extends GridCacheCompoundFuture<Ignite
                 }
 
                 // Send old value in case if rebalancing is not finished.
-                final boolean sndOldVal = !cacheCtx.isLocal() && !cacheCtx.topology().rebalanceFinished(tx.topologyVersion());
+                final boolean sndOldVal = !cacheCtx.isLocal() &&
+                    !cacheCtx.topology().rebalanceFinished(tx.topologyVersion());
 
                 if (sndOldVal) {
                     if (oldVal == null && !readOld) {
@@ -499,11 +497,10 @@ public final class GridDhtTxPrepareFuture extends GridCacheCompoundFuture<Ignite
                             /*keepBinary*/true);
                     }
 
-                    if (oldVal != null) {
+                    if (oldVal != null)
                         oldVal.prepareMarshal(cacheCtx.cacheObjectContext());
 
-                        txEntry.oldValue(oldVal, true);
-                    }
+                    txEntry.oldValue(oldVal);
                 }
             }
             catch (IgniteCheckedException e) {
@@ -1532,21 +1529,6 @@ public final class GridDhtTxPrepareFuture extends GridCacheCompoundFuture<Ignite
     ) {
         GridDistributedTxMapping global = globalMap.get(n.id());
 
-        if (!F.isEmpty(entry.entryProcessors())) {
-            GridDhtPartitionState state = entry.context().topology().partitionState(n.id(),
-                entry.cached().partition());
-
-            if (state != GridDhtPartitionState.OWNING && state != GridDhtPartitionState.EVICTED) {
-                T2<GridCacheOperation, CacheObject> procVal = entry.entryProcessorCalculatedValue();
-
-                assert procVal != null : entry;
-
-                entry.op(procVal.get1());
-                entry.value(procVal.get2(), true, false);
-                entry.entryProcessors(null);
-            }
-        }
-
         if (global == null)
             globalMap.put(n.id(), global = new GridDistributedTxMapping(n));
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/a4c39707/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearSingleGetRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearSingleGetRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearSingleGetRequest.java
index ab0afb1..0faa8ec 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearSingleGetRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearSingleGetRequest.java
@@ -32,8 +32,6 @@ import org.apache.ignite.plugin.extensions.communication.MessageReader;
 import org.apache.ignite.plugin.extensions.communication.MessageWriter;
 import org.jetbrains.annotations.NotNull;
 
-import static org.apache.ignite.internal.processors.cache.GridCacheUtils.SKIP_STORE_FLAG_MASK;
-
 /**
  *
  */
@@ -212,7 +210,7 @@ public class GridNearSingleGetRequest extends GridCacheMessage implements GridCa
      * @return Read through flag.
      */
     public boolean readThrough() {
-        return (flags & SKIP_STORE_FLAG_MASK) != 0;
+        return (flags & READ_THROUGH_FLAG_MASK) != 0;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/a4c39707/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java
index d3b39bd..5cba0cf 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java
@@ -83,6 +83,7 @@ import static org.apache.ignite.internal.processors.cache.GridCacheOperation.CRE
 import static org.apache.ignite.internal.processors.cache.GridCacheOperation.DELETE;
 import static org.apache.ignite.internal.processors.cache.GridCacheOperation.NOOP;
 import static org.apache.ignite.internal.processors.cache.GridCacheOperation.RELOAD;
+import static org.apache.ignite.internal.processors.cache.GridCacheOperation.TRANSFORM;
 import static org.apache.ignite.internal.processors.cache.GridCacheOperation.UPDATE;
 import static org.apache.ignite.transactions.TransactionConcurrency.OPTIMISTIC;
 import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC;
@@ -1381,6 +1382,8 @@ public abstract class IgniteTxAdapter extends GridMetadataAwareAdapter implement
         IgniteTxEntry txEntry,
         boolean metrics,
         @Nullable GridCacheReturn ret) throws GridCacheEntryRemovedException, IgniteCheckedException {
+        assert txEntry.op() != TRANSFORM || !F.isEmpty(txEntry.entryProcessors()) : txEntry;
+
         GridCacheContext cacheCtx = txEntry.context();
 
         assert cacheCtx != null;
@@ -1404,18 +1407,25 @@ public abstract class IgniteTxAdapter extends GridMetadataAwareAdapter implement
 
             final boolean keepBinary = txEntry.keepBinary();
 
-            CacheObject cacheVal = txEntry.hasValue() ? txEntry.value() :
-                txEntry.cached().innerGet(
+            CacheObject cacheVal;
+
+            if (txEntry.hasValue())
+                cacheVal = txEntry.value();
+            else if (txEntry.hasOldValue())
+                cacheVal = txEntry.oldValue();
+            else {
+                cacheVal = txEntry.cached().innerGet(
                     null,
                     this,
                     /*read through*/false,
                     /*metrics*/metrics,
                     /*event*/recordEvt,
                     /*subjId*/subjId,
-                    /**closure name */recordEvt ? F.first(txEntry.entryProcessors()).get1() : null,
+                    /*closure name */recordEvt ? F.first(txEntry.entryProcessors()).get1() : null,
                     resolveTaskName(),
                     null,
                     keepBinary);
+            }
 
             boolean modified = false;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/a4c39707/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java
index 1f8a107..163ed99 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java
@@ -37,7 +37,6 @@ import org.apache.ignite.internal.processors.cache.GridCacheEntryEx;
 import org.apache.ignite.internal.processors.cache.GridCacheEntryRemovedException;
 import org.apache.ignite.internal.processors.cache.GridCacheOperation;
 import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
-import org.apache.ignite.internal.processors.cache.GridCacheUtils;
 import org.apache.ignite.internal.processors.cache.KeyCacheObject;
 import org.apache.ignite.internal.processors.cache.distributed.IgniteExternalizableExpiryPolicy;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
@@ -57,9 +56,6 @@ import org.jetbrains.annotations.Nullable;
 
 import static org.apache.ignite.internal.processors.cache.GridCacheOperation.READ;
 import static org.apache.ignite.internal.processors.cache.GridCacheOperation.TRANSFORM;
-import static org.apache.ignite.internal.processors.cache.GridCacheUtils.KEEP_BINARY_FLAG_MASK;
-import static org.apache.ignite.internal.processors.cache.GridCacheUtils.OLD_VAL_ON_PRIMARY;
-import static org.apache.ignite.internal.processors.cache.GridCacheUtils.SKIP_STORE_FLAG_MASK;
 
 /**
  * Transaction entry. Note that it is essential that this class does not override
@@ -83,6 +79,15 @@ public class IgniteTxEntry implements GridPeerDeployAware, Message {
     /** */
     public static final GridCacheVersion GET_ENTRY_INVALID_VER_AFTER_GET = new GridCacheVersion(0, 0, 3);
 
+    /** Skip store flag bit mask. */
+    private static final int TX_ENTRY_SKIP_STORE_FLAG_MASK = 0x01;
+
+    /** Keep binary flag. */
+    private static final int TX_ENTRY_KEEP_BINARY_FLAG_MASK = 0x02;
+
+    /** Flag indicating that old value for 'invoke' operation was non null on primary node. */
+    private static final int TX_ENTRY_OLD_VAL_ON_PRIMARY = 0x04;
+
     /** Prepared flag updater. */
     private static final AtomicIntegerFieldUpdater<IgniteTxEntry> PREPARED_UPD =
         AtomicIntegerFieldUpdater.newUpdater(IgniteTxEntry.class, "prepared");
@@ -194,13 +199,7 @@ public class IgniteTxEntry implements GridPeerDeployAware, Message {
     /** Expiry policy bytes. */
     private byte[] expiryPlcBytes;
 
-    /**
-     * Additional flags:
-     * <ul>
-     * <li>{@link GridCacheUtils#SKIP_STORE_FLAG_MASK} - for skipStore flag value.</li>
-     * <li>{@link GridCacheUtils#KEEP_BINARY_FLAG_MASK} - for withKeepBinary flag.</li>
-     * </ul>
-     */
+    /** Additional flags. */
     private byte flags;
 
     /** Partition update counter. */
@@ -484,28 +483,28 @@ public class IgniteTxEntry implements GridPeerDeployAware, Message {
      * @param skipStore Skip store flag.
      */
     public void skipStore(boolean skipStore) {
-        setFlag(skipStore, SKIP_STORE_FLAG_MASK);
+        setFlag(skipStore, TX_ENTRY_SKIP_STORE_FLAG_MASK);
     }
 
     /**
      * @return Skip store flag.
      */
     public boolean skipStore() {
-        return isFlag(SKIP_STORE_FLAG_MASK);
+        return isFlag(TX_ENTRY_SKIP_STORE_FLAG_MASK);
     }
 
     /**
      * @param oldValOnPrimary {@code True} If old value for was non null on primary node.
      */
     public void oldValueOnPrimary(boolean oldValOnPrimary) {
-        setFlag(oldValOnPrimary, OLD_VAL_ON_PRIMARY);
+        setFlag(oldValOnPrimary, TX_ENTRY_OLD_VAL_ON_PRIMARY);
     }
 
     /**
      * @return {@code True} If old value for 'invoke' operation was non null on primary node.
      */
-    public boolean oldValueOnPrimary() {
-        return isFlag(OLD_VAL_ON_PRIMARY);
+    boolean oldValueOnPrimary() {
+        return isFlag(TX_ENTRY_OLD_VAL_ON_PRIMARY);
     }
 
     /**
@@ -514,14 +513,14 @@ public class IgniteTxEntry implements GridPeerDeployAware, Message {
      * @param keepBinary Keep binary flag value.
      */
     public void keepBinary(boolean keepBinary) {
-        setFlag(keepBinary, KEEP_BINARY_FLAG_MASK);
+        setFlag(keepBinary, TX_ENTRY_KEEP_BINARY_FLAG_MASK);
     }
 
     /**
      * @return Keep binary flag value.
      */
     public boolean keepBinary() {
-        return isFlag(KEEP_BINARY_FLAG_MASK);
+        return isFlag(TX_ENTRY_KEEP_BINARY_FLAG_MASK);
     }
 
     /**
@@ -588,11 +587,11 @@ public class IgniteTxEntry implements GridPeerDeployAware, Message {
     /**
      * @param oldVal Old value.
      */
-    public void oldValue(CacheObject oldVal, boolean hasOldVal) {
+    public void oldValue(CacheObject oldVal) {
         if (this.oldVal == null)
             this.oldVal = new TxEntryValueHolder();
 
-        this.oldVal.value(op(), oldVal, hasOldVal, hasOldVal);
+        this.oldVal.value(op(), oldVal, true, true);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/a4c39707/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/meta/IgfsMetaDirectoryListingAddProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/meta/IgfsMetaDirectoryListingAddProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/meta/IgfsMetaDirectoryListingAddProcessor.java
index 380d997..2e7ecae 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/meta/IgfsMetaDirectoryListingAddProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/meta/IgfsMetaDirectoryListingAddProcessor.java
@@ -80,17 +80,18 @@ public final class IgfsMetaDirectoryListingAddProcessor implements EntryProcesso
     @Override public Void process(MutableEntry<IgniteUuid, IgfsEntryInfo> e, Object... args) {
         IgfsEntryInfo fileInfo = e.getValue();
 
-        assert fileInfo.isDirectory();
+        assert fileInfo != null && fileInfo.isDirectory() : fileInfo;
 
         Map<String, IgfsListingEntry> listing = new HashMap<>(fileInfo.listing());
 
         // Modify listing in-place.
         IgfsListingEntry oldEntry = listing.put(fileName, entry);
 
-        if (oldEntry != null && !oldEntry.fileId().equals(entry.fileId()))
+        if (oldEntry != null && !oldEntry.fileId().equals(entry.fileId())) {
             throw new IgniteException("Directory listing contains unexpected file" +
                 " [listing=" + listing + ", fileName=" + fileName + ", entry=" + entry +
                 ", oldEntry=" + oldEntry + ']');
+        }
 
         e.setValue(fileInfo.listing(listing));
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/a4c39707/modules/core/src/test/java/org/apache/ignite/internal/TestRecordingCommunicationSpi.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/TestRecordingCommunicationSpi.java b/modules/core/src/test/java/org/apache/ignite/internal/TestRecordingCommunicationSpi.java
index c3d26b7..aa0cc09 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/TestRecordingCommunicationSpi.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/TestRecordingCommunicationSpi.java
@@ -24,6 +24,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.internal.managers.communication.GridIoMessage;
@@ -60,6 +61,14 @@ public class TestRecordingCommunicationSpi extends TcpCommunicationSpi {
     /** */
     private IgnitePredicate<GridIoMessage> blockP;
 
+    /**
+     * @param node Node.
+     * @return Test SPI.
+     */
+    public static TestRecordingCommunicationSpi spi(Ignite node) {
+        return (TestRecordingCommunicationSpi)node.configuration().getCommunicationSpi();
+    }
+
     /** {@inheritDoc} */
     @Override public void sendMessage(ClusterNode node, Message msg, IgniteInClosure<IgniteException> ackC)
         throws IgniteSpiException {

http://git-wip-us.apache.org/repos/asf/ignite/blob/a4c39707/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteOnePhaseCommitInvokeTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteOnePhaseCommitInvokeTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteOnePhaseCommitInvokeTest.java
new file mode 100644
index 0000000..601c067
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteOnePhaseCommitInvokeTest.java
@@ -0,0 +1,213 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import java.util.concurrent.Callable;
+import javax.cache.processor.MutableEntry;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.cache.CacheEntryProcessor;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.IgniteInternalFuture;
+import org.apache.ignite.internal.TestRecordingCommunicationSpi;
+import org.apache.ignite.internal.managers.communication.GridIoMessage;
+import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareResponse;
+import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionSupplyMessage;
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.internal.CU;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.lang.IgnitePredicate;
+import org.apache.ignite.plugin.extensions.communication.Message;
+import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
+import org.apache.ignite.testframework.GridTestUtils;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+
+import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL;
+import static org.apache.ignite.cache.CacheRebalanceMode.ASYNC;
+import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
+
+/**
+ *
+ */
+public class IgniteOnePhaseCommitInvokeTest extends GridCommonAbstractTest {
+    /** */
+    private static final TcpDiscoveryIpFinder ipFinder = new TcpDiscoveryVmIpFinder(true);
+
+    /** */
+    private boolean client;
+
+    /** */
+    private static final String CACHE_NAME = "testCache";
+
+    /** {@inheritDoc} */
+    @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception {
+        IgniteConfiguration cfg = super.getConfiguration(gridName);
+
+        ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setIpFinder(ipFinder);
+
+        TestRecordingCommunicationSpi commSpi = new TestRecordingCommunicationSpi();
+
+        cfg.setCommunicationSpi(commSpi);
+
+        cfg.setClientMode(client);
+
+        CacheConfiguration ccfg = new CacheConfiguration();
+
+        ccfg.setName(CACHE_NAME);
+        ccfg.setAtomicityMode(TRANSACTIONAL);
+        ccfg.setBackups(1);
+        ccfg.setRebalanceMode(ASYNC);
+        ccfg.setWriteSynchronizationMode(FULL_SYNC);
+
+        cfg.setCacheConfiguration(ccfg);
+
+        return cfg;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        stopAllGrids();
+
+        super.afterTest();
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testOnePhaseInvoke() throws Exception {
+        boolean flags[] = {true, false};
+
+        for (boolean withOldVal : flags) {
+            for (boolean setVal : flags) {
+                for (boolean retPrev : flags) {
+                    onePhaseInvoke(withOldVal, setVal, retPrev);
+
+                    stopAllGrids();
+                }
+            }
+        }
+    }
+
+    /**
+     * @param withOldVal If {@code true}
+     * @param setVal Flag whether set value from entry processor.
+     * @param retPrev Flag whether entry processor should return previous value.
+     * @throws Exception If failed.
+     */
+    private void onePhaseInvoke(final boolean withOldVal,
+        final boolean setVal,
+        final boolean retPrev)
+        throws Exception
+    {
+        log.info("Test onePhaseInvoke [withOldVal=" + withOldVal + ", setVal=" + setVal + ", retPrev=" + retPrev + ']');
+
+        Ignite srv0 = startGrid(0);
+
+        if (withOldVal)
+            srv0.cache(CACHE_NAME).put(1, 1);
+
+        client = true;
+
+        final Ignite clientNode = startGrid(1);
+
+        TestRecordingCommunicationSpi.spi(srv0).blockMessages(new IgnitePredicate<GridIoMessage>() {
+            @Override public boolean apply(GridIoMessage msg0) {
+                Message msg = msg0.message();
+
+                return msg instanceof GridDhtPartitionSupplyMessage &&
+                    ((GridDhtPartitionSupplyMessage)msg).cacheId() == CU.cacheId(CACHE_NAME);
+            }
+        });
+
+        client = false;
+
+        Ignite srv1 = startGrid(2);
+
+        TestRecordingCommunicationSpi.spi(srv1).blockMessages(GridDhtTxPrepareResponse.class, srv0.name());
+
+        IgniteInternalFuture<?> fut = GridTestUtils.runAsync(new Callable<Void>() {
+            @Override public Void call() throws Exception {
+                Object res = clientNode.cache(CACHE_NAME).invoke(1, new TestEntryProcessor(setVal, retPrev));
+
+                Object expRes;
+
+                if (retPrev)
+                    expRes = withOldVal ? 1 : null;
+                else
+                    expRes = null;
+
+                assertEquals(expRes, res);
+
+                return null;
+            }
+        });
+
+        U.sleep(1000);
+
+        stopGrid(0);
+
+        fut.get();
+
+        if (!setVal)
+            checkCacheData(F.asMap(1, null), CACHE_NAME);
+        else {
+            Object expVal;
+
+            if (setVal)
+                expVal = 2;
+            else
+                expVal = withOldVal ? 1 : null;
+
+            checkCacheData(F.asMap(1, expVal), CACHE_NAME);
+        }
+
+        checkOnePhaseCommitReturnValuesCleaned(-1);
+    }
+
+    /**
+     *
+     */
+    static class TestEntryProcessor implements CacheEntryProcessor {
+        /** */
+        private final boolean setVal;
+
+        /** */
+        private final boolean retPrev;
+
+        /**
+         * @param setVal Set value flag.
+         * @param retPrev Return previous value flag.
+         */
+        TestEntryProcessor(boolean setVal, boolean retPrev) {
+            this.setVal = setVal;
+            this.retPrev = retPrev;
+        }
+
+        /** {@inheritDoc} */
+        @Override public Object process(MutableEntry e, Object... args) {
+            Object val = e.getValue();
+
+            if (setVal)
+                e.setValue(2);
+
+            return retPrev ? val : null;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/a4c39707/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCachePutRetryAbstractSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCachePutRetryAbstractSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCachePutRetryAbstractSelfTest.java
index ca55a47..abec33c 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCachePutRetryAbstractSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCachePutRetryAbstractSelfTest.java
@@ -443,13 +443,13 @@ public abstract class IgniteCachePutRetryAbstractSelfTest extends GridCommonAbst
     private void checkInternalCleanup() throws Exception{
         checkNoAtomicFutures();
 
-        checkOnePhaseCommitReturnValuesCleaned();
+        checkOnePhaseCommitReturnValuesCleaned(GRID_CNT);
     }
 
     /**
      * @throws Exception If failed.
      */
-    void checkNoAtomicFutures() throws Exception {
+    private void checkNoAtomicFutures() throws Exception {
         for (int i = 0; i < GRID_CNT; i++) {
             final IgniteKernal ignite = (IgniteKernal)grid(i);
 
@@ -468,27 +468,6 @@ public abstract class IgniteCachePutRetryAbstractSelfTest extends GridCommonAbst
     /**
      * @throws Exception If failed.
      */
-    void checkOnePhaseCommitReturnValuesCleaned() throws Exception {
-        U.sleep(DEFERRED_ONE_PHASE_COMMIT_ACK_REQUEST_TIMEOUT);
-
-        for (int i = 0; i < GRID_CNT; i++) {
-            IgniteKernal ignite = (IgniteKernal)grid(i);
-
-            IgniteTxManager tm = ignite.context().cache().context().tm();
-
-            Map completedVersHashMap = U.field(tm, "completedVersHashMap");
-
-            for (Object o : completedVersHashMap.values()) {
-                assertTrue("completedVersHashMap contains" + o.getClass() + " instead of boolean. " +
-                    "These values should be replaced by boolean after onePhaseCommit finished. " +
-                    "[node=" + i + "]", o instanceof Boolean);
-            }
-        }
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
     public void testFailsWithNoRetries() throws Exception {
         checkFailsWithNoRetries(false);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/a4c39707/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCachePutRetryTransactionalSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCachePutRetryTransactionalSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCachePutRetryTransactionalSelfTest.java
index b439bcc..8e4b3a4 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCachePutRetryTransactionalSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCachePutRetryTransactionalSelfTest.java
@@ -260,7 +260,7 @@ public class IgniteCachePutRetryTransactionalSelfTest extends IgniteCachePutRetr
             fut2.get();
         }
 
-        checkOnePhaseCommitReturnValuesCleaned();
+        checkOnePhaseCommitReturnValuesCleaned(GRID_CNT);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/a4c39707/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/IgniteCacheAtomicProtocolTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/IgniteCacheAtomicProtocolTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/IgniteCacheAtomicProtocolTest.java
index dfb3f65..29d67e2 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/IgniteCacheAtomicProtocolTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/IgniteCacheAtomicProtocolTest.java
@@ -763,21 +763,7 @@ public class IgniteCacheAtomicProtocolTest extends GridCommonAbstractTest {
      * @param expData Expected cache data.
      */
     private void checkData(Map<Integer, Integer> expData) {
-        assert !expData.isEmpty();
-
-        List<Ignite> nodes = G.allGrids();
-
-        assertFalse(nodes.isEmpty());
-
-        for (Ignite node : nodes) {
-            IgniteCache<Integer, Integer> cache = node.cache(TEST_CACHE);
-
-            for (Map.Entry<Integer, Integer> e : expData.entrySet()) {
-                assertEquals("Invalid value [key=" + e.getKey() + ", node=" + node.name() + ']',
-                    e.getValue(),
-                    cache.get(e.getKey()));
-            }
-        }
+        checkCacheData(expData, TEST_CACHE);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/a4c39707/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java
index af623da..8a7150d 100644
--- a/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java
@@ -2024,10 +2024,9 @@ public abstract class GridAbstractTest extends TestCase {
     }
 
     /**
-     *
-     * @throws IgniteInterruptedCheckedException
+     * @throws IgniteInterruptedCheckedException If interrupted.
      */
-    public void awaitTopologyChange() throws IgniteInterruptedCheckedException {
+    private void awaitTopologyChange() throws IgniteInterruptedCheckedException {
         for (Ignite g : G.allGrids()) {
             final GridKernalContext ctx = ((IgniteKernal)g).context();
 
@@ -2038,7 +2037,9 @@ public abstract class GridAbstractTest extends TestCase {
             AffinityTopologyVersion exchVer = ctx.cache().context().exchange().readyAffinityVersion();
 
             if (! topVer.equals(exchVer)) {
-                info("topology version mismatch: node "  + g.name() + " " + exchVer + ", " + topVer);
+                info("Topology version mismatch [node="  + g.name() +
+                    ", exchVer=" + exchVer +
+                    ", topVer=" + topVer + ']');
 
                 GridTestUtils.waitForCondition(new GridAbsPredicate() {
                     @Override public boolean apply() {

http://git-wip-us.apache.org/repos/asf/ignite/blob/a4c39707/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
index cef35e5..c76c83e 100644
--- a/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
@@ -80,7 +80,9 @@ import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.Gri
 import org.apache.ignite.internal.processors.cache.distributed.near.GridNearCacheAdapter;
 import org.apache.ignite.internal.processors.cache.local.GridLocalCache;
 import org.apache.ignite.internal.processors.cache.transactions.IgniteInternalTx;
+import org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager;
 import org.apache.ignite.internal.util.IgniteUtils;
+import org.apache.ignite.internal.util.lang.GridAbsPredicate;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.G;
 import org.apache.ignite.internal.util.typedef.PA;
@@ -1577,4 +1579,81 @@ public abstract class GridCommonAbstractTest extends GridAbstractTest {
             .setEnforceJoinOrder(qry.isEnforceJoinOrder()))
             .getAll().get(0).get(0);
     }
+
+    /**
+     * @param expData Expected cache data.
+     * @param cacheName Cache name.
+     */
+    protected final void checkCacheData(Map<?, ?> expData, String cacheName) {
+        assert !expData.isEmpty();
+
+        List<Ignite> nodes = G.allGrids();
+
+        assertFalse(nodes.isEmpty());
+
+        for (Ignite node : nodes) {
+            IgniteCache<Object, Object> cache = node.cache(cacheName);
+
+            for (Map.Entry<?, ?> e : expData.entrySet()) {
+                assertEquals("Invalid value [key=" + e.getKey() + ", node=" + node.name() + ']',
+                    e.getValue(),
+                    cache.get(e.getKey()));
+            }
+        }
+    }
+
+    /**
+     * @param nodesCnt Expected nodes number or {@code -1} to use all nodes.
+     * @throws Exception If failed.
+     */
+    protected final void checkOnePhaseCommitReturnValuesCleaned(final int nodesCnt) throws Exception {
+        final List<Ignite> nodes;
+
+        if (nodesCnt == -1) {
+            nodes = G.allGrids();
+
+            assertTrue(nodes.size() > 0);
+        }
+        else {
+            nodes = new ArrayList<>(nodesCnt);
+
+            for (int i = 0; i < nodesCnt; i++)
+                nodes.add(grid(i));
+        }
+
+        GridTestUtils.waitForCondition(new GridAbsPredicate() {
+            @Override public boolean apply() {
+                for (Ignite node : nodes) {
+                    Map completedVersHashMap = completedTxsMap(node);
+
+                    for (Object o : completedVersHashMap.values()) {
+                        if (!(o instanceof Boolean))
+                            return false;
+                    }
+                }
+
+                return true;
+            }
+        }, 5000);
+
+        for (Ignite node : nodes) {
+            Map completedVersHashMap = completedTxsMap(node);
+
+            for (Object o : completedVersHashMap.values()) {
+                assertTrue("completedVersHashMap contains " + o.getClass().getName() + " instead of boolean. " +
+                    "These values should be replaced by boolean after onePhaseCommit finished. " +
+                    "[node=" + node.name() + "]", o instanceof Boolean);
+            }
+        }
+    }
+
+    /**
+     * @param ignite Node.
+     * @return Completed txs map.
+     */
+    private Map completedTxsMap(Ignite ignite) {
+        IgniteTxManager tm = ((IgniteKernal)ignite).context().cache().context().tm();
+
+        return U.field(tm, "completedVersHashMap");
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/a4c39707/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite2.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite2.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite2.java
index 62e6b78..89e8f01 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite2.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite2.java
@@ -42,6 +42,7 @@ import org.apache.ignite.internal.processors.cache.IgniteCacheEntryProcessorNode
 import org.apache.ignite.internal.processors.cache.IgniteCacheIncrementTxTest;
 import org.apache.ignite.internal.processors.cache.IgniteCachePartitionMapUpdateTest;
 import org.apache.ignite.internal.processors.cache.IgniteDynamicCacheAndNodeStop;
+import org.apache.ignite.internal.processors.cache.IgniteOnePhaseCommitInvokeTest;
 import org.apache.ignite.internal.processors.cache.MemoryPolicyConfigValidationTest;
 import org.apache.ignite.internal.processors.cache.distributed.CacheLoadingConcurrentGridStartSelfTest;
 import org.apache.ignite.internal.processors.cache.distributed.CacheLoadingConcurrentGridStartSelfTestAllowOverwrite;
@@ -262,6 +263,8 @@ public class IgniteCacheTestSuite2 extends TestSuite {
 
         suite.addTest(new TestSuite(GridNearCacheStoreUpdateTest.class));
 
+        suite.addTest(new TestSuite(IgniteOnePhaseCommitInvokeTest.class));
+
         return suite;
     }
 }


[49/70] [abbrv] ignite git commit: IGNITE-5001 .NET: Tests cleanup

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/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 8db4876..9f1ae68 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/SerializableClosureTaskTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/SerializableClosureTaskTest.cs
@@ -25,6 +25,7 @@ namespace Apache.Ignite.Core.Tests.Compute
     /// <summary>
     /// Closure execution tests for serializable objects.
     /// </summary>
+    [TestFixture]
     public class SerializableClosureTaskTest : ClosureTaskTest
     {
         /// <summary>

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/TaskAdapterTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/TaskAdapterTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/TaskAdapterTest.cs
index 32a28a7..8d23fc4 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/TaskAdapterTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/TaskAdapterTest.cs
@@ -100,12 +100,6 @@ namespace Apache.Ignite.Core.Tests.Compute
             }
         }
 
-        /** <inheritDoc /> */
-        protected override ICollection<Type> GetBinaryTypes()
-        {
-            return new[] { typeof(BinarizableJob) };
-        }
-
         /// <summary>
         /// Test task.
         /// </summary>

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/TaskResultTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/TaskResultTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/TaskResultTest.cs
index 289b68b..2fb698f 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/TaskResultTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/TaskResultTest.cs
@@ -154,18 +154,6 @@ namespace Apache.Ignite.Core.Tests.Compute
             Assert.AreEqual(101 * 1024, res.Length);
         }
 
-        /** <inheritDoc /> */
-        protected override ICollection<Type> GetBinaryTypes()
-        {
-            return new[]
-            {
-                typeof(BinarizableResult),
-                typeof(TestBinarizableJob),
-                typeof(BinarizableOutFunc),
-                typeof(BinarizableFunc)
-            };
-        }
-
         [Test]
         public void TestOutFuncResultPrimitive1()
         {

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Dataload/DataStreamerTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Dataload/DataStreamerTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Dataload/DataStreamerTest.cs
index 33c7704..eb025f6 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Dataload/DataStreamerTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Dataload/DataStreamerTest.cs
@@ -25,8 +25,6 @@ namespace Apache.Ignite.Core.Tests.Dataload
     using Apache.Ignite.Core.Binary;
     using Apache.Ignite.Core.Cache;
     using Apache.Ignite.Core.Datastream;
-    using Apache.Ignite.Core.Impl;
-    using Apache.Ignite.Core.Tests.Cache;
     using NUnit.Framework;
 
     /// <summary>
@@ -34,9 +32,6 @@ namespace Apache.Ignite.Core.Tests.Dataload
     /// </summary>
     public sealed class DataStreamerTest
     {
-        /** Node name. */
-        private const string GridName = "grid";
-
         /** Cache name. */
         private const string CacheName = "partitioned";
 
@@ -52,15 +47,18 @@ namespace Apache.Ignite.Core.Tests.Dataload
         [TestFixtureSetUp]
         public void InitClient()
         {
-            _grid = Ignition.Start(GetIgniteConfiguration(GridName));
+            _grid = Ignition.Start(TestUtils.GetTestConfiguration());
 
-            Ignition.Start(GetIgniteConfiguration(GridName + "_1"));
+            Ignition.Start(new IgniteConfiguration(TestUtils.GetTestConfiguration())
+            {
+                IgniteInstanceName = "grid1"
+            });
 
-            _cache = _grid.GetCache<int, int?>(CacheName);
+            _cache = _grid.CreateCache<int, int?>(CacheName);
         }
 
         /// <summary>
-        ///
+        /// Fixture teardown.
         /// </summary>
         [TestFixtureTearDown]
         public void StopGrids()
@@ -458,45 +456,6 @@ namespace Apache.Ignite.Core.Tests.Dataload
         }
 
         /// <summary>
-        /// Gets the Ignite configuration.
-        /// </summary>
-        /// <param name="gridName">Grid name.</param>
-        private static IgniteConfiguration GetIgniteConfiguration(string gridName)
-        {
-            return new IgniteConfiguration
-            {
-                IgniteInstanceName = gridName,
-                SpringConfigUrl = "config\\native-client-test-cache.xml",
-                JvmClasspath = TestUtils.CreateTestClasspath(),
-                BinaryConfiguration = new BinaryConfiguration
-                {
-                    TypeConfigurations = new List<BinaryTypeConfiguration>
-                    {
-                        new BinaryTypeConfiguration(typeof (CacheTestKey)),
-                        new BinaryTypeConfiguration(typeof (TestReferenceObject)),
-                        new BinaryTypeConfiguration(typeof (StreamReceiverBinarizable)),
-                        new BinaryTypeConfiguration(typeof (EntryProcessorBinarizable)),
-                        new BinaryTypeConfiguration(typeof (BinarizableEntry))
-                    }
-                },
-                JvmOptions = TestUtils.TestJavaOptions().Concat(new[]
-                {
-                    "-Xms3096m",
-                    "-Xmx3096m",
-                    "-XX:+UseParNewGC",
-                    "-XX:+UseConcMarkSweepGC",
-                    "-XX:+UseTLAB",
-                    "-XX:NewSize=128m",
-                    "-XX:MaxNewSize=128m",
-                    "-XX:MaxTenuringThreshold=0",
-                    "-XX:SurvivorRatio=1024",
-                    "-XX:+UseCMSInitiatingOccupancyOnly",
-                    "-XX:CMSInitiatingOccupancyFraction=60"
-                }).ToArray()
-            };
-        }
-
-        /// <summary>
         /// Test binarizable receiver.
         /// </summary>
         private class StreamReceiverBinarizable : IStreamReceiver<int, int>

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/DeploymentTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/DeploymentTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/DeploymentTest.cs
index 5f2ecfa..74da531 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/DeploymentTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/DeploymentTest.cs
@@ -125,11 +125,9 @@ namespace Apache.Ignite.Core.Tests
         /// </summary>
         private static void VerifyNodeStarted(string exePath)
         {
-            using (var ignite = Ignition.Start(new IgniteConfiguration
+            using (var ignite = Ignition.Start(new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
                 SpringConfigUrl = "config\\compute\\compute-grid1.xml",
-                JvmClasspath = TestUtils.CreateTestClasspath(),
-                JvmOptions = TestUtils.TestJavaOptions()
             }))
             {
                 Assert.IsTrue(ignite.WaitTopology(2));

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/EventsTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/EventsTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/EventsTest.cs
index 6f0e2d1..545a5c5 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/EventsTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/EventsTest.cs
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+// ReSharper disable MemberCanBePrivate.Global
+// ReSharper disable UnusedParameter.Global
 #pragma warning disable 618
 namespace Apache.Ignite.Core.Tests
 {
@@ -24,7 +26,7 @@ namespace Apache.Ignite.Core.Tests
     using System.Linq;
     using System.Threading;
     using System.Threading.Tasks;
-    using Apache.Ignite.Core.Binary;
+    using Apache.Ignite.Core.Cache.Configuration;
     using Apache.Ignite.Core.Cache.Query;
     using Apache.Ignite.Core.Cluster;
     using Apache.Ignite.Core.Common;
@@ -691,21 +693,14 @@ namespace Apache.Ignite.Core.Tests
         /// <summary>
         /// Gets the Ignite configuration.
         /// </summary>
-        private static IgniteConfiguration GetConfiguration(string springConfigUrl)
+        private static IgniteConfiguration GetConfiguration(string name, bool client = false)
         {
-            return new IgniteConfiguration
+            return new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
-                SpringConfigUrl = springConfigUrl,
-                JvmClasspath = TestUtils.CreateTestClasspath(),
-                JvmOptions = TestUtils.TestJavaOptions(),
-                BinaryConfiguration = new BinaryConfiguration
-                {
-                    TypeConfigurations = new List<BinaryTypeConfiguration>
-                    {
-                        new BinaryTypeConfiguration(typeof (RemoteEventBinarizableFilter))
-                    }
-                },
-                EventStorageSpi = new MemoryEventStorageSpi()
+                IgniteInstanceName = name,
+                EventStorageSpi = new MemoryEventStorageSpi(),
+                CacheConfiguration = new [] {new CacheConfiguration() },
+                ClientMode = client
             };
         }
 
@@ -792,9 +787,9 @@ namespace Apache.Ignite.Core.Tests
             if (_grid1 != null)
                 return;
 
-            _grid1 = Ignition.Start(GetConfiguration("config\\compute\\compute-grid1.xml"));
-            _grid2 = Ignition.Start(GetConfiguration("config\\compute\\compute-grid2.xml"));
-            _grid3 = Ignition.Start(GetConfiguration("config\\compute\\compute-grid3.xml"));
+            _grid1 = Ignition.Start(GetConfiguration("grid1"));
+            _grid2 = Ignition.Start(GetConfiguration("grid2"));
+            _grid3 = Ignition.Start(GetConfiguration("grid3", true));
 
             _grids = new[] {_grid1, _grid2, _grid3};
         }
@@ -975,42 +970,6 @@ namespace Apache.Ignite.Core.Tests
     }
 
     /// <summary>
-    /// Binary remote event filter.
-    /// </summary>
-    public class RemoteEventBinarizableFilter : IEventFilter<IEvent>, IBinarizable
-    {
-        /** */
-        private int _type;
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="RemoteEventBinarizableFilter"/> class.
-        /// </summary>
-        /// <param name="type">The event type.</param>
-        public RemoteEventBinarizableFilter(int type)
-        {
-            _type = type;
-        }
-
-        /** <inheritdoc /> */
-        public bool Invoke(IEvent evt)
-        {
-            return evt.Type == _type;
-        }
-
-        /** <inheritdoc /> */
-        public void WriteBinary(IBinaryWriter writer)
-        {
-            writer.GetRawWriter().WriteInt(_type);
-        }
-
-        /** <inheritdoc /> */
-        public void ReadBinary(IBinaryReader reader)
-        {
-            _type = reader.GetRawReader().ReadInt();
-        }
-    }
-
-    /// <summary>
     /// Event test case.
     /// </summary>
     public class EventTestCase

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ExceptionsTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ExceptionsTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ExceptionsTest.cs
index 7217e1a..d84e6dc 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ExceptionsTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ExceptionsTest.cs
@@ -340,7 +340,7 @@ namespace Apache.Ignite.Core.Tests
         {
             using (var grid = StartGrid())
             {
-                var cache = grid.GetCache<TK, int>("partitioned_atomic").WithNoRetries();
+                var cache = grid.GetOrCreateCache<TK, int>("partitioned_atomic").WithNoRetries();
 
                 if (typeof (TK) == typeof (IBinaryObject))
                     cache = cache.WithKeepBinary<TK, int>();
@@ -416,11 +416,8 @@ namespace Apache.Ignite.Core.Tests
         /// </summary>
         private static IIgnite StartGrid(string gridName = null)
         {
-            return Ignition.Start(new IgniteConfiguration
+            return Ignition.Start(new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
-                SpringConfigUrl = "config\\native-client-test-cache.xml",
-                JvmOptions = TestUtils.TestJavaOptions(),
-                JvmClasspath = TestUtils.CreateTestClasspath(),
                 IgniteInstanceName = gridName,
                 BinaryConfiguration = new BinaryConfiguration
                 {
@@ -458,7 +455,8 @@ namespace Apache.Ignite.Core.Tests
             /** <inheritDoc /> */
             public override bool Equals(object obj)
             {
-                return obj is BinarizableEntry && ((BinarizableEntry)obj)._val == _val;
+                var entry = obj as BinarizableEntry;
+                return entry != null && entry._val == _val;
             }
         }
 
@@ -489,7 +487,8 @@ namespace Apache.Ignite.Core.Tests
             /** <inheritDoc /> */
             public override bool Equals(object obj)
             {
-                return obj is SerializableEntry && ((SerializableEntry)obj)._val == _val;
+                var entry = obj as SerializableEntry;
+                return entry != null && entry._val == _val;
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ExecutableTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ExecutableTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ExecutableTest.cs
index dbac120..8f422f4 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ExecutableTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ExecutableTest.cs
@@ -38,7 +38,7 @@ namespace Apache.Ignite.Core.Tests
     public class ExecutableTest
     {
         /** Spring configuration path. */
-        private static readonly string SpringCfgPath = "config\\compute\\compute-standalone.xml";
+        private const string SpringCfgPath = "config\\compute\\compute-standalone.xml";
 
         /** Min memory Java task. */
         private const string MinMemTask = "org.apache.ignite.platform.PlatformMinMemoryTask";
@@ -57,7 +57,18 @@ namespace Apache.Ignite.Core.Tests
         {
             TestUtils.KillProcesses();
 
-            _grid = Ignition.Start(Configuration(SpringCfgPath));
+            _grid = Ignition.Start(new IgniteConfiguration(TestUtils.GetTestConfiguration())
+            {
+                BinaryConfiguration = new BinaryConfiguration
+                {
+                    TypeConfigurations = new List<BinaryTypeConfiguration>
+                    {
+                        new BinaryTypeConfiguration(typeof(RemoteConfiguration)),
+                        new BinaryTypeConfiguration(typeof(RemoteConfigurationClosure))
+                    }
+                },
+                SpringConfigUrl = SpringCfgPath
+            });
 
             Assert.IsTrue(_grid.WaitTopology(1));
 
@@ -354,48 +365,6 @@ namespace Apache.Ignite.Core.Tests
         }
 
         /// <summary>
-        /// Configuration for node.
-        /// </summary>
-        /// <param name="path">Path to Java XML configuration.</param>
-        /// <returns>Node configuration.</returns>
-        private static IgniteConfiguration Configuration(string path)
-        {
-            var cfg = new IgniteConfiguration();
-
-
-            var portCfg = new BinaryConfiguration();
-
-            ICollection<BinaryTypeConfiguration> portTypeCfgs = new List<BinaryTypeConfiguration>();
-
-            portTypeCfgs.Add(new BinaryTypeConfiguration(typeof (RemoteConfiguration)));
-            portTypeCfgs.Add(new BinaryTypeConfiguration(typeof (RemoteConfigurationClosure)));
-
-            portCfg.TypeConfigurations = portTypeCfgs;
-
-            cfg.BinaryConfiguration = portCfg;
-
-            cfg.JvmClasspath = TestUtils.CreateTestClasspath();
-
-            cfg.JvmOptions = new List<string>
-            {
-                "-ea",
-                "-Xcheck:jni",
-                "-Xms4g",
-                "-Xmx4g",
-                "-DIGNITE_QUIET=false",
-                "-Xnoagent",
-                "-Djava.compiler=NONE",
-                "-Xdebug",
-                "-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005",
-                "-XX:+HeapDumpOnOutOfMemoryError"
-            };
-
-            cfg.SpringConfigUrl = path;
-
-            return cfg;
-        }
-
-        /// <summary>
         /// 
         /// </summary>
         /// <param name="outputPath"></param>

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/FutureTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/FutureTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/FutureTest.cs
index bc1f08f..4abd75e 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/FutureTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/FutureTest.cs
@@ -18,7 +18,6 @@
 namespace Apache.Ignite.Core.Tests
 {
     using System;
-    using System.Collections.Generic;
     using System.Threading;
     using Apache.Ignite.Core.Binary;
     using Apache.Ignite.Core.Cache;
@@ -42,21 +41,9 @@ namespace Apache.Ignite.Core.Tests
         [TestFixtureSetUp]
         public void TestFixtureSetUp()
         {
-            TestUtils.KillProcesses();
+            var grid = Ignition.Start(TestUtils.GetTestConfiguration());
 
-            var grid = Ignition.Start(new IgniteConfiguration
-            {
-                SpringConfigUrl = "config\\compute\\compute-standalone.xml",
-                JvmClasspath = TestUtils.CreateTestClasspath(),
-                JvmOptions = TestUtils.TestJavaOptions(),
-                BinaryConfiguration = new BinaryConfiguration
-                {
-                    TypeConfigurations =
-                        new List<BinaryTypeConfiguration> { new BinaryTypeConfiguration(typeof(Binarizable)) }
-                }
-            });
-
-            _cache = grid.GetCache<object, object>(null);
+            _cache = grid.CreateCache<object, object>("cache");
 
             _compute = grid.GetCompute();
         }
@@ -68,7 +55,6 @@ namespace Apache.Ignite.Core.Tests
         public void TestFixtureTearDown()
         {
             Ignition.StopAll(true);
-            TestUtils.KillProcesses();
         }
 
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteStartStopTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteStartStopTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteStartStopTest.cs
index bc40f48..2c9a63b 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteStartStopTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteStartStopTest.cs
@@ -35,16 +35,7 @@ namespace Apache.Ignite.Core.Tests
     public class IgniteStartStopTest
     {
         /// <summary>
-        /// 
-        /// </summary>
-        [SetUp]
-        public void SetUp()
-        {
-            TestUtils.KillProcesses();
-        }
-
-        /// <summary>
-        /// 
+        /// Test teardown.
         /// </summary>
         [TearDown]
         public void TearDown()
@@ -170,27 +161,17 @@ namespace Apache.Ignite.Core.Tests
         [Test]
         public void TestStartTheSameName()
         {
-            var cfg = new IgniteConfiguration
+            var cfg = new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
                 SpringConfigUrl = "config\\start-test-grid1.xml",
-                JvmOptions = TestUtils.TestJavaOptions(),
-                JvmClasspath = TestUtils.CreateTestClasspath()
             };
 
             var grid1 = Ignition.Start(cfg);
 
             Assert.AreEqual("grid1", grid1.Name);
-
-            try
-            {
-                Ignition.Start(cfg);
-
-                Assert.Fail("Start should fail.");
-            }
-            catch (IgniteException e)
-            {
-                Console.WriteLine("Expected exception: " + e);
-            }
+            
+            var ex = Assert.Throws<IgniteException>(() => Ignition.Start(cfg));
+            Assert.AreEqual("Ignite instance with this name has already been started: grid1", ex.Message);
         }
 
         /// <summary>
@@ -216,11 +197,9 @@ namespace Apache.Ignite.Core.Tests
         [Test]
         public void TestUsageAfterStop()
         {
-            var cfg = new IgniteConfiguration
+            var cfg = new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
                 SpringConfigUrl = "config\\start-test-grid1.xml",
-                JvmOptions = TestUtils.TestJavaOptions(),
-                JvmClasspath = TestUtils.CreateTestClasspath()
             };
 
             var grid = Ignition.Start(cfg);
@@ -229,16 +208,10 @@ namespace Apache.Ignite.Core.Tests
 
             grid.Dispose();
 
-            try
-            {
-                grid.GetCache<int, int>("cache1");
-
-                Assert.Fail();
-            }
-            catch (InvalidOperationException e)
-            {
-                Console.WriteLine("Expected exception: " + e);
-            }
+            var ex = Assert.Throws<InvalidOperationException>(() => grid.GetCache<int, int>("cache1"));
+            Assert.AreEqual("Grid is in invalid state to perform this operation. " +
+                            "It either not started yet or has already being or have stopped " +
+                            "[igniteInstanceName=grid1, state=STOPPED]", ex.Message);
         }
 
         /// <summary>
@@ -285,18 +258,14 @@ namespace Apache.Ignite.Core.Tests
         [Test]
         public void TestClientMode()
         {
-            var servCfg = new IgniteConfiguration
+            var servCfg = new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
                 SpringConfigUrl = "config\\start-test-grid1.xml",
-                JvmOptions = TestUtils.TestJavaOptions(),
-                JvmClasspath = TestUtils.CreateTestClasspath()
             };
 
-            var clientCfg = new IgniteConfiguration
+            var clientCfg = new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
                 SpringConfigUrl = "config\\start-test-grid2.xml",
-                JvmOptions = TestUtils.TestJavaOptions(),
-                JvmClasspath = TestUtils.CreateTestClasspath()
             };
 
             try

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteTestBase.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteTestBase.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteTestBase.cs
index a6ffd84..51ce585 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteTestBase.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteTestBase.cs
@@ -18,11 +18,8 @@
 namespace Apache.Ignite.Core.Tests
 {
     using System;
-    using System.Collections.Generic;
     using System.Linq;
     using Apache.Ignite.Core.Compute;
-    using Apache.Ignite.Core.Events;
-    using Apache.Ignite.Core.Messaging;
     using NUnit.Framework;
 
     /// <summary>
@@ -72,7 +69,7 @@ namespace Apache.Ignite.Core.Tests
         /// <summary>
         /// Gets the grid1.
         /// </summary>
-        public IIgnite Grid
+        protected IIgnite Grid
         {
             get { return _grids[0]; }
         }
@@ -80,56 +77,24 @@ namespace Apache.Ignite.Core.Tests
         /// <summary>
         /// Gets the grid2.
         /// </summary>
-        public IIgnite Grid2
+        protected IIgnite Grid2
         {
             get { return _grids[1]; }
         }
 
         /// <summary>
-        /// Gets the grid3.
-        /// </summary>
-        public IIgnite Grid3
-        {
-            get { return _grids[2]; }
-        }
-
-        /// <summary>
-        /// Gets the events.
-        /// </summary>
-        public IEvents Events
-        {
-            get { return Grid.GetEvents(); }
-        }
-
-        /// <summary>
-        /// Gets the messaging.
-        /// </summary>
-        public IMessaging Messaging
-        {
-            get { return Grid.GetMessaging(); }
-        }
-
-        /// <summary>
         /// Gets the compute.
         /// </summary>
-        public ICompute Compute
+        protected ICompute Compute
         {
             get { return Grid.GetCompute(); }
         }
 
         /// <summary>
-        /// Gets the grids.
-        /// </summary>
-        public ICollection<IIgnite> Grids
-        {
-            get { return _grids; }
-        }
-
-        /// <summary>
         /// Fixture tear down.
         /// </summary>
         [TestFixtureTearDown]
-        public virtual void FixtureTearDown()
+        public void FixtureTearDown()
         {
             StopGrids();
         }
@@ -147,7 +112,7 @@ namespace Apache.Ignite.Core.Tests
         /// Executes after each test.
         /// </summary>
         [TearDown]
-        public virtual void TestTearDown()
+        public void TestTearDown()
         {
             try
             {
@@ -178,11 +143,9 @@ namespace Apache.Ignite.Core.Tests
         /// </summary>
         protected virtual IgniteConfiguration GetConfiguration(string springConfigUrl)
         {
-            return new IgniteConfiguration
+            return new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
-                SpringConfigUrl = springConfigUrl,
-                JvmClasspath = TestUtils.CreateTestClasspath(),
-                JvmOptions = TestUtils.TestJavaOptions()
+                SpringConfigUrl = springConfigUrl
             };
         }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/LifecycleTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/LifecycleTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/LifecycleTest.cs
index 2180a74..8f16876 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/LifecycleTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/LifecycleTest.cs
@@ -15,6 +15,10 @@
  * limitations under the License.
  */
 
+// ReSharper disable MemberCanBeProtected.Global
+// ReSharper disable UnassignedField.Global
+// ReSharper disable UnusedAutoPropertyAccessor.Global
+// ReSharper disable MemberCanBePrivate.Global
 namespace Apache.Ignite.Core.Tests
 {
     using System;
@@ -171,16 +175,8 @@ namespace Apache.Ignite.Core.Tests
         {
             ThrowErr = true;
 
-            try
-            {
-                Start(CfgNoBeans);
-
-                Assert.Fail("Should not reach this place.");
-            }
-            catch (Exception e)
-            {
-                Assert.AreEqual(typeof(IgniteException), e.GetType());
-            }
+            var ex = Assert.Throws<IgniteException>(() => Start(CfgNoBeans));
+            Assert.AreEqual("Lifecycle exception.", ex.Message);
         }
 
         /// <summary>
@@ -190,17 +186,11 @@ namespace Apache.Ignite.Core.Tests
         /// <returns>Grid.</returns>
         private static IIgnite Start(string cfgPath)
         {
-            TestUtils.JvmDebug = true;
-
-            IgniteConfiguration cfg = new IgniteConfiguration();
-
-            cfg.JvmClasspath = TestUtils.CreateTestClasspath();
-            cfg.JvmOptions = TestUtils.TestJavaOptions();
-            cfg.SpringConfigUrl = cfgPath;
-
-            cfg.LifecycleHandlers = new List<ILifecycleHandler> { new Bean(), new Bean() };
-
-            return Ignition.Start(cfg);
+            return Ignition.Start(new IgniteConfiguration(TestUtils.GetTestConfiguration())
+            {
+                SpringConfigUrl = cfgPath,
+                LifecycleHandlers = new List<ILifecycleHandler> {new Bean(), new Bean()}
+            });
         }
 
         /// <summary>
@@ -249,12 +239,13 @@ namespace Apache.Ignite.Core.Tests
             if (LifecycleTest.ThrowErr)
                 throw new Exception("Lifecycle exception.");
 
-            Event evt = new Event();
-
-            evt.Grid1 = Grid1;
-            evt.Grid2 = Grid2;
-            evt.Prop1 = Property1;
-            evt.Prop2 = Property2;
+            Event evt = new Event
+            {
+                Grid1 = Grid1,
+                Grid2 = Grid2,
+                Prop1 = Property1,
+                Prop2 = Property2
+            };
 
             switch (evtType)
             {

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/LoadDllTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/LoadDllTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/LoadDllTest.cs
index 25ffab3..e466642 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/LoadDllTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/LoadDllTest.cs
@@ -192,16 +192,7 @@ namespace Apache.Ignite.Core.Tests
                 JvmClasspath = TestUtils.CreateTestClasspath()
             };
 
-            try
-            {
-                Ignition.Start(cfg);
-
-                Assert.Fail("Grid has been started with broken configuration.");
-            }
-            catch (IgniteException)
-            {
-
-            }
+            Assert.Throws<IgniteException>(() => Ignition.Start(cfg));
         }
 
         /// <summary>

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core.Tests/MessagingTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/MessagingTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/MessagingTest.cs
index a35aeff..f41474d 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/MessagingTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/MessagingTest.cs
@@ -33,7 +33,7 @@ namespace Apache.Ignite.Core.Tests
     /// <summary>
     /// <see cref="IMessaging"/> tests.
     /// </summary>
-    public class MessagingTest
+    public sealed class MessagingTest
     {
         /** */
         private IIgnite _grid1;
@@ -45,7 +45,7 @@ namespace Apache.Ignite.Core.Tests
         private IIgnite _grid3;
 
         /** */
-        public static int MessageId;
+        private static int _messageId;
 
         /// <summary>
         /// Executes before each test.
@@ -53,9 +53,9 @@ namespace Apache.Ignite.Core.Tests
         [SetUp]
         public void SetUp()
         {
-            _grid1 = Ignition.Start(Configuration("config\\compute\\compute-grid1.xml"));
-            _grid2 = Ignition.Start(Configuration("config\\compute\\compute-grid2.xml"));
-            _grid3 = Ignition.Start(Configuration("config\\compute\\compute-grid3.xml"));
+            _grid1 = Ignition.Start(GetConfiguration("grid-1"));
+            _grid2 = Ignition.Start(GetConfiguration("grid-2"));
+            _grid3 = Ignition.Start(GetConfiguration("grid-3"));
 
             Assert.AreEqual(3, _grid1.GetCluster().GetNodes().Count);
         }
@@ -64,7 +64,7 @@ namespace Apache.Ignite.Core.Tests
         /// Executes after each test.
         /// </summary>
         [TearDown]
-        public virtual void TearDown()
+        public void TearDown()
         {
             try
             {
@@ -94,7 +94,7 @@ namespace Apache.Ignite.Core.Tests
         /// Tests LocalListen.
         /// </summary>
         [SuppressMessage("ReSharper", "AccessToModifiedClosure")]
-        public void TestLocalListen(object topic)
+        private void TestLocalListen(object topic)
         {
             var messaging = _grid1.GetMessaging();
             var listener = MessagingTestHelper.GetListener();
@@ -484,13 +484,11 @@ namespace Apache.Ignite.Core.Tests
         /// <summary>
         /// Gets the Ignite configuration.
         /// </summary>
-        private static IgniteConfiguration Configuration(string springConfigUrl)
+        private static IgniteConfiguration GetConfiguration(string name)
         {
-            return new IgniteConfiguration
+            return new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
-                SpringConfigUrl = springConfigUrl,
-                JvmClasspath = TestUtils.CreateTestClasspath(),
-                JvmOptions = TestUtils.TestJavaOptions()
+                IgniteInstanceName = name
             };
         }
 
@@ -508,7 +506,7 @@ namespace Apache.Ignite.Core.Tests
         /// </summary>
         private static int NextId()
         {
-            return Interlocked.Increment(ref MessageId);
+            return Interlocked.Increment(ref _messageId);
         }
     }
 
@@ -522,13 +520,13 @@ namespace Apache.Ignite.Core.Tests
         public static readonly ConcurrentStack<string> ReceivedMessages = new ConcurrentStack<string>();
         
         /** */
-        public static readonly ConcurrentStack<string> Failures = new ConcurrentStack<string>();
+        private static readonly ConcurrentStack<string> Failures = new ConcurrentStack<string>();
 
         /** */
-        public static readonly CountdownEvent ReceivedEvent = new CountdownEvent(0);
+        private static readonly CountdownEvent ReceivedEvent = new CountdownEvent(0);
 
         /** */
-        public static readonly ConcurrentStack<Guid> LastNodeIds = new ConcurrentStack<Guid>();
+        private static readonly ConcurrentStack<Guid> LastNodeIds = new ConcurrentStack<Guid>();
 
         /** */
         public static volatile bool ListenResult = true;

http://git-wip-us.apache.org/repos/asf/ignite/blob/d76a7299/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryUtils.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryUtils.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryUtils.cs
index 67edede..dee0a80 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryUtils.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryUtils.cs
@@ -30,9 +30,9 @@ namespace Apache.Ignite.Core.Impl.Binary
     using Apache.Ignite.Core.Impl.Binary.IO;
     using Apache.Ignite.Core.Impl.Common;
 
-    /**
-     * <summary>Utilities for binary serialization.</summary>
-     */
+    /// <summary>
+    /// Utilities for binary serialization.
+    /// </summary>
     internal static class BinaryUtils
     {
         /** Header of NULL object. */
@@ -76,7 +76,7 @@ namespace Apache.Ignite.Core.Impl.Binary
 
         /** Type: boolean. */
         public const byte TypeBool = 8;
-        
+
         /** Type: decimal. */
         public const byte TypeDecimal = 30;
 
@@ -133,7 +133,7 @@ namespace Apache.Ignite.Core.Impl.Binary
 
         /** Type: map. */
         public const byte TypeDictionary = 25;
-        
+
         /** Type: binary object. */
         public const byte TypeBinary = 27;
 
@@ -142,13 +142,10 @@ namespace Apache.Ignite.Core.Impl.Binary
 
         /** Type: enum array. */
         public const byte TypeArrayEnum = 29;
-        
+
         /** Type: native job holder. */
         public const byte TypeNativeJobHolder = 77;
 
-        /** Type: Ignite proxy. */
-        public const byte TypeIgniteProxy = 74;
-
         /** Type: function wrapper. */
         public const byte TypeComputeOutFuncJob = 80;
 
@@ -175,7 +172,7 @@ namespace Apache.Ignite.Core.Impl.Binary
 
         /** Type: entry predicate holder. */
         public const byte TypeCacheEntryPredicateHolder = 90;
-        
+
         /** Type: message filter holder. */
         public const byte TypeMessageListenerHolder = 92;
 
@@ -196,25 +193,19 @@ namespace Apache.Ignite.Core.Impl.Binary
 
         /** Collection: linked list. */
         public const byte CollectionLinkedList = 2;
-        
+
         /** Map: custom. */
         public const byte MapCustom = 0;
 
         /** Map: hash map. */
         public const byte MapHashMap = 1;
-        
+
         /** Byte "0". */
         public const byte ByteZero = 0;
 
-        /** Byte "1". */
-        public const byte ByteOne = 1;
-
         /** Indicates object array. */
         public const int ObjTypeId = -1;
 
-        /** Length of array size. */
-        public const int LengthArraySize = 4;
-
         /** Int type. */
         public static readonly Type TypInt = typeof(int);
 
@@ -226,13 +217,13 @@ namespace Apache.Ignite.Core.Impl.Binary
 
         /** Ticks for Java epoch. */
         private static readonly long JavaDateTicks = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).Ticks;
-        
+
         /** Bindig flags for static search. */
         private const BindingFlags BindFlagsStatic = BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;
 
         /** System marshaller. */
         private static readonly Marshaller Marsh = new Marshaller(
-            new BinaryConfiguration {CompactFooter = false})
+            new BinaryConfiguration { CompactFooter = false })
         {
             RegistrationDisabled = true
         };
@@ -335,31 +326,13 @@ namespace Apache.Ignite.Core.Impl.Binary
 
             fixed (sbyte* res0 = res)
             {
-                stream.Read((byte*) res0, len);
+                stream.Read((byte*)res0, len);
             }
 
             return res;
         }
 
         /**
-         * <summary>Read byte array.</summary>
-         * <param name="data">Data.</param>
-         * <param name="pos">Position.</param>
-         * <returns>Value.</returns>
-         */
-        public static byte[] ReadByteArray(byte[] data, int pos) {
-            int len = ReadInt(data, pos);
-
-            pos += 4;
-
-            byte[] res = new byte[len];
-
-            Buffer.BlockCopy(data, pos, res, 0, len);
-
-            return res;
-        }
-
-        /**
          * <summary>Write short array.</summary>
          * <param name="vals">Value.</param>
          * <param name="stream">Output stream.</param>
@@ -384,7 +357,7 @@ namespace Apache.Ignite.Core.Impl.Binary
 
             fixed (ushort* res0 = res)
             {
-                stream.Read((byte*) res0, len * 2);
+                stream.Read((byte*)res0, len * 2);
             }
 
             return res;
@@ -401,42 +374,6 @@ namespace Apache.Ignite.Core.Impl.Binary
         }
 
         /**
-         * <summary>Read int value.</summary>
-         * <param name="data">Data array.</param>
-         * <param name="pos">Position.</param>
-         * <returns>Value.</returns>
-         */
-        public static int ReadInt(byte[] data, int pos) {
-            int val = data[pos];
-
-            val |= data[pos + 1] << 8;
-            val |= data[pos + 2] << 16;
-            val |= data[pos + 3] << 24;
-
-            return val;
-        }
-
-        /**
-         * <summary>Read long value.</summary>
-         * <param name="data">Data array.</param>
-         * <param name="pos">Position.</param>
-         * <returns>Value.</returns>
-         */
-        public static long ReadLong(byte[] data, int pos) {
-            long val = (long)(data[pos]) << 0;
-
-            val |= (long)(data[pos + 1]) << 8;
-            val |= (long)(data[pos + 2]) << 16;
-            val |= (long)(data[pos + 3]) << 24;
-            val |= (long)(data[pos + 4]) << 32;
-            val |= (long)(data[pos + 5]) << 40;
-            val |= (long)(data[pos + 6]) << 48;
-            val |= (long)(data[pos + 7]) << 56;
-
-            return val;
-        }
-
-        /**
          * <summary>Write int array.</summary>
          * <param name="vals">Value.</param>
          * <param name="stream">Output stream.</param>
@@ -471,7 +408,7 @@ namespace Apache.Ignite.Core.Impl.Binary
 
             fixed (uint* res0 = res)
             {
-                stream.Read((byte*) res0, len * 4);
+                stream.Read((byte*)res0, len * 4);
             }
 
             return res;
@@ -512,7 +449,7 @@ namespace Apache.Ignite.Core.Impl.Binary
 
             fixed (ulong* res0 = res)
             {
-                stream.Read((byte*) res0, len * 8);
+                stream.Read((byte*)res0, len * 8);
             }
 
             return res;
@@ -618,7 +555,7 @@ namespace Apache.Ignite.Core.Impl.Binary
 
             return new DateTime(JavaDateTicks + high * TimeSpan.TicksPerMillisecond + low / 100, DateTimeKind.Utc);
         }
-        
+
         /// <summary>
         /// Write nullable date array.
         /// </summary>
@@ -640,7 +577,7 @@ namespace Apache.Ignite.Core.Impl.Binary
                     stream.WriteByte(HdrNull);
             }
         }
-        
+
         /**
          * <summary>Write string in UTF8 encoding.</summary>
          * <param name="val">String.</param>
@@ -735,7 +672,7 @@ namespace Apache.Ignite.Core.Impl.Binary
         /// </summary>
         /// <param name="arr">The bytes.</param>
         /// <returns>Resulting string.</returns>
-        public static string Utf8BytesToString(byte[] arr)
+        private static string Utf8BytesToString(byte[] arr)
         {
             if (!UseStringSerializationVer2)
                 return Utf8.GetString(arr);
@@ -859,28 +796,11 @@ namespace Apache.Ignite.Core.Impl.Binary
         }
 
         /**
-         * <summary>Read string array in UTF8 encoding.</summary>
-         * <param name="stream">Stream.</param>
-         * <returns>String array.</returns>
-         */
-        public static string[] ReadStringArray(IBinaryStream stream)
-        {
-            int len = stream.ReadInt();
-
-            string[] vals = new string[len];
-
-            for (int i = 0; i < len; i++)
-                vals[i] = ReadString(stream);
-
-            return vals;
-        }
-
-        /**
          * <summary>Write decimal value.</summary>
          * <param name="val">Decimal value.</param>
          * <param name="stream">Stream.</param>
          */
-        public static void WriteDecimal(decimal val, IBinaryStream stream) 
+        public static void WriteDecimal(decimal val, IBinaryStream stream)
         {
             // Vals are:
             // [0] = lo
@@ -888,12 +808,12 @@ namespace Apache.Ignite.Core.Impl.Binary
             // [2] = high
             // [3] = flags
             int[] vals = decimal.GetBits(val);
-            
+
             // Get start index skipping leading zeros.
             int idx = vals[2] != 0 ? 2 : vals[1] != 0 ? 1 : vals[0] != 0 ? 0 : -1;
-                        
+
             // Write scale and negative flag.
-            int scale = (vals[3] & 0x00FF0000) >> 16; 
+            int scale = (vals[3] & 0x00FF0000) >> 16;
 
             stream.WriteInt(scale);
 
@@ -908,7 +828,7 @@ namespace Apache.Ignite.Core.Impl.Binary
             else
             {
                 int len = (idx + 1) << 2;
-                
+
                 // Write data.
                 for (int i = idx; i >= 0; i--)
                 {
@@ -918,7 +838,7 @@ namespace Apache.Ignite.Core.Impl.Binary
                     int part16 = (curPart >> 16) & 0xFF;
                     int part8 = (curPart >> 8) & 0xFF;
                     int part0 = curPart & 0xFF;
-                    
+
                     if (i == idx)
                     {
                         // Possibly skipping some values here.
@@ -927,7 +847,7 @@ namespace Apache.Ignite.Core.Impl.Binary
                             if ((part24 & 0x80) == 0x80)
                             {
                                 stream.WriteInt(len + 1);
-                                
+
                                 stream.WriteByte((byte)(neg ? -0x80 : ByteZero));
 
                                 neg = false;
@@ -952,7 +872,7 @@ namespace Apache.Ignite.Core.Impl.Binary
                             }
                             else
                                 stream.WriteInt(len - 1);
-                            
+
                             stream.WriteByte((byte)(neg ? ((sbyte)part16 | -0x80) : part16));
                             stream.WriteByte((byte)part8);
                             stream.WriteByte((byte)part0);
@@ -969,7 +889,7 @@ namespace Apache.Ignite.Core.Impl.Binary
                             }
                             else
                                 stream.WriteInt(len - 2);
-                            
+
                             stream.WriteByte((byte)(neg ? ((sbyte)part8 | -0x80) : part8));
                             stream.WriteByte((byte)part0);
                         }
@@ -1024,7 +944,7 @@ namespace Apache.Ignite.Core.Impl.Binary
                 throw new BinaryObjectException("Decimal value scale overflow (must be between 0 and 28): " + scale);
 
             if (mag.Length > 13)
-                throw new BinaryObjectException("Decimal magnitude overflow (must be less than 96 bits): " + 
+                throw new BinaryObjectException("Decimal magnitude overflow (must be less than 96 bits): " +
                     mag.Length * 8);
 
             if (mag.Length == 13 && mag[0] != 0)
@@ -1108,7 +1028,7 @@ namespace Apache.Ignite.Core.Impl.Binary
 
             var bytes = guid.ToByteArray();
 
-            var bytes0 = (byte*) &guid;
+            var bytes0 = (byte*)&guid;
 
             for (var i = 0; i < bytes.Length; i++)
                 if (bytes[i] != bytes0[i])
@@ -1129,7 +1049,7 @@ namespace Apache.Ignite.Core.Impl.Binary
 
             var ptr = &jguid;
 
-            stream.Write((byte*) ptr, 16);
+            stream.Write((byte*)ptr, 16);
         }
 
         /// <summary>
@@ -1137,7 +1057,7 @@ namespace Apache.Ignite.Core.Impl.Binary
         /// </summary>
         /// <param name="val">The value.</param>
         /// <param name="stream">The stream.</param>
-        public static unsafe void WriteGuidSlow(Guid val, IBinaryStream stream)
+        private static unsafe void WriteGuidSlow(Guid val, IBinaryStream stream)
         {
             var bytes = val.ToByteArray();
             byte* jBytes = stackalloc byte[16];
@@ -1161,7 +1081,7 @@ namespace Apache.Ignite.Core.Impl.Binary
             jBytes[13] = bytes[10]; // f
             jBytes[14] = bytes[9]; // e
             jBytes[15] = bytes[8]; // d
-            
+
             stream.Write(jBytes, 16);
         }
 
@@ -1175,13 +1095,13 @@ namespace Apache.Ignite.Core.Impl.Binary
         {
             JavaGuid jguid;
 
-            var ptr = (byte*) &jguid;
+            var ptr = (byte*)&jguid;
 
             stream.Read(ptr, 16);
 
             var dotnetGuid = new GuidAccessor(jguid);
 
-            return *(Guid*) (&dotnetGuid);
+            return *(Guid*)(&dotnetGuid);
         }
 
         /// <summary>
@@ -1242,23 +1162,6 @@ namespace Apache.Ignite.Core.Impl.Binary
             }
         }
 
-        /**
-         * <summary>Read GUID array.</summary>
-         * <param name="stream">Stream.</param>
-         * <returns>GUID array.</returns>
-         */
-        public static Guid?[] ReadGuidArray(IBinaryStream stream)
-        {
-            int len = stream.ReadInt();
-
-            Guid?[] vals = new Guid?[len];
-
-            for (int i = 0; i < len; i++)
-                vals[i] = ReadGuid(stream);
-
-            return vals;
-        }
-
         /// <summary>
         /// Write array.
         /// </summary>
@@ -1311,7 +1214,7 @@ namespace Apache.Ignite.Core.Impl.Binary
                 result = ArrayReaders.GetOrAdd(elementType, t =>
                     DelegateConverter.CompileFunc<Func<BinaryReader, bool, object>>(null,
                         MtdhReadArray.MakeGenericMethod(t),
-                        new[] {typeof (BinaryReader), typeof (bool)}, new[] {false, false, true}));
+                        new[] { typeof(BinaryReader), typeof(bool) }, new[] { false, false, true }));
 
             return result(ctx, typed);
         }
@@ -1373,22 +1276,22 @@ namespace Apache.Ignite.Core.Impl.Binary
         public static void WriteCollection(ICollection val, BinaryWriter ctx)
         {
             var valType = val.GetType();
-            
+
             byte colType;
 
             if (valType.IsGenericType)
             {
                 var genType = valType.GetGenericTypeDefinition();
 
-                if (genType == typeof (List<>))
+                if (genType == typeof(List<>))
                     colType = CollectionArrayList;
-                else if (genType == typeof (LinkedList<>))
+                else if (genType == typeof(LinkedList<>))
                     colType = CollectionLinkedList;
                 else
                     colType = CollectionCustom;
             }
             else
-                colType = valType == typeof (ArrayList) ? CollectionArrayList : CollectionCustom;
+                colType = valType == typeof(ArrayList) ? CollectionArrayList : CollectionCustom;
 
             WriteCollection(val, ctx, colType);
         }
@@ -1442,7 +1345,7 @@ namespace Apache.Ignite.Core.Impl.Binary
             ctx.AddHandle(pos - 1, res);
 
             if (adder == null)
-                adder = (col, elem) => ((ArrayList) col).Add(elem);
+                adder = (col, elem) => ((ArrayList)col).Add(elem);
 
             for (int i = 0; i < len; i++)
                 adder.Invoke(res, ctx.Deserialize<object>());
@@ -1465,10 +1368,10 @@ namespace Apache.Ignite.Core.Impl.Binary
             {
                 var genType = valType.GetGenericTypeDefinition();
 
-                dictType = genType == typeof (Dictionary<,>) ? MapHashMap : MapCustom;
+                dictType = genType == typeof(Dictionary<,>) ? MapHashMap : MapCustom;
             }
             else
-                dictType = valType == typeof (Hashtable) ? MapHashMap : MapCustom;
+                dictType = valType == typeof(Hashtable) ? MapHashMap : MapCustom;
 
             WriteDictionary(val, ctx, dictType);
         }
@@ -1553,7 +1456,7 @@ namespace Apache.Ignite.Core.Impl.Binary
         /// <param name="enumType">The enum type.</param>
         /// <param name="marshaller">The marshaller.</param>
         /// <returns>Enum type id.</returns>
-        public static int GetEnumTypeId(Type enumType, Marshaller marshaller)
+        private static int GetEnumTypeId(Type enumType, Marshaller marshaller)
         {
             if (Enum.GetUnderlyingType(enumType) == TypInt)
             {
@@ -1647,13 +1550,12 @@ namespace Apache.Ignite.Core.Impl.Binary
             return fieldName;
         }
 
-        /**
-         * <summary>Convert field name.</summary>
-         * <param name="fieldName">Field name.</param>
-         * <param name="converter">Converter.</param>
-         * <returns>Converted name.</returns>
-         */
-        public static string ConvertFieldName(string fieldName, IBinaryNameMapper converter)
+        /// <summary>
+        /// Convert field name.
+        /// </summary>
+        /// <param name="fieldName">Field name.</param>
+        /// <param name="converter">Converter.</param>
+        private static string ConvertFieldName(string fieldName, IBinaryNameMapper converter)
         {
             var fieldName0 = fieldName;
 
@@ -1717,7 +1619,7 @@ namespace Apache.Ignite.Core.Impl.Binary
                 id = GetStringHashCode(fieldName);
 
             if (id == 0)
-                throw new BinaryObjectException("Field ID is zero (please provide ID mapper or change field name) " + 
+                throw new BinaryObjectException("Field ID is zero (please provide ID mapper or change field name) " +
                     "[typeId=" + typeId + ", fieldName=" + fieldName + ", idMapper=" + idMapper + ']');
 
             return id;
@@ -1814,7 +1716,7 @@ namespace Apache.Ignite.Core.Impl.Binary
 
             high = diff / TimeSpan.TicksPerMillisecond;
 
-            low = (int)(diff % TimeSpan.TicksPerMillisecond) * 100; 
+            low = (int)(diff % TimeSpan.TicksPerMillisecond) * 100;
         }
 
         /// <summary>
@@ -1901,7 +1803,7 @@ namespace Apache.Ignite.Core.Impl.Binary
         /// </summary>
         public static unsafe float IntToFloatBits(int val)
         {
-            return *(float*) &val;
+            return *(float*)&val;
         }
 
         /// <summary>
@@ -1909,7 +1811,7 @@ namespace Apache.Ignite.Core.Impl.Binary
         /// </summary>
         public static unsafe double LongToDoubleBits(long val)
         {
-            return *(double*) &val;
+            return *(double*)&val;
         }
 
         /// <summary>
@@ -1975,7 +1877,8 @@ namespace Apache.Ignite.Core.Impl.Binary
             [FieldOffset(0)] public readonly ulong CBA;
             [FieldOffset(8)] public readonly ulong KJIHGFED;
             [SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
-            [FieldOffset(0)] public unsafe fixed byte Bytes [16];
+            [FieldOffset(0)]
+            public unsafe fixed byte Bytes[16];
 
             /// <summary>
             /// Initializes a new instance of the <see cref="JavaGuid"/> struct.


[21/70] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math module to Ignite ML module added missed licenses renamed packages fixed wrong ml profile activation

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/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 &lt; b ? -1 : a &gt; 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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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());
-    }
-}


[33/70] [abbrv] ignite git commit: IGNITE-4565: Implemented CREATE INDEX and DROP INDEX. This closes #1773. This closes #1804.

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaIndexDropOperation.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaIndexDropOperation.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaIndexDropOperation.java
new file mode 100644
index 0000000..da60560
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaIndexDropOperation.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.query.schema.operation;
+
+import org.apache.ignite.internal.util.typedef.internal.S;
+
+import java.util.UUID;
+
+/**
+ * Schema index drop operation.
+ */
+public class SchemaIndexDropOperation extends SchemaIndexAbstractOperation {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Index name. */
+    private final String idxName;
+
+    /** Ignore operation if index doesn't exist. */
+    private final boolean ifExists;
+
+    /**
+     * Constructor.
+     *
+     * @param opId Operation id.
+     * @param space Space.
+     * @param idxName Index name.
+     * @param ifExists Ignore operation if index doesn't exist.
+     */
+    public SchemaIndexDropOperation(UUID opId, String space, String idxName, boolean ifExists) {
+        super(opId, space);
+
+        this.idxName = idxName;
+        this.ifExists = ifExists;
+    }
+
+    /** {@inheritDoc} */
+    @Override public String indexName() {
+        return idxName;
+    }
+
+    /**
+     * @return Ignore operation if index doesn't exist.
+     */
+    public boolean ifExists() {
+        return ifExists;
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(SchemaIndexDropOperation.class, this, "parent", super.toString());
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java
index 1545b8c..a060f7e 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java
@@ -32,6 +32,7 @@ import org.apache.ignite.internal.processors.cache.transactions.IgniteTxKey;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersionedEntryEx;
 import org.apache.ignite.internal.processors.dr.GridDrType;
+import org.apache.ignite.internal.processors.query.schema.SchemaIndexCacheVisitorClosure;
 import org.apache.ignite.internal.util.lang.GridMetadataAwareAdapter;
 import org.apache.ignite.internal.util.lang.GridTuple3;
 import org.jetbrains.annotations.Nullable;
@@ -853,6 +854,12 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
     }
 
     /** {@inheritDoc} */
+    @Override public void updateIndex(SchemaIndexCacheVisitorClosure clo, long link) throws IgniteCheckedException,
+        GridCacheEntryRemovedException {
+        // No-op.
+    }
+
+    /** {@inheritDoc} */
     @Override public boolean deleted() {
         return false;
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridTestKernalContext.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridTestKernalContext.java b/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridTestKernalContext.java
index 77d0ea7..ff67b77 100644
--- a/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridTestKernalContext.java
+++ b/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridTestKernalContext.java
@@ -66,6 +66,7 @@ public class GridTestKernalContext extends GridKernalContextImpl {
                 null,
                 null,
                 null,
+                null,
                 U.allPluginProviders()
         );
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/GridH2IndexingGeoSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/GridH2IndexingGeoSelfTest.java b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/GridH2IndexingGeoSelfTest.java
index b53387f..4404e9c 100644
--- a/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/GridH2IndexingGeoSelfTest.java
+++ b/modules/geospatial/src/test/java/org/apache/ignite/internal/processors/query/h2/GridH2IndexingGeoSelfTest.java
@@ -101,7 +101,7 @@ public class GridH2IndexingGeoSelfTest extends GridCacheAbstractSelfTest {
             List<List<?>> res = cache.query(new SqlFieldsQuery("explain select _key from Geometry where _val && ?")
                 .setArgs(r.read("POLYGON((5 70, 5 80, 30 80, 30 70, 5 70))")).setLocal(true)).getAll();
 
-            assertTrue("__ explain: " + res, res.get(0).get(0).toString().contains("_val_idx"));
+            assertTrue("__ explain: " + res, res.get(0).get(0).toString().toLowerCase().contains("_val_idx"));
         }
         finally {
             cache.destroy();
@@ -167,7 +167,7 @@ public class GridH2IndexingGeoSelfTest extends GridCacheAbstractSelfTest {
 
             // Check explaint request.
             assertTrue(F.first(cache.query(new SqlFieldsQuery("explain select * from EnemyCamp " +
-                "where coords && 'POINT(25 75)'")).getAll()).get(0).toString().contains("coords_idx"));
+                "where coords && 'POINT(25 75)'")).getAll()).get(0).toString().toLowerCase().contains("coords_idx"));
         }
         finally {
             cache.destroy();

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/DmlStatementsProcessor.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/DmlStatementsProcessor.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/DmlStatementsProcessor.java
index 7129691..e8dc73b 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/DmlStatementsProcessor.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/DmlStatementsProcessor.java
@@ -41,9 +41,11 @@ import org.apache.ignite.IgniteCache;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteDataStreamer;
 import org.apache.ignite.IgniteException;
+import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.binary.BinaryObject;
 import org.apache.ignite.binary.BinaryObjectBuilder;
 import org.apache.ignite.cache.query.SqlFieldsQuery;
+import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.processors.cache.CacheOperationContext;
 import org.apache.ignite.internal.processors.cache.GridCacheAdapter;
 import org.apache.ignite.internal.processors.cache.GridCacheContext;
@@ -51,7 +53,6 @@ import org.apache.ignite.internal.processors.cache.QueryCursorImpl;
 import org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode;
 import org.apache.ignite.internal.processors.query.GridQueryCacheObjectsIterator;
 import org.apache.ignite.internal.processors.query.GridQueryCancel;
-import org.apache.ignite.internal.processors.query.GridQueryFieldMetadata;
 import org.apache.ignite.internal.processors.query.GridQueryFieldsResult;
 import org.apache.ignite.internal.processors.query.GridQueryFieldsResultAdapter;
 import org.apache.ignite.internal.processors.query.GridQueryProperty;
@@ -73,14 +74,18 @@ import org.apache.ignite.lang.IgniteBiTuple;
 import org.apache.ignite.lang.IgniteInClosure;
 import org.apache.ignite.spi.indexing.IndexingQueryFilter;
 import org.h2.command.Prepared;
+import org.h2.command.dml.Delete;
+import org.h2.command.dml.Insert;
+import org.h2.command.dml.Merge;
+import org.h2.command.dml.Update;
 import org.h2.table.Column;
 import org.h2.value.DataType;
 import org.h2.value.Value;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import org.jsr166.ConcurrentHashMap8;
 
 import static org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode.createJdbcSqlException;
+import static org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.UPDATE_RESULT_META;
 
 /**
  *
@@ -90,11 +95,10 @@ public class DmlStatementsProcessor {
     private final static int DFLT_DML_RERUN_ATTEMPTS = 4;
 
     /** Indexing. */
-    private final IgniteH2Indexing indexing;
+    private IgniteH2Indexing idx;
 
-    /** Set of binary type ids for which warning about missing identity in configuration has been printed. */
-    private final static Set<Integer> WARNED_TYPES =
-        Collections.newSetFromMap(new ConcurrentHashMap8<Integer, Boolean>());
+    /** Logger. */
+    private IgniteLogger log;
 
     /** Default size for update plan cache. */
     private static final int PLAN_CACHE_SIZE = 1024;
@@ -102,15 +106,16 @@ public class DmlStatementsProcessor {
     /** Update plans cache. */
     private final ConcurrentMap<String, ConcurrentMap<String, UpdatePlan>> planCache = new ConcurrentHashMap<>();
 
-    /** Dummy metadata for update result. */
-    private final static List<GridQueryFieldMetadata> UPDATE_RESULT_META = Collections.<GridQueryFieldMetadata>
-        singletonList(new IgniteH2Indexing.SqlFieldMetadata(null, null, "UPDATED", Long.class.getName()));
-
     /**
-     * @param indexing indexing.
+     * Constructor.
+     *
+     * @param ctx Kernal context.
+     * @param idx indexing.
      */
-    DmlStatementsProcessor(IgniteH2Indexing indexing) {
-        this.indexing = indexing;
+    public void start(GridKernalContext ctx, IgniteH2Indexing idx) {
+        this.idx = idx;
+
+        log = ctx.log(DmlStatementsProcessor.class);
     }
 
     /**
@@ -251,7 +256,7 @@ public class DmlStatementsProcessor {
 
             final ArrayList<List<?>> data = new ArrayList<>(plan.rowsNum);
 
-            final GridQueryFieldsResult res = indexing.queryLocalSqlFields(cctx.name(), plan.selectQry,
+            final GridQueryFieldsResult res = idx.queryLocalSqlFields(cctx.name(), plan.selectQry,
                 F.asList(args), null, false, 0, null);
 
             QueryCursorImpl<List<?>> stepCur = new QueryCursorImpl<>(new Iterable<List<?>>() {
@@ -335,10 +340,10 @@ public class DmlStatementsProcessor {
                 .setPageSize(fieldsQry.getPageSize())
                 .setTimeout(fieldsQry.getTimeout(), TimeUnit.MILLISECONDS);
 
-            cur = (QueryCursorImpl<List<?>>) indexing.queryTwoStep(cctx, newFieldsQry, cancel);
+            cur = (QueryCursorImpl<List<?>>) idx.queryTwoStep(cctx, newFieldsQry, cancel);
         }
         else {
-            final GridQueryFieldsResult res = indexing.queryLocalSqlFields(cctx.name(), plan.selectQry,
+            final GridQueryFieldsResult res = idx.queryLocalSqlFields(cctx.name(), plan.selectQry,
                 F.asList(fieldsQry.getArgs()), filters, fieldsQry.isEnforceJoinOrder(), fieldsQry.getTimeout(), cancel);
 
             cur = new QueryCursorImpl<>(new Iterable<List<?>>() {
@@ -476,7 +481,7 @@ public class DmlStatementsProcessor {
         while (it.hasNext()) {
             List<?> e = it.next();
             if (e.size() != 2) {
-                U.warn(indexing.getLogger(), "Invalid row size on DELETE - expected 2, got " + e.size());
+                U.warn(log, "Invalid row size on DELETE - expected 2, got " + e.size());
                 continue;
             }
 
@@ -1069,6 +1074,16 @@ public class DmlStatementsProcessor {
         }
     }
 
+    /**
+     * Check whether statement is DML statement.
+     *
+     * @param stmt Statement.
+     * @return {@code True} if this is DML.
+     */
+    static boolean isDmlStatement(Prepared stmt) {
+        return stmt instanceof Merge || stmt instanceof Insert || stmt instanceof Update || stmt instanceof Delete;
+    }
+
     /** Update result - modifications count and keys to re-run query with, if needed. */
     private final static class UpdateResult {
         /** Result to return for operations that affected 1 item - mostly to be used for fast updates and deletes. */

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
index 531b760..4f0a9f9 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
@@ -78,10 +78,10 @@ import org.apache.ignite.internal.processors.cache.CacheObjectContext;
 import org.apache.ignite.internal.processors.cache.GridCacheAdapter;
 import org.apache.ignite.internal.processors.cache.GridCacheAffinityManager;
 import org.apache.ignite.internal.processors.cache.GridCacheContext;
-import org.apache.ignite.internal.processors.cache.GridCacheEntryEx;
-import org.apache.ignite.internal.processors.cache.GridCacheEntryRemovedException;
 import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
 import org.apache.ignite.internal.processors.cache.KeyCacheObject;
+import org.apache.ignite.internal.processors.cache.GridCacheEntryEx;
+import org.apache.ignite.internal.processors.cache.GridCacheEntryRemovedException;
 import org.apache.ignite.internal.processors.cache.QueryCursorImpl;
 import org.apache.ignite.internal.processors.cache.database.CacheDataRow;
 import org.apache.ignite.internal.processors.cache.database.tree.io.PageIO;
@@ -100,6 +100,9 @@ import org.apache.ignite.internal.processors.query.GridQueryProperty;
 import org.apache.ignite.internal.processors.query.GridQueryTypeDescriptor;
 import org.apache.ignite.internal.processors.query.GridRunningQueryInfo;
 import org.apache.ignite.internal.processors.query.IgniteSQLException;
+import org.apache.ignite.internal.processors.query.QueryIndexDescriptorImpl;
+import org.apache.ignite.internal.processors.query.h2.ddl.DdlStatementsProcessor;
+import org.apache.ignite.internal.processors.query.h2.opt.DistributedJoinMode;
 import org.apache.ignite.internal.processors.query.h2.database.H2PkHashIndex;
 import org.apache.ignite.internal.processors.query.h2.database.H2RowFactory;
 import org.apache.ignite.internal.processors.query.h2.database.H2TreeIndex;
@@ -107,8 +110,9 @@ import org.apache.ignite.internal.processors.query.h2.database.io.H2ExtrasInnerI
 import org.apache.ignite.internal.processors.query.h2.database.io.H2ExtrasLeafIO;
 import org.apache.ignite.internal.processors.query.h2.database.io.H2InnerIO;
 import org.apache.ignite.internal.processors.query.h2.database.io.H2LeafIO;
-import org.apache.ignite.internal.processors.query.h2.opt.DistributedJoinMode;
 import org.apache.ignite.internal.processors.query.h2.opt.GridH2DefaultTableEngine;
+import org.apache.ignite.internal.processors.query.h2.opt.GridH2IndexBase;
+import org.apache.ignite.internal.processors.query.h2.opt.GridH2SystemIndexFactory;
 import org.apache.ignite.internal.processors.query.h2.opt.GridH2KeyValueRowOffheap;
 import org.apache.ignite.internal.processors.query.h2.opt.GridH2KeyValueRowOnheap;
 import org.apache.ignite.internal.processors.query.h2.opt.GridH2QueryContext;
@@ -116,17 +120,19 @@ import org.apache.ignite.internal.processors.query.h2.opt.GridH2Row;
 import org.apache.ignite.internal.processors.query.h2.opt.GridH2RowDescriptor;
 import org.apache.ignite.internal.processors.query.h2.opt.GridH2RowFactory;
 import org.apache.ignite.internal.processors.query.h2.opt.GridH2Table;
-import org.apache.ignite.internal.processors.query.h2.opt.GridH2TreeIndex;
 import org.apache.ignite.internal.processors.query.h2.opt.GridH2ValueCacheObject;
 import org.apache.ignite.internal.processors.query.h2.opt.GridLuceneIndex;
 import org.apache.ignite.internal.processors.query.h2.sql.GridSqlQueryParser;
 import org.apache.ignite.internal.processors.query.h2.sql.GridSqlQuerySplitter;
 import org.apache.ignite.internal.processors.query.h2.twostep.GridMapQueryExecutor;
 import org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor;
+import org.apache.ignite.internal.processors.query.schema.SchemaIndexCacheVisitor;
+import org.apache.ignite.internal.processors.query.schema.SchemaIndexCacheVisitorClosure;
 import org.apache.ignite.internal.processors.timeout.GridTimeoutProcessor;
 import org.apache.ignite.internal.util.GridBoundedConcurrentLinkedHashMap;
 import org.apache.ignite.internal.util.GridEmptyCloseableIterator;
 import org.apache.ignite.internal.util.GridSpinBusyLock;
+import org.apache.ignite.internal.util.GridStringBuilder;
 import org.apache.ignite.internal.util.lang.GridCloseableIterator;
 import org.apache.ignite.internal.util.lang.GridPlainRunnable;
 import org.apache.ignite.internal.util.lang.IgniteInClosure2X;
@@ -150,14 +156,15 @@ import org.apache.ignite.resources.LoggerResource;
 import org.apache.ignite.spi.indexing.IndexingQueryFilter;
 import org.h2.api.ErrorCode;
 import org.h2.api.JavaObjectSerializer;
+import org.h2.api.TableEngine;
 import org.h2.command.CommandInterface;
 import org.h2.command.Prepared;
+import org.h2.command.ddl.CreateTableData;
 import org.h2.command.dml.Insert;
 import org.h2.engine.Session;
 import org.h2.engine.SysProperties;
 import org.h2.index.Cursor;
 import org.h2.index.Index;
-import org.h2.index.SpatialIndex;
 import org.h2.jdbc.JdbcConnection;
 import org.h2.jdbc.JdbcPreparedStatement;
 import org.h2.jdbc.JdbcStatement;
@@ -167,6 +174,7 @@ import org.h2.result.SortOrder;
 import org.h2.server.web.WebServer;
 import org.h2.table.Column;
 import org.h2.table.IndexColumn;
+import org.h2.table.TableBase;
 import org.h2.tools.Server;
 import org.h2.util.JdbcUtils;
 import org.h2.value.DataType;
@@ -221,8 +229,7 @@ import static org.apache.ignite.internal.processors.query.h2.opt.GridH2QueryType
  */
 @SuppressWarnings({"UnnecessaryFullyQualifiedName", "NonFinalStaticVariableUsedInClassInitialization"})
 public class IgniteH2Indexing implements GridQueryIndexing {
-
-    /**
+    /*
      * Register IO for indexes.
      */
     static {
@@ -231,6 +238,10 @@ public class IgniteH2Indexing implements GridQueryIndexing {
         H2ExtrasLeafIO.register();
     }
 
+    /** Spatial index class name. */
+    private static final String SPATIAL_IDX_CLS =
+        "org.apache.ignite.internal.processors.query.h2.opt.GridH2SpatialIndex";
+
     /** Default DB options. */
     private static final String DB_OPTIONS = ";LOCK_MODE=3;MULTI_THREADED=1;DB_CLOSE_ON_EXIT=FALSE" +
         ";DEFAULT_LOCK_TIMEOUT=10000;FUNCTIONS_IN_SCHEMA=true;OPTIMIZE_REUSE_RESULTS=0;QUERY_CACHE_SIZE=0" +
@@ -241,6 +252,10 @@ public class IgniteH2Indexing implements GridQueryIndexing {
         // Uncomment this setting to get debug output from H2 to sysout.
 //        ";TRACE_LEVEL_SYSTEM_OUT=3";
 
+    /** Dummy metadata for update result. */
+    public static final List<GridQueryFieldMetadata> UPDATE_RESULT_META = Collections.<GridQueryFieldMetadata>
+        singletonList(new SqlFieldMetadata(null, null, "UPDATED", Long.class.getName()));
+
     /** */
     private static final int PREPARED_STMT_CACHE_SIZE = 256;
 
@@ -371,10 +386,13 @@ public class IgniteH2Indexing implements GridQueryIndexing {
     };
 
     /** */
-    private volatile GridKernalContext ctx;
+    protected volatile GridKernalContext ctx;
+
+    /** */
+    private final DmlStatementsProcessor dmlProc = new DmlStatementsProcessor();
 
     /** */
-    private final DmlStatementsProcessor dmlProc = new DmlStatementsProcessor(this);
+    private DdlStatementsProcessor ddlProc;
 
     /** */
     private final ConcurrentMap<String, GridH2Table> dataTables = new ConcurrentHashMap8<>();
@@ -419,13 +437,6 @@ public class IgniteH2Indexing implements GridQueryIndexing {
     }
 
     /**
-     * @return Logger.
-     */
-    IgniteLogger getLogger() {
-        return log;
-    }
-
-    /**
      * @param c Connection.
      * @param sql SQL.
      * @param useStmtCache If {@code true} uses statement cache.
@@ -468,15 +479,15 @@ public class IgniteH2Indexing implements GridQueryIndexing {
     }
 
     /** {@inheritDoc} */
-    @Override public PreparedStatement prepareNativeStatement(String schema, String sql) throws SQLException {
-        return prepareStatement(connectionForSpace(space(schema)), sql, true);
+    @Override public PreparedStatement prepareNativeStatement(String space, String sql) throws SQLException {
+        return prepareStatement(connectionForSpace(space), sql, true);
     }
 
     /** {@inheritDoc} */
     @SuppressWarnings("unchecked")
     @Override public IgniteDataStreamer<?, ?> createStreamer(String spaceName, PreparedStatement nativeStmt,
         long autoFlushFreq, int nodeBufSize, int nodeParOps, boolean allowOverwrite) {
-        Prepared prep = GridSqlQueryParser.prepared((JdbcPreparedStatement) nativeStmt);
+        Prepared prep = GridSqlQueryParser.prepared(nativeStmt);
 
         if (!(prep instanceof Insert))
             throw new IgniteSQLException("Only INSERT operations are supported in streaming mode",
@@ -625,14 +636,14 @@ public class IgniteH2Indexing implements GridQueryIndexing {
 
     /** {@inheritDoc} */
     @Override public void store(@Nullable String spaceName,
-        GridQueryTypeDescriptor type,
+        String typeName,
         KeyCacheObject k,
         int partId,
         CacheObject v,
         GridCacheVersion ver,
         long expirationTime,
         long link) throws IgniteCheckedException {
-        TableDescriptor tbl = tableDescriptor(spaceName, type);
+        TableDescriptor tbl = tableDescriptor(typeName, spaceName);
 
         if (tbl == null)
             return; // Type was rejected.
@@ -700,7 +711,7 @@ public class IgniteH2Indexing implements GridQueryIndexing {
         if (log.isDebugEnabled())
             log.debug("Removing key from cache query index [locId=" + nodeId + ", key=" + key + ", val=" + val + ']');
 
-        TableDescriptor tbl = tableDescriptor(spaceName, type);
+        TableDescriptor tbl = tableDescriptor(type.name(), spaceName);
 
         if (tbl == null)
             return;
@@ -803,12 +814,232 @@ public class IgniteH2Indexing implements GridQueryIndexing {
         tbl.schema.tbls.remove(tbl.typeName());
     }
 
+    /**
+     * Add initial user index.
+     *
+     * @param spaceName Space name.
+     * @param desc Table descriptor.
+     * @param h2Idx User index.
+     * @throws IgniteCheckedException If failed.
+     */
+    private void addInitialUserIndex(String spaceName, TableDescriptor desc, GridH2IndexBase h2Idx)
+        throws IgniteCheckedException {
+        GridH2Table h2Tbl = desc.tbl;
+
+        h2Tbl.proposeUserIndex(h2Idx);
+
+        try {
+            String sql = indexCreateSql(desc.fullTableName(), h2Idx, false, desc.schema.escapeAll());
+
+            executeSql(spaceName, sql);
+        }
+        catch (Exception e) {
+            // Rollback and re-throw.
+            h2Tbl.rollbackUserIndex(h2Idx.getName());
+
+            throw e;
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override public void dynamicIndexCreate(@Nullable final String spaceName, final String tblName,
+        final QueryIndexDescriptorImpl idxDesc, boolean ifNotExists, SchemaIndexCacheVisitor cacheVisitor)
+        throws IgniteCheckedException {
+        // Locate table.
+        String schemaName = schema(spaceName);
+
+        Schema schema = schemas.get(schemaName);
+
+        TableDescriptor desc = (schema != null ? schema.tbls.get(tblName) : null);
+
+        if (desc == null)
+            throw new IgniteCheckedException("Table not found in internal H2 database [schemaName=" + schemaName +
+                ", tblName=" + tblName + ']');
+
+        GridH2Table h2Tbl = desc.tbl;
+
+        // Create index.
+        final GridH2IndexBase h2Idx = desc.createUserIndex(idxDesc);
+
+        h2Tbl.proposeUserIndex(h2Idx);
+
+        try {
+            // Populate index with existing cache data.
+            final GridH2RowDescriptor rowDesc = h2Tbl.rowDescriptor();
+
+            SchemaIndexCacheVisitorClosure clo = new SchemaIndexCacheVisitorClosure() {
+                @Override public void apply(KeyCacheObject key, int part, CacheObject val, GridCacheVersion ver,
+                    long expTime, long link) throws IgniteCheckedException {
+                    if (expTime == 0L)
+                        expTime = Long.MAX_VALUE;
+
+                    GridH2Row row = rowDesc.createRow(key, part, val, ver, expTime);
+
+                    row.link(link);
+
+                    h2Idx.put(row);
+                }
+            };
+
+            cacheVisitor.visit(clo);
+
+            // At this point index is in consistent state, promote it through H2 SQL statement, so that cached
+            // prepared statements are re-built.
+            String sql = indexCreateSql(desc.fullTableName(), h2Idx, ifNotExists, schema.escapeAll());
+
+            executeSql(spaceName, sql);
+        }
+        catch (Exception e) {
+            // Rollback and re-throw.
+            h2Tbl.rollbackUserIndex(h2Idx.getName());
+
+            throw e;
+        }
+    }
+
     /** {@inheritDoc} */
+    @SuppressWarnings("SynchronizationOnLocalVariableOrMethodParameter")
+    @Override public void dynamicIndexDrop(@Nullable final String spaceName, String idxName, boolean ifExists)
+        throws IgniteCheckedException{
+        String schemaName = schema(spaceName);
+
+        Schema schema = schemas.get(schemaName);
+
+        String sql = indexDropSql(schemaName, idxName, ifExists, schema.escapeAll());
+
+        executeSql(spaceName, sql);
+    }
+
+    /**
+     * Execute DDL command.
+     *
+     * @param spaceName Space name.
+     * @param sql SQL.
+     * @throws IgniteCheckedException If failed.
+     */
+    private void executeSql(String spaceName, String sql) throws IgniteCheckedException {
+        try {
+            Connection conn = connectionForSpace(spaceName);
+
+            try (PreparedStatement stmt = prepareStatement(conn, sql, false)) {
+                stmt.execute();
+            }
+        }
+        catch (Exception e) {
+            throw new IgniteCheckedException("Failed to execute SQL statement on internal H2 database: " + sql, e);
+        }
+    }
+
+    /**
+     * Generate {@code CREATE INDEX} SQL statement for given params.
+     * @param fullTblName Fully qualified table name.
+     * @param h2Idx H2 index.
+     * @param ifNotExists Quietly skip index creation if it exists.
+     * @return Statement string.
+     */
+    private static String indexCreateSql(String fullTblName, GridH2IndexBase h2Idx, boolean ifNotExists,
+        boolean escapeAll) {
+        boolean spatial = F.eq(SPATIAL_IDX_CLS, h2Idx.getClass().getName());
+
+        GridStringBuilder sb = new SB("CREATE ")
+            .a(spatial ? "SPATIAL " : "")
+            .a("INDEX ")
+            .a(ifNotExists ? "IF NOT EXISTS " : "")
+            .a(escapeName(h2Idx.getName(), escapeAll))
+            .a(" ON ")
+            .a(fullTblName)
+            .a(" (");
+
+        boolean first = true;
+
+        for (IndexColumn col : h2Idx.getIndexColumns()) {
+            if (first)
+                first = false;
+            else
+                sb.a(", ");
+
+            sb.a("\"" + col.columnName + "\"").a(" ").a(col.sortType == SortOrder.ASCENDING ? "ASC" : "DESC");
+        }
+
+        sb.a(')');
+
+        return sb.toString();
+    }
+
+    /**
+     * Generate {@code CREATE INDEX} SQL statement for given params.
+     * @param schemaName <b>Quoted</b> schema name.
+     * @param idxName Index name.
+     * @param ifExists Quietly skip index drop if it exists.
+     * @param escapeAll Escape flag.
+     * @return Statement string.
+     */
+    private static String indexDropSql(String schemaName, String idxName, boolean ifExists, boolean escapeAll) {
+        return "DROP INDEX " + (ifExists ? "IF EXISTS " : "") + schemaName + '.' + escapeName(idxName, escapeAll);
+    }
+
+    /**
+     * Create sorted index.
+     *
+     * @param schema Schema.
+     * @param name Index name,
+     * @param tbl Table.
+     * @param pk Primary key flag.
+     * @param cols Columns.
+     * @return Index.
+     */
+    private GridH2IndexBase createSortedIndex(Schema schema, String name, GridH2Table tbl, boolean pk,
+        List<IndexColumn> cols, int inlineSize) {
+        try {
+            GridCacheContext cctx = schema.cacheContext();
+
+            if (log.isDebugEnabled())
+                log.debug("Creating cache index [cacheId=" + cctx.cacheId() + ", idxName=" + name + ']');
+
+            final int segments = tbl.rowDescriptor().configuration().getQueryParallelism();
+
+            return new H2TreeIndex(cctx, tbl, name, pk, cols, inlineSize, segments);
+        }
+        catch (IgniteCheckedException e) {
+            throw new IgniteException(e);
+        }
+    }
+
+    /**
+     * Create spatial index.
+     *
+     * @param tbl Table.
+     * @param idxName Index name.
+     * @param cols Columns.
+     */
+    private GridH2IndexBase createSpatialIndex(GridH2Table tbl, String idxName, IndexColumn[] cols
+    ) {
+        try {
+            Class<?> cls = Class.forName(SPATIAL_IDX_CLS);
+
+            Constructor<?> ctor = cls.getConstructor(
+                GridH2Table.class,
+                String.class,
+                Integer.TYPE,
+                IndexColumn[].class);
+
+            if (!ctor.isAccessible())
+                ctor.setAccessible(true);
+
+            final int segments = tbl.rowDescriptor().configuration().getQueryParallelism();
+
+            return (GridH2IndexBase)ctor.newInstance(tbl, idxName, segments, cols);
+        }
+        catch (Exception e) {
+            throw new IgniteException("Failed to instantiate: " + SPATIAL_IDX_CLS, e);
+        }
+    }
+
     @SuppressWarnings("unchecked")
     @Override public <K, V> GridCloseableIterator<IgniteBiTuple<K, V>> queryLocalText(
-        @Nullable String spaceName, String qry, GridQueryTypeDescriptor type,
+        @Nullable String spaceName, String qry, String typeName,
         IndexingQueryFilter filters) throws IgniteCheckedException {
-        TableDescriptor tbl = tableDescriptor(spaceName, type);
+        TableDescriptor tbl = tableDescriptor(typeName, spaceName);
 
         if (tbl != null && tbl.luceneIdx != null) {
             GridRunningQueryInfo run = new GridRunningQueryInfo(qryIdGen.incrementAndGet(), qry, TEXT, spaceName,
@@ -828,9 +1059,9 @@ public class IgniteH2Indexing implements GridQueryIndexing {
     }
 
     /** {@inheritDoc} */
-    @Override public void unregisterType(@Nullable String spaceName, GridQueryTypeDescriptor type)
+    @Override public void unregisterType(@Nullable String spaceName, String typeName)
         throws IgniteCheckedException {
-        TableDescriptor tbl = tableDescriptor(spaceName, type);
+        TableDescriptor tbl = tableDescriptor(typeName, spaceName);
 
         if (tbl != null)
             removeTable(tbl);
@@ -860,9 +1091,9 @@ public class IgniteH2Indexing implements GridQueryIndexing {
 
         final PreparedStatement stmt = preparedStatementWithParams(conn, qry, params, true);
 
-        Prepared p = GridSqlQueryParser.prepared((JdbcPreparedStatement)stmt);
+        Prepared p = GridSqlQueryParser.prepared(stmt);
 
-        if (!p.isQuery()) {
+        if (DmlStatementsProcessor.isDmlStatement(p)) {
             SqlFieldsQuery fldsQry = new SqlFieldsQuery(qry);
 
             if (params != null)
@@ -873,6 +1104,9 @@ public class IgniteH2Indexing implements GridQueryIndexing {
 
             return dmlProc.updateLocalSqlFields(spaceName, stmt, fldsQry, filter, cancel);
         }
+        else if (DdlStatementsProcessor.isDdlStatement(p))
+            throw new IgniteSQLException("DDL statements are supported for the whole cluster only",
+                IgniteQueryErrorCode.UNSUPPORTED_OPERATION);
 
         List<GridQueryFieldMetadata> meta;
 
@@ -1419,6 +1653,7 @@ public class IgniteH2Indexing implements GridQueryIndexing {
                 .distributedJoinMode(distributedJoinMode));
 
             PreparedStatement stmt = null;
+            Prepared prepared;
 
             boolean cachesCreated = false;
 
@@ -1434,7 +1669,7 @@ public class IgniteH2Indexing implements GridQueryIndexing {
                         catch (SQLException e) {
                             if (!cachesCreated && e.getErrorCode() == ErrorCode.SCHEMA_NOT_FOUND_1) {
                                 try {
-                                    ctx.cache().createMissingCaches();
+                                    ctx.cache().createMissingQueryCaches();
                                 }
                                 catch (IgniteCheckedException ignored) {
                                     throw new CacheException("Failed to create missing caches.", e);
@@ -1449,7 +1684,7 @@ public class IgniteH2Indexing implements GridQueryIndexing {
                     }
 
 
-                    Prepared prepared = GridSqlQueryParser.prepared(stmt);
+                    prepared = GridSqlQueryParser.prepared(stmt);
 
                     if (qry instanceof JdbcSqlFieldsQuery && ((JdbcSqlFieldsQuery) qry).isQuery() != prepared.isQuery())
                         throw new IgniteSQLException("Given statement type does not match that declared by JDBC driver",
@@ -1470,12 +1705,23 @@ public class IgniteH2Indexing implements GridQueryIndexing {
 
                 // It is a DML statement if we did not create a twoStepQuery.
                 if (twoStepQry == null) {
-                    try {
-                        return dmlProc.updateSqlFieldsTwoStep(cctx.namexx(), stmt, qry, cancel);
+                    if (DmlStatementsProcessor.isDmlStatement(prepared)) {
+                        try {
+                            return dmlProc.updateSqlFieldsTwoStep(cctx.namexx(), stmt, qry, cancel);
+                        }
+                        catch (IgniteCheckedException e) {
+                            throw new IgniteSQLException("Failed to execute DML statement [stmt=" + sqlQry +
+                                ", params=" + Arrays.deepToString(qry.getArgs()) + "]", e);
+                        }
                     }
-                    catch (IgniteCheckedException e) {
-                        throw new IgniteSQLException("Failed to execute DML statement [qry=" + sqlQry + ", params=" +
-                            Arrays.deepToString(qry.getArgs()) + "]", e);
+
+                    if (DdlStatementsProcessor.isDdlStatement(prepared)) {
+                        try {
+                            return ddlProc.runDdlStatement(stmt);
+                        }
+                        catch (IgniteCheckedException e) {
+                            throw new IgniteSQLException("Failed to execute DDL statement [stmt=" + sqlQry + ']', e);
+                        }
                     }
                 }
 
@@ -1660,7 +1906,7 @@ public class IgniteH2Indexing implements GridQueryIndexing {
         try {
             Connection conn = connectionForThread(schemaName);
 
-            createTable(schema, tbl, conn);
+            createTable(spaceName, schema, tbl, conn);
 
             schema.add(tbl);
         }
@@ -1754,12 +2000,15 @@ public class IgniteH2Indexing implements GridQueryIndexing {
     /**
      * Create db table by using given table descriptor.
      *
+     * @param spaceName Space name.
      * @param schema Schema.
      * @param tbl Table descriptor.
      * @param conn Connection.
      * @throws SQLException If failed to create db table.
+     * @throws IgniteCheckedException If failed.
      */
-    private void createTable(Schema schema, TableDescriptor tbl, Connection conn) throws SQLException {
+    private void createTable(String spaceName, Schema schema, TableDescriptor tbl, Connection conn)
+        throws SQLException, IgniteCheckedException {
         assert schema != null;
         assert tbl != null;
 
@@ -1783,12 +2032,17 @@ public class IgniteH2Indexing implements GridQueryIndexing {
         if (log.isDebugEnabled())
             log.debug("Creating DB table with SQL: " + sql);
 
-        GridH2RowDescriptor desc = new RowDescriptor(tbl.type(), schema);
+        GridH2RowDescriptor rowDesc = new RowDescriptor(tbl.type(), schema);
 
-        GridH2Table res = GridH2Table.Engine.createTable(conn, sql.toString(), desc, tbl, tbl.schema.spaceName);
+        H2RowFactory rowFactory = tbl.rowFactory(rowDesc);
 
-        if (dataTables.putIfAbsent(res.identifier(), res) != null)
-            throw new IllegalStateException("Table already exists: " + res.identifier());
+        GridH2Table h2Tbl = H2TableEngine.createTable(conn, sql.toString(), rowDesc, rowFactory, tbl);
+
+        for (GridH2IndexBase usrIdx : tbl.createUserIndexes())
+            addInitialUserIndex(spaceName, tbl, usrIdx);
+
+        if (dataTables.putIfAbsent(h2Tbl.identifier(), h2Tbl) != null)
+            throw new IllegalStateException("Table already exists: " + h2Tbl.identifier());
     }
 
     /**
@@ -1800,24 +2054,29 @@ public class IgniteH2Indexing implements GridQueryIndexing {
     }
 
     /**
-     * Gets corresponding DB type from java class.
+     * Find table by name in given schema.
      *
-     * @param cls Java class.
-     * @return DB type name.
+     * @param schemaName Schema name.
+     * @param tblName Table name.
+     * @return Table or {@code null} if none found.
      */
-    private String dbTypeFromClass(Class<?> cls) {
-        return DBTypeEnum.fromClass(cls).dBTypeAsString();
+    public GridH2Table dataTable(String schemaName, String tblName) {
+        for (GridH2Table tbl : dataTables.values()) {
+            if (tbl.getSchema().getName().equals(schemaName) && tbl.getName().equals(tblName))
+                return tbl;
+        }
+
+        return null;
     }
 
     /**
-     * Gets table descriptor by value type.
+     * Gets corresponding DB type from java class.
      *
-     * @param spaceName Space name.
-     * @param type Value type descriptor.
-     * @return Table descriptor or {@code null} if not found.
+     * @param cls Java class.
+     * @return DB type name.
      */
-    @Nullable private TableDescriptor tableDescriptor(@Nullable String spaceName, GridQueryTypeDescriptor type) {
-        return tableDescriptor(type.name(), spaceName);
+    private String dbTypeFromClass(Class<?> cls) {
+        return DBTypeEnum.fromClass(cls).dBTypeAsString();
     }
 
     /**
@@ -1903,7 +2162,7 @@ public class IgniteH2Indexing implements GridQueryIndexing {
      */
     @Override public void rebuildIndexesFromHash(@Nullable String spaceName,
         GridQueryTypeDescriptor type) throws IgniteCheckedException {
-        TableDescriptor tbl = tableDescriptor(spaceName, type);
+        TableDescriptor tbl = tableDescriptor(type.name(), spaceName);
 
         if (tbl == null)
             return;
@@ -1961,7 +2220,7 @@ public class IgniteH2Indexing implements GridQueryIndexing {
 
     /** {@inheritDoc} */
     @Override public void markForRebuildFromHash(@Nullable String spaceName, GridQueryTypeDescriptor type) {
-        TableDescriptor tbl = tableDescriptor(spaceName, type);
+        TableDescriptor tbl = tableDescriptor(type.name(), spaceName);
 
         if (tbl == null)
             return;
@@ -1975,12 +2234,12 @@ public class IgniteH2Indexing implements GridQueryIndexing {
      * Gets size (for tests only).
      *
      * @param spaceName Space name.
-     * @param type Type descriptor.
+     * @param typeName Type name.
      * @return Size.
      * @throws IgniteCheckedException If failed or {@code -1} if the type is unknown.
      */
-    long size(@Nullable String spaceName, GridQueryTypeDescriptor type) throws IgniteCheckedException {
-        TableDescriptor tbl = tableDescriptor(spaceName, type);
+    long size(@Nullable String spaceName, String typeName) throws IgniteCheckedException {
+        TableDescriptor tbl = tableDescriptor(typeName, spaceName);
 
         if (tbl == null)
             return -1;
@@ -2093,6 +2352,11 @@ public class IgniteH2Indexing implements GridQueryIndexing {
                     cleanupStatementCache();
                 }
             }, CLEANUP_STMT_CACHE_PERIOD, CLEANUP_STMT_CACHE_PERIOD);
+
+            ddlProc = new DdlStatementsProcessor();
+
+            dmlProc.start(ctx, this);
+            ddlProc.start(ctx, this);
         }
 
         if (JdbcUtils.serializer != null)
@@ -2255,7 +2519,6 @@ public class IgniteH2Indexing implements GridQueryIndexing {
             log.debug("Stopping cache query index...");
 
 //        unregisterMBean(); TODO https://issues.apache.org/jira/browse/IGNITE-2139
-
         if (ctx != null && !ctx.cache().context().database().persistenceEnabled()) {
             for (Schema schema : schemas.values())
                 schema.onDrop();
@@ -2778,7 +3041,7 @@ public class IgniteH2Indexing implements GridQueryIndexing {
     /**
      * Information about table in database.
      */
-    private class TableDescriptor implements GridH2Table.IndexesFactory {
+    private class TableDescriptor implements GridH2SystemIndexFactory {
         /** */
         private final String fullTblName;
 
@@ -2795,9 +3058,6 @@ public class IgniteH2Indexing implements GridQueryIndexing {
         private GridLuceneIndex luceneIdx;
 
         /** */
-        private Index pkTreeIdx;
-
-        /** */
         private H2PkHashIndex pkHashIdx;
 
         /**
@@ -2808,7 +3068,7 @@ public class IgniteH2Indexing implements GridQueryIndexing {
             this.type = type;
             this.schema = schema;
 
-            String tblName = escapeName(type.tableName() != null ? type.tableName() : type.name(), schema.escapeAll());
+            String tblName = escapeName(type.tableName(), schema.escapeAll());
 
             fullTblName = schema.schemaName + "." + tblName;
         }
@@ -2846,22 +3106,23 @@ public class IgniteH2Indexing implements GridQueryIndexing {
             return S.toString(TableDescriptor.class, this);
         }
 
-        /** {@inheritDoc} */
-        @Override public H2RowFactory createRowFactory(GridH2Table tbl) {
-            int cacheId = CU.cacheId(schema.ccfg.getName());
-
-            GridCacheContext cctx = ctx.cache().context().cacheContext(cacheId);
+        /**
+         * Create H2 row factory.
+         *
+         * @param rowDesc Row descriptor.
+         * @return H2 row factory.
+         */
+        H2RowFactory rowFactory(GridH2RowDescriptor rowDesc) {
+            GridCacheContext cctx = schema.cacheContext();
 
             if (cctx.affinityNode() && cctx.offheapIndex())
-                return new H2RowFactory(tbl.rowDescriptor(), cctx);
+                return new H2RowFactory(rowDesc, cctx);
 
             return null;
         }
 
         /** {@inheritDoc} */
-        @Override public ArrayList<Index> createIndexes(GridH2Table tbl) {
-            this.tbl = tbl;
-
+        @Override public ArrayList<Index> createSystemIndexes(GridH2Table tbl) {
             ArrayList<Index> idxs = new ArrayList<>();
 
             IndexColumn keyCol = tbl.indexColumn(KEY_COL, SortOrder.ASCENDING);
@@ -2870,25 +3131,27 @@ public class IgniteH2Indexing implements GridQueryIndexing {
             if (affCol != null && equal(affCol, keyCol))
                 affCol = null;
 
-            int cacheId = CU.cacheId(schema.ccfg.getName());
-
             Index hashIdx = createHashIndex(
-                    cacheId,
-                    "_key_PK_hash",
-                    tbl,
-                    treeIndexColumns(new ArrayList<IndexColumn>(2), keyCol, affCol));
+                schema,
+                tbl,
+                "_key_PK_hash",
+                treeIndexColumns(new ArrayList<IndexColumn>(2), keyCol, affCol)
+            );
 
             if (hashIdx != null)
                 idxs.add(hashIdx);
 
             // Add primary key index.
-            idxs.add(createSortedIndex(
-                cacheId,
+            Index pkIdx = createSortedIndex(
+                schema,
                 "_key_PK",
                 tbl,
                 true,
                 treeIndexColumns(new ArrayList<IndexColumn>(2), keyCol, affCol),
-                -1));
+                -1
+            );
+
+            idxs.add(pkIdx);
 
             if (type().valueClass() == String.class) {
                 try {
@@ -2901,50 +3164,40 @@ public class IgniteH2Indexing implements GridQueryIndexing {
 
             boolean affIdxFound = false;
 
-            for (Map.Entry<String, GridQueryIndexDescriptor> e : type.indexes().entrySet()) {
-                String name = e.getKey();
-                GridQueryIndexDescriptor idx = e.getValue();
+            GridQueryIndexDescriptor textIdx = type.textIndex();
 
-                if (idx.type() == QueryIndexType.FULLTEXT) {
-                    try {
-                        luceneIdx = new GridLuceneIndex(ctx, schema.offheap, schema.spaceName, type);
-                    }
-                    catch (IgniteCheckedException e1) {
-                        throw new IgniteException(e1);
-                    }
+            if (textIdx != null) {
+                try {
+                    luceneIdx = new GridLuceneIndex(ctx, schema.offheap, schema.spaceName, type);
                 }
-                else {
-                    List<IndexColumn> cols = new ArrayList<>(idx.fields().size() + 2);
-
-                    boolean escapeAll = schema.escapeAll();
+                catch (IgniteCheckedException e1) {
+                    throw new IgniteException(e1);
+                }
+            }
 
-                    for (String field : idx.fields()) {
-                        String fieldName = escapeAll ? field : escapeName(field, false).toUpperCase();
+            // Locate index where affinity column is first (if any).
+            if (affCol != null) {
+                for (GridQueryIndexDescriptor idxDesc : type.indexes().values()) {
+                    if (idxDesc.type() != QueryIndexType.SORTED)
+                        continue;
 
-                        Column col = tbl.getColumn(fieldName);
+                    String firstField = idxDesc.fields().iterator().next();
 
-                        cols.add(tbl.indexColumn(col.getColumnId(),
-                            idx.descending(field) ? SortOrder.DESCENDING : SortOrder.ASCENDING));
-                    }
+                    String firstFieldName =
+                        schema.escapeAll() ? firstField : escapeName(firstField, false).toUpperCase();
 
-                    if (idx.type() == QueryIndexType.SORTED) {
-                        // We don't care about number of fields in affinity index, just affinity key must be the first.
-                        affIdxFound |= affCol != null && equal(cols.get(0), affCol);
+                    Column col = tbl.getColumn(firstFieldName);
 
-                        cols = treeIndexColumns(cols, keyCol, affCol);
+                    IndexColumn idxCol = tbl.indexColumn(col.getColumnId(),
+                        idxDesc.descending(firstField) ? SortOrder.DESCENDING : SortOrder.ASCENDING);
 
-                        idxs.add(createSortedIndex(cacheId, name, tbl, false, cols, idx.inlineSize()));
-                    }
-                    else if (idx.type() == QueryIndexType.GEOSPATIAL)
-                        idxs.add(createH2SpatialIndex(tbl, name, cols.toArray(new IndexColumn[cols.size()])));
-                    else
-                        throw new IllegalStateException("Index type: " + idx.type());
+                    affIdxFound |= equal(idxCol, affCol);
                 }
             }
 
             // Add explicit affinity key index if nothing alike was found.
             if (affCol != null && !affIdxFound) {
-                idxs.add(createSortedIndex(cacheId, "AFFINITY_KEY", tbl, false,
+                idxs.add(createSortedIndex(schema, "AFFINITY_KEY", tbl, false,
                     treeIndexColumns(new ArrayList<IndexColumn>(2), affCol, keyCol), -1));
             }
 
@@ -2952,121 +3205,92 @@ public class IgniteH2Indexing implements GridQueryIndexing {
         }
 
         /**
-         * @param cacheId Cache ID.
-         * @param name Index name,
-         * @param tbl Table.
-         * @param pk Primary key flag.
-         * @param cols Columns.
-         * @return Index.
+         * Get collection of user indexes.
+         *
+         * @return User indexes.
          */
-        private Index createSortedIndex(
-            int cacheId,
-            String name,
-            GridH2Table tbl,
-            boolean pk,
-            List<IndexColumn> cols,
-            int inlineSize
-        ) {
-            try {
-                GridCacheSharedContext<Object, Object> scctx = ctx.cache().context();
+        public Collection<GridH2IndexBase> createUserIndexes() {
+            assert tbl != null;
 
-                GridCacheContext cctx = scctx.cacheContext(cacheId);
+            ArrayList<GridH2IndexBase> res = new ArrayList<>();
 
-                if (log.isInfoEnabled())
-                    log.info("Creating cache index [cacheId=" + cctx.cacheId() + ", idxName=" + name + ']');
+            for (GridQueryIndexDescriptor idxDesc : type.indexes().values()) {
+                GridH2IndexBase idx = createUserIndex(idxDesc);
 
-                final int segments = tbl.rowDescriptor().configuration().getQueryParallelism();
-
-                return new H2TreeIndex(cctx, tbl, name, pk, cols, inlineSize, segments);
-            }
-            catch (IgniteCheckedException e) {
-                throw new IgniteException(e);
+                res.add(idx);
             }
+
+            return res;
         }
 
         /**
+         * Create user index.
+         *
+         * @param idxDesc Index descriptor.
          * @return Index.
          */
-        private Index createHashIndex(
-            int cacheId,
-            String name,
-            GridH2Table tbl,
-            List<IndexColumn> cols
-        ) {
-            GridCacheSharedContext<Object, Object> scctx = ctx.cache().context();
+        private GridH2IndexBase createUserIndex(GridQueryIndexDescriptor idxDesc) {
+            String name = schema.escapeAll() ? idxDesc.name() : escapeName(idxDesc.name(), false).toUpperCase();
 
-            GridCacheContext cctx = scctx.cacheContext(cacheId);
+            IndexColumn keyCol = tbl.indexColumn(KEY_COL, SortOrder.ASCENDING);
+            IndexColumn affCol = tbl.getAffinityKeyColumn();
 
-            if (cctx.affinityNode() && cctx.offheapIndex()) {
-                assert pkHashIdx == null : pkHashIdx;
+            List<IndexColumn> cols = new ArrayList<>(idxDesc.fields().size() + 2);
 
-                pkHashIdx = new H2PkHashIndex(
-                    cctx,
-                    tbl,
-                    name,
-                    cols);
+            boolean escapeAll = schema.escapeAll();
 
-                return pkHashIdx;
-            }
+            for (String field : idxDesc.fields()) {
+                String fieldName = escapeAll ? field : escapeName(field, false).toUpperCase();
 
-            return null;
-        }
+                Column col = tbl.getColumn(fieldName);
 
-        /**
-         *
-         */
-        void onDrop() {
-            dataTables.remove(tbl.identifier(), tbl);
+                cols.add(tbl.indexColumn(col.getColumnId(),
+                    idxDesc.descending(field) ? SortOrder.DESCENDING : SortOrder.ASCENDING));
+            }
 
-            tbl.destroy();
+            if (idxDesc.type() == QueryIndexType.SORTED) {
+                cols = treeIndexColumns(cols, keyCol, affCol);
 
-            U.closeQuiet(luceneIdx);
+                return createSortedIndex(schema, name, tbl, false, cols, idxDesc.inlineSize());
+            }
+            else if (idxDesc.type() == QueryIndexType.GEOSPATIAL)
+                return createSpatialIndex(tbl, name, cols.toArray(new IndexColumn[cols.size()]));
+
+            throw new IllegalStateException("Index type: " + idxDesc.type());
         }
 
         /**
+         * Create hash index.
+         *
+         * @param schema Schema.
          * @param tbl Table.
          * @param idxName Index name.
          * @param cols Columns.
+         * @return Index.
          */
-        private SpatialIndex createH2SpatialIndex(
-            GridH2Table tbl,
-            String idxName,
-            IndexColumn[] cols
-        ) {
-            String className = "org.apache.ignite.internal.processors.query.h2.opt.GridH2SpatialIndex";
-
-            try {
-                Class<?> cls = Class.forName(className);
+        private Index createHashIndex(Schema schema, GridH2Table tbl, String idxName, List<IndexColumn> cols) {
+            GridCacheContext cctx = schema.cacheContext();
 
-                Constructor<?> ctor = cls.getConstructor(
-                    GridH2Table.class,
-                    String.class,
-                    Integer.TYPE,
-                    IndexColumn[].class);
-
-                if (!ctor.isAccessible())
-                    ctor.setAccessible(true);
+            if (cctx.affinityNode() && cctx.offheapIndex()) {
+                assert pkHashIdx == null : pkHashIdx;
 
-                final int segments = tbl.rowDescriptor().configuration().getQueryParallelism();
+                pkHashIdx = new H2PkHashIndex(cctx, tbl, idxName, cols);
 
-                return (SpatialIndex)ctor.newInstance(tbl, idxName, segments, cols);
-            }
-            catch (Exception e) {
-                throw new IgniteException("Failed to instantiate: " + className, e);
+                return pkHashIdx;
             }
+
+            return null;
         }
 
         /**
-         * @param idxName Index name.
-         * @param tbl Table.
-         * @param pk Primary key flag.
-         * @param columns Index column list.
-         * @return
+         *
          */
-        private Index createTreeIndex(String idxName, GridH2Table tbl, boolean pk, List<IndexColumn> columns) {
-            final int segments = tbl.rowDescriptor().configuration().getQueryParallelism();
+        void onDrop() {
+            dataTables.remove(tbl.identifier(), tbl);
+
+            tbl.destroy();
 
-            return new GridH2TreeIndex(idxName, tbl, pk, columns, segments);
+            U.closeQuiet(luceneIdx);
         }
     }
 
@@ -3252,6 +3476,13 @@ public class IgniteH2Indexing implements GridQueryIndexing {
         }
 
         /**
+         * @return Cache context.
+         */
+        public GridCacheContext cacheContext() {
+            return cctx;
+        }
+
+        /**
          * @param tbl Table descriptor.
          */
         public void add(TableDescriptor tbl) {
@@ -3368,7 +3599,7 @@ public class IgniteH2Indexing implements GridQueryIndexing {
 
         /** {@inheritDoc} */
         @Override public GridCacheContext<?, ?> context() {
-            return schema.cctx;
+            return schema.cacheContext();
         }
 
         /** {@inheritDoc} */
@@ -3625,4 +3856,63 @@ public class IgniteH2Indexing implements GridQueryIndexing {
             lastUsage = U.currentTimeMillis();
         }
     }
+
+    /**
+     * H2 Table engine.
+     */
+    public static class H2TableEngine implements TableEngine {
+        /** */
+        private static GridH2RowDescriptor rowDesc0;
+
+        /** */
+        private static H2RowFactory rowFactory0;
+
+        /** */
+        private static TableDescriptor tblDesc0;
+
+        /** */
+        private static GridH2Table resTbl0;
+
+        /**
+         * Creates table using given connection, DDL clause for given type descriptor and list of indexes.
+         *
+         * @param conn Connection.
+         * @param sql DDL clause.
+         * @param rowDesc Row descriptor.
+         * @param rowFactory Row factory.
+         * @param tblDesc Table descriptor.
+         * @throws SQLException If failed.
+         * @return Created table.
+         */
+        public static synchronized GridH2Table createTable(Connection conn, String sql,
+            @Nullable GridH2RowDescriptor rowDesc, H2RowFactory rowFactory, TableDescriptor tblDesc)
+            throws SQLException {
+            rowDesc0 = rowDesc;
+            rowFactory0 = rowFactory;
+            tblDesc0 = tblDesc;
+
+            try {
+                try (Statement s = conn.createStatement()) {
+                    s.execute(sql + " engine \"" + H2TableEngine.class.getName() + "\"");
+                }
+
+                tblDesc.tbl = resTbl0;
+
+                return resTbl0;
+            }
+            finally {
+                resTbl0 = null;
+                tblDesc0 = null;
+                rowFactory0 = null;
+                rowDesc0 = null;
+            }
+        }
+
+        /** {@inheritDoc} */
+        @Override public TableBase createTable(CreateTableData createTblData) {
+            resTbl0 = new GridH2Table(createTblData, rowDesc0, rowFactory0, tblDesc0, tblDesc0.schema.spaceName);
+
+            return resTbl0;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/ddl/DdlStatementsProcessor.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/ddl/DdlStatementsProcessor.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/ddl/DdlStatementsProcessor.java
new file mode 100644
index 0000000..5b4b494
--- /dev/null
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/ddl/DdlStatementsProcessor.java
@@ -0,0 +1,208 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.query.h2.ddl;
+
+import java.sql.PreparedStatement;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.cache.QueryIndex;
+import org.apache.ignite.cache.query.QueryCursor;
+import org.apache.ignite.internal.GridKernalContext;
+import org.apache.ignite.internal.IgniteInternalFuture;
+import org.apache.ignite.internal.processors.cache.QueryCursorImpl;
+import org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode;
+import org.apache.ignite.internal.processors.query.GridQueryProperty;
+import org.apache.ignite.internal.processors.query.GridQueryTypeDescriptor;
+import org.apache.ignite.internal.processors.query.IgniteSQLException;
+import org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing;
+import org.apache.ignite.internal.processors.query.h2.opt.GridH2Table;
+import org.apache.ignite.internal.processors.query.h2.sql.GridSqlCreateIndex;
+import org.apache.ignite.internal.processors.query.h2.sql.GridSqlDropIndex;
+import org.apache.ignite.internal.processors.query.h2.sql.GridSqlQueryParser;
+import org.apache.ignite.internal.processors.query.h2.sql.GridSqlStatement;
+import org.apache.ignite.internal.processors.query.schema.SchemaOperationException;
+import org.h2.command.Prepared;
+import org.h2.command.ddl.CreateIndex;
+import org.h2.command.ddl.DropIndex;
+import org.h2.jdbc.JdbcPreparedStatement;
+
+import static org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.UPDATE_RESULT_META;
+
+/**
+ * DDL statements processor.<p>
+ * Contains higher level logic to handle operations as a whole and communicate with the client.
+ */
+public class DdlStatementsProcessor {
+    /** Kernal context. */
+    GridKernalContext ctx;
+
+    /** Indexing. */
+    IgniteH2Indexing idx;
+
+    /**
+     * Initialize message handlers and this' fields needed for further operation.
+     *
+     * @param ctx Kernal context.
+     * @param idx Indexing.
+     */
+    public void start(final GridKernalContext ctx, IgniteH2Indexing idx) {
+        this.ctx = ctx;
+        this.idx = idx;
+    }
+
+    /**
+     * Execute DDL statement.
+     *
+     * @param stmt H2 statement to parse and execute.
+     */
+    @SuppressWarnings("unchecked")
+    public QueryCursor<List<?>> runDdlStatement(PreparedStatement stmt)
+        throws IgniteCheckedException {
+        assert stmt instanceof JdbcPreparedStatement;
+
+        IgniteInternalFuture fut;
+
+        try {
+            GridSqlStatement gridStmt = new GridSqlQueryParser(false).parse(GridSqlQueryParser.prepared(stmt));
+
+            if (gridStmt instanceof GridSqlCreateIndex) {
+                GridSqlCreateIndex createIdx = (GridSqlCreateIndex)gridStmt;
+
+                String spaceName = idx.space(createIdx.schemaName());
+
+                QueryIndex newIdx = new QueryIndex();
+
+                newIdx.setName(createIdx.index().getName());
+
+                newIdx.setIndexType(createIdx.index().getIndexType());
+
+                LinkedHashMap<String, Boolean> flds = new LinkedHashMap<>();
+
+                GridH2Table tbl = idx.dataTable(createIdx.schemaName(), createIdx.tableName());
+
+                if (tbl == null)
+                    throw new IgniteSQLException("Table not found [schemaName=" + createIdx.schemaName() + ", " +
+                        "tblName=" + createIdx.tableName() + ']', IgniteQueryErrorCode.TABLE_NOT_FOUND);
+
+                assert tbl.rowDescriptor() != null;
+
+                // Let's replace H2's table and property names by those operated by GridQueryProcessor.
+                GridQueryTypeDescriptor typeDesc = tbl.rowDescriptor().type();
+
+                for (Map.Entry<String, Boolean> e : createIdx.index().getFields().entrySet()) {
+                    GridQueryProperty prop = typeDesc.property(e.getKey());
+
+                    if (prop == null)
+                        throw new IgniteSQLException("Property not found [typeName=" + typeDesc.name() + ", propName=" +
+                            e.getKey() + ']');
+
+                    flds.put(prop.name(), e.getValue());
+                }
+
+                newIdx.setFields(flds);
+
+                fut = ctx.query().dynamicIndexCreate(spaceName, typeDesc.tableName(), newIdx, createIdx.ifNotExists());
+            }
+            else if (gridStmt instanceof GridSqlDropIndex) {
+                GridSqlDropIndex dropIdx = (GridSqlDropIndex)gridStmt;
+
+                String spaceName = idx.space(dropIdx.schemaName());
+
+                fut = ctx.query().dynamicIndexDrop(spaceName, dropIdx.name(), dropIdx.ifExists());
+            }
+            else
+                throw new IgniteSQLException("Unexpected DDL operation [type=" + gridStmt.getClass() + ']',
+                    IgniteQueryErrorCode.UNEXPECTED_OPERATION);
+
+            fut.get();
+
+            QueryCursorImpl<List<?>> resCur = (QueryCursorImpl<List<?>>)new QueryCursorImpl(Collections.singletonList
+                (Collections.singletonList(0L)), null, false);
+
+            resCur.fieldsMeta(UPDATE_RESULT_META);
+
+            return resCur;
+        }
+        catch (SchemaOperationException e) {
+            throw convert(e);
+        }
+        catch (Exception e) {
+            throw new IgniteSQLException("DLL operation failed.", e);
+        }
+    }
+
+    /**
+     * @return {@link IgniteSQLException} with the message same as of {@code this}'s and
+     */
+    private IgniteSQLException convert(SchemaOperationException e) {
+        int sqlCode;
+
+        switch (e.code()) {
+            case SchemaOperationException.CODE_CACHE_NOT_FOUND:
+                sqlCode = IgniteQueryErrorCode.CACHE_NOT_FOUND;
+
+                break;
+
+            case SchemaOperationException.CODE_TABLE_NOT_FOUND:
+                sqlCode = IgniteQueryErrorCode.TABLE_NOT_FOUND;
+
+                break;
+
+            case SchemaOperationException.CODE_TABLE_EXISTS:
+                sqlCode = IgniteQueryErrorCode.TABLE_ALREADY_EXISTS;
+
+                break;
+
+            case SchemaOperationException.CODE_COLUMN_NOT_FOUND:
+                sqlCode = IgniteQueryErrorCode.COLUMN_NOT_FOUND;
+
+                break;
+
+            case SchemaOperationException.CODE_COLUMN_EXISTS:
+                sqlCode = IgniteQueryErrorCode.COLUMN_ALREADY_EXISTS;
+
+                break;
+
+            case SchemaOperationException.CODE_INDEX_NOT_FOUND:
+                sqlCode = IgniteQueryErrorCode.INDEX_NOT_FOUND;
+
+                break;
+
+            case SchemaOperationException.CODE_INDEX_EXISTS:
+                sqlCode = IgniteQueryErrorCode.INDEX_ALREADY_EXISTS;
+
+                break;
+
+            default:
+                sqlCode = IgniteQueryErrorCode.UNKNOWN;
+        }
+
+        return new IgniteSQLException(e.getMessage(), sqlCode);
+    }
+
+    /**
+     * @param cmd Statement.
+     * @return Whether {@code cmd} is a DDL statement we're able to handle.
+     */
+    public static boolean isDdlStatement(Prepared cmd) {
+        return cmd instanceof CreateIndex || cmd instanceof DropIndex;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java
index 67e294a..7163834 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java
@@ -376,7 +376,7 @@ public abstract class GridH2IndexBase extends BaseIndex {
 
     /** {@inheritDoc} */
     @Override public void remove(Session ses) {
-        throw DbException.getUnsupportedException("remove index");
+        // No-op: destroyed from owning table.
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2PrimaryScanIndex.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2PrimaryScanIndex.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2PrimaryScanIndex.java
new file mode 100644
index 0000000..097b34e
--- /dev/null
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2PrimaryScanIndex.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.internal.processors.query.h2.opt;
+
+import org.h2.engine.Session;
+import org.h2.result.SortOrder;
+import org.h2.table.TableFilter;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Wrapper type for primary key.
+ */
+@SuppressWarnings("PackageVisibleInnerClass")
+public class GridH2PrimaryScanIndex extends GridH2ScanIndex<GridH2IndexBase> {
+    /** */
+    static final String SCAN_INDEX_NAME_SUFFIX = "__SCAN_";
+
+    /** Parent table. */
+    private final GridH2Table tbl;
+
+    /** */
+    private final GridH2IndexBase hashIdx;
+
+    /**
+     * Constructor.
+     *
+     * @param tbl Table.
+     * @param treeIdx Tree index.
+     * @param hashIdx Hash index.
+     */
+    GridH2PrimaryScanIndex(GridH2Table tbl, GridH2IndexBase treeIdx, @Nullable GridH2IndexBase hashIdx) {
+        super(treeIdx);
+
+        this.tbl = tbl;
+        this.hashIdx = hashIdx;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected GridH2IndexBase delegate() {
+        boolean rebuildFromHashInProgress = tbl.rebuildFromHashInProgress();
+
+        if (hashIdx != null)
+            return rebuildFromHashInProgress ? hashIdx : super.delegate();
+        else {
+            assert !rebuildFromHashInProgress;
+
+            return super.delegate();
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override public double getCost(Session ses, int[] masks, TableFilter[] filters, int filter,
+        SortOrder sortOrder) {
+        long rows = getRowCountApproximation();
+
+        double baseCost = getCostRangeIndex(masks, rows, filters, filter, sortOrder, true);
+
+        int mul = delegate().getDistributedMultiplier(ses, filters, filter);
+
+        return mul * baseCost;
+    }
+
+    /** {@inheritDoc} */
+    @Override public String getPlanSQL() {
+        return delegate().getTable().getSQL() + "." + SCAN_INDEX_NAME_SUFFIX;
+    }
+
+    /** {@inheritDoc} */
+    @Override public String getName() {
+        return delegate().getName() + SCAN_INDEX_NAME_SUFFIX;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2edb935c/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SystemIndexFactory.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SystemIndexFactory.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SystemIndexFactory.java
new file mode 100644
index 0000000..f150b6a
--- /dev/null
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SystemIndexFactory.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.internal.processors.query.h2.opt;
+
+import org.apache.ignite.internal.processors.query.h2.database.H2TreeIndex;
+import org.h2.index.Index;
+
+import java.util.ArrayList;
+
+/**
+ * Factory for system table indexes.
+ */
+public interface GridH2SystemIndexFactory {
+    /**
+     * Create list of indexes. First must be primary key, after that all unique indexes and
+     * only then non-unique indexes.
+     * All indexes must be subtypes of {@link H2TreeIndex}.
+     *
+     * @param tbl Table to create indexes for.
+     * @return List of indexes.
+     */
+    ArrayList<Index> createSystemIndexes(GridH2Table tbl);
+}


[70/70] [abbrv] ignite git commit: Merge remote-tracking branch 'remotes/origin/ignite-2.0' into ignite-2893

Posted by sb...@apache.org.
Merge remote-tracking branch 'remotes/origin/ignite-2.0' into ignite-2893

# Conflicts:
#	modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java
#	modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheAtomicLongImpl.java
#	modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheAtomicReferenceImpl.java
#	modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheSemaphoreImpl.java
#	modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteOnePhaseCommitInvokeTest.java
#	modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
#	modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite2.java


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/89bfbad1
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/89bfbad1
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/89bfbad1

Branch: refs/heads/ignite-2893
Commit: 89bfbad19b398446320c7e519aa9d6e74d49c037
Parents: 81835e4
Author: sboikov <sb...@gridgain.com>
Authored: Thu Apr 20 10:46:58 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Thu Apr 20 10:46:58 2017 +0300

----------------------------------------------------------------------
 .../processors/cache/transactions/IgniteTxEntry.java     |  9 ---------
 .../datastructures/DataStructuresProcessor.java          |  6 +++---
 .../datastructures/GridCacheAtomicReferenceImpl.java     |  6 ------
 .../datastructures/GridCacheAtomicStampedImpl.java       |  6 ------
 .../processors/datastructures/GridCacheLockImpl.java     | 11 +++++------
 .../datastructures/GridCacheSemaphoreImpl.java           |  4 ++--
 6 files changed, 10 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/89bfbad1/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java
index c9c4f34..163ed99 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java
@@ -88,15 +88,6 @@ public class IgniteTxEntry implements GridPeerDeployAware, Message {
     /** Flag indicating that old value for 'invoke' operation was non null on primary node. */
     private static final int TX_ENTRY_OLD_VAL_ON_PRIMARY = 0x04;
 
-    /** Skip store flag bit mask. */
-    private static final int TX_ENTRY_SKIP_STORE_FLAG_MASK = 0x01;
-
-    /** Keep binary flag. */
-    private static final int TX_ENTRY_KEEP_BINARY_FLAG_MASK = 0x02;
-
-    /** Flag indicating that old value for 'invoke' operation was non null on primary node. */
-    private static final int TX_ENTRY_OLD_VAL_ON_PRIMARY = 0x04;
-
     /** Prepared flag updater. */
     private static final AtomicIntegerFieldUpdater<IgniteTxEntry> PREPARED_UPD =
         AtomicIntegerFieldUpdater.newUpdater(IgniteTxEntry.class, "prepared");

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bfbad1/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/DataStructuresProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/DataStructuresProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/DataStructuresProcessor.java
index fb1770e..0a439dc 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/DataStructuresProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/DataStructuresProcessor.java
@@ -629,7 +629,7 @@ public final class DataStructuresProcessor extends GridProcessorAdapter implemen
      * @param name Atomic long name.
      * @throws IgniteCheckedException If removing failed.
      */
-    public final void removeAtomicLong(final String name) throws IgniteCheckedException {
+    final void removeAtomicLong(final String name) throws IgniteCheckedException {
         assert name != null;
         assert dsCacheCtx != null;
 
@@ -788,7 +788,7 @@ public final class DataStructuresProcessor extends GridProcessorAdapter implemen
      * @param name Atomic reference name.
      * @throws IgniteCheckedException If removing failed.
      */
-    public final void removeAtomicReference(final String name) throws IgniteCheckedException {
+    final void removeAtomicReference(final String name) throws IgniteCheckedException {
         assert name != null;
         assert dsCacheCtx != null;
 
@@ -890,7 +890,7 @@ public final class DataStructuresProcessor extends GridProcessorAdapter implemen
      * @param name Atomic stamped name.
      * @throws IgniteCheckedException If removing failed.
      */
-    public final void removeAtomicStamped(final String name) throws IgniteCheckedException {
+    final void removeAtomicStamped(final String name) throws IgniteCheckedException {
         assert name != null;
         assert dsCacheCtx != null;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bfbad1/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheAtomicReferenceImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheAtomicReferenceImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheAtomicReferenceImpl.java
index 667fd15..b7dc007 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheAtomicReferenceImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheAtomicReferenceImpl.java
@@ -28,7 +28,6 @@ import javax.cache.processor.EntryProcessorResult;
 import javax.cache.processor.MutableEntry;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteException;
-import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.cache.CacheEntryProcessor;
 import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.processors.cache.GridCacheContext;
@@ -54,9 +53,6 @@ public final class GridCacheAtomicReferenceImpl<T> implements GridCacheAtomicRef
             }
         };
 
-    /** Logger. */
-    private IgniteLogger log;
-
     /** Atomic reference name. */
     private String name;
 
@@ -103,8 +99,6 @@ public final class GridCacheAtomicReferenceImpl<T> implements GridCacheAtomicRef
         this.key = key;
         this.atomicView = atomicView;
         this.name = name;
-
-        log = ctx.logger(getClass());
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bfbad1/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheAtomicStampedImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheAtomicStampedImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheAtomicStampedImpl.java
index 877b158..3f14942 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheAtomicStampedImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheAtomicStampedImpl.java
@@ -28,7 +28,6 @@ import javax.cache.processor.EntryProcessorResult;
 import javax.cache.processor.MutableEntry;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteException;
-import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.cache.CacheEntryProcessor;
 import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.processors.cache.GridCacheContext;
@@ -54,9 +53,6 @@ public final class GridCacheAtomicStampedImpl<T, S> implements GridCacheAtomicSt
             }
         };
 
-    /** Logger. */
-    private IgniteLogger log;
-
     /** Atomic stamped name. */
     private String name;
 
@@ -103,8 +99,6 @@ public final class GridCacheAtomicStampedImpl<T, S> implements GridCacheAtomicSt
         this.key = key;
         this.atomicView = atomicView;
         this.name = name;
-
-        log = ctx.logger(getClass());
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bfbad1/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheLockImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheLockImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheLockImpl.java
index 341c59b..e154850 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheLockImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheLockImpl.java
@@ -725,9 +725,9 @@ public final class GridCacheLockImpl implements GridCacheLockEx, IgniteChangeGlo
 
                                 // If this lock is fair, remove this node from queue.
                                 if (val.isFair() && newVal == 0) {
-                                    UUID removedNode = val.getNodes().removeFirst();
+                                    UUID rmvdNode = val.getNodes().removeFirst();
 
-                                    assert(thisNode.equals(removedNode));
+                                    assert(thisNode.equals(rmvdNode));
                                 }
 
                                 // Get global condition queue.
@@ -1127,7 +1127,7 @@ public final class GridCacheLockImpl implements GridCacheLockEx, IgniteChangeGlo
                 return;
 
             // Check if update came from this node.
-            boolean local = sync.isLockedLocally(val.getId());
+            boolean loc = sync.isLockedLocally(val.getId());
 
             // Process any incoming signals.
             boolean incomingSignals = sync.checkIncomingSignals(val);
@@ -1142,7 +1142,7 @@ public final class GridCacheLockImpl implements GridCacheLockEx, IgniteChangeGlo
             sync.setCurrentOwnerThread(val.getThreadId());
 
             // Check if any threads waiting on this node need to be notified.
-            if ((incomingSignals || sync.getPermits() == 0) && !local) {
+            if ((incomingSignals || sync.getPermits() == 0) && !loc) {
                 // Try to notify any waiting threads.
                 sync.release(0);
             }
@@ -1160,9 +1160,8 @@ public final class GridCacheLockImpl implements GridCacheLockEx, IgniteChangeGlo
             if (nodeId.equals(sync.getOwnerNode())) {
                 sync.setBroken(true);
 
-                if (!sync.failoverSafe) {
+                if (!sync.failoverSafe)
                     sync.interruptAll();
-                }
             }
 
             // Try to notify any waiting threads.

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bfbad1/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheSemaphoreImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheSemaphoreImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheSemaphoreImpl.java
index 903423d..edc322e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheSemaphoreImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheSemaphoreImpl.java
@@ -803,7 +803,7 @@ public final class GridCacheSemaphoreImpl implements GridCacheSemaphoreEx, Ignit
         try {
             initializeSemaphore();
 
-            boolean result = sync.tryAcquireSharedNanos(1, unit.toNanos(timeout));
+            boolean res = sync.tryAcquireSharedNanos(1, unit.toNanos(timeout));
 
             if (isBroken()) {
                 Thread.interrupted(); // Clear interrupt flag.
@@ -811,7 +811,7 @@ public final class GridCacheSemaphoreImpl implements GridCacheSemaphoreEx, Ignit
                 throw new InterruptedException();
             }
 
-            return result;
+            return res;
         }
         catch (IgniteCheckedException e) {
             throw U.convertException(e);


[07/70] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math module to Ignite ML module added missed licenses renamed packages fixed wrong ml profile activation

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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));
-        }
-    }
-}


[39/70] [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/f82ed018
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/f82ed018
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/f82ed018

Branch: refs/heads/ignite-2893
Commit: f82ed01807c80b36b7e361a5800ea131c1431c14
Parents: 9b21c85
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:43:28 2017 +0300

----------------------------------------------------------------------
 .../cache/GridCacheMvccPartitionedSelfTest.java | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/f82ed018/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);


[18/70] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math module to Ignite ML module added missed licenses renamed packages fixed wrong ml profile activation

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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&lt;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&lt;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 &gt;= 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  =   &gt;   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
+     * -&lt; 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 &gt;= 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 &lt;= 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&lt;30} simply looks up a table in O(1).
+     * For {@code k&gt;=30} uses stirlings approximation.
+     *
+     * @param k must hold {@code k &gt;= 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/d78e071a/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/d78e071a/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.
+    }
+}


[68/70] [abbrv] ignite git commit: Merge remote-tracking branch 'remotes/origin/ignite-2.0' into ignite-2893

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/81835e48/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81835e48/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81835e48/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java
----------------------------------------------------------------------
diff --cc modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java
index f7f61c6,163ed99..c9c4f34
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java
@@@ -68,26 -68,26 +68,35 @@@ public class IgniteTxEntry implements G
      private static final long serialVersionUID = 0L;
  
      /** Dummy version for non-existing entry read in SERIALIZABLE transaction. */
-     public static final GridCacheVersion SER_READ_EMPTY_ENTRY_VER = new GridCacheVersion(0, 0, 0, 0);
+     public static final GridCacheVersion SER_READ_EMPTY_ENTRY_VER = new GridCacheVersion(0, 0, 0);
  
      /** Dummy version for any existing entry read in SERIALIZABLE transaction. */
-     public static final GridCacheVersion SER_READ_NOT_EMPTY_VER = new GridCacheVersion(0, 0, 0, 1);
+     public static final GridCacheVersion SER_READ_NOT_EMPTY_VER = new GridCacheVersion(0, 0, 1);
  
      /** */
-     public static final GridCacheVersion GET_ENTRY_INVALID_VER_UPDATED = new GridCacheVersion(0, 0, 0, 2);
+     public static final GridCacheVersion GET_ENTRY_INVALID_VER_UPDATED = new GridCacheVersion(0, 0, 2);
  
      /** */
-     public static final GridCacheVersion GET_ENTRY_INVALID_VER_AFTER_GET = new GridCacheVersion(0, 0, 0, 3);
+     public static final GridCacheVersion GET_ENTRY_INVALID_VER_AFTER_GET = new GridCacheVersion(0, 0, 3);
+ 
+     /** Skip store flag bit mask. */
+     private static final int TX_ENTRY_SKIP_STORE_FLAG_MASK = 0x01;
+ 
+     /** Keep binary flag. */
+     private static final int TX_ENTRY_KEEP_BINARY_FLAG_MASK = 0x02;
+ 
+     /** Flag indicating that old value for 'invoke' operation was non null on primary node. */
+     private static final int TX_ENTRY_OLD_VAL_ON_PRIMARY = 0x04;
  
 +    /** Skip store flag bit mask. */
 +    private static final int TX_ENTRY_SKIP_STORE_FLAG_MASK = 0x01;
 +
 +    /** Keep binary flag. */
 +    private static final int TX_ENTRY_KEEP_BINARY_FLAG_MASK = 0x02;
 +
 +    /** Flag indicating that old value for 'invoke' operation was non null on primary node. */
 +    private static final int TX_ENTRY_OLD_VAL_ON_PRIMARY = 0x04;
 +
      /** Prepared flag updater. */
      private static final AtomicIntegerFieldUpdater<IgniteTxEntry> PREPARED_UPD =
          AtomicIntegerFieldUpdater.newUpdater(IgniteTxEntry.class, "prepared");

http://git-wip-us.apache.org/repos/asf/ignite/blob/81835e48/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/DataStructuresProcessor.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81835e48/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheAtomicLongImpl.java
----------------------------------------------------------------------
diff --cc modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheAtomicLongImpl.java
index f74d8a4,be718cf..3f07151
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheAtomicLongImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheAtomicLongImpl.java
@@@ -32,10 -29,17 +32,11 @@@ import org.apache.ignite.cache.CacheEnt
  import org.apache.ignite.internal.GridKernalContext;
  import org.apache.ignite.internal.processors.cache.GridCacheContext;
  import org.apache.ignite.internal.processors.cache.IgniteInternalCache;
 -import org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal;
 -import org.apache.ignite.internal.util.typedef.internal.CU;
  import org.apache.ignite.internal.util.typedef.internal.S;
  import org.apache.ignite.internal.util.typedef.internal.U;
+ import org.apache.ignite.internal.processors.cluster.IgniteChangeGlobalStateSupport;
  import org.apache.ignite.lang.IgniteBiTuple;
  
 -import static org.apache.ignite.internal.util.typedef.internal.CU.retryTopologySafe;
 -import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC;
 -import static org.apache.ignite.transactions.TransactionIsolation.REPEATABLE_READ;
 -
  /**
   * Cache atomic long implementation.
   */
@@@ -363,81 -422,38 +364,92 @@@ public final class GridCacheAtomicLongI
          }
      }
  
 +    /** {@inheritDoc} */
++    @Override public void onActivate(GridKernalContext kctx) throws IgniteCheckedException {
++        this.atomicView = kctx.cache().atomicsCache();
++        this.ctx = atomicView.context();
++    }
++
++    /** {@inheritDoc} */
++    @Override public void onDeActivate(GridKernalContext kctx) throws IgniteCheckedException {
++        // No-op.
++    }
++
++    /** {@inheritDoc} */
 +    @Override public void writeExternal(ObjectOutput out) throws IOException {
 +        out.writeObject(ctx.kernalContext());
 +        out.writeUTF(name);
 +    }
 +
 +    /** {@inheritDoc} */
 +    @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
 +        IgniteBiTuple<GridKernalContext, String> t = stash.get();
 +
 +        t.set1((GridKernalContext)in.readObject());
 +        t.set2(in.readUTF());
 +    }
 +
      /**
 -     * Method returns callable for execution {@link #addAndGet(long)} operation in async and sync mode.
 +     * Reconstructs object on unmarshalling.
       *
 -     * @param l Value will be added to atomic long.
 -     * @return Callable for execution in async and sync mode.
 +     * @return Reconstructed object.
 +     * @throws ObjectStreamException Thrown in case of unmarshalling error.
       */
 -    private Callable<Long> internalAddAndGet(final long l) {
 -        return retryTopologySafe(new Callable<Long>() {
 -            @Override public Long call() throws Exception {
 -                try (GridNearTxLocal tx = CU.txStartInternal(ctx, atomicView, PESSIMISTIC, REPEATABLE_READ)) {
 -                    GridCacheAtomicLongValue val = atomicView.get(key);
 +    private Object readResolve() throws ObjectStreamException {
 +        try {
 +            IgniteBiTuple<GridKernalContext, String> t = stash.get();
  
 -                    if (val == null)
 -                        throw new IgniteCheckedException("Failed to find atomic long with given name: " + name);
 +            return t.get1().dataStructures().atomicLong(t.get2(), 0L, false);
 +        }
 +        catch (IgniteCheckedException e) {
 +            throw U.withCause(new InvalidObjectException(e.getMessage()), e);
 +        }
 +        finally {
 +            stash.remove();
 +        }
 +    }
  
 -                    long retVal = val.get() + l;
 +    /** {@inheritDoc} */
 +    @Override public String toString() {
 +        return S.toString(GridCacheAtomicLongImpl.class, this);
 +    }
  
 -                    val.set(retVal);
 +    /**
 +     *
 +     */
 +    static class GetAndSetProcessor implements
 +        CacheEntryProcessor<GridCacheInternalKey, GridCacheAtomicLongValue, Long> {
 +        /** */
 +        private static final long serialVersionUID = 0L;
 +
 +        /** */
 +        private final long newVal;
 +
 +        /**
 +         * @param newVal New value.
 +         */
 +        GetAndSetProcessor(long newVal) {
 +            this.newVal = newVal;
 +        }
  
 -                    atomicView.put(key, val);
 +        /** {@inheritDoc} */
 +        @Override public Long process(MutableEntry<GridCacheInternalKey, GridCacheAtomicLongValue> e, Object... args) {
 +            GridCacheAtomicLongValue val = e.getValue();
  
 -                    tx.commit();
 +            if (val == null)
 +                throw new EntryProcessorException("Failed to find atomic long: " + e.getKey().name());
  
 -                    return retVal;
 -                }
 -                catch (Error | Exception e) {
 -                    U.error(log, "Failed to add and get: " + this, e);
 +            long curVal = val.get();
  
 -                    throw e;
 -                }
 -            }
 -        });
 +            e.setValue(new GridCacheAtomicLongValue(newVal));
 +
 +            return curVal;
 +        }
 +
 +        /** {@inheritDoc} */
 +        @Override public String toString() {
 +            return S.toString(GetAndSetProcessor.class, this);
 +        }
      }
  
      /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/81835e48/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheAtomicReferenceImpl.java
----------------------------------------------------------------------
diff --cc modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheAtomicReferenceImpl.java
index a026bf3,4365468..667fd15
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheAtomicReferenceImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheAtomicReferenceImpl.java
@@@ -33,11 -29,18 +33,12 @@@ import org.apache.ignite.cache.CacheEnt
  import org.apache.ignite.internal.GridKernalContext;
  import org.apache.ignite.internal.processors.cache.GridCacheContext;
  import org.apache.ignite.internal.processors.cache.IgniteInternalCache;
 -import org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal;
  import org.apache.ignite.internal.util.typedef.F;
 -import org.apache.ignite.internal.util.typedef.internal.CU;
  import org.apache.ignite.internal.util.typedef.internal.S;
  import org.apache.ignite.internal.util.typedef.internal.U;
+ import org.apache.ignite.internal.processors.cluster.IgniteChangeGlobalStateSupport;
  import org.apache.ignite.lang.IgniteBiTuple;
  
 -import static org.apache.ignite.internal.processors.cache.GridCacheUtils.retryTopologySafe;
 -import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC;
 -import static org.apache.ignite.transactions.TransactionIsolation.REPEATABLE_READ;
 -
  /**
   * Cache atomic reference implementation.
   */
@@@ -220,6 -205,93 +221,17 @@@ public final class GridCacheAtomicRefer
          }
      }
  
 -    /**
 -     * Method returns callable for execution {@link #set(Object)} operation in async and sync mode.
 -     *
 -     * @param val Value will be set in reference .
 -     * @return Callable for execution in async and sync mode.
 -     */
 -    private Callable<Boolean> internalSet(final T val) {
 -        return retryTopologySafe(new Callable<Boolean>() {
 -            @Override public Boolean call() throws Exception {
 -                try (GridNearTxLocal tx = CU.txStartInternal(ctx, atomicView, PESSIMISTIC, REPEATABLE_READ)) {
 -                    GridCacheAtomicReferenceValue<T> ref = atomicView.get(key);
 -
 -                    if (ref == null)
 -                        throw new IgniteCheckedException("Failed to find atomic reference with given name: " + name);
 -
 -                    ref.set(val);
 -
 -                    atomicView.put(key, ref);
 -
 -                    tx.commit();
 -
 -                    return true;
 -                }
 -                catch (Error | Exception e) {
 -                    U.error(log, "Failed to set value [val=" + val + ", atomicReference=" + this + ']', e);
 -
 -                    throw e;
 -                }
 -            }
 -        });
 -    }
 -
 -    /**
 -     * Conditionally sets the new value. It will be set if {@code expValPred} is
 -     * evaluate to {@code true}.
 -     *
 -     * @param expVal Expected value.
 -     * @param newVal New value.
 -     * @return Callable for execution in async and sync mode.
 -     */
 -    private Callable<T> internalCompareAndSetAndGet(final T expVal, final T newVal) {
 -        return retryTopologySafe(new Callable<T>() {
 -            @Override public T call() throws Exception {
 -                try (GridNearTxLocal tx = CU.txStartInternal(ctx, atomicView, PESSIMISTIC, REPEATABLE_READ)) {
 -                    GridCacheAtomicReferenceValue<T> ref = atomicView.get(key);
 -
 -                    if (ref == null)
 -                        throw new IgniteCheckedException("Failed to find atomic reference with given name: " + name);
 -
 -                    T origVal = ref.get();
 -
 -                    if (!F.eq(expVal, origVal)) {
 -                        tx.setRollbackOnly();
 -
 -                        return origVal;
 -                    }
 -                    else {
 -                        ref.set(newVal);
 -
 -                        atomicView.getAndPut(key, ref);
 -
 -                        tx.commit();
 -
 -                        return expVal;
 -                    }
 -                }
 -                catch (Error | Exception e) {
 -                    U.error(log, "Failed to compare and value [expVal=" + expVal + ", newVal" +
 -                        newVal + ", atomicReference" + this + ']', e);
 -
 -                    throw e;
 -                }
 -            }
 -        });
 -    }
 -
+     /** {@inheritDoc} */
+     @Override public void onActivate(GridKernalContext kctx) throws IgniteCheckedException {
+         this.atomicView = kctx.cache().atomicsCache();
+         this.ctx = atomicView.context();
+     }
+ 
+     /** {@inheritDoc} */
+     @Override public void onDeActivate(GridKernalContext kctx) throws IgniteCheckedException {
 -
++        // No-op.
+     }
+ 
      /**
       * Check removed status.
       *

http://git-wip-us.apache.org/repos/asf/ignite/blob/81835e48/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheAtomicSequenceImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81835e48/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheAtomicStampedImpl.java
----------------------------------------------------------------------
diff --cc modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheAtomicStampedImpl.java
index 1e4da30,09cea43..877b158
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheAtomicStampedImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheAtomicStampedImpl.java
@@@ -33,10 -29,19 +33,11 @@@ import org.apache.ignite.cache.CacheEnt
  import org.apache.ignite.internal.GridKernalContext;
  import org.apache.ignite.internal.processors.cache.GridCacheContext;
  import org.apache.ignite.internal.processors.cache.IgniteInternalCache;
 -import org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal;
 -import org.apache.ignite.internal.util.F0;
  import org.apache.ignite.internal.util.tostring.GridToStringBuilder;
 -import org.apache.ignite.internal.util.typedef.internal.CU;
 +import org.apache.ignite.internal.util.typedef.F;
  import org.apache.ignite.internal.util.typedef.internal.U;
+ import org.apache.ignite.internal.processors.cluster.IgniteChangeGlobalStateSupport;
  import org.apache.ignite.lang.IgniteBiTuple;
 -import org.apache.ignite.lang.IgniteClosure;
 -import org.apache.ignite.lang.IgnitePredicate;
 -
 -import static org.apache.ignite.internal.util.typedef.internal.CU.retryTopologySafe;
 -import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC;
 -import static org.apache.ignite.transactions.TransactionIsolation.REPEATABLE_READ;
  
  /**
   * Cache atomic stamped implementation.

http://git-wip-us.apache.org/repos/asf/ignite/blob/81835e48/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheCountDownLatchImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81835e48/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheLockImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/81835e48/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheSemaphoreImpl.java
----------------------------------------------------------------------
diff --cc modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheSemaphoreImpl.java
index 6ebd655,0039fa2..903423d
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheSemaphoreImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheSemaphoreImpl.java
@@@ -346,13 -361,16 +358,15 @@@ public final class GridCacheSemaphoreIm
  
          /**
           * This method is used for releasing the permits acquired by failing node.
+          * In case the semaphore is broken, no permits are released and semaphore is set (globally) to broken state.
           *
           * @param nodeId ID of the failing node.
+          * @param broken Flag indicating that this semaphore is broken.
           * @return True if this is the call that succeeded to change the global state.
           */
-         boolean releaseFailedNode(final UUID nodeId) {
 -        protected boolean releaseFailedNode(final UUID nodeId, final boolean broken) {
++        boolean releaseFailedNode(final UUID nodeId, final boolean broken) {
              try {
 -                return CU.outTx(
 -                    retryTopologySafe(new Callable<Boolean>() {
 +                return retryTopologySafe(new Callable<Boolean>() {
                          @Override public Boolean call() throws Exception {
                              try (
                                  GridNearTxLocal tx = CU.txStartInternal(ctx,
@@@ -466,10 -506,16 +499,14 @@@
  
                                  tx.commit();
  
-                                 return new Sync(cnt, waiters, failoverSafe);
+                                 Sync sync = new Sync(cnt, waiters, failoverSafe);
+ 
+                                 sync.setBroken(val.isBroken());
+ 
+                                 return sync;
                              }
                          }
 -                    }),
 -                    ctx
 -                );
 +                    });
  
                  if (log.isDebugEnabled())
                      log.debug("Initialized internal sync structure: " + sync);
@@@ -717,12 -787,15 +775,15 @@@
          try {
              initializeSemaphore();
  
 -            boolean result = sync.nonfairTryAcquireShared(1) >= 0;
 +            boolean res = sync.nonfairTryAcquireShared(1) >= 0;
  
-             if (isBroken())
+             if (isBroken()) {
+                 Thread.interrupted(); // Clear interrupt flag.
+ 
                  throw new InterruptedException();
+             }
  
 -            return result;
 +            return res;
          }
          catch (IgniteCheckedException e) {
              throw U.convertException(e);


[60/70] [abbrv] ignite git commit: ignite-4844 Removed internal async ops queue for atomic cache

Posted by sb...@apache.org.
ignite-4844 Removed internal async ops queue for atomic cache


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/130b1fde
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/130b1fde
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/130b1fde

Branch: refs/heads/ignite-2893
Commit: 130b1fde3e1f9cf1f9685a8144d71d03c7514533
Parents: f923bc9
Author: Konstantin Dudkov <kd...@ya.ru>
Authored: Wed Apr 19 18:34:08 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Wed Apr 19 18:34:08 2017 +0300

----------------------------------------------------------------------
 .../processors/cache/GridCacheAdapter.java      |  5 ++-
 .../dht/atomic/GridDhtAtomicCache.java          | 38 ++++----------------
 .../local/atomic/GridLocalAtomicCache.java      | 35 ++++--------------
 3 files changed, 17 insertions(+), 61 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/130b1fde/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java
index b38e481..a3d4c81 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java
@@ -4288,6 +4288,7 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K, V
     /**
      * Tries to acquire asynchronous operations permit, if limited.
      *
+     * @param retry Retry flag.
      * @return Failed future if waiting was interrupted.
      */
     @Nullable protected <T> IgniteInternalFuture<T> asyncOpAcquire(boolean retry) {
@@ -4307,8 +4308,10 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K, V
 
     /**
      * Releases asynchronous operations permit, if limited.
+     *
+     * @param retry Retry flag.
      */
-    private void asyncOpRelease(boolean retry) {
+    protected final void asyncOpRelease(boolean retry) {
         if (!retry && asyncOpsSem != null)
             asyncOpsSem.release();
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/130b1fde/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
index 2dacd12..5bbfe14 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
@@ -84,7 +84,6 @@ import org.apache.ignite.internal.processors.cache.version.GridCacheVersionEx;
 import org.apache.ignite.internal.processors.timeout.GridTimeoutObject;
 import org.apache.ignite.internal.util.GridLongList;
 import org.apache.ignite.internal.util.GridUnsafe;
-import org.apache.ignite.internal.util.future.GridEmbeddedFuture;
 import org.apache.ignite.internal.util.future.GridFinishedFuture;
 import org.apache.ignite.internal.util.nio.GridNioBackPressureControl;
 import org.apache.ignite.internal.util.nio.GridNioMessageTracker;
@@ -102,7 +101,6 @@ import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteBiTuple;
 import org.apache.ignite.lang.IgniteClosure;
 import org.apache.ignite.lang.IgniteInClosure;
-import org.apache.ignite.lang.IgniteOutClosure;
 import org.apache.ignite.lang.IgniteRunnable;
 import org.apache.ignite.lang.IgniteUuid;
 import org.apache.ignite.plugin.security.SecurityPermission;
@@ -822,39 +820,15 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
         if (fail != null)
             return fail;
 
-        FutureHolder holder = lastFut.get();
+        IgniteInternalFuture<T> f = op.apply();
 
-        holder.lock();
-
-        try {
-            IgniteInternalFuture fut = holder.future();
-
-            if (fut != null && !fut.isDone()) {
-                IgniteInternalFuture<T> f = new GridEmbeddedFuture(fut,
-                    new IgniteOutClosure<IgniteInternalFuture>() {
-                        @Override public IgniteInternalFuture<T> apply() {
-                            if (ctx.kernalContext().isStopping())
-                                return new GridFinishedFuture<>(
-                                    new IgniteCheckedException("Operation has been cancelled (node is stopping)."));
-
-                            return op.apply();
-                        }
-                    });
-
-                saveFuture(holder, f, /*retry*/false);
-
-                return f;
+        f.listen(new CI1<IgniteInternalFuture<?>>() {
+            @Override public void apply(IgniteInternalFuture<?> f) {
+                asyncOpRelease(/*retry*/false);
             }
+        });
 
-            IgniteInternalFuture<T> f = op.apply();
-
-            saveFuture(holder, f, /*retry*/false);
-
-            return f;
-        }
-        finally {
-            holder.unlock();
-        }
+        return f;
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/130b1fde/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java
index dfbc5af..e1d4484 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java
@@ -61,11 +61,10 @@ import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
 import org.apache.ignite.internal.processors.resource.GridResourceIoc;
 import org.apache.ignite.internal.util.F0;
 import org.apache.ignite.internal.util.GridUnsafe;
-import org.apache.ignite.internal.util.future.GridEmbeddedFuture;
 import org.apache.ignite.internal.util.future.GridFinishedFuture;
 import org.apache.ignite.internal.util.lang.GridTuple3;
 import org.apache.ignite.internal.util.typedef.C1;
-import org.apache.ignite.internal.util.typedef.C2;
+import org.apache.ignite.internal.util.typedef.CI1;
 import org.apache.ignite.internal.util.typedef.CX1;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.T2;
@@ -1469,35 +1468,15 @@ public class GridLocalAtomicCache<K, V> extends GridLocalCache<K, V> {
         if (fail != null)
             return fail;
 
-        FutureHolder holder = lastFut.get();
+        IgniteInternalFuture f = ctx.closures().callLocalSafe(op);
 
-        holder.lock();
-
-        try {
-            IgniteInternalFuture fut = holder.future();
-
-            if (fut != null && !fut.isDone()) {
-                IgniteInternalFuture f = new GridEmbeddedFuture(fut,
-                    new C2<Object, Exception, IgniteInternalFuture>() {
-                        @Override public IgniteInternalFuture apply(Object t, Exception e) {
-                            return ctx.closures().callLocalSafe(op);
-                        }
-                    });
-
-                saveFuture(holder, f, /*retry*/false);
-
-                return f;
+        f.listen(new CI1<IgniteInternalFuture<?>>() {
+            @Override public void apply(IgniteInternalFuture<?> f) {
+                asyncOpRelease(false);
             }
+        });
 
-            IgniteInternalFuture f = ctx.closures().callLocalSafe(op);
-
-            saveFuture(holder, f, /*retry*/false);
-
-            return f;
-        }
-        finally {
-            holder.unlock();
-        }
+        return f;
     }
 
     /** {@inheritDoc} */


[24/70] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math module to Ignite ML module added missed licenses renamed packages fixed wrong ml profile activation

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


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/d78e071a
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/d78e071a
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/d78e071a

Branch: refs/heads/ignite-2893
Commit: d78e071a7de1129838652e9f377ff73d3a84495d
Parents: 7038af4
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 16:47:17 2017 +0300

----------------------------------------------------------------------
 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 +++
 356 files changed, 27247 insertions(+), 27124 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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&lt;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&lt;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 &gt;= 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  =   &gt;   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
-     * -&lt; 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 &gt;= 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 &lt;= 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&lt;30} simply looks up a table in O(1).
-     * For {@code k&gt;=30} uses stirlings approximation.
-     *
-     * @param k must hold {@code k &gt;= 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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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);
-}


[55/70] [abbrv] ignite git commit: IGNITE-4211 Update Spring dependency to latest stable version

Posted by sb...@apache.org.
IGNITE-4211 Update Spring dependency to latest stable version


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/a51477c0
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/a51477c0
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/a51477c0

Branch: refs/heads/ignite-2893
Commit: a51477c0277785db4089467dde9c8da7132a46da
Parents: 1a9b38d
Author: daradurvs <da...@gmail.com>
Authored: Wed Apr 19 16:11:56 2017 +0300
Committer: Anton Vinogradov <av...@apache.org>
Committed: Wed Apr 19 16:11:56 2017 +0300

----------------------------------------------------------------------
 .../test/config/loaders/grid-cfg-2-grids.xml    |  6 +++---
 .../apache/ignite/cache/spring/SpringCache.java |  6 ++++++
 .../GridSpringResourceInjectionSelfTest.java    | 20 ++++++++++----------
 parent/pom.xml                                  |  2 +-
 4 files changed, 20 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/a51477c0/modules/core/src/test/config/loaders/grid-cfg-2-grids.xml
----------------------------------------------------------------------
diff --git a/modules/core/src/test/config/loaders/grid-cfg-2-grids.xml b/modules/core/src/test/config/loaders/grid-cfg-2-grids.xml
index af4792a..a26423d 100644
--- a/modules/core/src/test/config/loaders/grid-cfg-2-grids.xml
+++ b/modules/core/src/test/config/loaders/grid-cfg-2-grids.xml
@@ -28,7 +28,7 @@
     <!--
         Grid configuration.
     -->
-    <bean id="grid.cfg.1" class="org.apache.ignite.configuration.IgniteConfiguration" singleton="true">
+    <bean id="grid.cfg.1" class="org.apache.ignite.configuration.IgniteConfiguration">
         <property name="igniteInstanceName" value="grid-factory-test-1"/>
 
         <property name="connectorConfiguration"><null/></property>
@@ -45,7 +45,7 @@
         </property>
     </bean>
 
-    <bean id="grid.cfg.2" class="org.apache.ignite.configuration.IgniteConfiguration" singleton="true">
+    <bean id="grid.cfg.2" class="org.apache.ignite.configuration.IgniteConfiguration">
         <property name="igniteInstanceName" value="grid-factory-test-2"/>
 
         <property name="connectorConfiguration"><null/></property>
@@ -61,4 +61,4 @@
             </bean>
         </property>
     </bean>
-</beans>
+</beans>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/a51477c0/modules/spring/src/main/java/org/apache/ignite/cache/spring/SpringCache.java
----------------------------------------------------------------------
diff --git a/modules/spring/src/main/java/org/apache/ignite/cache/spring/SpringCache.java b/modules/spring/src/main/java/org/apache/ignite/cache/spring/SpringCache.java
index 77b30c5..f35ed2a 100644
--- a/modules/spring/src/main/java/org/apache/ignite/cache/spring/SpringCache.java
+++ b/modules/spring/src/main/java/org/apache/ignite/cache/spring/SpringCache.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.cache.spring;
 
 import java.io.Serializable;
+import java.util.concurrent.Callable;
 import org.apache.ignite.IgniteCache;
 import org.springframework.cache.Cache;
 import org.springframework.cache.support.SimpleValueWrapper;
@@ -82,6 +83,11 @@ class SpringCache implements Cache {
     }
 
     /** {@inheritDoc} */
+    @Override public <T> T get(Object key, Callable<T> valLdr) {
+        throw new UnsupportedOperationException();
+    }
+
+    /** {@inheritDoc} */
     @Override public ValueWrapper putIfAbsent(Object key, Object val) {
         Object old;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/a51477c0/modules/spring/src/test/java/org/apache/ignite/internal/processors/resource/GridSpringResourceInjectionSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/spring/src/test/java/org/apache/ignite/internal/processors/resource/GridSpringResourceInjectionSelfTest.java b/modules/spring/src/test/java/org/apache/ignite/internal/processors/resource/GridSpringResourceInjectionSelfTest.java
index e70b49e..827dd72 100644
--- a/modules/spring/src/test/java/org/apache/ignite/internal/processors/resource/GridSpringResourceInjectionSelfTest.java
+++ b/modules/spring/src/test/java/org/apache/ignite/internal/processors/resource/GridSpringResourceInjectionSelfTest.java
@@ -105,8 +105,8 @@ public class GridSpringResourceInjectionSelfTest extends GridCommonAbstractTest
         }, anotherGrid, null);
 
         assertTrue("Unexpected message: " + err.getMessage(), err.getMessage().startsWith("No qualifying bean of type " +
-            "[org.apache.ignite.internal.processors.resource.GridSpringResourceInjectionSelfTest$DummyResourceBean]" +
-            " is defined: expected single matching bean but found 2:"));
+            "'org.apache.ignite.internal.processors.resource.GridSpringResourceInjectionSelfTest$DummyResourceBean'" +
+            " available: expected single matching bean but found 2:"));
 
         G.stop("anotherGrid", false);
     }
@@ -124,7 +124,7 @@ public class GridSpringResourceInjectionSelfTest extends GridCommonAbstractTest
 
                 return null;
             }
-        }, "No bean named 'nonExistentResource' is defined");
+        }, "No bean named 'nonExistentResource' available");
     }
 
     /**
@@ -140,8 +140,8 @@ public class GridSpringResourceInjectionSelfTest extends GridCommonAbstractTest
 
                 return null;
             }
-        }, "No qualifying bean of type [org.apache.ignite.internal.processors.resource." +
-            "GridSpringResourceInjectionSelfTest$AnotherDummyResourceBean] is defined");
+        }, "No qualifying bean of type 'org.apache.ignite.internal.processors.resource." +
+            "GridSpringResourceInjectionSelfTest$AnotherDummyResourceBean' available");
     }
 
     /**
@@ -250,8 +250,8 @@ public class GridSpringResourceInjectionSelfTest extends GridCommonAbstractTest
             }, anotherGrid, null);
 
             assertTrue("Unexpected message: " + err.getMessage(), err.getMessage().startsWith("No qualifying bean of type " +
-                "[org.apache.ignite.internal.processors.resource.GridSpringResourceInjectionSelfTest$DummyResourceBean]" +
-                " is defined: expected single matching bean but found 2:"));
+                "'org.apache.ignite.internal.processors.resource.GridSpringResourceInjectionSelfTest$DummyResourceBean'" +
+                " available: expected single matching bean but found 2:"));
         }
         finally {
             G.stop("anotherGrid", false);
@@ -275,7 +275,7 @@ public class GridSpringResourceInjectionSelfTest extends GridCommonAbstractTest
 
                 return null;
             }
-        }, "No bean named 'nonExistentResource' is defined");
+        }, "No bean named 'nonExistentResource' available");
     }
 
     /**
@@ -295,8 +295,8 @@ public class GridSpringResourceInjectionSelfTest extends GridCommonAbstractTest
 
                 return null;
             }
-        }, "No qualifying bean of type [org.apache.ignite.internal.processors.resource" +
-                ".GridSpringResourceInjectionSelfTest$AnotherDummyResourceBean] is defined");
+        }, "No qualifying bean of type 'org.apache.ignite.internal.processors.resource" +
+            ".GridSpringResourceInjectionSelfTest$AnotherDummyResourceBean' available");
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/a51477c0/parent/pom.xml
----------------------------------------------------------------------
diff --git a/parent/pom.xml b/parent/pom.xml
index adb7995..24ff924 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -37,7 +37,7 @@
         <ignite.edition>fabric</ignite.edition>
         <hadoop.version>2.4.1</hadoop.version>
         <spark.version>2.1.0</spark.version>
-        <spring.version>4.1.0.RELEASE</spring.version>
+        <spring.version>4.3.7.RELEASE</spring.version>
         <spring.data.version>1.2.1.RELEASE</spring.data.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <maven.build.timestamp.format>MMMM d yyyy</maven.build.timestamp.format>


[14/70] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math module to Ignite ML module added missed licenses renamed packages fixed wrong ml profile activation

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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);
+    }
+}


[11/70] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math module to Ignite ML module added missed licenses renamed packages fixed wrong ml profile activation

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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);
-    }
-}


[62/70] [abbrv] ignite git commit: IGNITE-4949 - Fixed CacheJdbcPojoStore for BinaryMarshaller. This closes #1803.

Posted by sb...@apache.org.
IGNITE-4949 - Fixed CacheJdbcPojoStore for BinaryMarshaller. This closes #1803.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/0cb2c921
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/0cb2c921
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/0cb2c921

Branch: refs/heads/ignite-2893
Commit: 0cb2c92152ea944d3313aa493bfce1f5191bc263
Parents: 1cd3cac
Author: Dmitriy Govorukhin <dm...@gmail.com>
Authored: Wed Apr 19 19:44:49 2017 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Wed Apr 19 19:45:40 2017 +0300

----------------------------------------------------------------------
 .../store/jdbc/CacheAbstractJdbcStore.java      |  37 +++--
 .../cache/store/jdbc/CacheJdbcPojoStore.java    |   1 -
 .../store/jdbc/CacheJdbcPojoStoreTest.java      | 147 ++++++++++++++-----
 .../ignite/testframework/junits/IgniteMock.java |   4 +
 4 files changed, 129 insertions(+), 60 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/0cb2c921/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/CacheAbstractJdbcStore.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/CacheAbstractJdbcStore.java b/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/CacheAbstractJdbcStore.java
index 1c7e9dd..625d3cd 100644
--- a/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/CacheAbstractJdbcStore.java
+++ b/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/CacheAbstractJdbcStore.java
@@ -537,23 +537,36 @@ public abstract class CacheAbstractJdbcStore<K, V> implements CacheStore<K, V>,
 
     /**
      * @param type Type name to check.
+     * @param binarySupported True if binary marshaller enable.
      * @return {@code True} if class not found.
      */
-    protected TypeKind kindForName(String type) {
+    protected TypeKind kindForName(String type, boolean binarySupported) {
         if (BUILT_IN_TYPES.contains(type))
             return TypeKind.BUILT_IN;
 
+        if (binarySupported)
+            return TypeKind.BINARY;
+
         try {
             Class.forName(type);
 
             return TypeKind.POJO;
         }
-        catch(ClassNotFoundException ignored) {
-            return TypeKind.BINARY;
+        catch (ClassNotFoundException e) {
+            throw new CacheException("Failed to find class " + type +
+                " (make sure the class is present in classPath or use BinaryMarshaller)", e);
         }
     }
 
     /**
+     * @param type Type name to check.
+     * @return {@code True} if class not found.
+     */
+    protected TypeKind kindForName(String type) {
+        return kindForName(type, ignite.configuration().getMarshaller() instanceof BinaryMarshaller);
+    }
+
+    /**
      * @param cacheName Cache name to check mappings for.
      * @return Type mappings for specified cache name.
      * @throws CacheException If failed to initialize cache mappings.
@@ -587,11 +600,7 @@ public abstract class CacheAbstractJdbcStore<K, V> implements CacheStore<K, V>,
                     String keyType = type.getKeyType();
                     String valType = type.getValueType();
 
-                    TypeKind keyKind = kindForName(keyType);
-
-                    if (!binarySupported && keyKind == TypeKind.BINARY)
-                        throw new CacheException("Key type has no class [cache=" + U.maskName(cacheName) +
-                            ", type=" + keyType + "]");
+                    TypeKind keyKind = kindForName(keyType, binarySupported);
 
                     checkTypeConfiguration(cacheName, keyKind, keyType, type.getKeyFields());
 
@@ -601,21 +610,11 @@ public abstract class CacheAbstractJdbcStore<K, V> implements CacheStore<K, V>,
                         throw new CacheException("Key type must be unique in type metadata [cache=" +
                             U.maskName(cacheName) + ", type=" + keyType + "]");
 
-                    TypeKind valKind = kindForName(valType);
+                    TypeKind valKind = kindForName(valType, binarySupported);
 
                     checkTypeConfiguration(cacheName, valKind, valType, type.getValueFields());
 
                     entryMappings.put(keyTypeId, new EntryMapping(cacheName, dialect, type, keyKind, valKind, sqlEscapeAll));
-
-                    // Add one more binding to binary typeId for POJOs,
-                    // because object could be passed to store in binary format.
-                    if (binarySupported && keyKind == TypeKind.POJO) {
-                        keyTypeId = typeIdForTypeName(TypeKind.BINARY, keyType);
-
-                        valKind = valKind == TypeKind.POJO ? TypeKind.BINARY : valKind;
-
-                        entryMappings.put(keyTypeId, new EntryMapping(cacheName, dialect, type, TypeKind.BINARY, valKind, sqlEscapeAll));
-                    }
                 }
 
                 Map<String, Map<Object, EntryMapping>> mappings = new HashMap<>(cacheMappings);

http://git-wip-us.apache.org/repos/asf/ignite/blob/0cb2c921/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStore.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStore.java b/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStore.java
index 00a8ade..8244c6c 100644
--- a/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStore.java
+++ b/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStore.java
@@ -23,7 +23,6 @@ import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.sql.ResultSet;
 import java.sql.SQLException;
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;

http://git-wip-us.apache.org/repos/asf/ignite/blob/0cb2c921/modules/core/src/test/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStoreTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStoreTest.java b/modules/core/src/test/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStoreTest.java
index be38541..1a76321 100644
--- a/modules/core/src/test/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStoreTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStoreTest.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.cache.store.jdbc;
 
+import java.lang.reflect.Field;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
@@ -28,14 +29,16 @@ import java.util.Collection;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentLinkedQueue;
 import javax.cache.integration.CacheWriterException;
-
+import org.apache.ignite.Ignite;
 import org.apache.ignite.binary.BinaryObject;
+import org.apache.ignite.binary.BinaryObjectBuilder;
 import org.apache.ignite.cache.store.jdbc.dialect.H2Dialect;
 import org.apache.ignite.cache.store.jdbc.model.Organization;
 import org.apache.ignite.cache.store.jdbc.model.OrganizationKey;
 import org.apache.ignite.cache.store.jdbc.model.Person;
 import org.apache.ignite.cache.store.jdbc.model.PersonComplexKey;
 import org.apache.ignite.cache.store.jdbc.model.PersonKey;
+import org.apache.ignite.internal.binary.BinaryMarshaller;
 import org.apache.ignite.internal.processors.cache.CacheEntryImpl;
 import org.apache.ignite.internal.util.typedef.CI2;
 import org.apache.ignite.internal.util.typedef.internal.U;
@@ -57,6 +60,12 @@ public class CacheJdbcPojoStoreTest extends GridAbstractCacheStoreSelfTest<Cache
     /** Person count. */
     protected static final int PERSON_CNT = 100000;
 
+    /** Ignite. */
+    private Ignite ig;
+
+    /** Binary enable. */
+    private boolean binaryEnable;
+
     /**
      * @throws Exception If failed.
      */
@@ -226,6 +235,12 @@ public class CacheJdbcPojoStoreTest extends GridAbstractCacheStoreSelfTest<Cache
         U.closeQuiet(conn);
 
         super.beforeTest();
+
+        Ignite ig = U.field(store, "ignite");
+
+        this.ig = ig;
+
+        binaryEnable = ig.configuration().getMarshaller() instanceof BinaryMarshaller;
     }
 
     /**
@@ -290,32 +305,49 @@ public class CacheJdbcPojoStoreTest extends GridAbstractCacheStoreSelfTest<Cache
 
         U.closeQuiet(conn);
 
-        final Collection<OrganizationKey> orgKeys = new ConcurrentLinkedQueue<>();
-        final Collection<PersonKey> prnKeys = new ConcurrentLinkedQueue<>();
-        final Collection<PersonComplexKey> prnComplexKeys = new ConcurrentLinkedQueue<>();
+        final Collection<Object> orgKeys = new ConcurrentLinkedQueue<>();
+        final Collection<Object> prnKeys = new ConcurrentLinkedQueue<>();
+        final Collection<Object> prnComplexKeys = new ConcurrentLinkedQueue<>();
 
         IgniteBiInClosure<Object, Object> c = new CI2<Object, Object>() {
             @Override public void apply(Object k, Object v) {
-                if (k instanceof BinaryObject)
-                    k = ((BinaryObject)k).deserialize();
-
-                if (v instanceof BinaryObject)
-                    v = ((BinaryObject)k).deserialize();
-
-                if (k instanceof OrganizationKey && v instanceof Organization)
-                    orgKeys.add((OrganizationKey)k);
-                else if (k instanceof PersonKey && v instanceof Person)
-                    prnKeys.add((PersonKey)k);
-                else if (k instanceof PersonComplexKey && v instanceof Person) {
-                    PersonComplexKey key = (PersonComplexKey)k;
-
-                    Person val = (Person)v;
-
-                    assertTrue("Key ID should be the same as value ID", key.getId() == val.getId());
-                    assertTrue("Key orgID should be the same as value orgID", key.getOrgId() == val.getOrgId());
-                    assertEquals("name" + key.getId(), val.getName());
-
-                    prnComplexKeys.add((PersonComplexKey)k);
+                if (binaryEnable){
+                    if (k instanceof BinaryObject && v instanceof BinaryObject) {
+                        BinaryObject key = (BinaryObject)k;
+                        BinaryObject val = (BinaryObject)v;
+
+                        String keyType = key.type().typeName();
+                        String valType = val.type().typeName();
+
+                        if (OrganizationKey.class.getName().equals(keyType)
+                            && Organization.class.getName().equals(valType))
+                            orgKeys.add(key);
+
+                        if (PersonKey.class.getName().equals(keyType)
+                            && Person.class.getName().equals(valType))
+                            prnKeys.add(key);
+
+                        if (PersonComplexKey.class.getName().equals(keyType)
+                            && Person.class.getName().equals(valType))
+                            prnComplexKeys.add(key);
+                    }
+                }
+                else {
+                    if (k instanceof OrganizationKey && v instanceof Organization)
+                        orgKeys.add(k);
+                    else if (k instanceof PersonKey && v instanceof Person)
+                        prnKeys.add(k);
+                    else if (k instanceof PersonComplexKey && v instanceof Person) {
+                        PersonComplexKey key = (PersonComplexKey)k;
+
+                        Person val = (Person)v;
+
+                        assertTrue("Key ID should be the same as value ID", key.getId() == val.getId());
+                        assertTrue("Key orgID should be the same as value orgID", key.getOrgId() == val.getOrgId());
+                        assertEquals("name" + key.getId(), val.getName());
+
+                        prnComplexKeys.add(k);
+                    }
                 }
             }
         };
@@ -326,15 +358,16 @@ public class CacheJdbcPojoStoreTest extends GridAbstractCacheStoreSelfTest<Cache
         assertEquals(PERSON_CNT, prnKeys.size());
         assertEquals(PERSON_CNT, prnComplexKeys.size());
 
-        Collection<OrganizationKey> tmpOrgKeys = new ArrayList<>(orgKeys);
-        Collection<PersonKey> tmpPrnKeys = new ArrayList<>(prnKeys);
-        Collection<PersonComplexKey> tmpPrnComplexKeys = new ArrayList<>(prnComplexKeys);
+        Collection<Object> tmpOrgKeys = new ArrayList<>(orgKeys);
+        Collection<Object> tmpPrnKeys = new ArrayList<>(prnKeys);
+        Collection<Object> tmpPrnComplexKeys = new ArrayList<>(prnComplexKeys);
 
         orgKeys.clear();
         prnKeys.clear();
         prnComplexKeys.clear();
 
-        store.loadCache(c, OrganizationKey.class.getName(), "SELECT name, city, id FROM ORGANIZATION",
+        store.loadCache(
+            c, OrganizationKey.class.getName(), "SELECT name, city, id FROM ORGANIZATION",
             PersonKey.class.getName(), "SELECT org_id, id, name FROM Person WHERE id < 1000");
 
         assertEquals(ORGANIZATION_CNT, orgKeys.size());
@@ -384,20 +417,29 @@ public class CacheJdbcPojoStoreTest extends GridAbstractCacheStoreSelfTest<Cache
 
         U.closeQuiet(conn);
 
-        final Collection<PersonComplexKey> prnComplexKeys = new ConcurrentLinkedQueue<>();
+        final Collection<Object> prnComplexKeys = new ConcurrentLinkedQueue<>();
 
         IgniteBiInClosure<Object, Object> c = new CI2<Object, Object>() {
             @Override public void apply(Object k, Object v) {
-                if (k instanceof BinaryObject)
-                    k = ((BinaryObject)k).deserialize();
-
-                if (v instanceof BinaryObject)
-                    v = ((BinaryObject)k).deserialize();
-
-                if (k instanceof PersonComplexKey && v instanceof Person)
-                    prnComplexKeys.add((PersonComplexKey)k);
-                else
-                    fail("Unexpected entry [key=" + k + ", value=" + v + "]");
+                if (binaryEnable) {
+                    if (k instanceof BinaryObject && v instanceof BinaryObject) {
+                        BinaryObject key = (BinaryObject)k;
+                        BinaryObject val = (BinaryObject)v;
+
+                        String keyType = key.type().typeName();
+                        String valType = val.type().typeName();
+
+                        if (PersonComplexKey.class.getName().equals(keyType)
+                            && Person.class.getName().equals(valType))
+                            prnComplexKeys.add(key);
+                    }
+                }
+                else {
+                    if (k instanceof PersonComplexKey && v instanceof Person)
+                        prnComplexKeys.add(k);
+                    else
+                        fail("Unexpected entry [key=" + k + ", value=" + v + "]");
+                }
             }
         };
 
@@ -450,7 +492,7 @@ public class CacheJdbcPojoStoreTest extends GridAbstractCacheStoreSelfTest<Cache
         ses.newSession(null);
 
         try {
-            store.write(new CacheEntryImpl<>(k1, v1));
+            store.write(new CacheEntryImpl<>(wrap(k1), wrap(v1)));
 
             fail("CacheWriterException wasn't thrown.");
         }
@@ -479,4 +521,29 @@ public class CacheJdbcPojoStoreTest extends GridAbstractCacheStoreSelfTest<Cache
 
         assertNull(store.load(k));
     }
+
+    /**
+     * @param obj Object.
+     */
+    private Object wrap(Object obj) throws IllegalAccessException {
+        if (binaryEnable) {
+            Class<?> cls = obj.getClass();
+
+            BinaryObjectBuilder builder = ig.binary().builder(cls.getName());
+
+            for (Field f : cls.getDeclaredFields()) {
+                if (f.getName().contains("serialVersionUID"))
+                    continue;
+
+                f.setAccessible(true);
+
+                builder.setField(f.getName(), f.get(obj));
+            }
+
+            return builder.build();
+        }
+
+        return obj;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/0cb2c921/modules/core/src/test/java/org/apache/ignite/testframework/junits/IgniteMock.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/junits/IgniteMock.java b/modules/core/src/test/java/org/apache/ignite/testframework/junits/IgniteMock.java
index ab918e5..ea53345 100644
--- a/modules/core/src/test/java/org/apache/ignite/testframework/junits/IgniteMock.java
+++ b/modules/core/src/test/java/org/apache/ignite/testframework/junits/IgniteMock.java
@@ -56,6 +56,7 @@ import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.configuration.NearCacheConfiguration;
 import org.apache.ignite.internal.binary.BinaryCachingMetadataHandler;
 import org.apache.ignite.internal.binary.BinaryContext;
+import org.apache.ignite.internal.binary.BinaryMarshaller;
 import org.apache.ignite.internal.binary.builder.BinaryObjectBuilderImpl;
 import org.apache.ignite.internal.processors.cacheobject.NoOpBinary;
 import org.apache.ignite.internal.util.typedef.internal.U;
@@ -328,6 +329,9 @@ public class IgniteMock implements Ignite {
                     return typeName.hashCode();
                 }
             };
+
+            if (marshaller instanceof BinaryMarshaller)
+                ctx.configure((BinaryMarshaller)marshaller, configuration());
         }
 
         binaryMock = new NoOpBinary() {


[64/70] [abbrv] ignite git commit: ignite-2.0 - Web Console agent download dialog minor tweaks.

Posted by sb...@apache.org.
ignite-2.0 - Web Console agent download dialog minor tweaks.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/badf49c4
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/badf49c4
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/badf49c4

Branch: refs/heads/ignite-2893
Commit: badf49c44118fc09f686736ec45439cc4745e3fd
Parents: 2c37eff
Author: Alexey Kuznetsov <ak...@apache.org>
Authored: Thu Apr 20 10:03:59 2017 +0700
Committer: Alexey Kuznetsov <ak...@apache.org>
Committed: Thu Apr 20 10:03:59 2017 +0700

----------------------------------------------------------------------
 .../frontend/views/templates/agent-download.tpl.pug            | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/badf49c4/modules/web-console/frontend/views/templates/agent-download.tpl.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/templates/agent-download.tpl.pug b/modules/web-console/frontend/views/templates/agent-download.tpl.pug
index 615abbc..5abc587 100644
--- a/modules/web-console/frontend/views/templates/agent-download.tpl.pug
+++ b/modules/web-console/frontend/views/templates/agent-download.tpl.pug
@@ -23,11 +23,11 @@
                     span Connection to Ignite Web Agent is not established
             .modal-body.agent-download
                 p Please download and run #[a(href='/api/v1/downloads/agent' target='_self') ignite-web-agent] to use this functionality
-                p For run:
+                p To start:
                 ul
                     li Download and unzip #[a(href='/api/v1/downloads/agent' target='_self') ignite-web-agent] archive
                     li Run shell file #[b ignite-web-agent.{sh|bat}]
-                p Refer to #[b README.txt] in agent folder for more information
+                p Refer to #[b README.txt] in the ignite-web-agent folder for more information.
                 .modal-advanced-options
                     i.fa(ng-class='showToken ? "fa-chevron-circle-down" : "fa-chevron-circle-right"' ng-click='showToken = !showToken')
                     a(ng-click='showToken = !showToken') {{showToken ? 'Hide security token...' : 'Show security token...'}}
@@ -53,7 +53,7 @@
                     li Ignite Grid is up and Ignite REST server started (copy "ignite-rest-http" folder from libs/optional/ to libs/)
                     li In agent settings check URI for connect to Ignite REST server
                     li Check agent logs for errors
-                    li Refer to #[b README.txt] in agent folder for more information
+                    li Refer to #[b README.txt] in the ignite-web-agent folder for more information.
 
             .modal-footer
                 button.btn.btn-default(ng-click='ctrl.back()') {{::ctrl.backText}}


[28/70] [abbrv] ignite git commit: IGNITE-4954 - Configurable expiration timeout for Cassandra session. This closes #1785.

Posted by sb...@apache.org.
IGNITE-4954 - Configurable expiration timeout for Cassandra session. This closes #1785.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/735ce60d
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/735ce60d
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/735ce60d

Branch: refs/heads/ignite-2893
Commit: 735ce60da02ebadc43aaa29cc97d331b8056df36
Parents: 36a6cd0
Author: Valentin Kulichenko <va...@gmail.com>
Authored: Thu Apr 13 11:29:30 2017 +0300
Committer: Andrey V. Mashenkov <an...@gmail.com>
Committed: Tue Apr 18 16:59:50 2017 +0300

----------------------------------------------------------------------
 .../store/cassandra/datasource/DataSource.java  | 50 ++++++++++++++------
 .../cassandra/session/CassandraSessionImpl.java | 23 +++++----
 .../cassandra/session/pool/SessionPool.java     |  6 +--
 .../cassandra/session/pool/SessionWrapper.java  | 15 +++---
 4 files changed, 62 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/735ce60d/modules/cassandra/store/src/main/java/org/apache/ignite/cache/store/cassandra/datasource/DataSource.java
----------------------------------------------------------------------
diff --git a/modules/cassandra/store/src/main/java/org/apache/ignite/cache/store/cassandra/datasource/DataSource.java b/modules/cassandra/store/src/main/java/org/apache/ignite/cache/store/cassandra/datasource/DataSource.java
index 1ba3c7d..754d902 100644
--- a/modules/cassandra/store/src/main/java/org/apache/ignite/cache/store/cassandra/datasource/DataSource.java
+++ b/modules/cassandra/store/src/main/java/org/apache/ignite/cache/store/cassandra/datasource/DataSource.java
@@ -17,6 +17,16 @@
 
 package org.apache.ignite.cache.store.cassandra.datasource;
 
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.io.Serializable;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.UUID;
 import com.datastax.driver.core.AuthProvider;
 import com.datastax.driver.core.Cluster;
 import com.datastax.driver.core.ConsistencyLevel;
@@ -31,25 +41,13 @@ import com.datastax.driver.core.policies.LoadBalancingPolicy;
 import com.datastax.driver.core.policies.ReconnectionPolicy;
 import com.datastax.driver.core.policies.RetryPolicy;
 import com.datastax.driver.core.policies.SpeculativeExecutionPolicy;
-
-import java.io.Externalizable;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.io.Serializable;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.UUID;
-
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.cache.store.cassandra.session.CassandraSession;
 import org.apache.ignite.cache.store.cassandra.session.CassandraSessionImpl;
-import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.internal.util.tostring.GridToStringExclude;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
 
 /**
  * Data source abstraction to specify configuration of the Cassandra session to be used.
@@ -64,6 +62,9 @@ public class DataSource implements Externalizable {
      */
     private static final UUID NULL_OBJECT = UUID.fromString("45ffae47-3193-5910-84a2-048fe65735d9");
 
+    /** Default expiration timeout for Cassandra driver session. */
+    public static final long DFLT_SESSION_EXPIRATION_TIMEOUT = 300000; // 5 minutes.
+
     /** Number of rows to immediately fetch in CQL statement execution. */
     private Integer fetchSize;
 
@@ -141,6 +142,9 @@ public class DataSource implements Externalizable {
     /** Netty options to use for connection. */
     private NettyOptions nettyOptions;
 
+    /** Expiration timeout for Cassandra driver session. */
+    private long sessionExpirationTimeout = DFLT_SESSION_EXPIRATION_TIMEOUT;
+
     /** Cassandra session wrapper instance. */
     private volatile CassandraSession ses;
 
@@ -460,6 +464,23 @@ public class DataSource implements Externalizable {
     }
 
     /**
+     * Sets expiration timeout for Cassandra driver session. Idle sessions that are not
+     * used during this timeout value will be automatically closed and recreated later
+     * on demand.
+     * <p>
+     * If set to {@code 0}, timeout is disabled.
+     * <p>
+     * Default value is {@link #DFLT_SESSION_EXPIRATION_TIMEOUT}.
+     *
+     * @param sessionExpirationTimeout Expiration timeout for Cassandra driver session.
+     */
+    public void setSessionExpirationTimeout(long sessionExpirationTimeout) {
+        this.sessionExpirationTimeout = sessionExpirationTimeout;
+
+        invalidate();
+    }
+
+    /**
      * Creates Cassandra session wrapper if it wasn't created yet and returns it
      *
      * @param log logger
@@ -541,7 +562,8 @@ public class DataSource implements Externalizable {
         if (nettyOptions != null)
             builder = builder.withNettyOptions(nettyOptions);
 
-        return ses = new CassandraSessionImpl(builder, fetchSize, readConsistency, writeConsistency, log);
+        return ses = new CassandraSessionImpl(
+            builder, fetchSize, readConsistency, writeConsistency, sessionExpirationTimeout, log);
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/735ce60d/modules/cassandra/store/src/main/java/org/apache/ignite/cache/store/cassandra/session/CassandraSessionImpl.java
----------------------------------------------------------------------
diff --git a/modules/cassandra/store/src/main/java/org/apache/ignite/cache/store/cassandra/session/CassandraSessionImpl.java b/modules/cassandra/store/src/main/java/org/apache/ignite/cache/store/cassandra/session/CassandraSessionImpl.java
index ac11686..19b88c9 100644
--- a/modules/cassandra/store/src/main/java/org/apache/ignite/cache/store/cassandra/session/CassandraSessionImpl.java
+++ b/modules/cassandra/store/src/main/java/org/apache/ignite/cache/store/cassandra/session/CassandraSessionImpl.java
@@ -17,6 +17,13 @@
 
 package org.apache.ignite.cache.store.cassandra.session;
 
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+import javax.cache.Cache;
 import com.datastax.driver.core.BatchStatement;
 import com.datastax.driver.core.BoundStatement;
 import com.datastax.driver.core.Cluster;
@@ -30,13 +37,6 @@ import com.datastax.driver.core.Statement;
 import com.datastax.driver.core.exceptions.AlreadyExistsException;
 import com.datastax.driver.core.exceptions.InvalidQueryException;
 import com.datastax.driver.core.querybuilder.Batch;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicInteger;
-import javax.cache.Cache;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.cache.store.cassandra.common.CassandraHelper;
@@ -83,6 +83,9 @@ public class CassandraSessionImpl implements CassandraSession {
     /** Consistency level for Cassandra WRITE operations (insert/update/delete). */
     private ConsistencyLevel writeConsistency;
 
+    /** Expiration timeout. */
+    private long expirationTimeout;
+
     /** Logger. */
     private IgniteLogger log;
 
@@ -102,11 +105,12 @@ public class CassandraSessionImpl implements CassandraSession {
      * @param log Logger.
      */
     public CassandraSessionImpl(Cluster.Builder builder, Integer fetchSize, ConsistencyLevel readConsistency,
-        ConsistencyLevel writeConsistency, IgniteLogger log) {
+        ConsistencyLevel writeConsistency, long expirationTimeout, IgniteLogger log) {
         this.builder = builder;
         this.fetchSize = fetchSize;
         this.readConsistency = readConsistency;
         this.writeConsistency = writeConsistency;
+        this.expirationTimeout = expirationTimeout;
         this.log = log;
     }
 
@@ -504,7 +508,8 @@ public class CassandraSessionImpl implements CassandraSession {
     /** {@inheritDoc} */
     @Override public synchronized void close() throws IOException {
         if (decrementSessionRefs() == 0 && ses != null) {
-            SessionPool.put(this, ses);
+            SessionPool.put(this, ses, expirationTimeout);
+
             ses = null;
         }
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/735ce60d/modules/cassandra/store/src/main/java/org/apache/ignite/cache/store/cassandra/session/pool/SessionPool.java
----------------------------------------------------------------------
diff --git a/modules/cassandra/store/src/main/java/org/apache/ignite/cache/store/cassandra/session/pool/SessionPool.java b/modules/cassandra/store/src/main/java/org/apache/ignite/cache/store/cassandra/session/pool/SessionPool.java
index 95938bd..4de8516 100644
--- a/modules/cassandra/store/src/main/java/org/apache/ignite/cache/store/cassandra/session/pool/SessionPool.java
+++ b/modules/cassandra/store/src/main/java/org/apache/ignite/cache/store/cassandra/session/pool/SessionPool.java
@@ -17,13 +17,13 @@
 
 package org.apache.ignite.cache.store.cassandra.session.pool;
 
-import com.datastax.driver.core.Session;
 import java.lang.Thread.State;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import com.datastax.driver.core.Session;
 import org.apache.ignite.cache.store.cassandra.session.CassandraSessionImpl;
 
 /**
@@ -98,14 +98,14 @@ public class SessionPool {
      * @param cassandraSes Session wrapper.
      * @param driverSes Driver session.
      */
-    public static void put(CassandraSessionImpl cassandraSes, Session driverSes) {
+    public static void put(CassandraSessionImpl cassandraSes, Session driverSes, long expirationTimeout) {
         if (cassandraSes == null || driverSes == null)
             return;
 
         SessionWrapper old;
 
         synchronized (sessions) {
-            old = sessions.put(cassandraSes, new SessionWrapper(driverSes));
+            old = sessions.put(cassandraSes, new SessionWrapper(driverSes, expirationTimeout));
 
             if (monitorSingleton == null || State.TERMINATED.equals(monitorSingleton.getState())) {
                 monitorSingleton = new SessionMonitor();

http://git-wip-us.apache.org/repos/asf/ignite/blob/735ce60d/modules/cassandra/store/src/main/java/org/apache/ignite/cache/store/cassandra/session/pool/SessionWrapper.java
----------------------------------------------------------------------
diff --git a/modules/cassandra/store/src/main/java/org/apache/ignite/cache/store/cassandra/session/pool/SessionWrapper.java b/modules/cassandra/store/src/main/java/org/apache/ignite/cache/store/cassandra/session/pool/SessionWrapper.java
index 7c5722b..68b9dd4 100644
--- a/modules/cassandra/store/src/main/java/org/apache/ignite/cache/store/cassandra/session/pool/SessionWrapper.java
+++ b/modules/cassandra/store/src/main/java/org/apache/ignite/cache/store/cassandra/session/pool/SessionWrapper.java
@@ -24,12 +24,12 @@ import org.apache.ignite.cache.store.cassandra.common.CassandraHelper;
  * Wrapper for Cassandra driver session, responsible for monitoring session expiration and its closing.
  */
 public class SessionWrapper {
-    /** Expiration timeout for Cassandra driver session. */
-    public static final long DFLT_EXPIRATION_TIMEOUT = 300000;  // 5 minutes.
-
     /** Cassandra driver session. */
     private Session ses;
 
+    /** Expiration timeout. */
+    private long expirationTimeout;
+
     /** Wrapper creation time.  */
     private long time;
 
@@ -38,9 +38,11 @@ public class SessionWrapper {
      *
      * @param ses Cassandra driver session.
      */
-    public SessionWrapper(Session ses) {
+    public SessionWrapper(Session ses, long expirationTimeout) {
         this.ses = ses;
-        this.time = System.currentTimeMillis();
+        this.expirationTimeout = expirationTimeout;
+
+        time = System.currentTimeMillis();
     }
 
     /**
@@ -49,7 +51,7 @@ public class SessionWrapper {
      * @return true if session expired.
      */
     public boolean expired() {
-        return System.currentTimeMillis() - time > DFLT_EXPIRATION_TIMEOUT;
+        return expirationTimeout > 0 && System.currentTimeMillis() - time > expirationTimeout;
     }
 
     /**
@@ -66,6 +68,7 @@ public class SessionWrapper {
      */
     public void release() {
         CassandraHelper.closeSession(ses);
+
         ses = null;
     }
 }


[13/70] [abbrv] ignite git commit: IGNITE-5000 Rename Ignite Math module to Ignite ML module added missed licenses renamed packages fixed wrong ml profile activation

Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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/d78e071a/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);
+    }
+}


[41/70] [abbrv] ignite git commit: Attempt to fix awaitPartitionMapExchange: wait for last exchange completion to avoid races with cache destroy.

Posted by sb...@apache.org.
Attempt to fix awaitPartitionMapExchange: wait for last exchange completion to avoid races with cache destroy.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/d3834843
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/d3834843
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/d3834843

Branch: refs/heads/ignite-2893
Commit: d38348432a2b8b66999c6410ec4f5c1ef050191d
Parents: 36e7e19
Author: sboikov <sb...@gridgain.com>
Authored: Wed Apr 19 12:46:31 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Wed Apr 19 12:46:31 2017 +0300

----------------------------------------------------------------------
 .../junits/common/GridCommonAbstractTest.java   | 34 ++++++++++++++++++++
 1 file changed, 34 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/d3834843/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
index 81f5caf..cef35e5 100644
--- a/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
@@ -544,6 +544,27 @@ public abstract class GridCommonAbstractTest extends GridAbstractTest {
 
         Set<String> names = new HashSet<>();
 
+        Ignite crd = null;
+
+        for (Ignite g : G.allGrids()) {
+            ClusterNode node = g.cluster().localNode();
+
+            if (crd == null || node.order() < crd.cluster().localNode().order()) {
+                crd = g;
+
+                if (node.order() == 1)
+                    break;
+            }
+        }
+
+        if (crd == null)
+            return;
+
+        AffinityTopologyVersion waitTopVer = ((IgniteKernal)crd).context().discovery().topologyVersionEx();
+
+        if (waitTopVer.topologyVersion() <= 0)
+            waitTopVer = new AffinityTopologyVersion(1, 0);
+
         for (Ignite g : G.allGrids()) {
             if (nodes != null && !nodes.contains(g.cluster().localNode()))
                 continue;
@@ -560,6 +581,19 @@ public abstract class GridCommonAbstractTest extends GridAbstractTest {
             else
                 startTime = g0.context().discovery().gridStartTime();
 
+            IgniteInternalFuture<?> exchFut =
+                g0.context().cache().context().exchange().affinityReadyFuture(waitTopVer);
+
+            if (exchFut != null && !exchFut.isDone()) {
+                try {
+                    exchFut.get(timeout);
+                }
+                catch (IgniteCheckedException e) {
+                    log.error("Failed to wait for exchange [topVer=" + waitTopVer +
+                        ", node=" + g0.name() + ']', e);
+                }
+            }
+
             for (IgniteCacheProxy<?, ?> c : g0.context().cache().jcaches()) {
                 CacheConfiguration cfg = c.context().config();
 


[58/70] [abbrv] ignite git commit: Fixed hang in testJoinExchangeBecomeCoordinator.

Posted by sb...@apache.org.
Fixed hang in testJoinExchangeBecomeCoordinator.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/b1822da3
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/b1822da3
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/b1822da3

Branch: refs/heads/ignite-2893
Commit: b1822da3d29951d727f91c9dedc91e168f727e26
Parents: 7b2e388
Author: sboikov <sb...@gridgain.com>
Authored: Wed Apr 19 17:53:28 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Wed Apr 19 17:53:28 2017 +0300

----------------------------------------------------------------------
 .../cache/distributed/CacheLateAffinityAssignmentTest.java        | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/b1822da3/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLateAffinityAssignmentTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLateAffinityAssignmentTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLateAffinityAssignmentTest.java
index 5ecc5aa..a74117c 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLateAffinityAssignmentTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLateAffinityAssignmentTest.java
@@ -1101,13 +1101,12 @@ public class CacheLateAffinityAssignmentTest extends GridCommonAbstractTest {
                 U.sleep(5000);
 
                 for (int i = 0; i < NODES; i++)
-                    stopGrid(i);
+                    stopGrid(getTestIgniteInstanceName(i), false, false);
 
                 return null;
             }
         }, "stop-thread");
 
-
         latch.countDown();
 
         Ignite node = startGrid(NODES);