From 9a89243ab9b902fad77bfb046a104e90a97e886e Mon Sep 17 00:00:00 2001 From: Dmitry Messerman Date: Fri, 3 Apr 2026 19:47:07 +0300 Subject: [PATCH 01/21] Quickstart initial commit --- quickstart/constraint_dora.json | 12 +++ quickstart/constraint_dora_dataset.py | 85 +++++++++++++++++++ ...ora_poly_optimization_results_expected.txt | 3 + quickstart/quickstart.sh | 30 +++++++ 4 files changed, 130 insertions(+) create mode 100644 quickstart/constraint_dora.json create mode 100755 quickstart/constraint_dora_dataset.py create mode 100644 quickstart/constraint_dora_poly_optimization_results_expected.txt create mode 100755 quickstart/quickstart.sh diff --git a/quickstart/constraint_dora.json b/quickstart/constraint_dora.json new file mode 100644 index 00000000..3b6f1472 --- /dev/null +++ b/quickstart/constraint_dora.json @@ -0,0 +1,12 @@ +{ + "version": "1.2", + "variables": [ + {"label":"X1", "interface":"knob", "type":"real", "range":[-1.5,2.5], "rad-abs": 0.0}, + {"label":"X2", "interface":"knob", "type":"real", "range":[-1.5,2.0], "rad-abs": 0.0}, + {"label":"Y1", "interface":"output", "type":"real"} + ], + "alpha": "X1*X1+X2*X2<=1", + "objectives": { + "objective1": "-Y1" + } +} diff --git a/quickstart/constraint_dora_dataset.py b/quickstart/constraint_dora_dataset.py new file mode 100755 index 00000000..7248036f --- /dev/null +++ b/quickstart/constraint_dora_dataset.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python3.11 +""" +Constrained Optimization Example using SMLP +Classic Lagrange Multiplier Problem (appears in many optimization textbooks) + +Problem: + Minimize: f(x1, x2) = (x1 - 2)^2 + (x2 - 1)^2 + Subject to: x1^2 + x2^2 - 1 <= 0 (inside unit circle) + + Geometrically: Find the point on the unit circle closest to (2, 1) + +Analytical Solution (using Lagrange multipliers): + Setting ∇f = λ∇g where g(x1,x2) = x1² + x2² - 1: + - 2(x1-2) = 2λx1 → x1 = 2/(1+λ) + - 2(x2-1) = 2λx2 → x2 = 1/(1+λ) + - Substituting into constraint: 5 = (1+λ)² + - Solving: λ = √5 - 1 + +Expected Result: + Optimal point: x1 = 2/√5 ≈ 0.894427, x2 = 1/√5 ≈ 0.447214 + Minimum value: f = (√5 - 1)² ≈ 1.527864 + +Reference: Wolfram Alpha +https://www.wolframalpha.com/input?i=Minimize%3A+f%28x1%2C+x2%29+%3D+%28x1+-+2%29%5E2+%2B+%28x2+-+1%29%5E2+subject+to+x1%5E2+%2B+x2%5E2+-+1+%3C%3D+0 +""" + +from sys import argv +from numpy import linspace, meshgrid, cos, sin, pi, sqrt, inf +from pandas import read_csv, concat +from gzip import open as gzopen +from matplotlib import pyplot as plt + +def main(): +# Initial guess + rng = range(0, 1000) + x1_start, x1_stop = (-1.5, 2.5) + x2_start, x2_stop = (-1.5, 2.0) + x1 = linspace(x1_start, x1_stop, rng.stop) + x2 = linspace(x2_start, x2_stop, rng.stop) + X1, X2 = meshgrid(x1, x2) + Z = (X1 - 2)**2 + (X2 - 1)**2 + with gzopen('Constraint_dora.csv.gz',"wt") as ds: + ds.write("X1,X2,Y1\n") + [[ds.write(f"{X1[i][j]},{X2[i][j]},{Z[i][j]}\n") for j in rng] for i in rng] + + # Visualization + fig, ax = plt.subplots(figsize=(10, 8)) + + # Plot contours of objective function + contours = ax.contour(X1, X2, Z, levels=20, cmap='viridis', alpha=0.6) + ax.clabel(contours, inline=True, fontsize=8) + +# Plot constraint boundary (unit circle) + theta = linspace(0, 2*pi, 100) + circle_x = cos(theta) + circle_y = sin(theta) + ax.plot(circle_x, circle_y, 'r-', linewidth=2, label='Constraint boundary') + ax.fill(circle_x, circle_y, alpha=0.1, color='red', label='Feasible region') + + # Plot unconstrained optimum + ax.plot(2, 1, 'bs', markersize=12, label='Unconstrained optimum (2, 1)') + + ax.set_xlabel('x1', fontsize=12) + ax.set_ylabel('x2', fontsize=12) + ax.set_title('Constrained Optimization: Minimize f(x1,x2) subject to x1² + x2² ≤ 1', + fontsize=14) + # Plot constrained optimum + ax.plot(2/sqrt(5), 1/sqrt(5), 'go', markersize=12, label=f'Constrained optimum ({2/sqrt(5):.3f}, {1/sqrt(5):.3f})') + ax.legend(loc='upper right') + ax.grid(True, alpha=0.3) + ax.axis('equal') + ax.set_ylim(-1.5, 2.0) + + plt.tight_layout() + timeout = inf + if len(argv) > 2: + if '-timeout' == argv[1]: + timeout = int(argv[2]) + if not inf == timeout: + timer = fig.canvas.new_timer(interval=timeout*1000, callbacks=[(plt.close, [], {})]) + timer.start() + plt.show() + +if __name__ == "__main__": + main() diff --git a/quickstart/constraint_dora_poly_optimization_results_expected.txt b/quickstart/constraint_dora_poly_optimization_results_expected.txt new file mode 100644 index 00000000..17dc3ca3 --- /dev/null +++ b/quickstart/constraint_dora_poly_optimization_results_expected.txt @@ -0,0 +1,3 @@ +X1 = 0.89453125 +X2 = 0.4470043182373047 +Y1 = 1.5278653812779421 diff --git a/quickstart/quickstart.sh b/quickstart/quickstart.sh new file mode 100755 index 00000000..05377e4e --- /dev/null +++ b/quickstart/quickstart.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +script_path="$(dirname "$(realpath "$0")")" +name=Constraint_dora +log=${name}.log +dataset=${name}.csv.gz +if [[ $# -gt 0 ]]; then + if [[ "-clean" == "$1" ]]; then + rm -f $dataset 2>/dev/null + rm -f ${name}* *.log 2>/dev/null + exit 0 + fi +fi +name_lc="$(echo "$name" | tr '[:upper:]' '[:lower:]')" +"${script_path}/${name_lc}_dataset.py" -timeout 5 +results=${name}_poly_optimization_results.txt +rm -f "$results" 2>/dev/null +smlp_args=( + -data ${name}.csv.gz # input CSV dataset + -spec ${name_lc}.json # JSON spec file + -pref ${name} # output file prefix + -mode optimize # operation mode + -model poly_sklearn # model type + -epsilon 0.0000005 # convergence threshold +) + +smlp "${smlp_args[@]}" >"$log" 2>&1 +for var in X1 X2 Y1; do + echo "$var = $(jq ".${var}.value_in_config" ${name}_${name}_optimization_results.json)" 2>&1 | tee -a "$results" +done +diff "$results" ${name_lc}_poly_optimization_results_expected.txt From cc9f076f32e699e519abb87621516461388bcdba Mon Sep 17 00:00:00 2001 From: Dmitry Messerman Date: Fri, 3 Apr 2026 19:58:29 +0300 Subject: [PATCH 02/21] Adding image for README.md --- README.md | 8 ++++++++ misc/minimal_distance.png | Bin 0 -> 93129 bytes 2 files changed, 8 insertions(+) create mode 100644 misc/minimal_distance.png diff --git a/README.md b/README.md index 43e7646b..9fa8316a 100644 --- a/README.md +++ b/README.md @@ -221,6 +221,14 @@ tests/install/test_container_install mdmitry1/python311-dev Installation instructions for Ubuntu-22.04 can be followed using `homebrew` in place of `apt` +
+ Quickstart +

+Minimal Distance Problem +

+ +
+ ## [Tutorial](https://github.com/SMLP-Systems/smlp/tree/master/tutorial) - Black-box optimization Eggholder Function diff --git a/misc/minimal_distance.png b/misc/minimal_distance.png new file mode 100644 index 0000000000000000000000000000000000000000..68be010f18a23c9722e642a58148e26c21a545f8 GIT binary patch literal 93129 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

}xIcRh!En|0@eQKQF4;KUFR3|X;sAApR{Sr)b` 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 F{{nP=dp7_8 literal 0 HcmV?d00001 From ce84cf9c47815260be44d3f8c95c7ba0d88d353f Mon Sep 17 00:00:00 2001 From: Dmitry Messerman Date: Fri, 3 Apr 2026 21:15:13 +0300 Subject: [PATCH 03/21] 1. Added quickstart to the README.md 2. Enabled quickstart script to run from any directory --- README.md | 26 ++++++++++++++++++++------ quickstart/quickstart.sh | 6 +++--- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 9fa8316a..0aa2734e 100644 --- a/README.md +++ b/README.md @@ -221,12 +221,26 @@ tests/install/test_container_install mdmitry1/python311-dev Installation instructions for Ubuntu-22.04 can be followed using `homebrew` in place of `apt` -

- Quickstart -

-Minimal Distance Problem -

- +## Quickstart + +### Problem: find minimal distance between point (2,1) and unit circle
+ +

+Minimal Distance Problem

+ + Analytical solution for this problem:
+ ` +f(x*) = 6 - 2√5 ≈ 1.527864`, where `x* = (2/√5,1/√5) ≈ (0.894427, 0.447214)` +

+ Solution: see `bash` script [quickstart.sh](https://raw.githubusercontent.com/SMLP-Systems/smlp/smlp_quickstart/quickstart/quickstart.sh)

+ The script has 3 steps
+ - Step 1: Create input dataset and visualize the problem
+ - Step 2: Run SMLP
+ SMLP creates polynomial model and finds approximate solution
+ - Step 3: Comparison to expected SMLP results
+ SMLP results + `f(x*) = 1.527865, x* = (2/√5,1/√5) ≈ (0.894531, 0.447004)`
+ are pretty close to analytical solution
## [Tutorial](https://github.com/SMLP-Systems/smlp/tree/master/tutorial) diff --git a/quickstart/quickstart.sh b/quickstart/quickstart.sh index 05377e4e..f5635159 100755 --- a/quickstart/quickstart.sh +++ b/quickstart/quickstart.sh @@ -11,12 +11,12 @@ if [[ $# -gt 0 ]]; then fi fi name_lc="$(echo "$name" | tr '[:upper:]' '[:lower:]')" -"${script_path}/${name_lc}_dataset.py" -timeout 5 +"${script_path}/${name_lc}_dataset.py" -timeout 5 #Create dataset and visualize the problem results=${name}_poly_optimization_results.txt rm -f "$results" 2>/dev/null smlp_args=( -data ${name}.csv.gz # input CSV dataset - -spec ${name_lc}.json # JSON spec file + -spec ${script_path}/${name_lc}.json # JSON spec file -pref ${name} # output file prefix -mode optimize # operation mode -model poly_sklearn # model type @@ -27,4 +27,4 @@ smlp "${smlp_args[@]}" >"$log" 2>&1 for var in X1 X2 Y1; do echo "$var = $(jq ".${var}.value_in_config" ${name}_${name}_optimization_results.json)" 2>&1 | tee -a "$results" done -diff "$results" ${name_lc}_poly_optimization_results_expected.txt +diff "$results" ${script_path}/${name_lc}_poly_optimization_results_expected.txt From a779f794040ad9653cf605970722fa98610edaba Mon Sep 17 00:00:00 2001 From: Dmitry Messerman Date: Fri, 3 Apr 2026 21:19:29 +0300 Subject: [PATCH 04/21] Fixed typo --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 0aa2734e..12ca1d58 100644 --- a/README.md +++ b/README.md @@ -241,7 +241,6 @@ f(x*) = 6 - 2√5 ≈ 1.527864`, where `x* = (2/√5,1/√5) ≈ (0.894427, 0.44 SMLP results `f(x*) = 1.527865, x* = (2/√5,1/√5) ≈ (0.894531, 0.447004)`
are pretty close to analytical solution - ## [Tutorial](https://github.com/SMLP-Systems/smlp/tree/master/tutorial) From 01397205aae29c3a30ed7cf652be5b9f44f19275 Mon Sep 17 00:00:00 2001 From: Dmitry Messerman Date: Sat, 4 Apr 2026 11:02:08 +0300 Subject: [PATCH 05/21] Added quickstart to the smlptech package --- README.md | 6 ++++++ quickstart/quickstart.sh | 14 +++++++++----- setup.py | 42 ++++++++++++++++++++++------------------ src/__init__.py | 2 ++ 4 files changed, 40 insertions(+), 24 deletions(-) create mode 100644 src/__init__.py diff --git a/README.md b/README.md index 12ca1d58..3b680fc6 100644 --- a/README.md +++ b/README.md @@ -242,6 +242,12 @@ f(x*) = 6 - 2√5 ≈ 1.527864`, where `x* = (2/√5,1/√5) ≈ (0.894427, 0.44 `f(x*) = 1.527865, x* = (2/√5,1/√5) ≈ (0.894531, 0.447004)`
are pretty close to analytical solution +Running the script: +```bash +smlp_package_path=$(python3.11 -c 'import smlp; from os.path import dirname; print(dirname(smlp.__file__))') +$smlp_package_path/quickstart/quickstart.sh +``` + ## [Tutorial](https://github.com/SMLP-Systems/smlp/tree/master/tutorial) - Black-box optimization Eggholder Function diff --git a/quickstart/quickstart.sh b/quickstart/quickstart.sh index f5635159..542cdef8 100755 --- a/quickstart/quickstart.sh +++ b/quickstart/quickstart.sh @@ -1,17 +1,21 @@ #!/usr/bin/env bash script_path="$(dirname "$(realpath "$0")")" name=Constraint_dora -log=${name}.log -dataset=${name}.csv.gz if [[ $# -gt 0 ]]; then if [[ "-clean" == "$1" ]]; then - rm -f $dataset 2>/dev/null - rm -f ${name}* *.log 2>/dev/null + rm -rf ${name}_results_* 2>/dev/null exit 0 fi fi +results_dir=${name}_results_$(date +%s) +rm -rf $results_dir 2>/dev/null +mkdir -p $results_dir +echo "Working directory: $(realpath $results_dir)" +cd $results_dir +log=${name}.log +dataset=${name}.csv.gz name_lc="$(echo "$name" | tr '[:upper:]' '[:lower:]')" -"${script_path}/${name_lc}_dataset.py" -timeout 5 #Create dataset and visualize the problem +"${script_path}/${name_lc}_dataset.py" #Create dataset and visualize the problem results=${name}_poly_optimization_results.txt rm -f "$results" 2>/dev/null smlp_args=( diff --git a/setup.py b/setup.py index 951c00d4..f377b94e 100644 --- a/setup.py +++ b/setup.py @@ -862,25 +862,29 @@ def run(self): shutil.copytree(str(installed_pkg), str(dest)) print(f"[smlp build] smlp extension copied to wheel at {dest}") - # 5. Copy Python source from src/smlp_py into smlp/smlp_py inside the wheel - smlp_py_src = REPO_ROOT / "src" / "smlp_py" - if smlp_py_src.is_dir(): - smlp_py_dest = dest / "smlp_py" # dest is already smlp/ - if smlp_py_dest.exists(): - shutil.rmtree(smlp_py_dest) - shutil.copytree(str(smlp_py_src), str(smlp_py_dest)) - print(f"[smlp build] smlp_py source copied to wheel at {smlp_py_dest}") - else: - print(f"[smlp build] WARNING: src/smlp_py not found at {smlp_py_src}, skipping.") - - # 6. Copy src/run_smlp.py into smlp/ inside the wheel - run_smlp_src = REPO_ROOT / "src" / "run_smlp.py" - if run_smlp_src.is_file(): - shutil.copy2(str(run_smlp_src), str(dest / "run_smlp.py")) - print(f"[smlp build] run_smlp.py copied to wheel at {dest / 'run_smlp.py'}") - else: - print(f"[smlp build] WARNING: src/run_smlp.py not found at {run_smlp_src}, skipping.") - +# 5. Copy Python sources from src/ into smlp/ inside the wheel + sources = [ + (REPO_ROOT / "src" / "smlp_py", dest / "smlp_py", "dir"), + (REPO_ROOT / "src" / "__init__.py", dest / "__init__.py", "file"), + (REPO_ROOT / "src" / "run_smlp.py", dest / "run_smlp.py", "file"), + (REPO_ROOT / "quickstart", dest / "quickstart", "dir"), + ] + for src, dst, kind in sources: + copy_success = False + if kind == "dir": + if src.is_dir(): + if dst.exists(): + shutil.rmtree(str(dst)) + shutil.copytree(str(src), str(dst)) + copy_success = True + else: + if src.is_file(): + shutil.copy2(str(src), str(dst)) + copy_success = True + if copy_success: + print(f"[smlp build] {src} copied to wheel at {dst}") + else: + print(f"[smlp build] WARNING: source is not found at {src}, skipping.") # --------------------------------------------------------------------------- # setup() diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 00000000..fe8594d4 --- /dev/null +++ b/src/__init__.py @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: Apache-2.0 +# This file is part of smlp. From 677dcc0d30d50727b8a30fd6606c896f5ab0b7da Mon Sep 17 00:00:00 2001 From: Dmitry Messerman Date: Sat, 4 Apr 2026 11:31:58 +0300 Subject: [PATCH 06/21] Fixed copy-paste error --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3b680fc6..d058a9d6 100644 --- a/README.md +++ b/README.md @@ -239,7 +239,7 @@ f(x*) = 6 - 2√5 ≈ 1.527864`, where `x* = (2/√5,1/√5) ≈ (0.894427, 0.44 SMLP creates polynomial model and finds approximate solution
- Step 3: Comparison to expected SMLP results
SMLP results - `f(x*) = 1.527865, x* = (2/√5,1/√5) ≈ (0.894531, 0.447004)`
+ `f(x*) = 1.527865, x* = (0.894531, 0.447004)`
are pretty close to analytical solution Running the script: From 2a47e450c24e6ebe5840e017726d8331780d1411 Mon Sep 17 00:00:00 2001 From: Dmitry Messerman Date: Tue, 7 Apr 2026 16:37:33 +0300 Subject: [PATCH 07/21] Changes after the review --- README.md | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/README.md b/README.md index d058a9d6..78cbf4fa 100644 --- a/README.md +++ b/README.md @@ -247,6 +247,66 @@ Running the script: smlp_package_path=$(python3.11 -c 'import smlp; from os.path import dirname; print(dirname(smlp.__file__))') $smlp_package_path/quickstart/quickstart.sh ``` +
+ Test case description + 1. constraint_dora.json - spec in json format

+{
+ "version": "1.2",
+ "variables": [ + {"label":"X1", "interface":"knob", "type":"real", "range":[-1.5,2.5], "rad-abs": 0.0},
+ {"label":"X2", "interface":"knob", "type":"real", "range":[-1.5,2.0], "rad-abs": 0.0},
+ {"label":"Y1", "interface":"output", "type":"real"} + ],
+ "alpha": "X1*X1+X2*X2<=1",
+ "objectives": {"objective1": "-Y1"}
+}
+
+ Legend:
+ X1 - first controllable variable
+ X2 - second controlllable variable
+ Y1 - output function
+ alpha - constraint depending on controllable variables
+ objective1 - optimization goal

+ 2.SMLP command line arguments

+ -data ${name}.csv.gz # input CSV dataset
+ -spec ${script_path}/${name_lc}.json # JSON spec file
+ -pref ${name} # output file prefix
+ -mode optimize # operation mode
+ -model poly_sklearn # model type
+ -epsilon 0.0000005 # convergence threshold
+
+ +### Problem modification in the user area + +- Step 1: Copy the problem to the current directory and enter problem work area
+```bash +smlp_package_path=$(python3.11 -c 'import smlp; from os.path import dirname; print(dirname(smlp.__file__))') +\cp -rp $smlp_package_path/quickstart . +cd quickstart +``` +- Step 2: As an example, change constraint in order to get solution in rational numbers
+ Let's change circle radius to 2/√5, so squared radius will be 4/5
+ In order to do this, edit `constraint_dora.json` file and change right side of the inequality to be 4/5:
+ `"alpha": "X1*X1+X2*X2<=4/5",` +- Step 3: Run the script from current directory +```bash +./quickstart.sh +``` +Expected result: +```bash +Working directory: /quickstart/Constraint_dora_results_ +X1 = 0.800048828125 +X2 = 0.3999021053314209 +Y1 = 1.8000002980730385 +1,3c1,3 +< X1 = 0.800048828125 +< X2 = 0.3999021053314209 +< Y1 = 1.8000002980730385 +--- +> X1 = 0.89453125 +> X2 = 0.4470043182373047 +> Y1 = 1.5278653812779421 +``` ## [Tutorial](https://github.com/SMLP-Systems/smlp/tree/master/tutorial) From b868b9f20c863f813cda2d80d41e194d84f1b0c1 Mon Sep 17 00:00:00 2001 From: Dmitry Messerman Date: Tue, 7 Apr 2026 16:51:38 +0300 Subject: [PATCH 08/21] Improved test case description --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 78cbf4fa..ad37ebbe 100644 --- a/README.md +++ b/README.md @@ -249,7 +249,7 @@ $smlp_package_path/quickstart/quickstart.sh ```
Test case description - 1. constraint_dora.json - spec in json format

+
1. constraint_dora.json - spec in json format

{
"version": "1.2",
"variables": [ @@ -265,9 +265,10 @@ $smlp_package_path/quickstart/quickstart.sh X1 - first controllable variable
X2 - second controlllable variable
Y1 - output function
+ rad-abs: sensitivity radius. Zero radius means that solution sensitivity check is skipped alpha - constraint depending on controllable variables
objective1 - optimization goal

- 2.SMLP command line arguments

+ 2. SMLP command line arguments

-data ${name}.csv.gz # input CSV dataset
-spec ${script_path}/${name_lc}.json # JSON spec file
-pref ${name} # output file prefix
From c4af0c5a40c84663a6d9212f34cf4cd5e0838f8f Mon Sep 17 00:00:00 2001 From: Dmitry Messerman Date: Tue, 7 Apr 2026 16:53:02 +0300 Subject: [PATCH 09/21] Added missing line break --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ad37ebbe..4a95acb6 100644 --- a/README.md +++ b/README.md @@ -265,7 +265,7 @@ $smlp_package_path/quickstart/quickstart.sh X1 - first controllable variable
X2 - second controlllable variable
Y1 - output function
- rad-abs: sensitivity radius. Zero radius means that solution sensitivity check is skipped + rad-abs: sensitivity radius. Zero radius means that solution sensitivity check is skipped
alpha - constraint depending on controllable variables
objective1 - optimization goal

2. SMLP command line arguments

From 51150daa06b57d96ab534e11d26f0bf3ec30b9e8 Mon Sep 17 00:00:00 2001 From: Dmitry Messerman Date: Sat, 18 Apr 2026 16:15:53 +0300 Subject: [PATCH 10/21] Sync with master after PR#105 merge --- pyproject.toml | 9 +- .../Dockerfile.smlp-wheel_2_28-python311 | 2 +- setup.py | 134 ++++-------------- 3 files changed, 27 insertions(+), 118 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 80780788..dc1d4d3c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,15 +20,10 @@ description = "SMLP - The Symbolic Machine Learning Prover" readme = "README.md" requires-python = "==3.11.*" dependencies = [ - "blosc2", - "category_encoders==2.7.0", "doepy", "jenkspy", "keras-tuner", - "kt_legacy", - "joblib==1.3.2", "matplotlib", - "meson", "mrmr-selection", "pandas", "pycaret", @@ -37,7 +32,6 @@ dependencies = [ "scikit-learn==1.4.2", "scipy", "seaborn", - "z3-solver==4.8.12", "tensorflow==2.15.1", ] @@ -55,5 +49,6 @@ exclude = ["*"] # e.g. export BOOST_ROOT=~/.local/boost_py313 # BOOST_CACHE_DIR Where to cache compiled Boost (default: ~/.local/boost_py313). # BOOST_VERSION Boost version to download (default: 1.83.0). +# GMP_ROOT Path to prefix of an existing GMP installation. # KAY_DIR Path to an existing kay checkout. -# SMLP_BRANCH Git branch to use in the smlp repo (auto-detected if unset). +# Z3_PREFIX Path to existing installation of Z3. diff --git a/scripts/docker/Dockerfile.smlp-wheel_2_28-python311 b/scripts/docker/Dockerfile.smlp-wheel_2_28-python311 index 60edba01..62642b3c 100644 --- a/scripts/docker/Dockerfile.smlp-wheel_2_28-python311 +++ b/scripts/docker/Dockerfile.smlp-wheel_2_28-python311 @@ -34,7 +34,7 @@ ENV PATH="/root/.local/bin:${PATH}" # 5. Clone smlp and optionaly switch to branch # --------------------------------------------------------------------------- # Point setup.py to the correct z3 location for this Python installation -ENV Z3_PREFIX=/opt/python/cp311-cp311/lib/python3.11/site-packages/z3/lib +ENV Z3_PREFIX=/opt/python/cp311-cp311/lib/python3.11/site-packages/z3 WORKDIR /app COPY run_git_clone . diff --git a/setup.py b/setup.py index f377b94e..c7bed053 100644 --- a/setup.py +++ b/setup.py @@ -42,10 +42,8 @@ Source compilation is only attempted as a last resort. GMP_CACHE_DIR Where to cache a source-compiled GMP (default: ~/.local/gmp). GMP_VERSION GMP version to download if source build is needed (default: 6.3.0). -Z3_PREFIX Reuse an existing Z3 install prefix – skips pip z3-solver. +Z3_PREFIX Reuse an existing Z3 install prefix. e.g. export Z3_PREFIX=~/.local/z3 -Z3_VERSION Z3 version to download binary for (default: 4.8.12). -Z3_BIN_DIR Path to directory containing z3 binary (default: ~/.local/z3/bin). """ import os @@ -83,11 +81,6 @@ os.environ.get("GMP_CACHE_DIR", Path.home() / ".local" / "gmp") ).expanduser() -Z3_VERSION = os.environ.get("Z3_VERSION", "4.8.12") -Z3_BIN_DIR = Path( - os.environ.get("Z3_BIN_DIR", Path.home() / ".local" / "z3" / "bin") -).expanduser() - # Root of this repository (where setup.py lives) REPO_ROOT = Path(__file__).parent.resolve() @@ -287,11 +280,6 @@ def _add_z3_to_env(env: dict, z3_lib: Path) -> dict: existing_pkg = env.get("PKG_CONFIG_PATH", "") env["PKG_CONFIG_PATH"] = f"{z3_lib}:{existing_pkg}" if existing_pkg else str(z3_lib) - # Add z3 binary to PATH so meson can find the solver executable - z3_bin = z3_lib.parent / "bin" - existing_path = env.get("PATH", os.environ.get("PATH", "")) - env["PATH"] = f"{z3_bin}:{existing_path}" if existing_path else str(z3_bin) - return env @@ -556,72 +544,6 @@ def _gmp_prefix() -> Path: # Step 1b – Z3 (via pip z3-solver, no sudo) # --------------------------------------------------------------------------- -# --------------------------------------------------------------------------- -# Step 1d – Z3 binary (downloaded from GitHub releases) -# --------------------------------------------------------------------------- - -def _z3_binary() -> Path: - """ - Return the path to the z3 executable. - - Search order: - 1. Z3_BIN_DIR env var / constant (~/.local/z3/bin/z3) - 2. ~/.local/bin/z3 (pip install --user z3-solver installs it here) - 3. System z3 on PATH (sudo apt install z3) - 4. Download pre-built from GitHub (no sudo fallback) - """ - from shutil import which - - # ── 1. Explicit Z3_BIN_DIR ──────────────────────────────────────────── - if Z3_BIN_DIR.exists() and (Z3_BIN_DIR / "z3").exists(): - print(f"[smlp build] Using z3 binary from Z3_BIN_DIR: {Z3_BIN_DIR / 'z3'}") - return Z3_BIN_DIR / "z3" - - # ── 2. ~/.local/bin/z3 ─────────────────────────────────────────────── - user_z3 = Path.home() / ".local" / "bin" / "z3" - if user_z3.exists(): - print(f"[smlp build] Using user z3 binary: {user_z3}") - return user_z3 - - # ── 3. PATH ─────────────────────────────────────────────────────────── - system_z3 = which("z3") - if system_z3: - print(f"[smlp build] Using system z3: {system_z3}") - return Path(system_z3) - - # ── 4. Download pre-built binary from GitHub releases ───────────────── - import platform as _platform - machine = _platform.machine() - arch_map = {"x86_64": "x64", "aarch64": "arm64"} - arch = arch_map.get(machine, machine) - z3_release = f"z3-{Z3_VERSION}-{arch}-glibc-2.31" - url = ( - f"https://github.com/Z3Prover/z3/releases/download/z3-{Z3_VERSION}/" - f"{z3_release}.zip" - ) - - tmp_dir = Z3_BIN_DIR.parent.parent / "_z3_build_tmp" - tmp_dir.mkdir(parents=True, exist_ok=True) - zip_path = tmp_dir / f"{z3_release}.zip" - - print(f"[smlp build] Downloading z3 binary {Z3_VERSION} ...") - _download(url, zip_path) - - import zipfile, shutil as _shutil - print(f"[smlp build] Extracting z3 binary ...") - with zipfile.ZipFile(zip_path) as zf: - zf.extractall(tmp_dir) - - Z3_BIN_DIR.mkdir(parents=True, exist_ok=True) - src_bin = tmp_dir / z3_release / "bin" / "z3" - _shutil.copy2(src_bin, Z3_BIN_DIR / "z3") - (Z3_BIN_DIR / "z3").chmod(0o755) - _shutil.rmtree(tmp_dir, ignore_errors=True) - - print(f"[smlp build] z3 binary installed at {Z3_BIN_DIR / 'z3'}") - return Z3_BIN_DIR / "z3" - - def _write_z3_pc(z3_lib: Path) -> Path: """ Write a z3.pc pkg-config file into /pkgconfig/. @@ -673,7 +595,7 @@ def _z3_prefix() -> tuple[Path,Path]: """ env_prefix = os.environ.get("Z3_PREFIX", f"/usr/lib/{platform.machine()}-{platform.system().lower()}-gnu") prefix = Path(env_prefix).expanduser() if env_prefix else Z3_DEFAULT_PREFIX - lib_dir = prefix + lib_dir = prefix/'lib' print(f"[smlp build] Looking for libz3.so in: {lib_dir}") @@ -685,13 +607,11 @@ def _z3_prefix() -> tuple[Path,Path]: sys.exit( f"[smlp build] ERROR: libz3.so not found at {lib_dir}.\n" - "Install z3-solver with: python3.11 -m pip install --user z3-solver\n" - "Or set Z3_PREFIX to your z3 package directory, e.g.:\n" - " export Z3_PREFIX=~/.local/lib/python3.11/site-packages/z3" + "Install z3 and set Z3_PREFIX to your z3 install prefix directory." ) -def _write_native_file(boost_prefix: Path, gmp_prefix: Path, z3_lib: Path, z3_bin: Path, z3_pc_dir: Path, build_tmp: Path, stub_dir: Path = None) -> Path: +def _write_native_file(boost_prefix: Path, gmp_prefix: Path, z3_lib: Path, z3_pc_dir: Path, build_tmp: Path, stub_dir: Path = None) -> Path: """ Write a Meson native file that points to the user-space Boost install. This is the most reliable way to pass non-standard library paths to Meson — @@ -718,7 +638,6 @@ def _write_native_file(boost_prefix: Path, gmp_prefix: Path, z3_lib: Path, z3_bi f"python = '{sys.executable}'\n" f"python3 = '{sys.executable}'\n" f"pkg-config = 'pkg-config'\n" - f"z3 = '{z3_bin}'\n" "\n" "[built-in options]\n" f"pkg_config_path = ['{gmp_lib / 'pkgconfig'}', '{boost_lib / 'pkgconfig'}', '{z3_pc_dir}']\n" @@ -776,7 +695,6 @@ def _meson_build(poly_dir: Path, kay_dir: Path, shutil.rmtree(meson_build_dir) z3_lib, z3_pc_dir = _z3_prefix() - z3_bin = _z3_binary() gmp_prefix = _gmp_prefix() _create_python_stub_lib(build_tmp) env = _boost_env(boost_prefix) @@ -793,7 +711,7 @@ def _meson_build(poly_dir: Path, kay_dir: Path, rpath_flags = ":".join(f"-Wl,-rpath,{d}" for d in rpath_dirs) existing_ldflags = env.get("LDFLAGS", "") env["LDFLAGS"] = f"{rpath_flags} {existing_ldflags}".strip() - native_file = _write_native_file(boost_prefix, gmp_prefix, z3_lib, z3_bin, z3_pc_dir, build_tmp) + native_file = _write_native_file(boost_prefix, gmp_prefix, z3_lib, z3_pc_dir, build_tmp) meson_flags = [ "--wipe", @@ -862,29 +780,25 @@ def run(self): shutil.copytree(str(installed_pkg), str(dest)) print(f"[smlp build] smlp extension copied to wheel at {dest}") -# 5. Copy Python sources from src/ into smlp/ inside the wheel - sources = [ - (REPO_ROOT / "src" / "smlp_py", dest / "smlp_py", "dir"), - (REPO_ROOT / "src" / "__init__.py", dest / "__init__.py", "file"), - (REPO_ROOT / "src" / "run_smlp.py", dest / "run_smlp.py", "file"), - (REPO_ROOT / "quickstart", dest / "quickstart", "dir"), - ] - for src, dst, kind in sources: - copy_success = False - if kind == "dir": - if src.is_dir(): - if dst.exists(): - shutil.rmtree(str(dst)) - shutil.copytree(str(src), str(dst)) - copy_success = True - else: - if src.is_file(): - shutil.copy2(str(src), str(dst)) - copy_success = True - if copy_success: - print(f"[smlp build] {src} copied to wheel at {dst}") - else: - print(f"[smlp build] WARNING: source is not found at {src}, skipping.") + # 5. Copy Python source from src/smlp_py into smlp/smlp_py inside the wheel + smlp_py_src = REPO_ROOT / "src" / "smlp_py" + if smlp_py_src.is_dir(): + smlp_py_dest = dest / "smlp_py" # dest is already smlp/ + if smlp_py_dest.exists(): + shutil.rmtree(smlp_py_dest) + shutil.copytree(str(smlp_py_src), str(smlp_py_dest)) + print(f"[smlp build] smlp_py source copied to wheel at {smlp_py_dest}") + else: + print(f"[smlp build] WARNING: src/smlp_py not found at {smlp_py_src}, skipping.") + + # 6. Copy src/run_smlp.py into smlp/ inside the wheel + run_smlp_src = REPO_ROOT / "src" / "run_smlp.py" + if run_smlp_src.is_file(): + shutil.copy2(str(run_smlp_src), str(dest / "run_smlp.py")) + print(f"[smlp build] run_smlp.py copied to wheel at {dest / 'run_smlp.py'}") + else: + print(f"[smlp build] WARNING: src/run_smlp.py not found at {run_smlp_src}, skipping.") + # --------------------------------------------------------------------------- # setup() From ec35965962ded193de1107cca5c20099e0cfa036 Mon Sep 17 00:00:00 2001 From: Dmitry Messerman Date: Sun, 19 Apr 2026 09:07:45 +0300 Subject: [PATCH 11/21] Merge after PR #103 merge into main branch --- pyproject.toml | 5 ++- scripts/bin/smlp_versions.py | 1 + ...file.smlp-test-build-almalinux_9-python311 | 7 ++- ...le.smlp-test-build-opensuse_15.5-python311 | 8 +++- ...ile.smlp-test-build-ubuntu_22.04-python311 | 7 ++- .../Dockerfile.smlp-wheel_2_28-python311 | 2 +- scripts/docker/Makefile | 16 +++++-- scripts/docker/run_pip_install | 15 +++++++ scripts/docker/smlp_versions.py | 45 +++++++++++++++++++ scripts/docker/testpypi_upload | 2 + scripts/venv/run_dora | 11 ++++- setup.py | 42 +++++++++-------- 12 files changed, 130 insertions(+), 31 deletions(-) create mode 120000 scripts/bin/smlp_versions.py create mode 100755 scripts/docker/run_pip_install create mode 100755 scripts/docker/smlp_versions.py create mode 100755 scripts/docker/testpypi_upload diff --git a/pyproject.toml b/pyproject.toml index dc1d4d3c..27dafea6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,12 +1,15 @@ [build-system] requires = [ "setuptools>=68", + "setuptools_scm", "wheel", "meson", "ninja", ] build-backend = "setuptools.build_meta" +[tool.setuptools_scm] + [project] maintainers = [ {name = "Zurab Khasidashvili", email = "zurab.khasidashvili@gmail.com"}, @@ -15,7 +18,7 @@ maintainers = [ {name = "Dmitry Messerman", email = "dmitry.messerman@gmail.com"} ] name = "smlptech" -version = "1.1.1" +dynamic = ["version"] description = "SMLP - The Symbolic Machine Learning Prover" readme = "README.md" requires-python = "==3.11.*" diff --git a/scripts/bin/smlp_versions.py b/scripts/bin/smlp_versions.py new file mode 120000 index 00000000..fec36cac --- /dev/null +++ b/scripts/bin/smlp_versions.py @@ -0,0 +1 @@ +../docker/smlp_versions.py \ No newline at end of file diff --git a/scripts/docker/Dockerfile.smlp-test-build-almalinux_9-python311 b/scripts/docker/Dockerfile.smlp-test-build-almalinux_9-python311 index 906cae7f..91c27a98 100644 --- a/scripts/docker/Dockerfile.smlp-test-build-almalinux_9-python311 +++ b/scripts/docker/Dockerfile.smlp-test-build-almalinux_9-python311 @@ -46,14 +46,17 @@ RUN curl -sS https://bootstrap.pypa.io/get-pip.py | python3.11 && \ # --------------------------------------------------------------------------- ARG CACHE_BUST_SMLP ARG GIT_BRANCH=master +ARG RELEASE_TYPE RUN echo "Building image for branch: $GIT_BRANCH" -COPY run_git_clone /app +COPY run_git_clone . RUN cd /app && ./run_git_clone $GIT_BRANCH # --------------------------------------------------------------------------- # 5. Install smlp from wheel # --------------------------------------------------------------------------- -RUN python3.11 -m pip install -i https://test.pypi.org/simple --extra-index-url https://pypi.org/simple smlptech==1.2.0rc1 +COPY smlp_versions.py . +COPY run_pip_install . +RUN ./run_pip_install $RELEASE_TYPE # --------------------------------------------------------------------------- # 6. Configure UTF-8 locale diff --git a/scripts/docker/Dockerfile.smlp-test-build-opensuse_15.5-python311 b/scripts/docker/Dockerfile.smlp-test-build-opensuse_15.5-python311 index 5a6dcd69..979bc727 100644 --- a/scripts/docker/Dockerfile.smlp-test-build-opensuse_15.5-python311 +++ b/scripts/docker/Dockerfile.smlp-test-build-opensuse_15.5-python311 @@ -12,6 +12,7 @@ RUN zypper refresh && zypper install -y \ glibc-locale-base \ glibc-i18ndata \ gzip \ + hostname \ tar \ tcsh \ timezone \ @@ -46,14 +47,17 @@ RUN curl -sS https://bootstrap.pypa.io/get-pip.py | python3.11 && \ # --------------------------------------------------------------------------- ARG CACHE_BUST_SMLP ARG GIT_BRANCH=master +ARG RELEASE_TYPE RUN echo "Building image for branch: $GIT_BRANCH" -COPY run_git_clone /app +COPY run_git_clone . RUN cd /app && ./run_git_clone $GIT_BRANCH # --------------------------------------------------------------------------- # 5. Install smlp from wheel # --------------------------------------------------------------------------- -RUN python3.11 -m pip install -i https://test.pypi.org/simple --extra-index-url https://pypi.org/simple smlptech==1.2.0rc1 +COPY smlp_versions.py . +COPY run_pip_install . +RUN ./run_pip_install $RELEASE_TYPE # --------------------------------------------------------------------------- # 6. Configure UTF-8 locale diff --git a/scripts/docker/Dockerfile.smlp-test-build-ubuntu_22.04-python311 b/scripts/docker/Dockerfile.smlp-test-build-ubuntu_22.04-python311 index 34c04cdc..9a95bc29 100644 --- a/scripts/docker/Dockerfile.smlp-test-build-ubuntu_22.04-python311 +++ b/scripts/docker/Dockerfile.smlp-test-build-ubuntu_22.04-python311 @@ -40,14 +40,17 @@ RUN ./run_mathsat_build && rm -rf /tmp/mathsat* # --------------------------------------------------------------------------- ARG CACHE_BUST_SMLP ARG GIT_BRANCH=master +ARG RELEASE_TYPE RUN echo "Building image for branch: $GIT_BRANCH" -COPY run_git_clone /app +COPY run_git_clone . RUN cd /app && ./run_git_clone $GIT_BRANCH # --------------------------------------------------------------------------- # 5. Install smlp from wheel # --------------------------------------------------------------------------- -RUN python3.11 -m pip install -i https://test.pypi.org/simple --extra-index-url https://pypi.org/simple smlptech==1.2.0rc1 +COPY smlp_versions.py . +COPY run_pip_install . +RUN ./run_pip_install $RELEASE_TYPE # --------------------------------------------------------------------------- # 6. Install UTF-8 fonts diff --git a/scripts/docker/Dockerfile.smlp-wheel_2_28-python311 b/scripts/docker/Dockerfile.smlp-wheel_2_28-python311 index 62642b3c..664559fc 100644 --- a/scripts/docker/Dockerfile.smlp-wheel_2_28-python311 +++ b/scripts/docker/Dockerfile.smlp-wheel_2_28-python311 @@ -18,7 +18,7 @@ ENV PIP=/opt/python/cp311-cp311/bin/pip # 3. Python build tools # --------------------------------------------------------------------------- RUN /opt/python/cp311-cp311/bin/pip install --upgrade pip && \ - /opt/python/cp311-cp311/bin/pip install setuptools==71.1.0 && \ + /opt/python/cp311-cp311/bin/pip install setuptools==71.1.0 setuptools-scm && \ /opt/python/cp311-cp311/bin/pip install meson ninja z3-solver==4.8.12 auditwheel patchelf && \ ln -sf /opt/python/cp311-cp311/bin/python3.11 /usr/local/bin/python3.11 && \ ln -sf /opt/python/cp311-cp311/bin/pip /usr/local/bin/pip3.11 && \ diff --git a/scripts/docker/Makefile b/scripts/docker/Makefile index 3d80fae0..101f31bc 100644 --- a/scripts/docker/Makefile +++ b/scripts/docker/Makefile @@ -4,17 +4,24 @@ DOCKERFILE := Dockerfile.$(IMAGE) GIT_BRANCH := $(shell git branch --show-current) SMLP_COMMIT := $(shell git ls-remote https://github.com/SMLP-Systems/smlp.git refs/heads/$(GIT_BRANCH) | cut -f1) - -WHEEL_SRC := /app/smlp/dist/smlptech-1.2.0rc1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl +RELEASE_TYPE ?= WHEEL_DST := ../dist +ifeq ($(RELEASE_TYPE),test) + RELEASE_BUILD_ARG := --build-arg RELEASE_TYPE=-test +else + RELEASE_BUILD_ARG := --build-arg RELEASE_TYPE= +endif + define copy_out @if [[ "$(IMAGE)" == smlp-wheel* ]]; then \ echo "Copying wheel from container image $(IMAGE)..."; \ mkdir -p $(WHEEL_DST); \ docker create --name smlp_tmp $(IMAGE); \ - docker cp smlp_tmp:$(WHEEL_SRC) $(WHEEL_DST); \ + docker cp smlp_tmp:/app/smlp/dist/. /tmp/smlp_dist_tmp; \ docker rm smlp_tmp; \ + mv /tmp/smlp_dist_tmp/smlptech-*manylinux*.whl $(WHEEL_DST)/ ; \ + rm -rf /tmp/smlp_dist_tmp; \ else \ echo "Skipping copy_out: IMAGE=$(IMAGE) does not start with 'smlp-wheel'"; \ fi @@ -26,6 +33,7 @@ endef build: $(DOCKERFILE) env DOCKER_BUILDKIT=1 docker build \ --build-arg GIT_BRANCH=$(GIT_BRANCH) \ + $(RELEASE_BUILD_ARG) \ --progress=plain \ -f $(DOCKERFILE) \ -t $(IMAGE) \ @@ -36,6 +44,7 @@ rebuild_smlp: $(DOCKERFILE) env DOCKER_BUILDKIT=1 docker build \ --build-arg CACHE_BUST_SMLP=$(SMLP_COMMIT) \ --build-arg GIT_BRANCH=$(GIT_BRANCH) \ + $(RELEASE_BUILD_ARG) \ --progress=plain \ -f $(DOCKERFILE) \ -t $(IMAGE) \ @@ -46,6 +55,7 @@ clean_build: $(DOCKERFILE) env DOCKER_BUILDKIT=1 docker build \ --no-cache \ --build-arg GIT_BRANCH=$(GIT_BRANCH) \ + $(RELEASE_BUILD_ARG) \ --progress=plain \ -f $(DOCKERFILE) \ -t $(IMAGE) \ diff --git a/scripts/docker/run_pip_install b/scripts/docker/run_pip_install new file mode 100755 index 00000000..1418bf7b --- /dev/null +++ b/scripts/docker/run_pip_install @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +pip install requests packaging +if [ "$1" == "-test" ]; then + test="" + version=$(./smlp_versions.py -atl) + echo "Building image from the latest test version $version" +else + version=$(./smlp_versions.py -l) + echo "Building image from the latest prod version $version" +fi +if [[ -v test ]]; then + pip install -i https://test.pypi.org/simple --extra-index-url https://pypi.org/simple smlptech==$version +else + pip install smlptech +fi diff --git a/scripts/docker/smlp_versions.py b/scripts/docker/smlp_versions.py new file mode 100755 index 00000000..d4d37f00 --- /dev/null +++ b/scripts/docker/smlp_versions.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python3.11 +import requests +from packaging.version import Version +from argparse import ArgumentParser, Namespace +from os.path import realpath, basename +from sys import argv + +def add_arguments() -> ArgumentParser: + p = ArgumentParser() + p.add_argument('--test', '-t', default=None, action='store_true') + p.add_argument('--all', '-a', default=None, action='store_true') + p.add_argument('--latest', '-l', default=None, action='store_true') + return p + +def get_release_files(package: str, version: str, test_version: bool = False) -> list: + url = f"https://test.pypi.org/pypi/{package}/{version}/json" if test_version \ + else f"https://pypi.org/pypi/{package}/{version}/json" + response = requests.get(url) + response.raise_for_status() + return response.json()["urls"] # list of file dicts + +def smlp_versions(args: Namespace) -> int: + script_name = basename(realpath(argv[0])) + try: + url = "https://test.pypi.org/pypi/smlptech/json" if args.test \ + else "https://pypi.org/pypi/smlptech/json" + r = requests.get(url) + data = r.json() + version_list = list(data["releases"].keys()) + versions = sorted(Version(v) for v in data["releases"].keys()) + selected_versions = versions if args.all else [v for v in versions if not v.is_prerelease] + if args.latest: + print(selected_versions[-1]) + else: + for v in selected_versions: + if len(get_release_files("smlptech", v, args.test)) > 0: + print(v) + + except Exception as err: + print(f"\n{script_name}: ERROR: {err}\n") + return 1 + return 0 + +if __name__ == '__main__': + exit(smlp_versions(add_arguments().parse_args())) diff --git a/scripts/docker/testpypi_upload b/scripts/docker/testpypi_upload new file mode 100755 index 00000000..1c223cdd --- /dev/null +++ b/scripts/docker/testpypi_upload @@ -0,0 +1,2 @@ +#!/usr/bin/tcsh -f +twine upload --repository testpypi `realpath $0 | xargs dirname`/../dist/* diff --git a/scripts/venv/run_dora b/scripts/venv/run_dora index de355203..3d2c4180 100755 --- a/scripts/venv/run_dora +++ b/scripts/venv/run_dora @@ -1,10 +1,14 @@ #!/usr/bin/bash +script_path=$(realpath $0 | xargs dirname) smlp_venv_dir=smlp_package_venv \rm -rf $smlp_venv_dir > /dev/null if [[ $# -gt 0 ]]; then if [ "$1" == "-clean" ]; then exit 0 fi + if [ "$1" == "-test" ]; then + test="" + fi fi python3.11 -m venv $smlp_venv_dir cd $smlp_venv_dir @@ -20,7 +24,12 @@ mathsat_src_dir=scripts/docker/external $(dirname $mathsat_src_dir)/run_mathsat_build \rm -rf $mathsat_dest_dir > /dev/null \mv $mathsat_src_dir $mathsat_dest_dir -pip install -i https://test.pypi.org/simple --extra-index-url https://pypi.org/simple smlptech +if [[ -v test ]]; then + pip install requests packaging + pip install -i https://test.pypi.org/simple --extra-index-url https://pypi.org/simple smlptech==$($script_path/../bin/smlp_versions.py -atl) +else + pip install smlptech +fi sed -i.bak "s@../../src/run_smlp.py@smlp@" regr_smlp/code/smlp_regr.py cd regr_smlp/code smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test1 -mode train -resp y1 -feat x,p1,p2 -model dt_caret -save_model_config f -mrmr_pred 0 -plots t -seed 10 -log_time f diff --git a/setup.py b/setup.py index c7bed053..6efee577 100644 --- a/setup.py +++ b/setup.py @@ -780,25 +780,29 @@ def run(self): shutil.copytree(str(installed_pkg), str(dest)) print(f"[smlp build] smlp extension copied to wheel at {dest}") - # 5. Copy Python source from src/smlp_py into smlp/smlp_py inside the wheel - smlp_py_src = REPO_ROOT / "src" / "smlp_py" - if smlp_py_src.is_dir(): - smlp_py_dest = dest / "smlp_py" # dest is already smlp/ - if smlp_py_dest.exists(): - shutil.rmtree(smlp_py_dest) - shutil.copytree(str(smlp_py_src), str(smlp_py_dest)) - print(f"[smlp build] smlp_py source copied to wheel at {smlp_py_dest}") - else: - print(f"[smlp build] WARNING: src/smlp_py not found at {smlp_py_src}, skipping.") - - # 6. Copy src/run_smlp.py into smlp/ inside the wheel - run_smlp_src = REPO_ROOT / "src" / "run_smlp.py" - if run_smlp_src.is_file(): - shutil.copy2(str(run_smlp_src), str(dest / "run_smlp.py")) - print(f"[smlp build] run_smlp.py copied to wheel at {dest / 'run_smlp.py'}") - else: - print(f"[smlp build] WARNING: src/run_smlp.py not found at {run_smlp_src}, skipping.") - + # 5. Copy Python sources from src/ into smlp/ inside the wheel + sources = [ + (REPO_ROOT / "src" / "smlp_py", dest / "smlp_py", "dir"), + (REPO_ROOT / "src" / "__init__.py", dest / "__init__.py", "file"), + (REPO_ROOT / "src" / "run_smlp.py", dest / "run_smlp.py", "file"), + (REPO_ROOT / "quickstart", dest / "quickstart", "dir"), + ] + for src, dst, kind in sources: + copy_success = False + if kind == "dir": + if src.is_dir(): + if dst.exists(): + shutil.rmtree(str(dst)) + shutil.copytree(str(src), str(dst)) + copy_success = True + else: + if src.is_file(): + shutil.copy2(str(src), str(dst)) + copy_success = True + if copy_success: + print(f"[smlp build] {src} copied to wheel at {dst}") + else: + print(f"[smlp build] WARNING: source is not found at {src}, skipping.") # --------------------------------------------------------------------------- # setup() From 2fed4f0cbb34514f7e591704cfa219cc8dbecbde Mon Sep 17 00:00:00 2001 From: Dmitry Messerman Date: Tue, 21 Apr 2026 22:28:10 +0300 Subject: [PATCH 12/21] Synch with master --- scripts/docker/Makefile | 28 +++++++------ scripts/docker/run_git_clone | 78 ++++++++++++++++++++++++++++++++++-- 2 files changed, 89 insertions(+), 17 deletions(-) diff --git a/scripts/docker/Makefile b/scripts/docker/Makefile index 101f31bc..cec466fa 100644 --- a/scripts/docker/Makefile +++ b/scripts/docker/Makefile @@ -63,16 +63,18 @@ clean_build: $(DOCKERFILE) $(copy_out) help: - @echo "" - @echo "Usage: make [target] [IMAGE=]" - @echo "" - @echo "Targets:" - @echo " build Normal build using Dockerfile. (default target)" - @echo " rebuild_smlp Force re-fetch of smlp (cache-busted)" - @echo " clean_build Full rebuild with --no-cache" - @echo " default image $(IMAGE)" - @echo " help Show this message" - @echo "" - @echo "Example:" - @echo " make build IMAGE=python311-dev" - @echo "" + @echo "" + @echo "Usage: make [target] [IMAGE=] [SMLP_COMMIT="] + @echo "" + @echo "Targets:" + @echo " build Normal build using Dockerfile. (default target)" + @echo " rebuild_smlp Force smlp clone (docker cache busted)" + @echo " rebuild_smlp SMLP_COMMIT= Force smlp clone (docker cache busted)" + @echo -e " \033[1mif the only change versus previous build is the new tag pushed to remote\033[0m" + @echo " clean_build Full rebuild with --no-cache" + @echo " default image: $(IMAGE)" + @echo " help Show this message" + @echo "" + @echo "Example:" + @echo " make build IMAGE=python311-dev" + @echo "" diff --git a/scripts/docker/run_git_clone b/scripts/docker/run_git_clone index af6326ee..947c4996 100755 --- a/scripts/docker/run_git_clone +++ b/scripts/docker/run_git_clone @@ -1,7 +1,77 @@ #!/usr/bin/env bash -git clone https://github.com/SMLP-Systems/smlp -GIT_BRANCH=$1 +set -euo pipefail + +GIT_BRANCH="${1:-}" + +# Clone the repository +if ! git clone https://github.com/SMLP-Systems/smlp; then + echo "ERROR: git clone failed." >&2 + exit 1 +fi + cd smlp -if [ $(git branch -r --list origin/$GIT_BRANCH) ]; then - git switch $GIT_BRANCH + +# If a branch was specified, check and switch to it +if [[ -n "$GIT_BRANCH" ]]; then + if [[ -z "$(git branch -r --list "origin/$GIT_BRANCH")" ]]; then + echo "WARNING: Branch '$GIT_BRANCH' does not exist on remote." >&2 + GIT_BRANCH=$(git symbolic-ref refs/remotes/origin/HEAD | sed 's,.*/,,') + echo "WARNING: Staying on default branch '$GIT_BRANCH'" >&2 + else + git switch "$GIT_BRANCH" + fi +else + GIT_BRANCH=$(git symbolic-ref refs/remotes/origin/HEAD | sed 's,.*/,,') + echo "INFO: using default branch '$GIT_BRANCH'" +fi + +# Inspect the last commit on the current branch +LAST_COMMIT=$(git rev-parse HEAD) + +# Get all tags pointing exactly at the last commit +TAGS=$(git tag --points-at "$LAST_COMMIT") + +if [[ -z "$TAGS" ]]; then + echo "WARNING: The last commit on '$GIT_BRANCH' ($LAST_COMMIT) is not tagged." >&2 +else + # Count the tags + TAG_COUNT=$(echo "$TAGS" | wc -l | tr -d ' ') + + if [[ "$TAG_COUNT" -gt 1 ]]; then + echo "WARNING: The last commit on '$GIT_BRANCH' ($LAST_COMMIT) has multiple tags:" >&2 + while IFS= read -r tag; do + echo " - $tag" >&2 + done <<< "$TAGS" + fi + + # Check each tag against PEP 440 / setuptools_scm naming convention: + # valid forms: N.N.N N.N.N.devM N.N.NaN N.N.NbN N.N.NrcN N.N.N.postN + PEP440_RE='^v?[0-9]+\.[0-9]+(\.[0-9]+)*(\.dev[0-9]+|a[0-9]+|b[0-9]+|rc[0-9]+|\.post[0-9]+)?$' + NON_CONFORMING=() + while IFS= read -r tag; do + if ! [[ "$tag" =~ $PEP440_RE ]]; then + NON_CONFORMING+=("$tag") + fi + done <<< "$TAGS" + + if [[ "${#NON_CONFORMING[@]}" -gt 0 ]]; then + echo "WARNING: The following tag(s) on the last commit of '$GIT_BRANCH' do not follow" \ + "the PEP 440 naming convention required by setuptools_scm:" >&2 + for tag in "${NON_CONFORMING[@]}"; do + echo " - $tag" >&2 + done + fi +fi + +# Report the version that setuptools_scm would choose when building a wheel +# (equivalent to what `pip -v wheel . -w dist/` would use) +if command -v python3 &>/dev/null && python3 -c "import setuptools_scm" &>/dev/null; then + SCM_VERSION=$(python3 -m setuptools_scm 2>/dev/null || true) + if [[ -n "$SCM_VERSION" ]]; then + echo "INFO: setuptools_scm version that will be used for the wheel: $SCM_VERSION" + else + echo "WARNING: setuptools_scm could not determine a version (check pyproject.toml)." >&2 + fi +else + echo "WARNING: setuptools_scm is not installed; cannot determine the wheel version." >&2 fi From 94ae848053d03ff0273ae609d42c56d2946df299 Mon Sep 17 00:00:00 2001 From: Dmitry Messerman Date: Wed, 22 Apr 2026 09:12:50 +0300 Subject: [PATCH 13/21] Synch with main branch --- .../Dockerfile.smlp-wheel_2_28-python311 | 42 +- .../run_smlp_regression_venv_expected.log | 1059 +++---- ...p_regression_venv_expected_diff_report.log | 2450 +---------------- tutorial/README.md | 78 +- .../bnh/smlp/bnh_certify_expected.txt | 22 +- .../smlp/{bnh.json => bnh_certify_fail.json} | 9 +- .../examples/bnh/smlp/bnh_certify_pass.json | 13 + .../bnh/smlp/media/witness_certify.png | Bin 0 -> 133111 bytes .../bnh/smlp/media/witness_certify_0.5x.png | Bin 0 -> 92371 bytes tutorial/examples/bnh/smlp/run_certify | 53 - tutorial/examples/bnh/smlp/run_certify.sh | 86 + .../examples/bnh/smlp/witness_certify_plot.py | 148 + tutorial/run_all | 33 +- 13 files changed, 948 insertions(+), 3045 deletions(-) rename tutorial/examples/bnh/smlp/{bnh.json => bnh_certify_fail.json} (72%) create mode 100644 tutorial/examples/bnh/smlp/bnh_certify_pass.json create mode 100644 tutorial/examples/bnh/smlp/media/witness_certify.png create mode 100644 tutorial/examples/bnh/smlp/media/witness_certify_0.5x.png delete mode 100755 tutorial/examples/bnh/smlp/run_certify create mode 100755 tutorial/examples/bnh/smlp/run_certify.sh create mode 100755 tutorial/examples/bnh/smlp/witness_certify_plot.py diff --git a/scripts/docker/Dockerfile.smlp-wheel_2_28-python311 b/scripts/docker/Dockerfile.smlp-wheel_2_28-python311 index 664559fc..ad1161c4 100644 --- a/scripts/docker/Dockerfile.smlp-wheel_2_28-python311 +++ b/scripts/docker/Dockerfile.smlp-wheel_2_28-python311 @@ -16,14 +16,39 @@ ENV PIP=/opt/python/cp311-cp311/bin/pip # --------------------------------------------------------------------------- # 3. Python build tools -# --------------------------------------------------------------------------- +# -------------------------------------------------------------------------- RUN /opt/python/cp311-cp311/bin/pip install --upgrade pip && \ - /opt/python/cp311-cp311/bin/pip install setuptools==71.1.0 setuptools-scm && \ - /opt/python/cp311-cp311/bin/pip install meson ninja z3-solver==4.8.12 auditwheel patchelf && \ + /opt/python/cp311-cp311/bin/pip install \ + auditwheel \ + patchelf && \ ln -sf /opt/python/cp311-cp311/bin/python3.11 /usr/local/bin/python3.11 && \ - ln -sf /opt/python/cp311-cp311/bin/pip /usr/local/bin/pip3.11 && \ - ln -sf /opt/python/cp311-cp311/bin/meson /usr/local/bin/meson && \ - ln -sf /opt/python/cp311-cp311/bin/ninja /usr/local/bin/ninja + ln -sf /opt/python/cp311-cp311/bin/pip /usr/local/bin/pip3.11 + +# --------------------------------------------------------------------------- +# Z3 configuration +# --------------------------------------------------------------------------- +ARG Z3_VERSION=z3-4.8.12 +ARG Z3_PREFIX=/usr/local +ARG Z3_SRC_DIR=/tmp/z3 + +ENV Z3_PREFIX=${Z3_PREFIX} +ENV LD_LIBRARY_PATH=${Z3_PREFIX}/lib:${LD_LIBRARY_PATH} + +# --------------------------------------------------------------------------- +# 3.1 Build Z3 from source (for bundling) +# --------------------------------------------------------------------------- +WORKDIR /tmp +RUN git clone --branch ${Z3_VERSION} \ + https://github.com/Z3Prover/z3.git ${Z3_SRC_DIR} && \ + cd ${Z3_SRC_DIR} && \ + ${PYTHON} scripts/mk_make.py \ + --prefix=${Z3_PREFIX} \ + --optimize && \ + cd build && \ + make -j$(nproc) && \ + make install && \ + rm -rf ${Z3_SRC_DIR} +RUN ${Z3_PREFIX}/bin/z3 --version # --------------------------------------------------------------------------- # 4. Add ~/.local/bin to PATH @@ -31,11 +56,8 @@ RUN /opt/python/cp311-cp311/bin/pip install --upgrade pip && \ ENV PATH="/root/.local/bin:${PATH}" # --------------------------------------------------------------------------- -# 5. Clone smlp and optionaly switch to branch +# 5. Clone smlp and optionally switch to branch # --------------------------------------------------------------------------- -# Point setup.py to the correct z3 location for this Python installation -ENV Z3_PREFIX=/opt/python/cp311-cp311/lib/python3.11/site-packages/z3 - WORKDIR /app COPY run_git_clone . ARG CACHE_BUST_SMLP diff --git a/tests/smlp_regression/run_smlp_regression_venv_expected.log b/tests/smlp_regression/run_smlp_regression_venv_expected.log index 119215dd..88d9e0dd 100644 --- a/tests/smlp_regression/run_smlp_regression_venv_expected.log +++ b/tests/smlp_regression/run_smlp_regression_venv_expected.log @@ -6,20 +6,20 @@ Initiating 3 worker... Initiating 4 worker... Initiating 5 worker... Initiating 6 worker... -Running test 6 test type: prediction, description: basic dt_sklearn prediction test on labeled and new data with numeric labels -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test6 -mode predict -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" +Running test 7 test type: prediction, description: basic rf_sklearn prediction test on labeled and new data with numeric labels +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test7 -mode predict -resp y1,y2 -feat x,p1,p2 -model rf_sklearn -rf_sklearn_max_depth 15 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" -Running test 10 test type: prediction, description: basic et_sklearn prediction test on labeled and new data with numeric labels -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test10 -mode predict -resp y1,y2 -feat x,p1,p2 -model et_sklearn -et_sklearn_max_depth 15 -et_sklearn_bootstrap f -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" +Running test 11 test type: prediction, description: basic poly_sklearn prediction test on labeled and new data with numeric labels +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test11 -mode predict -resp y1,y2 -feat x,p1,p2 -model poly_sklearn -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" -Running test 18 test type: prediction, description: basic dt_sklearn prediction test on labeled and new data with numeric labels and saving model using name specified through model_name option - adapts Test6 -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test18 -mode predict -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -save_model t -use_model f -model_name test19_model -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" +Running test 17 test type: prediction, description: basic poly_sklearn prediction test from saved model on new data with numeric labels and two responses +smlp -model_name "../models/Test11_smlp_toy_num_resp_mult" -out_dir ./ -pref Test17 -mode predict -resp y1,y2 -feat x,p1,p2 -model poly_sklearn -save_model f -use_model t -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" -Running test 26 test type: prediction, description: basic dt_sklearn prediction test using a model saved under a name specified through model_name option on new data with numeric labels -smlp -model_name "../models/test26_model" -out_dir ./ -pref Test26 -mode predict -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -save_model f -use_model t -mrmr_pred 2 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" +Running test 23 test type: prediction, description: basic dt_sklearn prediction test on labeled and new data with numeric labels and saving model using name specified through model_name option - adapts Test6 +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test23 -mode predict -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -save_model t -use_model f -model_name test24_model -model_per_response t -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" -Running test 30 test type: subgroups, description: basic test for subgroup discovery for numric responses -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test30 -mode subgroups -psg_dim 3 -psg_top 10 -resp y1,y2 -feat x,p1,p2 -plots t -seed 10 -log_time f +Running test 32 test type: unknown, description: test reusing saved model by using configuration file +smlp -model_name "../models/test20_model" -out_dir ./ -pref Test32 -config ../models/test20_model_rerun_model_config.json -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" Running test 40 test type: doe, description: doe test with four levels with latin_hypercube_space_filling smlp -doe_spec "../grids/doe_two_levels.csv" -out_dir ./ -pref Test40 -mode doe -doe_algo latin_hypercube_sf -doe_samples 20 -log_time f @@ -37,39 +37,39 @@ specs_path ../specs Running test 70 test type: verify, description: nn_keras verification test with re-using saved model_per_response trained model smlp -model_name "../models/test69_model" -out_dir ./ -pref Test70 -mode verify -resp y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -save_model f -use_model t -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_y2_verify.spec -asrt_names asrt1 -asrt_exprs "(y2**3+p2)/2<6" -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api f -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat -spec_fn smlp_toy_num_resp_mult.spec +spec_fn smlp_toy_num_resp_mult_free_inps.spec specs_path ../specs -Running test 85 test type: optimize, description: tests alpha and eta constraints specified in command line in optimization mode -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test85 -mode optimize -pareto f -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -spec ../specs/smlp_toy_num_resp_mult.spec -data_scaler min_max -objv_names obj1,objv2 -objv_exprs "(y1+y2)/2;y1" -alpha "p2<5 and x==10 and x<12" -eta "p1==4" -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 83 test type: optimize, description: basic dt_sklearn multi objective pareto optimization test with numeric labels and integer grid as domain and with scaling objectives +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test83 -mode optimize -pareto t -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -spec ../specs/smlp_toy_num_resp_mult_free_inps.spec -data_scaler min_max -beta "y1>7 and y2>6" -objv_names obj1,objv2,objv3 -objv_exprs "(y1+y2)/2;y1/2-y2;y2" -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_num_resp_mult_optsyn.spec +spec_fn smlp_toy_num_resp_mult_verify_vacuous.spec specs_path ../specs -Running test 93 test type: optsyn, description: basic test for mode optsyn -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test93 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 92 test type: verify, description: test to detect contradictory constraints in verification mode +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test92 -mode verify -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model t -mrmr_pred 2 -model_per_response f -spec ../specs/smlp_toy_num_resp_mult_verify_vacuous.spec -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_num_resp_mult_witness.spec +spec_fn smlp_toy_num_resp_mult_free_inps_beta_objv.spec specs_path ../specs -Running test 101 test type: certify, description: basic test in certify mode to test stability (theta) and guard (eta) constraint generation -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test101 -mode certify -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model t -use_model f -model_name test101_model -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_witness.spec -quer_names query1,query2,query3 -quer_exprs "(y2**3+p2)/2<6;y1>=9;y2<20" -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 99 test type: optimize, description: testing that the response and feature names can be taken from spec file in model exploration modes when the responses and/or features are not specified in the command line +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test99 -mode optimize -pareto t -opt_strategy lazy -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -spec ../specs/smlp_toy_num_resp_mult_free_inps_beta_objv.spec -data_scaler min_max -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_num_resp_mult_beta_verify.spec +spec_fn smlp_toy_num_resp_mult_certify_witness.spec specs_path ../specs -Running test 107 test type: verify, description: test for verification mode to check that eta contraints are not contradictory and as otherwise verification problem is not well defined -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test107 -mode verify -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -spec ../specs/smlp_toy_num_resp_mult_beta_verify.spec -asrt_names asrt_y1,asrt_y2 -asrt_expr "y1*2+x<=5 and y1<=10;-2*y2-1<10-p2" -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 103 test type: certify, description: +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test103 -mode certify -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model t -use_model f -model_name test103_model -model_per_response f -spec ../specs/smlp_toy_num_resp_mult_certify_witness.spec -quer_names valid_candidate,grid_conflict,range_conflict -quer_exprs "True;True;True" -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -Running test 111 test type: unknown, description: smlp toy basic test to rerun saved model using the model rerun config file saved during model training -smlp -model_name "../models/test110_model" -out_dir ./ -pref Test111 -config ../models/test110_model_rerun_model_config.json -new_dat "../data/smlp_toy_basic_pred_unlabeled.csv" +spec_fn smlp_toy_basic.spec +specs_path ../specs +Running test 114 test type: optimize, description: smlp toy basic test for mode optimize from SMLP manual without specifying resp and feat in command line +smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test114 -mode optimize -pareto t -opt_strategy lazy -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -mrmr_pred 0 -epsilon 0.05 -delta_rel 0.01 -save_model f -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec ../specs/smlp_toy_basic.spec -spec_fn smlp_toy_system_stable_constant_certify.spec +spec_fn smlp_toy_system_stable_constant_synth_fail.spec specs_path ../specs -Running test 117 test type: certify, description: certification test with knobs only where assertion is valid without stability and fails with stability -smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test117 -mode certify -model system -resp y1,y2 -feat p1,p2 -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_constant_certify.spec -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 122 test type: optimize, description: optimization test with constant knob and no inputs where synthesis is not feasible because the assertion is not feasible but beta constraint is feasible therefore optimization is performed +smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test122 -mode optimize -pareto f -opt_strategy lazy -model system -resp y1,y2 -feat p1,p2 -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_constant_synth_fail.spec -epsilon 0.00000001 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_system_stable_constant_synth_feasible.spec +spec_fn smlp_toy_system_stable_verify.spec specs_path ../specs -Running test 123 test type: optimize, description: optimization test with constant knob and no inputs where synthesis is feasible and optimization is performed -smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test123 -mode optimize -pareto t -opt_strategy lazy -model system -resp y1,y2 -feat p1,p2 -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_constant_synth_feasible.spec -epsilon 0.00000001 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -Running test 3 test type: prediction, description: basic poly_sklearn prediction test on labeled and new data with numeric response in training/test data only +Running test 140 test type: verify, description: verification example with knobs only and fictitious inputs that have no effect where proparty is valid without stability and fails with stabilityRunning test 3 test type: prediction, description: basic poly_sklearn prediction test on labeled and new data with numeric response in training/test data only smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test3 -mode predict -resp y1 -feat x,p1,p2 -model poly_sklearn -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_unlabeled.csv" Running test 9 test type: prediction, description: basic dt_sklearn prediction test on labeled and new data with numeric labels @@ -78,61 +78,62 @@ smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test9 -mode pr Running test 16 test type: prediction, description: basic nn_keras prediction test from saved model on new data with numeric labels and two responses smlp -model_name "../models/Test8_smlp_toy_num_resp_mult" -out_dir ./ -pref Test16 -mode predict -resp y1,y2 -feat x,p1,p2 -model nn_keras -save_model f -use_model t -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" -Running test 27 test type: prediction, description: checks nn_keras prediction with nn_keras_seq_api t -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test27 -mode predict -resp y2 -feat x,p1,p2 -model nn_keras -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api t -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" +Running test 24 test type: prediction, description: basic dt_sklearn prediction test using a model saved under a name specified through model_name option on new data with numeric labels +smlp -model_name "../models/test24_model" -out_dir ./ -pref Test24 -mode predict -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -save_model f -use_model t -model_per_response t -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" -Running test 34 test type: doe, description: doe test with four levels with full_factorial method -smlp -doe_spec "../grids/doe_four_levels_real.csv" -out_dir ./ -pref Test34 -mode doe -doe_algo full_factorial -log_time f +Running test 31 test type: subgroups, description: testing resp2b in subgroup discovery mode +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test31 -mode subgroups -psg_dim 3 -psg_top 10 -resp y1,y2 -resp2b "y1<6;y2>6" -feat x,p1,p2 -plots t -seed 10 -log_time f -save_config t -Running test 42 test type: doe, description: doe test with four levels with maximin_reconstruction -smlp -doe_spec "../grids/doe_two_levels.csv" -out_dir ./ -pref Test42 -mode doe -doe_algo maximin_reconstruction -doe_samples 20 -log_time f +Running test 39 test type: doe, description: doe test with four levels with latin_hypercube +smlp -doe_spec "../grids/doe_two_levels.csv" -out_dir ./ -pref Test39 -mode doe -doe_algo latin_hypercube -doe_prob_distr Exponential -doe_samples 30 -log_time f -Running test 50 test type: discretization, description: tests discretization options -smlp -data "../data/smlp_toy_mult_discr.csv" -out_dir ./ -pref Test50 -mode discretize -resp "PF,PF1" -discr_algo kmeans -discr_bins 6 -discr_labels t -discr_type ordered -data_scaler none -mrmr_pred 0 -plots f -seed 10 -log_time f -pos_val fail -neg_val pass +Running test 47 test type: prediction, description: tests options -pos_val and -neg_val when re-using saved model +smlp -model_name "../models/test47_model" -out_dir ./ -pref Test47 -mode predict -resp "PF,PF1" -model poly_sklearn -save_model f -use_model t -data_scaler none -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -pos_val fail -neg_val pass -new_dat "../data/smlp_toy_pf_mult.csv" -spec_fn smlp_toy_num_resp_mult_y2_verify.spec -specs_path ../specs -Running test 60 test type: verify, description: basic nn_keras assertion verification test for functional nn_keras model -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test60 -mode verify -resp y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api t -save_model_config f -spec ../specs/smlp_toy_num_resp_mult_y2_verify.spec -asrt_names asrt1 -asrt_exprs "2*y2>1" -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat +Running test 55 test type: discretization, description: tests discretization options +smlp -data "../data/smlp_toy_mult_discr.csv" -out_dir ./ -pref Test55 -mode discretize -resp "PF,PF1" -discr_algo ranks -discr_bins 6 -discr_labels t -discr_type category -data_scaler none -mrmr_pred 0 -plots f -seed 10 -log_time f -pos_val fail -neg_val pass -spec_fn smlp_toy_num_resp_mult_free_inps.spec +spec_fn smlp_toy_num_resp_noknobs_verify.spec specs_path ../specs -Running test 82 test type: optimize, description: basic dt_sklearn single objective optimization test with numeric labels and integer grid as domain and with scaling objectives -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test82 -mode optimize -pareto t -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -spec ../specs/smlp_toy_num_resp_mult_free_inps.spec -data_scaler min_max -objv_names obj1,objv2,objv3 -objv_exprs "(y1+y2)/2;y1;y2" -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat +Running test 68 test type: verify, description: basic dt_sklearn assertion verification test on data with one numeric response +smlp -model_name "../models/test67_model" -out_dir ./ -pref Test68 -mode verify -resp y1,y2 -feat x0,x1,x2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -model_per_response t -save_model f -use_model t -spec ../specs/smlp_toy_num_resp_noknobs_verify.spec -asrt_names asrt1,asrt2 -asrt_exprs "x0**2+y1>4.3;(y1+x2)/2<6" -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_num_resp_mult_optsyn_vacuous.spec +spec_fn smlp_toy_num_resp_mult.spec specs_path ../specs -Running test 90 test type: optsyn, description: test to detect contradictory constraints in optsyn mode -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test90 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_optsyn_vacuous.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 80 test type: optimize, description: basic dt_sklearn single objective optimization test with numeric labels and integer grid as domain and with scaling objectives +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test80 -mode optimize -pareto f -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -spec ../specs/smlp_toy_num_resp_mult.spec -data_scaler min_max -objv_names obj1 -objv_exprs "(y1+y2)/2" -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f spec_fn smlp_toy_num_resp_mult_free_inps_beta_objv.spec specs_path ../specs -Running test 99 test type: optimize, description: testing that the response and feature names can be taken from spec file in model exploration modes when the responses and/or features are not specified in the command line -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test99 -mode optimize -pareto t -opt_strategy lazy -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -spec ../specs/smlp_toy_num_resp_mult_free_inps_beta_objv.spec -data_scaler min_max -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 88 test type: optimize, description: basic dt_sklearn multi objective pareto optimization test with beta and objectives specified in spec file +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test88 -mode optimize -pareto t -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -spec ../specs/smlp_toy_num_resp_mult_free_inps_beta_objv.spec -data_scaler min_max -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_num_resp_mult_witness.spec +spec_fn smlp_toy_num_resp_mult_optsyn.spec specs_path ../specs -Running test 102 test type: certify, description: basic test in certify mode to test stability (theta) and guard (eta) constraint generation -smlp -model_name "../models/test101_model" -out_dir ./ -pref Test102 -mode certify -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model f -use_model t -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_witness.spec -quer_names query1,query2,query3 -quer_exprs "(y2**3+p2)/2<6;y1>=9;y2<20" -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 95 test type: optsyn, description: basic test for dt_caret in model exploration mode optsyn +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test95 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_caret -save_model f -use_model f -tree_encoding nested -compress_rules f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_num_resp_mult_stable_verify.spec +spec_fn smlp_toy_num_resp_mult_unsat_eta_verify.spec specs_path ../specs -Running test 105 test type: verify, description: basic dt_sklearn assertion verfication test with numeric labels and integer grid as domain -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test105 -mode verify -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -spec ../specs/smlp_toy_num_resp_mult_stable_verify.spec -asrt_names asrt_y1,asrt_y2 -asrt_expr "y1*2+x<=5 and y1<=10;-2*y2-1<10-p2" -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 106 test type: verify, description: test for verification mode to check that eta contraints are not contradictory and as otherwise verification problem is not well defined +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test106 -mode verify -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -spec ../specs/smlp_toy_num_resp_mult_unsat_eta_verify.spec -asrt_names asrt_y1,asrt_y2 -asrt_expr "y1*2+x<=5 and y1<=10;-2*y2-1<10-p2" -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -Running test 112 test type: prediction, description: smlp toy basic test from SMLP manual -smlp -model_name "../models/test110_model" -out_dir ./ -pref Test112 -mode predict -resp y1,y2 -feat x1,x2,p1,p2 -model poly_sklearn -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -use_model t -save_model f -new_dat "../data/smlp_toy_basic_pred_unlabeled.csv" +Running test 110 test type: prediction, description: smlp toy basic example for predict mode from SMLP user manual +smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test110 -mode predict -resp y1,y2 -feat x1,x2,p1,p2 -model poly_sklearn -save_model t -model_name test110_model -save_model_config t -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_basic_pred_unlabeled.csv" -spec_fn smlp_toy_system_stable_constant_verify.spec +spec_fn smlp_toy_system_stable_constant_certify.spec specs_path ../specs -Running test 118 test type: verify, description: verification test with knobs only where assertion is valid without stability and fails with stability -smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test118 -mode verify -model system -resp y1,y2 -feat p1,p2 -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_constant_verify.spec -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 117 test type: certify, description: certification test with knobs only where assertion is valid without stability and fails with stability +smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test117 -mode certify -model system -resp y1,y2 -feat p1,p2 -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_constant_certify.spec -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_system_stable_constant_synth_fail.spec +spec_fn smlp_toy_system_stable_constant_synth_feasible.spec specs_path ../specs -Running test 124 test type: optsyn, description: optimized synthesis test with constant knob and no inputs where synthesis is not feasible because while beta constraint is feasible the assertion is not feasible therefore optimization is not performed -smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test124 -mode optsyn -pareto f -opt_strategy lazy -model system -resp y1,y2 -feat p1,p2 -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_constant_synth_fail.spec -epsilon 0.00000001 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -Running test 2 test type: prediction, description: basic rf_sklearn prediction test on labeled and new data with numeric labels +Running test 123 test type: optimize, description: optimization test with constant knob and no inputs where synthesis is feasible and optimization is performed +smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test123 -mode optimize -pareto t -opt_strategy lazy -model system -resp y1,y2 -feat p1,p2 -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_constant_synth_feasible.spec -epsilon 0.00000001 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f + +spec_fn smlp_toy_system_stable_constant_synth_feasible.spec +specs_path ../specs +Running test 145 test type: optimize, description: optimization test with constant knob and no inputs where synthesis is feasible and optimization is performedRunning test 2 test type: prediction, description: basic rf_sklearn prediction test on labeled and new data with numeric labels smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test2 -mode predict -resp y1 -feat x,p1,p2 -model rf_sklearn -rf_sklearn_max_depth 15 -save_model_config f -mrmr_pred 0 -plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" Running test 12 test type: train, description: EV-SI real life dt_sklearn predict test on labeled and new data with numeric labels @@ -144,130 +145,140 @@ smlp -model_name "../models/test20_model" -out_dir ./ -pref Test20 -mode predict Running test 28 test type: prediction, description: checks nn_keras prediction with sw_coef 0.8 and functional API smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test28 -mode predict -resp y2 -feat x,p1,p2 -model nn_keras -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api f -sw_coef 0.8 -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" -Running test 39 test type: doe, description: doe test with four levels with latin_hypercube -smlp -doe_spec "../grids/doe_two_levels.csv" -out_dir ./ -pref Test39 -mode doe -doe_algo latin_hypercube -doe_prob_distr Exponential -doe_samples 30 -log_time f - -Running test 45 test type: doe, description: doe test with four levels with fractional_factorial -smlp -doe_spec "../grids/doe_two_levels_real.csv" -out_dir ./ -pref Test45 -mode doe -doe_algo fractional_factorial -doe_resolution 5 -log_time f +Running test 34 test type: doe, description: doe test with four levels with full_factorial method +smlp -doe_spec "../grids/doe_four_levels_real.csv" -out_dir ./ -pref Test34 -mode doe -doe_algo full_factorial -log_time f -Running test 53 test type: discretization, description: tests discretization options -smlp -data "../data/smlp_toy_mult_discr.csv" -out_dir ./ -pref Test53 -mode discretize -resp "PF,PF1" -discr_algo ordinals -discr_bins 6 -discr_labels f -discr_type integer -data_scaler none -mrmr_pred 0 -plots f -seed 10 -log_time f -pos_val fail -neg_val pass +Running test 42 test type: doe, description: doe test with four levels with maximin_reconstruction +smlp -doe_spec "../grids/doe_two_levels.csv" -out_dir ./ -pref Test42 -mode doe -doe_algo maximin_reconstruction -doe_samples 20 -log_time f -spec_fn smlp_toy_num_resp_mult_y1_verify.spec -specs_path ../specs -Running test 63 test type: verify, description: basic dt_sklearn assertion verification test on data with numeric labels -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test63 -mode verify -resp y1 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model t -use_model f -model_name test63_model -spec ../specs/smlp_toy_num_resp_mult_y1_verify.spec -asrt_names asrt1,asrt2 -asrt_exprs "x/2+y1>4.3;(y1+p2)/2<6" -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 50 test type: discretization, description: tests discretization options +smlp -data "../data/smlp_toy_mult_discr.csv" -out_dir ./ -pref Test50 -mode discretize -resp "PF,PF1" -discr_algo kmeans -discr_bins 6 -discr_labels t -discr_type ordered -data_scaler none -mrmr_pred 0 -plots f -seed 10 -log_time f -pos_val fail -neg_val pass -spec_fn smlp_toy_num_resp_noknobs_verify.spec +spec_fn smlp_toy_num_resp_mult_y2_verify.spec specs_path ../specs -Running test 72 test type: verify, description: nn_keras verification test with re-using saved model_per_response trained model -smlp -model_name "../models/test71_model" -out_dir ./ -pref Test72 -mode verify -resp y1,y2 -feat x0,x1,x2 -model nn_keras -nnet_encoding nested -save_model f -use_model t -model_per_response t -spec ../specs/smlp_toy_num_resp_noknobs_verify.spec -asrt_names asrt1 -asrt_exprs "(y2**3+x2)/2<6" -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api f -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat +Running test 59 test type: verify, description: basic nn_keras assertion verification test for functional nn_keras model +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test59 -mode verify -resp y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api f -save_model_config f -spec ../specs/smlp_toy_num_resp_mult_y2_verify.spec -asrt_names asrt1 -asrt_exprs "2*y2>1" -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat spec_fn smlp_toy_num_resp_mult_free_inps.spec specs_path ../specs -Running test 83 test type: optimize, description: basic dt_sklearn multi objective pareto optimization test with numeric labels and integer grid as domain and with scaling objectives -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test83 -mode optimize -pareto t -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -spec ../specs/smlp_toy_num_resp_mult_free_inps.spec -data_scaler min_max -beta "y1>7 and y2>6" -objv_names obj1,objv2,objv3 -objv_exprs "(y1+y2)/2;y1/2-y2;y2" -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 81 test type: optimize, description: basic dt_sklearn single objective optimization test with numeric labels and integer grid as domain and with scaling objectives +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test81 -mode optimize -pareto f -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -spec ../specs/smlp_toy_num_resp_mult_free_inps.spec -data_scaler min_max -objv_names obj1 -objv_exprs "(y1+y2)/2" -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat -spec_fn smlp_toy_num_resp_mult_verify_vacuous.spec +spec_fn smlp_toy_num_resp_mult_query.spec specs_path ../specs -Running test 92 test type: verify, description: test to detect contradictory constraints in verification mode -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test92 -mode verify -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model t -mrmr_pred 2 -model_per_response f -spec ../specs/smlp_toy_num_resp_mult_verify_vacuous.spec -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 89 test type: query, description: basic test in query mode to test stability (theta) and guard (eta) constraint generation +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test89 -mode query -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_query.spec -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_num_resp_mult_free_inps_beta_objv.spec +spec_fn smlp_toy_num_resp_mult_query.spec specs_path ../specs -Running test 100 test type: optimize, description: basic test for sat_threshold option enabing usage of objectve values in SAT assignments that prove optimization thresholds -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test100 -mode optimize -pareto t -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -spec ../specs/smlp_toy_num_resp_mult_free_inps_beta_objv.spec -data_scaler min_max -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 97 test type: query, description: basic test for rf_sklearn in model exploration mode optsyn +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test97 -mode query -resp y1,y2 -feat x,p1,p2 -model et_sklearn -et_sklearn_bootstrap f -tree_encoding nested -compress_rules f -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_query.spec -epsilon 0.1 -delta_rel 0.05 -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_num_resp_mult.spec +spec_fn smlp_toy_num_resp_mult_beta_verify.spec specs_path ../specs -Running test 104 test type: verify, description: assertion verfication test with wrong spec that does not assign a single value using a singleton grid or range with equal max and min -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test104 -mode verify -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -spec ../specs/smlp_toy_num_resp_mult.spec -asrt_names asrt_y1,asrt_y2 -asrt_expr "y1*2+x<=5 and y1<=10;-2*y2-1<10-p2" -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 107 test type: verify, description: test for verification mode to check that eta contraints are not contradictory and as otherwise verification problem is not well defined +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test107 -mode verify -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -spec ../specs/smlp_toy_num_resp_mult_beta_verify.spec -asrt_names asrt_y1,asrt_y2 -asrt_expr "y1*2+x<=5 and y1<=10;-2*y2-1<10-p2" -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_num_resp_mult_cannot_synthesize.spec +spec_fn smlp_toy_basic.spec specs_path ../specs -Running test 109 test type: synthesize, description: basic test for mode synthesize where synthesis fails -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test109 -mode synthesize -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -tree_encoding nested -compress_rules f -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_cannot_synthesize.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 113 test type: optimize, description: smlp toy basic test for mode optimize from SMLP manual +smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test113 -mode optimize -pareto t -opt_strategy lazy -resp y1,y2 -feat x1,x2,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -mrmr_pred 0 -epsilon 0.05 -delta_rel 0.01 -save_model t -model_name test113_model -save_model_config t -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec ../specs/smlp_toy_basic.spec spec_fn smlp_toy_system_stable_constant_synth_fail.spec specs_path ../specs -Running test 122 test type: optimize, description: optimization test with constant knob and no inputs where synthesis is not feasible because the assertion is not feasible but beta constraint is feasible therefore optimization is performed -smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test122 -mode optimize -pareto f -opt_strategy lazy -model system -resp y1,y2 -feat p1,p2 -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_constant_synth_fail.spec -epsilon 0.00000001 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 120 test type: synthesize, description: synthesis test with constant knob and no inputs where synthesis is not feasible because the assertion is not feasible +smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test120 -mode synthesize -model system -resp y1,y2 -feat p1,p2 -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_constant_synth_fail.spec -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_system_stable_verify.spec +spec_fn smlp_toy_system_stable_constant_synth_feasible.spec specs_path ../specs -Running test 140 test type: verify, description: verification example with knobs only and fictitious inputs that have no effect where proparty is valid without stability and fails with stability -smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test140 -mode verify -model system -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_verify.spec -trace_prec 1 -trace_anonym t -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -Running test 5 test type: prediction, description: basic dt_caret prediction test on labeled and new data with numeric labels -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test5 -mode predict -resp y1 -feat x,p1,p2 -model dt_caret -save_model t -use_model f -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" +Running test 125 test type: optsyn, description: optimized synthesis test with constant knob and no inputs where synthesis is feasible and optimization is performed +smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test125 -mode optsyn -pareto t -opt_strategy lazy -model system -resp y1,y2 -feat p1,p2 -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_constant_synth_feasible.spec -epsilon 0.00000001 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -Running test 15 test type: prediction, description: basic dt_caret prediction test from saved model on new data with numeric labels -smlp -model_name "../models/Test5_smlp_toy_num_resp_mult" -out_dir ./ -pref Test15 -mode predict -resp y1 -feat x,p1,p2 -model dt_caret -save_model f -use_model t -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" +spec_fn smlp_toy_system.spec +specs_path ../specs +Running test 146 test type: optimize, description: optimization test with constant knob and no inputs where synthesis is feasible and optimization is performed +smlp -out_dir ./ -pref Test146 -mode optimize -pareto t -opt_strategy lazy -model poly_sklearn -resp y1,y2 -feat p1,p2,x1,x2 -save_model t -use_model f -mrmr_pred 0 -model_per_response t -split 1 -spec ../specs/smlp_toy_system.spec -doe_spec ../grids/explore_doe_two_levels.csv -doe_algo latin_hypercube -epsilon 0.99999999 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -Running test 23 test type: prediction, description: basic dt_sklearn prediction test on labeled and new data with numeric labels and saving model using name specified through model_name option - adapts Test6 -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test23 -mode predict -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -save_model t -use_model f -model_name test24_model -model_per_response t -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" +Running test 152 test type: prediction, description: tests the huber loss function Huber and sample weightsRunning test 8 test type: prediction, description: basic nn_keras prediction test on labeled and new data with numeric labels and two responses +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test8 -mode predict -resp y1,y2 -feat x,p1,p2 -model nn_keras -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -nn_keras_epochs 20 -nn_keras_seq_api f -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" -Running test 32 test type: unknown, description: test reusing saved model by using configuration file -smlp -model_name "../models/test20_model" -out_dir ./ -pref Test32 -config ../models/test20_model_rerun_model_config.json -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" +Running test 14 test type: train, description: EV-SI real life poly_sklearn prediction test on labeled and new data with numeric labels +smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test14 -mode train -resp y1,y2 -feat x1,x2,p1,p2 -model poly_sklearn -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -Running test 38 test type: doe, description: doe test with four levels with box_wilson -smlp -doe_spec "../grids/doe_two_levels.csv" -out_dir ./ -pref Test38 -mode doe -doe_algo box_wilson -doe_cc_face ccc -doe_cc_alpha r -doe_cc_center 2,3 -log_time f +Running test 21 test type: prediction, description: test for illegal symbols in column names +smlp -data "../data/smlp_toy_num_metasymbol_mult_reg.csv" -out_dir ./ -pref Test21 -mode predict -resp "PF ,|PF |" -model poly_sklearn -save_model t -use_model f -model_name test22_model -pred_plots t -resp_plots t -data_scaler none -mrmr_pred 0 -plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_metasymbol_mult_reg_pred_labeled.csv" -Running test 46 test type: prediction, description: tests options -pos_val and -neg_val -smlp -data "../data/smlp_toy_pf_mult.csv" -out_dir ./ -pref Test46 -mode predict -resp "PF,PF1" -model poly_sklearn -save_model t -save_model_config f -use_model f -model_name test47_model -data_scaler none -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -pos_val fail -neg_val pass -new_dat "../data/smlp_toy_pf_mult.csv" +Running test 29 test type: subgroups, description: basic test for subgroup discovery for pass-fail responses +smlp -data "../data/smlp_toy_cls_metasymbol_colnames_mult.csv" -out_dir ./ -pref Test29 -mode subgroups -psg_dim 3 -psg_top 10 -resp "PF 1,PF#" -plots t -seed 10 -log_time f -Running test 55 test type: discretization, description: tests discretization options -smlp -data "../data/smlp_toy_mult_discr.csv" -out_dir ./ -pref Test55 -mode discretize -resp "PF,PF1" -discr_algo ranks -discr_bins 6 -discr_labels t -discr_type category -data_scaler none -mrmr_pred 0 -plots f -seed 10 -log_time f -pos_val fail -neg_val pass +Running test 37 test type: doe, description: doe test with four levels with box_behnken +smlp -doe_spec "../grids/doe_three_levels_real_nan.csv" -out_dir ./ -pref Test37 -mode doe -doe_algo box_behnken -log_time f -spec_fn smlp_toy_num_resp_noknobs_verify.spec -specs_path ../specs -Running test 68 test type: verify, description: basic dt_sklearn assertion verification test on data with one numeric response -smlp -model_name "../models/test67_model" -out_dir ./ -pref Test68 -mode verify -resp y1,y2 -feat x0,x1,x2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -model_per_response t -save_model f -use_model t -spec ../specs/smlp_toy_num_resp_noknobs_verify.spec -asrt_names asrt1,asrt2 -asrt_exprs "x0**2+y1>4.3;(y1+x2)/2<6" -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 45 test type: doe, description: doe test with four levels with fractional_factorial +smlp -doe_spec "../grids/doe_two_levels_real.csv" -out_dir ./ -pref Test45 -mode doe -doe_algo fractional_factorial -doe_resolution 5 -log_time f -spec_fn smlp_toy_num_resp_mult.spec +Running test 53 test type: discretization, description: tests discretization options +smlp -data "../data/smlp_toy_mult_discr.csv" -out_dir ./ -pref Test53 -mode discretize -resp "PF,PF1" -discr_algo ordinals -discr_bins 6 -discr_labels f -discr_type integer -data_scaler none -mrmr_pred 0 -plots f -seed 10 -log_time f -pos_val fail -neg_val pass + +spec_fn smlp_toy_num_resp_mult_y1_verify.spec specs_path ../specs -Running test 80 test type: optimize, description: basic dt_sklearn single objective optimization test with numeric labels and integer grid as domain and with scaling objectives -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test80 -mode optimize -pareto f -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -spec ../specs/smlp_toy_num_resp_mult.spec -data_scaler min_max -objv_names obj1 -objv_exprs "(y1+y2)/2" -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 64 test type: verify, description: basic dt_sklearn assertion verification test on data with one numeric response +smlp -model_name "../models/test63_model" -out_dir ./ -pref Test64 -mode verify -resp y1 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model f -use_model t -spec ../specs/smlp_toy_num_resp_mult_y1_verify.spec -asrt_names asrt1,asrt2 -asrt_exprs "x/2+y1>4.3;(y1+p2)/2<6" -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_num_resp_mult_alpha_asrt_verify.spec +Running test 77 test type: unknown, description: verification test run using model_rerun config covering the case when mrmr selcts only a subset of features specified through the command line or config file +smlp -model_name "../models/test76_model" -out_dir ./ -pref Test77 -config ../models/test76_model_rerun_model_config.json + +spec_fn smlp_toy_num_resp_mult.spec specs_path ../specs -Running test 87 test type: verify, description: tests global alpha constraints and assertions specified in spec file -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test87 -mode verify -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model t -mrmr_pred 2 -model_per_response f -spec ../specs/smlp_toy_num_resp_mult_alpha_asrt_verify.spec -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 86 test type: optimize, description: tests alpha +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test86 -mode optimize -pareto f -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -spec ../specs/smlp_toy_num_resp_mult.spec -data_scaler min_max -objv_names obj1,objv2 -objv_exprs "(y1+y2)/2;y1" -asrt_names asrt1,asrt2,asrt3 -asrt_exprs "(y2**3+p2)/2<6;y1>=9;y2<0" -alpha "p2<5 and x==10 and x<12" -eta "p1==4" -epsilon 0.05 -delta_rel 0.01 -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f spec_fn smlp_toy_num_resp_mult_optsyn.spec specs_path ../specs -Running test 96 test type: optsyn, description: basic test for rf_sklearn in model exploration mode optsyn -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test96 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model rf_caret -save_model f -use_model f -tree_encoding nested -compress_rules f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 94 test type: optsyn, description: basic test for rf_sklearn in model exploration mode optsyn +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test94 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model rf_sklearn -rf_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_basic.spec +spec_fn smlp_toy_num_resp_mult_witness.spec specs_path ../specs -Running test 114 test type: optimize, description: smlp toy basic test for mode optimize from SMLP manual without specifying resp and feat in command line -smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test114 -mode optimize -pareto t -opt_strategy lazy -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -mrmr_pred 0 -epsilon 0.05 -delta_rel 0.01 -save_model f -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec ../specs/smlp_toy_basic.spec +Running test 102 test type: certify, description: basic test in certify mode to test stability (theta) and guard (eta) constraint generation +smlp -model_name "../models/test101_model" -out_dir ./ -pref Test102 -mode certify -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model f -use_model t -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_witness.spec -quer_names query1,query2,query3 -quer_exprs "(y2**3+p2)/2<6;y1>=9;y2<20" -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_system_stable_constant_synth_fail.spec +spec_fn smlp_toy_num_resp_mult_stable_verify.spec specs_path ../specs -Running test 120 test type: synthesize, description: synthesis test with constant knob and no inputs where synthesis is not feasible because the assertion is not feasible -smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test120 -mode synthesize -model system -resp y1,y2 -feat p1,p2 -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_constant_synth_fail.spec -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 105 test type: verify, description: basic dt_sklearn assertion verfication test with numeric labels and integer grid as domain +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test105 -mode verify -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -spec ../specs/smlp_toy_num_resp_mult_stable_verify.spec -asrt_names asrt_y1,asrt_y2 -asrt_expr "y1*2+x<=5 and y1<=10;-2*y2-1<10-p2" -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_witness_certify.spec +Running test 112 test type: prediction, description: smlp toy basic test from SMLP manual +smlp -model_name "../models/test110_model" -out_dir ./ -pref Test112 -mode predict -resp y1,y2 -feat x1,x2,p1,p2 -model poly_sklearn -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -use_model t -save_model f -new_dat "../data/smlp_toy_basic_pred_unlabeled.csv" + +spec_fn smlp_toy_system_stable_constant_query.spec specs_path ../specs -Running test 128 test type: certify, description: Basic regression test in certify mode covering all four possible outcomes when certifying a witness for a query: the witness is stable -smlp -data "../data/smlp_toy_ctg_num_resp.csv" -out_dir ./ -pref Test128 -mode certify -resp y1,y2 -feat x,p1,p2 -model poly_sklearn -dt_sklearn_max_depth 15 -save_model f -use_model f -model_per_response f -spec ../specs/smlp_toy_witness_certify.spec -quer_names query_stable_witness,query_grid_conflict,query_unstable_witness,query_infeasible_witness,query_poly_intercept_sensitive -quer_exprs "y2<=90;y1>=9;y1>=(-13);y1>9;y1>=(-10)" -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 119 test type: query, description: query test with knobs only where query is satisfiable without stability and fails with stability +smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test119 -mode query -model system -resp y1,y2 -feat p1,p2 -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_constant_query.spec -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -Running test 149 test type: prediction, description: tests the mae loss function MeanAbsoluteError and sample weoghts -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test149 -mode predict -resp y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api f -nn_keras_loss mae -sw_coef 0.8 -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" +spec_fn smlp_toy_system_stable_verify.spec +specs_path ../specs +Running test 126 test type: verify, description: verification example with knobs only and fictitious inputs that have no effect where proparty is valid without stability and fails with stability +smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test126 -mode verify -model system -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_verify.spec -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_num_resp_mult_verify.spec +spec_fn smlp_toy_num_resp_mult_optsyn.spec specs_path ../specs -Running test 156 test type: verify, description: basic nn_keras assertion verification test that uses keras tuner for functional model training; adapts test 154 by consdering multiple responses -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test156 -mode verify -resp y1,y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api f -nn_keras_tuner hyperband -nn_keras_layers_grid "2,2;3" -save_model_config f -spec ../specs/smlp_toy_num_resp_mult_verify.spec -asrt_names asrt1 -asrt_exprs "2*y2>1" -sw_coef 4 -sw_exp 5 -sw_int 0.5 -nn_keras_metrics rmse -Running test 4 test type: prediction, description: basic nn_keras prediction test on labeled and new data with numeric labels and one response -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test4 -mode predict -resp y2 -feat x,p1,p2 -model nn_keras -nn_keras_weights_precision 2 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" +Running test 142 test type: optsyn, description: basic test for compress_rules option for rf_sklearn in optsin mode +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test142 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model rf_sklearn -rf_sklearn_max_depth 15 -tree_encoding nested -compress_rules t -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -Running test 13 test type: train, description: EV-SI real life nn_keras prediction test on labeled and new data with numeric labels -smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test13 -mode train -resp y1,y2 -feat x1,x2,p1,p2 -model nn_keras -nn_keras_epochs 20 -nn_keras_seq_api f -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 153 test type: prediction, description: tests the logcosh loss function LogCosh and sample weights +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test153 -mode predict -resp y1,y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api t -nn_keras_loss logcosh -sw_coef 4 -sw_exp 5 -sw_int 0.5 -nn_keras_metrics mse -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" +Running test 6 test type: prediction, description: basic dt_sklearn prediction test on labeled and new data with numeric labels +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test6 -mode predict -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" -Running test 22 test type: prediction, description: test for illegal symbols in column names -smlp -model_name "../models/test22_model" -out_dir ./ -pref Test22 -mode predict -resp "PF ,|PF |" -model poly_sklearn -save_model f -use_model t -pred_plots t -resp_plots t -data_scaler none -mrmr_pred 0 -plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_metasymbol_mult_reg_pred_labeled.csv" +Running test 10 test type: prediction, description: basic et_sklearn prediction test on labeled and new data with numeric labels +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test10 -mode predict -resp y1,y2 -feat x,p1,p2 -model et_sklearn -et_sklearn_max_depth 15 -et_sklearn_bootstrap f -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" + +Running test 18 test type: prediction, description: basic dt_sklearn prediction test on labeled and new data with numeric labels and saving model using name specified through model_name option - adapts Test6 +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test18 -mode predict -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -save_model t -use_model f -model_name test19_model -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" + +Running test 26 test type: prediction, description: basic dt_sklearn prediction test using a model saved under a name specified through model_name option on new data with numeric labels +smlp -model_name "../models/test26_model" -out_dir ./ -pref Test26 -mode predict -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -save_model f -use_model t -mrmr_pred 2 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" Running test 33 test type: unknown, description: testing -config option with subgroups mode smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test33 -config ../models/Test31_smlp_toy_num_resp_mult_args_config.json @@ -286,260 +297,250 @@ specs_path ../specs Running test 69 test type: verify, description: nn_keras verification test with model_per_response training smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test69 -mode verify -resp y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -save_model t -use_model f -model_name test69_model -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_y2_verify.spec -asrt_names asrt1 -asrt_exprs "(y2**3+p2)/2<6" -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api f -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat -spec_fn smlp_toy_num_resp_mult_free_inps_beta_objv.spec +spec_fn smlp_toy_num_resp_mult_alpha_asrt_verify.spec specs_path ../specs -Running test 88 test type: optimize, description: basic dt_sklearn multi objective pareto optimization test with beta and objectives specified in spec file -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test88 -mode optimize -pareto t -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -spec ../specs/smlp_toy_num_resp_mult_free_inps_beta_objv.spec -data_scaler min_max -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 87 test type: verify, description: tests global alpha constraints and assertions specified in spec file +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test87 -mode verify -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model t -mrmr_pred 2 -model_per_response f -spec ../specs/smlp_toy_num_resp_mult_alpha_asrt_verify.spec -plots f -pred_plots f -resp_plots f -seed 10 -log_time f spec_fn smlp_toy_num_resp_mult_optsyn.spec specs_path ../specs -Running test 94 test type: optsyn, description: basic test for rf_sklearn in model exploration mode optsyn -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test94 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model rf_sklearn -rf_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f - -spec_fn smlp_toy_num_resp_mult_certify_witness.spec -specs_path ../specs -Running test 103 test type: certify, description: -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test103 -mode certify -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model t -use_model f -model_name test103_model -model_per_response f -spec ../specs/smlp_toy_num_resp_mult_certify_witness.spec -quer_names valid_candidate,grid_conflict,range_conflict -quer_exprs "True;True;True" -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 96 test type: optsyn, description: basic test for rf_sklearn in model exploration mode optsyn +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test96 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model rf_caret -save_model f -use_model f -tree_encoding nested -compress_rules f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -Running test 110 test type: prediction, description: smlp toy basic example for predict mode from SMLP user manual -smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test110 -mode predict -resp y1,y2 -feat x1,x2,p1,p2 -model poly_sklearn -save_model t -model_name test110_model -save_model_config t -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_basic_pred_unlabeled.csv" +Running test 111 test type: unknown, description: smlp toy basic test to rerun saved model using the model rerun config file saved during model training +smlp -model_name "../models/test110_model" -out_dir ./ -pref Test111 -config ../models/test110_model_rerun_model_config.json -new_dat "../data/smlp_toy_basic_pred_unlabeled.csv" -spec_fn smlp_toy_system.spec +spec_fn smlp_toy_system_stable_constant_verify.spec specs_path ../specs -Running test 116 test type: certify, description: basic test in certify mode when system is specified and is used as the model; p2 rel-rad needs to be 0 or very close to it the witness to first query to be stable -smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test116 -mode certify -resp y1,y2 -feat x1,x2,p1,p2 -model system -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_system.spec -quer_names query1,query2 -quer_exprs "y1>0;y2<=0" -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 118 test type: verify, description: verification test with knobs only where assertion is valid without stability and fails with stability +smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test118 -mode verify -model system -resp y1,y2 -feat p1,p2 -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_constant_verify.spec -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_system_stable_constant_synth_feasible.spec +spec_fn smlp_toy_system_stable_constant_synth_fail.spec specs_path ../specs -Running test 125 test type: optsyn, description: optimized synthesis test with constant knob and no inputs where synthesis is feasible and optimization is performed -smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test125 -mode optsyn -pareto t -opt_strategy lazy -model system -resp y1,y2 -feat p1,p2 -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_constant_synth_feasible.spec -epsilon 0.00000001 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 124 test type: optsyn, description: optimized synthesis test with constant knob and no inputs where synthesis is not feasible because while beta constraint is feasible the assertion is not feasible therefore optimization is not performed +smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test124 -mode optsyn -pareto f -opt_strategy lazy -model system -resp y1,y2 -feat p1,p2 -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_constant_synth_fail.spec -epsilon 0.00000001 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_system.spec +spec_fn smlp_toy_num_resp_mult.spec specs_path ../specs -Running test 146 test type: optimize, description: optimization test with constant knob and no inputs where synthesis is feasible and optimization is performed -smlp -out_dir ./ -pref Test146 -mode optimize -pareto t -opt_strategy lazy -model poly_sklearn -resp y1,y2 -feat p1,p2,x1,x2 -save_model t -use_model f -mrmr_pred 0 -model_per_response t -split 1 -spec ../specs/smlp_toy_system.spec -doe_spec ../grids/explore_doe_two_levels.csv -doe_algo latin_hypercube -epsilon 0.99999999 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 141 test type: optimize, description: basic test for compress_rules option for dt_sklearn in optimization mode +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test141 -mode optimize -opt_strategy lazy -pareto f -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules t -spec ../specs/smlp_toy_num_resp_mult.spec -objv_names objv_y1,objv_y2 -objv_exprs "y1;y2" -epsilon 0.01 -delta_rel 0.01 -data_scaler none -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -Running test 152 test type: prediction, description: tests the huber loss function Huber and sample weights -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test152 -mode predict -resp y1,y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api f -nn_keras_loss huber -sw_coef 8 -sw_exp 5 -sw_int 0.5 -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" +Running test 149 test type: prediction, description: tests the mae loss function MeanAbsoluteError and sample weoghts +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test149 -mode predict -resp y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api f -nn_keras_loss mae -sw_coef 0.8 -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" -Running test 159 test type: prediction, description: tests the msle loss function and sample weights with model_per_response t -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test159 -mode predict -resp y1,y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api t -nn_keras_loss msle -model_per_response t -sw_coef 4 -sw_exp 5 -sw_int 0.5 -nn_keras_metrics mae,cosine -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" +spec_fn smlp_toy_num_resp_mult_y2_verify.spec +specs_path ../specs +Running test 155 test type: verify, description: basic nn_keras assertion verification test that uses keras tuner with sequrntial models for model training +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test155 -mode verify -resp y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api t -nn_keras_tuner hyperband -nn_keras_layers_grid "2,2;3,3,3" -save_model_config f -spec ../specs/smlp_toy_num_resp_mult_y2_verify.spec -asrt_names asrt1 -asrt_exprs "2*y2>1" -sw_coef 4 -sw_exp 5 -sw_int 0.5 -nn_keras_metrics mae Running test 1 test type: train, description: basic dt_caret training and test on labeled data with single numeric response smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test1 -mode train -resp y1 -feat x,p1,p2 -model dt_caret -save_model_config f -mrmr_pred 0 -plots f -seed 10 -log_time f Running test 19 test type: prediction, description: basic dt_sklearn prediction test using a model saved under a name specified through model_name option on new data with numeric labels smlp -model_name "../models/test19_model" -out_dir ./ -pref Test19 -mode predict -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -save_model f -use_model t -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" -Running test 24 test type: prediction, description: basic dt_sklearn prediction test using a model saved under a name specified through model_name option on new data with numeric labels -smlp -model_name "../models/test24_model" -out_dir ./ -pref Test24 -mode predict -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -save_model f -use_model t -model_per_response t -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" +Running test 25 test type: prediction, description: basic dt_sklearn prediction test on labeled and new data with numeric labels and saving model using name specified through model_name option - adapts Test6 +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test25 -mode predict -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -save_model t -use_model f -model_name test26_model -mrmr_pred 2 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" -Running test 31 test type: subgroups, description: testing resp2b in subgroup discovery mode -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test31 -mode subgroups -psg_dim 3 -psg_top 10 -resp y1,y2 -resp2b "y1<6;y2>6" -feat x,p1,p2 -plots t -seed 10 -log_time f -save_config t +Running test 36 test type: doe, description: doe test with four levels with sukharev_grid +smlp -doe_spec "../grids/doe_four_levels_real.csv" -out_dir ./ -pref Test36 -mode doe -doe_algo sukharev_grid -doe_samples 125 -log_time f -Running test 35 test type: doe, description: doe test with four levels with plackett_burman -smlp -doe_spec "../grids/doe_four_levels_real.csv" -out_dir ./ -pref Test35 -mode doe -doe_algo plackett_burman -log_time f +Running test 44 test type: doe, description: doe test with four levels with uniform_random_matrix +smlp -doe_spec "../grids/doe_two_levels.csv" -out_dir ./ -pref Test44 -mode doe -doe_algo uniform_random_matrix -doe_samples 20 -log_time f -Running test 43 test type: doe, description: doe test with four levels with halton_sequence -smlp -doe_spec "../grids/doe_two_levels.csv" -out_dir ./ -pref Test43 -mode doe -doe_algo halton_sequence -doe_samples 20 -log_time f +Running test 52 test type: discretization, description: tests discretization options +smlp -data "../data/smlp_toy_mult_discr.csv" -out_dir ./ -pref Test52 -mode discretize -resp "PF,PF1" -discr_algo jenks -discr_bins 6 -discr_labels t -discr_type ordered -data_scaler none -mrmr_pred 0 -plots f -seed 10 -log_time f -pos_val fail -neg_val pass -Running test 51 test type: discretization, description: tests discretization options -smlp -data "../data/smlp_toy_mult_discr.csv" -out_dir ./ -pref Test51 -mode discretize -resp "PF,PF1" -discr_algo jenks -discr_bins 6 -discr_labels f -discr_type integer -data_scaler none -mrmr_pred 0 -plots f -seed 10 -log_time f -pos_val fail -neg_val pass +spec_fn smlp_toy_num_resp_mult_y1_verify.spec +specs_path ../specs +Running test 63 test type: verify, description: basic dt_sklearn assertion verification test on data with numeric labels +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test63 -mode verify -resp y1 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model t -use_model f -model_name test63_model -spec ../specs/smlp_toy_num_resp_mult_y1_verify.spec -asrt_names asrt1,asrt2 -asrt_exprs "x/2+y1>4.3;(y1+p2)/2<6" -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_num_resp_mult_y2_verify.spec +spec_fn smlp_toy_num_resp_noknobs_verify.spec specs_path ../specs -Running test 59 test type: verify, description: basic nn_keras assertion verification test for functional nn_keras model -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test59 -mode verify -resp y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api f -save_model_config f -spec ../specs/smlp_toy_num_resp_mult_y2_verify.spec -asrt_names asrt1 -asrt_exprs "2*y2>1" -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat +Running test 72 test type: verify, description: nn_keras verification test with re-using saved model_per_response trained model +smlp -model_name "../models/test71_model" -out_dir ./ -pref Test72 -mode verify -resp y1,y2 -feat x0,x1,x2 -model nn_keras -nnet_encoding nested -save_model f -use_model t -model_per_response t -spec ../specs/smlp_toy_num_resp_noknobs_verify.spec -asrt_names asrt1 -asrt_exprs "(y2**3+x2)/2<6" -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api f -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat -spec_fn smlp_toy_num_resp_mult_free_inps.spec +spec_fn smlp_toy_num_resp_mult.spec specs_path ../specs -Running test 81 test type: optimize, description: basic dt_sklearn single objective optimization test with numeric labels and integer grid as domain and with scaling objectives -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test81 -mode optimize -pareto f -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -spec ../specs/smlp_toy_num_resp_mult_free_inps.spec -data_scaler min_max -objv_names obj1 -objv_exprs "(y1+y2)/2" -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat +Running test 85 test type: optimize, description: tests alpha and eta constraints specified in command line in optimization mode +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test85 -mode optimize -pareto f -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -spec ../specs/smlp_toy_num_resp_mult.spec -data_scaler min_max -objv_names obj1,objv2 -objv_exprs "(y1+y2)/2;y1" -alpha "p2<5 and x==10 and x<12" -eta "p1==4" -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_num_resp_mult_query.spec +spec_fn smlp_toy_num_resp_mult_optsyn.spec specs_path ../specs -Running test 89 test type: query, description: basic test in query mode to test stability (theta) and guard (eta) constraint generation -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test89 -mode query -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_query.spec -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 93 test type: optsyn, description: basic test for mode optsyn +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test93 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_num_resp_mult_query.spec +spec_fn smlp_toy_num_resp_mult_witness.spec specs_path ../specs -Running test 97 test type: query, description: basic test for rf_sklearn in model exploration mode optsyn -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test97 -mode query -resp y1,y2 -feat x,p1,p2 -model et_sklearn -et_sklearn_bootstrap f -tree_encoding nested -compress_rules f -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_query.spec -epsilon 0.1 -delta_rel 0.05 -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 101 test type: certify, description: basic test in certify mode to test stability (theta) and guard (eta) constraint generation +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test101 -mode certify -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model t -use_model f -model_name test101_model -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_witness.spec -quer_names query1,query2,query3 -quer_exprs "(y2**3+p2)/2<6;y1>=9;y2<20" -plots f -pred_plots f -resp_plots f -seed 10 -log_time f spec_fn smlp_toy_num_resp_mult_synthesize.spec specs_path ../specs Running test 108 test type: synthesize, description: basic test for dt_sklearn in model exploration mode synthesize where synthesis succeeds smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test108 -mode synthesize -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -tree_encoding nested -compress_rules f -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_synthesize.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_system_stable_constant_synth_feasible.spec +spec_fn smlp_toy_system.spec specs_path ../specs -Running test 121 test type: synthesize, description: synthesis test with constant knob and no inputs where synthesis is feasible -smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test121 -mode synthesize -model system -resp y1,y2 -feat p1,p2 -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_constant_synth_feasible.spec -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 116 test type: certify, description: basic test in certify mode when system is specified and is used as the model; p2 rel-rad needs to be 0 or very close to it the witness to first query to be stable +smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test116 -mode certify -resp y1,y2 -feat x1,x2,p1,p2 -model system -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_system.spec -quer_names query1,query2 -quer_exprs "y1>0;y2<=0" -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_configuration_verify.spec +spec_fn smlp_toy_witness_certify.spec specs_path ../specs -Running test 129 test type: verify, description: verification example with demonstrating all basic result scenarious for assertions -smlp -data "../data/smlp_toy_ctg_num_resp.csv" -out_dir ./ -pref Test129 -mode verify -resp y1,y2 -feat x,p1,p2 -model poly_sklearn -save_model f -use_model f -model_per_response f -spec ../specs/smlp_toy_configuration_verify.spec -asrt_names assert_stable_config,assert_grid_conflict,assert_unstable_config,assert_infeasible -asrt_exprs "y2<=90;y1>=9;y1>=(-10);y1>20" -plots f -pred_plots f -resp_plots f -seed 10 -log_time f - -Running test 150 test type: prediction, description: tests the mape loss function MeanAbsolutePercentageError and sample weights -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test150 -mode predict -resp y1,y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api f -nn_keras_loss mape -sw_coef 0.8 -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" +Running test 128 test type: certify, description: Basic regression test in certify mode covering all four possible outcomes when certifying a witness for a query: the witness is stable +smlp -data "../data/smlp_toy_ctg_num_resp.csv" -out_dir ./ -pref Test128 -mode certify -resp y1,y2 -feat x,p1,p2 -model poly_sklearn -dt_sklearn_max_depth 15 -save_model f -use_model f -model_per_response f -spec ../specs/smlp_toy_witness_certify.spec -quer_names query_stable_witness,query_grid_conflict,query_unstable_witness,query_infeasible_witness,query_poly_intercept_sensitive -quer_exprs "y2<=90;y1>=9;y1>=(-13);y1>9;y1>=(-10)" -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -Running test 158 test type: prediction, description: tests the mape loss function and sample weights with model_per_response t -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test158 -mode predict -resp y1,y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api f -nn_keras_loss mape -model_per_response t -sw_coef 8 -sw_exp 5 -sw_int 0.5 -nn_keras_metrics rmse -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" +Running test 148 test type: prediction, description: checks nn_keras prediction with sw_coef 0.8 and sequential API +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test148 -mode predict -resp y1,y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api t -sw_coef 0.8 -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" -spec_fn smlp_toy_num_resp_mult_optsyn.spec +spec_fn smlp_toy_num_resp_mult_verify.spec specs_path ../specs -Running test 166 test type: optsyn, description: basic flat tree encoding test with model_per_response f for rf_sklearn in model exploration mode optsyn -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test166 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model rf_sklearn -rf_sklearn_max_depth 4 -rf_sklearn_n_estimators 3 -tree_encoding flat -compress_rules t -save_model f -use_model f -compress_rules t -mrmr_pred 2 -model_per_response f -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -Running test 8 test type: prediction, description: basic nn_keras prediction test on labeled and new data with numeric labels and two responses -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test8 -mode predict -resp y1,y2 -feat x,p1,p2 -model nn_keras -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -nn_keras_epochs 20 -nn_keras_seq_api f -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" +Running test 156 test type: verify, description: basic nn_keras assertion verification test that uses keras tuner for functional model training; adapts test 154 by consdering multiple responses +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test156 -mode verify -resp y1,y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api f -nn_keras_tuner hyperband -nn_keras_layers_grid "2,2;3" -save_model_config f -spec ../specs/smlp_toy_num_resp_mult_verify.spec -asrt_names asrt1 -asrt_exprs "2*y2>1" -sw_coef 4 -sw_exp 5 -sw_int 0.5 -nn_keras_metrics rmse +Running test 5 test type: prediction, description: basic dt_caret prediction test on labeled and new data with numeric labels +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test5 -mode predict -resp y1 -feat x,p1,p2 -model dt_caret -save_model t -use_model f -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" -Running test 14 test type: train, description: EV-SI real life poly_sklearn prediction test on labeled and new data with numeric labels -smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test14 -mode train -resp y1,y2 -feat x1,x2,p1,p2 -model poly_sklearn -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 15 test type: prediction, description: basic dt_caret prediction test from saved model on new data with numeric labels +smlp -model_name "../models/Test5_smlp_toy_num_resp_mult" -out_dir ./ -pref Test15 -mode predict -resp y1 -feat x,p1,p2 -model dt_caret -save_model f -use_model t -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" -Running test 21 test type: prediction, description: test for illegal symbols in column names -smlp -data "../data/smlp_toy_num_metasymbol_mult_reg.csv" -out_dir ./ -pref Test21 -mode predict -resp "PF ,|PF |" -model poly_sklearn -save_model t -use_model f -model_name test22_model -pred_plots t -resp_plots t -data_scaler none -mrmr_pred 0 -plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_metasymbol_mult_reg_pred_labeled.csv" +Running test 22 test type: prediction, description: test for illegal symbols in column names +smlp -model_name "../models/test22_model" -out_dir ./ -pref Test22 -mode predict -resp "PF ,|PF |" -model poly_sklearn -save_model f -use_model t -pred_plots t -resp_plots t -data_scaler none -mrmr_pred 0 -plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_metasymbol_mult_reg_pred_labeled.csv" -Running test 29 test type: subgroups, description: basic test for subgroup discovery for pass-fail responses -smlp -data "../data/smlp_toy_cls_metasymbol_colnames_mult.csv" -out_dir ./ -pref Test29 -mode subgroups -psg_dim 3 -psg_top 10 -resp "PF 1,PF#" -plots t -seed 10 -log_time f +Running test 30 test type: subgroups, description: basic test for subgroup discovery for numric responses +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test30 -mode subgroups -psg_dim 3 -psg_top 10 -resp y1,y2 -feat x,p1,p2 -plots t -seed 10 -log_time f -Running test 36 test type: doe, description: doe test with four levels with sukharev_grid -smlp -doe_spec "../grids/doe_four_levels_real.csv" -out_dir ./ -pref Test36 -mode doe -doe_algo sukharev_grid -doe_samples 125 -log_time f +Running test 38 test type: doe, description: doe test with four levels with box_wilson +smlp -doe_spec "../grids/doe_two_levels.csv" -out_dir ./ -pref Test38 -mode doe -doe_algo box_wilson -doe_cc_face ccc -doe_cc_alpha r -doe_cc_center 2,3 -log_time f -Running test 44 test type: doe, description: doe test with four levels with uniform_random_matrix -smlp -doe_spec "../grids/doe_two_levels.csv" -out_dir ./ -pref Test44 -mode doe -doe_algo uniform_random_matrix -doe_samples 20 -log_time f +Running test 46 test type: prediction, description: tests options -pos_val and -neg_val +smlp -data "../data/smlp_toy_pf_mult.csv" -out_dir ./ -pref Test46 -mode predict -resp "PF,PF1" -model poly_sklearn -save_model t -save_model_config f -use_model f -model_name test47_model -data_scaler none -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -pos_val fail -neg_val pass -new_dat "../data/smlp_toy_pf_mult.csv" -Running test 52 test type: discretization, description: tests discretization options -smlp -data "../data/smlp_toy_mult_discr.csv" -out_dir ./ -pref Test52 -mode discretize -resp "PF,PF1" -discr_algo jenks -discr_bins 6 -discr_labels t -discr_type ordered -data_scaler none -mrmr_pred 0 -plots f -seed 10 -log_time f -pos_val fail -neg_val pass +Running test 54 test type: discretization, description: tests discretization options +smlp -data "../data/smlp_toy_mult_discr.csv" -out_dir ./ -pref Test54 -mode discretize -resp "PF,PF1" -discr_algo ordinals -discr_bins 6 -discr_labels t -discr_type object -data_scaler none -mrmr_pred 0 -plots f -seed 10 -log_time f -pos_val fail -neg_val pass -spec_fn smlp_toy_num_resp_mult_y1_verify.spec +spec_fn smlp_toy_num_resp_noknobs_verify.spec specs_path ../specs -Running test 64 test type: verify, description: basic dt_sklearn assertion verification test on data with one numeric response -smlp -model_name "../models/test63_model" -out_dir ./ -pref Test64 -mode verify -resp y1 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model f -use_model t -spec ../specs/smlp_toy_num_resp_mult_y1_verify.spec -asrt_names asrt1,asrt2 -asrt_exprs "x/2+y1>4.3;(y1+p2)/2<6" -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f - -Running test 77 test type: unknown, description: verification test run using model_rerun config covering the case when mrmr selcts only a subset of features specified through the command line or config file -smlp -model_name "../models/test76_model" -out_dir ./ -pref Test77 -config ../models/test76_model_rerun_model_config.json +Running test 66 test type: verify, description: basic dt_sklearn assertion verification test on data with one numeric response +smlp -model_name "../models/test65_model" -out_dir ./ -pref Test66 -mode verify -resp y1,y2 -feat x0,x1,x2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model f -use_model t -spec ../specs/smlp_toy_num_resp_noknobs_verify.spec -asrt_names asrt1,asrt2 -asrt_exprs "x0**2+y1>4.3;(y1+x2)/2<6" -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f spec_fn smlp_toy_num_resp_mult.spec specs_path ../specs -Running test 86 test type: optimize, description: tests alpha -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test86 -mode optimize -pareto f -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -spec ../specs/smlp_toy_num_resp_mult.spec -data_scaler min_max -objv_names obj1,objv2 -objv_exprs "(y1+y2)/2;y1" -asrt_names asrt1,asrt2,asrt3 -asrt_exprs "(y2**3+p2)/2<6;y1>=9;y2<0" -alpha "p2<5 and x==10 and x<12" -eta "p1==4" -epsilon 0.05 -delta_rel 0.01 -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f - -spec_fn smlp_toy_num_resp_mult_optsyn.spec -specs_path ../specs -Running test 95 test type: optsyn, description: basic test for dt_caret in model exploration mode optsyn -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test95 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_caret -save_model f -use_model f -tree_encoding nested -compress_rules f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 79 test type: query, description: basic test in query mode to test stability (theta) and guard (eta) constraint generation +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test79 -mode query -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult.spec -quer_names query1,query2,query3 -quer_exprs "(y2**3+p2)/2<6;y1>=9;y2<0" -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_num_resp_mult_unsat_eta_verify.spec +spec_fn smlp_toy_num_resp_mult_query_vacuous.spec specs_path ../specs -Running test 106 test type: verify, description: test for verification mode to check that eta contraints are not contradictory and as otherwise verification problem is not well defined -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test106 -mode verify -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -spec ../specs/smlp_toy_num_resp_mult_unsat_eta_verify.spec -asrt_names asrt_y1,asrt_y2 -asrt_expr "y1*2+x<=5 and y1<=10;-2*y2-1<10-p2" -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 91 test type: query, description: test to detect contradictory constraints in optimization mode due to contradictory alpha global and alpha bounds constraints on FMAX_xyx +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test91 -mode query -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_query_vacuous.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_basic.spec +spec_fn smlp_toy_num_resp_mult_free_inps_beta_objv.spec specs_path ../specs -Running test 113 test type: optimize, description: smlp toy basic test for mode optimize from SMLP manual -smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test113 -mode optimize -pareto t -opt_strategy lazy -resp y1,y2 -feat x1,x2,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -mrmr_pred 0 -epsilon 0.05 -delta_rel 0.01 -save_model t -model_name test113_model -save_model_config t -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec ../specs/smlp_toy_basic.spec +Running test 100 test type: optimize, description: basic test for sat_threshold option enabing usage of objectve values in SAT assignments that prove optimization thresholds +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test100 -mode optimize -pareto t -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -spec ../specs/smlp_toy_num_resp_mult_free_inps_beta_objv.spec -data_scaler min_max -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_system_stable_constant_query.spec +spec_fn smlp_toy_num_resp_mult.spec specs_path ../specs -Running test 119 test type: query, description: query test with knobs only where query is satisfiable without stability and fails with stability -smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test119 -mode query -model system -resp y1,y2 -feat p1,p2 -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_constant_query.spec -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 104 test type: verify, description: assertion verfication test with wrong spec that does not assign a single value using a singleton grid or range with equal max and min +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test104 -mode verify -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -spec ../specs/smlp_toy_num_resp_mult.spec -asrt_names asrt_y1,asrt_y2 -asrt_expr "y1*2+x<=5 and y1<=10;-2*y2-1<10-p2" -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_system_stable_certify.spec +spec_fn smlp_toy_num_resp_mult_cannot_synthesize.spec specs_path ../specs -Running test 127 test type: certify, description: certification example with knobs only and fictitious inputs with values fixed through their ranges -smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test127 -mode certify -model system -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_certify.spec -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 109 test type: synthesize, description: basic test for mode synthesize where synthesis fails +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test109 -mode synthesize -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -tree_encoding nested -compress_rules f -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_cannot_synthesize.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_num_resp_mult_query.spec +spec_fn smlp_toy_system_stable_constant_synth_feasible.spec specs_path ../specs -Running test 143 test type: query, description: basic test for compress_rules for et_sklearn in mode query -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test143 -mode query -resp y1,y2 -feat x,p1,p2 -model et_sklearn -et_sklearn_bootstrap f -tree_encoding nested -compress_rules t -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_query.spec -epsilon 0.1 -delta_rel 0.05 -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat -plots f -pred_plots f -resp_plots f -seed 10 -log_time f - -Running test 160 test type: prediction, description: tests nn keras tuner bayesian -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test160 -mode predict -resp y1,y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api f -nn_keras_loss mape -nn_keras_metrics msle -nn_keras_tuner bayesian -nn_keras_layers_grid "2,3" -nn_keras_losses_grid "mse,mae,huber" -model_per_response f -sw_coef 8 -sw_exp 5 -sw_int 0.5 -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" +Running test 121 test type: synthesize, description: synthesis test with constant knob and no inputs where synthesis is feasible +smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test121 -mode synthesize -model system -resp y1,y2 -feat p1,p2 -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_constant_synth_feasible.spec -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_num_resp_mult_optsyn.spec -spec_fn smlp_toy_num_resp_mult_optsyn.spec +spec_fn smlp_toy_configuration_verify.spec specs_path ../specs -Running test 170 test type: optimize, description: basic test for et_sklearn with flat tree_encoding and model_per_response f in model exploration mode optimize -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test170 -mode optimize -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model et_sklearn -et_sklearn_max_depth 2 -rf_sklearn_n_estimators 3 -et_sklearn_bootstrap f -tree_encoding flat -model_per_response f -compress_rules t -save_model f -use_model f -mrmr_pred 2 -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 129 test type: verify, description: verification example with demonstrating all basic result scenarious for assertions +smlp -data "../data/smlp_toy_ctg_num_resp.csv" -out_dir ./ -pref Test129 -mode verify -resp y1,y2 -feat x,p1,p2 -model poly_sklearn -save_model f -use_model f -model_per_response f -spec ../specs/smlp_toy_configuration_verify.spec -asrt_names assert_stable_config,assert_grid_conflict,assert_unstable_config,assert_infeasible -asrt_exprs "y2<=90;y1>=9;y1>=(-10);y1>20" -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_num_resp_mult_optsyn.spec -specs_path ../specs -Running test 174 test type: optsyn, description: basic layered nn_keras encoding test with model_per_response f nn_keras_seq_api f for nn_keras in model exploration mode optsyn -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test174 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model nn_keras -nn_keras_epochs 20 -nn_keras_seq_api f -nnet_encoding layered -save_model f -use_model f -mrmr_pred 2 -model_per_response f -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 151 test type: prediction, description: tests msle loss function MeanSquaredLogarithmicError and and sample weoghts +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test151 -mode predict -resp y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api f -nn_keras_loss msle -sw_coef 3 -sw_exp 10 -sw_int 0 -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" -spec_fn smlp_toy_num_resp_mult_free_inps_beta_objv.spec +spec_fn smlp_toy_num_resp_mult_verify.spec specs_path ../specs -Running test 183 test type: optimize, description: basic flat tree encoding test for dt_sklearn multi objective pareto optimization when features and responses are not scaled modifies test 164 -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test183 -mode optimize -pareto t -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -compress_rules f -tree_encoding flat -scale_resp f -scale_feat f -spec ../specs/smlp_toy_num_resp_mult_free_inps_beta_objv.spec -data_scaler min_max -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 4 test type: prediction, description: basic nn_keras prediction test on labeled and new data with numeric labels and one response +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test4 -mode predict -resp y2 -feat x,p1,p2 -model nn_keras -nn_keras_weights_precision 2 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" -spec_fn smlp_toy_num_resp_mult_optsyn.spec -specs_path ../specs -Running test 191 test type: optimize, description: basic test for et_sklearn with branched tree_encoding and model_per_response t in model exploration mode optimize adapts test 169 -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test191 -mode optimize -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model et_sklearn -et_sklearn_max_depth 2 -et_sklearn_n_estimators 3 -et_sklearn_bootstrap t -tree_encoding branched -model_per_response t -compress_rules t -save_model f -use_model f -mrmr_pred 2 -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 13 test type: train, description: EV-SI real life nn_keras prediction test on labeled and new data with numeric labels +smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test13 -mode train -resp y1,y2 -feat x1,x2,p1,p2 -model nn_keras -nn_keras_epochs 20 -nn_keras_seq_api f -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_num_resp_mult_optsyn.spec -specs_path ../specs -Running test 195 test type: optimize, description: basic test for et_sklearn with branched tree_encoding and model_per_response f in model exploration mode optimize adapts test 192 by setting n_estimators 3 and then discrepancy between z3 -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test195 -mode optimize -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model et_sklearn -et_sklearn_max_depth 2 -et_sklearn_n_estimators 3 -et_sklearn_bootstrap f -tree_encoding branched -model_per_response f -compress_rules t -save_model f -use_model f -mrmr_pred 2 -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 27 test type: prediction, description: checks nn_keras prediction with nn_keras_seq_api t +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test27 -mode predict -resp y2 -feat x,p1,p2 -model nn_keras -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api t -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" -spec_fn smlp_toy_num_resp_mult_optsyn.spec -specs_path ../specs -Running test 199 test type: optimize, description: test to demonstrate that in pareto optimization and optsyn modes with multiple objectives when beta constraints are not present SMLP results are not consistent when different solvers are used; this is due to fact that when a subset of objectoves are exemined in pareto algo -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test199 -mode optimize -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model et_sklearn -et_sklearn_max_depth 2 -et_sklearn_n_estimators 100 -et_sklearn_bootstrap f -tree_encoding branched -model_per_response f -compress_rules t -save_model f -use_model f -mrmr_pred 2 -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 35 test type: doe, description: doe test with four levels with plackett_burman +smlp -doe_spec "../grids/doe_four_levels_real.csv" -out_dir ./ -pref Test35 -mode doe -doe_algo plackett_burman -log_time f -Running test 218 test type: correlate, description: basic test for correlate mode -smlp -data "../data/smlp_toy_mult_discr.csv" -out_dir ./ -pref Test218 -mode correlate -resp "PF,PF1" -discr_algo uniform -discr_bins 6 -discr_labels t -discr_type ordered -data_scaler none -cont_est pearson,spearman,kendall -mi_method correlation -mrmr_pred 0 -plots f -seed 10 -log_time f -pos_val fail -neg_val pass +Running test 43 test type: doe, description: doe test with four levels with halton_sequence +smlp -doe_spec "../grids/doe_two_levels.csv" -out_dir ./ -pref Test43 -mode doe -doe_algo halton_sequence -doe_samples 20 -log_time f -Running test 223 test type: correlate, description: basic test for correlate mode and tests the normalized mutual information -smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test223 -mode correlate -resp y1,y2 -discr_algo uniform -discr_bins 6 -discr_labels t -discr_type object -data_scaler none -cont_est pearson,spearman,kendall -mi_method normalized -mrmr_pred 0 -plots f -seed 10 -log_time f +Running test 51 test type: discretization, description: tests discretization options +smlp -data "../data/smlp_toy_mult_discr.csv" -out_dir ./ -pref Test51 -mode discretize -resp "PF,PF1" -discr_algo jenks -discr_bins 6 -discr_labels f -discr_type integer -data_scaler none -mrmr_pred 0 -plots f -seed 10 -log_time f -pos_val fail -neg_val pass +spec_fn smlp_toy_num_resp_mult_y2_verify.spec +specs_path ../specs +Running test 60 test type: verify, description: basic nn_keras assertion verification test for functional nn_keras model +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test60 -mode verify -resp y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api t -save_model_config f -spec ../specs/smlp_toy_num_resp_mult_y2_verify.spec -asrt_names asrt1 -asrt_exprs "2*y2>1" -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat +spec_fn smlp_toy_num_resp_mult_free_inps.spec specs_path ../specs -Running test 177 test type: optsyn, description: basic layered nn_keras encoding test with model_per_response t nn_keras_seq_api t for nn_keras in model exploration mode optsyn -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test177 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model nn_keras -nn_keras_epochs 20 -nn_keras_seq_api t -nnet_encoding layered -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 82 test type: optimize, description: basic dt_sklearn single objective optimization test with numeric labels and integer grid as domain and with scaling objectives +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test82 -mode optimize -pareto t -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -spec ../specs/smlp_toy_num_resp_mult_free_inps.spec -data_scaler min_max -objv_names obj1,objv2,objv3 -objv_exprs "(y1+y2)/2;y1;y2" -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat -spec_fn smlp_toy_num_resp_mult_optsyn.spec +spec_fn smlp_toy_num_resp_mult_optsyn_vacuous.spec specs_path ../specs -Running test 189 test type: optsyn, description: basic branched tree encoding test with model_per_response f for rf_sklearn in model exploration mode optsyn adapts test 166 -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test189 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model rf_sklearn -rf_sklearn_max_depth 4 -rf_sklearn_n_estimators 3 -tree_encoding branched -compress_rules t -save_model f -use_model f -compress_rules t -mrmr_pred 2 -model_per_response f -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 90 test type: optsyn, description: test to detect contradictory constraints in optsyn mode +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test90 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_optsyn_vacuous.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f spec_fn smlp_toy_num_resp_mult_optsyn.spec specs_path ../specs -Running test 193 test type: optimize, description: basic test for et_caret with branched tree_encoding in model exploration mode optimize adapts test 171 -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test193 -mode optimize -resp y1,y2 -feat x,p1,p2 -model et_caret -tree_encoding branched -model_per_response t -compress_rules t -save_model f -use_model f -mrmr_pred 2 -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 98 test type: optsyn, description: basic test for et_caret in model exploration mode optsyn +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test98 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model et_caret -save_model f -use_model f -tree_encoding nested -compress_rules f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_num_resp_mult_no_input_beta.spec +spec_fn smlp_toy_system.spec specs_path ../specs -Running test 201 test type: optimize, description: basic dt_sklearn single objective optimization with the eager algorithm when there are no inputs and there are beta constraints -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test201 -mode optimize -pareto t -opt_strategy eager -resp y1,y2 -feat p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -compress_rules f -spec ../specs/smlp_toy_num_resp_mult_no_input_beta.spec -data_scaler min_max -objv_names obj1 -objv_exprs "(y1+y2)/2" -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 115 test type: certify, description: basic test in certify mode +smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test115 -mode certify -resp y1,y2 -feat x1,x2,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_system.spec -quer_names query1,query2 -quer_exprs "y1>0;y2<=0" -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_num_resp_mult_no_input.spec +spec_fn smlp_toy_system_stable_certify.spec specs_path ../specs -Running test 202 test type: optimize, description: basic dt_sklearn single objective optimization with the eager algorithm when there are no inputs and no beta constraints -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test202 -mode optimize -pareto t -opt_strategy eager -resp y1,y2 -feat p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -compress_rules f -spec ../specs/smlp_toy_num_resp_mult_no_input.spec -data_scaler min_max -objv_names obj1 -objv_exprs "(y1+y2)/2" -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 127 test type: certify, description: certification example with knobs only and fictitious inputs with values fixed through their ranges +smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test127 -mode certify -model system -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_certify.spec -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_system_stable_constant_synth_feasible.spec +spec_fn smlp_toy_num_resp_mult_query.spec specs_path ../specs -Running test 206 test type: optsyn, description: optimized synthesis test with eager strategy and with constant knob and no inputs where synthesis is feasible and optimization is performed adapts test 125 -smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test206 -mode optsyn -pareto t -opt_strategy eager -model system -resp y1,y2 -feat p1,p2 -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_constant_synth_feasible.spec -epsilon 0.00000001 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 143 test type: query, description: basic test for compress_rules for et_sklearn in mode query +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test143 -mode query -resp y1,y2 -feat x,p1,p2 -model et_sklearn -et_sklearn_bootstrap f -tree_encoding nested -compress_rules t -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_query.spec -epsilon 0.1 -delta_rel 0.05 -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -Running test 219 test type: correlate, description: basic test for correlate mode -smlp -data "../data/smlp_toy_mult_discr.csv" -out_dir ./ -pref Test219 -mode correlate -resp "PF,PF1" -discr_algo uniform -discr_bins 6 -discr_labels t -discr_type integer -data_scaler none -cont_est pearson,spearman,kendall -mi_method correlation -mrmr_pred 0 -plots f -seed 10 -log_time f -pos_val fail -neg_val pass +Running test 158 test type: prediction, description: tests the mape loss function and sample weights with model_per_response t +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test158 -mode predict -resp y1,y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api f -nn_keras_loss mape -model_per_response t -sw_coef 8 -sw_exp 5 -sw_int 0.5 -nn_keras_metrics rmse -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" -Running test 224 test type: correlate, description: basic test for correlate mode and tests the Shannon mutual information -smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test224 -mode correlate -resp y1,y2 -discr_algo uniform -discr_bins 6 -discr_labels t -discr_type object -data_scaler none -cont_est pearson,spearman,kendall -mi_method shannon -mrmr_pred 0 -plots f -seed 10 -log_time f +spec_fn smlp_toy_num_resp_mult_free_inps_beta_objv.spec +specs_path ../specs +Running test 164 test type: optimize, description: basic flat tree encoding test for dt_sklearn multi objective pareto optimization +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test164 -mode optimize -pareto t -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -compress_rules f -tree_encoding flat -spec ../specs/smlp_toy_num_resp_mult_free_inps_beta_objv.spec -data_scaler min_max -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f + +spec_fn smlp_toy_num_resp_mult_optsyn.spec +specs_path ../specs +Running test 168 test type: optimize, description: basic test for rf_caret with flat tree_encoding and modelper_response in model exploration mode optimize +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test168 -mode optimize -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model rf_caret -model_per_response t -compress_rules t -tree_encoding flat -save_model f -use_model f -mrmr_pred 2 -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +spec_fnRunning test 157 test type: verify, description: basic nn_keras assertion verification test that uses keras tuner with sequrntial models for model training; adapts test 155 by consdering multiple responses +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test157 -mode verify -resp y1,y2 -feat x,p1,p2 --model nn_keras -nnet_encoding nested -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api t -nn_keras_tuner hyperband -nn_keras_layers_grid "2,2;3" -save_model_config f -spec ../specs/smlp_toy_num_resp_mult_verify.spec -asrt_names asrt1 -asrt_exprs "2*y2>1" -sw_coef 4 -sw_exp 5 -sw_int 0.5 -nn_keras_metrics rmse,logcosh spec_fn smlp_toy_num_resp_mult_optsyn.spec specs_path ../specs -Running test 167 test type: optsyn, description: basic flat tree encoding test with model_per_response t for rf_sklearn in model exploration mode optsyn -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test167 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model rf_sklearn -rf_sklearn_max_depth 4 -rf_sklearn_n_estimators 3 -tree_encoding flat -compress_rules t -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 166 test type: optsyn, description: basic flat tree encoding test with model_per_response f for rf_sklearn in model exploration mode optsyn +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test166 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model rf_sklearn -rf_sklearn_max_depth 4 -rf_sklearn_n_estimators 3 -tree_encoding flat -compress_rules t -save_model f -use_model f -compress_rules t -mrmr_pred 2 -model_per_response f -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f spec_fn smlp_toy_num_resp_mult_optsyn.spec specs_path ../specs -Running test 171 test type: optimize, description: basic test for et_caret with flat tree_encoding in model exploration mode optimize -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test171 -mode optimize -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model et_caret -tree_encoding flat -model_per_response t -compress_rules t -save_model f -use_model f -mrmr_pred 2 -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 169 test type: optimize, description: basic test for et_sklearn with flat tree_encoding and model_per_response t in model exploration mode optimize +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test169 -mode optimize -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model et_sklearn -et_sklearn_max_depth 2 -rf_sklearn_n_estimators 3 -et_sklearn_bootstrap f -tree_encoding flat -model_per_response t -compress_rules t -save_model f -use_model f -mrmr_pred 2 -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat -plots f -pred_plots f -resp_plots f -seed 10 -log_time f spec_fn smlp_toy_num_resp_mult_optsyn.spec specs_path ../specs @@ -553,51 +554,47 @@ smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test178 -mode spec_fn smlp_toy_num_resp_mult_free_inps_beta_objv.spec specs_path ../specs -Running test 182 test type: optimize, description: basic flat tree encoding test for dt_sklearn multi objective pareto optimization when responses are not scaled modifies test 164 -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test182 -mode optimize -pareto t -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -compress_rules f -tree_encoding flat -scale_resp f -spec ../specs/smlp_toy_num_resp_mult_free_inps_beta_objv.spec -data_scaler min_max -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat"" +Running test 183 test type: optimize, description: basic flat tree encoding test for dt_sklearn multi objective pareto optimization when features and responses are not scaled modifies test 164 +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test183 -mode optimize -pareto t -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -compress_rules f -tree_encoding flat -scale_resp f -scale_feat f -spec ../specs/smlp_toy_num_resp_mult_free_inps_beta_objv.spec -data_scaler min_max -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f + +spec_fn smlp_toy_num_resp_mult_optsyn.spec +specs_path ../specs +Running test 189 test type: optsyn, description: basic branched tree encoding test with model_per_response f for rf_sklearn in model exploration mode optsyn adapts test 166 +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test189 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model rf_sklearn -rf_sklearn_max_depth 4 -rf_sklearn_n_estimators 3 -tree_encoding branched -compress_rules t -save_model f -use_model f -compress_rules t -mrmr_pred 2 -model_per_response f -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f spec_fn smlp_toy_num_resp_mult_optsyn.spec specs_path ../specs Running test 192 test type: optimize, description: basic test for et_sklearn with branched tree_encoding and model_per_response f in model exploration mode optimize adapts test 170 !!!!!!!!! in this test z3 result differs from mathsat and yices results (the latter two give sma results smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test192 -mode optimize -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model et_sklearn -et_sklearn_max_depth 2 -et_sklearn_n_estimators 100 -et_sklearn_bootstrap f -tree_encoding branched -model_per_response f -compress_rules t -save_model f -use_model f -mrmr_pred 2 -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_system_stable_constant_synth_fail.spec +spec_fn smlp_toy_num_resp_mult_no_input.spec specs_path ../specs -Running test 203 test type: optimize, description: optimization test with eager strategy and with constant knob and no inputs where synthesis is not feasible because the assertion is not feasible but beta constraint is feasible therefore optimization is performed adapts test 122 -smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test203 -mode optimize -pareto f -opt_strategy eager -model system -resp y1,y2 -feat p1,p2 -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_constant_synth_fail.spec -epsilon 0.00000001 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f - -Running test 215 test type: correlate, description: basic test for correlate mode -smlp -data "../data/smlp_toy_mult_discr.csv" -out_dir ./ -pref Test215 -mode correlate -resp "PF,PF1" -discr_algo uniform -discr_bins 6 -discr_labels t -discr_type object -data_scaler none -cont_est pearson,spearman,kendall -mi_method correlation -mrmr_pred 0 -plots f -seed 10 -log_time f -pos_val fail -neg_val pass - -Running test 220 test type: correlate, description: basic test for correlate mode -smlp -data "../data/smlp_toy_mult_discr.csv" -out_dir ./ -pref Test220 -mode correlate -resp "PF,PF1" -discr_algo uniform -discr_bins 6 -discr_labels t -discr_type object -data_scaler none -cont_est pearson,spearman,kendall -mi_method normalized -mrmr_pred 0 -plots f -seed 10 -log_time f -pos_val fail -neg_val pass - -Running test 226 test type: correlate, description: basic test for correlate mode -smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test226 -mode correlate -resp y1,y2 -discr_algo uniform -discret_num t -discr_bins 6 -discr_labels t -discr_type object -data_scaler none -cont_est pearson,spearman,kendall -mi_method correlation -mrmr_pred 0 -plots f -seed 10 -log_time f - +Running test 202 test type: optimize, description: basic dt_sklearn single objective optimization with the eager algorithm when there are no inputs and no beta constraints +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test202 -mode optimize -pareto t -opt_strategy eager -resp y1,y2 -feat p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -compress_rules f -spec ../specs/smlp_toy_num_resp_mult_no_input.spec -data_scaler min_max -objv_names obj1 -objv_exprs "(y1+y2)/2" -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f spec_fn smlp_toy_system_stable_constant_synth_feasible.spec specs_path ../specs -Running test 145 test type: optimize, description: optimization test with constant knob and no inputs where synthesis is feasible and optimization is performed -smlp -out_dir ./ -pref Test145 -mode optimize -pareto t -opt_strategy lazy -model system -resp y1,y2 -feat p1,p2 -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_constant_synth_feasible.spec -doe_spec ../grids/doe_two_levels_opt.csv -doe_algo latin_hypercube -epsilon 0.00000001 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 206 test type: optsyn, description: optimized synthesis test with eager strategy and with constant knob and no inputs where synthesis is feasible and optimization is performed adapts test 125 +smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test206 -mode optsyn -pareto t -opt_strategy eager -model system -resp y1,y2 -feat p1,p2 -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_constant_synth_feasible.spec -epsilon 0.00000001 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -Running test 151 test type: prediction, description: tests msle loss function MeanSquaredLogarithmicError and and sample weoghts -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test151 -mode predict -resp y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api f -nn_keras_loss msle -sw_coef 3 -sw_exp 10 -sw_int 0 -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" +Running test 219 test type: correlate, description: basic test for correlate mode +smlp -data "../data/smlp_toy_mult_discr.csv" -out_dir ./ -pref Test219 -mode correlate -resp "PF,PF1" -discr_algo uniform -discr_bins 6 -discr_labels t -discr_type integer -data_scaler none -cont_est pearson,spearman,kendall -mi_method correlation -mrmr_pred 0 -plots f -seed 10 -log_time f -pos_val fail -neg_val pass -spec_fn smlp_toy_num_resp_mult_verify.spec -specs_path ../specs -Running test 157 test type: verify, description: basic nn_keras assertion verification test that uses keras tuner with sequrntial models for model training; adapts test 155 by consdering multiple responses -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test157 -mode verify -resp y1,y2 -feat x,p1,p2 --model nn_keras -nnet_encoding nested -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api t -nn_keras_tuner hyperband -nn_keras_layers_grid "2,2;3" -save_model_config f -spec ../specs/smlp_toy_num_resp_mult_verify.spec -asrt_names asrt1 -asrt_exprs "2*y2>1" -sw_coef 4 -sw_exp 5 -sw_int 0.5 -nn_keras_metrics rmse,logcosh +Running test 223 test type: correlate, description: basic test for correlate mode and tests the normalized mutual information +smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test223 -mode correlate -resp y1,y2 -discr_algo uniform -discr_bins 6 -discr_labels t -discr_type object -data_scaler none -cont_est pearson,spearman,kendall -mi_method normalized -mrmr_pred 0 -plots f -seed 10 -log_time f -spec_fn smlp_toy_num_resp_mult_free_inps_beta_objv.spec +Running test 227 test type: correlate, description: basic test for correlate mode and tests the normalized mutual information +smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test227 -mode correlate -resp y1,y2 -discr_algo uniform -discret_num t -discr_bins 6 -discr_labels t -discr_type object -data_scaler none -cont_est pearson,spearman,kendall -mi_method normalized -mrmr_pred 0 -plots f -seed 10 -log_time f + +spec_fn smlp_toy_num_resp_mult_optsyn.spec specs_path ../specs -Running test 164 test type: optimize, description: basic flat tree encoding test for dt_sklearn multi objective pareto optimization -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test164 -mode optimize -pareto t -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -compress_rules f -tree_encoding flat -spec ../specs/smlp_toy_num_resp_mult_free_inps_beta_objv.spec -data_scaler min_max -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 167 test type: optsyn, description: basic flat tree encoding test with model_per_response t for rf_sklearn in model exploration mode optsyn +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test167 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model rf_sklearn -rf_sklearn_max_depth 4 -rf_sklearn_n_estimators 3 -tree_encoding flat -compress_rules t -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f spec_fn smlp_toy_num_resp_mult_optsyn.spec specs_path ../specs -Running test 168 test type: optimize, description: basic test for rf_caret with flat tree_encoding and modelper_response in model exploration mode optimize -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test168 -mode optimize -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model rf_caret -model_per_response t -compress_rules t -tree_encoding flat -save_model f -use_model f -mrmr_pred 2 -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 170 test type: optimize, description: basic test for et_sklearn with flat tree_encoding and model_per_response f in model exploration mode optimize +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test170 -mode optimize -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model et_sklearn -et_sklearn_max_depth 2 -rf_sklearn_n_estimators 3 -et_sklearn_bootstrap f -tree_encoding flat -model_per_response f -compress_rules t -save_model f -use_model f -mrmr_pred 2 -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat -plots f -pred_plots f -resp_plots f -seed 10 -log_time f spec_fn smlp_toy_num_resp_mult_y2_verify.spec specs_path ../specs @@ -606,33 +603,43 @@ smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test173 -mode spec_fn smlp_toy_num_resp_mult_free_inps_beta_objv.spec specs_path ../specs -Running test 187 test type: optimize, description: basic branched tree encoding test for dt_sklearn multi objective pareto optimization adapts test 164 -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test187 -mode optimize -pareto t -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -compress_rules f -tree_encoding branched -spec ../specs/smlp_toy_num_resp_mult_free_inps_beta_objv.spec -data_scaler min_max -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 181 test type: optimize, description: basic flat tree encoding test for dt_sklearn multi objective pareto optimization when features are not scaled modifies test 164 +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test181 -mode optimize -pareto t -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -compress_rules f -tree_encoding flat -scale_feat f -spec ../specs/smlp_toy_num_resp_mult_free_inps_beta_objv.spec -data_scaler min_max -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f + +spec_fn smlp_toy_num_resp_mult_free_inps_beta_objv.spec +specs_path ../specs +Running test 182 test type: optimize, description: basic flat tree encoding test for dt_sklearn multi objective pareto optimization when responses are not scaled modifies test 164 +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test182 -mode optimize -pareto t -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -compress_rules f -tree_encoding flat -scale_resp f -spec ../specs/smlp_toy_num_resp_mult_free_inps_beta_objv.spec -data_scaler min_max -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat"" spec_fn smlp_toy_num_resp_mult_optsyn.spec specs_path ../specs -Running test 194 test type: optsyn, description: basic branched tree encoding test with model_per_response t for rf_sklearn in model exploration mode optsyn -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test194 -mode optsyn -resp y1,y2 -feat x,p1,p2 -model rf_sklearn -rf_sklearn_max_depth 4 -rf_sklearn_n_estimators 3 -tree_encoding branched -compress_rules t -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 188 test type: optsyn, description: basic branched tree encoding test for dt_caretin model exploration mode optsyn +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test188 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_caret -tree_encoding branched -save_model f -use_model f -compress_rules f -mrmr_pred 2 -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_num_resp_mult_free_inps_beta_objv.spec +spec_fn smlp_toy_num_resp_mult_optsyn.spec specs_path ../specs -Running test 198 test type: optimize, description: basic branched tree encoding test for dt_sklearn multi objective pareto optimization when features and responses are not scaled modifies test 164 and test 183 -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test198 -mode optimize -pareto t -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -compress_rules f -tree_encoding branched -scale_resp f -scale_feat f -spec ../specs/smlp_toy_num_resp_mult_free_inps_beta_objv.spec -data_scaler min_max -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat +Running test 193 test type: optimize, description: basic test for et_caret with branched tree_encoding in model exploration mode optimize adapts test 171 +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test193 -mode optimize -resp y1,y2 -feat x,p1,p2 -model et_caret -tree_encoding branched -model_per_response t -compress_rules t -save_model f -use_model f -mrmr_pred 2 -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f spec_fn smlp_toy_system_stable_constant_synth_feasible.spec specs_path ../specs Running test 204 test type: optimize, description: optimization test with eager strategy and with constant knob and no inputs where synthesis is feasible and optimization is performed adapts test 123 smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test204 -mode optimize -pareto t -opt_strategy eager -model system -resp y1,y2 -feat p1,p2 -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_constant_synth_feasible.spec -epsilon 0.00000001 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -Running test 216 test type: correlate, description: basic test for correlate mode -smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test216 -mode correlate -resp y1,y2 -discr_algo uniform -discr_bins 6 -discr_labels t -discr_type object -data_scaler none -cont_est pearson,spearman,kendall -mi_method correlation -mrmr_pred 0 -plots f -seed 10 -log_time f +Running test 217 test type: correlate, description: basic test for correlate mode +smlp -data "../data/smlp_toy_mult_discr.csv" -out_dir ./ -pref Test217 -mode correlate -resp "PF,PF1" -discr_algo uniform -discr_bins 6 -discr_labels t -discr_type category -data_scaler none -cont_est pearson,spearman,kendall -mi_method correlation -mrmr_pred 0 -plots f -seed 10 -log_time f -pos_val fail -neg_val pass -Running test 221 test type: correlate, description: basic test for correlate mode -smlp -data "../data/smlp_toy_mult_discr.csv" -out_dir ./ -pref Test221 -mode correlate -resp "PF,PF1" -discr_algo uniform -discr_bins 6 -discr_labels t -discr_type object -data_scaler none -cont_est pearson,spearman,kendall -mi_method shannon -mrmr_pred 0 -plots f -seed 10 -log_time f -pos_val fail -neg_val pass +Running test 222 test type: correlate, description: basic test for correlate mode +smlp -data "../data/smlp_toy_mult_discr.csv" -out_dir ./ -pref Test222 -mode correlate -resp "PF,PF1" -discr_algo uniform -discr_bins 6 -discr_labels t -discr_type object -data_scaler none -cont_est pearson,spearman,kendall -mi_method adjusted -mrmr_pred 0 -plots f -seed 10 -log_time f -pos_val fail -neg_val pass -Running test 225 test type: correlate, description: basic test for correlate mode and tests the adjusted mutual information -smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test225 -mode correlate -resp y1,y2 -discr_algo uniform -discr_bins 6 -discr_labels t -discr_type object -data_scaler none -cont_est pearson,spearman,kendall -mi_method adjusted -mrmr_pred 0 -plots f -seed 10 -log_time f +smlp -out_dir ./ -pref Test145 -mode optimize -pareto t -opt_strategy lazy -model system -resp y1,y2 -feat p1,p2 -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_constant_synth_feasible.spec -doe_spec ../grids/doe_two_levels_opt.csv -doe_algo latin_hypercube -epsilon 0.00000001 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f + +Running test 150 test type: prediction, description: tests the mape loss function MeanAbsolutePercentageError and sample weights +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test150 -mode predict -resp y1,y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api f -nn_keras_loss mape -sw_coef 0.8 -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" + +Running test 159 test type: prediction, description: tests the msle loss function and sample weights with model_per_response t +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test159 -mode predict -resp y1,y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api t -nn_keras_loss msle -model_per_response t -sw_coef 4 -sw_exp 5 -sw_int 0.5 -nn_keras_metrics mae,cosine -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" spec_fn smlp_toy_num_resp_mult_optsyn.spec specs_path ../specs @@ -646,147 +653,140 @@ smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test172 -mode spec_fn smlp_toy_num_resp_mult_optsyn.spec specs_path ../specs -Running test 180 test type: optsyn, description: basic layered nn_keras encoding test with model_per_response f nn_keras_seq_api t for nn_keras in model exploration mode optsyn when features and responses are not scaled adapts test 175 -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test180 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model nn_keras -nn_keras_epochs 20 -nn_keras_seq_api t -nnet_encoding layered -save_model f -use_model f -mrmr_pred 2 -model_per_response f -scale_feat f -scale_resp f -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 179 test type: optsyn, description: basic layered nn_keras encoding test with model_per_response f nn_keras_seq_api f for nn_keras in model exploration mode optsyn when resposes are not scaled adapts test 174 +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test179 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model nn_keras -nn_keras_epochs 20 -nn_keras_seq_api f -nnet_encoding layered -save_model f -use_model f -mrmr_pred 2 -model_per_response f -scale_resp f -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f spec_fn smlp_toy_num_resp_mult_optsyn.spec specs_path ../specs -Running test 190 test type: optimize, description: basic test for rf_caret with branched tree_encoding and modelper_response in model exploration mode optimize adapts test 168 -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test190 -mode optimize -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model rf_caret -model_per_response t -compress_rules t -tree_encoding branched -save_model f -use_model f -mrmr_pred 2 -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 180 test type: optsyn, description: basic layered nn_keras encoding test with model_per_response f nn_keras_seq_api t for nn_keras in model exploration mode optsyn when features and responses are not scaled adapts test 175 +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test180 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model nn_keras -nn_keras_epochs 20 -nn_keras_seq_api t -nnet_encoding layered -save_model f -use_model f -mrmr_pred 2 -model_per_response f -scale_feat f -scale_resp f -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f spec_fn smlp_toy_num_resp_mult_free_inps_beta_objv.spec specs_path ../specs -Running test 197 test type: optimize, description: basic branched tree encoding test for dt_sklearn multi objective pareto optimization when responses are not scaled modifies test 164 and test 182 -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test197 -mode optimize -pareto t -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -compress_rules f -tree_encoding branched -scale_resp f -spec ../specs/smlp_toy_num_resp_mult_free_inps_beta_objv.spec -data_scaler min_max -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat"" +Running test 187 test type: optimize, description: basic branched tree encoding test for dt_sklearn multi objective pareto optimization adapts test 164 +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test187 -mode optimize -pareto t -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -compress_rules f -tree_encoding branched -spec ../specs/smlp_toy_num_resp_mult_free_inps_beta_objv.spec -data_scaler min_max -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_system_stable_constant_synth_feasible.spec +spec_fn smlp_toy_num_resp_mult_optsyn.spec specs_path ../specs -Running test 205 test type: optimize, description: optimization test with eager strategy and with constant knob and no inputs where synthesis is feasible and optimization is performed adapts test 145 -smlp -out_dir ./ -pref Test205 -mode optimize -pareto t -opt_strategy eager -model system -resp y1,y2 -feat p1,p2 -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_constant_synth_feasible.spec -doe_spec ../grids/doe_two_levels_opt.csv -doe_algo latin_hypercube -epsilon 0.00000001 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f - -Running test 217 test type: correlate, description: basic test for correlate mode -smlp -data "../data/smlp_toy_mult_discr.csv" -out_dir ./ -pref Test217 -mode correlate -resp "PF,PF1" -discr_algo uniform -discr_bins 6 -discr_labels t -discr_type category -data_scaler none -cont_est pearson,spearman,kendall -mi_method correlation -mrmr_pred 0 -plots f -seed 10 -log_time f -pos_val fail -neg_val pass +Running test 191 test type: optimize, description: basic test for et_sklearn with branched tree_encoding and model_per_response t in model exploration mode optimize adapts test 169 +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test191 -mode optimize -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model et_sklearn -et_sklearn_max_depth 2 -et_sklearn_n_estimators 3 -et_sklearn_bootstrap t -tree_encoding branched -model_per_response t -compress_rules t -save_model f -use_model f -mrmr_pred 2 -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -Running test 222 test type: correlate, description: basic test for correlate mode -smlp -data "../data/smlp_toy_mult_discr.csv" -out_dir ./ -pref Test222 -mode correlate -resp "PF,PF1" -discr_algo uniform -discr_bins 6 -discr_labels t -discr_type object -data_scaler none -cont_est pearson,spearman,kendall -mi_method adjusted -mrmr_pred 0 -plots f -seed 10 -log_time f -pos_val fail -neg_val pass +spec_fn smlp_toy_num_resp_mult_optsyn.spec +specs_path ../specs +Running test 195 test type: optimize, description: basic test for et_sklearn with branched tree_encoding and model_per_response f in model exploration mode optimize adapts test 192 by setting n_estimators 3 and then discrepancy between z3 +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test195 -mode optimize -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model et_sklearn -et_sklearn_max_depth 2 -et_sklearn_n_estimators 3 -et_sklearn_bootstrap f -tree_encoding branched -model_per_response f -compress_rules t -save_model f -use_model f -mrmr_pred 2 -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -Running test 227 test type: correlate, description: basic test for correlate mode and tests the normalized mutual information -smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test227 -mode correlate -resp y1,y2 -discr_algo uniform -discret_num t -discr_bins 6 -discr_labels t -discr_type object -data_scaler none -cont_est pearson,spearman,kendall -mi_method normalized -mrmr_pred 0 -plots f -seed 10 -log_time f +spec_fn smlp_toy_num_resp_mult_optsyn.spec +specs_path ../specs +Running test 199 test type: optimize, description: test to demonstrate that in pareto optimization and optsyn modes with multiple objectives when beta constraints are not present SMLP results are not consistent when different solvers are used; this is due to fact that when a subset of objectoves are exemined in pareto algo +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test199 -mode optimize -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model et_sklearn -et_sklearn_max_depth 2 -et_sklearn_n_estimators 100 -et_sklearn_bootstrap f -tree_encoding branched -model_per_response f -compress_rules t -save_model f -use_model f -mrmr_pred 2 -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 218 test type: correlate, description: basic test for correlate mode +smlp -data "../data/smlp_toy_mult_discr.csv" -out_dir ./ -pref Test218 -mode correlate -resp "PF,PF1" -discr_algo uniform -discr_bins 6 -discr_labels t -discr_type ordered -data_scaler none -cont_est pearson,spearman,kendall -mi_method correlation -mrmr_pred 0 -plots f -seed 10 -log_time f -pos_val fail -neg_val pass -Running test 147 test type: prediction, description: checks nn_keras prediction with sw_coef 0.8 and sequential API -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test147 -mode predict -resp y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api t -sw_coef 0.8 -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" +Running test 224 test type: correlate, description: basic test for correlate mode and tests the Shannon mutual information +smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test224 -mode correlate -resp y1,y2 -discr_algo uniform -discr_bins 6 -discr_labels t -discr_type object -data_scaler none -cont_est pearson,spearman,kendall -mi_method shannon -mrmr_pred 0 -plots f -seed 10 -log_time f -Running test 153 test type: prediction, description: tests the logcosh loss function LogCosh and sample weights -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test153 -mode predict -resp y1,y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api t -nn_keras_loss logcosh -sw_coef 4 -sw_exp 5 -sw_int 0.5 -nn_keras_metrics mse -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" -Running test 161 test type: prediction, description: tests nn keras tuner bayesian -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test161 -mode predict -resp y1,y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api t -nn_keras_loss msle -nn_keras_metrics mape,logcosh -nn_keras_tuner random -nn_keras_lrates_grid "0.01,0.001" -nn_keras_batches_grid "32,64" -model_per_response f -sw_coef 4 -sw_exp 5 -sw_int 0.5 -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test152 -mode predict -resp y1,y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api f -nn_keras_loss huber -sw_coef 8 -sw_exp 5 -sw_int 0.5 -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" -spec_fn smlp_toy_num_resp_mult_optsyn.spec -specs_path ../specs -Running test 169 test type: optimize, description: basic test for et_sklearn with flat tree_encoding and model_per_response t in model exploration mode optimize -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test169 -mode optimize -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model et_sklearn -et_sklearn_max_depth 2 -rf_sklearn_n_estimators 3 -et_sklearn_bootstrap f -tree_encoding flat -model_per_response t -compress_rules t -save_model f -use_model f -mrmr_pred 2 -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 160 test type: prediction, description: tests nn keras tuner bayesian +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test160 -mode predict -resp y1,y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api f -nn_keras_loss mape -nn_keras_metrics msle -nn_keras_tuner bayesian -nn_keras_layers_grid "2,3" -nn_keras_losses_grid "mse,mae,huber" -model_per_response f -sw_coef 8 -sw_exp 5 -sw_int 0.5 -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" spec_fn smlp_toy_num_resp_mult_optsyn.spec specs_path ../specs -Running test 176 test type: optsyn, description: basic layered nn_keras encoding test with model_per_response t nn_keras_seq_api f for nn_keras in model exploration mode optsyn -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test176 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model nn_keras -nn_keras_epochs 20 -nn_keras_seq_api f -nnet_encoding layered -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 177 test type: optsyn, description: basic layered nn_keras encoding test with model_per_response t nn_keras_seq_api t for nn_keras in model exploration mode optsyn +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test177 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model nn_keras -nn_keras_epochs 20 -nn_keras_seq_api t -nnet_encoding layered -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f spec_fn smlp_toy_num_resp_mult_optsyn.spec specs_path ../specs -Running test 179 test type: optsyn, description: basic layered nn_keras encoding test with model_per_response f nn_keras_seq_api f for nn_keras in model exploration mode optsyn when resposes are not scaled adapts test 174 -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test179 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model nn_keras -nn_keras_epochs 20 -nn_keras_seq_api f -nnet_encoding layered -save_model f -use_model f -mrmr_pred 2 -model_per_response f -scale_resp f -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 194 test type: optsyn, description: basic branched tree encoding test with model_per_response t for rf_sklearn in model exploration mode optsyn +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test194 -mode optsyn -resp y1,y2 -feat x,p1,p2 -model rf_sklearn -rf_sklearn_max_depth 4 -rf_sklearn_n_estimators 3 -tree_encoding branched -compress_rules t -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f spec_fn smlp_toy_num_resp_mult_free_inps_beta_objv.spec specs_path ../specs -Running test 181 test type: optimize, description: basic flat tree encoding test for dt_sklearn multi objective pareto optimization when features are not scaled modifies test 164 -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test181 -mode optimize -pareto t -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -compress_rules f -tree_encoding flat -scale_feat f -spec ../specs/smlp_toy_num_resp_mult_free_inps_beta_objv.spec -data_scaler min_max -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 198 test type: optimize, description: basic branched tree encoding test for dt_sklearn multi objective pareto optimization when features and responses are not scaled modifies test 164 and test 183 +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test198 -mode optimize -pareto t -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -compress_rules f -tree_encoding branched -scale_resp f -scale_feat f -spec ../specs/smlp_toy_num_resp_mult_free_inps_beta_objv.spec -data_scaler min_max -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat -spec_fn smlp_toy_num_resp_mult_optsyn.spec +spec_fn smlp_toy_system_stable_constant_synth_fail.spec specs_path ../specs -Running test 188 test type: optsyn, description: basic branched tree encoding test for dt_caretin model exploration mode optsyn -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test188 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_caret -tree_encoding branched -save_model f -use_model f -compress_rules f -mrmr_pred 2 -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 203 test type: optimize, description: optimization test with eager strategy and with constant knob and no inputs where synthesis is not feasible because the assertion is not feasible but beta constraint is feasible therefore optimization is performed adapts test 122 +smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test203 -mode optimize -pareto f -opt_strategy eager -model system -resp y1,y2 -feat p1,p2 -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_constant_synth_fail.spec -epsilon 0.00000001 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_num_resp_mult_free_inps_beta_objv.spec -specs_path ../specs -Running test 196 test type: optimize, description: basic branched tree encoding test for dt_sklearn multi objective pareto optimization when features are not scaled modifies test 164 and test 181 -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test196 -mode optimize -pareto t -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -compress_rules f -tree_encoding branched -scale_feat f -spec ../specs/smlp_toy_num_resp_mult_free_inps_beta_objv.spec -data_scaler min_max -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 215 test type: correlate, description: basic test for correlate mode +smlp -data "../data/smlp_toy_mult_discr.csv" -out_dir ./ -pref Test215 -mode correlate -resp "PF,PF1" -discr_algo uniform -discr_bins 6 -discr_labels t -discr_type object -data_scaler none -cont_est pearson,spearman,kendall -mi_method correlation -mrmr_pred 0 -plots f -seed 10 -log_time f -pos_val fail -neg_val pass -spec_fn smlp_toy_num_resp_mult_optsyn.spec -specs_path ../specs -Running test 200 test type: optimize, description: basic test for et_sklearn with branched tree_encoding and model_per_response f in model exploration mode optimize adapts test 170 !!!!!!!!! in this test z3 result differs from mathsat and yices results (the latter two give sma results -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test200 -mode optimize -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model et_sklearn -et_sklearn_max_depth 2 -et_sklearn_n_estimators 100 -et_sklearn_bootstrap f -tree_encoding branched -model_per_response f -compress_rules t -save_model f -use_model f -mrmr_pred 2 -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0 -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 220 test type: correlate, description: basic test for correlate mode +smlp -data "../data/smlp_toy_mult_discr.csv" -out_dir ./ -pref Test220 -mode correlate -resp "PF,PF1" -discr_algo uniform -discr_bins 6 -discr_labels t -discr_type object -data_scaler none -cont_est pearson,spearman,kendall -mi_method normalized -mrmr_pred 0 -plots f -seed 10 -log_time f -pos_val fail -neg_val pass +Running test 225 test type: correlate, description: basic test for correlate mode and tests the adjusted mutual information +smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test225 -mode correlate -resp y1,y2 -discr_algo uniform -discr_bins 6 -discr_labels t -discr_type object -data_scaler none -cont_est pearson,spearman,kendall -mi_method adjusted -mrmr_pred 0 -plots f -seed 10 -log_time f -spec_fn smlp_toy_num_resp_mult.spec + smlp_toy_num_resp_mult_optsyn.spec specs_path ../specs -Running test 141 test type: optimize, description: basic test for compress_rules option for dt_sklearn in optimization mode -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test141 -mode optimize -opt_strategy lazy -pareto f -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules t -spec ../specs/smlp_toy_num_resp_mult.spec -objv_names objv_y1,objv_y2 -objv_exprs "y1;y2" -epsilon 0.01 -delta_rel 0.01 -data_scaler none -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f - -Running test 148 test type: prediction, description: checks nn_keras prediction with sw_coef 0.8 and sequential API -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test148 -mode predict -resp y1,y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api t -sw_coef 0.8 -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" +Running test 174 test type: optsyn, description: basic layered nn_keras encoding test with model_per_response f nn_keras_seq_api f for nn_keras in model exploration mode optsyn +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test174 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model nn_keras -nn_keras_epochs 20 -nn_keras_seq_api f -nnet_encoding layered -save_model f -use_model f -mrmr_pred 2 -model_per_response f -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_num_resp_mult_y2_verify.spec +spec_fn smlp_toy_num_resp_mult_free_inps_beta_objv.spec specs_path ../specs -Running test 155 test type: verify, description: basic nn_keras assertion verification test that uses keras tuner with sequrntial models for model training -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test155 -mode verify -resp y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api t -nn_keras_tuner hyperband -nn_keras_layers_grid "2,2;3,3,3" -save_model_config f -spec ../specs/smlp_toy_num_resp_mult_y2_verify.spec -asrt_names asrt1 -asrt_exprs "2*y2>1" -sw_coef 4 -sw_exp 5 -sw_int 0.5 -nn_keras_metrics mae - -Running test 7 test type: prediction, description: basic rf_sklearn prediction test on labeled and new data with numeric labels -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test7 -mode predict -resp y1,y2 -feat x,p1,p2 -model rf_sklearn -rf_sklearn_max_depth 15 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" +Running test 196 test type: optimize, description: basic branched tree encoding test for dt_sklearn multi objective pareto optimization when features are not scaled modifies test 164 and test 181 +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test196 -mode optimize -pareto t -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -compress_rules f -tree_encoding branched -scale_feat f -spec ../specs/smlp_toy_num_resp_mult_free_inps_beta_objv.spec -data_scaler min_max -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -Running test 11 test type: prediction, description: basic poly_sklearn prediction test on labeled and new data with numeric labels -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test11 -mode predict -resp y1,y2 -feat x,p1,p2 -model poly_sklearn -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" +spec_fn smlp_toy_num_resp_mult_no_input_beta.spec +specs_path ../specs +Running test 201 test type: optimize, description: basic dt_sklearn single objective optimization with the eager algorithm when there are no inputs and there are beta constraints +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test201 -mode optimize -pareto t -opt_strategy eager -resp y1,y2 -feat p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -compress_rules f -spec ../specs/smlp_toy_num_resp_mult_no_input_beta.spec -data_scaler min_max -objv_names obj1 -objv_exprs "(y1+y2)/2" -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -Running test 17 test type: prediction, description: basic poly_sklearn prediction test from saved model on new data with numeric labels and two responses -smlp -model_name "../models/Test11_smlp_toy_num_resp_mult" -out_dir ./ -pref Test17 -mode predict -resp y1,y2 -feat x,p1,p2 -model poly_sklearn -save_model f -use_model t -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" +spec_fn smlp_toy_system_stable_constant_synth_feasible.spec +specs_path ../specs +Running test 205 test type: optimize, description: optimization test with eager strategy and with constant knob and no inputs where synthesis is feasible and optimization is performed adapts test 145 +smlp -out_dir ./ -pref Test205 -mode optimize -pareto t -opt_strategy eager -model system -resp y1,y2 -feat p1,p2 -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_constant_synth_feasible.spec -doe_spec ../grids/doe_two_levels_opt.csv -doe_algo latin_hypercube -epsilon 0.00000001 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -Running test 25 test type: prediction, description: basic dt_sklearn prediction test on labeled and new data with numeric labels and saving model using name specified through model_name option - adapts Test6 -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test25 -mode predict -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -save_model t -use_model f -model_name test26_model -mrmr_pred 2 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" +Running test 216 test type: correlate, description: basic test for correlate mode +smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test216 -mode correlate -resp y1,y2 -discr_algo uniform -discr_bins 6 -discr_labels t -discr_type object -data_scaler none -cont_est pearson,spearman,kendall -mi_method correlation -mrmr_pred 0 -plots f -seed 10 -log_time f -Running test 37 test type: doe, description: doe test with four levels with box_behnken -smlp -doe_spec "../grids/doe_three_levels_real_nan.csv" -out_dir ./ -pref Test37 -mode doe -doe_algo box_behnken -log_time f +Running test 221 test type: correlate, description: basic test for correlate mode +smlp -data "../data/smlp_toy_mult_discr.csv" -out_dir ./ -pref Test221 -mode correlate -resp "PF,PF1" -discr_algo uniform -discr_bins 6 -discr_labels t -discr_type object -data_scaler none -cont_est pearson,spearman,kendall -mi_method shannon -mrmr_pred 0 -plots f -seed 10 -log_time f -pos_val fail -neg_val pass -Running test 47 test type: prediction, description: tests options -pos_val and -neg_val when re-using saved model -smlp -model_name "../models/test47_model" -out_dir ./ -pref Test47 -mode predict -resp "PF,PF1" -model poly_sklearn -save_model f -use_model t -data_scaler none -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -pos_val fail -neg_val pass -new_dat "../data/smlp_toy_pf_mult.csv" +Running test 226 test type: correlate, description: basic test for correlate mode +smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test226 -mode correlate -resp y1,y2 -discr_algo uniform -discret_num t -discr_bins 6 -discr_labels t -discr_type object -data_scaler none -cont_est pearson,spearman,kendall -mi_method correlation -mrmr_pred 0 -plots f -seed 10 -log_time f -Running test 54 test type: discretization, description: tests discretization options -smlp -data "../data/smlp_toy_mult_discr.csv" -out_dir ./ -pref Test54 -mode discretize -resp "PF,PF1" -discr_algo ordinals -discr_bins 6 -discr_labels t -discr_type object -data_scaler none -mrmr_pred 0 -plots f -seed 10 -log_time f -pos_val fail -neg_val pass -spec_fn smlp_toy_num_resp_noknobs_verify.spec -specs_path ../specs -Running test 66 test type: verify, description: basic dt_sklearn assertion verification test on data with one numeric response -smlp -model_name "../models/test65_model" -out_dir ./ -pref Test66 -mode verify -resp y1,y2 -feat x0,x1,x2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model f -use_model t -spec ../specs/smlp_toy_num_resp_noknobs_verify.spec -asrt_names asrt1,asrt2 -asrt_exprs "x0**2+y1>4.3;(y1+x2)/2<6" -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_num_resp_mult.spec -specs_path ../specs -Running test 79 test type: query, description: basic test in query mode to test stability (theta) and guard (eta) constraint generation -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test79 -mode query -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult.spec -quer_names query1,query2,query3 -quer_exprs "(y2**3+p2)/2<6;y1>=9;y2<0" -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 161 test type: prediction, description: tests nn keras tuner bayesian +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test161 -mode predict -resp y1,y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api t -nn_keras_loss msle -nn_keras_metrics mape,logcosh -nn_keras_tuner random -nn_keras_lrates_grid "0.01,0.001" -nn_keras_batches_grid "32,64" -model_per_response f -sw_coef 4 -sw_exp 5 -sw_int 0.5 -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" -spec_fn smlp_toy_num_resp_mult_query_vacuous.spec +spec_fn smlp_toy_num_resp_mult_optsyn.spec specs_path ../specs -Running test 91 test type: query, description: test to detect contradictory constraints in optimization mode due to contradictory alpha global and alpha bounds constraints on FMAX_xyx -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test91 -mode query -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_query_vacuous.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 171 test type: optimize, description: basic test for et_caret with flat tree_encoding in model exploration mode optimize +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test171 -mode optimize -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model et_caret -tree_encoding flat -model_per_response t -compress_rules t -save_model f -use_model f -mrmr_pred 2 -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f spec_fn smlp_toy_num_resp_mult_optsyn.spec specs_path ../specs -Running test 98 test type: optsyn, description: basic test for et_caret in model exploration mode optsyn -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test98 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model et_caret -save_model f -use_model f -tree_encoding nested -compress_rules f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 176 test type: optsyn, description: basic layered nn_keras encoding test with model_per_response t nn_keras_seq_api f for nn_keras in model exploration mode optsyn +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test176 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model nn_keras -nn_keras_epochs 20 -nn_keras_seq_api f -nnet_encoding layered -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_system.spec +spec_fn smlp_toy_num_resp_mult_optsyn.spec specs_path ../specs -Running test 115 test type: certify, description: basic test in certify mode -smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test115 -mode certify -resp y1,y2 -feat x1,x2,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -tree_encoding nested -compress_rules f -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_system.spec -quer_names query1,query2 -quer_exprs "y1>0;y2<=0" -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 190 test type: optimize, description: basic test for rf_caret with branched tree_encoding and modelper_response in model exploration mode optimize adapts test 168 +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test190 -mode optimize -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model rf_caret -model_per_response t -compress_rules t -tree_encoding branched -save_model f -use_model f -mrmr_pred 2 -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -spec_fn smlp_toy_system_stable_verify.spec +spec_fn smlp_toy_num_resp_mult_free_inps_beta_objv.spec specs_path ../specs -Running test 126 test type: verify, description: verification example with knobs only and fictitious inputs that have no effect where proparty is valid without stability and fails with stability -smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test126 -mode verify -model system -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_verify.spec -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 197 test type: optimize, description: basic branched tree encoding test for dt_sklearn multi objective pareto optimization when responses are not scaled modifies test 164 and test 182 +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test197 -mode optimize -pareto t -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model dt_sklearn -dt_sklearn_max_depth 15 -compress_rules f -tree_encoding branched -scale_resp f -spec ../specs/smlp_toy_num_resp_mult_free_inps_beta_objv.spec -data_scaler min_max -epsilon 0.05 -delta_rel 0.01 -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat"" spec_fn smlp_toy_num_resp_mult_optsyn.spec specs_path ../specs -Running test 142 test type: optsyn, description: basic test for compress_rules option for rf_sklearn in optsin mode -smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test142 -mode optsyn -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model rf_sklearn -rf_sklearn_max_depth 15 -tree_encoding nested -compress_rules t -save_model f -use_model f -mrmr_pred 2 -model_per_response t -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0.05 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f +Running test 200 test type: optimize, description: basic test for et_sklearn with branched tree_encoding and model_per_response f in model exploration mode optimize adapts test 170 !!!!!!!!! in this test z3 result differs from mathsat and yices results (the latter two give sma results +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test200 -mode optimize -opt_strategy lazy -resp y1,y2 -feat x,p1,p2 -model et_sklearn -et_sklearn_max_depth 2 -et_sklearn_n_estimators 100 -et_sklearn_bootstrap f -tree_encoding branched -model_per_response f -compress_rules t -save_model f -use_model f -mrmr_pred 2 -spec ../specs/smlp_toy_num_resp_mult_optsyn.spec -epsilon 0.1 -delta_rel 0 -solver_path ../../../external/mathsat-5.6.8-linux-x86_64-reentrant/bin/mathsat -plots f -pred_plots f -resp_plots f -seed 10 -log_time f + + + +smlp -data "../data/smlp_toy_basic.csv" -out_dir ./ -pref Test140 -mode verify -model system -save_model f -use_model f -mrmr_pred 0 -model_per_response t -spec ../specs/smlp_toy_system_stable_verify.spec -trace_prec 1 -trace_anonym t -plots f -pred_plots f -resp_plots f -seed 10 -log_time f + +Running test 147 test type: prediction, description: checks nn_keras prediction with sw_coef 0.8 and sequential API +smlp -data "../data/smlp_toy_num_resp_mult.csv" -out_dir ./ -pref Test147 -mode predict -resp y2 -feat x,p1,p2 -model nn_keras -nnet_encoding nested -save_model_config f -mrmr_pred 0 -plots f -pred_plots f -resp_plots f -seed 10 -log_time f -nn_keras_epochs 20 -nn_keras_seq_api t -sw_coef 0.8 -new_dat "../data/smlp_toy_num_resp_mult_pred_labeled.csv" spec_fn smlp_toy_num_resp_mult_y2_verify.spec specs_path ../specs @@ -822,15 +822,15 @@ comparing Test1_smlp_toy_num_resp_mult_training_prediction_precisions.csv to mas Passed! comparing Test1_smlp_toy_num_resp_mult_training_predictions_summary.csv to master Passed! -File master Test2_smlp_toy_num_resp_mult_rf_sklearn_y1_tree_rules.txt does not exist +comparing Test2_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled.txt to master +Passed! comparing Test2_smlp_toy_num_resp_mult_data_bounds.json to master Passed! comparing Test2_smlp_toy_num_resp_mult_model_features_dict.json to master Passed! comparing Test2_smlp_toy_num_resp_mult_model_levels_dict.json to master Passed! -comparing Test2_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled.txt to master -Passed! +File master Test2_smlp_toy_num_resp_mult_rf_sklearn_y1_tree_rules.txt does not exist File master Test2_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled_eval_rf_sklearn_labeled-col-y1.png does not exist File master Test2_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled_eval_rf_sklearn_new-col-y1.png does not exist File master Test2_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled_eval_rf_sklearn_test-col-y1.png does not exist @@ -909,7 +909,7 @@ comparing Test4_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled_train Passed! comparing Test4_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled_training_predictions_summary.csv to master Passed! -comparing Test5_smlp_toy_num_resp_mult_y1_dt_caret_tree_rules.txt to master +comparing Test5_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled.txt to master Passed! comparing Test5_smlp_toy_num_resp_mult_data_bounds.json to master Passed! @@ -917,8 +917,6 @@ comparing Test5_smlp_toy_num_resp_mult_model_features_dict.json to master Passed! comparing Test5_smlp_toy_num_resp_mult_model_levels_dict.json to master Passed! -comparing Test5_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled.txt to master -Passed! comparing Test5_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled_labeled_prediction_precisions.csv to master Passed! comparing Test5_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled_labeled_predictions_summary.csv to master @@ -937,6 +935,8 @@ comparing Test5_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled_train Passed! comparing Test5_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled_training_predictions_summary.csv to master Passed! +comparing Test5_smlp_toy_num_resp_mult_y1_dt_caret_tree_rules.txt to master +Passed! comparing Test6_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled.txt to master Passed! comparing Test6_smlp_toy_num_resp_mult_data_bounds.json to master @@ -1022,6 +1022,8 @@ comparing Test8_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled_train Passed! comparing Test8_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled_training_predictions_summary.csv to master Passed! +comparing test20_model_dt_sklearn_tree_rules.txt to master +Passed! comparing Test9_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled.txt to master Passed! comparing Test9_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled_args_config.json to master @@ -1046,23 +1048,21 @@ comparing Test9_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled_train Passed! comparing test20_model_data_bounds.json to master Passed! -comparing test20_model_dt_sklearn_tree_rules.txt to master -Passed! comparing test20_model_model_features_dict.json to master Passed! comparing test20_model_model_levels_dict.json to master Passed! comparing test20_model_rerun_model_config.json to master Passed! -comparing Test10_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled.txt to master -Passed! +comparing Test10_smlp_toy_num_resp_mult_et_sklearn_tree_rules.txt to master comparing Test10_smlp_toy_num_resp_mult_data_bounds.json to master Passed! -comparing Test10_smlp_toy_num_resp_mult_et_sklearn_tree_rules.txt to master comparing Test10_smlp_toy_num_resp_mult_model_features_dict.json to master Passed! comparing Test10_smlp_toy_num_resp_mult_model_levels_dict.json to master Passed! +comparing Test10_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled.txt to master +Passed! comparing Test10_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled_labeled_prediction_precisions.csv to master Passed! comparing Test10_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled_labeled_predictions_summary.csv to master @@ -1109,12 +1109,12 @@ comparing Test11_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled_trai Passed! comparing Test11_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled_training_predictions_summary.csv to master Passed! +comparing Test12_smlp_toy_basic_dt_sklearn_tree_rules.txt to master +Passed! comparing Test12_smlp_toy_basic.txt to master Passed! comparing Test12_smlp_toy_basic_data_bounds.json to master Passed! -comparing Test12_smlp_toy_basic_dt_sklearn_tree_rules.txt to master -Passed! comparing Test12_smlp_toy_basic_labeled_prediction_precisions.csv to master Passed! comparing Test12_smlp_toy_basic_labeled_predictions_summary.csv to master @@ -1198,6 +1198,8 @@ comparing Test17_Test11_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_label Passed! comparing Test17_Test11_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled_new_predictions_summary.csv to master Passed! +comparing test19_model_dt_sklearn_tree_rules.txt to master +Passed! comparing Test18_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled.txt to master Passed! comparing Test18_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled_labeled_prediction_precisions.csv to master @@ -1220,8 +1222,6 @@ comparing Test18_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled_trai Passed! comparing test19_model_data_bounds.json to master Passed! -comparing test19_model_dt_sklearn_tree_rules.txt to master -Passed! comparing test19_model_model_features_dict.json to master Passed! comparing test19_model_model_levels_dict.json to master @@ -1291,7 +1291,6 @@ Passed! comparing Test22_test22_model_smlp_toy_num_metasymbol_mult_reg_pred_labeled_new_predictions_summary.csv to master Passed! File master Test22_test22_model_smlp_toy_num_metasymbol_mult_reg_pred_labeled_resp-distr.png does not exist -File master test24_model_dt_sklearn_y1_tree_rules.txt does not exist comparing Test23_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled.txt to master Passed! comparing Test23_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled_labeled_prediction_precisions.csv to master @@ -1314,6 +1313,7 @@ comparing Test23_smlp_toy_num_resp_mult_smlp_toy_num_resp_mult_pred_labeled_trai Passed! comparing test24_model_data_bounds.json to master Passed! +File master test24_model_dt_sklearn_y1_tree_rules.txt does not exist File master test24_model_dt_sklearn_y2_tree_rules.txt does not exist comparing test24_model_model_features_dict.json to master Passed! @@ -1579,12 +1579,12 @@ Passed! Test 57 Failed: Error in Build stage: Data file does not exist +comparing Test58_smlp_toy_num_resp_mult_dt_sklearn_tree_rules.txt to master +Passed! comparing Test58_smlp_toy_num_resp_mult.txt to master Passed! comparing Test58_smlp_toy_num_resp_mult_data_bounds.json to master Passed! -comparing Test58_smlp_toy_num_resp_mult_dt_sklearn_tree_rules.txt to master -Passed! comparing Test58_smlp_toy_num_resp_mult_labeled_prediction_precisions.csv to master Passed! comparing Test58_smlp_toy_num_resp_mult_labeled_predictions_summary.csv to master @@ -1598,7 +1598,9 @@ Passed! comparing Test58_smlp_toy_num_resp_mult_optimization_progress.csv to master Passed! comparing Test58_smlp_toy_num_resp_mult_optimization_progress.json to master +Passed! comparing Test58_smlp_toy_num_resp_mult_optimization_results.json to master +Passed! File master Test58_smlp_toy_num_resp_mult_smlp_full_model_term.json does not exist comparing Test58_smlp_toy_num_resp_mult_test_prediction_precisions.csv to master Passed! @@ -1675,7 +1677,6 @@ Data file does not exist Test 62 Failed: Error in Build stage: Data file does not exist -File master test63_model_dt_sklearn_y1_tree_rules.txt does not exist comparing Test63_smlp_toy_num_resp_mult.txt to master Passed! comparing Test63_smlp_toy_num_resp_mult_labeled_prediction_precisions.csv to master @@ -1694,8 +1695,10 @@ Passed! comparing Test63_smlp_toy_num_resp_mult_training_predictions_summary.csv to master Passed! comparing Test63_smlp_toy_num_resp_mult_verify_results.json to master +Passed! comparing test63_model_data_bounds.json to master Passed! +File master test63_model_dt_sklearn_y1_tree_rules.txt does not exist comparing test63_model_model_features_dict.json to master Passed! comparing test63_model_model_levels_dict.json to master @@ -1707,6 +1710,7 @@ File master test63_model_y1_smlp_model_term.json does not exist comparing Test64_test63_model.txt to master File master Test64_test63_model_trace.csv does not exist comparing Test64_test63_model_verify_results.json to master +Passed! Test 65 Failed: Error in Build stage: Data file does not exist @@ -1736,6 +1740,7 @@ Passed! comparing Test69_smlp_toy_num_resp_mult_training_predictions_summary.csv to master Passed! comparing Test69_smlp_toy_num_resp_mult_verify_results.json to master +Passed! comparing test69_model_data_bounds.json to master Passed! comparing test69_model_model_features_dict.json to master @@ -1751,6 +1756,7 @@ File master test69_model_y2_smlp_model_term.json does not exist comparing Test70_test69_model.txt to master File master Test70_test69_model_trace.csv does not exist comparing Test70_test69_model_verify_results.json to master +Passed! Test 71 Failed: Error in Build stage: Data file does not exist @@ -1775,12 +1781,12 @@ File new Test77_test76_model_verify_results.json does not exist Test 78 Failed: Error in Build stage: Data file does not exist +File master Test79_smlp_toy_num_resp_mult_dt_sklearn_y2_tree_rules.txt does not exist comparing Test79_smlp_toy_num_resp_mult.txt to master Passed! comparing Test79_smlp_toy_num_resp_mult_data_bounds.json to master Passed! File master Test79_smlp_toy_num_resp_mult_dt_sklearn_y1_tree_rules.txt does not exist -File master Test79_smlp_toy_num_resp_mult_dt_sklearn_y2_tree_rules.txt does not exist comparing Test79_smlp_toy_num_resp_mult_labeled_prediction_precisions.csv to master Passed! comparing Test79_smlp_toy_num_resp_mult_labeled_predictions_summary.csv to master @@ -1792,6 +1798,7 @@ Passed! comparing Test79_smlp_toy_num_resp_mult_model_levels_dict.json to master Passed! comparing Test79_smlp_toy_num_resp_mult_query_results.json to master +Passed! comparing Test79_smlp_toy_num_resp_mult_test_prediction_precisions.csv to master Passed! comparing Test79_smlp_toy_num_resp_mult_test_predictions_summary.csv to master @@ -1805,12 +1812,12 @@ File master Test79_smlp_toy_num_resp_mult_y1_smlp_full_model_term.json does not File master Test79_smlp_toy_num_resp_mult_y1_smlp_model_term.json does not exist File master Test79_smlp_toy_num_resp_mult_y2_smlp_full_model_term.json does not exist File master Test79_smlp_toy_num_resp_mult_y2_smlp_model_term.json does not exist +comparing Test80_smlp_toy_num_resp_mult_dt_sklearn_tree_rules.txt to master +Passed! comparing Test80_smlp_toy_num_resp_mult.txt to master Passed! comparing Test80_smlp_toy_num_resp_mult_data_bounds.json to master Passed! -comparing Test80_smlp_toy_num_resp_mult_dt_sklearn_tree_rules.txt to master -Passed! comparing Test80_smlp_toy_num_resp_mult_labeled_prediction_precisions.csv to master Passed! comparing Test80_smlp_toy_num_resp_mult_labeled_predictions_summary.csv to master @@ -1824,7 +1831,9 @@ Passed! comparing Test80_smlp_toy_num_resp_mult_optimization_progress.csv to master Passed! comparing Test80_smlp_toy_num_resp_mult_optimization_progress.json to master +Passed! comparing Test80_smlp_toy_num_resp_mult_optimization_results.json to master +Passed! File master Test80_smlp_toy_num_resp_mult_smlp_full_model_term.json does not exist comparing Test80_smlp_toy_num_resp_mult_test_prediction_precisions.csv to master Passed! @@ -1835,12 +1844,12 @@ comparing Test80_smlp_toy_num_resp_mult_training_prediction_precisions.csv to ma Passed! comparing Test80_smlp_toy_num_resp_mult_training_predictions_summary.csv to master Passed! -comparing Test81_smlp_toy_num_resp_mult_dt_sklearn_tree_rules.txt to master -Passed! comparing Test81_smlp_toy_num_resp_mult.txt to master Passed! comparing Test81_smlp_toy_num_resp_mult_data_bounds.json to master Passed! +comparing Test81_smlp_toy_num_resp_mult_dt_sklearn_tree_rules.txt to master +Passed! comparing Test81_smlp_toy_num_resp_mult_labeled_prediction_precisions.csv to master Passed! comparing Test81_smlp_toy_num_resp_mult_labeled_predictions_summary.csv to master @@ -1854,7 +1863,9 @@ Passed! comparing Test81_smlp_toy_num_resp_mult_optimization_progress.csv to master Passed! comparing Test81_smlp_toy_num_resp_mult_optimization_progress.json to master +Passed! comparing Test81_smlp_toy_num_resp_mult_optimization_results.json to master +Passed! File master Test81_smlp_toy_num_resp_mult_smlp_full_model_term.json does not exist comparing Test81_smlp_toy_num_resp_mult_test_prediction_precisions.csv to master Passed! @@ -1884,9 +1895,11 @@ Passed! comparing Test82_smlp_toy_num_resp_mult_optimization_progress.csv to master Passed! comparing Test82_smlp_toy_num_resp_mult_optimization_progress.json to master +Passed! comparing Test82_smlp_toy_num_resp_mult_optimization_results.csv to master Passed! comparing Test82_smlp_toy_num_resp_mult_optimization_results.json to master +Passed! File master Test82_smlp_toy_num_resp_mult_smlp_full_model_term.json does not exist comparing Test82_smlp_toy_num_resp_mult_test_prediction_precisions.csv to master Passed! @@ -1916,9 +1929,11 @@ Passed! comparing Test83_smlp_toy_num_resp_mult_optimization_progress.csv to master Passed! comparing Test83_smlp_toy_num_resp_mult_optimization_progress.json to master +Passed! comparing Test83_smlp_toy_num_resp_mult_optimization_results.csv to master Passed! comparing Test83_smlp_toy_num_resp_mult_optimization_results.json to master +Passed! File master Test83_smlp_toy_num_resp_mult_smlp_full_model_term.json does not exist comparing Test83_smlp_toy_num_resp_mult_test_prediction_precisions.csv to master Passed! @@ -1951,7 +1966,9 @@ Passed! comparing Test85_smlp_toy_num_resp_mult_optimization_progress.csv to master Passed! comparing Test85_smlp_toy_num_resp_mult_optimization_progress.json to master +Passed! comparing Test85_smlp_toy_num_resp_mult_optimization_results.json to master +Passed! File master Test85_smlp_toy_num_resp_mult_smlp_full_model_term.json does not exist comparing Test85_smlp_toy_num_resp_mult_test_prediction_precisions.csv to master Passed! @@ -1981,7 +1998,9 @@ Passed! comparing Test86_smlp_toy_num_resp_mult_optimization_progress.csv to master Passed! comparing Test86_smlp_toy_num_resp_mult_optimization_progress.json to master +Passed! comparing Test86_smlp_toy_num_resp_mult_optimization_results.json to master +Passed! File master Test86_smlp_toy_num_resp_mult_smlp_full_model_term.json does not exist comparing Test86_smlp_toy_num_resp_mult_test_prediction_precisions.csv to master Passed! @@ -1992,12 +2011,12 @@ comparing Test86_smlp_toy_num_resp_mult_training_prediction_precisions.csv to ma Passed! comparing Test86_smlp_toy_num_resp_mult_training_predictions_summary.csv to master Passed! -comparing Test87_smlp_toy_num_resp_mult_dt_sklearn_tree_rules.txt to master -Passed! comparing Test87_smlp_toy_num_resp_mult.txt to master Passed! comparing Test87_smlp_toy_num_resp_mult_data_bounds.json to master Passed! +comparing Test87_smlp_toy_num_resp_mult_dt_sklearn_tree_rules.txt to master +Passed! comparing Test87_smlp_toy_num_resp_mult_labeled_prediction_precisions.csv to master Passed! comparing Test87_smlp_toy_num_resp_mult_labeled_predictions_summary.csv to master @@ -2021,12 +2040,13 @@ Passed! comparing Test87_smlp_toy_num_resp_mult_training_predictions_summary.csv to master Passed! comparing Test87_smlp_toy_num_resp_mult_verify_results.json to master +Passed! +comparing Test88_smlp_toy_num_resp_mult_dt_sklearn_tree_rules.txt to master +Passed! comparing Test88_smlp_toy_num_resp_mult.txt to master Passed! comparing Test88_smlp_toy_num_resp_mult_data_bounds.json to master Passed! -comparing Test88_smlp_toy_num_resp_mult_dt_sklearn_tree_rules.txt to master -Passed! comparing Test88_smlp_toy_num_resp_mult_labeled_prediction_precisions.csv to master Passed! comparing Test88_smlp_toy_num_resp_mult_labeled_predictions_summary.csv to master @@ -2040,9 +2060,11 @@ Passed! comparing Test88_smlp_toy_num_resp_mult_optimization_progress.csv to master Passed! comparing Test88_smlp_toy_num_resp_mult_optimization_progress.json to master +Passed! comparing Test88_smlp_toy_num_resp_mult_optimization_results.csv to master Passed! comparing Test88_smlp_toy_num_resp_mult_optimization_results.json to master +Passed! File master Test88_smlp_toy_num_resp_mult_smlp_full_model_term.json does not exist comparing Test88_smlp_toy_num_resp_mult_test_prediction_precisions.csv to master Passed! @@ -2053,12 +2075,12 @@ comparing Test88_smlp_toy_num_resp_mult_training_prediction_precisions.csv to ma Passed! comparing Test88_smlp_toy_num_resp_mult_training_predictions_summary.csv to master Passed! -File master Test89_smlp_toy_num_resp_mult_dt_sklearn_y1_tree_rules.txt does not exist +File master Test89_smlp_toy_num_resp_mult_dt_sklearn_y2_tree_rules.txt does not exist comparing Test89_smlp_toy_num_resp_mult.txt to master Passed! comparing Test89_smlp_toy_num_resp_mult_data_bounds.json to master Passed! -File master Test89_smlp_toy_num_resp_mult_dt_sklearn_y2_tree_rules.txt does not exist +File master Test89_smlp_toy_num_resp_mult_dt_sklearn_y1_tree_rules.txt does not exist comparing Test89_smlp_toy_num_resp_mult_labeled_prediction_precisions.csv to master Passed! comparing Test89_smlp_toy_num_resp_mult_labeled_predictions_summary.csv to master @@ -2070,6 +2092,7 @@ Passed! comparing Test89_smlp_toy_num_resp_mult_model_levels_dict.json to master Passed! comparing Test89_smlp_toy_num_resp_mult_query_results.json to master +Passed! comparing Test89_smlp_toy_num_resp_mult_test_prediction_precisions.csv to master Passed! comparing Test89_smlp_toy_num_resp_mult_test_predictions_summary.csv to master @@ -2083,12 +2106,12 @@ File master Test89_smlp_toy_num_resp_mult_y1_smlp_full_model_term.json does not File master Test89_smlp_toy_num_resp_mult_y1_smlp_model_term.json does not exist File master Test89_smlp_toy_num_resp_mult_y2_smlp_full_model_term.json does not exist File master Test89_smlp_toy_num_resp_mult_y2_smlp_model_term.json does not exist -File master Test90_smlp_toy_num_resp_mult_dt_sklearn_y2_tree_rules.txt does not exist +File master Test90_smlp_toy_num_resp_mult_dt_sklearn_y1_tree_rules.txt does not exist comparing Test90_smlp_toy_num_resp_mult.txt to master Passed! comparing Test90_smlp_toy_num_resp_mult_data_bounds.json to master Passed! -File master Test90_smlp_toy_num_resp_mult_dt_sklearn_y1_tree_rules.txt does not exist +File master Test90_smlp_toy_num_resp_mult_dt_sklearn_y2_tree_rules.txt does not exist comparing Test90_smlp_toy_num_resp_mult_labeled_prediction_precisions.csv to master Passed! comparing Test90_smlp_toy_num_resp_mult_labeled_predictions_summary.csv to master @@ -2113,11 +2136,11 @@ File master Test90_smlp_toy_num_resp_mult_y1_smlp_full_model_term.json does not File master Test90_smlp_toy_num_resp_mult_y1_smlp_model_term.json does not exist File master Test90_smlp_toy_num_resp_mult_y2_smlp_full_model_term.json does not exist File master Test90_smlp_toy_num_resp_mult_y2_smlp_model_term.json does not exist -File master Test91_smlp_toy_num_resp_mult_dt_sklearn_y1_tree_rules.txt does not exist comparing Test91_smlp_toy_num_resp_mult.txt to master Passed! comparing Test91_smlp_toy_num_resp_mult_data_bounds.json to master Passed! +File master Test91_smlp_toy_num_resp_mult_dt_sklearn_y1_tree_rules.txt does not exist File master Test91_smlp_toy_num_resp_mult_dt_sklearn_y2_tree_rules.txt does not exist comparing Test91_smlp_toy_num_resp_mult_labeled_prediction_precisions.csv to master Passed! @@ -2169,12 +2192,12 @@ comparing Test92_smlp_toy_num_resp_mult_training_predictions_summary.csv to mast Passed! comparing Test92_smlp_toy_num_resp_mult_verify_results.json to master Passed! -File master Test93_smlp_toy_num_resp_mult_dt_sklearn_y2_tree_rules.txt does not exist comparing Test93_smlp_toy_num_resp_mult.txt to master Passed! comparing Test93_smlp_toy_num_resp_mult_data_bounds.json to master Passed! File master Test93_smlp_toy_num_resp_mult_dt_sklearn_y1_tree_rules.txt does not exist +File master Test93_smlp_toy_num_resp_mult_dt_sklearn_y2_tree_rules.txt does not exist comparing Test93_smlp_toy_num_resp_mult_labeled_prediction_precisions.csv to master Passed! comparing Test93_smlp_toy_num_resp_mult_labeled_predictions_summary.csv to master @@ -2188,9 +2211,11 @@ Passed! comparing Test93_smlp_toy_num_resp_mult_optimization_progress.csv to master Passed! comparing Test93_smlp_toy_num_resp_mult_optimization_progress.json to master +Passed! comparing Test93_smlp_toy_num_resp_mult_optimization_results.csv to master Passed! comparing Test93_smlp_toy_num_resp_mult_optimization_results.json to master +Passed! comparing Test93_smlp_toy_num_resp_mult_test_prediction_precisions.csv to master Passed! comparing Test93_smlp_toy_num_resp_mult_test_predictions_summary.csv to master @@ -2222,9 +2247,11 @@ Passed! comparing Test94_smlp_toy_num_resp_mult_optimization_progress.csv to master Passed! comparing Test94_smlp_toy_num_resp_mult_optimization_progress.json to master +Passed! comparing Test94_smlp_toy_num_resp_mult_optimization_results.csv to master Passed! comparing Test94_smlp_toy_num_resp_mult_optimization_results.json to master +Passed! File master Test94_smlp_toy_num_resp_mult_rf_sklearn_y1_tree_rules.txt does not exist comparing Test94_smlp_toy_num_resp_mult_test_prediction_precisions.csv to master Passed! @@ -2239,7 +2266,7 @@ File master Test94_smlp_toy_num_resp_mult_y1_smlp_full_model_term.json does not File master Test94_smlp_toy_num_resp_mult_y1_smlp_model_term.json does not exist File master Test94_smlp_toy_num_resp_mult_y2_smlp_full_model_term.json does not exist File master Test94_smlp_toy_num_resp_mult_y2_smlp_model_term.json does not exist -comparing Test95_smlp_toy_num_resp_mult_y2_dt_caret_tree_rules.txt to master +comparing Test95_smlp_toy_num_resp_mult_y1_dt_caret_tree_rules.txt to master Passed! comparing Test95_smlp_toy_num_resp_mult.txt to master Passed! @@ -2258,9 +2285,11 @@ Passed! comparing Test95_smlp_toy_num_resp_mult_optimization_progress.csv to master Passed! comparing Test95_smlp_toy_num_resp_mult_optimization_progress.json to master +Passed! comparing Test95_smlp_toy_num_resp_mult_optimization_results.csv to master Passed! comparing Test95_smlp_toy_num_resp_mult_optimization_results.json to master +Passed! comparing Test95_smlp_toy_num_resp_mult_test_prediction_precisions.csv to master Passed! comparing Test95_smlp_toy_num_resp_mult_test_predictions_summary.csv to master @@ -2270,10 +2299,10 @@ comparing Test95_smlp_toy_num_resp_mult_training_prediction_precisions.csv to ma Passed! comparing Test95_smlp_toy_num_resp_mult_training_predictions_summary.csv to master Passed! -comparing Test95_smlp_toy_num_resp_mult_y1_dt_caret_tree_rules.txt to master -Passed! File master Test95_smlp_toy_num_resp_mult_y1_smlp_full_model_term.json does not exist File master Test95_smlp_toy_num_resp_mult_y1_smlp_model_term.json does not exist +comparing Test95_smlp_toy_num_resp_mult_y2_dt_caret_tree_rules.txt to master +Passed! File master Test95_smlp_toy_num_resp_mult_y2_smlp_full_model_term.json does not exist File master Test95_smlp_toy_num_resp_mult_y2_smlp_model_term.json does not exist comparing Test96_smlp_toy_num_resp_mult.txt to master @@ -2293,9 +2322,11 @@ Passed! comparing Test96_smlp_toy_num_resp_mult_optimization_progress.csv to master Passed! comparing Test96_smlp_toy_num_resp_mult_optimization_progress.json to master +Passed! comparing Test96_smlp_toy_num_resp_mult_optimization_results.csv to master Passed! comparing Test96_smlp_toy_num_resp_mult_optimization_results.json to master +Passed! comparing Test96_smlp_toy_num_resp_mult_test_prediction_precisions.csv to master Passed! comparing Test96_smlp_toy_num_resp_mult_test_predictions_summary.csv to master @@ -2313,11 +2344,11 @@ comparing Test96_smlp_toy_num_resp_mult_y2_rf_caret_tree_rules.txt to master Passed! File master Test96_smlp_toy_num_resp_mult_y2_smlp_full_model_term.json does not exist File master Test96_smlp_toy_num_resp_mult_y2_smlp_model_term.json does not exist +File master Test97_smlp_toy_num_resp_mult_et_sklearn_y2_tree_rules.txt does not exist comparing Test97_smlp_toy_num_resp_mult.txt to master comparing Test97_smlp_toy_num_resp_mult_data_bounds.json to master Passed! File master Test97_smlp_toy_num_resp_mult_et_sklearn_y1_tree_rules.txt does not exist -File master Test97_smlp_toy_num_resp_mult_et_sklearn_y2_tree_rules.txt does not exist comparing Test97_smlp_toy_num_resp_mult_labeled_prediction_precisions.csv to master Passed! comparing Test97_smlp_toy_num_resp_mult_labeled_predictions_summary.csv to master @@ -2343,8 +2374,6 @@ File master Test97_smlp_toy_num_resp_mult_y1_smlp_full_model_term.json does not File master Test97_smlp_toy_num_resp_mult_y1_smlp_model_term.json does not exist File master Test97_smlp_toy_num_resp_mult_y2_smlp_full_model_term.json does not exist File master Test97_smlp_toy_num_resp_mult_y2_smlp_model_term.json does not exist -comparing Test98_smlp_toy_num_resp_mult_y2_et_caret_tree_rules.txt to master -Passed! comparing Test98_smlp_toy_num_resp_mult.txt to master Passed! comparing Test98_smlp_toy_num_resp_mult_data_bounds.json to master @@ -2362,9 +2391,11 @@ Passed! comparing Test98_smlp_toy_num_resp_mult_optimization_progress.csv to master Passed! comparing Test98_smlp_toy_num_resp_mult_optimization_progress.json to master +Passed! comparing Test98_smlp_toy_num_resp_mult_optimization_results.csv to master Passed! comparing Test98_smlp_toy_num_resp_mult_optimization_results.json to master +Passed! comparing Test98_smlp_toy_num_resp_mult_test_prediction_precisions.csv to master Passed! comparing Test98_smlp_toy_num_resp_mult_test_predictions_summary.csv to master @@ -2378,14 +2409,16 @@ comparing Test98_smlp_toy_num_resp_mult_y1_et_caret_tree_rules.txt to master Passed! File master Test98_smlp_toy_num_resp_mult_y1_smlp_full_model_term.json does not exist File master Test98_smlp_toy_num_resp_mult_y1_smlp_model_term.json does not exist +comparing Test98_smlp_toy_num_resp_mult_y2_et_caret_tree_rules.txt to master +Passed! File master Test98_smlp_toy_num_resp_mult_y2_smlp_full_model_term.json does not exist File master Test98_smlp_toy_num_resp_mult_y2_smlp_model_term.json does not exist -comparing Test99_smlp_toy_num_resp_mult_dt_sklearn_tree_rules.txt to master -Passed! comparing Test99_smlp_toy_num_resp_mult.txt to master Passed! comparing Test99_smlp_toy_num_resp_mult_data_bounds.json to master Passed! +comparing Test99_smlp_toy_num_resp_mult_dt_sklearn_tree_rules.txt to master +Passed! comparing Test99_smlp_toy_num_resp_mult_labeled_prediction_precisions.csv to master Passed! comparing Test99_smlp_toy_num_resp_mult_labeled_predictions_summary.csv to master @@ -2399,9 +2432,11 @@ Passed! comparing Test99_smlp_toy_num_resp_mult_optimization_progress.csv to master Passed! comparing Test99_smlp_toy_num_resp_mult_optimization_progress.json to master +Passed! comparing Test99_smlp_toy_num_resp_mult_optimization_results.csv to master Passed! comparing Test99_smlp_toy_num_resp_mult_optimization_results.json to master +Passed! File master Test99_smlp_toy_num_resp_mult_smlp_full_model_term.json does not exist comparing Test99_smlp_toy_num_resp_mult_test_prediction_precisions.csv to master Passed! @@ -2431,9 +2466,11 @@ Passed! comparing Test100_smlp_toy_num_resp_mult_optimization_progress.csv to master Passed! comparing Test100_smlp_toy_num_resp_mult_optimization_progress.json to master +Passed! comparing Test100_smlp_toy_num_resp_mult_optimization_results.csv to master Passed! comparing Test100_smlp_toy_num_resp_mult_optimization_results.json to master +Passed! File master Test100_smlp_toy_num_resp_mult_smlp_full_model_term.json does not exist comparing Test100_smlp_toy_num_resp_mult_test_prediction_precisions.csv to master Passed! @@ -2444,7 +2481,7 @@ comparing Test100_smlp_toy_num_resp_mult_training_prediction_precisions.csv to m Passed! comparing Test100_smlp_toy_num_resp_mult_training_predictions_summary.csv to master Passed! -File master test101_model_dt_sklearn_y2_tree_rules.txt does not exist +File master test101_model_dt_sklearn_y1_tree_rules.txt does not exist comparing Test101_smlp_toy_num_resp_mult.txt to master Passed! comparing Test101_smlp_toy_num_resp_mult_certify_results.json to master @@ -2466,7 +2503,7 @@ comparing Test101_smlp_toy_num_resp_mult_training_predictions_summary.csv to mas Passed! comparing test101_model_data_bounds.json to master Passed! -File master test101_model_dt_sklearn_y1_tree_rules.txt does not exist +File master test101_model_dt_sklearn_y2_tree_rules.txt does not exist comparing test101_model_model_features_dict.json to master Passed! comparing test101_model_model_levels_dict.json to master @@ -2536,12 +2573,12 @@ comparing Test104_smlp_toy_num_resp_mult_training_prediction_precisions.csv to m Passed! comparing Test104_smlp_toy_num_resp_mult_training_predictions_summary.csv to master Passed! +comparing Test105_smlp_toy_num_resp_mult_dt_sklearn_tree_rules.txt to master +Passed! comparing Test105_smlp_toy_num_resp_mult.txt to master Passed! comparing Test105_smlp_toy_num_resp_mult_data_bounds.json to master Passed! -comparing Test105_smlp_toy_num_resp_mult_dt_sklearn_tree_rules.txt to master -Passed! comparing Test105_smlp_toy_num_resp_mult_labeled_prediction_precisions.csv to master Passed! comparing Test105_smlp_toy_num_resp_mult_labeled_predictions_summary.csv to master @@ -2563,6 +2600,7 @@ Passed! comparing Test105_smlp_toy_num_resp_mult_training_predictions_summary.csv to master Passed! comparing Test105_smlp_toy_num_resp_mult_verify_results.json to master +Passed! comparing Test106_smlp_toy_num_resp_mult_dt_sklearn_tree_rules.txt to master Passed! comparing Test106_smlp_toy_num_resp_mult.txt to master @@ -2590,12 +2628,12 @@ comparing Test106_smlp_toy_num_resp_mult_training_predictions_summary.csv to mas Passed! comparing Test106_smlp_toy_num_resp_mult_verify_results.json to master Passed! +comparing Test107_smlp_toy_num_resp_mult_dt_sklearn_tree_rules.txt to master +Passed! comparing Test107_smlp_toy_num_resp_mult.txt to master Passed! comparing Test107_smlp_toy_num_resp_mult_data_bounds.json to master Passed! -comparing Test107_smlp_toy_num_resp_mult_dt_sklearn_tree_rules.txt to master -Passed! comparing Test107_smlp_toy_num_resp_mult_labeled_prediction_precisions.csv to master Passed! comparing Test107_smlp_toy_num_resp_mult_labeled_predictions_summary.csv to master @@ -2708,8 +2746,6 @@ Passed! comparing Test112_test110_model_smlp_toy_basic_pred_unlabeled.txt to master comparing Test112_test110_model_smlp_toy_basic_pred_unlabeled_new_predictions_summary.csv to master Passed! -comparing test113_model_dt_sklearn_tree_rules.txt to master -Passed! comparing Test113_smlp_toy_basic.txt to master Passed! comparing Test113_smlp_toy_basic_labeled_prediction_precisions.csv to master @@ -2719,9 +2755,11 @@ Passed! comparing Test113_smlp_toy_basic_optimization_progress.csv to master Passed! comparing Test113_smlp_toy_basic_optimization_progress.json to master +Passed! comparing Test113_smlp_toy_basic_optimization_results.csv to master Passed! comparing Test113_smlp_toy_basic_optimization_results.json to master +Passed! comparing Test113_smlp_toy_basic_test_prediction_precisions.csv to master Passed! comparing Test113_smlp_toy_basic_test_predictions_summary.csv to master @@ -2733,6 +2771,8 @@ comparing Test113_smlp_toy_basic_training_predictions_summary.csv to master Passed! comparing test113_model_data_bounds.json to master Passed! +comparing test113_model_dt_sklearn_tree_rules.txt to master +Passed! comparing test113_model_model_features_dict.json to master Passed! comparing test113_model_model_levels_dict.json to master @@ -2740,12 +2780,12 @@ Passed! comparing test113_model_rerun_model_config.json to master Passed! File master test113_model_smlp_full_model_term.json does not exist -comparing Test114_smlp_toy_basic_dt_sklearn_tree_rules.txt to master -Passed! comparing Test114_smlp_toy_basic.txt to master Passed! comparing Test114_smlp_toy_basic_data_bounds.json to master Passed! +comparing Test114_smlp_toy_basic_dt_sklearn_tree_rules.txt to master +Passed! comparing Test114_smlp_toy_basic_labeled_prediction_precisions.csv to master Passed! comparing Test114_smlp_toy_basic_labeled_predictions_summary.csv to master @@ -2757,9 +2797,11 @@ Passed! comparing Test114_smlp_toy_basic_optimization_progress.csv to master Passed! comparing Test114_smlp_toy_basic_optimization_progress.json to master +Passed! comparing Test114_smlp_toy_basic_optimization_results.csv to master Passed! comparing Test114_smlp_toy_basic_optimization_results.json to master +Passed! File master Test114_smlp_toy_basic_smlp_full_model_term.json does not exist comparing Test114_smlp_toy_basic_test_prediction_precisions.csv to master Passed! @@ -2770,14 +2812,14 @@ comparing Test114_smlp_toy_basic_training_prediction_precisions.csv to master Passed! comparing Test114_smlp_toy_basic_training_predictions_summary.csv to master Passed! -File master Test115_smlp_toy_basic_dt_sklearn_y2_tree_rules.txt does not exist +File master Test115_smlp_toy_basic_dt_sklearn_y1_tree_rules.txt does not exist comparing Test115_smlp_toy_basic.txt to master Passed! comparing Test115_smlp_toy_basic_certify_results.json to master Passed! comparing Test115_smlp_toy_basic_data_bounds.json to master Passed! -File master Test115_smlp_toy_basic_dt_sklearn_y1_tree_rules.txt does not exist +File master Test115_smlp_toy_basic_dt_sklearn_y2_tree_rules.txt does not exist comparing Test115_smlp_toy_basic_labeled_prediction_precisions.csv to master Passed! comparing Test115_smlp_toy_basic_labeled_predictions_summary.csv to master @@ -2831,6 +2873,7 @@ comparing Test118_smlp_toy_basic_model_levels_dict.json to master Passed! File master Test118_smlp_toy_basic_trace.csv does not exist comparing Test118_smlp_toy_basic_verify_results.json to master +Passed! comparing Test119_smlp_toy_basic.txt to master Passed! comparing Test119_smlp_toy_basic_data_bounds.json to master @@ -2840,6 +2883,7 @@ Passed! comparing Test119_smlp_toy_basic_model_levels_dict.json to master Passed! comparing Test119_smlp_toy_basic_query_results.json to master +Passed! File master Test119_smlp_toy_basic_trace.csv does not exist comparing Test120_smlp_toy_basic.txt to master Passed! @@ -2861,6 +2905,7 @@ Passed! comparing Test121_smlp_toy_basic_model_levels_dict.json to master Passed! comparing Test121_smlp_toy_basic_synthesize_results.json to master +Passed! File master Test121_smlp_toy_basic_trace.csv does not exist comparing Test122_smlp_toy_basic.txt to master Passed! @@ -2873,7 +2918,9 @@ Passed! comparing Test122_smlp_toy_basic_optimization_progress.csv to master Passed! comparing Test122_smlp_toy_basic_optimization_progress.json to master +Passed! comparing Test122_smlp_toy_basic_optimization_results.json to master +Passed! File master Test122_smlp_toy_basic_trace.csv does not exist comparing Test123_smlp_toy_basic.txt to master Passed! @@ -2886,9 +2933,11 @@ Passed! comparing Test123_smlp_toy_basic_optimization_progress.csv to master Passed! comparing Test123_smlp_toy_basic_optimization_progress.json to master +Passed! comparing Test123_smlp_toy_basic_optimization_results.csv to master Passed! comparing Test123_smlp_toy_basic_optimization_results.json to master +Passed! File master Test123_smlp_toy_basic_sampling_prediction_precisions.csv does not exist File master Test123_smlp_toy_basic_sampling_predictions_summary.csv does not exist File master Test123_smlp_toy_basic_trace.csv does not exist @@ -2913,9 +2962,11 @@ Passed! comparing Test125_smlp_toy_basic_optimization_progress.csv to master Passed! comparing Test125_smlp_toy_basic_optimization_progress.json to master +Passed! comparing Test125_smlp_toy_basic_optimization_results.csv to master Passed! comparing Test125_smlp_toy_basic_optimization_results.json to master +Passed! File master Test125_smlp_toy_basic_trace.csv does not exist comparing Test126_smlp_toy_basic.txt to master Passed! @@ -2927,6 +2978,7 @@ comparing Test126_smlp_toy_basic_model_levels_dict.json to master Passed! File master Test126_smlp_toy_basic_trace.csv does not exist comparing Test126_smlp_toy_basic_verify_results.json to master +Passed! comparing Test127_smlp_toy_basic.txt to master Passed! comparing Test127_smlp_toy_basic_certify_results.json to master @@ -2993,6 +3045,7 @@ Passed! comparing Test129_smlp_toy_ctg_num_resp_training_predictions_summary.csv to master Passed! comparing Test129_smlp_toy_ctg_num_resp_verify_results.json to master +Passed! Test 130 Failed: Error in Build stage: Data file does not exist @@ -3056,7 +3109,7 @@ File master Test141_smlp_toy_num_resp_mult_test_predictions_summary.csv does not File master Test141_smlp_toy_num_resp_mult_trace.csv does not exist File master Test141_smlp_toy_num_resp_mult_training_prediction_precisions.csv does not exist File master Test141_smlp_toy_num_resp_mult_training_predictions_summary.csv does not exist -File master Test142_smlp_toy_num_resp_mult_rf_sklearn_y1_tree_rules.txt does not exist +File master Test142_smlp_toy_num_resp_mult_rf_sklearn_y2_tree_rules.txt does not exist File master Test142_smlp_toy_num_resp_mult.txt does not exist File master Test142_smlp_toy_num_resp_mult_data_bounds.json does not exist File master Test142_smlp_toy_num_resp_mult_features_scaler.pkl does not exist @@ -3070,7 +3123,7 @@ File master Test142_smlp_toy_num_resp_mult_optimization_progress.json does not e File master Test142_smlp_toy_num_resp_mult_optimization_results.csv does not exist File master Test142_smlp_toy_num_resp_mult_optimization_results.json does not exist File master Test142_smlp_toy_num_resp_mult_responses_scaler.pkl does not exist -File master Test142_smlp_toy_num_resp_mult_rf_sklearn_y2_tree_rules.txt does not exist +File master Test142_smlp_toy_num_resp_mult_rf_sklearn_y1_tree_rules.txt does not exist File master Test142_smlp_toy_num_resp_mult_test_prediction_precisions.csv does not exist File master Test142_smlp_toy_num_resp_mult_test_predictions_summary.csv does not exist File master Test142_smlp_toy_num_resp_mult_trace.csv does not exist @@ -3411,10 +3464,10 @@ Error in Build stage: Data file does not exist Error in Build stage: New data file does not exist +File master Test164_smlp_toy_num_resp_mult_dt_sklearn_tree_rules.txt does not exist File master Test164_smlp_toy_num_resp_mult.txt does not exist File master Test164_smlp_toy_num_resp_mult_data_bounds.json does not exist File master Test164_smlp_toy_num_resp_mult_dt_sklearn_model_complete.pkl does not exist -File master Test164_smlp_toy_num_resp_mult_dt_sklearn_tree_rules.txt does not exist File master Test164_smlp_toy_num_resp_mult_features_scaler.pkl does not exist File master Test164_smlp_toy_num_resp_mult_labeled_prediction_precisions.csv does not exist File master Test164_smlp_toy_num_resp_mult_labeled_predictions_summary.csv does not exist @@ -3478,7 +3531,7 @@ File master Test166_smlp_toy_num_resp_mult_test_predictions_summary.csv does not File master Test166_smlp_toy_num_resp_mult_trace.csv does not exist File master Test166_smlp_toy_num_resp_mult_training_prediction_precisions.csv does not exist File master Test166_smlp_toy_num_resp_mult_training_predictions_summary.csv does not exist -File master Test167_smlp_toy_num_resp_mult_rf_sklearn_y1_tree_rules.txt does not exist +File master Test167_smlp_toy_num_resp_mult_rf_sklearn_y2_tree_rules.txt does not exist File master Test167_smlp_toy_num_resp_mult.txt does not exist File master Test167_smlp_toy_num_resp_mult_data_bounds.json does not exist File master Test167_smlp_toy_num_resp_mult_features_scaler.pkl does not exist @@ -3492,7 +3545,7 @@ File master Test167_smlp_toy_num_resp_mult_optimization_progress.json does not e File master Test167_smlp_toy_num_resp_mult_optimization_results.csv does not exist File master Test167_smlp_toy_num_resp_mult_optimization_results.json does not exist File master Test167_smlp_toy_num_resp_mult_responses_scaler.pkl does not exist -File master Test167_smlp_toy_num_resp_mult_rf_sklearn_y2_tree_rules.txt does not exist +File master Test167_smlp_toy_num_resp_mult_rf_sklearn_y1_tree_rules.txt does not exist File master Test167_smlp_toy_num_resp_mult_test_prediction_precisions.csv does not exist File master Test167_smlp_toy_num_resp_mult_test_predictions_summary.csv does not exist File master Test167_smlp_toy_num_resp_mult_trace.csv does not exist @@ -3502,7 +3555,7 @@ File master Test167_smlp_toy_num_resp_mult_y1_smlp_full_model_term.json does not File master Test167_smlp_toy_num_resp_mult_y1_smlp_model_term.json does not exist File master Test167_smlp_toy_num_resp_mult_y2_smlp_full_model_term.json does not exist File master Test167_smlp_toy_num_resp_mult_y2_smlp_model_term.json does not exist -File master Test168_smlp_toy_num_resp_mult_y2_rf_caret_tree_rules.txt does not exist +File master Test168_smlp_toy_num_resp_mult_y1_rf_caret_tree_rules.txt does not exist File master Test168_smlp_toy_num_resp_mult.txt does not exist File master Test168_smlp_toy_num_resp_mult_data_bounds.json does not exist File master Test168_smlp_toy_num_resp_mult_features_scaler.pkl does not exist @@ -3521,15 +3574,15 @@ File master Test168_smlp_toy_num_resp_mult_test_predictions_summary.csv does not File master Test168_smlp_toy_num_resp_mult_trace.csv does not exist File master Test168_smlp_toy_num_resp_mult_training_prediction_precisions.csv does not exist File master Test168_smlp_toy_num_resp_mult_training_predictions_summary.csv does not exist -File master Test168_smlp_toy_num_resp_mult_y1_rf_caret_tree_rules.txt does not exist File master Test168_smlp_toy_num_resp_mult_y1_smlp_full_model_term.json does not exist File master Test168_smlp_toy_num_resp_mult_y1_smlp_model_term.json does not exist +File master Test168_smlp_toy_num_resp_mult_y2_rf_caret_tree_rules.txt does not exist File master Test168_smlp_toy_num_resp_mult_y2_smlp_full_model_term.json does not exist File master Test168_smlp_toy_num_resp_mult_y2_smlp_model_term.json does not exist -File master Test169_smlp_toy_num_resp_mult_et_sklearn_y2_tree_rules.txt does not exist +File master Test169_smlp_toy_num_resp_mult_et_sklearn_y1_tree_rules.txt does not exist File master Test169_smlp_toy_num_resp_mult.txt does not exist File master Test169_smlp_toy_num_resp_mult_data_bounds.json does not exist -File master Test169_smlp_toy_num_resp_mult_et_sklearn_y1_tree_rules.txt does not exist +File master Test169_smlp_toy_num_resp_mult_et_sklearn_y2_tree_rules.txt does not exist File master Test169_smlp_toy_num_resp_mult_features_scaler.pkl does not exist File master Test169_smlp_toy_num_resp_mult_labeled_prediction_precisions.csv does not exist File master Test169_smlp_toy_num_resp_mult_labeled_predictions_summary.csv does not exist @@ -3918,6 +3971,7 @@ File master Test188_smlp_toy_num_resp_mult_y1_smlp_full_model_term.json does not File master Test188_smlp_toy_num_resp_mult_y1_smlp_model_term.json does not exist File master Test188_smlp_toy_num_resp_mult_y2_smlp_full_model_term.json does not exist File master Test188_smlp_toy_num_resp_mult_y2_smlp_model_term.json does not exist +File master Test189_smlp_toy_num_resp_mult_rf_sklearn_tree_rules.txt does not exist File master Test189_smlp_toy_num_resp_mult.txt does not exist File master Test189_smlp_toy_num_resp_mult_data_bounds.json does not exist File master Test189_smlp_toy_num_resp_mult_features_scaler.pkl does not exist @@ -3931,7 +3985,6 @@ File master Test189_smlp_toy_num_resp_mult_optimization_progress.json does not e File master Test189_smlp_toy_num_resp_mult_optimization_results.csv does not exist File master Test189_smlp_toy_num_resp_mult_optimization_results.json does not exist File master Test189_smlp_toy_num_resp_mult_responses_scaler.pkl does not exist -File master Test189_smlp_toy_num_resp_mult_rf_sklearn_tree_rules.txt does not exist File master Test189_smlp_toy_num_resp_mult_smlp_full_model_term.json does not exist File master Test189_smlp_toy_num_resp_mult_smlp_model_term.json does not exist File master Test189_smlp_toy_num_resp_mult_test_prediction_precisions.csv does not exist @@ -3939,7 +3992,6 @@ File master Test189_smlp_toy_num_resp_mult_test_predictions_summary.csv does not File master Test189_smlp_toy_num_resp_mult_trace.csv does not exist File master Test189_smlp_toy_num_resp_mult_training_prediction_precisions.csv does not exist File master Test189_smlp_toy_num_resp_mult_training_predictions_summary.csv does not exist -File master Test190_smlp_toy_num_resp_mult_y2_rf_caret_tree_rules.txt does not exist File master Test190_smlp_toy_num_resp_mult.txt does not exist File master Test190_smlp_toy_num_resp_mult_data_bounds.json does not exist File master Test190_smlp_toy_num_resp_mult_features_scaler.pkl does not exist @@ -3961,12 +4013,13 @@ File master Test190_smlp_toy_num_resp_mult_training_predictions_summary.csv does File master Test190_smlp_toy_num_resp_mult_y1_rf_caret_tree_rules.txt does not exist File master Test190_smlp_toy_num_resp_mult_y1_smlp_full_model_term.json does not exist File master Test190_smlp_toy_num_resp_mult_y1_smlp_model_term.json does not exist +File master Test190_smlp_toy_num_resp_mult_y2_rf_caret_tree_rules.txt does not exist File master Test190_smlp_toy_num_resp_mult_y2_smlp_full_model_term.json does not exist File master Test190_smlp_toy_num_resp_mult_y2_smlp_model_term.json does not exist -File master Test191_smlp_toy_num_resp_mult_et_sklearn_y1_tree_rules.txt does not exist +File master Test191_smlp_toy_num_resp_mult_et_sklearn_y2_tree_rules.txt does not exist File master Test191_smlp_toy_num_resp_mult.txt does not exist File master Test191_smlp_toy_num_resp_mult_data_bounds.json does not exist -File master Test191_smlp_toy_num_resp_mult_et_sklearn_y2_tree_rules.txt does not exist +File master Test191_smlp_toy_num_resp_mult_et_sklearn_y1_tree_rules.txt does not exist File master Test191_smlp_toy_num_resp_mult_features_scaler.pkl does not exist File master Test191_smlp_toy_num_resp_mult_labeled_prediction_precisions.csv does not exist File master Test191_smlp_toy_num_resp_mult_labeled_predictions_summary.csv does not exist @@ -4008,7 +4061,6 @@ File master Test192_smlp_toy_num_resp_mult_test_predictions_summary.csv does not File master Test192_smlp_toy_num_resp_mult_trace.csv does not exist File master Test192_smlp_toy_num_resp_mult_training_prediction_precisions.csv does not exist File master Test192_smlp_toy_num_resp_mult_training_predictions_summary.csv does not exist -File master Test193_smlp_toy_num_resp_mult_y2_et_caret_tree_rules.txt does not exist File master Test193_smlp_toy_num_resp_mult.txt does not exist File master Test193_smlp_toy_num_resp_mult_data_bounds.json does not exist File master Test193_smlp_toy_num_resp_mult_features_scaler.pkl does not exist @@ -4030,9 +4082,9 @@ File master Test193_smlp_toy_num_resp_mult_training_predictions_summary.csv does File master Test193_smlp_toy_num_resp_mult_y1_et_caret_tree_rules.txt does not exist File master Test193_smlp_toy_num_resp_mult_y1_smlp_full_model_term.json does not exist File master Test193_smlp_toy_num_resp_mult_y1_smlp_model_term.json does not exist +File master Test193_smlp_toy_num_resp_mult_y2_et_caret_tree_rules.txt does not exist File master Test193_smlp_toy_num_resp_mult_y2_smlp_full_model_term.json does not exist File master Test193_smlp_toy_num_resp_mult_y2_smlp_model_term.json does not exist -File master Test194_smlp_toy_num_resp_mult_rf_sklearn_y1_tree_rules.txt does not exist File master Test194_smlp_toy_num_resp_mult.txt does not exist File master Test194_smlp_toy_num_resp_mult_data_bounds.json does not exist File master Test194_smlp_toy_num_resp_mult_features_scaler.pkl does not exist @@ -4046,6 +4098,7 @@ File master Test194_smlp_toy_num_resp_mult_optimization_progress.json does not e File master Test194_smlp_toy_num_resp_mult_optimization_results.csv does not exist File master Test194_smlp_toy_num_resp_mult_optimization_results.json does not exist File master Test194_smlp_toy_num_resp_mult_responses_scaler.pkl does not exist +File master Test194_smlp_toy_num_resp_mult_rf_sklearn_y1_tree_rules.txt does not exist File master Test194_smlp_toy_num_resp_mult_rf_sklearn_y2_tree_rules.txt does not exist File master Test194_smlp_toy_num_resp_mult_test_prediction_precisions.csv does not exist File master Test194_smlp_toy_num_resp_mult_test_predictions_summary.csv does not exist @@ -4098,10 +4151,10 @@ File master Test196_smlp_toy_num_resp_mult_test_predictions_summary.csv does not File master Test196_smlp_toy_num_resp_mult_trace.csv does not exist File master Test196_smlp_toy_num_resp_mult_training_prediction_precisions.csv does not exist File master Test196_smlp_toy_num_resp_mult_training_predictions_summary.csv does not exist -File master Test197_smlp_toy_num_resp_mult_dt_sklearn_tree_rules.txt does not exist File master Test197_smlp_toy_num_resp_mult.txt does not exist File master Test197_smlp_toy_num_resp_mult_data_bounds.json does not exist File master Test197_smlp_toy_num_resp_mult_dt_sklearn_model_complete.pkl does not exist +File master Test197_smlp_toy_num_resp_mult_dt_sklearn_tree_rules.txt does not exist File master Test197_smlp_toy_num_resp_mult_features_scaler.pkl does not exist File master Test197_smlp_toy_num_resp_mult_labeled_prediction_precisions.csv does not exist File master Test197_smlp_toy_num_resp_mult_labeled_predictions_summary.csv does not exist @@ -4139,9 +4192,9 @@ File master Test198_smlp_toy_num_resp_mult_test_predictions_summary.csv does not File master Test198_smlp_toy_num_resp_mult_trace.csv does not exist File master Test198_smlp_toy_num_resp_mult_training_prediction_precisions.csv does not exist File master Test198_smlp_toy_num_resp_mult_training_predictions_summary.csv does not exist +File master Test199_smlp_toy_num_resp_mult_et_sklearn_tree_rules.txt does not exist File master Test199_smlp_toy_num_resp_mult.txt does not exist File master Test199_smlp_toy_num_resp_mult_data_bounds.json does not exist -File master Test199_smlp_toy_num_resp_mult_et_sklearn_tree_rules.txt does not exist File master Test199_smlp_toy_num_resp_mult_features_scaler.pkl does not exist File master Test199_smlp_toy_num_resp_mult_labeled_prediction_precisions.csv does not exist File master Test199_smlp_toy_num_resp_mult_labeled_predictions_summary.csv does not exist @@ -4279,5 +4332,5 @@ File master Test227_smlp_toy_basic_features_summary.csv does not exist master log file does not exist! Do you wish to copy the new log file to master? (yes/no|y/n): No new tests crashed (not in the masters) -Time: 33.25827042659124 minutes +Time: 20.00333364009857 minutes End of regression diff --git a/tests/smlp_regression/run_smlp_regression_venv_expected_diff_report.log b/tests/smlp_regression/run_smlp_regression_venv_expected_diff_report.log index 71387358..e27a79c4 100644 --- a/tests/smlp_regression/run_smlp_regression_venv_expected_diff_report.log +++ b/tests/smlp_regression/run_smlp_regression_venv_expected_diff_report.log @@ -400,68 +400,12 @@ --- > smlp_logger - INFO - Seving model rerun configuration in file ./../models/test47_model_rerun_model_config.json =================== End of Test47_test47_model_smlp_toy_pf_mult.txt diff report ================================ -=================== Diff report for: Test58_smlp_toy_num_resp_mult_optimization_progress.json ================================== -17,19d16 -< "p1": { -< "value_in_config": 2.0 -< }, -23,24c20,21 -< "y1": { -< "value_in_config": 5.0 ---- -> "p1": { -> "value_in_config": 2.0 -27a25,27 -> }, -> "y1": { -> "value_in_config": 5.0 -=================== End of Test58_smlp_toy_num_resp_mult_optimization_progress.json diff report ================================ -=================== Diff report for: Test58_smlp_toy_num_resp_mult_optimization_results.json ================================== -3d2 -< "p1": 7.0, -5c4 -< "y1": 9.0, ---- -> "p1": 7.0, -6a6 -> "y1": 9.0, -15d14 -< "p1": 7.0, -17c16 -< "y1": 5.0, ---- -> "p1": 7.0, -18a18 -> "y1": 5.0, -=================== End of Test58_smlp_toy_num_resp_mult_optimization_results.json diff report ================================ -=================== Diff report for: Test63_smlp_toy_num_resp_mult_verify_results.json ================================== -12d11 -< "p1": 1.0, -14,15c13,15 -< "y1": 9.0, -< "p2": 7.0 ---- -> "p1": 1.0, -> "p2": 7.0, -> "y1": 9.0 -=================== End of Test63_smlp_toy_num_resp_mult_verify_results.json diff report ================================ =================== Diff report for: Test64_test63_model.txt ================================== 27c27 < smlp_logger - INFO - Seving model rerun configuration in file ../models/test63_model_rerun_model_config.json --- > smlp_logger - INFO - Seving model rerun configuration in file ./../models/test63_model_rerun_model_config.json =================== End of Test64_test63_model.txt diff report ================================ -=================== Diff report for: Test64_test63_model_verify_results.json ================================== -12d11 -< "p1": 1.0, -14,15c13,15 -< "y1": 9.0, -< "p2": 7.0 ---- -> "p1": 1.0, -> "p2": 7.0, -> "y1": 9.0 -=================== End of Test64_test63_model_verify_results.json diff report ================================ =================== Diff report for: Test66_test65_model.txt ================================== 0a1,97 > @@ -563,7 +507,7 @@ > smlp_logger - INFO - Executing run_smlp.py script: End =================== End of Test66_test65_model.txt diff report ================================ =================== Diff report for: Test66_test65_model_verify_results.json ================================== -diff: /home/mdmitry/github/smlptech/scripts/venv/smlp_package_venv/smlp/regr_smlp/code/Test66_test65_model_verify_results.json: No such file or directory +diff: /home/zurabk/smlp/repo/smlp/scripts/venv/smlp_package_venv/smlp/regr_smlp/code/Test66_test65_model_verify_results.json: No such file or directory =================== End of Test66_test65_model_verify_results.json diff report ================================ =================== Diff report for: Test68_test67_model.txt ================================== 0a1,97 @@ -666,36 +610,14 @@ diff: /home/mdmitry/github/smlptech/scripts/venv/smlp_package_venv/smlp/regr_sml > smlp_logger - INFO - Executing run_smlp.py script: End =================== End of Test68_test67_model.txt diff report ================================ =================== Diff report for: Test68_test67_model_verify_results.json ================================== -diff: /home/mdmitry/github/smlptech/scripts/venv/smlp_package_venv/smlp/regr_smlp/code/Test68_test67_model_verify_results.json: No such file or directory +diff: /home/zurabk/smlp/repo/smlp/scripts/venv/smlp_package_venv/smlp/regr_smlp/code/Test68_test67_model_verify_results.json: No such file or directory =================== End of Test68_test67_model_verify_results.json diff report ================================ -=================== Diff report for: Test69_smlp_toy_num_resp_mult_verify_results.json ================================== -6d5 -< "p1": 1.0, -8,9c7,9 -< "y2": 5.078784562647343, -< "p2": 7.0 ---- -> "p1": 1.0, -> "p2": 7.0, -> "y2": 5.078784562647343 -=================== End of Test69_smlp_toy_num_resp_mult_verify_results.json diff report ================================ =================== Diff report for: Test70_test69_model.txt ================================== 25c25 < smlp_logger - INFO - Seving model rerun configuration in file ../models/test69_model_rerun_model_config.json --- > smlp_logger - INFO - Seving model rerun configuration in file ./../models/test69_model_rerun_model_config.json =================== End of Test70_test69_model.txt diff report ================================ -=================== Diff report for: Test70_test69_model_verify_results.json ================================== -6d5 -< "p1": 1.0, -8,9c7,9 -< "y2": 5.078784562647343, -< "p2": 7.0 ---- -> "p1": 1.0, -> "p2": 7.0, -> "y2": 5.078784562647343 -=================== End of Test70_test69_model_verify_results.json diff report ================================ =================== Diff report for: Test72_test71_model.txt ================================== 0a1,84 > @@ -784,7 +706,7 @@ diff: /home/mdmitry/github/smlptech/scripts/venv/smlp_package_venv/smlp/regr_sml > smlp_logger - INFO - Executing run_smlp.py script: End =================== End of Test72_test71_model.txt diff report ================================ =================== Diff report for: Test72_test71_model_verify_results.json ================================== -diff: /home/mdmitry/github/smlptech/scripts/venv/smlp_package_venv/smlp/regr_smlp/code/Test72_test71_model_verify_results.json: No such file or directory +diff: /home/zurabk/smlp/repo/smlp/scripts/venv/smlp_package_venv/smlp/regr_smlp/code/Test72_test71_model_verify_results.json: No such file or directory =================== End of Test72_test71_model_verify_results.json diff report ================================ =================== Diff report for: Test77_test76_model.txt ================================== 0a1,110 @@ -900,1224 +822,22 @@ diff: /home/mdmitry/github/smlptech/scripts/venv/smlp_package_venv/smlp/regr_sml > smlp_logger - INFO - Executing run_smlp.py script: End =================== End of Test77_test76_model.txt diff report ================================ =================== Diff report for: Test77_test76_model_verify_results.json ================================== -diff: /home/mdmitry/github/smlptech/scripts/venv/smlp_package_venv/smlp/regr_smlp/code/Test77_test76_model_verify_results.json: No such file or directory +diff: /home/zurabk/smlp/repo/smlp/scripts/venv/smlp_package_venv/smlp/regr_smlp/code/Test77_test76_model_verify_results.json: No such file or directory =================== End of Test77_test76_model_verify_results.json diff report ================================ -=================== Diff report for: Test79_smlp_toy_num_resp_mult_query_results.json ================================== -14a15 -> "p1": 7.0, -16d16 -< "y2": 9.0, -18c18 -< "p1": 7.0 ---- -> "y2": 9.0 -=================== End of Test79_smlp_toy_num_resp_mult_query_results.json diff report ================================ -=================== Diff report for: Test80_smlp_toy_num_resp_mult_optimization_progress.json ================================== -10,12d9 -< "p1": { -< "value_in_config": 4.0 -< }, -16,17c13,14 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 4.0 -20a18,20 -> }, -> "y1": { -> "value_in_config": 9.0 -=================== End of Test80_smlp_toy_num_resp_mult_optimization_progress.json diff report ================================ -=================== Diff report for: Test80_smlp_toy_num_resp_mult_optimization_results.json ================================== -3d2 -< "p1": 7.0, -5c4 -< "y1": 9.0, ---- -> "p1": 7.0, -6a6 -> "y1": 9.0, -=================== End of Test80_smlp_toy_num_resp_mult_optimization_results.json diff report ================================ -=================== Diff report for: Test81_smlp_toy_num_resp_mult_optimization_progress.json ================================== -10,12d9 -< "p1": { -< "value_in_config": 4.0 -< }, -16,17c13,14 -< "y1": { -< "value_in_config": 5.0 ---- -> "p1": { -> "value_in_config": 4.0 -20a18,20 -> }, -> "y1": { -> "value_in_config": 5.0 -=================== End of Test81_smlp_toy_num_resp_mult_optimization_progress.json diff report ================================ -=================== Diff report for: Test81_smlp_toy_num_resp_mult_optimization_results.json ================================== -3d2 -< "p1": 4.0, -5c4 -< "y1": 9.0, ---- -> "p1": 4.0, -6a6 -> "y1": 9.0, -=================== End of Test81_smlp_toy_num_resp_mult_optimization_results.json diff report ================================ -=================== Diff report for: Test82_smlp_toy_num_resp_mult_optimization_progress.json ================================== -24,26d23 -< "p1": { -< "value_in_config": 4.0 -< }, -30,31c27,28 -< "y1": { -< "value_in_config": 5.0 ---- -> "p1": { -> "value_in_config": 4.0 -35a33,35 -> "y1": { -> "value_in_config": 5.0 -> }, -62,64d61 -< "p1": { -< "value_in_config": 4.0 -< }, -68,69c65,66 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 4.0 -73a71,73 -> "y1": { -> "value_in_config": 9.0 -> }, -121,123d120 -< "p1": { -< "value_in_config": 4.0 -< }, -127,128c124,125 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 4.0 -131a129,131 -> }, -> "y1": { -> "value_in_config": 9.0 -=================== End of Test82_smlp_toy_num_resp_mult_optimization_progress.json diff report ================================ -=================== Diff report for: Test82_smlp_toy_num_resp_mult_optimization_results.json ================================== -23,25d22 -< "p1": { -< "value_in_config": 4.0 -< }, -29,30c26,27 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 4.0 -33a31,33 -> }, -> "y1": { -> "value_in_config": 9.0 -=================== End of Test82_smlp_toy_num_resp_mult_optimization_results.json diff report ================================ -=================== Diff report for: Test83_smlp_toy_num_resp_mult_optimization_progress.json ================================== -24,26d23 -< "p1": { -< "value_in_config": 4.0 -< }, -30,31c27,28 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 4.0 -35a33,35 -> "y1": { -> "value_in_config": 9.0 -> }, -62,64d61 -< "p1": { -< "value_in_config": 4.0 -< }, -68,69c65,66 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 4.0 -73a71,73 -> "y1": { -> "value_in_config": 9.0 -> }, -100,102d99 -< "p1": { -< "value_in_config": 4.0 -< }, -106,107c103,104 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 4.0 -111a109,111 -> "y1": { -> "value_in_config": 9.0 -> }, -138,140d137 -< "p1": { -< "value_in_config": 4.0 -< }, -144,145c141,142 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 4.0 -149a147,149 -> "y1": { -> "value_in_config": 9.0 -> }, -197,199d196 -< "p1": { -< "value_in_config": 4.0 -< }, -203,204c200,201 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 4.0 -208a206,208 -> "y1": { -> "value_in_config": 9.0 -> }, -235,237d234 -< "p1": { -< "value_in_config": 7.0 -< }, -241,242c238,239 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 7.0 -246a244,246 -> "y1": { -> "value_in_config": 9.0 -> }, -273,275d272 -< "p1": { -< "value_in_config": 7.0 -< }, -279,280c276,277 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 7.0 -284a282,284 -> "y1": { -> "value_in_config": 9.0 -> }, -332,334d331 -< "p1": { -< "value_in_config": 7.0 -< }, -338,339c335,336 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 7.0 -342a340,342 -> }, -> "y1": { -> "value_in_config": 9.0 -=================== End of Test83_smlp_toy_num_resp_mult_optimization_progress.json diff report ================================ -=================== Diff report for: Test83_smlp_toy_num_resp_mult_optimization_results.json ================================== -23,25d22 -< "p1": { -< "value_in_config": 7.0 -< }, -29,30c26,27 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 7.0 -33a31,33 -> }, -> "y1": { -> "value_in_config": 9.0 -=================== End of Test83_smlp_toy_num_resp_mult_optimization_results.json diff report ================================ -=================== Diff report for: Test85_smlp_toy_num_resp_mult_optimization_progress.json ================================== -17,19d16 -< "p1": { -< "value_in_config": 4.0 -< }, -23,24c20,21 -< "y1": { -< "value_in_config": 5.0 ---- -> "p1": { -> "value_in_config": 4.0 -27a25,27 -> }, -> "y1": { -> "value_in_config": 5.0 -=================== End of Test85_smlp_toy_num_resp_mult_optimization_progress.json diff report ================================ -=================== Diff report for: Test85_smlp_toy_num_resp_mult_optimization_results.json ================================== -3d2 -< "p1": 4.0, -5c4 -< "y1": 5.0, ---- -> "p1": 4.0, -6a6 -> "y1": 5.0, -18d17 -< "p1": 4.0, -20c19 -< "y1": 5.0, ---- -> "p1": 4.0, -21a21 -> "y1": 5.0, -=================== End of Test85_smlp_toy_num_resp_mult_optimization_results.json diff report ================================ -=================== Diff report for: Test86_smlp_toy_num_resp_mult_optimization_progress.json ================================== -17,19d16 -< "p1": { -< "value_in_config": 4.0 -< }, -23,24c20,21 -< "y1": { -< "value_in_config": 5.0 ---- -> "p1": { -> "value_in_config": 4.0 -27a25,27 -> }, -> "y1": { -> "value_in_config": 5.0 -=================== End of Test86_smlp_toy_num_resp_mult_optimization_progress.json diff report ================================ -=================== Diff report for: Test86_smlp_toy_num_resp_mult_optimization_results.json ================================== -3d2 -< "p1": 4.0, -5c4 -< "y1": 5.0, ---- -> "p1": 4.0, -6a6 -> "y1": 5.0, -18d17 -< "p1": 4.0, -20c19 -< "y1": 5.0, ---- -> "p1": 4.0, -21a21 -> "y1": 5.0, -=================== End of Test86_smlp_toy_num_resp_mult_optimization_results.json diff report ================================ -=================== Diff report for: Test87_smlp_toy_num_resp_mult_verify_results.json ================================== -6d5 -< "p1": 2.5, -8c7 -< "y1": 9.0, ---- -> "p1": 2.5, -9a9 -> "y1": 9.0, -24d23 -< "p1": 2.5, -26c25 -< "y1": 9.0, ---- -> "p1": 2.5, -27a27 -> "y1": 9.0, -=================== End of Test87_smlp_toy_num_resp_mult_verify_results.json diff report ================================ -=================== Diff report for: Test88_smlp_toy_num_resp_mult_optimization_progress.json ================================== -24,26d23 -< "p1": { -< "value_in_config": 4.0 -< }, -30,31c27,28 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 4.0 -35a33,35 -> "y1": { -> "value_in_config": 9.0 -> }, -62,64d61 -< "p1": { -< "value_in_config": 4.0 -< }, -68,69c65,66 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 4.0 -73a71,73 -> "y1": { -> "value_in_config": 9.0 -> }, -100,102d99 -< "p1": { -< "value_in_config": 4.0 -< }, -106,107c103,104 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 4.0 -111a109,111 -> "y1": { -> "value_in_config": 9.0 -> }, -138,140d137 -< "p1": { -< "value_in_config": 4.0 -< }, -144,145c141,142 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 4.0 -149a147,149 -> "y1": { -> "value_in_config": 9.0 -> }, -197,199d196 -< "p1": { -< "value_in_config": 4.0 -< }, -203,204c200,201 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 4.0 -208a206,208 -> "y1": { -> "value_in_config": 9.0 -> }, -235,237d234 -< "p1": { -< "value_in_config": 7.0 -< }, -241,242c238,239 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 7.0 -246a244,246 -> "y1": { -> "value_in_config": 9.0 -> }, -273,275d272 -< "p1": { -< "value_in_config": 7.0 -< }, -279,280c276,277 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 7.0 -284a282,284 -> "y1": { -> "value_in_config": 9.0 -> }, -332,334d331 -< "p1": { -< "value_in_config": 7.0 -< }, -338,339c335,336 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 7.0 -342a340,342 -> }, -> "y1": { -> "value_in_config": 9.0 -=================== End of Test88_smlp_toy_num_resp_mult_optimization_progress.json diff report ================================ -=================== Diff report for: Test88_smlp_toy_num_resp_mult_optimization_results.json ================================== -23,25d22 -< "p1": { -< "value_in_config": 7.0 -< }, -29,30c26,27 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 7.0 -33a31,33 -> }, -> "y1": { -> "value_in_config": 9.0 -=================== End of Test88_smlp_toy_num_resp_mult_optimization_results.json diff report ================================ -=================== Diff report for: Test89_smlp_toy_num_resp_mult_query_results.json ================================== -14a15 -> "p1": 7.0, -16d16 -< "y2": 9.0, -18c18 -< "p1": 7.0 ---- -> "y2": 9.0 -=================== End of Test89_smlp_toy_num_resp_mult_query_results.json diff report ================================ -=================== Diff report for: Test93_smlp_toy_num_resp_mult_optimization_progress.json ================================== -17,19d16 -< "p1": { -< "value_in_config": 2.0 -< }, -23,24c20,21 -< "y1": { -< "value_in_config": 5.0 ---- -> "p1": { -> "value_in_config": 2.0 -28a26,28 -> "y1": { -> "value_in_config": 5.0 -> }, -48,50d47 -< "p1": { -< "value_in_config": 2.0 -< }, -54,55c51,52 -< "y1": { -< "value_in_config": 5.0 ---- -> "p1": { -> "value_in_config": 2.0 -59a57,59 -> "y1": { -> "value_in_config": 5.0 -> }, -100,102d99 -< "p1": { -< "value_in_config": 2.0 -< }, -106,107c103,104 -< "y1": { -< "value_in_config": 5.0 ---- -> "p1": { -> "value_in_config": 2.0 -110a108,110 -> }, -> "y1": { -> "value_in_config": 5.0 -=================== End of Test93_smlp_toy_num_resp_mult_optimization_progress.json diff report ================================ -=================== Diff report for: Test93_smlp_toy_num_resp_mult_optimization_results.json ================================== -16,18d15 -< "p1": { -< "value_in_config": 2.0 -< }, -22,23c19,20 -< "y1": { -< "value_in_config": 5.0 ---- -> "p1": { -> "value_in_config": 2.0 -26a24,26 -> }, -> "y1": { -> "value_in_config": 5.0 -=================== End of Test93_smlp_toy_num_resp_mult_optimization_results.json diff report ================================ -=================== Diff report for: Test94_smlp_toy_num_resp_mult_optimization_progress.json ================================== -17,19d16 -< "p1": { -< "value_in_config": 4.0 -< }, -23,24c20,21 -< "y1": { -< "value_in_config": 7.48 ---- -> "p1": { -> "value_in_config": 4.0 -28a26,28 -> "y1": { -> "value_in_config": 7.48 -> }, -48,50d47 -< "p1": { -< "value_in_config": 4.0 -< }, -54,55c51,52 -< "y1": { -< "value_in_config": 7.48 ---- -> "p1": { -> "value_in_config": 4.0 -59a57,59 -> "y1": { -> "value_in_config": 7.48 -> }, -79,81d78 -< "p1": { -< "value_in_config": 4.0 -< }, -85,86c82,83 -< "y1": { -< "value_in_config": 7.48 ---- -> "p1": { -> "value_in_config": 4.0 -90a88,90 -> "y1": { -> "value_in_config": 7.48 -> }, -110,112d109 -< "p1": { -< "value_in_config": 4.0 -< }, -116,117c113,114 -< "y1": { -< "value_in_config": 7.48 ---- -> "p1": { -> "value_in_config": 4.0 -121a119,121 -> "y1": { -> "value_in_config": 7.48 -> }, -162,164d161 -< "p1": { -< "value_in_config": 4.0 -< }, -168,169c165,166 -< "y1": { -< "value_in_config": 7.48 ---- -> "p1": { -> "value_in_config": 4.0 -173a171,173 -> "y1": { -> "value_in_config": 7.48 -> }, -193,195d192 -< "p1": { -< "value_in_config": 4.0 -< }, -199,200c196,197 -< "y1": { -< "value_in_config": 7.48 ---- -> "p1": { -> "value_in_config": 4.0 -204a202,204 -> "y1": { -> "value_in_config": 7.48 -> }, -224,226d223 -< "p1": { -< "value_in_config": 4.0 -< }, -230,231c227,228 -< "y1": { -< "value_in_config": 7.48 ---- -> "p1": { -> "value_in_config": 4.0 -235a233,235 -> "y1": { -> "value_in_config": 7.48 -> }, -276,278d275 -< "p1": { -< "value_in_config": 4.0 -< }, -282,283c279,280 -< "y1": { -< "value_in_config": 7.48 ---- -> "p1": { -> "value_in_config": 4.0 -286a284,286 -> }, -> "y1": { -> "value_in_config": 7.48 -=================== End of Test94_smlp_toy_num_resp_mult_optimization_progress.json diff report ================================ -=================== Diff report for: Test94_smlp_toy_num_resp_mult_optimization_results.json ================================== -16,18d15 -< "p1": { -< "value_in_config": 4.0 -< }, -22,23c19,20 -< "y1": { -< "value_in_config": 7.48 ---- -> "p1": { -> "value_in_config": 4.0 -26a24,26 -> }, -> "y1": { -> "value_in_config": 7.48 -=================== End of Test94_smlp_toy_num_resp_mult_optimization_results.json diff report ================================ -=================== Diff report for: Test95_smlp_toy_num_resp_mult_optimization_progress.json ================================== -17,19d16 -< "p1": { -< "value_in_config": 2.0 -< }, -23,24c20,21 -< "y1": { -< "value_in_config": 7.0 ---- -> "p1": { -> "value_in_config": 2.0 -28a26,28 -> "y1": { -> "value_in_config": 7.0 -> }, -48,50d47 -< "p1": { -< "value_in_config": 2.0 -< }, -54,55c51,52 -< "y1": { -< "value_in_config": 7.0 ---- -> "p1": { -> "value_in_config": 2.0 -59a57,59 -> "y1": { -> "value_in_config": 7.0 -> }, -79,81d78 -< "p1": { -< "value_in_config": 2.0 -< }, -85,86c82,83 -< "y1": { -< "value_in_config": 7.0 ---- -> "p1": { -> "value_in_config": 2.0 -90a88,90 -> "y1": { -> "value_in_config": 7.0 -> }, -131,133d130 -< "p1": { -< "value_in_config": 2.0 -< }, -137,138c134,135 -< "y1": { -< "value_in_config": 7.0 ---- -> "p1": { -> "value_in_config": 2.0 -141a139,141 -> }, -> "y1": { -> "value_in_config": 7.0 -=================== End of Test95_smlp_toy_num_resp_mult_optimization_progress.json diff report ================================ -=================== Diff report for: Test95_smlp_toy_num_resp_mult_optimization_results.json ================================== -16,18d15 -< "p1": { -< "value_in_config": 2.0 -< }, -22,23c19,20 -< "y1": { -< "value_in_config": 7.0 ---- -> "p1": { -> "value_in_config": 2.0 -26a24,26 -> }, -> "y1": { -> "value_in_config": 7.0 -=================== End of Test95_smlp_toy_num_resp_mult_optimization_results.json diff report ================================ -=================== Diff report for: Test96_smlp_toy_num_resp_mult_optimization_progress.json ================================== -17,19d16 -< "p1": { -< "value_in_config": 4.0 -< }, -23,24c20,21 -< "y1": { -< "value_in_config": 6.44 ---- -> "p1": { -> "value_in_config": 4.0 -28a26,28 -> "y1": { -> "value_in_config": 6.44 -> }, -48,50d47 -< "p1": { -< "value_in_config": 4.0 -< }, -54,55c51,52 -< "y1": { -< "value_in_config": 6.44 ---- -> "p1": { -> "value_in_config": 4.0 -59a57,59 -> "y1": { -> "value_in_config": 6.44 -> }, -79,81d78 -< "p1": { -< "value_in_config": 4.0 -< }, -85,86c82,83 -< "y1": { -< "value_in_config": 6.44 ---- -> "p1": { -> "value_in_config": 4.0 -90a88,90 -> "y1": { -> "value_in_config": 6.44 -> }, -131,133d130 -< "p1": { -< "value_in_config": 4.0 -< }, -137,138c134,135 -< "y1": { -< "value_in_config": 6.44 ---- -> "p1": { -> "value_in_config": 4.0 -142a140,142 -> "y1": { -> "value_in_config": 6.44 -> }, -162,164d161 -< "p1": { -< "value_in_config": 4.0 -< }, -168,169c165,166 -< "y1": { -< "value_in_config": 6.44 ---- -> "p1": { -> "value_in_config": 4.0 -173a171,173 -> "y1": { -> "value_in_config": 6.44 -> }, -193,195d192 -< "p1": { -< "value_in_config": 4.0 -< }, -199,200c196,197 -< "y1": { -< "value_in_config": 6.44 ---- -> "p1": { -> "value_in_config": 4.0 -204a202,204 -> "y1": { -> "value_in_config": 6.44 -> }, -245,247d244 -< "p1": { -< "value_in_config": 4.0 -< }, -251,252c248,249 -< "y1": { -< "value_in_config": 6.44 ---- -> "p1": { -> "value_in_config": 4.0 -255a253,255 -> }, -> "y1": { -> "value_in_config": 6.44 -=================== End of Test96_smlp_toy_num_resp_mult_optimization_progress.json diff report ================================ -=================== Diff report for: Test96_smlp_toy_num_resp_mult_optimization_results.json ================================== -16,18d15 -< "p1": { -< "value_in_config": 4.0 -< }, -22,23c19,20 -< "y1": { -< "value_in_config": 6.44 ---- -> "p1": { -> "value_in_config": 4.0 -26a24,26 -> }, -> "y1": { -> "value_in_config": 6.44 -=================== End of Test96_smlp_toy_num_resp_mult_optimization_results.json diff report ================================ =================== Diff report for: Test97_smlp_toy_num_resp_mult.txt ================================== 252c252 < smlp_logger - INFO - Model operator counts for y2: {'add': 100, 'mul': 715, 'const': 2547, 'ite': 305, 'and': 408, 'prop': 713, 'sub': 713, 'var': 713} --- > smlp_logger - INFO - Model operator counts for y2: {'add': 100, 'mul': 716, 'const': 2550, 'ite': 305, 'and': 409, 'prop': 714, 'sub': 714, 'var': 714} =================== End of Test97_smlp_toy_num_resp_mult.txt diff report ================================ -=================== Diff report for: Test98_smlp_toy_num_resp_mult_optimization_progress.json ================================== -17,19d16 -< "p1": { -< "value_in_config": 2.0 -< }, -23,24c20,21 -< "y1": { -< "value_in_config": 7.0 ---- -> "p1": { -> "value_in_config": 2.0 -28a26,28 -> "y1": { -> "value_in_config": 7.0 -> }, -48,50d47 -< "p1": { -< "value_in_config": 2.0 -< }, -54,55c51,52 -< "y1": { -< "value_in_config": 7.0 ---- -> "p1": { -> "value_in_config": 2.0 -59a57,59 -> "y1": { -> "value_in_config": 7.0 -> }, -79,81d78 -< "p1": { -< "value_in_config": 2.0 -< }, -85,86c82,83 -< "y1": { -< "value_in_config": 7.0 ---- -> "p1": { -> "value_in_config": 2.0 -90a88,90 -> "y1": { -> "value_in_config": 7.0 -> }, -131,133d130 -< "p1": { -< "value_in_config": 2.0 -< }, -137,138c134,135 -< "y1": { -< "value_in_config": 7.0 ---- -> "p1": { -> "value_in_config": 2.0 -141a139,141 -> }, -> "y1": { -> "value_in_config": 7.0 -=================== End of Test98_smlp_toy_num_resp_mult_optimization_progress.json diff report ================================ -=================== Diff report for: Test98_smlp_toy_num_resp_mult_optimization_results.json ================================== -16,18d15 -< "p1": { -< "value_in_config": 2.0 -< }, -22,23c19,20 -< "y1": { -< "value_in_config": 7.0 ---- -> "p1": { -> "value_in_config": 2.0 -26a24,26 -> }, -> "y1": { -> "value_in_config": 7.0 -=================== End of Test98_smlp_toy_num_resp_mult_optimization_results.json diff report ================================ -=================== Diff report for: Test99_smlp_toy_num_resp_mult_optimization_progress.json ================================== -24,26d23 -< "p1": { -< "value_in_config": 4.0 -< }, -30,31c27,28 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 4.0 -35a33,35 -> "y1": { -> "value_in_config": 9.0 -> }, -62,64d61 -< "p1": { -< "value_in_config": 4.0 -< }, -68,69c65,66 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 4.0 -73a71,73 -> "y1": { -> "value_in_config": 9.0 -> }, -100,102d99 -< "p1": { -< "value_in_config": 4.0 -< }, -106,107c103,104 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 4.0 -111a109,111 -> "y1": { -> "value_in_config": 9.0 -> }, -138,140d137 -< "p1": { -< "value_in_config": 4.0 -< }, -144,145c141,142 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 4.0 -149a147,149 -> "y1": { -> "value_in_config": 9.0 -> }, -197,199d196 -< "p1": { -< "value_in_config": 4.0 -< }, -203,204c200,201 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 4.0 -208a206,208 -> "y1": { -> "value_in_config": 9.0 -> }, -235,237d234 -< "p1": { -< "value_in_config": 7.0 -< }, -241,242c238,239 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 7.0 -246a244,246 -> "y1": { -> "value_in_config": 9.0 -> }, -273,275d272 -< "p1": { -< "value_in_config": 7.0 -< }, -279,280c276,277 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 7.0 -284a282,284 -> "y1": { -> "value_in_config": 9.0 -> }, -332,334d331 -< "p1": { -< "value_in_config": 7.0 -< }, -338,339c335,336 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 7.0 -342a340,342 -> }, -> "y1": { -> "value_in_config": 9.0 -=================== End of Test99_smlp_toy_num_resp_mult_optimization_progress.json diff report ================================ -=================== Diff report for: Test99_smlp_toy_num_resp_mult_optimization_results.json ================================== -23,25d22 -< "p1": { -< "value_in_config": 7.0 -< }, -29,30c26,27 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 7.0 -33a31,33 -> }, -> "y1": { -> "value_in_config": 9.0 -=================== End of Test99_smlp_toy_num_resp_mult_optimization_results.json diff report ================================ -=================== Diff report for: Test100_smlp_toy_num_resp_mult_optimization_progress.json ================================== -24,26d23 -< "p1": { -< "value_in_config": 4.0 -< }, -30,31c27,28 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 4.0 -35a33,35 -> "y1": { -> "value_in_config": 9.0 -> }, -62,64d61 -< "p1": { -< "value_in_config": 4.0 -< }, -68,69c65,66 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 4.0 -73a71,73 -> "y1": { -> "value_in_config": 9.0 -> }, -100,102d99 -< "p1": { -< "value_in_config": 4.0 -< }, -106,107c103,104 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 4.0 -111a109,111 -> "y1": { -> "value_in_config": 9.0 -> }, -138,140d137 -< "p1": { -< "value_in_config": 4.0 -< }, -144,145c141,142 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 4.0 -149a147,149 -> "y1": { -> "value_in_config": 9.0 -> }, -197,199d196 -< "p1": { -< "value_in_config": 4.0 -< }, -203,204c200,201 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 4.0 -208a206,208 -> "y1": { -> "value_in_config": 9.0 -> }, -235,237d234 -< "p1": { -< "value_in_config": 4.0 -< }, -241,242c238,239 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 4.0 -246a244,246 -> "y1": { -> "value_in_config": 9.0 -> }, -273,275d272 -< "p1": { -< "value_in_config": 4.0 -< }, -279,280c276,277 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 4.0 -284a282,284 -> "y1": { -> "value_in_config": 9.0 -> }, -332,334d331 -< "p1": { -< "value_in_config": 4.0 -< }, -338,339c335,336 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 4.0 -342a340,342 -> }, -> "y1": { -> "value_in_config": 9.0 -=================== End of Test100_smlp_toy_num_resp_mult_optimization_progress.json diff report ================================ -=================== Diff report for: Test100_smlp_toy_num_resp_mult_optimization_results.json ================================== -23,25d22 -< "p1": { -< "value_in_config": 4.0 -< }, -29,30c26,27 -< "y1": { -< "value_in_config": 9.0 ---- -> "p1": { -> "value_in_config": 4.0 -33a31,33 -> }, -> "y1": { -> "value_in_config": 9.0 -=================== End of Test100_smlp_toy_num_resp_mult_optimization_results.json diff report ================================ =================== Diff report for: Test102_test101_model.txt ================================== 38c38 < smlp_logger - INFO - Seving model rerun configuration in file ../models/test101_model_rerun_model_config.json --- > smlp_logger - INFO - Seving model rerun configuration in file ./../models/test101_model_rerun_model_config.json =================== End of Test102_test101_model.txt diff report ================================ -=================== Diff report for: Test105_smlp_toy_num_resp_mult_verify_results.json ================================== -6d5 -< "p1": 4.0, -8c7 -< "y1": 9.0, ---- -> "p1": 4.0, -9a9 -> "y1": 9.0, -=================== End of Test105_smlp_toy_num_resp_mult_verify_results.json diff report ================================ =================== Diff report for: test110_model_poly_sklearn_formula.txt ================================== -diff: /home/mdmitry/github/smlptech/scripts/venv/smlp_package_venv/smlp/regr_smlp/code/test110_model_poly_sklearn_formula.txt: No such file or directory +diff: /home/zurabk/smlp/repo/smlp/scripts/venv/smlp_package_venv/smlp/regr_smlp/code/test110_model_poly_sklearn_formula.txt: No such file or directory =================== End of test110_model_poly_sklearn_formula.txt diff report ================================ =================== Diff report for: Test111_test110_model_smlp_toy_basic_pred_unlabeled.txt ================================== 79c79 @@ -2131,1163 +851,3 @@ diff: /home/mdmitry/github/smlptech/scripts/venv/smlp_package_venv/smlp/regr_sml --- > smlp_logger - INFO - Seving model rerun configuration in file ./../models/test110_model_rerun_model_config.json =================== End of Test112_test110_model_smlp_toy_basic_pred_unlabeled.txt diff report ================================ -=================== Diff report for: Test113_smlp_toy_basic_optimization_progress.json ================================== -17,18c17,21 -< "x2": { -< "value_in_config": 0.0 ---- -> "x1": { -> "value_in_config": 10.0 -> }, -> "p2": { -> "value_in_config": 4.0 -23,24c26,27 -< "x1": { -< "value_in_config": 10.0 ---- -> "x2": { -> "value_in_config": 0.0 -31,33d33 -< }, -< "p2": { -< "value_in_config": 4.0 -51,52c51,55 -< "x2": { -< "value_in_config": 0.0 ---- -> "x1": { -> "value_in_config": 10.0 -> }, -> "p2": { -> "value_in_config": 4.0 -57,58c60,61 -< "x1": { -< "value_in_config": 10.0 ---- -> "x2": { -> "value_in_config": 0.0 -66,68d68 -< "p2": { -< "value_in_config": 4.0 -< }, -106,107c106,110 -< "x2": { -< "value_in_config": 0.0 ---- -> "x1": { -> "value_in_config": 10.0 -> }, -> "p2": { -> "value_in_config": 4.0 -112,113c115,116 -< "x1": { -< "value_in_config": 10.0 ---- -> "x2": { -> "value_in_config": 0.0 -120,122d122 -< }, -< "p2": { -< "value_in_config": 4.0 -=================== End of Test113_smlp_toy_basic_optimization_progress.json diff report ================================ -=================== Diff report for: Test113_smlp_toy_basic_optimization_results.json ================================== -16,17c16,20 -< "x2": { -< "value_in_config": 0.0 ---- -> "x1": { -> "value_in_config": 10.0 -> }, -> "p2": { -> "value_in_config": 4.0 -22,23c25,26 -< "x1": { -< "value_in_config": 10.0 ---- -> "x2": { -> "value_in_config": 0.0 -30,32d32 -< }, -< "p2": { -< "value_in_config": 4.0 -=================== End of Test113_smlp_toy_basic_optimization_results.json diff report ================================ -=================== Diff report for: Test114_smlp_toy_basic_optimization_progress.json ================================== -17,18c17,21 -< "x2": { -< "value_in_config": 0.0 ---- -> "x1": { -> "value_in_config": 10.0 -> }, -> "p2": { -> "value_in_config": 4.0 -23,24c26,27 -< "x1": { -< "value_in_config": 10.0 ---- -> "x2": { -> "value_in_config": 0.0 -31,33d33 -< }, -< "p2": { -< "value_in_config": 4.0 -51,52c51,55 -< "x2": { -< "value_in_config": 0.0 ---- -> "x1": { -> "value_in_config": 10.0 -> }, -> "p2": { -> "value_in_config": 4.0 -57,58c60,61 -< "x1": { -< "value_in_config": 10.0 ---- -> "x2": { -> "value_in_config": 0.0 -66,68d68 -< "p2": { -< "value_in_config": 4.0 -< }, -106,107c106,110 -< "x2": { -< "value_in_config": 0.0 ---- -> "x1": { -> "value_in_config": 10.0 -> }, -> "p2": { -> "value_in_config": 4.0 -112,113c115,116 -< "x1": { -< "value_in_config": 10.0 ---- -> "x2": { -> "value_in_config": 0.0 -120,122d122 -< }, -< "p2": { -< "value_in_config": 4.0 -=================== End of Test114_smlp_toy_basic_optimization_progress.json diff report ================================ -=================== Diff report for: Test114_smlp_toy_basic_optimization_results.json ================================== -16,17c16,20 -< "x2": { -< "value_in_config": 0.0 ---- -> "x1": { -> "value_in_config": 10.0 -> }, -> "p2": { -> "value_in_config": 4.0 -22,23c25,26 -< "x1": { -< "value_in_config": 10.0 ---- -> "x2": { -> "value_in_config": 0.0 -30,32d32 -< }, -< "p2": { -< "value_in_config": 4.0 -=================== End of Test114_smlp_toy_basic_optimization_results.json diff report ================================ -=================== Diff report for: Test118_smlp_toy_basic_verify_results.json ================================== -5a6 -> "p1": 0.2, -7d7 -< "y2": 0.0, -9c9 -< "p1": 0.2 ---- -> "y2": 0.0 -=================== End of Test118_smlp_toy_basic_verify_results.json diff report ================================ -=================== Diff report for: Test119_smlp_toy_basic_query_results.json ================================== -14a15 -> "p1": 0.0, -16d16 -< "y2": 0.0, -18c18 -< "p1": 0.0 ---- -> "y2": 0.0 -=================== End of Test119_smlp_toy_basic_query_results.json diff report ================================ -=================== Diff report for: Test121_smlp_toy_basic_synthesize_results.json ================================== -9,10c9,10 -< "p2": 0.0, -< "p1": 0.0 ---- -> "p1": 0.0, -> "p2": 0.0 -=================== End of Test121_smlp_toy_basic_synthesize_results.json diff report ================================ -=================== Diff report for: Test122_smlp_toy_basic_optimization_progress.json ================================== -16a17,19 -> "p1": { -> "value_in_config": 0.0 -> }, -20c23 -< "y2": { ---- -> "y1": { -24c27 -< "y1": { ---- -> "y2": { -27,29d29 -< }, -< "p1": { -< "value_in_config": 0.0 -=================== End of Test122_smlp_toy_basic_optimization_progress.json diff report ================================ -=================== Diff report for: Test122_smlp_toy_basic_optimization_results.json ================================== -2a3 -> "p1": 0.0, -4d4 -< "y2": 0.0, -6c6 -< "p1": 0.0, ---- -> "y2": 0.0, -16a17 -> "p1": 0.0, -18d18 -< "y2": 0.0, -20c20 -< "p1": 0.0, ---- -> "y2": 0.0, -=================== End of Test122_smlp_toy_basic_optimization_results.json diff report ================================ -=================== Diff report for: Test123_smlp_toy_basic_optimization_progress.json ================================== -16a17,19 -> "p1": { -> "value_in_config": 0.0 -> }, -20c23 -< "y2": { ---- -> "y1": { -24c27 -< "y1": { ---- -> "y2": { -27,29d29 -< }, -< "p1": { -< "value_in_config": 0.0 -46a47,49 -> "p1": { -> "value_in_config": 0.0 -> }, -50c53 -< "y2": { ---- -> "y1": { -54c57 -< "y1": { ---- -> "y2": { -57,59d59 -< }, -< "p1": { -< "value_in_config": 0.0 -76a77,79 -> "p1": { -> "value_in_config": 0.0 -> }, -80c83 -< "y2": { ---- -> "y1": { -84c87 -< "y1": { ---- -> "y2": { -87,89d89 -< }, -< "p1": { -< "value_in_config": 0.0 -106a107,109 -> "p1": { -> "value_in_config": 0.0 -> }, -110c113 -< "y2": { ---- -> "y1": { -114c117 -< "y1": { ---- -> "y2": { -117,119d119 -< }, -< "p1": { -< "value_in_config": 0.0 -136a137,139 -> "p1": { -> "value_in_config": 0.0 -> }, -140c143 -< "y2": { ---- -> "y1": { -144c147 -< "y1": { ---- -> "y2": { -147,149d149 -< }, -< "p1": { -< "value_in_config": 0.0 -166a167,169 -> "p1": { -> "value_in_config": 0.0 -> }, -170c173 -< "y2": { ---- -> "y1": { -174c177 -< "y1": { ---- -> "y2": { -177,179d179 -< }, -< "p1": { -< "value_in_config": 0.0 -196a197,199 -> "p1": { -> "value_in_config": 0.0 -> }, -200c203 -< "y2": { ---- -> "y1": { -204c207 -< "y1": { ---- -> "y2": { -207,209d209 -< }, -< "p1": { -< "value_in_config": 0.0 -226a227,229 -> "p1": { -> "value_in_config": 0.0 -> }, -230c233 -< "y2": { ---- -> "y1": { -234c237 -< "y1": { ---- -> "y2": { -237,239d239 -< }, -< "p1": { -< "value_in_config": 0.0 -256a257,259 -> "p1": { -> "value_in_config": 0.0 -> }, -260c263 -< "y2": { ---- -> "y1": { -264c267 -< "y1": { ---- -> "y2": { -267,269d269 -< }, -< "p1": { -< "value_in_config": 0.0 -286a287,289 -> "p1": { -> "value_in_config": 0.0 -> }, -290c293 -< "y2": { ---- -> "y1": { -294c297 -< "y1": { ---- -> "y2": { -297,299d299 -< }, -< "p1": { -< "value_in_config": 0.0 -316a317,319 -> "p1": { -> "value_in_config": 0.0 -> }, -320c323 -< "y2": { ---- -> "y1": { -324c327 -< "y1": { ---- -> "y2": { -327,329d329 -< }, -< "p1": { -< "value_in_config": 0.0 -346a347,349 -> "p1": { -> "value_in_config": 0.0 -> }, -350c353 -< "y2": { ---- -> "y1": { -354c357 -< "y1": { ---- -> "y2": { -357,359d359 -< }, -< "p1": { -< "value_in_config": 0.0 -376a377,379 -> "p1": { -> "value_in_config": 0.0 -> }, -380c383 -< "y2": { ---- -> "y1": { -384c387 -< "y1": { ---- -> "y2": { -388,390d390 -< "p1": { -< "value_in_config": 0.0 -< }, -427a428,430 -> "p1": { -> "value_in_config": 0.0 -> }, -431c434 -< "y2": { ---- -> "y1": { -435c438 -< "y1": { ---- -> "y2": { -438,440d440 -< }, -< "p1": { -< "value_in_config": 0.0 -457a458,460 -> "p1": { -> "value_in_config": 0.0 -> }, -461c464 -< "y2": { ---- -> "y1": { -465c468 -< "y1": { ---- -> "y2": { -468,470d470 -< }, -< "p1": { -< "value_in_config": 0.0 -487a488,490 -> "p1": { -> "value_in_config": 0.0 -> }, -491c494 -< "y2": { ---- -> "y1": { -495c498 -< "y1": { ---- -> "y2": { -498,500d500 -< }, -< "p1": { -< "value_in_config": 0.0 -517a518,520 -> "p1": { -> "value_in_config": 0.0 -> }, -521c524 -< "y2": { ---- -> "y1": { -525c528 -< "y1": { ---- -> "y2": { -528,530d530 -< }, -< "p1": { -< "value_in_config": 0.0 -547a548,550 -> "p1": { -> "value_in_config": 0.0 -> }, -551c554 -< "y2": { ---- -> "y1": { -555c558 -< "y1": { ---- -> "y2": { -558,560d560 -< }, -< "p1": { -< "value_in_config": 0.0 -577a578,580 -> "p1": { -> "value_in_config": 0.0 -> }, -581c584 -< "y2": { ---- -> "y1": { -585c588 -< "y1": { ---- -> "y2": { -588,590d590 -< }, -< "p1": { -< "value_in_config": 0.0 -607a608,610 -> "p1": { -> "value_in_config": 0.0 -> }, -611c614 -< "y2": { ---- -> "y1": { -615c618 -< "y1": { ---- -> "y2": { -618,620d620 -< }, -< "p1": { -< "value_in_config": 0.0 -637a638,640 -> "p1": { -> "value_in_config": 0.0 -> }, -641c644 -< "y2": { ---- -> "y1": { -645c648 -< "y1": { ---- -> "y2": { -648,650d650 -< }, -< "p1": { -< "value_in_config": 0.0 -667a668,670 -> "p1": { -> "value_in_config": 0.0 -> }, -671c674 -< "y2": { ---- -> "y1": { -675c678 -< "y1": { ---- -> "y2": { -678,680d680 -< }, -< "p1": { -< "value_in_config": 0.0 -697a698,700 -> "p1": { -> "value_in_config": 0.0 -> }, -701c704 -< "y2": { ---- -> "y1": { -705c708 -< "y1": { ---- -> "y2": { -708,710d710 -< }, -< "p1": { -< "value_in_config": 0.0 -727a728,730 -> "p1": { -> "value_in_config": 0.0 -> }, -731c734 -< "y2": { ---- -> "y1": { -735c738 -< "y1": { ---- -> "y2": { -738,740d740 -< }, -< "p1": { -< "value_in_config": 0.0 -757a758,760 -> "p1": { -> "value_in_config": 0.0 -> }, -761c764 -< "y2": { ---- -> "y1": { -765c768 -< "y1": { ---- -> "y2": { -768,770d770 -< }, -< "p1": { -< "value_in_config": 0.0 -787a788,790 -> "p1": { -> "value_in_config": 0.0 -> }, -791c794 -< "y2": { ---- -> "y1": { -795c798 -< "y1": { ---- -> "y2": { -799,801d801 -< "p1": { -< "value_in_config": 0.0 -< }, -838a839,841 -> "p1": { -> "value_in_config": 0.0 -> }, -842c845 -< "y2": { ---- -> "y1": { -846c849 -< "y1": { ---- -> "y2": { -849,851d851 -< }, -< "p1": { -< "value_in_config": 0.0 -=================== End of Test123_smlp_toy_basic_optimization_progress.json diff report ================================ -=================== Diff report for: Test123_smlp_toy_basic_optimization_results.json ================================== -15a16,18 -> "p1": { -> "value_in_config": 0.0 -> }, -19c22 -< "y2": { ---- -> "y1": { -23c26 -< "y1": { ---- -> "y2": { -26,28d28 -< }, -< "p1": { -< "value_in_config": 0.0 -=================== End of Test123_smlp_toy_basic_optimization_results.json diff report ================================ -=================== Diff report for: Test125_smlp_toy_basic_optimization_progress.json ================================== -16a17,19 -> "p1": { -> "value_in_config": 0.0 -> }, -20c23 -< "y2": { ---- -> "y1": { -24c27 -< "y1": { ---- -> "y2": { -27,29d29 -< }, -< "p1": { -< "value_in_config": 0.0 -46a47,49 -> "p1": { -> "value_in_config": 0.0 -> }, -50c53 -< "y2": { ---- -> "y1": { -54c57 -< "y1": { ---- -> "y2": { -57,59d59 -< }, -< "p1": { -< "value_in_config": 0.0 -76a77,79 -> "p1": { -> "value_in_config": 0.0 -> }, -80c83 -< "y2": { ---- -> "y1": { -84c87 -< "y1": { ---- -> "y2": { -87,89d89 -< }, -< "p1": { -< "value_in_config": 0.0 -106a107,109 -> "p1": { -> "value_in_config": 0.0 -> }, -110c113 -< "y2": { ---- -> "y1": { -114c117 -< "y1": { ---- -> "y2": { -117,119d119 -< }, -< "p1": { -< "value_in_config": 0.0 -136a137,139 -> "p1": { -> "value_in_config": 0.0 -> }, -140c143 -< "y2": { ---- -> "y1": { -144c147 -< "y1": { ---- -> "y2": { -147,149d149 -< }, -< "p1": { -< "value_in_config": 0.0 -166a167,169 -> "p1": { -> "value_in_config": 0.0 -> }, -170c173 -< "y2": { ---- -> "y1": { -174c177 -< "y1": { ---- -> "y2": { -177,179d179 -< }, -< "p1": { -< "value_in_config": 0.0 -196a197,199 -> "p1": { -> "value_in_config": 0.0 -> }, -200c203 -< "y2": { ---- -> "y1": { -204c207 -< "y1": { ---- -> "y2": { -207,209d209 -< }, -< "p1": { -< "value_in_config": 0.0 -226a227,229 -> "p1": { -> "value_in_config": 0.0 -> }, -230c233 -< "y2": { ---- -> "y1": { -234c237 -< "y1": { ---- -> "y2": { -237,239d239 -< }, -< "p1": { -< "value_in_config": 0.0 -256a257,259 -> "p1": { -> "value_in_config": 0.0 -> }, -260c263 -< "y2": { ---- -> "y1": { -264c267 -< "y1": { ---- -> "y2": { -267,269d269 -< }, -< "p1": { -< "value_in_config": 0.0 -286a287,289 -> "p1": { -> "value_in_config": 0.0 -> }, -290c293 -< "y2": { ---- -> "y1": { -294c297 -< "y1": { ---- -> "y2": { -297,299d299 -< }, -< "p1": { -< "value_in_config": 0.0 -316a317,319 -> "p1": { -> "value_in_config": 0.0 -> }, -320c323 -< "y2": { ---- -> "y1": { -324c327 -< "y1": { ---- -> "y2": { -327,329d329 -< }, -< "p1": { -< "value_in_config": 0.0 -346a347,349 -> "p1": { -> "value_in_config": 0.0 -> }, -350c353 -< "y2": { ---- -> "y1": { -354c357 -< "y1": { ---- -> "y2": { -357,359d359 -< }, -< "p1": { -< "value_in_config": 0.0 -376a377,379 -> "p1": { -> "value_in_config": 0.0 -> }, -380c383 -< "y2": { ---- -> "y1": { -384c387 -< "y1": { ---- -> "y2": { -388,390d390 -< "p1": { -< "value_in_config": 0.0 -< }, -427a428,430 -> "p1": { -> "value_in_config": 0.0 -> }, -431c434 -< "y2": { ---- -> "y1": { -435c438 -< "y1": { ---- -> "y2": { -438,440d440 -< }, -< "p1": { -< "value_in_config": 0.0 -457a458,460 -> "p1": { -> "value_in_config": 0.0 -> }, -461c464 -< "y2": { ---- -> "y1": { -465c468 -< "y1": { ---- -> "y2": { -468,470d470 -< }, -< "p1": { -< "value_in_config": 0.0 -487a488,490 -> "p1": { -> "value_in_config": 0.0 -> }, -491c494 -< "y2": { ---- -> "y1": { -495c498 -< "y1": { ---- -> "y2": { -498,500d500 -< }, -< "p1": { -< "value_in_config": 0.0 -517a518,520 -> "p1": { -> "value_in_config": 0.0 -> }, -521c524 -< "y2": { ---- -> "y1": { -525c528 -< "y1": { ---- -> "y2": { -528,530d530 -< }, -< "p1": { -< "value_in_config": 0.0 -547a548,550 -> "p1": { -> "value_in_config": 0.0 -> }, -551c554 -< "y2": { ---- -> "y1": { -555c558 -< "y1": { ---- -> "y2": { -558,560d560 -< }, -< "p1": { -< "value_in_config": 0.0 -577a578,580 -> "p1": { -> "value_in_config": 0.0 -> }, -581c584 -< "y2": { ---- -> "y1": { -585c588 -< "y1": { ---- -> "y2": { -588,590d590 -< }, -< "p1": { -< "value_in_config": 0.0 -607a608,610 -> "p1": { -> "value_in_config": 0.0 -> }, -611c614 -< "y2": { ---- -> "y1": { -615c618 -< "y1": { ---- -> "y2": { -618,620d620 -< }, -< "p1": { -< "value_in_config": 0.0 -637a638,640 -> "p1": { -> "value_in_config": 0.0 -> }, -641c644 -< "y2": { ---- -> "y1": { -645c648 -< "y1": { ---- -> "y2": { -648,650d650 -< }, -< "p1": { -< "value_in_config": 0.0 -667a668,670 -> "p1": { -> "value_in_config": 0.0 -> }, -671c674 -< "y2": { ---- -> "y1": { -675c678 -< "y1": { ---- -> "y2": { -678,680d680 -< }, -< "p1": { -< "value_in_config": 0.0 -697a698,700 -> "p1": { -> "value_in_config": 0.0 -> }, -701c704 -< "y2": { ---- -> "y1": { -705c708 -< "y1": { ---- -> "y2": { -708,710d710 -< }, -< "p1": { -< "value_in_config": 0.0 -727a728,730 -> "p1": { -> "value_in_config": 0.0 -> }, -731c734 -< "y2": { ---- -> "y1": { -735c738 -< "y1": { ---- -> "y2": { -738,740d740 -< }, -< "p1": { -< "value_in_config": 0.0 -757a758,760 -> "p1": { -> "value_in_config": 0.0 -> }, -761c764 -< "y2": { ---- -> "y1": { -765c768 -< "y1": { ---- -> "y2": { -768,770d770 -< }, -< "p1": { -< "value_in_config": 0.0 -787a788,790 -> "p1": { -> "value_in_config": 0.0 -> }, -791c794 -< "y2": { ---- -> "y1": { -795c798 -< "y1": { ---- -> "y2": { -799,801d801 -< "p1": { -< "value_in_config": 0.0 -< }, -838a839,841 -> "p1": { -> "value_in_config": 0.0 -> }, -842c845 -< "y2": { ---- -> "y1": { -846c849 -< "y1": { ---- -> "y2": { -849,851d851 -< }, -< "p1": { -< "value_in_config": 0.0 -=================== End of Test125_smlp_toy_basic_optimization_progress.json diff report ================================ -=================== Diff report for: Test125_smlp_toy_basic_optimization_results.json ================================== -15a16,18 -> "p1": { -> "value_in_config": 0.0 -> }, -19c22 -< "y2": { ---- -> "y1": { -23c26 -< "y1": { ---- -> "y2": { -26,28d28 -< }, -< "p1": { -< "value_in_config": 0.0 -=================== End of Test125_smlp_toy_basic_optimization_results.json diff report ================================ -=================== Diff report for: Test126_smlp_toy_basic_verify_results.json ================================== -6,7d5 -< "x2": 0.0, -< "y1": 0.2, -8a7,9 -> "p2": 0.0, -> "y1": 0.2, -> "x2": 0.0, -10,11c11 -< "y2": 0.0, -< "p2": 0.0 ---- -> "y2": 0.0 -=================== End of Test126_smlp_toy_basic_verify_results.json diff report ================================ -=================== Diff report for: Test129_smlp_toy_ctg_num_resp_verify_results.json ================================== -18d17 -< "p1": 7.5, -20c19 -< "y1": -61.895667856765954, ---- -> "p1": 7.5, -21a21 -> "y1": -61.895667856765954, -30d29 -< "p1": 7.5, -32c31 -< "y1": -61.895667856765954, ---- -> "p1": 7.5, -33a33 -> "y1": -61.895667856765954, -=================== End of Test129_smlp_toy_ctg_num_resp_verify_results.json diff report ================================ diff --git a/tutorial/README.md b/tutorial/README.md index 07786bfb..b79e0d39 100644 --- a/tutorial/README.md +++ b/tutorial/README.md @@ -1,28 +1,36 @@ # SMLP Optimization Examples This tutorial contains three benchmark optimization problems and one industrial example demonstrating the capabilities of SMLP (Symbolic Machine Learning Prover) for solving constrained and multi-objective optimization tasks for **black-box functions**.
-Black-box function optimization definition used in this document [2]:
+For one of the optimization examples tutorial demonstrates SMLP **result certification** - unique SMLP feature, which allows to validate solution robustness.SMLP addresses this through its notion of stability, ensuring that selected optima remain within stability region [3]. + +Black-box function optimization definition used in this document [2]: #### *Blackbox optimization (BBO) is the study of design and analysis of algorithms for optimization problems in which the structure of the objective function f and/or the constraints defining the set Ω is unknown, unexploitable or non-existant*
*In above definiton Ω is the feasible region : Ω → R* -SMLP has been applied in industrial setting at Intel for analyzing and optimizing hardware designs at the analog level [1]. +SMLP has been applied in industrial setting at Intel for analyzing and optimizing hardware designs at the analog level [1].
This tutorial contains one of Intel examples in Signal Integrity domain (with mangled numerical values and objective function names). ### In [SMLP](https://github.com/SMLP-Systems/smlp/blob/master/README.md) - Structure of the objective function *f* is unknown - Constraint defining set is comprised of known functions, which are defined by Python expressions -**SMLP** supports multiple modes: optimization, synthesis, verification and more -This tutorial focuses on optimization mode. In future it may be extended to other modes. +**SMLP** supports multiple modes: optimization, synthesis, verification and more.
+This tutorial focuses on optimization mode.
+In future it may be extended to other modes. ### SMLP optimization flow is comprised of two stages: -- Model build: input data is converted into one of supported model types: - 1. Polynomial model - 2. Decision Trees - 3. Random Forest - 4. Extremely Randomized Trees - 3. Neural network model -- Optimization: model and constraints are used to find objective function(s) maximum considering input constraints +
+Model build +Input data is converted into one of supported model types
+1. Polynomial model
+2. Decision Trees
+3. Random Forest
+4. Extremely Randomized Trees
+5. Neural network model
+
+
+Optimization Model and constraints are used to find objective function(s) maximum considering input constraints +
## Overview @@ -33,7 +41,8 @@ Examples in this tutorial showcase SMLP's ability to: - Generate Pareto fronts for multi-objective problems [1] [Franz Brauße, Zurab Khasidashvili, Konstantin Korovin. SMLP: Symbolic Machine Learning Prover](https://arxiv.org/pdf/2402.01415v1)
-[2] [Stéphane Alarie et al. Two decades of blackbox optimization applications](https://optimization-online.org/wp-content/uploads/2020/10/8082.pdf) +[2] [Stéphane Alarie et al. Two decades of blackbox optimization applications](https://optimization-online.org/wp-content/uploads/2020/10/8082.pdf)
+[3] [Yonina C. Eldar and Amir Beck. A Minimax Chebyshev Estimator for Bounded Error Estimation](https://ece.technion.ac.il/wp-content/uploads/2021/01/publication_617-1.pdf) ## Examples @@ -215,15 +224,56 @@ In decision space: #### Usage ```bash # Generate dataset -./examples/bnh/smlp/run_poly_pareto/bnh_dataset.py +./examples/bnh/smlp/bnh_dataset.py # Run optimization for each weighting and plot Pareto front ./examples/bnh/smlp/run_poly_pareto -# Visualize Pareto front +# Visualize Pareto front and compare simulation Pareto front to analytical ./examples/bnh/smlp/plot_results.py + +# Create analytical Pareto front +./examples/bnh/smlp/pareto_analytical.py ``` +#### Pareto point robustness ceritification example + +Below we demonstrate SMLP robustness certification accuracy for the second Pareto front point of the function `f₁`.
+We check (*certify*) stability of analytical Pareto solution (*witness*) `f₁(x₁,x₂) = 0.692042`
+where `x₁' = x₂' = 0.294118` within stability region.
+The stability region is defined as a square with [inradius](https://mathworld.wolfram.com/Inradius.html) `rad-abs`.
+Assertion, chosen for this example: + +``` +y = (f₁(x₁,x₂) - 0.692042)² < 4 +``` +Analytical solution for this problem:
+- assertion should pass for: `rad-abs < 0.285973` +- assertion should fail for: `rad-abs ≥ 0.285973` + +**SMLP results:** + +![CERTIFY_RESULT](examples/bnh/smlp/media/witness_certify_0.5x.png)
+ +From this plot one can see that as expected: +-

assertion passes for rad-abs=0.285

+-

assertion fails for rad-abs=0.286

+ +Above result clearly demonstrates high SMLP accuracy. + +#### Certification demo script usage - run SMLP and display results: + +```bash +examples/bnh/smlp/run_certify.sh +``` + +#### Plot certification results: + +```bash +examples/bnh/smlp/witness_certify_plot.py +``` + + ### 4. Intel Signal Integrity domain example **Location:** `examples/si/smlp` diff --git a/tutorial/examples/bnh/smlp/bnh_certify_expected.txt b/tutorial/examples/bnh/smlp/bnh_certify_expected.txt index 4df75cc8..6a347bb6 100644 --- a/tutorial/examples/bnh/smlp/bnh_certify_expected.txt +++ b/tutorial/examples/bnh/smlp/bnh_certify_expected.txt @@ -1,6 +1,16 @@ -1 F1*F1<1e-10 and (F2-50)*(F2-50)<1e-10 "PASS" -2 (F1-0.692042)*(F1-0.692042)<1e-10 and (F2-44.290657)*(F2-44.290657)<1e-10 "PASS" -3 (F1-4.081633)*(F1-4.081633)<1e-10 and (F2-36.734694)*(F2-36.734694)<1e-10 "PASS" -4 (F1-14.876033)*(F1-14.876033)<1e-10 and (F2-26.446281)*(F2-26.446281)<1e-10 "FAIL" -5 (F1-50.0)*(F1-50.0)<1e-10 and (F2-12.5)*(F2-12.5)<1e-10 "FAIL" -6 (F1-136.0)*(F1-136.0)<1e-10 and (F2-4.0)*(F2-4.0)<1e-10 "FAIL" +=============================================== PROBLEM ================================================ +For function f₁(x) = 4x₁² + 4x₂² +Certify stability of analytical Pareto solution for x₁ = x₂ = 0.294118 and given absolute radius rad-abs +----------------------------------------------- Expected result: --------------------------------------- +From inequality: f₁(x) - 0.692042 < 2 +| x | < sqrt((2+0.692042)/8) = 0.580091 +Pass/Fail absolute radius boundary point: 0.580091-0.294118 = 0.285973 +Checking two values of rad-abs: 0.285 and 0.286 +Expected result: 0.285 -> PASS, 0.286 -> FAIL +======================================================================================================== +=============================================== SMLP CERTIFY SOLUTIONS ================================= +X1: rad-abs=0.285; X2: rad-abs=0.285 +(F1-0.692042)*(F1-0.692042) < 4 "PASS" +X1: rad-abs=0.286; X2: rad-abs=0.286 +(F1-0.692042)*(F1-0.692042) < 4 "FAIL" +=================================================== DONE =============================================== diff --git a/tutorial/examples/bnh/smlp/bnh.json b/tutorial/examples/bnh/smlp/bnh_certify_fail.json similarity index 72% rename from tutorial/examples/bnh/smlp/bnh.json rename to tutorial/examples/bnh/smlp/bnh_certify_fail.json index 2e2c8ea9..25c3ebcd 100644 --- a/tutorial/examples/bnh/smlp/bnh.json +++ b/tutorial/examples/bnh/smlp/bnh_certify_fail.json @@ -1,10 +1,13 @@ { "version": "1.2", "variables": [ - {"label":"X1", "interface":"knob", "type":"real", "range":[0,5], "rad-abs": 0.0}, - {"label":"X2", "interface":"knob", "type":"real", "range":[0,3], "rad-abs": 0.0}, + {"label":"X1", "interface":"knob", "type":"real", "range":[0,5], "rad-abs": 0.286}, + {"label":"X2", "interface":"knob", "type":"real", "range":[0,3], "rad-abs": 0.286}, {"label":"F1", "interface":"output", "type":"real"}, {"label":"F2", "interface":"output", "type":"real"} ], - "alpha": "(X1-5)*(X1-5)+X2*X2<=25 and (X1-8)*(X1-8)+(X2+3)*(X2+3)>=7.7" + "alpha": "(X1-5)*(X1-5)+X2*X2<=25 and (X1-8)*(X1-8)+(X2+3)*(X2+3)>=7.7", + "witnesses": { + "query1": {"X1": 0.294118, "X2": 0.294118} + } } diff --git a/tutorial/examples/bnh/smlp/bnh_certify_pass.json b/tutorial/examples/bnh/smlp/bnh_certify_pass.json new file mode 100644 index 00000000..b64d5272 --- /dev/null +++ b/tutorial/examples/bnh/smlp/bnh_certify_pass.json @@ -0,0 +1,13 @@ +{ + "version": "1.2", + "variables": [ + {"label":"X1", "interface":"knob", "type":"real", "range":[0,5], "rad-abs": 0.285}, + {"label":"X2", "interface":"knob", "type":"real", "range":[0,3], "rad-abs": 0.285}, + {"label":"F1", "interface":"output", "type":"real"}, + {"label":"F2", "interface":"output", "type":"real"} + ], + "alpha": "(X1-5)*(X1-5)+X2*X2<=25 and (X1-8)*(X1-8)+(X2+3)*(X2+3)>=7.7", + "witnesses": { + "query1": {"X1": 0.294118, "X2": 0.294118} + } +} diff --git a/tutorial/examples/bnh/smlp/media/witness_certify.png b/tutorial/examples/bnh/smlp/media/witness_certify.png new file mode 100644 index 0000000000000000000000000000000000000000..6e84ed4e56af575b1d45abe1752575851701cdf6 GIT binary patch literal 133111 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

PV)zwmu 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 z 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 vL1sfpOh(iNGM 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�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 0) then - if("-clean" == "$argv[1]") then - \rm -f ${test}* *.log >& /dev/null - \rm -f $gzipped_dataset >& /dev/null - exit(0) - endif -endif -${script_path}/bnh_dataset.py -set csv=${test}.csv -set json=${script_path}/${test_lc}_w.json -gunzip -c $gzipped_dataset > $csv -set noglob -set e1="F1*F1<1e-10 and (F2-50)*(F2-50)<1e-10" -set e2="(F1-0.692042)*(F1-0.692042)<1e-10 and (F2-44.290657)*(F2-44.290657)<1e-10" -set e3="(F1-4.081633)*(F1-4.081633)<1e-10 and (F2-36.734694)*(F2-36.734694)<1e-10" -set e4="(F1-14.876033)*(F1-14.876033)<1e-10 and (F2-26.446281)*(F2-26.446281)<1e-10" -set e5="(F1-50.0)*(F1-50.0)<1e-10 and (F2-12.5)*(F2-12.5)<1e-10" -set e6="(F1-136.0)*(F1-136.0)<1e-10 and (F2-4.0)*(F2-4.0)<1e-10" -set exprs=("$e1" "$e2" "$e3" "$e4" "$e5" "$e6") -smlp \ - -data $csv \ - -spec $json \ - -out_dir ./ \ - -pref $test \ - -mode certify \ - -quer_names query1,query2,query3,query4,query5,query6 \ - -quer_exprs "$e1;$e2;$e3;$e4;$e5;$e6" \ - -pareto f \ - -resp F1,F2 \ - -feat X1,X2 \ - -model poly_sklearn \ - -tree_encoding flat \ - -compress_rules t \ - -mrmr_pred 0 \ - -epsilon 0.000005 \ - -delta_rel 0.05 \ - -save_model t \ - -model_name $csv:r_model \ - -save_model_config t \ - -plots f \ - -pred_plots f \ - -resp_plots f \ - -seed 10 \ - -log_time f >& `realpath $0 | xargs basename`.log - -foreach p (`seq 1 6`) - echo $p $exprs[$p] `jq ".query${p}.witness_status" ${test}_${test}_certify_results.json` -end diff --git a/tutorial/examples/bnh/smlp/run_certify.sh b/tutorial/examples/bnh/smlp/run_certify.sh new file mode 100755 index 00000000..ded656c0 --- /dev/null +++ b/tutorial/examples/bnh/smlp/run_certify.sh @@ -0,0 +1,86 @@ +#!/usr/bin/env bash +# Problem for function f₁(x) = 4x₁² + 4x₂² +# Certify stability of analytical Pareto solution for witness x₁ = x₂ = 0.294118 and given absolute radius rad-abs +# Expected result: +# From inequality: f₁(x) - 0.692042 < 2 +# | x | < sqrt((2+0.692042)/8) = 0.580091 +# Pass/Fail absolute radius boundary point: 0.580091-0.294118 = 0.285973 +# Checking two values of rad-abs: 0.285 and 0.286 +# Expected result: 0.285 -> PASS, 0.286 -> FAIL +# Reference: https://www.wolframalpha.com/input?i=8*x%5E2+-+0.692042+%3C+2 + +script_path="$(dirname "$(realpath "$0")")" +test=BNH +test_lc="$(echo "$test" | tr '[:upper:]' '[:lower:]')" +gzipped_dataset="${test_lc}.csv.gz" + +if [[ $# -gt 0 && "$1" == "-clean" ]]; then + rm -f ${test}* *.log 2>/dev/null + rm -f "$gzipped_dataset" 2>/dev/null + rm -f *.png 2>/dev/null + exit 0 +fi + +result="${test}_certify.txt" +rm -f "$result" 2>/dev/null + +tee_result() { tee -a "$result"; } + +echo "=============================================== PROBLEM ======================================================" | tee_result +echo 'For function f₁(x₁,x₂) = 4x₁² + 4x₂² ' | tee_result +echo 'Certify stability of analytical Pareto solution for witness f₁(x₁,x₂) = 0.692042, where x₁' = x₂' = 0.294118 ' | tee_result +echo "And specified absolute radius rad-abs " | tee_result +echo "----------------------------------------------- Expected result: ---------------------------------------------" | tee_result +echo 'From inequality: (f₁(x₁,x₂) - 0.692042)² < 4 ' | tee_result +echo '| x₁ | = | x₂ | < sqrt((2+0.692042)/8) = 0.580091 ' | tee_result +echo "Pass/Fail absolute radius boundary point: 0.580091-0.294118 = 0.285973 " | tee_result +echo "Checking two values of rad-abs: 0.285 and 0.286 " | tee_result +echo 'Expected result: 0.285 -> PASS, 0.286 -> FAIL ' | tee_result +echo "==============================================================================================================" | tee_result +echo "=============================================== SMLP CERTIFY SOLUTIONS =======================================" | tee_result + +"${script_path}/bnh_dataset.py" + +csv="${test}.csv" +json_pass="${script_path}/${test_lc}_certify_pass.json" +json_fail="${script_path}/${test_lc}_certify_fail.json" + +gunzip -c "$gzipped_dataset" > "$csv" + +e1="(F1-0.692042)*(F1-0.692042) < 4" + +log_file="$(basename "$0").log" + +for json in "$json_pass" "$json_fail"; do + jq '[.variables[] | select(has("rad-abs")) | {label: .label, "rad-abs": .["rad-abs"]}]' "$json" | \ + tr -d '\n {}[]"' | sed -e 's/label://g' -e 's/,X2/; X2/' -e 's/:/=/g' -e 's/,/: /g' | tee -a "$result" + echo "" | tee -a "$result" + smlp \ + -data "$csv" \ + -spec "$json" \ + -out_dir ./ \ + -pref "$test" \ + -mode certify \ + -quer_names query1 \ + -quer_exprs "$e1" \ + -pareto f \ + -resp F1,F2 \ + -feat X1,X2 \ + -model poly_sklearn \ + -tree_encoding flat \ + -compress_rules t \ + -mrmr_pred 0 \ + -epsilon 0.000005 \ + -delta_rel 0.05 \ + -save_model t \ + -model_name "${csv%.*}_model" \ + -save_model_config t \ + -plots f \ + -pred_plots f \ + -resp_plots f \ + -seed 10 \ + -log_time f >> "$log_file" 2>&1 + echo "$e1 $(jq ".query1.witness_status" "${test}_${test}_certify_results.json")" | tee -a "$result" +done +echo "=============================================== DONE ========================================================" | tee_result +"${script_path}/witness_certify_plot.py" -timeout 5 diff --git a/tutorial/examples/bnh/smlp/witness_certify_plot.py b/tutorial/examples/bnh/smlp/witness_certify_plot.py new file mode 100755 index 00000000..f8b18485 --- /dev/null +++ b/tutorial/examples/bnh/smlp/witness_certify_plot.py @@ -0,0 +1,148 @@ +#!/usr/bin/env python3.11 +""" +Witness Certification Visualizations +Produces witness_geometry.png – matplotlib geometry plot +""" + +import math +import textwrap +import numpy as np +import matplotlib +import matplotlib.pyplot as plt +import matplotlib.patches as mpatches +from matplotlib.lines import Line2D +from math import inf, sqrt +from sys import argv + +# ── shared palette ─────────────────────────────────────────────────────────── +C_BLUE = "#378ADD" +C_GREEN = "#1D9E75" +C_LIGHTGREEN = "#90EE90" +C_RED = "#E24B4A" +C_NAVYBLUE = "#000080" +C_GRAY = "#888780" +C_MAGENTA = "#FF00FF" +C_DARKGREEN = "#006400" + +matplotlib.rcParams.update({ + "font.family": "DejaVu Sans", + "font.size": 10, + "axes.spines.top": False, + "axes.spines.right": False, +}) + + +# ════════════════════════════════════════════════════════════════════════════ +# Figure 1 – Geometry (matplotlib → PNG) +# ════════════════════════════════════════════════════════════════════════════ +def plot_geometry(ax): + ax.set_aspect("equal") + ax.set_xlim(0.0, 1.05) + ax.set_ylim(0.0, 1.05) + ax.set_xlabel("x₁", fontsize=13) + ax.set_ylabel("x₂", fontsize=13) + ax.tick_params(labelsize=11) + ax.set_title("SMLP Witness certification\n" + r"$f_1(x)=4x_1^2+4x_2^2$" + "\n" + r"query: y = $(f_1-0.692042)^2<4$ and 0 ≤ $x_1 ≤ 5$ and 0 ≤ $x_2 ≤ 3$", + fontsize=15, pad=10) + + # ── constraint boundary |x| = 0.580091 (quarter circle) ────────────────── + R_constraint = 0.580091 + + wedge = mpatches.Wedge((0,0), R_constraint, 0, 90, facecolor=C_LIGHTGREEN, edgecolor=C_BLUE, linestyle='--') + ax.add_patch(wedge) + ax.text(0.05, R_constraint - 0.05, "y=4", fontsize=12, color=C_BLUE, va="center") + + # ── Arc for y = 9 ──────────────────────────────────────────────────── + x0 = 0.427793 + px = py = x0 + arc0 = mpatches.Arc((0,0), px*2*sqrt(2), py*2*sqrt(2), angle=0, theta1=0, theta2=90, color=C_RED, linestyle='--') + ax.add_patch(arc0) + ax.text(0.05, py*sqrt(2) + 0.04, "y=5", fontsize=12, color=C_RED, va="center") + + # ── Arc for y = 0 ──────────────────────────────────────────────────── + x0 = 0.294118 + px = py = x0 + arc0 = mpatches.Arc((0,0), px*2*sqrt(2), py*2*sqrt(2), angle=0, theta1=0, theta2=90, color=C_DARKGREEN, linestyle='--') + ax.add_patch(arc0) + ax.text(0.05, py*sqrt(2) - 0.05, "y=0", fontsize=12, color=C_NAVYBLUE, va="center") + + # ── Witness point ──────────────────────────────────────────────────── + px = py = x0 + ax.plot(px, py, "o", color=C_NAVYBLUE, ms=9, zorder=5) + + # ── PASS square: half-side = 0.285, full side = 0.570 ─────────────────── + hs_pass = 0.285 + ax.add_patch(mpatches.Rectangle( + (px - hs_pass, py - hs_pass), 2 * hs_pass, 2 * hs_pass, + facecolor=C_MAGENTA, alpha=0.14, linewidth=0, zorder=2)) + ax.add_patch(mpatches.Rectangle( + (px - hs_pass, py - hs_pass), 2 * hs_pass, 2 * hs_pass, + facecolor="none", edgecolor=C_GREEN, lw=1.8, zorder=3)) + ax.text(px + hs_pass - 0.175, py + 0.19, + f"side={2*hs_pass:.3f}\n PASS ✓ →", fontsize=12, + color=C_GREEN, va="center") + + # ── FAIL square: half-side = 0.286, full side = 0.572 ─────────────────── + hs_fail = 0.286 + ax.add_patch(mpatches.Rectangle( + (px - hs_fail, py - hs_fail), 2 * hs_fail, 2 * hs_fail, + facecolor="none", edgecolor=C_RED, lw=1.8, ls="--", zorder=3)) + ax.text(px + hs_fail + 0.01, py - 0.08, + f"side={2*hs_fail:.3f}\n← FAIL ✗", fontsize=12, + color=C_RED, va="center") + + # ── half-side annotation ────────────────────────────────────────────────── + bd = R_constraint - px + ax.annotate("", xy=(px + hs_fail + 0.005, py), xytext=(px, py), + arrowprops=dict(arrowstyle="<->", color=C_RED, lw=1.5)) + ax.text(px + hs_fail / 2 - 0.06, py - 0.05, f"rad-abs = {hs_fail}", + fontsize=14, color=C_RED, ha="center") + + handles = [ + Line2D([0], [0], color=C_BLUE, lw=1.5, ls="--", + label=r"$|x|= √(x_1^2+x_2^2)$" + f"={R_constraint}, y = 4 - constraint boundary"), + mpatches.Patch(facecolor=C_GREEN, alpha=0.65, + label=f"SMLP query is TRUE"), + mpatches.Patch(facecolor=C_MAGENTA, alpha=0.35, + label=f"certify PASS square side=2*{hs_pass}={2*hs_pass:.3f}"), + mpatches.Patch(facecolor="none", edgecolor=C_RED, lw=1.5, + linestyle="--", label=f"certify FAIL square side=2*{hs_fail}={2*hs_fail:.3f}"), + Line2D([0], [0], marker="o", color=C_NAVYBLUE, lw=0, + markersize=8, label=f"Witness point ({x0}, {x0}), y=0"), + ] + legend = ax.legend(handles=handles, fontsize=11, loc="upper right", framealpha=0.85) + ax.set_facecolor("#FAFAF8") + legend.get_texts()[0].set_color(C_BLUE) + legend.get_texts()[1].set_color(C_GREEN) + legend.get_texts()[2].set_color(C_MAGENTA) + legend.get_texts()[3].set_color(C_RED) + legend.get_texts()[4].set_color(C_NAVYBLUE) + + +# ════════════════════════════════════════════════════════════════════════════ +# Main +# ════════════════════════════════════════════════════════════════════════════ +def main(timeout: float = inf): + fig = plt.figure(figsize=(12, 8)) + ax1 = fig.subplots(1, 1) + + plot_geometry(ax1) + #plot_pipeline(ax2) + fig.tight_layout() + + fig.savefig("witness_certify.png", + dpi=150, bbox_inches="tight") + print("Saved witness_certify.png") + + if not inf == timeout: + timer = fig.canvas.new_timer(interval=int(timeout)*1000, callbacks=[(plt.close, [], {})]) + timer.start() + plt.show() + +if __name__ == "__main__": + timeout = inf + if len(argv) > 2: + if '-timeout' == argv[1]: + timeout = float(argv[2]) + main(timeout) diff --git a/tutorial/run_all b/tutorial/run_all index 452e56f0..2f98b2a4 100755 --- a/tutorial/run_all +++ b/tutorial/run_all @@ -1,23 +1,34 @@ #!/usr/bin/env -S tcsh -f set script_path=`realpath $0 | xargs dirname` set script_name=`realpath $0 | xargs basename` -set results_dir=${script_name}_results_`date +%s` -\rm -rf $results_dir >& /dev/null -mkdir $results_dir -cd $results_dir -echo "\nWorking directory: `realpath $PWD`\n" +if($#argv > 0) then + if("-clean" == "$argv[1]") then + set cleanup + endif +endif +if( $?cleanup ) then + foreach dir (`ls -d ${script_path}/${script_name}_results_* |& grep -v "No match"`) + set cmd="/usr/bin/rm -rf $dir" + echo $cmd + $cmd + end +else + set results_dir=${script_name}_results_`date +%s` + \rm -rf $results_dir >& /dev/null + mkdir $results_dir + cd $results_dir + echo "\nWorking directory: `realpath $PWD`\n" +endif set examples = ( \ ${script_path}/examples/constraint_dora/smlp/run_constraint_dora_poly \ ${script_path}/examples/bnh/smlp/run_poly_pareto \ + ${script_path}/examples/bnh/smlp/run_certify.sh \ ${script_path}/examples/eggholder/smlp/run_eggholder \ ${script_path}/examples/si/smlp/run_si_tests ) foreach e ( $examples ) - $e -clean - if( $#argv > 0 ) then - if("-clean" == "$argv[1]") then - echo Cleaning $e:h - continue - endif + if( $?cleanup ) then + echo Cleaning $e:h + continue endif echo Starting: $e $e From 29ea4ed56fc1897aa8e25f2d8c7e2e06ee093652 Mon Sep 17 00:00:00 2001 From: Dmitry Messerman Date: Wed, 22 Apr 2026 13:06:28 +0300 Subject: [PATCH 14/21] Synch with master --- pyproject.toml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 27dafea6..29a4814a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,6 +20,11 @@ maintainers = [ name = "smlptech" dynamic = ["version"] description = "SMLP - The Symbolic Machine Learning Prover" +license = "Apache-2.0" +license-files = [ + "LICENSE", + "AUTHORS", +] readme = "README.md" requires-python = "==3.11.*" dependencies = [ @@ -38,6 +43,9 @@ dependencies = [ "tensorflow==2.15.1", ] +[project.urls] +homepage = "https://github.com/SMLP-Systems/smlp" + [project.scripts] smlp = "smlp.run_smlp:main2" From a79a31b402b87cbbbff4c7eff96da48657443e36 Mon Sep 17 00:00:00 2001 From: Dmitry Messerman Date: Thu, 23 Apr 2026 11:43:25 +0300 Subject: [PATCH 15/21] Modified after the review --- README.md | 16 +++++----------- quickstart/quickstart.sh | 1 - 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 4a95acb6..ff11d39c 100644 --- a/README.md +++ b/README.md @@ -237,10 +237,9 @@ f(x*) = 6 - 2√5 ≈ 1.527864`, where `x* = (2/√5,1/√5) ≈ (0.894427, 0.44 - Step 1: Create input dataset and visualize the problem
- Step 2: Run SMLP
SMLP creates polynomial model and finds approximate solution
- - Step 3: Comparison to expected SMLP results
SMLP results `f(x*) = 1.527865, x* = (0.894531, 0.447004)`
- are pretty close to analytical solution + are within 0.05% accuracy for `f(x*)` and `x*` Running the script: ```bash @@ -289,24 +288,19 @@ cd quickstart Let's change circle radius to 2/√5, so squared radius will be 4/5
In order to do this, edit `constraint_dora.json` file and change right side of the inequality to be 4/5:
`"alpha": "X1*X1+X2*X2<=4/5",` + [Analytical solution](https://www.wolframalpha.com/input?i=Minimize%3A+f%28x1%2C+x2%29+%3D+%28x1+-+2%29%5E2+%2B+%28x2+-+1%29%5E2+subject+to+x1%5E2+%2B+x2%5E2+-+4%2F5+%3C%3D+0) for modified problem:
+ ` +f(x*) = 9/5 = 1.8`, where `x* = (4/5,2/5) = (0.8, 0.4)` - Step 3: Run the script from current directory ```bash ./quickstart.sh ``` -Expected result: +Expected SMLP results are within 0.03% accuracy for `f(x*)` and `x*`: ```bash Working directory: /quickstart/Constraint_dora_results_ X1 = 0.800048828125 X2 = 0.3999021053314209 Y1 = 1.8000002980730385 -1,3c1,3 -< X1 = 0.800048828125 -< X2 = 0.3999021053314209 -< Y1 = 1.8000002980730385 ---- -> X1 = 0.89453125 -> X2 = 0.4470043182373047 -> Y1 = 1.5278653812779421 ``` ## [Tutorial](https://github.com/SMLP-Systems/smlp/tree/master/tutorial) diff --git a/quickstart/quickstart.sh b/quickstart/quickstart.sh index 542cdef8..44778722 100755 --- a/quickstart/quickstart.sh +++ b/quickstart/quickstart.sh @@ -31,4 +31,3 @@ smlp "${smlp_args[@]}" >"$log" 2>&1 for var in X1 X2 Y1; do echo "$var = $(jq ".${var}.value_in_config" ${name}_${name}_optimization_results.json)" 2>&1 | tee -a "$results" done -diff "$results" ${script_path}/${name_lc}_poly_optimization_results_expected.txt From 2771350b8258c080ab20e3534861d621c6162bac Mon Sep 17 00:00:00 2001 From: Dmitry Messerman Date: Thu, 23 Apr 2026 11:57:08 +0300 Subject: [PATCH 16/21] Fixing typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ff11d39c..18a9fd38 100644 --- a/README.md +++ b/README.md @@ -233,7 +233,7 @@ tests/install/test_container_install mdmitry1/python311-dev f(x*) = 6 - 2√5 ≈ 1.527864`, where `x* = (2/√5,1/√5) ≈ (0.894427, 0.447214)`

Solution: see `bash` script [quickstart.sh](https://raw.githubusercontent.com/SMLP-Systems/smlp/smlp_quickstart/quickstart/quickstart.sh)

- The script has 3 steps
+ The script has 2 steps
- Step 1: Create input dataset and visualize the problem
- Step 2: Run SMLP
SMLP creates polynomial model and finds approximate solution
From 72ed08c625124d02d41537d9b7a2a93b9c3ee2bc Mon Sep 17 00:00:00 2001 From: Dmitry Messerman Date: Thu, 23 Apr 2026 12:41:11 +0300 Subject: [PATCH 17/21] Improved formatting --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 18a9fd38..1c0f79ba 100644 --- a/README.md +++ b/README.md @@ -287,10 +287,10 @@ cd quickstart - Step 2: As an example, change constraint in order to get solution in rational numbers
Let's change circle radius to 2/√5, so squared radius will be 4/5
In order to do this, edit `constraint_dora.json` file and change right side of the inequality to be 4/5:
- `"alpha": "X1*X1+X2*X2<=4/5",` + `"alpha": "X1*X1+X2*X2<=4/5",`

[Analytical solution](https://www.wolframalpha.com/input?i=Minimize%3A+f%28x1%2C+x2%29+%3D+%28x1+-+2%29%5E2+%2B+%28x2+-+1%29%5E2+subject+to+x1%5E2+%2B+x2%5E2+-+4%2F5+%3C%3D+0) for modified problem:
` -f(x*) = 9/5 = 1.8`, where `x* = (4/5,2/5) = (0.8, 0.4)` +f(x*) = 9/5 = 1.8`, where `x* = (4/5,2/5) = (0.8, 0.4)`

- Step 3: Run the script from current directory ```bash ./quickstart.sh From bcf24a5dda05984ebd31c3f61b34174bf6b30600 Mon Sep 17 00:00:00 2001 From: Dmitry Messerman Date: Thu, 23 Apr 2026 17:17:43 +0300 Subject: [PATCH 18/21] Fixed formatting in quickstart testcase details --- README.md | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 1c0f79ba..4fc2830e 100644 --- a/README.md +++ b/README.md @@ -247,26 +247,33 @@ smlp_package_path=$(python3.11 -c 'import smlp; from os.path import dirname; pri $smlp_package_path/quickstart/quickstart.sh ```

- Test case description -
1. constraint_dora.json - spec in json format

-{
- "version": "1.2",
+ **Test case description** + + **1.** *constraint_dora.json* - spec in json format

+ +``` +{ + "version": "1.2", "variables": [ - {"label":"X1", "interface":"knob", "type":"real", "range":[-1.5,2.5], "rad-abs": 0.0},
- {"label":"X2", "interface":"knob", "type":"real", "range":[-1.5,2.0], "rad-abs": 0.0},
+ {"label":"X1", "interface":"knob", "type":"real", "range":[-1.5,2.5], "rad-abs": 0.0}, + {"label":"X2", "interface":"knob", "type":"real", "range":[-1.5,2.0], "rad-abs": 0.0}, {"label":"Y1", "interface":"output", "type":"real"} - ],
- "alpha": "X1*X1+X2*X2<=1",
- "objectives": {"objective1": "-Y1"}
-}
-
+ ], + "alpha": "X1*X1+X2*X2<=1", + "objectives": {"objective1": "-Y1"} +} + Legend:
- X1 - first controllable variable
- X2 - second controlllable variable
- Y1 - output function
- rad-abs: sensitivity radius. Zero radius means that solution sensitivity check is skipped
- alpha - constraint depending on controllable variables
- objective1 - optimization goal

+ +``` + X1 - first controllable variable + X2 - second controlllable variable + Y1 - output function + rad-abs: sensitivity radius. Zero radius means that solution sensitivity check is skipped + alpha - constraint depending on controllable variables + objective1 - optimization goal +``` + 2. SMLP command line arguments

-data ${name}.csv.gz # input CSV dataset
-spec ${script_path}/${name_lc}.json # JSON spec file
From 292988f7a7c90dcddf70bd11300f76b58db4caaa Mon Sep 17 00:00:00 2001 From: Dmitry Messerman Date: Thu, 23 Apr 2026 17:17:43 +0300 Subject: [PATCH 19/21] Fixed formatting in quickstart testcase details --- README.md | 61 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 38 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 1c0f79ba..c21a6d31 100644 --- a/README.md +++ b/README.md @@ -247,33 +247,48 @@ smlp_package_path=$(python3.11 -c 'import smlp; from os.path import dirname; pri $smlp_package_path/quickstart/quickstart.sh ```
- Test case description -
1. constraint_dora.json - spec in json format

-{
- "version": "1.2",
+ Test case description
+ + **1.** *constraint_dora.json* - spec in json format
+ +``` +{ + "version": "1.2", "variables": [ - {"label":"X1", "interface":"knob", "type":"real", "range":[-1.5,2.5], "rad-abs": 0.0},
- {"label":"X2", "interface":"knob", "type":"real", "range":[-1.5,2.0], "rad-abs": 0.0},
+ {"label":"X1", "interface":"knob", "type":"real", "range":[-1.5,2.5], "rad-abs": 0.0}, + {"label":"X2", "interface":"knob", "type":"real", "range":[-1.5,2.0], "rad-abs": 0.0}, {"label":"Y1", "interface":"output", "type":"real"} - ],
- "alpha": "X1*X1+X2*X2<=1",
- "objectives": {"objective1": "-Y1"}
-}
-
+ ], + "alpha": "X1*X1+X2*X2<=1", + "objectives": {"objective1": "-Y1"} +} +``` + Legend:
- X1 - first controllable variable
- X2 - second controlllable variable
- Y1 - output function
- rad-abs: sensitivity radius. Zero radius means that solution sensitivity check is skipped
- alpha - constraint depending on controllable variables
- objective1 - optimization goal

- 2. SMLP command line arguments

- -data ${name}.csv.gz # input CSV dataset
+ +``` + X1 - first controllable variable + X2 - second controlllable variable + Y1 - output function + rad-abs - sensitivity radius. + Zero radius means that solution sensitivity check is skipped + alpha - constraint depending on controllable variables + objective1 - optimization goal +``` + +
+ + **2.** SMLP command line arguments
+ + ``` + -data ${name}.csv.gz # input CSV dataset
-spec ${script_path}/${name_lc}.json # JSON spec file
- -pref ${name} # output file prefix
- -mode optimize # operation mode
- -model poly_sklearn # model type
- -epsilon 0.0000005 # convergence threshold
+ -pref ${name} # output file prefix
+ -mode optimize # operation mode
+ -model poly_sklearn # model type
+ -epsilon 0.0000005 # convergence threshold
+``` +
### Problem modification in the user area From 4f818e4d6d856a004569ff3814d412ad98c2582f Mon Sep 17 00:00:00 2001 From: Dmitry Messerman Date: Thu, 23 Apr 2026 18:19:48 +0300 Subject: [PATCH 20/21] Added more line breaks to improve readability on pypi.org --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index c21a6d31..1da56ccf 100644 --- a/README.md +++ b/README.md @@ -246,6 +246,8 @@ Running the script: smlp_package_path=$(python3.11 -c 'import smlp; from os.path import dirname; print(dirname(smlp.__file__))') $smlp_package_path/quickstart/quickstart.sh ``` +
+
Test case description
From 5793224f2e9adfbcba8b1dd24c3a9a8e98cee4de Mon Sep 17 00:00:00 2001 From: Dmitry Messerman Date: Thu, 23 Apr 2026 18:46:25 +0300 Subject: [PATCH 21/21] Removed
in markdown code block --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 1da56ccf..c531e7ce 100644 --- a/README.md +++ b/README.md @@ -283,12 +283,12 @@ $smlp_package_path/quickstart/quickstart.sh **2.** SMLP command line arguments
``` - -data ${name}.csv.gz # input CSV dataset
- -spec ${script_path}/${name_lc}.json # JSON spec file
- -pref ${name} # output file prefix
- -mode optimize # operation mode
- -model poly_sklearn # model type
- -epsilon 0.0000005 # convergence threshold
+ -data ${name}.csv.gz # input CSV dataset + -spec ${script_path}/${name_lc}.json # JSON spec file + -pref ${name} # output file prefix + -mode optimize # operation mode + -model poly_sklearn # model type + -epsilon 0.0000005 # convergence threshold ```