From 994a960cf91964d330be96f8a80cfa2fc4f37ba0 Mon Sep 17 00:00:00 2001 From: Dongryeol Lee Date: Mon, 18 Feb 2008 21:53:29 +0000 Subject: [PATCH] Dense LPR cannot run beyond linear order --- .../contrib/dongryel/regression/dense_lpr.h | 4 +-- .../dongryel/regression/dense_lpr_impl.h | 26 +++---------------- .../dongryel/regression/relative_prune_lpr.h | 10 ++++--- 3 files changed, 12 insertions(+), 28 deletions(-) diff --git a/fastlib2/contrib/dongryel/regression/dense_lpr.h b/fastlib2/contrib/dongryel/regression/dense_lpr.h index 0904ed5c19..c2e7892ed0 100644 --- a/fastlib2/contrib/dongryel/regression/dense_lpr.h +++ b/fastlib2/contrib/dongryel/regression/dense_lpr.h @@ -522,8 +522,8 @@ class DenseLpr { * for a given query and a reference node pair. */ void SqdistAndKernelRanges_(QueryTree *qnode, ReferenceTree *rnode, - DRange &dsqd_range, - DRange &kernel_value_range); + DRange &dsqd_range, DRange &kernel_value_range, + Vector *furthest_point_in_qnode); /** @brief Resets bounds relevant to the given query point. */ diff --git a/fastlib2/contrib/dongryel/regression/dense_lpr_impl.h b/fastlib2/contrib/dongryel/regression/dense_lpr_impl.h index 99af389c71..197652d528 100644 --- a/fastlib2/contrib/dongryel/regression/dense_lpr_impl.h +++ b/fastlib2/contrib/dongryel/regression/dense_lpr_impl.h @@ -56,7 +56,7 @@ ComputeTargetWeightedReferenceVectors_(ReferenceTree *rnode) { // Initialize the center of expansions and bandwidth for series // expansion. - rnode->stat().Init(kernel_aux_, weight_diagram_kernel_aux_, row_length_); + rnode->stat().Init(kernel_aux_, row_length_); for(index_t j = 0; j < row_length_; j++) { rnode->bound().CalculateMidpoint (rnode->stat().target_weighted_data_far_field_expansion_[j]. @@ -66,9 +66,6 @@ ComputeTargetWeightedReferenceVectors_(ReferenceTree *rnode) { rnode->bound().CalculateMidpoint (rnode->stat().data_outer_products_far_field_expansion_[j][i]. get_center()); - rnode->bound().CalculateMidpoint - (rnode->stat().scaled_data_outer_products_far_field_expansion_[j][i]. - get_center()); } } @@ -117,10 +114,6 @@ ComputeTargetWeightedReferenceVectors_(ReferenceTree *rnode) { Accumulate(r_col, reference_point_expansion[j] * reference_point_expansion[i], kernel_aux_.sea_.get_max_order()); - rnode->stat().scaled_data_outer_products_far_field_expansion_[j][i]. - Accumulate(r_col, reference_point_expansion[j] * - reference_point_expansion[i], - weight_diagram_kernel_aux_.sea_.get_max_order()); } } @@ -170,17 +163,6 @@ ComputeTargetWeightedReferenceVectors_(ReferenceTree *rnode) { TranslateFromFarField (rnode->right()->stat(). data_outer_products_far_field_expansion_[j][i]); - - // Then the far field moments of oute rproduct using the - // bandwidth divided by the square root of 2. - rnode->stat().scaled_data_outer_products_far_field_expansion_[j][i]. - TranslateFromFarField - (rnode->left()->stat(). - scaled_data_outer_products_far_field_expansion_[j][i]); - rnode->stat().scaled_data_outer_products_far_field_expansion_[j][i]. - TranslateFromFarField - (rnode->right()->stat(). - scaled_data_outer_products_far_field_expansion_[j][i]); } } } @@ -508,7 +490,7 @@ void DenseLpr::DualtreeLprCanonical_ // moments if the maximum distance between the two nodes is within // the bandwidth! This if-statement does not apply to the Gaussian // kernel, so I need to fix in the future! - if(weight_diagram_kernel_aux_.kernel_.bandwidth_sq() >= dsqd_range.hi && + if(kernel_aux_.kernel_.bandwidth_sq() >= dsqd_range.hi && rnode->count() > 32) { for(index_t q = qnode->begin(); q < qnode->end(); q++) { @@ -527,7 +509,7 @@ void DenseLpr::DualtreeLprCanonical_ weight_diagram_numerator_e[q].set (j, i, weight_diagram_numerator_e[q].get(j, i) + rnode->stat(). - scaled_data_outer_products_far_field_expansion_[j][i]. + data_outer_products_far_field_expansion_[j][i]. EvaluateField(qset, q, 2)); } } @@ -548,7 +530,7 @@ void DenseLpr::DualtreeLprCanonical_ qnode->stat().postponed_weight_diagram_numerator_l_.set (j, i, qnode->stat().postponed_weight_diagram_numerator_l_.get(j, i) + rnode->stat(). - scaled_data_outer_products_far_field_expansion_[j][i]. + data_outer_products_far_field_expansion_[j][i]. EvaluateField(furthest_point_in_qnode, 2)); } } diff --git a/fastlib2/contrib/dongryel/regression/relative_prune_lpr.h b/fastlib2/contrib/dongryel/regression/relative_prune_lpr.h index 1e65efb348..236b1398ea 100644 --- a/fastlib2/contrib/dongryel/regression/relative_prune_lpr.h +++ b/fastlib2/contrib/dongryel/regression/relative_prune_lpr.h @@ -91,6 +91,7 @@ class RelativePruneLpr { // Refine the bound using the new info for the weight diagram // numerator matrix. + /* la::AddOverwrite(qnode->stat().postponed_weight_diagram_numerator_l_, weight_diagram_numerator_dl, &tmp_weight_diagram_numerator_dl); @@ -101,6 +102,7 @@ class RelativePruneLpr { (relative_error * new_weight_diagram_numerator_norm_l - qnode->stat().weight_diagram_numerator_used_error_) / (denominator_total_alloc_error - qnode->stat().denominator_n_pruned_); + */ // this is error per each query/reference pair for a fixed query // for the numerator and the denominator used for computing the @@ -128,11 +130,11 @@ class RelativePruneLpr { weight_diagram_numerator_used_error = squared_kernel_error * (rnode->stat().sum_data_outer_products_error_norm_); - // Check pruning condition. + // Check pruning condition. Note that this pruning criterion + // does not enforce error directly on the weight diagram + // computation. return (numerator_used_error <= numerator_allowed_err && - denominator_used_error <= denominator_allowed_err && - weight_diagram_numerator_used_error <= - weight_diagram_numerator_allowed_err); + denominator_used_error <= denominator_allowed_err); } };