www.pudn.com > AdaBoost_weaklearner_1.rar > Adaboost_common.cpp


#include "stdafx.h" 
#include "AdaBoost.h" 
#include "Adaboost_common.h" 
#include "math.h" 
#include "matrix.h" 
#include  
 
#include          /* For _MAX_PATH definition */ 
#include  
#include  
#include  
#include  
#include  
#include  
 
#include  
#include  
#include  
 
#ifdef _WIN32 
using namespace std; 
#endif 
 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
using namespace std ; 
static char temstr[200]; 
typedef vector INTVECTOR; 
 
/*read the data from train documents*/ 
int read_train_file(char *trainfile, 
					long train_max_words_doc, 
					long train_max_docs, 
					long train_ll, 
					Matrix* train_matrix, 
					Matrix *train_label_matrix) 
{ 
	FILE *docfl; 
	char *line; 
    line = (char *)my_malloc(sizeof(char)*train_ll); 
	if ((docfl = fopen (trainfile, "r")) == NULL) 
	{  
		printe (trainfile);   
		return -1; 
	} 
	 
	if (com_pro.show_readfile) 
	{ 
		sprintf(temstr,"Reading examples into memory...");  
		printm(temstr); 
	}  
	train_matrix->readFile(trainfile); 
	int i=1; 
	while((!feof(docfl)) && fgets(line,(int)train_ll,docfl)) 
	{	 
		if (line[0] == '#') continue;  /* line contains comments */ 
		int len=0,train_label_end=0; 
		len = strlen(line); 
        len=len-2;			 
		if((sscanf(line+len,"%ld",&train_label_end)) == EOF) return(0); 
        //theVector.push_back(train_label_end);	 
	    double value = (double) train_label_end; 
		int one=0; 
	    train_label_matrix->set(i,one,value); 
        i++; 
	}    
	// Matrix *vm_1 = new Matrix(r,c); 
	// Matrix mv_1=(*train_label_matrix)*(*train_label_matrix); 
	fclose(docfl); 
} 
 
/*read the data from test documents*/ 
int read_test_file(char *testfile, 
				   long test_max_words_doc, 
				   long test_max_docs, 
				   long test_ll, 
				   Matrix* test_matrix, 
				   Matrix* test_label_matrix) 
{ 
	FILE *docfl; 
	char *line; 
    line = (char *)my_malloc(sizeof(char)*test_ll); 
	if ((docfl = fopen (testfile, "r")) == NULL) 
	{  
		printe (testfile);   
		return -1; 
	}	 
	if (com_pro.show_readfile) 
	{ 
		sprintf(temstr,"Reading examples into memory...");  
		printm(temstr); 
	}  
    // Load test matrix from train file 
	test_matrix->readFile(testfile); 
	int i=1; 
	while((!feof(docfl)) && fgets(line,(int)test_ll,docfl)) 
	{	 
		if (line[0] == '#') continue;  /* line contains comments */ 
		int len=0,test_label_end=0; 
		len = strlen(line); 
        len=len-2;			 
		if((sscanf(line+len,"%ld",&test_label_end)) == EOF) return(0); 
	    double value = (double) test_label_end; 
		int one=0; 
	    test_label_matrix->set(i,one,value); 
        i++; 
	} 
	fclose(docfl);	 
} 
 
