00001
00043 #include "matchingdatabase.hpp"
00044
00045 ostream& DAGPrototype::write(ostream& os)
00046 {
00047 os.write(&count,sizeof(count));
00048 os.write(&view,sizeof(view));
00049
00050 return os;
00051 }
00052
00053 istream& DAGPrototype::read(istream& is)
00054 {
00055 is.read(&count,sizeof(count));
00056 is.read(&view, sizeof(view));
00057
00058 return is;
00059 }
00060
00061 ostream& DAGType::write(ostream& os)
00062 {
00063 size_t t;
00064 os.write(&count,sizeof(count));
00065
00066 t = name.length() + 1;
00067 os.write(&t,sizeof(t));
00068 os.write(name.c_str(),t);
00069
00070 return os;
00071 }
00072
00073 istream& DAGType::read(istream& is)
00074 {
00075 size_t t;
00076 char* namestr;
00077
00078 is.read(&count, sizeof(count));
00079 is.read(&t, sizeof(t));
00080
00081 namestr = new char[t];
00082
00083 is.read(namestr, t);
00084 name = string(namestr);
00085
00086 delete [] namestr;
00087
00088 return is;
00089 }
00090
00091 ostream& DAGView::write(ostream& os)
00092 {
00093 os.write(&graph,sizeof(graph));
00094 os.write(&type,sizeof(type));
00095 os.write(®ion,sizeof(region));
00096
00097 return os;
00098 }
00099
00100 istream& DAGView::read(istream& is)
00101 {
00102 is.read(&graph, sizeof(graph));
00103 is.read(&type, sizeof(type));
00104 is.read(®ion, sizeof(region));
00105
00106 return is;
00107 }
00108
00109 DAGView DAGRegion::GetPrototype()
00110 {
00111 }
00112
00113 ostream& DAGRegion::write(ostream& os)
00114 {
00115 size_t size;
00116 ID id;
00117
00118 size = views.size();
00119
00120 os.write(&size, sizeof(size));
00121
00122 for(; size > 0; size--)
00123 {
00124 id = views[size];
00125 os.write(&id, sizeof(id));
00126 }
00127
00128 return os;
00129 }
00130
00131 istream& DAGRegion::read(istream& is)
00132 {
00133 size_t size;
00134 ID id;
00135
00136
00137 views.clear();
00138
00139
00140 is.read(&size, sizeof(size));
00141 views.resize(size);
00142
00143 for(; size > 0; size--)
00144 {
00145 is.read(&id, sizeof(id));
00146 views[size] = id;
00147 }
00148
00149 return is;
00150 }
00151
00152 DAGSearchDatabase::DAGSearchDatabase()
00153 {
00154 nnd.name = "";
00155 nnd.data = HnSRTreeFile::null;
00156 nnd.dimension = 0;
00157 }
00158
00159 DAGSearchDatabase::~DAGSearchDatabase()
00160 {
00161 if(nnd.data!=HnSRTreeFile::null)
00162 {
00163 nnd.data.close();
00164 }
00165 }
00166
00167 void DAGSearchDatabase::Add(ID prototype, const DAG& dag)
00168 {
00169 leda_node v;
00170 DAGSearchRecord record;
00171 TSV h;
00172 HnPoint pn;
00173
00174 record.prototype = prototype;
00175
00176
00177 if(nnd.data!=HnSRTreeFile::null)
00178 {
00179
00180 forall_nodes(v, dag)
00181 {
00182 record.node = dag.GetNodeIndex(v);
00183 h = dag.GetNodeTSV(v, nnd.dimension);
00184 pn = TSVtoHnPoint(h);
00185 nnd.data.store(pn, new_HnDataItem((void*)(&record),sizeof(DAGSearchRecord)));
00186 }
00187 }
00188 }
00189
00190 void DAGSearchDatabase::Remove(ID prototype, DAG& dag)
00191 {
00192 leda_node v;
00193
00194 DAGSearchRecord record;
00195 record.prototype = prototype;
00196
00197
00198 if(nnd.data!=HnSRTreeFile::null)
00199 {
00200 forall_nodes(v, dag)
00201 {
00202 record.node = dag.GetNodeIndex(v);
00203
00204 nnd.data.remove(TSVtoHnPoint(dag.GetNodeTSV(v,nnd.dimension)), new_HnDataItem((void*)(&record),sizeof(DAGSearchRecord)));
00205 }
00206 }
00207 }
00208
00216 SmartArray<DAGSearchRecordEx> DAGSearchDatabase::GetClosest(const DAG& dag, const leda_node& querynode, int n)
00217 {
00218 SmartArray<DAGSearchRecordEx> closestDAGs;
00219
00220
00221 if(nnd.data != HnSRTreeFile::null && n >= 1)
00222 {
00223 int i, size;
00224 HnPoint pp;
00225 TSV tsv;
00226 DAGSearchRecordEx sr;
00227
00228 HnPointVector points;
00229 HnDataItemVector dataItems;
00230
00231 tsv = dag.GetNodeTSV(querynode, nnd.dimension);
00232
00233 pp = TSVtoHnPoint(tsv);
00234
00235 nnd.data.getNeighbors(pp, n, &points, &dataItems);
00236
00237 closestDAGs.ReSize(size = dataItems.size());
00238
00239 for(i = 0; i < size; i++)
00240 {
00241 sr = *(DAGSearchRecord*)(dataItems.elementAt(i).toCharArray());
00242 sr.nodeTSV = HnPointToTSV(points.elementAt(i));
00243 closestDAGs.Add(sr);
00244 }
00245 }
00246
00247 return closestDAGs;
00248 }
00249
00250 bool DAGSearchDatabase::Create(string& name, int dim)
00251 {
00252
00253 if(dim < Min_NND_Dimension) return false;
00254
00255
00256 if(nnd.data==HnSRTreeFile::null)
00257 {
00258
00259 nnd.data = new_HnSRTreeFile(name.c_str(), dim, sizeof(DAGSearchRecord), HnProperties::null);
00260
00261
00262 if(nnd.data == HnSRTreeFile::null)
00263 {
00264
00265 return false;
00266 }
00267 else
00268 {
00269 nnd.name = name;
00270 nnd.dimension = dim;
00271 }
00272 }
00273 else
00274 {
00275 return false;
00276 }
00277 return true;
00278 }
00279
00280 bool DAGSearchDatabase::Open(string& name)
00281 {
00282
00283 if(nnd.data!=HnSRTreeFile::null)
00284 {
00285 nnd.data.close();
00286 }
00287
00288 nnd.data = new_HnSRTreeFile(name.c_str(), "rw");
00289 if(nnd.data == HnSRTreeFile::null) return false;
00290
00291 nnd.name = name;
00292 nnd.dimension = nnd.data.getDimension();
00293 return true;
00294 }
00295
00296 istream& DAGSearchDatabase::Read(istream& is)
00297 {
00298 char* namestr;
00299 size_t t;
00300 string name;
00301 int dim;
00302
00303
00304 if(nnd.data!=HnSRTreeFile::null)
00305 {
00306 nnd.data.close();
00307 }
00308
00309 is.read(&t,sizeof(t));
00310 namestr = new char[t];
00311
00312 is.read(namestr, t);
00313 name = string(namestr);
00314 delete [] namestr;
00315
00316 is.read(&dim,sizeof(dim));
00317
00318
00319 nnd.data = new_HnSRTreeFile(name.c_str(), "rw");
00320
00321
00322 if(nnd.data == HnSRTreeFile::null)
00323 {
00324
00325 is.setstate(ios::failbit);
00326 return is;
00327 }
00328
00329 nnd.name = name;
00330 nnd.dimension = dim;
00331
00332 return is;
00333 }
00334
00335 ostream& DAGSearchDatabase::Write(ostream& os)
00336 {
00337 size_t t;
00338
00339 t = nnd.name.length() + 1;
00340
00341 os.write(&t,sizeof(t));
00342 os.write(nnd.name.c_str(), t);
00343 os.write(&nnd.dimension,sizeof(nnd.dimension));
00344
00345 return os;
00346 }
00347
00348 HnPoint DAGSearchDatabase::TSVtoHnPoint(const TSV& tsv)
00349 {
00350 int d = tsv.GetSize();
00351 HnPoint hp = new_HnPoint(d);
00352
00353 for(int i = 0; i < d; i++)
00354 hp.setCoordAt(tsv[i], i);
00355
00356 return hp;
00357 }
00358
00359 TSV DAGSearchDatabase::HnPointToTSV(const HnPoint& pt)
00360 {
00361 int d = pt.getDimension();
00362 TSV tsv(d);
00363
00364 for(int i = 0; i < d; i++)
00365 tsv[i] = pt.getCoordAt(i);
00366
00367 return tsv;
00368 }