-
Notifications
You must be signed in to change notification settings - Fork 0
/
bruteForce.cpp
162 lines (133 loc) · 4.71 KB
/
bruteForce.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#include <iostream>
#include <fstream>
#include <random>
#include <string>
#include "dataStructs.hpp"
#include "metrics.hpp"
#include "dynamicTimeWarping.hpp"
#include "bruteForce.hpp"
using namespace std;
pair<class Point *, double> *bruteForce(vector<class Point *> *points, class Point *query)
{
//find the nearest neighbor from the dataset of a given query
size_t npoints = points->size();
pair<class Point *, double> *nearestNeighbor = new pair<class Point *, double>;
class Point *closestPoint = points->at(0);
double minDistance = manhattanDist(points->at(0), query);
class Point *tempPoint;
double tempDist;
for (int i = 1; i < npoints; i++)
{
tempPoint = points->at(i);
tempDist = manhattanDist(tempPoint, query);
if (tempDist < minDistance)
{
minDistance = tempDist;
closestPoint = tempPoint;
}
}
nearestNeighbor->first = closestPoint;
nearestNeighbor->second = minDistance;
return nearestNeighbor;
}
int bruteForceAll(vector<class Point *> *points, vector<class Point *> *queries)
{
//same as brute force but operates with a set of queries
size_t npoints = points->size();
size_t nqueries = queries->size();
ofstream outfile;
outfile.open("brute.dat");
double avg = 0;
//for each nqueries find the one with the smallest manhattan distance
for (int i = 0; i < nqueries; i++)
{
double temp_dist, min_distance = manhattanDist(points->at(0), queries->at(i));
class Point *closest_point = points->at(0);
for (int j = 1; j < npoints; j++)
{
temp_dist = manhattanDist(points->at(j), queries->at(i));
if (temp_dist < min_distance)
{
min_distance = temp_dist;
closest_point = points->at(j);
}
}
//write the result to the file
outfile << "Query Point: " << queries->at(i)->getID() << "\tNearest Neighbor: " << closest_point->getID() << "\tDistance: " << min_distance << endl;
avg += min_distance;
}
avg /= nqueries;
cout << "Average Distance: " << avg << endl;
outfile.close();
return 1;
}
pair<class Point *, double> *bruteForceTweaked(vector<class Point *> *points, class Point *query, string ID)
{
//same as bruteforce but ignores points with the same id as the given query
size_t npoints = points->size();
pair<class Point *, double> *nearestNeighbor = new pair<class Point *, double>;
class Point *closestPoint = points->at(0);
double minDistance = manhattanDist(points->at(0), query);
class Point *tempPoint;
double tempDist;
for (int i = 1; i < npoints; i++)
{
tempPoint = points->at(i);
if (ID == tempPoint->getID())
continue;
tempDist = manhattanDist(tempPoint, query);
if (tempDist < minDistance)
{
minDistance = tempDist;
closestPoint = tempPoint;
}
}
nearestNeighbor->first = closestPoint;
nearestNeighbor->second = minDistance;
return nearestNeighbor;
}
pair<class Curve *, double> *bruteForceCurve(vector<class Curve *> *curves, class Curve *query)
{
//finds the nearest neighbor of a curve with dtw distance
size_t npoints = curves->size();
pair<class Curve *, double> *nearestNeighbor = new pair<class Curve *, double>;
class Curve *closestCurve = curves->at(0);
double minDistance = dtwDist(curves->at(0), query);
class Curve *tempCurve;
double tempDist;
for (int i = 1; i < npoints; i++)
{
tempCurve = curves->at(i);
tempDist = dtwDist(tempCurve, query);
if (tempDist < minDistance)
{
minDistance = tempDist;
closestCurve = tempCurve;
}
}
nearestNeighbor->first = closestCurve;
nearestNeighbor->second = minDistance;
return nearestNeighbor;
}
int calculateW(vector<class Point *> *points, int percentage)
{
//estimates the value of w used in the algorithms
//uses a percentage of random points from the datasets as queries
//and returns their average distance from their nearest neighbor
int toCheck = (points->size() * percentage) / 100;
random_device rd;
mt19937 gen(rd());
pair<class Point *, double> *temp;
double avgDist;
uniform_int_distribution<> dis(0, points->size() - 1);
for (int i = 0; i < toCheck; i++)
{
class Point *temp_point = points->at(dis(gen)); //generate a random point
temp = bruteForceTweaked(points, temp_point, temp_point->getID());
avgDist += temp->second;
delete temp;
}
avgDist = ceil(avgDist / toCheck);
cout << "ESTIMATED W IS : " << (int)avgDist << endl;
return (int)avgDist;
}