GroupCovers::GroupCovers(const vector<string>& groupFileNames, const char* groupElementSeparator, const char* groupDimensionElementsSeparator, const vector<unsigned int>& cardinalities, const vector<unordered_map<string, unsigned int>>& labels2Ids, const vector<unsigned int>& dimensionOrder): minCovers(), maxCovers()
{
  const char_separator<char> elementSeparator(groupElementSeparator);
  const char_separator<char> dimensionElementsSeparator(groupDimensionElementsSeparator);
  const unsigned int n = cardinalities.size();
  minCovers.resize(groupFileNames.size());
  maxCovers.reserve(groupFileNames.size());
  groups.resize(groupFileNames.size());
  vector<vector<dynamic_bitset<>>>::iterator groupIt = groups.begin();
  for (const string& fileName : groupFileNames)
    {
      ifstream file(fileName.c_str());
      if (!file)
	{
	  throw NoFileException(fileName.c_str());
	}
      groupIt->reserve(n);
      for (const unsigned int cardinality : cardinalities)
	{
	  groupIt->push_back(dynamic_bitset<>(cardinality));
	}
      unsigned int lineNb = 0;
      while (!file.eof())
	{
	  ++lineNb;
	  string dataString;
	  getline(file, dataString);
#ifdef VERBOSE_PARSER
	  cout << fileName << ':' << lineNb << ": " << dataString << endl;
#endif
	  tokenizer<char_separator<char>> dimensionElements(dataString, dimensionElementsSeparator);
	  tokenizer<char_separator<char>>::const_iterator dimensionElementsIt = dimensionElements.begin();
	  if (dimensionElementsIt != dimensionElements.end())
	    {
	      try
		{
		  const unsigned int dimensionId = lexical_cast<unsigned int>(*dimensionElementsIt);
		  if (dimensionId >= n)
		    {
		      throw DataFormatException(fileName.c_str(), lineNb, ("dimension " + lexical_cast<string>(dimensionId) + " does not exist! (at most " + lexical_cast<string>(n - 1) + " expected)").c_str());
		    }
		  if (++dimensionElementsIt != dimensionElements.end())
		    {
		      const unsigned int internalDimensionId = dimensionOrder[dimensionId];
		      dynamic_bitset<>& view = (*groupIt)[internalDimensionId];
		      const unordered_map<string, unsigned int>& labels2IdsView = labels2Ids[internalDimensionId];
		      tokenizer<char_separator<char>> elements(*dimensionElementsIt, elementSeparator);
		      for (const string& element : elements)
			{
			  const unordered_map<string, unsigned int>::const_iterator labels2IdsViewIt = labels2IdsView.find(element);
			  if (labels2IdsViewIt == labels2IdsView.end())
			    {
			      cerr << "Warning: ignoring " << element << " at line " << lineNb << " of " << fileName << " because it is absent from dimension " << dimensionId << " of the input data" << endl;
			    }
			  else
			    {
			      if (labels2IdsViewIt->second != numeric_limits<unsigned int>::max())
				{
				  view.set(labels2IdsViewIt->second);
				}
			    }
			}
		    }
		}
	      catch (bad_lexical_cast &)
		{
		  throw DataFormatException(fileName.c_str(), lineNb, ("the dimension should be an integer between 0 and " + lexical_cast<string>(n - 1) + '!').c_str());
		}
	      if (++dimensionElementsIt != dimensionElements.end())
		{
		  throw DataFormatException(fileName.c_str(), lineNb, "more than a pair (dimension, elements)!");
		}
	    }
	}
      file.close();
      unsigned int size = 0;
      for (const dynamic_bitset<>& dimension : *groupIt)
	{
	  size += dimension.count();
	}
      maxCovers.push_back(size);
      ++groupIt;
    }
}
Example #2
0
Image * ImageFactory::fromFile(const QString & filename, MatrixType t){
	debug("in");
	QImage qimage(filename);
	if(qimage.isNull()) throw NoFileException(filename);
	return fromQImage(qimage,t);
}