diff --git a/mc_openapi/__init__.py b/mc_openapi/__init__.py index f0e5e1eae422c4c35f7eb3ab5b6317699a2878d1..574f4077e0a3a20831ad84ee5419f5868a4bb65c 100644 --- a/mc_openapi/__init__.py +++ b/mc_openapi/__init__.py @@ -1 +1 @@ -__version__ = '2.6.0' +__version__ = '2.6.1' diff --git a/mc_openapi/assets/templates/mc.html b/mc_openapi/assets/templates/mc.html index 195eb4b2d6be3e0eec3938144744a642dcf1a7f7..4c39aee609fe99f66c29627330dc183468c78b12 100644 --- a/mc_openapi/assets/templates/mc.html +++ b/mc_openapi/assets/templates/mc.html @@ -29,7 +29,7 @@ <li class="message is-danger"> <div class="message-header"> <p> - Unsatisfied + Unsatisfied ({{req.time}}s) </p> <p> <span class="tag is-family-monospace is-danger is-light"> @@ -49,7 +49,7 @@ <li class="message is-success sat-req is-hidden"> <div class="message-header"> <p> - Satisfied + Satisfied ({{req.time}}s) </p> <p> <span class="tag is-family-monospace is-success is-light"> diff --git a/mc_openapi/doml_mc/imc.py b/mc_openapi/doml_mc/imc.py index b5ee40745f7f5485616d8fc22a168943905ebdfb..f663d9084f9b867767d7d1d4cb7d46caa223cd39 100644 --- a/mc_openapi/doml_mc/imc.py +++ b/mc_openapi/doml_mc/imc.py @@ -3,7 +3,7 @@ from dataclasses import dataclass from typing import Literal from z3 import (Context, DatatypeSortRef, ExprRef, FuncDeclRef, Solver, - SortRef, sat) + SortRef, Z3Exception) from .intermediate_model.doml_element import IntermediateModel from .mc_result import MCResult, MCResults @@ -166,14 +166,18 @@ class IntermediateModelChecker: req_type, req_err_desc_fn = req.error_description req_is_sat = MCResult.from_z3result(res, flipped=req.flipped) req_id = req.assert_name + try: + req_time = self.solver.statistics().get_key_value("time") + except Z3Exception: + req_time = "???" + results.append(( req_is_sat, req_type, req_err_desc_fn(self.solver, self.smt_sorts, self.intermediate_model) if req_is_sat else "", req_id, - req.description - # if res == sat else "" # not needed since we're try/catching model() errors - # in each requirement now + req.description, + req_time )) self.solver.pop() diff --git a/mc_openapi/doml_mc/main.py b/mc_openapi/doml_mc/main.py index c4befd1988e35951ce627ba41631a7b084b70d24..555cf4304eb2b9b14aa527d236ad29a5773dbe63 100644 --- a/mc_openapi/doml_mc/main.py +++ b/mc_openapi/doml_mc/main.py @@ -83,7 +83,7 @@ def verify_model( req_store, threads=threads, user_str_values=user_req_str_consts, - disable_multithreading=True #(threads == 1) + disable_multithreading=(threads == 1) ) res = results.summarize() diff --git a/mc_openapi/doml_mc/mc_result.py b/mc_openapi/doml_mc/mc_result.py index 253f044b8fa746699f4f1967ef14b22b86859bbf..fba8aaa505b8ece2fb0ce3b1bfa2e2feae310282 100644 --- a/mc_openapi/doml_mc/mc_result.py +++ b/mc_openapi/doml_mc/mc_result.py @@ -35,22 +35,22 @@ class MCResults: SATISFIED_MSG = "All requirements are satisfied." def __init__(self, results: list[tuple[MCResult, Literal["BUILTIN", "USER"], str, str, str]]): - """It receives a list of tuples (result, type, error message, id)""" + """It receives a list of tuples (result, type, error message, id, desc, time)""" self.results = results def summarize(self) -> dict[str, any]: - some_unsat = any(res == MCResult.unsat for res, _, _, _, _ in self.results) - some_dontknow = any(res == MCResult.dontknow for res, _, _, _, _ in self.results) + some_unsat = any(res == MCResult.unsat for res, _, _, _, _, _ in self.results) + some_dontknow = any(res == MCResult.dontknow for res, _, _, _, _, _ in self.results) if some_unsat: builtin_err_msgs = [ - (id, msg) for res, type, msg, id, _ in self.results if res == MCResult.unsat and type == "BUILTIN"] + (id, msg, time) for res, type, msg, id, _, time in self.results if res == MCResult.unsat and type == "BUILTIN"] user_err_msgs = [ - (id, msg) for res, type, msg, id, _ in self.results if res == MCResult.unsat and type == "USER"] + (id, msg, time) for res, type, msg, id, _, time in self.results if res == MCResult.unsat and type == "USER"] # Print to text (instead of HTML) - builtin_err_msg = "\n".join([f"[{id}] {msg}" for id, msg in builtin_err_msgs]) - user_err_msg = "\n".join([f"[{id}] {msg}" for id, msg in user_err_msgs]) + builtin_err_msg = "\n".join([f"[{id}][{time}s] {msg}" for id, msg, time in builtin_err_msgs]) + user_err_msg = "\n".join([f"[{id}][{time}s] {msg}" for id, msg, time in user_err_msgs]) err_msg = "" if builtin_err_msgs: @@ -66,9 +66,10 @@ class MCResults: "type": type, "message": msg, "result": res.name, - "description": desc + "description": desc, + "time": time } - for res, type, msg, id, desc in self.results + for res, type, msg, id, desc, time in self.results ] return {