Dense LPR cannot run beyond linear order
This commit is contained in:
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -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<TKernel, TPruneRule>::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<TKernel, TPruneRule>::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<TKernel, TPruneRule>::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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user