#include #include #include #include "Vector.hh" #include "Matrix.hh" #include "lorenz.hh" #include "lorenz1.hh" #include "lorenz3.hh" #include "lorenz4.hh" #include "Clock.hh" #include "Solve.hh" static const int LARGENUM=1000000; void distFromString(Vector& v, char *s, double& dist, double& err){ double T; Matrix *po = returnPO(s, T, err); int indx; double shft; findMinDist(*po, v, indx, shft, dist); delete po; } void distFromString(Vector& v, char *s, double& dist){ double err; distFromString(v, s, dist, err); if(err > 1e-10) dist = LARGENUM; } void rotateString2Front(Vector& v, char *s){ double T; double err; Matrix *po = returnPO(s, T, err); if(err > 1e-10){ cout<<"error in po too large"<getm(), po->getn()); int i,j; int n = po->getn(); for(i=0; i < po->getm(); i++) for(j=0; j < n; j++) potemp(i,j) = (*po)(i, (j+indx)%n); findSymString(potemp, s); } //uses orbits loaded into library in lorenz1.C void matchPoint2String(Vector& v, int len, char *s, double& dist){ findClosestString(v, len, s); rotateString2Front(v, s); distFromString(v, s, dist); } void findLookAheadBits(int lindx, int lwidth, char *ss){ assert(lwidth > 0); assert((0<=lindx)&&(lindx < pow(2,lwidth))); int i; for(i=0; i < lwidth; i++){ ss[i] = (lindx%2==0)? 'A':'B'; lindx = lindx/2; } ss[lwidth] = '\0'; } void findLookAheadString(char *s, int sindx, int lindx, int lwidth, char*ss){ strcpy(ss, s); assert((0<=sindx)&&(sindx<=strlen(s))); ss[sindx] = '\0'; char sbits[100]; findLookAheadBits(lindx, lwidth, sbits); strcat(ss, sbits); strcat(ss, s+sindx); } void findBestLookAheadString(Vector& v, char *s, int lwidth, char *ss, double& dist){ static int trialCount = 0; //static ofstream ofile("DATA6/trials"); double mindist=LARGENUM; char stemp[200]; int i, j; for(i=strlen(s); ((i >= strlen(s)-6)&&(i>0)); i--) if(i==strlen(s)-6) i=1; for(j=0; j < pow(2.0, lwidth); j++){ findLookAheadString(s, i, j, lwidth, stemp); trialCount++; double tempdist; //ofile<<"trying ("< 27.0) advancePoint2Section(pt1, h/2); else{ pt1 = pt2; advancePoint2Section(pt1, h); } } //point can be anywhere void advancePoint2ANYSection(Vector& pt1, double h){ if(fabs(pt1(2) - 27.0) < 1e-6) return; Vector pt2(3); advancePoint(pt1, h, pt2); if(fabs(pt2(2) - 27.0) < 1e-6){ pt1 = pt2; return; } while(!(((pt2(2) > 27.0) && (pt1(2) < 27.0))|| ((pt2(2) < 27.0) && (pt1(2) > 27.0)))){ pt1 = pt2; advancePoint(pt1, h, pt2); } h = h/2; advancePoint2ANYSection(pt1, h); } void shift2FirstPoint(Matrix& po, char *s){ char* ss = new char[2*strlen(s)]; findSymString(po, ss); int indxss; int lenoffit; stringbestfit(s, 0, ss, indxss, lenoffit); if(!isequal(ss, s)){ cout<<"shift2FirstPoint: ss doesnt equal s"<25); int i; cout< 1e-10)//err is 100 if symstr(*po) != s dist = dist+err; delete po; return dist; } void extendSwithBn(char *s, int n, char *tail, char *ss){ int len = strlen(s); strcpy(ss, s); int i; for(i=len; i < len+n; i++) ss[i] = 'B'; ss[len+n] = 'A'; ss[len+n+1] = '\0'; strcat(ss, tail); } void distFromSBn(Vector& pt, char *s, char *tail, Vector& count, Vector& dist){ char *ss = new char[strlen(s)+50]; count(0) = InvalidCount; count(1) = InvalidCount; count(2) = 1; dist(0) = InvalidDist; dist(1) = InvalidDist; extendSwithBn(s, 1, tail, ss); dist(2) = distFromFirstPoint(pt, ss); int i; for(i=2; i<=RepeatMax; i++){ extendSwithBn(s, i, tail, ss); //cout< dist(1)) break; } if((count(2) == RepeatMax) && (dist(2) < dist(1))){ dist(0) = InvalidDist; dist(1) = InvalidDist; dist(2) = InvalidDist; } } void extendSwithAn(char *s, int n, char *tail, char *ss){ int len = strlen(s); strcpy(ss, s); int i; for(i=len; i < len+n; i++) ss[i] = 'A'; ss[(len+n)] = 'B'; ss[(len+n)+1] = '\0'; strcat(ss, tail); } void distFromSAn(Vector& pt, char *s, char *tail, Vector& count, Vector& dist){ char *ss = new char[(strlen(s)+50)]; count(0) = InvalidCount; count(1) = InvalidCount; count(2) = 1; dist(0) = InvalidDist; dist(1) = InvalidDist; extendSwithAn(s, 1, tail, ss); dist(2) = distFromFirstPoint(pt, ss); int i; for(i=2; i<=RepeatMax; i++){ extendSwithAn(s, i, tail, ss); //cout< dist(1)) break; } if((count(2)==RepeatMax)&&(dist(2) < dist(1))){ dist(0) = InvalidDist; dist(1) = InvalidDist; dist(2) = InvalidDist; } } FwdFit::FwdFit(Vector& ptt, char *taill){ char emptystring[10] = ""; FwdFit(ptt, emptystring, taill); }; FwdFit::FwdFit(Vector& ptt, char *head, char *taill) :pt(3), dist(NF), tridist(3*NF) { pt = ptt; strcpy(tail, taill); if((fabs(pt(2)-27.0) > 1e-10) || (pt(0) >= 0)) cout<<"FwdFit object not formed properly"<=0); int i = 0; for(i=0; i < n; i++) ss[i] = c; ss[n] = '\0'; } void FwdFit::initialize(char *head){ char s[100]; strcpy(s, head); int len = strlen(s); Vector ddist(3); Vector count(3); char ichar; if((len!=0)&&(s[len-1] == 'A')){ ichar = 'B'; distFromSBn(pt, s, tail, count, ddist); exchar = 'A'; } else{ ichar = 'A'; distFromSAn(pt, s, tail, count, ddist); exchar = 'B'; } dist(0) = ddist(0); dist(1) = ddist(1); dist(2) = ddist(2); char ss[40]; if(dist(0) != InvalidDist){ strcpy(ffit[0], s); repeatchar(ichar, (int)count(0), ss); strcat(ffit[0], ss); } if(dist(1) != InvalidDist){ strcpy(ffit[1], s); repeatchar(ichar, (int)count(1), ss); strcat(ffit[1], ss); } if(dist(2) != InvalidDist){ strcpy(ffit[2], s); repeatchar(ichar, (int)count(2), ss); strcat(ffit[2], ss); } trifurcate(); sorttrifits(); } void FwdFit::trifurcateAt(int ind){ if(dist(ind) == InvalidDist){ tridist(3*ind) = InvalidDist; tridist(3*ind+1) = InvalidDist; tridist(3*ind+2) = InvalidDist; strcpy(triffit[3*ind], InvalidString); strcpy(triffit[3*ind+1], InvalidString); strcpy(triffit[3*ind+2], InvalidString); return; } char s[50]; strcpy(s, ffit[ind]); cout<<"trifurcating s="< tridist(j)){ swapstrings(triffit[i], triffit[j]); swapvector(tridist, i, j); } } } void FwdFit::copytrifits(){ int i; for(i=0; i < NF; i++){ dist(i) = tridist(i); strcpy(ffit[i], triffit[i]); exchar = triexchar; } } void FwdFit::updatefit(){ copytrifits(); trifurcate(); sorttrifits(); } void FwdFit::printfit(ostream& ofile){ int i; ofile<<"printing top five ..."<= 0; i--) if(s[i] != 'B') break; else num++; return num; } void ZeroFit::nextstring(){ int nb = numoftrailingBs(sf); int len = strlen(sf); double tol = 1e-8; if((err > tol) && (nb < RepeatMax)){//begin putting in As sf[len] = 'A'; int i; for(i=1; i <= RepeatMax; i++) sf[len+i] = 'B'; sf[len+RepeatMax+1] = '\0'; } else if((err > tol) && (nb==RepeatMax)){//begin taking away Bs sf[len-nb-1] = 'B'; sf[len-1] = '\0'; sf[len-2] = '\0'; } else if(nb < RepeatMax){//take away a B sf[len-1] = '\0'; } else if(nb == RepeatMax){//put in an A sf[len-nb] = 'A'; sf[len] = 'B'; sf[len+1] = '\0'; } cout<<"sf: "< 1e-8)) return -1; Vector zero(3); zero(0) = 0; zero(1) = 0; zero(2) = 0; double dist = returnMinDist(*po, zero); return dist; }