IGNITE-8981: [ML] Parallel optimizations for BaggingTrainer

this closes #4350


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

Branch: refs/heads/ignite-8446
Commit: 9f5dd09bc33d96f0a08d1890f9be33b51fef54ff
Parents: 81d04a5
Author: Alexey Platonov <aplaton...@gmail.com>
Authored: Tue Jul 24 15:45:09 2018 +0300
Committer: Yury Babak <yba...@gridgain.com>
Committed: Tue Jul 24 15:45:10 2018 +0300

----------------------------------------------------------------------
 .../OptimizeMakeChangeFitnessFunction.java      |   1 -
 .../change/OptimizeMakeChangeGAExample.java     |   2 -
 .../OptimizeMakeChangeTerminateCriteria.java    |   2 -
 .../genetic/helloworld/HelloWorldGAExample.java |   2 -
 .../helloworld/HelloWorldTerminateCriteria.java |   2 -
 .../ml/genetic/knapsack/KnapsackGAExample.java  |   2 -
 .../knapsack/KnapsackTerminateCriteria.java     |   1 -
 .../ml/genetic/movie/MovieFitnessFunction.java  |   1 -
 .../ml/genetic/movie/MovieGAExample.java        |   2 -
 .../genetic/movie/MovieTerminateCriteria.java   |   2 -
 .../ml/knn/KNNClassificationExample.java        |   2 +-
 .../examples/ml/knn/KNNRegressionExample.java   |   2 +-
 .../examples/ml/nn/MLPTrainerExample.java       |   2 +-
 .../ml/preprocessing/BinarizationExample.java   |   2 +-
 .../ml/preprocessing/ImputingExample.java       |   2 +-
 .../ImputingExampleWithMostFrequentValues.java  |   2 +-
 .../ml/preprocessing/MinMaxScalerExample.java   |   2 +-
 .../ml/preprocessing/NormalizationExample.java  |   2 +-
 ...ssionLSQRTrainerWithMinMaxScalerExample.java |   2 +-
 ...gressionMultiClassClassificationExample.java |   2 +-
 .../SVMMultiClassClassificationExample.java     |   2 +-
 .../RandomForestRegressionExample.java          |  18 ++-
 .../ml/tutorial/Step_1_Read_and_Learn.java      |   2 +-
 .../examples/ml/tutorial/Step_2_Imputing.java   |   2 +-
 .../examples/ml/tutorial/Step_3_Categorial.java |   2 +-
 .../ml/tutorial/Step_4_Add_age_fare.java        |   2 +-
 .../examples/ml/tutorial/Step_5_Scaling.java    |   2 +-
 .../ignite/examples/ml/tutorial/Step_6_KNN.java |   2 +-
 .../ml/tutorial/Step_7_Split_train_test.java    |   2 +-
 .../ignite/examples/ml/tutorial/Step_8_CV.java  |   2 +-
 .../ml/tutorial/Step_9_Go_to_LogReg.java        |   2 +-
 .../main/java/org/apache/ignite/ml/Model.java   |   7 +
 .../ml/clustering/kmeans/KMeansModel.java       |  22 +++-
 .../ml/clustering/kmeans/KMeansModelFormat.java |   2 +-
 .../ml/clustering/kmeans/KMeansTrainer.java     |   6 +-
 .../ml/composition/BaggingModelTrainer.java     |  38 ++++--
 .../ml/composition/ModelOnFeaturesSubspace.java |  19 +++
 .../ml/composition/ModelsComposition.java       |  14 ++
 .../boosting/GDBBinaryClassifierTrainer.java    |   2 +-
 .../boosting/GDBRegressionTrainer.java          |   2 +-
 .../ml/composition/boosting/GDBTrainer.java     |  40 +++---
 .../PredictionsAggregator.java                  |   8 ++
 .../WeightedPredictionsAggregator.java          |  24 ++++
 .../ignite/ml/dataset/DatasetFactory.java       |   2 +-
 .../builder/data/SimpleDatasetDataBuilder.java  |   2 +-
 .../data/SimpleLabeledDatasetDataBuilder.java   |   2 +-
 .../ml/environment/LearningEnvironment.java     |  54 ++++++++
 .../environment/LearningEnvironmentBuilder.java | 123 ++++++++++++++++++
 .../ml/environment/logging/ConsoleLogger.java   | 102 +++++++++++++++
 .../ml/environment/logging/CustomMLLogger.java  | 105 +++++++++++++++
 .../ignite/ml/environment/logging/MLLogger.java |  69 ++++++++++
 .../ml/environment/logging/NoOpLogger.java      |  64 +++++++++
 .../ml/environment/logging/package-info.java    |  21 +++
 .../ignite/ml/environment/package-info.java     |  21 +++
 .../parallelism/DefaultParallelismStrategy.java |  85 ++++++++++++
 .../parallelism/NoParallelismStrategy.java      |  87 +++++++++++++
 .../parallelism/ParallelismStrategy.java        |  47 +++++++
 .../ml/environment/parallelism/Promise.java     |  53 ++++++++
 .../environment/parallelism/package-info.java   |  21 +++
 .../apache/ignite/ml/genetic/CrossOverJob.java  |   4 +-
 .../apache/ignite/ml/genetic/CrossOverTask.java |   4 +-
 .../apache/ignite/ml/genetic/FitnessJob.java    |   4 +-
 .../apache/ignite/ml/genetic/FitnessTask.java   |   4 +-
 .../org/apache/ignite/ml/genetic/GAGrid.java    |   3 -
 .../java/org/apache/ignite/ml/genetic/Gene.java |   1 -
 .../apache/ignite/ml/genetic/MutateTask.java    |   5 +-
 .../ignite/ml/genetic/TruncateSelectionJob.java |   3 +-
 .../ml/genetic/TruncateSelectionTask.java       |   4 +-
 .../ml/genetic/functions/GAGridFunction.java    |   4 +-
 .../ml/genetic/parameter/GAConfiguration.java   |   1 -
 .../ignite/ml/genetic/utils/GAGridUtils.java    |   3 -
 .../java/org/apache/ignite/ml/knn/KNNUtils.java |   2 +-
 .../classification/KNNClassificationModel.java  |  17 ++-
 .../KNNClassificationTrainer.java               |   4 +-
 .../ml/knn/regression/KNNRegressionModel.java   |  17 ++-
 .../ml/knn/regression/KNNRegressionTrainer.java |   4 +-
 .../java/org/apache/ignite/ml/math/Blas.java    |   2 +-
 .../java/org/apache/ignite/ml/math/Tracer.java  |  32 ++++-
 .../ml/math/distances/DistanceMeasure.java      |   2 +-
 .../ml/math/distances/EuclideanDistance.java    |   2 +-
 .../ml/math/distances/HammingDistance.java      |   2 +-
 .../ml/math/distances/ManhattanDistance.java    |   2 +-
 .../math/primitives/matrix/AbstractMatrix.java  |   2 +-
 .../primitives/matrix/impl/DenseMatrix.java     |   6 +-
 .../primitives/matrix/impl/SparseMatrix.java    |   6 +-
 .../math/primitives/matrix/impl/ViewMatrix.java |   6 +-
 .../matrix/storage/DenseMatrixStorage.java      |   2 +-
 .../matrix/storage/SparseMatrixStorage.java     |   2 +-
 .../math/primitives/vector/AbstractVector.java  |   2 +-
 .../ml/math/primitives/vector/Vector.java       |   3 +-
 .../vector/impl/DelegatingVector.java           |   6 +-
 .../primitives/vector/impl/DenseVector.java     |   6 +-
 .../primitives/vector/impl/SparseVector.java    |   4 +-
 .../math/primitives/vector/impl/VectorView.java |   4 +-
 .../vector/impl/VectorizedViewMatrix.java       |   4 +-
 .../storage/VectorizedViewMatrixStorage.java    |   2 +-
 .../apache/ignite/ml/math/util/MatrixUtil.java  |   6 +-
 .../org/apache/ignite/ml/nn/MLPTrainer.java     |   6 +-
 .../ignite/ml/nn/MultilayerPerceptron.java      |  29 ++++-
 .../ignite/ml/nn/ReplicatedVectorMatrix.java    |   6 +-
 .../ignite/ml/optimization/LossFunctions.java   |   2 +-
 .../ml/optimization/SmoothParametrized.java     |   4 +-
 .../NesterovUpdateCalculator.java               |   4 +-
 .../ParameterUpdateCalculator.java              |   4 +-
 .../RPropUpdateCalculator.java                  |   4 +-
 .../SimpleGDUpdateCalculator.java               |   4 +-
 .../binarization/BinarizationPreprocessor.java  |   2 +-
 .../binarization/BinarizationTrainer.java       |   2 +-
 .../StringEncoderPreprocessor.java              |   4 +-
 .../stringencoder/StringEncoderTrainer.java     |   2 +-
 .../imputing/ImputerPreprocessor.java           |   2 +-
 .../preprocessing/imputing/ImputerTrainer.java  |   2 +-
 .../minmaxscaling/MinMaxScalerPreprocessor.java |   2 +-
 .../minmaxscaling/MinMaxScalerTrainer.java      |   2 +-
 .../NormalizationPreprocessor.java              |   2 +-
 .../normalization/NormalizationTrainer.java     |   2 +-
 .../linear/FeatureExtractorWrapper.java         |   2 +-
 .../linear/LinearRegressionLSQRTrainer.java     |   6 +-
 .../linear/LinearRegressionModel.java           |   9 +-
 .../linear/LinearRegressionSGDTrainer.java      |   4 +-
 .../binomial/LogisticRegressionModel.java       |   9 +-
 .../binomial/LogisticRegressionSGDTrainer.java  |   4 +-
 .../LogRegressionMultiClassModel.java           |   5 +
 .../LogRegressionMultiClassTrainer.java         |   4 +-
 .../ignite/ml/selection/cv/CrossValidation.java |   2 +-
 .../cursor/CacheBasedLabelPairCursor.java       |   2 +-
 .../scoring/cursor/LocalLabelPairCursor.java    |   2 +-
 .../selection/scoring/evaluator/Evaluator.java  |   2 +-
 .../ignite/ml/structures/LabeledDataset.java    |   2 +-
 ...abeledDatasetPartitionDataBuilderOnHeap.java |   2 +-
 .../preprocessing/LabeledDatasetLoader.java     |   2 +-
 .../svm/SVMLinearBinaryClassificationModel.java |   9 +-
 .../SVMLinearBinaryClassificationTrainer.java   |   4 +-
 .../SVMLinearMultiClassClassificationModel.java |   5 +
 ...VMLinearMultiClassClassificationTrainer.java |   4 +-
 .../ignite/ml/trainers/DatasetTrainer.java      |  26 +++-
 .../ml/trainers/MultiLabelDatasetTrainer.java   |   2 +-
 .../ml/trainers/SingleLabelDatasetTrainer.java  |   2 +-
 .../org/apache/ignite/ml/tree/DecisionTree.java |  56 +++++++-
 .../ml/tree/DecisionTreeConditionalNode.java    |  10 ++
 .../ignite/ml/tree/DecisionTreeLeafNode.java    |  10 ++
 .../ml/tree/data/DecisionTreeDataBuilder.java   |   2 +-
 .../org/apache/ignite/ml/util/ModelTrace.java   | 130 +++++++++++++++++++
 .../org/apache/ignite/ml/LocalModelsTest.java   |   2 +-
 .../java/org/apache/ignite/ml/TestUtils.java    |   2 +-
 .../ignite/ml/clustering/KMeansModelTest.java   |   2 +-
 .../ignite/ml/clustering/KMeansTrainerTest.java |   2 +-
 .../ml/genetic/GAGridCalculateFitnessTest.java  |   5 +-
 .../genetic/GAGridInitializePopulationTest.java |   5 +-
 .../ignite/ml/knn/KNNClassificationTest.java    |   2 +-
 .../apache/ignite/ml/knn/KNNRegressionTest.java |   2 +-
 .../ignite/ml/knn/LabeledDatasetTest.java       |   2 +-
 .../org/apache/ignite/ml/math/BlasTest.java     |   2 +-
 .../ignite/ml/math/MathImplLocalTestSuite.java  |   8 +-
 .../org/apache/ignite/ml/math/TracerTest.java   |   2 +-
 .../matrix/MatrixBaseStorageTest.java           |   1 -
 .../matrix/MatrixStorageFixtures.java           |   1 -
 .../primitives/vector/AbstractVectorTest.java   |   2 +-
 .../vector/DelegatingVectorConstructorTest.java |   2 +-
 .../primitives/vector/MatrixVectorViewTest.java |   2 +-
 .../primitives/vector/VectorAttributesTest.java |   2 +-
 .../vector/VectorBaseStorageTest.java           |   1 -
 .../vector/VectorImplementationsFixtures.java   |   4 +-
 .../vector/VectorImplementationsTest.java       |   2 +-
 .../primitives/vector/VectorToMatrixTest.java   |   4 +-
 .../java/org/apache/ignite/ml/nn/MLPTest.java   |   4 +-
 .../ignite/ml/nn/MLPTrainerIntegrationTest.java |   4 +-
 .../org/apache/ignite/ml/nn/MLPTrainerTest.java |   2 +-
 .../MLPTrainerMnistIntegrationTest.java         |   2 +-
 .../ml/nn/performance/MLPTrainerMnistTest.java  |   2 +-
 .../linear/LinearRegressionModelTest.java       |   2 +-
 .../logistic/LogisticRegressionModelTest.java   |   2 +-
 .../org/apache/ignite/ml/svm/SVMModelTest.java  |   2 +-
 173 files changed, 1517 insertions(+), 266 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeFitnessFunction.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeFitnessFunction.java
 
