#ifndef FDPROV_H #define FDPROV_H #include "dataProvider.h" #include "easylogging++.h" #include #include #include // Rank qid features class FileDP:public DataProvider { private: std::string fname; std::ifstream fin; public: FileDP(std::string fn=""):fname(fn){}; virtual int getDataSet(DataList &out){ DataEntry* e; out.clear(); int fsize; fin>>fsize; LOG(INFO)<<"Feature size:"<>e->rank; if (e->rank == 0) { delete e; break; } fin>>e->qid; e->feature.resize(fsize); for (int i=0;i>e->feature(i); } out.addEntry(e); } eof=true; return 0; } virtual int open(){fin.open(fname); eof=false;return 0;}; virtual int close(){fin.close();return 0;}; }; // label features class RidFileDP:public DataProvider { private: std::string fname; std::ifstream fin; DataList d; bool read; int pos; int qid; public: RidFileDP(std::string fn=""):fname(fn){read=false;}; virtual int getDataSet(DataList &out){ DataEntry *e; int fsize; if (!read) { d.clear(); fin >> fsize; LOG(INFO) << "Feature size:" << fsize; d.setfSize(fsize); while (!fin.eof()) { e = new DataEntry; fin >> e->qid; if (e->qid == "0") { delete e; break; } e->feature.resize(fsize); e->rank=-1; for (int i = 0; i < fsize; ++i) { fin >> e->feature(i); } d.addEntry(e); } pos = 0; qid = 1; } out.clear(); fsize = d.getfSize(); std::vector & dat = d.getData(); for (int i=0;iqid == dat[pos]->qid) { e = new DataEntry; e->rank=1; dat[i]->qid=std::to_string(qid); } else { e = new DataEntry; e->rank=-1; } e->feature.resize(d.getfSize()); e->qid=std::to_string(qid); for (int j = 0; j < fsize; ++j) { e->feature(i) = fabs(dat[i]->feature(j) -dat[pos]->feature(j)); } out.addEntry(e); } dat[pos]->qid=std::to_string(qid); ++qid; while (posrank!=-1) ++pos; if (pos==d.getSize()) eof = true; return 0; } virtual int open(){fin.open(fname); eof=false;return 0;}; virtual int close(){fin.close(); d.clear();return 0;}; }; #endif