From 29267be230bbba084f94580e0a4e7580e39386e3 Mon Sep 17 00:00:00 2001
From: Pietro Incardona <incardon@mpi-cbg.de>
Date: Wed, 28 Dec 2016 19:42:43 +0100
Subject: [PATCH] Performance test

---
 .../performance/cell_list_comp_reorder.hpp    | 61 +++++++++++++--
 .../performance/cell_list_part_reorder.hpp    | 36 +--------
 .../vector_dist_performance_util.hpp          | 74 +++++++++++++++++--
 .../performance/verlet_performance_tests.hpp  |  4 +
 src/pdata_performance.cpp                     | 73 ++++++++++++++++++
 5 files changed, 198 insertions(+), 50 deletions(-)

diff --git a/src/Vector/performance/cell_list_comp_reorder.hpp b/src/Vector/performance/cell_list_comp_reorder.hpp
index 7e389b52a..7ae2d5a26 100644
--- a/src/Vector/performance/cell_list_comp_reorder.hpp
+++ b/src/Vector/performance/cell_list_comp_reorder.hpp
@@ -51,21 +51,55 @@ openfpm::vector<openfpm::vector<double>> time_create_hilb_2_dev;
 BOOST_AUTO_TEST_CASE( vector_dist_celllist_random_test )
 {
 	//Benchmark test for 2D and 3D
-	cell_list_comp_reorder_random_benchmark<3>(k_start,k_min,r_cutoff,n_particles,time_rand_mean,time_create_rand_mean,time_rand_dev,time_create_rand_dev);
-	cell_list_comp_reorder_random_benchmark<2>(k_start,k_min,r_cutoff,n_particles,time_rand_2_mean,time_create_rand_2_mean,time_rand_2_dev,time_create_rand_2_dev);
+	cell_list_comp_reorder_random_benchmark<3>(k_start,
+			                                   k_min,
+											   r_cutoff,
+											   n_particles,
+											   time_rand_mean,
+											   time_rand_dev,
+											   time_create_rand_mean,
+											   time_create_rand_dev);
+
+
+	cell_list_comp_reorder_random_benchmark<2>(k_start,
+			                                   k_min,
+											   r_cutoff,
+											   n_particles,
+											   time_rand_2_mean,
+											   time_rand_2_dev,
+											   time_create_rand_2_mean,
+											   time_create_rand_2_dev);
 }
 
 BOOST_AUTO_TEST_CASE( vector_dist_celllist_hilbert_test )
 {
 	//Benchmark test for 2D and 3D
-	cell_list_comp_reorder_hilbert_benchmark<3>(k_start,k_min,r_cutoff,n_particles,time_hilb_mean,time_hilb_dev,time_create_hilb_mean,time_create_hilb_dev);
-	cell_list_comp_reorder_hilbert_benchmark<2>(k_start,k_min,r_cutoff,n_particles,time_hilb_2_mean,time_hilb_2_dev,time_create_hilb_2_mean,time_create_hilb_2_dev);
+	cell_list_comp_reorder_hilbert_benchmark<3>(k_start,
+			                                    k_min,
+												r_cutoff,
+												n_particles,
+												time_hilb_mean,
+												time_hilb_dev,
+												time_create_hilb_mean,
+												time_create_hilb_dev);
+
+	cell_list_comp_reorder_hilbert_benchmark<2>(k_start,
+			                                    k_min,
+												r_cutoff,
+												n_particles,
+												time_hilb_2_mean,
+												time_hilb_2_dev,
+												time_create_hilb_2_mean,
+												time_create_hilb_2_dev);
 }
 
 BOOST_AUTO_TEST_CASE(vector_dist_cl_performance_write_report)
 {
 	GoogleChart cg;
 
+	double warning_level = 0;
+	double norm = 0;
+
 	//Write report for 2D and 3D
 	cell_list_comp_reorder_report<3>(cg,
 			                         r_cutoff,
@@ -77,22 +111,33 @@ BOOST_AUTO_TEST_CASE(vector_dist_cl_performance_write_report)
 									 time_create_hilb_mean,
 									 time_create_rand_mean,
 									 time_create_hilb_dev,
-									 time_create_rand_dev);
+									 time_create_rand_dev,
+									 warning_level,
+									 norm);
 
 	cell_list_comp_reorder_report<2>(cg,
 			                         r_cutoff,
 									 n_particles,
 									 time_hilb_2_mean,
 									 time_rand_2_mean,
-									 time_create_hilb_2_mean,
-									 time_create_rand_2_mean,
 									 time_rand_2_dev,
 									 time_hilb_2_dev,
+									 time_create_hilb_2_mean,
+									 time_create_rand_2_mean,
 									 time_create_hilb_2_dev,
-									 time_create_rand_2_dev);
+									 time_create_rand_2_dev,
+									 warning_level,
+									 norm);
+
+	addUpdtateTime(cg);
 
 	if (create_vcluster().getProcessUnitID() == 0)
