Buggy code. Trying to incoporate the order of permutation of the regression estimates

This commit is contained in:
gmravi2003
2007-12-19 19:35:53 +00:00
parent cb34625c0a
commit 24dbf55d52
+55 -90
View File
@@ -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<index_t> 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<qset_.n_cols();i++){
for(int j=0;j<rset_.n_rows()+1;j++){
printf("density from naive calculation is %f\n",densities_[i][j]);
}
}*/
// then normalize it
/* for (index_t q = 0; q < qset_.n_cols (); q++){ //for each query point
for (index_t d = 0; d < rset_.n_rows () + 1; d++){ //along each dimension
densities_[q][d] /= (rset_.n_cols());
}
}*/
}
void Init (){
@@ -90,12 +85,15 @@ template < typename TKernel > class NaiveKde{
}
}
void Init (Matrix & qset, Matrix & rset){
void Init (Matrix & qset, Matrix & rset, ArrayList<index_t> &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 <int> 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;d<rset_.n_rows()+1;d++){ //along each dimension
// printf("Before subtraction i have more_u is %f\n",qnode->stat().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<int>& 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<new_from_old_r_.size();i++){
printf("new_from_old[%d]=%d\n",i,new_from_old_r_[i]);
}
// initialize the kernel
kernel_.Init (fx_param_double_req (NULL, "bandwidth"));
//printf("In the fast kde module....\n");
fast_kde_base=0;
number_of_prunes=0;
}
@@ -998,8 +964,7 @@ template < typename TKernel > 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);
}