From e7b21430c1e58bf2f92d79499a612446821a9406 Mon Sep 17 00:00:00 2001
From: jjenista <jjenista>
Date: Tue, 1 Jul 2008 21:49:10 +0000
Subject: [PATCH] special union of reachability sets works correctly now

---
 .../OwnershipAnalysis/ChangeTupleSet.java     | 13 +++-
 .../OwnershipAnalysis/ReachabilitySet.java    | 69 ++++++++++---------
 .../OwnershipAnalysis/TokenTuple.java         |  6 +-
 .../OwnershipAnalysis/TokenTupleSet.java      | 20 +++++-
 .../testTokens/Main.java                      | 39 ++++++++++-
 5 files changed, 104 insertions(+), 43 deletions(-)

diff --git a/Robust/src/Analysis/OwnershipAnalysis/ChangeTupleSet.java b/Robust/src/Analysis/OwnershipAnalysis/ChangeTupleSet.java
index c0d90104..5593285b 100644
--- a/Robust/src/Analysis/OwnershipAnalysis/ChangeTupleSet.java
+++ b/Robust/src/Analysis/OwnershipAnalysis/ChangeTupleSet.java
@@ -8,7 +8,7 @@ import java.io.*;
 
 public class ChangeTupleSet {
 
-    public HashSet<ChangeTuple> changeTuples;
+    private HashSet<ChangeTuple> changeTuples;
 
     public ChangeTupleSet() {
 	changeTuples = new HashSet<ChangeTuple>();
@@ -38,6 +38,15 @@ public class ChangeTupleSet {
     }
 
     public String toString() {
-	return changeTuples.toString();
+	String s = "[";
+
+	Iterator i = this.iterator();
+	while( i.hasNext() ) {
+	    s += "\n  "+i.next();
+	}
+
+	s += "\n]";
+
+	return s;
     }
 }
diff --git a/Robust/src/Analysis/OwnershipAnalysis/ReachabilitySet.java b/Robust/src/Analysis/OwnershipAnalysis/ReachabilitySet.java
index 6f612414..83d6bfce 100644
--- a/Robust/src/Analysis/OwnershipAnalysis/ReachabilitySet.java
+++ b/Robust/src/Analysis/OwnershipAnalysis/ReachabilitySet.java
@@ -8,12 +8,17 @@ import java.io.*;
 
 public class ReachabilitySet {
 
-    public HashSet<TokenTupleSet> possibleReachabilities;
+    private HashSet<TokenTupleSet> possibleReachabilities;
 
     public ReachabilitySet() {
 	possibleReachabilities = new HashSet<TokenTupleSet>();
     }
 
+    public ReachabilitySet( TokenTupleSet tts ) {
+	possibleReachabilities = new HashSet<TokenTupleSet>();
+	possibleReachabilities.add( tts );
+    }
+
     public ReachabilitySet( ReachabilitySet rs ) {
 	possibleReachabilities = (HashSet<TokenTupleSet>) rs.possibleReachabilities.clone(); // again, DEEP COPY?!
     }
@@ -59,49 +64,45 @@ public class ReachabilitySet {
 		while( itrRelement.hasNext() ) {
 		    TokenTuple e = (TokenTuple) itrRelement.next();
 
-		    if( o.contains( e ) ) {
-			theUnion.union( new TokenTupleSet( e.increaseArity() ) );
+		    if( o.containsToken( e.getToken() ) ) {
+			theUnion = theUnion.union( new TokenTupleSet( e.increaseArity() ) );
+		    } else {
+			theUnion = theUnion.union( new TokenTupleSet( e ) );
 		    }
 		}
+
+		Iterator itrOelement = o.iterator();
+		while( itrOelement.hasNext() ) {
+		    TokenTuple e = (TokenTuple) itrOelement.next();
+
+		    if( !theUnion.containsToken( e.getToken() ) ) {
+			theUnion = theUnion.union( new TokenTupleSet( e ) );
+		    }
+		}
+
+		if( !theUnion.isEmpty() ) {
+		    ctsOut = ctsOut.union( 
+			       new ChangeTupleSet( 
+			         new ChangeTuple( o, theUnion )
+					          )
+				          );
+		}
 	    }
 	}
 
 	return ctsOut;
     }
-}
-
-/*
-Set specialUnion( Set O, Set R ) {
-  Set C = {}
-
-  foreach o in O {
-    foreach r in R {
-
-      Set theUnion = {}
 
-      foreach e in r {
-        if o.contains( e ) {
-          if e.isSummaryToken() { // wait, stronger condition?
-            theUnion.add( e.copy().increaseArity() )
-          } else {
-            theUnion.add( e.copy() )
-          }
-        }
-      }
+    public String toString() {
+	String s = "[";
 
-      foreach e in o {
-        if !theUnion.contains( e ) {
-           theUnion.add( e.copy() )
-        }
-      }
+	Iterator i = this.iterator();
+	while( i.hasNext() ) {
+	    s += "\n  "+i.next();
+	}
 
-      if !theUnion.isEmpty() {
-        C.add( <o, theUnion> )
-      }
+	s += "\n]";
 
+	return s;	
     }
-  }
-
-  return C
 }
-*/
diff --git a/Robust/src/Analysis/OwnershipAnalysis/TokenTuple.java b/Robust/src/Analysis/OwnershipAnalysis/TokenTuple.java
index 4d496987..e135a680 100644
--- a/Robust/src/Analysis/OwnershipAnalysis/TokenTuple.java
+++ b/Robust/src/Analysis/OwnershipAnalysis/TokenTuple.java
@@ -63,14 +63,14 @@ public class TokenTuple
     public String toString() {
 	String s = "";
 	if( isNewSummary ) {
-	    s = "sum";
+	    s = "S";
 	}
 
 	String t = "1";
 	if( arity == ARITY_MANY ) {
-	    t = "many";
+	    t = "M";
 	}
 
-	return new String( "<"+token+s+", "+t+">" );
+	return new String( "<"+token+s+","+t+">" );
     }
 }
