You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ch...@apache.org on 2018/12/25 15:42:24 UTC
[2/2] ignite git commit: IGNITE-10543: [ML] Test/train sample
generator
IGNITE-10543: [ML] Test/train sample generator
This closes #5727
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/d0facb26
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/d0facb26
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/d0facb26
Branch: refs/heads/master
Commit: d0facb260773c3527237e038ce7c48121bb3f0f3
Parents: 581fdca
Author: Alexey Platonov <ap...@gmail.com>
Authored: Tue Dec 25 18:42:19 2018 +0300
Committer: Yury Babak <yb...@gridgain.com>
Committed: Tue Dec 25 18:42:19 2018 +0300
----------------------------------------------------------------------
.../ml/util/generators/DataStreamGenerator.java | 134 +++++++++++
.../util/generators/DatasetBuilderAdapter.java | 69 ++++++
.../ignite/ml/util/generators/package-info.java | 25 +++
.../generators/primitives/package-info.java | 22 ++
.../scalar/DiscreteRandomProducer.java | 204 +++++++++++++++++
.../primitives/scalar/GaussRandomProducer.java | 77 +++++++
.../primitives/scalar/RandomProducer.java | 78 +++++++
.../scalar/RandomProducerWithGenerator.java | 51 +++++
.../scalar/UniformRandomProducer.java | 66 ++++++
.../primitives/scalar/package-info.java | 22 ++
.../vector/ParametricVectorGenerator.java | 62 +++++
.../primitives/vector/VectorGenerator.java | 224 +++++++++++++++++++
.../vector/VectorGeneratorPrimitives.java | 154 +++++++++++++
.../vector/VectorGeneratorsFamily.java | 189 ++++++++++++++++
.../primitives/vector/package-info.java | 22 ++
.../standard/GaussianMixtureDataStream.java | 99 ++++++++
.../standard/RegressionDataStream.java | 119 ++++++++++
.../generators/standard/RingsDataStream.java | 91 ++++++++
.../standard/TwoSeparableClassesDataStream.java | 95 ++++++++
.../util/generators/standard/package-info.java | 22 ++
.../generators/DataStreamGeneratorTest.java | 210 +++++++++++++++++
.../scalar/DiscreteRandomProducerTest.java | 102 +++++++++
.../scalar/GaussRandomProducerTest.java | 66 ++++++
.../primitives/scalar/RandomProducerTest.java | 79 +++++++
.../scalar/UniformRandomProducerTest.java | 68 ++++++
.../vector/ParametricVectorGeneratorTest.java | 50 +++++
.../vector/VectorGeneratorPrimitivesTest.java | 110 +++++++++
.../primitives/vector/VectorGeneratorTest.java | 194 ++++++++++++++++
.../vector/VectorGeneratorsFamilyTest.java | 118 ++++++++++
29 files changed, 2822 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/d0facb26/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/DataStreamGenerator.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/DataStreamGenerator.java b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/DataStreamGenerator.java
new file mode 100644
index 0000000..c2fd652
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/DataStreamGenerator.java
@@ -0,0 +1,134 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.ml.util.generators;
+
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import org.apache.ignite.lang.IgniteBiPredicate;
+import org.apache.ignite.ml.dataset.DatasetBuilder;
+import org.apache.ignite.ml.dataset.UpstreamTransformerBuilder;
+import org.apache.ignite.ml.math.functions.IgniteFunction;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
+import org.apache.ignite.ml.structures.DatasetRow;
+import org.apache.ignite.ml.structures.LabeledVector;
+import org.apache.ignite.ml.util.generators.primitives.scalar.RandomProducer;
+
+/**
+ * Provides general interface for generation of pseudorandom vectors according to shape defined
+ * by logic of specific data stream generator.
+ */
+public interface DataStreamGenerator {
+ /**
+ * @return Stream of {@link LabeledVector} in according to dataset shape.
+ */
+ public Stream<LabeledVector<Vector, Double>> labeled();
+
+ /**
+ * @return Stream of unlabeled {@link Vector} in according to dataset shape.
+ */
+ public default Stream<Vector> unlabeled() {
+ return labeled().map(DatasetRow::features);
+ }
+
+ /**
+ * @param classifier User defined classifier for vectors stream.
+ * @return Stream of {@link LabeledVector} in according to dataset shape and user's classifier.
+ */
+ public default Stream<LabeledVector<Vector, Double>> labeled(IgniteFunction<Vector, Double> classifier) {
+ return labeled().map(DatasetRow::features).map(v -> new LabeledVector<>(v, classifier.apply(v)));
+ }
+
+ /**
+ * Apply user defined mapper to vectors stream without labels hiding.
+ *
+ * @param f Mapper of vectors of data stream.
+ * @return Stream of mapped vectors.
+ */
+ public default DataStreamGenerator mapVectors(IgniteFunction<Vector, Vector> f) {
+ return new DataStreamGenerator() {
+ @Override public Stream<LabeledVector<Vector, Double>> labeled() {
+ return DataStreamGenerator.this.labeled()
+ .map(v -> new LabeledVector<>(f.apply(v.features()), v.label()));
+ }
+ };
+ }
+
+ /**
+ * Apply pseudorandom noize to vectors without labels mapping. Such method can be useful in cases
+ * when vectors with different labels should be mixed between them on class bounds.
+ *
+ * @param rnd Generator of pseudorandom scalars modifying vector components with label saving.
+ * @return Stream of blurred vectors with same labels.
+ */
+ public default DataStreamGenerator blur(RandomProducer rnd) {
+ return mapVectors(rnd::noizify);
+ }
+
+ /**
+ * Convert first N values from stream to map.
+ *
+ * @param datasetSize Dataset size.
+ * @return Map of vectors and labels.
+ */
+ public default Map<Vector, Double> asMap(int datasetSize) {
+ return labeled().limit(datasetSize)
+ .collect(Collectors.toMap(DatasetRow::features, LabeledVector::label));
+ }
+
+ /**
+ * Convert first N values from stream to {@link DatasetBuilder}.
+ *
+ * @param datasetSize Dataset size.
+ * @param partitions Partitions count.
+ * @return Dataset builder.
+ */
+ public default DatasetBuilder<Vector, Double> asDatasetBuilder(int datasetSize, int partitions) {
+ return new DatasetBuilderAdapter(this, datasetSize, partitions);
+ }
+
+ /**
+ * Convert first N values from stream to {@link DatasetBuilder}.
+ *
+ * @param datasetSize Dataset size.
+ * @param filter Data filter.
+ * @param partitions Partitions count.
+ * @return Dataset builder.
+ */
+ public default DatasetBuilder<Vector, Double> asDatasetBuilder(int datasetSize, IgniteBiPredicate<Vector, Double> filter,
+ int partitions) {
+
+ return new DatasetBuilderAdapter(this, datasetSize, filter, partitions);
+ }
+
+ /**
+ * Convert first N values from stream to {@link DatasetBuilder}.
+ *
+ * @param datasetSize Dataset size.
+ * @param filter Data filter.
+ * @param partitions Partitions count.
+ * @param upstreamTransformerBuilder Upstream transformer builder.
+ * @return Dataset builder.
+ */
+ public default DatasetBuilder<Vector, Double> asDatasetBuilder(int datasetSize, IgniteBiPredicate<Vector, Double> filter,
+ int partitions, UpstreamTransformerBuilder<Vector, Double> upstreamTransformerBuilder) {
+
+ return new DatasetBuilderAdapter(this, datasetSize, filter, partitions, upstreamTransformerBuilder);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/d0facb26/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/DatasetBuilderAdapter.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/DatasetBuilderAdapter.java b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/DatasetBuilderAdapter.java
new file mode 100644
index 0000000..189e053
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/DatasetBuilderAdapter.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.ml.util.generators;
+
+import org.apache.ignite.lang.IgniteBiPredicate;
+import org.apache.ignite.ml.dataset.UpstreamTransformerBuilder;
+import org.apache.ignite.ml.dataset.impl.local.LocalDatasetBuilder;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
+
+/**
+ * DataStreamGenerator to DatasetBuilder adapter.
+ */
+class DatasetBuilderAdapter extends LocalDatasetBuilder<Vector, Double> {
+ /**
+ * Constructs an instance of DatasetBuilderAdapter.
+ *
+ * @param generator Generator.
+ * @param datasetSize Dataset size.
+ * @param partitions Partitions.
+ */
+ public DatasetBuilderAdapter(DataStreamGenerator generator, int datasetSize, int partitions) {
+ super(generator.asMap(datasetSize), partitions);
+ }
+
+ /**
+ * Constructs an instance of DatasetBuilderAdapter.
+ *
+ * @param generator Generator.
+ * @param datasetSize Dataset size.
+ * @param filter Filter.
+ * @param partitions Partitions.
+ * @param upstreamTransformerBuilder Upstream transformer builder.
+ */
+ public DatasetBuilderAdapter(DataStreamGenerator generator, int datasetSize,
+ IgniteBiPredicate<Vector, Double> filter, int partitions,
+ UpstreamTransformerBuilder<Vector, Double> upstreamTransformerBuilder) {
+
+ super(generator.asMap(datasetSize), filter, partitions, upstreamTransformerBuilder);
+ }
+
+ /**
+ * Constructs an instance of DatasetBuilderAdapter.
+ *
+ * @param generator Generator.
+ * @param datasetSize Dataset size.
+ * @param filter Filter.
+ * @param partitions Partitions.
+ */
+ public DatasetBuilderAdapter(DataStreamGenerator generator, int datasetSize,
+ IgniteBiPredicate<Vector, Double> filter, int partitions) {
+
+ super(generator.asMap(datasetSize), filter, partitions);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/d0facb26/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/package-info.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/package-info.java b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/package-info.java
new file mode 100644
index 0000000..6ebcc09
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/package-info.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * <!-- Package description. -->
+ * Contains utility classes for data streams generation. Entry point for all data streams is a
+ * {@link org.apache.ignite.ml.util.generators.DataStreamGenerator} class providing streams of
+ * labeled and unlabeled vectors. There are predefined generators like
+ * {@link org.apache.ignite.ml.util.generators.standard.RingsDataStream}.
+ */
+package org.apache.ignite.ml.util.generators;
http://git-wip-us.apache.org/repos/asf/ignite/blob/d0facb26/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/package-info.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/package-info.java b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/package-info.java
new file mode 100644
index 0000000..57c79c0
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * <!-- Package description. -->
+ * Contains primitives like random scalars and random vector generators for composing own data stream generator.
+ */
+package org.apache.ignite.ml.util.generators.primitives;
http://git-wip-us.apache.org/repos/asf/ignite/blob/d0facb26/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/scalar/DiscreteRandomProducer.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/scalar/DiscreteRandomProducer.java b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/scalar/DiscreteRandomProducer.java
new file mode 100644
index 0000000..ef80db7
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/scalar/DiscreteRandomProducer.java
@@ -0,0 +1,204 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.ml.util.generators.primitives.scalar;
+
+import java.util.Arrays;
+import java.util.Random;
+import java.util.stream.IntStream;
+import org.apache.ignite.internal.util.typedef.internal.A;
+
+/**
+ * Pseudorandom producer generating values from user provided discrete distribution.
+ */
+public class DiscreteRandomProducer extends RandomProducerWithGenerator {
+ /** */
+ private static final double EPS = 1e-5;
+
+ /** Probabilities. */
+ private final double[] probs;
+
+ /** Random variable values. */
+ private final int[] ids;
+
+ /**
+ * Creates an instance of DiscreteRandomProducer.
+ *
+ * @param probs Discrete distribution probabilities.
+ */
+ public DiscreteRandomProducer(double... probs) {
+ this(System.currentTimeMillis(), probs);
+ }
+
+ /**
+ * Creates an instance of DiscreteRandomProducer.
+ *
+ * @param seed Seed.
+ * @param probs Discrete distribution probabilities.
+ */
+ public DiscreteRandomProducer(long seed, double... probs) {
+ super(seed);
+
+ boolean allElementsAreGEZero = Arrays.stream(probs).allMatch(p -> p >= 0.0);
+ boolean sumOfProbsEqOne = Math.abs(Arrays.stream(probs).sum() - 1.0) < EPS;
+ A.ensure(allElementsAreGEZero, "all elements should be great or equals 0.0");
+ A.ensure(sumOfProbsEqOne, "sum of probs should equal 1.0");
+
+ this.probs = Arrays.copyOf(probs, probs.length);
+ this.ids = IntStream.range(0, probs.length).toArray();
+ sort(this.probs, ids, 0, probs.length - 1);
+
+ int i = 0;
+ int j = probs.length - 1;
+ while (i < j) {
+ double temp = this.probs[i];
+ this.probs[i] = this.probs[j];
+ this.probs[j] = temp;
+
+ int idxTmp = this.ids[i];
+ this.ids[i] = this.ids[j];
+ this.ids[j] = idxTmp;
+
+ i++;
+ j--;
+ }
+
+ for (i = 1; i < this.probs.length; i++)
+ this.probs[i] += this.probs[i - 1];
+ }
+
+ /**
+ * Creates a producer of random values from uniform discrete distribution.
+ *
+ * @param numOfValues Number of distinct values.
+ * @return Producer.
+ */
+ public static DiscreteRandomProducer uniform(int numOfValues) {
+ return uniform(numOfValues, System.currentTimeMillis());
+ }
+
+ /**
+ * Creates a producer of random values from uniform discrete distribution.
+ *
+ * @param numOfValues Number of distinct values.
+ * @param seed Seed.
+ * @return Producer.
+ */
+ public static DiscreteRandomProducer uniform(int numOfValues, long seed) {
+ double[] probs = new double[numOfValues];
+ Arrays.fill(probs, 1.0 / numOfValues);
+ return new DiscreteRandomProducer(seed, probs);
+ }
+
+ /**
+ * Generates pseudorandom discrete distribution.
+ *
+ * @param numOfValues Number of distinct values of pseudorandom variable.
+ * @return Probabilities array.
+ */
+ public static double[] randomDistribution(int numOfValues) {
+ return randomDistribution(numOfValues, System.currentTimeMillis());
+ }
+
+ /**
+ * Generates pseudorandom discrete distribution.
+ *
+ * @param numOfValues Number of distinct values of pseudorandom variable.
+ * @param seed Seed.
+ * @return Probabilities array.
+ */
+ public static double[] randomDistribution(int numOfValues, long seed) {
+ A.ensure(numOfValues > 0, "numberOfValues > 0");
+
+ Random random = new Random(seed);
+ long[] rnd = IntStream.range(0, numOfValues)
+ .mapToLong(i -> random.nextInt(Integer.MAX_VALUE))
+ .limit(numOfValues)
+ .toArray();
+ long sum = Arrays.stream(rnd).sum();
+
+ double[] res = new double[numOfValues];
+ for (int i = 0; i < res.length; i++)
+ res[i] = rnd[i] / Math.max(1.0, sum);
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Double get() {
+ double p = generator().nextDouble();
+ for (int i = 0; i < probs.length; i++) {
+ if (probs[i] > p)
+ return (double)ids[i];
+ }
+
+ return (double)ids[probs.length - 1];
+ }
+
+ /**
+ * @return Value of preudorandom discrete variable.
+ */
+ public int getInt() {
+ return get().intValue();
+ }
+
+ /**
+ * @return Count of distinct values of distribution.
+ */
+ public int size() {
+ return probs.length;
+ }
+
+ /**
+ * Sort of probabilities values and corresponded indicies.
+ *
+ * @param probs Probabilities.
+ * @param idx Random variable values.
+ * @param from From.
+ * @param to To.
+ */
+ private void sort(double[] probs, int[] idx, int from, int to) {
+ if (from < to) {
+ double pivot = probs[(from + to) / 2];
+
+ int i = from, j = to;
+
+ while (i <= j) {
+ while (probs[i] < pivot)
+ i++;
+ while (probs[j] > pivot)
+ j--;
+
+ if (i <= j) {
+ double tmpFeature = probs[i];
+ probs[i] = probs[j];
+ probs[j] = tmpFeature;
+
+ int tmpLb = idx[i];
+ idx[i] = idx[j];
+ idx[j] = tmpLb;
+
+ i++;
+ j--;
+ }
+ }
+
+ sort(probs, idx, from, j);
+ sort(probs, idx, i, to);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/d0facb26/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/scalar/GaussRandomProducer.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/scalar/GaussRandomProducer.java b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/scalar/GaussRandomProducer.java
new file mode 100644
index 0000000..0fcfcdf
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/scalar/GaussRandomProducer.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.ml.util.generators.primitives.scalar;
+
+import org.apache.ignite.internal.util.typedef.internal.A;
+
+/**
+ * Pseudorandom producer generating values from gauss distribution.
+ */
+public class GaussRandomProducer extends RandomProducerWithGenerator {
+ /** Mean. */
+ private final double mean;
+ /** Variance. */
+ private final double variance;
+
+ /**
+ * Creates an instance of GaussRandomProducer with mean = 0 and variance = 1.0.
+ */
+ public GaussRandomProducer() {
+ this(0.0, 1.0, System.currentTimeMillis());
+ }
+
+ /**
+ * Creates an instance of GaussRandomProducer with mean = 0 and variance = 1.0.
+ *
+ * @param seed Seed.
+ */
+ public GaussRandomProducer(long seed) {
+ this(0.0, 1.0, seed);
+ }
+
+ /**
+ * Creates an instance of GaussRandomProducer.
+ *
+ * @param mean Mean.
+ * @param variance Variance.
+ */
+ public GaussRandomProducer(double mean, double variance) {
+ this(mean, variance, System.currentTimeMillis());
+ }
+
+ /**
+ * Creates an instance of GaussRandomProducer.
+ *
+ * @param mean Mean.
+ * @param variance Variance.
+ * @param seed Seed.
+ */
+ public GaussRandomProducer(double mean, double variance, long seed) {
+ super(seed);
+
+ A.ensure(variance > 0, "variance > 0");
+
+ this.mean = mean;
+ this.variance = variance;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Double get() {
+ return mean + generator().nextGaussian() * Math.sqrt(variance);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/d0facb26/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/scalar/RandomProducer.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/scalar/RandomProducer.java b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/scalar/RandomProducer.java
new file mode 100644
index 0000000..35c8e1f
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/scalar/RandomProducer.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.ml.util.generators.primitives.scalar;
+
+import java.util.Arrays;
+import java.util.function.Supplier;
+import java.util.stream.IntStream;
+import org.apache.ignite.internal.util.typedef.internal.A;
+import org.apache.ignite.ml.math.functions.IgniteFunction;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
+import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
+import org.apache.ignite.ml.util.generators.primitives.vector.VectorGenerator;
+
+/**
+ * Represents a generator of preudorandom scalar values.
+ */
+public interface RandomProducer extends Supplier<Double> {
+ /**
+ * Create {@link VectorGenerator} with vectors having feature values generated by random producer.
+ *
+ * @param vectorSize Generated vector size.
+ * @return Vector generator.
+ */
+ public default VectorGenerator vectorize(int vectorSize) {
+ return () -> VectorUtils.of(IntStream.range(0, vectorSize).mapToDouble(x -> get()).toArray());
+ }
+
+ /**
+ * Adds value generated by random producer to function value.
+ *
+ * @param f Function.
+ * @return New function with noize.
+ */
+ public default IgniteFunction<Double, Double> noizify(IgniteFunction<Double, Double> f) {
+ return t -> f.apply(t) + get();
+ }
+
+ /**
+ * Adds values generated by random producer to each vector value.
+ *
+ * @param vector Vector.
+ * @return New vector.
+ */
+ public default Vector noizify(Vector vector) {
+ Vector cp = vector.copy();
+ for (int i = 0; i < vector.size(); i++)
+ cp.set(i, cp.get(i) + get());
+ return cp;
+ }
+
+ /**
+ * Creates {@link VectorGenerator} with vectors having feature values in according to
+ * preudorandom producers.
+ *
+ * @param producers Feature value producers.
+ * @return Vector generator.
+ */
+ public static VectorGenerator vectorize(RandomProducer... producers) {
+ A.notEmpty(producers, "producers");
+
+ return () -> VectorUtils.of(Arrays.stream(producers).mapToDouble(Supplier::get).toArray());
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/d0facb26/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/scalar/RandomProducerWithGenerator.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/scalar/RandomProducerWithGenerator.java b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/scalar/RandomProducerWithGenerator.java
new file mode 100644
index 0000000..f15de29
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/scalar/RandomProducerWithGenerator.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.ml.util.generators.primitives.scalar;
+
+import java.util.Random;
+
+/**
+ * Base class for generators based on basic java Random.
+ */
+abstract class RandomProducerWithGenerator implements RandomProducer {
+ /** Rnd. */
+ private final Random rnd;
+
+ /**
+ * Creates an instance of RandomProducerWithGenerator.
+ */
+ protected RandomProducerWithGenerator() {
+ this(System.currentTimeMillis());
+ }
+
+ /**
+ * Creates an instance of RandomProducerWithGenerator.
+ *
+ * @param seed Seed.
+ */
+ protected RandomProducerWithGenerator(long seed) {
+ this.rnd = new Random(seed);
+ }
+
+ /**
+ * @return Java preudorandom values generator.
+ */
+ protected Random generator() {
+ return rnd;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/d0facb26/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/scalar/UniformRandomProducer.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/scalar/UniformRandomProducer.java b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/scalar/UniformRandomProducer.java
new file mode 100644
index 0000000..91c598b
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/scalar/UniformRandomProducer.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.ml.util.generators.primitives.scalar;
+
+import org.apache.ignite.internal.util.typedef.internal.A;
+
+/**
+ * Pseudorandom producer generating values from uniform continuous distribution.
+ */
+public class UniformRandomProducer extends RandomProducerWithGenerator {
+ /** Generate values from this value. */
+ private final double from;
+
+ /** Generate values to this value. */
+ private final double to;
+
+ /**
+ * Creates an instance of UniformRandomProducer.
+ *
+ * @param from Generate values from this value.
+ * @param to Generate values to this value.
+ */
+ public UniformRandomProducer(double from, double to) {
+ this(from, to, System.currentTimeMillis());
+ }
+
+ /**
+ * Creates an instance of UniformRandomProducer.
+ *
+ * @param from Generate values from this value.
+ * @param to Generate values to this value.
+ * @param seed Seed.
+ */
+ public UniformRandomProducer(double from, double to, long seed) {
+ super(seed);
+
+ A.ensure(to >= from, "from >= to");
+
+ this.from = from;
+ this.to = to;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Double get() {
+ double result = generator().nextDouble() * (to - from) + from;
+ if (result > to)
+ result = to;
+
+ return result;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/d0facb26/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/scalar/package-info.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/scalar/package-info.java b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/scalar/package-info.java
new file mode 100644
index 0000000..264c69f
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/scalar/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * <!-- Package description. -->
+ * Contains generators of pseudo-random scalars in according to specific disctribution.
+ */
+package org.apache.ignite.ml.util.generators.primitives.scalar;
http://git-wip-us.apache.org/repos/asf/ignite/blob/d0facb26/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/vector/ParametricVectorGenerator.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/vector/ParametricVectorGenerator.java b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/vector/ParametricVectorGenerator.java
new file mode 100644
index 0000000..c9257cb
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/vector/ParametricVectorGenerator.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.ml.util.generators.primitives.vector;
+
+import java.util.Arrays;
+import java.util.List;
+import org.apache.ignite.internal.util.typedef.internal.A;
+import org.apache.ignite.ml.math.functions.IgniteFunction;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
+import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
+import org.apache.ignite.ml.util.generators.primitives.scalar.RandomProducer;
+
+/**
+ * Generate vectors having components generated by parametrized function.
+ * For each vector v: v = [F1(t), F2(t), ..., Fn(t)], where t is a value
+ * from user defined distribution.
+ *
+ */
+public class ParametricVectorGenerator implements VectorGenerator {
+ /** Per dimension generators. */
+ private final List<IgniteFunction<Double, Double>> perDimensionGenerators;
+
+ /** Random producer. */
+ private final RandomProducer randomProducer;
+
+ /**
+ * Create an intance of ParametricVectorGenerator.
+ *
+ * @param paramGenerator Parameter generator.
+ * @param perDimensionGenerators Per dimension generators.
+ */
+ public ParametricVectorGenerator(RandomProducer paramGenerator,
+ IgniteFunction<Double, Double>... perDimensionGenerators) {
+
+ A.notEmpty(perDimensionGenerators, "perDimensionGenerators.length != 0");
+
+ this.perDimensionGenerators = Arrays.asList(perDimensionGenerators);
+ this.randomProducer = paramGenerator;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector get() {
+ Double t = randomProducer.get();
+ return VectorUtils.of(perDimensionGenerators.stream()
+ .mapToDouble(f -> f.apply(t)).toArray());
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/d0facb26/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/vector/VectorGenerator.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/vector/VectorGenerator.java b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/vector/VectorGenerator.java
new file mode 100644
index 0000000..7a38cbe
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/vector/VectorGenerator.java
@@ -0,0 +1,224 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.ml.util.generators.primitives.vector;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Random;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+import org.apache.ignite.internal.util.typedef.internal.A;
+import org.apache.ignite.lang.IgnitePredicate;
+import org.apache.ignite.ml.math.functions.IgniteFunction;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
+import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
+import org.apache.ignite.ml.structures.LabeledVector;
+import org.apache.ignite.ml.util.generators.DataStreamGenerator;
+import org.apache.ignite.ml.util.generators.primitives.scalar.RandomProducer;
+
+/**
+ * Basic interface for pseudorandom vectors generators.
+ */
+public interface VectorGenerator extends Supplier<Vector> {
+ /**
+ * Maps values of vector generator using mapper.
+ *
+ * @param mapper Mapper.
+ * @return Vector generator with mapped vectors.
+ */
+ public default VectorGenerator map(IgniteFunction<Vector, Vector> mapper) {
+ return () -> mapper.apply(get());
+ }
+
+ /**
+ * Filters values of vector generator using predicate.
+ *
+ * @param predicate Predicate.
+ * @return Vector generator with filtered vectors.
+ */
+ public default VectorGenerator filter(IgnitePredicate<Vector> predicate) {
+ return () -> {
+ Vector v = null;
+ do {
+ v = get();
+ }
+ while (!predicate.apply(v));
+
+ return v;
+ };
+ }
+
+ /**
+ * Creates new generator by concatenation of vectors of this generator and other.
+ *
+ * @param other Other.
+ * @return Generator of concatenated vectors.
+ */
+ public default VectorGenerator concat(VectorGenerator other) {
+ return () -> VectorUtils.concat(this.get(), other.get());
+ }
+
+ /**
+ * Creates new generator by concatenation of vectors of this generator and random producer.
+ *
+ * @param producer Producer.
+ * @return Generator of concatenated vector and noize.
+ */
+ public default VectorGenerator concat(RandomProducer producer) {
+ return () -> VectorUtils.concat(this.get(), VectorUtils.of(producer.get()));
+ }
+
+ /**
+ * Creates new generator by sum of vectors of this generator and other.
+ *
+ * @param other Other.
+ * @return Generator of vector sums.
+ */
+ public default VectorGenerator plus(VectorGenerator other) {
+ return () -> this.get().plus(other.get());
+ }
+
+ /**
+ * Creates a permanent rearrangement mapping of features in vector and applies this rearrangement for each vectors
+ * of current generator.
+ *
+ * @return Generator of vectors with shuffled features.
+ */
+ public default VectorGenerator shuffle() {
+ return shuffle(System.currentTimeMillis());
+ }
+
+ /**
+ * Creates a permanent rearrangement mapping of features in vector and applies this rearrangement for each vectors
+ * of current generator.
+ *
+ * @param seed Seed.
+ * @return Generator of vectors with shuffled features.
+ */
+ public default VectorGenerator shuffle(Long seed) {
+ Random rnd = new Random(seed);
+ List<Integer> shuffledIds = IntStream.range(0, get().size()).boxed().collect(Collectors.toList());
+ Collections.shuffle(shuffledIds, rnd);
+
+ return map(original -> {
+ Vector cp = original.copy();
+ for (int to = 0; to < cp.size(); to++) {
+ int from = shuffledIds.get(to);
+ cp.set(to, original.get(from));
+ }
+ return cp;
+ });
+ }
+
+ /**
+ * Increase vectors of generator by increaseSize and sets to new values random selected feature values from already
+ * set components.
+ *
+ * @param increaseSize Increase size.
+ * @return Generator.
+ */
+ public default VectorGenerator duplicateRandomFeatures(int increaseSize) {
+ return duplicateRandomFeatures(increaseSize, System.currentTimeMillis());
+ }
+
+ /**
+ * Increase vectors of generator by increaseSize and sets to new values random selected feature values from already
+ * set components.
+ *
+ * @param increaseSize Increase size.
+ * @param seed Seed.
+ * @return Generator.
+ */
+ public default VectorGenerator duplicateRandomFeatures(int increaseSize, Long seed) {
+ A.ensure(increaseSize > 0, "increaseSize > 0");
+
+ Random rnd = new Random(seed);
+ return map(original -> {
+ double[] values = new double[original.size() + increaseSize];
+ for (int i = 0; i < original.size(); i++)
+ values[i] = original.get(i);
+ for (int i = 0; i < increaseSize; i++) {
+ int rndId = rnd.nextInt(original.size());
+ values[original.size() + i] = original.get(rndId);
+ }
+ return VectorUtils.of(values);
+ });
+ }
+
+ /**
+ * Moves all vectors to other position by summing with input vector.
+ *
+ * @param v Vector.
+ * @return Generator with old vectors plus input vector.
+ */
+ public default VectorGenerator move(Vector v) {
+ return map(x -> x.plus(v));
+ }
+
+ /**
+ * Rotate first two components of all vectors of generator by angle around zero.
+ *
+ * @param angle Angle.
+ * @return Generator.
+ */
+ public default VectorGenerator rotate(double angle) {
+ return rotate(angle, 0, 1);
+ }
+
+ /**
+ * Rotate selected two components of all vectors of generator by angle around zero.
+ *
+ * @param angle Angle.
+ * @param firstComponent First component id.
+ * @param secondComponent Second component id.
+ * @return Generator.
+ */
+ public default VectorGenerator rotate(double angle, int firstComponent, int secondComponent) {
+ return map(x -> x.copy()
+ .set(firstComponent, x.get(firstComponent) * Math.cos(angle) + x.get(secondComponent) * Math.sin(angle))
+ .set(secondComponent, -x.get(firstComponent) * Math.sin(angle) + x.get(secondComponent) * Math.cos(angle))
+ );
+ }
+
+ /**
+ * Adds noize to all components of generated vectors.
+ *
+ * @param randomProducer Random producer.
+ * @return Generator.
+ */
+ public default VectorGenerator noisify(RandomProducer randomProducer) {
+ int vectorSize = get().size();
+ return plus(randomProducer.vectorize(vectorSize));
+ }
+
+ /**
+ * Conterts vectors generator to unlabeled data stream generator.
+ *
+ * @return data stream generator.
+ */
+ public default DataStreamGenerator asDataStream() {
+ final VectorGenerator gen = this;
+ return new DataStreamGenerator() {
+ @Override public Stream<LabeledVector<Vector, Double>> labeled() {
+ return Stream.generate(gen).map(v -> new LabeledVector<>(v, 0.0));
+ }
+ };
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/d0facb26/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/vector/VectorGeneratorPrimitives.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/vector/VectorGeneratorPrimitives.java b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/vector/VectorGeneratorPrimitives.java
new file mode 100644
index 0000000..1c49643
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/vector/VectorGeneratorPrimitives.java
@@ -0,0 +1,154 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.ml.util.generators.primitives.vector;
+
+import org.apache.ignite.internal.util.typedef.internal.A;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
+import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
+import org.apache.ignite.ml.util.generators.primitives.scalar.GaussRandomProducer;
+import org.apache.ignite.ml.util.generators.primitives.scalar.RandomProducer;
+import org.apache.ignite.ml.util.generators.primitives.scalar.UniformRandomProducer;
+
+/**
+ * Collection of predefined vector generators.
+ */
+public class VectorGeneratorPrimitives {
+ /**
+ * Returns vector generator of vectors from multidimension gauss distribution.
+ *
+ * @param means Mean values per dimension.
+ * @param variances Variance values per dimension.
+ * @param seed Seed.
+ * @return Generator.
+ */
+ public static VectorGenerator gauss(Vector means, Vector variances, Long seed) {
+ A.notEmpty(means.asArray(), "mean.size() != 0");
+ A.ensure(means.size() == variances.size(), "mean.size() == variances.size()");
+
+ RandomProducer[] producers = new RandomProducer[means.size()];
+ for (int i = 0; i < producers.length; i++)
+ producers[i] = new GaussRandomProducer(means.get(i), variances.get(i), seed *= 2);
+ return RandomProducer.vectorize(producers);
+ }
+
+ /**
+ * Returns vector generator of vectors from multidimension gauss distribution.
+ *
+ * @param means Mean values per dimension.
+ * @param variances Variance values per dimension.
+ * @return Generator.
+ */
+ public static VectorGenerator gauss(Vector means, Vector variances) {
+ return gauss(means, variances, System.currentTimeMillis());
+ }
+
+ /**
+ * Returns vector generator of 2D-vectors from ring-like distribution.
+ *
+ * @param radius Ring radius.
+ * @param fromAngle From angle.
+ * @param toAngle To angle.
+ * @return Generator.
+ */
+ public static VectorGenerator ring(double radius, double fromAngle, double toAngle) {
+ return ring(radius, fromAngle, toAngle, System.currentTimeMillis());
+ }
+
+ /**
+ * Returns vector generator of 2D-vectors from ring-like distribution around zero.
+ *
+ * @param radius Ring radius.
+ * @param fromAngle From angle.
+ * @param toAngle To angle.
+ * @param seed Seed.
+ * @return Generator.
+ */
+ public static VectorGenerator ring(double radius, double fromAngle, double toAngle, long seed) {
+ return new ParametricVectorGenerator(
+ new UniformRandomProducer(fromAngle, toAngle, seed),
+ t -> radius * Math.sin(t),
+ t -> radius * Math.cos(t)
+ );
+ }
+
+ /**
+ * Returns vector generator of vectors from multidimension uniform distribution around zero.
+ *
+ * @param bounds Parallelogram bounds.
+ * @return Generator.
+ */
+ public static VectorGenerator parallelogram(Vector bounds) {
+ return parallelogram(bounds, System.currentTimeMillis());
+ }
+
+ /**
+ * Returns vector generator of vectors from multidimension uniform distribution around zero.
+ *
+ * @param bounds Parallelogram bounds.
+ * @param seed Seed.
+ * @return Generator.
+ */
+ public static VectorGenerator parallelogram(Vector bounds, long seed) {
+ A.ensure(bounds.size() != 0, "bounds.size() != 0");
+
+ UniformRandomProducer[] producers = new UniformRandomProducer[bounds.size()];
+ for (int i = 0; i < producers.length; i++)
+ producers[i] = new UniformRandomProducer(-bounds.get(i), bounds.get(i), seed *= 2);
+
+ return RandomProducer.vectorize(producers);
+ }
+
+ /**
+ * Returns vector generator of 2D-vectors from circle-like distribution around zero.
+ *
+ * @param radius Circle radius.
+ * @return Generator.
+ */
+ public static VectorGenerator circle(double radius) {
+ return circle(radius, System.currentTimeMillis());
+ }
+
+ /**
+ * Returns vector generator of 2D-vectors from circle-like distribution around zero.
+ *
+ * @param radius Circle radius.
+ * @param seed Seed.
+ * @return Generator.
+ */
+ public static VectorGenerator circle(double radius, long seed) {
+ return new UniformRandomProducer(-radius, radius, seed)
+ .vectorize(2)
+ .filter(v -> Math.sqrt(v.getLengthSquared()) <= radius);
+ }
+
+ /**
+ * @param size Vector size.
+ * @return Generator of constant vector = zero.
+ */
+ public static VectorGenerator zero(int size) {
+ return constant(VectorUtils.zeroes(size));
+ }
+
+ /**
+ * @param v Constant.
+ * @return Generator of constant vector.
+ */
+ public static VectorGenerator constant(Vector v) {
+ return () -> v;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/d0facb26/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/vector/VectorGeneratorsFamily.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/vector/VectorGeneratorsFamily.java b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/vector/VectorGeneratorsFamily.java
new file mode 100644
index 0000000..5359fe9
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/vector/VectorGeneratorsFamily.java
@@ -0,0 +1,189 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.ml.util.generators.primitives.vector;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import org.apache.ignite.internal.util.typedef.internal.A;
+import org.apache.ignite.ml.math.functions.IgniteFunction;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
+import org.apache.ignite.ml.structures.LabeledVector;
+import org.apache.ignite.ml.util.generators.DataStreamGenerator;
+import org.apache.ignite.ml.util.generators.primitives.scalar.DiscreteRandomProducer;
+
+/**
+ * Represents a distribution family of district vector generators.
+ */
+public class VectorGeneratorsFamily implements VectorGenerator {
+ /** Family of generators. */
+ private final List<VectorGenerator> family;
+
+ /** Randomized selector of vector generator from family. */
+ private final DiscreteRandomProducer selector;
+
+ /**
+ * Creates an instance of VectorGeneratorsFamily.
+ *
+ * @param family Family of generators.
+ * @param selector Randomized selector of generator from family.
+ */
+ private VectorGeneratorsFamily(List<VectorGenerator> family, DiscreteRandomProducer selector) {
+ this.family = family;
+ this.selector = selector;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Vector get() {
+ return family.get(selector.getInt()).get();
+ }
+
+ /**
+ * @return pseudo random vector with parent distribution id.
+ */
+ public VectorWithDistributionId getWithId() {
+ int id = selector.getInt();
+ return new VectorWithDistributionId(family.get(id).get(), id);
+ }
+
+ /**
+ * Creates data stream where label of vector == id of distribution from family.
+ *
+ * @return Data stream generator.
+ */
+ @Override public DataStreamGenerator asDataStream() {
+ VectorGeneratorsFamily gen = this;
+ return new DataStreamGenerator() {
+ @Override public Stream<LabeledVector<Vector, Double>> labeled() {
+ return Stream.generate(gen::getWithId)
+ .map(v -> new LabeledVector<>(v.vector, (double)v.distributionId));
+ }
+ };
+ }
+
+ /**
+ * Helper for distribution family building.
+ */
+ public static class Builder {
+ /** Family. */
+ private final List<VectorGenerator> family = new ArrayList<>();
+
+ /** Weights of generators. */
+ private final List<Double> weights = new ArrayList<>();
+
+ /**
+ * Mapper for generators in family.
+ * It as applied before create an instance of VectorGeneratorsFamily
+ */
+ private IgniteFunction<VectorGenerator, VectorGenerator> mapper = x -> x;
+
+ /**
+ * Add generator to family with weight proportional to it selection probability.
+ *
+ * @param generator Generator.
+ * @param weight Weight.
+ * @return This builder.
+ */
+ public Builder add(VectorGenerator generator, double weight) {
+ A.ensure(weight > 0, "weight > 0");
+
+ family.add(generator);
+ weights.add(weight);
+ return this;
+ }
+
+ /**
+ * Adds generator to family with weight = 1.
+ *
+ * @param generator Generator.
+ * @return This builder.
+ */
+ public Builder add(VectorGenerator generator) {
+ return add(generator, 1);
+ }
+
+ /**
+ * Adds map function for all generators in family.
+ *
+ * @param mapper Mapper.
+ * @return This builder.
+ */
+ public Builder map(IgniteFunction<VectorGenerator, VectorGenerator> mapper) {
+ final IgniteFunction<VectorGenerator, VectorGenerator> old = this.mapper;
+ this.mapper = x -> mapper.apply(old.apply(x));
+ return this;
+ }
+
+ /**
+ * Builds VectorGeneratorsFamily instance.
+ *
+ * @return Vector generators family.
+ */
+ public VectorGeneratorsFamily build() {
+ return build(System.currentTimeMillis());
+ }
+
+ /**
+ * Builds VectorGeneratorsFamily instance.
+ *
+ * @param seed Seed.
+ * @return Vector generators family.
+ */
+ public VectorGeneratorsFamily build(long seed) {
+ A.notEmpty(family, "family.size != 0");
+ double sumOfWeigts = weights.stream().mapToDouble(x -> x).sum();
+ double[] probs = weights.stream().mapToDouble(w -> w / sumOfWeigts).toArray();
+
+ List<VectorGenerator> mappedFamilily = family.stream().map(mapper).collect(Collectors.toList());
+ return new VectorGeneratorsFamily(mappedFamilily, new DiscreteRandomProducer(seed, probs));
+ }
+ }
+
+ /** */
+ public static class VectorWithDistributionId {
+ /** Vector. */
+ private final Vector vector;
+
+ /** Distribution id. */
+ private final int distributionId;
+
+ /**
+ * @param vector Vector.
+ * @param distributionId Distribution id.
+ */
+ public VectorWithDistributionId(Vector vector, int distributionId) {
+ this.vector = vector;
+ this.distributionId = distributionId;
+ }
+
+ /**
+ * @return Vector.
+ */
+ public Vector vector() {
+ return vector;
+ }
+
+ /**
+ * @return Distribution id.
+ */
+ public int distributionId() {
+ return distributionId;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/d0facb26/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/vector/package-info.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/vector/package-info.java b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/vector/package-info.java
new file mode 100644
index 0000000..ded85c5
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/primitives/vector/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * <!-- Package description. -->
+ * Contains generators of pseudo-random vectors in according to specific disctribution.
+ */
+package org.apache.ignite.ml.util.generators.primitives.vector;
http://git-wip-us.apache.org/repos/asf/ignite/blob/d0facb26/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/standard/GaussianMixtureDataStream.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/standard/GaussianMixtureDataStream.java b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/standard/GaussianMixtureDataStream.java
new file mode 100644
index 0000000..6ea3ed0
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/standard/GaussianMixtureDataStream.java
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.ml.util.generators.standard;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Stream;
+import org.apache.ignite.internal.util.typedef.internal.A;
+import org.apache.ignite.ml.math.functions.IgniteFunction;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
+import org.apache.ignite.ml.structures.LabeledVector;
+import org.apache.ignite.ml.util.generators.DataStreamGenerator;
+import org.apache.ignite.ml.util.generators.primitives.vector.VectorGenerator;
+import org.apache.ignite.ml.util.generators.primitives.vector.VectorGeneratorsFamily;
+
+import static org.apache.ignite.ml.util.generators.primitives.vector.VectorGeneratorPrimitives.gauss;
+
+/**
+ * Data stream generator representing gaussian mixture.
+ */
+public class GaussianMixtureDataStream implements DataStreamGenerator {
+ /** Gaussian component generators. */
+ private final List<IgniteFunction<Long, VectorGenerator>> componentGenerators;
+
+ /** Seed. */
+ private long seed;
+
+ /**
+ * Create an instance of GaussianMixtureDataStream.
+ *
+ * @param componentGenerators Component generators.
+ * @param seed Seed.
+ */
+ private GaussianMixtureDataStream(List<IgniteFunction<Long, VectorGenerator>> componentGenerators, long seed) {
+ this.componentGenerators = componentGenerators;
+ this.seed = seed;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Stream<LabeledVector<Vector, Double>> labeled() {
+ VectorGeneratorsFamily.Builder builder = new VectorGeneratorsFamily.Builder();
+ for (int i = 0; i < componentGenerators.size(); i++) {
+ builder = builder.add(componentGenerators.get(i).apply(seed), 1.0);
+ seed *= 2;
+ }
+
+ return builder.build().asDataStream().labeled();
+ }
+
+ /**
+ * Builder for gaussian mixture.
+ */
+ public static class Builder {
+ /** Gaussian component generators. */
+ private List<IgniteFunction<Long, VectorGenerator>> componentGenerators = new ArrayList<>();
+
+ /**
+ * Adds multidimentional gaussian component.
+ *
+ * @param mean Mean value.
+ * @param variance Variance for each component.
+ */
+ public Builder add(Vector mean, Vector variance) {
+ componentGenerators.add(seed -> gauss(mean, variance, seed));
+ return this;
+ }
+
+ /**
+ * @return GaussianMixtureDataStream instance.
+ */
+ public GaussianMixtureDataStream build() {
+ return build(System.currentTimeMillis());
+ }
+
+ /**
+ * @param seed Seed.
+ * @return GaussianMixtureDataStream instance.
+ */
+ public GaussianMixtureDataStream build(long seed) {
+ A.notEmpty(componentGenerators, "this.means.size()");
+ return new GaussianMixtureDataStream(componentGenerators, seed);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/d0facb26/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/standard/RegressionDataStream.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/standard/RegressionDataStream.java b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/standard/RegressionDataStream.java
new file mode 100644
index 0000000..6d7291b
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/standard/RegressionDataStream.java
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.ml.util.generators.standard;
+
+import java.util.stream.Stream;
+import org.apache.ignite.internal.util.typedef.internal.A;
+import org.apache.ignite.ml.math.functions.IgniteFunction;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
+import org.apache.ignite.ml.structures.LabeledVector;
+import org.apache.ignite.ml.util.generators.DataStreamGenerator;
+import org.apache.ignite.ml.util.generators.primitives.scalar.UniformRandomProducer;
+
+/**
+ * Represents a generator of regression data stream based on Vector->Double function where each Vector
+ * was produced from hypercube with sides = [minXValue, maxXValue].
+ */
+public class RegressionDataStream implements DataStreamGenerator {
+ /** Function. */
+ private final IgniteFunction<Vector, Double> function;
+
+ /** Min x value for each dimension. */
+ private final double minXVal;
+
+ /** Max x value. */
+ private final double maxXVal;
+
+ /** Vector size. */
+ private final int vectorSize;
+
+ /** Seed. */
+ private long seed;
+
+ /**
+ * Creates an instance of RegressionDataStream.
+ *
+ * @param vectorSize Vector size.
+ * @param function Function.
+ * @param minXVal Min x value.
+ * @param maxXVal Max x value.
+ * @param seed Seed.
+ */
+ private RegressionDataStream(int vectorSize, IgniteFunction<Vector, Double> function,
+ double minXVal, double maxXVal, long seed) {
+
+ A.ensure(vectorSize > 0, "vectorSize > 0");
+ A.ensure(minXVal <= maxXVal, "minXValue <= maxXValue");
+
+ this.function = function;
+ this.minXVal = minXVal;
+ this.maxXVal = maxXVal;
+ this.seed = seed;
+ this.vectorSize = vectorSize;
+ }
+
+ /**
+ * Creates an instance of RegressionDataStream.
+ *
+ * @param vectorSize Vector size.
+ * @param function Function.
+ * @param minXVal Min x value.
+ * @param maxXVal Max x value.
+ */
+ public RegressionDataStream(int vectorSize, IgniteFunction<Vector, Double> function, double minXVal,
+ double maxXVal) {
+ this(vectorSize, function, minXVal, maxXVal, System.currentTimeMillis());
+ }
+
+ /** {@inheritDoc} */
+ @Override public Stream<LabeledVector<Vector, Double>> labeled() {
+ seed *= 2;
+ return new UniformRandomProducer(minXVal, maxXVal, seed)
+ .vectorize(vectorSize).asDataStream()
+ .labeled(function);
+ }
+
+ /**
+ * Creates two dimensional regression data stream.
+ *
+ * @param function Double->double function.
+ * @param minXVal Min x value.
+ * @param maxXVal Max x value.
+ * @return RegressionDataStream instance.
+ */
+ public static RegressionDataStream twoDimensional(IgniteFunction<Double, Double> function,
+ double minXVal, double maxXVal) {
+
+ return twoDimensional(function, minXVal, maxXVal, System.currentTimeMillis());
+ }
+
+ /**
+ * Creates two dimensional regression data stream.
+ *
+ * @param function Double->double function.
+ * @param minXVal Min x value.
+ * @param maxXVal Max x value.
+ * @param seed Seed.
+ * @return RegressionDataStream instance.
+ */
+ public static RegressionDataStream twoDimensional(IgniteFunction<Double, Double> function,
+ double minXVal, double maxXVal, long seed) {
+
+ return new RegressionDataStream(1, v -> function.apply(v.get(0)), minXVal, maxXVal, seed);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/d0facb26/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/standard/RingsDataStream.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/standard/RingsDataStream.java b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/standard/RingsDataStream.java
new file mode 100644
index 0000000..27211b0
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/standard/RingsDataStream.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.ml.util.generators.standard;
+
+import java.util.stream.Stream;
+import org.apache.ignite.internal.util.typedef.internal.A;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
+import org.apache.ignite.ml.structures.LabeledVector;
+import org.apache.ignite.ml.util.generators.DataStreamGenerator;
+import org.apache.ignite.ml.util.generators.primitives.scalar.GaussRandomProducer;
+import org.apache.ignite.ml.util.generators.primitives.vector.VectorGeneratorsFamily;
+
+import static org.apache.ignite.ml.util.generators.primitives.vector.VectorGeneratorPrimitives.ring;
+
+/**
+ * Represents a data stream of vectors produced by family of ring-like distributions around zero blurred
+ * by gauss distribution. First ring equals minRadius next ring radius = prev_radius + distanceBetweenRings.
+ */
+public class RingsDataStream implements DataStreamGenerator {
+ /** Count of rings. */
+ private final int cntOfRings;
+
+ /** Min radius. */
+ private final double minRadius;
+
+ /** Distance between circles. */
+ private final double distanceBetweenRings;
+
+ /** Seed. */
+ private long seed;
+
+ /**
+ * Create an intance of RingsDataStream.
+ *
+ * @param cntOfRings Count of circles.
+ * @param minRadius Min radius.
+ * @param distanceBetweenRings Distance between circles.
+ */
+ public RingsDataStream(int cntOfRings, double minRadius, double distanceBetweenRings) {
+ this(cntOfRings, minRadius, distanceBetweenRings, System.currentTimeMillis());
+ }
+
+ /**
+ * Create an intance of RingsDataStream.
+ *
+ * @param cntOfRings Count of circles.
+ * @param minRadius Min radius.
+ * @param distanceBetweenRings Distance between circles.
+ * @param seed Seed.
+ */
+ public RingsDataStream(int cntOfRings, double minRadius, double distanceBetweenRings, long seed) {
+ A.ensure(cntOfRings > 0, "countOfRings > 0");
+ A.ensure(minRadius > 0, "minRadius > 0");
+ A.ensure(distanceBetweenRings > 0, "distanceBetweenRings > 0");
+
+ this.cntOfRings = cntOfRings;
+ this.minRadius = minRadius;
+ this.distanceBetweenRings = distanceBetweenRings;
+ this.seed = seed;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Stream<LabeledVector<Vector, Double>> labeled() {
+ VectorGeneratorsFamily.Builder builder = new VectorGeneratorsFamily.Builder();
+ for (int i = 0; i < cntOfRings; i++) {
+ final double radius = minRadius + distanceBetweenRings * i;
+ final double variance = 0.1 * (i + 1);
+
+ GaussRandomProducer gauss = new GaussRandomProducer(0, variance, seed);
+ builder = builder.add(ring(radius, 0, 2 * Math.PI).noisify(gauss));
+ seed *= 2;
+ }
+
+ return builder.build().asDataStream().labeled();
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/d0facb26/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/standard/TwoSeparableClassesDataStream.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/standard/TwoSeparableClassesDataStream.java b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/standard/TwoSeparableClassesDataStream.java
new file mode 100644
index 0000000..49c69b7
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/standard/TwoSeparableClassesDataStream.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.ml.util.generators.standard;
+
+import java.util.stream.Stream;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
+import org.apache.ignite.ml.structures.LabeledVector;
+import org.apache.ignite.ml.util.generators.DataStreamGenerator;
+import org.apache.ignite.ml.util.generators.primitives.scalar.UniformRandomProducer;
+
+/**
+ * 2D-Vectors data stream with two separable classes.
+ */
+public class TwoSeparableClassesDataStream implements DataStreamGenerator {
+ /** Margin. */
+ private final double margin;
+
+ /** Variance. */
+ private final double variance;
+
+ /** Seed. */
+ private long seed;
+
+ /**
+ * Create an instance of TwoSeparableClassesDataStream. Note that margin can be less than zero.
+ *
+ * @param margin Margin.
+ * @param variance Variance.
+ */
+ public TwoSeparableClassesDataStream(double margin, double variance) {
+ this(margin, variance, System.currentTimeMillis());
+ }
+
+ /**
+ * Create an instance of TwoSeparableClassesDataStream. Note that margin can be less than zero.
+ *
+ * @param margin Margin.
+ * @param variance Variance.
+ * @param seed Seed.
+ */
+ public TwoSeparableClassesDataStream(double margin, double variance, long seed) {
+ this.margin = margin;
+ this.variance = variance;
+ this.seed = seed;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Stream<LabeledVector<Vector, Double>> labeled() {
+ seed *= 2;
+
+ double minCordVal = -variance - Math.abs(margin);
+ double maxCordVal = variance + Math.abs(margin);
+
+ return new UniformRandomProducer(minCordVal, maxCordVal, seed)
+ .vectorize(2).asDataStream().labeled(this::classify)
+ .map(v -> new LabeledVector<>(applyMargin(v.features()), v.label()))
+ .filter(v -> between(v.features().get(0), -variance, variance))
+ .filter(v -> between(v.features().get(1), -variance, variance));
+ }
+
+ /** */
+ private boolean between(double x, double min, double max) {
+ return x >= min && x <= max;
+ }
+
+ /** */
+ private double classify(Vector v) {
+ return v.get(0) - v.get(1) > 0 ? -1.0 : 1.0;
+ }
+
+ /** */
+ private Vector applyMargin(Vector v) {
+ Vector cp = v.copy();
+
+ cp.set(0, cp.get(0) + Math.signum(v.get(0) - v.get(1)) * margin);
+ cp.set(1, cp.get(1) - Math.signum(v.get(0) - v.get(1)) * margin);
+
+ return cp;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/d0facb26/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/standard/package-info.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/standard/package-info.java b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/standard/package-info.java
new file mode 100644
index 0000000..4aaf4bf
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/util/generators/standard/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * <!-- Package description. -->
+ * Contains classes for predefined data stream generators.
+ */
+package org.apache.ignite.ml.util.generators.standard;