Changeset 418


Ignore:
Timestamp:
Jun 9, 2010 12:14:27 PM (14 years ago)
Author:
Anya Helene Bagge
Message:
  • random generator for terms
  • tests and axioms for term matching
  • fix term matcher
Location:
trunk/MagnoliaPlugin/src/org/magnolialang/parsetree
Files:
1 added
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/MagnoliaPlugin/src/org/magnolialang/parsetree/XaTreeFactory.java

    r411 r418  
    11package org.magnolialang.parsetree;
    22
     3import java.util.Random;
     4
    35import org.eclipse.imp.pdb.facts.IConstructor;
     6import org.eclipse.imp.pdb.facts.IInteger;
    47import org.eclipse.imp.pdb.facts.IList;
     8import org.eclipse.imp.pdb.facts.IListWriter;
     9import org.eclipse.imp.pdb.facts.IMap;
     10import org.eclipse.imp.pdb.facts.IMapWriter;
     11import org.eclipse.imp.pdb.facts.ITuple;
    512import org.eclipse.imp.pdb.facts.IValue;
    613import org.eclipse.imp.pdb.facts.IValueFactory;
     
    1118
    1219public class XaTreeFactory {
     20        private static final int RANDOM_CHANCE_CONS = 35;
     21        private static final int RANDOM_CHANCE_SEQ = 45;
     22        private static final int RANDOM_CHANCE_LEAF = 100;
     23        private static final int RANDOM_MAX_CHILDREN = 5;
    1324        public static TypeStore ts = new TypeStore(
    1425                        org.rascalmpl.values.uptr.Factory.getStore(),
     
    89100                return vf.constructor(Type_Child, vf.integer(index));
    90101        }
     102
     103        public static IConstructor randomTree(Random random) {
     104                return (IConstructor) randomTreeWithVars(random, 0, new UniqueGen("x"), 100, 1000);
     105        }
     106       
     107        public static ITuple randomTreeWithVars(Random random, int varChance) {
     108                return randomTreeWithVars(random, varChance, new UniqueGen("x"), 100, 5000);
     109        }
     110       
     111        private static ITuple randomTreeWithVars(Random random, int varChance, UniqueGen gen, int maxDepth, int maxSize) {
     112
     113                IConstructor tree, varTree;
     114                IMap env;
     115                int r = (int) (random.nextInt(100)*((150.0-maxDepth)/100.0));
     116                int size = 1;
     117                IConstructor var = null;
     118               
     119                if(random.nextInt(100) < varChance) {
     120                        var = termvar(gen.next(), "foo");
     121                        varChance = 0;
     122                }
     123               
     124                if(r < RANDOM_CHANCE_SEQ && maxDepth > 0) {
     125                       
     126                        //int num = (int) (RANDOM_MAX_CHILDREN*Math.pow(Math.abs(random.nextGaussian()), 2));
     127                        //System.out.println(num);
     128                        IListWriter lw1 = vf.listWriter(Type_XaTree);
     129                        IListWriter lw2 = vf.listWriter(Type_XaTree);
     130                        IMapWriter envw = vf.mapWriter(Type_TermVar, Type_XaTree);
     131                        while(random.nextDouble() < 0.6 && maxSize > 0) {
     132                                ITuple child = randomTreeWithVars(random, varChance, gen, maxDepth-1, maxSize-1);
     133                                maxSize -= ((IInteger)child.get(3)).intValue();
     134                                size += ((IInteger)child.get(3)).intValue();
     135                                lw1.append(child.get(0));
     136                                lw2.append(child.get(1));
     137                                envw.putAll((IMap) child.get(2));
     138                        }
     139
     140                        env = envw.done();
     141                        if(r < RANDOM_CHANCE_CONS) {
     142                                tree = cons("foo", "foo", lw1.done());
     143                                varTree = cons("foo", "foo", lw2.done());
     144                        }
     145                        else {
     146                                tree = seq("foo", lw1.done());
     147                                varTree = seq("foo", lw2.done());
     148                        }
     149                }
     150                else { // if(r < RANDOM_CHANCE_LEAF) {
     151                        int num = random.nextInt(RANDOM_MAX_CHILDREN) + 1;
     152                        StringBuffer s = new StringBuffer(num);
     153                        for(int i = 0; i < num; i++)
     154                                s.append((char)(random.nextInt('Z'-'A')+'A' + (random.nextBoolean() ? 0 : 'a'-'A')));
     155                        tree = leaf(s.toString(), "foo");
     156                        varTree =  leaf(s.toString(), "foo");
     157                        env = vf.map(Type_TermVar, Type_XaTree);
     158                        maxSize--;
     159                }
     160               
     161                if(var != null) {
     162                        env = env.put(var, varTree);
     163                        varTree = var;
     164                }
     165                return vf.tuple(tree, varTree, env, vf.integer(size));
     166        }
     167       
     168       
    91169}
     170class UniqueGen {
     171        String name;
     172        int counter;
     173       
     174        public UniqueGen(String name) {
     175                this.name = name;
     176                this.counter = 0;
     177        }
     178       
     179        String next() {
     180                return name + counter++;
     181        }
     182}
Note: See TracChangeset for help on using the changeset viewer.