00001
00040 #include "DAGSearchDatabase.h"
00041 #include "Debug.h"
00042
00043 DAGSearchDatabase::DAGSearchDatabase()
00044 {
00045 nnd.name = "";
00046 nnd.data = HnSRTreeFile::null;
00047 nnd.dimension = 0;
00048 }
00049
00050 DAGSearchDatabase::~DAGSearchDatabase()
00051 {
00052 if(nnd.data!=HnSRTreeFile::null)
00053 {
00054 nnd.data.close();
00055 }
00056 }
00057
00058 void DAGSearchDatabase::Add(ID id, const DAG& dag)
00059 {
00060 leda_node v;
00061 DAGSearchRecord record;
00062 TSV h;
00063 HnPoint pn;
00064
00065
00066 if(nnd.data!=HnSRTreeFile::null)
00067 {
00068 record.id = id;
00069 record.offset = dag.GetFileOffset();
00070 record.totalVote = dag.GetTotalTSVSum();
00071
00072
00073 forall_nodes(v, dag)
00074 {
00075 if (dag.GetNodeTSVNorm(v) > 0)
00076 {
00077 record.node = dag.GetNodeIndex(v);
00078 record.nodeLbl = dag.NodeType(v);
00079 h = dag.GetNodeTSV(v, nnd.dimension);
00080 pn = TSVtoHnPoint(h);
00081 nnd.data.store(pn, new_HnDataItem((void*)(&record),sizeof(DAGSearchRecord)));
00082 }
00083 }
00084 }
00085 }
00086
00087 void DAGSearchDatabase::Remove(ID id, DAG& dag)
00088 {
00089 leda_node v;
00090 TSV h;
00091 HnPoint pn;
00092
00093 DAGSearchRecord record;
00094 record.id = id;
00095
00096
00097 if(nnd.data!=HnSRTreeFile::null)
00098 {
00099 forall_nodes(v, dag)
00100 {
00101 record.node = dag.GetNodeIndex(v);
00102 h = dag.GetNodeTSV(v, nnd.dimension);
00103 pn = TSVtoHnPoint(h);
00104
00105
00106 nnd.data.remove(pn, new_HnDataItem((void*)(&record),sizeof(DAGSearchRecord)));
00107 }
00108 }
00109 }
00110
00118 SmartArray<DAGSearchRecordEx> DAGSearchDatabase::GetKClosest(const DAG& dag, const leda_node& querynode, int k)
00119 {
00120 SmartArray<DAGSearchRecordEx> closestDAGs;
00121
00122
00123 if(nnd.data != HnSRTreeFile::null && k >= 1)
00124 {
00125 int i, size;
00126 HnPoint pp;
00127 TSV tsv;
00128 DAGSearchRecordEx sr;
00129
00130 HnPointVector points;
00131 HnDataItemVector dataItems;
00132
00133 tsv = dag.GetNodeTSV(querynode, nnd.dimension);
00134
00135 pp = TSVtoHnPoint(tsv);
00136
00137 nnd.data.getNeighbors(pp, k, &points, &dataItems);
00138
00139 closestDAGs.ReSize(size = dataItems.size());
00140
00141 for(i = 0; i < size; i++)
00142 {
00143 sr = *(DAGSearchRecord*)(dataItems.elementAt(i).toCharArray());
00144 sr.nodeTSV = HnPointToTSV(points.elementAt(i));
00145 closestDAGs.Add(sr);
00146 }
00147 }
00148
00149 return closestDAGs;
00150 }
00151
00152 SmartArray<DAGSearchRecordEx> DAGSearchDatabase::GetClosest(const DAG& dag, const leda_node& querynode,
00153 const double& range)
00154 {
00155 SmartArray<DAGSearchRecordEx> closestDAGs;
00156
00157 ASSERT(range >= 0 && range <= 1);
00158
00159
00160 if(nnd.data != HnSRTreeFile::null)
00161 {
00162 int i, size;
00163 double delta, val;
00164 HnRect rect;
00165 TSV tsv;
00166 DAGSearchRecordEx sr;
00167
00168 HnPointVector points;
00169 HnDataItemVector dataItems;
00170
00171 tsv = dag.GetNodeTSV(querynode, nnd.dimension);
00172 rect = new_HnRect(nnd.dimension);
00173
00174 for(i = 0; i < tsv.GetSize(); i++)
00175 {
00176 val = tsv[i];
00177 delta = val * range;
00178 rect.setRangeAt(val - delta, val + delta, i);
00179 }
00180
00181 nnd.data.getInRect(rect, &points, &dataItems);
00182
00183 closestDAGs.ReSize(size = dataItems.size());
00184
00185 for(i = 0; i < size; i++)
00186 {
00187 sr = *(DAGSearchRecord*)(dataItems.elementAt(i).toCharArray());
00188 sr.nodeTSV = HnPointToTSV(points.elementAt(i));
00189 closestDAGs.Add(sr);
00190 }
00191 }
00192
00193 return closestDAGs;
00194 }
00195
00196
00197 bool DAGSearchDatabase::Create(std::string name, int dim)
00198 {
00199
00200 if(dim < Min_NND_Dimension) return false;
00201
00202
00203 if(nnd.data==HnSRTreeFile::null)
00204 {
00205
00206 nnd.data = new_HnSRTreeFile(name.c_str(), dim, sizeof(DAGSearchRecord), HnProperties::null);
00207
00208
00209 if(nnd.data == HnSRTreeFile::null)
00210 {
00211
00212 return false;
00213 }
00214 else
00215 {
00216 nnd.name = name;
00217 nnd.dimension = dim;
00218 }
00219 }
00220 else
00221 {
00222 return false;
00223 }
00224 return true;
00225 }
00226
00227 bool DAGSearchDatabase::Open(std::string name)
00228 {
00229
00230 if(nnd.data!=HnSRTreeFile::null)
00231 {
00232 nnd.data.close();
00233 }
00234
00235 nnd.data = new_HnSRTreeFile(name.c_str(), "rw");
00236 if(nnd.data == HnSRTreeFile::null) return false;
00237
00238 nnd.name = name;
00239 nnd.dimension = nnd.data.getDimension();
00240 return true;
00241 }
00242
00243 void DAGSearchDatabase::Close()
00244 {
00245 nnd.data.close();
00246 nnd.data = HnSRTreeFile::null;
00247 }
00248
00249 std::istream& DAGSearchDatabase::Read(std::istream& is)
00250 {
00251 char* namestr;
00252 size_t t;
00253 std::string name;
00254 int dim;
00255
00256
00257 if(nnd.data!=HnSRTreeFile::null)
00258 {
00259 nnd.data.close();
00260 }
00261
00262 is.read((char*)&t,sizeof(t));
00263 namestr = new char[t];
00264
00265 is.read(namestr, t);
00266 name = std::string(namestr);
00267 delete [] namestr;
00268
00269 is.read((char*)&dim,sizeof(dim));
00270
00271
00272 nnd.data = new_HnSRTreeFile(name.c_str(), "rw");
00273
00274
00275 if(nnd.data == HnSRTreeFile::null)
00276 {
00277
00278 is.setstate(ios::failbit);
00279 return is;
00280 }
00281
00282 nnd.name = name;
00283 nnd.dimension = dim;
00284
00285 return is;
00286 }
00287
00288 std::ostream& DAGSearchDatabase::Write(std::ostream& os)
00289 {
00290 size_t t;
00291
00292 t = nnd.name.length() + 1;
00293
00294 os.write((char*)&t,sizeof(t));
00295 os.write(nnd.name.c_str(), t);
00296 os.write((char*)&nnd.dimension,sizeof(nnd.dimension));
00297
00298 return os;
00299 }
00300
00301 HnPoint DAGSearchDatabase::TSVtoHnPoint(const TSV& tsv)
00302 {
00303 int d = tsv.GetSize();
00304 HnPoint hp = new_HnPoint(d);
00305
00306 for(int i = 0; i < d; i++)
00307 hp.setCoordAt(tsv[i], i);
00308
00309 return hp;
00310 }
00311
00312 TSV DAGSearchDatabase::HnPointToTSV(const HnPoint& pt)
00313 {
00314 int d = pt.getDimension();
00315 TSV tsv(d);
00316
00317 for(int i = 0; i < d; i++)
00318 tsv[i] = pt.getCoordAt(i);
00319
00320 return tsv;
00321 }