Skip to content

Commit 70a3cfc

Browse files
committed
add new API method for FP_ABS returning the absolute of a FP value.
This is related to #173.
1 parent 7d5e120 commit 70a3cfc

11 files changed

+43
-0
lines changed

src/org/sosy_lab/java_smt/api/FloatingPointFormulaManager.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,8 @@ FloatingPointFormula castFrom(
140140

141141
FloatingPointFormula negate(FloatingPointFormula number);
142142

143+
FloatingPointFormula abs(FloatingPointFormula number);
144+
143145
FloatingPointFormula add(FloatingPointFormula number1, FloatingPointFormula number2);
144146

145147
FloatingPointFormula add(

src/org/sosy_lab/java_smt/api/FunctionDeclarationKind.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,9 @@ public enum FunctionDeclarationKind {
197197
/** Negation of a floating point. */
198198
FP_NEG,
199199

200+
/** Absolute value of a floating point. */
201+
FP_ABS,
202+
200203
/** Subtraction over floating points. */
201204
FP_SUB,
202205

src/org/sosy_lab/java_smt/basicimpl/AbstractFloatingPointFormulaManager.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,14 @@ public FloatingPointFormula negate(FloatingPointFormula pNumber) {
250250

251251
protected abstract TFormulaInfo negate(TFormulaInfo pParam1);
252252

253+
@Override
254+
public FloatingPointFormula abs(FloatingPointFormula pNumber) {
255+
TFormulaInfo param1 = extractInfo(pNumber);
256+
return wrap(abs(param1));
257+
}
258+
259+
protected abstract TFormulaInfo abs(TFormulaInfo pParam1);
260+
253261
@Override
254262
public FloatingPointFormula add(FloatingPointFormula pNumber1, FloatingPointFormula pNumber2) {
255263
TFormulaInfo param1 = extractInfo(pNumber1);

src/org/sosy_lab/java_smt/solvers/cvc4/CVC4FloatingPointFormulaManager.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,11 @@ protected Expr negate(Expr pParam1) {
246246
return exprManager.mkExpr(Kind.FLOATINGPOINT_NEG, pParam1);
247247
}
248248

249+
@Override
250+
protected Expr abs(Expr pParam1) {
251+
return exprManager.mkExpr(Kind.FLOATINGPOINT_ABS, pParam1);
252+
}
253+
249254
@Override
250255
protected Expr add(Expr pParam1, Expr pParam2, Expr pRoundingMode) {
251256
return exprManager.mkExpr(Kind.FLOATINGPOINT_PLUS, pRoundingMode, pParam1, pParam2);

src/org/sosy_lab/java_smt/solvers/cvc4/CVC4FormulaCreator.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,7 @@ public <R> R visit(FormulaVisitor<R> visitor, Formula formula, final Expr f) {
370370
.put(Kind.FLOATINGPOINT_ISSN, FunctionDeclarationKind.FP_IS_SUBNORMAL)
371371
.put(Kind.FLOATINGPOINT_ISZ, FunctionDeclarationKind.FP_IS_ZERO)
372372
.put(Kind.FLOATINGPOINT_EQ, FunctionDeclarationKind.FP_EQ)
373+
.put(Kind.FLOATINGPOINT_ABS, FunctionDeclarationKind.FP_ABS)
373374
.put(Kind.FLOATINGPOINT_PLUS, FunctionDeclarationKind.FP_ADD)
374375
.put(Kind.FLOATINGPOINT_SUB, FunctionDeclarationKind.FP_SUB)
375376
.put(Kind.FLOATINGPOINT_MULT, FunctionDeclarationKind.FP_MUL)

src/org/sosy_lab/java_smt/solvers/mathsat5/Mathsat5FloatingPointFormulaManager.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.sosy_lab.java_smt.solvers.mathsat5;
2121

2222
import static org.sosy_lab.java_smt.solvers.mathsat5.Mathsat5NativeApi.msat_make_equal;
23+
import static org.sosy_lab.java_smt.solvers.mathsat5.Mathsat5NativeApi.msat_make_fp_abs;
2324
import static org.sosy_lab.java_smt.solvers.mathsat5.Mathsat5NativeApi.msat_make_fp_cast;
2425
import static org.sosy_lab.java_smt.solvers.mathsat5.Mathsat5NativeApi.msat_make_fp_div;
2526
import static org.sosy_lab.java_smt.solvers.mathsat5.Mathsat5NativeApi.msat_make_fp_equal;
@@ -214,6 +215,11 @@ protected Long negate(Long pNumber) {
214215
return msat_make_fp_neg(mathsatEnv, pNumber);
215216
}
216217

218+
@Override
219+
protected Long abs(Long pNumber) {
220+
return msat_make_fp_abs(mathsatEnv, pNumber);
221+
}
222+
217223
@Override
218224
protected Long add(Long pNumber1, Long pNumber2, Long pRoundingMode) {
219225
return msat_make_fp_plus(mathsatEnv, pRoundingMode, pNumber1, pNumber2);

src/org/sosy_lab/java_smt/solvers/mathsat5/Mathsat5FormulaCreator.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import static org.sosy_lab.java_smt.solvers.mathsat5.Mathsat5NativeApi.MSAT_TAG_BV_ZEXT;
4949
import static org.sosy_lab.java_smt.solvers.mathsat5.Mathsat5NativeApi.MSAT_TAG_EQ;
5050
import static org.sosy_lab.java_smt.solvers.mathsat5.Mathsat5NativeApi.MSAT_TAG_FLOOR;
51+
import static org.sosy_lab.java_smt.solvers.mathsat5.Mathsat5NativeApi.MSAT_TAG_FP_ABS;
5152
import static org.sosy_lab.java_smt.solvers.mathsat5.Mathsat5NativeApi.MSAT_TAG_FP_ADD;
5253
import static org.sosy_lab.java_smt.solvers.mathsat5.Mathsat5NativeApi.MSAT_TAG_FP_AS_IEEEBV;
5354
import static org.sosy_lab.java_smt.solvers.mathsat5.Mathsat5NativeApi.MSAT_TAG_FP_CAST;
@@ -432,6 +433,8 @@ private FunctionDeclarationKind getDeclarationKind(long pF) {
432433

433434
case MSAT_TAG_FP_NEG:
434435
return FunctionDeclarationKind.FP_NEG;
436+
case MSAT_TAG_FP_ABS:
437+
return FunctionDeclarationKind.FP_ABS;
435438
case MSAT_TAG_FP_ADD:
436439
return FunctionDeclarationKind.FP_ADD;
437440
case MSAT_TAG_FP_SUB:

src/org/sosy_lab/java_smt/solvers/z3/Z3FloatingPointFormulaManager.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,11 @@ protected Long negate(Long pNumber) {
186186
return Native.mkFpaNeg(z3context, pNumber);
187187
}
188188

189+
@Override
190+
protected Long abs(Long pNumber) {
191+
return Native.mkFpaAbs(z3context, pNumber);
192+
}
193+
189194
@Override
190195
protected Long add(Long pNumber1, Long pNumber2, Long pRoundingMode) {
191196
return Native.mkFpaAdd(z3context, pRoundingMode, pNumber1, pNumber2);

src/org/sosy_lab/java_smt/solvers/z3/Z3FormulaCreator.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,8 @@ private FunctionDeclarationKind getDeclarationKind(long f) {
563563

564564
case Z3_OP_FPA_NEG:
565565
return FunctionDeclarationKind.FP_NEG;
566+
case Z3_OP_FPA_ABS:
567+
return FunctionDeclarationKind.FP_ABS;
566568
case Z3_OP_FPA_SUB:
567569
return FunctionDeclarationKind.FP_SUB;
568570
case Z3_OP_FPA_ADD:

src/org/sosy_lab/java_smt/test/FloatingPointFormulaManagerTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,11 +117,14 @@ public void negative() throws SolverException, InterruptedException {
117117
FloatingPointFormula formula = fpmgr.makeNumber(d, singlePrecType);
118118
assertThatFormula(fpmgr.isNegative(formula)).isTautological();
119119
assertThatFormula(fpmgr.isNegative(fpmgr.negate(formula))).isUnsatisfiable();
120+
assertThatFormula(fpmgr.equalWithFPSemantics(fpmgr.negate(formula), fpmgr.abs(formula)))
121+
.isTautological();
120122
}
121123
for (double d : new double[] {1, 2, 0.0, Double.POSITIVE_INFINITY}) {
122124
FloatingPointFormula formula = fpmgr.makeNumber(d, singlePrecType);
123125
assertThatFormula(fpmgr.isNegative(formula)).isUnsatisfiable();
124126
assertThatFormula(fpmgr.isNegative(fpmgr.negate(formula))).isTautological();
127+
assertThatFormula(fpmgr.equalWithFPSemantics(formula, fpmgr.abs(formula))).isTautological();
125128
}
126129
}
127130

@@ -131,16 +134,20 @@ public void parser() throws SolverException, InterruptedException {
131134
FloatingPointFormula formula = fpmgr.makeNumber(s, singlePrecType);
132135
assertThatFormula(fpmgr.isNegative(formula)).isTautological();
133136
assertThatFormula(fpmgr.isNegative(fpmgr.negate(formula))).isUnsatisfiable();
137+
assertThatFormula(fpmgr.equalWithFPSemantics(fpmgr.negate(formula), fpmgr.abs(formula)))
138+
.isTautological();
134139
}
135140
for (String s : new String[] {"1", "Infinity", "0", "0.0", "0.000"}) {
136141
FloatingPointFormula formula = fpmgr.makeNumber(s, singlePrecType);
137142
assertThatFormula(fpmgr.isNegative(formula)).isUnsatisfiable();
138143
assertThatFormula(fpmgr.isNegative(fpmgr.negate(formula))).isTautological();
144+
assertThatFormula(fpmgr.equalWithFPSemantics(formula, fpmgr.abs(formula))).isTautological();
139145
}
140146
for (String s : new String[] {"+1", "+Infinity", "+0", "+0.0", "+0.000"}) {
141147
FloatingPointFormula formula = fpmgr.makeNumber(s, singlePrecType);
142148
assertThatFormula(fpmgr.isNegative(formula)).isUnsatisfiable();
143149
assertThatFormula(fpmgr.isNegative(fpmgr.negate(formula))).isTautological();
150+
assertThatFormula(fpmgr.equalWithFPSemantics(formula, fpmgr.abs(formula))).isTautological();
144151
}
145152
// NaN is not positive and not negative.
146153
for (String s : new String[] {"NaN", "-NaN", "+NaN"}) {

src/org/sosy_lab/java_smt/test/SolverVisitorTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ public void floatMoreVisit() {
205205
checkKind(fpmgr.isNormal(x), FunctionDeclarationKind.FP_IS_NORMAL);
206206
checkKind(fpmgr.isSubnormal(x), FunctionDeclarationKind.FP_IS_SUBNORMAL);
207207
checkKind(fpmgr.isZero(x), FunctionDeclarationKind.FP_IS_ZERO);
208+
checkKind(fpmgr.abs(x), FunctionDeclarationKind.FP_ABS);
208209
if (Solvers.CVC4 != solverToUse()) { // CVC4 does not support this operation
209210
checkKind(fpmgr.toIeeeBitvector(x), FunctionDeclarationKind.FP_AS_IEEEBV);
210211
}

0 commit comments

Comments
 (0)