#include "pattern.h" #include #define _CHECK_INDEX #define _NBPAT 200 /*inline*/ patterns::patterns() : nbVar(0), nbPat(0), patCur(0), index(0,0), sizePat(1,0), coverPat(1,0), weightPat(1,0), order(1,0) {} /*inline*/ patterns::patterns(int maxDgr) : nbVar(0), nbPat(0), patCur(0), index(_NBPAT,maxDgr), sizePat(1,_NBPAT), coverPat(1,_NBPAT), weightPat(1,_NBPAT), order(1,_NBPAT) {} /*inline*/ patterns::~patterns() {} /*inline*/ int patterns::nbPatterns() const { return nbPat; } /*inline*/ void patterns::first() { patCur=0; } /*inline*/ void patterns::next() { patCur++; } /*inline*/ boolean patterns::eol() { return (patCur>=nbPat); } patterns& patterns::add(const int n, const Matrix& dblIndices, const int cover, const float weight) { //int i; ?? if ( !nbPat ) nbVar=n; if ( n!=nbVar ) { flog<< "### patterns based on different sets of variables!\n" << flush; return *this; } if ( nbPat == index.m() ) { index.resize_(index.m()+_NBPAT,index.n()); sizePat.resize_(1,index.m()); coverPat.resize_(1,index.m()); weightPat.resize_(1,index.m()); order.resize_(1,index.m()); } if ( dblIndices.n() > index.n() ) { flog<< "### pattern is longer than expected!\n" << flush; return *this; } if ( dblIndices.n() ) index.s(nbPat,1,0,dblIndices.n()) = dblIndices; sizePat(nbPat) = dblIndices.n(); coverPat(nbPat) = cover; weightPat(nbPat) = weight; order(nbPat) = nbPat; nbPat++; return *this; } /*inline*/ patterns& patterns::empty() { nbPat=0; return *this; } /*inline*/ int patterns::size() const { return sizePat(order(patCur)); } int patterns::var(const int literalIndex) const { int res = index(order(patCur),literalIndex); return ( res < nbVar ) ? res : res-nbVar; } /*inline*/ boolean patterns::bar(const int literalIndex) const { return ( index(order(patCur),literalIndex) >= nbVar ); } /*inline*/ int patterns::coverage() const { return coverPat(order(patCur)); } /*inline*/ float& patterns::weight() { return weightPat(order(patCur)); } boolean patterns::fire (const Array& data) const { for (int varInd=0; varInd=nbPat ) throw whereOutOfRange( "void patterns::delPatterns(int patIndex)", "patIndex",patIndex,0,nbPat-1); #endif if ( patIndex < --nbPat ) { order(patIndex)=order(nbPat); } } void patterns::printPattern(ostream& s) { for (int j=0; jl) { //int k; ?? v=sizePat(order(r)); i=l-1; j=r; for(;;) { ++i; --j; if(i<0) i=0; while(((sizePat(order(i)) < v) || (sizePat(order(i)) == v && weightPat(order(i)) > weightPat(order(r))) || (sizePat(order(i)) == v && weightPat(order(i)) == weightPat(order(r)) && coverPat(order(i)) > coverPat(order(r)))) && i v) || (sizePat(order(j)) == v && weightPat(order(j)) < weightPat(order(r))) || (sizePat(order(j)) == v && weightPat(order(j)) == weightPat(order(r)) && coverPat(order(j)) < coverPat(order(r)))) && l=j) break; aux=order(i); order(i)=order(j); order(j)=aux; } aux=order(i); order(i)=order(r); order(r)=aux; sort(l,i-1); sort(i+1,r); } } // new function that implements a quicksort routine to sort the patterns // by degree, then weight, then coverage. void patterns::do_sort() { sort(0,nbPat-1); /* printf("\n correct pattern order is:\n"); for(int i=0;i<=nbPat-1;i++) printf("%d with pattern size %d\n", order(i), sizePat(order(i))); */ } ostream& operator << (ostream& s, patterns& ps) { Matrix cardinal(1,ps.index.n()+1,0); // ps.do_sort(); //new Mario for (int i=0; i> (const char* fileName, patterns& myself) { ifstream in(fileName); if ( !in ) throw whereWhich("void operator >> (char* fileName, patterns&)", "File open error"); int maxDgr; in >> myself.nbVar >> myself.nbPat >> maxDgr; myself.patCur=0; myself.index.resize(myself.nbPat,maxDgr); myself.order.resize(1,myself.nbPat); myself.sizePat.resize(1,myself.nbPat); myself.coverPat.resize(1,myself.nbPat); myself.weightPat.resize(1,myself.nbPat); for (int i=0; i> myself.index.s(i) >> myself.sizePat.s(0,1,i,1) >> myself.coverPat.s(0,1,i,1) >> myself.weightPat.s(0,1,i,1); } in.close(); }