55 #ifndef KFILE_MULTBINARY_HH 56 #define KFILE_MULTBINARY_HH 101 kmatrix_dir = orig.kmatrix_dir;
102 kfile_bin = orig.kfile_bin;
111 template<
typename STDATA>
115 stData.getValue(
"kmatrix_dir",kmatrix_dir);
118 template<
typename STDATA>
122 stData.setValue(
"kmatrix_dir", kmatrix_dir);
127 return std::string(
"multbinary");
132 return std::string(
"multiple binary format");
138 ParamInfo(
"kmatrix_dir",
"kmd",
"string",
139 "name of directory with float kernel-matrices"));
146 std::vector<unsigned int>& gIDs1,
147 std::vector<unsigned int>& gIDs2)
154 struct dirent *current_name;
159 while (( !kmatrix_dir.empty())
160 && ((kmatrix_dir[kmatrix_dir.size()-1] ==
'/' ) ||
161 (kmatrix_dir[kmatrix_dir.size()-1] ==
'\\' ) ))
162 kmatrix_dir.erase(kmatrix_dir.end()-1);
164 dir = opendir(kmatrix_dir.c_str());
169 std::cerr <<
"error in reading kmf-directory\n";
179 current_name = readdir(dir);
182 file1 = std::string(current_name->d_name);
187 }
while ((current_name!=NULL) &&
188 (file1.find(
"rows",0)==std::string::npos));
197 std::string::size_type pr = file1.find(
"rows",0);
198 std::string filebase = file1.substr(0,pr);
199 std::vector<unsigned int> min_rrange, max_rrange, min_crange,max_crange;
200 std::vector<unsigned int>::iterator IDi1,IDi2;
201 std::vector<std::vector<unsigned int> > gIDs1_parts, gIDs2_parts;
202 float** rowStarts_shifted;
203 rowStarts_shifted =
new float*[gIDs1.size()];
207 dir = opendir(kmatrix_dir.c_str());
208 while (current_name!=NULL)
215 current_name = readdir(dir);
216 if (current_name!=NULL)
220 file1 = std::string(current_name->d_name);
221 if (file1.find(
"rows",0)!=std::string::npos)
225 }
while ((current_name!=NULL) && !is_kmf_file);
229 std::string fn(current_name->d_name);
231 std::string::size_type pr = fn.find(
"rows",0);
232 std::string::size_type pc = fn.find(
"cols",0);
233 std::string::size_type pe = fn.find(
".kmf",0);
234 if (pr==std::string::npos || pc==std::string::npos ||
235 pe==std::string::npos)
237 std::cerr <<
"KFile_MULTBINARY.hh: \n";
238 std::cerr <<
"error in getting index-ranges from filename " 240 std::cerr <<
"required format of filename: \n";
241 std::cerr << filebase <<
"-rows-RMIN-RMAX-cols-CMIN-CMAX.kmf\n";
245 std::string rrange = fn.substr(pr+5,pc-pr-6);
246 std::string crange = fn.substr(pc+5,pe-pc-5);
248 pr = rrange.find(
"-",0);
249 pc = crange.find(
"-",0);
251 unsigned int rmin = atol(rrange.substr(0,pr).c_str());
252 unsigned int rmax = atol(rrange.substr(pr+1).c_str());
253 unsigned int cmin = atol(crange.substr(0,pc).c_str());
254 unsigned int cmax = atol(crange.substr(pc+1).c_str());
257 IDi1 = find(min_rrange.begin(),min_rrange.end(),rmin);
258 if (IDi1!=min_rrange.end())
261 int po = IDi1-min_rrange.begin();
262 if ((max_rrange[po]!=rmax))
264 std::cerr <<
"error in loading files: " <<
265 "rows-ranges not coinciding: " <<
267 min_rrange[po] <<
","<< max_rrange[po] <<
"),"<<
269 rmin <<
","<< rmax <<
")\n";
275 min_rrange.push_back(rmin);
276 max_rrange.push_back(rmax);
281 IDi2 = find(min_crange.begin(),min_crange.end(),cmin);
282 if (IDi2!=min_crange.end())
285 int po = IDi2-min_crange.begin();
286 if ((max_crange[po]!=cmax))
288 std::cerr <<
"error in loading files: " <<
289 "cols-ranges not coinciding: " <<
291 min_crange[po] <<
","<< max_crange[po] <<
"),"<<
293 cmin <<
","<< cmax <<
")\n";
299 min_crange.push_back(cmin);
300 max_crange.push_back(cmax);
308 gIDs1_parts.resize(min_rrange.size());
309 for (
unsigned int i=0;i<min_rrange.size();i++)
311 IDi1 = gIDs1.begin();
314 while (((*IDi1)<min_rrange[i]) && (IDi1!= gIDs1.end()))
316 while (((*(IDi2-1))>max_rrange[i]) && ((IDi2-1)!= gIDs1.begin()))
319 if ((IDi2>IDi1) && (*IDi1)<=max_rrange[i])
321 gIDs1_parts[i].resize(IDi2-IDi1);
322 copy(IDi1,IDi2,gIDs1_parts[i].begin());
336 gIDs2_parts.resize(min_crange.size());
337 for (
unsigned int i=0;i<min_crange.size();i++)
339 IDi1 = gIDs2.begin();
340 IDi2 = gIDs2.end()-1;
342 while (((*IDi1)<min_crange[i]) && (IDi1!= gIDs2.end()))
344 while (((*IDi2)>max_crange[i]) && (IDi2!= gIDs2.begin()))
348 if ((IDi2>IDi1) && (*IDi1)<=max_crange[i])
350 gIDs2_parts[i].resize(IDi2-IDi1);
351 copy(IDi1,IDi2,gIDs2_parts[i].begin());
363 unsigned int sum1 = 0;
364 for (
unsigned int i=0;i<min_rrange.size();i++)
365 sum1 +=gIDs1_parts[i].size();
367 unsigned int sum2 = 0;
368 for (
unsigned int i=0;i<min_crange.size();i++)
369 sum2 +=gIDs2_parts[i].size();
371 if ((sum1!=gIDs1.size()) || (sum2!=gIDs2.size()))
373 std::cerr <<
"error in determining gID subsequences!\n";
378 for (
unsigned int i=0;i< gIDs2_parts.size();i++)
379 if (!gIDs2_parts[i].empty())
383 IDi2 = find(gIDs2.begin(),gIDs2.end(),gIDs2_parts[i][0]);
384 shift2 = IDi2-gIDs2.begin();
385 for (
unsigned int j=0;j<gIDs1.size();j++)
386 rowStarts_shifted[j]=rowStarts[j]+shift2;
389 for (
unsigned int j=0;j<gIDs1_parts.size();j++)
390 if (!gIDs1_parts[j].empty())
393 IDi1 = find(gIDs1.begin(),gIDs1.end(),
395 shift1 = IDi1-gIDs1.begin();
399 std::ostringstream o;
400 o << kmatrix_dir <<
"/" << filebase <<
401 "rows-" << min_rrange[j] <<
"-" << max_rrange[j] <<
402 "-cols-" << min_crange[i] <<
"-" << max_crange[i] <<
404 std::string filename = o.str();
410 gIDs1_parts[j],gIDs2_parts[i]);
415 delete[] rowStarts_shifted;
422 std::string kmatrix_dir;
static std::string description()
static std::string name()
#define CHECK_MEMBER_TEMPLATE(c)
void load_matrix(float **rowStarts, std::vector< unsigned int > &gIDs1, std::vector< unsigned int > &gIDs2)
void operator=(const KFile_MULTBINARY &orig)
void saveParameters(STDATA &stData) const
static void getParamInfos(std::vector< ParamInfo > &p)
void setKmatrix_file(std::string kmf)
void loadParameters(STDATA &stData)
void load_matrix(float **rowStarts, std::vector< unsigned int > &gIDs1, std::vector< unsigned int > &gIDs2)
The ParamInfo class contains informations about one parameter like key, help text, guiHints etc.
KFile_MULTBINARY(const KFile_MULTBINARY &orig)