ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Tree-M/PMT.cpp
(Generate patch)

Comparing Tree-M/PMT.cpp (file contents):
Revision 1.3 by root, Sun May 6 17:28:24 2001 UTC vs.
Revision 1.4 by root, Wed May 23 02:11:14 2001 UTC

17 memcpy (n, k, ndims * sizeof (double)); 17 memcpy (n, k, ndims * sizeof (double));
18 return n; 18 return n;
19} 19}
20*/ 20*/
21 21
22double *Object::data() const
23{
24 double *d = new double [NDIMS];
25
26 for (int i = NDIMS; i--; )
27 d[i] = int2double(k[i]);
28
29 return d;
30}
31
22double Object::distance(const Object& other) const 32double Object::distance(const Object& other) const
23{ 33{
24 int i; 34 if (ACC->distfast)
25 double dist = 0;
26
27 for (i = NDIMS; i--; )
28 { 35 {
36 velem dist = 0;
37
38 for (int i = NDIMS; i--; )
39 {
29 double d = other.k[i] - k[i]; 40 long d = other.k[i] - k[i];
30 41
31 dist += d*d; 42 dist += (velem)(d*d);
43 }
44
45 return dist * ACC->distmul;
32 } 46 }
47 else
48 {
49 double dist = 0.;
33 50
51 for (int i = NDIMS; i--; )
52 {
53 double d = int2double(other.k[i]) - int2double(k[i]);
54
55 dist += (velem)(d*d);
56 }
57
34 return dist; 58 return dist;
59 }
35} 60}
36 61
37 62
38Object::Object(double *pkey) 63Object::Object(double *pkey)
39{ 64{
40 k = pkey; 65 k = new velem[NDIMS];
41 66
42 // discretize the vector 67 // discretize the vector
43 for (int i = NDIMS; i--; ) 68 for (int i = NDIMS; i--; )
44 k[i] = int2double (double2int (k[i])); 69 k[i] = double2int (pkey[i]);
70
71 free (pkey);
45} 72}
46 73
47Object::Object(char *key) 74Object::Object(char *key)
48{ 75{
49 unsigned char *c = (unsigned char *)key; 76 unsigned char *c = (unsigned char *)key;
50 77
51 k = new double [NDIMS]; 78 k = new velem [NDIMS];
52 79
53 for (int i = 0; i < NDIMS; i++) 80 for (int i = 0; i < NDIMS; i++)
54 { 81 {
55 unsigned long elem = 0; 82 velem elem = 0;
56 83
57 switch (ACC->elemsize) 84 switch (ACC->elemsize)
58 { 85 {
59 case 4: elem |= *c++ << 24; 86 case 4: elem |= *c++ << 24;
60 case 3: elem |= *c++ << 16; 87 case 3: elem |= *c++ << 16;
63 break; 90 break;
64 default: 91 default:
65 abort (); 92 abort ();
66 } 93 }
67 94
68 k[i] = int2double(elem); 95 k[i] = elem;
69 } 96 }
70} 97}
71 98
72void Object::Compress(char *key) 99void Object::Compress(char *key)
73{ 100{
74 unsigned char *c = (unsigned char *)key; 101 unsigned char *c = (unsigned char *)key;
75 102
76 for (int i = 0; i < NDIMS; i++) 103 for (int i = 0; i < NDIMS; i++)
77 { 104 {
78 unsigned long elem = double2int (k[i]); 105 velem elem = k[i];
79 106
80 switch (ACC->elemsize) 107 switch (ACC->elemsize)
81 { 108 {
82 case 4: *c++ = (elem >> 24) & 0xff; 109 case 4: *c++ = (elem >> 24) & 0xff;
83 case 3: *c++ = (elem >> 16) & 0xff; 110 case 3: *c++ = (elem >> 16) & 0xff;
90 } 117 }
91} 118}
92 119
93#define SETCUR current_pmt = this 120#define SETCUR current_pmt = this
94 121
95PMT::PMT(int ndims, double min, double max, double steps) 122PMT::PMT(int ndims, double min, double max, double steps, unsigned int pagesize)
96{ 123{
124 steps--;
125
126 assert (min <= 0);
127
97 this->ndims = ndims; 128 this->ndims = ndims;
98 this->min = min; 129 this->min = min;
99 this->max = max; 130 this->max = max;
100 this->steps = steps; 131 this->steps = steps;
101 132
133 this->vzero = (velem)floor (- min * steps / max);
134
102 if (steps <= (1<<8)) 135 if (steps < (1<<8))
103 elemsize = 1; 136 elemsize = 1;
104 else if (steps <= (1<<16)) 137 else if (steps < (1<<16))
105 elemsize = 2; 138 elemsize = 2;
106 else if (steps <= (1<<24)) 139 else if (steps < (1<<24))
107 elemsize = 3; 140 elemsize = 3;
108 else 141 else
109 elemsize = 4; 142 elemsize = 4;
110 143
111 maxDist = (max - min) * (max - min) * ndims; 144 maxDist = (max - min) * (max - min) * ndims;
112 145
146 if (elemsize <= 2
147 && floor (steps * steps * 0.5 + 1) < velem(1<<31) / velem(ndims))
148 {
149 distfast = 1;
150 distmul = maxDist / double(steps * steps * ndims);
151 }
152 else
153 distfast = 0;
154
155 printf ("%f < %ld?\n", floor (steps * steps * 0.5 + 1) , velem(1<<31) / velem(ndims));
156 printf ("elem %d, distmul %f, maxdist %f\n", elemsize, distmul, maxDist);
157
113 SETCUR; 158 SETCUR;
114 mt = new MT; 159 mt = new MT (pagesize);
115} 160}
116 161
117PMT::~PMT() 162PMT::~PMT()
118{ 163{
119 SETCUR; 164 SETCUR;
165 mt->Sync();
120 delete mt; 166 delete mt;
121} 167}
122 168
123void PMT::create(const char *path) 169void PMT::create(const char *path)
124{ 170{
139 const MTkey key(o, 0, 0); 185 const MTkey key(o, 0, 0);
140 const MTentry entry(key, data); 186 const MTentry entry(key, data);
141 mt->Insert(entry); 187 mt->Insert(entry);
142} 188}
143 189
190void PMT::sync()
191{
192 SETCUR;
193 mt->Sync();
194}
195
144double PMT::distance(double *k1, double *k2) const 196double PMT::distance(double *k1, double *k2) const
145{ 197{
146 SETCUR; 198 SETCUR;
147 Object o1(k1), o2(k2); 199 Object o1(k1), o2(k2);
148 return o1.distance(o2); 200 return o1.distance(o2);
158 GiSTlist<MTentry *> res = mt->RangeSearch(q); 210 GiSTlist<MTentry *> res = mt->RangeSearch(q);
159 211
160 while(!res.IsEmpty()) 212 while(!res.IsEmpty())
161 { 213 {
162 MTentry *e = res.RemoveFront (); 214 MTentry *e = res.RemoveFront ();
215 double *data = e->Key()->obj.data ();
163 add_result(e->Ptr(), e->Key()->obj.data(), ndims); 216 add_result(e->Ptr(), data, ndims);
217 delete data;
164 delete e; 218 delete e;
165 } 219 }
166} 220}
167 221
168void PMT::top(double *k, int n) const 222void PMT::top(double *k, int n) const

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines