Skip to content

Commit ec0a4fd

Browse files
authored
Merge pull request #363 from leventeBajczi/fp.rem
Add fp.rem operation to FloatingPointFormulaManager
2 parents 20a13b0 + 6c66b15 commit ec0a4fd

9 files changed

+159
-55
lines changed

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,13 @@ FloatingPointFormula multiply(
201201
FloatingPointFormula number2,
202202
FloatingPointRoundingMode pFloatingPointRoundingMode);
203203

204+
/**
205+
* remainder: x - y * n, where n in Z is nearest to x/y. The result can be negative even for two
206+
* positive arguments, e.g. "rem(5, 4) == 1" and "rem(5, 6) == -1", as opposed to integer modulo
207+
* operators.
208+
*/
209+
FloatingPointFormula remainder(FloatingPointFormula dividend, FloatingPointFormula divisor);
210+
204211
// ----------------- Numeric relations, return type BooleanFormula -----------------
205212

206213
/**

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,14 @@ public FloatingPointFormula multiply(
374374
protected abstract TFormulaInfo multiply(
375375
TFormulaInfo pParam1, TFormulaInfo pParam2, TFormulaInfo pFloatingPointRoundingMode);
376376

377+
@Override
378+
public FloatingPointFormula remainder(
379+
FloatingPointFormula number1, FloatingPointFormula number2) {
380+
return wrap(remainder(extractInfo(number1), extractInfo(number2)));
381+
}
382+
383+
protected abstract TFormulaInfo remainder(TFormulaInfo pParam1, TFormulaInfo pParam2);
384+
377385
@Override
378386
public BooleanFormula assignment(FloatingPointFormula pNumber1, FloatingPointFormula pNumber2) {
379387
TFormulaInfo param1 = extractInfo(pNumber1);

src/org/sosy_lab/java_smt/delegate/statistics/StatisticsFloatingPointFormulaManager.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,13 @@ public FloatingPointFormula multiply(
263263
return delegate.multiply(pNumber1, pNumber2, pFloatingPointRoundingMode);
264264
}
265265

266+
@Override
267+
public FloatingPointFormula remainder(
268+
FloatingPointFormula number1, FloatingPointFormula number2) {
269+
stats.fpOperations.getAndIncrement();
270+
return delegate.remainder(number1, number2);
271+
}
272+
266273
@Override
267274
public BooleanFormula assignment(FloatingPointFormula pNumber1, FloatingPointFormula pNumber2) {
268275
stats.fpOperations.getAndIncrement();

src/org/sosy_lab/java_smt/delegate/synchronize/SynchronizedFloatingPointFormulaManager.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,14 @@ public FloatingPointFormula multiply(
297297
}
298298
}
299299

300+
@Override
301+
public FloatingPointFormula remainder(
302+
FloatingPointFormula number1, FloatingPointFormula number2) {
303+
synchronized (sync) {
304+
return delegate.remainder(number1, number2);
305+
}
306+
}
307+
300308
@Override
301309
public BooleanFormula assignment(FloatingPointFormula pNumber1, FloatingPointFormula pNumber2) {
302310
synchronized (sync) {

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

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

284+
@Override
285+
protected Expr remainder(Expr pParam1, Expr pParam2) {
286+
return exprManager.mkExpr(Kind.FLOATINGPOINT_REM, pParam1, pParam2);
287+
}
288+
284289
@Override
285290
protected Expr assignment(Expr pParam1, Expr pParam2) {
286291
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);

0 commit comments

Comments
 (0)