n-point correlations, wrote basic kernel function

This commit is contained in:
Bill March
2010-02-23 21:56:05 +00:00
parent 84adbf24d5
commit 37bbaea3f6
6 changed files with 363 additions and 0 deletions
+13
View File
@@ -0,0 +1,13 @@
librule(
name = "naive_two_point",
sources = [],
headers = ["naive_two_point.h"],
deplibs = ["fastlib:fastlib"]
)
binrule(
name = "n_point_testing",
sources = ["n_point_testing.cc"],
headers = [],
deplibs = ["fastlib:fastlib", ":naive_two_point"]
)
@@ -0,0 +1,59 @@
/*
* matcher.cc
*
*
* Created by William March on 2/23/10.
* Copyright 2010 __MyCompanyName__. All rights reserved.
*
*/
#include "matcher.h"
bool Matcher::CheckDistances_(double dist_sq, index_t ind1, index_t ind2) {
double upper_bd = upper_bounds_sqr_.ref(ind1, ind2);
double lower_bd = lower_bounds_sqr_.ref(ind1, ind2);
return (dist_sq <= upper_bd && dist_sq >= lower_bd);
} // CheckDistances_()
// IMPORTANT: this assumes that the two points have already been checked for
// symmetry
bool Matcher::TestPointPair(double dist_sq, index_t tuple_index_1,
index_t tuple_index_2,
ArrayList<bool> permutation_ok) {
DEBUG_ASSERT(permutation_ok.size() == factorial(tuple_size_));
bool any_matches = false;
for (index_t i = 0; i < num_permutations_; i++) {
if (!(permutation_ok[i])) {
continue;
} // does this permutation work?
index_t template_index_1 = GetPermutationIndex_(i, tuple_index_1);
index_t template_index_2 = GetPermutationIndex_(i, tuple_index_2);
if (CheckDistances_(dist_sq, template_index_1,
template_index_2)) {
any_matches = true;
} // this placement works
else {
permutation_ok[i] = false;
} // this placement doesn't work
} // for i
return any_matches;
} // TestPointPair()
+131
View File
@@ -0,0 +1,131 @@
/*
* matcher.h
*
*
* Created by William March on 2/23/10.
*
*
* Stores the upper and lower bounds on each pair in the n-tuple.
* Can also evaluate whether a set of points or nodes violates these
* conditions.
*/
// TODO: where should I keep the list of acceptable permutations?
// I think it should just be a vector passed down in the recursion
class Matcher {
private:
class Permutations {
private:
GenMatrix<index_t> permutation_indices_;
int num_perms_;
public:
void Init(index_t n) {
num_perms_ = factorials(n);
permutation_indices_.Init(num_perms_, n);
// TODO: fill in the permutations
} // Init()
int num_perms() {
return num_perms_;
}
index_t GetPermutation(index_t perm_index, index_t pt_index) {
return permutation_indices_.get(perm_index, pt_index);
} // GetPermutation
}; // class Permutations
// these are symmetric n \times n matrices
// the diagonals are not defined, since they are never accessed.
// for a tuple to work, we need L_{i,j} \leq d(x_i, x_j) \leq H_{i,j}
// for all pairs (x_i, x_j) in the tuple (under some permutation)
// these are the squared bounds to prevent square roots in the code
Matrix lower_bounds_sqr_;
Matrix upper_bounds_sqr_;
Permutations perms_;
int tuple_size_;
int num_permutations_;
///////////////////// functions ///////////////////////
/**
*
*/
index_t GetPermutationIndex_(index_t perm_index, index_t pt_index) {
return perms_.GetPermutation(perm_index, pt_index);
} // GetPermutation
/**
*
*/
bool CheckDistances_(double dist_sq, index_t ind1, index_t ind2);
public:
/**
*
*/
void Init(const Matrix& lower, const Matrix& upper, int tuple_size) {
lower_bounds_.Copy(lower);
upper_bounds_.Copy(upper);
tuple_size_ = tuple_size;
// need to set them to be the squares of the values read in
for (index_t i = 0; i < tuple_size_; i++) {
for (index_t j = 0; j < i; j++) {
double new_low = lower_bounds_.get(i, j) * lower_bounds_.get(i, j);
double new_hi = upper_bounds_.get(i, j) * upper_bounds_.get(i, j);
lower_bounds_.set(i, j, new_low);
lower_bounds_.set(j, i, new_low);
upper_bound_.set(i, j, new_hi);
upper_bound_.set(j, i, new_hi);
} // for j
} // for i
perms_.Init(tuple_size_);
num_permutations_ = perms_.num_perms();
} // Init()
/**
*
*/
bool TestPointPair(double dist_sq, index_t tuple_index_1,
index_t tuple_index_2, ArrayList<bool> permutation_ok);
// TODO: how will I know what the nodes are inside this function?
// I think the Auton code just passes the hrects
/**
*
*/
bool TestNodePair();
}; // Matcher
@@ -0,0 +1,51 @@
/*
* n_point_testing.cc
*
*
* Created by William March on 2/16/10.
* Copyright 2010 __MyCompanyName__. All rights reserved.
*
*/
#include "naive_two_point.h"
#include "fastlib/fastlib.h"
const fx_entry_doc n_point_testing_main_entries[] = {
{"data", FX_REQUIRED, FX_STR, NULL,
"A file containing the data.\n"},
};
const fx_submodule_doc n_point_testing_main_submodules[] = {
{"naive_two_point_module", &naive_two_point_doc,
"Naive two-point module.\n"},
FX_SUBMODULE_DOC_DONE
};
const fx_module_doc n_point_testing_main_doc = {
n_point_testing_main_entries, n_point_testing_main_submodules,
"Runs and compares different methods for computing n point correlations.\n"
};
int main(int argc, char* argv[]) {
fx_init(argc, argv, &n_point_testing_main_doc);
const char* data_name = fx_param_str_req(NULL, "data");
Matrix data;
data::Load(data_name, &data);
//////////// Naive two point //////////////////
fx_module* naive_two_point_mod = fx_submodule(NULL, "naive_two_point_module");
NaiveTwoPoint naive_two_point_alg;
naive_two_point_alg.Init(data, naive_two_point_mod);
naive_two_point_alg.Compute();
fx_done(NULL);
return 0;
}
@@ -0,0 +1,105 @@
/*
* two_point.h
*
*
* Created by William March on 2/16/10.
* Copyright 2010 __MyCompanyName__. All rights reserved.
*
*/
#include "fastlib/fastlib.h"
const fx_entry_doc naive_two_point_entries[] = {
{"total_runtime", FX_TIMER, FX_CUSTOM, NULL,
"Total time required to compute the 2-point correlation.\n"},
{"radius", FX_REQUIRED, FX_DOUBLE, NULL,
"The radius to compute the correlation for.\n"},
{"num_pairs", FX_RESULT, FX_INT, NULL,
"The number of pairs found.\n"},
FX_ENTRY_DOC_DONE
};
const fx_submodule_doc naive_two_point_submodules[] = {
FX_SUBMODULE_DOC_DONE
};
const fx_module_doc naive_two_point_doc = {
naive_two_point_entries, naive_two_point_submodules,
"Algorithm module for naive serial two-point correlation.\n"
};
class NaiveTwoPoint {
private:
Matrix data_points_;
// TODO: replace with upper and lower bounds?
// TODO: replace with a range of values and compute the correlation for all
// of them?
double radius_;
int num_pairs_;
index_t num_points_;
fx_module* mod_;
public:
void Init(const Matrix& data, fx_module* mod) {
data_points_.Copy(data);
mod_ = mod;
num_points_ = data_points_.n_cols();
radius_ = fx_param_double_req(mod_, "radius");
if (radius_ <= 0.0) {
FATAL("Negative radii not allowed.\n");
}
num_pairs_ = 0;
} // Init()
void Compute() {
fx_timer_start(mod_, "total_runtime");
for (index_t i = 0; i < num_points_ - 1; i++) {
Vector i_vec;
data_points_.MakeColumnVector(i, &i_vec);
for (index_t j = i + 1; j < num_points_; j++) {
Vector j_vec;
data_points_.MakeColumnVector(j, &j_vec);
double dist = sqrt(la::DistanceSqEuclidean(i_vec, j_vec));
//printf("distance = %g\n", dist);
if (dist < radius_) {
num_pairs_++;
} // is dist small
} // for j
} // for i
fx_timer_stop(mod_, "total_runtime");
fx_result_int(mod_, "num_pairs", num_pairs_);
printf("Number of pairs: %d\n\n", num_pairs_);
} // Compute()
}; // NaiveTwoPoint
+4
View File
@@ -0,0 +1,4 @@
0, 0, 0
1.0, 0, 0
2.1, 0, 0
3.2, 0, 0
1 0 0 0
2 1.0 0 0
3 2.1 0 0
4 3.2 0 0