http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/CacheVector.java ---------------------------------------------------------------------- diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/CacheVector.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/CacheVector.java deleted file mode 100644 index 0e9b26f..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/CacheVector.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.math.impls.vector; - -import org.apache.ignite.IgniteCache; -import org.apache.ignite.math.Matrix; -import org.apache.ignite.math.ValueMapper; -import org.apache.ignite.math.Vector; -import org.apache.ignite.math.VectorKeyMapper; -import org.apache.ignite.math.exceptions.UnsupportedOperationException; -import org.apache.ignite.math.functions.IgniteBiFunction; -import org.apache.ignite.math.functions.IgniteDoubleFunction; -import org.apache.ignite.math.functions.IgniteFunction; -import org.apache.ignite.math.impls.CacheUtils; -import org.apache.ignite.math.impls.storage.vector.CacheVectorStorage; - -/** - * Vector based on existing cache and index and value mapping functions. - */ -public class CacheVector<K, V> extends AbstractVector { - /** - * - */ - public CacheVector() { - // No-op. - } - - /** - * Creates new vector over existing cache. - * - * @param size - * @param cache - * @param keyFunc - * @param valMapper - */ - public CacheVector( - int size, - IgniteCache<K, V> cache, - VectorKeyMapper<K> keyFunc, - ValueMapper<V> valMapper) { - setStorage(new CacheVectorStorage<>(size, cache, keyFunc, valMapper)); - } - - /** - * @param mapper - */ - private Vector mapOverCache(IgniteFunction<Double, Double> mapper) { - CacheVectorStorage<K, V> sto = storage(); - - CacheUtils.map(sto.cache().getName(), sto.keyMapper(), sto.valueMapper(), mapper); - - return this; - } - - /** {@inheritDoc} */ - @Override public double minValue() { - CacheVectorStorage<K, V> sto = storage(); - - return CacheUtils.min(sto.cache().getName(), sto.keyMapper(), sto.valueMapper()); - } - - /** {@inheritDoc} */ - @Override public double maxValue() { - CacheVectorStorage<K, V> sto = storage(); - - return CacheUtils.max(sto.cache().getName(), sto.keyMapper(), sto.valueMapper()); - } - - /** {@inheritDoc} */ - @Override public Vector map(IgniteDoubleFunction<Double> fun) { - return mapOverCache(fun::apply); - } - - /** {@inheritDoc} */ - @Override public Vector map(IgniteBiFunction<Double, Double, Double> fun, double y) { - // TODO: provide cache-optimized implementation. - return super.map(fun, y); // TODO - } - - /** {@inheritDoc} */ - @Override public double sum() { - CacheVectorStorage<K, V> sto = storage(); - - return CacheUtils.sum(sto.cache().getName(), sto.keyMapper(), sto.valueMapper()); - } - - /** {@inheritDoc} */ - @Override public Vector assign(double val) { - return mapOverCache((Double d) -> val); - } - - /** {@inheritDoc} */ - @Override public Vector plus(double x) { - return mapOverCache((Double d) -> d + x); - } - - /** {@inheritDoc} */ - @Override public Vector divide(double x) { - return mapOverCache((Double d) -> d / x); - } - - /** {@inheritDoc} */ - @Override public Vector times(double x) { - return mapOverCache((Double d) -> d * x); - } - - /** - * - * - */ - @SuppressWarnings({"unchecked"}) - private CacheVectorStorage<K, V> storage() { - return (CacheVectorStorage<K, V>)getStorage(); - } - - /** {@inheritDoc} */ - @Override public Vector like(int crd) { - throw new UnsupportedOperationException(); - } - - /** {@inheritDoc} */ - @Override public Matrix likeMatrix(int rows, int cols) { - throw new UnsupportedOperationException(); - } -}
http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/ConstantVector.java ---------------------------------------------------------------------- diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/ConstantVector.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/ConstantVector.java deleted file mode 100644 index 0fddfd6..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/ConstantVector.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.math.impls.vector; - -import org.apache.ignite.math.Matrix; -import org.apache.ignite.math.Vector; -import org.apache.ignite.math.VectorStorage; -import org.apache.ignite.math.exceptions.UnsupportedOperationException; -import org.apache.ignite.math.impls.storage.vector.ConstantVectorStorage; - -/** - * Constant value, read-only vector. - */ -public class ConstantVector extends AbstractReadOnlyVector { - /** - * - */ - public ConstantVector() { - // No-op. - } - - /** - * @param size - * @param val - */ - public ConstantVector(int size, double val) { - super(new ConstantVectorStorage(size, val)); - } - - /** - * - * - */ - private ConstantVectorStorage storage() { - return (ConstantVectorStorage)getStorage(); - } - - /** {@inheritDoc} */ - @Override public Vector copy() { - ConstantVectorStorage sto = storage(); - - return new ConstantVector(sto.size(), sto.constant()); - } - - /** {@inheritDoc} */ - @Override public Vector like(int crd) { - return new ConstantVector(crd, storage().constant()); - } - - /** {@inheritDoc} */ - @Override public Matrix likeMatrix(int rows, int cols) { - throw new UnsupportedOperationException(); - } - - /** {@inheritDoc} */ - @Override public boolean equals(Object o) { - if (this == o) - return true; - - if (o == null || getClass() != o.getClass()) - return false; - - ConstantVector that = (ConstantVector)o; - - VectorStorage sto = getStorage(); - - return (sto != null ? sto.equals(that.getStorage()) : that.getStorage() == null); - } -} http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/DelegatingVector.java ---------------------------------------------------------------------- diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/DelegatingVector.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/DelegatingVector.java deleted file mode 100644 index a10fa45..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/DelegatingVector.java +++ /dev/null @@ -1,391 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.math.impls.vector; - -import java.io.IOException; -import java.io.ObjectInput; -import java.io.ObjectOutput; -import java.util.HashMap; -import java.util.Map; -import java.util.Spliterator; -import java.util.function.IntToDoubleFunction; -import org.apache.ignite.lang.IgniteUuid; -import org.apache.ignite.math.Matrix; -import org.apache.ignite.math.Vector; -import org.apache.ignite.math.VectorStorage; -import org.apache.ignite.math.functions.IgniteBiFunction; -import org.apache.ignite.math.functions.IgniteDoubleFunction; - -/** - * Convenient class that can be used to add decorations to an existing vector. Subclasses - * can add weights, indices, etc. while maintaining full vector functionality. - */ -public class DelegatingVector implements Vector { - /** Delegating vector. */ - private Vector dlg; - - /** Meta attribute storage. */ - private Map<String, Object> meta = new HashMap<>(); - - /** GUID. */ - private IgniteUuid guid = IgniteUuid.randomUuid(); - - /** */ - public DelegatingVector() { - // No-op. - } - - /** - * @param dlg - */ - public DelegatingVector(Vector dlg) { - assert dlg != null; - - this.dlg = dlg; - } - - /** {@inheritDoc} */ - @Override public void writeExternal(ObjectOutput out) throws IOException { - out.writeObject(dlg); - out.writeObject(meta); - out.writeObject(guid); - } - - /** {@inheritDoc} */ - @SuppressWarnings("unchecked") - @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { - dlg = (Vector)in.readObject(); - meta = (Map<String, Object>)in.readObject(); - guid = (IgniteUuid)in.readObject(); - } - - /** {@inheritDoc} */ - @Override public Map<String, Object> getMetaStorage() { - return meta; - } - - /** {@inheritDoc} */ - @Override public Matrix likeMatrix(int rows, int cols) { - return dlg.likeMatrix(rows, cols); - } - - /** {@inheritDoc} */ - @Override public Matrix toMatrix(boolean rowLike) { - return dlg.toMatrix(rowLike); - } - - /** {@inheritDoc} */ - @Override public Matrix toMatrixPlusOne(boolean rowLike, double zeroVal) { - return dlg.toMatrixPlusOne(rowLike, zeroVal); - } - - /** {@inheritDoc} */ - @Override public int size() { - return dlg.size(); - } - - /** {@inheritDoc} */ - @Override public boolean isDense() { - return dlg.isDense(); - } - - /** {@inheritDoc} */ - @Override public double minValue() { - return dlg.minValue(); - } - - /** {@inheritDoc} */ - @Override public double maxValue() { - return dlg.maxValue(); - } - - /** {@inheritDoc} */ - @Override public boolean isSequentialAccess() { - return dlg.isSequentialAccess(); - } - - /** {@inheritDoc} */ - @Override public boolean isArrayBased() { - return dlg.isArrayBased(); - } - - /** {@inheritDoc} */ - @Override public Vector copy() { - return new DelegatingVector(dlg); - } - - /** {@inheritDoc} */ - @Override public Iterable<Element> all() { - return dlg.all(); - } - - /** {@inheritDoc} */ - @Override public Iterable<Element> nonZeroes() { - return dlg.nonZeroes(); - } - - /** {@inheritDoc} */ - @Override public Vector sort() { - return dlg.sort(); - } - - /** {@inheritDoc} */ - @Override public Spliterator<Double> allSpliterator() { - return dlg.allSpliterator(); - } - - /** {@inheritDoc} */ - @Override public Spliterator<Double> nonZeroSpliterator() { - return dlg.nonZeroSpliterator(); - } - - /** {@inheritDoc} */ - @Override public Element getElement(int idx) { - return dlg.getElement(idx); - } - - /** {@inheritDoc} */ - @Override public Vector assign(double val) { - return dlg.assign(val); - } - - /** {@inheritDoc} */ - @Override public Vector assign(double[] vals) { - return dlg.assign(vals); - } - - /** {@inheritDoc} */ - @Override public Vector assign(Vector vec) { - return dlg.assign(vec); - } - - /** {@inheritDoc} */ - @Override public Vector assign(IntToDoubleFunction fun) { - return dlg.assign(fun); - } - - /** {@inheritDoc} */ - @Override public Vector map(IgniteDoubleFunction<Double> fun) { - return dlg.map(fun); - } - - /** {@inheritDoc} */ - @Override public Vector map(Vector vec, IgniteBiFunction<Double, Double, Double> fun) { - return dlg.map(vec, fun); - } - - /** {@inheritDoc} */ - @Override public Vector map(IgniteBiFunction<Double, Double, Double> fun, double y) { - return dlg.map(fun, y); - } - - /** {@inheritDoc} */ - @Override public Vector divide(double x) { - return dlg.divide(x); - } - - /** {@inheritDoc} */ - @Override public double dot(Vector vec) { - return dlg.dot(vec); - } - - /** {@inheritDoc} */ - @Override public double get(int idx) { - return dlg.get(idx); - } - - /** {@inheritDoc} */ - @Override public double getX(int idx) { - return dlg.getX(idx); - } - - /** {@inheritDoc} */ - @Override public Vector like(int crd) { - return dlg.like(crd); - } - - /** {@inheritDoc} */ - @Override public Vector minus(Vector vec) { - return dlg.minus(vec); - } - - /** {@inheritDoc} */ - @Override public Vector normalize() { - return dlg.normalize(); - } - - /** {@inheritDoc} */ - @Override public Vector normalize(double power) { - return dlg.normalize(power); - } - - /** {@inheritDoc} */ - @Override public Vector logNormalize() { - return dlg.logNormalize(); - } - - /** {@inheritDoc} */ - @Override public Vector logNormalize(double power) { - return dlg.logNormalize(power); - } - - /** {@inheritDoc} */ - @Override public double kNorm(double power) { - return dlg.kNorm(power); - } - - /** {@inheritDoc} */ - @Override public Element minElement() { - return dlg.minElement(); - } - - /** {@inheritDoc} */ - @Override public Element maxElement() { - return dlg.maxElement(); - } - - /** {@inheritDoc} */ - @Override public Vector plus(double x) { - return dlg.plus(x); - } - - /** {@inheritDoc} */ - @Override public Vector plus(Vector vec) { - return dlg.plus(vec); - } - - /** {@inheritDoc} */ - @Override public Vector set(int idx, double val) { - return dlg.set(idx, val); - } - - /** {@inheritDoc} */ - @Override public Vector setX(int idx, double val) { - return dlg.setX(idx, val); - } - - /** {@inheritDoc} */ - @Override public Vector incrementX(int idx, double val) { - return dlg.incrementX(idx, val); - } - - /** {@inheritDoc} */ - @Override public Vector increment(int idx, double val) { - return dlg.increment(idx, val); - } - - /** {@inheritDoc} */ - @Override public int nonZeroElements() { - return dlg.nonZeroElements(); - } - - /** {@inheritDoc} */ - @Override public Vector times(double x) { - return dlg.times(x); - } - - /** {@inheritDoc} */ - @Override public Vector times(Vector vec) { - return dlg.times(vec); - } - - /** {@inheritDoc} */ - @Override public Vector viewPart(int off, int len) { - return dlg.viewPart(off, len); - } - - /** {@inheritDoc} */ - @Override public VectorStorage getStorage() { - return dlg.getStorage(); - } - - /** {@inheritDoc} */ - @Override public double sum() { - return dlg.sum(); - } - - /** {@inheritDoc} */ - @Override public Matrix cross(Vector vec) { - return dlg.cross(vec); - } - - /** {@inheritDoc} */ - @Override public <T> T foldMap(IgniteBiFunction<T, Double, T> foldFun, IgniteDoubleFunction<Double> mapFun, - T zeroVal) { - return dlg.foldMap(foldFun, mapFun, zeroVal); - } - - /** {@inheritDoc} */ - @Override public <T> T foldMap(Vector vec, IgniteBiFunction<T, Double, T> foldFun, - IgniteBiFunction<Double, Double, Double> combFun, T zeroVal) { - return dlg.foldMap(vec, foldFun, combFun, zeroVal); - } - - /** {@inheritDoc} */ - @Override public double getLengthSquared() { - return dlg.getLengthSquared(); - } - - /** {@inheritDoc} */ - @Override public double getDistanceSquared(Vector vec) { - return dlg.getDistanceSquared(vec); - } - - /** {@inheritDoc} */ - @Override public boolean isRandomAccess() { - return dlg.isRandomAccess(); - } - - /** {@inheritDoc} */ - @Override public boolean isDistributed() { - return dlg.isDistributed(); - } - - /** {@inheritDoc} */ - @Override public IgniteUuid guid() { - return guid; - } - - /** {@inheritDoc} */ - @Override public void destroy() { - dlg.destroy(); - } - - /** {@inheritDoc} */ - @Override public int hashCode() { - int res = 1; - - res = res * 37 + meta.hashCode(); - res = res * 37 + dlg.hashCode(); - - return res; - } - - /** {@inheritDoc} */ - @Override public boolean equals(Object o) { - if (this == o) - return true; - - if (o == null || getClass() != o.getClass()) - return false; - - DelegatingVector that = (DelegatingVector)o; - - return meta.equals(that.meta) && dlg.equals(that.dlg); - } -} http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/DenseLocalOffHeapVector.java ---------------------------------------------------------------------- diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/DenseLocalOffHeapVector.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/DenseLocalOffHeapVector.java deleted file mode 100644 index 4e7eb21..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/DenseLocalOffHeapVector.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.math.impls.vector; - -import java.util.stream.IntStream; -import org.apache.ignite.math.Matrix; -import org.apache.ignite.math.Vector; -import org.apache.ignite.math.impls.matrix.DenseLocalOffHeapMatrix; -import org.apache.ignite.math.impls.storage.vector.DenseLocalOffHeapVectorStorage; - -/** - * Implementation for {@link Vector} assuming dense logic and local offheap JVM storage. - * It is suitable for data sets where local, non-distributed execution is satisfactory and on-heap JVM storage - * is not enough to keep the entire data set. - */ -public class DenseLocalOffHeapVector extends AbstractVector { - /** */ - public DenseLocalOffHeapVector() { - // No-op. - } - - /** */ - private void makeOffheapStorage(int size) { - setStorage(new DenseLocalOffHeapVectorStorage(size)); - } - - /** - * @param arr Array to copy to offheap storage. - */ - public DenseLocalOffHeapVector(double[] arr) { - makeOffheapStorage(arr.length); - - assign(arr); - } - - /** - * @param size Vector cardinality. - */ - public DenseLocalOffHeapVector(int size) { - makeOffheapStorage(size); - } - - /** {@inheritDoc} */ - @Override public Vector assign(Vector vec) { - checkCardinality(vec); - - IntStream.range(0, size()).parallel().forEach(idx -> set(idx, vec.get(idx))); - - return this; - } - - /** {@inheritDoc} */ - @Override public Vector times(double x) { - if (x == 0.0) - return like(size()).assign(0); - else - return super.times(x); - } - - /** {@inheritDoc} */ - @Override public Vector like(int crd) { - return new DenseLocalOffHeapVector(crd); - } - - /** {@inheritDoc} */ - @Override public Matrix likeMatrix(int rows, int cols) { - return new DenseLocalOffHeapMatrix(rows, cols); - } - - /** {@inheritDoc} */ - @Override public boolean equals(Object o) { - return o != null && getClass().equals(o.getClass()) && (getStorage().equals(((Vector)o).getStorage())); - } -} http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/DenseLocalOnHeapVector.java ---------------------------------------------------------------------- diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/DenseLocalOnHeapVector.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/DenseLocalOnHeapVector.java deleted file mode 100644 index 5827998..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/DenseLocalOnHeapVector.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.math.impls.vector; - -import java.util.Map; -import org.apache.ignite.math.Matrix; -import org.apache.ignite.math.Vector; -import org.apache.ignite.math.VectorStorage; -import org.apache.ignite.math.exceptions.UnsupportedOperationException; -import org.apache.ignite.math.impls.matrix.DenseLocalOnHeapMatrix; -import org.apache.ignite.math.impls.storage.vector.ArrayVectorStorage; - -/** - * Basic implementation for vector. - * <p> - * This is a trivial implementation for vector assuming dense logic, local on-heap JVM storage - * based on {@code double[]} array. It is only suitable for data sets where - * local, non-distributed execution is satisfactory and on-heap JVM storage is enough - * to keep the entire data set. - */ -public class DenseLocalOnHeapVector extends AbstractVector { - /** - * @param size Vector cardinality. - */ - private VectorStorage mkStorage(int size) { - return new ArrayVectorStorage(size); - } - - /** - * @param arr Source array. - * @param cp {@code true} to clone array, reuse it otherwise. - */ - private VectorStorage mkStorage(double[] arr, boolean cp) { - assert arr != null; - - return new ArrayVectorStorage(cp ? arr.clone() : arr); - } - - /** - * @param args Parameters for new Vector. - */ - public DenseLocalOnHeapVector(Map<String, Object> args) { - assert args != null; - - if (args.containsKey("size")) - setStorage(mkStorage((int)args.get("size"))); - else if (args.containsKey("arr") && args.containsKey("copy")) - setStorage(mkStorage((double[])args.get("arr"), (boolean)args.get("copy"))); - else - throw new UnsupportedOperationException("Invalid constructor argument(s)."); - } - - /** */ - public DenseLocalOnHeapVector() { - // No-op. - } - - /** - * @param size Vector cardinality. - */ - public DenseLocalOnHeapVector(int size) { - setStorage(mkStorage(size)); - } - - /** - * @param arr Source array. - * @param shallowCp {@code true} to use shallow copy. - */ - public DenseLocalOnHeapVector(double[] arr, boolean shallowCp) { - setStorage(mkStorage(arr, shallowCp)); - } - - /** - * @param arr Source array. - */ - public DenseLocalOnHeapVector(double[] arr) { - this(arr, false); - } - - /** {@inheritDoc} */ - @Override public Matrix likeMatrix(int rows, int cols) { - return new DenseLocalOnHeapMatrix(rows, cols); - } - - /** {@inheritDoc} */ - @Override public Vector like(int crd) { - return new DenseLocalOnHeapVector(crd); - } -} http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/FunctionVector.java ---------------------------------------------------------------------- diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/FunctionVector.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/FunctionVector.java deleted file mode 100644 index 0e7cfad..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/FunctionVector.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.math.impls.vector; - -import java.util.Map; -import org.apache.ignite.math.Matrix; -import org.apache.ignite.math.Vector; -import org.apache.ignite.math.exceptions.UnsupportedOperationException; -import org.apache.ignite.math.functions.IgniteFunction; -import org.apache.ignite.math.functions.IntDoubleToVoidFunction; -import org.apache.ignite.math.impls.storage.vector.FunctionVectorStorage; - -/** - * Implementation of {@link Vector} that maps vector element index to {@link java.util.function} interfaces. - */ -public class FunctionVector extends AbstractVector { - /** - * - */ - public FunctionVector() { - // No-op. - } - - /** - * Creates read-write or read-only function vector. - * - * @param size Vector size. - * @param getFunc Function that returns value corresponding to given element index. - * @param setFunc Set function. If {@code null} - this will be a read-only vector. - */ - public FunctionVector(int size, IgniteFunction<Integer, Double> getFunc, IntDoubleToVoidFunction setFunc) { - setStorage(new FunctionVectorStorage(size, getFunc, setFunc)); - } - - /** - * Creates read-only function vector. - * - * @param size Vector size. - * @param getFunc Function that returns value corresponding to given element index. - */ - public FunctionVector(int size, IgniteFunction<Integer, Double> getFunc) { - setStorage(new FunctionVectorStorage(size, getFunc)); - } - - /** - * @param args Arguments for vector constructor. - */ - public FunctionVector(Map<String, Object> args) { - assert args != null; - - if (args.containsKey("size") && args.containsKey("getFunc") && args.containsKey("setFunc")) { - @SuppressWarnings("unchecked") - IgniteFunction<Integer, Double> getFunc = (IgniteFunction<Integer, Double>)args.get("getFunc"); - IntDoubleToVoidFunction setFunc = (IntDoubleToVoidFunction)args.get("setFunc"); - int size = (int)args.get("size"); - - setStorage(new FunctionVectorStorage(size, getFunc, setFunc)); - } - else if (args.containsKey("size") && args.containsKey("getFunc")) { - @SuppressWarnings("unchecked") - IgniteFunction<Integer, Double> getFunc = (IgniteFunction<Integer, Double>)args.get("getFunc"); - int size = (int)args.get("size"); - - setStorage(new FunctionVectorStorage(size, getFunc)); - } - else - throw new UnsupportedOperationException("Invalid constructor argument(s)."); - } - - /** - * - * - */ - private FunctionVectorStorage storage() { - return (FunctionVectorStorage)getStorage(); - } - - /** {@inheritDoc} */ - @Override public org.apache.ignite.math.Vector like(int crd) { - FunctionVectorStorage sto = storage(); - - return new FunctionVector(crd, sto.getFunction(), sto.setFunction()); - } - - /** {@inheritDoc} */ - @Override public Matrix likeMatrix(int rows, int cols) { - throw new UnsupportedOperationException(); - } - - /** {@inheritDoc} */ - @Override public Vector times(double x) { - if (x == 0.0) - return like(size()).assign(0); - else - return super.times(x); - } -} http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/MatrixVectorView.java ---------------------------------------------------------------------- diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/MatrixVectorView.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/MatrixVectorView.java deleted file mode 100644 index 8f32a89..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/MatrixVectorView.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.math.impls.vector; - -import java.io.IOException; -import java.io.ObjectInput; -import java.io.ObjectOutput; -import org.apache.ignite.math.Matrix; -import org.apache.ignite.math.Vector; -import org.apache.ignite.math.exceptions.IndexException; -import org.apache.ignite.math.impls.storage.vector.MatrixVectorStorage; - -/** - * Row or column vector view off the matrix. - */ -public class MatrixVectorView extends AbstractVector { - /** */ private Matrix parent; - - /** */ private int row; - /** */ private int col; - - /** */ private int rowStride; - /** */ private int colStride; - - /** - * - */ - public MatrixVectorView() { - // No-op. - } - - /** - * @param parent - * @param row - * @param col - * @param rowStride - * @param colStride - */ - public MatrixVectorView(Matrix parent, int row, int col, int rowStride, int colStride) { - assert parent != null; - - if (row < 0 || row >= parent.rowSize()) - throw new IndexException(row); - if (col < 0 || col >= parent.columnSize()) - throw new IndexException(col); - - this.parent = parent; - - this.row = row; - this.col = col; - - this.rowStride = rowStride; - this.colStride = colStride; - - setStorage(new MatrixVectorStorage(parent, row, col, rowStride, colStride)); - } - - /** {@inheritDoc} */ - @Override public Vector copy() { - return new MatrixVectorView(parent, row, col, rowStride, colStride); - } - - /** {@inheritDoc} */ - @Override public Vector like(int crd) { - return parent.likeVector(crd); - } - - /** {@inheritDoc} */ - @Override public Matrix likeMatrix(int rows, int cols) { - return parent.like(rows, cols); - } - - /** {@inheritDoc} */ - @Override public void writeExternal(ObjectOutput out) throws IOException { - super.writeExternal(out); - - out.writeObject(parent); - out.writeInt(row); - out.writeInt(col); - out.writeInt(rowStride); - out.writeInt(colStride); - } - - /** {@inheritDoc} */ - @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { - super.readExternal(in); - - parent = (Matrix)in.readObject(); - row = in.readInt(); - col = in.readInt(); - rowStride = in.readInt(); - colStride = in.readInt(); - } - - /** {@inheritDoc} */ - @Override public int hashCode() { - int res = 1; - - res = res * 37 + (parent == null ? 0 : parent.hashCode()); - res = res * 37 + row; - res = res * 37 + col; - res = res * 37 + rowStride; - res = res * 37 + colStride; - - return res; - } - - /** {@inheritDoc} */ - @Override public boolean equals(Object o) { - if (this == o) - return true; - - if (o == null || getClass() != o.getClass()) - return false; - - MatrixVectorView that = (MatrixVectorView)o; - - return (parent != null ? parent.equals(that.parent) : that.parent == null) && - row == that.row && - col == that.col && - rowStride == that.rowStride && - colStride == that.colStride; - } -} http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/PivotedVectorView.java ---------------------------------------------------------------------- diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/PivotedVectorView.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/PivotedVectorView.java deleted file mode 100644 index cc9e835..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/PivotedVectorView.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.math.impls.vector; - -import java.io.IOException; -import java.io.ObjectInput; -import java.io.ObjectOutput; -import org.apache.ignite.math.Matrix; -import org.apache.ignite.math.Vector; -import org.apache.ignite.math.exceptions.UnsupportedOperationException; -import org.apache.ignite.math.functions.Functions; -import org.apache.ignite.math.impls.storage.vector.PivotedVectorStorage; - -/** - * Pivoted (index mapped) view over another vector. - */ -public class PivotedVectorView extends AbstractVector { - /** */ private Vector vec; - - /** - * @param vec - * @param pivot Mapping from external index to internal. - * @param unpivot Mapping from internal index to external. - */ - public PivotedVectorView(Vector vec, int[] pivot, int[] unpivot) { - setStorage(new PivotedVectorStorage(vec.getStorage(), pivot, unpivot)); - - checkCardinality(pivot); - checkCardinality(unpivot); - - this.vec = vec; - } - - /** - * @param vec - * @param pivot - */ - public PivotedVectorView(Vector vec, int[] pivot) { - setStorage(new PivotedVectorStorage(vec.getStorage(), pivot)); - - checkCardinality(pivot); - - this.vec = vec; - } - - /** - * - * - */ - private PivotedVectorStorage storage() { - return (PivotedVectorStorage)getStorage(); - } - - /** - * - */ - public PivotedVectorView() { - // No-op. - } - - /** - * - * - */ - public Vector getBaseVector() { - return vec; - } - - /** - * @param i - */ - public int pivot(int i) { - return storage().pivot()[i]; - } - - /** - * @param i - */ - public int unpivot(int i) { - return storage().unpivot()[i]; - } - - /** - * @param idx - */ - protected Vector.Element makeElement(int idx) { - checkIndex(idx); - - // External index. - int exIdx = storage().pivot()[idx]; - - return new Vector.Element() { - /** {@inheritDoc */ - @Override public double get() { - return storageGet(idx); - } - - /** {@inheritDoc */ - @Override public int index() { - return exIdx; - } - - /** {@inheritDoc */ - @Override public void set(double val) { - storageSet(idx, val); - } - }; - } - - /** {@inheritDoc} */ - @Override public Vector copy() { - PivotedVectorStorage sto = storage(); - - return new PivotedVectorView(vec, sto.pivot(), sto.unpivot()); - } - - /** {@inheritDoc} */ - @Override public Vector like(int crd) { - throw new UnsupportedOperationException(); - } - - /** {@inheritDoc} */ - @Override public Matrix likeMatrix(int rows, int cols) { - return vec.likeMatrix(rows, cols); - } - - /** {@inheritDoc} */ - @Override public Vector times(double x) { - if (x == 0.0) - return copy().map(Functions.mult(x)); - else - return super.times(x); - } - - /** {@inheritDoc} */ - @Override public void writeExternal(ObjectOutput out) throws IOException { - super.writeExternal(out); - - out.writeObject(vec); - } - - /** {@inheritDoc} */ - @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { - super.readExternal(in); - - vec = (Vector)in.readObject(); - } -} http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/RandomVector.java ---------------------------------------------------------------------- diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/RandomVector.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/RandomVector.java deleted file mode 100644 index c9121c9..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/RandomVector.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.math.impls.vector; - -import java.io.IOException; -import java.io.ObjectInput; -import java.io.ObjectOutput; -import java.util.Map; -import org.apache.ignite.math.Matrix; -import org.apache.ignite.math.VectorStorage; -import org.apache.ignite.math.exceptions.UnsupportedOperationException; -import org.apache.ignite.math.impls.matrix.RandomMatrix; -import org.apache.ignite.math.impls.storage.vector.RandomVectorStorage; - -/** - * Random vector. Each value is taken from {-1,0,1} with roughly equal probability. Note - * that by default, the value is determined by a relatively simple hash of the index. - */ -public class RandomVector extends AbstractReadOnlyVector { - /** */ private boolean fastHash; - - /** - * @param size Vector cardinality. - * @param fastHash - */ - private VectorStorage mkStorage(int size, boolean fastHash) { - this.fastHash = fastHash; - - return new RandomVectorStorage(size, fastHash); - } - - /** - * @param size - * @param fastHash - */ - public RandomVector(int size, boolean fastHash) { - setStorage(mkStorage(size, fastHash)); - } - - /** - * @param size - */ - public RandomVector(int size) { - this(size, true); - } - - /** - * @param args - */ - public RandomVector(Map<String, Object> args) { - assert args != null; - - if (args.containsKey("size") && args.containsKey("fastHash")) - setStorage(mkStorage((int)args.get("size"), (boolean)args.get("fastHash"))); - else if (args.containsKey("size")) - setStorage(mkStorage((int)args.get("size"), true)); - else - throw new UnsupportedOperationException("Invalid constructor argument(s)."); - } - - /** */ - public RandomVector() { - // No-op. - } - - /** {@inheritDoc} */ - @Override public org.apache.ignite.math.Vector like(int crd) { - return new RandomVector(crd, fastHash); - } - - /** {@inheritDoc} */ - @Override public Matrix likeMatrix(int rows, int cols) { - return new RandomMatrix(rows, cols); - } - - /** {@inheritDoc} */ - @Override public void writeExternal(ObjectOutput out) throws IOException { - super.writeExternal(out); - - out.writeBoolean(fastHash); - } - - /** {@inheritDoc} */ - @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { - super.readExternal(in); - - fastHash = in.readBoolean(); - } - - /** {@inheritDoc} */ - @Override public int hashCode() { - int res = 1; - - res = res * 37 + Boolean.hashCode(fastHash); - res = res * 37 + getStorage().hashCode(); - - return res; - } - - /** {@inheritDoc} */ - @Override public boolean equals(Object o) { - if (this == o) - return true; - - if (o == null || getClass() != o.getClass()) - return false; - - RandomVector that = (RandomVector)o; - VectorStorage sto = getStorage(); - - return fastHash == that.fastHash && (sto != null ? sto.equals(that.getStorage()) : that.getStorage() == null); - } -} http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SingleElementVector.java ---------------------------------------------------------------------- diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SingleElementVector.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SingleElementVector.java deleted file mode 100644 index 8d19ee0..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SingleElementVector.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.math.impls.vector; - -import java.util.Map; -import org.apache.ignite.math.Matrix; -import org.apache.ignite.math.Vector; -import org.apache.ignite.math.exceptions.UnsupportedOperationException; -import org.apache.ignite.math.impls.storage.vector.SingleElementVectorStorage; - -/** - * Read-write vector holding a single non-zero value at some index. - */ -public class SingleElementVector extends AbstractVector { - /** - * - */ - public SingleElementVector() { - // No-op - } - - /** - * @param size - * @param idx - * @param val - */ - public SingleElementVector(int size, int idx, double val) { - super(new SingleElementVectorStorage(size, idx, val)); - } - - /** - * @param args - */ - public SingleElementVector(Map<String, Object> args) { - assert args != null; - - if (args.containsKey("size") && args.containsKey("index") && args.containsKey("value")) { - int size = (int)args.get("size"); - int idx = (int)args.get("index"); - double val = (double)args.get("value"); - - setStorage(new SingleElementVectorStorage(size, idx, val)); - } - else - throw new UnsupportedOperationException("Invalid constructor argument(s)."); - } - - /** - * - * - */ - private SingleElementVectorStorage storage() { - return (SingleElementVectorStorage)getStorage(); - } - - /** {@inheritDoc} */ - @Override public Element minElement() { - return makeElement(storage().index()); - } - - /** {@inheritDoc} */ - @Override public Element maxElement() { - return makeElement(storage().index()); - } - - /** {@inheritDoc} */ - @Override public double sum() { - return getX(storage().index()); - } - - /** {@inheritDoc} */ - @Override public int nonZeroElements() { - return isZero(get(storage().index())) ? 0 : 1; - } - - /** {@inheritDoc} */ - @Override public Vector like(int crd) { - int idx = storage().index(); - - return new SingleElementVector(crd, idx, getX(idx)); - } - - /** {@inheritDoc} */ - @Override public Matrix likeMatrix(int rows, int cols) { - throw new UnsupportedOperationException(); - } -} http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SingleElementVectorView.java ---------------------------------------------------------------------- diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SingleElementVectorView.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SingleElementVectorView.java deleted file mode 100644 index 76a1c0a..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SingleElementVectorView.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.math.impls.vector; - -import org.apache.ignite.math.Matrix; -import org.apache.ignite.math.Vector; -import org.apache.ignite.math.exceptions.UnsupportedOperationException; -import org.apache.ignite.math.functions.Functions; -import org.apache.ignite.math.impls.storage.vector.SingleElementVectorDelegateStorage; - -/** - * Single value vector view over another vector. - */ -public class SingleElementVectorView extends AbstractVector { - /** - * - */ - public SingleElementVectorView() { - // No-op. - } - - /** - * @param vec - * @param idx - */ - public SingleElementVectorView(Vector vec, int idx) { - super(new SingleElementVectorDelegateStorage(vec, idx)); - } - - /** - * - * - */ - private SingleElementVectorDelegateStorage storage() { - return (SingleElementVectorDelegateStorage)getStorage(); - } - - /** {@inheritDoc} */ - @Override public Vector.Element minElement() { - return makeElement(storage().index()); - } - - /** {@inheritDoc} */ - @Override public Vector.Element maxElement() { - return makeElement(storage().index()); - } - - /** {@inheritDoc} */ - @Override public double sum() { - return getX(storage().index()); - } - - /** {@inheritDoc} */ - @Override public int nonZeroElements() { - return isZero(getX(storage().index())) ? 0 : 1; - } - - /** {@inheritDoc} */ - @Override public Vector copy() { - SingleElementVectorDelegateStorage sto = storage(); - - return new SingleElementVectorView(sto.delegate(), sto.index()); - } - - /** {@inheritDoc} */ - @Override public Vector times(double x) { - if (x == 0.0) - return copy().map(Functions.mult(x)); - else - return super.times(x); - } - - /** {@inheritDoc} */ - @Override public Vector like(int crd) { - throw new UnsupportedOperationException(); - } - - /** {@inheritDoc} */ - @Override public Matrix likeMatrix(int rows, int cols) { - throw new UnsupportedOperationException(); - } -} http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SparseLocalOffHeapVector.java ---------------------------------------------------------------------- diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SparseLocalOffHeapVector.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SparseLocalOffHeapVector.java deleted file mode 100644 index 2fd1c57..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SparseLocalOffHeapVector.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.math.impls.vector; - -import org.apache.ignite.math.Matrix; -import org.apache.ignite.math.Vector; -import org.apache.ignite.math.impls.storage.vector.SparseLocalOffHeapVectorStorage; - -/** - * Implementation for {@link Vector} assuming sparse logic and local offheap JVM storage. - * It is suitable for data sets where local, non-distributed execution is satisfactory and on-heap JVM storage - * is not enough to keep the entire data set. - * <p>See also: <a href="https://en.wikipedia.org/wiki/Sparse_array">Wikipedia article</a>.</p> - */ -public class SparseLocalOffHeapVector extends AbstractVector { - /** - * @param crd Vector cardinality. - */ - public SparseLocalOffHeapVector(int crd) { - setStorage(new SparseLocalOffHeapVectorStorage(crd)); - } - - /** {@inheritDoc} */ - @Override public Vector like(int crd) { - return new SparseLocalOffHeapVector(crd); - } - - /** {@inheritDoc} */ - @Override public Matrix likeMatrix(int rows, int cols) { - return null; - } -} http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SparseLocalVector.java ---------------------------------------------------------------------- diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SparseLocalVector.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SparseLocalVector.java deleted file mode 100644 index ebb6731..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/SparseLocalVector.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.math.impls.vector; - -import org.apache.ignite.math.Matrix; -import org.apache.ignite.math.StorageConstants; -import org.apache.ignite.math.Vector; -import org.apache.ignite.math.impls.matrix.SparseLocalOnHeapMatrix; -import org.apache.ignite.math.impls.storage.vector.SparseLocalOnHeapVectorStorage; - -/** - * Local on-heap sparse vector based on hash map storage. - */ -public class SparseLocalVector extends AbstractVector implements StorageConstants { - /** - * - */ - public SparseLocalVector() { - // No-op. - } - - /** - * @param size - * @param acsMode - */ - public SparseLocalVector(int size, int acsMode) { - assertAccessMode(acsMode); - - setStorage(new SparseLocalOnHeapVectorStorage(size, acsMode)); - } - - /** */ - private SparseLocalOnHeapVectorStorage storage() { - return (SparseLocalOnHeapVectorStorage)getStorage(); - } - - /** {@inheritDoc} */ - @Override public Vector like(int crd) { - SparseLocalOnHeapVectorStorage sto = storage(); - - return new SparseLocalVector(crd, sto.getAccessMode()); - } - - /** {@inheritDoc} */ - @Override public Matrix likeMatrix(int rows, int cols) { - return new SparseLocalOnHeapMatrix(rows, cols); - } - - /** {@inheritDoc} */ - @Override public Vector times(double x) { - if (x == 0.0) - return assign(0); - else - return super.times(x); - } -} http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/VectorView.java ---------------------------------------------------------------------- diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/VectorView.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/VectorView.java deleted file mode 100644 index ce51a45..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/VectorView.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.math.impls.vector; - -import java.io.Externalizable; -import org.apache.ignite.math.Matrix; -import org.apache.ignite.math.Vector; -import org.apache.ignite.math.VectorStorage; -import org.apache.ignite.math.exceptions.UnsupportedOperationException; -import org.apache.ignite.math.impls.storage.vector.DelegateVectorStorage; - -/** - * Implements the partial view into the parent {@link Vector}. - */ -public class VectorView extends AbstractVector { - /** - * Constructor for {@link Externalizable} interface. - */ - public VectorView() { - // No-op. - } - - /** - * @param parent Backing parent {@link Vector}. - * @param off Offset to parent vector. - * @param len Size of the view. - */ - public VectorView(Vector parent, int off, int len) { - super(new DelegateVectorStorage(parent.getStorage(), off, len)); - } - - /** - * @param sto Backing parent {@link VectorStorage}. - * @param off Offset to parent vector. - * @param len Size of the view. - */ - public VectorView(VectorStorage sto, int off, int len) { - super(new DelegateVectorStorage(sto, off, len)); - } - - /** */ - private DelegateVectorStorage storage() { - return (DelegateVectorStorage)getStorage(); - } - - /** {@inheritDoc} */ - @Override public Vector copy() { - DelegateVectorStorage sto = storage(); - - return new VectorView(sto.delegate(), sto.offset(), sto.length()); - } - - /** {@inheritDoc} */ - @Override public Vector like(int crd) { - throw new UnsupportedOperationException(); - } - - /** {@inheritDoc} */ - @Override public Matrix likeMatrix(int rows, int cols) { - throw new UnsupportedOperationException(); - } - - /** {@inheritDoc} */ - @Override public boolean equals(Object o) { - return this == o || - ((o != null) - && o.getClass() == getClass() - && (getStorage().equals(((VectorView)o).getStorage()))); - } -} http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/package-info.java ---------------------------------------------------------------------- diff --git a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/package-info.java b/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/package-info.java deleted file mode 100644 index d6ca1f3..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/math/impls/vector/package-info.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * <!-- Package description. --> - * Contains specific implementations for vectors. - */ -package org.apache.ignite.math.impls.vector; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/modules/ml/src/main/java/org/apache/ignite/math/package-info.java ---------------------------------------------------------------------- diff --git a/modules/ml/src/main/java/org/apache/ignite/math/package-info.java b/modules/ml/src/main/java/org/apache/ignite/math/package-info.java deleted file mode 100644 index 05ce651..0000000 --- a/modules/ml/src/main/java/org/apache/ignite/math/package-info.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * <!-- Package description. --> - * Contains main APIs for distributed code algebra. - */ -package org.apache.ignite.math; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/modules/ml/src/main/java/org/apache/ignite/ml/math/Algebra.java ---------------------------------------------------------------------- diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/Algebra.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/Algebra.java new file mode 100644 index 0000000..a31503f --- /dev/null +++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/Algebra.java @@ -0,0 +1,571 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* +Copyright 1999 CERN - European Organization for Nuclear Research. +Permission to use, copy, modify, distribute and sell this software and its documentation for any purpose +is hereby granted without fee, provided that the above copyright notice appear in all copies and +that both that copyright notice and this permission notice appear in supporting documentation. +CERN makes no representations about the suitability of this software for any purpose. +It is provided "as is" without expressed or implied warranty. +*/ + +package org.apache.ignite.ml.math; + +/** + * Miscellaneous arithmetic and algebra functions. + * Lifted from Apache Mahout. + */ +public class Algebra extends Constants { + /** */ private static final double[] STIRLING_CORRECTION = { + 0.0, + 8.106146679532726e-02, 4.134069595540929e-02, + 2.767792568499834e-02, 2.079067210376509e-02, + 1.664469118982119e-02, 1.387612882307075e-02, + 1.189670994589177e-02, 1.041126526197209e-02, + 9.255462182712733e-03, 8.330563433362871e-03, + 7.573675487951841e-03, 6.942840107209530e-03, + 6.408994188004207e-03, 5.951370112758848e-03, + 5.554733551962801e-03, 5.207655919609640e-03, + 4.901395948434738e-03, 4.629153749334029e-03, + 4.385560249232324e-03, 4.166319691996922e-03, + 3.967954218640860e-03, 3.787618068444430e-03, + 3.622960224683090e-03, 3.472021382978770e-03, + 3.333155636728090e-03, 3.204970228055040e-03, + 3.086278682608780e-03, 2.976063983550410e-03, + 2.873449362352470e-03, 2.777674929752690e-03, + }; + + /** */ private static final double[] LOG_FACTORIALS = { + 0.00000000000000000, 0.00000000000000000, 0.69314718055994531, + 1.79175946922805500, 3.17805383034794562, 4.78749174278204599, + 6.57925121201010100, 8.52516136106541430, 10.60460290274525023, + 12.80182748008146961, 15.10441257307551530, 17.50230784587388584, + 19.98721449566188615, 22.55216385312342289, 25.19122118273868150, + 27.89927138384089157, 30.67186010608067280, 33.50507345013688888, + 36.39544520803305358, 39.33988418719949404, 42.33561646075348503, + 45.38013889847690803, 48.47118135183522388, 51.60667556776437357, + 54.78472939811231919, 58.00360522298051994, 61.26170176100200198, + 64.55753862700633106, 67.88974313718153498, 71.25703896716800901 + }; + + /** */ private static final long[] LONG_FACTORIALS = { + 1L, + 1L, + 2L, + 6L, + 24L, + 120L, + 720L, + 5040L, + 40320L, + 362880L, + 3628800L, + 39916800L, + 479001600L, + 6227020800L, + 87178291200L, + 1307674368000L, + 20922789888000L, + 355687428096000L, + 6402373705728000L, + 121645100408832000L, + 2432902008176640000L + }; + + /** */ private static final double[] DOUBLE_FACTORIALS = { + 5.109094217170944E19, + 1.1240007277776077E21, + 2.585201673888498E22, + 6.204484017332394E23, + 1.5511210043330984E25, + 4.032914611266057E26, + 1.0888869450418352E28, + 3.048883446117138E29, + 8.841761993739701E30, + 2.652528598121911E32, + 8.222838654177924E33, + 2.6313083693369355E35, + 8.68331761881189E36, + 2.952327990396041E38, + 1.0333147966386144E40, + 3.719933267899013E41, + 1.3763753091226346E43, + 5.23022617466601E44, + 2.0397882081197447E46, + 8.15915283247898E47, + 3.34525266131638E49, + 1.4050061177528801E51, + 6.041526306337384E52, + 2.6582715747884495E54, + 1.196222208654802E56, + 5.502622159812089E57, + 2.5862324151116827E59, + 1.2413915592536068E61, + 6.082818640342679E62, + 3.0414093201713376E64, + 1.5511187532873816E66, + 8.06581751709439E67, + 4.274883284060024E69, + 2.308436973392413E71, + 1.2696403353658264E73, + 7.109985878048632E74, + 4.052691950487723E76, + 2.350561331282879E78, + 1.386831185456898E80, + 8.32098711274139E81, + 5.075802138772246E83, + 3.146997326038794E85, + 1.9826083154044396E87, + 1.2688693218588414E89, + 8.247650592082472E90, + 5.443449390774432E92, + 3.6471110918188705E94, + 2.48003554243683E96, + 1.7112245242814127E98, + 1.1978571669969892E100, + 8.504785885678624E101, + 6.123445837688612E103, + 4.470115461512686E105, + 3.307885441519387E107, + 2.4809140811395404E109, + 1.8854947016660506E111, + 1.451830920282859E113, + 1.1324281178206295E115, + 8.94618213078298E116, + 7.15694570462638E118, + 5.797126020747369E120, + 4.7536433370128435E122, + 3.94552396972066E124, + 3.314240134565354E126, + 2.8171041143805494E128, + 2.4227095383672744E130, + 2.107757298379527E132, + 1.854826422573984E134, + 1.6507955160908465E136, + 1.4857159644817605E138, + 1.3520015276784033E140, + 1.2438414054641305E142, + 1.156772507081641E144, + 1.0873661566567426E146, + 1.0329978488239061E148, + 9.916779348709491E149, + 9.619275968248216E151, + 9.426890448883248E153, + 9.332621544394415E155, + 9.332621544394418E157, + 9.42594775983836E159, + 9.614466715035125E161, + 9.902900716486178E163, + 1.0299016745145631E166, + 1.0813967582402912E168, + 1.1462805637347086E170, + 1.2265202031961373E172, + 1.324641819451829E174, + 1.4438595832024942E176, + 1.5882455415227423E178, + 1.7629525510902457E180, + 1.974506857221075E182, + 2.2311927486598138E184, + 2.543559733472186E186, + 2.925093693493014E188, + 3.393108684451899E190, + 3.96993716080872E192, + 4.6845258497542896E194, + 5.574585761207606E196, + 6.689502913449135E198, + 8.094298525273444E200, + 9.875044200833601E202, + 1.2146304367025332E205, + 1.506141741511141E207, + 1.882677176888926E209, + 2.3721732428800483E211, + 3.0126600184576624E213, + 3.856204823625808E215, + 4.974504222477287E217, + 6.466855489220473E219, + 8.471580690878813E221, + 1.1182486511960037E224, + 1.4872707060906847E226, + 1.99294274616152E228, + 2.690472707318049E230, + 3.6590428819525483E232, + 5.0128887482749884E234, + 6.917786472619482E236, + 9.615723196941089E238, + 1.3462012475717523E241, + 1.8981437590761713E243, + 2.6953641378881633E245, + 3.8543707171800694E247, + 5.550293832739308E249, + 8.047926057471989E251, + 1.1749972043909107E254, + 1.72724589045464E256, + 2.5563239178728637E258, + 3.8089226376305687E260, + 5.7133839564458575E262, + 8.627209774233244E264, + 1.3113358856834527E267, + 2.0063439050956838E269, + 3.0897696138473515E271, + 4.789142901463393E273, + 7.471062926282892E275, + 1.1729568794264134E278, + 1.8532718694937346E280, + 2.946702272495036E282, + 4.714723635992061E284, + 7.590705053947223E286, + 1.2296942187394494E289, + 2.0044015765453032E291, + 3.287218585534299E293, + 5.423910666131583E295, + 9.003691705778434E297, + 1.5036165148649983E300, + 2.5260757449731988E302, + 4.2690680090047056E304, + 7.257415615308004E306 + }; + + /** + * Efficiently returns the binomial coefficient, often also referred to as + * "n over k" or "n choose k". The binomial coefficient is defined as + * {@code (n * n-1 * ... * n-k+1 ) / ( 1 * 2 * ... * k )}. + * <ul> <li>{@code k<0}: {@code 0}.</li> + * <li>{@code k==0}: {@code 1}.</li> + * <li>{@code k==1}: {@code n}.</li> + * <li>else: {@code (n * n-1 * ... * n-k+1 ) / ( 1 * 2 * ... * k)}.</li> + * </ul> + * + * @param n + * @param k + * @return Binomial coefficient. + */ + public static double binomial(double n, long k) { + if (k < 0) + return 0; + + if (k == 0) + return 1; + + if (k == 1) + return n; + + // binomial(n,k) = (n * n-1 * ... * n-k+1 ) / ( 1 * 2 * ... * k ) + double a = n - k + 1; + double b = 1; + double binomial = 1; + + for (long i = k; i-- > 0; ) + binomial *= (a++) / (b++); + + return binomial; + } + + /** + * Efficiently returns the binomial coefficient, often also referred to as "n over k" or "n choose k". + * The binomial coefficient is defined as + * <ul> <li>{@code k<0}: {@code 0}. <li>{@code k==0 || k==n}: {@code 1}. <li>{@code k==1 || k==n-1}: + * {@code n}. <li>else: {@code (n * n-1 * ... * n-k+1 ) / ( 1 * 2 * ... * k )}. </ul> + * + * @param n + * @param k + * @return Binomial coefficient. + */ + public static double binomial(long n, long k) { + if (k < 0) + return 0; + + if (k == 0 || k == n) + return 1; + + if (k == 1 || k == n - 1) + return n; + + if (n > k) { + int max = LONG_FACTORIALS.length + DOUBLE_FACTORIALS.length; + + if (n < max) { + double nFac = factorial((int)n); + double kFac = factorial((int)k); + double nMinusKFac = factorial((int)(n - k)); + double nk = nMinusKFac * kFac; + + if (nk != Double.POSITIVE_INFINITY) // No numeric overflow? + return nFac / nk; + } + + if (k > n / 2) + k = n - k; + } + + // binomial(n,k) = (n * n-1 * ... * n-k+1 ) / ( 1 * 2 * ... * k ) + long a = n - k + 1; + long b = 1; + double binomial = 1; + + for (long i = k; i-- > 0; ) + binomial *= (double)a++ / (b++); + + return binomial; + } + + /** + * Returns the smallest <code>long >= value</code>. + * <dl><dt>Examples: {@code 1.0 -> 1, 1.2 -> 2, 1.9 -> 2}. This + * method is safer than using (long) Math.ceil(value), because of possible rounding error.</dt></dl> + * + * @param val + */ + public static long ceil(double val) { + return Math.round(Math.ceil(val)); + } + + /** + * Evaluates the series of Chebyshev polynomials Ti at argument x/2. The series is given by + * <pre> + * N-1 + * - ' + * y = > coef[i] T (x/2) + * - i + * i=0 + * </pre> + * Coefficients are stored in reverse order, i.e. the zero order term is last in the array. Note N is the number of + * coefficients, not the order. <p> If coefficients are for the interval a to b, x must have been transformed to x + * -< 2(2x - b - a)/(b-a) before entering the routine. This maps x from (a, b) to (-1, 1), over which the + * Chebyshev polynomials are defined. <p> If the coefficients are for the inverted interval, in which (a, b) is + * mapped to (1/b, 1/a), the transformation required is {@code x -> 2(2ab/x - b - a)/(b-a)}. If b is infinity, this + * becomes {@code x -> 4a/x - 1}. <p> SPEED: <p> Taking advantage of the recurrence properties of the Chebyshev + * polynomials, the routine requires one more addition per loop than evaluating a nested polynomial of the same + * degree. + * + * @param x Argument to the polynomial. + * @param coef Coefficients of the polynomial. + * @param N Number of coefficients. + */ + public static double chbevl(double x, double[] coef, int N) { + int p = 0; + + double b0 = coef[p++]; + double b1 = 0.0; + int i = N - 1; + + double b2; + + do { + b2 = b1; + b1 = b0; + b0 = x * b1 - b2 + coef[p++]; + } + while (--i > 0); + + return 0.5 * (b0 - b2); + } + + /** + * Instantly returns the factorial {@code k!}. + * + * @param k must hold {@code k >= 0}. + */ + private static double factorial(int k) { + if (k < 0) + throw new IllegalArgumentException(); + + int len1 = LONG_FACTORIALS.length; + + if (k < len1) + return LONG_FACTORIALS[k]; + + int len2 = DOUBLE_FACTORIALS.length; + + return (k < len1 + len2) ? DOUBLE_FACTORIALS[k - len1] : Double.POSITIVE_INFINITY; + } + + /** + * Returns the largest <code>long <= value</code>. + * <dl><dt>Examples: {@code 1.0 -> 1, 1.2 -> 1, 1.9 -> 1 <dt> 2.0 -> 2, 2.2 -> 2, 2.9 -> 2}</dt></dl> + * This method is safer than using (long) Math.floor(value), because of possible rounding error. + */ + public static long floor(double val) { + return Math.round(Math.floor(val)); + } + + /** + * Returns {@code log<sub>base</sub>value}. + */ + public static double log(double base, double val) { + return Math.log(val) / Math.log(base); + } + + /** + * Returns {@code log<sub>10</sub>value}. + */ + public static double log10(double val) { + // 1.0 / Math.log(10) == 0.43429448190325176 + return Math.log(val) * 0.43429448190325176; + } + + /** + * Returns {@code log<sub>2</sub>value}. + */ + public static double log2(double val) { + // 1.0 / Math.log(2) == 1.4426950408889634 + return Math.log(val) * 1.4426950408889634; + } + + /** + * Returns {@code log(k!)}. Tries to avoid overflows. For {@code k<30} simply looks up a table in O(1). + * For {@code k>=30} uses stirlings approximation. + * + * @param k must hold {@code k >= 0}. + */ + public static double logFactorial(int k) { + if (k >= 30) { + double r = 1.0 / k; + double rr = r * r; + double C7 = -5.95238095238095238e-04; + double C5 = 7.93650793650793651e-04; + double C3 = -2.77777777777777778e-03; + double C1 = 8.33333333333333333e-02; + double C0 = 9.18938533204672742e-01; + + return (k + 0.5) * Math.log(k) - k + C0 + r * (C1 + rr * (C3 + rr * (C5 + rr * C7))); + } + else + return LOG_FACTORIALS[k]; + } + + /** + * Instantly returns the factorial {@code k!}. + * + * @param k must hold {@code k >= 0 && k < 21} + */ + public static long longFactorial(int k) { + if (k < 0) + throw new IllegalArgumentException("Negative k"); + + if (k < LONG_FACTORIALS.length) + return LONG_FACTORIALS[k]; + + throw new IllegalArgumentException("Overflow"); + } + + /** + * Returns the StirlingCorrection. + * + * Correction term of the Stirling approximation for {@code log(k!)} (series in + * 1/k, or table values for small k) with int parameter k. </p> {@code log k! = (k + 1/2)log(k + 1) - (k + 1) + + * (1/2)log(2Pi) + STIRLING_CORRECTION(k + 1) log k! = (k + 1/2)log(k) - k + (1/2)log(2Pi) + + * STIRLING_CORRECTION(k) } + */ + public static double stirlingCorrection(int k) { + if (k > 30) { + double r = 1.0 / k; + double rr = r * r; + double C7 = -5.95238095238095238e-04; + double C5 = 7.93650793650793651e-04; + double C3 = -2.77777777777777778e-03; + double C1 = 8.33333333333333333e-02; + + return r * (C1 + rr * (C3 + rr * (C5 + rr * C7))); + } + else + return STIRLING_CORRECTION[k]; + } + + /** + * Evaluates the given polynomial of degree {@code N} at {@code x}, assuming coefficient of N is 1.0. Otherwise same + * as {@link #evalPoly(double, double[], int)}. + * <pre> + * 2 N + * y = C + C x + C x +...+ C x + * 0 1 2 N + * + * where C = 1 and hence is omitted from the array. + * N + * + * Coefficients are stored in reverse order: + * + * coef[0] = C , ..., coef[N-1] = C . + * N-1 0 + * + * Calling arguments are otherwise the same as {@link #evalPoly(double, double[], int)}. + * </pre> + * In the interest of speed, there are no checks for out of bounds arithmetic. + * + * @param x Argument to the polynomial. + * @param coef Coefficients of the polynomial. + * @param n Degree of the polynomial. + */ + public static double evalPoly1(double x, double[] coef, int n) { + double res = x + coef[0]; + + for (int i = 1; i < n; i++) + res = res * x + coef[i]; + + return res; + } + + /** + * Evaluates the given polynomial of degree {@code N} at {@code x}. + * <pre> + * 2 N + * y = C + C x + C x +...+ C x + * 0 1 2 N + * + * Coefficients are stored in reverse order: + * + * coef[0] = C , ..., coef[N] = C . + * N 0 + * </pre> + * In the interest of speed, there are no checks for out of bounds arithmetic. + * + * @param x Argument to the polynomial. + * @param coef Coefficients of the polynomial. + * @param n Degree of the polynomial. + */ + public static double evalPoly(double x, double[] coef, int n) { + double res = coef[0]; + + for (int i = 1; i <= n; i++) + res = res * x + coef[i]; + + return res; + } + + /** + * Gets <code>sqrt(a^2 + b^2)</code> without under/overflow. + * + * @param a + * @param b + */ + public static double hypot(double a, double b) { + double r; + + if (Math.abs(a) > Math.abs(b)) { + r = b / a; + r = Math.abs(a) * Math.sqrt(1 + r * r); + } + else if (b != 0) { + r = a / b; + r = Math.abs(b) * Math.sqrt(1 + r * r); + } + else + r = 0.0; + + return r; + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/modules/ml/src/main/java/org/apache/ignite/ml/math/Constants.java ---------------------------------------------------------------------- diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/Constants.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/Constants.java new file mode 100644 index 0000000..e20c139 --- /dev/null +++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/Constants.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* +Copyright 1999 CERN - European Organization for Nuclear Research. +Permission to use, copy, modify, distribute and sell this software and its documentation for any purpose +is hereby granted without fee, provided that the above copyright notice appear in all copies and +that both that copyright notice and this permission notice appear in supporting documentation. +CERN makes no representations about the suitability of this software for any purpose. +It is provided "as is" without expressed or implied warranty. +*/ + +package org.apache.ignite.ml.math; + +/** + * Math constants. Lifted from Apache Mahout. + */ +public class Constants { + /** */ public static final double MACHEP = 1.11022302462515654042E-16; + /** */ public static final double MAXLOG = 7.09782712893383996732E2; + /** */ public static final double MINLOG = -7.451332191019412076235E2; + /** */ public static final double MAXGAM = 171.624376956302725; + /** */ public static final double SQTPI = 2.50662827463100050242E0; + /** */ public static final double SQRTH = 7.07106781186547524401E-1; + /** */ public static final double LOGPI = 1.14472988584940017414; + /** */ public static final double BIG = 4.503599627370496e15; + /** */ public static final double BIGINV = 2.22044604925031308085e-16; +} http://git-wip-us.apache.org/repos/asf/ignite/blob/d78e071a/modules/ml/src/main/java/org/apache/ignite/ml/math/Destroyable.java ---------------------------------------------------------------------- diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/Destroyable.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/Destroyable.java new file mode 100644 index 0000000..8e7ce95 --- /dev/null +++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/Destroyable.java @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.ml.math; + +/** + * Support for destroying objects that are managed outside of JVM. + */ +public interface Destroyable { + /** + * Destroys object if managed outside of JVM. It's a no-op in all other cases. + */ + public default void destroy() { + // No-op. + } +}