int pacc_wrap(const char *ign0, char *ign1, off_t ign2, struct s_node **result) { struct s_node *p, *q, *r, *s, *t; /* char *Char ← . { ref_str() } */ p = new_node(expr); p->text = "ref_str()"; q = p; p = new_node(any); p->next = q; q = p; p = new_node(seq); p->first = q; q = p; p = new_node(type); p->text = "char *"; p->next = q; q = p; p = new_node(rule); p->text = "Char"; p->first = q; r = p; /* void IdentCont ← IdentStart / d:Char &{ *d >= '0' && *d <= '9' } */ p = new_node(ident); p->text = "d"; s = p; p = new_node(guard); p->text = "*d >= '0' && *d <= '9'"; p->first = s; q = p; p = new_node(call); p->text = "Char"; s = p; p = new_node(bind); p->text = "d"; p->first = s; p->next = q; q = p; p = new_node(seq); p->first = q; s = p; p = new_node(call); p->text = "IdentStart"; q = p; p = new_node(seq); p->first = q; p->next = s; q = p; p = new_node(alt); p->first = q; q = p; p = new_node(type); p->text = "void"; p->next = q; q = p; p = new_node(rule); p->text = "IdentCont"; p->first = q; p->next = r; r = p; /* void IdentStart ← c:Char &{ *c >= 'a' && *c <= 'z' } */ p = new_node(ident); p->text = "c"; s = p; p = new_node(guard); p->text = "*c >= 'a' && *c <= 'z'"; p->first = s; q = p; p = new_node(call); p->text = "Char"; s = p; p = new_node(bind); p->text = "c"; p->first = s; p->next = q; q = p; p = new_node(seq); p->first = q; q = p; p = new_node(type); p->text = "void"; p->next = q; q = p; p = new_node(rule); p->text = "IdentStart"; p->first = q; p->next = r; r = p; /* Identifier :: char * ← i:(IdentStart IdentCont*) .* { ref_dup(i) } */ p = s_both(expr, "ref_dup(i)", s_text(ident, "i")); p = cons(s_both(rep, 0, s_new(any)), p); q = s_both(rep, 0, s_text(call, "IdentCont")); q = cons(s_text(call, "IdentStart"), q); q = s_both(bind, "i", s_kid(seq, q)); p = cons(q, p); p = cons(s_text(type, "char *"), s_kid(seq, p)); p = s_both(rule, "Identifier", p); r = cons(p, r); r = cons(s_text(preamble, 0), r); p = s_kid(grammar, r); *result = p; return 1; }
std::vector<double> & LyapunovExpsSolver::calcLE(double warmUpTime, double wudt, int numSteps, double stepTime, double dt, state_t &ini, double eps) { nld_sys->setSolveCombined(false); nld_sys->solve(warmUpTime, wudt, ini); state_t s0 = nld_sys->getState(); bool epsCrit = (eps > 0); LEs.resize(dim); for (int i=0; i<LEs.size(); i++) { LEs[i] = 0.0; } auto immediateLEs(LEs); for (auto &v : immediateLEs) v = 1e10; auto diff(LEs); nld_sys->setSolveCombined(true); int dboth = dim*(dim+1); state_t s_both(dboth); std::copy(s0.begin(), s0.end(), s_both.begin()); std::fill(s_both.begin()+dim, s_both.end(),0.0); for (int i=0; i<dim; i++) { s_both[dim+i+i*dim] = 1.0; } m_ImmLes.clear(); std::vector<double> norms(dim); for (auto &v: norms) v = 0; int actualSteps = numSteps; for (int i=0; i<numSteps; i++) { nld_sys->solve(stepTime, dt, s_both); s_both.swap(nld_sys->getState()); auto vecs =ublas::subrange(s_both,dim,dboth); GramShmidt(vecs, norms); for (int j=0; j<dim; j++) { // std::cout << "normed " << j << ":" << LE_matrix_ortonormed[j] << std::endl; LEs[j] += log(norms[j]); } for (int j=0; j<dim; j++) { double le = LEs[j]/((i+1)*stepTime); if (epsCrit) { double maxv = fabs(le) > fabs(immediateLEs[j]) ? fabs(le) : fabs(immediateLEs[j]); diff[j] = fabs(le-immediateLEs[j])/maxv; } immediateLEs[j] = le; } if (keepImmediateLEs) { std::vector<double> ln; for (auto &v : norms) ln.push_back(log(v)); ln.push_back(stepTime*(i+1)); m_ImmLes.push_back(ln); } if (epsCrit){ bool can_stop = true; for (auto v : diff) if (v > eps) { can_stop = false; actualSteps = i+1; break; } if (can_stop) { std::cout << "Desired accuracy achieved: iterations " << i << " out of " << numSteps << std::endl; break; } } } for (int i=0; i<dim; i++) { LEs[i] = LEs[i]/(actualSteps*stepTime); } calcKaplanYorkeDimension(); // if (debugFlag) { // ts.setNoLegend(true); // ts.plotRows(); // } return LEs; }