ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Tree-M/PMT.cpp
Revision: 1.1
Committed: Sun May 6 00:45:51 2001 UTC (23 years ago) by root
Branch: MAIN
Log Message:
*** empty log message ***

File Contents

# Content
1 #include <cstdlib>
2
3 #include "MT/MT.h"
4 #include "MT/MTpredicate.h"
5 #include "PMT.h"
6
7 const PMT *current_pmt;
8 int IOread, IOwrite;
9 dist2sim hfunction; // argl. using c++ without any clue.
10
11 /*
12 static double *
13 kdup (double *k, int ndims)
14 {
15 double *n = new double [ndims];
16
17 memcpy (n, k, ndims * sizeof (double));
18 return n;
19 }
20 */
21
22 double Object::distance(const Object& other) const
23 {
24 int i;
25 double dist = 0;
26
27 for (i = NDIMS; i--; )
28 {
29 double d = other.k[i] - k[i];
30
31 dist += d*d;
32 }
33
34 return dist;
35 }
36
37 Object::Object(char *key)
38 {
39 unsigned char *c = (unsigned char *)key;
40
41 k = new double [NDIMS];
42
43 for (int i = 0; i < NDIMS; i++)
44 {
45 unsigned long elem = 0;
46
47 switch (ACC->elemsize)
48 {
49 case 4: elem |= *c++ << 24;
50 case 3: elem |= *c++ << 16;
51 case 2: elem |= *c++ << 8;
52 case 1: elem |= *c++ << 0;
53 break;
54 default:
55 abort ();
56 }
57
58 k[i] = ((double)elem) * ACC->max / ACC->steps + ACC->min;
59 }
60 }
61
62 void Object::Compress(char *key)
63 {
64 unsigned char *c = (unsigned char *)key;
65
66 for (int i = 0; i < NDIMS; i++)
67 {
68 unsigned long elem = (unsigned long)floor ((k[i] - ACC->min) * ACC->steps / ACC->max);
69
70 switch (ACC->elemsize)
71 {
72 case 4: *c++ = (elem >> 24) & 0xff;
73 case 3: *c++ = (elem >> 16) & 0xff;
74 case 2: *c++ = (elem >> 8) & 0xff;
75 case 1: *c++ = (elem >> 0) & 0xff;
76 break;
77 default:
78 abort ();
79 }
80 }
81 }
82
83 #define SETCUR current_pmt = this
84
85 PMT::PMT(int ndims, double min, double max, double steps)
86 {
87 this->ndims = ndims;
88 this->min = min;
89 this->max = max;
90 this->steps = steps;
91
92 if (steps <= (1<<8))
93 elemsize = 1;
94 else if (steps <= (1<<16))
95 elemsize = 2;
96 else if (steps <= (1<<24))
97 elemsize = 3;
98 else
99 elemsize = 4;
100
101 maxDist = (max - min) * (max - min) * ndims;
102
103 SETCUR;
104 mt = new MT;
105 }
106
107 PMT::~PMT()
108 {
109 SETCUR;
110 delete mt;
111 }
112
113 void PMT::create(const char *path)
114 {
115 SETCUR;
116 mt->Create(path);
117 }
118
119 void PMT::open(const char *path)
120 {
121 SETCUR;
122 mt->Open(path);
123 }
124
125 void PMT::insert(double *k, int data)
126 {
127 SETCUR;
128 Object o(k);
129 const MTkey key(o, 0, 0);
130 const MTentry entry(key, data);
131 mt->Insert(entry);
132 }
133
134 double PMT::distance(double *k1, double *k2) const
135 {
136 SETCUR;
137 Object o1(k1), o2(k2);
138 return o1.distance(o2);
139 }
140
141
142 void PMT::range(double *k, double r) const
143 {
144 SETCUR;
145 Object o(k);
146 Pred p(o);
147 SimpleQuery q(&p, r);
148 GiSTlist<MTentry *> res = mt->RangeSearch(q);
149
150 while(!res.IsEmpty()) {
151 MTentry *e = res.RemoveFront ();
152
153 add_result(e->Key()->distance, e->Ptr(), e->Key()->obj.data(), ndims);
154
155 delete e;
156 }
157 }
158
159 void PMT::top(double *k, int n) const
160 {
161 abort ();
162 }