b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeFitnessFunction.java
index 88d7037..34626be 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeFitnessFunction.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeFitnessFunction.java
@@ -18,7 +18,6 @@
 package org.apache.ignite.examples.ml.genetic.change;
 
 import java.util.List;
-
 import org.apache.ignite.ml.genetic.Gene;
 import org.apache.ignite.ml.genetic.IFitnessFunction;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeGAExample.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeGAExample.java
 
b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeGAExample.java
index 829fc4e..1e80d6d 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeGAExample.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeGAExample.java
@@ -19,11 +19,9 @@ package org.apache.ignite.examples.ml.genetic.change;
 
 import java.util.ArrayList;
 import java.util.List;
-
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.Ignition;
-
 import org.apache.ignite.ml.genetic.Chromosome;
 import org.apache.ignite.ml.genetic.GAGrid;
 import org.apache.ignite.ml.genetic.Gene;

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeTerminateCriteria.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeTerminateCriteria.java
 
b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeTerminateCriteria.java
index bb4a369..2080ac3 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeTerminateCriteria.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/change/OptimizeMakeChangeTerminateCriteria.java
@@ -18,10 +18,8 @@
 package org.apache.ignite.examples.ml.genetic.change;
 
 import java.util.List;
-
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteLogger;
-
 import org.apache.ignite.ml.genetic.Chromosome;
 import org.apache.ignite.ml.genetic.Gene;
 import org.apache.ignite.ml.genetic.parameter.ITerminateCriteria;

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/helloworld/HelloWorldGAExample.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/helloworld/HelloWorldGAExample.java
 
b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/helloworld/HelloWorldGAExample.java
index 9e0eb7a..839471a 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/helloworld/HelloWorldGAExample.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/helloworld/HelloWorldGAExample.java
@@ -19,10 +19,8 @@ package org.apache.ignite.examples.ml.genetic.helloworld;
 
 import java.util.ArrayList;
 import java.util.List;
-
 import org.apache.ignite.Ignite;
 import org.apache.ignite.Ignition;
-
 import org.apache.ignite.ml.genetic.Chromosome;
 import org.apache.ignite.ml.genetic.GAGrid;
 import org.apache.ignite.ml.genetic.Gene;

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/helloworld/HelloWorldTerminateCriteria.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/helloworld/HelloWorldTerminateCriteria.java
 
b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/helloworld/HelloWorldTerminateCriteria.java
index e7ec131..41809d4 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/helloworld/HelloWorldTerminateCriteria.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/helloworld/HelloWorldTerminateCriteria.java
@@ -18,10 +18,8 @@
 package org.apache.ignite.examples.ml.genetic.helloworld;
 
 import java.util.List;
-
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteLogger;
-
 import org.apache.ignite.ml.genetic.Chromosome;
 import org.apache.ignite.ml.genetic.Gene;
 import org.apache.ignite.ml.genetic.parameter.ITerminateCriteria;

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/KnapsackGAExample.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/KnapsackGAExample.java
 
b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/KnapsackGAExample.java
index 21b9c01..7578226 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/KnapsackGAExample.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/KnapsackGAExample.java
@@ -19,10 +19,8 @@ package org.apache.ignite.examples.ml.genetic.knapsack;
 
 import java.util.ArrayList;
 import java.util.List;
-
 import org.apache.ignite.Ignite;
 import org.apache.ignite.Ignition;
-
 import org.apache.ignite.ml.genetic.GAGrid;
 import org.apache.ignite.ml.genetic.Gene;
 import org.apache.ignite.ml.genetic.parameter.GAConfiguration;

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/KnapsackTerminateCriteria.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/KnapsackTerminateCriteria.java
 
b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/KnapsackTerminateCriteria.java
index 76af2bb..487f8a7 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/KnapsackTerminateCriteria.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/knapsack/KnapsackTerminateCriteria.java
@@ -18,7 +18,6 @@
 package org.apache.ignite.examples.ml.genetic.knapsack;
 
 import java.util.List;