+	{
+		// write the xml report
+		pt.put("celllist.comp.warning",warning_level);
+
 		cg.write(std::string(test_dir) + "/openfpm_pdata/Celllist_comp_ord.html");
+	}
 }
 
 BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/Vector/performance/cell_list_part_reorder.hpp b/src/Vector/performance/cell_list_part_reorder.hpp
index f53f3f15f..0cdb09cbc 100644
--- a/src/Vector/performance/cell_list_part_reorder.hpp
+++ b/src/Vector/performance/cell_list_part_reorder.hpp
@@ -90,40 +90,6 @@ BOOST_AUTO_TEST_CASE(vector_dist_cl_performance_write_report)
 {
 	GoogleChart cg;
 
-/*	n_particles.save("debug1");
-	time_rand_mean.save("debug2");
-	time_hilb_mean.save("debug3");
-	time_rand_dev.save("debug4");
-	time_hilb_dev.save("debug5");
-	time_reorder_mean.save("debug6");
-	time_reorder_dev.save("debug7");
-	time_hilb_moved.save("debug8");
-
-	time_rand_2_mean.save("debug9");
-	time_hilb_2_mean.save("debug10");
-	time_rand_2_dev.save("debug11");
-	time_hilb_2_dev.save("debug12");
-	time_reorder_2_mean.save("debug13");
-	time_reorder_2_dev.save("debug14");
-	time_hilb_moved_2.save("debug15");*/
-
-/*	n_particles.load("debug1");
-	time_rand_mean.load("debug2");
-	time_hilb_mean.load("debug3");
-	time_rand_dev.load("debug4");
-	time_hilb_dev.load("debug5");
-	time_reorder_mean.load("debug6");
-	time_reorder_dev.load("debug7");
-	time_hilb_moved.load("debug8");
-
-	time_rand_2_mean.load("debug9");
-	time_hilb_2_mean.load("debug10");
-	time_rand_2_dev.load("debug11");
-	time_hilb_2_dev.load("debug12");
-	time_reorder_2_mean.load("debug13");
-	time_reorder_2_dev.load("debug14");
-	time_hilb_moved_2.load("debug15");*/
-
 	//Write report for 2D and 3D
 	cell_list_part_reorder_report<3>(cg,
 			                         n_moving,
@@ -149,6 +115,8 @@ BOOST_AUTO_TEST_CASE(vector_dist_cl_performance_write_report)
 									 time_rand_2_dev,
 									 time_reorder_2_dev);
 
+	addUpdtateTime(cg);
+
 	if (create_vcluster().getProcessUnitID() == 0)
 		cg.write(std::string(test_dir) + "/openfpm_pdata/Celllist_part_ord.html");
 }