/*************************************************************************************/ 
/* function boosted=adaBoost(train,train_label,cycles)                               */ 
/*  disp('running adaBoost algorithm');                                              */ 
/*  d=size(train);                                                                   */ 
/*	distribution=ones(1,d(1))/d(1);                                                  */ 
/*	error=zeros(1,cycles);                                                           */ 
/*	beta=zeros(1,cycles);                                                            */ 
/*	label=(train_label(:)>=5);% contain the correct label per vector                 */ 
/*	for j=1:cycles                                                                   */ 
/*        if(mod(j,10)==0)                                                           */ 
/*            disp([j,cycles]);                                                      */ 
/*        end                                                                        */ 
/*	  [i,t]=weakLearner(distribution,train,label);                                   */ 
/*    error(j)=distribution*abs(label-(train(:,i)>=t));                              */ 
/*    beta(j)=error(j)/(1-error(j));                                                 */ 
/*    boosted(j,:)=[beta(j),i,t];                                                    */ 
/*    distribution=distribution.* exp(log(beta(j))*(1-abs(label-(train(:,i)>=t))))'; */ 
/*    distribution=distribution/sum(distribution);                                   */ 
/* end                                                                               */ 
/*************************************************************************************/ 
int adaBoost(Matrix* train,  
			 Matrix* train_label, 
			 long train_max_words_doc, 
			 long train_max_docs, 
			 int step, 
			 int cycles, 
			 Matrix* boost, 
			 Matrix* iii, 
			 Matrix* ttt, 
			 double ave_delta) 
{ 
    int r_train=train_max_docs+1;  
    int c_train=train_max_words_doc; 
	int value_one = 1; 
	int value_1000 = 1000; 
	int cycles_num=0; 
	Matrix* scalar_minus_error = new Matrix(value_one+1,step); 
 
	if (step < 100){ 
		cycles_num=step; 
	} 
 
	if (step >= 100){ 
		cycles_num=100; 
	} 
 
	if (step < 100){ 
		step=r_train; 
	} 
    Matrix* distribution= new Matrix(value_one+1,step);	 
    distribution->ones(value_one+1,step,value_one,step); 
	Matrix* error= new Matrix(value_one+1,cycles);	 
    error->zeros(value_one+1,cycles); 
	Matrix* beta= new Matrix(value_one+1,cycles);	 
    beta->zeros(value_one+1,cycles); 
 
	// temprary Matrix 
	Matrix* train_error_part = new Matrix(step,value_one+1); 
	Matrix* error_label_train = new Matrix(step,value_one+1); 
	Matrix* error_abs_label_train = new Matrix(step,value_one+1); 
	Matrix* train_error_part_1 = new Matrix(step,value_one+1); 
	Matrix* error_label_train_1 = new Matrix(step,value_one+1); 
	Matrix* error_abs_label_train_1 = new Matrix(step,value_one+1); 
	Matrix* scalar_minus_error_1 = new Matrix(step,value_one+1); 
	Matrix* val_beta = new Matrix(value_one+1,value_one+1); 
	Matrix* beta_label_train = new Matrix(step,value_one+1); 
	Matrix* expMatrix = new Matrix(step,value_one+1); 
	Matrix* transposeExpMatrix = new Matrix(value_one+1,step); 
	Matrix* sumMatrix = new Matrix(value_one+1,step); 
	Matrix* i_all = new Matrix(step,value_one); 
	Matrix* t_all = new Matrix(step,value_one); 
 
    double Array_boost[100]; 
	double Array_ttt[100]; 
	double Array_iii[100]; 
	Matrix* getArrayiii = new Matrix(cycles,value_one); 
    Matrix* getArrayttt = new Matrix(cycles,value_one); 
	Matrix* getArrayboost = new Matrix(cycles,value_one); 
 
    // label_matrix are contain the correct label per vector 
    Matrix label_matrix = (*train_label)>3; 
 
    if (com_pro.show_action) 
		printm("running adaBoost algorithm"); 
	for (int j=1; j <= cycles_num; j++) 
	{ 
		if ((j % 10) == 0)  
		{ 
			if (com_pro.show_compute_1) 
			{ 
              sprintf(temstr,"%d %d\n",j,cycles); 
              printm(temstr); 
			} 
		} 
        /************************************************/ 
		/* [i,t]=weakLearner(distribution,train,label); */ 
        /************************************************/ 
		int i,t; 
        weakLearner(distribution,train,i_all,t_all,label_matrix,train_max_words_doc,train_max_docs,step, &i, &t,cycles,j,ave_delta); 
		/*if (com_pro.show_compute_1) 
		{ 
        sprintf(temstr,"i: %.d\n",i); 
        printm(temstr); 
		}  
		if (com_pro.show_compute_1) 
		{ 
        sprintf(temstr,"t: %.d\n",t); 
        printm(temstr); 
		}*/ 
		/*****************************************************/ 
		/* error(j)=distribution*abs(label-(train(:,i)>=t)); */ 
		/*****************************************************/ 
		// train(:,i)>=t)	 
		train_error_part->specificPartOfMatrix(*train,step,i); 
		Matrix train_error = (*train_error_part)>t; 
		 
        // (label-(train(:,i)>=t)) 
        //Matrix error_label_train = (label_matrix)-(train_error); 
		error_label_train->matrixMinusMatrix(train_error,label_matrix); 
		// abs(label-(train(:,i)>=t)) 
		error_abs_label_train->matrixAbs(*error_label_train); 
		 
		// distribution*abs(label-(train(:,i)>=t)) 
        Matrix error_tmp = (*distribution)*(*error_abs_label_train); 
		 
		//error(j)=distribution*abs(label-(train(:,i)>=t)); 
		error->copy(j-1,error_tmp); 
 
        /**********************************/ 
		/* beta(j)=error(j)/(1-error(j)); */ 
		/**********************************/ 
		double k = 1; 
		scalar_minus_error->ScalarMinusMatrix(k,*error); 
        Matrix beta = (*error) / (*scalar_minus_error);  
         
		/*******************************/ 
		/* boosted(j,:)=[beta(j),i,t]; */ 
		/*******************************/ 
         boost->copyToMatrix(j,beta); 
		 iii->setValue(j,i); 
		 ttt->setValue(j,t); 
		 
         getArrayboost->matrixToArray(Array_boost,*boost); 
		 getArrayiii->matrixToArray(Array_iii,*iii); 
         getArrayttt->matrixToArray(Array_ttt,*ttt); 
		/*********************************************************************************/ 
        /* distribution=distribution.* exp(log(beta(j))*(1-abs(label-(train(:,i)>=t))))' */ 
        /*********************************************************************************/ 
		// (train(:,i)>=t) 
		train_error_part_1->specificPartOfMatrix(*train,step,i); 
		Matrix train_error_1 = (*train_error_part_1)>t;   
			 
		// (label-(train(:,i)>=t)) 
        //Matrix error_label_train_1 = (label_matrix)-(train_error_1); 
		error_label_train_1->matrixMinusMatrix(train_error_1,label_matrix); 
		// abs(label-(train(:,i)>=t)) 
		error_abs_label_train_1->matrixAbs(*error_label_train_1); 
 
		// (1-abs(label-(train(:,i)>=t)))) 
		scalar_minus_error_1->ScalarMinusMatrix(k,*error_abs_label_train_1); 
		 
		// log(beta(j)) 
        double y; 
		double val; 
        val_beta->getValue(j,&val,beta); 
        y = log(val); 
		 
		// log(beta(j)) * (1-abs(label-(train(:,i)>=t)))) 
		beta_label_train->ScalarMultiMatrix(y,*scalar_minus_error_1); 
         
		// exp(log(beta(j))*(1-abs(label-(train(:,i)>=t))))' 
		/* 
		int cycles_num=0; 
		if (step < 100){ 
			cycles_num=20; 
		} 
		if (step >= 100){ 
			cycles_num=100; 
		} 
		*/ 
		expMatrix->matrixExp(*beta_label_train); 
		transposeExpMatrix->matrixTranspose(step,value_one,*expMatrix); 
		 
		// distribution=distribution.* exp(log(beta(j))*(1-abs(label-(train(:,i)>=t))))'; 
		distribution->MatrixMultiMatrix(*distribution,*transposeExpMatrix); 
		 
		//distribution=distribution/sum(distribution); 
        double sum_distribution=0; 
		//double multi_step=0; 
		sumMatrix->matrixSumCol(&sum_distribution, *distribution);         
		distribution->matrixdDivisonScalar(sum_distribution,*distribution); 
 
        //multi_step= step / 100; 
        //distribution->MatrixMultiScalar(multi_step,*distribution); 
 
		//double distribution_value=0; 
		//Matrix *tmp = new Matrix(value_one,value_one); 
		//tmp->getValueSpecific(0,0,&distribution_value,*distribution); 
 
		/*if (com_pro.show_compute_1) 
		{ 
          sprintf(temstr,"distribution value: %f\n",distribution_value); 
          printm(temstr); 
		}*/ 
		//delete tmp; 
	} 
	// delete matrix 
    delete train_error_part; 
	delete error_label_train; 
	delete error_abs_label_train; 
	delete scalar_minus_error; 
	delete train_error_part_1; 
	delete error_label_train_1; 
	delete error_abs_label_train_1; 
	delete scalar_minus_error_1; 
	delete val_beta; 
	delete beta_label_train; 
	delete sumMatrix; 
	delete transposeExpMatrix; 
	delete expMatrix; 
	delete distribution; 
	delete error; 
	delete beta; 
	delete i_all; 
	delete t_all; 
	delete getArrayiii; 
    delete getArrayttt; 
	delete getArrayboost; 
	 
	return(0); 
} 
 
 
/******************************************************************************************/ 
/*  function [i,t] = weakLearner(distribution,train,label)                                */ 
/*	 %disp('run weakLearner');                                                            */ 
/*   for tt=1:(16*256-1)                                                                  */ 
/*        error(tt)=distribution*abs(label-(train(:,floor(tt/16)+1)>=16*(mod(tt,16)+1))); */ 
/*   end                                                                                  */ 
/*  [val,tt]=max(abs(error-0.5));                                                         */ 
/*  i=floor(tt/16)+1;                                                                     */ 
/*  t=16*(mod(tt,16)+1);                                                                  */                                                 
/******************************************************************************************/ 
int weakLearner(Matrix* distribution, 
				Matrix* train, 
				Matrix* i_all, 
				Matrix* t_all, 
				Matrix label_matrix, 
				long train_max_words_doc, 
				long train_max_docs, 
				int step, 
				int *i, 
				int *t, 
				int cycles, 
				int j, 
				double ave_delta) 
{ 
	/*if (com_pro.show_action) 
	//	printm("run weakLearner %d\n times, j"); 
	if (com_pro.show_compute_1) 
	{ 
        sprintf(temstr,"run weakLearn %.d\n times",j); 
        printm(temstr); 
	}*/ 
	int r_train=train_max_docs+1;  
    int c_train=train_max_words_doc; 
	float sqrt_c_train_tmp=sqrt(c_train); 
	int sqrt_c_train = floor(sqrt_c_train_tmp); 
    int value_one = 1; 
    int modulus_number=0; 
    int floor_number=1; 
    int sizeOfsqrt_c_train=2*sqrt_c_train*(c_train- 1); 
//    double val_error;		 
    int counter=1; 
 
	if (step < 100){ 
		step=r_train; 
	} 
    
	// New temporary matrix's 
	Matrix* error = new Matrix(value_one,sizeOfsqrt_c_train); 
	Matrix* error_max = new Matrix(value_one,sizeOfsqrt_c_train); 
	//Matrix* matrix_val_error = new Matrix(value_one,value_one); 
	Matrix* get_i_all = new Matrix(step,value_one); 
    Matrix* get_t_all = new Matrix(step,value_one); 
	Matrix* Ava_data_matrix = new Matrix(step,c_train-1); 
 
    for (int tt=0; tt < 12*(c_train - 1); tt++) 
	{ 
		Matrix* train_error_part = new Matrix(step,2); 
		Matrix* error_abs_label_train = new Matrix(step,2); 
		 
        /***********************************************************************************/ 
		/* error(tt)=distribution*abs(label-(train(:,floor(tt/16)+1)>=16*(mod(tt,16)+1))); */ 
		/***********************************************************************************/ 
		//16*(mod(tt,sqrt(c_train))+1) 
		//sqrt_c_train 
		modulus_number = 69 + (5 * (tt % 12)+1); 
		 
		//floor(tt/sqrt(c_train))+1 
		floor_number=floor(tt / 11) + 1; 
		if (step < 100) 
		{ 
		  step=r_train; 
		} 
		train_error_part->specificPartOfMatrix(*train,step,floor_number-1); 
		 
		// (train(:,floor(tt/16)+1)>=16*(mod(tt,16)+1)) 
		Matrix train_error = (*train_error_part)>modulus_number; 
		 
		// label-(train(:,floor(tt/16)+1)>=16*(mod(tt,16)+1)) 
		Matrix error_label_train = (label_matrix)-(train_error); 
		 
		// abs(label-(train(:,floor(tt/16)+1)>=16*(mod(tt,16)+1))) 
		error_abs_label_train->matrixAbs(error_label_train); 
		 
		//error(tt)=distribution*abs(label-(train(:,floor(tt/16)+1)>=16*(mod(tt,16)+1)));  
		Matrix error_tmp = (*distribution)*(*error_abs_label_train); 
		error->copy(tt,error_tmp); 
		//free matrix 
		delete train_error_part; 
		delete error_abs_label_train; 
	} 
    //double error_train_array[432]; 
    //Matrix* getArrayTrain_error = new Matrix(432,value_one); 
    //getArrayTrain_error->matrixToArrayold(error_train_array,*error); 
	//matrix_val_error->getValueSpecific(0,0,&val_error,*error); 
	 
	//[val,tt]=max(abs(error-0.5));    
    double val=0; 
	int index=0; 
	double parameter_05 = 0.5; 
	Matrix* errorMinusScalar = new Matrix(value_one,sizeOfsqrt_c_train); 
	errorMinusScalar->matrixMinusSclar(parameter_05,*error); 
	Matrix* errorAbsMinusScalar = new Matrix(value_one,sizeOfsqrt_c_train); 
	errorAbsMinusScalar->matrixAbs(*errorMinusScalar); 
	error_max->matrixMax(&val,&index,*errorAbsMinusScalar); 
    /************************/ 
	/* i=floor(tt/16)+1;    */ 
	/* t=16*(mod(tt,16)+1); */ 
	/************************/ 
	if (index > 400 && index < 500 ){ 
      (*i) = floor(index/17)+1; 
	  if (*i >= (c_train-1)){ 
		  *i = (c_train-10); 
	  } 
	  (*t) = 12 * ((index % 12) + 1); 
	} 
	if (index > 300 && index < 400 ){ 
      (*i) = floor(index/12)+1; 
	  if (*i >= (c_train-1)){ 
		  *i = (c_train-10); 
	  } 
      (*t) = 12 * ((index % 12) + 1); 
	} 
    if (index > 200 && index < 300){ 
      (*i) = floor(index/7)+1; 
	  if (*i >= (c_train-1)){ 
		  *i = (c_train-10); 
	  } 
	  (*t) = 12 * ((index % 12) + 1); 
	} 
	if (index > 100 && index < 200){ 
      (*i) = floor(index/5)+1; 
	  if (*i >= (c_train-1)){ 
		  *i = (c_train-10); 
	  } 
	   (*t) = 12 * ((index % 12) + 1); 
	} 
    if (index > 0 && index < 100){ 
      (*i) = floor(index/2)+1; 
	  if (*i >= (c_train-1)){ 
		  *i = (c_train-10); 
	  } 
	  (*t) = 12 * ((index % 12) + 1); 
	} 
    i_all->setValue(j,*i); 
	if (j > 2) 
	{ 
	   get_i_all->matrixCompareAndSet(i,c_train,*i_all); 
	} 
     
    t_all->setValue(j,*t); 
	if (j > 1) 
	{ 
	   get_t_all->matrixCompareAndSetfor_t(j,t,c_train,*t_all); 
	}  
 
	(*t) = (*t) + ave_delta; 
 
	delete error_max; 
	delete error; 
	delete Ava_data_matrix; 
	delete errorMinusScalar; 
	delete errorAbsMinusScalar; 
	delete get_i_all; 
	delete get_t_all; 
 
	return (0); 
} 
 
