Mercurial > hg > Applications > JavaLite
changeset 49:6213620eb992
*** empty log message ***
author | kono |
---|---|
date | Sun, 06 Jan 2008 21:02:24 +0900 |
parents | 49ccbe7a0a32 |
children | 9a0deb4bc5e7 |
files | src/lite/ITLNodeFactory.java src/sbdd/BDDID.java src/sbdd/BDDInterface.java src/sbdd/BDDSatisfier.java src/sbdd/SBDDEntry.java src/sbdd/SBDDFactory.java src/sbdd/SBDDFactoryInterface.java src/sbdd/SBDDHash.java src/sbdd/SBDDSet.java src/sbdd/SBDDTest.java |
diffstat | 10 files changed, 495 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lite/ITLNodeFactory.java Sun Jan 06 18:41:36 2008 +0900 +++ b/src/lite/ITLNodeFactory.java Sun Jan 06 21:02:24 2008 +0900 @@ -1,7 +1,10 @@ package lite; import java.util.LinkedList; +import java.util.Set; +import java.util.Map.Entry; +import sbdd.BDDInterface; import sbdd.SBDDFactoryInterface; import logicNode.parser.Command; @@ -95,4 +98,8 @@ public ITLSolver bddNode(ITLSolver cond, ITLSolver high, ITLSolver low) { return new BDDSolver((VariableSolver)cond,high,low); } + + public Set<Entry<ITLSolver, BDDInterface>> set() { + return null; + } }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/sbdd/BDDID.java Sun Jan 06 21:02:24 2008 +0900 @@ -0,0 +1,15 @@ +package sbdd; + +public enum BDDID { + + + Exists, + True , + False , + Variable, + Chop, + Next, + Empty, + Projection, BDD; + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/sbdd/BDDInterface.java Sun Jan 06 21:02:24 2008 +0900 @@ -0,0 +1,7 @@ +package sbdd; + +import lite.BDDSolver; + +public interface BDDInterface { + public BDDSolver toSBDD(SBDDFactoryInterface sf); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/sbdd/BDDSatisfier.java Sun Jan 06 21:02:24 2008 +0900 @@ -0,0 +1,44 @@ +package sbdd; + + + +import java.util.LinkedList; +import java.util.Set; +import java.util.Map.Entry; + +import verifier.Backtrack; +import lite.Continuation; +import lite.ITLSatisfier; +import lite.ITLSolver; +import lite.Next; + +public class BDDSatisfier extends ITLSatisfier { + + + /** + * + */ + private static final long serialVersionUID = 1L; + public Set<SBDDEntry> state; + public LinkedList<SBDDEntry> queue; + + public BDDSatisfier(ITLSolver p) { + lf = new SBDDFactory(); + this.empty = p; // have to be the same in the parser + state = lf.set(); + true_ = SBDDFactory.trueSolver; + } + + + class allNext implements Next { + public ITLSolver next(ITLSatisfier sat, Continuation next, ITLSolver value) throws Backtrack { + if (value!=null) { + SBDDEntry e = state.get(value); + if (!e.expanded) { + queue.add(e); + } + } + throw backtrack; + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/sbdd/SBDDEntry.java Sun Jan 06 21:02:24 2008 +0900 @@ -0,0 +1,25 @@ +package sbdd; + + +import lite.ITLSolver; + + +public class SBDDEntry { + + public static int count = 0; + + public ITLSolver key; + boolean expanded = false; + + public SBDDEntry(ITLSolver now) { + this.key = now; + } + + public boolean equals(Object e0) { + if (e0.getClass()!=this.getClass()) return false; + SBDDEntry e = (SBDDEntry) e0; + return key==null?e.key==null: key.equals(e.key); + } + + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/sbdd/SBDDFactory.java Sun Jan 06 21:02:24 2008 +0900 @@ -0,0 +1,125 @@ +package sbdd; + + +import java.util.Set; + +import lite.BDDSolver; +import lite.ITLNodeFactory; +import lite.ITLSolver; +import logicNode.parser.TokenID; + + +public class SBDDFactory implements SBDDFactoryInterface { + + public static final ITLSolver trueSolver = new BDDSolver(ITLNodeFactory.trueSolver,BDDID.True,TokenID.True.hash); + public static final ITLSolver falseSolver = new BDDSolver(ITLNodeFactory.falseSolver,BDDID.False,TokenID.False.hash); + public static final ITLSolver chopSolver = new BDDSolver(BDDID.Chop,TokenID.Chop.hash); + public static final ITLSolver existsSolver = new BDDSolver(BDDID.Exists,TokenID.Exists.hash); + public static final ITLSolver nextSolver = new BDDSolver(BDDID.Next,TokenID.Next.hash); + public static final ITLSolver emptySolver = new BDDSolver(ITLNodeFactory.emptySolver,BDDID.Empty,TokenID.Empty.hash); + public static final ITLSolver projSolver = new BDDSolver(BDDID.Projection,TokenID.Projection.hash); + public SBDDSet hash; + ITLNodeFactory itlf; + + SBDDFactory() { + hash = new SBDDSet(this); + itlf = new ITLNodeFactory(); + + hash.put(falseSolver); + hash.put(trueSolver); + hash.put(existsSolver); + hash.put(nextSolver); + hash.put(chopSolver); + hash.put(emptySolver); + hash.put(projSolver); + } + + + public ITLSolver bddNode(ITLSolver lvar, ITLSolver solver, ITLSolver solver2) { + ITLSolver v = new BDDSolver(lvar,solver,solver2,BDDID.BDD); + return hash.put(v); + } + + public ITLSolver chopNode(ITLSolver solver, ITLSolver solver2) { + ITLSolver v = itlf.chopNode(solver.toSBDD(this),solver2.toSBDD(this)); + BDDSolver b = new BDDSolver(v,trueSolver,falseSolver,BDDID.Chop); + return hash.put(b); + } + + public ITLSolver emptyNode() { + return emptySolver; + } + + public ITLSolver existsNode(ITLSolver solver, ITLSolver solver2) { + ITLSolver v = itlf.existsNode(solver,solver2); + BDDSolver b = new BDDSolver(v,trueSolver,falseSolver,BDDID.Exists); + return hash.put(b); + } + + public ITLSolver falseNode() { + return falseSolver; + } + + public ITLSolver nextNode(ITLSolver solver) { + ITLSolver v = itlf.nextNode(solver); + BDDSolver b = new BDDSolver(v,trueSolver,falseSolver,BDDID.Next); + return hash.put(b); + } + + public ITLSolver projectionNode(ITLSolver solver, ITLSolver solver2) { + ITLSolver v = itlf.projectionNode(solver,solver2); + BDDSolver b = new BDDSolver(v,trueSolver,falseSolver,BDDID.Projection); + return hash.put(b); + } + + public ITLSolver trueNode() { + return trueSolver; + } + + public ITLSolver variableNode(String name, boolean value) { + ITLSolver v = new BDDSolver(itlf.variableNode(name, value),trueSolver,falseSolver,BDDID.Variable); + return hash.put(v); + } + + + public ITLSolver andNode(ITLSolver left, ITLSolver right) { + + BDDSolver lb = left.toSBDD(this); + BDDSolver rb = right.toSBDD(this); + if (lb==falseSolver||rb==falseSolver) + return falseSolver; + if (lb==trueSolver) + return rb; + lb = (BDDSolver) lb.and(this, rb); + return hash.put(lb); + } + + + public ITLSolver notNode(ITLSolver node) { + BDDSolver nb = node.toSBDD(this); + if (nb==falseSolver) return trueSolver; + if (nb==trueSolver) return falseSolver; + nb = (BDDSolver) nb.not(this); + return hash.put(nb); + } + + + public ITLSolver orNode(ITLSolver left, ITLSolver right) { + BDDSolver lb = left.toSBDD(this); + BDDSolver rb = right.toSBDD(this); + if (lb==trueSolver||rb==trueSolver) + return trueSolver; + if (lb==falseSolver) + return rb; + lb = (BDDSolver) lb.or(this, rb); + return hash.put(lb); + } + + + public SBDDSet set() { + return hash; + } + + + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/sbdd/SBDDFactoryInterface.java Sun Jan 06 21:02:24 2008 +0900 @@ -0,0 +1,32 @@ +package sbdd; + +import lite.ITLSolver; + + +public interface SBDDFactoryInterface { + + public ITLSolver bddNode(ITLSolver lvar, ITLSolver solver, ITLSolver solver2); + + public ITLSolver chopNode(ITLSolver solver, ITLSolver solver2); + + public ITLSolver emptyNode(); + + public ITLSolver existsNode(ITLSolver solver, ITLSolver solver2); + + public ITLSolver falseNode(); + + public ITLSolver nextNode(ITLSolver solver); + + public ITLSolver projectionNode(ITLSolver solver, ITLSolver solver2); + + public ITLSolver trueNode(); + + public ITLSolver variableNode(String name, boolean value); + + public ITLSolver andNode(ITLSolver left, ITLSolver right); + public ITLSolver orNode(ITLSolver left,ITLSolver right); + public ITLSolver notNode(ITLSolver node); + + public SBDDSet set(); + +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/sbdd/SBDDHash.java Sun Jan 06 21:02:24 2008 +0900 @@ -0,0 +1,53 @@ +package sbdd; + + +import java.util.AbstractMap; +import java.util.Set; + +import lite.*; +import logicNode.parser.TokenID; + +public class SBDDHash extends AbstractMap<ITLSolver,BDDInterface> { + + SBDDSet sbddset; + private SBDDFactoryInterface sf; + int lastVar ; + + SBDDHash() { + sbddset = new SBDDSet(); + lastVar = TokenID.Projection.hash+ 1; + } + + SBDDHash(Set<Entry<ITLSolver, BDDInterface>> sbddset) { + this.sbddset = (SBDDSet) sbddset; + sf = new SBDDFactory(); + } + + public SBDDHash(SBDDFactoryInterface factory) { + this(); + } + + @Override + public BDDSolver put(ITLSolver key,BDDInterface value) { + BDDSolver std = key.toSBDD(sf); + SBDDEntry e = new SBDDEntry(std,std); + if (sbddset.contains(e)) { + return std; + } else { + if (sbddset.add(e)) { + value.setHash(sbddset.hash); + } + } + return std; + } + + + @Override + public Set<Entry<ITLSolver, BDDInterface>> entrySet() { + return sbddset; + } + + public String toString() { + return sbddset.toString(); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/sbdd/SBDDSet.java Sun Jan 06 21:02:24 2008 +0900 @@ -0,0 +1,114 @@ +package sbdd; + +import java.util.AbstractSet; +import java.util.Collection; +import java.util.Iterator; +import java.util.Set; + +import lite.BDDSolver; +import lite.ITLSolver; + +public class SBDDSet extends AbstractSet<SBDDEntry> + implements Set<SBDDEntry> { + public SBDDEntry[] sbddArray ; + public int hash; + private int hash0; + private int hashSize = 1024; + public Object lastEntry; + SBDDFactory sf; + + SBDDSet() { + sbddArray = new SBDDEntry [hashSize]; + } + + SBDDSet(SBDDFactory sf) { + sbddArray = new SBDDEntry [hashSize]; + this.sf = sf; + } + + SBDDSet(SBDDFactory sf, int size) { + sbddArray = new SBDDEntry [size]; + hashSize = size; + this.sf = sf; + } + + SBDDSet(Collection<SBDDEntry> c) { + sbddArray = (SBDDEntry[]) c.toArray(); + } + + @Override + public Iterator<SBDDEntry> iterator() { + return new Iterator<SBDDEntry>() { + + public boolean hasNext() { + return (hash!=hash0 && sbddArray[hash % hashSize]!=null) ; + } + + public SBDDEntry next() { + return sbddArray[hash++ % hashSize]; + } + + public void remove() { + } + + }; + } + + @Override + public boolean contains(Object e) { + lastEntry = null; + hash = e.hashCode()%hashSize; + hash0 = hash-1+hashSize; + while(sbddArray[hash%hashSize]!=null && hash!=hash0) { + if (sbddArray[hash%hashSize].equals(e)) return true; + hash ++; + } + if (hash!=hash0) lastEntry = e; + return false; + // return super.contains(e); + } + + + @Override + public int size() { + return hashSize; + } + + @Override + public boolean add(SBDDEntry e) { + // check hash is already set by contains + if (lastEntry!=e) { + if (contains(e)||hash==hash0) return false; + } + sbddArray[hash%hashSize] = (SBDDEntry) e; + return true; + } + + public BDDSolver put(ITLSolver key) { + BDDSolver std = key.toSBDD(sf); + SBDDEntry e = new SBDDEntry(std); + if (contains(e)) { + return std; + } else { + add(e); + } + return std; + } + + + public String toString() { + String s = "SBDDSet[\n"; + /* + for(Entry<ITLSolver, BDDInterface>e : sbddset) { + s += e.getValue().hashCode()+":"+e.getValue()+"\n"; + } */ + for(int i = 0;i<sbddArray.length;i++) { + if (sbddArray[i]!=null) { + SBDDEntry e = sbddArray[i]; + s += "\t"+i+"\thash="+e.key.hashCode()+":"+e.key+"\n"; + } + } + return s+"]"; + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/sbdd/SBDDTest.java Sun Jan 06 21:02:24 2008 +0900 @@ -0,0 +1,73 @@ +package sbdd; + +import verifier.Backtrack; +import lite.BDDSolver; +import lite.Continuation; +import lite.ITLNodeFactory; +import lite.ITLNodeFactoryInterface; +import lite.ITLNodeParser; +import lite.ITLSatisfier; +import lite.ITLSolver; +import lite.Next; + +public class SBDDTest { + + + + ITLNodeParser<ITLSolver> p; + ITLSatisfier sat; + SBDDFactory sf; + ITLNodeFactoryInterface<ITLSolver> lf; + + public static void main(String arg[]) { + + SBDDTest test = new SBDDTest(); + + test.bddTest(); + test.satTest(); + } + + SBDDTest() { + + lf = new ITLNodeFactory(); + p = new ITLNodeParser<ITLSolver>(lf); + sf = new SBDDFactory(); + sat = new BDDSatisfier(p.emptyNode); + } + + public void bddTest() { + + BDDSolver b; + ITLSolver s = p.parse("p&q"); + b = s.toSBDD(sf); + System.out.println(b); + } + + public void satTest() { + + SBDDTest test = new SBDDTest(); + + test.showAllNext("p&q"); + test.showAllNext("true&q"); + test.showAllNext("~(true& ~q)"); + test.showAllNext("proj(length(3),<>(p))"); + + } + + public void showAllNext(String s) { + ITLSolver n = p.parse(s); + BDDSolver b = n.toSBDD(sf); + System.out.println(b); + sat.develop(b, new Print()); + System.out.println(sf.hash); + System.out.println(); + } + + class Print implements Next { + public ITLSolver next(ITLSatisfier sat, Continuation next, ITLSolver value) throws Backtrack { + System.out.println(" "+sat.choicePoint()+" -> "+value); + throw sat.backtrack; + } + } + +}