source: CIVL/mods/dev.civl.sarl/test/big/performance/PerformanceTest.java

main
Last change on this file was aad342c, checked in by Stephen Siegel <siegel@…>, 3 years ago

Performing huge refactor to incorporate ABC, GMC, and SARL into CIVL repo and use Java modules.

git-svn-id: svn://vsl.cis.udel.edu/civl/trunk@5664 fb995dde-84ed-4084-dfe6-e5aef3e2452c

  • Property mode set to 100644
File size: 4.6 KB
Line 
1package performance;
2
3import static org.junit.Assert.assertEquals;
4
5import java.util.Arrays;
6
7import org.junit.Test;
8
9import dev.civl.sarl.SARL;
10import dev.civl.sarl.IF.SymbolicUniverse;
11import dev.civl.sarl.IF.expr.BooleanExpression;
12import dev.civl.sarl.IF.expr.NumericExpression;
13import dev.civl.sarl.IF.expr.NumericSymbolicConstant;
14import dev.civl.sarl.IF.expr.SymbolicConstant;
15import dev.civl.sarl.IF.type.SymbolicArrayType;
16import dev.civl.sarl.IF.type.SymbolicFunctionType;
17import dev.civl.sarl.IF.type.SymbolicType;
18
19public class PerformanceTest {
20
21 static public BooleanExpression slowNegationFormula(boolean unsat,
22 SymbolicUniverse u) {
23 // types:
24 SymbolicType intType = u.integerType();
25 SymbolicArrayType arrayType = u.arrayType(intType);
26 SymbolicFunctionType funcType = u.functionType(
27 Arrays.asList(arrayType, intType, intType, intType, intType),
28 u.booleanType());
29 // constants:
30 NumericSymbolicConstant X_N = (NumericSymbolicConstant) u
31 .symbolicConstant(u.stringObject("X_N"), u.integerType());
32 NumericSymbolicConstant Y0 = (NumericSymbolicConstant) u
33 .symbolicConstant(u.stringObject("Y0"), intType);
34 NumericSymbolicConstant Y1 = (NumericSymbolicConstant) u
35 .symbolicConstant(u.stringObject("Y1"), intType);
36 NumericSymbolicConstant Y2 = (NumericSymbolicConstant) u
37 .symbolicConstant(u.stringObject("Y2"), intType);
38 NumericSymbolicConstant Y3 = (NumericSymbolicConstant) u
39 .symbolicConstant(u.stringObject("Y3"), intType);
40 BooleanExpression Y4 = (BooleanExpression) u
41 .symbolicConstant(u.stringObject("Y4"), u.booleanType());
42 BooleanExpression Y5 = (BooleanExpression) u
43 .symbolicConstant(u.stringObject("Y5"), u.booleanType());
44 NumericSymbolicConstant Y6 = (NumericSymbolicConstant) u
45 .symbolicConstant(u.stringObject("Y6"), intType);
46 NumericSymbolicConstant Y7 = (NumericSymbolicConstant) u
47 .symbolicConstant(u.stringObject("Y7"), intType);
48 SymbolicConstant array = u.symbolicConstant(u.stringObject("X_a"),
49 arrayType);
50 SymbolicConstant isDuplet = u
51 .symbolicConstant(u.stringObject("is_duplet"), funcType);
52 // clauses:
53 BooleanExpression clauses[] = new BooleanExpression[17];
54
55 clauses[0] = u.lessThan(u.oneInt(), X_N);
56 clauses[1] = u.or(u.equals(u.oneInt(), u.subtract(X_N, Y7)), Y5);
57 clauses[2] = u.or(u.equals(Y6, u.add(Y0, u.oneInt())), u.not(Y4));
58 clauses[3] = u.or(u.equals(Y7, u.add(Y2, u.oneInt())), u.not(Y5));
59 clauses[4] = u.or(u.equals(Y0, u.zeroInt()), Y4);
60 clauses[5] = u.or(u.equals(Y2, u.zeroInt()), Y5);
61 clauses[6] = u.or(u.lessThanEquals(u.add(Y0, u.oneInt()), Y1),
62 u.not(Y4));
63 clauses[7] = u.or(u.lessThanEquals(u.add(Y2, u.oneInt()), Y3),
64 u.not(Y5));
65 clauses[8] = u.or(u.lessThanEquals(Y1, u.subtract(X_N, u.oneInt())),
66 u.not(Y4));
67 clauses[9] = u.or(u.lessThanEquals(Y3, u.subtract(X_N, u.oneInt())),
68 u.not(Y5));
69 clauses[10] = u.or(u.lessThanEquals(u.oneInt(), Y6), u.not(Y4));
70 clauses[11] = u.or(u.lessThanEquals(u.oneInt(), Y7), u.not(Y5));
71 clauses[12] = u.or(
72 u.neq(u.zeroInt(),
73 u.subtract((NumericExpression) u.arrayRead(array, Y0),
74 (NumericExpression) u.arrayRead(array, Y2))),
75 u.not(Y5));
76 clauses[13] = u.or(
77 (BooleanExpression) u.apply(isDuplet,
78 Arrays.asList(array, u.zeroInt(), X_N, Y0, Y1)),
79 u.not(Y4));
80 clauses[14] = u.or(
81 (BooleanExpression) u.apply(isDuplet,
82 Arrays.asList(array, u.zeroInt(), X_N, Y2, Y3)),
83 u.not(Y5));
84 clauses[15] = u.or(u.equals(u.oneInt(), u.subtract(X_N, Y6)), Y4);
85 if (unsat)
86 clauses[16] = u.lessThan(X_N, u.zeroInt());
87 else
88 clauses[16] = u.trueExpression();
89 // ret:
90 return u.and(Arrays.asList(clauses));
91 }
92
93 /**
94 * The negation of <code>
95 * 0 <= X_N - 1*Y7 - 1 &&
96 * 0 <= X_N - 3 &&
97 * 0 <= Y6 &&
98 * 0 <= Y7 &&
99 * (is_duplet(X_a,0,X_N,Y0,Y1) || (!Y4)) &&
100 * (is_duplet(X_a,0,X_N,Y2,Y3) || (!Y5)) &&
101 * ((0 == X_N - 1*Y6 - 1) || Y4) &&
102 * ((0 == X_N - 1*Y7 - 1) || Y5) &&
103 * ((0 == Y0 - 1*Y6 + 1) || (!Y4)) &&
104 * ((0 == Y2 - 1*Y7 + 1) || (!Y5)) &&
105 * ((0 == Y0) || Y4) &&
106 * ((0 == Y2) || Y5) &&
107 * ((Y0 - 1*Y1 + 1 <= 0) || (!Y4)) &&
108 * ((Y2 - 1*Y3 + 1 <= 0) || (!Y5)) &&
109 * ((0 <= X_N - 1*Y1 - 1) || (!Y4)) &&
110 * ((0 <= X_N - 1*Y3 - 1) || (!Y5)) &&
111 * ((0 <= Y6 - 1) || (!Y4)) &&
112 * ((0 <= Y7 - 1) || (!Y5)) &&
113 * ((0 != X_a[Y0] - 1*X_a[Y2]) || (!Y5)) &&
114 * 0 <= X_N - 1*Y6 - 1 &&
115 * X_N <= 0
116 * </code>
117 */
118 @Test
119 public void slowNegation() {
120 SymbolicUniverse u = SARL.newStandardUniverse();
121 // test:
122 BooleanExpression negation = u.not(slowNegationFormula(true, u));
123
124 assertEquals(u.trueExpression(),
125 u.reasoner(u.trueExpression()).simplify(negation));
126 }
127}
Note: See TracBrowser for help on using the repository browser.