-
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.ml.genetic.Chromosome;

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieFitnessFunction.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieFitnessFunction.java
 
b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieFitnessFunction.java
index b5f52f7..bfd50f0 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieFitnessFunction.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieFitnessFunction.java
@@ -19,7 +19,6 @@ package org.apache.ignite.examples.ml.genetic.movie;
 
 import java.util.ArrayList;
 import java.util.List;
-
 import org.apache.ignite.ml.genetic.Gene;
 import org.apache.ignite.ml.genetic.IFitnessFunction;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieGAExample.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieGAExample.java
 
b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieGAExample.java
index c52238b..a0b368af 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieGAExample.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieGAExample.java
@@ -20,10 +20,8 @@ package org.apache.ignite.examples.ml.genetic.movie;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.StringTokenizer;
-
 import org.apache.ignite.Ignite;
 import org.apache.ignite.Ignition;
-
 import org.apache.ignite.ml.genetic.Chromosome;
 import org.apache.ignite.ml.genetic.GAGrid;
 import org.apache.ignite.ml.genetic.Gene;

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieTerminateCriteria.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieTerminateCriteria.java
 
b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieTerminateCriteria.java
index ac56cca..43804b7 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieTerminateCriteria.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/genetic/movie/MovieTerminateCriteria.java
@@ -18,10 +18,8 @@
 package org.apache.ignite.examples.ml.genetic.movie;
 
 import java.util.List;
-
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteLogger;
-
 import org.apache.ignite.ml.genetic.Chromosome;
 import org.apache.ignite.ml.genetic.Gene;
 import org.apache.ignite.ml.genetic.parameter.ITerminateCriteria;

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/knn/KNNClassificationExample.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/knn/KNNClassificationExample.java
 
b/examples/src/main/java/org/apache/ignite/examples/ml/knn/KNNClassificationExample.java
index 85e2bec..d12fc1d 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/knn/KNNClassificationExample.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/knn/KNNClassificationExample.java
@@ -30,8 +30,8 @@ import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.ml.knn.classification.KNNClassificationModel;
 import org.apache.ignite.ml.knn.classification.KNNClassificationTrainer;
 import org.apache.ignite.ml.knn.classification.KNNStrategy;
-import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
 import org.apache.ignite.ml.math.distances.EuclideanDistance;
+import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
 import org.apache.ignite.ml.math.primitives.vector.impl.DenseVector;
 import org.apache.ignite.thread.IgniteThread;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/knn/KNNRegressionExample.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/knn/KNNRegressionExample.java
 
b/examples/src/main/java/org/apache/ignite/examples/ml/knn/KNNRegressionExample.java
index 597efe4..d1e5055 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/knn/KNNRegressionExample.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/knn/KNNRegressionExample.java
@@ -31,8 +31,8 @@ import 
org.apache.ignite.ml.knn.classification.KNNClassificationTrainer;
 import org.apache.ignite.ml.knn.classification.KNNStrategy;
 import org.apache.ignite.ml.knn.regression.KNNRegressionModel;
 import org.apache.ignite.ml.knn.regression.KNNRegressionTrainer;
-import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
 import org.apache.ignite.ml.math.distances.ManhattanDistance;
+import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
 import org.apache.ignite.ml.math.primitives.vector.impl.DenseVector;
 import org.apache.ignite.thread.IgniteThread;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/nn/MLPTrainerExample.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/nn/MLPTrainerExample.java
 
b/examples/src/main/java/org/apache/ignite/examples/ml/nn/MLPTrainerExample.java
index 68d793f..7873b12 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/nn/MLPTrainerExample.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/nn/MLPTrainerExample.java
@@ -24,8 +24,8 @@ import 
org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.examples.ExampleNodeStartup;
 import org.apache.ignite.ml.math.primitives.matrix.Matrix;
-import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
 import org.apache.ignite.ml.math.primitives.matrix.impl.DenseMatrix;
+import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
 import org.apache.ignite.ml.nn.Activators;
 import org.apache.ignite.ml.nn.MLPTrainer;
 import org.apache.ignite.ml.nn.MultilayerPerceptron;

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/BinarizationExample.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/BinarizationExample.java
 
b/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/BinarizationExample.java
index 9f2fc8a..4c873d9 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/BinarizationExample.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/BinarizationExample.java
@@ -26,9 +26,9 @@ import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.examples.ml.dataset.model.Person;
 import org.apache.ignite.ml.dataset.DatasetFactory;
 import org.apache.ignite.ml.dataset.primitive.SimpleDataset;
+import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
-import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import org.apache.ignite.ml.preprocessing.binarization.BinarizationTrainer;
 
 /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/ImputingExample.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/ImputingExample.java
 
b/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/ImputingExample.java
index 239e3a7..3ea52d8 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/ImputingExample.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/ImputingExample.java
@@ -26,9 +26,9 @@ import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.examples.ml.dataset.model.Person;
 import org.apache.ignite.ml.dataset.DatasetFactory;
 import org.apache.ignite.ml.dataset.primitive.SimpleDataset;
+import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
-import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import org.apache.ignite.ml.preprocessing.imputing.ImputerTrainer;
 
 /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/ImputingExampleWithMostFrequentValues.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/ImputingExampleWithMostFrequentValues.java
 
b/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/ImputingExampleWithMostFrequentValues.java
index 3348ce0..10344bc 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/ImputingExampleWithMostFrequentValues.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/ImputingExampleWithMostFrequentValues.java
@@ -26,9 +26,9 @@ import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.examples.ml.dataset.model.Person;
 import org.apache.ignite.ml.dataset.DatasetFactory;
 import org.apache.ignite.ml.dataset.primitive.SimpleDataset;
+import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
-import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import org.apache.ignite.ml.preprocessing.imputing.ImputerTrainer;
 import org.apache.ignite.ml.preprocessing.imputing.ImputingStrategy;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/MinMaxScalerExample.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/MinMaxScalerExample.java
 
b/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/MinMaxScalerExample.java
index 37920cf..3f3b0d6 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/MinMaxScalerExample.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/MinMaxScalerExample.java
@@ -26,9 +26,9 @@ import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.examples.ml.dataset.model.Person;
 import org.apache.ignite.ml.dataset.DatasetFactory;
 import org.apache.ignite.ml.dataset.primitive.SimpleDataset;
+import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
-import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import org.apache.ignite.ml.preprocessing.minmaxscaling.MinMaxScalerTrainer;
 
 /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/NormalizationExample.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/NormalizationExample.java
 
b/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/NormalizationExample.java
index e58154a..b8581d0 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/NormalizationExample.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/preprocessing/NormalizationExample.java
@@ -26,9 +26,9 @@ import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.examples.ml.dataset.model.Person;
 import org.apache.ignite.ml.dataset.DatasetFactory;
 import org.apache.ignite.ml.dataset.primitive.SimpleDataset;
+import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
-import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import org.apache.ignite.ml.preprocessing.normalization.NormalizationTrainer;
 
 /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionLSQRTrainerWithMinMaxScalerExample.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionLSQRTrainerWithMinMaxScalerExample.java
 
b/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionLSQRTrainerWithMinMaxScalerExample.java
index fca86b6..03c82ef 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionLSQRTrainerWithMinMaxScalerExample.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/regression/linear/LinearRegressionLSQRTrainerWithMinMaxScalerExample.java
@@ -27,9 +27,9 @@ import 
org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction;
 import org.apache.ignite.cache.query.QueryCursor;
 import org.apache.ignite.cache.query.ScanQuery;
 import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
-import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import 
org.apache.ignite.ml.preprocessing.minmaxscaling.MinMaxScalerPreprocessor;
 import org.apache.ignite.ml.preprocessing.minmaxscaling.MinMaxScalerTrainer;
 import org.apache.ignite.ml.regressions.linear.LinearRegressionLSQRTrainer;

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/regression/logistic/multiclass/LogRegressionMultiClassClassificationExample.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/regression/logistic/multiclass/LogRegressionMultiClassClassificationExample.java
 
b/examples/src/main/java/org/apache/ignite/examples/ml/regression/logistic/multiclass/LogRegressionMultiClassClassificationExample.java
index 362e9b7..351f1c6 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/regression/logistic/multiclass/LogRegressionMultiClassClassificationExample.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/regression/logistic/multiclass/LogRegressionMultiClassClassificationExample.java
@@ -27,9 +27,9 @@ import 
org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction;
 import org.apache.ignite.cache.query.QueryCursor;
 import org.apache.ignite.cache.query.ScanQuery;
 import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
-import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import org.apache.ignite.ml.math.primitives.vector.impl.DenseVector;
 import org.apache.ignite.ml.nn.UpdatesStrategy;
 import 
