Skip to content

Commit e660303

Browse files
committed
Implemented fp.rem in solvers, added tests
1 parent 797f0c9 commit e660303

File tree

5 files changed

+97
-0
lines changed

5 files changed

+97
-0
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,11 @@ protected Expr multiply(Expr pParam1, Expr pParam2, Expr pRoundingMode) {
280280
return exprManager.mkExpr(Kind.FLOATINGPOINT_MULT, pRoundingMode, pParam1, pParam2);
281281
}
282282

283+
@Override
284+
protected Expr remainder(Expr pParam1, Expr pParam2) {
285+
return exprManager.mkExpr(Kind.FLOATINGPOINT_REM, pParam1, pParam2);
286+
}
287+
283288
@Override
284289
protected Expr assignment(Expr pParam1, Expr pParam2) {
285290
return exprManager.mkExpr(Kind.EQUAL, pParam1, pParam2);

src/org/sosy_lab/java_smt/solvers/cvc5/CVC5FloatingPointFormulaManager.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,11 @@ protected Term multiply(Term pParam1, Term pParam2, Term pRoundingMode) {
317317
return solver.mkTerm(Kind.FLOATINGPOINT_MULT, pRoundingMode, pParam1, pParam2);
318318
}
319319

320+
@Override
321+
protected Term remainder(Term pParam1, Term pParam2) {
322+
return solver.mkTerm(Kind.FLOATINGPOINT_REM, pParam1, pParam2);
323+
}
324+
320325
@Override
321326
protected Term assignment(Term pParam1, Term pParam2) {
322327
return solver.mkTerm(Kind.EQUAL, pParam1, pParam2);

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,11 @@ protected Long multiply(Long pNumber1, Long pNumber2, Long pRoundingMode) {
248248
return msat_make_fp_times(mathsatEnv, pRoundingMode, pNumber1, pNumber2);
249249
}
250250

251+
@Override
252+
protected Long remainder(Long pParam1, Long pParam2) {
253+
throw new UnsupportedOperationException("MathSAT5 does not implement fp.rem");
254+
}
255+
251256
@Override
252257
protected Long divide(Long pNumber1, Long pNumber2, Long pRoundingMode) {
253258
return msat_make_fp_div(mathsatEnv, pRoundingMode, pNumber1, pNumber2);

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,11 @@ protected Long multiply(Long pNumber1, Long pNumber2, Long pRoundingMode) {
216216
return Native.mkFpaMul(z3context, pRoundingMode, pNumber1, pNumber2);
217217
}
218218

219+
@Override
220+
protected Long remainder(Long pParam1, Long pParam2) {
221+
return Native.mkFpaRem(z3context, pParam1, pParam2);
222+
}
223+
219224
@Override
220225
protected Long divide(Long pNumber1, Long pNumber2, Long pRoundingMode) {
221226
return Native.mkFpaDiv(z3context, pRoundingMode, pNumber1, pNumber2);

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

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,83 @@ public void sqrt() throws SolverException, InterruptedException {
197197
}
198198
}
199199

200+
@Test
201+
public void fpremNormal() throws SolverException, InterruptedException {
202+
assume()
203+
.withMessage("MathSAT5 does not implement fp.rem")
204+
.that(solver == Solvers.MATHSAT5)
205+
.isFalse();
206+
207+
for (FloatingPointType prec : new FloatingPointType[]{singlePrecType, doublePrecType,
208+
FormulaType.getFloatingPointType(5, 6)}) {
209+
210+
final FloatingPointFormula five = fpmgr.makeNumber(5, prec);
211+
final FloatingPointFormula four = fpmgr.makeNumber(4, prec);
212+
final FloatingPointFormula six = fpmgr.makeNumber(6, prec);
213+
214+
final FloatingPointFormula one = fpmgr.makeNumber(1, prec);
215+
final FloatingPointFormula minusOne = fpmgr.makeNumber(-1, prec);
216+
217+
final FloatingPointFormula expr1 = fpmgr.remainder(five, four);
218+
final FloatingPointFormula expr2 = fpmgr.remainder(five, six);
219+
220+
assertThatFormula(fpmgr.assignment(expr1, one)).isTautological();
221+
assertThatFormula(fpmgr.assignment(expr2, minusOne)).isTautological();
222+
}
223+
}
224+
225+
@Test
226+
public void fpremSpecial() throws SolverException, InterruptedException {
227+
assume()
228+
.withMessage("MathSAT5 does not implement fp.rem")
229+
.that(solver == Solvers.MATHSAT5)
230+
.isFalse();
231+
232+
for (FloatingPointType prec : new FloatingPointType[]{singlePrecType, doublePrecType,
233+
FormulaType.getFloatingPointType(5, 6)}) {
234+
235+
final FloatingPointFormula num = fpmgr.makeNumber(42, prec);
236+
237+
final FloatingPointFormula nan = fpmgr.makeNumber("NaN", prec);
238+
final FloatingPointFormula zero = fpmgr.makeNumber("0", prec);
239+
final FloatingPointFormula inf = fpmgr.makePlusInfinity(prec);
240+
241+
final FloatingPointFormula minusNan = fpmgr.makeNumber("-NaN", prec);
242+
final FloatingPointFormula minusZero = fpmgr.makeNumber("0", prec);
243+
final FloatingPointFormula minusInf = fpmgr.makeMinusInfinity(prec);
244+
245+
246+
final FloatingPointFormula expr1 = fpmgr.remainder(nan, nan);
247+
final FloatingPointFormula expr2 = fpmgr.remainder(zero, zero);
248+
final FloatingPointFormula expr3 = fpmgr.remainder(inf, inf);
249+
250+
final FloatingPointFormula expr4 = fpmgr.remainder(minusNan, minusNan);
251+
final FloatingPointFormula expr5 = fpmgr.remainder(minusZero, minusZero);
252+
final FloatingPointFormula expr6 = fpmgr.remainder(minusInf, minusInf);
253+
254+
final FloatingPointFormula expr7 = fpmgr.remainder(num, nan);
255+
final FloatingPointFormula expr8 = fpmgr.remainder(num, zero);
256+
final FloatingPointFormula expr9 = fpmgr.remainder(num, inf);
257+
258+
final FloatingPointFormula expr10 = fpmgr.remainder(num, minusNan);
259+
final FloatingPointFormula expr11 = fpmgr.remainder(num, minusZero);
260+
final FloatingPointFormula expr12 = fpmgr.remainder(num, minusInf);
261+
262+
assertThatFormula(fpmgr.assignment(expr1, nan)).isTautological();
263+
assertThatFormula(fpmgr.assignment(expr2, nan)).isTautological();
264+
assertThatFormula(fpmgr.assignment(expr3, nan)).isTautological();
265+
assertThatFormula(fpmgr.assignment(expr4, nan)).isTautological();
266+
assertThatFormula(fpmgr.assignment(expr5, nan)).isTautological();
267+
assertThatFormula(fpmgr.assignment(expr6, nan)).isTautological();
268+
assertThatFormula(fpmgr.assignment(expr7, nan)).isTautological();
269+
assertThatFormula(fpmgr.assignment(expr8, nan)).isTautological();
270+
assertThatFormula(fpmgr.assignment(expr9, num)).isTautological();
271+
assertThatFormula(fpmgr.assignment(expr10, nan)).isTautological();
272+
assertThatFormula(fpmgr.assignment(expr11, nan)).isTautological();
273+
assertThatFormula(fpmgr.assignment(expr12, num)).isTautological();
274+
}
275+
}
276+
200277
@Test
201278
public void specialValueFunctions() throws SolverException, InterruptedException {
202279
assertThatFormula(fpmgr.isInfinity(posInf)).isTautological();

0 commit comments

Comments
 (0)