diff --git a/Robust/src/Analysis/OwnershipAnalysis/TokenTupleSet.java b/Robust/src/Analysis/OwnershipAnalysis/TokenTupleSet.java
index 626e5327..9a81a658 100644
--- a/Robust/src/Analysis/OwnershipAnalysis/TokenTupleSet.java
+++ b/Robust/src/Analysis/OwnershipAnalysis/TokenTupleSet.java
@@ -8,7 +8,7 @@ import java.io.*;
 
 public class TokenTupleSet {
 
-    public HashSet<TokenTuple> tokenTuples;
+    private HashSet<TokenTuple> tokenTuples;
 
     public TokenTupleSet() {
 	tokenTuples = new HashSet<TokenTuple>();
@@ -33,10 +33,26 @@ public class TokenTupleSet {
 	return ttsOut;
     }
 
-    public boolean contains( TokenTuple tt ) {
+    public boolean isEmpty() {
+	return tokenTuples.isEmpty();
+    }
+
+    public boolean containsTuple( TokenTuple tt ) {
 	return tokenTuples.contains( tt );
     }
 
+    // this should be a hash table so we can do this by key
+    public boolean containsToken( Integer token ) {
+	Iterator itr = tokenTuples.iterator();
+	while( itr.hasNext() ) {
+	    TokenTuple tt = (TokenTuple) itr.next();
+	    if( token.equals( tt.getToken() ) ) {
+		return true;
+	    }
+	}
+	return false;
+    }
+
     public String toString() {
 	return tokenTuples.toString();
     }
diff --git a/Robust/src/Tests/OwnershipAnalysisTest/testTokens/Main.java b/Robust/src/Tests/OwnershipAnalysisTest/testTokens/Main.java
index b6a05089..603ce6c9 100644
--- a/Robust/src/Tests/OwnershipAnalysisTest/testTokens/Main.java
+++ b/Robust/src/Tests/OwnershipAnalysisTest/testTokens/Main.java
@@ -30,7 +30,9 @@ public class Main {
 					 true,
 					 TokenTuple.ARITY_ONE );
 
-	TokenTuple tt1 = tt0.copy();
+	TokenTuple tt1 = new TokenTuple( new Integer( 1 ),
+					 true,
+					 TokenTuple.ARITY_ONE );
 
 	TokenTuple tt2 = new TokenTuple( new Integer( 2 ),
 					 true,
@@ -52,7 +54,7 @@ public class Main {
 	test( "tt2 equals tt3?", false, tt2.equals( tt3 ) );
 	test( "tt3 equals tt2?", false, tt3.equals( tt2 ) );
 
-	tt1.increaseArity();
+	tt1 = tt1.increaseArity();
 
 	test( "tt1 equals tt2?", false, tt1.equals( tt2 ) );
 	test( "tt2 equals tt1?", false, tt2.equals( tt1 ) );
@@ -72,5 +74,38 @@ public class Main {
 	System.out.println( "tts4 is "+tts4 );
 	System.out.println( "tts5 is "+tts5 );
 	System.out.println( "tts6 is "+tts6 );
+
+	ReachabilitySet rs0 = new ReachabilitySet( tts0 );
+	rs0 = rs0.union( new ReachabilitySet( tts2 ) );
+	rs0 = rs0.union( new ReachabilitySet( tts5 ) );
+
+	System.out.println( "rs0 is "+rs0 );
+
+	TokenTuple tt4 = new TokenTuple( new Integer( 4 ),
+					 true,
+					 TokenTuple.ARITY_ONE );
+
+	/*	TokenTuple tt5 = new TokenTuple( new Integer( 4 ),
+					 true,
+					 TokenTuple.ARITY_ONE );
+	*/
+	TokenTuple tt6 = new TokenTuple( new Integer( 6 ),
+					 false,
+					 TokenTuple.ARITY_ONE );
+
+	TokenTupleSet tts7 = new TokenTupleSet( tt4 );
+	//TokenTupleSet tts8 = new TokenTupleSet( tt5 );
+	TokenTupleSet tts9 = new TokenTupleSet( tt1 );
+	tts9 = tts9.union( tts2 );
+
+	ReachabilitySet rs1 = new ReachabilitySet( tts7 );
+	//rs1 = rs1.union( new ReachabilitySet( tts8 ) );
+	rs1 = rs1.union( new ReachabilitySet( tts9 ) );
+
+	System.out.println( "rs1 is "+rs1 );
+
+
+	ChangeTupleSet cts0 = rs0.unionUpArity( rs1 );
+	System.out.println( "cts0 is "+cts0 );
     }
 }
\ No newline at end of file
-- 
2.34.1