From 24dbf55d526543c2e1dbd7238b94f36bfee073ec Mon Sep 17 00:00:00 2001 From: gmravi2003 Date: Wed, 19 Dec 2007 19:35:53 +0000 Subject: [PATCH] Buggy code. Trying to incoporate the order of permutation of the regression estimates --- fastlib/u/gmravi/regression/regression.h | 145 +++++++++-------------- 1 file changed, 55 insertions(+), 90 deletions(-) diff --git a/fastlib/u/gmravi/regression/regression.h b/fastlib/u/gmravi/regression/regression.h index 896cbfa560..9312cf09c9 100644 --- a/fastlib/u/gmravi/regression/regression.h +++ b/fastlib/u/gmravi/regression/regression.h @@ -1,9 +1,8 @@ #ifndef REGRESSION_H #define REGRESSION_H -#define MAXDOUBLE 32768.0 +#include "values.h" #include "fastlib/fastlib_int.h" - template < typename TKernel > class NaiveKde{ private: @@ -23,6 +22,10 @@ template < typename TKernel > class NaiveKde{ /**Reference weights*/ Vector rset_weights_; + /** get the permutation */ + + ArrayList new_from_old_r_; + public: //getters............... @@ -32,6 +35,8 @@ template < typename TKernel > class NaiveKde{ return densities_[i][j]; } + + //Interesting functions........................... void Compute (){ @@ -49,7 +54,7 @@ template < typename TKernel > class NaiveKde{ const double *r_col = rset_.GetColumnPtr (r); double dsqd =la::DistanceSqEuclidean (qset_.n_rows (), q_col, r_col); double val = kernel_.EvalUnnormOnSq (dsqd); - val *= rset_weights_[r]; + val *= rset_weights_[new_from_old_r_[r]]; densities_[q][d] += val; } else{ @@ -58,7 +63,7 @@ template < typename TKernel > class NaiveKde{ double dsqd = la::DistanceSqEuclidean (qset_.n_rows (), q_col, r_col); double val = kernel_.EvalUnnormOnSq (dsqd); - val *= rset_weights_[r]; + val *= rset_weights_[new_from_old_r_[r]]; val *= rset_.get (d - 1, r); densities_[q][d] += val; } @@ -68,17 +73,7 @@ template < typename TKernel > class NaiveKde{ fx_timer_stop(NULL,"naive_kde"); //Density estimates from naive calculations..... - /*for(int i=0;i class NaiveKde{ } } - void Init (Matrix & qset, Matrix & rset){ + void Init (Matrix & qset, Matrix & rset, ArrayList &new_from_old_r){ // get datasets qset_.Alias (qset); rset_.Alias (rset); + //get permutation + new_from_old_r_.Copy(new_from_old_r); + // get bandwidth kernel_.Init (fx_param_double_req (NULL, "bandwidth")); @@ -157,7 +155,6 @@ template < typename TKernel > class NaiveKde{ void ComputeMaximumRelativeError (ArrayList < Vector > density_estimate) { - //printf ("Came to compute maximum relative error...\n"); double max_rel_err = 0; for (index_t q = 0; q < qset_.n_cols (); q++){ for (index_t d = 0; d < rset_.n_rows () + 1; d++){ @@ -300,6 +297,11 @@ template < typename TKernel > class FastKde{ /**Number of base case operations*/ int fast_kde_base; + + + /**The mapping array for the reference file**/ + ArrayList new_from_old_r_; + // preprocessing: scaling the dataset; this has to be moved to the dataset // module @@ -331,8 +333,6 @@ template < typename TKernel > class FastKde{ double max_coord = max (qset_range.hi, rset_range.hi); double width = max_coord - min_coord; -//printf ("Dimension %d range: [%g, %g]\n", i, min_coord, max_coord); - for (index_t j = 0; j < rset_.n_cols (); j++){ rset_.set (i, j, (rset_.get (i, j) - min_coord) / width); } @@ -365,6 +365,7 @@ template < typename TKernel > class FastKde{ node->stat ().owed_l[i] = 0; node->stat ().owed_u[i] = 0; } + //Base CAse..... if (node->is_leaf ()){ @@ -380,24 +381,20 @@ template < typename TKernel > class FastKde{ for (int j = node->begin (); j < node->end (); j++){ //looping over all points if (i != 0){ node->stat ().weight_of_dimension[i] += - rset_.get (i - 1, j) * rset_weights_[j]; + rset_.get (i - 1, j) * rset_weights_[new_from_old_r_[j]]; } else{ - node->stat ().weight_of_dimension[i] += rset_weights_[j]; + node->stat ().weight_of_dimension[i] += rset_weights_[new_from_old_r_[j]]; } } } -/*printf ("THE WEIGHT VECTOR I WILL BE RETURNING IS ...\n"); - for (int i = 0; i < rset_.n_rows () + 1; i++){ - printf ("weight is %f\n", node->stat ().weight_of_dimension[i]); - }*/ } // for non-leaf node, recurse else{ - //printf ("This is not a leaf node...\n"); + PreProcess (node->left ()); PreProcess (node->right ()); @@ -431,7 +428,7 @@ template < typename TKernel > class FastKde{ if (qnode->is_leaf ()){ for (int t = 0; t < rset_.n_rows () + 1; t++){ - qstat.more_l[t] += dl[t]; //Why are we doing this. Why dowe maintain a field called qstat.more_l_ for a leaf node + qstat.more_l[t] += dl[t]; qstat.more_u[t] += du[t]; } } @@ -457,21 +454,16 @@ template < typename TKernel > class FastKde{ /** exhaustive base KDE case */ void FKdeBase (Tree * qnode, Tree * rnode){ -//printf ("In FKdeBase ...\n"); - - fast_kde_base++; -//printf("with this fast_kde_base is %d\n",fast_kde_base); //subtract because now you are doing exhaustive computation for(index_t d=0;dstat().more_u[d]); + qnode->stat().more_u[d]-=rnode->stat().weight_of_dimension[d]; -// printf("After subtraction i have more_u is %f\n",qnode->stat().more_u[d]); } // compute unnormalized sum - for (index_t q = qnode->begin (); q < qnode->end (); q++){ + for (index_t q = qnode->begin (); q < qnode->end (); q++){ //for each query node // get query point const double *q_col = qset_.GetColumnPtr (q); @@ -488,13 +480,13 @@ template < typename TKernel > class FastKde{ double ker_value = kernel_.EvalUnnormOnSq (dsqd); if (i != 0){ densities_l_[q][i] += - ker_value * rset_weights_[r] * rset_.get (i - 1, r); + ker_value * rset_weights_[new_from_old_r_[r]] * rset_.get (i - 1, r); densities_u_[q][i] += - ker_value * rset_weights_[r] * rset_.get (i - 1, r); + ker_value * rset_weights_[new_from_old_r_[r]] * rset_.get (i - 1, r); } else{ - densities_l_[q][i] += ker_value * rset_weights_[r]; - densities_u_[q][i] += ker_value * rset_weights_[r]; + densities_l_[q][i] += ker_value * rset_weights_[new_from_old_r_[r]]; + densities_u_[q][i] += ker_value * rset_weights_[new_from_old_r_[r]]; } } @@ -502,8 +494,7 @@ template < typename TKernel > class FastKde{ } // get a tighter lower and upper bound for every dimension by looping over each query point - // in the current query leaf node - + Vector min_l; min_l.Init (rset_.n_rows () + 1); @@ -544,8 +535,6 @@ template < typename TKernel > class FastKde{ // query node stat KdeStat & stat = qnode->stat (); - // printf("The error tolerance is %f\n",tau_); - // try pruning after bound refinement: first compute distance/kernel // value bounds @@ -637,15 +626,15 @@ template < typename TKernel > class FastKde{ left_stat = &(qnode->left ()->stat ()); right_stat = &(qnode->right ()->stat ()); - // stat.MergeChildBounds (*left_stat, *right_stat, rset_.n_rows()+ 1); //I think this should not be here - } // try finite difference pruning first + if (Prunable (qnode, rnode, dsqd_range, kernel_value_range, dl, du)){ UpdateBounds (qnode, dl, du); return; } + } //Pruning failed........ @@ -677,8 +666,6 @@ template < typename TKernel > class FastKde{ if (rnode->is_leaf ()){ Tree *qnode_first = NULL, *qnode_second = NULL; - - //stat.PushDownTokens(*left_stat, *right_stat, NULL, NULL,&stat.mass_t_); BestNodePartners (rnode, qnode->left (), qnode->right (), &qnode_first, &qnode_second); FKde (qnode_first, rnode); @@ -690,8 +677,6 @@ template < typename TKernel > class FastKde{ else{ Tree *rnode_first = NULL, *rnode_second = NULL; - //stat.PushDownTokens(*left_stat, *right_stat, NULL, NULL,&stat.mass_t_); - BestNodePartners (qnode->left (), rnode->left (), rnode->right (), &rnode_first, &rnode_second); FKde (qnode->left (), rnode_first); @@ -701,7 +686,6 @@ template < typename TKernel > class FastKde{ rnode->right (), &rnode_first, &rnode_second); FKde (qnode->right (), rnode_first); FKde (qnode->right (), rnode_second); - // return; } stat.MergeChildBounds (*left_stat, *right_stat, rset_.n_rows()+ 1); } @@ -720,11 +704,6 @@ template < typename TKernel > class FastKde{ for (index_t q = qnode->begin (); q < qnode->end (); q++){ //for each point for (int i = 0; i < rset_.n_rows () + 1; i++){ //Along each dimension -/* printf("We have the following estimates....\n"); - printf("density_lower is %f\n",densities_l_[q][i]); - printf("density upper estimate is %f\n",densities_u_[q][i]); - printf("lower estimate of more is %f\n",qnode->stat().more_l[i]); - printf("Upper estimate of more is %f\n",qnode->stat().more_u[i]);*/ densities_e_[q][i] = (densities_l_[q][i] + qnode->stat ().more_l[i] + densities_u_[q][i] + qnode->stat ().more_u[i]) / 2.0; @@ -759,8 +738,6 @@ template < typename TKernel > class FastKde{ } ~FastKde (){ - -// printf ("Have come to destructor of fastkde...\n"); //delete qroot_; //delete rroot_; @@ -768,17 +745,9 @@ template < typename TKernel > class FastKde{ // getters and setters - void set_total_sum_of_weights (Vector rset_weights_){ - double total_sum_of_weights_ = 0; - for (int i = 0; i < rset_weights_.length (); i++){ - total_sum_of_weights_ += rset_weights_[i]; - } - } - /*void set_total_sum_of_weights (index_t value){ - total_sum_of_weights_ = value; - }*/ + /**get the reference weights*/ Vector get_reference_weights (){ @@ -786,6 +755,13 @@ template < typename TKernel > class FastKde{ return rset_weights_; } + /** Get the perumutation*/ + + ArrayList& get_new_from_old_r(){ + + return new_from_old_r_; + } + /** get the reference dataset */ Matrix & get_reference_dataset (){ @@ -822,7 +798,7 @@ template < typename TKernel > class FastKde{ //initialize the size qnode->stat ().mass_u.Init (rset_.n_rows () + 1); - //Initialize the value + for (int i = 0; i < rset_.n_rows () + 1; i++){ qnode->stat ().mass_u[i] = qroot_->stat ().weight_of_dimension[i]; @@ -834,22 +810,11 @@ template < typename TKernel > class FastKde{ void Compute (double tau){ -//printf ("Came to compute function...\n"); // set accuracy parameter tau_ = tau; - //num_finite_difference_prunes_ = num_farfield_to_local_prunes_ =num_farfield_prunes_ = num_local_prunes_ = 0; - - // fx_timer_start(NULL, "fast_kde_compute"); - - //printf ("Will call FKde....\n"); - //printf ("Will preprocess now....\n"); - - //PreProcess first..... PreProcess (qroot_); - //printf ("done with preprocessing of the query tree.....\n"); - PreProcess (rroot_); //printf ("Preprocessing complete....\n"); @@ -922,14 +887,14 @@ template < typename TKernel > class FastKde{ Dataset ref_weights; ref_weights.InitFromFile (rwfname); rset_weights_.Copy (ref_weights.matrix ().GetColumnPtr (0), ref_weights.matrix ().n_rows ()); //Note rset_weights_ is a vector of weights - //set_total_sum_of_weights (rset_weights_); + } else{ rset_weights_.Init (rset_.n_cols ()); rset_weights_.SetAll (1); - //set_total_sum_of_weights (rset_.n_cols ()); + } if (!strcmp (qfname, rfname)){ @@ -952,21 +917,22 @@ template < typename TKernel > class FastKde{ // construct query and reference trees. This also fills up the statistics in the reference tree - //printf("Before building trees the dataset in regression.h is ...\n"); - //qset_.PrintDebug(); - fx_timer_start (NULL, "tree_d"); - rroot_ = tree::MakeKdTreeMidpoint < Tree > (rset_, leaflen); - qroot_=tree::MakeKdTreeMidpoint < Tree > (qset_, leaflen,NULL,NULL); - - //printf("After building tree the dataset in regression.h is ...\n"); - //qset_.PrintDebug(); + rroot_ = tree::MakeKdTreeMidpoint < Tree > (rset_, leaflen, NULL, &new_from_old_r_); + qroot_=tree::MakeKdTreeMidpoint < Tree > (qset_, leaflen, NULL, NULL); + fx_timer_stop (NULL, "tree_d"); + printf("The mapping is ...\n"); + + for(index_t i=0;i class FastKde{ fprintf (fp, "%f\n", densities_e_[q][d]); } } -//printf("Total number of base calulations are %d\n",fast_kde_base); -// printf("Number of prunes are...%d\n",number_of_prunes); + fclose (fp); }