diff --git a/src/Vector/performance/vector_dist_performance_util.hpp b/src/Vector/performance/vector_dist_performance_util.hpp
index a773f9379..9f62aa65f 100644
--- a/src/Vector/performance/vector_dist_performance_util.hpp
+++ b/src/Vector/performance/vector_dist_performance_util.hpp
@@ -861,6 +861,9 @@ template<unsigned int dim> void vd_verlet_performance_write_report(GoogleChart &
 	y_ref_create_mean.load(file_mean);
 	y_ref_create_dev.load(file_var);
 
+	// warning level
+	openfpm::vector<int> warning_vlevel;
+
 	// Get the test dir
 	std::string file_mean2(test_dir);
 	std::string file_var2(test_dir);
@@ -872,6 +875,9 @@ template<unsigned int dim> void vd_verlet_performance_write_report(GoogleChart &
 	y_ref_force_mean.load(file_mean2);
 	y_ref_force_dev.load(file_var2);
 
+	// warning level
+	openfpm::vector<int> warning_vlevel2;
+
 	// Speedup graphs data
 	openfpm::vector<size_t> x;
 	openfpm::vector<openfpm::vector<openfpm::vector<double>>> y;
@@ -912,6 +918,8 @@ template<unsigned int dim> void vd_verlet_performance_write_report(GoogleChart &
 		y.resize(time_force_mean.size());
 		for (size_t r = 0; r < time_force_mean.size(); r++)
 		{
+			int warning_level = -1;
+
 			y.get(r).resize(time_force_mean.get(r).size());
 			y_dev.get(r).resize(time_force_mean.get(r).size());
 			for (size_t k = 0; k < time_force_mean.get(r).size(); k++)
@@ -920,7 +928,11 @@ template<unsigned int dim> void vd_verlet_performance_write_report(GoogleChart &
 				y.get(r).get(k).add(time_force_mean.get(r).get(k));
 				y.get(r).get(k).add(y_ref_force_mean.get(r).get(k).get(0) - 3.0*y_ref_force_dev.get(r).get(k).get(0) );
 				y.get(r).get(k).add(y_ref_force_mean.get(r).get(k).get(0) + 3.0*y_ref_force_dev.get(r).get(k).get(0) );
+
+				warning_set(warning_level,time_force_mean.get(r).get(k),y_ref_force_mean.get(r).get(k).get(0),y_ref_force_dev.get(r).get(k).get(0));
 			}
+
+			warning_vlevel.add(warning_level);
 		}
 	}
 
@@ -962,6 +974,8 @@ template<unsigned int dim> void vd_verlet_performance_write_report(GoogleChart &
 		y2.resize(time_create_mean.size());
 		for (size_t r = 0; r < time_create_mean.size(); r++)
 		{
+			int warning_level = -1;
+
 			y2.get(r).resize(time_create_mean.get(r).size());
 			for (size_t k = 0; k < time_create_mean.get(r).size(); k++)
 			{
@@ -970,7 +984,11 @@ template<unsigned int dim> void vd_verlet_performance_write_report(GoogleChart &
 
 				y2.get(r).get(k).add(y_ref_create_mean.get(r).get(k).get(0) - 3.0*y_ref_create_dev.get(r).get(k).get(0) );
 				y2.get(r).get(k).add(y_ref_create_mean.get(r).get(k).get(0) + 3.0*y_ref_create_dev.get(r).get(k).get(0) );
+
+				warning_set(warning_level,time_create_mean.get(r).get(k),y_ref_create_mean.get(r).get(k).get(0),y_ref_create_dev.get(r).get(k).get(0));
 			}
+
+			warning_vlevel2.add(warning_level);
 		}
 	}
 
@@ -982,13 +1000,17 @@ template<unsigned int dim> void vd_verlet_performance_write_report(GoogleChart &
 	options.yAxis = std::string("Time (s)");
 	options.xAxis = std::string("Number of particles");
 	options.lineWidth = 2;
-	options.more = GC_Y_LOG + "," + GC_ZOOM;
 
 	std::string str("<h1>Verlet-list " + std::to_string(dim) + "-D performance test force calculation: </h1>");
 	cg.addHTML(str);
 
 	for (size_t i = 0; i < r_cutoff.size(); i++)
 	{
+		std::string chart_area;
+		if (warning_vlevel.size() != 0)
+			addchartarea(chart_area,warning_vlevel.get(i));
+		options.more = GC_Y_LOG + "," + GC_ZOOM + chart_area;
+
 		options.title = std::string("Verlet-list cut-off radius: " + std::to_string(r_cutoff.get(i)));
 		cg.AddLinesGraph(x,y.get(i),yn,options);
 	}
@@ -1001,13 +1023,17 @@ template<unsigned int dim> void vd_verlet_performance_write_report(GoogleChart &
 	options2.yAxis = std::string("Time to construct a verlet-list (s)");
 	options2.xAxis = std::string("Number of particles");
 	options2.lineWidth = 2;
-	options2.more = GC_ZOOM;
 
-	std::string str2("<h2>2) Total calculation time</h2>");
+	std::string str2("<h2>2) Time to construct a Verlet-list time</h2>");
 	cg.addHTML(str2);
 
 	for (size_t i = 0; i < r_cutoff.size(); i++)
 	{
+		std::string chart_area;
+		if (warning_vlevel.size() != 0)
+			addchartarea(chart_area,warning_vlevel2.get(i));
+		options2.more = GC_ZOOM + chart_area;
+
 		options2.title = std::string("Cell-list performance, cut-off radius: " + std::to_string(r_cutoff.get(i)));
 		cg.AddLinesGraph(x,y2.get(i),yn2,options2);
 	}
@@ -1036,8 +1062,21 @@ template<unsigned int dim> void cell_list_part_reorder_report(GoogleChart & cg,
 
 	// Speedup graphs data
 
-	cl_part_time<dim>(cg,cl_n_particles,cl_r_cutoff,cl_orders,cl_time_hilb_mean,cl_time_rand_mean,cl_time_hilb_dev,cl_time_rand_dev);
-	cl_part_reorder_time<dim>(cg,cl_n_particles,cl_r_cutoff,cl_orders,cl_time_reorder_mean,cl_time_reorder_dev);
+	cl_part_time<dim>(cg,
+			          cl_n_particles,
+					  cl_r_cutoff,
+					  cl_orders,
+					  cl_time_hilb_mean,
+					  cl_time_rand_mean,
+					  cl_time_hilb_dev,
+					  cl_time_rand_dev);
+
+	cl_part_reorder_time<dim>(cg,
+			                  cl_n_particles,
+							  cl_r_cutoff,
+							  cl_orders,
+							  cl_time_reorder_mean,
+							  cl_time_reorder_dev);
 }
 
 /*! \brief Function for cell list hilb performance report
@@ -1053,10 +1092,29 @@ template<unsigned int dim> void cell_list_comp_reorder_report(GoogleChart & cg,
 															  openfpm::vector<openfpm::vector<double>> & cl_time_create_hilb_mean,
 															  openfpm::vector<openfpm::vector<double>> & cl_time_create_rand_mean,
 															  openfpm::vector<openfpm::vector<double>> & cl_time_create_hilb_dev,
-															  openfpm::vector<openfpm::vector<double>> & cl_time_create_rand_dev)
+															  openfpm::vector<openfpm::vector<double>> & cl_time_create_rand_dev,
+															  double & warning_level,
+															  double & norm)
 {
-	cl_comp_normal_vs_hilbert_force_time<dim>(cg,cl_n_particles,cl_r_cutoff,cl_time_hilb_mean,cl_time_rand_mean,cl_time_hilb_dev,cl_time_rand_dev);
-	cl_comp_normal_vs_hilbert_create_time<dim>(cg,cl_n_particles,cl_r_cutoff,cl_time_create_hilb_mean,cl_time_create_rand_mean,cl_time_create_hilb_dev,cl_time_create_rand_dev);
+	cl_comp_normal_vs_hilbert_force_time<dim>(cg,
+			                                  cl_n_particles,
+											  cl_r_cutoff,
+											  cl_time_hilb_mean,
+											  cl_time_rand_mean,
+											  cl_time_hilb_dev,
+											  cl_time_rand_dev,
+											  warning_level,
+											  norm);
+
+	cl_comp_normal_vs_hilbert_create_time<dim>(cg,
+			                                   cl_n_particles,
+											   cl_r_cutoff,
+											   cl_time_create_hilb_mean,
+											   cl_time_create_rand_mean,
+											   cl_time_create_hilb_dev,
+											   cl_time_create_rand_dev,
+											   warning_level,
+											   norm);
 }
 
 #endif /* SRC_VECTOR_VECTOR_DIST_PERFORMANCE_UTIL_HPP_ */
diff --git a/src/Vector/performance/verlet_performance_tests.hpp b/src/Vector/performance/verlet_performance_tests.hpp
index b963f3ea6..83141fe4f 100644
--- a/src/Vector/performance/verlet_performance_tests.hpp
+++ b/src/Vector/performance/verlet_performance_tests.hpp
@@ -54,7 +54,11 @@ BOOST_AUTO_TEST_CASE(vector_dist_verlet_performance_write_report)
 	vd_verlet_performance_write_report<2>(cg,r_cutoff,n_particles,time_force_mean_2,time_force_dev_2,time_create_mean_2,time_create_dev_2);
 
 	if (create_vcluster().getProcessUnitID() == 0)
+	{
+		addUpdtateTime(cg);
+
 		cg.write(std::string(test_dir) + "/openfpm_pdata/Verletlist_comp.html");
+	}
 }
 
 BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/pdata_performance.cpp b/src/pdata_performance.cpp
index 2d9c401e8..ec7027f26 100644
--- a/src/pdata_performance.cpp
+++ b/src/pdata_performance.cpp
@@ -12,20 +12,93 @@
 #include <mpi.h>
 #include "config.h"
 
+#include <boost/property_tree/ptree.hpp>
+#include <boost/property_tree/xml_parser.hpp>
 #include "Vector/vector_dist.hpp"
 #include "data_type/aggregate.hpp"
 #include "Plot/GoogleChart.hpp"
 #include "Point_test.hpp"
+#include <sstream>
 
 #define BOOST_TEST_DYN_LINK
 #include <boost/test/unit_test.hpp>
 
 extern const char * test_dir;
 
+// XML report
+boost::property_tree::ptree pt;
+
 #ifdef PERFORMANCE_TEST
 
 BOOST_AUTO_TEST_SUITE( performance )
 
+static inline void warning_set(int & warning_level, double mean, double mean_ref, double sigma)
+{
+	int warning_level_candidate;
+
+	if (mean - mean_ref < -2.0*sigma )
+		warning_level_candidate = -1;
+	else if (mean - mean_ref < 2.0*sigma)
+		warning_level_candidate = 0;
+	else if (mean - mean_ref < 3.0*sigma)
+		warning_level_candidate = 1;
+	else
+		warning_level_candidate = 2;
+
+	if (warning_level_candidate > warning_level)
+		warning_level = warning_level_candidate;
+}
+
+static inline void addchartarea(std::string & chart_area, int lvl)
+{
+	std::string color;
+
+	if (lvl == -1)
+	{
+		chart_area = std::string(",chartArea: {\
+		    backgroundColor: {\
+		        stroke: '#00FF00',\
+		        strokeWidth: 6\
+		    }\
+		}");
+	}
+	else if (lvl == 0)
+	{
+		// NOTHING TO DO
+	}
+	else if (lvl == 1)
+	{
+		chart_area = std::string(",chartArea: {\
+		    backgroundColor: {\
+		        stroke: '#FFFF00',\
+		        strokeWidth: 6\
+		    }\
+		}");
+	}
+	else if (lvl == 2)
+	{
+		chart_area = std::string(",chartArea: {\
+		    backgroundColor: {\
+		        stroke: '#FF0000',\
+		        strokeWidth: 6\
+		    }\
+		}");
+	}
+
+}
+
+void addUpdtateTime(GoogleChart & cg)
+{
+    time_t t = time(0);   // get time now
+    struct tm * now = localtime( & t );
+
+    std::stringstream str;
+
+    str << "<h3>Updated: " << now->tm_mday << "/" << now->tm_mon + 1 << "/" << now->tm_year+1900 << "     " << now->tm_hour << ":" << now->tm_min << ":" << now->tm_sec << std::endl;
+
+	cg.addHTML(str.str());
+}
+
 #include "Vector/performance/vector_dist_performance_util.hpp"
 #include "Vector/performance/verlet_performance_tests.hpp"
 #include "Vector/performance/cell_list_part_reorder.hpp"
-- 
GitLab