From 4f4a298ccd3713a2d216ed45ee7abb50c80df087 Mon Sep 17 00:00:00 2001 From: Guido Tack Date: Mon, 12 Jun 2017 13:12:46 +1000 Subject: [PATCH 1/8] Fix unification of enum type-inst variables Previously a call to a function such as predicate foo(array[$U] of int, $U) would not type check. --- lib/ast.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/ast.cpp b/lib/ast.cpp index c800b3cbc..944475bb5 100644 --- a/lib/ast.cpp +++ b/lib/ast.cpp @@ -713,8 +713,12 @@ namespace MiniZinc { tiit.enumId(enumIds[enumIds.size()-1]); } tiit.dim(0); - if (tii->type().st()==Type::ST_SET) + if (tii->type().st()==Type::ST_SET) { tiit.st(Type::ST_PLAIN); + } + if (isaEnumTIId(tii->domain())) { + tiit.st(Type::ST_SET); + } ASTStringMap::t::iterator it = tmap.find(tiid); if (it==tmap.end()) { tmap.insert(std::pair(tiid,tiit)); From 9384d3d6b7dc20139b6c4a36fa6a2dec81e7a8f5 Mon Sep 17 00:00:00 2001 From: Guido Tack Date: Mon, 12 Jun 2017 15:06:47 +1000 Subject: [PATCH 2/8] Fix bug in JSON output of one-dimensional array literals --- lib/builtins.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/builtins.cpp b/lib/builtins.cpp index b94528575..b62b98b1a 100644 --- a/lib/builtins.cpp +++ b/lib/builtins.cpp @@ -1412,7 +1412,9 @@ namespace MiniZinc { if (ArrayLit* al = e->dyn_cast()) { std::vector dims(al->dims()-1); - dims[0] = al->max(al->dims()-1)-al->min(al->dims()-1)+1; + if (dims.size() != 0) { + dims[0] = al->max(al->dims()-1)-al->min(al->dims()-1)+1; + } for (unsigned int i=1; idims()-1; i++) { dims[i] = dims[i-1] * (al->max(al->dims()-1-i)-al->min(al->dims()-1-i)+1); From da5509cff53725e775a1f669206d29df2f014407 Mon Sep 17 00:00:00 2001 From: Guido Tack Date: Mon, 12 Jun 2017 15:29:16 +1000 Subject: [PATCH 3/8] Fix un-trailing for let expressions, which could sometimes cause incorrect code to be emitted when lets are evaluated in nested loops. Fixes #166. --- lib/ast.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/ast.cpp b/lib/ast.cpp index 944475bb5..c5955132a 100644 --- a/lib/ast.cpp +++ b/lib/ast.cpp @@ -634,7 +634,12 @@ namespace MiniZinc { } void Let::popbindings(void) { - GC::untrail(); + for (unsigned int i=_let.size(); i--;) { + if (VarDecl* vd = _let[i]->dyn_cast()) { + GC::untrail(); + break; + } + } } void From 576c570f03888d0d51e4a32058246918792106d9 Mon Sep 17 00:00:00 2001 From: Guido Tack Date: Wed, 12 Jul 2017 11:48:09 +1000 Subject: [PATCH 4/8] Fix bug in flattening of linear equations that contain the same variable on both sides --- lib/flatten.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/flatten.cpp b/lib/flatten.cpp index 055526c30..efba1a9fb 100644 --- a/lib/flatten.cpp +++ b/lib/flatten.cpp @@ -2503,7 +2503,7 @@ namespace MiniZinc { } else { GCLock lock; if (assignTo != NULL) { - Val resultCoeff; + Val resultCoeff = 0; typename LinearTraits::Bounds bounds(d,d,true); for (unsigned int i=coeffv.size(); i--;) { if (alv[i]()==assignTo) { @@ -2525,7 +2525,7 @@ namespace MiniZinc { break; } } - if (bounds.valid) { + if (bounds.valid && resultCoeff!=0) { if (resultCoeff < 0) { bounds.l = LinearTraits::floor_div(bounds.l,-resultCoeff); bounds.u = LinearTraits::ceil_div(bounds.u,-resultCoeff); From 192aedb9bec460df42f5301b8bb7ddd740658e45 Mon Sep 17 00:00:00 2001 From: Guido Tack Date: Thu, 17 Aug 2017 17:57:13 +1000 Subject: [PATCH 5/8] Fix incorrect simplification of Boolean constraints assigned to variables that are assigned to false --- lib/optimize.cpp | 43 ++++++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/lib/optimize.cpp b/lib/optimize.cpp index ff3876d30..e27926787 100644 --- a/lib/optimize.cpp +++ b/lib/optimize.cpp @@ -396,7 +396,6 @@ namespace MiniZinc { int idCount = 0; std::vector pos; std::vector neg; - for (unsigned int j=0; jargs().size(); j++) { bool unit = (j==0 ? isConjunction : !isConjunction); ArrayLit* al = follow_id(c->args()[j])->cast(); @@ -454,13 +453,19 @@ namespace MiniZinc { if (bi->isa()) { env.envi().fail(); } else { - CollectDecls cd(envi.vo,deletedVarDecls,bi); - topDown(cd,bi->cast()->e()->e()); - bi->cast()->e()->ti()->domain(constants().lit_false); - bi->cast()->e()->ti()->setComputedDomain(true); - bi->cast()->e()->e(constants().lit_false); - pushVarDecl(envi, bi->cast(), boolConstraints[i], vardeclQueue); - pushDependentConstraints(envi, bi->cast()->e()->id(), constraintQueue); + if (bi->cast()->e()->ti()->domain()) { + if (eval_bool(envi, bi->cast()->e()->ti()->domain())) { + envi.fail(); + } + } else { + CollectDecls cd(envi.vo,deletedVarDecls,bi); + topDown(cd,bi->cast()->e()->e()); + bi->cast()->e()->ti()->domain(constants().lit_false); + bi->cast()->e()->ti()->setComputedDomain(true); + bi->cast()->e()->e(constants().lit_false); + pushVarDecl(envi, bi->cast(), boolConstraints[i], vardeclQueue); + pushDependentConstraints(envi, bi->cast()->e()->id(), constraintQueue); + } } } else { if (bi->isa()) { @@ -468,13 +473,19 @@ namespace MiniZinc { topDown(cd,bi->cast()->e()); bi->remove(); } else { - CollectDecls cd(envi.vo,deletedVarDecls,bi); - topDown(cd,bi->cast()->e()->e()); - bi->cast()->e()->ti()->domain(constants().lit_true); - bi->cast()->e()->ti()->setComputedDomain(true); - bi->cast()->e()->e(constants().lit_true); - pushVarDecl(envi, bi->cast(), boolConstraints[i], vardeclQueue); - pushDependentConstraints(envi, bi->cast()->e()->id(), constraintQueue); + if (bi->cast()->e()->ti()->domain()) { + if (!eval_bool(envi, bi->cast()->e()->ti()->domain())) { + envi.fail(); + } + } else { + CollectDecls cd(envi.vo,deletedVarDecls,bi); + topDown(cd,bi->cast()->e()->e()); + bi->cast()->e()->ti()->domain(constants().lit_true); + bi->cast()->e()->ti()->setComputedDomain(true); + bi->cast()->e()->e(constants().lit_true); + pushVarDecl(envi, bi->cast(), boolConstraints[i], vardeclQueue); + pushDependentConstraints(envi, bi->cast()->e()->id(), constraintQueue); + } } } } @@ -848,6 +859,7 @@ namespace MiniZinc { std::vector& deletedVarDecls, std::vector& constraintQueue, std::vector& vardeclQueue) { + std::cerr << "simplify1 " << *ii; Expression* con_e; bool is_true; bool is_false; @@ -1214,6 +1226,7 @@ namespace MiniZinc { remove = false; return; } + std::cerr << "simplify " << *ii; bool isTrue = vd->ti()->domain()==constants().lit_true; Expression* e = NULL; ConstraintI* ci = ii->dyn_cast(); From 1ad8f8ed0752cbb770b1a4ba7544cdc4cb642810 Mon Sep 17 00:00:00 2001 From: Guido Tack Date: Tue, 19 Sep 2017 12:16:49 +1000 Subject: [PATCH 6/8] Remove debug output --- lib/optimize.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/optimize.cpp b/lib/optimize.cpp index e27926787..2543ed4f8 100644 --- a/lib/optimize.cpp +++ b/lib/optimize.cpp @@ -859,7 +859,6 @@ namespace MiniZinc { std::vector& deletedVarDecls, std::vector& constraintQueue, std::vector& vardeclQueue) { - std::cerr << "simplify1 " << *ii; Expression* con_e; bool is_true; bool is_false; @@ -1226,7 +1225,6 @@ namespace MiniZinc { remove = false; return; } - std::cerr << "simplify " << *ii; bool isTrue = vd->ti()->domain()==constants().lit_true; Expression* e = NULL; ConstraintI* ci = ii->dyn_cast(); From f1ab37759d7e0e01a37e87702e7d8cbed54e5401 Mon Sep 17 00:00:00 2001 From: Guido Tack Date: Wed, 20 Sep 2017 14:36:48 +1000 Subject: [PATCH 7/8] Fully evaluate parameters before binding formal arguments when evaluating call expressions. Fixes #177. --- lib/eval_par.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/eval_par.cpp b/lib/eval_par.cpp index 5a509ce0b..cc6e148ad 100644 --- a/lib/eval_par.cpp +++ b/lib/eval_par.cpp @@ -340,11 +340,15 @@ namespace MiniZinc { template typename Eval::Val eval_call(EnvI& env, Call* ce) { std::vector previousParameters(ce->decl()->params().size()); + std::vector params(ce->decl()->params().size()); + for (unsigned int i=0; idecl()->params().size(); i++) { + params[i] = eval_par(env, ce->args()[i]); + } for (unsigned int i=ce->decl()->params().size(); i--;) { VarDecl* vd = ce->decl()->params()[i]; previousParameters[i] = vd->e(); vd->flat(vd); - vd->e(eval_par(env, ce->args()[i])); + vd->e(params[i]); if (vd->e()->type().ispar()) { if (Expression* dom = vd->ti()->domain()) { if (!dom->isa()) { From df71540f88288eff27eed4fd3a693681e6cfcba5 Mon Sep 17 00:00:00 2001 From: Guido Tack Date: Sat, 9 Sep 2017 10:14:44 +1000 Subject: [PATCH 8/8] Change log and bump version number --- CHANGES.txt | 16 ++++++++++++++++ CMakeLists.txt | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CHANGES.txt b/CHANGES.txt index 8bfb09bcd..364cdadfb 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -5,6 +5,22 @@ All bug numbers refer to the issue tracker at https://github.com/MiniZinc/libminizinc/issues +Version 2.1.6 +============= + +Bug fixes: + + - Fully evaluate parameters before binding formal arguments when evaluating + call expressions. Fixes #177. + - Fix incorrect simplification of Boolean constraints assigned to variables + that are assigned to false + - Fix bug in flattening of linear equations that contain the same variable on + both sides + - Fix un-trailing for let expressions, which could sometimes cause incorrect + code to be emitted when lets are evaluated in nested loops. Fixes #166. + - Fix bug in JSON output of one-dimensional array literals + - Fix unification of enum type-inst variables + Version 2.1.5 ============= diff --git a/CMakeLists.txt b/CMakeLists.txt index 788f97660..304a07b4c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,7 +27,7 @@ endif() # The version number. set (libminizinc_VERSION_MAJOR 2) set (libminizinc_VERSION_MINOR 1) -set (libminizinc_VERSION_PATCH 5) +set (libminizinc_VERSION_PATCH 6) if (ADDITIONAL_DATE_STRING) set (libminizinc_VERSION_PATCH "${libminizinc_VERSION_PATCH}.${ADDITIONAL_DATE_STRING}")