/*************************************************************************************/ 
/* function [errorTrain,errorTest]=getError(boost,train,train_label,test,test_label) */ 
/*  disp('run getError');                                                            */ 
/*  d=size(boost);                                                                   */ 
/*  num=size(train);                                                                 */ 
/*  prediction=zeros(num(1),1);                                                      */ 
/*   % geting the train error                                                        */ 
/*  for h=1:d(1)                                                                     */ 
/*       prediction=prediction-log(boost(h,1))*(train(:,boost(h,2))>=boost(h,3));    */ 
/*  end                                                                              */ 
/*  temp=-sum(log(boost(:,1)))/2;                                                    */ 
/*  errorTrain=sum(abs((train_label>=5)-(prediction>=temp)))/num(1);                 */ 
/*    prediction=zeros(1000,1);                                                      */ 
/*    % geting the test error                                                        */ 
/*    for h=1:d(1)                                                                   */ 
/*        prediction=prediction-log(boost(h,1))*(test(:,boost(h,2))>=boost(h,3));    */ 
/*    end                                                                            */ 
/*    errorTest=sum(abs((test_label>=5)-(prediction>=temp)))/1000;                   */ 
/*************************************************************************************/ 
int getError(Matrix* boost, 
			 Matrix* iii, 
			 Matrix* ttt, 
			 Matrix* train_matrix, 
			 Matrix* train_label_matrix, 
			 Matrix* test_matrix, 
			 Matrix* test_label_matrix, 
			 Matrix* errorTrain, 
			 Matrix* errorTest, 
			 long train_max_words_doc, 
			 long train_max_docs, 
			 int step, 
			 int cycles) 
{ 
	if (com_pro.show_action) 
		printm("run getError"); 
	double value_one = 1; 
	double value_two = 2; 
	// d=size(boost); 
	int boost_row; 
	int boost_col; 
	Matrix* size = new Matrix(step,step); 
	size->matrixSize(&boost_row,&boost_col,*boost); 
	 
	// num=size(train_matrix); 
	int train_row; 
	int train_col; 
	size->matrixSize(&train_row,&train_col,*train_matrix); 
	 
    // num=size(test_matrix); 
	int test_row; 
	int test_col; 
	size->matrixSize(&test_row,&test_col,*test_matrix);  
	if (step < 100){ 
		step=train_row; 
	} 
	// prediction=zeros(num(1),1); 
	Matrix* prediction_train = new Matrix(step,value_one+1); 
    delete(size); 
	// geting the train error 
	/*****************************************************************************/ 
	/* for h=1:d(1)                                                              */ 
	/*   prediction=prediction-log(boost(h,1))*(train(:,boost(h,2))>=boost(h,3)) */ 
    /* end                                                                       */ 
	/*****************************************************************************/ 
	//for (int h=1; h <= boost_row; h++){ 
    for (int h=1; h < boost_row; h++){ 
		//boost(h,3) 
		double val_ttt=0;	   
		Matrix* matrix_val_ttt = new Matrix(h,value_one); 
		matrix_val_ttt->getValueSpecific(h-1,0,&val_ttt,*ttt); 
		 
		// boost(h,2) 
		double val_iii=0; 
		matrix_val_ttt->getValueSpecific(h-1,0,&val_iii,*iii); 
		 
		// train(:,boost(h,2)) 
		Matrix* partOfTrainMatrix = new Matrix(step,val_iii); 
		partOfTrainMatrix->specificPartOfMatrix(*train_matrix,step,val_iii); 
		 
		// (train(:,boost(h,2))>=boost(h,3)) 
		Matrix train_error_boost = (*partOfTrainMatrix) > val_ttt;   
		 
		// (boost(h,1)) 
		double val_boost=0; 
		matrix_val_ttt->getValueSpecific(h-1,0,&val_boost,*boost); 
		 
		// log(boost(h,1)) 
		double log_val_boost = log(val_boost); 
		 
		// log(boost(h,1))*(train(:,boost(h,2))>=boost(h,3)) 
		Matrix* boostMultiTrain = new Matrix(step, value_one+1); 
		boostMultiTrain->ScalarMultiMatrix(log_val_boost,train_error_boost); 
		 
		// prediction-log(boost(h,1))*(train(:,boost(h,2))>=boost(h,3))	 
		prediction_train->matrixMinusMatrix(*boostMultiTrain,*prediction_train); 
		//prediction_train->matrixMinusMatrix(*prediction_train,*boostMultiTrain); 
 
		//free matrix 
		delete matrix_val_ttt; 
		delete partOfTrainMatrix; 
		delete boostMultiTrain; 
	} 
//	double prediction_array[500]; 
//	Matrix* getPredictionArray = new Matrix(step,value_one); 
//	getPredictionArray->matrixToArray(prediction_array,*prediction_train); 
	/*********************************/ 
	/* temp=-sum(log(boost(:,1)))/2; */ 
	/*********************************/ 
	// log(boost(:,1)) 
	Matrix* log_boost = new Matrix(boost_row,boost_col); 
	log_boost->matrixLog(*boost); 
	// sum(log(boost(:,1))) 
	double sum_log_boost = 0; 
	Matrix* sum_log_boost_matrix = new Matrix(boost_row,boost_col); 
	sum_log_boost_matrix->matrixSumRow(&sum_log_boost,*log_boost); 
	double temp = 0; 
	temp = -1 * (sum_log_boost/2); 
	//temp = -1*(sum_log_boost/5); 
	/********************************************************************/ 
	/* errorTrain=sum(abs((train_label>=5)-(prediction>=temp)))/num(1); */ 
	/********************************************************************/ 
	// (prediction>=temp) 
	Matrix prediction_biger_temp = (*prediction_train) > temp;   
 
	// (train_label>=5) 
	Matrix *train_label = new Matrix(step,boost_col+1); 
	train_label->partOfMatrix(step,boost_col,*train_label_matrix); 
	Matrix train_label_biger_value = (*train_label) > 3;  
 
	// ((train_label>=5)-(prediction>=temp)) 
	Matrix* train_label_minus_prediction = new Matrix(step,boost_col+1); 
	train_label_minus_prediction->matrixMinusMatrix(prediction_biger_temp,train_label_biger_value); 
 
	// abs((train_label>=5)-(prediction>=temp)) 
	Matrix* abs_train_label_minus_prediction = new Matrix(step,boost_col+1); 
	abs_train_label_minus_prediction->matrixAbs(*train_label_minus_prediction); 
	 
	// sum(abs((train_label>=5)-(prediction>=temp))) 
	double sum_abs_train_label_minus_prediction = 0; 
	Matrix* sum_abs_train_label_minus_prediction_matrix = new Matrix(step,boost_col+1); 
	sum_abs_train_label_minus_prediction_matrix->matrixSumRow(&sum_abs_train_label_minus_prediction,*abs_train_label_minus_prediction); 
	 
	 
	// errorTrain=sum(abs((train_label>=5)-(prediction>=temp)))/num(1) 
	errorTrain->scalarDivisonScalar(sum_abs_train_label_minus_prediction,step, *errorTrain); 
	prediction_train->zeros(step,value_one); 
	/*****************************/ 
	/* prediction=zeros(1000,1); */ 
	/*****************************/ 
    Matrix* prediction_test = new Matrix(step,value_one+1); 
	if (step < 100){ 
		step=test_row; 
	} 
    // geting the test error 
	/******************************************************************************/ 
    /* for h=1:d(1)																  */ 
    /*    prediction=prediction-log(boost(h,1))*(test(:,boost(h,2))>=boost(h,3)); */ 
    /* end                                                                        */ 
	/******************************************************************************/ 
    for (int hh=1; hh < boost_row; hh++){ 
		//boost(h,3) 
		// test(:,boost(h,2)) 
		double val_ttt=0;	   
		Matrix* matrix_val_ttt = new Matrix(hh,value_one); 
		matrix_val_ttt->getValueSpecific(hh-1,0,&val_ttt,*ttt); 
		 
		// boost(h,2) 
		double val_iii=0; 
		matrix_val_ttt->getValueSpecific(hh-1,0,&val_iii,*iii); 
 
		Matrix* partOfTestMatrix = new Matrix(step,val_iii); 
		partOfTestMatrix->specificPartOfMatrix(*test_matrix,step,val_iii); 
		 
		// (test(:,boost(h,2))>=boost(h,3)) 
		Matrix test_error_boost = (*partOfTestMatrix) > val_ttt;   
		 
		// (boost(h,1)) 
		double val_boost=0; 
		matrix_val_ttt->getValueSpecific(hh-1,0,&val_boost,*boost); 
		 
		// log(boost(h,1)) 
		double log_val_boost = log(val_boost); 
		 
		// log(boost(h,1))*(train(:,boost(h,2))>=boost(h,3)) 
		Matrix* boostMultiTest = new Matrix(step,value_one+1); 
		boostMultiTest->ScalarMultiMatrix(log_val_boost,test_error_boost); 
		 
		// prediction-log(boost(h,1))*(train(:,boost(h,2))>=boost(h,3)) 
		prediction_test->matrixMinusMatrix(*boostMultiTest,*prediction_test); 
		//prediction_test->matrixMinusMatrix(*prediction_test,*boostMultiTest); 
		delete matrix_val_ttt; 
		delete partOfTestMatrix; 
		delete boostMultiTest; 
	} 
	//double predictionTest_array[500]; 
	//Matrix* getPredictionTestArray = new Matrix(step,value_one); 
	//getPredictionTestArray->matrixToArray(predictionTest_array,*prediction_test);	 
	/****************************************************************/ 
    /* errorTest=sum(abs((test_label>=5)-(prediction>=temp)))/1000; */ 
	/****************************************************************/ 
    // (prediction>=temp) 
	Matrix prediction_biger_temp_test = (*prediction_test) > temp;   
	 
	// (train_label>=5) 
	Matrix *test_label = new Matrix(step,boost_col+1); 
	test_label->partOfMatrix(step,boost_col,*test_label_matrix); 
	Matrix test_label_biger_value = (*test_label) > 3;  
	 
	// ((train_label>=5)-(prediction>=temp)) 
	Matrix* test_label_minus_prediction = new Matrix(step,boost_col+1); 
	test_label_minus_prediction->matrixMinusMatrix(prediction_biger_temp_test,test_label_biger_value); 
	 
	// abs((train_label>=5)-(prediction>=temp)) 
	Matrix* abs_test_label_minus_prediction = new Matrix(step,boost_col+1); 
	abs_test_label_minus_prediction->matrixAbs(*test_label_minus_prediction); 
	 
	// sum(abs((train_label>=5)-(prediction>=temp))) 
	double sum_abs_test_label_minus_prediction = 0; 
	Matrix* sum_abs_test_label_minus_prediction_matrix = new Matrix(step,boost_col+1); 
	sum_abs_test_label_minus_prediction_matrix->matrixSumRow(&sum_abs_test_label_minus_prediction,*abs_test_label_minus_prediction); 
	 
	 
	// errorTrain=sum(abs((train_label>=5)-(prediction>=temp)))/num(1) 
	errorTest->scalarDivisonScalar(sum_abs_test_label_minus_prediction,test_row, *errorTest); 
	prediction_test->zeros(step,value_one); 
	//delete Matrix 
	delete prediction_train; 
    delete prediction_test; 
	delete train_label; 
	delete test_label; 
	delete log_boost; 
	delete sum_log_boost_matrix; 
	delete train_label_minus_prediction; 
	delete test_label_minus_prediction; 
	delete abs_train_label_minus_prediction; 
	delete abs_test_label_minus_prediction; 
	delete sum_abs_train_label_minus_prediction_matrix; 
	delete sum_abs_test_label_minus_prediction_matrix; 
	 
	return (0); 
} 
 
 
/* grep through file and count number of lines, maximum number of spaces per line, and */  
/* longest line. */ 
int nol_ll(char *file,long *nol,long *wol,long *ll)  
{ 
	FILE *fl; 
	int ic; 
	char c; 
	long current_length,current_wol; 
	 
	if ((fl = fopen (file, "r")) == NULL) 
	{  
		printe (file);    
		return -1; 
	} 
	current_length=0; 
	current_wol=0; 
	(*ll)=0; 
	(*nol)=1; 
	(*wol)=0; 
	while((ic=getc(fl)) != EOF)  
	{ 
		c=(char)ic; 
		current_length++; 
		if(c == ' ')  
		{ 
			current_wol++; 
		} 
		if(c == '\n')  
		{ 
			(*nol)++; 
			if(current_length>(*ll))  
			{ 
				(*ll)=current_length; 
			} 
			if(current_wol>(*wol))  
			{ 
				(*wol)=current_wol; 
			} 
			current_length=0; 
			current_wol=0; 
		} 
	} 
	fclose(fl); 
} 
 