org.apache.ignite.ml.optimization.updatecalculators.SimpleGDParameterUpdate;

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/svm/multiclass/SVMMultiClassClassificationExample.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/svm/multiclass/SVMMultiClassClassificationExample.java
 
b/examples/src/main/java/org/apache/ignite/examples/ml/svm/multiclass/SVMMultiClassClassificationExample.java
index b835a5f..b9e24c0 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/svm/multiclass/SVMMultiClassClassificationExample.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/svm/multiclass/SVMMultiClassClassificationExample.java
@@ -27,9 +27,9 @@ import 
org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction;
 import org.apache.ignite.cache.query.QueryCursor;
 import org.apache.ignite.cache.query.ScanQuery;
 import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
-import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import org.apache.ignite.ml.math.primitives.vector.impl.DenseVector;
 import org.apache.ignite.ml.preprocessing.minmaxscaling.MinMaxScalerTrainer;
 import org.apache.ignite.ml.svm.SVMLinearMultiClassClassificationModel;

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/tree/randomforest/RandomForestRegressionExample.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/tree/randomforest/RandomForestRegressionExample.java
 
b/examples/src/main/java/org/apache/ignite/examples/ml/tree/randomforest/RandomForestRegressionExample.java
index 4704268..c803354 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/tree/randomforest/RandomForestRegressionExample.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/tree/randomforest/RandomForestRegressionExample.java
@@ -28,6 +28,10 @@ import org.apache.ignite.cache.query.QueryCursor;
 import org.apache.ignite.cache.query.ScanQuery;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.ml.composition.ModelsComposition;
+import org.apache.ignite.ml.environment.LearningEnvironment;
+import org.apache.ignite.ml.environment.logging.ConsoleLogger;
+import org.apache.ignite.ml.environment.logging.MLLogger;
+import org.apache.ignite.ml.environment.parallelism.ParallelismStrategy;
 import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
 import org.apache.ignite.ml.tree.randomforest.RandomForestRegressionTrainer;
 import org.apache.ignite.ml.tree.randomforest.RandomForestTrainer;
