void CompactTriples::load(ModifiableTriples &triples, ProgressListener *listener) {
	triples.sort(order);

	IteratorTripleID *it = triples.searchAll();

	vector<unsigned int> vectorY, vectorZ;
	unsigned int lastX, lastY, lastZ;
	unsigned int x, y, z;

	// First triple
	if(it->hasNext()) {
		TripleID *triple = it->next();

		swapComponentOrder(triple, SPO, order);

		lastX = x = triple->getSubject();
		lastY = y = triple->getPredicate();
		lastZ = z = triple->getObject();

		vectorY.push_back(y);
		vectorZ.push_back(z);

		numTriples++;
	}

	// Rest of the triples
	while(it->hasNext()) {
		TripleID *triple = it->next();
		//cout << "111> " << triple << endl;

		swapComponentOrder(triple, SPO, order);
		//cout << "222> " << triple << endl;

		x = triple->getSubject();
		y = triple->getPredicate();
		z = triple->getObject();

		if(x!=lastX) {
			vectorY.push_back(0);
			vectorY.push_back(y);

			vectorZ.push_back(0);
			vectorZ.push_back(z);
		} else if(y!=lastY) {
			vectorY.push_back(y);
			vectorZ.push_back(0);
			vectorZ.push_back(z);
		} else {
			vectorZ.push_back(z);
		}

		lastX = x;
		lastY = y;
		lastZ = z;

		NOTIFYCOND(listener, "Converting to CompactTriples.", numTriples, triples.getNumberOfElements());
		numTriples++;
	}

	delete it;

	VectorUIntIterator itY(vectorY);
	VectorUIntIterator itZ(vectorZ);

	streamY->add(itY);
	streamZ->add(itZ);

#if 0
	// Debug Adjacency Lists
	cout << "Y" << vectorY.size() << "): ";
	for(unsigned int i=0;i<arrayY->getNumberOfElements();i++){
		cout << arrayY->get(i) << " ";
	}
	cout << endl;

	cout << "Z" << vectorZ.size() << "): ";
	for(unsigned int i=0;i<arrayZ->getNumberOfElements();i++){
		cout << arrayZ->get(i) << " ";
	}
	cout << endl;
#endif

}
	ERMsg CKNearestNeighbor::LoadFromString(const string& dataX, const string& dataY)
	{
		ERMsg msg;

		vector<string> species = GetSpeciesList(dataX);

		if (species.empty())
		{
			msg.ajoute("Invalid input file. Need to have one column named SpeciesID");
			return msg;
		}

		std::stringstream streamX(dataX);
		std::stringstream streamY(dataY);


		CSVIterator itX(streamX);
		CSVIterator itY(streamY);


		CSVRow const& headerX = itX.Header();
		CSVRow const& headerY = itY.Header();

		set<size_t> Xset = headerX.FindAll("X_");
		set<size_t> Yset = headerY.FindAll("Y_");

		vector<size_t> Xpos(Xset.begin(), Xset.end());
		vector<size_t> Ypos(Yset.begin(), Yset.end());
		vector<size_t> coordinatePos;


		if (Xpos.empty())
		{
			msg.ajoute("Invalid input file. Doesn't contain X value with prefix: X_");
			return msg;
		}


		m_X.SetNbDimension(Xpos.size()*species.size());
		for (size_t s = 0; s < species.size(); s++)
			for (size_t i = 0; i < Xpos.size(); i++)
				m_X.SetDimensionName(s*Xpos.size() + i, headerX[Xpos[i]] + "_" + species[s]);

		m_Y.resize(Ypos.size());
		for (size_t i = 0; i < Ypos.size(); i++)
			m_Y[i].SetName(headerY[Ypos[i]]);


		for (int x = 0; itX != CSVIterator(); x++)
		{
			m_X.resize(m_X.size() + 1);
			m_X[x].SetNbDimension(Xpos.size()*species.size());
			for (size_t s = 0; s < species.size(); s++, ++itX)
			{
				ASSERT(itX != CSVIterator());
				CSVRow const& line = *itX;

				for (size_t i = 0; i < Xpos.size(); i++)
				{
					if (Xpos[i] < (int)line.size())
					{
						if (line[Xpos[i]] != "NA")
						{
							m_X[x][s*Xpos.size() + i] = ToFloat(line[Xpos[i]]);
						}
						else
						{
							msg.ajoute("Reading error at line : " + ToString(i + 1));
							msg.ajoute("Row with missing values (\"NA\") not allowed.");
							return msg;
						}
					}
					else
					{
						msg.ajoute("Reading error at line : " + ToString(i + 1));
						msg.ajoute("Expected number of columns : " + ToString(Ypos.size()));
						msg.ajoute("Number of columns find : " + ToString(line.size()));
						return msg;
					}
				}
			}
		}


		//for(size_t i=0; i<Ypos.size(); i++)
		for (; itY != CSVIterator(); ++itY)
		{
			CSVRow const& line = *itY;
			for (size_t i = 0; i < Ypos.size(); i++)
			{
				if (Ypos[i] < (int)line.size())
				{
					if (line[Ypos[i]] != "NA")
					{
						m_Y[i].push_back(ToFloat(line[Ypos[i]]));
					}
					else
					{
						msg.ajoute("Reading error at line : " + ToString(i + 1));
						msg.ajoute("Row with missing values (\"NA\") not allowed.");
						return msg;
					}

				}
				else
				{
					msg.ajoute("Reading error at line : " + ToString(i + 1));
					msg.ajoute("Expected number of columns : " + ToString(Ypos.size()));
					msg.ajoute("Number of columns find : " + ToString(line.size()));
					return msg;
				}
			}
		}


		return msg;
	}