40 template <
class VTagMap,
class ETagMap>
46 FamilyUtilityCheckerPtr _checker;
57 std::vector<size_t> load_valid_map;
58 std::vector<size_t> load_invalid_map;
60 std::vector<char> save_map;
65 std::map<size_t, CachedSet> _cached_sets;
72 void addCachedSet(std::string set_name, std::string cache_filename, std::string header)
76 newset.name = set_name;
77 newset.filename = cache_filename;
78 newset.header = header;
83 newset.var = _checker->getSetIndex(set_name);
87 newset.save_map.resize(num_vertices(_checker->_g));
96 _cached_sets.insert(std::make_pair(newset.var, newset));
108 for (
typename std::map<size_t, CachedSet>::iterator
109 iset=_cached_sets.begin(); iset!=_cached_sets.end(); iset++)
111 const char * filename = iset->second.filename.c_str();
112 iset->second.fp = fopen(filename,
"r");
113 if (!iset->second.fp)
115 OMPL_INFORM(
"Family tag cache file \"%s\" not found.", filename);
119 size_t size_expected = iset->second.header.size();
120 std::string header_read(size_expected,
' ');
121 size_t size_read = fread(&header_read[0], 1, size_expected, iset->second.fp);
122 if (size_read != size_expected || header_read != iset->second.header)
124 OMPL_ERROR(
"Error, header mismatch in family tag cache file \"%s\".", filename);
125 fclose(iset->second.fp);
130 iset->second.load_valid_map.resize(_checker->numTags(), 0);
131 iset->second.load_invalid_map.resize(_checker->numTags(), 0);
135 void loadBatch(
size_t batch,
136 VTagMap v_tag_map,
size_t v_from,
size_t v_to,
137 ETagMap e_tag_map,
size_t e_from,
size_t e_to)
139 if (batch != 0 || v_from != 0 || e_from != 0)
141 OMPL_ERROR(
"We can only load the first batch for now.");
144 for (
typename std::map<size_t, CachedSet>::iterator
145 iset=_cached_sets.begin(); iset!=_cached_sets.end(); iset++)
147 OMPL_INFORM(
"Loading batch %lu for set \"%s\" from file \"%s\" ...",
148 batch, iset->second.name.c_str(), iset->second.filename.c_str());
149 if (!iset->second.fp)
153 size_t read_vertices;
155 int n_stored = fscanf(iset->second.fp,
"batch %lu num_vertices %lu num_edges %lu\n",
156 &read_batch, &read_vertices, &read_edges);
157 if (n_stored != 3 || read_vertices != (v_to-v_from) || read_edges != (e_to-e_from))
166 bytes_read = fread(buffer, 1, 9, iset->second.fp);
167 if (bytes_read != 9 || strncmp(buffer,
"vertices ",9)!=0)
174 for (v_index=v_from; v_index<v_to;)
176 size_t bytes =
sizeof(buffer);
177 if (bytes > v_to - v_index)
178 bytes = v_to - v_index;
179 bytes_read = fread(buffer, 1, bytes, iset->second.fp);
180 if (bytes_read != bytes)
185 for (
size_t i=0; i<bytes; i++,v_index++)
192 new_tag = iset->second.load_valid_map[v_tag_map[v_index]];
195 new_tag = _checker->tagIfSetKnown(v_tag_map[v_index], iset->second.var,
true);
196 iset->second.load_valid_map[v_tag_map[v_index]] = new_tag;
198 v_tag_map[v_index] = new_tag;
201 new_tag = iset->second.load_invalid_map[v_tag_map[v_index]];
204 new_tag = _checker->tagIfSetKnown(v_tag_map[v_index], iset->second.var,
false);
205 iset->second.load_valid_map[v_tag_map[v_index]] = new_tag;
207 v_tag_map[v_index] = new_tag;
210 OMPL_ERROR(
"Unknown character: %c", buffer[i]);
217 bytes_read = fread(buffer, 1, 7, iset->second.fp);
218 if (bytes_read != 7 || strncmp(buffer,
"\nedges ",7)!=0)
225 for (e_index=e_from; e_index<e_to;)
227 size_t bytes =
sizeof(buffer);
228 if (bytes > e_to - e_index)
229 bytes = e_to - e_index;
230 bytes_read = fread(buffer, 1, bytes, iset->second.fp);
231 if (bytes_read != bytes)
236 for (
size_t i=0; i<bytes; i++,e_index++)
243 new_tag = iset->second.load_valid_map[e_tag_map[e_index]];
246 new_tag = _checker->tagIfSetKnown(e_tag_map[e_index], iset->second.var,
true);
247 iset->second.load_valid_map[e_tag_map[e_index]] = new_tag;
249 e_tag_map[e_index] = new_tag;
252 new_tag = iset->second.load_invalid_map[e_tag_map[e_index]];
255 new_tag = _checker->tagIfSetKnown(e_tag_map[e_index], iset->second.var,
false);
256 iset->second.load_valid_map[e_tag_map[e_index]] = new_tag;
258 e_tag_map[e_index] = new_tag;
261 OMPL_ERROR(
"Unknown character: %c", buffer[i]);
268 bytes_read = fread(buffer, 1, 1, iset->second.fp);
269 if (bytes_read != 1 || strncmp(buffer,
"\n ",1)!=0)
279 for (
typename std::map<size_t, CachedSet>::iterator
280 iset=_cached_sets.begin(); iset!=_cached_sets.end(); iset++)
283 fclose(iset->second.fp);
289 for (
typename std::map<size_t, CachedSet>::iterator
290 iset=_cached_sets.begin(); iset!=_cached_sets.end(); iset++)
292 const char * filename = iset->second.filename.c_str();
293 iset->second.fp = fopen(filename,
"w");
294 if (!iset->second.fp)
296 OMPL_ERROR(
"Could not save to file \"%s\".", filename);
300 fprintf(iset->second.fp,
"%s", iset->second.header.c_str());
304 void saveBatch(
size_t batch,
305 VTagMap v_tag_map,
size_t v_from,
size_t v_to,
306 ETagMap e_tag_map,
size_t e_from,
size_t e_to)
308 printf(
"new save not implemented!\n");
310 for (
typename std::map<size_t, CachedSet>::iterator
311 iset=_cached_sets.begin(); iset!=_cached_sets.end(); iset++)
313 if (!iset->second.fp)
316 fprintf(iset->second.fp,
"batch %lu num_vertices %lu num_edges %lu\n",
317 batch, v_to - v_from, e_to - e_from);
319 fprintf(iset->second.fp,
"vertices ");
320 for (
size_t v_index=v_from; v_index<v_to; v_index++)
322 size_t & tag = v_tag_map[v_index];
323 fprintf(iset->second.fp,
"%c", iset->second.save_map[tag]);
325 fprintf(iset->second.fp,
"\n");
327 fprintf(iset->second.fp,
"edges ");
328 for (
size_t e_index=e_from; e_index<e_to; e_index++)
330 size_t & tag = e_tag_map[e_index];
331 fprintf(iset->second.fp,
"%c", iset->second.save_map[tag]);
333 fprintf(iset->second.fp,
"\n");
340 for (
typename std::map<size_t, CachedSet>::iterator
341 iset=_cached_sets.begin(); iset!=_cached_sets.end(); iset++)
344 fclose(iset->second.fp);
Definition: TagCache.h:12
#define OMPL_ERROR(fmt,...)
Tag cache which uses a family checker to save/load particular sets.
Definition: FamilyTagCache.h:41
Definition: FamilyTagCache.h:51
#define OMPL_INFORM(fmt,...)