http://git-wip-us.apache.org/repos/asf/ignite/blob/26e40528/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 deleted file mode 100644 index 5b3c9c8..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/SparseLocalOnHeapMatrixStorage.java +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 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 it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; -import it.unimi.dsi.fastutil.ints.IntSet; -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; -import org.apache.ignite.ml.math.functions.IgniteTriFunction; - -/** - * 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<>(); - } - - /** - * @return Matrix elements storage mode. - */ - public int storageMode() { - return stoMode; - } - - /** {@inheritDoc} */ - @Override public int accessMode() { - 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; - } - - // TODO: IGNITE-5777, optimize this - - /** {@inheritDoc} */ - @Override public double[] data() { - double[] res = new double[rows * cols]; - - boolean isRowStorage = stoMode == ROW_STORAGE_MODE; - - sto.forEach((fstIdx, map) -> - map.forEach((sndIdx, val) -> { - if (isRowStorage) - res[sndIdx * rows + fstIdx] = val; - else - res[fstIdx * cols + sndIdx] = val; - - })); - - return res; - } - - /** {@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); - } - - /** */ - public void compute(int row, int col, IgniteTriFunction<Integer, Integer, Double, Double> f) { - sto.get(row).compute(col, (c, val) -> f.apply(row, c, val)); - } - - /** */ - public Int2ObjectArrayMap<IntSet> indexesMap() { - Int2ObjectArrayMap<IntSet> res = new Int2ObjectArrayMap<>(); - - for (Integer row : sto.keySet()) - res.put(row.intValue(), (IntSet)sto.get(row).keySet()); - - return res; - } -}
http://git-wip-us.apache.org/repos/asf/ignite/blob/26e40528/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 deleted file mode 100644 index e0a760c..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/ml/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.ml.math.impls.storage.matrix; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/26e40528/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 deleted file mode 100644 index dc23611..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/ml/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.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/26e40528/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 deleted file mode 100644 index 6775d44..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/DelegateVectorStorage.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.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; - } - - /** - * @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; - } - - /** {@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/26e40528/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 deleted file mode 100644 index 71b7793..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/ml/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.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: IGNITE-5535, 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/26e40528/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 deleted file mode 100644 index 1e3680a..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/MatrixVectorStorage.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.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 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; - 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(); - } - - /** - * @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; - 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} */ - //TODO: IGNITE-5925, tmp solution, wait this ticket. - @Override public double[] data() { - double[] res = new double[size]; - - for (int i = 0; i < size; i++) - res[i] = get(i); - - return res; - } - - /** {@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/26e40528/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 deleted file mode 100644 index a858364..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOffHeapVectorStorage.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 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. - } - - /** - * @param cap Initial capacity. - */ - 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: IGNITE-5801, 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/26e40528/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 deleted file mode 100644 index 4e07a92..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOnHeapVectorStorage.java +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 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 it.unimi.dsi.fastutil.ints.IntSet; -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.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. - } - - /** */ - public SparseLocalOnHeapVectorStorage(Map<Integer, Double> map, boolean cp) { - assert map.size() > 0; - - this.size = map.size(); - - if (map instanceof Int2DoubleRBTreeMap) - acsMode = SEQUENTIAL_ACCESS_MODE; - else if (map instanceof Int2DoubleOpenHashMap) - acsMode = RANDOM_ACCESS_MODE; - else - acsMode = UNKNOWN_STORAGE_MODE; - - if (cp) - switch (acsMode) { - case SEQUENTIAL_ACCESS_MODE: - sto = new Int2DoubleRBTreeMap(map); - case RANDOM_ACCESS_MODE: - sto = new Int2DoubleOpenHashMap(map); - break; - default: - sto = new HashMap<>(map); - } - else - sto = map; - } - - /** - * @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(); - } - - /** - * @return Vector elements access mode. - */ - 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 double[] data() { - double[] data = new double[size]; - - sto.forEach((idx, val) -> data[idx] = val); - - return data; - } - - /** {@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; - } - - /** */ - public IntSet indexes() { - return (IntSet)sto.keySet(); - } -} http://git-wip-us.apache.org/repos/asf/ignite/blob/26e40528/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 deleted file mode 100644 index a9825b3..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/ml/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.ml.math.impls.storage.vector; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/26e40528/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 deleted file mode 100644 index 131a610..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/AbstractVector.java +++ /dev/null @@ -1,915 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 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.functions.IgniteIntDoubleToDoubleBiFunction; -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); - } - - /** - * @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); - } - - /** {@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); - } - - /** {@inheritDoc} */ - @Override public void compute(int idx, IgniteIntDoubleToDoubleBiFunction f) { - storageSet(idx, f.apply(idx, storageGet(idx))); - lenSq = 0.0; - maxElm = minElm = null; - } -} http://git-wip-us.apache.org/repos/asf/ignite/blob/26e40528/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 deleted file mode 100644 index 1df9acc..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/DelegatingVector.java +++ /dev/null @@ -1,402 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 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; -import org.apache.ignite.ml.math.functions.IgniteIntDoubleToDoubleBiFunction; - -/** - * 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 Parent vector. - */ - public DelegatingVector(Vector dlg) { - assert dlg != null; - - this.dlg = dlg; - } - - /** Get the delegating vector */ - public Vector getVector() { - return 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 compute(int i, IgniteIntDoubleToDoubleBiFunction f) { - dlg.compute(i, f); - } - - /** {@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/26e40528/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 deleted file mode 100644 index c635572..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/ml/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.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/26e40528/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 deleted file mode 100644 index c37bda0..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/ml/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.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/26e40528/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/MapWrapperVector.java ---------------------------------------------------------------------- diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/MapWrapperVector.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/MapWrapperVector.java deleted file mode 100644 index d79f98b..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/MapWrapperVector.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.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.impls.storage.matrix.MapWrapperStorage; - -/** - * Vector wrapping a given map. - */ -public class MapWrapperVector extends AbstractVector { - /** - * Construct a vector wrapping given map. - * - * @param map Map to wrap. - */ - public MapWrapperVector(Map<Integer, Double> map) { - setStorage(new MapWrapperStorage(map)); - } - - /** - * No-op constructor for serialization. - */ - public MapWrapperVector() { - // No-op. - } - - /** {@inheritDoc} */ - @Override public Vector like(int crd) { - throw new UnsupportedOperationException(); - } - - /** {@inheritDoc} */ - @Override public Matrix likeMatrix(int rows, int cols) { - throw new UnsupportedOperationException(); - } -}
