diff --git a/0001-Disambiguate-UNKNOWN-EXCEPTION.patch b/0001-Disambiguate-UNKNOWN-EXCEPTION.patch new file mode 100644 index 0000000..22d6ccd --- /dev/null +++ b/0001-Disambiguate-UNKNOWN-EXCEPTION.patch @@ -0,0 +1,41 @@ +From 9fce2c1f83b89ce8cbef585ccfc3c19c55cc16f6 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20Br=C3=BCns?= +Date: Tue, 19 Jul 2022 03:30:09 +0200 +Subject: [PATCH 1/3] Disambiguate UNKNOWN EXCEPTION + +minizinc.cpp and solns2out.cpp have the exact same error message in case of +an unhandled/unknown exception, add a suffix to notify where it is catched. +--- + lib/solns2out.cpp | 2 +- + minizinc.cpp | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/lib/solns2out.cpp b/lib/solns2out.cpp +index 1e0ec4c6..6f9fdfe5 100644 +--- a/lib/solns2out.cpp ++++ b/lib/solns2out.cpp +@@ -403,7 +403,7 @@ void Solns2Out::checkSolution(std::ostream& oss) { + } catch (const exception& e) { + oss << e.what() << std::endl; + } catch (...) { +- oss << " UNKNOWN EXCEPTION." << std::endl; ++ oss << " UNKNOWN EXCEPTION in checker." << std::endl; + } + + #else +diff --git a/minizinc.cpp b/minizinc.cpp +index 0cb11667..a62478e9 100644 +--- a/minizinc.cpp ++++ b/minizinc.cpp +@@ -72,7 +72,7 @@ int run(const std::string& exe, const std::vector& args, bool jsonS + if (slv.getFlagVerbose()) { + std::cerr << std::endl; + } +- std::cerr << " UNKNOWN EXCEPTION." << std::endl; ++ std::cerr << " UNKNOWN EXCEPTION in solver." << std::endl; + } + + if (slv.getFlagVerbose()) { +-- +2.37.0 + diff --git a/0002-Catch-std-exception-by-const-reference.patch b/0002-Catch-std-exception-by-const-reference.patch new file mode 100644 index 0000000..2870c12 --- /dev/null +++ b/0002-Catch-std-exception-by-const-reference.patch @@ -0,0 +1,33 @@ +From c1e1cc1f76cac901752a870ac44a2ebc45729d96 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20Br=C3=BCns?= +Date: Tue, 19 Jul 2022 19:31:23 +0200 +Subject: [PATCH 2/3] Catch std::exception by const-reference + +Although the details are ignored and do not matter, catching +std::exception by value is in general bad due to potential slicing, +and the potentially required copy. +--- + include/minizinc/flatten.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/include/minizinc/flatten.hh b/include/minizinc/flatten.hh +index 2b631e82..b51c9625 100644 +--- a/include/minizinc/flatten.hh ++++ b/include/minizinc/flatten.hh +@@ -87,11 +87,11 @@ struct FlatteningOptions { + try { + std::random_device rdev("/dev/urandom"); + seeds.push_back(rdev()); +- } catch (std::exception) { ++ } catch (const std::exception&) { + try { + std::random_device rdev; + seeds.push_back(rdev()); +- } catch (std::exception) { /* NOLINT(bugprone-empty-catch) */ ++ } catch (const std::exception&) { /* NOLINT(bugprone-empty-catch) */ + } + } + auto highrestime = static_cast( +-- +2.37.0 + diff --git a/0003-Try-to-get-some-more-information-when-catching.patch b/0003-Try-to-get-some-more-information-when-catching.patch new file mode 100644 index 0000000..415d240 --- /dev/null +++ b/0003-Try-to-get-some-more-information-when-catching.patch @@ -0,0 +1,126 @@ +From e0a77580c7f4a9ffcbd03cfd11b9bfa3628c9fee Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20Br=C3=BCns?= +Date: Tue, 19 Jul 2022 19:35:10 +0200 +Subject: [PATCH 3/3] Try to get some more information when catching + +get_file_contents may throw int error codes, notably when inflating, +provide the filename. + +Also show the error code/value for int type exceptions elsewhere. +--- + lib/flattener.cpp | 9 +++++++-- + lib/parser.cpp | 16 ++++++++++++++-- + lib/solns2out.cpp | 24 ++++++++++++++++-------- + minizinc.cpp | 5 +++++ + 4 files changed, 42 insertions(+), 12 deletions(-) + +diff --git a/lib/flattener.cpp b/lib/flattener.cpp +index 5bb1d69b..0fe64df2 100644 +--- a/lib/flattener.cpp ++++ b/lib/flattener.cpp +@@ -624,8 +624,13 @@ void Flattener::flatten(const std::string& modelString, const std::string& model + } + } + smm->compact(); +- std::string smm_compressed = +- FileUtils::encode_base64(FileUtils::deflate_string(smm_oss.str())); ++ std::string smm_compressed; ++ try { ++ smm_compressed = ++ FileUtils::encode_base64(FileUtils::deflate_string(smm_oss.str())); ++ } catch (int i) { ++ throw Error("Failed to compress, error code: " + std::to_string(i)); ++ } + auto* ti = new TypeInst(Location().introduce(), Type::parstring(), nullptr); + auto* sl = new StringLit(Location().introduce(), smm_compressed); + auto* checkString = +diff --git a/lib/parser.cpp b/lib/parser.cpp +index ef4db443..aad276e1 100644 +--- a/lib/parser.cpp ++++ b/lib/parser.cpp +@@ -261,7 +261,13 @@ void parse(Env& env, Model*& model, const vector& filenames, + if (verbose) { + std::cerr << "processing file '" << fullname << "'" << endl; + } +- s = get_file_contents(file); ++ try { ++ s = get_file_contents(file); ++ } catch (int i) { ++ throw Error("Cannot read file '" + f + "', error: " + std::to_string(i)); ++ } catch (...) { ++ throw Error("Cannot read file '" + f + "'"); ++ } + + if (m->filepath().empty()) { + m->setFilepath(fullname); +@@ -305,7 +311,13 @@ void parse(Env& env, Model*& model, const vector& filenames, + if (verbose) { + std::cerr << "processing data file '" << f << "'" << endl; + } +- s = get_file_contents(file); ++ try { ++ s = get_file_contents(file); ++ } catch (int i) { ++ throw Error("Cannot read data file '" + f + "', error: " + std::to_string(i)); ++ } catch (...) { ++ throw Error("Cannot read data file '" + f + "'"); ++ } + } + + ParserState pp(f, s, err, includePaths, files, seenModels, model, true, false, false, +diff --git a/lib/solns2out.cpp b/lib/solns2out.cpp +index 6f9fdfe5..b1807ff8 100644 +--- a/lib/solns2out.cpp ++++ b/lib/solns2out.cpp +@@ -551,16 +551,24 @@ void Solns2Out::init() { + _outputExpr = oi->e(); + } else if (auto* vdi = i->dynamicCast()) { + if (vdi->e()->id()->idn() == -1 && vdi->e()->id()->v() == "_mzn_solution_checker") { +- _checkerModel = eval_string(getEnv()->envi(), vdi->e()->e()); +- if (!_checkerModel.empty() && _checkerModel[0] == '@') { +- _checkerModel = FileUtils::decode_base64(_checkerModel); +- FileUtils::inflate_string(_checkerModel); ++ try { ++ _checkerModel = eval_string(getEnv()->envi(), vdi->e()->e()); ++ if (!_checkerModel.empty() && _checkerModel[0] == '@') { ++ _checkerModel = FileUtils::decode_base64(_checkerModel); ++ FileUtils::inflate_string(_checkerModel); ++ } ++ } catch (int ei) { ++ throw Error("Failed to inflate solution checker, error: " + std::to_string(ei)); + } + } else if (vdi->e()->id()->idn() == -1 && vdi->e()->id()->v() == "_mzn_stats_checker") { +- _statisticsCheckerModel = eval_string(getEnv()->envi(), vdi->e()->e()); +- if (!_statisticsCheckerModel.empty() && _statisticsCheckerModel[0] == '@') { +- _statisticsCheckerModel = FileUtils::decode_base64(_statisticsCheckerModel); +- FileUtils::inflate_string(_statisticsCheckerModel); ++ try { ++ _statisticsCheckerModel = eval_string(getEnv()->envi(), vdi->e()->e()); ++ if (!_statisticsCheckerModel.empty() && _statisticsCheckerModel[0] == '@') { ++ _statisticsCheckerModel = FileUtils::decode_base64(_statisticsCheckerModel); ++ FileUtils::inflate_string(_statisticsCheckerModel); ++ } ++ } catch (int ei) { ++ throw Error("Failed to inflate stats checker, error: " + std::to_string(ei)); + } + } else { + _declmap.insert(make_pair(vdi->e()->id()->str(), DE(vdi->e(), vdi->e()->e()))); +diff --git a/minizinc.cpp b/minizinc.cpp +index a62478e9..93f83b3d 100644 +--- a/minizinc.cpp ++++ b/minizinc.cpp +@@ -68,6 +68,11 @@ int run(const std::string& exe, const std::vector& args, bool jsonS + std::cerr << std::endl; + } + std::cerr << e.what() << std::endl; ++ } catch (int i) { ++ if (slv.getFlagVerbose()) { ++ std::cerr << std::endl; ++ } ++ std::cerr << " UNKNOWN EXCEPTION in solver, errorcode: " << i << std::endl; + } catch (...) { + if (slv.getFlagVerbose()) { + std::cerr << std::endl; +-- +2.37.0 + diff --git a/libminizinc-2.7.6.tar.gz b/libminizinc-2.7.6.tar.gz deleted file mode 100644 index 5698b32..0000000 --- a/libminizinc-2.7.6.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99de3a1051bd4b3ed2d436f62d965fce067286d954b5693d74a5f7c75877ddfb -size 13053472 diff --git a/libminizinc-2.8.2.tar.gz b/libminizinc-2.8.2.tar.gz new file mode 100644 index 0000000..273cb79 --- /dev/null +++ b/libminizinc-2.8.2.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e8b5c037e1d9711803e05ef6eaf416d5ed080f57cc0867d3c6ec3b1304bfd375 +size 8026563 diff --git a/libminizinc.changes b/libminizinc.changes index dfb516e..cd73345 100644 --- a/libminizinc.changes +++ b/libminizinc.changes @@ -1,3 +1,197 @@ +------------------------------------------------------------------- +Sat Dec 30 05:08:48 UTC 2023 - Stefan Brüns + +- update to 2.8.2: + * Bug fixes: + + Fix incorrect FlatZinc definition in the gecode_presolver + solver library. + + Fix type specialisation for function with an polymorphic + array argument and a non-array return type with the same + type-inst identifier. + + Fix crash during typechecking of overloaded functions + differing only by inst returning structured types. + + Fix incorrect type checking of polymorphic functions with + type-inst IDs inside structured types. + + Fix evaluation error when boolean variables are fixed during + flattening. + + Fix incorrect call names output when generating .ozn files. + + Fix incorrect output of record access as tuple access in + .ozn files. + + Fix definition of array_intersect so that it can be used in + non-positive contexts. + + Fix standards definitions of increasing variants to correct + be ignored when the argument array is empty. + + Fix a problem where exceptions thrown for undefined + expressions were not caught during the aggregation of linear + expressions, breaking relational semantics. + + Fix crash when calculating computed domain of a declaration. + + Fix x-y line/scatter visualisations. + * Changes: + + Support var set``s of enums for ``array_union and + array_intersect. + + Support var enums for the .. range operator. + + Always perform substitution of fixed values before outputting + FlatZinc for consistency. + * Changes in the IDE: + + Make process handling more robust to failures. +- update to 2.8.1: + * Bug fixes: + + Fix incorrect message for par array out of bounds indicating + that array is empty + + Fix incorrect propagation of Boolean variables potentially + causing output not accepted by Gecode and Chuffed. + + Fix a problem where the usage of lb on a Boolean expression + would return -infinity.. + + Fix omission of error location when there is no stack trace + available. + + Fix type specialisation to always make par versions of + functions available for output. + + Fix internal error when checking return value of functions + involving arrays of optional values. + + Fix incorrect false values for has_output_item when running + with --model-interface-only + + Fix translation of search annotations with multi-dimensional + arrays as arguments. + + Fix bug in output generation for some visualisation functions. + + Fix problem where tuple or record assignments would sometimes + trigger segmentation faults. + + Fix context when binding the result of flattening a + concatenation operation, resolving a possible segmentation + fault. + + Fix incorrect possible evaluation error for in operator + involving an array RHS. + * Changes: + + Add --solution-checker option to allow specifying the + solution checker (allowing use from a parameter configuration + .mpc file). + + Produce tighter bounds in compute_mod_bounds for the + mod operator. + * Changes in the IDE: + + Fix command used to run findMUS and Globalizer. + + Add ability to set the ports used for the visualisation + server. + + Add option for printing the visualisation server URL for + debugging purposes. + + Add more information to subprocess error messages. +- update to 2.8.0: + * Changes in interfaces to solvers: + + OR-Tools is now bundled with the MiniZinc IDE on all + platforms. + + HiGHS is now loaded as a dynamic plugin instead of statically + linked, and now supports outputting intermediate solutions + for optimisation problems. + + Add support for producing a JSON-based version of FlatZinc as + the output format of the MiniZinc compiler. + + Replace supportsMzn, supportsFzn and supportsNL solver + configuration flags with new option inputType. The old flags + are still supported for backwards compatibility. + + Add experimental support for restart based meta-search + specification for the Gecode and Chuffed solvers, as first + explored in Solver-Independent Large Neighbourhood Search and + A Modern Architecture for Constraint Modelling Languages. + + Automatically detect current versions of CPLEX. + * Changes in the MiniZinc Library: + + Add cumulatives scheduling global constraint. + + Add the opt variants of the global_cardinality functions, and + add enumerated type typesafety between the values of the + decision variables and the cover parameters. + + Add optional versions of count_* global constraints. + + (strictly_)decreasing will now always be rewritten into + (strictly_)increasing and has support for option types. + + Allow libraries to define how to iterate over var set of int + using the function set2iter, useful for different set + representations. + + Stabilise the IDE visualisation library, allowing all + visualisation functions to be used from output statements, + and removing the need for manual calls to showJSON in custom + visualisations. This is a breaking change for users of the + previous experimental API. + + Add mzn_half_reify_clause compiler option to allow solvers to + disable the half reification of bool_clause constraints. + + Update the reflection functions ub, lb, and dom to return + enum values. + + Use tuples to implement the decomposition of optional + variables, avoiding possible CSE aliasing problems. + * Changes in the compiler: + + CSE has been adjusted to handle commutative functions when + annotated using the promise_commutative annotation. + + mzn_reverse_map_var is now only called on output variables + that do not yet have reverse mappers after initial + flattening, but are required by the output model. + + Improve error messaging for invalid parameter configuration + (.mpc) files. + + Add a list of messages generated by solution checkers to the + checker message when using --json-stream. + + Support output of command line argument parsing errors in + --json-stream mode. + * Bug fixes: + + Fix restoration of tuple/record domains when flattening let + expressions. + + Fix type checking error due to creation of incorrect par + versions of functions involving tuples/records. + + Ensure that when --solver is used, the given solver + configuration file is always selected even when it collides + with a solver in the search paths. + + Fix error when running satisfaction problems using the Gecode + presolver where an output variable is also an + introduced variable. + + Resolve a problem where unification in the optimization phase + might remove variables part of the output. + + Fix possible crash when printing the final solution using the + built-in Chuffed interface. + + Don’t print the final status line from solution checkers. + + Fix typechecking of par type-inst identifiers when + instantiated using structured types involving var types. + + Implement fix and is_fixed for strucutred types. + + Ensure reverse mappers are created when flattening + tuple/record literals. This resolves certain errors during + output processing in models using these types. + + Fix problem where certain strings in exceptions might be + garbage collected before they are output. + + Fix problem where argument names of generated functions could + conflict with model declared names. + + Fix problem where the common type of complex records or + tuples was not correctly determined in the array literals. + + Fix a problem in the parser where a nullptr would be used + before a syntax error was thrown. + + Fix error management when reading preference files. + + Fix segmentation fault caused by the creation of invalid + domain constraints generated for functions with arrays of + tuples or records parameters. + + Fix crash when instantiating a type-inst identifier using + only <>. + + Fix evaluation of comprehensions containing opt string. + + Fix crash when instantiating polymorphic functions using + tuples/records with many var or opt fields. + + Do not generate default DZN output when there are only + sectioned output items present. + + Fix the edge indexing of the edges for the final node in the + neural_net global constraint. + + Add better error messaging when an index set mismatch is + encountered in the standard library. + + Fix evaluation error when indexing into an array using <>. + + Fix incorrect unsatisfiability when equating optional + variables with non-intersecting domains. + + Fix array access using optional indices for multidimensional + arrays. + + Fix output of zero length arrays of optional variables. + + Fix output processing performance degradation when printing + arrays in DZN output mode. + + Fix card function on set of floats and bools. + + Make set literals containing strings or annotations a + type error. + * Changes in the IDE: + + Fix unreadable cheat sheet font colour in dark mode. + + Add option to output objective value and enable by default. + + Show manually input parameters in output window. + + Fix missing checker messages. + + Fix incorrect OpenSSL version in Linux packages. +- Add minimal checks +- Add patches: + * 0001-Disambiguate-UNKNOWN-EXCEPTION.patch + * 0002-Catch-std-exception-by-const-reference.patch + * 0003-Try-to-get-some-more-information-when-catching.patch + ------------------------------------------------------------------- Thu Nov 9 09:14:34 UTC 2023 - Dirk Müller diff --git a/libminizinc.spec b/libminizinc.spec index b1a9d68..ee1b767 100644 --- a/libminizinc.spec +++ b/libminizinc.spec @@ -17,16 +17,21 @@ Name: libminizinc -Version: 2.7.6 +Version: 2.8.2 Release: 0 Summary: A high-level constraint modelling language Group: Productivity/Scientific/Math License: MPL-2.0 URL: https://www.minizinc.org/ Source: https://github.com/MiniZinc/libminizinc/archive/refs/tags/%{version}.tar.gz#/%{name}-%{version}.tar.gz +# PATCH-FEATURE-OPENSUSE - Be more verbose on thrown exceptions +Patch0: 0001-Disambiguate-UNKNOWN-EXCEPTION.patch +Patch1: 0002-Catch-std-exception-by-const-reference.patch +Patch2: 0003-Try-to-get-some-more-information-when-catching.patch BuildRequires: cmake >= 3.4.0 BuildRequires: gcc-c++ BuildRequires: gecode-devel +BuildRequires: gecode-minizinc BuildRequires: pkgconfig(mpfr) %description @@ -61,6 +66,21 @@ MiniZinc is a free and open-source constraint modeling language. %install %cmake_install +%check +cat > t.mzn < t1.mzc.mzn < t2.mzc.mzn <