Merge pull request #374 from apache/simplified_setop_cases

Simplified set operations
diff --git a/src/main/java/org/apache/datasketches/SetOperationCornerCases.java b/src/main/java/org/apache/datasketches/SetOperationCornerCases.java
index 280c78f..0ff5804 100644
--- a/src/main/java/org/apache/datasketches/SetOperationCornerCases.java
+++ b/src/main/java/org/apache/datasketches/SetOperationCornerCases.java
@@ -26,8 +26,8 @@
   private static final long MAX = Long.MAX_VALUE;
 
   public enum IntersectResult {
-    NEW_1_0_T(1, "New{1.0, 0, T}"),
-    RESULTDEGEN_MIN_0_F(2, "New{MinTheta, 0, F}"),
+    EMPTY_1_0_T(1, "Empty{1.0, 0, T}"),
+    DEGEN_MIN_0_F(2, "Degenerate{MinTheta, 0, F}"),
     FULL_INTER(6, "Full Intersect");
 
     private int interRid;
@@ -48,9 +48,9 @@
   }
 
   public enum AnotbResult {
-    NEW_1_0_T(1, "New{1.0, 0, T}"),
-    RESULTDEGEN_MIN_0_F(2, "New{MinTheta, 0, F}"),
-    RESULTDEGEN_THA_0_F(3, "New{ThetaA, 0, F}"),
+    EMPTY_1_0_T(1, "Empty{1.0, 0, T}"),
+    DEGEN_MIN_0_F(2, "Degenerate{MinTheta, 0, F}"),
+    DEGEN_THA_0_F(3, "Degenerate{ThetaA, 0, F}"),
     SKA_TRIM(4, "Trim Sketch A by MinTheta"),
     SKETCH_A(5, "Sketch A Exactly"),
     FULL_ANOTB(7, "Full AnotB");
@@ -73,60 +73,41 @@
   }
 
   public enum CornerCase {
-    ResultDegen_ResultDegen(0,  "A{<1.0, 0, F} ; B{<1.0, 0, F}",
-        IntersectResult.RESULTDEGEN_MIN_0_F, AnotbResult.RESULTDEGEN_MIN_0_F), //0
-    ResultDegen_NewDegen(01,    "A{<1.0, 0, F} ; B{<1.0, 0, T}",
-        IntersectResult.NEW_1_0_T, AnotbResult.RESULTDEGEN_THA_0_F),   //1
-    ResultDegen_Estimation(02,  "A{<1.0, 0, F} ; B{<1.0,>0, F}",
-        IntersectResult.RESULTDEGEN_MIN_0_F, AnotbResult.RESULTDEGEN_MIN_0_F), //2
-    ResultDegen_New(05,         "A{<1.0, 0, F} ; B{ 1.0, 0, T}",
-        IntersectResult.NEW_1_0_T, AnotbResult.RESULTDEGEN_THA_0_F),   //5
-    ResultDegen_Exact(06,       "A{<1.0, 0, F} ; B{ 1.0,>0, F}",
-        IntersectResult.RESULTDEGEN_MIN_0_F, AnotbResult.RESULTDEGEN_THA_0_F), //6
+    Empty_Empty(055, "A{ 1.0, 0, T} ; B{ 1.0, 0, T}",
+        IntersectResult.EMPTY_1_0_T, AnotbResult.EMPTY_1_0_T),
+    Empty_Exact(056, "A{ 1.0, 0, T} ; B{ 1.0,>0, F}",
+        IntersectResult.EMPTY_1_0_T, AnotbResult.EMPTY_1_0_T),
+    Empty_Estimation(052, "A{ 1.0, 0, T} ; B{<1.0,>0, F}",
+        IntersectResult.EMPTY_1_0_T, AnotbResult.EMPTY_1_0_T),
+    Empty_Degen(050, "A{ 1.0, 0, T} ; B{<1.0, 0, F}",
+        IntersectResult.EMPTY_1_0_T, AnotbResult.EMPTY_1_0_T),
 
-    NewDegen_ResultDegen(010,   "A{<1.0, 0, T} ; B{<1.0, 0, F}",
-        IntersectResult.NEW_1_0_T, AnotbResult.NEW_1_0_T),     //8
-    NewDegen_NewDegen(011,      "A{<1.0, 0, T} ; B{<1.0, 0, T}",
-        IntersectResult.NEW_1_0_T, AnotbResult.NEW_1_0_T),     //9
-    NewDegen_Estimation(012,    "A{<1.0, 0, T} ; B{<1.0,>0, F}",
-        IntersectResult.NEW_1_0_T, AnotbResult.NEW_1_0_T),    //10
-    NewDegen_New(015,           "A{<1.0, 0, T} ; B{ 1.0, 0, T}",
-        IntersectResult.NEW_1_0_T, AnotbResult.NEW_1_0_T),    //13
-    NewDegen_Exact(016,         "A{<1.0, 0, T} ; B{ 1.0,>0, F}",
-        IntersectResult.NEW_1_0_T, AnotbResult.NEW_1_0_T),    //14
+    Exact_Empty(065, "A{ 1.0,>0, F} ; B{ 1.0, 0, T}",
+        IntersectResult.EMPTY_1_0_T, AnotbResult.SKETCH_A),
+    Exact_Exact(066, "A{ 1.0,>0, F} ; B{ 1.0,>0, F}",
+        IntersectResult.FULL_INTER, AnotbResult.FULL_ANOTB),
+    Exact_Estimation(062, "A{ 1.0,>0, F} ; B{<1.0,>0, F}",
+        IntersectResult.FULL_INTER, AnotbResult.FULL_ANOTB),
+    Exact_Degen(060, "A{ 1.0,>0, F} ; B{<1.0, 0, F}",
+        IntersectResult.DEGEN_MIN_0_F, AnotbResult.SKA_TRIM),
 
-    Estimation_ResultDegen(020, "A{<1.0,>0, F} ; B{<1.0, 0, F}",
-        IntersectResult.RESULTDEGEN_MIN_0_F, AnotbResult.SKA_TRIM),   //16
-    Estimation_NewDegen(021,    "A{<1.0,>0, F} ; B{<1.0, 0, T}",
-        IntersectResult.NEW_1_0_T, AnotbResult.SKETCH_A),     //17
-    Estimation_Estimation(022,  "A{<1.0,>0, F} ; B{<1.0,>0, F}",
-        IntersectResult.FULL_INTER, AnotbResult.FULL_ANOTB),  //18
-    Estimation_New(025,         "A{<1.0,>0, F} ; B{ 1.0, 0, T}",
-        IntersectResult.NEW_1_0_T, AnotbResult.SKETCH_A),     //21
-    Estimation_Exact(026,       "A{<1.0,>0, F} ; B{ 1.0,>0, F}",
-        IntersectResult.FULL_INTER, AnotbResult.FULL_ANOTB),  //22
+    Estimation_Empty(025, "A{<1.0,>0, F} ; B{ 1.0, 0, T}",
+        IntersectResult.EMPTY_1_0_T, AnotbResult.SKETCH_A),
+    Estimation_Exact(026, "A{<1.0,>0, F} ; B{ 1.0,>0, F}",
+        IntersectResult.FULL_INTER, AnotbResult.FULL_ANOTB),
+    Estimation_Estimation(022, "A{<1.0,>0, F} ; B{<1.0,>0, F}",
+        IntersectResult.FULL_INTER, AnotbResult.FULL_ANOTB),
+    Estimation_Degen(020, "A{<1.0,>0, F} ; B{<1.0, 0, F}",
+        IntersectResult.DEGEN_MIN_0_F, AnotbResult.SKA_TRIM),
 
-    New_ResultDegen(050,        "A{ 1.0, 0, T} ; B{<1.0, 0, F}",
-        IntersectResult.NEW_1_0_T, AnotbResult.NEW_1_0_T),    //40
-    New_NewDegen(051,           "A{ 1.0, 0, T} ; B{<1.0, 0, T}",
-        IntersectResult.NEW_1_0_T, AnotbResult.NEW_1_0_T),    //41
-    New_Estimation(052,         "A{ 1.0, 0, T} ; B{<1.0,>0, F}",
-        IntersectResult.NEW_1_0_T, AnotbResult.NEW_1_0_T),    //42
-    New_New(055,                "A{ 1.0, 0, T} ; B{ 1.0, 0, T}",
-        IntersectResult.NEW_1_0_T, AnotbResult.NEW_1_0_T),    //45
-    New_Exact(056,              "A{ 1.0, 0, T} ; B{ 1.0,>0, F}",
-        IntersectResult.NEW_1_0_T, AnotbResult.NEW_1_0_T),    //46
-
-    Exact_ResultDegen(060,      "A{ 1.0,>0, F} ; B{<1.0, 0, F}",
-        IntersectResult.RESULTDEGEN_MIN_0_F, AnotbResult.SKA_TRIM),   //48
-    Exact_NewDegen(061,         "A{ 1.0,>0, F} ; B{<1.0, 0, T}",
-        IntersectResult.NEW_1_0_T, AnotbResult.SKETCH_A),     //49
-    Exact_Estimation(062,       "A{ 1.0,>0, F} ; B{<1.0,>0, F}",
-        IntersectResult.FULL_INTER, AnotbResult.FULL_ANOTB),  //50
-    Exact_New(065,              "A{ 1.0,>0, F} ; B{ 1.0, 0, T}",
-        IntersectResult.NEW_1_0_T, AnotbResult.SKETCH_A),     //53
-    Exact_Exact(066,            "A{ 1.0,>0, F} ; B{ 1.0,>0, F}",
-        IntersectResult.FULL_INTER, AnotbResult.FULL_ANOTB);  //54
+    Degen_Empty(005, "A{<1.0, 0, F} ; B{ 1.0, 0, T}",
+        IntersectResult.EMPTY_1_0_T, AnotbResult.DEGEN_THA_0_F),
+    Degen_Exact(006, "A{<1.0, 0, F} ; B{ 1.0,>0, F}",
+        IntersectResult.DEGEN_MIN_0_F, AnotbResult.DEGEN_THA_0_F),
+    Degen_Estimation(002, "A{<1.0, 0, F} ; B{<1.0,>0, F}",
+        IntersectResult.DEGEN_MIN_0_F, AnotbResult.DEGEN_MIN_0_F),
+    Degen_Degen(000, "A{<1.0, 0, F} ; B{<1.0, 0, F}",
+        IntersectResult.DEGEN_MIN_0_F, AnotbResult.DEGEN_MIN_0_F);
 
     private static final Map<Integer, CornerCase> idToCornerCaseMap = new HashMap<>();
     private int id;
@@ -168,21 +149,20 @@
     public static CornerCase idToCornerCase(final int id) {
       final CornerCase cc = idToCornerCaseMap.get(id);
       if (cc == null) {
-        throw new SketchesArgumentException("Possible Corruption: Illegal CornerCase ID: " + id);
+        throw new SketchesArgumentException("Possible Corruption: Illegal CornerCase ID: " + Integer.toOctalString(id));
       }
       return cc;
     }
-  } //end of enum
+  } //end of enum CornerCase
 
   public static int createCornerCaseId(
       final long thetaLongA, final int countA, final boolean emptyA,
       final long thetaLongB, final int countB, final boolean emptyB) {
-    return ((thetaLongA < MAX) ? 0 : 1 << 5)
-         | ((countA == 0)      ? 0 : 1 << 4)
-         | (!emptyA            ? 0 : 1 << 3)
-         | ((thetaLongB < MAX) ? 0 : 1 << 2)
-         | ((countB == 0)      ? 0 : 1 << 1)
-         | (!emptyB            ? 0 : 1);
+    return (sketchStateId(emptyA, countA, thetaLongA) << 3) | sketchStateId(emptyB, countB, thetaLongB);
   }
 
