Skip to content

Commit

Permalink
Merge pull request #2 from van51/boundary_oracle
Browse files Browse the repository at this point in the history
Boundary oracle
  • Loading branch information
Evangelos Anagnostopoulos authored Nov 30, 2016
2 parents 98b332b + 642a249 commit 0bb501d
Show file tree
Hide file tree
Showing 4 changed files with 1,257 additions and 1,070 deletions.
1 change: 1 addition & 0 deletions examples/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ if(COMMAND cmake_policy)
endif(COMMAND cmake_policy)

find_package(CGAL QUIET COMPONENTS Core )
set(CMAKE_EXPORT_COMPILE_COMMANDS "ON")

#FIND_PACKAGE( OpenMP REQUIRED)
#if(OPENMP_FOUND)
Expand Down
173 changes: 149 additions & 24 deletions examples/vol.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
// Developer: Vissarion Fisikopoulos

#include <vol_rand.h>
#include <random>
#include <string>
#include <list>
#include <chrono>
Expand Down Expand Up @@ -49,13 +50,36 @@ int factorial(int n) {
// The user should provide the appropriate membership
// oracles.

int membership_main(stdHPolytope<double>& P, double epsilon, int k, int l, int probes, std::string query_filename,vars& var) {
int boundary_main(stdHPolytope<double>& P, double epsilon, int num_query_points, int k, int l, int probes, std::string query_filename,vars& var) {
Point chebPoint = P.create_point_representation();
P.create_lsh_ds(k, l);
P.create_ann_ds();

std::list<Point> randPoints; //ds for storing rand points

rand_point_generator(P, chebPoint, 2, var.walk_steps, randPoints, var);

auto it = randPoints.begin();
Point p = (*it);
++it;
Vector v = (*it) - CGAL::ORIGIN;
Ray ray(p, v);
auto range = P.line_intersect(p, v);


std::cout << range.first << "\t" << range.second << std::endl;
std::cout << P.compute_boundary_intersection(ray, epsilon, true) << std::endl;
std::cout << P.compute_boundary_intersection(ray, epsilon, false) << std::endl;

}

int membership_main(stdHPolytope<double>& P, double epsilon, int num_query_points, int k, int l, int probes, std::string query_filename,vars& var) {
Point chebPoint = P.create_point_representation();
P.create_lsh_ds(k, l);
P.create_ann_ds();
std::list<Point> randPoints; //ds for storing rand points

rand_point_generator(P, chebPoint, 5000, var.walk_steps, randPoints, var);
rand_point_generator(P, chebPoint, num_query_points, var.walk_steps, randPoints, var);

std::ifstream inp;
std::vector<std::vector<double> > Pin;
Expand All @@ -70,55 +94,120 @@ int membership_main(stdHPolytope<double>& P, double epsilon, int k, int l, int p
int lsh_mismatches = 0;
int ann_mismatches = 0;
int not_contained = 0;
for (int i=0; i<Pin.size(); i++) {
Point p(P.dimension(), Pin[i].begin(), Pin[i].end());
// for (int i=0; i<Pin.size(); i++) {
// Point p(P.dimension(), Pin[i].begin(), Pin[i].end());
// Timer lsh_timer;
// bool lsh_contains = P.contains_point_lsh(p, probes);
// lsh_time += lsh_timer.elapsed_seconds();
//
// Timer naive_timer;
// bool naive_contains = P.contains_point_naive(p);
// naive_time += naive_timer.elapsed_seconds();
//
// Timer ann_timer;
// bool ann_contains = P.contains_point_ann(p, epsilon);
// ann_time += ann_timer.elapsed_seconds();
//
// if (!naive_contains) {
// //not_contained++;
// }
// if (ann_contains!=naive_contains) {
// //++ann_mismatches;
// }
// if (lsh_contains!=naive_contains) {
// //++lsh_mismatches;
// }
// }
auto it = randPoints.begin();

for (; it!=randPoints.end(); it++) {
Point p(P.dimension(), (*it).cartesian_begin(), (*it).cartesian_end());

int i=0;
Point projection = P.project(p, i++);
double minDist = std::sqrt(((p-CGAL::ORIGIN)-(projection-CGAL::ORIGIN)).squared_length());
for (; i<P.num_of_hyperplanes(); i++) {
projection = P.project(p, i);
double tmpDist = std::sqrt(((p-CGAL::ORIGIN)-(projection-CGAL::ORIGIN)).squared_length());
if (tmpDist<minDist) {
minDist = tmpDist;
}
}

Timer lsh_timer;
bool lsh_contains = P.contains_point_lsh(p, probes);
int nnIndex = 0;
bool lsh_contains = P.contains_point_lsh(p, probes, &nnIndex);
lsh_time += lsh_timer.elapsed_seconds();

Timer naive_timer;
bool naive_contains = P.contains_point_naive(p);
bool naive_contains = P.contains_point_naive(p, epsilon);
naive_time += naive_timer.elapsed_seconds();

Timer ann_timer;
bool ann_contains = P.contains_point_ann(p, probes);
bool ann_contains = P.contains_point_ann(p, epsilon, &nnIndex);
ann_time += ann_timer.elapsed_seconds();

if (!naive_contains) {
//not_contained++;
not_contained++;
}
if (ann_contains!=naive_contains) {
++ann_mismatches;
if (!ann_contains) {
if (minDist>epsilon) {
++ann_mismatches;
}
}
if (lsh_contains!=naive_contains) {
++lsh_mismatches;
if (!lsh_contains) {
if (minDist>epsilon) {
++lsh_mismatches;
}
}
}
auto it = randPoints.begin();
it = randPoints.begin();
for (; it!=randPoints.end(); it++) {
Point p(P.dimension(), (*it).cartesian_begin(), (*it).cartesian_end());

int i=0;
Point projection = P.project(p, i++);
double minDist = std::sqrt(((p-CGAL::ORIGIN)-(projection-CGAL::ORIGIN)).squared_length());
for (; i<P.num_of_hyperplanes(); i++) {
projection = P.project(p, i);
double tmpDist = std::sqrt(((p-CGAL::ORIGIN)-(projection-CGAL::ORIGIN)).squared_length());
if (tmpDist<minDist) {
minDist = tmpDist;
}
}

Vector direction = (projection-CGAL::ORIGIN) - (p-CGAL::ORIGIN);
direction *= 3;
p = (CGAL::ORIGIN + ((p-CGAL::ORIGIN) + direction));

int nnIndex = 0;
Timer lsh_timer;
bool lsh_contains = P.contains_point_lsh(p, probes);
bool lsh_contains = P.contains_point_lsh(p, probes, &nnIndex);
lsh_time += lsh_timer.elapsed_seconds();

Timer naive_timer;
bool naive_contains = P.contains_point_naive(p);
bool naive_contains = P.contains_point_naive(p, epsilon);
naive_time += naive_timer.elapsed_seconds();

Timer ann_timer;
bool ann_contains = P.contains_point_ann(p, probes);
bool ann_contains = P.contains_point_ann(p, epsilon, &nnIndex);
ann_time += ann_timer.elapsed_seconds();
std::cout << p << std::endl;

if (!naive_contains) {
if (naive_contains) {
not_contained++;
}
if (ann_contains!=naive_contains) {
++ann_mismatches;
if (ann_contains) {
if (minDist>epsilon) {
++ann_mismatches;
}

}
if (lsh_contains!=naive_contains) {
++lsh_mismatches;
if (lsh_contains) {
if (minDist>epsilon) {
++lsh_mismatches;
}
}

}

std::cout << "Naive took " << naive_time << "s, averaging at " << (naive_time/Pin.size()) << "s." << std::endl;
Expand Down Expand Up @@ -149,10 +238,12 @@ int main(const int argc, const char** argv) {
coordinate=true;

bool membership_test=false;
bool boundary_test = false;
int k = 20;
int l = 20;
double epsilon = 0.1;
int probes = l;
int nqp = 10;
std::string query_filename;

//this is our polytope
Expand Down Expand Up @@ -215,12 +306,23 @@ int main(const int argc, const char** argv) {
if(!strcmp(argv[i],"--membership")) {
std::cout<<"found membership"<<std::endl;
correct = true;
boundary_test = false;
membership_test = true;
}
if(!strcmp(argv[i],"--boundary")) {
std::cout<<"found membership"<<std::endl;
correct = true;
boundary_test = true;
membership_test = false;
}
if(!strcmp(argv[i],"-k")) {
correct = true;
k = atoi(argv[++i]);
}
if(!strcmp(argv[i],"--nqp")) {
correct = true;
nqp = atoi(argv[++i]);
}
if(!strcmp(argv[i],"--probes")) {
correct = true;
probes = atoi(argv[++i]);
Expand Down Expand Up @@ -374,9 +476,32 @@ int main(const int argc, const char** argv) {
int rnum = std::pow(e,-2) * 400 * n * std::log(n);
vars var(rnum,n,walk_len,n_threads,err,0,0,0,0,rng,get_snd_rand,
urdist,urdist1,verbose,rand_only,round,NN,birk,coordinate);
membership_main(P,epsilon,k,l,probes,query_filename,var);
membership_main(P,epsilon,nqp,k,l,probes,query_filename,var);
}
if (boundary_test) {
const double err=0.0000000001;
const double err_opt=0.01;
//bounds for the cube
const int lw=0, up=10000, R=up-lw;

/* RANDOM NUMBERS */
// obtain a time-based seed:
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
// the random engine with this seed
RNGType rng(seed);
// standard normal distribution with mean of 0 and standard deviation of 1
boost::normal_distribution<> rdist(0,1);
boost::variate_generator< RNGType, boost::normal_distribution<> >
get_snd_rand(rng, rdist);
// uniform distribution
boost::random::uniform_real_distribution<>(urdist);
boost::random::uniform_real_distribution<> urdist1(-1,1);
int rnum = std::pow(e,-2) * 400 * n * std::log(n);
vars var(rnum,n,walk_len,n_threads,err,0,0,0,0,rng,get_snd_rand,
urdist,urdist1,verbose,rand_only,round,NN,birk,coordinate);
boundary_main(P,epsilon,nqp,k,l,probes,query_filename,var);
}
else {
if ((!membership_test) && (!boundary_test)) {
std::cout<<"Starting old experiments" << std::endl;

// Set the number of random walk steps
Expand Down
Loading

0 comments on commit 0bb501d

Please sign in to comment.