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); - } -}