long get_runtime()  
{ 
	clock_t start; 
	start = clock(); 
	return((long)((double)start*100.0/(double)CLOCKS_PER_SEC)); 
} 
 
 
int isnan(double a) 
{ 
	return(_isnan(a)); 
} 
 
void * my_malloc(long size)  
{ 
	void *ptr; 
	ptr=(void *)malloc(size); 
	if(!ptr) 
	{  
		printe ("Out of memory!");  
		return (NULL); 
	} 
	return(ptr); 
} 
//print error on screen 
 
void printe(char* str) 
{ 
	char err[200]="--error--"; 
	strcat(err,str); 
	theApp.ShowM(err); 
} 
 
//print message on screen 
void printm(char* str) 
{ 
	theApp.ShowM(str); 
} 
 
void  SetInitParam() 
{ 
		com_param.biased_Hyperplane=1; 
		com_param.remove_inconsitant=0; 
		com_param.C                =0.0; 
		com_param.cost_factor      =1.0; 
		com_param.loo              =0; 
		com_param.search_depth     = 0; 
		com_param.rho           = 	1.0; 
		com_param.fraction        =1.0; 
		com_param.rbf_gamma        =1.0; 
		com_param.poly_c           =0.0; 
		com_param.poly_s           =1.0; 
		com_param.poly_degree      =1; 
		com_param.kernel_type      =0; 
		//com_param.user_u   =            pp4.m_strU  ;                             
		com_param.epsion           =0.001; 
		com_param.iteration_time   =100; 
		com_param.cache_size       =40; 
		com_param.new_variable     =com_param.maximum_size; 
		com_param.maximum_size     =10; 
		com_param.final_test       = 1; 
 
		com_param.blAadaboostresults=TRUE; 
		com_param.Running=FALSE; 
		com_param.Finished=TRUE; 
		com_param.Close=FALSE; 
 
 
		//prompt default values 
		com_pro.show_action=TRUE; 
		com_pro.show_compute_1=TRUE; 
		com_pro.show_compute_2=FALSE; 
		com_pro.show_compute_3=FALSE; 
		com_pro.show_other=FALSE; 
		com_pro.show_readfile=FALSE; 
		com_pro.show_writefile=FALSE; 
		com_pro.show_testresult=TRUE; 
		com_pro.show_trainresult=FALSE; 
} 
 
 
/******************** tmp code ****************************/ 
 
	/*if (com_pro.show_compute_1) 
	{ 
        sprintf(temstr,"index: %.d\n",index); 
        printm(temstr); 
	} 
 
	//i=floor(tt/16)+1; 
	if (index > 400 && index < 500 ){ 
      (*i) = floor(index/17)+1; 
	  if (*i == (c_train-1)){ 
		  *i = (c_train-10); 
	  } 
	} 
	if (index > 300 && index < 400 ){ 
      (*i) = floor(index/12)+1; 
	  if (*i == (c_train-1)){ 
		  *i = (c_train-10); 
	  } 
	} 
    if (index > 200 && index < 300){ 
      (*i) = floor(index/7)+1; 
	  if (*i == (c_train-1)){ 
		  *i = (c_train-10); 
	  } 
	} 
	if (index > 100 && index < 200){ 
      (*i) = floor(index/5)+1; 
	  if (*i == (c_train-1)){ 
		  *i = (c_train-10); 
	  } 
	} 
    if (index > 0 && index < 100){ 
      (*i) = floor(index/2)+1; 
	  if (*i == (c_train-1)){ 
		  *i = (c_train-10); 
	  } 
	} 
 
	//Matrix* i_all = new Matrix(cycles,value_one); 
    i_all->setValue(j,*i); 
	if (j > 2) 
	{ 
	   get_i_all->matrixCompareAndSet(i,c_train,*i_all); 
	} 
     
    // Get the avarage of thr data 
    double Sum_ava_data=0; 
	Ava_data_matrix->matrixSumCol(&Sum_ava_data, *train);  
	(*t) = Sum_ava_data / (step * (c_train-2)); 
//	if (step >= 300){ 
//		(*t) = (*t) + 15; 
//	} 
 
 
	/* 
	//t=16*(mod(tt,16)+1); 
    //(*t) = sqrt_c_train * ((index % 16) + 1); 
	(*t) = 9 * ((index % 13) + 1); 
	t_all->setValue(j,*t); 
	if (j > 1) 
	{ 
	   get_t_all->matrixCompareAndSetfor_t(j,t,c_train,*t_all); 
	} */ 
	/* 
	//(*i) = index; 
	// t=16*(mod(tt,4)+1); 
	int i_rand_tmp; 
    //int i_rand; 
	srand( (unsigned)time( NULL ) ); 
	i_rand_tmp=rand(); 
    if (i_rand_tmp > 100 && i_rand_tmp < 1000){ 
    	//i_rand=floor(i_rand_tmp/100)+1; 
		(*t)=floor(i_rand_tmp/10)+50; 
		if (*t < 75) { 
			(*t)=floor(i_rand_tmp/10)+70; 
		} 
	} 
	if (i_rand_tmp > 1000 && i_rand_tmp < 10000){ 
    	//i_rand=floor(i_rand_tmp/100)+1; 
		(*t)=floor(i_rand_tmp/100)+60; 
		if (*t > 105) { 
			(*t)=floor(i_rand_tmp/1000)+70; 
		} 
		if (*t < 75) { 
			(*t)=floor(i_rand_tmp/100)+70; 
		} 
	} 
    if (i_rand_tmp > 10000 && i_rand_tmp < 100000){ 
    	//i_rand=floor(i_rand_tmp/1000)+100; 
		(*t)=floor(i_rand_tmp/1000)+80; 
		if (*t > 105) { 
			(*t)=floor(i_rand_tmp/1000)+70; 
		} 
	}  
    if (*t < 75 ){ 
		(*t) = (*t) + 10; 
	} 
	if (*t > 110) { 
		(*t)=(*t) - 10; 
	} 
 
	t_all->setValue(j,*t); 
	if (j > 1) 
	{ 
	   get_t_all->matrixCompareAndSetfor_t(j,t,c_train,*t_all); 
	} 
	(*t)=120; 
	*/ 
	//(*t) = 3 * sqrt_c_train * ((index % sqrt_c_train) + 1); 
 
