text: // ******************************************************** 
  
  // This C++ code was automatically generated by ml2cpp (development version).
  // Copyright 2020
  
  // https://github.com/antoinecarme/ml2cpp
  // Model : GradientBoostingClassifier_Pipeline
  // Dataset : BreastCancer
  
  // This CPP code can be compiled using any C++-17 compiler.
  // g++ -Wall -Wno-unused-function -std=c++17 -g -o ml2cpp-demo_GradientBoostingClassifier_Pipeline_BreastCancer.exe ml2cpp-demo_GradientBoostingClassifier_Pipeline_BreastCancer.cpp
  
  // Model deployment code
  
  // ******************************************************** 
  
  #include "../../Generic.i"
  
  namespace  {
  
  	std::vector<std::any> get_classes(){
  		std::vector<std::any> lClasses = { 0, 1 };
  
  		return lClasses;
  	}
  
  	namespace imputer {
  	
  		std::vector<std::string> get_input_names(){
  			std::vector<std::string> lFeatures = { "Feature_0", "Feature_1", "Feature_2", "Feature_3", "Feature_4", "Feature_5", "Feature_6", "Feature_7", "Feature_8", "Feature_9", "Feature_10", "Feature_11", "Feature_12", "Feature_13", "Feature_14", "Feature_15", "Feature_16", "Feature_17", "Feature_18", "Feature_19", "Feature_20", "Feature_21", "Feature_22", "Feature_23", "Feature_24", "Feature_25", "Feature_26", "Feature_27", "Feature_28", "Feature_29" };
  	
  			return lFeatures;
  		}
  	
  		std::vector<std::string> get_output_names(){
  			std::vector<std::string> lOutputs = { "imputer_output_2", "imputer_output_3", "imputer_output_4", "imputer_output_5", "imputer_output_6", "imputer_output_7", "imputer_output_8", "imputer_output_9", "imputer_output_10", "imputer_output_11", "imputer_output_12", "imputer_output_13", "imputer_output_14", "imputer_output_15", "imputer_output_16", "imputer_output_17", "imputer_output_18", "imputer_output_19", "imputer_output_20", "imputer_output_21", "imputer_output_22", "imputer_output_23", "imputer_output_24", "imputer_output_25", "imputer_output_26", "imputer_output_27", "imputer_output_28", "imputer_output_29", "imputer_output_30", "imputer_output_31" };
  	
  			return lOutputs;
  		}
  	
  		tTable compute_features(std::any Feature_0, std::any Feature_1, std::any Feature_2, std::any Feature_3, std::any Feature_4, std::any Feature_5, std::any Feature_6, std::any Feature_7, std::any Feature_8, std::any Feature_9, std::any Feature_10, std::any Feature_11, std::any Feature_12, std::any Feature_13, std::any Feature_14, std::any Feature_15, std::any Feature_16, std::any Feature_17, std::any Feature_18, std::any Feature_19, std::any Feature_20, std::any Feature_21, std::any Feature_22, std::any Feature_23, std::any Feature_24, std::any Feature_25, std::any Feature_26, std::any Feature_27, std::any Feature_28, std::any Feature_29) {
  	
  			tTable lTable;
  	
  			lTable["imputer_output_2"] = { ((Feature_0 == std::any()) ?  ( 14.077712087912083 ) : ( Feature_0)) };
  			lTable["imputer_output_3"] = { ((Feature_1 == std::any()) ?  ( 19.03905494505495 ) : ( Feature_1)) };
  			lTable["imputer_output_4"] = { ((Feature_2 == std::any()) ?  ( 91.66178021978023 ) : ( Feature_2)) };
  			lTable["imputer_output_5"] = { ((Feature_3 == std::any()) ?  ( 650.9676923076925 ) : ( Feature_3)) };
  			lTable["imputer_output_6"] = { ((Feature_4 == std::any()) ?  ( 0.09642184615384615 ) : ( Feature_4)) };
  			lTable["imputer_output_7"] = { ((Feature_5 == std::any()) ?  ( 0.10441613186813191 ) : ( Feature_5)) };
  			lTable["imputer_output_8"] = { ((Feature_6 == std::any()) ?  ( 0.08826232681318694 ) : ( Feature_6)) };
  			lTable["imputer_output_9"] = { ((Feature_7 == std::any()) ?  ( 0.048516399999999966 ) : ( Feature_7)) };
  			lTable["imputer_output_10"] = { ((Feature_8 == std::any()) ?  ( 0.1815885714285715 ) : ( Feature_8)) };
  			lTable["imputer_output_11"] = { ((Feature_9 == std::any()) ?  ( 0.06294030769230768 ) : ( Feature_9)) };
  			lTable["imputer_output_12"] = { ((Feature_10 == std::any()) ?  ( 0.4099173626373627 ) : ( Feature_10)) };
  			lTable["imputer_output_13"] = { ((Feature_11 == std::any()) ?  ( 1.2170694505494501 ) : ( Feature_11)) };
  			lTable["imputer_output_14"] = { ((Feature_12 == std::any()) ?  ( 2.90524901098901 ) : ( Feature_12)) };
  			lTable["imputer_output_15"] = { ((Feature_13 == std::any()) ?  ( 40.87988571428572 ) : ( Feature_13)) };
  			lTable["imputer_output_16"] = { ((Feature_14 == std::any()) ?  ( 0.007055971428571433 ) : ( Feature_14)) };
  			lTable["imputer_output_17"] = { ((Feature_15 == std::any()) ?  ( 0.025567830769230776 ) : ( Feature_15)) };
  			lTable["imputer_output_18"] = { ((Feature_16 == std::any()) ?  ( 0.03199925626373623 ) : ( Feature_16)) };
  			lTable["imputer_output_19"] = { ((Feature_17 == std::any()) ?  ( 0.011972369230769237 ) : ( Feature_17)) };
  			lTable["imputer_output_20"] = { ((Feature_18 == std::any()) ?  ( 0.020896200000000014 ) : ( Feature_18)) };
  			lTable["imputer_output_21"] = { ((Feature_19 == std::any()) ?  ( 0.0038465518681318647 ) : ( Feature_19)) };
  			lTable["imputer_output_22"] = { ((Feature_20 == std::any()) ?  ( 16.17776483516484 ) : ( Feature_20)) };
  			lTable["imputer_output_23"] = { ((Feature_21 == std::any()) ?  ( 25.26505494505494 ) : ( Feature_21)) };
  			lTable["imputer_output_24"] = { ((Feature_22 == std::any()) ?  ( 106.68156043956041 ) : ( Feature_22)) };
  			lTable["imputer_output_25"] = { ((Feature_23 == std::any()) ?  ( 870.8639560439567 ) : ( Feature_23)) };
  			lTable["imputer_output_26"] = { ((Feature_24 == std::any()) ?  ( 0.1318275604395605 ) : ( Feature_24)) };
  			lTable["imputer_output_27"] = { ((Feature_25 == std::any()) ?  ( 0.24991806593406582 ) : ( Feature_25)) };
  			lTable["imputer_output_28"] = { ((Feature_26 == std::any()) ?  ( 0.2654615934065932 ) : ( Feature_26)) };
  			lTable["imputer_output_29"] = { ((Feature_27 == std::any()) ?  ( 0.11348798021978022 ) : ( Feature_27)) };
  			lTable["imputer_output_30"] = { ((Feature_28 == std::any()) ?  ( 0.2897881318681319 ) : ( Feature_28)) };
  			lTable["imputer_output_31"] = { ((Feature_29 == std::any()) ?  ( 0.08364145054945049 ) : ( Feature_29)) };
  	
  			return lTable;
  		}
  	
  		tTable compute_model_outputs_from_table( tTable const & iTable) {
  			tTable lTable = compute_features(iTable.at("Feature_0")[0], iTable.at("Feature_1")[0], iTable.at("Feature_2")[0], iTable.at("Feature_3")[0], iTable.at("Feature_4")[0], iTable.at("Feature_5")[0], iTable.at("Feature_6")[0], iTable.at("Feature_7")[0], iTable.at("Feature_8")[0], iTable.at("Feature_9")[0], iTable.at("Feature_10")[0], iTable.at("Feature_11")[0], iTable.at("Feature_12")[0], iTable.at("Feature_13")[0], iTable.at("Feature_14")[0], iTable.at("Feature_15")[0], iTable.at("Feature_16")[0], iTable.at("Feature_17")[0], iTable.at("Feature_18")[0], iTable.at("Feature_19")[0], iTable.at("Feature_20")[0], iTable.at("Feature_21")[0], iTable.at("Feature_22")[0], iTable.at("Feature_23")[0], iTable.at("Feature_24")[0], iTable.at("Feature_25")[0], iTable.at("Feature_26")[0], iTable.at("Feature_27")[0], iTable.at("Feature_28")[0], iTable.at("Feature_29")[0]);
  	
  			return lTable;
  		}
  	
  	} // eof namespace imputer
  	
  
  	namespace scaler {
  	
  		std::vector<std::string> get_input_names(){
  			std::vector<std::string> lFeatures = { "imputer_output_2", "imputer_output_3", "imputer_output_4", "imputer_output_5", "imputer_output_6", "imputer_output_7", "imputer_output_8", "imputer_output_9", "imputer_output_10", "imputer_output_11", "imputer_output_12", "imputer_output_13", "imputer_output_14", "imputer_output_15", "imputer_output_16", "imputer_output_17", "imputer_output_18", "imputer_output_19", "imputer_output_20", "imputer_output_21", "imputer_output_22", "imputer_output_23", "imputer_output_24", "imputer_output_25", "imputer_output_26", "imputer_output_27", "imputer_output_28", "imputer_output_29", "imputer_output_30", "imputer_output_31" };
  	
  			return lFeatures;
  		}
  	
  		std::vector<std::string> get_output_names(){
  			std::vector<std::string> lOutputs = { "scaler_output_2", "scaler_output_3", "scaler_output_4", "scaler_output_5", "scaler_output_6", "scaler_output_7", "scaler_output_8", "scaler_output_9", "scaler_output_10", "scaler_output_11", "scaler_output_12", "scaler_output_13", "scaler_output_14", "scaler_output_15", "scaler_output_16", "scaler_output_17", "scaler_output_18", "scaler_output_19", "scaler_output_20", "scaler_output_21", "scaler_output_22", "scaler_output_23", "scaler_output_24", "scaler_output_25", "scaler_output_26", "scaler_output_27", "scaler_output_28", "scaler_output_29", "scaler_output_30", "scaler_output_31" };
  	
  			return lOutputs;
  		}
  	
  		tTable compute_features(std::any imputer_output_2, std::any imputer_output_3, std::any imputer_output_4, std::any imputer_output_5, std::any imputer_output_6, std::any imputer_output_7, std::any imputer_output_8, std::any imputer_output_9, std::any imputer_output_10, std::any imputer_output_11, std::any imputer_output_12, std::any imputer_output_13, std::any imputer_output_14, std::any imputer_output_15, std::any imputer_output_16, std::any imputer_output_17, std::any imputer_output_18, std::any imputer_output_19, std::any imputer_output_20, std::any imputer_output_21, std::any imputer_output_22, std::any imputer_output_23, std::any imputer_output_24, std::any imputer_output_25, std::any imputer_output_26, std::any imputer_output_27, std::any imputer_output_28, std::any imputer_output_29, std::any imputer_output_30, std::any imputer_output_31) {
  	
  			tTable lTable;
  	
  			lTable["scaler_output_2"] = { ( ( imputer_output_2 - 14.077712087912083 ) / 3.5451492987000814 ) };
  			lTable["scaler_output_3"] = { ( ( imputer_output_3 - 19.03905494505495 ) / 4.1622971504218205 ) };
  			lTable["scaler_output_4"] = { ( ( imputer_output_4 - 91.66178021978023 ) / 24.503971943475648 ) };
  			lTable["scaler_output_5"] = { ( ( imputer_output_5 - 650.9676923076925 ) / 355.702823163891 ) };
  			lTable["scaler_output_6"] = { ( ( imputer_output_6 - 0.09642184615384615 ) / 0.014197819663072304 ) };
  			lTable["scaler_output_7"] = { ( ( imputer_output_7 - 0.10441613186813191 ) / 0.05340369466973436 ) };
  			lTable["scaler_output_8"] = { ( ( imputer_output_8 - 0.08826232681318694 ) / 0.08191200162631372 ) };
  			lTable["scaler_output_9"] = { ( ( imputer_output_9 - 0.048516399999999966 ) / 0.039373117396730245 ) };
  			lTable["scaler_output_10"] = { ( ( imputer_output_10 - 0.1815885714285715 ) / 0.02779005832874822 ) };
  			lTable["scaler_output_11"] = { ( ( imputer_output_11 - 0.06294030769230768 ) / 0.007019354586172742 ) };
  			lTable["scaler_output_12"] = { ( ( imputer_output_12 - 0.4099173626373627 ) / 0.29120400836827026 ) };
  			lTable["scaler_output_13"] = { ( ( imputer_output_13 - 1.2170694505494501 ) / 0.5363896396336265 ) };
  			lTable["scaler_output_14"] = { ( ( imputer_output_14 - 2.90524901098901 ) / 2.1424944299808626 ) };
  			lTable["scaler_output_15"] = { ( ( imputer_output_15 - 40.87988571428572 ) / 48.224754479577314 ) };
  			lTable["scaler_output_16"] = { ( ( imputer_output_16 - 0.007055971428571433 ) / 0.002863651656569403 ) };
  			lTable["scaler_output_17"] = { ( ( imputer_output_17 - 0.025567830769230776 ) / 0.017947013631032318 ) };
  			lTable["scaler_output_18"] = { ( ( imputer_output_18 - 0.03199925626373623 ) / 0.03166493672136351 ) };
  			lTable["scaler_output_19"] = { ( ( imputer_output_19 - 0.011972369230769237 ) / 0.006392005589396607 ) };
  			lTable["scaler_output_20"] = { ( ( imputer_output_20 - 0.020896200000000014 ) / 0.008582910079869234 ) };
  			lTable["scaler_output_21"] = { ( ( imputer_output_21 - 0.0038465518681318647 ) / 0.0027436075866190575 ) };
  			lTable["scaler_output_22"] = { ( ( imputer_output_22 - 16.17776483516484 ) / 4.817458816201383 ) };
  			lTable["scaler_output_23"] = { ( ( imputer_output_23 - 25.26505494505494 ) / 5.92332412866667 ) };
  			lTable["scaler_output_24"] = { ( ( imputer_output_24 - 106.68156043956041 ) / 33.70385837605481 ) };
  			lTable["scaler_output_25"] = { ( ( imputer_output_25 - 870.8639560439567 ) / 566.9950559872813 ) };
  			lTable["scaler_output_26"] = { ( ( imputer_output_26 - 0.1318275604395605 ) / 0.02274820752228878 ) };
  			lTable["scaler_output_27"] = { ( ( imputer_output_27 - 0.24991806593406582 ) / 0.15246893644279044 ) };
  			lTable["scaler_output_28"] = { ( ( imputer_output_28 - 0.2654615934065932 ) / 0.20692568678204093 ) };
  			lTable["scaler_output_29"] = { ( ( imputer_output_29 - 0.11348798021978022 ) / 0.06638141278520703 ) };
  			lTable["scaler_output_30"] = { ( ( imputer_output_30 - 0.2897881318681319 ) / 0.06220470665051894 ) };
  			lTable["scaler_output_31"] = { ( ( imputer_output_31 - 0.08364145054945049 ) / 0.01706514580694785 ) };
  	
  			return lTable;
  		}
  	
  		tTable compute_model_outputs_from_table( tTable const & iTable) {
  			tTable lTable = compute_features(iTable.at("imputer_output_2")[0], iTable.at("imputer_output_3")[0], iTable.at("imputer_output_4")[0], iTable.at("imputer_output_5")[0], iTable.at("imputer_output_6")[0], iTable.at("imputer_output_7")[0], iTable.at("imputer_output_8")[0], iTable.at("imputer_output_9")[0], iTable.at("imputer_output_10")[0], iTable.at("imputer_output_11")[0], iTable.at("imputer_output_12")[0], iTable.at("imputer_output_13")[0], iTable.at("imputer_output_14")[0], iTable.at("imputer_output_15")[0], iTable.at("imputer_output_16")[0], iTable.at("imputer_output_17")[0], iTable.at("imputer_output_18")[0], iTable.at("imputer_output_19")[0], iTable.at("imputer_output_20")[0], iTable.at("imputer_output_21")[0], iTable.at("imputer_output_22")[0], iTable.at("imputer_output_23")[0], iTable.at("imputer_output_24")[0], iTable.at("imputer_output_25")[0], iTable.at("imputer_output_26")[0], iTable.at("imputer_output_27")[0], iTable.at("imputer_output_28")[0], iTable.at("imputer_output_29")[0], iTable.at("imputer_output_30")[0], iTable.at("imputer_output_31")[0]);
  	
  			return lTable;
  		}
  	
  	} // eof namespace scaler
  	
  
  	namespace model {
  	
  		std::vector<std::any> get_classes(){
  			std::vector<std::any> lClasses = { 0, 1 };
  	
  			return lClasses;
  		}
  	
  		namespace SubModel_0_0 {
  		
  			std::vector<std::any> get_classes(){
  				std::vector<std::any> lClasses = { 0, 1 };
  		
  				return lClasses;
  			}
  		
  			typedef std::vector<double> tNodeData;
  			std::map<int, tNodeData> Decision_Tree_Node_data = {
  					{ 3 ,  {1.46726804 }} ,
  					{ 4 ,  {-2.84375 }} ,
  					{ 6 ,  {1.54237288 }} ,
  					{ 7 ,  {-2.55134181 }} ,
  					{ 10 ,  {1.54237288 }} ,
  					{ 11 ,  {-2.81264275 }} ,
  					{ 13 ,  {1.54237288 }} ,
  					{ 14 ,  {1.54237288 }} 
  			};
  			
  		
  			int get_decision_tree_node_index(std::any scaler_output_2, std::any scaler_output_3, std::any scaler_output_4, std::any scaler_output_5, std::any scaler_output_6, std::any scaler_output_7, std::any scaler_output_8, std::any scaler_output_9, std::any scaler_output_10, std::any scaler_output_11, std::any scaler_output_12, std::any scaler_output_13, std::any scaler_output_14, std::any scaler_output_15, std::any scaler_output_16, std::any scaler_output_17, std::any scaler_output_18, std::any scaler_output_19, std::any scaler_output_20, std::any scaler_output_21, std::any scaler_output_22, std::any scaler_output_23, std::any scaler_output_24, std::any scaler_output_25, std::any scaler_output_26, std::any scaler_output_27, std::any scaler_output_28, std::any scaler_output_29, std::any scaler_output_30, std::any scaler_output_31) {
  				int lNodeIndex = (scaler_output_29 <= 0.48149049282073975) ? ( (scaler_output_25 <= 0.15994150936603546) ? ( (scaler_output_12 <= 2.189642369747162) ? ( 3 ) : ( 4 ) ) : ( (scaler_output_26 <= -1.9275171756744385) ? ( 6 ) : ( 7 ) ) ) : ( (scaler_output_18 <= 3.2733601331710815) ? ( (scaler_output_28 <= -0.2999221310019493) ? ( 10 ) : ( 11 ) ) : ( (scaler_output_23 <= -0.3359692692756653) ? ( 13 ) : ( 14 ) ) );
  			
  				return lNodeIndex;
  			}
  			
  		
  			std::vector<std::string> get_input_names(){
  				std::vector<std::string> lFeatures = { "scaler_output_2", "scaler_output_3", "scaler_output_4", "scaler_output_5", "scaler_output_6", "scaler_output_7", "scaler_output_8", "scaler_output_9", "scaler_output_10", "scaler_output_11", "scaler_output_12", "scaler_output_13", "scaler_output_14", "scaler_output_15", "scaler_output_16", "scaler_output_17", "scaler_output_18", "scaler_output_19", "scaler_output_20", "scaler_output_21", "scaler_output_22", "scaler_output_23", "scaler_output_24", "scaler_output_25", "scaler_output_26", "scaler_output_27", "scaler_output_28", "scaler_output_29", "scaler_output_30", "scaler_output_31" };
  		
  				return lFeatures;
  			}
  		
  			std::vector<std::string> get_output_names(){
  				std::vector<std::string> lOutputs = { 
  					"Score_0", "Score_1",
  					"Proba_0", "Proba_1",
  					"LogProba_0", "LogProba_1" };
  		
  				return lOutputs;
  			}
  		
  			tTable compute_classification_scores(std::any scaler_output_2, std::any scaler_output_3, std::any scaler_output_4, std::any scaler_output_5, std::any scaler_output_6, std::any scaler_output_7, std::any scaler_output_8, std::any scaler_output_9, std::any scaler_output_10, std::any scaler_output_11, std::any scaler_output_12, std::any scaler_output_13, std::any scaler_output_14, std::any scaler_output_15, std::any scaler_output_16, std::any scaler_output_17, std::any scaler_output_18, std::any scaler_output_19, std::any scaler_output_20, std::any scaler_output_21, std::any scaler_output_22, std::any scaler_output_23, std::any scaler_output_24, std::any scaler_output_25, std::any scaler_output_26, std::any scaler_output_27, std::any scaler_output_28, std::any scaler_output_29, std::any scaler_output_30, std::any scaler_output_31) {
  				auto lClasses = get_classes();
  		
  				int lNodeIndex = get_decision_tree_node_index(scaler_output_2, scaler_output_3, scaler_output_4, scaler_output_5, scaler_output_6, scaler_output_7, scaler_output_8, scaler_output_9, scaler_output_10, scaler_output_11, scaler_output_12, scaler_output_13, scaler_output_14, scaler_output_15, scaler_output_16, scaler_output_17, scaler_output_18, scaler_output_19, scaler_output_20, scaler_output_21, scaler_output_22, scaler_output_23, scaler_output_24, scaler_output_25, scaler_output_26, scaler_output_27, scaler_output_28, scaler_output_29, scaler_output_30, scaler_output_31);
  		
  				std::vector<double> lNodeValue = Decision_Tree_Node_data[ lNodeIndex ];
  		
  		
  				tTable lTable;
  		
  				lTable["Score"] = { 
  					lNodeValue [ 0 ],
  					0.0 
  				} ;
  				lTable["Proba"] = { 
  					std::any(),
  					std::any() 
  				} ;
  		
  				recompute_log_probas( lTable );
  		
  				return lTable;
  			}
  		
  			tTable compute_model_outputs_from_table( tTable const & iTable) {
  				tTable lTable = compute_classification_scores(iTable.at("scaler_output_2")[0], iTable.at("scaler_output_3")[0], iTable.at("scaler_output_4")[0], iTable.at("scaler_output_5")[0], iTable.at("scaler_output_6")[0], iTable.at("scaler_output_7")[0], iTable.at("scaler_output_8")[0], iTable.at("scaler_output_9")[0], iTable.at("scaler_output_10")[0], iTable.at("scaler_output_11")[0], iTable.at("scaler_output_12")[0], iTable.at("scaler_output_13")[0], iTable.at("scaler_output_14")[0], iTable.at("scaler_output_15")[0], iTable.at("scaler_output_16")[0], iTable.at("scaler_output_17")[0], iTable.at("scaler_output_18")[0], iTable.at("scaler_output_19")[0], iTable.at("scaler_output_20")[0], iTable.at("scaler_output_21")[0], iTable.at("scaler_output_22")[0], iTable.at("scaler_output_23")[0], iTable.at("scaler_output_24")[0], iTable.at("scaler_output_25")[0], iTable.at("scaler_output_26")[0], iTable.at("scaler_output_27")[0], iTable.at("scaler_output_28")[0], iTable.at("scaler_output_29")[0], iTable.at("scaler_output_30")[0], iTable.at("scaler_output_31")[0]);
  		
  				return lTable;
  			}
  		
  		} // eof namespace SubModel_0_0
  		
  	
  		namespace SubModel_1_0 {
  		
  			std::vector<std::any> get_classes(){
  				std::vector<std::any> lClasses = { 0, 1 };
  		
  				return lClasses;
  			}
  		
  			typedef std::vector<double> tNodeData;
  			std::map<int, tNodeData> Decision_Tree_Node_data = {
  					{ 3 ,  {1.39108106 }} ,
  					{ 4 ,  {-0.65963637 }} ,
  					{ 6 ,  {-2.42856059 }} ,
  					{ 7 ,  {-2.42856059 }} ,
  					{ 10 ,  {1.46485078 }} ,
  					{ 11 ,  {-2.36256492 }} ,
  					{ 12 ,  {1.46485078 }} 
  			};
  			
  		
  			int get_decision_tree_node_index(std::any scaler_output_2, std::any scaler_output_3, std::any scaler_output_4, std::any scaler_output_5, std::any scaler_output_6, std::any scaler_output_7, std::any scaler_output_8, std::any scaler_output_9, std::any scaler_output_10, std::any scaler_output_11, std::any scaler_output_12, std::any scaler_output_13, std::any scaler_output_14, std::any scaler_output_15, std::any scaler_output_16, std::any scaler_output_17, std::any scaler_output_18, std::any scaler_output_19, std::any scaler_output_20, std::any scaler_output_21, std::any scaler_output_22, std::any scaler_output_23, std::any scaler_output_24, std::any scaler_output_25, std::any scaler_output_26, std::any scaler_output_27, std::any scaler_output_28, std::any scaler_output_29, std::any scaler_output_30, std::any scaler_output_31) {
  				int lNodeIndex = (scaler_output_29 <= 0.48149049282073975) ? ( (scaler_output_25 <= 0.3300488144159317) ? ( (scaler_output_15 <= 0.16786222159862518) ? ( 3 ) : ( 4 ) ) : ( (scaler_output_11 <= -1.4659906029701233) ? ( 6 ) : ( 7 ) ) ) : ( (scaler_output_18 <= 3.2733601331710815) ? ( (scaler_output_28 <= -0.2999221310019493) ? ( 10 ) : ( 11 ) ) : ( 12 ) );
  			
  				return lNodeIndex;
  			}
  			
  		
  			std::vector<std::string> get_input_names(){
  				std::vector<std::string> lFeatures = { "scaler_output_2", "scaler_output_3", "scaler_output_4", "scaler_output_5", "scaler_output_6", "scaler_output_7", "scaler_output_8", "scaler_output_9", "scaler_output_10", "scaler_output_11", "scaler_output_12", "scaler_output_13", "scaler_output_14", "scaler_output_15", "scaler_output_16", "scaler_output_17", "scaler_output_18", "scaler_output_19", "scaler_output_20", "scaler_output_21", "scaler_output_22", "scaler_output_23", "scaler_output_24", "scaler_output_25", "scaler_output_26", "scaler_output_27", "scaler_output_28", "scaler_output_29", "scaler_output_30", "scaler_output_31" };
  		
  				return lFeatures;
  			}
  		
  			std::vector<std::string> get_output_names(){
  				std::vector<std::string> lOutputs = { 
  					"Score_0", "Score_1",
  					"Proba_0", "Proba_1",
  					"LogProba_0", "LogProba_1" };
  		
  				return lOutputs;
  			}
  		
  			tTable compute_classification_scores(std::any scaler_output_2, std::any scaler_output_3, std::any scaler_output_4, std::any scaler_output_5, std::any scaler_output_6, std::any scaler_output_7, std::any scaler_output_8, std::any scaler_output_9, std::any scaler_output_10, std::any scaler_output_11, std::any scaler_output_12, std::any scaler_output_13, std::any scaler_output_14, std::any scaler_output_15, std::any scaler_output_16, std::any scaler_output_17, std::any scaler_output_18, std::any scaler_output_19, std::any scaler_output_20, std::any scaler_output_21, std::any scaler_output_22, std::any scaler_output_23, std::any scaler_output_24, std::any scaler_output_25, std::any scaler_output_26, std::any scaler_output_27, std::any scaler_output_28, std::any scaler_output_29, std::any scaler_output_30, std::any scaler_output_31) {
  				auto lClasses = get_classes();
  		
  				int lNodeIndex = get_decision_tree_node_index(scaler_output_2, scaler_output_3, scaler_output_4, scaler_output_5, scaler_output_6, scaler_output_7, scaler_output_8, scaler_output_9, scaler_output_10, scaler_output_11, scaler_output_12, scaler_output_13, scaler_output_14, scaler_output_15, scaler_output_16, scaler_output_17, scaler_output_18, scaler_output_19, scaler_output_20, scaler_output_21, scaler_output_22, scaler_output_23, scaler_output_24, scaler_output_25, scaler_output_26, scaler_output_27, scaler_output_28, scaler_output_29, scaler_output_30, scaler_output_31);
  		
  				std::vector<double> lNodeValue = Decision_Tree_Node_data[ lNodeIndex ];
  		
  		
  				tTable lTable;
  		
  				lTable["Score"] = { 
  					lNodeValue [ 0 ],
  					0.0 
  				} ;
  				lTable["Proba"] = { 
  					std::any(),
  					std::any() 
  				} ;
  		
  				recompute_log_probas( lTable );
  		
  				return lTable;
  			}
  		
  			tTable compute_model_outputs_from_table( tTable const & iTable) {
  				tTable lTable = compute_classification_scores(iTable.at("scaler_output_2")[0], iTable.at("scaler_output_3")[0], iTable.at("scaler_output_4")[0], iTable.at("scaler_output_5")[0], iTable.at("scaler_output_6")[0], iTable.at("scaler_output_7")[0], iTable.at("scaler_output_8")[0], iTable.at("scaler_output_9")[0], iTable.at("scaler_output_10")[0], iTable.at("scaler_output_11")[0], iTable.at("scaler_output_12")[0], iTable.at("scaler_output_13")[0], iTable.at("scaler_output_14")[0], iTable.at("scaler_output_15")[0], iTable.at("scaler_output_16")[0], iTable.at("scaler_output_17")[0], iTable.at("scaler_output_18")[0], iTable.at("scaler_output_19")[0], iTable.at("scaler_output_20")[0], iTable.at("scaler_output_21")[0], iTable.at("scaler_output_22")[0], iTable.at("scaler_output_23")[0], iTable.at("scaler_output_24")[0], iTable.at("scaler_output_25")[0], iTable.at("scaler_output_26")[0], iTable.at("scaler_output_27")[0], iTable.at("scaler_output_28")[0], iTable.at("scaler_output_29")[0], iTable.at("scaler_output_30")[0], iTable.at("scaler_output_31")[0]);
  		
  				return lTable;
  			}
  		
  		} // eof namespace SubModel_1_0
  		
  	
  		std::vector<std::string> get_input_names(){
  			std::vector<std::string> lFeatures = { "scaler_output_2", "scaler_output_3", "scaler_output_4", "scaler_output_5", "scaler_output_6", "scaler_output_7", "scaler_output_8", "scaler_output_9", "scaler_output_10", "scaler_output_11", "scaler_output_12", "scaler_output_13", "scaler_output_14", "scaler_output_15", "scaler_output_16", "scaler_output_17", "scaler_output_18", "scaler_output_19", "scaler_output_20", "scaler_output_21", "scaler_output_22", "scaler_output_23", "scaler_output_24", "scaler_output_25", "scaler_output_26", "scaler_output_27", "scaler_output_28", "scaler_output_29", "scaler_output_30", "scaler_output_31" };
  	
  			return lFeatures;
  		}
  	
  		std::vector<std::string> get_output_names(){
  			std::vector<std::string> lOutputs = { 
  				"Score_0", "Score_1",
  				"Proba_0", "Proba_1",
  				"LogProba_0", "LogProba_1",
  				"Decision", "DecisionProba" };
  	
  			return lOutputs;
  		}
  	
  		tTable compute_classification_scores(std::any scaler_output_2, std::any scaler_output_3, std::any scaler_output_4, std::any scaler_output_5, std::any scaler_output_6, std::any scaler_output_7, std::any scaler_output_8, std::any scaler_output_9, std::any scaler_output_10, std::any scaler_output_11, std::any scaler_output_12, std::any scaler_output_13, std::any scaler_output_14, std::any scaler_output_15, std::any scaler_output_16, std::any scaler_output_17, std::any scaler_output_18, std::any scaler_output_19, std::any scaler_output_20, std::any scaler_output_21, std::any scaler_output_22, std::any scaler_output_23, std::any scaler_output_24, std::any scaler_output_25, std::any scaler_output_26, std::any scaler_output_27, std::any scaler_output_28, std::any scaler_output_29, std::any scaler_output_30, std::any scaler_output_31) {
  			auto lClasses = get_classes();
  	
  			std::vector<tTable> lTreeScores = { 
  				SubModel_0_0::compute_classification_scores(scaler_output_2, scaler_output_3, scaler_output_4, scaler_output_5, scaler_output_6, scaler_output_7, scaler_output_8, scaler_output_9, scaler_output_10, scaler_output_11, scaler_output_12, scaler_output_13, scaler_output_14, scaler_output_15, scaler_output_16, scaler_output_17, scaler_output_18, scaler_output_19, scaler_output_20, scaler_output_21, scaler_output_22, scaler_output_23, scaler_output_24, scaler_output_25, scaler_output_26, scaler_output_27, scaler_output_28, scaler_output_29, scaler_output_30, scaler_output_31),
  				SubModel_1_0::compute_classification_scores(scaler_output_2, scaler_output_3, scaler_output_4, scaler_output_5, scaler_output_6, scaler_output_7, scaler_output_8, scaler_output_9, scaler_output_10, scaler_output_11, scaler_output_12, scaler_output_13, scaler_output_14, scaler_output_15, scaler_output_16, scaler_output_17, scaler_output_18, scaler_output_19, scaler_output_20, scaler_output_21, scaler_output_22, scaler_output_23, scaler_output_24, scaler_output_25, scaler_output_26, scaler_output_27, scaler_output_28, scaler_output_29, scaler_output_30, scaler_output_31)
  			};
  	
  			tTable lAggregatedTable = aggregate_gb_scores(lTreeScores, {"Proba", "Score"});
  	
  			auto lLogSumExp = ln( + exp(ln(0.3516483516483517) + 0.1 * lAggregatedTable["Score"][ 0 ]) + exp(ln(0.6483516483516484) + 0.1 * lAggregatedTable["Score"][ 1 ]));
  	
  			lAggregatedTable["Score"][ 0 ] = exp(ln(0.3516483516483517) + 0.1 * lAggregatedTable["Score"][ 0 ] - lLogSumExp);
  	
  			lAggregatedTable["Score"][ 1 ] = exp(ln(0.6483516483516484) + 0.1 * lAggregatedTable["Score"][ 1 ] - lLogSumExp);
  	
  			tTable lSoftMaxTable = soft_max( lAggregatedTable );
  	
  			lSoftMaxTable[ "Score" ] = lAggregatedTable[ "Score" ];
  	
  	
  			tTable lTable = lSoftMaxTable;
  	
  			int lBestClass = get_arg_max( lTable["Proba"] );
  			auto lDecision = lClasses[lBestClass];
  			lTable["Decision"] = { lDecision } ;
  			lTable["DecisionProba"] = { lTable["Proba"][lBestClass] };
  	
  			recompute_log_probas( lTable );
  	
  			return lTable;
  		}
  	
  		tTable compute_model_outputs_from_table( tTable const & iTable) {
  			tTable lTable = compute_classification_scores(iTable.at("scaler_output_2")[0], iTable.at("scaler_output_3")[0], iTable.at("scaler_output_4")[0], iTable.at("scaler_output_5")[0], iTable.at("scaler_output_6")[0], iTable.at("scaler_output_7")[0], iTable.at("scaler_output_8")[0], iTable.at("scaler_output_9")[0], iTable.at("scaler_output_10")[0], iTable.at("scaler_output_11")[0], iTable.at("scaler_output_12")[0], iTable.at("scaler_output_13")[0], iTable.at("scaler_output_14")[0], iTable.at("scaler_output_15")[0], iTable.at("scaler_output_16")[0], iTable.at("scaler_output_17")[0], iTable.at("scaler_output_18")[0], iTable.at("scaler_output_19")[0], iTable.at("scaler_output_20")[0], iTable.at("scaler_output_21")[0], iTable.at("scaler_output_22")[0], iTable.at("scaler_output_23")[0], iTable.at("scaler_output_24")[0], iTable.at("scaler_output_25")[0], iTable.at("scaler_output_26")[0], iTable.at("scaler_output_27")[0], iTable.at("scaler_output_28")[0], iTable.at("scaler_output_29")[0], iTable.at("scaler_output_30")[0], iTable.at("scaler_output_31")[0]);
  	
  			return lTable;
  		}
  	
  	} // eof namespace model
  	
  
  	std::vector<std::string> get_input_names(){
  		std::vector<std::string> lFeatures = { "Feature_0", "Feature_1", "Feature_2", "Feature_3", "Feature_4", "Feature_5", "Feature_6", "Feature_7", "Feature_8", "Feature_9", "Feature_10", "Feature_11", "Feature_12", "Feature_13", "Feature_14", "Feature_15", "Feature_16", "Feature_17", "Feature_18", "Feature_19", "Feature_20", "Feature_21", "Feature_22", "Feature_23", "Feature_24", "Feature_25", "Feature_26", "Feature_27", "Feature_28", "Feature_29" };
  
  		return lFeatures;
  	}
  
  	std::vector<std::string> get_output_names(){
  		std::vector<std::string> lOutputs = { 
  			"Score_0", "Score_1",
  			"Proba_0", "Proba_1",
  			"LogProba_0", "LogProba_1",
  			"Decision", "DecisionProba" };
  
  		return lOutputs;
  	}
  
  	tTable compute_classification_scores(std::any Feature_0, std::any Feature_1, std::any Feature_2, std::any Feature_3, std::any Feature_4, std::any Feature_5, std::any Feature_6, std::any Feature_7, std::any Feature_8, std::any Feature_9, std::any Feature_10, std::any Feature_11, std::any Feature_12, std::any Feature_13, std::any Feature_14, std::any Feature_15, std::any Feature_16, std::any Feature_17, std::any Feature_18, std::any Feature_19, std::any Feature_20, std::any Feature_21, std::any Feature_22, std::any Feature_23, std::any Feature_24, std::any Feature_25, std::any Feature_26, std::any Feature_27, std::any Feature_28, std::any Feature_29) {
  		auto lClasses = get_classes();
  
  		tTable lTable_imputer = imputer::compute_features(Feature_0, Feature_1, Feature_2, Feature_3, Feature_4, Feature_5, Feature_6, Feature_7, Feature_8, Feature_9, Feature_10, Feature_11, Feature_12, Feature_13, Feature_14, Feature_15, Feature_16, Feature_17, Feature_18, Feature_19, Feature_20, Feature_21, Feature_22, Feature_23, Feature_24, Feature_25, Feature_26, Feature_27, Feature_28, Feature_29);
  
  		tTable lTable_scaler = scaler::compute_model_outputs_from_table( lTable_imputer );
  
  		tTable lTable_model = model::compute_model_outputs_from_table( lTable_scaler );
  
  
  		tTable lTable = lTable_model;
  
  		int lBestClass = get_arg_max( lTable["Proba"] );
  		auto lDecision = lClasses[lBestClass];
  		lTable["Decision"] = { lDecision } ;
  		lTable["DecisionProba"] = { lTable["Proba"][lBestClass] };
  
  		recompute_log_probas( lTable );
  
  		return lTable;
  	}
  
  	tTable compute_model_outputs_from_table( tTable const & iTable) {
  		tTable lTable = compute_classification_scores(iTable.at("Feature_0")[0], iTable.at("Feature_1")[0], iTable.at("Feature_2")[0], iTable.at("Feature_3")[0], iTable.at("Feature_4")[0], iTable.at("Feature_5")[0], iTable.at("Feature_6")[0], iTable.at("Feature_7")[0], iTable.at("Feature_8")[0], iTable.at("Feature_9")[0], iTable.at("Feature_10")[0], iTable.at("Feature_11")[0], iTable.at("Feature_12")[0], iTable.at("Feature_13")[0], iTable.at("Feature_14")[0], iTable.at("Feature_15")[0], iTable.at("Feature_16")[0], iTable.at("Feature_17")[0], iTable.at("Feature_18")[0], iTable.at("Feature_19")[0], iTable.at("Feature_20")[0], iTable.at("Feature_21")[0], iTable.at("Feature_22")[0], iTable.at("Feature_23")[0], iTable.at("Feature_24")[0], iTable.at("Feature_25")[0], iTable.at("Feature_26")[0], iTable.at("Feature_27")[0], iTable.at("Feature_28")[0], iTable.at("Feature_29")[0]);
  
  		return lTable;
  	}
  
  } // eof namespace 
  
  
  int main() {
  	score_csv_file("outputs/ml2cpp-demo/datasets/BreastCancer.csv");
  	return 0;
  }
  