Skip to content

Commit

Permalink
Merge d7d07ea into f77eb5e
Browse files Browse the repository at this point in the history
  • Loading branch information
leerho committed Dec 3, 2021
2 parents f77eb5e + d7d07ea commit d3a15cb
Show file tree
Hide file tree
Showing 3 changed files with 126 additions and 91 deletions.
175 changes: 105 additions & 70 deletions src/main/java/org/apache/datasketches/SetOperationCornerCases.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,129 +25,164 @@
public class SetOperationCornerCases {
private static final long MAX = Long.MAX_VALUE;

public enum IntersectResult {
EMPTY_1_0_T(1, "Empty{1.0, 0, T}"),
DEGEN_MIN_0_F(2, "Degenerate{MinTheta, 0, F}"),
FULL_INTER(6, "Full Intersect");
public enum IntersectAction {
DEGEN_MIN_0_F("D", "Degenerate{MinTheta, 0, F}"),
EMPTY_1_0_T("E", "Empty{1.0, 0, T}"),
FULL_INTERSECT("I", "Full Intersect");

private int interRid;
private String desc;
private String actionId;
private String actionDescription;

private IntersectResult(final int interRid, final String desc) {
this.interRid = interRid;
this.desc = desc;
private IntersectAction(final String actionId, final String actionDescription) {
this.actionId = actionId;
this.actionDescription = actionDescription;
}

public int getInterResultId() {
return interRid;
public String getActionId() {
return actionId;
}

public String getDesc() {
return desc;
public String getActionDescription() {
return actionDescription;
}
}

public enum AnotbResult {
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");
public enum AnotbAction {
SKETCH_A("A", "Sketch A Exactly"),
TRIM_A("TA", "Trim Sketch A by MinTheta"),
DEGEN_MIN_0_F("D", "Degenerate{MinTheta, 0, F}"),
DEGEN_THA_0_F("DA", "Degenerate{ThetaA, 0, F}"),
EMPTY_1_0_T("E", "Empty{1.0, 0, T}"),
FULL_ANOTB("N", "Full AnotB");

private int aNbRid;
private String desc;
private String actionId;
private String actionDescription;

private AnotbResult(final int aNbRid, final String desc) {
this.aNbRid = aNbRid;
this.desc = desc;
private AnotbAction(final String actionId, final String actionDescription) {
this.actionId = actionId;
this.actionDescription = actionDescription;
}

public int getAnotbResultId() {
return aNbRid;
public String getActionId() {
return actionId;
}

public String getDesc() {
return desc;
public String getActionDescription() {
return actionDescription;
}
}

public enum UnionAction {
SKETCH_A("A", "Sketch A Exactly"),
TRIM_A("TA", "Trim Sketch A by MinTheta"),
SKETCH_B("B", "Sketch B Exactly"),
TRIM_B("TB", "Trim Sketch B by MinTheta"),
DEGEN_MIN_0_F("D", "Degenerate{MinTheta, 0, F}"),
DEGEN_THA_0_F("DA", "Degenerate{ThetaA, 0, F}"),
DEGEN_THB_0_F("DB", "Degenerate{ThetaB, 0, F}"),
EMPTY_1_0_T("E", "Empty{1.0, 0, T}"),
FULL_UNION("N", "Full Union");

private String actionId;
private String actionDescription;

private UnionAction(final String actionId, final String actionDescription) {
this.actionId = actionId;
this.actionDescription = actionDescription;
}

public String getActionId() {
return actionId;
}

public String getActionDescription() {
return actionDescription;
}
}


public enum CornerCase {
Empty_Empty(055, "A{ 1.0, 0, T} ; B{ 1.0, 0, T}",
IntersectResult.EMPTY_1_0_T, AnotbResult.EMPTY_1_0_T),
IntersectAction.EMPTY_1_0_T, AnotbAction.EMPTY_1_0_T, UnionAction.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),
IntersectAction.EMPTY_1_0_T, AnotbAction.EMPTY_1_0_T, UnionAction.SKETCH_B),
Empty_Estimation(052, "A{ 1.0, 0, T} ; B{<1.0,>0, F",
IntersectAction.EMPTY_1_0_T, AnotbAction.EMPTY_1_0_T, UnionAction.SKETCH_B),
Empty_Degen(050, "A{ 1.0, 0, T} ; B{<1.0, 0, F}",
IntersectResult.EMPTY_1_0_T, AnotbResult.EMPTY_1_0_T),
IntersectAction.EMPTY_1_0_T, AnotbAction.EMPTY_1_0_T, UnionAction.DEGEN_THB_0_F),

Exact_Empty(065, "A{ 1.0,>0, F} ; B{ 1.0, 0, T}",
IntersectResult.EMPTY_1_0_T, AnotbResult.SKETCH_A),
IntersectAction.EMPTY_1_0_T, AnotbAction.SKETCH_A, UnionAction.SKETCH_A),
Exact_Exact(066, "A{ 1.0,>0, F} ; B{ 1.0,>0, F}",
IntersectResult.FULL_INTER, AnotbResult.FULL_ANOTB),
IntersectAction.FULL_INTERSECT, AnotbAction.FULL_ANOTB, UnionAction.FULL_UNION),
Exact_Estimation(062, "A{ 1.0,>0, F} ; B{<1.0,>0, F}",
IntersectResult.FULL_INTER, AnotbResult.FULL_ANOTB),
IntersectAction.FULL_INTERSECT, AnotbAction.FULL_ANOTB, UnionAction.FULL_UNION),
Exact_Degen(060, "A{ 1.0,>0, F} ; B{<1.0, 0, F}",
IntersectResult.DEGEN_MIN_0_F, AnotbResult.SKA_TRIM),
IntersectAction.DEGEN_MIN_0_F, AnotbAction.TRIM_A, UnionAction.TRIM_A),

Estimation_Empty(025, "A{<1.0,>0, F} ; B{ 1.0, 0, T}",
IntersectResult.EMPTY_1_0_T, AnotbResult.SKETCH_A),
IntersectAction.EMPTY_1_0_T, AnotbAction.SKETCH_A, UnionAction.SKETCH_A),
Estimation_Exact(026, "A{<1.0,>0, F} ; B{ 1.0,>0, F}",
IntersectResult.FULL_INTER, AnotbResult.FULL_ANOTB),
IntersectAction.FULL_INTERSECT, AnotbAction.FULL_ANOTB, UnionAction.FULL_UNION),
Estimation_Estimation(022, "A{<1.0,>0, F} ; B{<1.0,>0, F}",
IntersectResult.FULL_INTER, AnotbResult.FULL_ANOTB),
IntersectAction.FULL_INTERSECT, AnotbAction.FULL_ANOTB, UnionAction.FULL_UNION),
Estimation_Degen(020, "A{<1.0,>0, F} ; B{<1.0, 0, F}",
IntersectResult.DEGEN_MIN_0_F, AnotbResult.SKA_TRIM),
IntersectAction.DEGEN_MIN_0_F, AnotbAction.TRIM_A, UnionAction.TRIM_A),