//double error_train_array[443]; 
	//Matrix* getArrayTrain_error = new Matrix(443,value_one); 
	//getArrayTrain_error->matrixToArrayold(error_train_array,*errorAbsMinusScalar); 
			  
/* 
int parse_dataset(char *line,long *train_label,long*numwords,long train_max_words_doc) 
{ 
	register long wpos,pos; 
	//long wnum; 
	//double weight; 
	 
	pos=0; 
	int len; 
    len = strlen(line); 
    len=len-2; 
	while(line[len])  
	{      // cut off comments  
		if(line[pos] == '#')  
		{ 
			line[pos]=0; 
		} 
		else  
		{ 
			pos++; 
		} 
	} 
	wpos=0; 
	if((sscanf(line,"%ld",train_label)) == EOF) return(0); 
	pos=0; 
} 
 
int read_documents(char *docfile, 
					DOC  *docs, 
					long *label, 
					long max_words_doc, 
					long ll, 
					long *totwords, 
					long *totdoc) 
{ 
	char *line; 
	DOC doc; 
	long dnum=0,wpos,i,dpos=0,dneg=0,dunlab=0; 
	long doc_label; 
	FILE *docfl; 
 
	line = (char *)my_malloc(sizeof(char)*ll); 
	if ((docfl = fopen (docfile, "r")) == NULL) 
	{  
		printe (docfile);   
		return -1; 
	} 
	 
	doc.words = (SVM_WORD *)my_malloc(sizeof(SVM_WORD)*(max_words_doc+10)); 
	if (com_pro.show_readfile) 
	{ 
		sprintf(temstr,"Reading examples into memory...");  
		printm(temstr); 
	} 
	 
	dnum=0; 
	(*totwords)=0; 
	while((!feof(docfl)) && fgets(line,(int)ll,docfl)) { 
		if(line[0] == '#') continue;  // line contains comments  
		if(!parse_document(line,&doc,&doc_label,&wpos,max_words_doc))  
		{ 
			sprintf(temstr,"Parsing error in line %ld!",dnum); 
			printm(temstr); 
		} 
		label[dnum]=doc_label; 
		if(doc_label > 0) dpos++; 
		if (doc_label < 0) dneg++; 
		if (doc_label == 0) dunlab++; 
		if((wpos>1) && ((doc.words[wpos-2]).wnum>(*totwords)))  
			(*totwords)=(doc.words[wpos-2]).wnum; 
		docs[dnum].words = (SVM_WORD *)my_malloc(sizeof(SVM_WORD)*wpos); 
		docs[dnum].docnum=dnum; 
		for(i=0;i' ') pos++; 
	char sring_weight[5]; 
	char NaN[5]="NaN"; 
	int result; 
	while((sscanf(line+pos,"%ld:%lf",&wnum,&weight)!= EOF) && (wpos' '); 
		if(wnum<=0)  
		{  
			printe ("Feature numbers must be larger or equal to 1!!!");  
			sprintf(temstr,"LINE: %s",line); 
			printm(temstr); 
			return (0); 
		  
		} 
		if((wpos>0) && ((doc->words[wpos-1]).wnum >= wnum)) 
		{  
			printe ("Features must be in increasing order!!!");  
			sprintf(temstr,"LINE: %s",line); 
			printm(temstr); 
			return (0); 
		  
		} 
		(doc->words[wpos]).wnum=wnum; 
 		(doc->words[wpos]).weight=weight;  
		wpos++; 
	 
	} 
	(doc->words[wpos]).wnum=0; 
	(*numwords)=wpos+1; 
	doc->docnum=-1; 
	//doc->twonorm_sq=sprod_ss(doc->words,doc->words); 
	return(1); 
} 
 
  double Array_train[10]; 
	double Array_test[10]; 
	Matrix* getArrayTrain = new Matrix(10,one); 
    Matrix* getArrayTest = new Matrix(10,one); 
    getArrayTrain->matrixToArrayold(Array_train,*errorTrain_acc); 
    getArrayTest->matrixToArrayold(Array_test,*errorTest_acc); 
*/