Beispiel #1
0
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;
}
Beispiel #2
0
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;

}