+  public static int sketchStateId(final boolean isEmpty, final int numRetained, final long theta) {
+    // assume theta = MAX if empty
+    return (((theta == MAX) || isEmpty) ? 4 : 0) | ((numRetained > 0) ? 2 : 0) | (isEmpty ? 1 : 0);
+  }
 }
diff --git a/src/main/java/org/apache/datasketches/theta/DirectQuickSelectSketchR.java b/src/main/java/org/apache/datasketches/theta/DirectQuickSelectSketchR.java
index 1958b90..7e99cd4 100644
--- a/src/main/java/org/apache/datasketches/theta/DirectQuickSelectSketchR.java
+++ b/src/main/java/org/apache/datasketches/theta/DirectQuickSelectSketchR.java
@@ -139,7 +139,7 @@
 
   @Override
   public long getThetaLong() {
-    return wmem_.getLong(THETA_LONG);
+    return isEmpty() ? Long.MAX_VALUE : wmem_.getLong(THETA_LONG);
   }
 
   @Override
diff --git a/src/main/java/org/apache/datasketches/theta/HeapQuickSelectSketch.java b/src/main/java/org/apache/datasketches/theta/HeapQuickSelectSketch.java
index e5b7373..0333bf5 100644
--- a/src/main/java/org/apache/datasketches/theta/HeapQuickSelectSketch.java
+++ b/src/main/java/org/apache/datasketches/theta/HeapQuickSelectSketch.java
@@ -159,7 +159,7 @@
 
   @Override
   public long getThetaLong() {
-    return thetaLong_;
+    return empty_ ? Long.MAX_VALUE : thetaLong_;
   }
 
   @Override
