Changeset 6278


Ignore:
Timestamp:
Jan 19, 2019, 2:44:46 PM (3 months ago)
Author:
cameron
Message:

Contextual simplification of start/end with complex context; fix for editd_test.

Location:
icGREP/icgrep-devel
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/QA/editd/run_all.py

    r5262 r6278  
    11from subprocess import *
    22from string import *
    3 import sys, os, optparse
     3import sys, os, optparse, shutil
    44
    55if __name__ == "__main__":
     
    88        options, args = option_parser.parse_args(sys.argv[1:])
    99        print(options.exec_dir)
    10         out_f = open('OutputFiles/reads2', 'w')
     10        output_home = 'OutputFiles'
     11        if os.path.exists(output_home):
     12                shutil.move(output_home, output_home + ".bak")
     13        os.mkdir(output_home)
     14        out_f = open(output_home + '/reads2', 'w')
    1115        expected_f = open('ExpectedOutput/reads2', 'r')
    1216        call([options.exec_dir+'/editd', '-f', 'TestFiles/reads2', 'chr.fa', '-display'], stdout=out_f)
    13         if open('OutputFiles/reads2', 'r').read()==expected_f.read():
     17        out_f.close()
     18        if open(output_home + '/reads2', 'r').read()==expected_f.read():
    1419                print('Edit Distance test succeeded.')
    1520        else:
  • icGREP/icgrep-devel/icgrep/re/re_contextual_simplification.cpp

    r6270 r6278  
    5252}
    5353
     54struct NonEmptyValidator : public RE_Validator {
     55    NonEmptyValidator() : RE_Validator() {}
     56    bool validateStart(const Start *) override {return false;}
     57    bool validateEnd(const End *) override {return false;}
     58    bool validateAssertion(const Assertion *) override {return false;}
     59    bool validateName(const Name * n) override {
     60        RE * defn = n->getDefinition();
     61        return defn && validate(defn);
     62    }
     63    bool validateDiff(const Diff * d) override {return validate(d->getLH());}
     64    bool validateSeq(const Seq * seq) override {
     65        for (RE * e : *seq) {
     66            if (validate(e)) return true;
     67        }
     68        return false;
     69    }
     70};
     71   
     72bool nonEmpty(const RE * r) {
     73    return NonEmptyValidator().validateRE(r);
     74}
    5475
    5576RE * firstSym(RE * re) {
     
    6081            UndefinedNameError(name);
    6182        }
    62     } else if (isa<CC>(re) || isa<Any>(re) || isa<Start>(re) || isa<End>(re)) {
     83    } else if (isa<CC>(re) || isa<Start>(re) || isa<End>(re)) {
    6384        return re;
    6485    } else if (Seq * seq = dyn_cast<Seq>(re)) {
     
    6687        for (auto & si : *seq) {
    6788            RE * fi = firstSym(si);
    68             if (isa<Any>(fi)) return fi;
    6989            cc = makeCC(cc, cast<CC>(fi));
    7090            if (!isNullable(si)) {
     
    7797        for (auto & ai : *alt) {
    7898            RE * fi = firstSym(ai);
    79             if (isa<Any>(fi)) return fi;
    8099            cc = makeCC(cc, cast<CC>(fi));
    81100        }
     
    86105        RE * lh = firstSym(diff->getLH());
    87106        RE * rh = firstSym(diff->getRH());
    88         if (isa<Any>(rh)) return makeCC();
    89         if (isa<Any>(lh)) lh = makeCC(0, 0x10FFFF);
    90107        return subtractCC(cast<CC>(lh), cast<CC>(rh));
    91108    } else if (Intersect * ix = dyn_cast<Intersect>(re)) {
    92109        RE * lh = firstSym(ix->getLH());
    93110        RE * rh = firstSym(ix->getRH());
    94         if (isa<Any>(lh)) return rh;
    95         if (isa<Any>(rh)) return lh;
    96111        return intersectCC(cast<CC>(lh), cast<CC>(rh));
    97112    }
     
    106121            UndefinedNameError(name);
    107122        }
    108     } else if (isa<CC>(re) || isa<Any>(re) || isa<Start>(re) || isa<End>(re)) {
     123    } else if (isa<CC>(re) || isa<Start>(re) || isa<End>(re)) {
    109124        return re;
    110125    } else if (Seq * seq = dyn_cast<Seq>(re)) {
     
    112127        for (auto & si : boost::adaptors::reverse(*seq)) {
    113128            RE * fi = finalSym(si);
    114             if (isa<Any>(fi)) return fi;
    115129            cc = makeCC(cc, cast<CC>(fi));
    116130            if (!isNullable(si)) {
     
    123137        for (auto & ai : *alt) {
    124138            RE * fi = finalSym(ai);
    125             if (isa<Any>(fi)) return fi;
    126139            cc = makeCC(cc, cast<CC>(fi));
    127140        }
     
    132145        RE * lh = finalSym(diff->getLH());
    133146        RE * rh = finalSym(diff->getRH());
    134         if (isa<Any>(rh)) return makeCC();
    135         if (isa<Any>(lh)) lh = makeCC(0, 0x10FFFF);
    136147        return subtractCC(cast<CC>(lh), cast<CC>(rh));
    137148    } else if (Intersect * ix = dyn_cast<Intersect>(re)) {
    138149        RE * lh = finalSym(ix->getLH());
    139150        RE * rh = finalSym(ix->getRH());
    140         if (isa<Any>(lh)) return rh;
    141         if (isa<Any>(rh)) return lh;
    142151        return intersectCC(cast<CC>(lh), cast<CC>(rh));
    143152    }
     
    238247        RE_Context nextContext = cursor.ctxt;
    239248        RE * item = cursor.ctxt.currentItem();
    240         if (isZeroWidth(item) || isNullable(item)) {
     249        if (!nonEmpty(item)) {
    241250            return ContextMatchCursor{RE_Context{nullptr, nullptr, 0}, MatchResult::Possible};
    242251        }
     
    361370    return ContextMatchCursor{cursor.ctxt, MatchResult::Possible};
    362371}
    363 
     372   
    364373class ContextualAssertionSimplifier : public RE_Transformer {
    365374public:
     
    398407            if (isa<Start>(prior)) {
    399408                return makeSeq();
    400             } else if (isa<CC>(prior)) {
     409            } else if (nonEmpty(prior)) {
    401410                return makeAlt();
    402411            }
     
    410419            if (isa<End>(following)) {
    411420                return makeSeq();
    412             } else if (isa<CC>(following)) {
     421            } else if (nonEmpty(following)) {
    413422                return makeAlt();
    414423            }
Note: See TracChangeset for help on using the changeset viewer.