diff --git a/benchmarks/hasheddoc_benchmarks.cpp b/benchmarks/hasheddoc_benchmarks.cpp index adc268c3b35..f48204499be 100644 --- a/benchmarks/hasheddoc_benchmarks.cpp +++ b/benchmarks/hasheddoc_benchmarks.cpp @@ -9,7 +9,6 @@ #include #include #include -#include using namespace shogun; @@ -23,13 +22,13 @@ int main(int argv, char** argc) int32_t num_strings = 5000; int32_t max_str_length = 10000; SGStringList string_list(num_strings, max_str_length); - + auto m_rng = std::unique_ptr(new CRandom()); SG_SPRINT("Creating features...\n"); for (index_t i=0; i(max_str_length); for (index_t j=0; jrandom('A', 'Z'); } SG_SPRINT("Features were created.\n"); diff --git a/benchmarks/rf_feats_benchmark.cpp b/benchmarks/rf_feats_benchmark.cpp index e93d72a8459..9daf777223d 100644 --- a/benchmarks/rf_feats_benchmark.cpp +++ b/benchmarks/rf_feats_benchmark.cpp @@ -16,6 +16,7 @@ int main(int argv, char** argc) int32_t dims[] = {100, 300, 600}; CTime* timer = new CTime(); + auto m_rng = std::unique_ptr(new CRandom()); for (index_t d=0; d<3; d++) { int32_t num_dim = dims[d]; @@ -27,7 +28,7 @@ int main(int argv, char** argc) { for (index_t j=0; jrandom(0, 1) + 0.5; } } diff --git a/benchmarks/rf_feats_kernel_comp.cpp b/benchmarks/rf_feats_kernel_comp.cpp index a1acc106d6f..52bc49cf336 100644 --- a/benchmarks/rf_feats_kernel_comp.cpp +++ b/benchmarks/rf_feats_kernel_comp.cpp @@ -29,6 +29,7 @@ int main(int argv, char** argc) float64_t lin_C = 0.1; float64_t non_lin_C = 0.1; CPRCEvaluation* evaluator = new CPRCEvaluation(); + auto m_rng = std::unique_ptr(new CRandom()); CSqrtDiagKernelNormalizer* normalizer = new CSqrtDiagKernelNormalizer(true); SG_REF(normalizer); for (index_t d=0; d<4; d++) @@ -48,12 +49,12 @@ int main(int argv, char** argc) if ((i+j)%2==0) { labs[i] = -1; - mat(j,i) = CMath::random(0,1) + 0.5; + mat(j, i) = m_rng->random(0, 1) + 0.5; } else { labs[i] = 1; - mat(j,i) = CMath::random(0,1) - 0.5; + mat(j, i) = m_rng->random(0, 1) - 0.5; } } } diff --git a/benchmarks/sparse_test.cpp b/benchmarks/sparse_test.cpp index 8849ea68e69..2b586aac553 100644 --- a/benchmarks/sparse_test.cpp +++ b/benchmarks/sparse_test.cpp @@ -112,7 +112,7 @@ int main(int argc, char** argv) v.set_const(1.0); Map map_v(v.vector, v.vlen); CTime time; - CMath::init_random(17); + set_global_seed(17); SG_SPRINT("time\tshogun (s)\teigen3 (s)\n\n"); for (index_t t=0; t matrix_test(num_class, num_vec); CMulticlassLabels* labels=new CMulticlassLabels(num_vec); CMulticlassLabels* labels_test=new CMulticlassLabels(num_vec); + auto m_rng = std::unique_ptr(new CRandom()); for (index_t i=0; istd_normal_distrib(); + matrix_test(j, i) = m_rng->std_normal_distrib(); labels->set_label(i, label); labels_test->set_label(i, label); } diff --git a/examples/undocumented/libshogun/classifier_latent_svm.cpp b/examples/undocumented/libshogun/classifier_latent_svm.cpp index c39b1faadc4..38e3039fa6a 100644 --- a/examples/undocumented/libshogun/classifier_latent_svm.cpp +++ b/examples/undocumented/libshogun/classifier_latent_svm.cpp @@ -110,7 +110,7 @@ static void read_dataset(char* fname, CLatentFeatures*& feats, CLatentLabels*& l SG_REF(labels); CBinaryLabels* ys = new CBinaryLabels(num_examples); - + auto m_rng = std::unique_ptr(new CRandom()); feats = new CLatentFeatures(num_examples); SG_REF(feats); @@ -146,8 +146,8 @@ static void read_dataset(char* fname, CLatentFeatures*& feats, CLatentLabels*& l height = atoi(last_pchar); /* create latent label */ - int x = CMath::random(0, width-1); - int y = CMath::random(0, height-1); + int x = m_rng->random(0, width - 1); + int y = m_rng->random(0, height - 1); CBoundingBox* bb = new CBoundingBox(x,y); labels->add_latent_label(bb); diff --git a/examples/undocumented/libshogun/classifier_libsvm_probabilities.cpp b/examples/undocumented/libshogun/classifier_libsvm_probabilities.cpp index e1a875bf9a9..ab96153d89f 100644 --- a/examples/undocumented/libshogun/classifier_libsvm_probabilities.cpp +++ b/examples/undocumented/libshogun/classifier_libsvm_probabilities.cpp @@ -10,27 +10,28 @@ using namespace shogun; //generates data points (of different classes) randomly void gen_rand_data(SGMatrix features, SGVector labels, float64_t distance) { - index_t num_samples=labels.vlen; - index_t dimensions=features.num_rows; - for (int32_t i=0; i(new CRandom()); + index_t num_samples = labels.vlen; + index_t dimensions = features.num_rows; + for (int32_t i = 0; i < num_samples; i++) + { + if (i < num_samples / 2) + { + labels[i] = -1.0; + for (int32_t j = 0; j < dimensions; j++) + features(j, i) = m_rng->random(0.0, 1.0) + distance; + } + else + { + labels[i] = 1.0; + for (int32_t j = 0; j < dimensions; j++) + features(j, i) = m_rng->random(0.0, 1.0) - distance; + } + } + labels.display_vector("labels"); + std::cout << std::endl; + features.display_matrix("features"); + std::cout << std::endl; } int main(int argc, char** argv) diff --git a/examples/undocumented/libshogun/classifier_mkl_svmlight_modelselection_bug.cpp b/examples/undocumented/libshogun/classifier_mkl_svmlight_modelselection_bug.cpp index b2315f6586d..b672d6e1fd2 100644 --- a/examples/undocumented/libshogun/classifier_mkl_svmlight_modelselection_bug.cpp +++ b/examples/undocumented/libshogun/classifier_mkl_svmlight_modelselection_bug.cpp @@ -66,8 +66,9 @@ void test() /* create some data and labels */ SGMatrix matrix(dim_vectors, num_vectors); CBinaryLabels* labels=new CBinaryLabels(num_vectors); + auto m_rng = std::unique_ptr(new CRandom()); for (int32_t i=0; istd_normal_distrib(); /* create num_feautres 2-dimensional vectors */ CDenseFeatures* features=new CDenseFeatures(); diff --git a/examples/undocumented/libshogun/classifier_svmlight_string_features_precomputed_kernel.cpp b/examples/undocumented/libshogun/classifier_svmlight_string_features_precomputed_kernel.cpp index 3a9a2f286f3..091d9095292 100644 --- a/examples/undocumented/libshogun/classifier_svmlight_string_features_precomputed_kernel.cpp +++ b/examples/undocumented/libshogun/classifier_svmlight_string_features_precomputed_kernel.cpp @@ -27,24 +27,24 @@ void test_svmlight() float64_t p_x=0.5; // probability for class A float64_t mostly_prob=0.8; CDenseLabels* labels=new CBinaryLabels(num_train+num_test); - CMath::init_random(17); + auto m_rng = std::unique_ptr(new CRandom(17)); SGStringList data(num_train+num_test, max_length); for (index_t i=0; irandom(1, max_length); /* allocate string */ data.strings[i]=SGString(length); /* fill with elements and set label */ - if (p_xrandom(0.0, 1.0)) { labels->set_label(i, 1); for (index_t j=0; jrandom(0.0, 1.0) ? '0' : '1'; data.strings[i].string[j]=c; } } @@ -53,7 +53,7 @@ void test_svmlight() labels->set_label(i, -1); for (index_t j=0; jrandom(0.0, 1.0) ? '1' : '0'; data.strings[i].string[j]=c; } } diff --git a/examples/undocumented/libshogun/clustering_kmeans.cpp b/examples/undocumented/libshogun/clustering_kmeans.cpp index 83dbfe9e4cd..e01c3ce86ea 100644 --- a/examples/undocumented/libshogun/clustering_kmeans.cpp +++ b/examples/undocumented/libshogun/clustering_kmeans.cpp @@ -36,6 +36,7 @@ int main(int argc, char **argv) int32_t dim_features=3; int32_t num_vectors_per_cluster=5; float64_t cluster_std_dev=2.0; + auto m_rng = std::unique_ptr(new CRandom()); /* build random cluster centers */ SGMatrix cluster_centers(dim_features, num_clusters); @@ -56,7 +57,7 @@ int main(int argc, char **argv) idx+=j; idx+=k*dim_features; float64_t entry=cluster_centers.matrix[i*dim_features+j]; - data.matrix[idx]=CMath::normal_random(entry, cluster_std_dev); + data.matrix[idx] = m_rng->normal_random(entry, cluster_std_dev); } } } diff --git a/examples/undocumented/libshogun/converter_jade_bss.cpp b/examples/undocumented/libshogun/converter_jade_bss.cpp index 866ab20d882..c6950098a9a 100644 --- a/examples/undocumented/libshogun/converter_jade_bss.cpp +++ b/examples/undocumented/libshogun/converter_jade_bss.cpp @@ -28,7 +28,7 @@ using namespace Eigen; void test() { // Generate sample data - CMath::init_random(0); + auto m_rng = std::unique_ptr(new CRandom(0)); int n_samples = 2000; VectorXd time(n_samples, true); time.setLinSpaced(n_samples,0,10); @@ -39,11 +39,11 @@ void test() { // Sin wave S(0,i) = sin(2*time[i]); - S(0,i) += 0.2*CMath::randn_double(); + S(0, i) += 0.2 * m_rng->std_normal_distrib(); // Square wave S(1,i) = sin(3*time[i]) < 0 ? -1 : 1; - S(1,i) += 0.2*CMath::randn_double(); + S(1, i) += 0.2 * m_rng->std_normal_distrib(); } // Standardize data diff --git a/examples/undocumented/libshogun/evaluation_cross_validation_classification.cpp b/examples/undocumented/libshogun/evaluation_cross_validation_classification.cpp index 197a118919e..f21eb40a801 100644 --- a/examples/undocumented/libshogun/evaluation_cross_validation_classification.cpp +++ b/examples/undocumented/libshogun/evaluation_cross_validation_classification.cpp @@ -26,7 +26,7 @@ void test_cross_validation() /* data matrix dimensions */ index_t num_vectors=40; index_t num_features=5; - + auto m_rng = std::unique_ptr(new CRandom()); /* data means -1, 1 in all components, std deviation of 3 */ SGVector mean_1(num_features); SGVector mean_2(num_features); @@ -44,7 +44,8 @@ void test_cross_validation() for (index_t j=0; jnormal_random(mean, sigma); } } diff --git a/examples/undocumented/libshogun/evaluation_cross_validation_locked_comparison.cpp b/examples/undocumented/libshogun/evaluation_cross_validation_locked_comparison.cpp index f12c9b0f59d..89d96eb391e 100644 --- a/examples/undocumented/libshogun/evaluation_cross_validation_locked_comparison.cpp +++ b/examples/undocumented/libshogun/evaluation_cross_validation_locked_comparison.cpp @@ -35,6 +35,7 @@ void test_cross_validation() SGVector::fill_vector(mean_1.vector, mean_1.vlen, -1.0); SGVector::fill_vector(mean_2.vector, mean_2.vlen, 1.0); float64_t sigma=1.5; + auto m_rng = std::unique_ptr(new CRandom()); /* fill data matrix around mean */ SGMatrix train_dat(num_features, num_vectors); @@ -43,7 +44,8 @@ void test_cross_validation() for (index_t j=0; jnormal_random(mean, sigma); } } diff --git a/examples/undocumented/libshogun/evaluation_cross_validation_mkl_weight_storage.cpp b/examples/undocumented/libshogun/evaluation_cross_validation_mkl_weight_storage.cpp index 27c8b4c46f5..3efdf06ea76 100644 --- a/examples/undocumented/libshogun/evaluation_cross_validation_mkl_weight_storage.cpp +++ b/examples/undocumented/libshogun/evaluation_cross_validation_mkl_weight_storage.cpp @@ -24,7 +24,7 @@ void gen_rand_data(SGVector lab, SGMatrix feat, { index_t dims=feat.num_rows; index_t num=lab.vlen; - + auto m_rng = std::unique_ptr(new CRandom()); for (int32_t i=0; i lab, SGMatrix feat, lab[i]=-1.0; for (int32_t j=0; jrandom(0.0, 1.0) + dist; } else { lab[i]=1.0; for (int32_t j=0; jrandom(0.0, 1.0) - dist; } } lab.display_vector("lab"); diff --git a/examples/undocumented/libshogun/evaluation_cross_validation_multiclass_mkl.cpp b/examples/undocumented/libshogun/evaluation_cross_validation_multiclass_mkl.cpp index 57b38318f5d..e3530e181a7 100644 --- a/examples/undocumented/libshogun/evaluation_cross_validation_multiclass_mkl.cpp +++ b/examples/undocumented/libshogun/evaluation_cross_validation_multiclass_mkl.cpp @@ -30,7 +30,7 @@ const char fname_labels[]="../data/label_train_multiclass.dat"; void test_multiclass_mkl_cv() { - CMath::init_random(12); + set_global_seed(12); /* dense features from matrix */ CCSVFile* feature_file = new CCSVFile(fname_feats); SGMatrix mat=SGMatrix(); @@ -84,7 +84,7 @@ void test_multiclass_mkl_cv() CMulticlassAccuracy* eval_crit=new CMulticlassAccuracy(); CStratifiedCrossValidationSplitting* splitting= new CStratifiedCrossValidationSplitting(labels, n_folds); - splitting->set_seed(12); + CCrossValidation *cross=new CCrossValidation(mkl, cfeats, labels, splitting, eval_crit); cross->set_autolock(false); diff --git a/examples/undocumented/libshogun/evaluation_cross_validation_regression.cpp b/examples/undocumented/libshogun/evaluation_cross_validation_regression.cpp index 11ccef36c75..9ef0e2d85f5 100644 --- a/examples/undocumented/libshogun/evaluation_cross_validation_regression.cpp +++ b/examples/undocumented/libshogun/evaluation_cross_validation_regression.cpp @@ -30,6 +30,7 @@ void test_cross_validation() /* training label data */ SGVector lab(num_vectors); + auto m_rng = std::unique_ptr(new CRandom()); /* fill data matrix and labels */ SGMatrix train_dat(num_features, num_vectors); @@ -37,8 +38,7 @@ void test_cross_validation() for (index_t i=0; inormal_random(0, 1.0); } /* training features */ diff --git a/examples/undocumented/libshogun/features_subset_labels.cpp b/examples/undocumented/libshogun/features_subset_labels.cpp index c3ed5a04b3b..f9145e24a41 100644 --- a/examples/undocumented/libshogun/features_subset_labels.cpp +++ b/examples/undocumented/libshogun/features_subset_labels.cpp @@ -20,7 +20,8 @@ const int32_t num_classes=3; void test() { - const int32_t num_subset_idx=CMath::random(1, num_labels); + auto m_rng = std::unique_ptr(new CRandom()); + const int32_t num_subset_idx = m_rng->random(1, num_labels); /* create labels */ CMulticlassLabels* labels=new CMulticlassLabels(num_labels); diff --git a/examples/undocumented/libshogun/features_subset_simple_features.cpp b/examples/undocumented/libshogun/features_subset_simple_features.cpp index 864132504fa..ceed29bbe2f 100644 --- a/examples/undocumented/libshogun/features_subset_simple_features.cpp +++ b/examples/undocumented/libshogun/features_subset_simple_features.cpp @@ -46,7 +46,8 @@ const int32_t dim_features=6; void test() { - const int32_t num_subset_idx=CMath::random(1, num_vectors); + auto m_rng = std::unique_ptr(new CRandom()); + const int32_t num_subset_idx = m_rng->random(1, num_vectors); /* create feature data matrix */ SGMatrix data(dim_features, num_vectors); @@ -55,7 +56,7 @@ void test() for (index_t i=0; irandom(-5, 5); } /* create simple features */ diff --git a/examples/undocumented/libshogun/hashed_features_example.cpp b/examples/undocumented/libshogun/hashed_features_example.cpp index 0bc9c7bec4b..930c27e931d 100644 --- a/examples/undocumented/libshogun/hashed_features_example.cpp +++ b/examples/undocumented/libshogun/hashed_features_example.cpp @@ -12,12 +12,12 @@ int main() int32_t num_vectors = 5; int32_t dim = 20; - + auto m_rng = std::unique_ptr(new CRandom()); SGMatrix mat(dim, num_vectors); for (index_t v=0; vrandom(-dim, dim); } int32_t hashing_dim = 12; diff --git a/examples/undocumented/libshogun/kernel_custom.cpp b/examples/undocumented/libshogun/kernel_custom.cpp index c09a43a282e..40a5f053bb7 100644 --- a/examples/undocumented/libshogun/kernel_custom.cpp +++ b/examples/undocumented/libshogun/kernel_custom.cpp @@ -35,7 +35,7 @@ void test_custom_kernel_subsets() { subset.range_fill(); CMath::permute(subset); -// subset.display_vector("permutation"); + // subset.display_vector("permutation"); features->add_subset(subset); k->init(features, features); l->add_row_subset(subset); diff --git a/examples/undocumented/libshogun/kernel_custom_kernel.cpp b/examples/undocumented/libshogun/kernel_custom_kernel.cpp index 8a449bf759e..31d6ba383cd 100644 --- a/examples/undocumented/libshogun/kernel_custom_kernel.cpp +++ b/examples/undocumented/libshogun/kernel_custom_kernel.cpp @@ -33,7 +33,7 @@ void test_custom_kernel_subsets() { subset.range_fill(); CMath::permute(subset); -// subset.display_vector("permutation"); + // subset.display_vector("permutation"); features->add_subset(subset); k->init(features, features); l->add_row_subset(subset); diff --git a/examples/undocumented/libshogun/kernel_machine_train_locked.cpp b/examples/undocumented/libshogun/kernel_machine_train_locked.cpp index 49be2414a80..19ad7841a17 100644 --- a/examples/undocumented/libshogun/kernel_machine_train_locked.cpp +++ b/examples/undocumented/libshogun/kernel_machine_train_locked.cpp @@ -34,6 +34,7 @@ void test() SGVector::display_vector(mean_1.vector, mean_1.vlen, "mean 1"); SGVector::display_vector(mean_2.vector, mean_2.vlen, "mean 2"); + auto m_rng = std::unique_ptr(new CRandom()); /* fill data matrix around mean */ SGMatrix train_dat(num_features, num_vectors); @@ -42,7 +43,8 @@ void test() for (index_t j=0; jnormal_random(mean, sigma); } } diff --git a/examples/undocumented/libshogun/library_serialization.cpp b/examples/undocumented/libshogun/library_serialization.cpp index 7521126c4c3..d924f6920ba 100644 --- a/examples/undocumented/libshogun/library_serialization.cpp +++ b/examples/undocumented/libshogun/library_serialization.cpp @@ -12,14 +12,14 @@ int main(int argc, char** argv) /* create feature data matrix */ SGMatrix data(3, 20); - + auto m_rng = std::unique_ptr(new CRandom()); /* fill matrix with random data */ for (index_t i=0; i<20*3; ++i) { if (i%2==0) data.matrix[i]=0; else - data.matrix[i]=CMath::random(1, 9); + data.matrix[i] = m_rng->random(1, 9); } /* create sparse features */ diff --git a/examples/undocumented/libshogun/modelselection_combined_kernel_sub_parameters.cpp b/examples/undocumented/libshogun/modelselection_combined_kernel_sub_parameters.cpp index ccd6b8524d5..dacd83f87d4 100644 --- a/examples/undocumented/libshogun/modelselection_combined_kernel_sub_parameters.cpp +++ b/examples/undocumented/libshogun/modelselection_combined_kernel_sub_parameters.cpp @@ -97,9 +97,10 @@ void modelselection_combined_kernel() /* create some data and labels */ SGMatrix matrix(dim_vectors, num_vectors); CBinaryLabels* labels=new CBinaryLabels(num_vectors); + auto m_rng = std::unique_ptr(new CRandom()); for (int32_t i=0; istd_normal_distrib(); /* create num_feautres 2-dimensional vectors */ CDenseFeatures* features=new CDenseFeatures(matrix); diff --git a/examples/undocumented/libshogun/modelselection_grid_search_kernel.cpp b/examples/undocumented/libshogun/modelselection_grid_search_kernel.cpp index 5729abf3319..6a8144bb222 100644 --- a/examples/undocumented/libshogun/modelselection_grid_search_kernel.cpp +++ b/examples/undocumented/libshogun/modelselection_grid_search_kernel.cpp @@ -100,9 +100,10 @@ int main(int argc, char **argv) /* create some data and labels */ SGMatrix matrix(dim_vectors, num_vectors); CBinaryLabels* labels=new CBinaryLabels(num_vectors); + auto m_rng = std::unique_ptr(new CRandom()); for (int32_t i=0; istd_normal_distrib(); /* create num_feautres 2-dimensional vectors */ CDenseFeatures* features=new CDenseFeatures(matrix); diff --git a/examples/undocumented/libshogun/modelselection_grid_search_krr.cpp b/examples/undocumented/libshogun/modelselection_grid_search_krr.cpp index 97c33dbdf01..c5172e4b099 100644 --- a/examples/undocumented/libshogun/modelselection_grid_search_krr.cpp +++ b/examples/undocumented/libshogun/modelselection_grid_search_krr.cpp @@ -74,6 +74,7 @@ void test_cross_validation() /* training label data */ SGVector lab(num_vectors); + auto m_rng = std::unique_ptr(new CRandom()); /* fill data matrix and labels */ SGMatrix train_dat(num_features, num_vectors); @@ -81,8 +82,7 @@ void test_cross_validation() for (index_t i=0; inormal_random(0, 1.0); } /* training features */ diff --git a/examples/undocumented/libshogun/modelselection_grid_search_mkl.cpp b/examples/undocumented/libshogun/modelselection_grid_search_mkl.cpp index 3db670c9038..8b793a451f1 100644 --- a/examples/undocumented/libshogun/modelselection_grid_search_mkl.cpp +++ b/examples/undocumented/libshogun/modelselection_grid_search_mkl.cpp @@ -61,8 +61,9 @@ void test() /* create some data and labels */ SGMatrix matrix(dim_vectors, num_vectors); + auto m_rng = std::unique_ptr(new CRandom()); for (int32_t i=0; istd_normal_distrib(); /* create feature object */ CDenseFeatures* features=new CDenseFeatures (); diff --git a/examples/undocumented/libshogun/modelselection_grid_search_multiclass_svm.cpp b/examples/undocumented/libshogun/modelselection_grid_search_multiclass_svm.cpp index df5e51f8bca..d7a47cb3e60 100644 --- a/examples/undocumented/libshogun/modelselection_grid_search_multiclass_svm.cpp +++ b/examples/undocumented/libshogun/modelselection_grid_search_multiclass_svm.cpp @@ -51,12 +51,13 @@ void test() /* create data: some easy multiclass data */ SGMatrix feat=SGMatrix(dim_vectors, num_vectors); SGVector lab(num_vectors); + auto m_rng = std::unique_ptr(new CRandom()); for (index_t j=0; jstd_normal_distrib(); /* make sure classes are (alomst) linearly seperable against each other */ feat(lab[j],j)+=distance; diff --git a/examples/undocumented/libshogun/modelselection_grid_search_string_kernel.cpp b/examples/undocumented/libshogun/modelselection_grid_search_string_kernel.cpp index 301ff04adec..90bef7e0f87 100644 --- a/examples/undocumented/libshogun/modelselection_grid_search_string_kernel.cpp +++ b/examples/undocumented/libshogun/modelselection_grid_search_string_kernel.cpp @@ -73,17 +73,17 @@ int main(int argc, char **argv) index_t num_subsets=num_strings/3; SGStringList strings(num_strings, max_string_length); - + auto m_rng = std::unique_ptr(new CRandom()); for (index_t i=0; irandom(min_string_length, max_string_length); SGString current(len); SG_SPRINT("string %i: \"", i); /* fill with random uppercase letters (ASCII) */ for (index_t j=0; jrandom('A', 'Z'); char* string=new char[2]; string[0]=current.string[j]; diff --git a/examples/undocumented/libshogun/neuralnets_basic.cpp b/examples/undocumented/libshogun/neuralnets_basic.cpp index d2b32f30314..0896a132134 100644 --- a/examples/undocumented/libshogun/neuralnets_basic.cpp +++ b/examples/undocumented/libshogun/neuralnets_basic.cpp @@ -51,7 +51,7 @@ int main(int, char*[]) #ifdef HAVE_LAPACK // for CDataGenerator::generate_gaussian() // initialize the random number generator with a fixed seed, for repeatability - CMath::init_random(10); + set_global_seed(10); // Prepare the training data const int num_classes = 4; diff --git a/examples/undocumented/libshogun/neuralnets_convolutional.cpp b/examples/undocumented/libshogun/neuralnets_convolutional.cpp index 26ec60e0f65..18f0b50ff51 100644 --- a/examples/undocumented/libshogun/neuralnets_convolutional.cpp +++ b/examples/undocumented/libshogun/neuralnets_convolutional.cpp @@ -54,7 +54,7 @@ int main(int, char*[]) #ifdef HAVE_LAPACK // for CDataGenerator::generate_gaussian() // initialize the random number generator with a fixed seed, for repeatability - CMath::init_random(10); + set_global_seed(10); // Prepare the training data const int width = 4; diff --git a/examples/undocumented/libshogun/neuralnets_deep_autoencoder.cpp b/examples/undocumented/libshogun/neuralnets_deep_autoencoder.cpp index 52e79c57a5a..6ad5b99b93c 100644 --- a/examples/undocumented/libshogun/neuralnets_deep_autoencoder.cpp +++ b/examples/undocumented/libshogun/neuralnets_deep_autoencoder.cpp @@ -49,8 +49,7 @@ int main(int, char*[]) #ifdef HAVE_LAPACK // for CDataGenerator::generate_gaussian() // initialize the random number generator with a fixed seed, for repeatability - CMath::init_random(10); - + set_global_seed(10); // Prepare the training data const int num_features = 20; const int num_classes = 4; diff --git a/examples/undocumented/libshogun/neuralnets_deep_belief_network.cpp b/examples/undocumented/libshogun/neuralnets_deep_belief_network.cpp index 0c81eb9a195..52a1a092592 100644 --- a/examples/undocumented/libshogun/neuralnets_deep_belief_network.cpp +++ b/examples/undocumented/libshogun/neuralnets_deep_belief_network.cpp @@ -45,7 +45,7 @@ int main(int, char*[]) init_shogun_with_defaults(); // initialize the random number generator with a fixed seed, for repeatability - CMath::init_random(10); + auto m_rng = std::unique_ptr(new CRandom(10)); // Prepare the training data const int num_features = 5; @@ -67,11 +67,11 @@ int main(int, char*[]) } for (int32_t i=0; irandom(-1.0, 1.0); for (int32_t i=0; inormal_random(means[i], 1.0); CDenseFeatures* features = new CDenseFeatures(X); diff --git a/examples/undocumented/libshogun/parameter_iterate_float64.cpp b/examples/undocumented/libshogun/parameter_iterate_float64.cpp index a2d9380793f..41f729caa6b 100644 --- a/examples/undocumented/libshogun/parameter_iterate_float64.cpp +++ b/examples/undocumented/libshogun/parameter_iterate_float64.cpp @@ -29,9 +29,9 @@ int main(int argc, char** argv) /* create some random data */ SGMatrix matrix(n,n); - + auto m_rng = std::unique_ptr(new CRandom()); for(int32_t i=0; irandom((float64_t)-n, (float64_t)n); SGMatrix::display_matrix(matrix.matrix, n, n); diff --git a/examples/undocumented/libshogun/parameter_iterate_sgobject.cpp b/examples/undocumented/libshogun/parameter_iterate_sgobject.cpp index ba987233e27..cc78092a216 100644 --- a/examples/undocumented/libshogun/parameter_iterate_sgobject.cpp +++ b/examples/undocumented/libshogun/parameter_iterate_sgobject.cpp @@ -26,11 +26,11 @@ int main(int argc, char** argv) const int32_t n=7; init_shogun(&print_message); - + auto m_rng = std::unique_ptr(new CRandom()); /* create some random data and hand it to each kernel */ SGMatrix matrix(n,n); for (int32_t k=0; krandom((float64_t)-n, (float64_t)n); SG_SPRINT("feature data:\n"); SGMatrix::display_matrix(matrix.matrix, n, n); @@ -41,7 +41,8 @@ int main(int argc, char** argv) CGaussianKernel** kernels=SG_MALLOC(CGaussianKernel*, n); for (int32_t i=0; irandom(0.0, (float64_t)n * n)); /* hand data to kernel */ kernels[i]->init(features, features); diff --git a/examples/undocumented/libshogun/preprocessor_randomfouriergauss.cpp b/examples/undocumented/libshogun/preprocessor_randomfouriergauss.cpp index 0e47a656c0f..3b54dfd2ed9 100644 --- a/examples/undocumented/libshogun/preprocessor_randomfouriergauss.cpp +++ b/examples/undocumented/libshogun/preprocessor_randomfouriergauss.cpp @@ -27,7 +27,7 @@ void gen_rand_data(float64_t* & feat, float64_t* & lab,const int32_t num,const i { lab=SG_MALLOC(float64_t, num); feat=SG_MALLOC(float64_t, num*dims); - + auto m_rng = std::unique_ptr(new CRandom()); for (int32_t i=0; irandom(0.0, 1.0) + dist; } else { lab[i]=1.0; for (int32_t j=0; jrandom(0.0, 1.0) - dist; } } CMath::display_vector(lab,num); diff --git a/examples/undocumented/libshogun/random_fourier_features.cpp b/examples/undocumented/libshogun/random_fourier_features.cpp index a25f409e299..3546777b138 100644 --- a/examples/undocumented/libshogun/random_fourier_features.cpp +++ b/examples/undocumented/libshogun/random_fourier_features.cpp @@ -18,6 +18,7 @@ void load_data(int32_t num_dim, int32_t num_vecs, { SGMatrix mat(num_dim, num_vecs); SGVector labs(num_vecs); + auto m_rng = std::unique_ptr(new CRandom()); for (index_t i=0; irandom(0, 1) + 0.5; } else { labs[i] = 1; - mat(j,i) = CMath::random(0,1) - 0.5; + mat(j, i) = m_rng->random(0, 1) - 0.5; } } } diff --git a/examples/undocumented/libshogun/regression_gaussian_process_simple_exact.cpp b/examples/undocumented/libshogun/regression_gaussian_process_simple_exact.cpp index ea0aee32edb..877158cd51d 100644 --- a/examples/undocumented/libshogun/regression_gaussian_process_simple_exact.cpp +++ b/examples/undocumented/libshogun/regression_gaussian_process_simple_exact.cpp @@ -28,10 +28,10 @@ void test() SGMatrix X(1, n); SGMatrix X_test(1, n); SGVector Y(n); - + auto m_rng = std::unique_ptr(new CRandom()); for (index_t i=0; irandom(0.0, x_range); X_test[i]=(float64_t)i / n*x_range; Y[i]=CMath::sin(X[i]); } diff --git a/examples/undocumented/libshogun/regression_libsvr.cpp b/examples/undocumented/libshogun/regression_libsvr.cpp index ee393cfe43e..e22de541478 100644 --- a/examples/undocumented/libshogun/regression_libsvr.cpp +++ b/examples/undocumented/libshogun/regression_libsvr.cpp @@ -22,7 +22,7 @@ void test_libsvr() /* create some easy regression data: 1d noisy sine wave */ index_t n=100; float64_t x_range=6; - + auto m_rng = std::unique_ptr(new CRandom()); SGMatrix feat_train(1, n); SGMatrix feat_test(1, n); SGVector lab_train(n); @@ -30,7 +30,7 @@ void test_libsvr() for (index_t i=0; irandom(0.0, x_range); feat_test[i]=(float64_t)i/n*x_range; lab_train[i]=CMath::sin(feat_train[i]); lab_test[i]=CMath::sin(feat_test[i]); diff --git a/examples/undocumented/libshogun/serialization_multiclass_labels.cpp b/examples/undocumented/libshogun/serialization_multiclass_labels.cpp index 7de121622db..2dbafb4d3ed 100644 --- a/examples/undocumented/libshogun/serialization_multiclass_labels.cpp +++ b/examples/undocumented/libshogun/serialization_multiclass_labels.cpp @@ -25,8 +25,9 @@ void test() labels->allocate_confidences_for(n_class); SGVector conf(n_class); + auto m_rng = std::unique_ptr(new CRandom()); for (index_t i=0; istd_normal_distrib(); for (index_t i=0; iset_multiclass_confidences(i, conf); diff --git a/examples/undocumented/libshogun/so_fg_model.cpp b/examples/undocumented/libshogun/so_fg_model.cpp index efbede0fc0a..5202a2c136d 100644 --- a/examples/undocumented/libshogun/so_fg_model.cpp +++ b/examples/undocumented/libshogun/so_fg_model.cpp @@ -18,7 +18,7 @@ using namespace shogun; void test(int32_t num_samples) { - CMath::init_random(17); + set_global_seed(17); // define factor type SGVector card(2); @@ -50,11 +50,11 @@ void test(int32_t num_samples) SGVector::fill_vector(vc.vector, vc.vlen, 2); CFactorGraph* fg = new CFactorGraph(vc); - + auto m_rng = std::unique_ptr(new CRandom()); // add factors SGVector data1(2); - data1[0] = 2.0 * CMath::random(0.0, 1.0) - 1.0; - data1[1] = 2.0 * CMath::random(0.0, 1.0) - 1.0; + data1[0] = 2.0 * m_rng->random(0.0, 1.0) - 1.0; + data1[1] = 2.0 * m_rng->random(0.0, 1.0) - 1.0; SGVector var_index1(2); var_index1[0] = 0; var_index1[1] = 1; @@ -62,8 +62,8 @@ void test(int32_t num_samples) fg->add_factor(fac1); SGVector data2(2); - data2[0] = 2.0 * CMath::random(0.0, 1.0) - 1.0; - data2[1] = 2.0 * CMath::random(0.0, 1.0) - 1.0; + data2[0] = 2.0 * m_rng->random(0.0, 1.0) - 1.0; + data2[1] = 2.0 * m_rng->random(0.0, 1.0) - 1.0; SGVector var_index2(2); var_index2[0] = 1; var_index2[1] = 2; diff --git a/examples/undocumented/libshogun/so_multiclass.cpp b/examples/undocumented/libshogun/so_multiclass.cpp index cd3a9f1932b..ef4b4878565 100644 --- a/examples/undocumented/libshogun/so_multiclass.cpp +++ b/examples/undocumented/libshogun/so_multiclass.cpp @@ -34,6 +34,7 @@ void gen_rand_data(SGVector< float64_t > labs, SGMatrix< float64_t > feats) { float64_t means[DIMS]; float64_t stds[DIMS]; + auto m_rng = std::unique_ptr(new CRandom()); FILE* pfile = fopen(FNAME, "w"); @@ -41,8 +42,8 @@ void gen_rand_data(SGVector< float64_t > labs, SGMatrix< float64_t > feats) { for ( int32_t j = 0 ; j < DIMS ; ++j ) { - means[j] = CMath::random(-100, 100); - stds[j] = CMath::random( 1, 5); + means[j] = m_rng->random(-100, 100); + stds[j] = m_rng->random(1, 5); } for ( int32_t i = 0 ; i < NUM_SAMPLES ; ++i ) @@ -53,8 +54,8 @@ void gen_rand_data(SGVector< float64_t > labs, SGMatrix< float64_t > feats) for ( int32_t j = 0 ; j < DIMS ; ++j ) { - feats[(c*NUM_SAMPLES+i)*DIMS + j] = - CMath::normal_random(means[j], stds[j]); + feats[(c * NUM_SAMPLES + i) * DIMS + j] = + m_rng->normal_random(means[j], stds[j]); fprintf(pfile, " %f", feats[(c*NUM_SAMPLES+i)*DIMS + j]); } diff --git a/examples/undocumented/libshogun/so_multiclass_BMRM.cpp b/examples/undocumented/libshogun/so_multiclass_BMRM.cpp index 5c60ad47ded..6dcbd3caac5 100644 --- a/examples/undocumented/libshogun/so_multiclass_BMRM.cpp +++ b/examples/undocumented/libshogun/so_multiclass_BMRM.cpp @@ -88,14 +88,14 @@ void gen_rand_data(SGVector< float64_t > labs, SGMatrix< float64_t > feats) FILE* pfile = fopen(FNAME, "w"); - CMath::init_random(17); + auto m_rng = std::unique_ptr(new CRandom(17)); for ( int32_t c = 0 ; c < NUM_CLASSES ; ++c ) { for ( int32_t j = 0 ; j < DIMS ; ++j ) { - means[j] = CMath::random(-100, 100); - stds[j] = CMath::random( 1, 5); + means[j] = m_rng->random(-100, 100); + stds[j] = m_rng->random(1, 5); } for ( int32_t i = 0 ; i < NUM_SAMPLES ; ++i ) @@ -106,8 +106,8 @@ void gen_rand_data(SGVector< float64_t > labs, SGMatrix< float64_t > feats) for ( int32_t j = 0 ; j < DIMS ; ++j ) { - feats[(c*NUM_SAMPLES+i)*DIMS + j] = - CMath::normal_random(means[j], stds[j]); + feats[(c * NUM_SAMPLES + i) * DIMS + j] = + m_rng->normal_random(means[j], stds[j]); fprintf(pfile, " %d:%f", j+1, feats[(c*NUM_SAMPLES+i)*DIMS + j]); } diff --git a/examples/undocumented/libshogun/splitting_LOO_crossvalidation.cpp b/examples/undocumented/libshogun/splitting_LOO_crossvalidation.cpp index 5380a709373..17a79a26357 100644 --- a/examples/undocumented/libshogun/splitting_LOO_crossvalidation.cpp +++ b/examples/undocumented/libshogun/splitting_LOO_crossvalidation.cpp @@ -16,10 +16,11 @@ int main(int argc, char **argv) index_t num_labels; index_t runs=10; + auto m_rng = std::unique_ptr(new CRandom()); while (runs-->0) { - num_labels=CMath::random(10, 50); + num_labels = m_rng->random(10, 50); //SG_SPRINT("num_labels=%d\n\n", num_labels); @@ -27,9 +28,8 @@ int main(int argc, char **argv) CRegressionLabels* labels=new CRegressionLabels(num_labels); for (index_t i=0; iset_label(i, CMath::random(-10.0, 10.0)); - // SG_SPRINT("label(%d)=%.18g\n", i, labels->get_label(i)); - + labels->set_label(i, m_rng->random(-10.0, 10.0)); + // SG_SPRINT("label(%d)=%.18g\n", i, labels->get_label(i)); } //SG_SPRINT("\n"); diff --git a/examples/undocumented/libshogun/splitting_standard_crossvalidation.cpp b/examples/undocumented/libshogun/splitting_standard_crossvalidation.cpp index dc6099eb316..b7dfa806e37 100644 --- a/examples/undocumented/libshogun/splitting_standard_crossvalidation.cpp +++ b/examples/undocumented/libshogun/splitting_standard_crossvalidation.cpp @@ -22,11 +22,12 @@ int main(int argc, char **argv) index_t num_labels; index_t num_subsets; index_t runs=100; + auto m_rng = std::unique_ptr(new CRandom()); while (runs-->0) { - num_labels=CMath::random(10, 150); - num_subsets=CMath::random(1, 5); + num_labels = m_rng->random(10, 150); + num_subsets = m_rng->random(1, 5); index_t desired_size=CMath::round( (float64_t)num_labels/(float64_t)num_subsets); @@ -40,7 +41,7 @@ int main(int argc, char **argv) CRegressionLabels* labels=new CRegressionLabels(num_labels); for (index_t i=0; iset_label(i, CMath::random(-10.0, 10.0)); + labels->set_label(i, m_rng->random(-10.0, 10.0)); SG_SPRINT("label(%d)=%.18g\n", i, labels->get_label(i)); } SG_SPRINT("\n"); diff --git a/examples/undocumented/libshogun/splitting_stratified_crossvalidation.cpp b/examples/undocumented/libshogun/splitting_stratified_crossvalidation.cpp index fb3469c1d21..400b666f8c7 100644 --- a/examples/undocumented/libshogun/splitting_stratified_crossvalidation.cpp +++ b/examples/undocumented/libshogun/splitting_stratified_crossvalidation.cpp @@ -21,12 +21,13 @@ int main(int argc, char **argv) index_t num_labels, num_classes, num_subsets; index_t runs=50; + auto m_rng = std::unique_ptr(new CRandom()); while (runs-->0) { - num_labels=CMath::random(5, 100); - num_classes=CMath::random(2, 10); - num_subsets=CMath::random(1, 10); + num_labels = m_rng->random(5, 100); + num_classes = m_rng->random(2, 10); + num_subsets = m_rng->random(1, 10); /* this will throw an error */ if (num_labelsset_label(i, CMath::random()%num_classes); + labels->set_label(i, m_rng->random_64() % num_classes); SG_SPRINT("label(%d)=%.18g\n", i, labels->get_label(i)); } SG_SPRINT("\n"); diff --git a/examples/undocumented/libshogun/streaming_from_dense.cpp b/examples/undocumented/libshogun/streaming_from_dense.cpp index 9559c588f2c..e0855fb141f 100644 --- a/examples/undocumented/libshogun/streaming_from_dense.cpp +++ b/examples/undocumented/libshogun/streaming_from_dense.cpp @@ -23,12 +23,13 @@ using namespace shogun; void gen_rand_data(SGMatrix feat, SGVector lab) { + auto m_rng = std::unique_ptr(new CRandom()); for (int32_t i=0; irandom(0.0, 1.0) + DIST; if (lab.vector) lab[i]=0; @@ -36,7 +37,7 @@ void gen_rand_data(SGMatrix feat, SGVector lab) else { for (int32_t j=0; jrandom(0.0, 1.0) - DIST; if (lab.vector) lab[i]=1; diff --git a/src/shogun/base/DynArray.h b/src/shogun/base/DynArray.h index 99a22ab7e2d..4bf6625e01d 100644 --- a/src/shogun/base/DynArray.h +++ b/src/shogun/base/DynArray.h @@ -9,6 +9,7 @@ #ifndef _DYNARRAY_H_ #define _DYNARRAY_H_ +#include #include #include @@ -444,8 +445,11 @@ template class DynArray /** randomizes the array (not thread safe!) */ void shuffle() { + auto m_rng = std::unique_ptr(new CRandom(sg_random_seed)); for (index_t i=0; i<=current_num_elements-1; ++i) - CMath::swap(array[i], array[CMath::random(i, current_num_elements-1)]); + CMath::swap( + array[i], + array[m_rng->random(i, current_num_elements - 1)]); } /** randomizes the array with external random state */ diff --git a/src/shogun/base/SGObject.cpp b/src/shogun/base/SGObject.cpp index 80ad6c33415..1af9fa5feea 100644 --- a/src/shogun/base/SGObject.cpp +++ b/src/shogun/base/SGObject.cpp @@ -37,7 +37,7 @@ namespace shogun { - + extern uint32_t sg_random_seed; typedef std::map ParametersMap; typedef std::unordered_map> @@ -510,7 +510,7 @@ void CSGObject::init() m_parameters = new Parameter(); m_model_selection_parameters = new Parameter(); m_gradient_parameters=new Parameter(); - m_rng = std::unique_ptr(new CRandom()); + m_rng = std::unique_ptr(new CRandom(sg_random_seed)); m_generic = PT_NOT_GENERIC; m_load_pre_called = false; m_load_post_called = false; diff --git a/src/shogun/base/SGObject.h b/src/shogun/base/SGObject.h index 76d7999e33b..9df5c8770a6 100644 --- a/src/shogun/base/SGObject.h +++ b/src/shogun/base/SGObject.h @@ -627,11 +627,6 @@ class CSGObject */ virtual CSGObject* clone(); - /** Set random seed - * @param seed seed for random generator - */ - void set_seed(int32_t seed); - protected: /** Returns an empty instance of own type. * diff --git a/src/shogun/base/init.cpp b/src/shogun/base/init.cpp index 1a0a844b296..1e8a9e4de86 100644 --- a/src/shogun/base/init.cpp +++ b/src/shogun/base/init.cpp @@ -18,7 +18,6 @@ #include #include -#include #include #include @@ -35,6 +34,15 @@ shogun::CMap* sg_mallocs=NULL; #include #endif +#ifdef _WIN32 +#define _CRT_RAND_S +#include +#endif + +#ifdef DEV_RANDOM +#include +#endif + namespace shogun { Parallel* sg_parallel=NULL; @@ -42,6 +50,7 @@ namespace shogun Version* sg_version=NULL; CMath* sg_math=NULL; std::unique_ptr sg_signal(nullptr); + uint32_t sg_random_seed = generate_seed(); std::unique_ptr sg_linalg(nullptr); @@ -260,4 +269,37 @@ namespace shogun } #endif } + + uint32_t generate_seed() + { + uint32_t seed; +#if defined(_WIN32) + rand_s(&seed); +#elif defined(HAVE_ARC4RANDOM) + seed = arc4random(); +#elif defined(DEV_RANDOM) + int fd = open(DEV_RANDOM, O_RDONLY); + ASSERT(fd >= 0); + ssize_t actual_read = + read(fd, reinterpret_cast(&seed), sizeof(seed)); + close(fd); + ASSERT(actual_read == sizeof(seed)); +#else + SG_SWARNING("Not safe seed for the PRNG\n"); + struct timeval tv; + gettimeofday(&tv, NULL); + seed = (uint32_t)(4223517 * getpid() * tv.tv_sec * tv.tv_usec); +#endif + return seed; + } + + void set_global_seed(uint32_t seed) + { + sg_random_seed = seed; + } + + uint32_t get_global_seed() + { + return sg_random_seed; + } } diff --git a/src/shogun/base/init.h b/src/shogun/base/init.h index 84817629daa..1040c271dc5 100644 --- a/src/shogun/base/init.h +++ b/src/shogun/base/init.h @@ -123,6 +123,18 @@ namespace shogun */ CMath* get_global_math(); +/** Set global random seed + * @param seed seed for random generator + */ +void set_global_seed(uint32_t seed); + +/** get global random seed + * @return random seed + */ +uint32_t get_global_seed(); + +uint32_t generate_seed(); + #ifndef SWIG // SWIG should skip this part /** get the global linalg library object * diff --git a/src/shogun/classifier/svm/GNPPLib.cpp b/src/shogun/classifier/svm/GNPPLib.cpp index a1ea077c39a..d3715a6ee8d 100644 --- a/src/shogun/classifier/svm/GNPPLib.cpp +++ b/src/shogun/classifier/svm/GNPPLib.cpp @@ -5,9 +5,9 @@ */ #include -#include #include -#include +#include +#include #include #include diff --git a/src/shogun/classifier/svm/LibLinear.cpp b/src/shogun/classifier/svm/LibLinear.cpp index 82b58b02802..94a0db644fe 100644 --- a/src/shogun/classifier/svm/LibLinear.cpp +++ b/src/shogun/classifier/svm/LibLinear.cpp @@ -1,8 +1,8 @@ /* * This software is distributed under BSD 3-clause license (see LICENSE file). * - * Authors: Soeren Sonnenburg, Sergey Lisitsyn, Giovanni De Toni, Liang Pang, - * Heiko Strathmann, Weijie Lin, Youssef Emad El-Din, Thoralf Klein, + * Authors: Soeren Sonnenburg, Sergey Lisitsyn, Giovanni De Toni, Liang Pang, + * Heiko Strathmann, Weijie Lin, Youssef Emad El-Din, Thoralf Klein, * Björn Esser */ #include @@ -336,7 +336,7 @@ void CLibLinear::solve_l2r_l1l2_svc( for (i = 0; i < active_size; i++) { - int j = CMath::random(i, active_size - 1); + int j = m_rng->random(i, active_size - 1); CMath::swap(index[i], index[j]); } @@ -548,7 +548,7 @@ void CLibLinear::solve_l1r_l2_svc( for (j = 0; j < active_size; j++) { - int i = CMath::random(j, active_size - 1); + int i = m_rng->random(j, active_size - 1); CMath::swap(index[i], index[j]); } @@ -922,7 +922,7 @@ void CLibLinear::solve_l1r_lr( for (j = 0; j < active_size; j++) { - int i = CMath::random(j, active_size - 1); + int i = m_rng->random(j, active_size - 1); CMath::swap(index[i], index[j]); } @@ -1271,7 +1271,7 @@ void CLibLinear::solve_l2r_lr_dual( { for (i = 0; i < l; i++) { - int j = CMath::random(i, l - 1); + int j = m_rng->random(i, l - 1); CMath::swap(index[i], index[j]); } int newton_iter = 0; diff --git a/src/shogun/clustering/GMM.cpp b/src/shogun/clustering/GMM.cpp index 7023063e2a3..9891ad4d412 100644 --- a/src/shogun/clustering/GMM.cpp +++ b/src/shogun/clustering/GMM.cpp @@ -404,8 +404,12 @@ void CGMM::partial_em(int32_t comp1, int32_t comp2, int32_t comp3, float64_t min for (int32_t i=0; iget_mean().vector[i]=components[0]->get_mean().vector[i]+CMath::randn_double()*noise_mag; - components[0]->get_mean().vector[i]=components[0]->get_mean().vector[i]+CMath::randn_double()*noise_mag; + components[2]->get_mean().vector[i] = + components[0]->get_mean().vector[i] + + m_rng->std_normal_distrib() * noise_mag; + components[0]->get_mean().vector[i] = + components[0]->get_mean().vector[i] + + m_rng->std_normal_distrib() * noise_mag; } coefficients.vector[1]=coefficients.vector[1]+coefficients.vector[2]; @@ -789,7 +793,7 @@ SGVector CGMM::sample() { REQUIRE(m_components.size()>0, "Number of mixture components is %d but " "must be positive\n", m_components.size()); - float64_t rand_num = CMath::random(0.0, 1.0); + float64_t rand_num = m_rng->random(float64_t(0), float64_t(1)); float64_t cum_sum=0; for (int32_t i=0; i #include #include -#include #include +#include #include using namespace Eigen; diff --git a/src/shogun/clustering/KMeansBase.cpp b/src/shogun/clustering/KMeansBase.cpp index b7fd2c2c4b4..94bca347ef1 100644 --- a/src/shogun/clustering/KMeansBase.cpp +++ b/src/shogun/clustering/KMeansBase.cpp @@ -4,13 +4,13 @@ * Authors: Saurabh Mahindre, Heiko Strathmann, Pan Deng, Viktor Gal */ +#include #include #include #include -#include #include -#include -#include +#include +#include #include using namespace shogun; @@ -270,7 +270,7 @@ SGMatrix CKMeansBase::kmeanspp() min_dist.zero(); /* First center is chosen at random */ - int32_t mu=CMath::random((int32_t) 0, lhs_size-1); + int32_t mu = m_rng->random((int32_t)0, lhs_size - 1); SGVector mu_first=lhs->get_feature_vector(mu); for(int32_t j=0; j CKMeansBase::kmeanspp() { float64_t temp_sum=0.0; float64_t temp_dist=0.0; - SGVector temp_min_dist=SGVector(lhs_size); - int32_t new_center=0; - float64_t prob=CMath::random(0.0, 1.0); + SGVector temp_min_dist = SGVector(lhs_size); + int32_t new_center = 0; + float64_t prob = m_rng->random(0.0, 1.0); prob=prob*sum; for(int32_t j=0; j -#include #include #include +#include #ifdef _WIN32 #undef far @@ -128,7 +128,7 @@ SGVector CKMeansMiniBatch::mbchoose_rand(int32_t b, int32_t num) { SGVector chosen=SGVector(num); SGVector ret=SGVector(b); - auto rng = std::unique_ptr(new CRandom()); + auto rng = std::unique_ptr(new CRandom(sg_random_seed)); chosen.zero(); int32_t ch=0; while (chstd_normal_distrib(); } } diff --git a/src/shogun/distributions/Gaussian.cpp b/src/shogun/distributions/Gaussian.cpp index 6a726f6addd..e1a04118787 100644 --- a/src/shogun/distributions/Gaussian.cpp +++ b/src/shogun/distributions/Gaussian.cpp @@ -408,7 +408,7 @@ SGVector CGaussian::sample() SGVector random_vec(m_mean.vlen); for (int32_t i = 0; i < m_mean.vlen; i++) - random_vec.vector[i] = CMath::randn_double(); + random_vec.vector[i] = m_rng->std_normal_distrib(); if (m_cov_type == FULL) { diff --git a/src/shogun/distributions/HMM.cpp b/src/shogun/distributions/HMM.cpp index cc624e8ec63..5c5b993d87b 100644 --- a/src/shogun/distributions/HMM.cpp +++ b/src/shogun/distributions/HMM.cpp @@ -19,7 +19,12 @@ #include #include -#define VAL_MACRO log((default_value == 0) ? (CMath::random(MIN_RAND, MAX_RAND)) : default_value) +#define VAL_MACRO \ + [&]() { \ + return log( \ + (default_value == 0) ? (m_rng->random(MIN_RAND, MAX_RAND)) \ + : default_value); \ + } #define ARRAY_SIZE 65336 using namespace shogun; @@ -2449,7 +2454,7 @@ void CHMM::init_model_random() sum=0; for (j=0; jrandom(MIN_RAND, 1.0)); sum+=get_a(i,j); } @@ -2462,7 +2467,7 @@ void CHMM::init_model_random() sum=0; for (i=0; irandom(MIN_RAND, 1.0)); sum+=get_p(i); } @@ -2474,7 +2479,7 @@ void CHMM::init_model_random() sum=0; for (i=0; irandom(MIN_RAND, 1.0)); sum+=get_q(i); } @@ -2488,7 +2493,7 @@ void CHMM::init_model_random() sum=0; for (j=0; jrandom(MIN_RAND, 1.0)); sum+=get_b(i,j); } @@ -2529,7 +2534,8 @@ void CHMM::init_model_defined() //initialize a values that have to be learned float64_t *R=SG_MALLOC(float64_t, N); - for (r=0; rrandom(MIN_RAND, 1.0); i=0; sum=0; k=i; j=model->get_learn_a(i,0); while (model->get_learn_a(i,0)!=-1 || kget_learn_a(i,0); k=i; sum=0; - for (r=0; rrandom(MIN_RAND, 1.0); } } SG_FREE(R); R=NULL ; //initialize b values that have to be learned R=SG_MALLOC(float64_t, M); - for (r=0; rrandom(MIN_RAND, 1.0); i=0; sum=0; k=0 ; j=model->get_learn_b(i,0); while (model->get_learn_b(i,0)!=-1 || kget_learn_b(i,0); k=i; sum=0; - for (r=0; rrandom(MIN_RAND, 1.0); } } SG_FREE(R); R=NULL ; @@ -2625,7 +2634,7 @@ void CHMM::init_model_defined() sum=0; while (model->get_learn_p(i)!=-1) { - set_p(model->get_learn_p(i),CMath::random(MIN_RAND,1.0)) ; + set_p(model->get_learn_p(i), m_rng->random(MIN_RAND, 1.0)); sum+=get_p(model->get_learn_p(i)) ; i++ ; } ; @@ -2641,7 +2650,7 @@ void CHMM::init_model_defined() sum=0; while (model->get_learn_q(i)!=-1) { - set_q(model->get_learn_q(i),CMath::random(MIN_RAND,1.0)) ; + set_q(model->get_learn_q(i), m_rng->random(MIN_RAND, 1.0)); sum+=get_q(model->get_learn_q(i)) ; i++ ; } ; @@ -5071,7 +5080,7 @@ void CHMM::add_states(int32_t num_states, float64_t default_value) // warning pay attention to the ordering of // transition_matrix_a, observation_matrix_b !!! - for (i=0; i CDataGenerator::generate_checkboard_data(int32_t num_classes int32_t dim, int32_t num_points, float64_t overlap) { int32_t points_per_class = num_points / num_classes; + auto m_rng = std::unique_ptr(new CRandom(sg_random_seed)); int32_t grid_size = (int32_t ) CMath::ceil(CMath::sqrt((float64_t ) num_classes)); float64_t cell_size = (float64_t ) 1 / grid_size; @@ -52,11 +53,12 @@ SGMatrix CDataGenerator::generate_checkboard_data(int32_t num_classes { do { - points(i, p) = CMath::normal_random(class_dim_centers[i], cell_size*0.5); + points(i, p) = m_rng->normal_random( + class_dim_centers[i], cell_size * 0.5); if ((points(i, p)>(grid_idx[i]+1)*cell_size) || (points(i, p)random(0.0, 1.0) < overlap)) continue; } break; @@ -84,12 +86,13 @@ SGMatrix CDataGenerator::generate_mean_data(index_t m, /* evtl. allocate space */ SGMatrix result=SGMatrix::get_allocated_matrix( dim, 2*m, target); + auto m_rng = std::unique_ptr(new CRandom(sg_random_seed)); /* fill matrix with normal data */ for (index_t i=0; i<2*m; ++i) { for (index_t j=0; jstd_normal_distrib(); /* mean shift for second half */ if (i>=m) @@ -105,7 +108,7 @@ SGMatrix CDataGenerator::generate_sym_mix_gauss(index_t m, /* evtl. allocate space */ SGMatrix result=SGMatrix::get_allocated_matrix( 2, m, target); - + auto m_rng = std::unique_ptr(new CRandom(sg_random_seed)); /* rotation matrix */ SGMatrix rot=SGMatrix(2,2); rot(0, 0)=CMath::cos(angle); @@ -117,8 +120,10 @@ SGMatrix CDataGenerator::generate_sym_mix_gauss(index_t m, * Gaussians */ for (index_t i=0; istd_normal_distrib() + (m_rng->random(0, 1) ? d : -d); + result(1, i) = + m_rng->std_normal_distrib() + (m_rng->random(0, 1) ? d : -d); } /* rotate result */ diff --git a/src/shogun/features/RandomFourierDotFeatures.cpp b/src/shogun/features/RandomFourierDotFeatures.cpp index b31b8104aca..046102bc32c 100644 --- a/src/shogun/features/RandomFourierDotFeatures.cpp +++ b/src/shogun/features/RandomFourierDotFeatures.cpp @@ -86,11 +86,11 @@ SGVector CRandomFourierDotFeatures::generate_random_parameter_vector( case GAUSSIAN: for (index_t i=0; inormal_random(0.0, 1); } - vec[vec.vlen-1] = CMath::random(0.0, 2 * CMath::PI); + vec[vec.vlen - 1] = m_rng->random(0.0, 2 * CMath::PI); break; default: diff --git a/src/shogun/features/streaming/generators/GaussianBlobsDataGenerator.cpp b/src/shogun/features/streaming/generators/GaussianBlobsDataGenerator.cpp index ac46ae7e045..d69c3f41190 100644 --- a/src/shogun/features/streaming/generators/GaussianBlobsDataGenerator.cpp +++ b/src/shogun/features/streaming/generators/GaussianBlobsDataGenerator.cpp @@ -86,12 +86,12 @@ bool CGaussianBlobsDataGenerator::get_next_example() SGVector result=SGVector(2); /* sample latent distribution to compute offsets */ - index_t x_offset=CMath::random(0, m_sqrt_num_blobs-1)*m_distance; - index_t y_offset=CMath::random(0, m_sqrt_num_blobs-1)*m_distance; + index_t x_offset = m_rng->random(0, m_sqrt_num_blobs - 1) * m_distance; + index_t y_offset = m_rng->random(0, m_sqrt_num_blobs - 1) * m_distance; /* sample from std Gaussian */ - float64_t x=CMath::randn_double(); - float64_t y=CMath::randn_double(); + float64_t x = m_rng->std_normal_distrib(); + float64_t y = m_rng->std_normal_distrib(); /* transform through cholesky and add offset */ result[0]=m_cholesky(0, 0)*x+m_cholesky(0, 1)*y+x_offset; diff --git a/src/shogun/features/streaming/generators/MeanShiftDataGenerator.cpp b/src/shogun/features/streaming/generators/MeanShiftDataGenerator.cpp index 3c14c200e7a..4759c74fa26 100644 --- a/src/shogun/features/streaming/generators/MeanShiftDataGenerator.cpp +++ b/src/shogun/features/streaming/generators/MeanShiftDataGenerator.cpp @@ -63,7 +63,7 @@ bool CMeanShiftDataGenerator::get_next_example() /* fill with std normal data */ for (index_t i=0; istd_normal_distrib(); /* mean shift in selected dimension */ result[m_dimension_shift]+=m_mean_shift; diff --git a/src/shogun/kernel/PyramidChi2.cpp b/src/shogun/kernel/PyramidChi2.cpp index e2f901c2edb..bc18c49b06f 100644 --- a/src/shogun/kernel/PyramidChi2.cpp +++ b/src/shogun/kernel/PyramidChi2.cpp @@ -154,7 +154,10 @@ float64_t CPyramidChi2::compute(int32_t idx_a, int32_t idx_b) if (num_randfeats_forwidthcomputation >0) { for(int32_t i=0; i< numind;++i) - featindices[i]=CMath::random(0, ((CDenseFeatures*) lhs)->get_num_vectors()-1); + featindices[i] = m_rng->random( + 0, + ((CDenseFeatures*)lhs)->get_num_vectors() - + 1); } else { diff --git a/src/shogun/lib/SGVector.cpp b/src/shogun/lib/SGVector.cpp index cc0ea44bd0b..ae59f7a60d5 100644 --- a/src/shogun/lib/SGVector.cpp +++ b/src/shogun/lib/SGVector.cpp @@ -644,8 +644,9 @@ void SGVector::vec1_plus_scalar_times_vec2(float32_t* vec1, template void SGVector::random_vector(T* vec, int32_t len, T min_value, T max_value) { + auto m_rng = std::unique_ptr(new CRandom(sg_random_seed)); for (int32_t i=0; irandom(min_value, max_value); } template <> diff --git a/src/shogun/lib/tapkee/defines/random.hpp b/src/shogun/lib/tapkee/defines/random.hpp index 6d6bc266bc7..66dafd3dfdc 100644 --- a/src/shogun/lib/tapkee/defines/random.hpp +++ b/src/shogun/lib/tapkee/defines/random.hpp @@ -16,7 +16,8 @@ namespace tapkee inline IndexType uniform_random_index() { #ifdef CUSTOM_UNIFORM_RANDOM_INDEX_FUNCTION - return CUSTOM_UNIFORM_RANDOM_INDEX_FUNCTION % std::numeric_limits::max(); + return CUSTOM_UNIFORM_RANDOM_INDEX_FUNCTION() % + std::numeric_limits::max(); #else return std::rand(); #endif @@ -30,7 +31,7 @@ inline IndexType uniform_random_index_bounded(IndexType upper) inline ScalarType uniform_random() { #ifdef CUSTOM_UNIFORM_RANDOM_FUNCTION - return CUSTOM_UNIFORM_RANDOM_FUNCTION; + return CUSTOM_UNIFORM_RANDOM_FUNCTION(); #else return std::rand()/((double)RAND_MAX+1); #endif @@ -39,7 +40,7 @@ inline ScalarType uniform_random() inline ScalarType gaussian_random() { #ifdef CUSTOM_GAUSSIAN_RANDOM_FUNCTION - return CUSTOM_GAUSSIAN_RANDOM_FUNCTION; + return CUSTOM_GAUSSIAN_RANDOM_FUNCTION(); #else ScalarType x, y, radius; do { diff --git a/src/shogun/lib/tapkee/tapkee_shogun.cpp b/src/shogun/lib/tapkee/tapkee_shogun.cpp index 8a2783dad85..b5d750704ed 100644 --- a/src/shogun/lib/tapkee/tapkee_shogun.cpp +++ b/src/shogun/lib/tapkee/tapkee_shogun.cpp @@ -5,10 +5,25 @@ #include - -#define CUSTOM_UNIFORM_RANDOM_INDEX_FUNCTION shogun::CMath::random() -#define CUSTOM_UNIFORM_RANDOM_FUNCTION shogun::CMath::random(static_cast(0),static_cast(1)) -#define CUSTOM_GAUSSIAN_RANDOM_FUNCTION shogun::CMath::normal_random(static_cast(0),static_cast(1)) +#define CUSTOM_UNIFORM_RANDOM_INDEX_FUNCTION \ + []() -> uint64_t { \ + auto rng = std::unique_ptr(new CRandom()); \ + return rng->random_64(); \ + } +#define CUSTOM_UNIFORM_RANDOM_FUNCTION \ + []() { \ + auto rng = std::unique_ptr(new CRandom()); \ + return rng->random( \ + static_cast(0), \ + static_cast(1)); \ + } +#define CUSTOM_GAUSSIAN_RANDOM_FUNCTION \ + []() { \ + auto rng = std::unique_ptr(new CRandom()); \ + return rng->normal_random( \ + static_cast(0), \ + static_cast(1)); \ + } #define TAPKEE_EIGEN_INCLUDE_FILE #ifdef HAVE_ARPACK diff --git a/src/shogun/machine/BaggingMachine.cpp b/src/shogun/machine/BaggingMachine.cpp index 994ab9b899a..33e3841669c 100644 --- a/src/shogun/machine/BaggingMachine.cpp +++ b/src/shogun/machine/BaggingMachine.cpp @@ -175,9 +175,9 @@ bool CBaggingMachine::train_machine(CFeatures* data) SGMatrix rnd_indicies(m_bag_size, m_num_bags); for (index_t i = 0; i < m_num_bags*m_bag_size; ++i) - rnd_indicies.matrix[i] = CMath::random(0, m_bag_size-1); + rnd_indicies.matrix[i] = m_rng->random(0, m_bag_size - 1); - #pragma omp parallel for +#pragma omp parallel for for (int32_t i = 0; i < m_num_bags; ++i) { CMachine* c=dynamic_cast(m_machine->clone()); diff --git a/src/shogun/mathematics/Math.cpp b/src/shogun/mathematics/Math.cpp index ba34ea429d4..228159805a3 100644 --- a/src/shogun/mathematics/Math.cpp +++ b/src/shogun/mathematics/Math.cpp @@ -33,8 +33,6 @@ int32_t CMath::LOGACCURACY = 0; // 100000 steps per integer int32_t CMath::LOGRANGE = 0; // range for logtable: log(1+exp(x)) -25 <= x <= 0 -CRandom* CMath::m_rng = new CRandom(12345); - const float64_t CMath::NOT_A_NUMBER = NAN; const float64_t CMath::INFTY = INFINITY; // infinity const float64_t CMath::ALMOST_INFTY = +1e+300; //a large number diff --git a/src/shogun/mathematics/Math.h b/src/shogun/mathematics/Math.h index 8a7ac44cd92..8a625081042 100644 --- a/src/shogun/mathematics/Math.h +++ b/src/shogun/mathematics/Math.h @@ -11,13 +11,13 @@ #ifndef __MATHEMATICS_H_ #define __MATHEMATICS_H_ -#include - -#include +#include #include -#include +#include #include -#include +#include +#include +#include #ifndef _USE_MATH_DEFINES #define _USE_MATH_DEFINES @@ -782,152 +782,6 @@ class CMath : public CSGObject res*=i ; return res ; } - - /** - * @name Random Functions - */ - //@{ - /** Initiates seed for pseudo random generator - * @param initseed value of seed - */ - static void init_random(uint32_t initseed=0) - { - if (initseed==0) - m_rng->set_seed(CRandom::generate_seed()); - else - m_rng->set_seed(initseed); - } - - /** Returns random number - * @return unsigned 64 bit integer - */ - static inline uint64_t random() - { - uint64_t result = m_rng->random_64(); - return result; - } - - /** Returns random number - * @return unsigned 64 bit integer - */ - static inline uint64_t random(uint64_t min_value, uint64_t max_value) - { - uint64_t result = m_rng->random(min_value, max_value); - return result; - } - - /** Returns random number between minimum and maximum value - * @param min_value minimum value (64 bit integer) - * @param max_value maximum value (64 bit integer) - * @return signed 64 bit integer - */ - static inline int64_t random(int64_t min_value, int64_t max_value) - { - int64_t result = m_rng->random(min_value, max_value); - return result; - } - - /** Returns random number between minimum and maximum value - * @param min_value minimum value (32 bit unsigned integer) - * @param max_value maximum value (32 bit unsigned integer) - * @return unsigned 32 bit integer - */ - static inline uint32_t random(uint32_t min_value, uint32_t max_value) - { - uint32_t result = m_rng->random(min_value, max_value); - return result; - } - - /** Returns random number between minimum and maximum value - * @param min_value minimum value (32 bit signed integer) - * @param max_value maximum value (32 bit signed integer) - * @return signed 32 bit integer - */ - static inline int32_t random(int32_t min_value, int32_t max_value) - { - int32_t result = m_rng->random(min_value, max_value); - return result; - } - - /** Returns random number between minimum and maximum value - * @param min_value minimum value (32 bit float) - * @param max_value maximum value (32 bit float) - * @return 32 bit float - */ - static inline float32_t random(float32_t min_value, float32_t max_value) - { - float32_t result = m_rng->random(min_value, max_value); - return result; - } - - /** Returns random number between minimum and maximum value - * @param min_value minimum value (64 bit float) - * @param max_value maximum value (64 bit float) - * @return 64 bit float - */ - static inline float64_t random(float64_t min_value, float64_t max_value) - { - float64_t result = m_rng->random(min_value, max_value); - return result; - } - - /** Returns random number between minimum and maximum value - * @param min_value minimum value (128 bit float) - * @param max_value maximum value (128 bit float) - * @return 128 bit float - */ - static inline floatmax_t random(floatmax_t min_value, floatmax_t max_value) - { - floatmax_t result = m_rng->random(min_value, max_value); - return result; - } - - /// Returns a Gaussian or Normal random number. - /// Using the polar form of the Box-Muller transform. - /// http://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform#Polar_form - static inline float32_t normal_random(float32_t mean, float32_t std_dev) - { - // sets up variables & makes sure rand_s.range == (0,1) - float32_t ret; - float32_t rand_u; - float32_t rand_v; - float32_t rand_s; - do - { - rand_u = static_cast(CMath::random(-1.0, 1.0)); - rand_v = static_cast(CMath::random(-1.0, 1.0)); - rand_s = rand_u*rand_u + rand_v*rand_v; - } while ((rand_s == 0) || (rand_s >= 1)); - - // the meat & potatos, and then the mean & standard deviation shifting... - ret = static_cast(rand_u*CMath::sqrt(-2.0*CMath::log(rand_s)/rand_s)); - ret = std_dev*ret + mean; - return ret; - } - - /// Returns a Gaussian or Normal random number. - /// Using the polar form of the Box-Muller transform. - /// http://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform#Polar_form - static inline float64_t normal_random(float64_t mean, float64_t std_dev) - { - float64_t result = m_rng->normal_distrib(mean, std_dev); - return result; - } - - /// Convenience method for generating Standard Normal random numbers - /// Float: Mean = 0 and Standard Deviation = 1 - static inline float32_t randn_float() - { - return static_cast(normal_random(0.0, 1.0)); - } - - /// Convenience method for generating Standard Normal random numbers - /// Double: Mean = 0 and Standard Deviation = 1 - static inline float64_t randn_double() - { - float64_t result = m_rng->std_normal_distrib(); - return result; - } //@} /** Implements the greatest common divisor (gcd) via modulo operations. @@ -956,25 +810,22 @@ class CMath : public CSGObject return 0 == a ? b : a; } - /** Permute randomly the elements of the vector. If provided, use the - * random object to generate the permutations. - * @param v the vector to permute. - * @param rand random object that might be used to generate the permutations. - */ template - static void permute(SGVector v, CRandom* rand=NULL) + static void permute(SGVector v, CRandom* rand = NULL) + { + if (rand) { - if (rand) - { - for (index_t i=0; irandom(i, v.vlen-1)]); - } - else - { - for (index_t i=0; irandom(i, v.vlen - 1)]); } + else + { + auto m_rng = + std::unique_ptr(new CRandom(sg_random_seed)); + for (index_t i = 0; i < v.vlen; ++i) + swap(v[i], v[m_rng->random(i, v.vlen - 1)]); + } + } /** Computes sum of non-zero elements * @param vec vector @@ -1888,8 +1739,6 @@ class CMath : public CSGObject static const float32_t F_MIN_VAL32; static const float64_t F_MIN_VAL64; - static CRandom* m_rng; - protected: /// range for logtable: log(1+exp(x)) -LOGRANGE <= x <= 0 static int32_t LOGRANGE; diff --git a/src/shogun/mathematics/Random.cpp b/src/shogun/mathematics/Random.cpp index 82ed10a87ae..91541129acc 100644 --- a/src/shogun/mathematics/Random.cpp +++ b/src/shogun/mathematics/Random.cpp @@ -9,12 +9,13 @@ #include #endif -#include #include +#include +#include #include #include -#include -#include +#include +#include #ifdef DEV_RANDOM #include @@ -27,7 +28,7 @@ CRandom::CRandom() m_sfmt_64(NULL), m_dsfmt(NULL) { - m_seed = CRandom::generate_seed(); + m_seed = sg_random_seed; init(); } @@ -340,25 +341,35 @@ void CRandom::reinit(uint32_t seed) m_state_lock.unlock(); } -uint32_t CRandom::generate_seed() +float32_t CRandom::normal_random(float32_t mean, float32_t std_dev) { - uint32_t seed; -#if defined(_WIN32) - rand_s(&seed); -#elif defined(HAVE_ARC4RANDOM) - seed = arc4random(); -#elif defined(DEV_RANDOM) - int fd = open(DEV_RANDOM, O_RDONLY); - ASSERT(fd >= 0); - ssize_t actual_read = - read(fd, reinterpret_cast(&seed), sizeof(seed)); - close(fd); - ASSERT(actual_read == sizeof(seed)); -#else - SG_SWARNING("Not safe seed for the PRNG\n"); - struct timeval tv; - gettimeofday(&tv, NULL); - seed=(uint32_t) (4223517*getpid()*tv.tv_sec*tv.tv_usec); -#endif - return seed; + // sets up variables & makes sure rand_s.range == (0,1) + float32_t ret; + float32_t rand_u; + float32_t rand_v; + float32_t rand_s; + do + { + rand_u = static_cast(random(-1.0, 1.0)); + rand_v = static_cast(random(-1.0, 1.0)); + rand_s = rand_u * rand_u + rand_v * rand_v; + } while ((rand_s == 0) || (rand_s >= 1)); + + // the meat & potatos, and then the mean & standard deviation + // shifting... + ret = static_cast( + rand_u * CMath::sqrt(-2.0 * CMath::log(rand_s) / rand_s)); + ret = std_dev * ret + mean; + return ret; +} + +float64_t CRandom::normal_random(float64_t mean, float64_t std_dev) +{ + float64_t result = normal_distrib(mean, std_dev); + return result; +} + +float32_t CRandom::randn_float() +{ + return static_cast(normal_random(0.0, 1.0)); } diff --git a/src/shogun/mathematics/Random.h b/src/shogun/mathematics/Random.h index 399d63217f9..00a911adcf6 100644 --- a/src/shogun/mathematics/Random.h +++ b/src/shogun/mathematics/Random.h @@ -14,7 +14,6 @@ #include #include #include -#include /* opaque pointers */ struct SFMT_T; @@ -22,7 +21,9 @@ struct DSFMT_T; namespace shogun { + extern uint32_t sg_random_seed; class CLock; + class CMath; /** @brief: Pseudo random number geneartor * * It is based on SIMD oriented Fast Mersenne Twister(SFMT) pseudorandom @@ -264,14 +265,37 @@ namespace shogun */ float64_t std_normal_distrib() const; - /** - * Generate a seed for PRNG - * - * @return entropy for PRNG - */ - static uint32_t generate_seed(); - - virtual const char* get_name() const { return "Random"; } + /** + *Returns a Gaussian or Normal random number. + *Using the polar form of the Box-Muller transform. + *http://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform#Polar_form + */ + float32_t normal_random(float32_t mean, float32_t std_dev); + + /** + *Returns a Gaussian or Normal random number. + *Using the polar form of the Box-Muller transform. + *http://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform#Polar_form + */ + float64_t normal_random(float64_t mean, float64_t std_dev); + + /* + *Convenience method for generating Standard Normal random numbers + *Float: Mean = 0 and Standard Deviation = 1 + */ + float32_t randn_float(); + + /** + * Generate a seed for PRNG + * + * @return entropy for PRNG + */ + static uint32_t generate_seed(); + + virtual const char* get_name() const + { + return "Random"; + } private: /** initialise the object */ diff --git a/src/shogun/mathematics/Statistics.cpp b/src/shogun/mathematics/Statistics.cpp index d4f062dad9e..5761cd6e2d2 100644 --- a/src/shogun/mathematics/Statistics.cpp +++ b/src/shogun/mathematics/Statistics.cpp @@ -323,6 +323,7 @@ SGVector CStatistics::sample_indices(int32_t sample_size, int32_t N) int32_t* idxs=SG_MALLOC(int32_t,N); int32_t i, rnd; int32_t* permuted_idxs=SG_MALLOC(int32_t,sample_size); + auto rng = std::unique_ptr(new CRandom(sg_random_seed)); // reservoir sampling for (i=0; i CStatistics::sample_indices(int32_t sample_size, int32_t N) permuted_idxs[i]=idxs[i]; for (i=sample_size; irandom(1, i); if (rnd CStatistics::sample_from_gaussian(SGVector mean, int32_t dim=mean.vlen; Map mu(mean.vector, mean.vlen); Map c(cov.matrix, cov.num_rows, cov.num_cols); + auto rng = std::unique_ptr(new CRandom(sg_random_seed)); // generate samples, z, from N(0, I), DxN SGMatrix S(dim, N); for( int32_t j=0; jstd_normal_distrib(); // the cholesky factorization c=L*U MatrixXd U=c.llt().matrixU(); @@ -771,6 +773,7 @@ SGMatrix CStatistics::sample_from_gaussian(SGVector mean, typedef SparseMatrix MatrixType; const MatrixType &c=EigenSparseUtil::toEigenSparse(cov); + auto rng = std::unique_ptr(new CRandom(sg_random_seed)); SimplicialLLT llt; @@ -778,7 +781,7 @@ SGMatrix CStatistics::sample_from_gaussian(SGVector mean, SGMatrix S(dim, N); for( int32_t j=0; jstd_normal_distrib(); Map s(S.matrix, S.num_rows, S.num_cols); diff --git a/src/shogun/mathematics/ajd/QDiag.cpp b/src/shogun/mathematics/ajd/QDiag.cpp index c4aed34e7db..c8e2df57616 100644 --- a/src/shogun/mathematics/ajd/QDiag.cpp +++ b/src/shogun/mathematics/ajd/QDiag.cpp @@ -16,6 +16,7 @@ SGMatrix CQDiag::diagonalize(SGNDArray C, SGMatrix V; + auto rng = std::unique_ptr(new CRandom(sg_random_seed)); if (V0.num_rows == N && V0.num_cols == N) { V = V0.clone(); @@ -27,7 +28,7 @@ SGMatrix CQDiag::diagonalize(SGNDArray C, SGMatrixstd_normal_distrib(); } } diff --git a/src/shogun/modelselection/ModelSelectionParameters.cpp b/src/shogun/modelselection/ModelSelectionParameters.cpp index cc1cf96fa09..e69f52347cb 100644 --- a/src/shogun/modelselection/ModelSelectionParameters.cpp +++ b/src/shogun/modelselection/ModelSelectionParameters.cpp @@ -199,7 +199,7 @@ CParameterCombination* CModelSelectionParameters::get_single_combination( index_t i = 0; if (is_rand) - i = CMath::random(0, m_values_length-1); + i = m_rng->random(0, m_values_length - 1); Parameter* p=new Parameter(); @@ -212,7 +212,7 @@ CParameterCombination* CModelSelectionParameters::get_single_combination( for (index_t j = 0; j < param_vect->vlen; j++) { if (is_rand) - i = CMath::random(0, m_values_length-1); + i = m_rng->random(0, m_values_length - 1); (*param_vect)[j] = ((float64_t*)m_values)[i]; } p->add(param_vect, m_node_name); @@ -225,7 +225,7 @@ CParameterCombination* CModelSelectionParameters::get_single_combination( for (index_t j = 0; j < *m_vector_length; j++) { if (is_rand) - i = CMath::random(0, m_values_length-1); + i = m_rng->random(0, m_values_length - 1); (param_vect)[j] = ((float64_t*)m_values)[i]; } p->add_vector(¶m_vect, m_vector_length, m_node_name); @@ -240,7 +240,7 @@ CParameterCombination* CModelSelectionParameters::get_single_combination( for (index_t j = 0; j < param_vect->vlen; j++) { if (is_rand) - i = CMath::random(0, m_values_length-1); + i = m_rng->random(0, m_values_length - 1); (*param_vect)[j] = ((int32_t*)m_values)[i]; } p->add(param_vect, m_node_name); @@ -253,7 +253,7 @@ CParameterCombination* CModelSelectionParameters::get_single_combination( for (index_t j = 0; j < *m_vector_length; j++) { if (is_rand) - i = CMath::random(0, m_values_length-1); + i = m_rng->random(0, m_values_length - 1); (param_vect)[j] = ((int32_t*)m_values)[i]; } p->add_vector(¶m_vect, m_vector_length, m_node_name); diff --git a/src/shogun/multiclass/LaRank.cpp b/src/shogun/multiclass/LaRank.cpp index e496709fa61..744412fe258 100644 --- a/src/shogun/multiclass/LaRank.cpp +++ b/src/shogun/multiclass/LaRank.cpp @@ -756,7 +756,7 @@ int32_t CLaRank::add (int32_t x_id, int32_t yi) if (w_opt < prop_min) w_opt = prop_min; w_sum = w_pro + w_rep + w_opt; - float64_t r = CMath::random(0.0, w_sum); + float64_t r = m_rng->random(0.0, w_sum); if (r <= w_pro) { break; diff --git a/src/shogun/multiclass/LaRank.h b/src/shogun/multiclass/LaRank.h index 554ca76c1c4..d040975bf6a 100644 --- a/src/shogun/multiclass/LaRank.h +++ b/src/shogun/multiclass/LaRank.h @@ -249,46 +249,49 @@ namespace shogun LaRankPattern & sample () { - ASSERT (!empty ()) - while (true) - { - uint32_t r = CMath::random(uint32_t(0), uint32_t(patterns.size ()-1)); - if (patterns[r].exists ()) - return patterns[r]; - } - return patterns[0]; - } - - uint32_t getPatternRank (int32_t x_id) - { - return x_id2rank[x_id]; - } - - bool isPattern (int32_t x_id) - { - return x_id2rank[x_id] != 0; - } - - LaRankPattern & getPattern (int32_t x_id) - { - uint32_t rank = x_id2rank[x_id]; - return patterns[rank]; - } - - uint32_t maxcount () const - { - return patterns.size (); - } - - LaRankPattern & operator [] (uint32_t i) - { - return patterns[i]; - } - - const LaRankPattern & operator [] (uint32_t i) const - { - return patterns[i]; - } + auto m_rng = + std::unique_ptr(new CRandom(sg_random_seed)); + ASSERT(!empty()) + while (true) + { + uint32_t r = m_rng->random( + uint32_t(0), uint32_t(patterns.size() - 1)); + if (patterns[r].exists()) + return patterns[r]; + } + return patterns[0]; + } + + uint32_t getPatternRank(int32_t x_id) + { + return x_id2rank[x_id]; + } + + bool isPattern(int32_t x_id) + { + return x_id2rank[x_id] != 0; + } + + LaRankPattern& getPattern(int32_t x_id) + { + uint32_t rank = x_id2rank[x_id]; + return patterns[rank]; + } + + uint32_t maxcount() const + { + return patterns.size(); + } + + LaRankPattern& operator[](uint32_t i) + { + return patterns[i]; + } + + const LaRankPattern& operator[](uint32_t i) const + { + return patterns[i]; + } private: std_hash_set < uint32_t >freeidx; diff --git a/src/shogun/multiclass/ecoc/ECOCDiscriminantEncoder.cpp b/src/shogun/multiclass/ecoc/ECOCDiscriminantEncoder.cpp index 693973587ef..1db5ebc6f58 100644 --- a/src/shogun/multiclass/ecoc/ECOCDiscriminantEncoder.cpp +++ b/src/shogun/multiclass/ecoc/ECOCDiscriminantEncoder.cpp @@ -133,40 +133,39 @@ float64_t CECOCDiscriminantEncoder::sffs_iteration(float64_t MI, vector if (part1.size() <= 1) return MI; - int32_t iclas = CMath::random(0, int32_t(part1.size()-1)); - int32_t clas = part1[iclas]; - - // move clas from part1 to part2 - for (int32_t i=0; i < m_labels->get_num_labels(); ++i) - { - if (((CMulticlassLabels*) m_labels)->get_int_label(i) == clas) - { - idata1.erase(i); - idata2.insert(i); - } - } - - float64_t new_MI = compute_MI(idata1, idata2); - if (new_MI < MI) - { - part2.push_back(clas); - part1.erase(part1.begin() + iclas); - return new_MI; - } - else - { - // revert changes - for (int32_t i=0; i < m_labels->get_num_labels(); ++i) - { - if (((CMulticlassLabels*) m_labels)->get_int_label(i) == clas) - { - idata2.erase(i); - idata1.insert(i); - } - } - return MI; - } - + int32_t iclas = m_rng->random(0, int32_t(part1.size() - 1)); + int32_t clas = part1[iclas]; + + // move clas from part1 to part2 + for (int32_t i = 0; i < m_labels->get_num_labels(); ++i) + { + if (((CMulticlassLabels*)m_labels)->get_int_label(i) == clas) + { + idata1.erase(i); + idata2.insert(i); + } + } + + float64_t new_MI = compute_MI(idata1, idata2); + if (new_MI < MI) + { + part2.push_back(clas); + part1.erase(part1.begin() + iclas); + return new_MI; + } + else + { + // revert changes + for (int32_t i = 0; i < m_labels->get_num_labels(); ++i) + { + if (((CMulticlassLabels*)m_labels)->get_int_label(i) == clas) + { + idata2.erase(i); + idata1.insert(i); + } + } + return MI; + } } float64_t CECOCDiscriminantEncoder::compute_MI(const std::set& idata1, const std::set& idata2) diff --git a/src/shogun/multiclass/ecoc/ECOCRandomDenseEncoder.cpp b/src/shogun/multiclass/ecoc/ECOCRandomDenseEncoder.cpp index 7899463b95d..c783afb4f3b 100644 --- a/src/shogun/multiclass/ecoc/ECOCRandomDenseEncoder.cpp +++ b/src/shogun/multiclass/ecoc/ECOCRandomDenseEncoder.cpp @@ -56,59 +56,61 @@ SGMatrix CECOCRandomDenseEncoder::create_codebook(int32_t num_classes) { for (int32_t j=0; j < num_classes; ++j) { - float64_t randval = CMath::random(0.0, 1.0); - if (randval > m_pposone) - codebook(i, j) = -1; - else - codebook(i, j) = +1; - } - } - - bool valid = true; - for (int32_t i=0; i < codelen; ++i) - { - bool p1_occur = false, n1_occur = false; - for (int32_t j=0; j < num_classes; ++j) - if (codebook(i, j) == 1) - p1_occur = true; - else if (codebook(i, j) == -1) - n1_occur = true; - - if (!p1_occur || !n1_occur) - { - valid = false; - break; - } - } - - if (valid) - { - // see if this is a better codebook - // compute the minimum pairwise code distance - int32_t min_dist = std::numeric_limits::max(); - for (int32_t i=0; i < num_classes; ++i) - { - for (int32_t j=i+1; j < num_classes; ++j) - { - int32_t dist = CECOCUtil::hamming_distance(codebook.get_column_vector(i), - codebook.get_column_vector(j), codelen); - if (dist < min_dist) - min_dist = dist; - } - } - - if (min_dist > best_dist) - { - best_dist = min_dist; - std::copy(codebook.matrix, codebook.matrix + codelen*num_classes, - best_codebook.matrix); - } - } - - if (++n_iter >= m_maxiter) - if (best_dist > 0) // already obtained a good codebook - break; - } - - return best_codebook; + float64_t randval = m_rng->random(0.0, 1.0); + if (randval > m_pposone) + codebook(i, j) = -1; + else + codebook(i, j) = +1; + } + } + + bool valid = true; + for (int32_t i = 0; i < codelen; ++i) + { + bool p1_occur = false, n1_occur = false; + for (int32_t j = 0; j < num_classes; ++j) + if (codebook(i, j) == 1) + p1_occur = true; + else if (codebook(i, j) == -1) + n1_occur = true; + + if (!p1_occur || !n1_occur) + { + valid = false; + break; + } + } + + if (valid) + { + // see if this is a better codebook + // compute the minimum pairwise code distance + int32_t min_dist = std::numeric_limits::max(); + for (int32_t i = 0; i < num_classes; ++i) + { + for (int32_t j = i + 1; j < num_classes; ++j) + { + int32_t dist = CECOCUtil::hamming_distance( + codebook.get_column_vector(i), + codebook.get_column_vector(j), codelen); + if (dist < min_dist) + min_dist = dist; + } + } + + if (min_dist > best_dist) + { + best_dist = min_dist; + std::copy( + codebook.matrix, codebook.matrix + codelen * num_classes, + best_codebook.matrix); + } + } + + if (++n_iter >= m_maxiter) + if (best_dist > 0) // already obtained a good codebook + break; + } + + return best_codebook; } diff --git a/src/shogun/multiclass/ecoc/ECOCRandomSparseEncoder.cpp b/src/shogun/multiclass/ecoc/ECOCRandomSparseEncoder.cpp index 479bdad3581..5278ee48aaf 100644 --- a/src/shogun/multiclass/ecoc/ECOCRandomSparseEncoder.cpp +++ b/src/shogun/multiclass/ecoc/ECOCRandomSparseEncoder.cpp @@ -66,55 +66,57 @@ SGMatrix CECOCRandomSparseEncoder::create_codebook(int32_t num_classes) for (int32_t j=0; j < num_classes; ++j) random_sel[j] = j; std::random_shuffle(random_sel.begin(), random_sel.end()); - if (CMath::random(0.0, 1.0) > 0.5) - { - codebook(i, random_sel[0]) = +1; - codebook(i, random_sel[1]) = -1; - } - else - { - codebook(i, random_sel[0]) = -1; - codebook(i, random_sel[1]) = +1; - } - - // assign the remaining positions - for (int32_t j=2; j < num_classes; ++j) - { - float64_t randval = CMath::random(0.0, 1.0); - if (randval > m_pzero) - { - if (randval > m_pzero+m_pposone) - codebook(i, random_sel[j]) = -1; - else - codebook(i, random_sel[j]) = +1; - } - } - } - - // see if this is a better codebook - // compute the minimum pairwise code distance - int32_t min_dist = std::numeric_limits::max(); - for (int32_t i=0; i < num_classes; ++i) - { - for (int32_t j=i+1; j < num_classes; ++j) - { - int32_t dist = CECOCUtil::hamming_distance(codebook.get_column_vector(i), - codebook.get_column_vector(j), codelen); - if (dist < min_dist) - min_dist = dist; - } - } - - if (min_dist > best_dist) - { - best_dist = min_dist; - std::copy(codebook.matrix, codebook.matrix + codelen*num_classes, - best_codebook.matrix); - } - - if (++n_iter >= m_maxiter) - break; - } - - return best_codebook; + if (m_rng->random(0.0, 1.0) > 0.5) + { + codebook(i, random_sel[0]) = +1; + codebook(i, random_sel[1]) = -1; + } + else + { + codebook(i, random_sel[0]) = -1; + codebook(i, random_sel[1]) = +1; + } + + // assign the remaining positions + for (int32_t j = 2; j < num_classes; ++j) + { + float64_t randval = m_rng->random(0.0, 1.0); + if (randval > m_pzero) + { + if (randval > m_pzero + m_pposone) + codebook(i, random_sel[j]) = -1; + else + codebook(i, random_sel[j]) = +1; + } + } + } + + // see if this is a better codebook + // compute the minimum pairwise code distance + int32_t min_dist = std::numeric_limits::max(); + for (int32_t i = 0; i < num_classes; ++i) + { + for (int32_t j = i + 1; j < num_classes; ++j) + { + int32_t dist = CECOCUtil::hamming_distance( + codebook.get_column_vector(i), + codebook.get_column_vector(j), codelen); + if (dist < min_dist) + min_dist = dist; + } + } + + if (min_dist > best_dist) + { + best_dist = min_dist; + std::copy( + codebook.matrix, codebook.matrix + codelen * num_classes, + best_codebook.matrix); + } + + if (++n_iter >= m_maxiter) + break; + } + + return best_codebook; } diff --git a/src/shogun/multiclass/tree/RandomConditionalProbabilityTree.cpp b/src/shogun/multiclass/tree/RandomConditionalProbabilityTree.cpp index 6bebe16b09e..3dcb041b916 100644 --- a/src/shogun/multiclass/tree/RandomConditionalProbabilityTree.cpp +++ b/src/shogun/multiclass/tree/RandomConditionalProbabilityTree.cpp @@ -11,7 +11,7 @@ using namespace shogun; bool CRandomConditionalProbabilityTree::which_subtree(bnode_t *node, SGVector ex) { - if (CMath::random(0.0, 1.0) > 0.5) + if (m_rng->random(0.0, 1.0) > 0.5) return true; return false; } diff --git a/src/shogun/neuralnets/DeepBeliefNetwork.cpp b/src/shogun/neuralnets/DeepBeliefNetwork.cpp index 2a0cdcd4762..2a3605a1a63 100644 --- a/src/shogun/neuralnets/DeepBeliefNetwork.cpp +++ b/src/shogun/neuralnets/DeepBeliefNetwork.cpp @@ -92,7 +92,7 @@ void CDeepBeliefNetwork::initialize_neural_network(float64_t sigma) m_params = SGVector(m_num_params); for (int32_t i=0; inormal_random(0.0, sigma); pt_cd_num_steps = SGVector(m_num_layers-1); pt_cd_num_steps.set_const(1); @@ -353,7 +353,7 @@ void CDeepBeliefNetwork::reset_chain() SGMatrix s = m_states[m_num_layers-2]; for (int32_t i=0; i 0.5; + s[i] = m_rng->random(0.0, 1.0) > 0.5; } CNeuralNetwork* CDeepBeliefNetwork::convert_to_neural_network( @@ -435,7 +435,7 @@ void CDeepBeliefNetwork::down_step(int32_t index, SGVector< float64_t > params, { int32_t len = m_layer_sizes->element(index)*m_batch_size; for (int32_t i=0; irandom(0.0, 1.0) < result[i]; } } @@ -465,7 +465,7 @@ void CDeepBeliefNetwork::up_step(int32_t index, SGVector< float64_t > params, if (sample_states && index>0) { for (int32_t i=0; irandom(0.0, 1.0) < result[i]; } } diff --git a/src/shogun/neuralnets/NeuralConvolutionalLayer.cpp b/src/shogun/neuralnets/NeuralConvolutionalLayer.cpp index 5f77349ad98..0dd103eb131 100644 --- a/src/shogun/neuralnets/NeuralConvolutionalLayer.cpp +++ b/src/shogun/neuralnets/NeuralConvolutionalLayer.cpp @@ -139,14 +139,16 @@ void CNeuralConvolutionalLayer::initialize_parameters(SGVector parame { if (m_initialization_mode == NORMAL) { - map_params[i] = CMath::normal_random(0.0, sigma); + map_params[i] = m_rng->normal_random(0.0, sigma); // turn off regularization for the bias, on for the rest of the parameters map_param_regularizable[i] = (i != 0); } else // for the case when m_initialization_mode = RE_NORMAL { - map_params[i] = CMath::normal_random(0.0, - CMath::sqrt(2.0/(m_input_height*m_input_width*m_input_num_channels))); + map_params[i] = m_rng->normal_random( + 0.0, CMath::sqrt( + 2.0 / (m_input_height * m_input_width * + m_input_num_channels))); // initialize b=0 map_param_regularizable[i] = 0; } diff --git a/src/shogun/neuralnets/NeuralInputLayer.cpp b/src/shogun/neuralnets/NeuralInputLayer.cpp index b9191ac7090..70e77d27999 100644 --- a/src/shogun/neuralnets/NeuralInputLayer.cpp +++ b/src/shogun/neuralnets/NeuralInputLayer.cpp @@ -73,7 +73,7 @@ void CNeuralInputLayer::compute_activations(SGMatrix< float64_t > inputs) { int32_t len = m_num_neurons*m_batch_size; for (int32_t k=0; knormal_random(0.0, gaussian_noise); } } diff --git a/src/shogun/neuralnets/NeuralLayer.cpp b/src/shogun/neuralnets/NeuralLayer.cpp index 70a40a0becc..ea84fa0ab73 100644 --- a/src/shogun/neuralnets/NeuralLayer.cpp +++ b/src/shogun/neuralnets/NeuralLayer.cpp @@ -96,7 +96,7 @@ void CNeuralLayer::dropout_activations() int32_t len = m_num_neurons*m_batch_size; for (int32_t i=0; i= dropout_prop; + m_dropout_mask[i] = m_rng->random(0.0, 1.0) >= dropout_prop; m_activations[i] *= m_dropout_mask[i]; } } diff --git a/src/shogun/neuralnets/NeuralLinearLayer.cpp b/src/shogun/neuralnets/NeuralLinearLayer.cpp index 9896b783d12..4b3fd070e3e 100644 --- a/src/shogun/neuralnets/NeuralLinearLayer.cpp +++ b/src/shogun/neuralnets/NeuralLinearLayer.cpp @@ -65,7 +65,7 @@ void CNeuralLinearLayer::initialize_parameters(SGVector parameters, for (int32_t i=0; inormal_random(0.0, sigma); // turn regularization off for the biases, on for the weights parameter_regularizable[i] = (i>=m_num_neurons); diff --git a/src/shogun/neuralnets/NeuralNetwork.cpp b/src/shogun/neuralnets/NeuralNetwork.cpp index 8b04e788a44..3ff8ce7d6d5 100644 --- a/src/shogun/neuralnets/NeuralNetwork.cpp +++ b/src/shogun/neuralnets/NeuralNetwork.cpp @@ -561,12 +561,12 @@ float64_t CNeuralNetwork::check_gradients(float64_t approx_epsilon, float64_t s) SGMatrix y(get_num_outputs(),1); for (int32_t i=0; irandom(0.0, 1.0); // the outputs are set up in the form of a probability distribution (in case // that is required by the output layer, i.e softmax) for (int32_t i=0; irandom(0.0, 1.0); float64_t y_sum = SGVector::sum(y.matrix, y.num_rows); for (int32_t i=0; i(m_num_params); for (int32_t i=0; inormal_random(0.0, sigma); } void CRBM::set_batch_size(int32_t batch_size) @@ -266,7 +266,7 @@ void CRBM::reset_chain() { for (int32_t i=0; i 0.5; + visible_state(i, j) = m_rng->random(0.0, 1.0) > 0.5; } float64_t CRBM::free_energy(SGMatrix< float64_t > visible, SGMatrix< float64_t > buffer) @@ -431,8 +431,7 @@ float64_t CRBM::pseudo_likelihood(SGMatrix< float64_t > visible, SGVector indices(m_batch_size); for (int32_t i=0; irandom(0, m_num_visible - 1); float64_t f1 = free_energy(visible, buffer); @@ -520,7 +519,7 @@ void CRBM::sample_hidden(SGMatrix< float64_t > mean, SGMatrix< float64_t > resul { int32_t length = result.num_rows*result.num_cols; for (int32_t i=0; irandom(0.0, 1.0) < mean[i]; } void CRBM::sample_visible(SGMatrix< float64_t > mean, SGMatrix< float64_t > result) @@ -540,7 +539,8 @@ void CRBM::sample_visible(int32_t index, { for (int32_t i=0; ielement(index); i++) for (int32_t j=0; jrandom(0.0, 1.0) < mean(i + offset, j); } if (m_visible_group_types->element(index)==RBMVUT_SOFTMAX) @@ -551,7 +551,7 @@ void CRBM::sample_visible(int32_t index, for (int32_t j=0; jrandom(0.0, 1.0); float64_t sum = 0; for (int32_t i=0; ielement(index); i++) { diff --git a/src/shogun/optimization/liblinear/shogun_liblinear.cpp b/src/shogun/optimization/liblinear/shogun_liblinear.cpp index d2016e728e8..c29ef991bb9 100644 --- a/src/shogun/optimization/liblinear/shogun_liblinear.cpp +++ b/src/shogun/optimization/liblinear/shogun_liblinear.cpp @@ -516,6 +516,7 @@ void Solver_MCSVM_CS::solve() state->inited = true; } + auto m_rng = std::unique_ptr(new CRandom(sg_random_seed)); // TODO: replace with the new signal // while(iter < max_iter && !CSignal::cancel_computations()) while (iter < max_iter) @@ -523,7 +524,7 @@ void Solver_MCSVM_CS::solve() double stopping = -CMath::INFTY; for(i=0;irandom(i, active_size - 1); CMath::swap(index[i], index[j]); } for(s=0;srandom((float64_t)0.0, 2 * pi); } for (int32_t i = 0; i < cur_dim_feature_space; ++i) { @@ -251,8 +251,8 @@ bool CRandomFourierGaussPreproc::init_randomcoefficients() { float64_t s = 2; while ((s >= 1) ) { // Marsaglia polar for gaussian - x1 = CMath::random((float64_t) -1.0, (float64_t) 1.0); - x2 = CMath::random((float64_t) -1.0, (float64_t) 1.0); + x1 = m_rng->random((float64_t)-1.0, (float64_t)1.0); + x2 = m_rng->random((float64_t)-1.0, (float64_t)1.0); s=x1*x1+x2*x2; } diff --git a/src/shogun/regression/svr/LibLinearRegression.cpp b/src/shogun/regression/svr/LibLinearRegression.cpp index 8222708ca1e..4a0503ff399 100644 --- a/src/shogun/regression/svr/LibLinearRegression.cpp +++ b/src/shogun/regression/svr/LibLinearRegression.cpp @@ -212,7 +212,7 @@ void CLibLinearRegression::solve_l2r_l1l2_svr(SGVector& w, const libl for(i=0; irandom(i, active_size - 1); CMath::swap(index[i], index[j]); } diff --git a/src/shogun/statistical_testing/QuadraticTimeMMD.cpp b/src/shogun/statistical_testing/QuadraticTimeMMD.cpp index a6a2c8c1ca7..98db8ed1ed2 100644 --- a/src/shogun/statistical_testing/QuadraticTimeMMD.cpp +++ b/src/shogun/statistical_testing/QuadraticTimeMMD.cpp @@ -407,7 +407,7 @@ SGVector CQuadraticTimeMMD::Self::sample_null_spectrum() float64_t null_sample=0; for (index_t j=0; jstd_normal_distrib(); float64_t multiple=CMath::sq(z_j); /* take largest EV, scale by 1/(m+n) on the fly and take abs value*/ diff --git a/src/shogun/statistical_testing/internals/DataFetcher.cpp b/src/shogun/statistical_testing/internals/DataFetcher.cpp index 13e19373e7a..1c1df42d66a 100644 --- a/src/shogun/statistical_testing/internals/DataFetcher.cpp +++ b/src/shogun/statistical_testing/internals/DataFetcher.cpp @@ -119,7 +119,7 @@ void DataFetcher::shuffle_features() } std::iota(shuffle_subset.data(), shuffle_subset.data()+shuffle_subset.size(), 0); CMath::permute(shuffle_subset); -// shuffle_subset.display_vector("shuffle_subset"); + // shuffle_subset.display_vector("shuffle_subset"); SG_SDEBUG("Shuffling %d feature vectors\n", size); m_samples->add_subset(shuffle_subset); diff --git a/src/shogun/statistical_testing/kernelselection/internals/MaxCrossValidation.cpp b/src/shogun/statistical_testing/kernelselection/internals/MaxCrossValidation.cpp index 87eaf01ad1b..a6810a807fa 100644 --- a/src/shogun/statistical_testing/kernelselection/internals/MaxCrossValidation.cpp +++ b/src/shogun/statistical_testing/kernelselection/internals/MaxCrossValidation.cpp @@ -97,14 +97,11 @@ void MaxCrossValidation::compute_measures() auto Ny=estimator->get_num_samples_q(); auto num_null_samples=estimator->get_num_null_samples(); auto stype=estimator->get_statistic_type(); - auto seed = estimator->get_random_seed(); CrossValidationMMD compute(Nx, Ny, num_folds, num_null_samples); compute.m_stype=stype; compute.m_alpha=alpha; compute.m_num_runs=num_runs; compute.m_rejections=rejections; - compute.m_kfold_x->set_seed(seed); - compute.m_kfold_y->set_seed(seed); if (kernel_mgr.same_distance_type()) { CDistance* distance=kernel_mgr.get_distance_instance(); diff --git a/src/shogun/structure/StochasticSOSVM.cpp b/src/shogun/structure/StochasticSOSVM.cpp index 5ad5c2fcbec..96715a8aba6 100644 --- a/src/shogun/structure/StochasticSOSVM.cpp +++ b/src/shogun/structure/StochasticSOSVM.cpp @@ -43,13 +43,11 @@ void CStochasticSOSVM::init() SG_ADD(&m_num_iter, "num_iter", "Number of iterations", MS_NOT_AVAILABLE); SG_ADD(&m_do_weighted_averaging, "do_weighted_averaging", "Do weighted averaging", MS_NOT_AVAILABLE); SG_ADD(&m_debug_multiplier, "debug_multiplier", "Debug multiplier", MS_NOT_AVAILABLE); - SG_ADD(&m_rand_seed, "rand_seed", "Random seed", MS_NOT_AVAILABLE); m_lambda = 1.0; m_num_iter = 50; m_do_weighted_averaging = true; m_debug_multiplier = 0; - m_rand_seed = 1; } CStochasticSOSVM::~CStochasticSOSVM() @@ -105,8 +103,6 @@ bool CStochasticSOSVM::train_machine(CFeatures* data) m_debug_multiplier = 100; } - m_rng->set_seed(m_rand_seed); - // Main loop int32_t k = 0; for (int32_t pi = 0; pi < m_num_iter; ++pi) diff --git a/src/shogun/structure/TwoStateModel.cpp b/src/shogun/structure/TwoStateModel.cpp index 7a6dd1608aa..0186696b714 100644 --- a/src/shogun/structure/TwoStateModel.cpp +++ b/src/shogun/structure/TwoStateModel.cpp @@ -265,19 +265,23 @@ CHMSVMModel* CTwoStateModel::simulate_data(int32_t num_exm, int32_t exm_len, SGVector< int32_t > ll(num_exm*exm_len); ll.zero(); int32_t rnb, rl, rp; - + auto m_rng = std::unique_ptr(new CRandom(sg_random_seed)); for ( int32_t i = 0 ; i < num_exm ; ++i) { SGVector< int32_t > lab(exm_len); lab.zero(); - rnb = num_blocks[0] + CMath::ceil((num_blocks[1]-num_blocks[0])* - CMath::random(0.0, 1.0)) - 1; + rnb = num_blocks[0] + + CMath::ceil( + (num_blocks[1] - num_blocks[0]) * m_rng->random(0.0, 1.0)) - + 1; for ( int32_t j = 0 ; j < rnb ; ++j ) { - rl = block_len[0] + CMath::ceil((block_len[1]-block_len[0])* - CMath::random(0.0, 1.0)) - 1; - rp = CMath::ceil((exm_len-rl)*CMath::random(0.0, 1.0)); + rl = block_len[0] + + CMath::ceil( + (block_len[1] - block_len[0]) * m_rng->random(0.0, 1.0)) - + 1; + rp = CMath::ceil((exm_len - rl) * m_rng->random(0.0, 1.0)); for ( int32_t idx = rp-1 ; idx < rp+rl ; ++idx ) { @@ -317,7 +321,8 @@ CHMSVMModel* CTwoStateModel::simulate_data(int32_t num_exm, int32_t exm_len, int32_t idx = i*signal.num_cols; for ( int32_t j = 0 ; j < signal.num_cols ; ++j ) - signal[idx++] = lf[j] + noise_std*CMath::normal_random((float64_t)0.0, 1.0); + signal[idx++] = + lf[j] + noise_std * m_rng->normal_random((float64_t)0.0, 1.0); } // Substitute some features by pure noise @@ -325,7 +330,8 @@ CHMSVMModel* CTwoStateModel::simulate_data(int32_t num_exm, int32_t exm_len, { int32_t idx = i*signal.num_cols; for ( int32_t j = 0 ; j < signal.num_cols ; ++j ) - signal[idx++] = noise_std*CMath::normal_random((float64_t)0.0, 1.0); + signal[idx++] = + noise_std * m_rng->normal_random((float64_t)0.0, 1.0); } CMatrixFeatures< float64_t >* features = diff --git a/src/shogun/transfer/multitask/LibLinearMTL.cpp b/src/shogun/transfer/multitask/LibLinearMTL.cpp index 85bb4620084..f0851c23a95 100644 --- a/src/shogun/transfer/multitask/LibLinearMTL.cpp +++ b/src/shogun/transfer/multitask/LibLinearMTL.cpp @@ -261,7 +261,7 @@ void CLibLinearMTL::solve_l2r_l1l2_svc(const liblinear_problem *prob, double eps for (i=0; irandom(i, active_size - 1); CMath::swap(index[i], index[j]); } diff --git a/tests/unit/base/SGObject_unittest.cc b/tests/unit/base/SGObject_unittest.cc index dcbccf81014..cb633d658c1 100644 --- a/tests/unit/base/SGObject_unittest.cc +++ b/tests/unit/base/SGObject_unittest.cc @@ -278,10 +278,11 @@ TEST(SGObject,equals_complex_equal) SGMatrix X(1, n); SGMatrix X_test(1, n); SGVector Y(n); + auto m_rng = std::unique_ptr(new CRandom()); for (index_t i=0; irandom(0.0, x_range); X_test[i]=(float64_t)i / n*x_range; Y[i]=CMath::sin(X[i]); } diff --git a/tests/unit/base/Serialization_unittest.cc b/tests/unit/base/Serialization_unittest.cc index 9f0a889bb51..40014ae54ec 100644 --- a/tests/unit/base/Serialization_unittest.cc +++ b/tests/unit/base/Serialization_unittest.cc @@ -23,6 +23,7 @@ TEST(Serialization,multiclass_labels) index_t n_class=3; CMulticlassLabels* labels=new CMulticlassLabels(); + auto m_rng = std::unique_ptr(new CRandom()); SGVector lab(n); for (index_t i=0; iallocate_confidences_for(n_class); SGVector conf(n_class); for (index_t i=0; istd_normal_distrib(); for (index_t i=0; iset_multiclass_confidences(i, conf); @@ -75,7 +76,7 @@ TEST(Serialization,multiclass_labels) TEST(Serialization, liblinear) { index_t num_samples = 50; - CMath::init_random(13); + set_global_seed(13); SGMatrix data = CDataGenerator::generate_gaussians(num_samples, 2, 2); CDenseFeatures features(data); diff --git a/tests/unit/classifier/svm/LibLinear_unittest.cc b/tests/unit/classifier/svm/LibLinear_unittest.cc index ec1999d306d..93e63d3d80f 100644 --- a/tests/unit/classifier/svm/LibLinear_unittest.cc +++ b/tests/unit/classifier/svm/LibLinear_unittest.cc @@ -25,7 +25,7 @@ void generate_data_l1(CDenseFeatures* &train_feats, CBinaryLabels* &ground_truth) { index_t num_samples = 50; - CMath::init_random(5); + set_global_seed(5); SGMatrix data = CDataGenerator::generate_gaussians(num_samples, 2, 2); CDenseFeatures features(data); @@ -65,7 +65,7 @@ void generate_data_l2(CDenseFeatures* &train_feats, CBinaryLabels* &ground_truth) { index_t num_samples = 50; - CMath::init_random(5); + set_global_seed(5); SGMatrix data = CDataGenerator::generate_gaussians(num_samples, 2, 2); CDenseFeatures features(data); diff --git a/tests/unit/classifier/svm/SVMOcas_unittest.cc b/tests/unit/classifier/svm/SVMOcas_unittest.cc index 8cfc5a58ead..bbded0f56da 100644 --- a/tests/unit/classifier/svm/SVMOcas_unittest.cc +++ b/tests/unit/classifier/svm/SVMOcas_unittest.cc @@ -15,7 +15,7 @@ extern LinearTestEnvironment* linear_test_env; #ifdef HAVE_LAPACK TEST(SVMOcasTest,train) { - CMath::init_random(5); + set_global_seed(5); std::shared_ptr mockData = linear_test_env->getBinaryLabelData(); diff --git a/tests/unit/converter/Isomap_unittest.cc b/tests/unit/converter/Isomap_unittest.cc index dedb67f3fac..21d387ed4c6 100644 --- a/tests/unit/converter/Isomap_unittest.cc +++ b/tests/unit/converter/Isomap_unittest.cc @@ -200,13 +200,14 @@ void check_similarity_of_sets(const std::set& first_set,const std::set< void fill_matrix_with_test_data(SGMatrix& matrix_to_fill) { index_t num_cols = matrix_to_fill.num_cols, num_rows = matrix_to_fill.num_rows; + auto m_rng = std::unique_ptr(new CRandom()); for (index_t i = 0; i < num_cols; ++i) { for (index_t j = 0; j < num_rows - 1; ++j) { matrix_to_fill(j, i) = i; } - matrix_to_fill(num_rows - 1, i) = CMath::randn_double(); + matrix_to_fill(num_rows - 1, i) = m_rng->std_normal_distrib(); } } diff --git a/tests/unit/distribution/MixtureModel_unittest.cc b/tests/unit/distribution/MixtureModel_unittest.cc index bc07825153b..c0ef987ea64 100644 --- a/tests/unit/distribution/MixtureModel_unittest.cc +++ b/tests/unit/distribution/MixtureModel_unittest.cc @@ -40,12 +40,12 @@ using namespace shogun; TEST(MixtureModel,gaussian_mixture_model) { + auto m_rng = std::unique_ptr(new CRandom(2)); SGMatrix data(1,400); - CMath::init_random(2); for (int32_t i=0;i<100;i++) - data(0,i)=CMath::randn_double(); + data(0, i) = m_rng->std_normal_distrib(); for (int32_t i=100;i<400;i++) - data(0,i)=CMath::randn_double()+10; + data(0, i) = m_rng->std_normal_distrib() + 10; CDenseFeatures* feats=new CDenseFeatures(data); diff --git a/tests/unit/environments/LinearTestEnvironment.h b/tests/unit/environments/LinearTestEnvironment.h index d349034391a..46daacac785 100644 --- a/tests/unit/environments/LinearTestEnvironment.h +++ b/tests/unit/environments/LinearTestEnvironment.h @@ -45,6 +45,7 @@ class LinearTestEnvironment : public ::testing::Environment public: virtual void SetUp() { + set_global_seed(12345); mBinaryLabelData = std::shared_ptr( new GaussianCheckerboard(100, 2, 2)); } diff --git a/tests/unit/environments/MultiLabelTestEnvironment.h b/tests/unit/environments/MultiLabelTestEnvironment.h index 12e50da1897..083cbe7ff0e 100644 --- a/tests/unit/environments/MultiLabelTestEnvironment.h +++ b/tests/unit/environments/MultiLabelTestEnvironment.h @@ -45,6 +45,7 @@ class MultiLabelTestEnvironment : public ::testing::Environment public: virtual void SetUp() { + set_global_seed(12345); mMulticlassFixture = std::shared_ptr( new GaussianCheckerboard(100, 3, 3)); } diff --git a/tests/unit/evaluation/CrossValidation_multithread_unittest.cc b/tests/unit/evaluation/CrossValidation_multithread_unittest.cc index a9203ab4723..7da2b15307e 100644 --- a/tests/unit/evaluation/CrossValidation_multithread_unittest.cc +++ b/tests/unit/evaluation/CrossValidation_multithread_unittest.cc @@ -48,10 +48,11 @@ using namespace shogun; void generate_data(SGMatrix& mat, SGVector &lab) { int32_t num=lab.size(); - + auto m_rng = std::unique_ptr(new CRandom()); for (index_t i=0; istd_normal_distrib() * 4) + : 100 + (m_rng->std_normal_distrib() * 4); mat(1,i)=i; } diff --git a/tests/unit/evaluation/SplittingStrategy_unittest.cc b/tests/unit/evaluation/SplittingStrategy_unittest.cc index fd1b6cd6326..27a7ad6d3ce 100644 --- a/tests/unit/evaluation/SplittingStrategy_unittest.cc +++ b/tests/unit/evaluation/SplittingStrategy_unittest.cc @@ -23,19 +23,20 @@ TEST(SplittingStrategy,standard) index_t num_labels; index_t num_subsets; index_t runs=100; + auto m_rng = std::unique_ptr(new CRandom()); while (runs-->0) { fold_sizes=0; - num_labels=CMath::random(10, 150); - num_subsets=CMath::random(1, 5); + num_labels = m_rng->random(10, 150); + num_subsets = m_rng->random(1, 5); index_t desired_size=CMath::round( (float64_t)num_labels/(float64_t)num_subsets); /* build labels */ CRegressionLabels* labels=new CRegressionLabels(num_labels); for (index_t i=0; iset_label(i, CMath::random(-10.0, 10.0)); + labels->set_label(i, m_rng->random(-10.0, 10.0)); /* build splitting strategy */ CCrossValidationSplitting* splitting= @@ -89,18 +90,19 @@ TEST(SplittingStrategy,stratified_subsets_disjoint_cover) { index_t num_labels, num_classes, num_subsets, fold_sizes; index_t runs=50; + auto m_rng = std::unique_ptr(new CRandom()); while (runs-->0) { fold_sizes=0; - num_labels=CMath::random(11, 100); - num_classes=CMath::random(2, 10); - num_subsets=CMath::random(1, 10); + num_labels = m_rng->random(11, 100); + num_classes = m_rng->random(2, 10); + num_subsets = m_rng->random(1, 10); /* build labels */ CMulticlassLabels* labels=new CMulticlassLabels(num_labels); for (index_t i=0; iset_label(i, CMath::random()%num_classes); + labels->set_label(i, m_rng->random_64() % num_classes); SGVector classes=labels->get_unique_labels(); @@ -168,17 +170,18 @@ TEST(SplittingStrategy,stratified_subset_label_ratio) { index_t num_labels, num_classes, num_subsets; index_t runs=50; + auto m_rng = std::unique_ptr(new CRandom()); while (runs-->0) { - num_labels=CMath::random(11, 100); - num_classes=CMath::random(2, 10); - num_subsets=CMath::random(1, 10); + num_labels = m_rng->random(11, 100); + num_classes = m_rng->random(2, 10); + num_subsets = m_rng->random(1, 10); /* build labels */ CMulticlassLabels* labels=new CMulticlassLabels(num_labels); for (index_t i=0; iset_label(i, CMath::random()%num_classes); + labels->set_label(i, m_rng->random_64() % num_classes); /*No. of labels belonging to one class*/ SGVector class_labels(num_classes); @@ -241,16 +244,17 @@ TEST(SplittingStrategy,LOO) { index_t num_labels, fold_sizes; index_t runs=10; + auto m_rng = std::unique_ptr(new CRandom()); while (runs-->0) { fold_sizes=0; - num_labels=CMath::random(10, 50); + num_labels = m_rng->random(10, 50); /* build labels */ CRegressionLabels* labels=new CRegressionLabels(num_labels); for (index_t i=0; iset_label(i, CMath::random(-10.0, 10.0)); + labels->set_label(i, m_rng->random(-10.0, 10.0)); /* build Leave one out splitting strategy */ CLOOCrossValidationSplitting* splitting= diff --git a/tests/unit/features/CombinedFeatures_unittest.cc b/tests/unit/features/CombinedFeatures_unittest.cc index aa49a22f1da..60b557b6163 100644 --- a/tests/unit/features/CombinedFeatures_unittest.cc +++ b/tests/unit/features/CombinedFeatures_unittest.cc @@ -72,12 +72,12 @@ TEST(CombinedFeaturesTest,create_merged_copy) SGMatrix data_1(dim,n_1); for (index_t i=0; i(new CRandom()); + // data_1.display_matrix("data_1"); SGMatrix data_2(dim,n_2); for (index_t i=0; istd_normal_distrib(); // data_1.display_matrix("data_2"); diff --git a/tests/unit/features/DenseFeatures_unittest.cc b/tests/unit/features/DenseFeatures_unittest.cc index 07191e84519..d16d24e263d 100644 --- a/tests/unit/features/DenseFeatures_unittest.cc +++ b/tests/unit/features/DenseFeatures_unittest.cc @@ -45,12 +45,13 @@ TEST(DenseFeaturesTest,create_merged_copy) SGMatrix data_1(dim,n_1); for (index_t i=0; i(new CRandom()); //data_1.display_matrix("data_1"); SGMatrix data_2(dim,n_2); for (index_t i=0; istd_normal_distrib(); //data_2.display_matrix("data_2"); @@ -131,10 +132,11 @@ TEST(DenseFeaturesTest, copy_dimension_subset) data.matrix[i]=i; CDenseFeatures* features=new CDenseFeatures(data); + auto m_rng = std::unique_ptr(new CRandom()); SGVector dims(dim/2); for (index_t i=0; irandom(0, dim - 1); CDenseFeatures* f_reduced=(CDenseFeatures*) features->copy_dimension_subset(dims); @@ -161,16 +163,17 @@ TEST(DenseFeaturesTest, copy_dimension_subset_with_subsets) data.matrix[i]=i; CDenseFeatures* features=new CDenseFeatures(data); + auto m_rng = std::unique_ptr(new CRandom()); SGVector inds(n/2); for (index_t i=0; irandom(0, n - 1); features->add_subset(inds); SGVector dims(dim/2); for (index_t i=0; irandom(0, dim - 1); CDenseFeatures* f_reduced=(CDenseFeatures*) features->copy_dimension_subset(dims); diff --git a/tests/unit/features/HashedDenseFeatures_unittest.cc b/tests/unit/features/HashedDenseFeatures_unittest.cc index 68ca8cd22aa..6397415a144 100644 --- a/tests/unit/features/HashedDenseFeatures_unittest.cc +++ b/tests/unit/features/HashedDenseFeatures_unittest.cc @@ -320,10 +320,11 @@ TEST(HashedDenseFeaturesTest, dense_comparison) int32_t hashing_dim = 300; CHashedDenseFeatures* h_feats = new CHashedDenseFeatures(data, hashing_dim); CDenseFeatures* d_feats = new CDenseFeatures(data); + auto m_rng = std::unique_ptr(new CRandom()); SGVector dense_vec(hashing_dim); for (index_t i=0; irandom(-hashing_dim, hashing_dim); for (index_t i=0; idot(i, h_feats, i), d_feats->dot(i, d_feats, i)); diff --git a/tests/unit/features/HashedDocDotFeatures_unittest.cc b/tests/unit/features/HashedDocDotFeatures_unittest.cc index d86dd081e5a..a9ffd88a3cb 100644 --- a/tests/unit/features/HashedDocDotFeatures_unittest.cc +++ b/tests/unit/features/HashedDocDotFeatures_unittest.cc @@ -77,7 +77,7 @@ TEST(HashedDocDotFeaturesTest, dense_dot_test) const char* doc_1 = "You're never too old to rock and roll, if you're too young to die"; const char* doc_2 = "Give me some rope, tie me to dream, give me the hope to run out of steam"; const char* doc_3 = "Thank you Jack Daniels, Old Number Seven, Tennessee Whiskey got me drinking in heaven"; - + auto m_rng = std::unique_ptr(new CRandom()); SGString string_1(65); for (index_t i=0; i<65; i++) string_1.string[i] = doc_1[i]; @@ -112,7 +112,7 @@ TEST(HashedDocDotFeaturesTest, dense_dot_test) SGVector vec(dimension); for (index_t i=0; irandom(-dimension, dimension); for (index_t i=0; i<3; i++) { diff --git a/tests/unit/features/StreamingHashedDocDotFeatures_unittest.cc b/tests/unit/features/StreamingHashedDocDotFeatures_unittest.cc index 6e79b9b2a68..e74a7ab3662 100644 --- a/tests/unit/features/StreamingHashedDocDotFeatures_unittest.cc +++ b/tests/unit/features/StreamingHashedDocDotFeatures_unittest.cc @@ -81,7 +81,7 @@ TEST(StreamingHashedDocFeaturesTest, dot_tests) const char* doc_1 = "You're never too old to rock and roll, if you're too young to die"; const char* doc_2 = "Give me some rope, tie me to dream, give me the hope to run out of steam"; const char* doc_3 = "Thank you Jack Daniels, Old Number Seven, Tennessee Whiskey got me drinking in heaven"; - + auto m_rng = std::unique_ptr(new CRandom()); SGString string_1(65); for (index_t i=0; i<65; i++) string_1.string[i] = doc_1[i]; @@ -112,7 +112,7 @@ TEST(StreamingHashedDocFeaturesTest, dot_tests) SGVector dense_vec(32); for (index_t j=0; j<32; j++) - dense_vec[j] = CMath::random(0.0, 1.0); + dense_vec[j] = m_rng->random(0.0, 1.0); index_t i = 0; while (feats->get_next_example()) diff --git a/tests/unit/features/StringFeatures_unittest.cc b/tests/unit/features/StringFeatures_unittest.cc index dd6ab6259ce..4ae344af5f2 100644 --- a/tests/unit/features/StringFeatures_unittest.cc +++ b/tests/unit/features/StringFeatures_unittest.cc @@ -17,18 +17,19 @@ using namespace shogun; SGStringList generateRandomData(index_t num_strings=10, index_t max_string_length=20, index_t min_string_length=10) { SGStringList strings(num_strings, max_string_length); + auto m_rng = std::unique_ptr(new CRandom()); //SG_SPRINT("original string data:\n"); for (index_t i=0; irandom(min_string_length, max_string_length); SGString current(len); //SG_SPRINT("[%i]: \"", i); /* fill with random uppercase letters (ASCII) */ for (index_t j=0; jrandom('A', 'Z'); /* attach \0 to print letter */ char* string=SG_MALLOC(char, 2); diff --git a/tests/unit/kernel/CustomKernel_unittest.cc b/tests/unit/kernel/CustomKernel_unittest.cc index 6fa022dc459..4af31eab711 100644 --- a/tests/unit/kernel/CustomKernel_unittest.cc +++ b/tests/unit/kernel/CustomKernel_unittest.cc @@ -9,13 +9,14 @@ #include -#include -#include #include #include #include -#include +#include +#include #include +#include +#include using namespace shogun; using namespace Eigen; diff --git a/tests/unit/kernel/Kernel_unittest.cc b/tests/unit/kernel/Kernel_unittest.cc index e591df1120a..2e0b9e299d3 100644 --- a/tests/unit/kernel/Kernel_unittest.cc +++ b/tests/unit/kernel/Kernel_unittest.cc @@ -41,10 +41,11 @@ static SGMatrix generate_std_norm_matrix(const index_t num_feats, const index_t dim) { SGMatrix data(dim, num_feats); + auto m_rng = std::unique_ptr(new CRandom()); for (index_t i=0; istd_normal_distrib(); } return data; } @@ -55,7 +56,7 @@ TEST(Kernel, sum_symmetric_block_no_diag) const index_t dim=3; // create random data - CMath::init_random(100); + set_global_seed(100); SGMatrix data = generate_std_norm_matrix(num_feats, dim); CDenseFeatures* feats=new CDenseFeatures(data); @@ -84,7 +85,7 @@ TEST(Kernel, sum_symmetric_block_with_diag) const index_t dim=3; // create random data - CMath::init_random(100); + set_global_seed(100); SGMatrix data = generate_std_norm_matrix(num_feats, dim); CDenseFeatures* feats=new CDenseFeatures(data); @@ -114,7 +115,7 @@ TEST(Kernel, sum_block_with_diag) const index_t dim=3; // create random data - CMath::init_random(100); + set_global_seed(100); SGMatrix data_p = generate_std_norm_matrix(num_feats_p, dim); SGMatrix data_q = generate_std_norm_matrix(num_feats_q, dim); @@ -147,7 +148,7 @@ TEST(Kernel, sum_block_no_diag) const index_t dim=3; // create random data - CMath::init_random(100); + set_global_seed(100); SGMatrix data_p = generate_std_norm_matrix(num_feats_p, dim); SGMatrix data_q = generate_std_norm_matrix(num_feats_q, dim); @@ -179,7 +180,7 @@ TEST(Kernel, row_wise_sum_symmetric_block_no_diag) const index_t dim=3; // create random data - CMath::init_random(100); + set_global_seed(100); SGMatrix data = generate_std_norm_matrix(num_feats, dim); CDenseFeatures* feats=new CDenseFeatures(data); @@ -208,7 +209,7 @@ TEST(Kernel, row_wise_sum_symmetric_block_with_diag) const index_t dim=3; // create random data - CMath::init_random(100); + set_global_seed(100); SGMatrix data = generate_std_norm_matrix(num_feats, dim); CDenseFeatures* feats=new CDenseFeatures(data); @@ -237,7 +238,7 @@ TEST(Kernel, row_wise_sum_squared_sum_symmetric_block_no_diag) const index_t dim=3; // create random data - CMath::init_random(100); + set_global_seed(100); SGMatrix data = generate_std_norm_matrix(num_feats, dim); CDenseFeatures* feats=new CDenseFeatures(data); @@ -272,7 +273,7 @@ TEST(Kernel, row_wise_sum_squared_sum_symmetric_block_with_diag) const index_t dim=3; // create random data - CMath::init_random(100); + set_global_seed(100); SGMatrix data = generate_std_norm_matrix(num_feats, dim); CDenseFeatures* feats=new CDenseFeatures(data); @@ -308,7 +309,7 @@ TEST(Kernel, row_col_wise_sum_block_with_diag) const index_t dim=3; // create random data - CMath::init_random(100); + set_global_seed(100); SGMatrix data_p = generate_std_norm_matrix(num_feats_p, dim); SGMatrix data_q = generate_std_norm_matrix(num_feats_q, dim); @@ -349,7 +350,7 @@ TEST(Kernel, row_col_wise_sum_block_no_diag) const index_t dim=3; // create random data - CMath::init_random(100); + set_global_seed(100); SGMatrix data_p = generate_std_norm_matrix(num_feats_p, dim); SGMatrix data_q = generate_std_norm_matrix(num_feats_q, dim); diff --git a/tests/unit/kernel/SubsequenceStringKernel_unittest.cc b/tests/unit/kernel/SubsequenceStringKernel_unittest.cc index 6fa359c3796..19caffbd768 100644 --- a/tests/unit/kernel/SubsequenceStringKernel_unittest.cc +++ b/tests/unit/kernel/SubsequenceStringKernel_unittest.cc @@ -61,18 +61,19 @@ TEST(SubsequenceStringKernel, psd_random_feat) const index_t min_len=max_len/2; SGStringList list(num_strings, max_len); + auto m_rng = std::unique_ptr(new CRandom()); for (index_t i=0; irandom(min_len, max_len); SGString str(cur_len); for (index_t l=0; lrandom('A', 'Z')); list.strings[i]=str; } CStringFeatures* s_feats=new CStringFeatures(list, ALPHANUM); - int32_t s_len=CMath::random(1, min_len); - float64_t lambda=CMath::random(0.0, 1.0); + int32_t s_len = m_rng->random(1, min_len); + float64_t lambda = m_rng->random(0.0, 1.0); CSubsequenceStringKernel* kernel=new CSubsequenceStringKernel(s_feats, s_feats, s_len, lambda); SGMatrix kernel_matrix=kernel->get_kernel_matrix(); diff --git a/tests/unit/lib/Memory_unittest.cc b/tests/unit/lib/Memory_unittest.cc index b051918458c..561ec1e9115 100644 --- a/tests/unit/lib/Memory_unittest.cc +++ b/tests/unit/lib/Memory_unittest.cc @@ -67,8 +67,9 @@ TEST(MemoryTest, sg_memcpy) { const index_t size = 10; auto src = SG_CALLOC(float64_t, size); + auto m_rng = std::unique_ptr(new CRandom()); for (index_t i=0; istd_normal_distrib(); auto dest = SG_CALLOC(float64_t, size); diff --git a/tests/unit/lib/SGMatrix_unittest.cc b/tests/unit/lib/SGMatrix_unittest.cc index d11529cd1fd..fc10fa59d9e 100644 --- a/tests/unit/lib/SGMatrix_unittest.cc +++ b/tests/unit/lib/SGMatrix_unittest.cc @@ -252,14 +252,14 @@ TEST(SGMatrixTest,is_symmetric_float32_false_old_plus_eps) { const index_t size=2; SGMatrix mat(size, size); - CMath::init_random(100); + auto m_rng = std::unique_ptr(new CRandom(100)); // create a symmetric matrix for (index_t i=0; irandn_float(); mat(j, i)=mat(i, j); } } @@ -289,14 +289,14 @@ TEST(SGMatrixTest,is_symmetric_float32_false_old_minus_eps) { const index_t size=2; SGMatrix mat(size, size); - CMath::init_random(100); + auto m_rng = std::unique_ptr(new CRandom(100)); // create a symmetric matrix for (index_t i=0; irandn_float(); mat(j, i)=mat(i, j); } } @@ -326,11 +326,12 @@ TEST(SGMatrixTest,is_symmetric_float32_true) { const index_t size=2; SGMatrix mat(size, size); + auto m_rng = std::unique_ptr(new CRandom()); for (index_t i=0; irandn_float(); mat(j, i)=mat(i, j); } } @@ -341,14 +342,14 @@ TEST(SGMatrixTest,is_symmetric_float64_false_old_plus_eps) { const index_t size=2; SGMatrix mat(size, size); - CMath::init_random(100); + auto m_rng = std::unique_ptr(new CRandom(100)); // create a symmetric matrix for (index_t i=0; istd_normal_distrib(); mat(j, i)=mat(i, j); } } @@ -378,14 +379,14 @@ TEST(SGMatrixTest,is_symmetric_float64_false_old_minus_eps) { const index_t size=2; SGMatrix mat(size, size); - CMath::init_random(100); + auto m_rng = std::unique_ptr(new CRandom(100)); // create a symmetric matrix for (index_t i=0; istd_normal_distrib(); mat(j, i)=mat(i, j); } } @@ -415,12 +416,12 @@ TEST(SGMatrixTest,is_symmetric_float64_true) { const index_t size=2; SGMatrix mat(size, size); - CMath::init_random(100); + auto m_rng = std::unique_ptr(new CRandom(100)); for (index_t i=0; istd_normal_distrib(); mat(j, i)=mat(i, j); } } @@ -431,14 +432,15 @@ TEST(SGMatrixTest,is_symmetric_complex128_false_old_plus_eps) { const index_t size=2; SGMatrix mat(size, size); - CMath::init_random(100); + auto m_rng = std::unique_ptr(new CRandom(100)); // create a symmetric matrix for (index_t i=0; istd_normal_distrib(), m_rng->std_normal_distrib()); mat(j, i)=mat(i, j); } } @@ -476,14 +478,15 @@ TEST(SGMatrixTest,is_symmetric_complex128_false_old_minus_eps) { const index_t size=2; SGMatrix mat(size, size); - CMath::init_random(100); + auto m_rng = std::unique_ptr(new CRandom(100)); // create a symmetric matrix for (index_t i=0; istd_normal_distrib(), m_rng->std_normal_distrib()); mat(j, i)=mat(i, j); } } @@ -521,12 +524,13 @@ TEST(SGMatrixTest,is_symmetric_complex128_true) { const index_t size=2; SGMatrix mat(size, size); - CMath::init_random(100); + auto m_rng = std::unique_ptr(new CRandom(100)); for (index_t i=0; istd_normal_distrib(), m_rng->std_normal_distrib()); mat(j, i)=mat(i, j); } } @@ -570,20 +574,22 @@ TEST(SGMatrixTest, equals) EXPECT_TRUE(mat.equals(mat)); EXPECT_TRUE(mat.equals(copy)); + auto m_rng = std::unique_ptr(new CRandom(100)); mat=SGMatrix(size, size); - CMath::init_random(100); + for (int64_t i=0; irandn_float(); + EXPECT_TRUE(mat.equals(mat)); EXPECT_FALSE(mat.equals(copy)); copy=SGMatrix(size, size); EXPECT_FALSE(mat.equals(copy)); + m_rng->set_seed(100); - CMath::init_random(100); for (int64_t i=0; irandn_float(); EXPECT_TRUE(mat.equals(copy)); } @@ -592,8 +598,9 @@ TEST(SGMatrixTest, clone) { const index_t size=10; SGMatrix mat(size, size); + auto m_rng = std::unique_ptr(new CRandom()); for (int64_t i=0; irandn_float(); SGMatrix copy=mat.clone(); @@ -615,7 +622,8 @@ TEST(SGMatrixTest, set_const) { const index_t size=10; SGMatrix mat(size, size); - const auto value=CMath::randn_double(); + auto m_rng = std::unique_ptr(new CRandom()); + const auto value = m_rng->std_normal_distrib(); mat.set_const(value); for (int64_t i=0; i mat(size, size); + auto m_rng = std::unique_ptr(new CRandom()); for (int64_t i=0; irandn_float(); auto max=mat.max_single(); for (int64_t i=0; i mat(n_rows, n_cols); + auto m_rng = std::unique_ptr(new CRandom()); for (index_t i = 0; i < n_rows * n_cols; ++i) - mat[i] = CMath::randn_double(); + mat[i] = m_rng->std_normal_distrib(); auto vec = mat.get_column_vector(col); @@ -675,9 +685,9 @@ TEST(SGMatrixTest, set_column) SGMatrix mat(n_rows, n_cols); SGVector vec(n_rows); - + auto m_rng = std::unique_ptr(new CRandom()); for (index_t i = 0; i < n_rows; ++i) - vec[i] = CMath::randn_double(); + vec[i] = m_rng->std_normal_distrib(); mat.set_column(col, vec); diff --git a/tests/unit/lib/SGVector_unittest.cc b/tests/unit/lib/SGVector_unittest.cc index 0788610cd6c..88ca557401b 100644 --- a/tests/unit/lib/SGVector_unittest.cc +++ b/tests/unit/lib/SGVector_unittest.cc @@ -56,10 +56,10 @@ TEST(SGVectorTest,ctor) TEST(SGVectorTest, ctor_from_matrix) { const index_t n_rows = 5, n_cols = 4; - + auto m_rng = std::unique_ptr(new CRandom(100)); SGMatrix mat(n_rows, n_cols); for (index_t i = 0; i < mat.size(); ++i) - mat[i] = CMath::randn_double(); + mat[i] = m_rng->std_normal_distrib(); auto vec = SGVector(mat); @@ -93,7 +93,7 @@ TEST(SGVectorTest,setget) TEST(SGVectorTest,add) { - CMath::init_random(17); + set_global_seed(17); SGVector a(10); SGVector b(10); a.random(0.0, 1024.0); @@ -113,7 +113,7 @@ TEST(SGVectorTest,add) TEST(SGVectorTest,norm) { - CMath::init_random(17); + set_global_seed(17); SGVector a(10); a.random(-50.0, 1024.0); @@ -137,7 +137,7 @@ TEST(SGVectorTest,norm) TEST(SGVectorTest,misc) { - CMath::init_random(17); + set_global_seed(17); SGVector a(10); a.random(-1024.0, 1024.0); diff --git a/tests/unit/machine/StochasticGBMachine_unittest.cc b/tests/unit/machine/StochasticGBMachine_unittest.cc index 3dbd5ad1074..86c36e4b388 100644 --- a/tests/unit/machine/StochasticGBMachine_unittest.cc +++ b/tests/unit/machine/StochasticGBMachine_unittest.cc @@ -52,7 +52,7 @@ SGMatrix get_sinusoid_samples(int32_t num_samples, SGVector lab(num_train_samples); SGMatrix data=get_sinusoid_samples(num_train_samples,lab); diff --git a/tests/unit/mathematics/Math_unittest.cc b/tests/unit/mathematics/Math_unittest.cc index 5753c30ed4c..95c85254844 100644 --- a/tests/unit/mathematics/Math_unittest.cc +++ b/tests/unit/mathematics/Math_unittest.cc @@ -388,9 +388,8 @@ TEST(CMath, permute) { SGVector v(4); v.range_fill(0); - CRandom* random = new CRandom(2); - CMath::permute(v, random); - SG_FREE(random); + auto random = std::unique_ptr(new CRandom(2)); + CMath::permute(v, random.get()); EXPECT_EQ(v[0], 2); EXPECT_EQ(v[1], 1); EXPECT_EQ(v[2], 3); @@ -401,9 +400,8 @@ TEST(CMath, permute_with_random) { SGVector v(4); v.range_fill(0); - CRandom* random = new CRandom(2); - CMath::permute(v, random); - SG_FREE(random); + auto random = std::unique_ptr(new CRandom(2)); + CMath::permute(v, random.get()); EXPECT_EQ(v[0], 2); EXPECT_EQ(v[1], 1); @@ -413,7 +411,7 @@ TEST(CMath, permute_with_random) TEST(CMath,misc) { - CMath::init_random(17); + set_global_seed(17); SGVector a(10); a.random(-1024.0, 1024.0); diff --git a/tests/unit/mathematics/Random_unittest.cc b/tests/unit/mathematics/Random_unittest.cc index b55e3a53c8a..c69b638d6f9 100644 --- a/tests/unit/mathematics/Random_unittest.cc +++ b/tests/unit/mathematics/Random_unittest.cc @@ -117,10 +117,10 @@ TEST(Random, normal_distrib) TEST(Random, random_uint64_1_2) { - CMath::init_random(17); + auto m_rng = std::unique_ptr(new CRandom(17)); for (int32_t i=0; i<10000; i++) { - uint64_t r=CMath::random((uint64_t) 1, (uint64_t) 2); + uint64_t r = m_rng->random((uint64_t)1, (uint64_t)2); EXPECT_TRUE(r == 1 || r == 2); } } @@ -304,11 +304,12 @@ TEST(Random, random_uint32_random_range) TEST(Random, random_float64_range) { int rnds[array_len]; + auto m_rng = std::unique_ptr(new CRandom(17)); for (uint32_t i=0; irandom((float64_t)0, (float64_t)array_len); rnds[r]++; } diff --git a/tests/unit/mathematics/ajd/FFDiag_unittest.cc b/tests/unit/mathematics/ajd/FFDiag_unittest.cc index 8090ba3f22b..6b7acd9251b 100644 --- a/tests/unit/mathematics/ajd/FFDiag_unittest.cc +++ b/tests/unit/mathematics/ajd/FFDiag_unittest.cc @@ -26,7 +26,7 @@ TEST(CFFDiag, diagonalize) C_dims[2] = 30; SGNDArray< float64_t > C(C_dims, 3); - CMath::init_random(17); + auto m_rng = std::unique_ptr(new CRandom(17)); for (int i = 0; i < C_dims[2]; i++) { @@ -34,8 +34,7 @@ TEST(CFFDiag, diagonalize) tmp.setIdentity(); for (int j = 0; j < C_dims[0]; j++) - tmp(j,j) *= CMath::abs(CMath::random(1,5)); - + tmp(j, j) *= CMath::abs(m_rng->random(1, 5)); } // Mixing and demixing matrices diff --git a/tests/unit/mathematics/ajd/JADiagOrth_unittest.cc b/tests/unit/mathematics/ajd/JADiagOrth_unittest.cc index c02c234d839..76a43c30942 100644 --- a/tests/unit/mathematics/ajd/JADiagOrth_unittest.cc +++ b/tests/unit/mathematics/ajd/JADiagOrth_unittest.cc @@ -26,6 +26,7 @@ TEST(CJADiagOrth, diagonalize) C_dims[1] = 10; C_dims[2] = 30; SGNDArray< float64_t > C(C_dims, 3); + auto m_rng = std::unique_ptr(new CRandom()); for (int i = 0; i < C_dims[2]; i++) { @@ -33,8 +34,7 @@ TEST(CJADiagOrth, diagonalize) tmp.setIdentity(); for (int j = 0; j < C_dims[0]; j++) - tmp(j,j) *= CMath::abs(CMath::random(1,5)); - + tmp(j, j) *= CMath::abs(m_rng->random(1, 5)); } // Building a random orthonormal matrix A diff --git a/tests/unit/mathematics/ajd/JADiag_unittest.cc b/tests/unit/mathematics/ajd/JADiag_unittest.cc index 2e64b11becc..4189d9ff7bb 100644 --- a/tests/unit/mathematics/ajd/JADiag_unittest.cc +++ b/tests/unit/mathematics/ajd/JADiag_unittest.cc @@ -26,7 +26,7 @@ TEST(CJADiag, diagonalize) C_dims[2] = 30; SGNDArray< float64_t > C(C_dims, 3); - CMath::init_random(17); + auto m_rng = std::unique_ptr(new CRandom(17)); for (int i = 0; i < C_dims[2]; i++) { @@ -34,8 +34,7 @@ TEST(CJADiag, diagonalize) tmp.setIdentity(); for (int j = 0; j < C_dims[0]; j++) - tmp(j,j) *= CMath::abs(CMath::random(1,5)); - + tmp(j, j) *= CMath::abs(m_rng->random(1, 5)); } // Mixing and demixing matrices diff --git a/tests/unit/mathematics/ajd/JediDiag_unittest.cc b/tests/unit/mathematics/ajd/JediDiag_unittest.cc index a4c139cf37a..a04557e9a86 100644 --- a/tests/unit/mathematics/ajd/JediDiag_unittest.cc +++ b/tests/unit/mathematics/ajd/JediDiag_unittest.cc @@ -26,7 +26,7 @@ TEST(CJediDiag, diagonalize) C_dims[2] = 30; SGNDArray< float64_t > C(C_dims, 3); - CMath::init_random(17); + auto m_rng = std::unique_ptr(new CRandom(17)); for (int i = 0; i < C_dims[2]; i++) { @@ -34,8 +34,7 @@ TEST(CJediDiag, diagonalize) tmp.setIdentity(); for (int j = 0; j < C_dims[0]; j++) - tmp(j,j) *= CMath::abs(CMath::random(1,5)); - + tmp(j, j) *= CMath::abs(m_rng->random(1, 5)); } // Mixing and demixing matrices diff --git a/tests/unit/mathematics/ajd/QDiag_unittest.cc b/tests/unit/mathematics/ajd/QDiag_unittest.cc index 5a0f38e3f8e..0cd3aef57a3 100644 --- a/tests/unit/mathematics/ajd/QDiag_unittest.cc +++ b/tests/unit/mathematics/ajd/QDiag_unittest.cc @@ -26,7 +26,7 @@ TEST(CQDiag, diagonalize) C_dims[2] = 30; SGNDArray< float64_t > C(C_dims, 3); - CMath::init_random(17); + auto m_rng = std::unique_ptr(new CRandom(17)); for (int i = 0; i < C_dims[2]; i++) { @@ -34,8 +34,7 @@ TEST(CQDiag, diagonalize) tmp.setIdentity(); for (int j = 0; j < C_dims[0]; j++) - tmp(j,j) *= CMath::abs(CMath::random(1,5)); - + tmp(j, j) *= CMath::abs(m_rng->random(1, 5)); } // Mixing and demixing matrices diff --git a/tests/unit/mathematics/ajd/UWedge_unittest.cc b/tests/unit/mathematics/ajd/UWedge_unittest.cc index 820cd0f0cf4..8a11a2ed209 100644 --- a/tests/unit/mathematics/ajd/UWedge_unittest.cc +++ b/tests/unit/mathematics/ajd/UWedge_unittest.cc @@ -26,7 +26,7 @@ TEST(CUWedge, diagonalize) C_dims[2] = 30; SGNDArray< float64_t > C(C_dims, 3); - CMath::init_random(17); + auto m_rng = std::unique_ptr(new CRandom(17)); for (int i = 0; i < C_dims[2]; i++) { @@ -35,7 +35,7 @@ TEST(CUWedge, diagonalize) for (int j = 0; j < C_dims[0]; j++) { - tmp(j,j) *= CMath::abs(CMath::random(1,5)); + tmp(j, j) *= CMath::abs(m_rng->random(1, 5)); } } diff --git a/tests/unit/mathematics/linalg/LanczosEigenSolver_unittest.cc b/tests/unit/mathematics/linalg/LanczosEigenSolver_unittest.cc index 6a6d91b1d94..9a0ad176486 100644 --- a/tests/unit/mathematics/linalg/LanczosEigenSolver_unittest.cc +++ b/tests/unit/mathematics/linalg/LanczosEigenSolver_unittest.cc @@ -29,11 +29,12 @@ TEST(LanczosEigenSolver, compute) { const int32_t size=4; SGMatrix m(size, size); - m.set_const(CMath::random(50.0, 100.0)); + auto m_rng = std::unique_ptr(new CRandom()); + m.set_const(m_rng->random(50.0, 100.0)); // Hermintian matrix for (index_t i=0; irandom(100.0, 10000.0); // Creating sparse linear operator to use with Lanczos CSparseFeatures feat(m); diff --git a/tests/unit/mathematics/linalg/LogDetEstimator_unittest.cc b/tests/unit/mathematics/linalg/LogDetEstimator_unittest.cc index a06aa356dd8..2fb90523a00 100644 --- a/tests/unit/mathematics/linalg/LogDetEstimator_unittest.cc +++ b/tests/unit/mathematics/linalg/LogDetEstimator_unittest.cc @@ -121,7 +121,7 @@ TEST(LogDetEstimator, sample_ratapp_dense) mat(1,0)=0.5; mat(1,1)=1000.0; - CMath::init_random(1); + set_global_seed(1); float64_t accuracy=1E-5; CDenseMatrixOperator* op=new CDenseMatrixOperator(mat); @@ -140,7 +140,7 @@ TEST(LogDetEstimator, sample_ratapp_dense) SG_REF(op_func); CNormalSampler* trace_sampler=new CNormalSampler(size); - trace_sampler->set_seed(1); + SG_REF(trace_sampler); CLogDetEstimator estimator(trace_sampler, op_func, e); diff --git a/tests/unit/multiclass/BaggingMachine_unittest.cc b/tests/unit/multiclass/BaggingMachine_unittest.cc index cc6ac7b9908..696d9be0a88 100644 --- a/tests/unit/multiclass/BaggingMachine_unittest.cc +++ b/tests/unit/multiclass/BaggingMachine_unittest.cc @@ -27,7 +27,7 @@ class BaggingMachine : public ::testing::Test SGVector ft; virtual void SetUp() { - CMath::init_random(1); + set_global_seed(1); load_toy_data(); } diff --git a/tests/unit/multiclass/KNN_unittest.cc b/tests/unit/multiclass/KNN_unittest.cc index 1be12719e07..f37c2e6a108 100644 --- a/tests/unit/multiclass/KNN_unittest.cc +++ b/tests/unit/multiclass/KNN_unittest.cc @@ -12,7 +12,7 @@ using namespace shogun; void generate_knn_data(SGMatrix& feat, SGVector& lab, int32_t num, int32_t classes, int32_t feats) { - CMath::init_random(1); + set_global_seed(1); feat = CDataGenerator::generate_gaussians(num,classes,feats); for( int i = 0 ; i < classes ; ++i ) for( int j = 0 ; j < num ; ++j ) diff --git a/tests/unit/multiclass/LaRank_unittest.cc b/tests/unit/multiclass/LaRank_unittest.cc index 157ec7b2604..dd27bb8e9f9 100644 --- a/tests/unit/multiclass/LaRank_unittest.cc +++ b/tests/unit/multiclass/LaRank_unittest.cc @@ -18,13 +18,14 @@ TEST(LaRank,train) SGMatrix matrix_test(num_class, num_vec); CMulticlassLabels* labels=new CMulticlassLabels(num_vec); CMulticlassLabels* labels_test=new CMulticlassLabels(num_vec); + auto m_rng = std::unique_ptr(new CRandom()); for (index_t i=0; istd_normal_distrib(); + matrix_test(j, i) = m_rng->std_normal_distrib(); labels->set_label(i, label); labels_test->set_label(i, label); } diff --git a/tests/unit/multiclass/MulticlassLibLinear_unittest.cc b/tests/unit/multiclass/MulticlassLibLinear_unittest.cc index 56fec676fe0..ee73eb5966a 100644 --- a/tests/unit/multiclass/MulticlassLibLinear_unittest.cc +++ b/tests/unit/multiclass/MulticlassLibLinear_unittest.cc @@ -16,13 +16,14 @@ TEST(MulticlassLibLinearTest,train_and_apply) SGMatrix matrix_test(num_class, num_vec); CMulticlassLabels* labels=new CMulticlassLabels(num_vec); CMulticlassLabels* labels_test=new CMulticlassLabels(num_vec); + auto m_rng = std::unique_ptr(new CRandom()); for (index_t i=0; istd_normal_distrib(); + matrix_test(j, i) = m_rng->std_normal_distrib(); labels->set_label(i, label); labels_test->set_label(i, label); } diff --git a/tests/unit/multiclass/MulticlassOCAS_unittest.cc b/tests/unit/multiclass/MulticlassOCAS_unittest.cc index e0f6e0373ea..15ca4002f2a 100644 --- a/tests/unit/multiclass/MulticlassOCAS_unittest.cc +++ b/tests/unit/multiclass/MulticlassOCAS_unittest.cc @@ -13,7 +13,7 @@ extern MultiLabelTestEnvironment* multilabel_test_env; #ifdef HAVE_LAPACK TEST(MulticlassOCASTest,train) { - CMath::init_random(17); + set_global_seed(17); float64_t C = 1.0; std::shared_ptr mockData = multilabel_test_env->getMulticlassFixture(); diff --git a/tests/unit/multiclass/tree/CARTree_unittest.cc b/tests/unit/multiclass/tree/CARTree_unittest.cc index 5e1c0af9b56..b98d86c03f9 100644 --- a/tests/unit/multiclass/tree/CARTree_unittest.cc +++ b/tests/unit/multiclass/tree/CARTree_unittest.cc @@ -546,7 +546,7 @@ TEST(CARTree, form_t1_test) TEST(CARTree,cv_prune_simple) { - CMath::init_random(1); + set_global_seed(1); SGMatrix data(2,20); data(0,0)=2; data(1,0)=2; diff --git a/tests/unit/multiclass/tree/RandomCARTree_unittest.cc b/tests/unit/multiclass/tree/RandomCARTree_unittest.cc index dff490ad801..34ff9732923 100644 --- a/tests/unit/multiclass/tree/RandomCARTree_unittest.cc +++ b/tests/unit/multiclass/tree/RandomCARTree_unittest.cc @@ -51,7 +51,7 @@ using namespace shogun; TEST(RandomCARTree, classify_nominal) { - CMath::init_random(2); + set_global_seed(2); SGMatrix data(4,14); //vector = [Outlook Temperature Humidity Wind] diff --git a/tests/unit/multiclass/tree/RandomForest_unittest.cc b/tests/unit/multiclass/tree/RandomForest_unittest.cc index f216f28e8b5..7cdab87e262 100644 --- a/tests/unit/multiclass/tree/RandomForest_unittest.cc +++ b/tests/unit/multiclass/tree/RandomForest_unittest.cc @@ -50,7 +50,7 @@ class RandomForest : public ::testing::Test virtual void SetUp() { - CMath::init_random(1); + set_global_seed(1); load_toy_data(); } @@ -109,10 +109,10 @@ TEST_F(RandomForest, classify_nominal_test) EXPECT_EQ(0.0,res_vector[1]); EXPECT_EQ(0.0,res_vector[2]); EXPECT_EQ(1.0,res_vector[3]); - EXPECT_EQ(1.0,res_vector[4]); + EXPECT_EQ(0.0, res_vector[4]); CMulticlassAccuracy* eval=new CMulticlassAccuracy(); - EXPECT_NEAR(0.642857,c->get_oob_error(eval),1e-6); + EXPECT_NEAR(0.571428, c->get_oob_error(eval), 1e-6); SG_UNREF(result); SG_UNREF(c); @@ -143,10 +143,10 @@ TEST_F(RandomForest, classify_non_nominal_test) EXPECT_EQ(0.0,res_vector[1]); EXPECT_EQ(0.0,res_vector[2]); EXPECT_EQ(1.0,res_vector[3]); - EXPECT_EQ(1.0,res_vector[4]); + EXPECT_EQ(0.0, res_vector[4]); CMulticlassAccuracy* eval=new CMulticlassAccuracy(); - EXPECT_NEAR(0.714285,c->get_oob_error(eval),1e-6); + EXPECT_NEAR(0.571428, c->get_oob_error(eval), 1e-6); SG_UNREF(result); SG_UNREF(c); diff --git a/tests/unit/neuralnets/Autoencoder_unittest.cc b/tests/unit/neuralnets/Autoencoder_unittest.cc index f4ebf089872..af6572edd81 100644 --- a/tests/unit/neuralnets/Autoencoder_unittest.cc +++ b/tests/unit/neuralnets/Autoencoder_unittest.cc @@ -44,7 +44,7 @@ using namespace shogun; TEST(Autoencoder, train) { - CMath::init_random(100); + auto m_rng = std::unique_ptr(new CRandom(100)); int32_t num_features = 10; int32_t num_examples = 100; @@ -52,7 +52,7 @@ TEST(Autoencoder, train) SGMatrix data(num_features, num_examples); for (int32_t i=0; irandom(-1.0, 1.0); CAutoencoder ae(num_features, new CNeuralRectifiedLinearLayer(num_hid)); @@ -81,7 +81,7 @@ TEST(Autoencoder, contractive_linear) { float64_t tolerance = 1e-9; - CMath::init_random(10); + set_global_seed(10); CAutoencoder ae(10, new CNeuralLinearLayer(15)); @@ -98,7 +98,7 @@ TEST(Autoencoder, contractive_rectified_linear) { float64_t tolerance = 1e-9; - CMath::init_random(10); + set_global_seed(10); CAutoencoder ae(10, new CNeuralRectifiedLinearLayer(15)); @@ -115,7 +115,7 @@ TEST(Autoencoder, contractive_logistic) { float64_t tolerance = 1e-6; - CMath::init_random(10); + set_global_seed(10); CAutoencoder ae(10, new CNeuralLogisticLayer(15)); ae.initialize_neural_network(); @@ -135,7 +135,7 @@ TEST(Autoencoder, convolutional) float64_t tolerance = 1e-9; - CMath::init_random(10); + set_global_seed(10); CAutoencoder ae(w,h,3, new CNeuralConvolutionalLayer(CMAF_IDENTITY, 2, 1,1, 1,1, 1,1), @@ -154,7 +154,7 @@ TEST(Autoencoder, convolutional_with_pooling) float64_t tolerance = 1e-9; - CMath::init_random(10); + set_global_seed(10); CAutoencoder ae(w,h,3, new CNeuralConvolutionalLayer(CMAF_IDENTITY, 2, 1,1, 3,2, 1,1), @@ -173,7 +173,7 @@ TEST(Autoencoder, convolutional_with_stride) float64_t tolerance = 1e-9; - CMath::init_random(10); + set_global_seed(10); CAutoencoder ae(w,h,3, new CNeuralConvolutionalLayer(CMAF_IDENTITY, 2, 1,1, 1,1, 3,2), @@ -192,7 +192,7 @@ TEST(Autoencoder, convolutional_with_stride_and_pooling) float64_t tolerance = 1e-9; - CMath::init_random(10); + set_global_seed(10); CAutoencoder ae(w,h,3, new CNeuralConvolutionalLayer(CMAF_IDENTITY, 2, 1,1, 2,2, 2,2), diff --git a/tests/unit/neuralnets/ConvolutionalFeatureMap_unittest.cc b/tests/unit/neuralnets/ConvolutionalFeatureMap_unittest.cc index 226637a7da8..b689a85c173 100644 --- a/tests/unit/neuralnets/ConvolutionalFeatureMap_unittest.cc +++ b/tests/unit/neuralnets/ConvolutionalFeatureMap_unittest.cc @@ -307,11 +307,11 @@ TEST(ConvolutionalFeatureMap, compute_parameter_gradients) const int32_t map_index = 1; const int32_t num_maps = 3; - CMath::init_random(10); + auto m_rng = std::unique_ptr(new CRandom(10)); SGMatrix x1(w*h,b); for (int32_t i=0; irandom(-10.0, 10.0); CNeuralInputLayer* input1 = new CNeuralInputLayer (x1.num_rows); input1->set_batch_size(x1.num_cols); @@ -319,7 +319,7 @@ TEST(ConvolutionalFeatureMap, compute_parameter_gradients) // two channels SGMatrix x2(2*w*h,b); for (int32_t i=0; irandom(-10.0, 10.0); CNeuralInputLayer* input2 = new CNeuralInputLayer (x2.num_rows); input2->set_batch_size(x2.num_cols); @@ -335,7 +335,7 @@ TEST(ConvolutionalFeatureMap, compute_parameter_gradients) CConvolutionalFeatureMap map(w,h,rx,ry,1,1,map_index); SGVector params(1+(2*rx+1)*(2*ry+1)*3); for (int32_t i=0; inormal_random(0.0, 0.01); input1->compute_activations(x1); input2->compute_activations(x2); @@ -399,11 +399,11 @@ TEST(ConvolutionalFeatureMap, compute_parameter_gradients_with_stride) int32_t w_out = w/stride_x; int32_t h_out = h/stride_y; - CMath::init_random(10); + auto m_rng = std::unique_ptr(new CRandom(10)); SGMatrix x1(w*h,b); for (int32_t i=0; irandom(-10.0, 10.0); CNeuralInputLayer* input1 = new CNeuralInputLayer (x1.num_rows); input1->set_batch_size(x1.num_cols); @@ -411,7 +411,7 @@ TEST(ConvolutionalFeatureMap, compute_parameter_gradients_with_stride) // two channels SGMatrix x2(2*w*h,b); for (int32_t i=0; irandom(-10.0, 10.0); CNeuralInputLayer* input2 = new CNeuralInputLayer (x2.num_rows); input2->set_batch_size(x2.num_cols); @@ -427,7 +427,7 @@ TEST(ConvolutionalFeatureMap, compute_parameter_gradients_with_stride) CConvolutionalFeatureMap map(w,h,rx,ry,stride_x,stride_y,map_index); SGVector params(1+(2*rx+1)*(2*ry+1)*3); for (int32_t i=0; inormal_random(0.0, 0.01); input1->compute_activations(x1); input2->compute_activations(x2); @@ -484,11 +484,11 @@ TEST(ConvolutionalFeatureMap, compute_parameter_gradients_logistic) const int32_t ry = 1; const int32_t b = 2; - CMath::init_random(10); + auto m_rng = std::unique_ptr(new CRandom(10)); SGMatrix x1(w*h,b); for (int32_t i=0; irandom(-10.0, 10.0); CNeuralInputLayer* input1 = new CNeuralInputLayer (x1.num_rows); input1->set_batch_size(x1.num_cols); @@ -502,7 +502,7 @@ TEST(ConvolutionalFeatureMap, compute_parameter_gradients_logistic) CConvolutionalFeatureMap map(w,h,rx,ry,1,1,0, CMAF_LOGISTIC); SGVector params(1+(2*rx+1)*(2*ry+1)); for (int32_t i=0; inormal_random(0.0, 0.01); input1->compute_activations(x1); @@ -558,11 +558,11 @@ TEST(ConvolutionalFeatureMap, compute_parameter_gradients_rectified_linear) const int32_t ry = 1; const int32_t b = 2; - CMath::init_random(10); + auto m_rng = std::unique_ptr(new CRandom(10)); SGMatrix x1(w*h,b); for (int32_t i=0; irandom(-10.0, 10.0); CNeuralInputLayer* input1 = new CNeuralInputLayer (x1.num_rows); input1->set_batch_size(x1.num_cols); @@ -576,7 +576,7 @@ TEST(ConvolutionalFeatureMap, compute_parameter_gradients_rectified_linear) CConvolutionalFeatureMap map(w,h,rx,ry,1,1,0, CMAF_RECTIFIED_LINEAR); SGVector params(1+(2*rx+1)*(2*ry+1)); for (int32_t i=0; inormal_random(0.0, 0.01); input1->compute_activations(x1); @@ -634,7 +634,7 @@ TEST(ConvolutionalFeatureMap, compute_input_gradients) const int32_t map_index = 0; const int32_t num_maps = 1; - CMath::init_random(100); + auto m_rng = std::unique_ptr(new CRandom(100)); CNeuralLinearLayer* input1 = new CNeuralLinearLayer (w*h); input1->set_batch_size(b); @@ -644,10 +644,10 @@ TEST(ConvolutionalFeatureMap, compute_input_gradients) input2->set_batch_size(b); for (int32_t i=0; iget_num_neurons()*b; i++) - input1->get_activations()[i] = CMath::random(-10.0,10.0); + input1->get_activations()[i] = m_rng->random(-10.0, 10.0); for (int32_t i=0; iget_num_neurons()*b; i++) - input2->get_activations()[i] = CMath::random(-10.0,10.0); + input2->get_activations()[i] = m_rng->random(-10.0, 10.0); CDynamicObjectArray* layers = new CDynamicObjectArray(); layers->append_element(input1); @@ -660,7 +660,7 @@ TEST(ConvolutionalFeatureMap, compute_input_gradients) CConvolutionalFeatureMap map(w,h,rx,ry,1,1,map_index); SGVector params(1+(2*rx+1)*(2*ry+1)*3); for (int32_t i=0; inormal_random(0.0, 0.01); SGMatrix A(num_maps*w*h,b); A.zero(); diff --git a/tests/unit/neuralnets/DeepAutoencoder_unittest.cc b/tests/unit/neuralnets/DeepAutoencoder_unittest.cc index 31d3bdfa96a..abf15e1d2bf 100644 --- a/tests/unit/neuralnets/DeepAutoencoder_unittest.cc +++ b/tests/unit/neuralnets/DeepAutoencoder_unittest.cc @@ -44,14 +44,14 @@ using namespace shogun; TEST(DeepAutoencoder, pre_train) { - CMath::init_random(10); + auto m_rng = std::unique_ptr(new CRandom(10)); int32_t num_features = 10; int32_t num_examples = 100; SGMatrix data(num_features, num_examples); for (int32_t i=0; irandom(-1.0, 1.0); CDynamicObjectArray* layers = new CDynamicObjectArray(); layers->append_element(new CNeuralInputLayer(num_features)); @@ -83,7 +83,7 @@ TEST(DeepAutoencoder, pre_train) TEST(DeepAutoencoder, convert_to_neural_network) { - CMath::init_random(100); + auto m_rng = std::unique_ptr(new CRandom(100)); CDynamicObjectArray* layers = new CDynamicObjectArray(); layers->append_element(new CNeuralInputLayer(10)); @@ -98,7 +98,7 @@ TEST(DeepAutoencoder, convert_to_neural_network) SGMatrix x(10, 3); for (int32_t i=0; irandom(0.0, 1.0); CDenseFeatures f(x); diff --git a/tests/unit/neuralnets/DeepBeliefNetwork_unittest.cc b/tests/unit/neuralnets/DeepBeliefNetwork_unittest.cc index e8836ec29ec..63cb3ca80de 100644 --- a/tests/unit/neuralnets/DeepBeliefNetwork_unittest.cc +++ b/tests/unit/neuralnets/DeepBeliefNetwork_unittest.cc @@ -41,7 +41,7 @@ using namespace shogun; TEST(DeepBeliefNetwork, convert_to_neural_network) { - CMath::init_random(100); + auto m_rng = std::unique_ptr(new CRandom(100)); CDeepBeliefNetwork dbn(5, RBMVUT_BINARY); dbn.add_hidden_layer(6); @@ -54,7 +54,7 @@ TEST(DeepBeliefNetwork, convert_to_neural_network) SGMatrix x(5, 3); for (int32_t i=0; irandom(0.0, 1.0); CDenseFeatures f(x); diff --git a/tests/unit/neuralnets/NeuralInputLayer_unittest.cc b/tests/unit/neuralnets/NeuralInputLayer_unittest.cc index a4b1a11feb0..e5c9026654f 100644 --- a/tests/unit/neuralnets/NeuralInputLayer_unittest.cc +++ b/tests/unit/neuralnets/NeuralInputLayer_unittest.cc @@ -38,10 +38,10 @@ using namespace shogun; TEST(NeuralInputLayer, compute_activations) { - CMath::init_random(100); + auto m_rng = std::unique_ptr(new CRandom(100)); SGMatrix x(12,3); for (int32_t i=0; irandom(-10.0, 10.0); CNeuralInputLayer layer(5, 4); layer.set_batch_size(x.num_cols); diff --git a/tests/unit/neuralnets/NeuralLeakyRectifiedLinearLayer_unittest.cc b/tests/unit/neuralnets/NeuralLeakyRectifiedLinearLayer_unittest.cc index fd1f1128939..5ff137870c0 100644 --- a/tests/unit/neuralnets/NeuralLeakyRectifiedLinearLayer_unittest.cc +++ b/tests/unit/neuralnets/NeuralLeakyRectifiedLinearLayer_unittest.cc @@ -48,10 +48,10 @@ TEST(NeuralLeakyRectifiedLinearLayer, compute_activations) CNeuralLeakyRectifiedLinearLayer layer(9); float64_t alpha = 0.02; // initialize some random inputs - CMath::init_random(100); + auto m_rng = std::unique_ptr(new CRandom(100)); SGMatrix x(12,3); for (int32_t i=0; irandom(-10.0, 10.0); CNeuralInputLayer* input = new CNeuralInputLayer (x.num_rows); input->set_batch_size(x.num_cols); diff --git a/tests/unit/neuralnets/NeuralLinearLayer_unittest.cc b/tests/unit/neuralnets/NeuralLinearLayer_unittest.cc index 0d7ca6b8b78..0cba7ce7967 100644 --- a/tests/unit/neuralnets/NeuralLinearLayer_unittest.cc +++ b/tests/unit/neuralnets/NeuralLinearLayer_unittest.cc @@ -48,17 +48,17 @@ TEST(NeuralLinearLayer, compute_activations) CNeuralLinearLayer layer(9); // initialize some random inputs - CMath::init_random(100); + auto m_rng = std::unique_ptr(new CRandom(100)); SGMatrix x1(12,3); for (int32_t i=0; irandom(-10.0, 10.0); CNeuralInputLayer* input1 = new CNeuralInputLayer (x1.num_rows); input1->set_batch_size(x1.num_cols); SGMatrix x2(7,3); for (int32_t i=0; irandom(-10.0, 10.0); CNeuralInputLayer* input2 = new CNeuralInputLayer (x2.num_rows); input2->set_batch_size(x2.num_cols); @@ -120,17 +120,17 @@ TEST(NeuralLinearLayer, compute_activations) */ TEST(NeuralLinearLayer, compute_error) { - CMath::init_random(100); + auto m_rng = std::unique_ptr(new CRandom(100)); SGMatrix x1(12,3); for (int32_t i=0; irandom(-10.0, 10.0); CNeuralInputLayer* input1 = new CNeuralInputLayer (x1.num_rows); input1->set_batch_size(x1.num_cols); SGMatrix x2(7,3); for (int32_t i=0; irandom(-10.0, 10.0); CNeuralInputLayer* input2 = new CNeuralInputLayer (x2.num_rows); input2->set_batch_size(x2.num_cols); @@ -145,7 +145,7 @@ TEST(NeuralLinearLayer, compute_error) SGMatrix y(9,3); for (int32_t i=0; irandom(0.0, 1.0); // initialize the layer CNeuralLinearLayer layer(y.num_rows); @@ -178,10 +178,10 @@ TEST(NeuralLinearLayer, compute_error) */ TEST(NeuralLinearLayer, compute_local_gradients) { - CMath::init_random(100); + auto m_rng = std::unique_ptr(new CRandom(100)); SGMatrix x(12,3); for (int32_t i=0; irandom(-10.0, 10.0); CNeuralInputLayer* input1 = new CNeuralInputLayer (x.num_rows); input1->set_batch_size(x.num_cols); @@ -194,7 +194,7 @@ TEST(NeuralLinearLayer, compute_local_gradients) SGMatrix y(9,3); for (int32_t i=0; irandom(0.0, 1.0); // initialize the layer CNeuralLinearLayer layer(y.num_rows); @@ -241,15 +241,16 @@ TEST(NeuralLinearLayer, compute_local_gradients) TEST(NeuralLinearLayer, compute_parameter_gradients_output) { SGMatrix x1(12,3); + auto m_rng = std::unique_ptr(new CRandom()); for (int32_t i=0; irandom(-10.0, 10.0); CNeuralInputLayer* input1 = new CNeuralInputLayer (x1.num_rows); input1->set_batch_size(x1.num_cols); SGMatrix x2(7,3); for (int32_t i=0; irandom(-10.0, 10.0); CNeuralInputLayer* input2 = new CNeuralInputLayer (x2.num_rows); input2->set_batch_size(x2.num_cols); @@ -264,7 +265,7 @@ TEST(NeuralLinearLayer, compute_parameter_gradients_output) SGMatrix y(9,3); for (int32_t i=0; irandom(0.0, 1.0); // initialize the layer CNeuralLinearLayer layer(y.num_rows); @@ -318,15 +319,16 @@ TEST(NeuralLinearLayer, compute_parameter_gradients_output) TEST(NeuralLinearLayer, compute_parameter_gradients_hidden) { SGMatrix x1(12,3); + auto m_rng = std::unique_ptr(new CRandom()); for (int32_t i=0; irandom(-10.0, 10.0); CNeuralInputLayer* input1 = new CNeuralInputLayer (x1.num_rows); input1->set_batch_size(x1.num_cols); SGMatrix x2(7,3); for (int32_t i=0; irandom(-10.0, 10.0); CNeuralInputLayer* input2 = new CNeuralInputLayer (x2.num_rows); input2->set_batch_size(x2.num_cols); @@ -348,7 +350,7 @@ TEST(NeuralLinearLayer, compute_parameter_gradients_hidden) SGMatrix y(9,3); for (int32_t i=0; irandom(0.0, 1.0); // initialize the hidden layer layer_hid->initialize_neural_layer(layers, input_indices_hid); diff --git a/tests/unit/neuralnets/NeuralLogisticLayer_unittest.cc b/tests/unit/neuralnets/NeuralLogisticLayer_unittest.cc index 68847c45b66..af5be5fbbc1 100644 --- a/tests/unit/neuralnets/NeuralLogisticLayer_unittest.cc +++ b/tests/unit/neuralnets/NeuralLogisticLayer_unittest.cc @@ -48,10 +48,10 @@ TEST(NeuralLogisticLayer, compute_activations) CNeuralLogisticLayer layer(9); // initialize some random inputs - CMath::init_random(100); + auto m_rng = std::unique_ptr(new CRandom(100)); SGMatrix x(12,3); for (int32_t i=0; irandom(-10.0, 10.0); CNeuralInputLayer* input = new CNeuralInputLayer (x.num_rows); input->set_batch_size(x.num_cols); @@ -109,10 +109,10 @@ TEST(NeuralLogisticLayer, compute_local_gradients) { CNeuralLogisticLayer layer(9); - CMath::init_random(100); + auto m_rng = std::unique_ptr(new CRandom(100)); SGMatrix x(12,3); for (int32_t i=0; irandom(-10.0, 10.0); CNeuralInputLayer* input = new CNeuralInputLayer (x.num_rows); input->set_batch_size(x.num_cols); @@ -132,7 +132,7 @@ TEST(NeuralLogisticLayer, compute_local_gradients) SGMatrix y(layer.get_num_neurons(), x.num_cols); for (int32_t i=0; irandom(0.0, 1.0); // compute the layer's local gradients input->compute_activations(x); diff --git a/tests/unit/neuralnets/NeuralNetwork_unittest.cc b/tests/unit/neuralnets/NeuralNetwork_unittest.cc index b88acdce749..f1080283052 100644 --- a/tests/unit/neuralnets/NeuralNetwork_unittest.cc +++ b/tests/unit/neuralnets/NeuralNetwork_unittest.cc @@ -56,7 +56,7 @@ TEST(NeuralNetwork, backpropagation_linear) { float64_t tolerance = 1e-9; - CMath::init_random(10); + set_global_seed(100); CDynamicObjectArray* layers = new CDynamicObjectArray(); layers->append_element(new CNeuralInputLayer(5)); @@ -88,7 +88,7 @@ TEST(NeuralNetwork, neural_layers_builder) { float64_t tolerance = 1e-9; - CMath::init_random(10); + set_global_seed(100); CNeuralLayers* layers = new CNeuralLayers(); layers->input(5) @@ -123,7 +123,7 @@ TEST(NeuralNetwork, backpropagation_logistic) { float64_t tolerance = 1e-9; - CMath::init_random(10); + set_global_seed(100); CDynamicObjectArray* layers = new CDynamicObjectArray(); layers->append_element(new CNeuralInputLayer(5)); @@ -155,7 +155,7 @@ TEST(NeuralNetwork, backpropagation_softmax) { float64_t tolerance = 1e-9; - CMath::init_random(10); + set_global_seed(100); CDynamicObjectArray* layers = new CDynamicObjectArray(); layers->append_element(new CNeuralInputLayer(5)); @@ -187,7 +187,7 @@ TEST(NeuralNetwork, backpropagation_rectified_linear) { float64_t tolerance = 1e-9; - CMath::init_random(10); + set_global_seed(10); CDynamicObjectArray* layers = new CDynamicObjectArray(); layers->append_element(new CNeuralInputLayer(5)); @@ -219,7 +219,7 @@ TEST(NeuralNetwork, backpropagation_convolutional) { float64_t tolerance = 1e-9; - CMath::init_random(10); + set_global_seed(10); CDynamicObjectArray* layers = new CDynamicObjectArray(); layers->append_element(new CNeuralInputLayer(6,4)); @@ -250,7 +250,7 @@ TEST(NeuralNetwork, backpropagation_convolutional) /** tests a neural network on the binary XOR problem */ TEST(NeuralNetwork, binary_classification) { - CMath::init_random(100); + set_global_seed(10); SGMatrix inputs_matrix(2,4); SGVector targets_vector(4); @@ -309,7 +309,7 @@ TEST(NeuralNetwork, binary_classification) */ TEST(NeuralNetwork, multiclass_classification) { - CMath::init_random(100); + set_global_seed(100); SGMatrix inputs_matrix(2,4); SGVector targets_vector(4); @@ -368,7 +368,7 @@ TEST(NeuralNetwork, multiclass_classification) /** tests a neural network on a very simple regression problem */ TEST(NeuralNetwork, regression) { - CMath::init_random(100); + set_global_seed(100); int32_t N = 20; SGMatrix inputs_matrix(1,N); @@ -414,7 +414,7 @@ TEST(NeuralNetwork, regression) */ TEST(NeuralNetwork, gradient_descent) { - CMath::init_random(100); + set_global_seed(100); SGMatrix inputs_matrix(2,4); SGVector targets_vector(4); diff --git a/tests/unit/neuralnets/NeuralRectifiedLinearLayer_unittest.cc b/tests/unit/neuralnets/NeuralRectifiedLinearLayer_unittest.cc index 4b065eb2e7d..9010599daa0 100644 --- a/tests/unit/neuralnets/NeuralRectifiedLinearLayer_unittest.cc +++ b/tests/unit/neuralnets/NeuralRectifiedLinearLayer_unittest.cc @@ -48,10 +48,10 @@ TEST(NeuralRectifiedLinearLayer, compute_activations) CNeuralRectifiedLinearLayer layer(9); // initialize some random inputs - CMath::init_random(100); + auto m_rng = std::unique_ptr(new CRandom(100)); SGMatrix x(12,3); for (int32_t i=0; irandom(-10.0, 10.0); CNeuralInputLayer* input = new CNeuralInputLayer (x.num_rows); input->set_batch_size(x.num_cols); @@ -109,15 +109,16 @@ TEST(NeuralRectifiedLinearLayer, compute_activations) TEST(NeuralRectifiedLinearLayer, compute_parameter_gradients_hidden) { SGMatrix x1(12,3); + auto m_rng = std::unique_ptr(new CRandom()); for (int32_t i=0; irandom(-10.0, 10.0); CNeuralInputLayer* input1 = new CNeuralInputLayer (x1.num_rows); input1->set_batch_size(x1.num_cols); SGMatrix x2(7,3); for (int32_t i=0; irandom(-10.0, 10.0); CNeuralInputLayer* input2 = new CNeuralInputLayer (x2.num_rows); input2->set_batch_size(x2.num_cols); @@ -139,7 +140,7 @@ TEST(NeuralRectifiedLinearLayer, compute_parameter_gradients_hidden) SGMatrix y(9,3); for (int32_t i=0; irandom(0.0, 1.0); // initialize the hidden layer layer_hid->initialize_neural_layer(layers, input_indices_hid); diff --git a/tests/unit/neuralnets/NeuralSoftmaxLayer_unittest.cc b/tests/unit/neuralnets/NeuralSoftmaxLayer_unittest.cc index 50b9f286d91..e2d6f081311 100644 --- a/tests/unit/neuralnets/NeuralSoftmaxLayer_unittest.cc +++ b/tests/unit/neuralnets/NeuralSoftmaxLayer_unittest.cc @@ -48,10 +48,10 @@ TEST(NeuralSoftmaxLayer, compute_activations) CNeuralSoftmaxLayer layer(9); // initialize some random inputs - CMath::init_random(100); + auto m_rng = std::unique_ptr(new CRandom(100)); SGMatrix x(12,3); for (int32_t i=0; irandom(-10.0, 10.0); CNeuralInputLayer* input = new CNeuralInputLayer (x.num_rows); input->set_batch_size(x.num_cols); @@ -119,10 +119,10 @@ TEST(NeuralSoftmaxLayer, compute_error) { CNeuralSoftmaxLayer layer(9); - CMath::init_random(100); + auto m_rng = std::unique_ptr(new CRandom(100)); SGMatrix x(12,3); for (int32_t i=0; irandom(-10.0, 10.0); CNeuralInputLayer* input = new CNeuralInputLayer (x.num_rows); input->set_batch_size(x.num_cols); @@ -142,7 +142,7 @@ TEST(NeuralSoftmaxLayer, compute_error) SGMatrix y(layer.get_num_neurons(), x.num_cols); for (int32_t i=0; irandom(0.0, 1.0); // make sure y is in the form of a probability distribution for (int32_t j=0; j(new CRandom(100)); SGMatrix x(12,3); for (int32_t i=0; irandom(-10.0, 10.0); CNeuralInputLayer* input = new CNeuralInputLayer (x.num_rows); input->set_batch_size(x.num_cols); @@ -203,7 +203,7 @@ TEST(NeuralSoftmaxLayer, compute_local_gradients) SGMatrix y(layer.get_num_neurons(), x.num_cols); for (int32_t i=0; irandom(0.0, 1.0); // make sure y is in the form of a probability distribution for (int32_t j=0; j(new CRandom(100)); int32_t num_visible = 15; int32_t num_hidden = 6; @@ -126,7 +126,7 @@ TEST(RBM, free_energy_gradients) SGMatrix V(num_visible, batch_size); for (int32_t i=0; irandom_64() < 0.7; SGVector gradients(rbm.get_num_parameters()); rbm.free_energy_gradients(V, gradients); @@ -153,11 +153,10 @@ TEST(RBM, free_energy_gradients) TEST(RBM, pseudo_likelihood_binary) { - CMath::init_random(100); - int32_t num_visible = 5; int32_t num_hidden = 6; int32_t batch_size = 1; + set_global_seed(100); CRBM rbm(num_hidden, num_visible, RBMVUT_BINARY); rbm.initialize_neural_network(); diff --git a/tests/unit/preprocessor/Preprocessor_unittest.cc b/tests/unit/preprocessor/Preprocessor_unittest.cc index 1459be0ded1..21f041fddf7 100644 --- a/tests/unit/preprocessor/Preprocessor_unittest.cc +++ b/tests/unit/preprocessor/Preprocessor_unittest.cc @@ -45,8 +45,9 @@ TEST(Preprocessor, dense_apply) const index_t dim=2; const index_t size=4; SGMatrix data(dim, size); + auto m_rng = std::unique_ptr(new CRandom()); for (index_t i=0; istd_normal_distrib(); CDenseFeatures* features=new CDenseFeatures(data); CDensePreprocessor* preproc=new CNormOne(); @@ -69,15 +70,16 @@ TEST(Preprocessor, string_apply) const index_t min_string_length=max_string_length/2; SGStringList strings(num_strings, max_string_length); + auto m_rng = std::unique_ptr(new CRandom()); for (index_t i=0; irandom(min_string_length, max_string_length); SGString current(len); /* fill with random uppercase letters (ASCII) */ for (index_t j=0; jrandom('A', 'Z'); strings.strings[i]=current; } diff --git a/tests/unit/preprocessor/RescaleFeatures_unittest.cc b/tests/unit/preprocessor/RescaleFeatures_unittest.cc index 3289df56b0d..99a46cc536f 100644 --- a/tests/unit/preprocessor/RescaleFeatures_unittest.cc +++ b/tests/unit/preprocessor/RescaleFeatures_unittest.cc @@ -18,7 +18,7 @@ TEST(RescaleFeatures, apply_to_feature_matrix) index_t num_vectors = 10; SGVector min(num_features), range(num_features); SGVector v(num_features*num_vectors), ev; - CMath::init_random(12345); + set_global_seed(12345); v.random(-1024, 1024); ev = v.clone(); diff --git a/tests/unit/regression/krrnystrom_unittest.cc b/tests/unit/regression/krrnystrom_unittest.cc index 16c523f3355..21c58be35cc 100644 --- a/tests/unit/regression/krrnystrom_unittest.cc +++ b/tests/unit/regression/krrnystrom_unittest.cc @@ -54,10 +54,11 @@ TEST(KRRNystrom, apply_and_compare_to_KRR_with_all_columns) /* fill data matrix and labels */ SGMatrix train_dat(num_features, num_vectors); SGMatrix test_dat(num_features, num_vectors); + auto m_rng = std::unique_ptr(new CRandom()); for (index_t i=0; inormal_random(0, 1.0); train_dat.matrix[i]=i; test_dat.matrix[i]=i; } @@ -113,6 +114,7 @@ TEST(KRRNystrom, apply_and_compare_to_KRR_with_column_subset) /* training label data */ SGVector lab(num_vectors); + auto m_rng = std::unique_ptr(new CRandom()); /* fill data matrix and labels */ SGMatrix train_dat(num_features, num_vectors); @@ -121,7 +123,7 @@ TEST(KRRNystrom, apply_and_compare_to_KRR_with_column_subset) { /* labels are linear plus noise */ float64_t point=(float64_t)i*10/num_vectors; - lab.vector[i]=point+CMath::normal_random(0, 1.0); + lab.vector[i] = point + m_rng->normal_random(0, 1.0); train_dat.matrix[i]=point; test_dat.matrix[i]=point; } diff --git a/tests/unit/regression/lars_unittest.cc b/tests/unit/regression/lars_unittest.cc index db0c45c8b3a..4e6ed514f69 100644 --- a/tests/unit/regression/lars_unittest.cc +++ b/tests/unit/regression/lars_unittest.cc @@ -377,12 +377,13 @@ TEST(LeastAngleRegression, cholesky_insert) SGVector vec(num_vec); vec.random(0.0,1.0); Map map_vec(vec.vector, vec.size()); + auto m_rng = std::unique_ptr(new CRandom()); for (index_t i=0; irandom(0.0, 1.0); matnew(i,j)=mat(i,j); } } @@ -414,10 +415,11 @@ TEST(LeastAngleRegression, ols_equivalence) { int32_t n_feat=25, n_vec=100; SGMatrix data(n_feat, n_vec); + auto m_rng = std::unique_ptr(new CRandom()); for (index_t i=0; irandom(0.0, 1.0); } SGVector lab=SGVector(n_vec); diff --git a/tests/unit/statistical_testing/KernelSelection_unittest.cc b/tests/unit/statistical_testing/KernelSelection_unittest.cc index 06b3599caa4..b0123a44e43 100644 --- a/tests/unit/statistical_testing/KernelSelection_unittest.cc +++ b/tests/unit/statistical_testing/KernelSelection_unittest.cc @@ -50,7 +50,7 @@ TEST(KernelSelectionMaxMMD, linear_time_single_kernel_streaming) const float64_t difference=0.5; const index_t num_kernels=10; - CMath::init_random(12345); + set_global_seed(12345); auto gen_p=new CMeanShiftDataGenerator(0, dim, 0); auto gen_q=new CMeanShiftDataGenerator(difference, dim, 0); @@ -83,7 +83,7 @@ TEST(KernelSelectionMaxMMD, quadratic_time_single_kernel_dense) const float64_t difference=0.5; const index_t num_kernels=10; - CMath::init_random(12345); + set_global_seed(12345); auto gen_p=some(0, dim, 0); auto gen_q=some(difference, dim, 0); @@ -105,7 +105,7 @@ TEST(KernelSelectionMaxMMD, quadratic_time_single_kernel_dense) mmd->set_train_test_mode(false); auto selected_kernel=static_cast(mmd->get_kernel()); - EXPECT_NEAR(selected_kernel->get_width(), 0.25, 1E-10); + EXPECT_NEAR(selected_kernel->get_width(), 0.0625, 1E-10); } TEST( @@ -150,7 +150,7 @@ TEST(KernelSelectionMaxMMD, linear_time_weighted_kernel_streaming) const float64_t difference=0.5; const index_t num_kernels=10; - CMath::init_random(12345); + set_global_seed(12345); auto gen_p=new CMeanShiftDataGenerator(0, dim, 0); auto gen_q=new CMeanShiftDataGenerator(difference, dim, 0); @@ -189,7 +189,7 @@ TEST(KernelSelectionMaxTestPower, linear_time_single_kernel_streaming) const float64_t difference=0.5; const index_t num_kernels=10; - CMath::init_random(12345); + set_global_seed(12345); auto gen_p=new CMeanShiftDataGenerator(0, dim, 0); auto gen_q=new CMeanShiftDataGenerator(difference, dim, 0); @@ -222,7 +222,7 @@ TEST(KernelSelectionMaxTestPower, quadratic_time_single_kernel) const float64_t difference=0.5; const index_t num_kernels=10; - CMath::init_random(12345); + set_global_seed(12345); auto gen_p=new CMeanShiftDataGenerator(0, dim, 0); auto gen_q=new CMeanShiftDataGenerator(difference, dim, 0); @@ -243,7 +243,7 @@ TEST(KernelSelectionMaxTestPower, quadratic_time_single_kernel) mmd->set_train_test_mode(false); auto selected_kernel=static_cast(mmd->get_kernel()); - EXPECT_NEAR(selected_kernel->get_width(), 0.25, 1E-10); + EXPECT_NEAR(selected_kernel->get_width(), 0.03125, 1E-10); } #ifdef USE_GPL_SHOGUN @@ -255,7 +255,7 @@ TEST(KernelSelectionMaxTestPower, linear_time_weighted_kernel_streaming) const float64_t difference=0.5; const index_t num_kernels=10; - CMath::init_random(12345); + set_global_seed(12345); auto gen_p=new CMeanShiftDataGenerator(0, dim, 0); auto gen_q=new CMeanShiftDataGenerator(difference, dim, 0); @@ -320,7 +320,7 @@ TEST(KernelSelectionMaxCrossValidation, quadratic_time_single_kernel_dense) mmd->set_train_test_mode(false); auto selected_kernel=static_cast(mmd->get_kernel()); - EXPECT_NEAR(selected_kernel->get_width(), 0.03125, 1E-10); + EXPECT_NEAR(selected_kernel->get_width(), 0.0625, 1E-10); } TEST(KernelSelectionMaxCrossValidation, linear_time_single_kernel_dense) @@ -335,7 +335,7 @@ TEST(KernelSelectionMaxCrossValidation, linear_time_single_kernel_dense) const float64_t train_test_ratio=3; const float64_t alpha=0.05; - CMath::init_random(12345); + set_global_seed(12345); auto gen_p=some(0, dim, 0); auto gen_q=some(difference, dim, 0); @@ -368,7 +368,7 @@ TEST(KernelSelectionMedianHeuristic, quadratic_time_single_kernel_dense) const float64_t difference=0.5; const index_t num_kernels=10; - CMath::init_random(12345); + set_global_seed(12345); auto gen_p=new CMeanShiftDataGenerator(0, dim, 0); auto gen_q=new CMeanShiftDataGenerator(difference, dim, 0); @@ -400,7 +400,7 @@ TEST(KernelSelectionMedianHeuristic, linear_time_single_kernel_dense) const float64_t difference=0.5; const index_t num_kernels=10; - CMath::init_random(12345); + set_global_seed(12345); auto gen_p=new CMeanShiftDataGenerator(0, dim, 0); auto gen_q=new CMeanShiftDataGenerator(difference, dim, 0); diff --git a/tests/unit/statistical_testing/LinearTimeMMD_unittest.cc b/tests/unit/statistical_testing/LinearTimeMMD_unittest.cc index 86e3adf9876..a72172d36dc 100644 --- a/tests/unit/statistical_testing/LinearTimeMMD_unittest.cc +++ b/tests/unit/statistical_testing/LinearTimeMMD_unittest.cc @@ -318,7 +318,7 @@ TEST(LinearTimeMMD, perform_test_gaussian_biased_full) const index_t dim=3; // use fixed seed - CMath::init_random(12345); + set_global_seed(12345); float64_t difference=0.5; // streaming data generator for mean shift distributions @@ -347,7 +347,7 @@ TEST(LinearTimeMMD, perform_test_gaussian_biased_full) // assert against local machine computed result mmd->set_statistic_type(ST_BIASED_FULL); float64_t p_value_gaussian=mmd->compute_p_value(mmd->compute_statistic()); - EXPECT_NEAR(p_value_gaussian, 0.0, 1E-10); + EXPECT_NEAR(p_value_gaussian, 0.0, 1E-6); } TEST(LinearTimeMMD, perform_test_gaussian_unbiased_full) @@ -357,7 +357,7 @@ TEST(LinearTimeMMD, perform_test_gaussian_unbiased_full) const index_t dim=3; float64_t difference=0.5; - CMath::init_random(12345); + set_global_seed(12345); // streaming data generator for mean shift distributions auto gen_p=new CMeanShiftDataGenerator(0, dim, 0); auto gen_q=new CMeanShiftDataGenerator(difference, dim, 0); @@ -384,7 +384,7 @@ TEST(LinearTimeMMD, perform_test_gaussian_unbiased_full) // assert against local machine computed result mmd->set_statistic_type(ST_UNBIASED_FULL); float64_t p_value_gaussian=mmd->compute_p_value(mmd->compute_statistic()); - EXPECT_NEAR(p_value_gaussian, 0.060947882185221292, 1E-6); + EXPECT_NEAR(p_value_gaussian, 0.78999099853119159, 1E-6); } TEST(LinearTimeMMD, perform_test_gaussian_unbiased_incomplete) @@ -393,7 +393,7 @@ TEST(LinearTimeMMD, perform_test_gaussian_unbiased_incomplete) const index_t n=20; const index_t dim=3; - CMath::init_random(12345); + set_global_seed(12345); float64_t difference=0.5; // streaming data generator for mean shift distributions @@ -422,5 +422,5 @@ TEST(LinearTimeMMD, perform_test_gaussian_unbiased_incomplete) // assert against local machine computed result mmd->set_statistic_type(ST_UNBIASED_INCOMPLETE); float64_t p_value_gaussian=mmd->compute_p_value(mmd->compute_statistic()); - EXPECT_NEAR(p_value_gaussian, 0.40645354706402292, 1E-6); + EXPECT_NEAR(p_value_gaussian, 0.48342157360749094, 1E-6); } diff --git a/tests/unit/statistical_testing/QuadraticTimeMMD_unittest.cc b/tests/unit/statistical_testing/QuadraticTimeMMD_unittest.cc index e30e32e455b..62a3eda9ad5 100644 --- a/tests/unit/statistical_testing/QuadraticTimeMMD_unittest.cc +++ b/tests/unit/statistical_testing/QuadraticTimeMMD_unittest.cc @@ -324,7 +324,9 @@ TEST(QuadraticTimeMMD, perform_test_permutation_biased_full) const index_t n=30; const index_t dim=3; - CMath::init_random(12345); + // use fixed seed + set_global_seed(12345); + float64_t difference=0.5; // streaming data generator for mean shift distributions @@ -361,7 +363,9 @@ TEST(QuadraticTimeMMD, perform_test_permutation_unbiased_full) const index_t n=30; const index_t dim=3; - CMath::init_random(12345); + // use fixed seed + set_global_seed(12345); + float64_t difference=0.5; // streaming data generator for mean shift distributions @@ -398,7 +402,9 @@ TEST(QuadraticTimeMMD, perform_test_permutation_unbiased_incomplete) const index_t n=20; const index_t dim=3; - CMath::init_random(12345); + // use fixed seed + set_global_seed(12345); + float64_t difference=0.5; // streaming data generator for mean shift distributions @@ -435,7 +441,9 @@ TEST(QuadraticTimeMMD, perform_test_spectrum) const index_t n=30; const index_t dim=3; - CMath::init_random(12345); + // use fixed seed + set_global_seed(12345); + float64_t difference=0.5; // streaming data generator for mean shift distributions @@ -503,11 +511,11 @@ TEST(QuadraticTimeMMD, precomputed_vs_nonprecomputed) mmd->set_num_null_samples(num_null_samples); mmd->set_null_approximation_method(NAM_PERMUTATION); - CMath::init_random(12345); + set_global_seed(12345); SGVector result_1=mmd->sample_null(); mmd->precompute_kernel_matrix(false); - CMath::init_random(12345); + set_global_seed(12345); SGVector result_2=mmd->sample_null(); ASSERT_EQ(result_1.size(), result_2.size()); @@ -522,8 +530,8 @@ TEST(QuadraticTimeMMD, multikernel_compute_statistic) const index_t dim=1; const index_t num_kernels=10; - CMath::init_random(12345); float64_t difference=0.5; + set_global_seed(12345); auto gen_p=some(0, dim, 0); auto gen_q=some(difference, dim, 0); @@ -560,8 +568,8 @@ TEST(QuadraticTimeMMD, multikernel_compute_variance_h1) const index_t dim=1; const index_t num_kernels=10; - CMath::init_random(12345); float64_t difference=0.5; + set_global_seed(12345); auto gen_p=some(0, dim, 0); auto gen_q=some(difference, dim, 0); @@ -598,8 +606,8 @@ TEST(QuadraticTimeMMD, multikernel_compute_test_power) const index_t dim=1; const index_t num_kernels=10; - CMath::init_random(12345); float64_t difference=0.5; + set_global_seed(12345); auto gen_p=some(0, dim, 0); auto gen_q=some(difference, dim, 0); @@ -640,7 +648,6 @@ TEST(QuadraticTimeMMD, multikernel_perform_test) const index_t num_null_samples=200; const index_t cache_size=10; - CMath::init_random(12345); float64_t difference=0.5; auto gen_p=some(0, dim, 0); @@ -656,7 +663,7 @@ TEST(QuadraticTimeMMD, multikernel_perform_test) float64_t tau=pow(2, sigma); mmd->multikernel()->add_kernel(new CGaussianKernel(cache_size, tau)); } - CMath::init_random(12345); + set_global_seed(12345); SGVector rejections_multiple=mmd->multikernel()->perform_test(alpha); mmd->multikernel()->cleanup(); @@ -665,7 +672,7 @@ TEST(QuadraticTimeMMD, multikernel_perform_test) { float64_t tau=pow(2, sigma); mmd->set_kernel(new CGaussianKernel(cache_size, tau)); - CMath::init_random(12345); + set_global_seed(12345); rejections_single[i]=mmd->perform_test(alpha); } diff --git a/tests/unit/statistical_testing/TwoDistributionTest_unittest.cc b/tests/unit/statistical_testing/TwoDistributionTest_unittest.cc index 84225391951..bf73bc2e389 100644 --- a/tests/unit/statistical_testing/TwoDistributionTest_unittest.cc +++ b/tests/unit/statistical_testing/TwoDistributionTest_unittest.cc @@ -140,12 +140,11 @@ TEST(TwoDistributionTest, compute_distance_streaming) mock_obj->set_num_samples_p(m); mock_obj->set_num_samples_q(n); - CMath::init_random(12345); + set_global_seed(12345); auto euclidean_distance=some(); auto distance=mock_obj->compute_distance(euclidean_distance); auto distance_mat1=distance->get_distance_matrix(); - CMath::init_random(12345); auto feats_p=static_cast*>(gen_p->get_streamed_features(m)); auto feats_q=static_cast*>(gen_q->get_streamed_features(n)); euclidean_distance->init(feats_p, feats_q); @@ -175,12 +174,11 @@ TEST(TwoDistributionTest, compute_joint_distance_streaming) mock_obj->set_num_samples_p(m); mock_obj->set_num_samples_q(n); - CMath::init_random(12345); + set_global_seed(12345); auto euclidean_distance=some(); auto distance=mock_obj->compute_joint_distance(euclidean_distance); auto distance_mat1=distance->get_distance_matrix(); - CMath::init_random(12345); auto feats_p=static_cast*>(gen_p->get_streamed_features(m)); auto feats_q=static_cast*>(gen_q->get_streamed_features(n)); diff --git a/tests/unit/statistical_testing/internals/CrossValidationMMD_unittest.cc b/tests/unit/statistical_testing/internals/CrossValidationMMD_unittest.cc index a5962778c86..6945116577e 100644 --- a/tests/unit/statistical_testing/internals/CrossValidationMMD_unittest.cc +++ b/tests/unit/statistical_testing/internals/CrossValidationMMD_unittest.cc @@ -92,11 +92,7 @@ TEST(CrossValidationMMD, biased_full) cv.m_num_runs=num_runs; cv.m_rejections=SGMatrix(num_runs*num_folds, num_kernels); - // set seed like this is about to make CrossValidationSplitting will have a - // same seed during this test. Not sure if it's a good thing to do. - cv.m_kfold_x->set_seed(12345); - cv.m_kfold_y->set_seed(12345); - CMath::init_random(12345); + set_global_seed(12345); cv(kernel_mgr); kernel_mgr.unset_precomputed_distance(); @@ -106,15 +102,11 @@ TEST(CrossValidationMMD, biased_full) auto kfold_p=some(new CBinaryLabels(dummy_labels_p), num_folds); auto kfold_q=some(new CBinaryLabels(dummy_labels_q), num_folds); - // set the seed for CrossValidationSplitting - kfold_p->set_seed(12345); - kfold_q->set_seed(12345); - auto permutation_mmd=PermutationMMD(); permutation_mmd.m_stype=stype; permutation_mmd.m_num_null_samples=num_null_samples; - CMath::init_random(12345); + set_global_seed(12345); for (auto k=0; k(num_runs*num_folds, num_kernels); - // set seed like this is about to make CrossValidationSplitting will have a - // same seed during this test. Not sure if it's a good thing to do. - cv.m_kfold_x->set_seed(12345); - cv.m_kfold_y->set_seed(12345); - CMath::init_random(12345); - CMath::init_random(12345); cv(kernel_mgr); kernel_mgr.unset_precomputed_distance(); @@ -215,10 +201,7 @@ TEST(CrossValidationMMD, unbiased_full) permutation_mmd.m_stype=stype; permutation_mmd.m_num_null_samples=num_null_samples; - // set the seed for CrossValidationSplitting - kfold_p->set_seed(12345); - kfold_q->set_seed(12345); - CMath::init_random(12345); + set_global_seed(12345); for (auto k=0; k(num_runs*num_folds, num_kernels); - // set seed like this is about to make CrossValidationSplitting will have a - // same seed during this test. Not sure if it's a good thing to do. - cv.m_kfold_x->set_seed(12345); - cv.m_kfold_y->set_seed(12345); - CMath::init_random(12345); - CMath::init_random(12345); - CMath::init_random(12345); + set_global_seed(12345); + set_global_seed(12345); + set_global_seed(12345); cv(kernel_mgr); kernel_mgr.unset_precomputed_distance(); @@ -320,10 +299,7 @@ TEST(CrossValidationMMD, unbiased_incomplete) permutation_mmd.m_stype=stype; permutation_mmd.m_num_null_samples=num_null_samples; - // set the seed for CrossValidationSplitting - kfold_p->set_seed(12345); - kfold_q->set_seed(12345); - CMath::init_random(12345); + set_global_seed(12345); for (auto k=0; k result_1=permutation_mmd(kernel_matrix); auto compute_mmd=ComputeMMD(); @@ -102,7 +102,7 @@ TEST(PermutationMMD, biased_full_single_kernel) Map map(kernel_matrix.matrix, kernel_matrix.num_rows, kernel_matrix.num_cols); SGVector result_2(num_null_samples); - CMath::init_random(12345); + set_global_seed(12345); for (auto i=0; i perm(kernel_matrix.num_rows); @@ -116,7 +116,7 @@ TEST(PermutationMMD, biased_full_single_kernel) SGVector inds(kernel_matrix.num_rows); SGVector result_3(num_null_samples); - CMath::init_random(12345); + set_global_seed(12345); for (auto i=0; i result_1=permutation_mmd(kernel_matrix); auto compute_mmd=ComputeMMD(); compute_mmd.m_n_x=n; compute_mmd.m_n_y=m; compute_mmd.m_stype=stype; - CMath::init_random(12345); + set_global_seed(12345); Map map(kernel_matrix.matrix, kernel_matrix.num_rows, kernel_matrix.num_cols); SGVector result_2(num_null_samples); @@ -197,7 +197,7 @@ TEST(PermutationMMD, unbiased_full_single_kernel) SGVector inds(kernel_matrix.num_rows); SGVector result_3(num_null_samples); - CMath::init_random(12345); + set_global_seed(12345); for (auto i=0; i result_1=permutation_mmd(kernel_matrix); auto compute_mmd=ComputeMMD(); @@ -262,7 +262,7 @@ TEST(PermutationMMD, unbiased_incomplete_single_kernel) Map map(kernel_matrix.matrix, kernel_matrix.num_rows, kernel_matrix.num_cols); - CMath::init_random(12345); + set_global_seed(12345); SGVector result_2(num_null_samples); for (auto i=0; i inds(kernel_matrix.num_rows); SGVector result_3(num_null_samples); @@ -334,10 +334,10 @@ TEST(PermutationMMD, precomputed_vs_non_precomputed_single_kernel) permutation_mmd.m_stype=stype; permutation_mmd.m_num_null_samples=num_null_samples; - CMath::init_random(12345); + set_global_seed(12345); SGVector result_1=permutation_mmd(kernel_matrix); - CMath::init_random(12345); + set_global_seed(12345); SGVector result_2=permutation_mmd(Kernel(kernel)); EXPECT_TRUE(result_1.size()==result_2.size()); @@ -390,7 +390,7 @@ TEST(PermutationMMD, biased_full_multi_kernel) permutation_mmd.m_stype=stype; permutation_mmd.m_num_null_samples=num_null_samples; - CMath::init_random(12345); + set_global_seed(12345); SGMatrix null_samples=permutation_mmd(kernel_mgr); kernel_mgr.unset_precomputed_distance(); @@ -401,7 +401,7 @@ TEST(PermutationMMD, biased_full_multi_kernel) { CKernel* kernel=kernel_mgr.kernel_at(k); kernel->init(merged_feats, merged_feats); - CMath::init_random(12345); + set_global_seed(12345); SGVector curr_null_samples=permutation_mmd(kernel->get_kernel_matrix()); ASSERT_EQ(curr_null_samples.size(), null_samples.num_rows); @@ -456,7 +456,7 @@ TEST(PermutationMMD, unbiased_full_multi_kernel) permutation_mmd.m_stype=stype; permutation_mmd.m_num_null_samples=num_null_samples; - CMath::init_random(12345); + set_global_seed(12345); SGMatrix null_samples=permutation_mmd(kernel_mgr); kernel_mgr.unset_precomputed_distance(); @@ -467,7 +467,7 @@ TEST(PermutationMMD, unbiased_full_multi_kernel) { CKernel* kernel=kernel_mgr.kernel_at(k); kernel->init(merged_feats, merged_feats); - CMath::init_random(12345); + set_global_seed(12345); SGVector curr_null_samples=permutation_mmd(kernel->get_kernel_matrix()); ASSERT_EQ(curr_null_samples.size(), null_samples.num_rows); @@ -522,7 +522,7 @@ TEST(PermutationMMD, unbiased_incomplete_multi_kernel) permutation_mmd.m_stype=stype; permutation_mmd.m_num_null_samples=num_null_samples; - CMath::init_random(12345); + set_global_seed(12345); SGMatrix null_samples=permutation_mmd(kernel_mgr); kernel_mgr.unset_precomputed_distance(); @@ -533,7 +533,7 @@ TEST(PermutationMMD, unbiased_incomplete_multi_kernel) { CKernel* kernel=kernel_mgr.kernel_at(k); kernel->init(merged_feats, merged_feats); - CMath::init_random(12345); + set_global_seed(12345); SGVector curr_null_samples=permutation_mmd(kernel->get_kernel_matrix()); ASSERT_EQ(curr_null_samples.size(), null_samples.num_rows); diff --git a/tests/unit/statistical_testing/internals/WithinBlockPermutation_unittest.cc b/tests/unit/statistical_testing/internals/WithinBlockPermutation_unittest.cc index a9bb999b2d4..5c3675aedc9 100644 --- a/tests/unit/statistical_testing/internals/WithinBlockPermutation_unittest.cc +++ b/tests/unit/statistical_testing/internals/WithinBlockPermutation_unittest.cc @@ -80,7 +80,7 @@ TEST(WithinBlockPermutation, biased_full) // compute using within-block-permutation functor operation compute=shogun::internal::mmd::WithinBlockPermutation(n, m, ST_BIASED_FULL); - CMath::init_random(12345); + set_global_seed(12345); auto result_1=compute(mat); auto mmd=shogun::internal::mmd::ComputeMMD(); @@ -97,7 +97,7 @@ TEST(WithinBlockPermutation, biased_full) SGVector perminds(perm.indices().data(), perm.indices().size(), false); - CMath::init_random(12345); + set_global_seed(12345); CMath::permute(perminds); MatrixXf permuted = perm.transpose()*map*perm; SGMatrix permuted_km(permuted.data(), permuted.rows(), permuted.cols(), false); @@ -108,7 +108,7 @@ TEST(WithinBlockPermutation, biased_full) SGVector inds(mat.num_rows); std::iota(inds.vector, inds.vector+inds.vlen, 0); - CMath::init_random(12345); + set_global_seed(12345); CMath::permute(inds); feats->add_subset(inds); kernel->init(feats, feats); @@ -153,7 +153,7 @@ TEST(WithinBlockPermutation, unbiased_full) // compute using within-block-permutation functor operation compute=shogun::internal::mmd::WithinBlockPermutation(n, m, ST_UNBIASED_FULL); - CMath::init_random(12345); + set_global_seed(12345); auto result_1=compute(mat); auto mmd=shogun::internal::mmd::ComputeMMD(); @@ -169,7 +169,7 @@ TEST(WithinBlockPermutation, unbiased_full) perm.setIdentity(); SGVector perminds(perm.indices().data(), perm.indices().size(), false); - CMath::init_random(12345); + set_global_seed(12345); CMath::permute(perminds); MatrixXf permuted = perm.transpose()*map*perm; SGMatrix permuted_km(permuted.data(), permuted.rows(), permuted.cols(), false); @@ -180,7 +180,7 @@ TEST(WithinBlockPermutation, unbiased_full) SGVector inds(mat.num_rows); std::iota(inds.vector, inds.vector+inds.vlen, 0); - CMath::init_random(12345); + set_global_seed(12345); CMath::permute(inds); feats->add_subset(inds); kernel->init(feats, feats); @@ -224,7 +224,7 @@ TEST(WithinBlockPermutation, unbiased_incomplete) // compute using within-block-permutation functor operation compute=shogun::internal::mmd::WithinBlockPermutation(n, n, ST_UNBIASED_INCOMPLETE); - CMath::init_random(12345); + set_global_seed(12345); auto result_1=compute(mat); auto mmd=shogun::internal::mmd::ComputeMMD(); @@ -240,7 +240,7 @@ TEST(WithinBlockPermutation, unbiased_incomplete) perm.setIdentity(); SGVector perminds(perm.indices().data(), perm.indices().size(), false); - CMath::init_random(12345); + set_global_seed(12345); CMath::permute(perminds); MatrixXf permuted = perm.transpose()*map*perm; SGMatrix permuted_km(permuted.data(), permuted.rows(), permuted.cols(), false); @@ -251,7 +251,7 @@ TEST(WithinBlockPermutation, unbiased_incomplete) SGVector inds(mat.num_rows); std::iota(inds.vector, inds.vector+inds.vlen, 0); - CMath::init_random(12345); + set_global_seed(12345); CMath::permute(inds); feats->add_subset(inds); kernel->init(feats, feats); diff --git a/tests/unit/structure/HierarchicalMultilabelModel_unittest.cc b/tests/unit/structure/HierarchicalMultilabelModel_unittest.cc index faa744330bd..211da9a9ee1 100644 --- a/tests/unit/structure/HierarchicalMultilabelModel_unittest.cc +++ b/tests/unit/structure/HierarchicalMultilabelModel_unittest.cc @@ -20,10 +20,11 @@ TEST(HierarchicalMultilabelModel, get_joint_feature_vector_1) int32_t num_samples = 2; SGMatrix feats(dim_features, num_samples); + auto m_rng = std::unique_ptr(new CRandom()); for (index_t i = 0; i < dim_features * num_samples; i++) { - feats[i] = CMath::random(-100, 100); + feats[i] = m_rng->random(-100, 100); } CSparseFeatures * features = new CSparseFeatures(feats); @@ -79,10 +80,11 @@ TEST(HierarchicalMultilabelModel, get_joint_feature_vector_2) int32_t num_samples = 2; SGMatrix feats(dim_features, num_samples); + auto m_rng = std::unique_ptr(new CRandom()); for (index_t i = 0; i < dim_features * num_samples; i++) { - feats[i] = CMath::random(-100, 100); + feats[i] = m_rng->random(-100, 100); } CSparseFeatures * features = new CSparseFeatures(feats); @@ -205,10 +207,11 @@ TEST(HierarchicalMultilabelModel, argmax) int32_t num_samples = 2; SGMatrix feats(dim_features, num_samples); + auto m_rng = std::unique_ptr(new CRandom()); for (index_t i = 0; i < dim_features * num_samples; i++) { - feats[i] = CMath::random(-100, 100); + feats[i] = m_rng->random(-100, 100); } CSparseFeatures * features = new CSparseFeatures(feats); @@ -241,7 +244,7 @@ TEST(HierarchicalMultilabelModel, argmax) for (index_t i = 0; i < w.vlen; i++) { - w[i] = CMath::random(-1, 1); + w[i] = m_rng->random(-1, 1); } CResultSet * ret_1 = model->argmax(w, 0, true); @@ -316,10 +319,11 @@ TEST(HierarchicalMultilabelModel, argmax_leaf_nodes_mandatory) int32_t num_samples = 2; SGMatrix feats(dim_features, num_samples); + auto m_rng = std::unique_ptr(new CRandom()); for (index_t i = 0; i < dim_features * num_samples; i++) { - feats[i] = CMath::random(-100, 100); + feats[i] = m_rng->random(-100, 100); } CSparseFeatures * features = new CSparseFeatures(feats); @@ -352,7 +356,7 @@ TEST(HierarchicalMultilabelModel, argmax_leaf_nodes_mandatory) for (index_t i = 0; i < w.vlen; i++) { - w[i] = CMath::random(-1, 1); + w[i] = m_rng->random(-1, 1); } CResultSet * ret_1 = model->argmax(w, 0, true); diff --git a/tests/unit/structure/MultilabelCLRModel_unittest.cc b/tests/unit/structure/MultilabelCLRModel_unittest.cc index 71e97666688..312c909e9a1 100644 --- a/tests/unit/structure/MultilabelCLRModel_unittest.cc +++ b/tests/unit/structure/MultilabelCLRModel_unittest.cc @@ -21,10 +21,10 @@ using namespace shogun; TEST(MultilabelCLRModel, get_joint_feature_vector_1) { SGMatrix feats(DIMS, NUM_SAMPLES); - + auto m_rng = std::unique_ptr(new CRandom()); for (index_t i = 0; i < DIMS * NUM_SAMPLES; i++) { - feats[i] = CMath::random(-100, 100); + feats[i] = m_rng->random(-100, 100); } CSparseFeatures * features = new CSparseFeatures(feats); @@ -70,10 +70,10 @@ TEST(MultilabelCLRModel, get_joint_feature_vector_1) TEST(MultilabelCLRModel, get_joint_feature_vector_2) { SGMatrix feats(DIMS, NUM_SAMPLES); - + auto m_rng = std::unique_ptr(new CRandom()); for (index_t i = 0; i < DIMS * NUM_SAMPLES; i++) { - feats[i] = CMath::random(-100, 100); + feats[i] = m_rng->random(-100, 100); } CSparseFeatures * features = new CSparseFeatures(feats); @@ -176,10 +176,10 @@ TEST(MultilabelCLRModel, delta_loss) TEST(MultilabelCLRModel, argmax) { SGMatrix feats(DIMS, NUM_SAMPLES); - + auto m_rng = std::unique_ptr(new CRandom()); for (index_t i = 0; i < DIMS * NUM_SAMPLES; i++) { - feats[i] = CMath::random(-100, 100); + feats[i] = m_rng->random(-100, 100); } CSparseFeatures * features = new CSparseFeatures(feats); @@ -203,7 +203,7 @@ TEST(MultilabelCLRModel, argmax) for (index_t i = 0; i < w.vlen; i++) { - w[i] = CMath::random(-1, 1); + w[i] = m_rng->random(-1, 1); } CResultSet * ret_1 = model->argmax(w, 0, true); diff --git a/tests/unit/structure/PrimalMosekSOSVM_unittest.cc b/tests/unit/structure/PrimalMosekSOSVM_unittest.cc index 678e3ecc07a..f6ec0316e5c 100644 --- a/tests/unit/structure/PrimalMosekSOSVM_unittest.cc +++ b/tests/unit/structure/PrimalMosekSOSVM_unittest.cc @@ -18,7 +18,7 @@ using namespace shogun; TEST(PrimalMosekSOSVM, mosek_init_sosvm_w_bounds) { int32_t num_samples = 10; - CMath::init_random(17); + auto m_rng = std::unique_ptr(new CRandom(17)); // define factor type SGVector card(2); @@ -53,8 +53,8 @@ TEST(PrimalMosekSOSVM, mosek_init_sosvm_w_bounds) // add factors SGVector data1(2); - data1[0] = 2.0 * CMath::random(0.0, 1.0) - 1.0; - data1[1] = 2.0 * CMath::random(0.0, 1.0) - 1.0; + data1[0] = 2.0 * m_rng->random(0.0, 1.0) - 1.0; + data1[1] = 2.0 * m_rng->random(0.0, 1.0) - 1.0; SGVector var_index1(2); var_index1[0] = 0; var_index1[1] = 1; @@ -62,8 +62,8 @@ TEST(PrimalMosekSOSVM, mosek_init_sosvm_w_bounds) fg->add_factor(fac1); SGVector data2(2); - data2[0] = 2.0 * CMath::random(0.0, 1.0) - 1.0; - data2[1] = 2.0 * CMath::random(0.0, 1.0) - 1.0; + data2[0] = 2.0 * m_rng->random(0.0, 1.0) - 1.0; + data2[1] = 2.0 * m_rng->random(0.0, 1.0) - 1.0; SGVector var_index2(2); var_index2[0] = 1; var_index2[1] = 2; diff --git a/tests/unit/transfer/MALSAR_unittest.cc b/tests/unit/transfer/MALSAR_unittest.cc index e7f5e382d50..17ac5c90bb7 100644 --- a/tests/unit/transfer/MALSAR_unittest.cc +++ b/tests/unit/transfer/MALSAR_unittest.cc @@ -20,7 +20,7 @@ typedef std::pair SplittedDataset; SplittedDataset generate_data() { index_t num_samples = 50; - CMath::init_random(5); + set_global_seed(5); SGMatrix data = CDataGenerator::generate_gaussians(num_samples, 2, 2); CDenseFeatures* features = new CDenseFeatures(data);