void test_calib_gMatrixNegative_allData()
{
	std::vector<std::string> mkt_file_list = InputFileManager::get_VCUB_FileList();
	//size_t nbFile = 2;
	size_t nbFile = mkt_file_list.size();

	LmmCalibrationConfig config;
	config.model_nbYear_=16;

	//std::cout<<"------------------------------------------------------  HORIZON "<<nbYear<<" YR "<<std::endl;//ctndebug_calib_todelete
	for(size_t iFile=0 ; iFile< nbFile ; ++iFile)
	{
		std::string folder_name;// = "TotalCalib\\" ;  config.use_positive_constraint_=true;
		std::string base_name_file = LMMPATH::get_BaseFileName(mkt_file_list[iFile]) + "\\";
		folder_name+=base_name_file;
		LMMPATH::reset_Output_SubFolder(folder_name );

		LmmSwaptionMarketData_PTR pLmmSwaptionMarketData=get_LmmSwaptionMarketData(config, mkt_file_list[iFile]);

		config.correl_ReducedRank_= 30 ; config.correl_alpha_ = 0.000000001 ; config.correl_beta_  = 0.05;
		QuantLib::Array found_abcd = marketData_LMM_ABCD_calibration(config,pLmmSwaptionMarketData);

		//Correlation_PTR found_correlation_ptr = marketData_LMM_Correlation_calibration(config,pLmmSwaptionMarketData,found_abcd);

		config.correl_ReducedRank_= 3 ;

		//marketData_LMM_CascadeExact_calibration(config, pLmmSwaptionMarketData, found_abcd , create_InitCorrelation(config) );
		//config.use_local_calib_=true;
		//marketData_LMM_Local_gCalibration(config, pLmmSwaptionMarketData, found_abcd , create_InitCorrelation(config), GMatrixMapping_PTR() );
		//config.use_local_calib_=false;
		//config.penalty_time_homogeneity_ = 1e-4 ; config.penalty_libor_ = 1e-6 ; config.use_positive_constraint_=false;
		marketData_LMM_Global_gCalibration(config, pLmmSwaptionMarketData, found_abcd , create_InitCorrelation(config), GMatrixMapping_PTR() );

	}
}
void test_calib_gMatrix_OneFile(const std::string& mkt_data_file)
{
	std::string folder_name;// = "TotalCalib\\" ;  config.use_positive_constraint_=true;
	std::string base_name_file = LMMPATH::get_BaseFileName(mkt_data_file) + "\\";
	folder_name+=base_name_file;
	LMMPATH::reset_Output_SubFolder(folder_name );

	LmmCalibrationConfig config;
	config.model_nbYear_=16;

	LmmSwaptionMarketData_PTR pLmmSwaptionMarketData=get_LmmSwaptionMarketData(config, mkt_data_file);

	config.correl_ReducedRank_= 30 ; config.correl_alpha_ = 0.000000001 ; config.correl_beta_  = 0.05;
	QuantLib::Array found_abcd = marketData_LMM_ABCD_calibration(config,pLmmSwaptionMarketData);

	//Correlation_PTR found_correlation_ptr = marketData_LMM_Correlation_calibration(config,pLmmSwaptionMarketData,found_abcd);

	config.correl_ReducedRank_= 3 ;

	//marketData_LMM_CascadeExact_calibration(config, pLmmSwaptionMarketData, found_abcd , create_InitCorrelation(config) );
	//config.use_local_calib_=true;
	//marketData_LMM_Local_gCalibration(config, pLmmSwaptionMarketData, found_abcd , create_InitCorrelation(config), GMatrixMapping_PTR() );
	//config.use_local_calib_=false;
	config.penalty_time_homogeneity_ = 1e-4 ; config.penalty_libor_ = 1e-6 ; config.use_positive_constraint_= true;
	marketData_LMM_Global_gCalibration(config, pLmmSwaptionMarketData, found_abcd , create_InitCorrelation(config), GMatrixMapping_PTR() );
}
void test_Calib_gMatrix(const LmmCalibrationConfig& config , const std::string& mkt_data_filename)
{
	std::string folder_data_file = "WithPositiveConstraint\\" + LMMPATH::get_BaseFileName(mkt_data_filename) + "\\";

	LmmSwaptionMarketData_PTR pLmmSwaptionMarketData=get_LmmSwaptionMarketData(config, mkt_data_filename);

	{
		std::string sub_folder_data_file = folder_data_file + "Cascade\\";
		LMMPATH::reset_Output_SubFolder(sub_folder_data_file );
		GMatrixMapping_PTR pGMatrixMapping = marketData_LMM_CascadeExact_calibration(config, pLmmSwaptionMarketData, config.get_abcdArray() ,create_InitCorrelation(config));
		config.print("calib_config.csv");
	}

	{
		config.use_local_calib_=false;
		std::string sub_folder_data_file = folder_data_file + "Global\\";
		LMMPATH::reset_Output_SubFolder(sub_folder_data_file );
		marketData_LMM_Global_gCalibration(config, pLmmSwaptionMarketData,config.get_abcdArray(),create_InitCorrelation(config), GMatrixMapping_PTR() );
		config.print("calib_config.csv");
	}

	{
		config.use_local_calib_=true;
		std::string sub_folder_data_file = folder_data_file + "Local\\";
		LMMPATH::reset_Output_SubFolder(sub_folder_data_file );
		marketData_LMM_Global_gCalibration(config, pLmmSwaptionMarketData,config.get_abcdArray(),create_InitCorrelation(config), GMatrixMapping_PTR() );
		config.print("calib_config.csv");
	}


}
void test_calibration_Cascade_then_Global(const std::string& mkt_data_filename)
{
	LmmCalibrationConfig config;
	config.reset_nbYear(16);
	config.correl_ReducedRank_= 3;

	config.correl_alpha_ = 0.000000001;
	config.correl_beta_  = 0.05;

	config.vol_abcd_.a_  = 0.25673;
	config.vol_abcd_.b_  = 0.00002;
	config.vol_abcd_.c_  = 0.547;
	config.vol_abcd_.d_  = 0.13998;

	config.use_positive_constraint_=true;
	

	std::stringstream foldername ;

	std::string base_name_file = LMMPATH::get_BaseFileName(mkt_data_filename) + "\\";
	foldername<<"Cascade_Then_Global\\";

	foldername << base_name_file ;

	LMMPATH::reset_Output_SubFolder(foldername.str() );


	LmmSwaptionMarketData_PTR pLmmSwaptionMarketData=get_LmmSwaptionMarketData(config, mkt_data_filename );

	GMatrixMapping_PTR pGMatrixMapping = marketData_LMM_CascadeExact_calibration(config, pLmmSwaptionMarketData, config.get_abcdArray() ,create_InitCorrelation(config));
	
	marketData_LMM_Global_gCalibration(config, pLmmSwaptionMarketData,config.get_abcdArray(),create_InitCorrelation(config),pGMatrixMapping );	
}
void JB_test_calib_shift_gMatrix_OneFile(const std::string& mkt_data_file)
{

	std::string folder_name;// = "TotalCalib\\" ;  config.use_positive_constraint_=true;
	std::string base_name_file = LMMPATH::get_BaseFileName(mkt_data_file) + "\\";
	folder_name+=base_name_file;
	LMMPATH::reset_Output_SubFolder(folder_name );

	LmmCalibrationConfig config;
	config.model_nbYear_=16;

	LmmSwaptionMarketData_PTR pLmmSwaptionMarketData=get_LmmSwaptionMarketData(config, mkt_data_file);

	config.correl_ReducedRank_= 30 ; config.correl_alpha_ = 0.000000001 ; config.correl_beta_  = 0.05;
	Shifted_HGVolatilityFunction_PTR  shifted_HGVolatilityFunction= JB_marketData_LMM_ABCD_calibration(config,pLmmSwaptionMarketData);

	//Correlation_PTR found_correlation_ptr = marketData_LMM_Correlation_calibration(config,pLmmSwaptionMarketData,found_abcd);

	config.correl_ReducedRank_= 3 ;

	//marketData_LMM_CascadeExact_calibration(config, pLmmSwaptionMarketData, found_abcd , create_InitCorrelation(config) );
	//config.use_local_calib_=true;
	//marketData_LMM_Local_gCalibration(config, pLmmSwaptionMarketData, found_abcd , create_InitCorrelation(config), GMatrixMapping_PTR() );
	//config.use_local_calib_=false;
	config.penalty_time_homogeneity_ = 1e-4 ; config.penalty_libor_ = 1e-6 ; config.use_positive_constraint_= true;
	GMatrix_Vol_gMapping gMatrix_Vol_gMapping	=	JB_marketData_LMM_Global_gCalibration(config, pLmmSwaptionMarketData, shifted_HGVolatilityFunction, create_InitCorrelation(config), GMatrixMapping_PTR() );
	
	Shifted_HGVolatilityFunction_PTR param_h_g_shifted	=	JB_marketData_LMM_shift_Calibration(	config
																								, pLmmSwaptionMarketData 
																								, gMatrix_Vol_gMapping.first
																							);
	JB_marketData_LMM_Global_gCalibration(config, pLmmSwaptionMarketData, param_h_g_shifted , create_InitCorrelation(config), gMatrix_Vol_gMapping.second );
	cout << "end of program" << endl;
//		JB_marketData_LMM_Global_gCalibration(config, pLmmSwaptionMarketData, found_abcd , create_InitCorrelation(config), GMatrixMapping_PTR() )
}
void test_LmmGenericSensitivity(const std::string& mkt_data_filename)
{

	LmmCalibrationConfig config;
	config.reset_nbYear(16);
	config.correl_ReducedRank_= 3;

	config.correl_alpha_ = 0.000000001;
	config.correl_beta_  = 0.05;

	config.vol_abcd_.a_  = 0.136554  ;
	config.vol_abcd_.b_  = 8.45E-06  ;
	config.vol_abcd_.c_  = 0.0439938 ;
	config.vol_abcd_.d_  = 0.0269172 ;
	
	config.penalty_libor_ = 1e-6;
	config.penalty_time_homogeneity_ = 1e-4;

	config.use_positive_constraint_=true;
	
	std::stringstream foldername ;

	std::string base_name_file = LMMPATH::get_BaseFileName(mkt_data_filename) + "\\";
	foldername<<"Regularized_";

	foldername << base_name_file ;

	LMMPATH::reset_Output_SubFolder(foldername.str() );
	
	LmmSwaptionMarketData_PTR pLmmSwaptionMarketData=get_LmmSwaptionMarketData(config, mkt_data_filename );

	//config.print("config_for_abcd_calibration.csv");
	//QuantLib::Array calibrated_abcd = marketData_LMM_ABCD_calibration(config,pLmmSwaptionMarketData);

	marketData_LMM_Global_gCalibration(config, pLmmSwaptionMarketData,config.get_abcdArray(),create_InitCorrelation(config), GMatrixMapping_PTR() );

	//QuantLib::Array calibrated_abcd(4);
	//config.correl_alpha_= 1e-7 ; config.correl_beta_= 1;
	//calibrated_abcd[0]=0.223519;calibrated_abcd[1]=1.36E-05;calibrated_abcd[2]=0.455953;calibrated_abcd[3]=0.140501;
	//Correlation_PTR pCorrelation = marketData_LMM_Correlation_calibration(config,pLmmSwaptionMarketData, calibrated_abcd );

	//config.print("config_for_correlation_calibration.csv");
	//Correlation_PTR pCorrelation = marketData_LMM_Correlation_calibration(config,pLmmSwaptionMarketData, calibrated_abcd );
	//Correlation_PTR pCorrelation = create_InitCorrelation(config);
	//GMatrixMapping_PTR pGMatrixMapping = marketData_LMM_CascadeExact_calibration(config, pLmmSwaptionMarketData, config.get_abcdArray() ,pCorrelation);
	//marketData_LMM_Global_gCalibration(config, pLmmSwaptionMarketData,config.get_abcdArray(),pCorrelation, pGMatrixMapping );



	foldername.str( std::string() ) ;
}
void test_Stability_ABCD_vs_Correl(const std::string& mkt_data_filename)
{
	// loop testing if calib of abcd, then correl, then reiterate by the result is stable

	LmmCalibrationConfig config;

	config.reset_nbYear(16);
	config.correl_ReducedRank_= 30;

	config.correl_alpha_= 1. ;
	config.correl_beta_=  1. ;

	LmmSwaptionMarketData_PTR pLmmSwaptionMarketData=get_LmmSwaptionMarketData(config, mkt_data_filename );

	size_t loop_counter=0;
	std::string base_folder = "Test_ABCD_vs_Correl\\";
	const std::string base_path = LMMPATH::get_output_path() +  base_folder;
	std::string common_result_file = base_path + "Evolution_abcd_correlation.csv";
	
	while(loop_counter<10)
	{
		{			
			std::ofstream common_result ; common_result.open(common_result_file.c_str(), std::ios::app);

			common_result<<"-------------- loop "<<loop_counter<<std::endl;
			common_result<<"a,b,c,d, ,, alpha,beta,"<<std::endl;
			common_result<<"a,b,c,d, ,, alpha,beta,"<<std::endl;
			common_result<<config.vol_abcd_.a_<<","<<config.vol_abcd_.b_<<","<<config.vol_abcd_.c_<<","<<config.vol_abcd_.d_<<", ,,";
			common_result<<config.correl_alpha_<<","<<config.correl_beta_<<","<<std::endl<<std::endl;
			common_result.close();
		}

		std::stringstream foldername ;
		foldername<<"loop_"<<loop_counter;
		std::string full_path_folder = base_folder + foldername.str() + "\\";
		LMMPATH::reset_Output_SubFolder( full_path_folder );	

		QuantLib::Array calibrated_abcd = marketData_LMM_ABCD_calibration(config,pLmmSwaptionMarketData);
		config.vol_abcd_.a_ = calibrated_abcd[0];
		config.vol_abcd_.b_ = calibrated_abcd[1];
		config.vol_abcd_.c_ = calibrated_abcd[2];
		config.vol_abcd_.d_ = calibrated_abcd[3];

		Correlation_PTR pCorrelation = marketData_LMM_Correlation_calibration(config,pLmmSwaptionMarketData, calibrated_abcd );
		QuantLib::Array calibrated_correlation = pCorrelation->get_ArrayFrom_Correlation();
		config.correl_alpha_= calibrated_correlation[0];
		config.correl_beta_= calibrated_correlation[1];

		++loop_counter;
	}
}
void test_ABCDSensitivity_ABCD_vs_nbFactor_N_Alpha()
{
	///// create a grid of nbFactor and alpha, calibrate abcd throu this grid and see the quality of calibrator

	std::vector<std::string> file_list = InputFileManager::get_VCUB_FileList();

	const std::string& mkt_data_filename = file_list.back();

	std::string base_output_folder = "Test_ABCDSensitivity\\";
	std::string base_name_file = LMMPATH::get_BaseFileName(mkt_data_filename);

	for(size_t nbFactor =3; nbFactor<33; nbFactor+=5)
	{
		for(double correl_alpha=0.0000001;correl_alpha<=0.00000011;correl_alpha+=0.03)
		{			

			LmmCalibrationConfig config;

			config.reset_nbYear(16);

			config.correl_ReducedRank_= nbFactor;

			config.correl_alpha_= 0.0000001;
			config.correl_beta_= correl_alpha;

			std::ostringstream sub_folder_name;

			sub_folder_name<<"_nbF_"<<nbFactor<<"_alp_"<<correl_alpha;

			std::string output_folder = base_output_folder + sub_folder_name.str() + "\\";

			LMMPATH::reset_Output_SubFolder(output_folder );

			LmmSwaptionMarketData_PTR pLmmSwaptionMarketData=get_LmmSwaptionMarketData(config, mkt_data_filename );

			QuantLib::Array calibrated_abcd = marketData_LMM_ABCD_calibration(config,pLmmSwaptionMarketData);
		}
	}
}
void test_LmmSensitivityCorrelationReducedRank()
{
	std::vector<std::string> mkt_file_list = InputFileManager::get_VCUB_FileList();
	size_t nbFile = mkt_file_list.size();

	LmmCalibrationConfig config;
	config.reset_nbYear(16);
	config.vol_abcd_.a_ = 0.148975	;
	config.vol_abcd_.b_ = 0.0197503	;
	config.vol_abcd_.c_ = 0.108518	;
	config.vol_abcd_.d_ = 1.38E-08  ;


	std::vector<size_t> reduced_rank_list;
	reduced_rank_list.push_back(3);
	reduced_rank_list.push_back(5);
	reduced_rank_list.push_back(10);
	reduced_rank_list.push_back(15);
	reduced_rank_list.push_back(20);
	reduced_rank_list.push_back(25);
	reduced_rank_list.push_back(30);

	std::stringstream foldername ;

	LmmSwaptionMarketData_PTR pLmmSwaptionMarketData=get_LmmSwaptionMarketData(config, mkt_file_list[0]);

	for(size_t i=0; i<reduced_rank_list.size();++i)
	{
		config.correl_ReducedRank_ = reduced_rank_list[i]  ;

		foldername << LMMPATH::get_BaseFileName(mkt_file_list[0])<<"\\"<<"ReducedRank_"<<reduced_rank_list[i]<<"\\";
		LMMPATH::reset_Output_SubFolder(foldername.str() );

		Correlation_PTR pCorrelation = marketData_LMM_Correlation_calibration(config,pLmmSwaptionMarketData,config.get_abcdArray() );

		foldername.str( std::string() ) ;
	}
}
void Test_evaluation_basis()
{
	LMM::Index  indexStart = 2;		//1Y
	LMM::Index  indexEnd   = 20;		//10Y
	Tenor	floatingLegTenorType = Tenor::_6M;
	Tenor	fixedLegTenorType    = Tenor::_1YR;
	assert(indexStart%2==0&&indexEnd%2==0);
	LMMTenorStructure_PTR lmmTenorStructure( new LMMTenorStructure(floatingLegTenorType, indexEnd/2));

	std::vector<std::string> mkt_file_list = InputFileManager::get_VCUB_FileList();
	const std::string& mkt_data_file = mkt_file_list.back();
	std::string folder_name;   // = "TotalCalib\\" ;  config.use_positive_constraint_=true;
	std::string base_name_file = LMMPATH::get_BaseFileName(mkt_data_file) + "\\";
	folder_name+=base_name_file;
	LMMPATH::reset_Output_SubFolder(folder_name );

	LmmCalibrationConfig config;

	config.floatLegTenor_=floatingLegTenorType;
	config.fixedLegTenor_=fixedLegTenorType;

	config.model_nbYear_		=	indexEnd/2;
	size_t fixedFloatRatio		=	config.fixedLegTenor_.ratioTo(config.floatLegTenor_);
	config.correl_FullRank_		=	fixedFloatRatio*config.model_nbYear_+1;

	LmmSwaptionMarketData_PTR pLmmSwaptionMarketData	=	get_LmmSwaptionMarketData(config, mkt_data_file);
	const std::vector<double>&	initLiborValues			=	pLmmSwaptionMarketData->get_LiborQuotes()->get_InitLibor();

	double strike = 0.0137;

	std::vector<LMM::Index> exerciseDates;
	exerciseDates.push_back(2);
	//exerciseDates.push_back(4);
	//exerciseDates.push_back(6);
	//exerciseDates.push_back(8);
	//exerciseDates.push_back(10);
	//exerciseDates.push_back(12);
	//exerciseDates.push_back(14);
	//exerciseDates.push_back(16);
	//exerciseDates.push_back(18);
	exerciseDates.push_back(20);

	McLmm_PTR mcLmm_for_pricer = getMcLmmExample(lmmTenorStructure, initLiborValues, LmmCalibrationConfig());

	size_t fixedFloatingRatio = fixedLegTenorType.ratioTo(floatingLegTenorType);

	std::vector<std::vector<size_t>> subset;
	for(size_t i = 0; i <= 2; i++) 
	{
		subset.push_back(std::vector<size_t>());
		subset.back().push_back(0);
		subset.back().push_back(0);
		subset.back().push_back(i);							
	}
	//for(size_t j = 1; j <= 2; j++) 
	//{
	//	subset.push_back(std::vector<size_t>());
	//	subset.back().push_back(0);
	//	subset.back().push_back(j);
	//	subset.back().push_back(0);
	//}	
/*	for(size_t k = 1; k <= 2; k++) 
	{
		subset.push_back(std::vector<size_t>());
		subset.back().push_back(k);
		subset.back().push_back(0);
		subset.back().push_back(0);
	}	*/			



	size_t regressionIndex=2;
	LMM::Index liborIndex	= indexStart + regressionIndex*fixedFloatingRatio;
	LMM::Index paymentIndex = indexStart + regressionIndex*fixedFloatingRatio + 1;

	VanillaSwap vanillaSwap(	strike, 
								liborIndex, 
								indexEnd, 
								floatingLegTenorType, 
								fixedLegTenorType, 
								lmmTenorStructure);
		
	std::vector<Basis_CONSTPTR> basis_vect;
	std::vector<Basis_Evaluator_CONSTPTR> basis_evaluator_vect;

	for(size_t basisIndex = 0; basisIndex<subset.size(); basisIndex++)
	{
			basis_vect.push_back(getBasis(subset[basisIndex], 1.0, vanillaSwap, strike, liborIndex));
			basis_evaluator_vect.push_back(getBasisEvaluator(subset[basisIndex], McLmmVanillaSwapPricer(mcLmm_for_pricer)));	
	}

	LS::Regression rg(LS::RegressionRepresentation(basis_vect, basis_evaluator_vect));

	McLmm_PTR mcLmm = getMcLmmExample(lmmTenorStructure, initLiborValues, LmmCalibrationConfig());
	McLmm_LS mcLmm_LS(mcLmm);
	mcLmm_LS.simulateLMM(1);

	size_t nb = 30000;
	clock_t startTime = clock();
	std::vector<std::vector<double>> vect(nb);
	for(size_t i=0; i<nb; i++)
	{
		//rg.getRegressionRepresentation().evaluate_basis(mcLmm_LS.lmmSimualtionResults_[0]);
		vect[i].resize(3);
		vect[i]=rg.getRegressionRepresentation().getBasis_val_buffer();
		vect[i]=std::vector<double>(3, 1.0);
	}

	clock_t endTime = clock();

	clock_t time = endTime - startTime;
	double time_in_second = time/(double) CLOCKS_PER_SEC;

	cout << "time_in_second  "<< time_in_second << endl;

	const matrix& m = mcLmm_LS.lmmSimualtionResults_[0].get_liborMatrix();
	const std::vector<double>& numeraire = mcLmm_LS.lmmSimualtionResults_[0].get_numeraire();

	std::vector<size_t> basis1;
	basis1.push_back(1);
	basis1.push_back(0);
	basis1.push_back(0);
	Basis_CONSTPTR basisA=getBasis(basis1, 1.0, vanillaSwap, strike, liborIndex);
	Basis_Evaluator_CONSTPTR basis_EvaluatorA = getBasisEvaluator(basis1, McLmmVanillaSwapPricer(mcLmm_for_pricer));

	basis_EvaluatorA->evaluate(basisA,m, numeraire);
	clock_t startTime1 = clock();
	for(size_t i=0; i<1000; i++)
		basis_EvaluatorA->evaluate(basisA,m, numeraire);

	clock_t endTime1 = clock();

	clock_t time1 = endTime1 - startTime1;
	double time1_in_second = time1/(double) CLOCKS_PER_SEC;

	cout << "time1_in_second  "<< time1_in_second << endl;

	std::vector<size_t> basis2;
	basis2.push_back(0);
	basis2.push_back(1);
	basis2.push_back(0);
	Basis_CONSTPTR basisB=getBasis(basis2, 1.0, vanillaSwap, strike, liborIndex);
	Basis_Evaluator_CONSTPTR basis_EvaluatorB = getBasisEvaluator(basis2, McLmmVanillaSwapPricer(mcLmm_for_pricer));

	clock_t startTime2 = clock();
	for(size_t i=0; i<1000; i++)
		basis_EvaluatorB->evaluate(basisB, m, numeraire);

	clock_t endTime2 = clock();

	clock_t time2 = endTime2 - startTime2;
	double time2_in_second = time2/(double) CLOCKS_PER_SEC;

	cout << "time2_in_second  "<< time2_in_second << endl;

	std::vector<size_t> basis3;
	basis3.push_back(0);
	basis3.push_back(0);
	basis3.push_back(1);
	Basis_CONSTPTR basisC=getBasis(basis3, 1.0, vanillaSwap, strike, liborIndex);
	Basis_Evaluator_CONSTPTR basis_EvaluatorC = getBasisEvaluator(basis3, McLmmVanillaSwapPricer(mcLmm_for_pricer));

	
	clock_t startTime3 = clock();
	for(size_t i=0; i<1000; i++)
		basis_EvaluatorC->evaluate(basisC, m, numeraire);

	clock_t endTime3 = clock();

	clock_t time3 = endTime3 - startTime3;
	double time3_in_second = time3/(double) CLOCKS_PER_SEC;

	cout << "time3_in_second  "<< time3_in_second << endl;

	EV_Evaluator_CONSTPTR ev_evaluator_libor(new EV_LiborRate_Evaluator());
	EV_Evaluator_CONSTPTR ev_evaluator_swaprate(new EV_VanillaSwapRate_Evaluator(McLmmVanillaSwapPricer(mcLmm_for_pricer)));

	EV_CONSTPTR ev_swaprate(new EV_VanillaSwapRate( Rate1_CONSTPTR( new VanillaSwapRate(VanillaSwap(vanillaSwap)))));

	EV_CONSTPTR ev_libor(new EV_LiborRate(Rate1_CONSTPTR(new LiborRate(2,Tenor(Tenor::_6M)))));

	clock_t startTime4 = clock();
	for(size_t i=0; i<1000; i++)
		ev_evaluator_swaprate->evaluate(ev_swaprate,m,numeraire);

	clock_t endTime4 = clock();

	clock_t time4 = endTime4 - startTime4;
	double time4_in_second = time4/(double) CLOCKS_PER_SEC;

	cout << "time4_in_second  "<< time4_in_second << endl;



	clock_t startTime5 = clock();
	for(size_t i=0; i<1000; i++)
		ev_evaluator_libor->evaluate(ev_libor,m,numeraire);

	clock_t endTime5 = clock();

	clock_t time5 = endTime5 - startTime5;
	double time5_in_second = time5/(double) CLOCKS_PER_SEC;

	cout << "time5_in_second  "<< time5_in_second << endl;

}
void test_LmmRegularizedCalibrationMarketData_OneFile(const std::string& mkt_data_file)
{

	LmmCalibrationConfig config;
	config.reset_nbYear(16);

	LmmSwaptionMarketData_PTR pLmmSwaptionMarketData=get_LmmSwaptionMarketData(config, mkt_data_file);

	config.correl_ReducedRank_= 30 ; config.correl_alpha_ = 0.000000001 ; config.correl_beta_  = 0.05;
	QuantLib::Array found_abcd = marketData_LMM_ABCD_calibration(config,pLmmSwaptionMarketData);

	config.correl_ReducedRank_= 3;
	config.use_positive_constraint_= true;

	std::vector<double> pel_time ; 
	std::vector<double> pel_libor; 

	generating_penalties_values(pel_time, pel_libor);

	const size_t penalty_matrix_size1 = pel_time.size();
	const size_t penalty_matrix_size2 = pel_libor.size();

	boost::numeric::ublas::matrix<double> quote_error_l2(penalty_matrix_size1,penalty_matrix_size2);
	boost::numeric::ublas::matrix<double> quote_error_l1(penalty_matrix_size1,penalty_matrix_size2);
	boost::numeric::ublas::matrix<double> quote_error_linf(penalty_matrix_size1,penalty_matrix_size2);

	boost::numeric::ublas::matrix<double> pel_timehomo_error_l2(penalty_matrix_size1,penalty_matrix_size2);
	boost::numeric::ublas::matrix<double> pel_timehomo_error_l1(penalty_matrix_size1,penalty_matrix_size2);
	boost::numeric::ublas::matrix<double> pel_timehomo_error_linf(penalty_matrix_size1,penalty_matrix_size2);
	boost::numeric::ublas::matrix<double> pel_liborsmoth_error_l2(penalty_matrix_size1,penalty_matrix_size2);
	boost::numeric::ublas::matrix<double> pel_liborsmoth_error_l1(penalty_matrix_size1,penalty_matrix_size2);
	boost::numeric::ublas::matrix<double> pel_liborsmoth_error_linf(penalty_matrix_size1,penalty_matrix_size2);


	for(size_t iPelTime=0;iPelTime<penalty_matrix_size1;++iPelTime)
	{
		for(size_t jPelLibor=0;jPelLibor<penalty_matrix_size2;++jPelLibor)
		{
			config.penalty_time_homogeneity_ = pel_time[iPelTime] ; 
			config.penalty_libor_            = pel_libor[jPelLibor];

			marketData_LMM_Global_gCalibration(config, pLmmSwaptionMarketData, found_abcd , create_InitCorrelation(config), GMatrixMapping_PTR() );

			quote_error_l2(iPelTime,jPelLibor)          = config.result_quote_error_l2 ;
			quote_error_l1(iPelTime,jPelLibor)          = config.result_quote_error_l1 ;
			quote_error_linf(iPelTime,jPelLibor)        = config.result_quote_error_linf ;
			pel_timehomo_error_l2(iPelTime,jPelLibor)   = config.result_pelTime_error_l2 ;
			pel_timehomo_error_l1(iPelTime,jPelLibor)   = config.result_pelTime_error_l1 ;
			pel_timehomo_error_linf(iPelTime,jPelLibor) = config.result_pelTime_error_linf ;
			pel_liborsmoth_error_l2(iPelTime,jPelLibor) = config.result_pelLibor_error_l2 ;
			pel_liborsmoth_error_l1(iPelTime,jPelLibor) = config.result_pelLibor_error_l1 ;
			pel_liborsmoth_error_linf(iPelTime,jPelLibor) = config.result_pelLibor_error_linf ;

			config.reset_result();			
		}
	}

	print_matrices_error
		(
		pel_time
		,pel_libor
		,quote_error_l2
		,quote_error_l1
		,quote_error_linf
		,pel_timehomo_error_l2
		,pel_timehomo_error_l1
		,pel_timehomo_error_linf
		,pel_liborsmoth_error_l2
		,pel_liborsmoth_error_l1
		,pel_liborsmoth_error_linf
		);
}