diff --git a/src/main/java/org/apache/datasketches/tuple/AnotB.java b/src/main/java/org/apache/datasketches/tuple/AnotB.java
index d570665..5d9702e 100644
--- a/src/main/java/org/apache/datasketches/tuple/AnotB.java
+++ b/src/main/java/org/apache/datasketches/tuple/AnotB.java
@@ -156,17 +156,17 @@
     final AnotbResult anotbResult = cCase.getAnotbResult();
 
     switch (anotbResult) {
-      case NEW_1_0_T: {
+      case EMPTY_1_0_T: {
         reset();
         break;
       }
-      case RESULTDEGEN_MIN_0_F: {
+      case DEGEN_MIN_0_F: {
         reset();
         thetaLong_ = min(thetaLong_, thetaLongB);
         empty_ = false;
         break;
       }
-      case RESULTDEGEN_THA_0_F: {
+      case DEGEN_THA_0_F: {
         empty_ = false;
         curCount_ = 0;
         //thetaLong_ is ok
@@ -229,17 +229,17 @@
     final AnotbResult anotbResult = cCase.getAnotbResult();
 
     switch (anotbResult) {
-      case NEW_1_0_T: {
+      case EMPTY_1_0_T: {
         reset();
         break;
       }
-      case RESULTDEGEN_MIN_0_F: {
+      case DEGEN_MIN_0_F: {
         reset();
         thetaLong_ = min(thetaLong_, thetaLongB);
         empty_ = false;
         break;
       }
-      case RESULTDEGEN_THA_0_F: {
+      case DEGEN_THA_0_F: {
         empty_ = false;
         curCount_ = 0;
         //thetaLong_ is ok
@@ -335,16 +335,16 @@
     CompactSketch<S> result = null;
 
     switch (anotbResult) {
-      case NEW_1_0_T: {
+      case EMPTY_1_0_T: {
         result = new CompactSketch<>(null, null, Long.MAX_VALUE, true);
         break;
       }
-      case RESULTDEGEN_MIN_0_F: {
+      case DEGEN_MIN_0_F: {
         final long thetaLong = min(thetaLongA, thetaLongB);
         result = new CompactSketch<>(null, null, thetaLong, false);
         break;
       }
-      case RESULTDEGEN_THA_0_F: {
+      case DEGEN_THA_0_F: {
         result = new CompactSketch<>(null, null, thetaLongA, false);
         break;
       }
@@ -427,16 +427,16 @@
     CompactSketch<S> result = null;
 
     switch (anotbResult) {
-      case NEW_1_0_T: {
+      case EMPTY_1_0_T: {
         result = new CompactSketch<>(null, null, Long.MAX_VALUE, true);
         break;
       }
-      case RESULTDEGEN_MIN_0_F: {
+      case DEGEN_MIN_0_F: {
         final long thetaLong = min(thetaLongA, thetaLongB);
         result = new CompactSketch<>(null, null, thetaLong, false);
         break;
       }
-      case RESULTDEGEN_THA_0_F: {
+      case DEGEN_THA_0_F: {
         result = new CompactSketch<>(null, null, thetaLongA, false);
         break;
       }
diff --git a/src/main/java/org/apache/datasketches/tuple/Sketch.java b/src/main/java/org/apache/datasketches/tuple/Sketch.java
index e7d767e..ef11a0f 100644
--- a/src/main/java/org/apache/datasketches/tuple/Sketch.java
+++ b/src/main/java/org/apache/datasketches/tuple/Sketch.java
@@ -162,7 +162,7 @@
    * @return the value of theta as a double
    */
   public double getTheta() {
-    return thetaLong_ / (double) Long.MAX_VALUE;
+    return getThetaLong() / (double) Long.MAX_VALUE;
   }
 
   /**
@@ -186,7 +186,7 @@
    * @return Theta as a long
    */
   public long getThetaLong() {
-    return thetaLong_;
+    return isEmpty() ? Long.MAX_VALUE : thetaLong_;
   }
 
   @Override
diff --git a/src/main/java/org/apache/datasketches/tuple/arrayofdoubles/ArrayOfDoublesSketch.java b/src/main/java/org/apache/datasketches/tuple/arrayofdoubles/ArrayOfDoublesSketch.java
index 2c0e3b2..a127153 100644
--- a/src/main/java/org/apache/datasketches/tuple/arrayofdoubles/ArrayOfDoublesSketch.java
+++ b/src/main/java/org/apache/datasketches/tuple/arrayofdoubles/ArrayOfDoublesSketch.java
@@ -179,7 +179,7 @@
    * @return the value of theta as a double
    */
   public double getTheta() {
-    return theta_ / (double) Long.MAX_VALUE;
+    return getThetaLong() / (double) Long.MAX_VALUE;
   }
 
   /**
@@ -201,7 +201,7 @@
    * @return the value of theta as a long
    */
   long getThetaLong() {
-    return theta_;
+    return isEmpty() ? Long.MAX_VALUE : theta_;
   }
 
   abstract short getSeedHash();
diff --git a/src/test/java/org/apache/datasketches/theta/CornerCaseThetaSetOperationsTest.java b/src/test/java/org/apache/datasketches/theta/CornerCaseThetaSetOperationsTest.java
index 96018af..eef015f 100644
--- a/src/test/java/org/apache/datasketches/theta/CornerCaseThetaSetOperationsTest.java
+++ b/src/test/java/org/apache/datasketches/theta/CornerCaseThetaSetOperationsTest.java
@@ -39,21 +39,18 @@
 
   private static final long GT_MIDP_V   = 3L;
   private static final float MIDP       = 0.5f;
-  private static final long LT_MIDP_V   = 2L;
 
   private static final long GT_LOWP_V   = 6L;
   private static final float LOWP       = 0.1f;
   private static final long LT_LOWP_V   = 4L;
 
-  private static final double MIDP_THETA = MIDP;
   private static final double LOWP_THETA = LOWP;
 
   private enum SkType {
-    NEW,          //{ 1.0,  0, T} Bin: 101  Oct: 05
-    EXACT,        //{ 1.0, >0, F} Bin: 110  Oct: 06, specify only value
-    ESTIMATION,   //{<1.0, >0, F} Bin: 010  Oct: 02, specify only value
-    NEW_DEGEN,    //{<1.0,  0, T} Bin: 001  Oct: 01, specify only p
-    RESULT_DEGEN  //{<1.0,  0, F} Bin: 000  Oct: 0, specify p, value
+    EMPTY,      // { 1.0,  0, T} Bin: 101  Oct: 05
+    EXACT,      // { 1.0, >0, F} Bin: 110  Oct: 06, specify only value
+    ESTIMATION, // {<1.0, >0, F} Bin: 010  Oct: 02, specify only value
+    DEGENERATE  // {<1.0,  0, F} Bin: 000  Oct: 0, specify p, value
   }
 
   //NOTE: 0 values in getSketch are not used.
@@ -69,7 +66,6 @@
       boolean resultAnotbEmpty) {
     CompactSketch csk;
 
-    //Intersection
     Intersection inter = SetOperation.builder().buildIntersection();
 
     csk = inter.intersect(thetaA, thetaB);
@@ -77,7 +73,6 @@
     csk = inter.intersect(thetaA.compact(), thetaB.compact());
     checkResult("Intersect Stateless Theta, Theta", csk, resultInterTheta, resultInterCount, resultInterEmpty);
 
-    //AnotB
     AnotB anotb = SetOperation.builder().buildANotB();
 
     csk = anotb.aNotB(thetaA, thetaB);
@@ -98,9 +93,9 @@
 
 
   @Test
-  public void newNew() {
-    UpdateSketch thetaA = getSketch(SkType.NEW,    0, 0);
-    UpdateSketch thetaB = getSketch(SkType.NEW,    0, 0);
+  public void emptyEmpty() {
+    UpdateSketch thetaA = getSketch(SkType.EMPTY, 0, 0);
+    UpdateSketch thetaB = getSketch(SkType.EMPTY, 0, 0);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = true;
@@ -113,9 +108,9 @@
   }
 
   @Test
-  public void newExact() {
-    UpdateSketch thetaA = getSketch(SkType.NEW,    0, 0);
-    UpdateSketch thetaB = getSketch(SkType.EXACT,  0, GT_MIDP_V);
+  public void emptyExact() {
+    UpdateSketch thetaA = getSketch(SkType.EMPTY, 0, 0);
+    UpdateSketch thetaB = getSketch(SkType.EXACT, 0, GT_MIDP_V);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = true;
@@ -128,9 +123,9 @@
   }
 
   @Test
-  public void newNewDegen() {
-    UpdateSketch thetaA = getSketch(SkType.NEW,       0, 0);
-    UpdateSketch thetaB = getSketch(SkType.NEW_DEGEN, LOWP, 0);
+  public void emptyDegenerate() {
+    UpdateSketch thetaA = getSketch(SkType.EMPTY, 0, 0);
+    UpdateSketch thetaB = getSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = true;
@@ -143,23 +138,8 @@
   }
 
   @Test
-  public void newResultDegen() {
-    UpdateSketch thetaA = getSketch(SkType.NEW,          0, 0);
-    UpdateSketch thetaB = getSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V);
-    final double resultInterTheta = 1.0;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = 1.0;
-    final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = true;
-
-    checks(thetaA, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void newNewEstimation() {
-    UpdateSketch thetaA = getSketch(SkType.NEW,        0, 0);
+  public void EmptyEstimation() {
+    UpdateSketch thetaA = getSketch(SkType.EMPTY, 0, 0);
     UpdateSketch thetaB = getSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 0;
@@ -175,9 +155,9 @@
   /*********************/
 
   @Test
-  public void exactNew() {
-    UpdateSketch thetaA = getSketch(SkType.EXACT,  0, GT_MIDP_V);
-    UpdateSketch thetaB = getSketch(SkType.NEW,    0, 0);
+  public void exactEmpty() {
+    UpdateSketch thetaA = getSketch(SkType.EXACT, 0, GT_MIDP_V);
+    UpdateSketch thetaB = getSketch(SkType.EMPTY, 0, 0);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = true;
@@ -191,8 +171,8 @@
 
   @Test
   public void exactExact() {
-    UpdateSketch thetaA = getSketch(SkType.EXACT,  0, GT_MIDP_V);
-    UpdateSketch thetaB = getSketch(SkType.EXACT,  0, GT_MIDP_V);
+    UpdateSketch thetaA = getSketch(SkType.EXACT, 0, GT_MIDP_V);
+    UpdateSketch thetaB = getSketch(SkType.EXACT, 0, GT_MIDP_V);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 1;
     final boolean resultInterEmpty = false;
@@ -205,24 +185,9 @@
   }
 
   @Test
-  public void exactNewDegen() {
-    UpdateSketch thetaA = getSketch(SkType.EXACT,     0, LT_LOWP_V);
-    UpdateSketch thetaB = getSketch(SkType.NEW_DEGEN, LOWP, 0);
-    final double resultInterTheta = 1.0;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = 1.0;
-    final int resultAnotbCount = 1;
-    final boolean resultAnotbEmpty = false;
-
-    checks(thetaA, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void exactResultDegen() {
-    UpdateSketch thetaA = getSketch(SkType.EXACT,        0, LT_LOWP_V);
-    UpdateSketch thetaB = getSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V); //entries = 0
+  public void exactDegenerate() {
+    UpdateSketch thetaA = getSketch(SkType.EXACT, 0, LT_LOWP_V);
+    UpdateSketch thetaB = getSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V); //entries = 0
     final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = false;
@@ -236,7 +201,7 @@
 
   @Test
   public void exactEstimation() {
-    UpdateSketch thetaA = getSketch(SkType.EXACT,      0, LT_LOWP_V);
+    UpdateSketch thetaA = getSketch(SkType.EXACT, 0, LT_LOWP_V);
     UpdateSketch thetaB = getSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
     final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 1;
@@ -252,9 +217,9 @@
   /*********************/
 
   @Test
-  public void estimationNew() {
+  public void estimationEmpty() {
     UpdateSketch thetaA = getSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
-    UpdateSketch thetaB = getSketch(SkType.NEW,        0, 0);
+    UpdateSketch thetaB = getSketch(SkType.EMPTY, 0, 0);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = true;
@@ -269,7 +234,7 @@
   @Test
   public void estimationExact() {
     UpdateSketch thetaA = getSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
-    UpdateSketch thetaB = getSketch(SkType.EXACT,      0, LT_LOWP_V);
+    UpdateSketch thetaB = getSketch(SkType.EXACT, 0, LT_LOWP_V);
     final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 1;
     final boolean resultInterEmpty = false;
@@ -282,24 +247,9 @@
   }
 
   @Test
-  public void estimationNewDegen() {
-    UpdateSketch thetaA = getSketch(SkType.ESTIMATION,  MIDP, LT_MIDP_V);
-    UpdateSketch thetaB = getSketch(SkType.NEW_DEGEN,   LOWP, 0);
-    final double resultInterTheta = 1.0;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = MIDP_THETA;
-    final int resultAnotbCount = 1;
-    final boolean resultAnotbEmpty = false;
-
-    checks(thetaA, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void estimationResultDegen() {
-    UpdateSketch thetaA = getSketch(SkType.ESTIMATION,   MIDP, LT_LOWP_V);
-    UpdateSketch thetaB = getSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V);
+  public void estimationDegenerate() {
+    UpdateSketch thetaA = getSketch(SkType.ESTIMATION, MIDP, LT_LOWP_V);
+    UpdateSketch thetaB = getSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V);
     final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = false;
@@ -313,8 +263,8 @@
 
   @Test
   public void estimationEstimation() {
-    UpdateSketch thetaA = getSketch(SkType.ESTIMATION,  MIDP, LT_LOWP_V);
-    UpdateSketch thetaB = getSketch(SkType.ESTIMATION,  LOWP, LT_LOWP_V);
+    UpdateSketch thetaA = getSketch(SkType.ESTIMATION, MIDP, LT_LOWP_V);
+    UpdateSketch thetaB = getSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
     final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 1;
     final boolean resultInterEmpty = false;
@@ -329,146 +279,54 @@
   /*********************/
 
   @Test
-  public void newDegenNew() {
-    UpdateSketch thetaA = getSketch(SkType.NEW_DEGEN,   LOWP, 0);
-    UpdateSketch thetaB = getSketch(SkType.NEW,         0, 0);
+  public void DegenerateEmpty() {
+    UpdateSketch thetaA = getSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V); //entries = 0
+    UpdateSketch thetaB = getSketch(SkType.EMPTY, 0, 0);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = 1.0;
+    final double resultAnotbTheta = LOWP_THETA;
     final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = true;
+    final boolean resultAnotbEmpty = false;
 
     checks(thetaA, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
         resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
   }
 
   @Test
-  public void newDegenExact() {
-    UpdateSketch thetaA = getSketch(SkType.NEW_DEGEN,  LOWP,0);
-    UpdateSketch thetaB = getSketch(SkType.EXACT,      0, LT_LOWP_V);
-    final double resultInterTheta = 1.0;
+  public void DegenerateExact() {
+    UpdateSketch thetaA = getSketch(SkType.DEGENERATE,  LOWP, GT_LOWP_V); //entries = 0
+    UpdateSketch thetaB = getSketch(SkType.EXACT, 0, LT_LOWP_V);
+    final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = 1.0;
+    final boolean resultInterEmpty = false;
+    final double resultAnotbTheta = LOWP_THETA;
     final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = true;
+    final boolean resultAnotbEmpty = false;
 
     checks(thetaA, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
         resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
   }
 
   @Test
-  public void newDegenNewDegen() {
-    UpdateSketch thetaA = getSketch(SkType.NEW_DEGEN, MIDP, 0);
-    UpdateSketch thetaB = getSketch(SkType.NEW_DEGEN, LOWP, 0);
-    final double resultInterTheta = 1.0;
+  public void DegenerateDegenerate() {
+    UpdateSketch thetaA = getSketch(SkType.DEGENERATE, MIDP, GT_MIDP_V); //entries = 0
+    UpdateSketch thetaB = getSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V);
+    final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = 1.0;
+    final boolean resultInterEmpty = false;
+    final double resultAnotbTheta = LOWP_THETA;
     final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = true;
+    final boolean resultAnotbEmpty = false;
 
     checks(thetaA, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
         resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
   }
 
   @Test
-  public void newDegenResultDegen() {
-    UpdateSketch thetaA = getSketch(SkType.NEW_DEGEN,    MIDP, 0);
-    UpdateSketch thetaB = getSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V);
-    final double resultInterTheta = 1.0;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = 1.0;
-    final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = true;
-
-    checks(thetaA, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void newDegenEstimation() {
-    UpdateSketch thetaA = getSketch(SkType.NEW_DEGEN,  MIDP, 0);
+  public void DegenerateEstimation() {
+    UpdateSketch thetaA = getSketch(SkType.DEGENERATE, MIDP, GT_MIDP_V); //entries = 0
     UpdateSketch thetaB = getSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
-    final double resultInterTheta = 1.0;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = 1.0;
-    final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = true;
-
-    checks(thetaA, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  /*********************/
-
-  @Test
-  public void resultDegenNew() {
-    UpdateSketch thetaA = getSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V); //entries = 0
-    UpdateSketch thetaB = getSketch(SkType.NEW,           0, 0);
-    final double resultInterTheta = 1.0;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = LOWP_THETA;
-    final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = false;
-
-    checks(thetaA, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void resultDegenExact() {
-    UpdateSketch thetaA = getSketch(SkType.RESULT_DEGEN,  LOWP, GT_LOWP_V); //entries = 0
-    UpdateSketch thetaB = getSketch(SkType.EXACT,         0, LT_LOWP_V);
-    final double resultInterTheta = LOWP_THETA;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = false;
-    final double resultAnotbTheta = LOWP_THETA;
-    final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = false;
-
-    checks(thetaA, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void resultDegenNewDegen() {
-    UpdateSketch thetaA = getSketch(SkType.RESULT_DEGEN, MIDP, GT_MIDP_V); //entries = 0
-    UpdateSketch thetaB = getSketch(SkType.NEW_DEGEN,    LOWP, 0);
-    final double resultInterTheta = 1.0;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = MIDP_THETA;
-    final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = false;
-
-    checks(thetaA, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void resultDegenResultDegen() {
-    UpdateSketch thetaA = getSketch(SkType.RESULT_DEGEN, MIDP, GT_MIDP_V); //entries = 0
-    UpdateSketch thetaB = getSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V);
-    final double resultInterTheta = LOWP_THETA;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = false;
-    final double resultAnotbTheta = LOWP_THETA;
-    final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = false;
-
-    checks(thetaA, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void resultDegenEstimation() {
-    UpdateSketch thetaA = getSketch(SkType.RESULT_DEGEN, MIDP, GT_MIDP_V); //entries = 0
-    UpdateSketch thetaB = getSketch(SkType.ESTIMATION,   LOWP, LT_LOWP_V);
     final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = false;
@@ -505,34 +363,29 @@
     bldr.setLogNominalEntries(4);
     UpdateSketch sk;
     switch(skType) {
-      case NEW: {      //{ 1.0,  0, T} Bin: 101  Oct: 05
+      case EMPTY: { // { 1.0,  0, T}
         sk = bldr.build();
         break;
       }
-      case EXACT: {     //{ 1.0, >0, F} Bin: 111  Oct: 07
+      case EXACT: { // { 1.0, >0, F}
         sk = bldr.build();
         sk.update(value);
         break;
       }
-      case ESTIMATION: {   //{<1.0, >0, F} Bin: 010  Oct: 02
+      case ESTIMATION: { // {<1.0, >0, F}
         bldr.setP(p);
         sk = bldr.build();
         sk.update(value);
         break;
       }
-      case NEW_DEGEN: {    //{<1.0,  0, T} Bin: 001  Oct: 01
-        bldr.setP(p);
-        sk = bldr.build();
-        break;
-      }
-      case RESULT_DEGEN: { //{<1.0,  0, F} Bin: 000  Oct: 0
+      case DEGENERATE: { // {<1.0,  0, F}
         bldr.setP(p);
         sk = bldr.build();
         sk.update(value);
         break;
       }
 
-      default: { return null; } //should not happen
+      default: { return null; } // should not happen
     }
     return sk;
   }
diff --git a/src/test/java/org/apache/datasketches/tuple/adouble/AdoubleTest.java b/src/test/java/org/apache/datasketches/tuple/adouble/AdoubleTest.java
index 87396d9..21bc7a3 100644
--- a/src/test/java/org/apache/datasketches/tuple/adouble/AdoubleTest.java
+++ b/src/test/java/org/apache/datasketches/tuple/adouble/AdoubleTest.java
@@ -104,8 +104,8 @@
     Assert.assertEquals(sketch.getEstimate(), 0.0);
     Assert.assertEquals(sketch.getUpperBound(1), 0.0);
     Assert.assertEquals(sketch.getLowerBound(1), 0.0);
-    Assert.assertEquals((float)sketch.getTheta(), samplingProbability);
-    Assert.assertEquals((float)sketch.getTheta(), samplingProbability);
+    Assert.assertEquals(sketch.getThetaLong(), Long.MAX_VALUE);
+    Assert.assertEquals(sketch.getTheta(), 1.0);
   }
 
   @Test
diff --git a/src/test/java/org/apache/datasketches/tuple/aninteger/CornerCaseTupleSetOperationsTest.java b/src/test/java/org/apache/datasketches/tuple/aninteger/CornerCaseTupleSetOperationsTest.java
index 9ca0181..7d518b0 100644
--- a/src/test/java/org/apache/datasketches/tuple/aninteger/CornerCaseTupleSetOperationsTest.java
+++ b/src/test/java/org/apache/datasketches/tuple/aninteger/CornerCaseTupleSetOperationsTest.java
@@ -45,13 +45,11 @@
 
   private static final long GT_MIDP_V   = 3L;
   private static final float MIDP       = 0.5f;
-  private static final long LT_MIDP_V   = 2L;
 
   private static final long GT_LOWP_V   = 6L;
   private static final float LOWP       = 0.1f;
   private static final long LT_LOWP_V   = 4L;
 
-  private static final double MIDP_THETA = MIDP;
   private static final double LOWP_THETA = LOWP;
 
   private IntegerSummary.Mode mode = IntegerSummary.Mode.Min;
@@ -59,11 +57,10 @@
   private IntegerSummarySetOperations setOperations = new IntegerSummarySetOperations(mode, mode);
 
   private enum SkType {
-    NEW,         //{ 1.0,  0, T} Bin: 101  Oct: 05
-    EXACT,       //{ 1.0, >0, F} Bin: 110  Oct: 06, specify only value
-    ESTIMATION,  //{<1.0, >0, F} Bin: 010  Oct: 02, specify only value
-    NEW_DEGEN,   //{<1.0,  0, T} Bin: 001  Oct: 01, specify only p
-    RESULT_DEGEN //{<1.0,  0, F} Bin: 000  Oct: 0, specify p, value
+    EMPTY,      // { 1.0,  0, T} Bin: 101  Oct: 05
+    EXACT,      // { 1.0, >0, F} Bin: 110  Oct: 06, specify only value
+    ESTIMATION, // {<1.0, >0, F} Bin: 010  Oct: 02, specify only value
+    DEGENERATE  // {<1.0,  0, F} Bin: 000  Oct: 0, specify p, value
   }
 
   //NOTE: 0 values in getTupleSketch or getThetaSketch are not used.
@@ -80,7 +77,6 @@
       boolean resultAnotbEmpty) {
     CompactSketch<IntegerSummary> csk;
 
-    //Intersection
     Intersection<IntegerSummary> inter = new Intersection<>(setOperations);
 
     csk = inter.intersect(tupleA, tupleB);
@@ -93,8 +89,6 @@
     csk = inter.intersect(tupleA.compact(), thetaB.compact(), intSum);
     checkResult("Intersect Stateless Tuple, Theta", csk, resultInterTheta, resultInterCount, resultInterEmpty);
 
-
-    //AnotB
     csk = AnotB.aNotB(tupleA, tupleB);
     checkResult("AnotB Stateless Tuple, Tuple", csk, resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
     csk = AnotB.aNotB(tupleA.compact(), tupleB.compact());
@@ -129,10 +123,10 @@
 
 
   @Test
-  public void newNew() {
-    IntegerSketch tupleA = getTupleSketch(SkType.NEW,    0, 0);
-    IntegerSketch tupleB = getTupleSketch(SkType.NEW,    0, 0);
-    UpdateSketch thetaB =  getThetaSketch(SkType.NEW,    0, 0);
+  public void emptyEmpty() {
+    IntegerSketch tupleA = getTupleSketch(SkType.EMPTY, 0, 0);
+    IntegerSketch tupleB = getTupleSketch(SkType.EMPTY, 0, 0);
+    UpdateSketch thetaB =  getThetaSketch(SkType.EMPTY, 0, 0);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = true;
@@ -145,10 +139,10 @@
   }
 
   @Test
-  public void newExact() {
-    IntegerSketch tupleA = getTupleSketch(SkType.NEW,    0, 0);
-    IntegerSketch tupleB = getTupleSketch(SkType.EXACT,  0, GT_MIDP_V);
-    UpdateSketch thetaB =  getThetaSketch(SkType.EXACT,  0, GT_MIDP_V);
+  public void emptyExact() {
+    IntegerSketch tupleA = getTupleSketch(SkType.EMPTY, 0, 0);
+    IntegerSketch tupleB = getTupleSketch(SkType.EXACT, 0, GT_MIDP_V);
+    UpdateSketch thetaB =  getThetaSketch(SkType.EXACT, 0, GT_MIDP_V);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = true;
@@ -161,10 +155,10 @@
   }
 
   @Test
-  public void newNewDegen() {
-    IntegerSketch tupleA = getTupleSketch(SkType.NEW,       0, 0);
-    IntegerSketch tupleB = getTupleSketch(SkType.NEW_DEGEN, LOWP, 0);
-    UpdateSketch thetaB =  getThetaSketch(SkType.NEW_DEGEN, LOWP, 0);
+  public void EmptyDegenerate() {
+    IntegerSketch tupleA = getTupleSketch(SkType.EMPTY, 0, 0);
+    IntegerSketch tupleB = getTupleSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V);
+    UpdateSketch thetaB =  getThetaSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = true;
@@ -177,24 +171,8 @@
   }
 
   @Test
-  public void newResultDegen() {
-    IntegerSketch tupleA = getTupleSketch(SkType.NEW,          0, 0);
-    IntegerSketch tupleB = getTupleSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V);
-    UpdateSketch thetaB =  getThetaSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V);
-    final double resultInterTheta = 1.0;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = 1.0;
-    final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = true;
-
-    checks(tupleA, tupleB, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void newNewEstimation() {
-    IntegerSketch tupleA = getTupleSketch(SkType.NEW,        0, 0);
+  public void emptyEstimation() {
+    IntegerSketch tupleA = getTupleSketch(SkType.EMPTY, 0, 0);
     IntegerSketch tupleB = getTupleSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
     UpdateSketch thetaB =  getThetaSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
     final double resultInterTheta = 1.0;
@@ -211,10 +189,10 @@
   /*********************/
 
   @Test
-  public void exactNew() {
-    IntegerSketch tupleA = getTupleSketch(SkType.EXACT,  0, GT_MIDP_V);
-    IntegerSketch tupleB = getTupleSketch(SkType.NEW,    0, 0);
-    UpdateSketch thetaB =  getThetaSketch(SkType.NEW,    0, 0);
+  public void exactEmpty() {
+    IntegerSketch tupleA = getTupleSketch(SkType.EXACT, 0, GT_MIDP_V);
+    IntegerSketch tupleB = getTupleSketch(SkType.EMPTY, 0, 0);
+    UpdateSketch thetaB =  getThetaSketch(SkType.EMPTY, 0, 0);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = true;
@@ -228,9 +206,9 @@
 
   @Test
   public void exactExact() {
-    IntegerSketch tupleA = getTupleSketch(SkType.EXACT,  0, GT_MIDP_V);
-    IntegerSketch tupleB = getTupleSketch(SkType.EXACT,  0, GT_MIDP_V);
-    UpdateSketch thetaB =  getThetaSketch(SkType.EXACT,  0, GT_MIDP_V);
+    IntegerSketch tupleA = getTupleSketch(SkType.EXACT, 0, GT_MIDP_V);
+    IntegerSketch tupleB = getTupleSketch(SkType.EXACT, 0, GT_MIDP_V);
+    UpdateSketch thetaB =  getThetaSketch(SkType.EXACT, 0, GT_MIDP_V);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 1;
     final boolean resultInterEmpty = false;
@@ -243,26 +221,10 @@
   }
 
   @Test
-  public void exactNewDegen() {
-    IntegerSketch tupleA = getTupleSketch(SkType.EXACT,     0, LT_LOWP_V);
-    IntegerSketch tupleB = getTupleSketch(SkType.NEW_DEGEN, LOWP, 0);
-    UpdateSketch thetaB =  getThetaSketch(SkType.NEW_DEGEN, LOWP, 0);
-    final double resultInterTheta = 1.0;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = 1.0;
-    final int resultAnotbCount = 1;
-    final boolean resultAnotbEmpty = false;
-
-    checks(tupleA, tupleB, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void exactResultDegen() {
-    IntegerSketch tupleA = getTupleSketch(SkType.EXACT,        0, LT_LOWP_V);
-    IntegerSketch tupleB = getTupleSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V); //entries = 0
-    UpdateSketch thetaB =  getThetaSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V);
+  public void exactDegenerate() {
+    IntegerSketch tupleA = getTupleSketch(SkType.EXACT, 0, LT_LOWP_V);
+    IntegerSketch tupleB = getTupleSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V); //entries = 0
+    UpdateSketch thetaB =  getThetaSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V);
     final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = false;
@@ -276,7 +238,7 @@
 
   @Test
   public void exactEstimation() {
-    IntegerSketch tupleA = getTupleSketch(SkType.EXACT,      0, LT_LOWP_V);
+    IntegerSketch tupleA = getTupleSketch(SkType.EXACT, 0, LT_LOWP_V);
     IntegerSketch tupleB = getTupleSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
     UpdateSketch thetaB =  getThetaSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
     final double resultInterTheta = LOWP_THETA;
@@ -293,10 +255,10 @@
   /*********************/
 
   @Test
-  public void estimationNew() {
+  public void estimationEmpty() {
     IntegerSketch tupleA = getTupleSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
-    IntegerSketch tupleB = getTupleSketch(SkType.NEW,        0, 0);
-    UpdateSketch thetaB =  getThetaSketch(SkType.NEW,        0, 0);
+    IntegerSketch tupleB = getTupleSketch(SkType.EMPTY, 0, 0);
+    UpdateSketch thetaB =  getThetaSketch(SkType.EMPTY, 0, 0);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = true;
@@ -311,8 +273,8 @@
   @Test
   public void estimationExact() {
     IntegerSketch tupleA = getTupleSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
-    IntegerSketch tupleB = getTupleSketch(SkType.EXACT,      0, LT_LOWP_V);
-    UpdateSketch thetaB =  getThetaSketch(SkType.EXACT,      0, LT_LOWP_V);
+    IntegerSketch tupleB = getTupleSketch(SkType.EXACT, 0, LT_LOWP_V);
+    UpdateSketch thetaB =  getThetaSketch(SkType.EXACT, 0, LT_LOWP_V);
     final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 1;
     final boolean resultInterEmpty = false;
@@ -325,26 +287,10 @@
   }
 
   @Test
-  public void estimationNewDegen() {
-    IntegerSketch tupleA = getTupleSketch(SkType.ESTIMATION,  MIDP, LT_MIDP_V);
-    IntegerSketch tupleB = getTupleSketch(SkType.NEW_DEGEN,   LOWP, 0);
-    UpdateSketch thetaB =  getThetaSketch(SkType.NEW_DEGEN,   LOWP, 0);
-    final double resultInterTheta = 1.0;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = MIDP_THETA;
-    final int resultAnotbCount = 1;
-    final boolean resultAnotbEmpty = false;
-
-    checks(tupleA, tupleB, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void estimationResultDegen() {
-    IntegerSketch tupleA = getTupleSketch(SkType.ESTIMATION,   MIDP, LT_LOWP_V);
-    IntegerSketch tupleB = getTupleSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V);
-    UpdateSketch thetaB =  getThetaSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V);
+  public void estimationDegenerate() {
+    IntegerSketch tupleA = getTupleSketch(SkType.ESTIMATION, MIDP, LT_LOWP_V);
+    IntegerSketch tupleB = getTupleSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V);
+    UpdateSketch thetaB =  getThetaSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V);
     final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = false;
@@ -358,9 +304,9 @@
 
   @Test
   public void estimationEstimation() {
-    IntegerSketch tupleA = getTupleSketch(SkType.ESTIMATION,  MIDP, LT_LOWP_V);
-    IntegerSketch tupleB = getTupleSketch(SkType.ESTIMATION,  LOWP, LT_LOWP_V);
-    UpdateSketch thetaB =  getThetaSketch(SkType.ESTIMATION,  LOWP, LT_LOWP_V);
+    IntegerSketch tupleA = getTupleSketch(SkType.ESTIMATION, MIDP, LT_LOWP_V);
+    IntegerSketch tupleB = getTupleSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
+    UpdateSketch thetaB =  getThetaSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
     final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 1;
     final boolean resultInterEmpty = false;
@@ -375,156 +321,58 @@
   /*********************/
 
   @Test
-  public void newDegenNew() {
-    IntegerSketch tupleA = getTupleSketch(SkType.NEW_DEGEN,   LOWP, 0);
-    IntegerSketch tupleB = getTupleSketch(SkType.NEW,         0, 0);
-    UpdateSketch thetaB =  getThetaSketch(SkType.NEW,         0, 0);
+  public void degenerateEmpty() {
+    IntegerSketch tupleA = getTupleSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V); //entries = 0
+    IntegerSketch tupleB = getTupleSketch(SkType.EMPTY, 0, 0);
+    UpdateSketch thetaB =  getThetaSketch(SkType.EMPTY, 0, 0);
     final double resultInterTheta = 1.0;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = 1.0;
+    final double resultAnotbTheta = LOWP_THETA;
     final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = true;
+    final boolean resultAnotbEmpty = false;
 
     checks(tupleA, tupleB, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
         resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
   }
 
   @Test
-  public void newDegenExact() {
-    IntegerSketch tupleA = getTupleSketch(SkType.NEW_DEGEN, LOWP,0);
-    IntegerSketch tupleB = getTupleSketch(SkType.EXACT,      0, LT_LOWP_V);
-    UpdateSketch thetaB =  getThetaSketch(SkType.EXACT,      0, LT_LOWP_V);
-    final double resultInterTheta = 1.0;
+  public void degenerateExact() {
+    IntegerSketch tupleA = getTupleSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V); //entries = 0
+    IntegerSketch tupleB = getTupleSketch(SkType.EXACT, 0, LT_LOWP_V);
+    UpdateSketch thetaB =  getThetaSketch(SkType.EXACT, 0, LT_LOWP_V);
+    final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = 1.0;
+    final boolean resultInterEmpty = false;
+    final double resultAnotbTheta = LOWP_THETA;
     final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = true;
+    final boolean resultAnotbEmpty = false;
 
     checks(tupleA, tupleB, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
         resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
   }
 
   @Test
-  public void newDegenNewDegen() {
-    IntegerSketch tupleA = getTupleSketch(SkType.NEW_DEGEN, MIDP, 0);
-    IntegerSketch tupleB = getTupleSketch(SkType.NEW_DEGEN, LOWP, 0);
-    UpdateSketch thetaB =  getThetaSketch(SkType.NEW_DEGEN, LOWP, 0);
-    final double resultInterTheta = 1.0;
+  public void degenerateDegenerate() {
+    IntegerSketch tupleA = getTupleSketch(SkType.DEGENERATE, MIDP, GT_MIDP_V); //entries = 0
+    IntegerSketch tupleB = getTupleSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V);
+    UpdateSketch thetaB =  getThetaSketch(SkType.DEGENERATE, LOWP, GT_LOWP_V);
+    final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = 1.0;
+    final boolean resultInterEmpty = false;
+    final double resultAnotbTheta = LOWP_THETA;
     final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = true;
+    final boolean resultAnotbEmpty = false;
 
     checks(tupleA, tupleB, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
         resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
   }
 
   @Test
-  public void newDegenResultDegen() {
-    IntegerSketch tupleA = getTupleSketch(SkType.NEW_DEGEN,    MIDP, 0);
-    IntegerSketch tupleB =  getTupleSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V);
-    UpdateSketch thetaB =   getThetaSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V);
-    final double resultInterTheta = 1.0;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = 1.0;
-    final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = true;
-
-    checks(tupleA, tupleB, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void newDegenEstimation() {
-    IntegerSketch tupleA = getTupleSketch(SkType.NEW_DEGEN,  MIDP, 0);
+  public void degenerateEstimation() {
+    IntegerSketch tupleA = getTupleSketch(SkType.DEGENERATE, MIDP, GT_MIDP_V); //entries = 0
     IntegerSketch tupleB = getTupleSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
     UpdateSketch thetaB =  getThetaSketch(SkType.ESTIMATION, LOWP, LT_LOWP_V);
-    final double resultInterTheta = 1.0;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = 1.0;
-    final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = true;
-
-    checks(tupleA, tupleB, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  /*********************/
-
-  @Test
-  public void resultDegenNew() {
-    IntegerSketch tupleA = getTupleSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V); //entries = 0
-    IntegerSketch tupleB = getTupleSketch(SkType.NEW,           0, 0);
-    UpdateSketch thetaB =  getThetaSketch(SkType.NEW,           0, 0);
-    final double resultInterTheta = 1.0;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = LOWP_THETA;
-    final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = false;
-
-    checks(tupleA, tupleB, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void resultDegenExact() {
-    IntegerSketch tupleA = getTupleSketch(SkType.RESULT_DEGEN,  LOWP, GT_LOWP_V); //entries = 0
-    IntegerSketch tupleB = getTupleSketch(SkType.EXACT,         0, LT_LOWP_V);
-    UpdateSketch thetaB =  getThetaSketch(SkType.EXACT,         0, LT_LOWP_V);
-    final double resultInterTheta = LOWP_THETA;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = false;
-    final double resultAnotbTheta = LOWP_THETA;
-    final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = false;
-
-    checks(tupleA, tupleB, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void resultDegenNewDegen() {
-    IntegerSketch tupleA = getTupleSketch(SkType.RESULT_DEGEN, MIDP, GT_MIDP_V); //entries = 0
-    IntegerSketch tupleB = getTupleSketch(SkType.NEW_DEGEN,    LOWP, 0);
-    UpdateSketch thetaB =  getThetaSketch(SkType.NEW_DEGEN,    LOWP, 0);
-    final double resultInterTheta = 1.0;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = true;
-    final double resultAnotbTheta = MIDP_THETA;
-    final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = false;
-
-    checks(tupleA, tupleB, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void resultDegenResultDegen() {
-    IntegerSketch tupleA = getTupleSketch(SkType.RESULT_DEGEN, MIDP, GT_MIDP_V); //entries = 0
-    IntegerSketch tupleB = getTupleSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V);
-    UpdateSketch thetaB =  getThetaSketch(SkType.RESULT_DEGEN, LOWP, GT_LOWP_V);
-    final double resultInterTheta = LOWP_THETA;
-    final int resultInterCount = 0;
-    final boolean resultInterEmpty = false;
-    final double resultAnotbTheta = LOWP_THETA;
-    final int resultAnotbCount = 0;
-    final boolean resultAnotbEmpty = false;
-
-    checks(tupleA, tupleB, thetaB, resultInterTheta, resultInterCount, resultInterEmpty,
-        resultAnotbTheta, resultAnotbCount, resultAnotbEmpty);
-  }
-
-  @Test
-  public void resultDegenEstimation() {
-    IntegerSketch tupleA = getTupleSketch(SkType.RESULT_DEGEN, MIDP, GT_MIDP_V); //entries = 0
-    IntegerSketch tupleB = getTupleSketch(SkType.ESTIMATION,   LOWP, LT_LOWP_V);
-    UpdateSketch thetaB =  getThetaSketch(SkType.ESTIMATION,   LOWP, LT_LOWP_V);
     final double resultInterTheta = LOWP_THETA;
     final int resultInterCount = 0;
     final boolean resultInterEmpty = false;
@@ -550,9 +398,9 @@
     if (!thetaOk || !entriesOk || !emptyOk) {
       StringBuilder sb = new StringBuilder();
       sb.append(comment + ": ");
-      if (!thetaOk)   { sb.append("Got: " + skTheta + ", Expected: " + theta + "; "); }
-      if (!entriesOk) { sb.append("Got: " + skEntries + ", Expected: " + entries + "; "); }
-      if (!emptyOk)   { sb.append("Got: " + skEmpty + ", Expected: " + empty + "."); }
+      if (!thetaOk)   { sb.append("theta: expected " + theta + ", got " + skTheta + "; "); }
+      if (!entriesOk) { sb.append("entries: expected " + entries + ", got " + skEntries + "; "); }
+      if (!emptyOk)   { sb.append("empty: expected " + empty + ", got " + skEmpty + "."); }
       throw new IllegalArgumentException(sb.toString());
     }
   }
@@ -561,31 +409,27 @@
 
     IntegerSketch sk;
     switch(skType) {
-      case NEW: {      //{ 1.0,  0, T} Bin: 101  Oct: 05
+      case EMPTY: { // { 1.0,  0, T}
         sk = new IntegerSketch(4, 2, 1.0f, IntegerSummary.Mode.Min);
         break;
       }
-      case EXACT: {     //{ 1.0, >0, F} Bin: 111  Oct: 07
+      case EXACT: { // { 1.0, >0, F}
         sk = new IntegerSketch(4, 2, 1.0f, IntegerSummary.Mode.Min);
         sk.update(value, 1);
         break;
       }
-      case ESTIMATION: {   //{<1.0, >0, F} Bin: 010  Oct: 02
+      case ESTIMATION: { // {<1.0, >0, F}
         sk = new IntegerSketch(4, 2, p, IntegerSummary.Mode.Min);
         sk.update(value, 1);
         break;
       }
-      case NEW_DEGEN: {    //{<1.0,  0, T} Bin: 001  Oct: 01
-        sk =  new IntegerSketch(4, 2, p, IntegerSummary.Mode.Min);
-        break;
-      }
-      case RESULT_DEGEN: { //{<1.0,  0, F} Bin: 000  Oct: 0
+      case DEGENERATE: { // {<1.0,  0, F}
         sk = new IntegerSketch(4, 2, p, IntegerSummary.Mode.Min);
         sk.update(value, 1); // > theta
         break;
       }
 
-      default: { return null; } //should not happen
+      default: { return null; } // should not happen
     }
     return sk;
   }
@@ -597,34 +441,29 @@
 
     UpdateSketch sk;
     switch(skType) {
-      case NEW: { //{ 1.0,  0, T} Bin: 101  Oct: 05
+      case EMPTY: { // { 1.0,  0, T}
         sk = bldr.build();
         break;
       }
-      case EXACT: { //{ 1.0, >0, F} Bin: 111  Oct: 07
+      case EXACT: { // { 1.0, >0, F}
         sk = bldr.build();
         sk.update(value);
         break;
       }
-      case ESTIMATION: {   //{<1.0, >0, F} Bin: 010  Oct: 02
+      case ESTIMATION: { // {<1.0, >0, F}
         bldr.setP(p);
         sk = bldr.build();
         sk.update(value);
         break;
       }
-      case NEW_DEGEN: {    //{<1.0,  0, T} Bin: 001  Oct: 01
-        bldr.setP(p);
-        sk = bldr.build();
-        break;
-      }
-      case RESULT_DEGEN: { //{<1.0,  0, F} Bin: 000  Oct: 0
+      case DEGENERATE: { // {<1.0,  0, F}
         bldr.setP(p);
         sk = bldr.build();
         sk.update(value); // > theta
         break;
       }
 
-      default: { return null; } //should not happen
+      default: { return null; } // should not happen
     }
     return sk;
   }
diff --git a/src/test/java/org/apache/datasketches/tuple/arrayofdoubles/DirectArrayOfDoublesQuickSelectSketchTest.java b/src/test/java/org/apache/datasketches/tuple/arrayofdoubles/DirectArrayOfDoublesQuickSelectSketchTest.java
index c77664c..aae8c0b 100644
--- a/src/test/java/org/apache/datasketches/tuple/arrayofdoubles/DirectArrayOfDoublesQuickSelectSketchTest.java
+++ b/src/test/java/org/apache/datasketches/tuple/arrayofdoubles/DirectArrayOfDoublesQuickSelectSketchTest.java
@@ -58,9 +58,8 @@
     Assert.assertEquals(sketch.getEstimate(), 0.0);
     Assert.assertEquals(sketch.getUpperBound(1), 0.0);
     Assert.assertEquals(sketch.getLowerBound(1), 0.0);
-    Assert.assertEquals(
-        (float)(sketch.getThetaLong() / (double) Long.MAX_VALUE), samplingProbability);
-    Assert.assertEquals((float)sketch.getTheta(), samplingProbability);
+    Assert.assertEquals(sketch.getThetaLong(), Long.MAX_VALUE);
+    Assert.assertEquals(sketch.getTheta(), 1.0);
   }
 
   @Test
diff --git a/src/test/java/org/apache/datasketches/tuple/arrayofdoubles/HeapArrayOfDoublesQuickSelectSketchTest.java b/src/test/java/org/apache/datasketches/tuple/arrayofdoubles/HeapArrayOfDoublesQuickSelectSketchTest.java
index e27cda2..5156574 100644
--- a/src/test/java/org/apache/datasketches/tuple/arrayofdoubles/HeapArrayOfDoublesQuickSelectSketchTest.java
+++ b/src/test/java/org/apache/datasketches/tuple/arrayofdoubles/HeapArrayOfDoublesQuickSelectSketchTest.java
@@ -53,8 +53,8 @@
     Assert.assertEquals(sketch.getEstimate(), 0.0);
     Assert.assertEquals(sketch.getUpperBound(1), 0.0);
     Assert.assertEquals(sketch.getLowerBound(1), 0.0);
-    Assert.assertEquals((float)(sketch.getThetaLong() / (double) Long.MAX_VALUE), samplingProbability);
-    Assert.assertEquals((float)sketch.getTheta(), samplingProbability);
+    Assert.assertEquals(sketch.getThetaLong(), Long.MAX_VALUE);
+    Assert.assertEquals(sketch.getTheta(), 1.0);
   }
 
   @Test