Took out the template argument that specified the local polynomial order

This commit is contained in:
Dongryeol Lee
2008-02-15 01:50:15 +00:00
parent b867b7c827
commit 104e4ad01a
3 changed files with 39 additions and 26 deletions
@@ -42,7 +42,7 @@
* fast_kde.Compute(&results);
* @endcode
*/
template<typename TKernel, int lpr_order, typename TPruneRule>
template<typename TKernel, typename TPruneRule>
class DenseLpr {
FORBID_ACCIDENTAL_COPIES(DenseLpr);
@@ -91,6 +91,9 @@ class DenseLpr {
*/
void Init(int dimension) {
struct datanode* local_linear_module =
fx_submodule(NULL, "lpr", "lpr_module");
int lpr_order = fx_param_int(local_linear_module, "lpr_order", 0);
int matrix_dimension =
(int) math::BinomialCoefficient(dimension + lpr_order, dimension);
@@ -127,7 +130,7 @@ class DenseLpr {
const double *reference_point = dataset.GetColumnPtr(start + r);
MultiIndexUtil::ComputePointMultivariatePolynomial
(dataset.n_rows(), lpr_order, reference_point,
(dataset.n_rows(), lpr_order_, reference_point,
reference_point_expansion.ptr());
// Based on the polynomial expansion computed, sum up its
@@ -287,7 +290,7 @@ class DenseLpr {
void Init(int dimension) {
int matrix_dimension =
(int) math::BinomialCoefficient(dimension + lpr_order, dimension);
(int) math::BinomialCoefficient(dimension + lpr_order_, dimension);
// Initialize quantities associated with the numerator matrix.
numerator_norm_l_ = 0;
@@ -335,7 +338,10 @@ class DenseLpr {
typedef BinarySpaceTree<DHrectBound<2>, Matrix, LprRStat > ReferenceTree;
////////// Private Member Variables //////////
/** @brief The local polynomial order. */
int lpr_order_;
/** @brief The required relative error. */
double relative_error_;
@@ -551,11 +557,15 @@ class DenseLpr {
void Init(Matrix &queries, Matrix &references, Matrix &reference_targets,
struct datanode *module_in) {
// set the incoming parameter module.
module_ = module_in;
// read in the number of points owned by a leaf
int leaflen = fx_param_int(module_in, "leaflen", 20);
// set the local polynomial approximation order.
lpr_order_ = fx_param_double(module_in, "lpr_order", 0);
// copy reference dataset and reference weights.
rset_.Copy(references);
rset_targets_.Copy(reference_targets.GetColumnPtr(0),
@@ -564,7 +574,7 @@ class DenseLpr {
// Record dimensionality and the appropriately cache the number of
// components required.
dimension_ = rset_.n_rows();
row_length_ = (int) math::BinomialCoefficient(dimension_ + lpr_order,
row_length_ = (int) math::BinomialCoefficient(dimension_ + lpr_order_,
dimension_);
// copy query dataset.
@@ -6,8 +6,8 @@
#include "matrix_util.h"
template<typename TKernel, int lpr_order, typename TPruneRule>
void DenseLpr<TKernel, lpr_order, TPruneRule>::SqdistAndKernelRanges_
template<typename TKernel, typename TPruneRule>
void DenseLpr<TKernel, TPruneRule>::SqdistAndKernelRanges_
(QueryTree *qnode, ReferenceTree *rnode,
DRange &dsqd_range, DRange &kernel_value_range) {
@@ -16,8 +16,8 @@ void DenseLpr<TKernel, lpr_order, TPruneRule>::SqdistAndKernelRanges_
kernel_value_range = kernel_.RangeUnnormOnSq(dsqd_range);
}
template<typename TKernel, int lpr_order, typename TPruneRule>
void DenseLpr<TKernel, lpr_order, TPruneRule>::ResetQuery_(int q) {
template<typename TKernel, typename TPruneRule>
void DenseLpr<TKernel, TPruneRule>::ResetQuery_(int q) {
// First the numerator quantities.
Vector q_numerator_l, q_numerator_e;
@@ -35,8 +35,8 @@ void DenseLpr<TKernel, lpr_order, TPruneRule>::ResetQuery_(int q) {
denominator_n_pruned_[q] = 0;
}
template<typename TKernel, int lpr_order, typename TPruneRule>
void DenseLpr<TKernel, lpr_order, TPruneRule>::
template<typename TKernel, typename TPruneRule>
void DenseLpr<TKernel, TPruneRule>::
ComputeTargetWeightedReferenceVectors_(ReferenceTree *rnode) {
if(rnode->is_leaf()) {
@@ -58,7 +58,7 @@ ComputeTargetWeightedReferenceVectors_(ReferenceTree *rnode) {
// Compute the multiindex expansion of the given reference point.
MultiIndexUtil::ComputePointMultivariatePolynomial
(dimension_, lpr_order, r_col, r_target_weighted_by_coordinates);
(dimension_, lpr_order_, r_col, r_target_weighted_by_coordinates);
// Scale the expansion by the reference target.
la::Scale(row_length_, rset_targets_[r],
@@ -91,8 +91,8 @@ ComputeTargetWeightedReferenceVectors_(ReferenceTree *rnode) {
}
}
template<typename TKernel, int lpr_order, typename TPruneRule>
void DenseLpr<TKernel, lpr_order, TPruneRule>::
template<typename TKernel, typename TPruneRule>
void DenseLpr<TKernel, TPruneRule>::
InitializeQueryTree_(QueryTree *qnode) {
// Set the bounds to default values for the statistics.
@@ -115,8 +115,8 @@ InitializeQueryTree_(QueryTree *qnode) {
}
}
template<typename TKernel, int lpr_order, typename TPruneRule>
void DenseLpr<TKernel, lpr_order, TPruneRule>::BestNodePartners_
template<typename TKernel, typename TPruneRule>
void DenseLpr<TKernel, TPruneRule>::BestNodePartners_
(QueryTree *nd, ReferenceTree *nd1, ReferenceTree *nd2,
ReferenceTree **partner1, ReferenceTree **partner2) {
@@ -133,8 +133,8 @@ void DenseLpr<TKernel, lpr_order, TPruneRule>::BestNodePartners_
}
}
template<typename TKernel, int lpr_order, typename TPruneRule>
void DenseLpr<TKernel, lpr_order, TPruneRule>::BestNodePartners_
template<typename TKernel, typename TPruneRule>
void DenseLpr<TKernel, TPruneRule>::BestNodePartners_
(ReferenceTree *nd, QueryTree *nd1, QueryTree *nd2,
QueryTree **partner1, QueryTree **partner2) {
@@ -151,8 +151,8 @@ void DenseLpr<TKernel, lpr_order, TPruneRule>::BestNodePartners_
}
}
template<typename TKernel, int lpr_order, typename TPruneRule>
void DenseLpr<TKernel, lpr_order, TPruneRule>::DualtreeLprBase_
template<typename TKernel, typename TPruneRule>
void DenseLpr<TKernel, TPruneRule>::DualtreeLprBase_
(QueryTree *qnode, ReferenceTree *rnode) {
// Temporary variable for storing multivariate expansion of a
@@ -199,7 +199,7 @@ void DenseLpr<TKernel, lpr_order, TPruneRule>::DualtreeLprBase_
// Compute the reference point expansion.
MultiIndexUtil::ComputePointMultivariatePolynomial
(dimension_, lpr_order, r_col, reference_point_expansion.ptr());
(dimension_, lpr_order_, r_col, reference_point_expansion.ptr());
// Pairwise distance and kernel value and kernel value weighted
// by the reference target training value.
@@ -270,8 +270,8 @@ void DenseLpr<TKernel, lpr_order, TPruneRule>::DualtreeLprBase_
qnode->stat().postponed_denominator_n_pruned_ = 0;
}
template<typename TKernel, int lpr_order, typename TPruneRule>
void DenseLpr<TKernel, lpr_order, TPruneRule>::DualtreeLprCanonical_
template<typename TKernel, typename TPruneRule>
void DenseLpr<TKernel, TPruneRule>::DualtreeLprCanonical_
(QueryTree *qnode, ReferenceTree *rnode) {
// Total amount of used error
@@ -434,8 +434,8 @@ void DenseLpr<TKernel, lpr_order, TPruneRule>::DualtreeLprCanonical_
} // end of the case: non-leaf query node.
}
template<typename TKernel, int lpr_order, typename TPruneRule>
void DenseLpr<TKernel, lpr_order, TPruneRule>::
template<typename TKernel, typename TPruneRule>
void DenseLpr<TKernel, TPruneRule>::
FinalizeQueryTree_(QueryTree *qnode) {
LprQStat &q_stat = qnode->stat();
@@ -476,7 +476,7 @@ FinalizeQueryTree_(QueryTree *qnode) {
la::MulOverwrite(pseudoinverse_denominator, q_numerator_e,
&least_squares_solution);
MultiIndexUtil::ComputePointMultivariatePolynomial
(dimension_, lpr_order, query_point, query_point_expansion.ptr());
(dimension_, lpr_order_, query_point, query_point_expansion.ptr());
regression_estimates_[q] = la::Dot(query_point_expansion,
least_squares_solution);
}
@@ -53,6 +53,9 @@ int main(int argc, char *argv[]) {
// users.
DatasetScaler::ScaleDataByMinMax(queries, references, false);
// Do fast algorithm.
DenseLpr<EpanKernel, RelativePruneLpr> fast_lpr;
// Do naive algorithm.
Vector naive_query_regression_estimates;
ArrayList<DRange> naive_query_confidence_bands;