diff --git a/fastlib2/contrib/dongryel/regression/dense_lpr.h b/fastlib2/contrib/dongryel/regression/dense_lpr.h index e2a277bd99..4c861e9f31 100644 --- a/fastlib2/contrib/dongryel/regression/dense_lpr.h +++ b/fastlib2/contrib/dongryel/regression/dense_lpr.h @@ -42,7 +42,7 @@ * fast_kde.Compute(&results); * @endcode */ -template +template 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, 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. diff --git a/fastlib2/contrib/dongryel/regression/dense_lpr_impl.h b/fastlib2/contrib/dongryel/regression/dense_lpr_impl.h index 05b9c4a388..ef6fbfa508 100644 --- a/fastlib2/contrib/dongryel/regression/dense_lpr_impl.h +++ b/fastlib2/contrib/dongryel/regression/dense_lpr_impl.h @@ -6,8 +6,8 @@ #include "matrix_util.h" -template -void DenseLpr::SqdistAndKernelRanges_ +template +void DenseLpr::SqdistAndKernelRanges_ (QueryTree *qnode, ReferenceTree *rnode, DRange &dsqd_range, DRange &kernel_value_range) { @@ -16,8 +16,8 @@ void DenseLpr::SqdistAndKernelRanges_ kernel_value_range = kernel_.RangeUnnormOnSq(dsqd_range); } -template -void DenseLpr::ResetQuery_(int q) { +template +void DenseLpr::ResetQuery_(int q) { // First the numerator quantities. Vector q_numerator_l, q_numerator_e; @@ -35,8 +35,8 @@ void DenseLpr::ResetQuery_(int q) { denominator_n_pruned_[q] = 0; } -template -void DenseLpr:: +template +void DenseLpr:: 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 -void DenseLpr:: +template +void DenseLpr:: InitializeQueryTree_(QueryTree *qnode) { // Set the bounds to default values for the statistics. @@ -115,8 +115,8 @@ InitializeQueryTree_(QueryTree *qnode) { } } -template -void DenseLpr::BestNodePartners_ +template +void DenseLpr::BestNodePartners_ (QueryTree *nd, ReferenceTree *nd1, ReferenceTree *nd2, ReferenceTree **partner1, ReferenceTree **partner2) { @@ -133,8 +133,8 @@ void DenseLpr::BestNodePartners_ } } -template -void DenseLpr::BestNodePartners_ +template +void DenseLpr::BestNodePartners_ (ReferenceTree *nd, QueryTree *nd1, QueryTree *nd2, QueryTree **partner1, QueryTree **partner2) { @@ -151,8 +151,8 @@ void DenseLpr::BestNodePartners_ } } -template -void DenseLpr::DualtreeLprBase_ +template +void DenseLpr::DualtreeLprBase_ (QueryTree *qnode, ReferenceTree *rnode) { // Temporary variable for storing multivariate expansion of a @@ -199,7 +199,7 @@ void DenseLpr::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::DualtreeLprBase_ qnode->stat().postponed_denominator_n_pruned_ = 0; } -template -void DenseLpr::DualtreeLprCanonical_ +template +void DenseLpr::DualtreeLprCanonical_ (QueryTree *qnode, ReferenceTree *rnode) { // Total amount of used error @@ -434,8 +434,8 @@ void DenseLpr::DualtreeLprCanonical_ } // end of the case: non-leaf query node. } -template -void DenseLpr:: +template +void DenseLpr:: 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); } diff --git a/fastlib2/contrib/dongryel/regression/dense_lpr_main.cc b/fastlib2/contrib/dongryel/regression/dense_lpr_main.cc index 4516ceb92f..8af8512718 100644 --- a/fastlib2/contrib/dongryel/regression/dense_lpr_main.cc +++ b/fastlib2/contrib/dongryel/regression/dense_lpr_main.cc @@ -53,6 +53,9 @@ int main(int argc, char *argv[]) { // users. DatasetScaler::ScaleDataByMinMax(queries, references, false); + // Do fast algorithm. + DenseLpr fast_lpr; + // Do naive algorithm. Vector naive_query_regression_estimates; ArrayList naive_query_confidence_bands;