@@ -35,11 +39,12 @@ import org.apache.ignite.thread.IgniteThread;
 
 /**
  * Example represents a solution for the task of price predictions for houses 
in Boston based on RandomForest
- * implementation for regression. It shows an initialization of {@link 
RandomForestTrainer},
- * +initialization of Ignite Cache, learning step and evaluation of model 
quality in terms of
- * Mean Squared Error (MSE) and Mean Absolute Error (MAE).
+ * implementation for regression. It shows an initialization of {@link 
RandomForestTrainer}, +initialization of Ignite
+ * Cache, learning step and evaluation of model quality in terms of Mean 
Squared Error (MSE) and Mean Absolute Error
+ * (MAE).
  *
  * Dataset url: 
https://archive.ics.uci.edu/ml/machine-learning-databases/housing/
+ *
  * @see RandomForestRegressionTrainer
  */
 public class RandomForestRegressionExample {
@@ -54,10 +59,15 @@ public class RandomForestRegressionExample {
             System.out.println(">>> Ignite grid started.");
 
             IgniteThread igniteThread = new 
IgniteThread(ignite.configuration().getIgniteInstanceName(),
-                    RandomForestRegressionExample.class.getSimpleName(), () -> 
{
+                RandomForestRegressionExample.class.getSimpleName(), () -> {
                 IgniteCache<Integer, double[]> dataCache = 
getTestCache(ignite);
 
                 RandomForestRegressionTrainer trainer = new 
RandomForestRegressionTrainer(13, 4, 101, 0.3, 2, 0);
+                trainer.setEnvironment(LearningEnvironment.builder()
+                    
.withParallelismStrategy(ParallelismStrategy.Type.ON_DEFAULT_POOL)
+                    
.withLoggingFactory(ConsoleLogger.factory(MLLogger.VerboseLevel.LOW))
+                    .build()
+                );
 
                 ModelsComposition randomForest = trainer.fit(ignite, dataCache,
                         (k, v) -> VectorUtils.of(Arrays.copyOfRange(v, 0, 
v.length - 1)),

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_1_Read_and_Learn.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_1_Read_and_Learn.java
 
b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_1_Read_and_Learn.java
index 3910edb..460ca67 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_1_Read_and_Learn.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_1_Read_and_Learn.java
@@ -21,9 +21,9 @@ import java.io.FileNotFoundException;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
+import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
-import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
 import org.apache.ignite.ml.selection.scoring.metric.Accuracy;
 import org.apache.ignite.ml.tree.DecisionTreeClassificationTrainer;

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_2_Imputing.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_2_Imputing.java
 
b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_2_Imputing.java
index 52dc434..8127a51 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_2_Imputing.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_2_Imputing.java
@@ -21,9 +21,9 @@ import java.io.FileNotFoundException;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
+import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
-import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import org.apache.ignite.ml.preprocessing.imputing.ImputerTrainer;
 import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;
 import org.apache.ignite.ml.selection.scoring.metric.Accuracy;

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_3_Categorial.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_3_Categorial.java
 
b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_3_Categorial.java
index 7eb3d3b..ee2ef8b 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_3_Categorial.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_3_Categorial.java
@@ -21,8 +21,8 @@ import java.io.FileNotFoundException;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
-import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.math.functions.IgniteBiFunction;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
 import 
org.apache.ignite.ml.preprocessing.encoding.stringencoder.StringEncoderTrainer;
 import org.apache.ignite.ml.preprocessing.imputing.ImputerTrainer;
 import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_4_Add_age_fare.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_4_Add_age_fare.java
 
b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_4_Add_age_fare.java
index 67615dd..c3bf389 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_4_Add_age_fare.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_4_Add_age_fare.java
@@ -21,8 +21,8 @@ import java.io.FileNotFoundException;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
-import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.math.functions.IgniteBiFunction;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
 import 
org.apache.ignite.ml.preprocessing.encoding.stringencoder.StringEncoderTrainer;
 import org.apache.ignite.ml.preprocessing.imputing.ImputerTrainer;
 import org.apache.ignite.ml.selection.scoring.evaluator.Evaluator;

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_5_Scaling.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_5_Scaling.java
 
b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_5_Scaling.java
index 88a38ef..549ab77 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_5_Scaling.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_5_Scaling.java
@@ -21,8 +21,8 @@ import java.io.FileNotFoundException;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
-import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.math.functions.IgniteBiFunction;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
 import 
org.apache.ignite.ml.preprocessing.encoding.stringencoder.StringEncoderTrainer;
 import org.apache.ignite.ml.preprocessing.imputing.ImputerTrainer;
 import org.apache.ignite.ml.preprocessing.minmaxscaling.MinMaxScalerTrainer;

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_6_KNN.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_6_KNN.java 
b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_6_KNN.java
index 42a531b..5308287 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_6_KNN.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_6_KNN.java
@@ -24,8 +24,8 @@ import org.apache.ignite.Ignition;
 import org.apache.ignite.ml.knn.classification.KNNClassificationModel;
 import org.apache.ignite.ml.knn.classification.KNNClassificationTrainer;
 import org.apache.ignite.ml.knn.classification.KNNStrategy;
-import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.math.functions.IgniteBiFunction;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
 import 
org.apache.ignite.ml.preprocessing.encoding.stringencoder.StringEncoderTrainer;
 import org.apache.ignite.ml.preprocessing.imputing.ImputerTrainer;
 import org.apache.ignite.ml.preprocessing.minmaxscaling.MinMaxScalerTrainer;

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_7_Split_train_test.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_7_Split_train_test.java
 
b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_7_Split_train_test.java
index 3a882e0..c8fad61 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_7_Split_train_test.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_7_Split_train_test.java
@@ -21,8 +21,8 @@ import java.io.FileNotFoundException;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
-import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.math.functions.IgniteBiFunction;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
 import 
org.apache.ignite.ml.preprocessing.encoding.stringencoder.StringEncoderTrainer;
 import org.apache.ignite.ml.preprocessing.imputing.ImputerTrainer;
 import org.apache.ignite.ml.preprocessing.minmaxscaling.MinMaxScalerTrainer;

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_8_CV.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_8_CV.java 
b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_8_CV.java
index 077d8c8..981e119 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_8_CV.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_8_CV.java
@@ -22,8 +22,8 @@ import java.util.Arrays;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
-import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.math.functions.IgniteBiFunction;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
 import 
org.apache.ignite.ml.preprocessing.encoding.stringencoder.StringEncoderTrainer;
 import org.apache.ignite.ml.preprocessing.imputing.ImputerTrainer;
 import org.apache.ignite.ml.preprocessing.minmaxscaling.MinMaxScalerTrainer;

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_9_Go_to_LogReg.java
----------------------------------------------------------------------
diff --git 
a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_9_Go_to_LogReg.java
 
b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_9_Go_to_LogReg.java
index 701039a..88b642b 100644
--- 
a/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_9_Go_to_LogReg.java
+++ 
b/examples/src/main/java/org/apache/ignite/examples/ml/tutorial/Step_9_Go_to_LogReg.java
@@ -22,8 +22,8 @@ import java.util.Arrays;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
-import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.math.functions.IgniteBiFunction;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.nn.UpdatesStrategy;
 import 
org.apache.ignite.ml.optimization.updatecalculators.SimpleGDParameterUpdate;
 import 
org.apache.ignite.ml.optimization.updatecalculators.SimpleGDUpdateCalculator;

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/modules/ml/src/main/java/org/apache/ignite/ml/Model.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/Model.java 
b/modules/ml/src/main/java/org/apache/ignite/ml/Model.java
index 41b10b9..a042666 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/Model.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/Model.java
@@ -32,4 +32,11 @@ public interface Model<T, V> extends IgniteFunction<T, V> {
     public default <X, W> Model<T, X> combine(Model<T, W> other, BiFunction<V, 
W, X> combiner) {
         return v -> combiner.apply(apply(v), other.apply(v));
     }
+
+    /**
+     * @param pretty Use pretty mode.
+     */
+    default public String toString(boolean pretty) {
+        return getClass().getSimpleName();
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/modules/ml/src/main/java/org/apache/ignite/ml/clustering/kmeans/KMeansModel.java
----------------------------------------------------------------------
diff --git 
a/modules/ml/src/main/java/org/apache/ignite/ml/clustering/kmeans/KMeansModel.java
 
b/modules/ml/src/main/java/org/apache/ignite/ml/clustering/kmeans/KMeansModel.java
index 6c09f9d..bdfa1b6 100644
--- 
a/modules/ml/src/main/java/org/apache/ignite/ml/clustering/kmeans/KMeansModel.java
+++ 
b/modules/ml/src/main/java/org/apache/ignite/ml/clustering/kmeans/KMeansModel.java
@@ -18,10 +18,14 @@
 package org.apache.ignite.ml.clustering.kmeans;
 
 import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
 import org.apache.ignite.ml.Exportable;
 import org.apache.ignite.ml.Exporter;
-import org.apache.ignite.ml.math.primitives.vector.Vector;
+import org.apache.ignite.ml.math.Tracer;
 import org.apache.ignite.ml.math.distances.DistanceMeasure;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
+import org.apache.ignite.ml.util.ModelTrace;
 
 /**
  * This class encapsulates result of clusterization by KMeans algorithm.
@@ -109,4 +113,20 @@ public class KMeansModel implements 
ClusterizationModel<Vector, Integer>, Export
         return distanceMeasure.equals(that.distanceMeasure) && 
Arrays.deepEquals(centers, that.centers);
     }
 
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return toString(false);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString(boolean pretty) {
+        String measureName = distanceMeasure.getClass().getSimpleName();
+        List<String> centersList = Arrays.stream(centers).map(x -> 
Tracer.asAscii(x, "%.4f", false))
+            .collect(Collectors.toList());
+
+        return ModelTrace.builder("KMeansModel", pretty)
+            .addField("distance measure", measureName)
+            .addField("centroids", centersList)
+            .toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/modules/ml/src/main/java/org/apache/ignite/ml/clustering/kmeans/KMeansModelFormat.java
----------------------------------------------------------------------
diff --git 
a/modules/ml/src/main/java/org/apache/ignite/ml/clustering/kmeans/KMeansModelFormat.java
 
b/modules/ml/src/main/java/org/apache/ignite/ml/clustering/kmeans/KMeansModelFormat.java
index a0f6cc7..549b9fe 100644
--- 
a/modules/ml/src/main/java/org/apache/ignite/ml/clustering/kmeans/KMeansModelFormat.java
+++ 
b/modules/ml/src/main/java/org/apache/ignite/ml/clustering/kmeans/KMeansModelFormat.java
@@ -21,8 +21,8 @@ import java.io.Serializable;
 import java.util.Arrays;
 import org.apache.ignite.ml.Exportable;
 import org.apache.ignite.ml.Exporter;
-import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.math.distances.DistanceMeasure;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
 
 /**
  * K-means model representation.

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/modules/ml/src/main/java/org/apache/ignite/ml/clustering/kmeans/KMeansTrainer.java
----------------------------------------------------------------------
diff --git 
a/modules/ml/src/main/java/org/apache/ignite/ml/clustering/kmeans/KMeansTrainer.java
 
b/modules/ml/src/main/java/org/apache/ignite/ml/clustering/kmeans/KMeansTrainer.java
index b26ff68..7dbc78a 100644
--- 
a/modules/ml/src/main/java/org/apache/ignite/ml/clustering/kmeans/KMeansTrainer.java
+++ 
b/modules/ml/src/main/java/org/apache/ignite/ml/clustering/kmeans/KMeansTrainer.java
@@ -28,11 +28,11 @@ import org.apache.ignite.ml.dataset.Dataset;
 import org.apache.ignite.ml.dataset.DatasetBuilder;
 import org.apache.ignite.ml.dataset.PartitionDataBuilder;
 import org.apache.ignite.ml.dataset.primitive.context.EmptyContext;
-import org.apache.ignite.ml.math.primitives.vector.Vector;
-import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
 import org.apache.ignite.ml.math.distances.DistanceMeasure;
 import org.apache.ignite.ml.math.distances.EuclideanDistance;
 import org.apache.ignite.ml.math.functions.IgniteBiFunction;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
+import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
 import org.apache.ignite.ml.math.primitives.vector.impl.DenseVector;
 import org.apache.ignite.ml.math.util.MapUtil;
 import org.apache.ignite.ml.structures.LabeledDataset;
@@ -43,7 +43,7 @@ import 
org.apache.ignite.ml.trainers.SingleLabelDatasetTrainer;
 /**
  * The trainer for KMeans algorithm.
  */
-public class KMeansTrainer implements SingleLabelDatasetTrainer<KMeansModel> {
+public class KMeansTrainer extends SingleLabelDatasetTrainer<KMeansModel> {
     /** Amount of clusters. */
     private int k = 2;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/modules/ml/src/main/java/org/apache/ignite/ml/composition/BaggingModelTrainer.java
----------------------------------------------------------------------
diff --git 
a/modules/ml/src/main/java/org/apache/ignite/ml/composition/BaggingModelTrainer.java
 
b/modules/ml/src/main/java/org/apache/ignite/ml/composition/BaggingModelTrainer.java
index d73bd4e..f439789 100644
--- 
a/modules/ml/src/main/java/org/apache/ignite/ml/composition/BaggingModelTrainer.java
+++ 
b/modules/ml/src/main/java/org/apache/ignite/ml/composition/BaggingModelTrainer.java
@@ -22,25 +22,28 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Random;
+import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 import org.apache.ignite.ml.Model;
 import 
org.apache.ignite.ml.composition.predictionsaggregator.PredictionsAggregator;
 import org.apache.ignite.ml.dataset.DatasetBuilder;
-import org.apache.ignite.ml.math.primitives.vector.Vector;
-import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
+import org.apache.ignite.ml.environment.logging.MLLogger;
+import org.apache.ignite.ml.environment.parallelism.Promise;
 import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import org.apache.ignite.ml.math.functions.IgniteFunction;
+import org.apache.ignite.ml.math.functions.IgniteSupplier;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
+import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
 import org.apache.ignite.ml.selection.split.mapper.SHA256UniformMapper;
 import org.apache.ignite.ml.trainers.DatasetTrainer;
 import org.apache.ignite.ml.util.Utils;
 import org.jetbrains.annotations.NotNull;
 
 /**
- * Abstract trainer implementing bagging logic.
- * In each learning iteration the algorithm trains one model on subset of 
learning sample and
- * subspace of features space. Each model is produced from same model-class 
[e.g. Decision Trees].
+ * Abstract trainer implementing bagging logic. In each learning iteration the 
algorithm trains one model on subset of
+ * learning sample and subspace of features space. Each model is produced from 
same model-class [e.g. Decision Trees].
  */
-public abstract class BaggingModelTrainer implements 
DatasetTrainer<ModelsComposition, Double> {
+public abstract class BaggingModelTrainer extends 
DatasetTrainer<ModelsComposition, Double> {
     /**
      * Predictions aggregator.
      */
@@ -89,11 +92,23 @@ public abstract class BaggingModelTrainer implements 
DatasetTrainer<ModelsCompos
         IgniteBiFunction<K, V, Vector> featureExtractor,
         IgniteBiFunction<K, V, Double> lbExtractor) {
 
-        List<ModelOnFeaturesSubspace> learnedModels = new ArrayList<>();
-        for (int i = 0; i < ensembleSize; i++)
-            learnedModels.add(learnModel(datasetBuilder, featureExtractor, 
lbExtractor));
+        MLLogger log = environment.logger(getClass());
+        log.log(MLLogger.VerboseLevel.LOW, "Start learning");
+
+        Long startTs = System.currentTimeMillis();
+
+        List<IgniteSupplier<ModelOnFeaturesSubspace>> tasks = new 
ArrayList<>();
+        for(int i = 0; i < ensembleSize; i++)
+            tasks.add(() -> learnModel(datasetBuilder, featureExtractor, 
lbExtractor));
+
+        List<Model<Vector, Double>> models = 
environment.parallelismStrategy().submit(tasks)
+            .stream().map(Promise::unsafeGet)
+            .collect(Collectors.toList());
 
-        return new ModelsComposition(learnedModels, predictionsAggregator);
+        double learningTime = (double)(System.currentTimeMillis() - startTs) / 
1000.0;
+        log.log(MLLogger.VerboseLevel.LOW, "The training time was %.2fs", 
learningTime);
+        log.log(MLLogger.VerboseLevel.LOW, "Learning finished");
+        return new ModelsComposition(models, predictionsAggregator);
     }
 
     /**
@@ -114,10 +129,13 @@ public abstract class BaggingModelTrainer implements 
DatasetTrainer<ModelsCompos
         Map<Integer, Integer> featuresMapping = 
createFeaturesMapping(featureExtractorSeed, featureVectorSize);
 
         //TODO: IGNITE-8867 Need to implement bootstrapping algorithm
+        Long startTs = System.currentTimeMillis();
         Model<Vector, Double> mdl = buildDatasetTrainerForModel().fit(
             datasetBuilder.withFilter((features, answer) -> 
sampleFilter.map(features, answer) < samplePartSizePerMdl),
             wrapFeatureExtractor(featureExtractor, featuresMapping),
             lbExtractor);
+        double learningTime = (double)(System.currentTimeMillis() - startTs) / 
1000.0;
+        environment.logger(getClass()).log(MLLogger.VerboseLevel.HIGH, "One 
model training time was %.2fs", learningTime);
 
         return new ModelOnFeaturesSubspace(featuresMapping, mdl);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/modules/ml/src/main/java/org/apache/ignite/ml/composition/ModelOnFeaturesSubspace.java
----------------------------------------------------------------------
diff --git 
a/modules/ml/src/main/java/org/apache/ignite/ml/composition/ModelOnFeaturesSubspace.java
 
b/modules/ml/src/main/java/org/apache/ignite/ml/composition/ModelOnFeaturesSubspace.java
index 5877afa..5ef1de5 100644
--- 
a/modules/ml/src/main/java/org/apache/ignite/ml/composition/ModelOnFeaturesSubspace.java
+++ 
b/modules/ml/src/main/java/org/apache/ignite/ml/composition/ModelOnFeaturesSubspace.java
@@ -19,9 +19,11 @@ package org.apache.ignite.ml.composition;
 
 import java.util.Collections;
 import java.util.Map;
+import java.util.stream.Collectors;
 import org.apache.ignite.ml.Model;
 import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.math.primitives.vector.VectorUtils;
+import org.apache.ignite.ml.util.ModelTrace;
 
 /**
  * Model trained on a features subspace with mapping from original features 
space to subspace.
@@ -72,4 +74,21 @@ public class ModelOnFeaturesSubspace implements 
Model<Vector, Double> {
     public Model<Vector, Double> getMdl() {
         return mdl;
     }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return toString(false);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString(boolean pretty) {
+        String mappingStr = featuresMapping.entrySet().stream()
+            .map(e -> String.format("%d -> %d", e.getKey(), e.getValue()))
+            .collect(Collectors.joining(", ", "{", "}"));
+
+        return ModelTrace.builder("ModelOnFeatureSubspace", pretty)
+            .addField("features mapping", mappingStr)
+            .addField("model", mdl.toString(false))
+            .toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/modules/ml/src/main/java/org/apache/ignite/ml/composition/ModelsComposition.java
----------------------------------------------------------------------
diff --git 
a/modules/ml/src/main/java/org/apache/ignite/ml/composition/ModelsComposition.java
 
b/modules/ml/src/main/java/org/apache/ignite/ml/composition/ModelsComposition.java
index 661c941..e14fa6d 100644
--- 
a/modules/ml/src/main/java/org/apache/ignite/ml/composition/ModelsComposition.java
+++ 
b/modules/ml/src/main/java/org/apache/ignite/ml/composition/ModelsComposition.java
@@ -22,6 +22,7 @@ import java.util.List;
 import org.apache.ignite.ml.Model;
 import 
org.apache.ignite.ml.composition.predictionsaggregator.PredictionsAggregator;
 import org.apache.ignite.ml.math.primitives.vector.Vector;
+import org.apache.ignite.ml.util.ModelTrace;
 
 /**
  * Model consisting of several models and prediction aggregation strategy.
@@ -75,4 +76,17 @@ public class ModelsComposition implements Model<Vector, 
Double> {
     public List<Model<Vector, Double>> getModels() {
         return models;
     }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return toString(false);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString(boolean pretty) {
+        return ModelTrace.builder("Models composition", pretty)
+            .addField("aggregator", predictionsAggregator.toString(pretty))
+            .addField("models", models)
+            .toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/modules/ml/src/main/java/org/apache/ignite/ml/composition/boosting/GDBBinaryClassifierTrainer.java
----------------------------------------------------------------------
diff --git 
a/modules/ml/src/main/java/org/apache/ignite/ml/composition/boosting/GDBBinaryClassifierTrainer.java
 
b/modules/ml/src/main/java/org/apache/ignite/ml/composition/boosting/GDBBinaryClassifierTrainer.java
index 25ae2375..53a6219 100644
--- 
a/modules/ml/src/main/java/org/apache/ignite/ml/composition/boosting/GDBBinaryClassifierTrainer.java
+++ 
b/modules/ml/src/main/java/org/apache/ignite/ml/composition/boosting/GDBBinaryClassifierTrainer.java
@@ -25,10 +25,10 @@ import java.util.stream.Collectors;
 import org.apache.ignite.internal.util.typedef.internal.A;
 import org.apache.ignite.ml.dataset.DatasetBuilder;
 import 
org.apache.ignite.ml.dataset.primitive.builder.context.EmptyContextBuilder;
-import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import org.apache.ignite.ml.math.functions.IgniteFunction;
 import org.apache.ignite.ml.math.functions.IgniteTriFunction;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.structures.LabeledDataset;
 import org.apache.ignite.ml.structures.LabeledVector;
 import 
org.apache.ignite.ml.structures.partition.LabeledDatasetPartitionDataBuilderOnHeap;

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/modules/ml/src/main/java/org/apache/ignite/ml/composition/boosting/GDBRegressionTrainer.java
----------------------------------------------------------------------
diff --git 
a/modules/ml/src/main/java/org/apache/ignite/ml/composition/boosting/GDBRegressionTrainer.java
 
b/modules/ml/src/main/java/org/apache/ignite/ml/composition/boosting/GDBRegressionTrainer.java
index 2c8caba..201586e 100644
--- 
a/modules/ml/src/main/java/org/apache/ignite/ml/composition/boosting/GDBRegressionTrainer.java
+++ 
b/modules/ml/src/main/java/org/apache/ignite/ml/composition/boosting/GDBRegressionTrainer.java
@@ -18,8 +18,8 @@
 package org.apache.ignite.ml.composition.boosting;
 
 import org.apache.ignite.ml.dataset.DatasetBuilder;
-import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.math.functions.IgniteBiFunction;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
 
 /**
  * Trainer for regressor using Gradient Boosting.

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/modules/ml/src/main/java/org/apache/ignite/ml/composition/boosting/GDBTrainer.java
----------------------------------------------------------------------
diff --git 
a/modules/ml/src/main/java/org/apache/ignite/ml/composition/boosting/GDBTrainer.java
 
b/modules/ml/src/main/java/org/apache/ignite/ml/composition/boosting/GDBTrainer.java
index 8bdb9b8..6726892 100644
--- 
a/modules/ml/src/main/java/org/apache/ignite/ml/composition/boosting/GDBTrainer.java
+++ 
b/modules/ml/src/main/java/org/apache/ignite/ml/composition/boosting/GDBTrainer.java
@@ -28,10 +28,11 @@ import org.apache.ignite.ml.dataset.Dataset;
 import org.apache.ignite.ml.dataset.DatasetBuilder;
 import 
org.apache.ignite.ml.dataset.primitive.builder.context.EmptyContextBuilder;
 import org.apache.ignite.ml.dataset.primitive.context.EmptyContext;
+import org.apache.ignite.ml.environment.logging.MLLogger;
 import org.apache.ignite.ml.knn.regression.KNNRegressionTrainer;
-import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import org.apache.ignite.ml.math.functions.IgniteTriFunction;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.regressions.linear.LinearRegressionLSQRTrainer;
 import org.apache.ignite.ml.regressions.linear.LinearRegressionSGDTrainer;
 import org.apache.ignite.ml.trainers.DatasetTrainer;
@@ -42,26 +43,25 @@ import 
org.apache.ignite.ml.tree.randomforest.RandomForestRegressionTrainer;
 import org.jetbrains.annotations.NotNull;
 
 /**
- * Abstract Gradient Boosting trainer.
- * It implements gradient descent in functional space using user-selected 
regressor in child class.
- * Each learning iteration the trainer evaluate gradient of error-function and 
fit regression model
- * to it. After learning step the model is used in models composition of 
regressions with weight
- * equal to gradient descent step.
+ * Abstract Gradient Boosting trainer. It implements gradient descent in 
functional space using user-selected regressor
+ * in child class. Each learning iteration the trainer evaluate gradient of 
error-function and fit regression model to
+ * it. After learning step the model is used in models composition of 
regressions with weight equal to gradient descent
+ * step.
  *
- * These classes can be used as regressor trainers:
- * {@link DecisionTreeRegressionTrainer}, {@link KNNRegressionTrainer},
- * {@link LinearRegressionLSQRTrainer}, {@link RandomForestRegressionTrainer},
- * {@link LinearRegressionSGDTrainer}.
+ * These classes can be used as regressor trainers: {@link 
DecisionTreeRegressionTrainer}, {@link KNNRegressionTrainer},
+ * {@link LinearRegressionLSQRTrainer}, {@link RandomForestRegressionTrainer}, 
{@link LinearRegressionSGDTrainer}.
  *
  * But in practice Decision Trees is most used regressors (see: {@link 
DecisionTreeRegressionTrainer}).
  */
-abstract class GDBTrainer implements DatasetTrainer<Model<Vector, Double>, 
Double> {
+abstract class GDBTrainer extends DatasetTrainer<Model<Vector, Double>, 
Double> {
     /** Gradient step. */
     private final double gradientStep;
     /** Count of iterations. */
     private final int cntOfIterations;
-    /** Gradient of loss function. First argument is sample size, second 
argument is valid answer,
-     * third argument is current model prediction. */
+    /**
+     * Gradient of loss function. First argument is sample size, second 
argument is valid answer, third argument is
+     * current model prediction.
+     */
     private final IgniteTriFunction<Long, Double, Double, Double> lossGradient;
 
     /**
@@ -69,9 +69,11 @@ abstract class GDBTrainer implements 
DatasetTrainer<Model<Vector, Double>, Doubl
      *
      * @param gradStepSize Grad step size.
      * @param cntOfIterations Count of learning iterations.
-     * @param lossGradient Gradient of loss function. First argument is sample 
size, second argument is valid answer third argument is current model 
prediction.
+     * @param lossGradient Gradient of loss function. First argument is sample 
size, second argument is valid answer
+     * third argument is current model prediction.
      */
-    public GDBTrainer(double gradStepSize, Integer cntOfIterations, 
IgniteTriFunction<Long, Double, Double, Double> lossGradient) {
+    public GDBTrainer(double gradStepSize, Integer cntOfIterations,
+        IgniteTriFunction<Long, Double, Double, Double> lossGradient) {
         gradientStep = gradStepSize;
         this.cntOfIterations = cntOfIterations;
         this.lossGradient = lossGradient;
@@ -94,6 +96,7 @@ abstract class GDBTrainer implements 
DatasetTrainer<Model<Vector, Double>, Doubl
         Arrays.fill(compositionWeights, gradientStep);
         WeightedPredictionsAggregator resAggregator = new 
WeightedPredictionsAggregator(compositionWeights, mean);
 
+        long learningStartTs = System.currentTimeMillis();
         for (int i = 0; i < cntOfIterations; i++) {
             double[] weights = Arrays.copyOf(compositionWeights, i);
             WeightedPredictionsAggregator aggregator = new 
WeightedPredictionsAggregator(weights, mean);
@@ -105,8 +108,13 @@ abstract class GDBTrainer implements 
DatasetTrainer<Model<Vector, Double>, Doubl
                 return -lossGradient.apply(sampleSize, realAnswer, mdlAnswer);
             };
 
+            long startTs = System.currentTimeMillis();
             models.add(buildBaseModelTrainer().fit(datasetBuilder, 
featureExtractor, lbExtractorWrap));
+            double learningTime = (double)(System.currentTimeMillis() - 
startTs) / 1000.0;
+            environment.logger(getClass()).log(MLLogger.VerboseLevel.LOW, "One 
model training time was %.2fs", learningTime);
         }
+        double learningTime = (double)(System.currentTimeMillis() - 
learningStartTs) / 1000.0;
+        environment.logger(getClass()).log(MLLogger.VerboseLevel.LOW, "The 
training time was %.2fs", learningTime);
 
         return new ModelsComposition(models, resAggregator) {
             @Override public Double apply(Vector features) {
@@ -122,7 +130,7 @@ abstract class GDBTrainer implements 
DatasetTrainer<Model<Vector, Double>, Doubl
      * @param featureExtractor Feature extractor.
      * @param lExtractor Labels extractor.
      */
-    protected abstract  <V, K> void learnLabels(DatasetBuilder<K, V> builder,
+    protected abstract <V, K> void learnLabels(DatasetBuilder<K, V> builder,
         IgniteBiFunction<K, V, Vector> featureExtractor, IgniteBiFunction<K, 
V, Double> lExtractor);
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/modules/ml/src/main/java/org/apache/ignite/ml/composition/predictionsaggregator/PredictionsAggregator.java
----------------------------------------------------------------------
diff --git 
a/modules/ml/src/main/java/org/apache/ignite/ml/composition/predictionsaggregator/PredictionsAggregator.java
 
b/modules/ml/src/main/java/org/apache/ignite/ml/composition/predictionsaggregator/PredictionsAggregator.java
index 86b1e96..d996a2a 100644
--- 
a/modules/ml/src/main/java/org/apache/ignite/ml/composition/predictionsaggregator/PredictionsAggregator.java
+++ 
b/modules/ml/src/main/java/org/apache/ignite/ml/composition/predictionsaggregator/PredictionsAggregator.java
@@ -23,4 +23,12 @@ import org.apache.ignite.ml.math.functions.IgniteFunction;
  * Predictions aggregator interface.
  */
 public interface PredictionsAggregator extends IgniteFunction<double[], 
Double> {
+    /**
+     * Represents aggregator as String.
+     *
+     * @param pretty Use pretty mode.
+     */
+    public default String toString(boolean pretty) {
+        return getClass().getSimpleName();
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/modules/ml/src/main/java/org/apache/ignite/ml/composition/predictionsaggregator/WeightedPredictionsAggregator.java
----------------------------------------------------------------------
diff --git 
a/modules/ml/src/main/java/org/apache/ignite/ml/composition/predictionsaggregator/WeightedPredictionsAggregator.java
 
b/modules/ml/src/main/java/org/apache/ignite/ml/composition/predictionsaggregator/WeightedPredictionsAggregator.java
index f6bbe9c..c37fdf7 100644
--- 
a/modules/ml/src/main/java/org/apache/ignite/ml/composition/predictionsaggregator/WeightedPredictionsAggregator.java
+++ 
b/modules/ml/src/main/java/org/apache/ignite/ml/composition/predictionsaggregator/WeightedPredictionsAggregator.java
@@ -62,4 +62,28 @@ public class WeightedPredictionsAggregator implements 
PredictionsAggregator {
 
         return res;
     }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return toString(false);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString(boolean pretty) {
+        String clsName = getClass().getSimpleName();
+        if(!pretty)
+            return clsName;
+
+        StringBuilder builder = new StringBuilder(clsName).append(" [");
+        for(int i = 0; i < weights.length; i++) {
+            final String SIGN = weights[i] > 0 ? " + " : " - ";
+            builder
+                .append(i > 0 || weights[i] < 0 ? SIGN : "")
+                .append(String.format("%.4f", Math.abs(weights[i])))
+                .append("*x").append(i);
+        }
+
+        return builder.append(bias > 0 ? " + " : " - 
").append(String.format("%.4f", bias))
+            .append("]").toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/modules/ml/src/main/java/org/apache/ignite/ml/dataset/DatasetFactory.java
----------------------------------------------------------------------
diff --git 
a/modules/ml/src/main/java/org/apache/ignite/ml/dataset/DatasetFactory.java 
b/modules/ml/src/main/java/org/apache/ignite/ml/dataset/DatasetFactory.java
index 75ac6d3..ffd3136 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/dataset/DatasetFactory.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/dataset/DatasetFactory.java
@@ -31,8 +31,8 @@ import 
org.apache.ignite.ml.dataset.primitive.builder.data.SimpleLabeledDatasetD
 import org.apache.ignite.ml.dataset.primitive.context.EmptyContext;
 import org.apache.ignite.ml.dataset.primitive.data.SimpleDatasetData;
 import org.apache.ignite.ml.dataset.primitive.data.SimpleLabeledDatasetData;
-import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.math.functions.IgniteBiFunction;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
 
 /**
  * Factory providing a client facing API that allows to construct basic and 
the most frequently used types of dataset.

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/modules/ml/src/main/java/org/apache/ignite/ml/dataset/primitive/builder/data/SimpleDatasetDataBuilder.java
----------------------------------------------------------------------
diff --git 
a/modules/ml/src/main/java/org/apache/ignite/ml/dataset/primitive/builder/data/SimpleDatasetDataBuilder.java
 
b/modules/ml/src/main/java/org/apache/ignite/ml/dataset/primitive/builder/data/SimpleDatasetDataBuilder.java
index e2f98c2..cf5bc7a 100644
--- 
a/modules/ml/src/main/java/org/apache/ignite/ml/dataset/primitive/builder/data/SimpleDatasetDataBuilder.java
+++ 
b/modules/ml/src/main/java/org/apache/ignite/ml/dataset/primitive/builder/data/SimpleDatasetDataBuilder.java
@@ -22,8 +22,8 @@ import java.util.Iterator;
 import org.apache.ignite.ml.dataset.PartitionDataBuilder;
 import org.apache.ignite.ml.dataset.UpstreamEntry;
 import org.apache.ignite.ml.dataset.primitive.data.SimpleDatasetData;
-import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.math.functions.IgniteBiFunction;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
 
 /**
  * A partition {@code data} builder that makes {@link SimpleDatasetData}.

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/modules/ml/src/main/java/org/apache/ignite/ml/dataset/primitive/builder/data/SimpleLabeledDatasetDataBuilder.java
----------------------------------------------------------------------
diff --git 
a/modules/ml/src/main/java/org/apache/ignite/ml/dataset/primitive/builder/data/SimpleLabeledDatasetDataBuilder.java
 
b/modules/ml/src/main/java/org/apache/ignite/ml/dataset/primitive/builder/data/SimpleLabeledDatasetDataBuilder.java
index 1bfd949..6286255 100644
--- 
a/modules/ml/src/main/java/org/apache/ignite/ml/dataset/primitive/builder/data/SimpleLabeledDatasetDataBuilder.java
+++ 
b/modules/ml/src/main/java/org/apache/ignite/ml/dataset/primitive/builder/data/SimpleLabeledDatasetDataBuilder.java
@@ -22,8 +22,8 @@ import java.util.Iterator;
 import org.apache.ignite.ml.dataset.PartitionDataBuilder;
 import org.apache.ignite.ml.dataset.UpstreamEntry;
 import org.apache.ignite.ml.dataset.primitive.data.SimpleLabeledDatasetData;
-import org.apache.ignite.ml.math.primitives.vector.Vector;
 import org.apache.ignite.ml.math.functions.IgniteBiFunction;
+import org.apache.ignite.ml.math.primitives.vector.Vector;
 
 /**
  * A partition {@code data} builder that makes {@link 
SimpleLabeledDatasetData}.

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/modules/ml/src/main/java/org/apache/ignite/ml/environment/LearningEnvironment.java
----------------------------------------------------------------------
diff --git 
a/modules/ml/src/main/java/org/apache/ignite/ml/environment/LearningEnvironment.java
 
b/modules/ml/src/main/java/org/apache/ignite/ml/environment/LearningEnvironment.java
new file mode 100644
index 0000000..2b94a2f
--- /dev/null
+++ 
b/modules/ml/src/main/java/org/apache/ignite/ml/environment/LearningEnvironment.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.ml.environment;
+
+import org.apache.ignite.ml.environment.logging.MLLogger;
+import org.apache.ignite.ml.environment.parallelism.ParallelismStrategy;
+
+/**
+ * Specifies a set of utility-objects helpful at runtime but optional for 
learning algorithm
+ * (like thread pool for parallel learning in bagging model or logger).
+ */
+public interface LearningEnvironment {
+    /** Default environment */
+    public static final LearningEnvironment DEFAULT = builder().build();
+
+    /**
+     * Returns Parallelism Strategy instance.
+     */
+    public ParallelismStrategy parallelismStrategy();
+
+    /**
+     * Returns an instance of logger.
+     */
+    public MLLogger logger();
+
+    /**
+     * Returns an instance of logger for specific class.
+     *
+     * @param forClass Logging class context.
+     */
+    public <T> MLLogger logger(Class<T> forClass);
+
+    /**
+     * Creates an instance of LearningEnvironmentBuilder.
+     */
+    public static LearningEnvironmentBuilder builder() {
+        return new LearningEnvironmentBuilder();
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/9f5dd09b/modules/ml/src/main/java/org/apache/ignite/ml/environment/LearningEnvironmentBuilder.java
----------------------------------------------------------------------
diff --git 
a/modules/ml/src/main/java/org/apache/ignite/ml/environment/LearningEnvironmentBuilder.java
 
b/modules/ml/src/main/java/org/apache/ignite/ml/environment/LearningEnvironmentBuilder.java
new file mode 100644
index 0000000..be56ccc
--- /dev/null
+++ 
b/modules/ml/src/main/java/org/apache/ignite/ml/environment/LearningEnvironmentBuilder.java
@@ -0,0 +1,123 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.ml.environment;
+
+import org.apache.ignite.ml.environment.logging.MLLogger;
+import org.apache.ignite.ml.environment.logging.NoOpLogger;
+import org.apache.ignite.ml.environment.parallelism.DefaultParallelismStrategy;
+import org.apache.ignite.ml.environment.parallelism.NoParallelismStrategy;
+import org.apache.ignite.ml.environment.parallelism.ParallelismStrategy;
+
+/**
+ * Builder for LearningEnvironment.
+ */
+public class LearningEnvironmentBuilder {
+    /** Parallelism strategy. */
+    private ParallelismStrategy parallelismStgy;
+    /** Logging factory. */
+    private MLLogger.Factory loggingFactory;
+
+    /**
+     * Creates an instance of LearningEnvironmentBuilder.
+     */
+    LearningEnvironmentBuilder() {
+        parallelismStgy = NoParallelismStrategy.INSTANCE;
+        loggingFactory = NoOpLogger.factory();
+    }
+
+    /**
+     * Specifies Parallelism Strategy for LearningEnvironment.
+     *
+     * @param stgy Parallelism Strategy.
+     */
+    public <T> LearningEnvironmentBuilder 
withParallelismStrategy(ParallelismStrategy stgy) {
+        this.parallelismStgy = stgy;
+
+        return this;
+    }
+
+    /**
+     * Specifies Parallelism Strategy for LearningEnvironment.
+     *
+     * @param stgyType Parallelism Strategy Type.
+     */
+    public LearningEnvironmentBuilder 
withParallelismStrategy(ParallelismStrategy.Type stgyType) {
+        switch (stgyType) {
+            case NO_PARALLELISM:
+                this.parallelismStgy = NoParallelismStrategy.INSTANCE;
+            case ON_DEFAULT_POOL:
+                this.parallelismStgy = new DefaultParallelismStrategy();
+        }
+        return this;
+    }
+
+
+    /**
+     * Specifies Logging factory for LearningEnvironment.
+     *
+     * @param loggingFactory Logging Factory.
+     */
+    public LearningEnvironmentBuilder withLoggingFactory(MLLogger.Factory 
loggingFactory) {
+        this.loggingFactory = loggingFactory;
+        return this;
+    }
+
+    /**
+     * Create an instance of LearningEnvironment.
+     */
+    public LearningEnvironment build() {
+        return new LearningEnvironmentImpl(parallelismStgy, loggingFactory);
+    }
+
+    /**
+     * Default LearningEnvironment implementation.
+     */
+    private class LearningEnvironmentImpl implements LearningEnvironment {
+        /** Parallelism strategy. */
+        private final ParallelismStrategy parallelismStgy;
+        /** Logging factory. */
+        private final MLLogger.Factory loggingFactory;
+
+        /**
+         * Creates an instance of LearningEnvironmentImpl.
+         *
+         * @param parallelismStgy Parallelism strategy.
+         * @param loggingFactory Logging factory.
+         */
+        private LearningEnvironmentImpl(ParallelismStrategy parallelismStgy,
+            MLLogger.Factory loggingFactory) {
+            this.parallelismStgy = parallelismStgy;
+            this.loggingFactory = loggingFactory;
+        }
+
+        /** {@inheritDoc} */
+        @Override public ParallelismStrategy parallelismStrategy() {
+            return parallelismStgy;
+        }
+
+        /** {@inheritDoc} */
+        @Override public MLLogger logger() {
+            return loggingFactory.create(getClass());
+        }
+
+        /** {@inheritDoc} */
+        @Override public <T> MLLogger logger(Class<T> clazz) {
+            return loggingFactory.create(clazz);
+        }
+    }
+}

Reply via email to