Degen_Empty(005, "A{<1.0, 0, F} ; B{ 1.0, 0, T}",
IntersectResult.EMPTY_1_0_T, AnotbResult.DEGEN_THA_0_F),
IntersectAction.EMPTY_1_0_T, AnotbAction.DEGEN_THA_0_F, UnionAction.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),
IntersectAction.DEGEN_MIN_0_F, AnotbAction.DEGEN_THA_0_F, UnionAction.TRIM_B),
Degen_Estimation(002, "A{<1.0, 0, F} ; B{<1.0,>0, F}",
IntersectResult.DEGEN_MIN_0_F, AnotbResult.DEGEN_MIN_0_F),
IntersectAction.DEGEN_MIN_0_F, AnotbAction.DEGEN_MIN_0_F, UnionAction.TRIM_B),
Degen_Degen(000, "A{<1.0, 0, F} ; B{<1.0, 0, F}",
IntersectResult.DEGEN_MIN_0_F, AnotbResult.DEGEN_MIN_0_F);
IntersectAction.DEGEN_MIN_0_F, AnotbAction.DEGEN_MIN_0_F, UnionAction.DEGEN_MIN_0_F);

private static final Map<Integer, CornerCase> idToCornerCaseMap = new HashMap<>();
private int id;
private String inputStr;
private IntersectResult interResult;
private AnotbResult anotbResult;
private static final Map<Integer, CornerCase> caseIdToCornerCaseMap = new HashMap<>();
private int caseId;
private String caseDescription;
private IntersectAction intersectAction;
private AnotbAction anotbAction;
private UnionAction unionAction;

