ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Tree-M/PMT.cpp
Revision: 1.3
Committed: Sun May 6 17:28:24 2001 UTC (23 years ago) by root
Branch: MAIN
Changes since 1.2: +12 -2 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.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 root 1.3
38     Object::Object(double *pkey)
39     {
40     k = pkey;
41    
42     // discretize the vector
43     for (int i = NDIMS; i--; )
44     k[i] = int2double (double2int (k[i]));
45     }
46    
47 root 1.1 Object::Object(char *key)
48     {
49     unsigned char *c = (unsigned char *)key;
50    
51     k = new double [NDIMS];
52    
53     for (int i = 0; i < NDIMS; i++)
54     {
55     unsigned long elem = 0;
56    
57     switch (ACC->elemsize)
58     {
59     case 4: elem |= *c++ << 24;
60     case 3: elem |= *c++ << 16;
61     case 2: elem |= *c++ << 8;
62     case 1: elem |= *c++ << 0;
63     break;
64     default:
65     abort ();
66     }
67    
68 root 1.3 k[i] = int2double(elem);
69 root 1.1 }
70     }
71    
72     void Object::Compress(char *key)
73     {
74     unsigned char *c = (unsigned char *)key;
75    
76     for (int i = 0; i < NDIMS; i++)
77     {
78 root 1.3 unsigned long elem = double2int (k[i]);
79 root 1.1
80     switch (ACC->elemsize)
81     {
82     case 4: *c++ = (elem >> 24) & 0xff;
83     case 3: *c++ = (elem >> 16) & 0xff;
84     case 2: *c++ = (elem >> 8) & 0xff;
85     case 1: *c++ = (elem >> 0) & 0xff;
86     break;
87     default:
88     abort ();
89     }
90     }
91     }
92    
93     #define SETCUR current_pmt = this
94    
95     PMT::PMT(int ndims, double min, double max, double steps)
96     {
97     this->ndims = ndims;
98     this->min = min;
99     this->max = max;
100     this->steps = steps;
101    
102     if (steps <= (1<<8))
103     elemsize = 1;
104     else if (steps <= (1<<16))
105     elemsize = 2;
106     else if (steps <= (1<<24))
107     elemsize = 3;
108     else
109     elemsize = 4;
110    
111     maxDist = (max - min) * (max - min) * ndims;
112    
113     SETCUR;
114     mt = new MT;
115     }
116    
117     PMT::~PMT()
118     {
119     SETCUR;
120     delete mt;
121     }
122    
123     void PMT::create(const char *path)
124     {
125     SETCUR;
126     mt->Create(path);
127     }
128    
129     void PMT::open(const char *path)
130     {
131     SETCUR;
132     mt->Open(path);
133     }
134    
135     void PMT::insert(double *k, int data)
136     {
137     SETCUR;
138     Object o(k);
139     const MTkey key(o, 0, 0);
140     const MTentry entry(key, data);
141     mt->Insert(entry);
142     }
143    
144     double PMT::distance(double *k1, double *k2) const
145     {
146     SETCUR;
147     Object o1(k1), o2(k2);
148     return o1.distance(o2);
149     }
150    
151    
152     void PMT::range(double *k, double r) const
153     {
154     SETCUR;
155     Object o(k);
156     Pred p(o);
157     SimpleQuery q(&p, r);
158     GiSTlist<MTentry *> res = mt->RangeSearch(q);
159    
160 root 1.2 while(!res.IsEmpty())
161     {
162     MTentry *e = res.RemoveFront ();
163     add_result(e->Ptr(), e->Key()->obj.data(), ndims);
164     delete e;
165     }
166     }
167 root 1.1
168 root 1.2 void PMT::top(double *k, int n) const
169     {
170     SETCUR;
171     Object o(k);
172     Pred p(o);
173     TopQuery q(&p, n);
174     MTentry **res = mt->TopSearch(q);
175 root 1.1
176 root 1.2 for (int i=0; i < n; i++)
177     {
178     MTentry *e = res[i];
179     add_result(e->Ptr(), e->Key()->obj.data(), ndims);
180     delete e;
181     }
182 root 1.1 }
183    
184 root 1.2 int PMT::maxlevel() const
185 root 1.1 {
186 root 1.2 SETCUR;
187     return mt->MaxLevel();
188 root 1.1 }