static {
for (final CornerCase cc : values()) {
idToCornerCaseMap.put(cc.getId(), cc);
caseIdToCornerCaseMap.put(cc.getId(), cc);
}
}

private CornerCase(final int id, final String desc,
final IntersectResult interResult, final AnotbResult anotbResult) {
this.id = id;
this.inputStr = desc;
this.interResult = interResult;
this.anotbResult = anotbResult;
private CornerCase(final int caseId, final String caseDescription,
final IntersectAction intersectAction, final AnotbAction anotbAction, final UnionAction unionAction) {
this.caseId = caseId;
this.caseDescription = caseDescription;
this.intersectAction = intersectAction;
this.anotbAction = anotbAction;
this.unionAction = unionAction;
}

public int getId() {
return id;
return caseId;
}

public String getCaseDescription() {
return caseDescription;
}

public String getDesc() {
return inputStr;
public IntersectAction getIntersectAction() {
return intersectAction;
}

public IntersectResult getInterResult() {
return interResult;
public AnotbAction getAnotbAction() {
return anotbAction;
}

public AnotbResult getAnotbResult() {
return anotbResult;
public UnionAction getUnionAction() {
return unionAction;
}

//See checkById test in /tuple/MiscTest.
public static CornerCase idToCornerCase(final int id) {
final CornerCase cc = idToCornerCaseMap.get(id);
public static CornerCase caseIdToCornerCase(final int id) {
final CornerCase cc = caseIdToCornerCaseMap.get(id);
if (cc == null) {
throw new SketchesArgumentException("Possible Corruption: Illegal CornerCase ID: " + Integer.toOctalString(id));
}
Expand All @@ -161,8 +196,8 @@ public static int createCornerCaseId(
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);
public static int sketchStateId(final boolean isEmpty, final int numRetained, final long thetaLong) {
// assume thetaLong = MAX if empty
return (((thetaLong == MAX) || isEmpty) ? 4 : 0) | ((numRetained > 0) ? 2 : 0) | (isEmpty ? 1 : 0);
}
}
34 changes: 17 additions & 17 deletions src/main/java/org/apache/datasketches/tuple/AnotB.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
import java.util.Arrays;

import org.apache.datasketches.SetOperationCornerCases;
import org.apache.datasketches.SetOperationCornerCases.AnotbResult;
import org.apache.datasketches.SetOperationCornerCases.AnotbAction;
import org.apache.datasketches.SetOperationCornerCases.CornerCase;
import org.apache.datasketches.SketchesArgumentException;
import org.apache.datasketches.SketchesStateException;
Expand Down Expand Up @@ -151,10 +151,10 @@ public void notB(final Sketch<S> skB) {

final int id =
SetOperationCornerCases.createCornerCaseId(thetaLong_, curCount_, empty_, thetaLongB, countB, emptyB);
final CornerCase cCase = CornerCase.idToCornerCase(id);
final AnotbResult anotbResult = cCase.getAnotbResult();
final CornerCase cCase = CornerCase.caseIdToCornerCase(id);
final AnotbAction anotbAction = cCase.getAnotbAction();

switch (anotbResult) {
switch (anotbAction) {
case EMPTY_1_0_T: {
reset();
break;
Expand All @@ -171,7 +171,7 @@ public void notB(final Sketch<S> skB) {
//thetaLong_ is ok
break;
}
case SKA_TRIM: {
case TRIM_A: {
thetaLong_ = min(thetaLong_, thetaLongB);
final DataArrays<S> da = trimAndCopyDataArrays(hashArr_, summaryArr_, thetaLong_, true);
hashArr_ = da.hashArr;
Expand Down Expand Up @@ -224,10 +224,10 @@ public void notB(final org.apache.datasketches.theta.Sketch skB) {

final int id =
SetOperationCornerCases.createCornerCaseId(thetaLong_, curCount_, empty_, thetaLongB, countB, emptyB);
final CornerCase cCase = CornerCase.idToCornerCase(id);
final AnotbResult anotbResult = cCase.getAnotbResult();
final CornerCase cCase = CornerCase.caseIdToCornerCase(id);
final AnotbAction anotbAction = cCase.getAnotbAction();

switch (anotbResult) {
switch (anotbAction) {
case EMPTY_1_0_T: {
reset();
break;
Expand All @@ -244,7 +244,7 @@ public void notB(final org.apache.datasketches.theta.Sketch skB) {
//thetaLong_ is ok
break;
}
case SKA_TRIM: {
case TRIM_A: {
thetaLong_ = min(thetaLong_, thetaLongB);
final DataArrays<S> da = trimAndCopyDataArrays(hashArr_, summaryArr_,thetaLong_, true);
hashArr_ = da.hashArr;
Expand Down Expand Up @@ -329,12 +329,12 @@ public static <S extends Summary> CompactSketch<S> aNotB(

final int id =
SetOperationCornerCases.createCornerCaseId(thetaLongA, countA, emptyA, thetaLongB, countB, emptyB);
final CornerCase cCase = CornerCase.idToCornerCase(id);
final AnotbResult anotbResult = cCase.getAnotbResult();
final CornerCase cCase = CornerCase.caseIdToCornerCase(id);
final AnotbAction anotbAction = cCase.getAnotbAction();

CompactSketch<S> result = null;

switch (anotbResult) {
switch (anotbAction) {
case EMPTY_1_0_T: {
result = new CompactSketch<>(null, null, Long.MAX_VALUE, true);
break;
Expand All @@ -348,7 +348,7 @@ public static <S extends Summary> CompactSketch<S> aNotB(
result = new CompactSketch<>(null, null, thetaLongA, false);
break;
}
case SKA_TRIM: {
case TRIM_A: {
final DataArrays<S> daA = getCopyOfDataArraysTuple(skA);
final long[] hashArrA = daA.hashArr;
final S[] summaryArrA = daA.summaryArr;
Expand Down Expand Up @@ -421,12 +421,12 @@ public static <S extends Summary> CompactSketch<S> aNotB(

final int id =
SetOperationCornerCases.createCornerCaseId(thetaLongA, countA, emptyA, thetaLongB, countB, emptyB);
final CornerCase cCase = CornerCase.idToCornerCase(id);
final AnotbResult anotbResult = cCase.getAnotbResult();
final CornerCase cCase = CornerCase.caseIdToCornerCase(id);
final AnotbAction anotbAction = cCase.getAnotbAction();

CompactSketch<S> result = null;

switch (anotbResult) {
switch (anotbAction) {
case EMPTY_1_0_T: {
result = new CompactSketch<>(null, null, Long.MAX_VALUE, true);
break;
Expand All @@ -440,7 +440,7 @@ public static <S extends Summary> CompactSketch<S> aNotB(
result = new CompactSketch<>(null, null, thetaLongA, false);
break;
}
case SKA_TRIM: {
case TRIM_A: {
final DataArrays<S> daA = getCopyOfDataArraysTuple(skA);
final long[] hashArrA = daA.hashArr;
final S[] summaryArrA = daA.summaryArr;
Expand Down
8 changes: 4 additions & 4 deletions src/test/java/org/apache/datasketches/tuple/MiscTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,10 @@ public void checkById() {
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
final int id = ids[i] << 3 | ids[j];
final CornerCase cCase = CornerCase.idToCornerCase(id);
final String interResStr = cCase.getInterResult().getDesc();
final String anotbResStr = cCase.getAnotbResult().getDesc();
println(Integer.toOctalString(id) + "\t" + cCase + "\t" + cCase.getDesc()
final CornerCase cCase = CornerCase.caseIdToCornerCase(id);
final String interResStr = cCase.getIntersectAction().getActionDescription();
final String anotbResStr = cCase.getAnotbAction().getActionDescription();
println(Integer.toOctalString(id) + "\t" + cCase + "\t" + cCase.getCaseDescription()
+ "\t" + interResStr + "\t" + anotbResStr);
}
}
Expand Down

0 comments on commit d3a15cb

Please sign in to comment.