From ba87d6d784269d2fd9675231ad2a86e8138faaab Mon Sep 17 00:00:00 2001 From: mayge Date: Wed, 24 Sep 2025 22:18:53 -0400 Subject: [PATCH] =?UTF-8?q?chore:=20=E5=88=86=E7=A6=BB=E4=BA=86sweep?= =?UTF-8?q?=E5=92=8Cvf=E9=83=A8=E5=88=86,vf=E9=83=A8=E5=88=86=E5=87=86?= =?UTF-8?q?=E5=A4=87=E5=86=99=E4=B8=BA=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- capa_results.json | 12170 ---------------- core/MultiPortOrthonormalBasis.py | 626 - core/VFManager.py | 176 + core/basis/MultiPortOrthonormalBasis.py | 362 + core/{ => basis}/MultiplePortQR.py | 4 +- core/{robust.py => basis/__init__.py} | 0 core/{ => basis}/basis.py | 4 +- core/{ => basis}/basisQR.py | 4 +- core/{ => basis}/relaxed_basisQR.py | 4 +- core/{freqency.py => sample.py} | 0 core/util.py | 909 -- core/{sk_iter.py => utils.py} | 12 + core/vectorFitting.py | 2617 ---- main.py | 558 +- models/basic.py | 155 - models/capa.py | 45 - models/mlin.py | 45 - outputs/capa_parametric.s2p | 309 - outputs/pvf_test_sample.s2p | 309 - schemas/paramer.py | 49 - sweep.py | 13 - .../test_vector_fitting.py | 0 utils.py | 55 - 24 files changed, 684 insertions(+), 17745 deletions(-) delete mode 100644 capa_results.json delete mode 100644 core/MultiPortOrthonormalBasis.py create mode 100644 core/VFManager.py create mode 100644 core/basis/MultiPortOrthonormalBasis.py rename core/{ => basis}/MultiplePortQR.py (99%) rename core/{robust.py => basis/__init__.py} (100%) rename core/{ => basis}/basis.py (99%) rename core/{ => basis}/basisQR.py (99%) rename core/{ => basis}/relaxed_basisQR.py (99%) rename core/{freqency.py => sample.py} (100%) delete mode 100644 core/util.py rename core/{sk_iter.py => utils.py} (56%) delete mode 100644 core/vectorFitting.py delete mode 100644 models/basic.py delete mode 100644 models/capa.py delete mode 100644 models/mlin.py delete mode 100644 outputs/capa_parametric.s2p delete mode 100644 outputs/pvf_test_sample.s2p delete mode 100644 schemas/paramer.py delete mode 100644 sweep.py rename vector_fitting.py => test/test_vector_fitting.py (100%) delete mode 100644 utils.py diff --git a/.gitignore b/.gitignore index 2be33ae..b25ab98 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ __pycache__/ __pypackages__/ env/ .venv/ -.vscode/ \ No newline at end of file +.vscode/ +outputs/ \ No newline at end of file diff --git a/capa_results.json b/capa_results.json deleted file mode 100644 index 7c73e82..0000000 --- a/capa_results.json +++ /dev/null @@ -1,12170 +0,0 @@ -[ - { - "parameters": { - "W": 15.52, - "L": 15.52 - }, - "id": 2626, - "result_dir": "/tmp/paramer/simulation/2626" - }, - { - "parameters": { - "W": 15.52, - "L": 16.3 - }, - "id": 2627, - "result_dir": "/tmp/paramer/simulation/2627" - }, - { - "parameters": { - "W": 15.52, - "L": 17.12 - }, - "id": 2628, - "result_dir": "/tmp/paramer/simulation/2628" - }, - { - "parameters": { - "W": 15.52, - "L": 17.98 - }, - "id": 2629, - "result_dir": "/tmp/paramer/simulation/2629" - }, - { - "parameters": { - "W": 15.52, - "L": 18.88 - }, - "id": 2630, - "result_dir": "/tmp/paramer/simulation/2630" - }, - { - "parameters": { - "W": 15.52, - "L": 19.82 - }, - "id": 2631, - "result_dir": "/tmp/paramer/simulation/2631" - }, - { - "parameters": { - "W": 15.52, - "L": 20.81 - }, - "id": 2632, - "result_dir": "/tmp/paramer/simulation/2632" - }, - { - "parameters": { - "W": 15.52, - "L": 21.85 - }, - "id": 2633, - "result_dir": "/tmp/paramer/simulation/2633" - }, - { - "parameters": { - "W": 15.52, - "L": 22.94 - }, - "id": 2634, - "result_dir": "/tmp/paramer/simulation/2634" - }, - { - "parameters": { - "W": 15.52, - "L": 24.09 - }, - "id": 2635, - "result_dir": "/tmp/paramer/simulation/2635" - }, - { - "parameters": { - "W": 15.52, - "L": 25.29 - }, - "id": 2636, - "result_dir": "/tmp/paramer/simulation/2636" - }, - { - "parameters": { - "W": 15.52, - "L": 26.55 - }, - "id": 2637, - "result_dir": "/tmp/paramer/simulation/2637" - }, - { - "parameters": { - "W": 15.52, - "L": 27.88 - }, - "id": 2638, - "result_dir": "/tmp/paramer/simulation/2638" - }, - { - "parameters": { - "W": 15.52, - "L": 29.27 - }, - "id": 2639, - "result_dir": "/tmp/paramer/simulation/2639" - }, - { - "parameters": { - "W": 15.52, - "L": 30.73 - }, - "id": 2640, - "result_dir": "/tmp/paramer/simulation/2640" - }, - { - "parameters": { - "W": 15.52, - "L": 32.27 - }, - "id": 2641, - "result_dir": "/tmp/paramer/simulation/2641" - }, - { - "parameters": { - "W": 15.52, - "L": 33.88 - }, - "id": 2642, - "result_dir": "/tmp/paramer/simulation/2642" - }, - { - "parameters": { - "W": 15.52, - "L": 35.57 - }, - "id": 2643, - "result_dir": "/tmp/paramer/simulation/2643" - }, - { - "parameters": { - "W": 15.52, - "L": 37.35 - }, - "id": 2644, - "result_dir": "/tmp/paramer/simulation/2644" - }, - { - "parameters": { - "W": 15.52, - "L": 39.22 - }, - "id": 2645, - "result_dir": "/tmp/paramer/simulation/2645" - }, - { - "parameters": { - "W": 15.52, - "L": 41.18 - }, - "id": 2646, - "result_dir": "/tmp/paramer/simulation/2646" - }, - { - "parameters": { - "W": 15.52, - "L": 43.24 - }, - "id": 2647, - "result_dir": "/tmp/paramer/simulation/2647" - }, - { - "parameters": { - "W": 15.52, - "L": 45.4 - }, - "id": 2648, - "result_dir": "/tmp/paramer/simulation/2648" - }, - { - "parameters": { - "W": 15.52, - "L": 47.67 - }, - "id": 2649, - "result_dir": "/tmp/paramer/simulation/2649" - }, - { - "parameters": { - "W": 15.52, - "L": 50.05 - }, - "id": 2650, - "result_dir": "/tmp/paramer/simulation/2650" - }, - { - "parameters": { - "W": 15.52, - "L": 52.55 - }, - "id": 2651, - "result_dir": "/tmp/paramer/simulation/2651" - }, - { - "parameters": { - "W": 15.52, - "L": 55.18 - }, - "id": 2652, - "result_dir": "/tmp/paramer/simulation/2652" - }, - { - "parameters": { - "W": 15.52, - "L": 57.94 - }, - "id": 2653, - "result_dir": "/tmp/paramer/simulation/2653" - }, - { - "parameters": { - "W": 15.52, - "L": 60.84 - }, - "id": 2654, - "result_dir": "/tmp/paramer/simulation/2654" - }, - { - "parameters": { - "W": 15.52, - "L": 63.88 - }, - "id": 2655, - "result_dir": "/tmp/paramer/simulation/2655" - }, - { - "parameters": { - "W": 15.52, - "L": 67.07 - }, - "id": 2656, - "result_dir": "/tmp/paramer/simulation/2656" - }, - { - "parameters": { - "W": 15.52, - "L": 70.42 - }, - "id": 2657, - "result_dir": "/tmp/paramer/simulation/2657" - }, - { - "parameters": { - "W": 15.52, - "L": 73.94 - }, - "id": 2658, - "result_dir": "/tmp/paramer/simulation/2658" - }, - { - "parameters": { - "W": 15.52, - "L": 77.64 - }, - "id": 2659, - "result_dir": "/tmp/paramer/simulation/2659" - }, - { - "parameters": { - "W": 15.52, - "L": 81.52 - }, - "id": 2660, - "result_dir": "/tmp/paramer/simulation/2660" - }, - { - "parameters": { - "W": 15.52, - "L": 85.6 - }, - "id": 2661, - "result_dir": "/tmp/paramer/simulation/2661" - }, - { - "parameters": { - "W": 15.52, - "L": 89.88 - }, - "id": 2662, - "result_dir": "/tmp/paramer/simulation/2662" - }, - { - "parameters": { - "W": 15.52, - "L": 94.37 - }, - "id": 2663, - "result_dir": "/tmp/paramer/simulation/2663" - }, - { - "parameters": { - "W": 15.52, - "L": 99.09 - }, - "id": 2664, - "result_dir": "/tmp/paramer/simulation/2664" - }, - { - "parameters": { - "W": 16.3, - "L": 15.52 - }, - "id": 2674, - "result_dir": "/tmp/paramer/simulation/2674" - }, - { - "parameters": { - "W": 16.3, - "L": 16.3 - }, - "id": 2675, - "result_dir": "/tmp/paramer/simulation/2675" - }, - { - "parameters": { - "W": 16.3, - "L": 17.12 - }, - "id": 2676, - "result_dir": "/tmp/paramer/simulation/2676" - }, - { - "parameters": { - "W": 16.3, - "L": 17.98 - }, - "id": 2677, - "result_dir": "/tmp/paramer/simulation/2677" - }, - { - "parameters": { - "W": 16.3, - "L": 18.88 - }, - "id": 2678, - "result_dir": "/tmp/paramer/simulation/2678" - }, - { - "parameters": { - "W": 16.3, - "L": 19.82 - }, - "id": 2679, - "result_dir": "/tmp/paramer/simulation/2679" - }, - { - "parameters": { - "W": 16.3, - "L": 20.81 - }, - "id": 2680, - "result_dir": "/tmp/paramer/simulation/2680" - }, - { - "parameters": { - "W": 16.3, - "L": 21.85 - }, - "id": 2681, - "result_dir": "/tmp/paramer/simulation/2681" - }, - { - "parameters": { - "W": 16.3, - "L": 22.94 - }, - "id": 2682, - "result_dir": "/tmp/paramer/simulation/2682" - }, - { - "parameters": { - "W": 16.3, - "L": 24.09 - }, - "id": 2683, - "result_dir": "/tmp/paramer/simulation/2683" - }, - { - "parameters": { - "W": 16.3, - "L": 25.29 - }, - "id": 2684, - "result_dir": "/tmp/paramer/simulation/2684" - }, - { - "parameters": { - "W": 16.3, - "L": 26.55 - }, - "id": 2685, - "result_dir": "/tmp/paramer/simulation/2685" - }, - { - "parameters": { - "W": 16.3, - "L": 27.88 - }, - "id": 2686, - "result_dir": "/tmp/paramer/simulation/2686" - }, - { - "parameters": { - "W": 16.3, - "L": 29.27 - }, - "id": 2687, - "result_dir": "/tmp/paramer/simulation/2687" - }, - { - "parameters": { - "W": 16.3, - "L": 30.73 - }, - "id": 2688, - "result_dir": "/tmp/paramer/simulation/2688" - }, - { - "parameters": { - "W": 16.3, - "L": 32.27 - }, - "id": 2689, - "result_dir": "/tmp/paramer/simulation/2689" - }, - { - "parameters": { - "W": 16.3, - "L": 33.88 - }, - "id": 2690, - "result_dir": "/tmp/paramer/simulation/2690" - }, - { - "parameters": { - "W": 16.3, - "L": 35.57 - }, - "id": 2691, - "result_dir": "/tmp/paramer/simulation/2691" - }, - { - "parameters": { - "W": 16.3, - "L": 37.35 - }, - "id": 2692, - "result_dir": "/tmp/paramer/simulation/2692" - }, - { - "parameters": { - "W": 16.3, - "L": 39.22 - }, - "id": 2693, - "result_dir": "/tmp/paramer/simulation/2693" - }, - { - "parameters": { - "W": 16.3, - "L": 41.18 - }, - "id": 2694, - "result_dir": "/tmp/paramer/simulation/2694" - }, - { - "parameters": { - "W": 16.3, - "L": 43.24 - }, - "id": 2695, - "result_dir": "/tmp/paramer/simulation/2695" - }, - { - "parameters": { - "W": 16.3, - "L": 45.4 - }, - "id": 2696, - "result_dir": "/tmp/paramer/simulation/2696" - }, - { - "parameters": { - "W": 16.3, - "L": 47.67 - }, - "id": 2697, - "result_dir": "/tmp/paramer/simulation/2697" - }, - { - "parameters": { - "W": 16.3, - "L": 50.05 - }, - "id": 2698, - "result_dir": "/tmp/paramer/simulation/2698" - }, - { - "parameters": { - "W": 16.3, - "L": 52.55 - }, - "id": 2699, - "result_dir": "/tmp/paramer/simulation/2699" - }, - { - "parameters": { - "W": 16.3, - "L": 55.18 - }, - "id": 2700, - "result_dir": "/tmp/paramer/simulation/2700" - }, - { - "parameters": { - "W": 16.3, - "L": 57.94 - }, - "id": 2701, - "result_dir": "/tmp/paramer/simulation/2701" - }, - { - "parameters": { - "W": 16.3, - "L": 60.84 - }, - "id": 2702, - "result_dir": "/tmp/paramer/simulation/2702" - }, - { - "parameters": { - "W": 16.3, - "L": 63.88 - }, - "id": 2703, - "result_dir": "/tmp/paramer/simulation/2703" - }, - { - "parameters": { - "W": 16.3, - "L": 67.07 - }, - "id": 2704, - "result_dir": "/tmp/paramer/simulation/2704" - }, - { - "parameters": { - "W": 16.3, - "L": 70.42 - }, - "id": 2705, - "result_dir": "/tmp/paramer/simulation/2705" - }, - { - "parameters": { - "W": 16.3, - "L": 73.94 - }, - "id": 2706, - "result_dir": "/tmp/paramer/simulation/2706" - }, - { - "parameters": { - "W": 16.3, - "L": 77.64 - }, - "id": 2707, - "result_dir": "/tmp/paramer/simulation/2707" - }, - { - "parameters": { - "W": 16.3, - "L": 81.52 - }, - "id": 2708, - "result_dir": "/tmp/paramer/simulation/2708" - }, - { - "parameters": { - "W": 16.3, - "L": 85.6 - }, - "id": 2709, - "result_dir": "/tmp/paramer/simulation/2709" - }, - { - "parameters": { - "W": 16.3, - "L": 89.88 - }, - "id": 2710, - "result_dir": "/tmp/paramer/simulation/2710" - }, - { - "parameters": { - "W": 16.3, - "L": 94.37 - }, - "id": 2711, - "result_dir": "/tmp/paramer/simulation/2711" - }, - { - "parameters": { - "W": 16.3, - "L": 99.09 - }, - "id": 2712, - "result_dir": "/tmp/paramer/simulation/2712" - }, - { - "parameters": { - "W": 17.12, - "L": 15.52 - }, - "id": 2722, - "result_dir": "/tmp/paramer/simulation/2722" - }, - { - "parameters": { - "W": 17.12, - "L": 16.3 - }, - "id": 2723, - "result_dir": "/tmp/paramer/simulation/2723" - }, - { - "parameters": { - "W": 17.12, - "L": 17.12 - }, - "id": 2724, - "result_dir": "/tmp/paramer/simulation/2724" - }, - { - "parameters": { - "W": 17.12, - "L": 17.98 - }, - "id": 2725, - "result_dir": "/tmp/paramer/simulation/2725" - }, - { - "parameters": { - "W": 17.12, - "L": 18.88 - }, - "id": 2726, - "result_dir": "/tmp/paramer/simulation/2726" - }, - { - "parameters": { - "W": 17.12, - "L": 19.82 - }, - "id": 2727, - "result_dir": "/tmp/paramer/simulation/2727" - }, - { - "parameters": { - "W": 17.12, - "L": 20.81 - }, - "id": 2728, - "result_dir": "/tmp/paramer/simulation/2728" - }, - { - "parameters": { - "W": 17.12, - "L": 21.85 - }, - "id": 2729, - "result_dir": "/tmp/paramer/simulation/2729" - }, - { - "parameters": { - "W": 17.12, - "L": 22.94 - }, - "id": 2730, - "result_dir": "/tmp/paramer/simulation/2730" - }, - { - "parameters": { - "W": 17.12, - "L": 24.09 - }, - "id": 2731, - "result_dir": "/tmp/paramer/simulation/2731" - }, - { - "parameters": { - "W": 17.12, - "L": 25.29 - }, - "id": 2732, - "result_dir": "/tmp/paramer/simulation/2732" - }, - { - "parameters": { - "W": 17.12, - "L": 26.55 - }, - "id": 2733, - "result_dir": "/tmp/paramer/simulation/2733" - }, - { - "parameters": { - "W": 17.12, - "L": 27.88 - }, - "id": 2734, - "result_dir": "/tmp/paramer/simulation/2734" - }, - { - "parameters": { - "W": 17.12, - "L": 29.27 - }, - "id": 2735, - "result_dir": "/tmp/paramer/simulation/2735" - }, - { - "parameters": { - "W": 17.12, - "L": 30.73 - }, - "id": 2736, - "result_dir": "/tmp/paramer/simulation/2736" - }, - { - "parameters": { - "W": 17.12, - "L": 32.27 - }, - "id": 2737, - "result_dir": "/tmp/paramer/simulation/2737" - }, - { - "parameters": { - "W": 17.12, - "L": 33.88 - }, - "id": 2738, - "result_dir": "/tmp/paramer/simulation/2738" - }, - { - "parameters": { - "W": 17.12, - "L": 35.57 - }, - "id": 2739, - "result_dir": "/tmp/paramer/simulation/2739" - }, - { - "parameters": { - "W": 17.12, - "L": 37.35 - }, - "id": 2740, - "result_dir": "/tmp/paramer/simulation/2740" - }, - { - "parameters": { - "W": 17.12, - "L": 39.22 - }, - "id": 2741, - "result_dir": "/tmp/paramer/simulation/2741" - }, - { - "parameters": { - "W": 17.12, - "L": 41.18 - }, - "id": 2742, - "result_dir": "/tmp/paramer/simulation/2742" - }, - { - "parameters": { - "W": 17.12, - "L": 43.24 - }, - "id": 2743, - "result_dir": "/tmp/paramer/simulation/2743" - }, - { - "parameters": { - "W": 17.12, - "L": 45.4 - }, - "id": 2744, - "result_dir": "/tmp/paramer/simulation/2744" - }, - { - "parameters": { - "W": 17.12, - "L": 47.67 - }, - "id": 2745, - "result_dir": "/tmp/paramer/simulation/2745" - }, - { - "parameters": { - "W": 17.12, - "L": 50.05 - }, - "id": 2746, - "result_dir": "/tmp/paramer/simulation/2746" - }, - { - "parameters": { - "W": 17.12, - "L": 52.55 - }, - "id": 2747, - "result_dir": "/tmp/paramer/simulation/2747" - }, - { - "parameters": { - "W": 17.12, - "L": 55.18 - }, - "id": 2748, - "result_dir": "/tmp/paramer/simulation/2748" - }, - { - "parameters": { - "W": 17.12, - "L": 57.94 - }, - "id": 2749, - "result_dir": "/tmp/paramer/simulation/2749" - }, - { - "parameters": { - "W": 17.12, - "L": 60.84 - }, - "id": 2750, - "result_dir": "/tmp/paramer/simulation/2750" - }, - { - "parameters": { - "W": 17.12, - "L": 63.88 - }, - "id": 2751, - "result_dir": "/tmp/paramer/simulation/2751" - }, - { - "parameters": { - "W": 17.12, - "L": 67.07 - }, - "id": 2752, - "result_dir": "/tmp/paramer/simulation/2752" - }, - { - "parameters": { - "W": 17.12, - "L": 70.42 - }, - "id": 2753, - "result_dir": "/tmp/paramer/simulation/2753" - }, - { - "parameters": { - "W": 17.12, - "L": 73.94 - }, - "id": 2754, - "result_dir": "/tmp/paramer/simulation/2754" - }, - { - "parameters": { - "W": 17.12, - "L": 77.64 - }, - "id": 2755, - "result_dir": "/tmp/paramer/simulation/2755" - }, - { - "parameters": { - "W": 17.12, - "L": 81.52 - }, - "id": 2756, - "result_dir": "/tmp/paramer/simulation/2756" - }, - { - "parameters": { - "W": 17.12, - "L": 85.6 - }, - "id": 2757, - "result_dir": "/tmp/paramer/simulation/2757" - }, - { - "parameters": { - "W": 17.12, - "L": 89.88 - }, - "id": 2758, - "result_dir": "/tmp/paramer/simulation/2758" - }, - { - "parameters": { - "W": 17.12, - "L": 94.37 - }, - "id": 2759, - "result_dir": "/tmp/paramer/simulation/2759" - }, - { - "parameters": { - "W": 17.12, - "L": 99.09 - }, - "id": 2760, - "result_dir": "/tmp/paramer/simulation/2760" - }, - { - "parameters": { - "W": 17.98, - "L": 15.52 - }, - "id": 2770, - "result_dir": "/tmp/paramer/simulation/2770" - }, - { - "parameters": { - "W": 17.98, - "L": 16.3 - }, - "id": 2771, - "result_dir": "/tmp/paramer/simulation/2771" - }, - { - "parameters": { - "W": 17.98, - "L": 17.12 - }, - "id": 2772, - "result_dir": "/tmp/paramer/simulation/2772" - }, - { - "parameters": { - "W": 17.98, - "L": 17.98 - }, - "id": 2773, - "result_dir": "/tmp/paramer/simulation/2773" - }, - { - "parameters": { - "W": 17.98, - "L": 18.88 - }, - "id": 2774, - "result_dir": "/tmp/paramer/simulation/2774" - }, - { - "parameters": { - "W": 17.98, - "L": 19.82 - }, - "id": 2775, - "result_dir": "/tmp/paramer/simulation/2775" - }, - { - "parameters": { - "W": 17.98, - "L": 20.81 - }, - "id": 2776, - "result_dir": "/tmp/paramer/simulation/2776" - }, - { - "parameters": { - "W": 17.98, - "L": 21.85 - }, - "id": 2777, - "result_dir": "/tmp/paramer/simulation/2777" - }, - { - "parameters": { - "W": 17.98, - "L": 22.94 - }, - "id": 2778, - "result_dir": "/tmp/paramer/simulation/2778" - }, - { - "parameters": { - "W": 17.98, - "L": 24.09 - }, - "id": 2779, - "result_dir": "/tmp/paramer/simulation/2779" - }, - { - "parameters": { - "W": 17.98, - "L": 25.29 - }, - "id": 2780, - "result_dir": "/tmp/paramer/simulation/2780" - }, - { - "parameters": { - "W": 17.98, - "L": 26.55 - }, - "id": 2781, - "result_dir": "/tmp/paramer/simulation/2781" - }, - { - "parameters": { - "W": 17.98, - "L": 27.88 - }, - "id": 2782, - "result_dir": "/tmp/paramer/simulation/2782" - }, - { - "parameters": { - "W": 17.98, - "L": 29.27 - }, - "id": 2783, - "result_dir": "/tmp/paramer/simulation/2783" - }, - { - "parameters": { - "W": 17.98, - "L": 30.73 - }, - "id": 2784, - "result_dir": "/tmp/paramer/simulation/2784" - }, - { - "parameters": { - "W": 17.98, - "L": 32.27 - }, - "id": 2785, - "result_dir": "/tmp/paramer/simulation/2785" - }, - { - "parameters": { - "W": 17.98, - "L": 33.88 - }, - "id": 2786, - "result_dir": "/tmp/paramer/simulation/2786" - }, - { - "parameters": { - "W": 17.98, - "L": 35.57 - }, - "id": 2787, - "result_dir": "/tmp/paramer/simulation/2787" - }, - { - "parameters": { - "W": 17.98, - "L": 37.35 - }, - "id": 2788, - "result_dir": "/tmp/paramer/simulation/2788" - }, - { - "parameters": { - "W": 17.98, - "L": 39.22 - }, - "id": 2789, - "result_dir": "/tmp/paramer/simulation/2789" - }, - { - "parameters": { - "W": 17.98, - "L": 41.18 - }, - "id": 2790, - "result_dir": "/tmp/paramer/simulation/2790" - }, - { - "parameters": { - "W": 17.98, - "L": 43.24 - }, - "id": 2791, - "result_dir": "/tmp/paramer/simulation/2791" - }, - { - "parameters": { - "W": 17.98, - "L": 45.4 - }, - "id": 2792, - "result_dir": "/tmp/paramer/simulation/2792" - }, - { - "parameters": { - "W": 17.98, - "L": 47.67 - }, - "id": 2793, - "result_dir": "/tmp/paramer/simulation/2793" - }, - { - "parameters": { - "W": 17.98, - "L": 50.05 - }, - "id": 2794, - "result_dir": "/tmp/paramer/simulation/2794" - }, - { - "parameters": { - "W": 17.98, - "L": 52.55 - }, - "id": 2795, - "result_dir": "/tmp/paramer/simulation/2795" - }, - { - "parameters": { - "W": 17.98, - "L": 55.18 - }, - "id": 2796, - "result_dir": "/tmp/paramer/simulation/2796" - }, - { - "parameters": { - "W": 17.98, - "L": 57.94 - }, - "id": 2797, - "result_dir": "/tmp/paramer/simulation/2797" - }, - { - "parameters": { - "W": 17.98, - "L": 60.84 - }, - "id": 2798, - "result_dir": "/tmp/paramer/simulation/2798" - }, - { - "parameters": { - "W": 17.98, - "L": 63.88 - }, - "id": 2799, - "result_dir": "/tmp/paramer/simulation/2799" - }, - { - "parameters": { - "W": 17.98, - "L": 67.07 - }, - "id": 2800, - "result_dir": "/tmp/paramer/simulation/2800" - }, - { - "parameters": { - "W": 17.98, - "L": 70.42 - }, - "id": 2801, - "result_dir": "/tmp/paramer/simulation/2801" - }, - { - "parameters": { - "W": 17.98, - "L": 73.94 - }, - "id": 2802, - "result_dir": "/tmp/paramer/simulation/2802" - }, - { - "parameters": { - "W": 17.98, - "L": 77.64 - }, - "id": 2803, - "result_dir": "/tmp/paramer/simulation/2803" - }, - { - "parameters": { - "W": 17.98, - "L": 81.52 - }, - "id": 2804, - "result_dir": "/tmp/paramer/simulation/2804" - }, - { - "parameters": { - "W": 17.98, - "L": 85.6 - }, - "id": 2805, - "result_dir": "/tmp/paramer/simulation/2805" - }, - { - "parameters": { - "W": 17.98, - "L": 89.88 - }, - "id": 2806, - "result_dir": "/tmp/paramer/simulation/2806" - }, - { - "parameters": { - "W": 17.98, - "L": 94.37 - }, - "id": 2807, - "result_dir": "/tmp/paramer/simulation/2807" - }, - { - "parameters": { - "W": 17.98, - "L": 99.09 - }, - "id": 2808, - "result_dir": "/tmp/paramer/simulation/2808" - }, - { - "parameters": { - "W": 18.88, - "L": 15.52 - }, - "id": 2818, - "result_dir": "/tmp/paramer/simulation/2818" - }, - { - "parameters": { - "W": 18.88, - "L": 16.3 - }, - "id": 2819, - "result_dir": "/tmp/paramer/simulation/2819" - }, - { - "parameters": { - "W": 18.88, - "L": 17.12 - }, - "id": 2820, - "result_dir": "/tmp/paramer/simulation/2820" - }, - { - "parameters": { - "W": 18.88, - "L": 17.98 - }, - "id": 2821, - "result_dir": "/tmp/paramer/simulation/2821" - }, - { - "parameters": { - "W": 18.88, - "L": 18.88 - }, - "id": 2822, - "result_dir": "/tmp/paramer/simulation/2822" - }, - { - "parameters": { - "W": 18.88, - "L": 19.82 - }, - "id": 2823, - "result_dir": "/tmp/paramer/simulation/2823" - }, - { - "parameters": { - "W": 18.88, - "L": 20.81 - }, - "id": 2824, - "result_dir": "/tmp/paramer/simulation/2824" - }, - { - "parameters": { - "W": 18.88, - "L": 21.85 - }, - "id": 2825, - "result_dir": "/tmp/paramer/simulation/2825" - }, - { - "parameters": { - "W": 18.88, - "L": 22.94 - }, - "id": 2826, - "result_dir": "/tmp/paramer/simulation/2826" - }, - { - "parameters": { - "W": 18.88, - "L": 24.09 - }, - "id": 2827, - "result_dir": "/tmp/paramer/simulation/2827" - }, - { - "parameters": { - "W": 18.88, - "L": 25.29 - }, - "id": 2828, - "result_dir": "/tmp/paramer/simulation/2828" - }, - { - "parameters": { - "W": 18.88, - "L": 26.55 - }, - "id": 2829, - "result_dir": "/tmp/paramer/simulation/2829" - }, - { - "parameters": { - "W": 18.88, - "L": 27.88 - }, - "id": 2830, - "result_dir": "/tmp/paramer/simulation/2830" - }, - { - "parameters": { - "W": 18.88, - "L": 29.27 - }, - "id": 2831, - "result_dir": "/tmp/paramer/simulation/2831" - }, - { - "parameters": { - "W": 18.88, - "L": 30.73 - }, - "id": 2832, - "result_dir": "/tmp/paramer/simulation/2832" - }, - { - "parameters": { - "W": 18.88, - "L": 32.27 - }, - "id": 2833, - "result_dir": "/tmp/paramer/simulation/2833" - }, - { - "parameters": { - "W": 18.88, - "L": 33.88 - }, - "id": 2834, - "result_dir": "/tmp/paramer/simulation/2834" - }, - { - "parameters": { - "W": 18.88, - "L": 35.57 - }, - "id": 2835, - "result_dir": "/tmp/paramer/simulation/2835" - }, - { - "parameters": { - "W": 18.88, - "L": 37.35 - }, - "id": 2836, - "result_dir": "/tmp/paramer/simulation/2836" - }, - { - "parameters": { - "W": 18.88, - "L": 39.22 - }, - "id": 2837, - "result_dir": "/tmp/paramer/simulation/2837" - }, - { - "parameters": { - "W": 18.88, - "L": 41.18 - }, - "id": 2838, - "result_dir": "/tmp/paramer/simulation/2838" - }, - { - "parameters": { - "W": 18.88, - "L": 43.24 - }, - "id": 2839, - "result_dir": "/tmp/paramer/simulation/2839" - }, - { - "parameters": { - "W": 18.88, - "L": 45.4 - }, - "id": 2840, - "result_dir": "/tmp/paramer/simulation/2840" - }, - { - "parameters": { - "W": 18.88, - "L": 47.67 - }, - "id": 2841, - "result_dir": "/tmp/paramer/simulation/2841" - }, - { - "parameters": { - "W": 18.88, - "L": 50.05 - }, - "id": 2842, - "result_dir": "/tmp/paramer/simulation/2842" - }, - { - "parameters": { - "W": 18.88, - "L": 52.55 - }, - "id": 2843, - "result_dir": "/tmp/paramer/simulation/2843" - }, - { - "parameters": { - "W": 18.88, - "L": 55.18 - }, - "id": 2844, - "result_dir": "/tmp/paramer/simulation/2844" - }, - { - "parameters": { - "W": 18.88, - "L": 57.94 - }, - "id": 2845, - "result_dir": "/tmp/paramer/simulation/2845" - }, - { - "parameters": { - "W": 18.88, - "L": 60.84 - }, - "id": 2846, - "result_dir": "/tmp/paramer/simulation/2846" - }, - { - "parameters": { - "W": 18.88, - "L": 63.88 - }, - "id": 2847, - "result_dir": "/tmp/paramer/simulation/2847" - }, - { - "parameters": { - "W": 18.88, - "L": 67.07 - }, - "id": 2848, - "result_dir": "/tmp/paramer/simulation/2848" - }, - { - "parameters": { - "W": 18.88, - "L": 70.42 - }, - "id": 2849, - "result_dir": "/tmp/paramer/simulation/2849" - }, - { - "parameters": { - "W": 18.88, - "L": 73.94 - }, - "id": 2850, - "result_dir": "/tmp/paramer/simulation/2850" - }, - { - "parameters": { - "W": 18.88, - "L": 77.64 - }, - "id": 2851, - "result_dir": "/tmp/paramer/simulation/2851" - }, - { - "parameters": { - "W": 18.88, - "L": 81.52 - }, - "id": 2852, - "result_dir": "/tmp/paramer/simulation/2852" - }, - { - "parameters": { - "W": 18.88, - "L": 85.6 - }, - "id": 2853, - "result_dir": "/tmp/paramer/simulation/2853" - }, - { - "parameters": { - "W": 18.88, - "L": 89.88 - }, - "id": 2854, - "result_dir": "/tmp/paramer/simulation/2854" - }, - { - "parameters": { - "W": 18.88, - "L": 94.37 - }, - "id": 2855, - "result_dir": "/tmp/paramer/simulation/2855" - }, - { - "parameters": { - "W": 18.88, - "L": 99.09 - }, - "id": 2856, - "result_dir": "/tmp/paramer/simulation/2856" - }, - { - "parameters": { - "W": 19.82, - "L": 15.52 - }, - "id": 2866, - "result_dir": "/tmp/paramer/simulation/2866" - }, - { - "parameters": { - "W": 19.82, - "L": 16.3 - }, - "id": 2867, - "result_dir": "/tmp/paramer/simulation/2867" - }, - { - "parameters": { - "W": 19.82, - "L": 17.12 - }, - "id": 2868, - "result_dir": "/tmp/paramer/simulation/2868" - }, - { - "parameters": { - "W": 19.82, - "L": 17.98 - }, - "id": 2869, - "result_dir": "/tmp/paramer/simulation/2869" - }, - { - "parameters": { - "W": 19.82, - "L": 18.88 - }, - "id": 2870, - "result_dir": "/tmp/paramer/simulation/2870" - }, - { - "parameters": { - "W": 19.82, - "L": 19.82 - }, - "id": 2871, - "result_dir": "/tmp/paramer/simulation/2871" - }, - { - "parameters": { - "W": 19.82, - "L": 20.81 - }, - "id": 2872, - "result_dir": "/tmp/paramer/simulation/2872" - }, - { - "parameters": { - "W": 19.82, - "L": 21.85 - }, - "id": 2873, - "result_dir": "/tmp/paramer/simulation/2873" - }, - { - "parameters": { - "W": 19.82, - "L": 22.94 - }, - "id": 2874, - "result_dir": "/tmp/paramer/simulation/2874" - }, - { - "parameters": { - "W": 19.82, - "L": 24.09 - }, - "id": 2875, - "result_dir": "/tmp/paramer/simulation/2875" - }, - { - "parameters": { - "W": 19.82, - "L": 25.29 - }, - "id": 2876, - "result_dir": "/tmp/paramer/simulation/2876" - }, - { - "parameters": { - "W": 19.82, - "L": 26.55 - }, - "id": 2877, - "result_dir": "/tmp/paramer/simulation/2877" - }, - { - "parameters": { - "W": 19.82, - "L": 27.88 - }, - "id": 2878, - "result_dir": "/tmp/paramer/simulation/2878" - }, - { - "parameters": { - "W": 19.82, - "L": 29.27 - }, - "id": 2879, - "result_dir": "/tmp/paramer/simulation/2879" - }, - { - "parameters": { - "W": 19.82, - "L": 30.73 - }, - "id": 2880, - "result_dir": "/tmp/paramer/simulation/2880" - }, - { - "parameters": { - "W": 19.82, - "L": 32.27 - }, - "id": 2881, - "result_dir": "/tmp/paramer/simulation/2881" - }, - { - "parameters": { - "W": 19.82, - "L": 33.88 - }, - "id": 2882, - "result_dir": "/tmp/paramer/simulation/2882" - }, - { - "parameters": { - "W": 19.82, - "L": 35.57 - }, - "id": 2883, - "result_dir": "/tmp/paramer/simulation/2883" - }, - { - "parameters": { - "W": 19.82, - "L": 37.35 - }, - "id": 2884, - "result_dir": "/tmp/paramer/simulation/2884" - }, - { - "parameters": { - "W": 19.82, - "L": 39.22 - }, - "id": 2885, - "result_dir": "/tmp/paramer/simulation/2885" - }, - { - "parameters": { - "W": 19.82, - "L": 41.18 - }, - "id": 2886, - "result_dir": "/tmp/paramer/simulation/2886" - }, - { - "parameters": { - "W": 19.82, - "L": 43.24 - }, - "id": 2887, - "result_dir": "/tmp/paramer/simulation/2887" - }, - { - "parameters": { - "W": 19.82, - "L": 45.4 - }, - "id": 2888, - "result_dir": "/tmp/paramer/simulation/2888" - }, - { - "parameters": { - "W": 19.82, - "L": 47.67 - }, - "id": 2889, - "result_dir": "/tmp/paramer/simulation/2889" - }, - { - "parameters": { - "W": 19.82, - "L": 50.05 - }, - "id": 2890, - "result_dir": "/tmp/paramer/simulation/2890" - }, - { - "parameters": { - "W": 19.82, - "L": 52.55 - }, - "id": 2891, - "result_dir": "/tmp/paramer/simulation/2891" - }, - { - "parameters": { - "W": 19.82, - "L": 55.18 - }, - "id": 2892, - "result_dir": "/tmp/paramer/simulation/2892" - }, - { - "parameters": { - "W": 19.82, - "L": 57.94 - }, - "id": 2893, - "result_dir": "/tmp/paramer/simulation/2893" - }, - { - "parameters": { - "W": 19.82, - "L": 60.84 - }, - "id": 2894, - "result_dir": "/tmp/paramer/simulation/2894" - }, - { - "parameters": { - "W": 19.82, - "L": 63.88 - }, - "id": 2895, - "result_dir": "/tmp/paramer/simulation/2895" - }, - { - "parameters": { - "W": 19.82, - "L": 67.07 - }, - "id": 2896, - "result_dir": "/tmp/paramer/simulation/2896" - }, - { - "parameters": { - "W": 19.82, - "L": 70.42 - }, - "id": 2897, - "result_dir": "/tmp/paramer/simulation/2897" - }, - { - "parameters": { - "W": 19.82, - "L": 73.94 - }, - "id": 2898, - "result_dir": "/tmp/paramer/simulation/2898" - }, - { - "parameters": { - "W": 19.82, - "L": 77.64 - }, - "id": 2899, - "result_dir": "/tmp/paramer/simulation/2899" - }, - { - "parameters": { - "W": 19.82, - "L": 81.52 - }, - "id": 2900, - "result_dir": "/tmp/paramer/simulation/2900" - }, - { - "parameters": { - "W": 19.82, - "L": 85.6 - }, - "id": 2901, - "result_dir": "/tmp/paramer/simulation/2901" - }, - { - "parameters": { - "W": 19.82, - "L": 89.88 - }, - "id": 2902, - "result_dir": "/tmp/paramer/simulation/2902" - }, - { - "parameters": { - "W": 19.82, - "L": 94.37 - }, - "id": 2903, - "result_dir": "/tmp/paramer/simulation/2903" - }, - { - "parameters": { - "W": 19.82, - "L": 99.09 - }, - "id": 2904, - "result_dir": "/tmp/paramer/simulation/2904" - }, - { - "parameters": { - "W": 20.81, - "L": 15.52 - }, - "id": 2914, - "result_dir": "/tmp/paramer/simulation/2914" - }, - { - "parameters": { - "W": 20.81, - "L": 16.3 - }, - "id": 2915, - "result_dir": "/tmp/paramer/simulation/2915" - }, - { - "parameters": { - "W": 20.81, - "L": 17.12 - }, - "id": 2916, - "result_dir": "/tmp/paramer/simulation/2916" - }, - { - "parameters": { - "W": 20.81, - "L": 17.98 - }, - "id": 2917, - "result_dir": "/tmp/paramer/simulation/2917" - }, - { - "parameters": { - "W": 20.81, - "L": 18.88 - }, - "id": 2918, - "result_dir": "/tmp/paramer/simulation/2918" - }, - { - "parameters": { - "W": 20.81, - "L": 19.82 - }, - "id": 2919, - "result_dir": "/tmp/paramer/simulation/2919" - }, - { - "parameters": { - "W": 20.81, - "L": 20.81 - }, - "id": 2920, - "result_dir": "/tmp/paramer/simulation/2920" - }, - { - "parameters": { - "W": 20.81, - "L": 21.85 - }, - "id": 2921, - "result_dir": "/tmp/paramer/simulation/2921" - }, - { - "parameters": { - "W": 20.81, - "L": 22.94 - }, - "id": 2922, - "result_dir": "/tmp/paramer/simulation/2922" - }, - { - "parameters": { - "W": 20.81, - "L": 24.09 - }, - "id": 2923, - "result_dir": "/tmp/paramer/simulation/2923" - }, - { - "parameters": { - "W": 20.81, - "L": 25.29 - }, - "id": 2924, - "result_dir": "/tmp/paramer/simulation/2924" - }, - { - "parameters": { - "W": 20.81, - "L": 26.55 - }, - "id": 2925, - "result_dir": "/tmp/paramer/simulation/2925" - }, - { - "parameters": { - "W": 20.81, - "L": 27.88 - }, - "id": 2926, - "result_dir": "/tmp/paramer/simulation/2926" - }, - { - "parameters": { - "W": 20.81, - "L": 29.27 - }, - "id": 2927, - "result_dir": "/tmp/paramer/simulation/2927" - }, - { - "parameters": { - "W": 20.81, - "L": 30.73 - }, - "id": 2928, - "result_dir": "/tmp/paramer/simulation/2928" - }, - { - "parameters": { - "W": 20.81, - "L": 32.27 - }, - "id": 2929, - "result_dir": "/tmp/paramer/simulation/2929" - }, - { - "parameters": { - "W": 20.81, - "L": 33.88 - }, - "id": 2930, - "result_dir": "/tmp/paramer/simulation/2930" - }, - { - "parameters": { - "W": 20.81, - "L": 35.57 - }, - "id": 2931, - "result_dir": "/tmp/paramer/simulation/2931" - }, - { - "parameters": { - "W": 20.81, - "L": 37.35 - }, - "id": 2932, - "result_dir": "/tmp/paramer/simulation/2932" - }, - { - "parameters": { - "W": 20.81, - "L": 39.22 - }, - "id": 2933, - "result_dir": "/tmp/paramer/simulation/2933" - }, - { - "parameters": { - "W": 20.81, - "L": 41.18 - }, - "id": 2934, - "result_dir": "/tmp/paramer/simulation/2934" - }, - { - "parameters": { - "W": 20.81, - "L": 43.24 - }, - "id": 2935, - "result_dir": "/tmp/paramer/simulation/2935" - }, - { - "parameters": { - "W": 20.81, - "L": 45.4 - }, - "id": 2936, - "result_dir": "/tmp/paramer/simulation/2936" - }, - { - "parameters": { - "W": 20.81, - "L": 47.67 - }, - "id": 2937, - "result_dir": "/tmp/paramer/simulation/2937" - }, - { - "parameters": { - "W": 20.81, - "L": 50.05 - }, - "id": 2938, - "result_dir": "/tmp/paramer/simulation/2938" - }, - { - "parameters": { - "W": 20.81, - "L": 52.55 - }, - "id": 2939, - "result_dir": "/tmp/paramer/simulation/2939" - }, - { - "parameters": { - "W": 20.81, - "L": 55.18 - }, - "id": 2940, - "result_dir": "/tmp/paramer/simulation/2940" - }, - { - "parameters": { - "W": 20.81, - "L": 57.94 - }, - "id": 2941, - "result_dir": "/tmp/paramer/simulation/2941" - }, - { - "parameters": { - "W": 20.81, - "L": 60.84 - }, - "id": 2942, - "result_dir": "/tmp/paramer/simulation/2942" - }, - { - "parameters": { - "W": 20.81, - "L": 63.88 - }, - "id": 2943, - "result_dir": "/tmp/paramer/simulation/2943" - }, - { - "parameters": { - "W": 20.81, - "L": 67.07 - }, - "id": 2944, - "result_dir": "/tmp/paramer/simulation/2944" - }, - { - "parameters": { - "W": 20.81, - "L": 70.42 - }, - "id": 2945, - "result_dir": "/tmp/paramer/simulation/2945" - }, - { - "parameters": { - "W": 20.81, - "L": 73.94 - }, - "id": 2946, - "result_dir": "/tmp/paramer/simulation/2946" - }, - { - "parameters": { - "W": 20.81, - "L": 77.64 - }, - "id": 2947, - "result_dir": "/tmp/paramer/simulation/2947" - }, - { - "parameters": { - "W": 20.81, - "L": 81.52 - }, - "id": 2948, - "result_dir": "/tmp/paramer/simulation/2948" - }, - { - "parameters": { - "W": 20.81, - "L": 85.6 - }, - "id": 2949, - "result_dir": "/tmp/paramer/simulation/2949" - }, - { - "parameters": { - "W": 20.81, - "L": 89.88 - }, - "id": 2950, - "result_dir": "/tmp/paramer/simulation/2950" - }, - { - "parameters": { - "W": 20.81, - "L": 94.37 - }, - "id": 2951, - "result_dir": "/tmp/paramer/simulation/2951" - }, - { - "parameters": { - "W": 20.81, - "L": 99.09 - }, - "id": 2952, - "result_dir": "/tmp/paramer/simulation/2952" - }, - { - "parameters": { - "W": 21.85, - "L": 15.52 - }, - "id": 2962, - "result_dir": "/tmp/paramer/simulation/2962" - }, - { - "parameters": { - "W": 21.85, - "L": 16.3 - }, - "id": 2963, - "result_dir": "/tmp/paramer/simulation/2963" - }, - { - "parameters": { - "W": 21.85, - "L": 17.12 - }, - "id": 2964, - "result_dir": "/tmp/paramer/simulation/2964" - }, - { - "parameters": { - "W": 21.85, - "L": 17.98 - }, - "id": 2965, - "result_dir": "/tmp/paramer/simulation/2965" - }, - { - "parameters": { - "W": 21.85, - "L": 18.88 - }, - "id": 2966, - "result_dir": "/tmp/paramer/simulation/2966" - }, - { - "parameters": { - "W": 21.85, - "L": 19.82 - }, - "id": 2967, - "result_dir": "/tmp/paramer/simulation/2967" - }, - { - "parameters": { - "W": 21.85, - "L": 20.81 - }, - "id": 2968, - "result_dir": "/tmp/paramer/simulation/2968" - }, - { - "parameters": { - "W": 21.85, - "L": 21.85 - }, - "id": 2969, - "result_dir": "/tmp/paramer/simulation/2969" - }, - { - "parameters": { - "W": 21.85, - "L": 22.94 - }, - "id": 2970, - "result_dir": "/tmp/paramer/simulation/2970" - }, - { - "parameters": { - "W": 21.85, - "L": 24.09 - }, - "id": 2971, - "result_dir": "/tmp/paramer/simulation/2971" - }, - { - "parameters": { - "W": 21.85, - "L": 25.29 - }, - "id": 2972, - "result_dir": "/tmp/paramer/simulation/2972" - }, - { - "parameters": { - "W": 21.85, - "L": 26.55 - }, - "id": 2973, - "result_dir": "/tmp/paramer/simulation/2973" - }, - { - "parameters": { - "W": 21.85, - "L": 27.88 - }, - "id": 2974, - "result_dir": "/tmp/paramer/simulation/2974" - }, - { - "parameters": { - "W": 21.85, - "L": 29.27 - }, - "id": 2975, - "result_dir": "/tmp/paramer/simulation/2975" - }, - { - "parameters": { - "W": 21.85, - "L": 30.73 - }, - "id": 2976, - "result_dir": "/tmp/paramer/simulation/2976" - }, - { - "parameters": { - "W": 21.85, - "L": 32.27 - }, - "id": 2977, - "result_dir": "/tmp/paramer/simulation/2977" - }, - { - "parameters": { - "W": 21.85, - "L": 33.88 - }, - "id": 2978, - "result_dir": "/tmp/paramer/simulation/2978" - }, - { - "parameters": { - "W": 21.85, - "L": 35.57 - }, - "id": 2979, - "result_dir": "/tmp/paramer/simulation/2979" - }, - { - "parameters": { - "W": 21.85, - "L": 37.35 - }, - "id": 2980, - "result_dir": "/tmp/paramer/simulation/2980" - }, - { - "parameters": { - "W": 21.85, - "L": 39.22 - }, - "id": 2981, - "result_dir": "/tmp/paramer/simulation/2981" - }, - { - "parameters": { - "W": 21.85, - "L": 41.18 - }, - "id": 2982, - "result_dir": "/tmp/paramer/simulation/2982" - }, - { - "parameters": { - "W": 21.85, - "L": 43.24 - }, - "id": 2983, - "result_dir": "/tmp/paramer/simulation/2983" - }, - { - "parameters": { - "W": 21.85, - "L": 45.4 - }, - "id": 2984, - "result_dir": "/tmp/paramer/simulation/2984" - }, - { - "parameters": { - "W": 21.85, - "L": 47.67 - }, - "id": 2985, - "result_dir": "/tmp/paramer/simulation/2985" - }, - { - "parameters": { - "W": 21.85, - "L": 50.05 - }, - "id": 2986, - "result_dir": "/tmp/paramer/simulation/2986" - }, - { - "parameters": { - "W": 21.85, - "L": 52.55 - }, - "id": 2987, - "result_dir": "/tmp/paramer/simulation/2987" - }, - { - "parameters": { - "W": 21.85, - "L": 55.18 - }, - "id": 2988, - "result_dir": "/tmp/paramer/simulation/2988" - }, - { - "parameters": { - "W": 21.85, - "L": 57.94 - }, - "id": 2989, - "result_dir": "/tmp/paramer/simulation/2989" - }, - { - "parameters": { - "W": 21.85, - "L": 60.84 - }, - "id": 2990, - "result_dir": "/tmp/paramer/simulation/2990" - }, - { - "parameters": { - "W": 21.85, - "L": 63.88 - }, - "id": 2991, - "result_dir": "/tmp/paramer/simulation/2991" - }, - { - "parameters": { - "W": 21.85, - "L": 67.07 - }, - "id": 2992, - "result_dir": "/tmp/paramer/simulation/2992" - }, - { - "parameters": { - "W": 21.85, - "L": 70.42 - }, - "id": 2993, - "result_dir": "/tmp/paramer/simulation/2993" - }, - { - "parameters": { - "W": 21.85, - "L": 73.94 - }, - "id": 2994, - "result_dir": "/tmp/paramer/simulation/2994" - }, - { - "parameters": { - "W": 21.85, - "L": 77.64 - }, - "id": 2995, - "result_dir": "/tmp/paramer/simulation/2995" - }, - { - "parameters": { - "W": 21.85, - "L": 81.52 - }, - "id": 2996, - "result_dir": "/tmp/paramer/simulation/2996" - }, - { - "parameters": { - "W": 21.85, - "L": 85.6 - }, - "id": 2997, - "result_dir": "/tmp/paramer/simulation/2997" - }, - { - "parameters": { - "W": 21.85, - "L": 89.88 - }, - "id": 2998, - "result_dir": "/tmp/paramer/simulation/2998" - }, - { - "parameters": { - "W": 21.85, - "L": 94.37 - }, - "id": 2999, - "result_dir": "/tmp/paramer/simulation/2999" - }, - { - "parameters": { - "W": 21.85, - "L": 99.09 - }, - "id": 3000, - "result_dir": "/tmp/paramer/simulation/3000" - }, - { - "parameters": { - "W": 22.94, - "L": 15.52 - }, - "id": 3010, - "result_dir": "/tmp/paramer/simulation/3010" - }, - { - "parameters": { - "W": 22.94, - "L": 16.3 - }, - "id": 3011, - "result_dir": "/tmp/paramer/simulation/3011" - }, - { - "parameters": { - "W": 22.94, - "L": 17.12 - }, - "id": 3012, - "result_dir": "/tmp/paramer/simulation/3012" - }, - { - "parameters": { - "W": 22.94, - "L": 17.98 - }, - "id": 3013, - "result_dir": "/tmp/paramer/simulation/3013" - }, - { - "parameters": { - "W": 22.94, - "L": 18.88 - }, - "id": 3014, - "result_dir": "/tmp/paramer/simulation/3014" - }, - { - "parameters": { - "W": 22.94, - "L": 19.82 - }, - "id": 3015, - "result_dir": "/tmp/paramer/simulation/3015" - }, - { - "parameters": { - "W": 22.94, - "L": 20.81 - }, - "id": 3016, - "result_dir": "/tmp/paramer/simulation/3016" - }, - { - "parameters": { - "W": 22.94, - "L": 21.85 - }, - "id": 3017, - "result_dir": "/tmp/paramer/simulation/3017" - }, - { - "parameters": { - "W": 22.94, - "L": 22.94 - }, - "id": 3018, - "result_dir": "/tmp/paramer/simulation/3018" - }, - { - "parameters": { - "W": 22.94, - "L": 24.09 - }, - "id": 3019, - "result_dir": "/tmp/paramer/simulation/3019" - }, - { - "parameters": { - "W": 22.94, - "L": 25.29 - }, - "id": 3020, - "result_dir": "/tmp/paramer/simulation/3020" - }, - { - "parameters": { - "W": 22.94, - "L": 26.55 - }, - "id": 3021, - "result_dir": "/tmp/paramer/simulation/3021" - }, - { - "parameters": { - "W": 22.94, - "L": 27.88 - }, - "id": 3022, - "result_dir": "/tmp/paramer/simulation/3022" - }, - { - "parameters": { - "W": 22.94, - "L": 29.27 - }, - "id": 3023, - "result_dir": "/tmp/paramer/simulation/3023" - }, - { - "parameters": { - "W": 22.94, - "L": 30.73 - }, - "id": 3024, - "result_dir": "/tmp/paramer/simulation/3024" - }, - { - "parameters": { - "W": 22.94, - "L": 32.27 - }, - "id": 3025, - "result_dir": "/tmp/paramer/simulation/3025" - }, - { - "parameters": { - "W": 22.94, - "L": 33.88 - }, - "id": 3026, - "result_dir": "/tmp/paramer/simulation/3026" - }, - { - "parameters": { - "W": 22.94, - "L": 35.57 - }, - "id": 3027, - "result_dir": "/tmp/paramer/simulation/3027" - }, - { - "parameters": { - "W": 22.94, - "L": 37.35 - }, - "id": 3028, - "result_dir": "/tmp/paramer/simulation/3028" - }, - { - "parameters": { - "W": 22.94, - "L": 39.22 - }, - "id": 3029, - "result_dir": "/tmp/paramer/simulation/3029" - }, - { - "parameters": { - "W": 22.94, - "L": 41.18 - }, - "id": 3030, - "result_dir": "/tmp/paramer/simulation/3030" - }, - { - "parameters": { - "W": 22.94, - "L": 43.24 - }, - "id": 3031, - "result_dir": "/tmp/paramer/simulation/3031" - }, - { - "parameters": { - "W": 22.94, - "L": 45.4 - }, - "id": 3032, - "result_dir": "/tmp/paramer/simulation/3032" - }, - { - "parameters": { - "W": 22.94, - "L": 47.67 - }, - "id": 3033, - "result_dir": "/tmp/paramer/simulation/3033" - }, - { - "parameters": { - "W": 22.94, - "L": 50.05 - }, - "id": 3034, - "result_dir": "/tmp/paramer/simulation/3034" - }, - { - "parameters": { - "W": 22.94, - "L": 52.55 - }, - "id": 3035, - "result_dir": "/tmp/paramer/simulation/3035" - }, - { - "parameters": { - "W": 22.94, - "L": 55.18 - }, - "id": 3036, - "result_dir": "/tmp/paramer/simulation/3036" - }, - { - "parameters": { - "W": 22.94, - "L": 57.94 - }, - "id": 3037, - "result_dir": "/tmp/paramer/simulation/3037" - }, - { - "parameters": { - "W": 22.94, - "L": 60.84 - }, - "id": 3038, - "result_dir": "/tmp/paramer/simulation/3038" - }, - { - "parameters": { - "W": 22.94, - "L": 63.88 - }, - "id": 3039, - "result_dir": "/tmp/paramer/simulation/3039" - }, - { - "parameters": { - "W": 22.94, - "L": 67.07 - }, - "id": 3040, - "result_dir": "/tmp/paramer/simulation/3040" - }, - { - "parameters": { - "W": 22.94, - "L": 70.42 - }, - "id": 3041, - "result_dir": "/tmp/paramer/simulation/3041" - }, - { - "parameters": { - "W": 22.94, - "L": 73.94 - }, - "id": 3042, - "result_dir": "/tmp/paramer/simulation/3042" - }, - { - "parameters": { - "W": 22.94, - "L": 77.64 - }, - "id": 3043, - "result_dir": "/tmp/paramer/simulation/3043" - }, - { - "parameters": { - "W": 22.94, - "L": 81.52 - }, - "id": 3044, - "result_dir": "/tmp/paramer/simulation/3044" - }, - { - "parameters": { - "W": 22.94, - "L": 85.6 - }, - "id": 3045, - "result_dir": "/tmp/paramer/simulation/3045" - }, - { - "parameters": { - "W": 22.94, - "L": 89.88 - }, - "id": 3046, - "result_dir": "/tmp/paramer/simulation/3046" - }, - { - "parameters": { - "W": 22.94, - "L": 94.37 - }, - "id": 3047, - "result_dir": "/tmp/paramer/simulation/3047" - }, - { - "parameters": { - "W": 22.94, - "L": 99.09 - }, - "id": 3048, - "result_dir": "/tmp/paramer/simulation/3048" - }, - { - "parameters": { - "W": 24.09, - "L": 15.52 - }, - "id": 3058, - "result_dir": "/tmp/paramer/simulation/3058" - }, - { - "parameters": { - "W": 24.09, - "L": 16.3 - }, - "id": 3059, - "result_dir": "/tmp/paramer/simulation/3059" - }, - { - "parameters": { - "W": 24.09, - "L": 17.12 - }, - "id": 3060, - "result_dir": "/tmp/paramer/simulation/3060" - }, - { - "parameters": { - "W": 24.09, - "L": 17.98 - }, - "id": 3061, - "result_dir": "/tmp/paramer/simulation/3061" - }, - { - "parameters": { - "W": 24.09, - "L": 18.88 - }, - "id": 3062, - "result_dir": "/tmp/paramer/simulation/3062" - }, - { - "parameters": { - "W": 24.09, - "L": 19.82 - }, - "id": 3063, - "result_dir": "/tmp/paramer/simulation/3063" - }, - { - "parameters": { - "W": 24.09, - "L": 20.81 - }, - "id": 3064, - "result_dir": "/tmp/paramer/simulation/3064" - }, - { - "parameters": { - "W": 24.09, - "L": 21.85 - }, - "id": 3065, - "result_dir": "/tmp/paramer/simulation/3065" - }, - { - "parameters": { - "W": 24.09, - "L": 22.94 - }, - "id": 3066, - "result_dir": "/tmp/paramer/simulation/3066" - }, - { - "parameters": { - "W": 24.09, - "L": 24.09 - }, - "id": 3067, - "result_dir": "/tmp/paramer/simulation/3067" - }, - { - "parameters": { - "W": 24.09, - "L": 25.29 - }, - "id": 3068, - "result_dir": "/tmp/paramer/simulation/3068" - }, - { - "parameters": { - "W": 24.09, - "L": 26.55 - }, - "id": 3069, - "result_dir": "/tmp/paramer/simulation/3069" - }, - { - "parameters": { - "W": 24.09, - "L": 27.88 - }, - "id": 3070, - "result_dir": "/tmp/paramer/simulation/3070" - }, - { - "parameters": { - "W": 24.09, - "L": 29.27 - }, - "id": 3071, - "result_dir": "/tmp/paramer/simulation/3071" - }, - { - "parameters": { - "W": 24.09, - "L": 30.73 - }, - "id": 3072, - "result_dir": "/tmp/paramer/simulation/3072" - }, - { - "parameters": { - "W": 24.09, - "L": 32.27 - }, - "id": 3073, - "result_dir": "/tmp/paramer/simulation/3073" - }, - { - "parameters": { - "W": 24.09, - "L": 33.88 - }, - "id": 3074, - "result_dir": "/tmp/paramer/simulation/3074" - }, - { - "parameters": { - "W": 24.09, - "L": 35.57 - }, - "id": 3075, - "result_dir": "/tmp/paramer/simulation/3075" - }, - { - "parameters": { - "W": 24.09, - "L": 37.35 - }, - "id": 3076, - "result_dir": "/tmp/paramer/simulation/3076" - }, - { - "parameters": { - "W": 24.09, - "L": 39.22 - }, - "id": 3077, - "result_dir": "/tmp/paramer/simulation/3077" - }, - { - "parameters": { - "W": 24.09, - "L": 41.18 - }, - "id": 3078, - "result_dir": "/tmp/paramer/simulation/3078" - }, - { - "parameters": { - "W": 24.09, - "L": 43.24 - }, - "id": 3079, - "result_dir": "/tmp/paramer/simulation/3079" - }, - { - "parameters": { - "W": 24.09, - "L": 45.4 - }, - "id": 3080, - "result_dir": "/tmp/paramer/simulation/3080" - }, - { - "parameters": { - "W": 24.09, - "L": 47.67 - }, - "id": 3081, - "result_dir": "/tmp/paramer/simulation/3081" - }, - { - "parameters": { - "W": 24.09, - "L": 50.05 - }, - "id": 3082, - "result_dir": "/tmp/paramer/simulation/3082" - }, - { - "parameters": { - "W": 24.09, - "L": 52.55 - }, - "id": 3083, - "result_dir": "/tmp/paramer/simulation/3083" - }, - { - "parameters": { - "W": 24.09, - "L": 55.18 - }, - "id": 3084, - "result_dir": "/tmp/paramer/simulation/3084" - }, - { - "parameters": { - "W": 24.09, - "L": 57.94 - }, - "id": 3085, - "result_dir": "/tmp/paramer/simulation/3085" - }, - { - "parameters": { - "W": 24.09, - "L": 60.84 - }, - "id": 3086, - "result_dir": "/tmp/paramer/simulation/3086" - }, - { - "parameters": { - "W": 24.09, - "L": 63.88 - }, - "id": 3087, - "result_dir": "/tmp/paramer/simulation/3087" - }, - { - "parameters": { - "W": 24.09, - "L": 67.07 - }, - "id": 3088, - "result_dir": "/tmp/paramer/simulation/3088" - }, - { - "parameters": { - "W": 24.09, - "L": 70.42 - }, - "id": 3089, - "result_dir": "/tmp/paramer/simulation/3089" - }, - { - "parameters": { - "W": 24.09, - "L": 73.94 - }, - "id": 3090, - "result_dir": "/tmp/paramer/simulation/3090" - }, - { - "parameters": { - "W": 24.09, - "L": 77.64 - }, - "id": 3091, - "result_dir": "/tmp/paramer/simulation/3091" - }, - { - "parameters": { - "W": 24.09, - "L": 81.52 - }, - "id": 3092, - "result_dir": "/tmp/paramer/simulation/3092" - }, - { - "parameters": { - "W": 24.09, - "L": 85.6 - }, - "id": 3093, - "result_dir": "/tmp/paramer/simulation/3093" - }, - { - "parameters": { - "W": 24.09, - "L": 89.88 - }, - "id": 3094, - "result_dir": "/tmp/paramer/simulation/3094" - }, - { - "parameters": { - "W": 24.09, - "L": 94.37 - }, - "id": 3095, - "result_dir": "/tmp/paramer/simulation/3095" - }, - { - "parameters": { - "W": 24.09, - "L": 99.09 - }, - "id": 3096, - "result_dir": "/tmp/paramer/simulation/3096" - }, - { - "parameters": { - "W": 25.29, - "L": 15.52 - }, - "id": 3106, - "result_dir": "/tmp/paramer/simulation/3106" - }, - { - "parameters": { - "W": 25.29, - "L": 16.3 - }, - "id": 3107, - "result_dir": "/tmp/paramer/simulation/3107" - }, - { - "parameters": { - "W": 25.29, - "L": 17.12 - }, - "id": 3108, - "result_dir": "/tmp/paramer/simulation/3108" - }, - { - "parameters": { - "W": 25.29, - "L": 17.98 - }, - "id": 3109, - "result_dir": "/tmp/paramer/simulation/3109" - }, - { - "parameters": { - "W": 25.29, - "L": 18.88 - }, - "id": 3110, - "result_dir": "/tmp/paramer/simulation/3110" - }, - { - "parameters": { - "W": 25.29, - "L": 19.82 - }, - "id": 3111, - "result_dir": "/tmp/paramer/simulation/3111" - }, - { - "parameters": { - "W": 25.29, - "L": 20.81 - }, - "id": 3112, - "result_dir": "/tmp/paramer/simulation/3112" - }, - { - "parameters": { - "W": 25.29, - "L": 21.85 - }, - "id": 3113, - "result_dir": "/tmp/paramer/simulation/3113" - }, - { - "parameters": { - "W": 25.29, - "L": 22.94 - }, - "id": 3114, - "result_dir": "/tmp/paramer/simulation/3114" - }, - { - "parameters": { - "W": 25.29, - "L": 24.09 - }, - "id": 3115, - "result_dir": "/tmp/paramer/simulation/3115" - }, - { - "parameters": { - "W": 25.29, - "L": 25.29 - }, - "id": 3116, - "result_dir": "/tmp/paramer/simulation/3116" - }, - { - "parameters": { - "W": 25.29, - "L": 26.55 - }, - "id": 3117, - "result_dir": "/tmp/paramer/simulation/3117" - }, - { - "parameters": { - "W": 25.29, - "L": 27.88 - }, - "id": 3118, - "result_dir": "/tmp/paramer/simulation/3118" - }, - { - "parameters": { - "W": 25.29, - "L": 29.27 - }, - "id": 3119, - "result_dir": "/tmp/paramer/simulation/3119" - }, - { - "parameters": { - "W": 25.29, - "L": 30.73 - }, - "id": 3120, - "result_dir": "/tmp/paramer/simulation/3120" - }, - { - "parameters": { - "W": 25.29, - "L": 32.27 - }, - "id": 3121, - "result_dir": "/tmp/paramer/simulation/3121" - }, - { - "parameters": { - "W": 25.29, - "L": 33.88 - }, - "id": 3122, - "result_dir": "/tmp/paramer/simulation/3122" - }, - { - "parameters": { - "W": 25.29, - "L": 35.57 - }, - "id": 3123, - "result_dir": "/tmp/paramer/simulation/3123" - }, - { - "parameters": { - "W": 25.29, - "L": 37.35 - }, - "id": 3124, - "result_dir": "/tmp/paramer/simulation/3124" - }, - { - "parameters": { - "W": 25.29, - "L": 39.22 - }, - "id": 3125, - "result_dir": "/tmp/paramer/simulation/3125" - }, - { - "parameters": { - "W": 25.29, - "L": 41.18 - }, - "id": 3126, - "result_dir": "/tmp/paramer/simulation/3126" - }, - { - "parameters": { - "W": 25.29, - "L": 43.24 - }, - "id": 3127, - "result_dir": "/tmp/paramer/simulation/3127" - }, - { - "parameters": { - "W": 25.29, - "L": 45.4 - }, - "id": 3128, - "result_dir": "/tmp/paramer/simulation/3128" - }, - { - "parameters": { - "W": 25.29, - "L": 47.67 - }, - "id": 3129, - "result_dir": "/tmp/paramer/simulation/3129" - }, - { - "parameters": { - "W": 25.29, - "L": 50.05 - }, - "id": 3130, - "result_dir": "/tmp/paramer/simulation/3130" - }, - { - "parameters": { - "W": 25.29, - "L": 52.55 - }, - "id": 3131, - "result_dir": "/tmp/paramer/simulation/3131" - }, - { - "parameters": { - "W": 25.29, - "L": 55.18 - }, - "id": 3132, - "result_dir": "/tmp/paramer/simulation/3132" - }, - { - "parameters": { - "W": 25.29, - "L": 57.94 - }, - "id": 3133, - "result_dir": "/tmp/paramer/simulation/3133" - }, - { - "parameters": { - "W": 25.29, - "L": 60.84 - }, - "id": 3134, - "result_dir": "/tmp/paramer/simulation/3134" - }, - { - "parameters": { - "W": 25.29, - "L": 63.88 - }, - "id": 3135, - "result_dir": "/tmp/paramer/simulation/3135" - }, - { - "parameters": { - "W": 25.29, - "L": 67.07 - }, - "id": 3136, - "result_dir": "/tmp/paramer/simulation/3136" - }, - { - "parameters": { - "W": 25.29, - "L": 70.42 - }, - "id": 3137, - "result_dir": "/tmp/paramer/simulation/3137" - }, - { - "parameters": { - "W": 25.29, - "L": 73.94 - }, - "id": 3138, - "result_dir": "/tmp/paramer/simulation/3138" - }, - { - "parameters": { - "W": 25.29, - "L": 77.64 - }, - "id": 3139, - "result_dir": "/tmp/paramer/simulation/3139" - }, - { - "parameters": { - "W": 25.29, - "L": 81.52 - }, - "id": 3140, - "result_dir": "/tmp/paramer/simulation/3140" - }, - { - "parameters": { - "W": 25.29, - "L": 85.6 - }, - "id": 3141, - "result_dir": "/tmp/paramer/simulation/3141" - }, - { - "parameters": { - "W": 25.29, - "L": 89.88 - }, - "id": 3142, - "result_dir": "/tmp/paramer/simulation/3142" - }, - { - "parameters": { - "W": 25.29, - "L": 94.37 - }, - "id": 3143, - "result_dir": "/tmp/paramer/simulation/3143" - }, - { - "parameters": { - "W": 25.29, - "L": 99.09 - }, - "id": 3144, - "result_dir": "/tmp/paramer/simulation/3144" - }, - { - "parameters": { - "W": 26.55, - "L": 15.52 - }, - "id": 3154, - "result_dir": "/tmp/paramer/simulation/3154" - }, - { - "parameters": { - "W": 26.55, - "L": 16.3 - }, - "id": 3155, - "result_dir": "/tmp/paramer/simulation/3155" - }, - { - "parameters": { - "W": 26.55, - "L": 17.12 - }, - "id": 3156, - "result_dir": "/tmp/paramer/simulation/3156" - }, - { - "parameters": { - "W": 26.55, - "L": 17.98 - }, - "id": 3157, - "result_dir": "/tmp/paramer/simulation/3157" - }, - { - "parameters": { - "W": 26.55, - "L": 18.88 - }, - "id": 3158, - "result_dir": "/tmp/paramer/simulation/3158" - }, - { - "parameters": { - "W": 26.55, - "L": 19.82 - }, - "id": 3159, - "result_dir": "/tmp/paramer/simulation/3159" - }, - { - "parameters": { - "W": 26.55, - "L": 20.81 - }, - "id": 3160, - "result_dir": "/tmp/paramer/simulation/3160" - }, - { - "parameters": { - "W": 26.55, - "L": 21.85 - }, - "id": 3161, - "result_dir": "/tmp/paramer/simulation/3161" - }, - { - "parameters": { - "W": 26.55, - "L": 22.94 - }, - "id": 3162, - "result_dir": "/tmp/paramer/simulation/3162" - }, - { - "parameters": { - "W": 26.55, - "L": 24.09 - }, - "id": 3163, - "result_dir": "/tmp/paramer/simulation/3163" - }, - { - "parameters": { - "W": 26.55, - "L": 25.29 - }, - "id": 3164, - "result_dir": "/tmp/paramer/simulation/3164" - }, - { - "parameters": { - "W": 26.55, - "L": 26.55 - }, - "id": 3165, - "result_dir": "/tmp/paramer/simulation/3165" - }, - { - "parameters": { - "W": 26.55, - "L": 27.88 - }, - "id": 3166, - "result_dir": "/tmp/paramer/simulation/3166" - }, - { - "parameters": { - "W": 26.55, - "L": 29.27 - }, - "id": 3167, - "result_dir": "/tmp/paramer/simulation/3167" - }, - { - "parameters": { - "W": 26.55, - "L": 30.73 - }, - "id": 3168, - "result_dir": "/tmp/paramer/simulation/3168" - }, - { - "parameters": { - "W": 26.55, - "L": 32.27 - }, - "id": 3169, - "result_dir": "/tmp/paramer/simulation/3169" - }, - { - "parameters": { - "W": 26.55, - "L": 33.88 - }, - "id": 3170, - "result_dir": "/tmp/paramer/simulation/3170" - }, - { - "parameters": { - "W": 26.55, - "L": 35.57 - }, - "id": 3171, - "result_dir": "/tmp/paramer/simulation/3171" - }, - { - "parameters": { - "W": 26.55, - "L": 37.35 - }, - "id": 3172, - "result_dir": "/tmp/paramer/simulation/3172" - }, - { - "parameters": { - "W": 26.55, - "L": 39.22 - }, - "id": 3173, - "result_dir": "/tmp/paramer/simulation/3173" - }, - { - "parameters": { - "W": 26.55, - "L": 41.18 - }, - "id": 3174, - "result_dir": "/tmp/paramer/simulation/3174" - }, - { - "parameters": { - "W": 26.55, - "L": 43.24 - }, - "id": 3175, - "result_dir": "/tmp/paramer/simulation/3175" - }, - { - "parameters": { - "W": 26.55, - "L": 45.4 - }, - "id": 3176, - "result_dir": "/tmp/paramer/simulation/3176" - }, - { - "parameters": { - "W": 26.55, - "L": 47.67 - }, - "id": 3177, - "result_dir": "/tmp/paramer/simulation/3177" - }, - { - "parameters": { - "W": 26.55, - "L": 50.05 - }, - "id": 3178, - "result_dir": "/tmp/paramer/simulation/3178" - }, - { - "parameters": { - "W": 26.55, - "L": 52.55 - }, - "id": 3179, - "result_dir": "/tmp/paramer/simulation/3179" - }, - { - "parameters": { - "W": 26.55, - "L": 55.18 - }, - "id": 3180, - "result_dir": "/tmp/paramer/simulation/3180" - }, - { - "parameters": { - "W": 26.55, - "L": 57.94 - }, - "id": 3181, - "result_dir": "/tmp/paramer/simulation/3181" - }, - { - "parameters": { - "W": 26.55, - "L": 60.84 - }, - "id": 3182, - "result_dir": "/tmp/paramer/simulation/3182" - }, - { - "parameters": { - "W": 26.55, - "L": 63.88 - }, - "id": 3183, - "result_dir": "/tmp/paramer/simulation/3183" - }, - { - "parameters": { - "W": 26.55, - "L": 67.07 - }, - "id": 3184, - "result_dir": "/tmp/paramer/simulation/3184" - }, - { - "parameters": { - "W": 26.55, - "L": 70.42 - }, - "id": 3185, - "result_dir": "/tmp/paramer/simulation/3185" - }, - { - "parameters": { - "W": 26.55, - "L": 73.94 - }, - "id": 3186, - "result_dir": "/tmp/paramer/simulation/3186" - }, - { - "parameters": { - "W": 26.55, - "L": 77.64 - }, - "id": 3187, - "result_dir": "/tmp/paramer/simulation/3187" - }, - { - "parameters": { - "W": 26.55, - "L": 81.52 - }, - "id": 3188, - "result_dir": "/tmp/paramer/simulation/3188" - }, - { - "parameters": { - "W": 26.55, - "L": 85.6 - }, - "id": 3189, - "result_dir": "/tmp/paramer/simulation/3189" - }, - { - "parameters": { - "W": 26.55, - "L": 89.88 - }, - "id": 3190, - "result_dir": "/tmp/paramer/simulation/3190" - }, - { - "parameters": { - "W": 26.55, - "L": 94.37 - }, - "id": 3191, - "result_dir": "/tmp/paramer/simulation/3191" - }, - { - "parameters": { - "W": 26.55, - "L": 99.09 - }, - "id": 3192, - "result_dir": "/tmp/paramer/simulation/3192" - }, - { - "parameters": { - "W": 27.88, - "L": 15.52 - }, - "id": 3202, - "result_dir": "/tmp/paramer/simulation/3202" - }, - { - "parameters": { - "W": 27.88, - "L": 16.3 - }, - "id": 3203, - "result_dir": "/tmp/paramer/simulation/3203" - }, - { - "parameters": { - "W": 27.88, - "L": 17.12 - }, - "id": 3204, - "result_dir": "/tmp/paramer/simulation/3204" - }, - { - "parameters": { - "W": 27.88, - "L": 17.98 - }, - "id": 3205, - "result_dir": "/tmp/paramer/simulation/3205" - }, - { - "parameters": { - "W": 27.88, - "L": 18.88 - }, - "id": 3206, - "result_dir": "/tmp/paramer/simulation/3206" - }, - { - "parameters": { - "W": 27.88, - "L": 19.82 - }, - "id": 3207, - "result_dir": "/tmp/paramer/simulation/3207" - }, - { - "parameters": { - "W": 27.88, - "L": 20.81 - }, - "id": 3208, - "result_dir": "/tmp/paramer/simulation/3208" - }, - { - "parameters": { - "W": 27.88, - "L": 21.85 - }, - "id": 3209, - "result_dir": "/tmp/paramer/simulation/3209" - }, - { - "parameters": { - "W": 27.88, - "L": 22.94 - }, - "id": 3210, - "result_dir": "/tmp/paramer/simulation/3210" - }, - { - "parameters": { - "W": 27.88, - "L": 24.09 - }, - "id": 3211, - "result_dir": "/tmp/paramer/simulation/3211" - }, - { - "parameters": { - "W": 27.88, - "L": 25.29 - }, - "id": 3212, - "result_dir": "/tmp/paramer/simulation/3212" - }, - { - "parameters": { - "W": 27.88, - "L": 26.55 - }, - "id": 3213, - "result_dir": "/tmp/paramer/simulation/3213" - }, - { - "parameters": { - "W": 27.88, - "L": 27.88 - }, - "id": 3214, - "result_dir": "/tmp/paramer/simulation/3214" - }, - { - "parameters": { - "W": 27.88, - "L": 29.27 - }, - "id": 3215, - "result_dir": "/tmp/paramer/simulation/3215" - }, - { - "parameters": { - "W": 27.88, - "L": 30.73 - }, - "id": 3216, - "result_dir": "/tmp/paramer/simulation/3216" - }, - { - "parameters": { - "W": 27.88, - "L": 32.27 - }, - "id": 3217, - "result_dir": "/tmp/paramer/simulation/3217" - }, - { - "parameters": { - "W": 27.88, - "L": 33.88 - }, - "id": 3218, - "result_dir": "/tmp/paramer/simulation/3218" - }, - { - "parameters": { - "W": 27.88, - "L": 35.57 - }, - "id": 3219, - "result_dir": "/tmp/paramer/simulation/3219" - }, - { - "parameters": { - "W": 27.88, - "L": 37.35 - }, - "id": 3220, - "result_dir": "/tmp/paramer/simulation/3220" - }, - { - "parameters": { - "W": 27.88, - "L": 39.22 - }, - "id": 3221, - "result_dir": "/tmp/paramer/simulation/3221" - }, - { - "parameters": { - "W": 27.88, - "L": 41.18 - }, - "id": 3222, - "result_dir": "/tmp/paramer/simulation/3222" - }, - { - "parameters": { - "W": 27.88, - "L": 43.24 - }, - "id": 3223, - "result_dir": "/tmp/paramer/simulation/3223" - }, - { - "parameters": { - "W": 27.88, - "L": 45.4 - }, - "id": 3224, - "result_dir": "/tmp/paramer/simulation/3224" - }, - { - "parameters": { - "W": 27.88, - "L": 47.67 - }, - "id": 3225, - "result_dir": "/tmp/paramer/simulation/3225" - }, - { - "parameters": { - "W": 27.88, - "L": 50.05 - }, - "id": 3226, - "result_dir": "/tmp/paramer/simulation/3226" - }, - { - "parameters": { - "W": 27.88, - "L": 52.55 - }, - "id": 3227, - "result_dir": "/tmp/paramer/simulation/3227" - }, - { - "parameters": { - "W": 27.88, - "L": 55.18 - }, - "id": 3228, - "result_dir": "/tmp/paramer/simulation/3228" - }, - { - "parameters": { - "W": 27.88, - "L": 57.94 - }, - "id": 3229, - "result_dir": "/tmp/paramer/simulation/3229" - }, - { - "parameters": { - "W": 27.88, - "L": 60.84 - }, - "id": 3230, - "result_dir": "/tmp/paramer/simulation/3230" - }, - { - "parameters": { - "W": 27.88, - "L": 63.88 - }, - "id": 3231, - "result_dir": "/tmp/paramer/simulation/3231" - }, - { - "parameters": { - "W": 27.88, - "L": 67.07 - }, - "id": 3232, - "result_dir": "/tmp/paramer/simulation/3232" - }, - { - "parameters": { - "W": 27.88, - "L": 70.42 - }, - "id": 3233, - "result_dir": "/tmp/paramer/simulation/3233" - }, - { - "parameters": { - "W": 27.88, - "L": 73.94 - }, - "id": 3234, - "result_dir": "/tmp/paramer/simulation/3234" - }, - { - "parameters": { - "W": 27.88, - "L": 77.64 - }, - "id": 3235, - "result_dir": "/tmp/paramer/simulation/3235" - }, - { - "parameters": { - "W": 27.88, - "L": 81.52 - }, - "id": 3236, - "result_dir": "/tmp/paramer/simulation/3236" - }, - { - "parameters": { - "W": 27.88, - "L": 85.6 - }, - "id": 3237, - "result_dir": "/tmp/paramer/simulation/3237" - }, - { - "parameters": { - "W": 27.88, - "L": 89.88 - }, - "id": 3238, - "result_dir": "/tmp/paramer/simulation/3238" - }, - { - "parameters": { - "W": 27.88, - "L": 94.37 - }, - "id": 3239, - "result_dir": "/tmp/paramer/simulation/3239" - }, - { - "parameters": { - "W": 27.88, - "L": 99.09 - }, - "id": 3240, - "result_dir": "/tmp/paramer/simulation/3240" - }, - { - "parameters": { - "W": 29.27, - "L": 15.52 - }, - "id": 3250, - "result_dir": "/tmp/paramer/simulation/3250" - }, - { - "parameters": { - "W": 29.27, - "L": 16.3 - }, - "id": 3251, - "result_dir": "/tmp/paramer/simulation/3251" - }, - { - "parameters": { - "W": 29.27, - "L": 17.12 - }, - "id": 3252, - "result_dir": "/tmp/paramer/simulation/3252" - }, - { - "parameters": { - "W": 29.27, - "L": 17.98 - }, - "id": 3253, - "result_dir": "/tmp/paramer/simulation/3253" - }, - { - "parameters": { - "W": 29.27, - "L": 18.88 - }, - "id": 3254, - "result_dir": "/tmp/paramer/simulation/3254" - }, - { - "parameters": { - "W": 29.27, - "L": 19.82 - }, - "id": 3255, - "result_dir": "/tmp/paramer/simulation/3255" - }, - { - "parameters": { - "W": 29.27, - "L": 20.81 - }, - "id": 3256, - "result_dir": "/tmp/paramer/simulation/3256" - }, - { - "parameters": { - "W": 29.27, - "L": 21.85 - }, - "id": 3257, - "result_dir": "/tmp/paramer/simulation/3257" - }, - { - "parameters": { - "W": 29.27, - "L": 22.94 - }, - "id": 3258, - "result_dir": "/tmp/paramer/simulation/3258" - }, - { - "parameters": { - "W": 29.27, - "L": 24.09 - }, - "id": 3259, - "result_dir": "/tmp/paramer/simulation/3259" - }, - { - "parameters": { - "W": 29.27, - "L": 25.29 - }, - "id": 3260, - "result_dir": "/tmp/paramer/simulation/3260" - }, - { - "parameters": { - "W": 29.27, - "L": 26.55 - }, - "id": 3261, - "result_dir": "/tmp/paramer/simulation/3261" - }, - { - "parameters": { - "W": 29.27, - "L": 27.88 - }, - "id": 3262, - "result_dir": "/tmp/paramer/simulation/3262" - }, - { - "parameters": { - "W": 29.27, - "L": 29.27 - }, - "id": 3263, - "result_dir": "/tmp/paramer/simulation/3263" - }, - { - "parameters": { - "W": 29.27, - "L": 30.73 - }, - "id": 3264, - "result_dir": "/tmp/paramer/simulation/3264" - }, - { - "parameters": { - "W": 29.27, - "L": 32.27 - }, - "id": 3265, - "result_dir": "/tmp/paramer/simulation/3265" - }, - { - "parameters": { - "W": 29.27, - "L": 33.88 - }, - "id": 3266, - "result_dir": "/tmp/paramer/simulation/3266" - }, - { - "parameters": { - "W": 29.27, - "L": 35.57 - }, - "id": 3267, - "result_dir": "/tmp/paramer/simulation/3267" - }, - { - "parameters": { - "W": 29.27, - "L": 37.35 - }, - "id": 3268, - "result_dir": "/tmp/paramer/simulation/3268" - }, - { - "parameters": { - "W": 29.27, - "L": 39.22 - }, - "id": 3269, - "result_dir": "/tmp/paramer/simulation/3269" - }, - { - "parameters": { - "W": 29.27, - "L": 41.18 - }, - "id": 3270, - "result_dir": "/tmp/paramer/simulation/3270" - }, - { - "parameters": { - "W": 29.27, - "L": 43.24 - }, - "id": 3271, - "result_dir": "/tmp/paramer/simulation/3271" - }, - { - "parameters": { - "W": 29.27, - "L": 45.4 - }, - "id": 3272, - "result_dir": "/tmp/paramer/simulation/3272" - }, - { - "parameters": { - "W": 29.27, - "L": 47.67 - }, - "id": 3273, - "result_dir": "/tmp/paramer/simulation/3273" - }, - { - "parameters": { - "W": 29.27, - "L": 50.05 - }, - "id": 3274, - "result_dir": "/tmp/paramer/simulation/3274" - }, - { - "parameters": { - "W": 29.27, - "L": 52.55 - }, - "id": 3275, - "result_dir": "/tmp/paramer/simulation/3275" - }, - { - "parameters": { - "W": 29.27, - "L": 55.18 - }, - "id": 3276, - "result_dir": "/tmp/paramer/simulation/3276" - }, - { - "parameters": { - "W": 29.27, - "L": 57.94 - }, - "id": 3277, - "result_dir": "/tmp/paramer/simulation/3277" - }, - { - "parameters": { - "W": 29.27, - "L": 60.84 - }, - "id": 3278, - "result_dir": "/tmp/paramer/simulation/3278" - }, - { - "parameters": { - "W": 29.27, - "L": 63.88 - }, - "id": 3279, - "result_dir": "/tmp/paramer/simulation/3279" - }, - { - "parameters": { - "W": 29.27, - "L": 67.07 - }, - "id": 3280, - "result_dir": "/tmp/paramer/simulation/3280" - }, - { - "parameters": { - "W": 29.27, - "L": 70.42 - }, - "id": 3281, - "result_dir": "/tmp/paramer/simulation/3281" - }, - { - "parameters": { - "W": 29.27, - "L": 73.94 - }, - "id": 3282, - "result_dir": "/tmp/paramer/simulation/3282" - }, - { - "parameters": { - "W": 29.27, - "L": 77.64 - }, - "id": 3283, - "result_dir": "/tmp/paramer/simulation/3283" - }, - { - "parameters": { - "W": 29.27, - "L": 81.52 - }, - "id": 3284, - "result_dir": "/tmp/paramer/simulation/3284" - }, - { - "parameters": { - "W": 29.27, - "L": 85.6 - }, - "id": 3285, - "result_dir": "/tmp/paramer/simulation/3285" - }, - { - "parameters": { - "W": 29.27, - "L": 89.88 - }, - "id": 3286, - "result_dir": "/tmp/paramer/simulation/3286" - }, - { - "parameters": { - "W": 29.27, - "L": 94.37 - }, - "id": 3287, - "result_dir": "/tmp/paramer/simulation/3287" - }, - { - "parameters": { - "W": 29.27, - "L": 99.09 - }, - "id": 3288, - "result_dir": "/tmp/paramer/simulation/3288" - }, - { - "parameters": { - "W": 30.73, - "L": 15.52 - }, - "id": 3298, - "result_dir": "/tmp/paramer/simulation/3298" - }, - { - "parameters": { - "W": 30.73, - "L": 16.3 - }, - "id": 3299, - "result_dir": "/tmp/paramer/simulation/3299" - }, - { - "parameters": { - "W": 30.73, - "L": 17.12 - }, - "id": 3300, - "result_dir": "/tmp/paramer/simulation/3300" - }, - { - "parameters": { - "W": 30.73, - "L": 17.98 - }, - "id": 3301, - "result_dir": "/tmp/paramer/simulation/3301" - }, - { - "parameters": { - "W": 30.73, - "L": 18.88 - }, - "id": 3302, - "result_dir": "/tmp/paramer/simulation/3302" - }, - { - "parameters": { - "W": 30.73, - "L": 19.82 - }, - "id": 3303, - "result_dir": "/tmp/paramer/simulation/3303" - }, - { - "parameters": { - "W": 30.73, - "L": 20.81 - }, - "id": 3304, - "result_dir": "/tmp/paramer/simulation/3304" - }, - { - "parameters": { - "W": 30.73, - "L": 21.85 - }, - "id": 3305, - "result_dir": "/tmp/paramer/simulation/3305" - }, - { - "parameters": { - "W": 30.73, - "L": 22.94 - }, - "id": 3306, - "result_dir": "/tmp/paramer/simulation/3306" - }, - { - "parameters": { - "W": 30.73, - "L": 24.09 - }, - "id": 3307, - "result_dir": "/tmp/paramer/simulation/3307" - }, - { - "parameters": { - "W": 30.73, - "L": 25.29 - }, - "id": 3308, - "result_dir": "/tmp/paramer/simulation/3308" - }, - { - "parameters": { - "W": 30.73, - "L": 26.55 - }, - "id": 3309, - "result_dir": "/tmp/paramer/simulation/3309" - }, - { - "parameters": { - "W": 30.73, - "L": 27.88 - }, - "id": 3310, - "result_dir": "/tmp/paramer/simulation/3310" - }, - { - "parameters": { - "W": 30.73, - "L": 29.27 - }, - "id": 3311, - "result_dir": "/tmp/paramer/simulation/3311" - }, - { - "parameters": { - "W": 30.73, - "L": 30.73 - }, - "id": 3312, - "result_dir": "/tmp/paramer/simulation/3312" - }, - { - "parameters": { - "W": 30.73, - "L": 32.27 - }, - "id": 3313, - "result_dir": "/tmp/paramer/simulation/3313" - }, - { - "parameters": { - "W": 30.73, - "L": 33.88 - }, - "id": 3314, - "result_dir": "/tmp/paramer/simulation/3314" - }, - { - "parameters": { - "W": 30.73, - "L": 35.57 - }, - "id": 3315, - "result_dir": "/tmp/paramer/simulation/3315" - }, - { - "parameters": { - "W": 30.73, - "L": 37.35 - }, - "id": 3316, - "result_dir": "/tmp/paramer/simulation/3316" - }, - { - "parameters": { - "W": 30.73, - "L": 39.22 - }, - "id": 3317, - "result_dir": "/tmp/paramer/simulation/3317" - }, - { - "parameters": { - "W": 30.73, - "L": 41.18 - }, - "id": 3318, - "result_dir": "/tmp/paramer/simulation/3318" - }, - { - "parameters": { - "W": 30.73, - "L": 43.24 - }, - "id": 3319, - "result_dir": "/tmp/paramer/simulation/3319" - }, - { - "parameters": { - "W": 30.73, - "L": 45.4 - }, - "id": 3320, - "result_dir": "/tmp/paramer/simulation/3320" - }, - { - "parameters": { - "W": 30.73, - "L": 47.67 - }, - "id": 3321, - "result_dir": "/tmp/paramer/simulation/3321" - }, - { - "parameters": { - "W": 30.73, - "L": 50.05 - }, - "id": 3322, - "result_dir": "/tmp/paramer/simulation/3322" - }, - { - "parameters": { - "W": 30.73, - "L": 52.55 - }, - "id": 3323, - "result_dir": "/tmp/paramer/simulation/3323" - }, - { - "parameters": { - "W": 30.73, - "L": 55.18 - }, - "id": 3324, - "result_dir": "/tmp/paramer/simulation/3324" - }, - { - "parameters": { - "W": 30.73, - "L": 57.94 - }, - "id": 3325, - "result_dir": "/tmp/paramer/simulation/3325" - }, - { - "parameters": { - "W": 30.73, - "L": 60.84 - }, - "id": 3326, - "result_dir": "/tmp/paramer/simulation/3326" - }, - { - "parameters": { - "W": 30.73, - "L": 63.88 - }, - "id": 3327, - "result_dir": "/tmp/paramer/simulation/3327" - }, - { - "parameters": { - "W": 30.73, - "L": 67.07 - }, - "id": 3328, - "result_dir": "/tmp/paramer/simulation/3328" - }, - { - "parameters": { - "W": 30.73, - "L": 70.42 - }, - "id": 3329, - "result_dir": "/tmp/paramer/simulation/3329" - }, - { - "parameters": { - "W": 30.73, - "L": 73.94 - }, - "id": 3330, - "result_dir": "/tmp/paramer/simulation/3330" - }, - { - "parameters": { - "W": 30.73, - "L": 77.64 - }, - "id": 3331, - "result_dir": "/tmp/paramer/simulation/3331" - }, - { - "parameters": { - "W": 30.73, - "L": 81.52 - }, - "id": 3332, - "result_dir": "/tmp/paramer/simulation/3332" - }, - { - "parameters": { - "W": 30.73, - "L": 85.6 - }, - "id": 3333, - "result_dir": "/tmp/paramer/simulation/3333" - }, - { - "parameters": { - "W": 30.73, - "L": 89.88 - }, - "id": 3334, - "result_dir": "/tmp/paramer/simulation/3334" - }, - { - "parameters": { - "W": 30.73, - "L": 94.37 - }, - "id": 3335, - "result_dir": "/tmp/paramer/simulation/3335" - }, - { - "parameters": { - "W": 30.73, - "L": 99.09 - }, - "id": 3336, - "result_dir": "/tmp/paramer/simulation/3336" - }, - { - "parameters": { - "W": 32.27, - "L": 15.52 - }, - "id": 3346, - "result_dir": "/tmp/paramer/simulation/3346" - }, - { - "parameters": { - "W": 32.27, - "L": 16.3 - }, - "id": 3347, - "result_dir": "/tmp/paramer/simulation/3347" - }, - { - "parameters": { - "W": 32.27, - "L": 17.12 - }, - "id": 3348, - "result_dir": "/tmp/paramer/simulation/3348" - }, - { - "parameters": { - "W": 32.27, - "L": 17.98 - }, - "id": 3349, - "result_dir": "/tmp/paramer/simulation/3349" - }, - { - "parameters": { - "W": 32.27, - "L": 18.88 - }, - "id": 3350, - "result_dir": "/tmp/paramer/simulation/3350" - }, - { - "parameters": { - "W": 32.27, - "L": 19.82 - }, - "id": 3351, - "result_dir": "/tmp/paramer/simulation/3351" - }, - { - "parameters": { - "W": 32.27, - "L": 20.81 - }, - "id": 3352, - "result_dir": "/tmp/paramer/simulation/3352" - }, - { - "parameters": { - "W": 32.27, - "L": 21.85 - }, - "id": 3353, - "result_dir": "/tmp/paramer/simulation/3353" - }, - { - "parameters": { - "W": 32.27, - "L": 22.94 - }, - "id": 3354, - "result_dir": "/tmp/paramer/simulation/3354" - }, - { - "parameters": { - "W": 32.27, - "L": 24.09 - }, - "id": 3355, - "result_dir": "/tmp/paramer/simulation/3355" - }, - { - "parameters": { - "W": 32.27, - "L": 25.29 - }, - "id": 3356, - "result_dir": "/tmp/paramer/simulation/3356" - }, - { - "parameters": { - "W": 32.27, - "L": 26.55 - }, - "id": 3357, - "result_dir": "/tmp/paramer/simulation/3357" - }, - { - "parameters": { - "W": 32.27, - "L": 27.88 - }, - "id": 3358, - "result_dir": "/tmp/paramer/simulation/3358" - }, - { - "parameters": { - "W": 32.27, - "L": 29.27 - }, - "id": 3359, - "result_dir": "/tmp/paramer/simulation/3359" - }, - { - "parameters": { - "W": 32.27, - "L": 30.73 - }, - "id": 3360, - "result_dir": "/tmp/paramer/simulation/3360" - }, - { - "parameters": { - "W": 32.27, - "L": 32.27 - }, - "id": 3361, - "result_dir": "/tmp/paramer/simulation/3361" - }, - { - "parameters": { - "W": 32.27, - "L": 33.88 - }, - "id": 3362, - "result_dir": "/tmp/paramer/simulation/3362" - }, - { - "parameters": { - "W": 32.27, - "L": 35.57 - }, - "id": 3363, - "result_dir": "/tmp/paramer/simulation/3363" - }, - { - "parameters": { - "W": 32.27, - "L": 37.35 - }, - "id": 3364, - "result_dir": "/tmp/paramer/simulation/3364" - }, - { - "parameters": { - "W": 32.27, - "L": 39.22 - }, - "id": 3365, - "result_dir": "/tmp/paramer/simulation/3365" - }, - { - "parameters": { - "W": 32.27, - "L": 41.18 - }, - "id": 3366, - "result_dir": "/tmp/paramer/simulation/3366" - }, - { - "parameters": { - "W": 32.27, - "L": 43.24 - }, - "id": 3367, - "result_dir": "/tmp/paramer/simulation/3367" - }, - { - "parameters": { - "W": 32.27, - "L": 45.4 - }, - "id": 3368, - "result_dir": "/tmp/paramer/simulation/3368" - }, - { - "parameters": { - "W": 32.27, - "L": 47.67 - }, - "id": 3369, - "result_dir": "/tmp/paramer/simulation/3369" - }, - { - "parameters": { - "W": 32.27, - "L": 50.05 - }, - "id": 3370, - "result_dir": "/tmp/paramer/simulation/3370" - }, - { - "parameters": { - "W": 32.27, - "L": 52.55 - }, - "id": 3371, - "result_dir": "/tmp/paramer/simulation/3371" - }, - { - "parameters": { - "W": 32.27, - "L": 55.18 - }, - "id": 3372, - "result_dir": "/tmp/paramer/simulation/3372" - }, - { - "parameters": { - "W": 32.27, - "L": 57.94 - }, - "id": 3373, - "result_dir": "/tmp/paramer/simulation/3373" - }, - { - "parameters": { - "W": 32.27, - "L": 60.84 - }, - "id": 3374, - "result_dir": "/tmp/paramer/simulation/3374" - }, - { - "parameters": { - "W": 32.27, - "L": 63.88 - }, - "id": 3375, - "result_dir": "/tmp/paramer/simulation/3375" - }, - { - "parameters": { - "W": 32.27, - "L": 67.07 - }, - "id": 3376, - "result_dir": "/tmp/paramer/simulation/3376" - }, - { - "parameters": { - "W": 32.27, - "L": 70.42 - }, - "id": 3377, - "result_dir": "/tmp/paramer/simulation/3377" - }, - { - "parameters": { - "W": 32.27, - "L": 73.94 - }, - "id": 3378, - "result_dir": "/tmp/paramer/simulation/3378" - }, - { - "parameters": { - "W": 32.27, - "L": 77.64 - }, - "id": 3379, - "result_dir": "/tmp/paramer/simulation/3379" - }, - { - "parameters": { - "W": 32.27, - "L": 81.52 - }, - "id": 3380, - "result_dir": "/tmp/paramer/simulation/3380" - }, - { - "parameters": { - "W": 32.27, - "L": 85.6 - }, - "id": 3381, - "result_dir": "/tmp/paramer/simulation/3381" - }, - { - "parameters": { - "W": 32.27, - "L": 89.88 - }, - "id": 3382, - "result_dir": "/tmp/paramer/simulation/3382" - }, - { - "parameters": { - "W": 32.27, - "L": 94.37 - }, - "id": 3383, - "result_dir": "/tmp/paramer/simulation/3383" - }, - { - "parameters": { - "W": 32.27, - "L": 99.09 - }, - "id": 3384, - "result_dir": "/tmp/paramer/simulation/3384" - }, - { - "parameters": { - "W": 33.88, - "L": 15.52 - }, - "id": 3394, - "result_dir": "/tmp/paramer/simulation/3394" - }, - { - "parameters": { - "W": 33.88, - "L": 16.3 - }, - "id": 3395, - "result_dir": "/tmp/paramer/simulation/3395" - }, - { - "parameters": { - "W": 33.88, - "L": 17.12 - }, - "id": 3396, - "result_dir": "/tmp/paramer/simulation/3396" - }, - { - "parameters": { - "W": 33.88, - "L": 17.98 - }, - "id": 3397, - "result_dir": "/tmp/paramer/simulation/3397" - }, - { - "parameters": { - "W": 33.88, - "L": 18.88 - }, - "id": 3398, - "result_dir": "/tmp/paramer/simulation/3398" - }, - { - "parameters": { - "W": 33.88, - "L": 19.82 - }, - "id": 3399, - "result_dir": "/tmp/paramer/simulation/3399" - }, - { - "parameters": { - "W": 33.88, - "L": 20.81 - }, - "id": 3400, - "result_dir": "/tmp/paramer/simulation/3400" - }, - { - "parameters": { - "W": 33.88, - "L": 21.85 - }, - "id": 3401, - "result_dir": "/tmp/paramer/simulation/3401" - }, - { - "parameters": { - "W": 33.88, - "L": 22.94 - }, - "id": 3402, - "result_dir": "/tmp/paramer/simulation/3402" - }, - { - "parameters": { - "W": 33.88, - "L": 24.09 - }, - "id": 3403, - "result_dir": "/tmp/paramer/simulation/3403" - }, - { - "parameters": { - "W": 33.88, - "L": 25.29 - }, - "id": 3404, - "result_dir": "/tmp/paramer/simulation/3404" - }, - { - "parameters": { - "W": 33.88, - "L": 26.55 - }, - "id": 3405, - "result_dir": "/tmp/paramer/simulation/3405" - }, - { - "parameters": { - "W": 33.88, - "L": 27.88 - }, - "id": 3406, - "result_dir": "/tmp/paramer/simulation/3406" - }, - { - "parameters": { - "W": 33.88, - "L": 29.27 - }, - "id": 3407, - "result_dir": "/tmp/paramer/simulation/3407" - }, - { - "parameters": { - "W": 33.88, - "L": 30.73 - }, - "id": 3408, - "result_dir": "/tmp/paramer/simulation/3408" - }, - { - "parameters": { - "W": 33.88, - "L": 32.27 - }, - "id": 3409, - "result_dir": "/tmp/paramer/simulation/3409" - }, - { - "parameters": { - "W": 33.88, - "L": 33.88 - }, - "id": 3410, - "result_dir": "/tmp/paramer/simulation/3410" - }, - { - "parameters": { - "W": 33.88, - "L": 35.57 - }, - "id": 3411, - "result_dir": "/tmp/paramer/simulation/3411" - }, - { - "parameters": { - "W": 33.88, - "L": 37.35 - }, - "id": 3412, - "result_dir": "/tmp/paramer/simulation/3412" - }, - { - "parameters": { - "W": 33.88, - "L": 39.22 - }, - "id": 3413, - "result_dir": "/tmp/paramer/simulation/3413" - }, - { - "parameters": { - "W": 33.88, - "L": 41.18 - }, - "id": 3414, - "result_dir": "/tmp/paramer/simulation/3414" - }, - { - "parameters": { - "W": 33.88, - "L": 43.24 - }, - "id": 3415, - "result_dir": "/tmp/paramer/simulation/3415" - }, - { - "parameters": { - "W": 33.88, - "L": 45.4 - }, - "id": 3416, - "result_dir": "/tmp/paramer/simulation/3416" - }, - { - "parameters": { - "W": 33.88, - "L": 47.67 - }, - "id": 3417, - "result_dir": "/tmp/paramer/simulation/3417" - }, - { - "parameters": { - "W": 33.88, - "L": 50.05 - }, - "id": 3418, - "result_dir": "/tmp/paramer/simulation/3418" - }, - { - "parameters": { - "W": 33.88, - "L": 52.55 - }, - "id": 3419, - "result_dir": "/tmp/paramer/simulation/3419" - }, - { - "parameters": { - "W": 33.88, - "L": 55.18 - }, - "id": 3420, - "result_dir": "/tmp/paramer/simulation/3420" - }, - { - "parameters": { - "W": 33.88, - "L": 57.94 - }, - "id": 3421, - "result_dir": "/tmp/paramer/simulation/3421" - }, - { - "parameters": { - "W": 33.88, - "L": 60.84 - }, - "id": 3422, - "result_dir": "/tmp/paramer/simulation/3422" - }, - { - "parameters": { - "W": 33.88, - "L": 63.88 - }, - "id": 3423, - "result_dir": "/tmp/paramer/simulation/3423" - }, - { - "parameters": { - "W": 33.88, - "L": 67.07 - }, - "id": 3424, - "result_dir": "/tmp/paramer/simulation/3424" - }, - { - "parameters": { - "W": 33.88, - "L": 70.42 - }, - "id": 3425, - "result_dir": "/tmp/paramer/simulation/3425" - }, - { - "parameters": { - "W": 33.88, - "L": 73.94 - }, - "id": 3426, - "result_dir": "/tmp/paramer/simulation/3426" - }, - { - "parameters": { - "W": 33.88, - "L": 77.64 - }, - "id": 3427, - "result_dir": "/tmp/paramer/simulation/3427" - }, - { - "parameters": { - "W": 33.88, - "L": 81.52 - }, - "id": 3428, - "result_dir": "/tmp/paramer/simulation/3428" - }, - { - "parameters": { - "W": 33.88, - "L": 85.6 - }, - "id": 3429, - "result_dir": "/tmp/paramer/simulation/3429" - }, - { - "parameters": { - "W": 33.88, - "L": 89.88 - }, - "id": 3430, - "result_dir": "/tmp/paramer/simulation/3430" - }, - { - "parameters": { - "W": 33.88, - "L": 94.37 - }, - "id": 3431, - "result_dir": "/tmp/paramer/simulation/3431" - }, - { - "parameters": { - "W": 33.88, - "L": 99.09 - }, - "id": 3432, - "result_dir": "/tmp/paramer/simulation/3432" - }, - { - "parameters": { - "W": 35.57, - "L": 15.52 - }, - "id": 3442, - "result_dir": "/tmp/paramer/simulation/3442" - }, - { - "parameters": { - "W": 35.57, - "L": 16.3 - }, - "id": 3443, - "result_dir": "/tmp/paramer/simulation/3443" - }, - { - "parameters": { - "W": 35.57, - "L": 17.12 - }, - "id": 3444, - "result_dir": "/tmp/paramer/simulation/3444" - }, - { - "parameters": { - "W": 35.57, - "L": 17.98 - }, - "id": 3445, - "result_dir": "/tmp/paramer/simulation/3445" - }, - { - "parameters": { - "W": 35.57, - "L": 18.88 - }, - "id": 3446, - "result_dir": "/tmp/paramer/simulation/3446" - }, - { - "parameters": { - "W": 35.57, - "L": 19.82 - }, - "id": 3447, - "result_dir": "/tmp/paramer/simulation/3447" - }, - { - "parameters": { - "W": 35.57, - "L": 20.81 - }, - "id": 3448, - "result_dir": "/tmp/paramer/simulation/3448" - }, - { - "parameters": { - "W": 35.57, - "L": 21.85 - }, - "id": 3449, - "result_dir": "/tmp/paramer/simulation/3449" - }, - { - "parameters": { - "W": 35.57, - "L": 22.94 - }, - "id": 3450, - "result_dir": "/tmp/paramer/simulation/3450" - }, - { - "parameters": { - "W": 35.57, - "L": 24.09 - }, - "id": 3451, - "result_dir": "/tmp/paramer/simulation/3451" - }, - { - "parameters": { - "W": 35.57, - "L": 25.29 - }, - "id": 3452, - "result_dir": "/tmp/paramer/simulation/3452" - }, - { - "parameters": { - "W": 35.57, - "L": 26.55 - }, - "id": 3453, - "result_dir": "/tmp/paramer/simulation/3453" - }, - { - "parameters": { - "W": 35.57, - "L": 27.88 - }, - "id": 3454, - "result_dir": "/tmp/paramer/simulation/3454" - }, - { - "parameters": { - "W": 35.57, - "L": 29.27 - }, - "id": 3455, - "result_dir": "/tmp/paramer/simulation/3455" - }, - { - "parameters": { - "W": 35.57, - "L": 30.73 - }, - "id": 3456, - "result_dir": "/tmp/paramer/simulation/3456" - }, - { - "parameters": { - "W": 35.57, - "L": 32.27 - }, - "id": 3457, - "result_dir": "/tmp/paramer/simulation/3457" - }, - { - "parameters": { - "W": 35.57, - "L": 33.88 - }, - "id": 3458, - "result_dir": "/tmp/paramer/simulation/3458" - }, - { - "parameters": { - "W": 35.57, - "L": 35.57 - }, - "id": 3459, - "result_dir": "/tmp/paramer/simulation/3459" - }, - { - "parameters": { - "W": 35.57, - "L": 37.35 - }, - "id": 3460, - "result_dir": "/tmp/paramer/simulation/3460" - }, - { - "parameters": { - "W": 35.57, - "L": 39.22 - }, - "id": 3461, - "result_dir": "/tmp/paramer/simulation/3461" - }, - { - "parameters": { - "W": 35.57, - "L": 41.18 - }, - "id": 3462, - "result_dir": "/tmp/paramer/simulation/3462" - }, - { - "parameters": { - "W": 35.57, - "L": 43.24 - }, - "id": 3463, - "result_dir": "/tmp/paramer/simulation/3463" - }, - { - "parameters": { - "W": 35.57, - "L": 45.4 - }, - "id": 3464, - "result_dir": "/tmp/paramer/simulation/3464" - }, - { - "parameters": { - "W": 35.57, - "L": 47.67 - }, - "id": 3465, - "result_dir": "/tmp/paramer/simulation/3465" - }, - { - "parameters": { - "W": 35.57, - "L": 50.05 - }, - "id": 3466, - "result_dir": "/tmp/paramer/simulation/3466" - }, - { - "parameters": { - "W": 35.57, - "L": 52.55 - }, - "id": 3467, - "result_dir": "/tmp/paramer/simulation/3467" - }, - { - "parameters": { - "W": 35.57, - "L": 55.18 - }, - "id": 3468, - "result_dir": "/tmp/paramer/simulation/3468" - }, - { - "parameters": { - "W": 35.57, - "L": 57.94 - }, - "id": 3469, - "result_dir": "/tmp/paramer/simulation/3469" - }, - { - "parameters": { - "W": 35.57, - "L": 60.84 - }, - "id": 3470, - "result_dir": "/tmp/paramer/simulation/3470" - }, - { - "parameters": { - "W": 35.57, - "L": 63.88 - }, - "id": 3471, - "result_dir": "/tmp/paramer/simulation/3471" - }, - { - "parameters": { - "W": 35.57, - "L": 67.07 - }, - "id": 3472, - "result_dir": "/tmp/paramer/simulation/3472" - }, - { - "parameters": { - "W": 35.57, - "L": 70.42 - }, - "id": 3473, - "result_dir": "/tmp/paramer/simulation/3473" - }, - { - "parameters": { - "W": 35.57, - "L": 73.94 - }, - "id": 3474, - "result_dir": "/tmp/paramer/simulation/3474" - }, - { - "parameters": { - "W": 35.57, - "L": 77.64 - }, - "id": 3475, - "result_dir": "/tmp/paramer/simulation/3475" - }, - { - "parameters": { - "W": 35.57, - "L": 81.52 - }, - "id": 3476, - "result_dir": "/tmp/paramer/simulation/3476" - }, - { - "parameters": { - "W": 35.57, - "L": 85.6 - }, - "id": 3477, - "result_dir": "/tmp/paramer/simulation/3477" - }, - { - "parameters": { - "W": 35.57, - "L": 89.88 - }, - "id": 3478, - "result_dir": "/tmp/paramer/simulation/3478" - }, - { - "parameters": { - "W": 35.57, - "L": 94.37 - }, - "id": 3479, - "result_dir": "/tmp/paramer/simulation/3479" - }, - { - "parameters": { - "W": 35.57, - "L": 99.09 - }, - "id": 3480, - "result_dir": "/tmp/paramer/simulation/3480" - }, - { - "parameters": { - "W": 37.35, - "L": 15.52 - }, - "id": 3490, - "result_dir": "/tmp/paramer/simulation/3490" - }, - { - "parameters": { - "W": 37.35, - "L": 16.3 - }, - "id": 3491, - "result_dir": "/tmp/paramer/simulation/3491" - }, - { - "parameters": { - "W": 37.35, - "L": 17.12 - }, - "id": 3492, - "result_dir": "/tmp/paramer/simulation/3492" - }, - { - "parameters": { - "W": 37.35, - "L": 17.98 - }, - "id": 3493, - "result_dir": "/tmp/paramer/simulation/3493" - }, - { - "parameters": { - "W": 37.35, - "L": 18.88 - }, - "id": 3494, - "result_dir": "/tmp/paramer/simulation/3494" - }, - { - "parameters": { - "W": 37.35, - "L": 19.82 - }, - "id": 3495, - "result_dir": "/tmp/paramer/simulation/3495" - }, - { - "parameters": { - "W": 37.35, - "L": 20.81 - }, - "id": 3496, - "result_dir": "/tmp/paramer/simulation/3496" - }, - { - "parameters": { - "W": 37.35, - "L": 21.85 - }, - "id": 3497, - "result_dir": "/tmp/paramer/simulation/3497" - }, - { - "parameters": { - "W": 37.35, - "L": 22.94 - }, - "id": 3498, - "result_dir": "/tmp/paramer/simulation/3498" - }, - { - "parameters": { - "W": 37.35, - "L": 24.09 - }, - "id": 3499, - "result_dir": "/tmp/paramer/simulation/3499" - }, - { - "parameters": { - "W": 37.35, - "L": 25.29 - }, - "id": 3500, - "result_dir": "/tmp/paramer/simulation/3500" - }, - { - "parameters": { - "W": 37.35, - "L": 26.55 - }, - "id": 3501, - "result_dir": "/tmp/paramer/simulation/3501" - }, - { - "parameters": { - "W": 37.35, - "L": 27.88 - }, - "id": 3502, - "result_dir": "/tmp/paramer/simulation/3502" - }, - { - "parameters": { - "W": 37.35, - "L": 29.27 - }, - "id": 3503, - "result_dir": "/tmp/paramer/simulation/3503" - }, - { - "parameters": { - "W": 37.35, - "L": 30.73 - }, - "id": 3504, - "result_dir": "/tmp/paramer/simulation/3504" - }, - { - "parameters": { - "W": 37.35, - "L": 32.27 - }, - "id": 3505, - "result_dir": "/tmp/paramer/simulation/3505" - }, - { - "parameters": { - "W": 37.35, - "L": 33.88 - }, - "id": 3506, - "result_dir": "/tmp/paramer/simulation/3506" - }, - { - "parameters": { - "W": 37.35, - "L": 35.57 - }, - "id": 3507, - "result_dir": "/tmp/paramer/simulation/3507" - }, - { - "parameters": { - "W": 37.35, - "L": 37.35 - }, - "id": 3508, - "result_dir": "/tmp/paramer/simulation/3508" - }, - { - "parameters": { - "W": 37.35, - "L": 39.22 - }, - "id": 3509, - "result_dir": "/tmp/paramer/simulation/3509" - }, - { - "parameters": { - "W": 37.35, - "L": 41.18 - }, - "id": 3510, - "result_dir": "/tmp/paramer/simulation/3510" - }, - { - "parameters": { - "W": 37.35, - "L": 43.24 - }, - "id": 3511, - "result_dir": "/tmp/paramer/simulation/3511" - }, - { - "parameters": { - "W": 37.35, - "L": 45.4 - }, - "id": 3512, - "result_dir": "/tmp/paramer/simulation/3512" - }, - { - "parameters": { - "W": 37.35, - "L": 47.67 - }, - "id": 3513, - "result_dir": "/tmp/paramer/simulation/3513" - }, - { - "parameters": { - "W": 37.35, - "L": 50.05 - }, - "id": 3514, - "result_dir": "/tmp/paramer/simulation/3514" - }, - { - "parameters": { - "W": 37.35, - "L": 52.55 - }, - "id": 3515, - "result_dir": "/tmp/paramer/simulation/3515" - }, - { - "parameters": { - "W": 37.35, - "L": 55.18 - }, - "id": 3516, - "result_dir": "/tmp/paramer/simulation/3516" - }, - { - "parameters": { - "W": 37.35, - "L": 57.94 - }, - "id": 3517, - "result_dir": "/tmp/paramer/simulation/3517" - }, - { - "parameters": { - "W": 37.35, - "L": 60.84 - }, - "id": 3518, - "result_dir": "/tmp/paramer/simulation/3518" - }, - { - "parameters": { - "W": 37.35, - "L": 63.88 - }, - "id": 3519, - "result_dir": "/tmp/paramer/simulation/3519" - }, - { - "parameters": { - "W": 37.35, - "L": 67.07 - }, - "id": 3520, - "result_dir": "/tmp/paramer/simulation/3520" - }, - { - "parameters": { - "W": 37.35, - "L": 70.42 - }, - "id": 3521, - "result_dir": "/tmp/paramer/simulation/3521" - }, - { - "parameters": { - "W": 37.35, - "L": 73.94 - }, - "id": 3522, - "result_dir": "/tmp/paramer/simulation/3522" - }, - { - "parameters": { - "W": 37.35, - "L": 77.64 - }, - "id": 3523, - "result_dir": "/tmp/paramer/simulation/3523" - }, - { - "parameters": { - "W": 37.35, - "L": 81.52 - }, - "id": 3524, - "result_dir": "/tmp/paramer/simulation/3524" - }, - { - "parameters": { - "W": 37.35, - "L": 85.6 - }, - "id": 3525, - "result_dir": "/tmp/paramer/simulation/3525" - }, - { - "parameters": { - "W": 37.35, - "L": 89.88 - }, - "id": 3526, - "result_dir": "/tmp/paramer/simulation/3526" - }, - { - "parameters": { - "W": 37.35, - "L": 94.37 - }, - "id": 3527, - "result_dir": "/tmp/paramer/simulation/3527" - }, - { - "parameters": { - "W": 37.35, - "L": 99.09 - }, - "id": 3528, - "result_dir": "/tmp/paramer/simulation/3528" - }, - { - "parameters": { - "W": 39.22, - "L": 15.52 - }, - "id": 3538, - "result_dir": "/tmp/paramer/simulation/3538" - }, - { - "parameters": { - "W": 39.22, - "L": 16.3 - }, - "id": 3539, - "result_dir": "/tmp/paramer/simulation/3539" - }, - { - "parameters": { - "W": 39.22, - "L": 17.12 - }, - "id": 3540, - "result_dir": "/tmp/paramer/simulation/3540" - }, - { - "parameters": { - "W": 39.22, - "L": 17.98 - }, - "id": 3541, - "result_dir": "/tmp/paramer/simulation/3541" - }, - { - "parameters": { - "W": 39.22, - "L": 18.88 - }, - "id": 3542, - "result_dir": "/tmp/paramer/simulation/3542" - }, - { - "parameters": { - "W": 39.22, - "L": 19.82 - }, - "id": 3543, - "result_dir": "/tmp/paramer/simulation/3543" - }, - { - "parameters": { - "W": 39.22, - "L": 20.81 - }, - "id": 3544, - "result_dir": "/tmp/paramer/simulation/3544" - }, - { - "parameters": { - "W": 39.22, - "L": 21.85 - }, - "id": 3545, - "result_dir": "/tmp/paramer/simulation/3545" - }, - { - "parameters": { - "W": 39.22, - "L": 22.94 - }, - "id": 3546, - "result_dir": "/tmp/paramer/simulation/3546" - }, - { - "parameters": { - "W": 39.22, - "L": 24.09 - }, - "id": 3547, - "result_dir": "/tmp/paramer/simulation/3547" - }, - { - "parameters": { - "W": 39.22, - "L": 25.29 - }, - "id": 3548, - "result_dir": "/tmp/paramer/simulation/3548" - }, - { - "parameters": { - "W": 39.22, - "L": 26.55 - }, - "id": 3549, - "result_dir": "/tmp/paramer/simulation/3549" - }, - { - "parameters": { - "W": 39.22, - "L": 27.88 - }, - "id": 3550, - "result_dir": "/tmp/paramer/simulation/3550" - }, - { - "parameters": { - "W": 39.22, - "L": 29.27 - }, - "id": 3551, - "result_dir": "/tmp/paramer/simulation/3551" - }, - { - "parameters": { - "W": 39.22, - "L": 30.73 - }, - "id": 3552, - "result_dir": "/tmp/paramer/simulation/3552" - }, - { - "parameters": { - "W": 39.22, - "L": 32.27 - }, - "id": 3553, - "result_dir": "/tmp/paramer/simulation/3553" - }, - { - "parameters": { - "W": 39.22, - "L": 33.88 - }, - "id": 3554, - "result_dir": "/tmp/paramer/simulation/3554" - }, - { - "parameters": { - "W": 39.22, - "L": 35.57 - }, - "id": 3555, - "result_dir": "/tmp/paramer/simulation/3555" - }, - { - "parameters": { - "W": 39.22, - "L": 37.35 - }, - "id": 3556, - "result_dir": "/tmp/paramer/simulation/3556" - }, - { - "parameters": { - "W": 39.22, - "L": 39.22 - }, - "id": 3557, - "result_dir": "/tmp/paramer/simulation/3557" - }, - { - "parameters": { - "W": 39.22, - "L": 41.18 - }, - "id": 3558, - "result_dir": "/tmp/paramer/simulation/3558" - }, - { - "parameters": { - "W": 39.22, - "L": 43.24 - }, - "id": 3559, - "result_dir": "/tmp/paramer/simulation/3559" - }, - { - "parameters": { - "W": 39.22, - "L": 45.4 - }, - "id": 3560, - "result_dir": "/tmp/paramer/simulation/3560" - }, - { - "parameters": { - "W": 39.22, - "L": 47.67 - }, - "id": 3561, - "result_dir": "/tmp/paramer/simulation/3561" - }, - { - "parameters": { - "W": 39.22, - "L": 50.05 - }, - "id": 3562, - "result_dir": "/tmp/paramer/simulation/3562" - }, - { - "parameters": { - "W": 39.22, - "L": 52.55 - }, - "id": 3563, - "result_dir": "/tmp/paramer/simulation/3563" - }, - { - "parameters": { - "W": 39.22, - "L": 55.18 - }, - "id": 3564, - "result_dir": "/tmp/paramer/simulation/3564" - }, - { - "parameters": { - "W": 39.22, - "L": 57.94 - }, - "id": 3565, - "result_dir": "/tmp/paramer/simulation/3565" - }, - { - "parameters": { - "W": 39.22, - "L": 60.84 - }, - "id": 3566, - "result_dir": "/tmp/paramer/simulation/3566" - }, - { - "parameters": { - "W": 39.22, - "L": 63.88 - }, - "id": 3567, - "result_dir": "/tmp/paramer/simulation/3567" - }, - { - "parameters": { - "W": 39.22, - "L": 67.07 - }, - "id": 3568, - "result_dir": "/tmp/paramer/simulation/3568" - }, - { - "parameters": { - "W": 39.22, - "L": 70.42 - }, - "id": 3569, - "result_dir": "/tmp/paramer/simulation/3569" - }, - { - "parameters": { - "W": 39.22, - "L": 73.94 - }, - "id": 3570, - "result_dir": "/tmp/paramer/simulation/3570" - }, - { - "parameters": { - "W": 39.22, - "L": 77.64 - }, - "id": 3571, - "result_dir": "/tmp/paramer/simulation/3571" - }, - { - "parameters": { - "W": 39.22, - "L": 81.52 - }, - "id": 3572, - "result_dir": "/tmp/paramer/simulation/3572" - }, - { - "parameters": { - "W": 39.22, - "L": 85.6 - }, - "id": 3573, - "result_dir": "/tmp/paramer/simulation/3573" - }, - { - "parameters": { - "W": 39.22, - "L": 89.88 - }, - "id": 3574, - "result_dir": "/tmp/paramer/simulation/3574" - }, - { - "parameters": { - "W": 39.22, - "L": 94.37 - }, - "id": 3575, - "result_dir": "/tmp/paramer/simulation/3575" - }, - { - "parameters": { - "W": 39.22, - "L": 99.09 - }, - "id": 3576, - "result_dir": "/tmp/paramer/simulation/3576" - }, - { - "parameters": { - "W": 41.18, - "L": 15.52 - }, - "id": 3586, - "result_dir": "/tmp/paramer/simulation/3586" - }, - { - "parameters": { - "W": 41.18, - "L": 16.3 - }, - "id": 3587, - "result_dir": "/tmp/paramer/simulation/3587" - }, - { - "parameters": { - "W": 41.18, - "L": 17.12 - }, - "id": 3588, - "result_dir": "/tmp/paramer/simulation/3588" - }, - { - "parameters": { - "W": 41.18, - "L": 17.98 - }, - "id": 3589, - "result_dir": "/tmp/paramer/simulation/3589" - }, - { - "parameters": { - "W": 41.18, - "L": 18.88 - }, - "id": 3590, - "result_dir": "/tmp/paramer/simulation/3590" - }, - { - "parameters": { - "W": 41.18, - "L": 19.82 - }, - "id": 3591, - "result_dir": "/tmp/paramer/simulation/3591" - }, - { - "parameters": { - "W": 41.18, - "L": 20.81 - }, - "id": 3592, - "result_dir": "/tmp/paramer/simulation/3592" - }, - { - "parameters": { - "W": 41.18, - "L": 21.85 - }, - "id": 3593, - "result_dir": "/tmp/paramer/simulation/3593" - }, - { - "parameters": { - "W": 41.18, - "L": 22.94 - }, - "id": 3594, - "result_dir": "/tmp/paramer/simulation/3594" - }, - { - "parameters": { - "W": 41.18, - "L": 24.09 - }, - "id": 3595, - "result_dir": "/tmp/paramer/simulation/3595" - }, - { - "parameters": { - "W": 41.18, - "L": 25.29 - }, - "id": 3596, - "result_dir": "/tmp/paramer/simulation/3596" - }, - { - "parameters": { - "W": 41.18, - "L": 26.55 - }, - "id": 3597, - "result_dir": "/tmp/paramer/simulation/3597" - }, - { - "parameters": { - "W": 41.18, - "L": 27.88 - }, - "id": 3598, - "result_dir": "/tmp/paramer/simulation/3598" - }, - { - "parameters": { - "W": 41.18, - "L": 29.27 - }, - "id": 3599, - "result_dir": "/tmp/paramer/simulation/3599" - }, - { - "parameters": { - "W": 41.18, - "L": 30.73 - }, - "id": 3600, - "result_dir": "/tmp/paramer/simulation/3600" - }, - { - "parameters": { - "W": 41.18, - "L": 32.27 - }, - "id": 3601, - "result_dir": "/tmp/paramer/simulation/3601" - }, - { - "parameters": { - "W": 41.18, - "L": 33.88 - }, - "id": 3602, - "result_dir": "/tmp/paramer/simulation/3602" - }, - { - "parameters": { - "W": 41.18, - "L": 35.57 - }, - "id": 3603, - "result_dir": "/tmp/paramer/simulation/3603" - }, - { - "parameters": { - "W": 41.18, - "L": 37.35 - }, - "id": 3604, - "result_dir": "/tmp/paramer/simulation/3604" - }, - { - "parameters": { - "W": 41.18, - "L": 39.22 - }, - "id": 3605, - "result_dir": "/tmp/paramer/simulation/3605" - }, - { - "parameters": { - "W": 41.18, - "L": 41.18 - }, - "id": 3606, - "result_dir": "/tmp/paramer/simulation/3606" - }, - { - "parameters": { - "W": 41.18, - "L": 43.24 - }, - "id": 3607, - "result_dir": "/tmp/paramer/simulation/3607" - }, - { - "parameters": { - "W": 41.18, - "L": 45.4 - }, - "id": 3608, - "result_dir": "/tmp/paramer/simulation/3608" - }, - { - "parameters": { - "W": 41.18, - "L": 47.67 - }, - "id": 3609, - "result_dir": "/tmp/paramer/simulation/3609" - }, - { - "parameters": { - "W": 41.18, - "L": 50.05 - }, - "id": 3610, - "result_dir": "/tmp/paramer/simulation/3610" - }, - { - "parameters": { - "W": 41.18, - "L": 52.55 - }, - "id": 3611, - "result_dir": "/tmp/paramer/simulation/3611" - }, - { - "parameters": { - "W": 41.18, - "L": 55.18 - }, - "id": 3612, - "result_dir": "/tmp/paramer/simulation/3612" - }, - { - "parameters": { - "W": 41.18, - "L": 57.94 - }, - "id": 3613, - "result_dir": "/tmp/paramer/simulation/3613" - }, - { - "parameters": { - "W": 41.18, - "L": 60.84 - }, - "id": 3614, - "result_dir": "/tmp/paramer/simulation/3614" - }, - { - "parameters": { - "W": 41.18, - "L": 63.88 - }, - "id": 3615, - "result_dir": "/tmp/paramer/simulation/3615" - }, - { - "parameters": { - "W": 41.18, - "L": 67.07 - }, - "id": 3616, - "result_dir": "/tmp/paramer/simulation/3616" - }, - { - "parameters": { - "W": 41.18, - "L": 70.42 - }, - "id": 3617, - "result_dir": "/tmp/paramer/simulation/3617" - }, - { - "parameters": { - "W": 41.18, - "L": 73.94 - }, - "id": 3618, - "result_dir": "/tmp/paramer/simulation/3618" - }, - { - "parameters": { - "W": 41.18, - "L": 77.64 - }, - "id": 3619, - "result_dir": "/tmp/paramer/simulation/3619" - }, - { - "parameters": { - "W": 41.18, - "L": 81.52 - }, - "id": 3620, - "result_dir": "/tmp/paramer/simulation/3620" - }, - { - "parameters": { - "W": 41.18, - "L": 85.6 - }, - "id": 3621, - "result_dir": "/tmp/paramer/simulation/3621" - }, - { - "parameters": { - "W": 41.18, - "L": 89.88 - }, - "id": 3622, - "result_dir": "/tmp/paramer/simulation/3622" - }, - { - "parameters": { - "W": 41.18, - "L": 94.37 - }, - "id": 3623, - "result_dir": "/tmp/paramer/simulation/3623" - }, - { - "parameters": { - "W": 41.18, - "L": 99.09 - }, - "id": 3624, - "result_dir": "/tmp/paramer/simulation/3624" - }, - { - "parameters": { - "W": 43.24, - "L": 15.52 - }, - "id": 3634, - "result_dir": "/tmp/paramer/simulation/3634" - }, - { - "parameters": { - "W": 43.24, - "L": 16.3 - }, - "id": 3635, - "result_dir": "/tmp/paramer/simulation/3635" - }, - { - "parameters": { - "W": 43.24, - "L": 17.12 - }, - "id": 3636, - "result_dir": "/tmp/paramer/simulation/3636" - }, - { - "parameters": { - "W": 43.24, - "L": 17.98 - }, - "id": 3637, - "result_dir": "/tmp/paramer/simulation/3637" - }, - { - "parameters": { - "W": 43.24, - "L": 18.88 - }, - "id": 3638, - "result_dir": "/tmp/paramer/simulation/3638" - }, - { - "parameters": { - "W": 43.24, - "L": 19.82 - }, - "id": 3639, - "result_dir": "/tmp/paramer/simulation/3639" - }, - { - "parameters": { - "W": 43.24, - "L": 20.81 - }, - "id": 3640, - "result_dir": "/tmp/paramer/simulation/3640" - }, - { - "parameters": { - "W": 43.24, - "L": 21.85 - }, - "id": 3641, - "result_dir": "/tmp/paramer/simulation/3641" - }, - { - "parameters": { - "W": 43.24, - "L": 22.94 - }, - "id": 3642, - "result_dir": "/tmp/paramer/simulation/3642" - }, - { - "parameters": { - "W": 43.24, - "L": 24.09 - }, - "id": 3643, - "result_dir": "/tmp/paramer/simulation/3643" - }, - { - "parameters": { - "W": 43.24, - "L": 25.29 - }, - "id": 3644, - "result_dir": "/tmp/paramer/simulation/3644" - }, - { - "parameters": { - "W": 43.24, - "L": 26.55 - }, - "id": 3645, - "result_dir": "/tmp/paramer/simulation/3645" - }, - { - "parameters": { - "W": 43.24, - "L": 27.88 - }, - "id": 3646, - "result_dir": "/tmp/paramer/simulation/3646" - }, - { - "parameters": { - "W": 43.24, - "L": 29.27 - }, - "id": 3647, - "result_dir": "/tmp/paramer/simulation/3647" - }, - { - "parameters": { - "W": 43.24, - "L": 30.73 - }, - "id": 3648, - "result_dir": "/tmp/paramer/simulation/3648" - }, - { - "parameters": { - "W": 43.24, - "L": 32.27 - }, - "id": 3649, - "result_dir": "/tmp/paramer/simulation/3649" - }, - { - "parameters": { - "W": 43.24, - "L": 33.88 - }, - "id": 3650, - "result_dir": "/tmp/paramer/simulation/3650" - }, - { - "parameters": { - "W": 43.24, - "L": 35.57 - }, - "id": 3651, - "result_dir": "/tmp/paramer/simulation/3651" - }, - { - "parameters": { - "W": 43.24, - "L": 37.35 - }, - "id": 3652, - "result_dir": "/tmp/paramer/simulation/3652" - }, - { - "parameters": { - "W": 43.24, - "L": 39.22 - }, - "id": 3653, - "result_dir": "/tmp/paramer/simulation/3653" - }, - { - "parameters": { - "W": 43.24, - "L": 41.18 - }, - "id": 3654, - "result_dir": "/tmp/paramer/simulation/3654" - }, - { - "parameters": { - "W": 43.24, - "L": 43.24 - }, - "id": 3655, - "result_dir": "/tmp/paramer/simulation/3655" - }, - { - "parameters": { - "W": 43.24, - "L": 45.4 - }, - "id": 3656, - "result_dir": "/tmp/paramer/simulation/3656" - }, - { - "parameters": { - "W": 43.24, - "L": 47.67 - }, - "id": 3657, - "result_dir": "/tmp/paramer/simulation/3657" - }, - { - "parameters": { - "W": 43.24, - "L": 50.05 - }, - "id": 3658, - "result_dir": "/tmp/paramer/simulation/3658" - }, - { - "parameters": { - "W": 43.24, - "L": 52.55 - }, - "id": 3659, - "result_dir": "/tmp/paramer/simulation/3659" - }, - { - "parameters": { - "W": 43.24, - "L": 55.18 - }, - "id": 3660, - "result_dir": "/tmp/paramer/simulation/3660" - }, - { - "parameters": { - "W": 43.24, - "L": 57.94 - }, - "id": 3661, - "result_dir": "/tmp/paramer/simulation/3661" - }, - { - "parameters": { - "W": 43.24, - "L": 60.84 - }, - "id": 3662, - "result_dir": "/tmp/paramer/simulation/3662" - }, - { - "parameters": { - "W": 43.24, - "L": 63.88 - }, - "id": 3663, - "result_dir": "/tmp/paramer/simulation/3663" - }, - { - "parameters": { - "W": 43.24, - "L": 67.07 - }, - "id": 3664, - "result_dir": "/tmp/paramer/simulation/3664" - }, - { - "parameters": { - "W": 43.24, - "L": 70.42 - }, - "id": 3665, - "result_dir": "/tmp/paramer/simulation/3665" - }, - { - "parameters": { - "W": 43.24, - "L": 73.94 - }, - "id": 3666, - "result_dir": "/tmp/paramer/simulation/3666" - }, - { - "parameters": { - "W": 43.24, - "L": 77.64 - }, - "id": 3667, - "result_dir": "/tmp/paramer/simulation/3667" - }, - { - "parameters": { - "W": 43.24, - "L": 81.52 - }, - "id": 3668, - "result_dir": "/tmp/paramer/simulation/3668" - }, - { - "parameters": { - "W": 43.24, - "L": 85.6 - }, - "id": 3669, - "result_dir": "/tmp/paramer/simulation/3669" - }, - { - "parameters": { - "W": 43.24, - "L": 89.88 - }, - "id": 3670, - "result_dir": "/tmp/paramer/simulation/3670" - }, - { - "parameters": { - "W": 43.24, - "L": 94.37 - }, - "id": 3671, - "result_dir": "/tmp/paramer/simulation/3671" - }, - { - "parameters": { - "W": 43.24, - "L": 99.09 - }, - "id": 3672, - "result_dir": "/tmp/paramer/simulation/3672" - }, - { - "parameters": { - "W": 45.4, - "L": 15.52 - }, - "id": 3682, - "result_dir": "/tmp/paramer/simulation/3682" - }, - { - "parameters": { - "W": 45.4, - "L": 16.3 - }, - "id": 3683, - "result_dir": "/tmp/paramer/simulation/3683" - }, - { - "parameters": { - "W": 45.4, - "L": 17.12 - }, - "id": 3684, - "result_dir": "/tmp/paramer/simulation/3684" - }, - { - "parameters": { - "W": 45.4, - "L": 17.98 - }, - "id": 3685, - "result_dir": "/tmp/paramer/simulation/3685" - }, - { - "parameters": { - "W": 45.4, - "L": 18.88 - }, - "id": 3686, - "result_dir": "/tmp/paramer/simulation/3686" - }, - { - "parameters": { - "W": 45.4, - "L": 19.82 - }, - "id": 3687, - "result_dir": "/tmp/paramer/simulation/3687" - }, - { - "parameters": { - "W": 45.4, - "L": 20.81 - }, - "id": 3688, - "result_dir": "/tmp/paramer/simulation/3688" - }, - { - "parameters": { - "W": 45.4, - "L": 21.85 - }, - "id": 3689, - "result_dir": "/tmp/paramer/simulation/3689" - }, - { - "parameters": { - "W": 45.4, - "L": 22.94 - }, - "id": 3690, - "result_dir": "/tmp/paramer/simulation/3690" - }, - { - "parameters": { - "W": 45.4, - "L": 24.09 - }, - "id": 3691, - "result_dir": "/tmp/paramer/simulation/3691" - }, - { - "parameters": { - "W": 45.4, - "L": 25.29 - }, - "id": 3692, - "result_dir": "/tmp/paramer/simulation/3692" - }, - { - "parameters": { - "W": 45.4, - "L": 26.55 - }, - "id": 3693, - "result_dir": "/tmp/paramer/simulation/3693" - }, - { - "parameters": { - "W": 45.4, - "L": 27.88 - }, - "id": 3694, - "result_dir": "/tmp/paramer/simulation/3694" - }, - { - "parameters": { - "W": 45.4, - "L": 29.27 - }, - "id": 3695, - "result_dir": "/tmp/paramer/simulation/3695" - }, - { - "parameters": { - "W": 45.4, - "L": 30.73 - }, - "id": 3696, - "result_dir": "/tmp/paramer/simulation/3696" - }, - { - "parameters": { - "W": 45.4, - "L": 32.27 - }, - "id": 3697, - "result_dir": "/tmp/paramer/simulation/3697" - }, - { - "parameters": { - "W": 45.4, - "L": 33.88 - }, - "id": 3698, - "result_dir": "/tmp/paramer/simulation/3698" - }, - { - "parameters": { - "W": 45.4, - "L": 35.57 - }, - "id": 3699, - "result_dir": "/tmp/paramer/simulation/3699" - }, - { - "parameters": { - "W": 45.4, - "L": 37.35 - }, - "id": 3700, - "result_dir": "/tmp/paramer/simulation/3700" - }, - { - "parameters": { - "W": 45.4, - "L": 39.22 - }, - "id": 3701, - "result_dir": "/tmp/paramer/simulation/3701" - }, - { - "parameters": { - "W": 45.4, - "L": 41.18 - }, - "id": 3702, - "result_dir": "/tmp/paramer/simulation/3702" - }, - { - "parameters": { - "W": 45.4, - "L": 43.24 - }, - "id": 3703, - "result_dir": "/tmp/paramer/simulation/3703" - }, - { - "parameters": { - "W": 45.4, - "L": 45.4 - }, - "id": 3704, - "result_dir": "/tmp/paramer/simulation/3704" - }, - { - "parameters": { - "W": 45.4, - "L": 47.67 - }, - "id": 3705, - "result_dir": "/tmp/paramer/simulation/3705" - }, - { - "parameters": { - "W": 45.4, - "L": 50.05 - }, - "id": 3706, - "result_dir": "/tmp/paramer/simulation/3706" - }, - { - "parameters": { - "W": 45.4, - "L": 52.55 - }, - "id": 3707, - "result_dir": "/tmp/paramer/simulation/3707" - }, - { - "parameters": { - "W": 45.4, - "L": 55.18 - }, - "id": 3708, - "result_dir": "/tmp/paramer/simulation/3708" - }, - { - "parameters": { - "W": 45.4, - "L": 57.94 - }, - "id": 3709, - "result_dir": "/tmp/paramer/simulation/3709" - }, - { - "parameters": { - "W": 45.4, - "L": 60.84 - }, - "id": 3710, - "result_dir": "/tmp/paramer/simulation/3710" - }, - { - "parameters": { - "W": 45.4, - "L": 63.88 - }, - "id": 3711, - "result_dir": "/tmp/paramer/simulation/3711" - }, - { - "parameters": { - "W": 45.4, - "L": 67.07 - }, - "id": 3712, - "result_dir": "/tmp/paramer/simulation/3712" - }, - { - "parameters": { - "W": 45.4, - "L": 70.42 - }, - "id": 3713, - "result_dir": "/tmp/paramer/simulation/3713" - }, - { - "parameters": { - "W": 45.4, - "L": 73.94 - }, - "id": 3714, - "result_dir": "/tmp/paramer/simulation/3714" - }, - { - "parameters": { - "W": 45.4, - "L": 77.64 - }, - "id": 3715, - "result_dir": "/tmp/paramer/simulation/3715" - }, - { - "parameters": { - "W": 45.4, - "L": 81.52 - }, - "id": 3716, - "result_dir": "/tmp/paramer/simulation/3716" - }, - { - "parameters": { - "W": 45.4, - "L": 85.6 - }, - "id": 3717, - "result_dir": "/tmp/paramer/simulation/3717" - }, - { - "parameters": { - "W": 45.4, - "L": 89.88 - }, - "id": 3718, - "result_dir": "/tmp/paramer/simulation/3718" - }, - { - "parameters": { - "W": 45.4, - "L": 94.37 - }, - "id": 3719, - "result_dir": "/tmp/paramer/simulation/3719" - }, - { - "parameters": { - "W": 45.4, - "L": 99.09 - }, - "id": 3720, - "result_dir": "/tmp/paramer/simulation/3720" - }, - { - "parameters": { - "W": 47.67, - "L": 15.52 - }, - "id": 3730, - "result_dir": "/tmp/paramer/simulation/3730" - }, - { - "parameters": { - "W": 47.67, - "L": 16.3 - }, - "id": 3731, - "result_dir": "/tmp/paramer/simulation/3731" - }, - { - "parameters": { - "W": 47.67, - "L": 17.12 - }, - "id": 3732, - "result_dir": "/tmp/paramer/simulation/3732" - }, - { - "parameters": { - "W": 47.67, - "L": 17.98 - }, - "id": 3733, - "result_dir": "/tmp/paramer/simulation/3733" - }, - { - "parameters": { - "W": 47.67, - "L": 18.88 - }, - "id": 3734, - "result_dir": "/tmp/paramer/simulation/3734" - }, - { - "parameters": { - "W": 47.67, - "L": 19.82 - }, - "id": 3735, - "result_dir": "/tmp/paramer/simulation/3735" - }, - { - "parameters": { - "W": 47.67, - "L": 20.81 - }, - "id": 3736, - "result_dir": "/tmp/paramer/simulation/3736" - }, - { - "parameters": { - "W": 47.67, - "L": 21.85 - }, - "id": 3737, - "result_dir": "/tmp/paramer/simulation/3737" - }, - { - "parameters": { - "W": 47.67, - "L": 22.94 - }, - "id": 3738, - "result_dir": "/tmp/paramer/simulation/3738" - }, - { - "parameters": { - "W": 47.67, - "L": 24.09 - }, - "id": 3739, - "result_dir": "/tmp/paramer/simulation/3739" - }, - { - "parameters": { - "W": 47.67, - "L": 25.29 - }, - "id": 3740, - "result_dir": "/tmp/paramer/simulation/3740" - }, - { - "parameters": { - "W": 47.67, - "L": 26.55 - }, - "id": 3741, - "result_dir": "/tmp/paramer/simulation/3741" - }, - { - "parameters": { - "W": 47.67, - "L": 27.88 - }, - "id": 3742, - "result_dir": "/tmp/paramer/simulation/3742" - }, - { - "parameters": { - "W": 47.67, - "L": 29.27 - }, - "id": 3743, - "result_dir": "/tmp/paramer/simulation/3743" - }, - { - "parameters": { - "W": 47.67, - "L": 30.73 - }, - "id": 3744, - "result_dir": "/tmp/paramer/simulation/3744" - }, - { - "parameters": { - "W": 47.67, - "L": 32.27 - }, - "id": 3745, - "result_dir": "/tmp/paramer/simulation/3745" - }, - { - "parameters": { - "W": 47.67, - "L": 33.88 - }, - "id": 3746, - "result_dir": "/tmp/paramer/simulation/3746" - }, - { - "parameters": { - "W": 47.67, - "L": 35.57 - }, - "id": 3747, - "result_dir": "/tmp/paramer/simulation/3747" - }, - { - "parameters": { - "W": 47.67, - "L": 37.35 - }, - "id": 3748, - "result_dir": "/tmp/paramer/simulation/3748" - }, - { - "parameters": { - "W": 47.67, - "L": 39.22 - }, - "id": 3749, - "result_dir": "/tmp/paramer/simulation/3749" - }, - { - "parameters": { - "W": 47.67, - "L": 41.18 - }, - "id": 3750, - "result_dir": "/tmp/paramer/simulation/3750" - }, - { - "parameters": { - "W": 47.67, - "L": 43.24 - }, - "id": 3751, - "result_dir": "/tmp/paramer/simulation/3751" - }, - { - "parameters": { - "W": 47.67, - "L": 45.4 - }, - "id": 3752, - "result_dir": "/tmp/paramer/simulation/3752" - }, - { - "parameters": { - "W": 47.67, - "L": 47.67 - }, - "id": 3753, - "result_dir": "/tmp/paramer/simulation/3753" - }, - { - "parameters": { - "W": 47.67, - "L": 50.05 - }, - "id": 3754, - "result_dir": "/tmp/paramer/simulation/3754" - }, - { - "parameters": { - "W": 47.67, - "L": 52.55 - }, - "id": 3755, - "result_dir": "/tmp/paramer/simulation/3755" - }, - { - "parameters": { - "W": 47.67, - "L": 55.18 - }, - "id": 3756, - "result_dir": "/tmp/paramer/simulation/3756" - }, - { - "parameters": { - "W": 47.67, - "L": 57.94 - }, - "id": 3757, - "result_dir": "/tmp/paramer/simulation/3757" - }, - { - "parameters": { - "W": 47.67, - "L": 60.84 - }, - "id": 3758, - "result_dir": "/tmp/paramer/simulation/3758" - }, - { - "parameters": { - "W": 47.67, - "L": 63.88 - }, - "id": 3759, - "result_dir": "/tmp/paramer/simulation/3759" - }, - { - "parameters": { - "W": 47.67, - "L": 67.07 - }, - "id": 3760, - "result_dir": "/tmp/paramer/simulation/3760" - }, - { - "parameters": { - "W": 47.67, - "L": 70.42 - }, - "id": 3761, - "result_dir": "/tmp/paramer/simulation/3761" - }, - { - "parameters": { - "W": 47.67, - "L": 73.94 - }, - "id": 3762, - "result_dir": "/tmp/paramer/simulation/3762" - }, - { - "parameters": { - "W": 47.67, - "L": 77.64 - }, - "id": 3763, - "result_dir": "/tmp/paramer/simulation/3763" - }, - { - "parameters": { - "W": 47.67, - "L": 81.52 - }, - "id": 3764, - "result_dir": "/tmp/paramer/simulation/3764" - }, - { - "parameters": { - "W": 47.67, - "L": 85.6 - }, - "id": 3765, - "result_dir": "/tmp/paramer/simulation/3765" - }, - { - "parameters": { - "W": 47.67, - "L": 89.88 - }, - "id": 3766, - "result_dir": "/tmp/paramer/simulation/3766" - }, - { - "parameters": { - "W": 47.67, - "L": 94.37 - }, - "id": 3767, - "result_dir": "/tmp/paramer/simulation/3767" - }, - { - "parameters": { - "W": 47.67, - "L": 99.09 - }, - "id": 3768, - "result_dir": "/tmp/paramer/simulation/3768" - }, - { - "parameters": { - "W": 50.05, - "L": 15.52 - }, - "id": 3778, - "result_dir": "/tmp/paramer/simulation/3778" - }, - { - "parameters": { - "W": 50.05, - "L": 16.3 - }, - "id": 3779, - "result_dir": "/tmp/paramer/simulation/3779" - }, - { - "parameters": { - "W": 50.05, - "L": 17.12 - }, - "id": 3780, - "result_dir": "/tmp/paramer/simulation/3780" - }, - { - "parameters": { - "W": 50.05, - "L": 17.98 - }, - "id": 3781, - "result_dir": "/tmp/paramer/simulation/3781" - }, - { - "parameters": { - "W": 50.05, - "L": 18.88 - }, - "id": 3782, - "result_dir": "/tmp/paramer/simulation/3782" - }, - { - "parameters": { - "W": 50.05, - "L": 19.82 - }, - "id": 3783, - "result_dir": "/tmp/paramer/simulation/3783" - }, - { - "parameters": { - "W": 50.05, - "L": 20.81 - }, - "id": 3784, - "result_dir": "/tmp/paramer/simulation/3784" - }, - { - "parameters": { - "W": 50.05, - "L": 21.85 - }, - "id": 3785, - "result_dir": "/tmp/paramer/simulation/3785" - }, - { - "parameters": { - "W": 50.05, - "L": 22.94 - }, - "id": 3786, - "result_dir": "/tmp/paramer/simulation/3786" - }, - { - "parameters": { - "W": 50.05, - "L": 24.09 - }, - "id": 3787, - "result_dir": "/tmp/paramer/simulation/3787" - }, - { - "parameters": { - "W": 50.05, - "L": 25.29 - }, - "id": 3788, - "result_dir": "/tmp/paramer/simulation/3788" - }, - { - "parameters": { - "W": 50.05, - "L": 26.55 - }, - "id": 3789, - "result_dir": "/tmp/paramer/simulation/3789" - }, - { - "parameters": { - "W": 50.05, - "L": 27.88 - }, - "id": 3790, - "result_dir": "/tmp/paramer/simulation/3790" - }, - { - "parameters": { - "W": 50.05, - "L": 29.27 - }, - "id": 3791, - "result_dir": "/tmp/paramer/simulation/3791" - }, - { - "parameters": { - "W": 50.05, - "L": 30.73 - }, - "id": 3792, - "result_dir": "/tmp/paramer/simulation/3792" - }, - { - "parameters": { - "W": 50.05, - "L": 32.27 - }, - "id": 3793, - "result_dir": "/tmp/paramer/simulation/3793" - }, - { - "parameters": { - "W": 50.05, - "L": 33.88 - }, - "id": 3794, - "result_dir": "/tmp/paramer/simulation/3794" - }, - { - "parameters": { - "W": 50.05, - "L": 35.57 - }, - "id": 3795, - "result_dir": "/tmp/paramer/simulation/3795" - }, - { - "parameters": { - "W": 50.05, - "L": 37.35 - }, - "id": 3796, - "result_dir": "/tmp/paramer/simulation/3796" - }, - { - "parameters": { - "W": 50.05, - "L": 39.22 - }, - "id": 3797, - "result_dir": "/tmp/paramer/simulation/3797" - }, - { - "parameters": { - "W": 50.05, - "L": 41.18 - }, - "id": 3798, - "result_dir": "/tmp/paramer/simulation/3798" - }, - { - "parameters": { - "W": 50.05, - "L": 43.24 - }, - "id": 3799, - "result_dir": "/tmp/paramer/simulation/3799" - }, - { - "parameters": { - "W": 50.05, - "L": 45.4 - }, - "id": 3800, - "result_dir": "/tmp/paramer/simulation/3800" - }, - { - "parameters": { - "W": 50.05, - "L": 47.67 - }, - "id": 3801, - "result_dir": "/tmp/paramer/simulation/3801" - }, - { - "parameters": { - "W": 50.05, - "L": 50.05 - }, - "id": 3802, - "result_dir": "/tmp/paramer/simulation/3802" - }, - { - "parameters": { - "W": 50.05, - "L": 52.55 - }, - "id": 3803, - "result_dir": "/tmp/paramer/simulation/3803" - }, - { - "parameters": { - "W": 50.05, - "L": 55.18 - }, - "id": 3804, - "result_dir": "/tmp/paramer/simulation/3804" - }, - { - "parameters": { - "W": 50.05, - "L": 57.94 - }, - "id": 3805, - "result_dir": "/tmp/paramer/simulation/3805" - }, - { - "parameters": { - "W": 50.05, - "L": 60.84 - }, - "id": 3806, - "result_dir": "/tmp/paramer/simulation/3806" - }, - { - "parameters": { - "W": 50.05, - "L": 63.88 - }, - "id": 3807, - "result_dir": "/tmp/paramer/simulation/3807" - }, - { - "parameters": { - "W": 50.05, - "L": 67.07 - }, - "id": 3808, - "result_dir": "/tmp/paramer/simulation/3808" - }, - { - "parameters": { - "W": 50.05, - "L": 70.42 - }, - "id": 3809, - "result_dir": "/tmp/paramer/simulation/3809" - }, - { - "parameters": { - "W": 50.05, - "L": 73.94 - }, - "id": 3810, - "result_dir": "/tmp/paramer/simulation/3810" - }, - { - "parameters": { - "W": 50.05, - "L": 77.64 - }, - "id": 3811, - "result_dir": "/tmp/paramer/simulation/3811" - }, - { - "parameters": { - "W": 50.05, - "L": 81.52 - }, - "id": 3812, - "result_dir": "/tmp/paramer/simulation/3812" - }, - { - "parameters": { - "W": 50.05, - "L": 85.6 - }, - "id": 3813, - "result_dir": "/tmp/paramer/simulation/3813" - }, - { - "parameters": { - "W": 50.05, - "L": 89.88 - }, - "id": 3814, - "result_dir": "/tmp/paramer/simulation/3814" - }, - { - "parameters": { - "W": 50.05, - "L": 94.37 - }, - "id": 3815, - "result_dir": "/tmp/paramer/simulation/3815" - }, - { - "parameters": { - "W": 50.05, - "L": 99.09 - }, - "id": 3816, - "result_dir": "/tmp/paramer/simulation/3816" - }, - { - "parameters": { - "W": 52.55, - "L": 15.52 - }, - "id": 3826, - "result_dir": "/tmp/paramer/simulation/3826" - }, - { - "parameters": { - "W": 52.55, - "L": 16.3 - }, - "id": 3827, - "result_dir": "/tmp/paramer/simulation/3827" - }, - { - "parameters": { - "W": 52.55, - "L": 17.12 - }, - "id": 3828, - "result_dir": "/tmp/paramer/simulation/3828" - }, - { - "parameters": { - "W": 52.55, - "L": 17.98 - }, - "id": 3829, - "result_dir": "/tmp/paramer/simulation/3829" - }, - { - "parameters": { - "W": 52.55, - "L": 18.88 - }, - "id": 3830, - "result_dir": "/tmp/paramer/simulation/3830" - }, - { - "parameters": { - "W": 52.55, - "L": 19.82 - }, - "id": 3831, - "result_dir": "/tmp/paramer/simulation/3831" - }, - { - "parameters": { - "W": 52.55, - "L": 20.81 - }, - "id": 3832, - "result_dir": "/tmp/paramer/simulation/3832" - }, - { - "parameters": { - "W": 52.55, - "L": 21.85 - }, - "id": 3833, - "result_dir": "/tmp/paramer/simulation/3833" - }, - { - "parameters": { - "W": 52.55, - "L": 22.94 - }, - "id": 3834, - "result_dir": "/tmp/paramer/simulation/3834" - }, - { - "parameters": { - "W": 52.55, - "L": 24.09 - }, - "id": 3835, - "result_dir": "/tmp/paramer/simulation/3835" - }, - { - "parameters": { - "W": 52.55, - "L": 25.29 - }, - "id": 3836, - "result_dir": "/tmp/paramer/simulation/3836" - }, - { - "parameters": { - "W": 52.55, - "L": 26.55 - }, - "id": 3837, - "result_dir": "/tmp/paramer/simulation/3837" - }, - { - "parameters": { - "W": 52.55, - "L": 27.88 - }, - "id": 3838, - "result_dir": "/tmp/paramer/simulation/3838" - }, - { - "parameters": { - "W": 52.55, - "L": 29.27 - }, - "id": 3839, - "result_dir": "/tmp/paramer/simulation/3839" - }, - { - "parameters": { - "W": 52.55, - "L": 30.73 - }, - "id": 3840, - "result_dir": "/tmp/paramer/simulation/3840" - }, - { - "parameters": { - "W": 52.55, - "L": 32.27 - }, - "id": 3841, - "result_dir": "/tmp/paramer/simulation/3841" - }, - { - "parameters": { - "W": 52.55, - "L": 33.88 - }, - "id": 3842, - "result_dir": "/tmp/paramer/simulation/3842" - }, - { - "parameters": { - "W": 52.55, - "L": 35.57 - }, - "id": 3843, - "result_dir": "/tmp/paramer/simulation/3843" - }, - { - "parameters": { - "W": 52.55, - "L": 37.35 - }, - "id": 3844, - "result_dir": "/tmp/paramer/simulation/3844" - }, - { - "parameters": { - "W": 52.55, - "L": 39.22 - }, - "id": 3845, - "result_dir": "/tmp/paramer/simulation/3845" - }, - { - "parameters": { - "W": 52.55, - "L": 41.18 - }, - "id": 3846, - "result_dir": "/tmp/paramer/simulation/3846" - }, - { - "parameters": { - "W": 52.55, - "L": 43.24 - }, - "id": 3847, - "result_dir": "/tmp/paramer/simulation/3847" - }, - { - "parameters": { - "W": 52.55, - "L": 45.4 - }, - "id": 3848, - "result_dir": "/tmp/paramer/simulation/3848" - }, - { - "parameters": { - "W": 52.55, - "L": 47.67 - }, - "id": 3849, - "result_dir": "/tmp/paramer/simulation/3849" - }, - { - "parameters": { - "W": 52.55, - "L": 50.05 - }, - "id": 3850, - "result_dir": "/tmp/paramer/simulation/3850" - }, - { - "parameters": { - "W": 52.55, - "L": 52.55 - }, - "id": 3851, - "result_dir": "/tmp/paramer/simulation/3851" - }, - { - "parameters": { - "W": 52.55, - "L": 55.18 - }, - "id": 3852, - "result_dir": "/tmp/paramer/simulation/3852" - }, - { - "parameters": { - "W": 52.55, - "L": 57.94 - }, - "id": 3853, - "result_dir": "/tmp/paramer/simulation/3853" - }, - { - "parameters": { - "W": 52.55, - "L": 60.84 - }, - "id": 3854, - "result_dir": "/tmp/paramer/simulation/3854" - }, - { - "parameters": { - "W": 52.55, - "L": 63.88 - }, - "id": 3855, - "result_dir": "/tmp/paramer/simulation/3855" - }, - { - "parameters": { - "W": 52.55, - "L": 67.07 - }, - "id": 3856, - "result_dir": "/tmp/paramer/simulation/3856" - }, - { - "parameters": { - "W": 52.55, - "L": 70.42 - }, - "id": 3857, - "result_dir": "/tmp/paramer/simulation/3857" - }, - { - "parameters": { - "W": 52.55, - "L": 73.94 - }, - "id": 3858, - "result_dir": "/tmp/paramer/simulation/3858" - }, - { - "parameters": { - "W": 52.55, - "L": 77.64 - }, - "id": 3859, - "result_dir": "/tmp/paramer/simulation/3859" - }, - { - "parameters": { - "W": 52.55, - "L": 81.52 - }, - "id": 3860, - "result_dir": "/tmp/paramer/simulation/3860" - }, - { - "parameters": { - "W": 52.55, - "L": 85.6 - }, - "id": 3861, - "result_dir": "/tmp/paramer/simulation/3861" - }, - { - "parameters": { - "W": 52.55, - "L": 89.88 - }, - "id": 3862, - "result_dir": "/tmp/paramer/simulation/3862" - }, - { - "parameters": { - "W": 52.55, - "L": 94.37 - }, - "id": 3863, - "result_dir": "/tmp/paramer/simulation/3863" - }, - { - "parameters": { - "W": 52.55, - "L": 99.09 - }, - "id": 3864, - "result_dir": "/tmp/paramer/simulation/3864" - }, - { - "parameters": { - "W": 55.18, - "L": 15.52 - }, - "id": 3874, - "result_dir": "/tmp/paramer/simulation/3874" - }, - { - "parameters": { - "W": 55.18, - "L": 16.3 - }, - "id": 3875, - "result_dir": "/tmp/paramer/simulation/3875" - }, - { - "parameters": { - "W": 55.18, - "L": 17.12 - }, - "id": 3876, - "result_dir": "/tmp/paramer/simulation/3876" - }, - { - "parameters": { - "W": 55.18, - "L": 17.98 - }, - "id": 3877, - "result_dir": "/tmp/paramer/simulation/3877" - }, - { - "parameters": { - "W": 55.18, - "L": 18.88 - }, - "id": 3878, - "result_dir": "/tmp/paramer/simulation/3878" - }, - { - "parameters": { - "W": 55.18, - "L": 19.82 - }, - "id": 3879, - "result_dir": "/tmp/paramer/simulation/3879" - }, - { - "parameters": { - "W": 55.18, - "L": 20.81 - }, - "id": 3880, - "result_dir": "/tmp/paramer/simulation/3880" - }, - { - "parameters": { - "W": 55.18, - "L": 21.85 - }, - "id": 3881, - "result_dir": "/tmp/paramer/simulation/3881" - }, - { - "parameters": { - "W": 55.18, - "L": 22.94 - }, - "id": 3882, - "result_dir": "/tmp/paramer/simulation/3882" - }, - { - "parameters": { - "W": 55.18, - "L": 24.09 - }, - "id": 3883, - "result_dir": "/tmp/paramer/simulation/3883" - }, - { - "parameters": { - "W": 55.18, - "L": 25.29 - }, - "id": 3884, - "result_dir": "/tmp/paramer/simulation/3884" - }, - { - "parameters": { - "W": 55.18, - "L": 26.55 - }, - "id": 3885, - "result_dir": "/tmp/paramer/simulation/3885" - }, - { - "parameters": { - "W": 55.18, - "L": 27.88 - }, - "id": 3886, - "result_dir": "/tmp/paramer/simulation/3886" - }, - { - "parameters": { - "W": 55.18, - "L": 29.27 - }, - "id": 3887, - "result_dir": "/tmp/paramer/simulation/3887" - }, - { - "parameters": { - "W": 55.18, - "L": 30.73 - }, - "id": 3888, - "result_dir": "/tmp/paramer/simulation/3888" - }, - { - "parameters": { - "W": 55.18, - "L": 32.27 - }, - "id": 3889, - "result_dir": "/tmp/paramer/simulation/3889" - }, - { - "parameters": { - "W": 55.18, - "L": 33.88 - }, - "id": 3890, - "result_dir": "/tmp/paramer/simulation/3890" - }, - { - "parameters": { - "W": 55.18, - "L": 35.57 - }, - "id": 3891, - "result_dir": "/tmp/paramer/simulation/3891" - }, - { - "parameters": { - "W": 55.18, - "L": 37.35 - }, - "id": 3892, - "result_dir": "/tmp/paramer/simulation/3892" - }, - { - "parameters": { - "W": 55.18, - "L": 39.22 - }, - "id": 3893, - "result_dir": "/tmp/paramer/simulation/3893" - }, - { - "parameters": { - "W": 55.18, - "L": 41.18 - }, - "id": 3894, - "result_dir": "/tmp/paramer/simulation/3894" - }, - { - "parameters": { - "W": 55.18, - "L": 43.24 - }, - "id": 3895, - "result_dir": "/tmp/paramer/simulation/3895" - }, - { - "parameters": { - "W": 55.18, - "L": 45.4 - }, - "id": 3896, - "result_dir": "/tmp/paramer/simulation/3896" - }, - { - "parameters": { - "W": 55.18, - "L": 47.67 - }, - "id": 3897, - "result_dir": "/tmp/paramer/simulation/3897" - }, - { - "parameters": { - "W": 55.18, - "L": 50.05 - }, - "id": 3898, - "result_dir": "/tmp/paramer/simulation/3898" - }, - { - "parameters": { - "W": 55.18, - "L": 52.55 - }, - "id": 3899, - "result_dir": "/tmp/paramer/simulation/3899" - }, - { - "parameters": { - "W": 55.18, - "L": 55.18 - }, - "id": 3900, - "result_dir": "/tmp/paramer/simulation/3900" - }, - { - "parameters": { - "W": 55.18, - "L": 57.94 - }, - "id": 3901, - "result_dir": "/tmp/paramer/simulation/3901" - }, - { - "parameters": { - "W": 55.18, - "L": 60.84 - }, - "id": 3902, - "result_dir": "/tmp/paramer/simulation/3902" - }, - { - "parameters": { - "W": 55.18, - "L": 63.88 - }, - "id": 3903, - "result_dir": "/tmp/paramer/simulation/3903" - }, - { - "parameters": { - "W": 55.18, - "L": 67.07 - }, - "id": 3904, - "result_dir": "/tmp/paramer/simulation/3904" - }, - { - "parameters": { - "W": 55.18, - "L": 70.42 - }, - "id": 3905, - "result_dir": "/tmp/paramer/simulation/3905" - }, - { - "parameters": { - "W": 55.18, - "L": 73.94 - }, - "id": 3906, - "result_dir": "/tmp/paramer/simulation/3906" - }, - { - "parameters": { - "W": 55.18, - "L": 77.64 - }, - "id": 3907, - "result_dir": "/tmp/paramer/simulation/3907" - }, - { - "parameters": { - "W": 55.18, - "L": 81.52 - }, - "id": 3908, - "result_dir": "/tmp/paramer/simulation/3908" - }, - { - "parameters": { - "W": 55.18, - "L": 85.6 - }, - "id": 3909, - "result_dir": "/tmp/paramer/simulation/3909" - }, - { - "parameters": { - "W": 55.18, - "L": 89.88 - }, - "id": 3910, - "result_dir": "/tmp/paramer/simulation/3910" - }, - { - "parameters": { - "W": 55.18, - "L": 94.37 - }, - "id": 3911, - "result_dir": "/tmp/paramer/simulation/3911" - }, - { - "parameters": { - "W": 55.18, - "L": 99.09 - }, - "id": 3912, - "result_dir": "/tmp/paramer/simulation/3912" - }, - { - "parameters": { - "W": 57.94, - "L": 15.52 - }, - "id": 3922, - "result_dir": "/tmp/paramer/simulation/3922" - }, - { - "parameters": { - "W": 57.94, - "L": 16.3 - }, - "id": 3923, - "result_dir": "/tmp/paramer/simulation/3923" - }, - { - "parameters": { - "W": 57.94, - "L": 17.12 - }, - "id": 3924, - "result_dir": "/tmp/paramer/simulation/3924" - }, - { - "parameters": { - "W": 57.94, - "L": 17.98 - }, - "id": 3925, - "result_dir": "/tmp/paramer/simulation/3925" - }, - { - "parameters": { - "W": 57.94, - "L": 18.88 - }, - "id": 3926, - "result_dir": "/tmp/paramer/simulation/3926" - }, - { - "parameters": { - "W": 57.94, - "L": 19.82 - }, - "id": 3927, - "result_dir": "/tmp/paramer/simulation/3927" - }, - { - "parameters": { - "W": 57.94, - "L": 20.81 - }, - "id": 3928, - "result_dir": "/tmp/paramer/simulation/3928" - }, - { - "parameters": { - "W": 57.94, - "L": 21.85 - }, - "id": 3929, - "result_dir": "/tmp/paramer/simulation/3929" - }, - { - "parameters": { - "W": 57.94, - "L": 22.94 - }, - "id": 3930, - "result_dir": "/tmp/paramer/simulation/3930" - }, - { - "parameters": { - "W": 57.94, - "L": 24.09 - }, - "id": 3931, - "result_dir": "/tmp/paramer/simulation/3931" - }, - { - "parameters": { - "W": 57.94, - "L": 25.29 - }, - "id": 3932, - "result_dir": "/tmp/paramer/simulation/3932" - }, - { - "parameters": { - "W": 57.94, - "L": 26.55 - }, - "id": 3933, - "result_dir": "/tmp/paramer/simulation/3933" - }, - { - "parameters": { - "W": 57.94, - "L": 27.88 - }, - "id": 3934, - "result_dir": "/tmp/paramer/simulation/3934" - }, - { - "parameters": { - "W": 57.94, - "L": 29.27 - }, - "id": 3935, - "result_dir": "/tmp/paramer/simulation/3935" - }, - { - "parameters": { - "W": 57.94, - "L": 30.73 - }, - "id": 3936, - "result_dir": "/tmp/paramer/simulation/3936" - }, - { - "parameters": { - "W": 57.94, - "L": 32.27 - }, - "id": 3937, - "result_dir": "/tmp/paramer/simulation/3937" - }, - { - "parameters": { - "W": 57.94, - "L": 33.88 - }, - "id": 3938, - "result_dir": "/tmp/paramer/simulation/3938" - }, - { - "parameters": { - "W": 57.94, - "L": 35.57 - }, - "id": 3939, - "result_dir": "/tmp/paramer/simulation/3939" - }, - { - "parameters": { - "W": 57.94, - "L": 37.35 - }, - "id": 3940, - "result_dir": "/tmp/paramer/simulation/3940" - }, - { - "parameters": { - "W": 57.94, - "L": 39.22 - }, - "id": 3941, - "result_dir": "/tmp/paramer/simulation/3941" - }, - { - "parameters": { - "W": 57.94, - "L": 41.18 - }, - "id": 3942, - "result_dir": "/tmp/paramer/simulation/3942" - }, - { - "parameters": { - "W": 57.94, - "L": 43.24 - }, - "id": 3943, - "result_dir": "/tmp/paramer/simulation/3943" - }, - { - "parameters": { - "W": 57.94, - "L": 45.4 - }, - "id": 3944, - "result_dir": "/tmp/paramer/simulation/3944" - }, - { - "parameters": { - "W": 57.94, - "L": 47.67 - }, - "id": 3945, - "result_dir": "/tmp/paramer/simulation/3945" - }, - { - "parameters": { - "W": 57.94, - "L": 50.05 - }, - "id": 3946, - "result_dir": "/tmp/paramer/simulation/3946" - }, - { - "parameters": { - "W": 57.94, - "L": 52.55 - }, - "id": 3947, - "result_dir": "/tmp/paramer/simulation/3947" - }, - { - "parameters": { - "W": 57.94, - "L": 55.18 - }, - "id": 3948, - "result_dir": "/tmp/paramer/simulation/3948" - }, - { - "parameters": { - "W": 57.94, - "L": 57.94 - }, - "id": 3949, - "result_dir": "/tmp/paramer/simulation/3949" - }, - { - "parameters": { - "W": 57.94, - "L": 60.84 - }, - "id": 3950, - "result_dir": "/tmp/paramer/simulation/3950" - }, - { - "parameters": { - "W": 57.94, - "L": 63.88 - }, - "id": 3951, - "result_dir": "/tmp/paramer/simulation/3951" - }, - { - "parameters": { - "W": 57.94, - "L": 67.07 - }, - "id": 3952, - "result_dir": "/tmp/paramer/simulation/3952" - }, - { - "parameters": { - "W": 57.94, - "L": 70.42 - }, - "id": 3953, - "result_dir": "/tmp/paramer/simulation/3953" - }, - { - "parameters": { - "W": 57.94, - "L": 73.94 - }, - "id": 3954, - "result_dir": "/tmp/paramer/simulation/3954" - }, - { - "parameters": { - "W": 57.94, - "L": 77.64 - }, - "id": 3955, - "result_dir": "/tmp/paramer/simulation/3955" - }, - { - "parameters": { - "W": 57.94, - "L": 81.52 - }, - "id": 3956, - "result_dir": "/tmp/paramer/simulation/3956" - }, - { - "parameters": { - "W": 57.94, - "L": 85.6 - }, - "id": 3957, - "result_dir": "/tmp/paramer/simulation/3957" - }, - { - "parameters": { - "W": 57.94, - "L": 89.88 - }, - "id": 3958, - "result_dir": "/tmp/paramer/simulation/3958" - }, - { - "parameters": { - "W": 57.94, - "L": 94.37 - }, - "id": 3959, - "result_dir": "/tmp/paramer/simulation/3959" - }, - { - "parameters": { - "W": 57.94, - "L": 99.09 - }, - "id": 3960, - "result_dir": "/tmp/paramer/simulation/3960" - }, - { - "parameters": { - "W": 60.84, - "L": 15.52 - }, - "id": 3970, - "result_dir": "/tmp/paramer/simulation/3970" - }, - { - "parameters": { - "W": 60.84, - "L": 16.3 - }, - "id": 3971, - "result_dir": "/tmp/paramer/simulation/3971" - }, - { - "parameters": { - "W": 60.84, - "L": 17.12 - }, - "id": 3972, - "result_dir": "/tmp/paramer/simulation/3972" - }, - { - "parameters": { - "W": 60.84, - "L": 17.98 - }, - "id": 3973, - "result_dir": "/tmp/paramer/simulation/3973" - }, - { - "parameters": { - "W": 60.84, - "L": 18.88 - }, - "id": 3974, - "result_dir": "/tmp/paramer/simulation/3974" - }, - { - "parameters": { - "W": 60.84, - "L": 19.82 - }, - "id": 3975, - "result_dir": "/tmp/paramer/simulation/3975" - }, - { - "parameters": { - "W": 60.84, - "L": 20.81 - }, - "id": 3976, - "result_dir": "/tmp/paramer/simulation/3976" - }, - { - "parameters": { - "W": 60.84, - "L": 21.85 - }, - "id": 3977, - "result_dir": "/tmp/paramer/simulation/3977" - }, - { - "parameters": { - "W": 60.84, - "L": 22.94 - }, - "id": 3978, - "result_dir": "/tmp/paramer/simulation/3978" - }, - { - "parameters": { - "W": 60.84, - "L": 24.09 - }, - "id": 3979, - "result_dir": "/tmp/paramer/simulation/3979" - }, - { - "parameters": { - "W": 60.84, - "L": 25.29 - }, - "id": 3980, - "result_dir": "/tmp/paramer/simulation/3980" - }, - { - "parameters": { - "W": 60.84, - "L": 26.55 - }, - "id": 3981, - "result_dir": "/tmp/paramer/simulation/3981" - }, - { - "parameters": { - "W": 60.84, - "L": 27.88 - }, - "id": 3982, - "result_dir": "/tmp/paramer/simulation/3982" - }, - { - "parameters": { - "W": 60.84, - "L": 29.27 - }, - "id": 3983, - "result_dir": "/tmp/paramer/simulation/3983" - }, - { - "parameters": { - "W": 60.84, - "L": 30.73 - }, - "id": 3984, - "result_dir": "/tmp/paramer/simulation/3984" - }, - { - "parameters": { - "W": 60.84, - "L": 32.27 - }, - "id": 3985, - "result_dir": "/tmp/paramer/simulation/3985" - }, - { - "parameters": { - "W": 60.84, - "L": 33.88 - }, - "id": 3986, - "result_dir": "/tmp/paramer/simulation/3986" - }, - { - "parameters": { - "W": 60.84, - "L": 35.57 - }, - "id": 3987, - "result_dir": "/tmp/paramer/simulation/3987" - }, - { - "parameters": { - "W": 60.84, - "L": 37.35 - }, - "id": 3988, - "result_dir": "/tmp/paramer/simulation/3988" - }, - { - "parameters": { - "W": 60.84, - "L": 39.22 - }, - "id": 3989, - "result_dir": "/tmp/paramer/simulation/3989" - }, - { - "parameters": { - "W": 60.84, - "L": 41.18 - }, - "id": 3990, - "result_dir": "/tmp/paramer/simulation/3990" - }, - { - "parameters": { - "W": 60.84, - "L": 43.24 - }, - "id": 3991, - "result_dir": "/tmp/paramer/simulation/3991" - }, - { - "parameters": { - "W": 60.84, - "L": 45.4 - }, - "id": 3992, - "result_dir": "/tmp/paramer/simulation/3992" - }, - { - "parameters": { - "W": 60.84, - "L": 47.67 - }, - "id": 3993, - "result_dir": "/tmp/paramer/simulation/3993" - }, - { - "parameters": { - "W": 60.84, - "L": 50.05 - }, - "id": 3994, - "result_dir": "/tmp/paramer/simulation/3994" - }, - { - "parameters": { - "W": 60.84, - "L": 52.55 - }, - "id": 3995, - "result_dir": "/tmp/paramer/simulation/3995" - }, - { - "parameters": { - "W": 60.84, - "L": 55.18 - }, - "id": 3996, - "result_dir": "/tmp/paramer/simulation/3996" - }, - { - "parameters": { - "W": 60.84, - "L": 57.94 - }, - "id": 3997, - "result_dir": "/tmp/paramer/simulation/3997" - }, - { - "parameters": { - "W": 60.84, - "L": 60.84 - }, - "id": 3998, - "result_dir": "/tmp/paramer/simulation/3998" - }, - { - "parameters": { - "W": 60.84, - "L": 63.88 - }, - "id": 3999, - "result_dir": "/tmp/paramer/simulation/3999" - }, - { - "parameters": { - "W": 60.84, - "L": 67.07 - }, - "id": 4000, - "result_dir": "/tmp/paramer/simulation/4000" - }, - { - "parameters": { - "W": 60.84, - "L": 70.42 - }, - "id": 4001, - "result_dir": "/tmp/paramer/simulation/4001" - }, - { - "parameters": { - "W": 60.84, - "L": 73.94 - }, - "id": 4002, - "result_dir": "/tmp/paramer/simulation/4002" - }, - { - "parameters": { - "W": 60.84, - "L": 77.64 - }, - "id": 4003, - "result_dir": "/tmp/paramer/simulation/4003" - }, - { - "parameters": { - "W": 60.84, - "L": 81.52 - }, - "id": 4004, - "result_dir": "/tmp/paramer/simulation/4004" - }, - { - "parameters": { - "W": 60.84, - "L": 85.6 - }, - "id": 4005, - "result_dir": "/tmp/paramer/simulation/4005" - }, - { - "parameters": { - "W": 60.84, - "L": 89.88 - }, - "id": 4006, - "result_dir": "/tmp/paramer/simulation/4006" - }, - { - "parameters": { - "W": 60.84, - "L": 94.37 - }, - "id": 4007, - "result_dir": "/tmp/paramer/simulation/4007" - }, - { - "parameters": { - "W": 60.84, - "L": 99.09 - }, - "id": 4008, - "result_dir": "/tmp/paramer/simulation/4008" - }, - { - "parameters": { - "W": 63.88, - "L": 15.52 - }, - "id": 4018, - "result_dir": "/tmp/paramer/simulation/4018" - }, - { - "parameters": { - "W": 63.88, - "L": 16.3 - }, - "id": 4019, - "result_dir": "/tmp/paramer/simulation/4019" - }, - { - "parameters": { - "W": 63.88, - "L": 17.12 - }, - "id": 4020, - "result_dir": "/tmp/paramer/simulation/4020" - }, - { - "parameters": { - "W": 63.88, - "L": 17.98 - }, - "id": 4021, - "result_dir": "/tmp/paramer/simulation/4021" - }, - { - "parameters": { - "W": 63.88, - "L": 18.88 - }, - "id": 4022, - "result_dir": "/tmp/paramer/simulation/4022" - }, - { - "parameters": { - "W": 63.88, - "L": 19.82 - }, - "id": 4023, - "result_dir": "/tmp/paramer/simulation/4023" - }, - { - "parameters": { - "W": 63.88, - "L": 20.81 - }, - "id": 4024, - "result_dir": "/tmp/paramer/simulation/4024" - }, - { - "parameters": { - "W": 63.88, - "L": 21.85 - }, - "id": 4025, - "result_dir": "/tmp/paramer/simulation/4025" - }, - { - "parameters": { - "W": 63.88, - "L": 22.94 - }, - "id": 4026, - "result_dir": "/tmp/paramer/simulation/4026" - }, - { - "parameters": { - "W": 63.88, - "L": 24.09 - }, - "id": 4027, - "result_dir": "/tmp/paramer/simulation/4027" - }, - { - "parameters": { - "W": 63.88, - "L": 25.29 - }, - "id": 4028, - "result_dir": "/tmp/paramer/simulation/4028" - }, - { - "parameters": { - "W": 63.88, - "L": 26.55 - }, - "id": 4029, - "result_dir": "/tmp/paramer/simulation/4029" - }, - { - "parameters": { - "W": 63.88, - "L": 27.88 - }, - "id": 4030, - "result_dir": "/tmp/paramer/simulation/4030" - }, - { - "parameters": { - "W": 63.88, - "L": 29.27 - }, - "id": 4031, - "result_dir": "/tmp/paramer/simulation/4031" - }, - { - "parameters": { - "W": 63.88, - "L": 30.73 - }, - "id": 4032, - "result_dir": "/tmp/paramer/simulation/4032" - }, - { - "parameters": { - "W": 63.88, - "L": 32.27 - }, - "id": 4033, - "result_dir": "/tmp/paramer/simulation/4033" - }, - { - "parameters": { - "W": 63.88, - "L": 33.88 - }, - "id": 4034, - "result_dir": "/tmp/paramer/simulation/4034" - }, - { - "parameters": { - "W": 63.88, - "L": 35.57 - }, - "id": 4035, - "result_dir": "/tmp/paramer/simulation/4035" - }, - { - "parameters": { - "W": 63.88, - "L": 37.35 - }, - "id": 4036, - "result_dir": "/tmp/paramer/simulation/4036" - }, - { - "parameters": { - "W": 63.88, - "L": 39.22 - }, - "id": 4037, - "result_dir": "/tmp/paramer/simulation/4037" - }, - { - "parameters": { - "W": 63.88, - "L": 41.18 - }, - "id": 4038, - "result_dir": "/tmp/paramer/simulation/4038" - }, - { - "parameters": { - "W": 63.88, - "L": 43.24 - }, - "id": 4039, - "result_dir": "/tmp/paramer/simulation/4039" - }, - { - "parameters": { - "W": 63.88, - "L": 45.4 - }, - "id": 4040, - "result_dir": "/tmp/paramer/simulation/4040" - }, - { - "parameters": { - "W": 63.88, - "L": 47.67 - }, - "id": 4041, - "result_dir": "/tmp/paramer/simulation/4041" - }, - { - "parameters": { - "W": 63.88, - "L": 50.05 - }, - "id": 4042, - "result_dir": "/tmp/paramer/simulation/4042" - }, - { - "parameters": { - "W": 63.88, - "L": 52.55 - }, - "id": 4043, - "result_dir": "/tmp/paramer/simulation/4043" - }, - { - "parameters": { - "W": 63.88, - "L": 55.18 - }, - "id": 4044, - "result_dir": "/tmp/paramer/simulation/4044" - }, - { - "parameters": { - "W": 63.88, - "L": 57.94 - }, - "id": 4045, - "result_dir": "/tmp/paramer/simulation/4045" - }, - { - "parameters": { - "W": 63.88, - "L": 60.84 - }, - "id": 4046, - "result_dir": "/tmp/paramer/simulation/4046" - }, - { - "parameters": { - "W": 63.88, - "L": 63.88 - }, - "id": 4047, - "result_dir": "/tmp/paramer/simulation/4047" - }, - { - "parameters": { - "W": 63.88, - "L": 67.07 - }, - "id": 4048, - "result_dir": "/tmp/paramer/simulation/4048" - }, - { - "parameters": { - "W": 63.88, - "L": 70.42 - }, - "id": 4049, - "result_dir": "/tmp/paramer/simulation/4049" - }, - { - "parameters": { - "W": 63.88, - "L": 73.94 - }, - "id": 4050, - "result_dir": "/tmp/paramer/simulation/4050" - }, - { - "parameters": { - "W": 63.88, - "L": 77.64 - }, - "id": 4051, - "result_dir": "/tmp/paramer/simulation/4051" - }, - { - "parameters": { - "W": 63.88, - "L": 81.52 - }, - "id": 4052, - "result_dir": "/tmp/paramer/simulation/4052" - }, - { - "parameters": { - "W": 63.88, - "L": 85.6 - }, - "id": 4053, - "result_dir": "/tmp/paramer/simulation/4053" - }, - { - "parameters": { - "W": 63.88, - "L": 89.88 - }, - "id": 4054, - "result_dir": "/tmp/paramer/simulation/4054" - }, - { - "parameters": { - "W": 63.88, - "L": 94.37 - }, - "id": 4055, - "result_dir": "/tmp/paramer/simulation/4055" - }, - { - "parameters": { - "W": 63.88, - "L": 99.09 - }, - "id": 4056, - "result_dir": "/tmp/paramer/simulation/4056" - }, - { - "parameters": { - "W": 67.07, - "L": 15.52 - }, - "id": 4066, - "result_dir": "/tmp/paramer/simulation/4066" - }, - { - "parameters": { - "W": 67.07, - "L": 16.3 - }, - "id": 4067, - "result_dir": "/tmp/paramer/simulation/4067" - }, - { - "parameters": { - "W": 67.07, - "L": 17.12 - }, - "id": 4068, - "result_dir": "/tmp/paramer/simulation/4068" - }, - { - "parameters": { - "W": 67.07, - "L": 17.98 - }, - "id": 4069, - "result_dir": "/tmp/paramer/simulation/4069" - }, - { - "parameters": { - "W": 67.07, - "L": 18.88 - }, - "id": 4070, - "result_dir": "/tmp/paramer/simulation/4070" - }, - { - "parameters": { - "W": 67.07, - "L": 19.82 - }, - "id": 4071, - "result_dir": "/tmp/paramer/simulation/4071" - }, - { - "parameters": { - "W": 67.07, - "L": 20.81 - }, - "id": 4072, - "result_dir": "/tmp/paramer/simulation/4072" - }, - { - "parameters": { - "W": 67.07, - "L": 21.85 - }, - "id": 4073, - "result_dir": "/tmp/paramer/simulation/4073" - }, - { - "parameters": { - "W": 67.07, - "L": 22.94 - }, - "id": 4074, - "result_dir": "/tmp/paramer/simulation/4074" - }, - { - "parameters": { - "W": 67.07, - "L": 24.09 - }, - "id": 4075, - "result_dir": "/tmp/paramer/simulation/4075" - }, - { - "parameters": { - "W": 67.07, - "L": 25.29 - }, - "id": 4076, - "result_dir": "/tmp/paramer/simulation/4076" - }, - { - "parameters": { - "W": 67.07, - "L": 26.55 - }, - "id": 4077, - "result_dir": "/tmp/paramer/simulation/4077" - }, - { - "parameters": { - "W": 67.07, - "L": 27.88 - }, - "id": 4078, - "result_dir": "/tmp/paramer/simulation/4078" - }, - { - "parameters": { - "W": 67.07, - "L": 29.27 - }, - "id": 4079, - "result_dir": "/tmp/paramer/simulation/4079" - }, - { - "parameters": { - "W": 67.07, - "L": 30.73 - }, - "id": 4080, - "result_dir": "/tmp/paramer/simulation/4080" - }, - { - "parameters": { - "W": 67.07, - "L": 32.27 - }, - "id": 4081, - "result_dir": "/tmp/paramer/simulation/4081" - }, - { - "parameters": { - "W": 67.07, - "L": 33.88 - }, - "id": 4082, - "result_dir": "/tmp/paramer/simulation/4082" - }, - { - "parameters": { - "W": 67.07, - "L": 35.57 - }, - "id": 4083, - "result_dir": "/tmp/paramer/simulation/4083" - }, - { - "parameters": { - "W": 67.07, - "L": 37.35 - }, - "id": 4084, - "result_dir": "/tmp/paramer/simulation/4084" - }, - { - "parameters": { - "W": 67.07, - "L": 39.22 - }, - "id": 4085, - "result_dir": "/tmp/paramer/simulation/4085" - }, - { - "parameters": { - "W": 67.07, - "L": 41.18 - }, - "id": 4086, - "result_dir": "/tmp/paramer/simulation/4086" - }, - { - "parameters": { - "W": 67.07, - "L": 43.24 - }, - "id": 4087, - "result_dir": "/tmp/paramer/simulation/4087" - }, - { - "parameters": { - "W": 67.07, - "L": 45.4 - }, - "id": 4088, - "result_dir": "/tmp/paramer/simulation/4088" - }, - { - "parameters": { - "W": 67.07, - "L": 47.67 - }, - "id": 4089, - "result_dir": "/tmp/paramer/simulation/4089" - }, - { - "parameters": { - "W": 67.07, - "L": 50.05 - }, - "id": 4090, - "result_dir": "/tmp/paramer/simulation/4090" - }, - { - "parameters": { - "W": 67.07, - "L": 52.55 - }, - "id": 4091, - "result_dir": "/tmp/paramer/simulation/4091" - }, - { - "parameters": { - "W": 67.07, - "L": 55.18 - }, - "id": 4092, - "result_dir": "/tmp/paramer/simulation/4092" - }, - { - "parameters": { - "W": 67.07, - "L": 57.94 - }, - "id": 4093, - "result_dir": "/tmp/paramer/simulation/4093" - }, - { - "parameters": { - "W": 67.07, - "L": 60.84 - }, - "id": 4094, - "result_dir": "/tmp/paramer/simulation/4094" - }, - { - "parameters": { - "W": 67.07, - "L": 63.88 - }, - "id": 4095, - "result_dir": "/tmp/paramer/simulation/4095" - }, - { - "parameters": { - "W": 67.07, - "L": 67.07 - }, - "id": 4096, - "result_dir": "/tmp/paramer/simulation/4096" - }, - { - "parameters": { - "W": 67.07, - "L": 70.42 - }, - "id": 4097, - "result_dir": "/tmp/paramer/simulation/4097" - }, - { - "parameters": { - "W": 67.07, - "L": 73.94 - }, - "id": 4098, - "result_dir": "/tmp/paramer/simulation/4098" - }, - { - "parameters": { - "W": 67.07, - "L": 77.64 - }, - "id": 4099, - "result_dir": "/tmp/paramer/simulation/4099" - }, - { - "parameters": { - "W": 67.07, - "L": 81.52 - }, - "id": 4100, - "result_dir": "/tmp/paramer/simulation/4100" - }, - { - "parameters": { - "W": 67.07, - "L": 85.6 - }, - "id": 4101, - "result_dir": "/tmp/paramer/simulation/4101" - }, - { - "parameters": { - "W": 67.07, - "L": 89.88 - }, - "id": 4102, - "result_dir": "/tmp/paramer/simulation/4102" - }, - { - "parameters": { - "W": 67.07, - "L": 94.37 - }, - "id": 4103, - "result_dir": "/tmp/paramer/simulation/4103" - }, - { - "parameters": { - "W": 67.07, - "L": 99.09 - }, - "id": 4104, - "result_dir": "/tmp/paramer/simulation/4104" - }, - { - "parameters": { - "W": 70.42, - "L": 15.52 - }, - "id": 4114, - "result_dir": "/tmp/paramer/simulation/4114" - }, - { - "parameters": { - "W": 70.42, - "L": 16.3 - }, - "id": 4115, - "result_dir": "/tmp/paramer/simulation/4115" - }, - { - "parameters": { - "W": 70.42, - "L": 17.12 - }, - "id": 4116, - "result_dir": "/tmp/paramer/simulation/4116" - }, - { - "parameters": { - "W": 70.42, - "L": 17.98 - }, - "id": 4117, - "result_dir": "/tmp/paramer/simulation/4117" - }, - { - "parameters": { - "W": 70.42, - "L": 18.88 - }, - "id": 4118, - "result_dir": "/tmp/paramer/simulation/4118" - }, - { - "parameters": { - "W": 70.42, - "L": 19.82 - }, - "id": 4119, - "result_dir": "/tmp/paramer/simulation/4119" - }, - { - "parameters": { - "W": 70.42, - "L": 20.81 - }, - "id": 4120, - "result_dir": "/tmp/paramer/simulation/4120" - }, - { - "parameters": { - "W": 70.42, - "L": 21.85 - }, - "id": 4121, - "result_dir": "/tmp/paramer/simulation/4121" - }, - { - "parameters": { - "W": 70.42, - "L": 22.94 - }, - "id": 4122, - "result_dir": "/tmp/paramer/simulation/4122" - }, - { - "parameters": { - "W": 70.42, - "L": 24.09 - }, - "id": 4123, - "result_dir": "/tmp/paramer/simulation/4123" - }, - { - "parameters": { - "W": 70.42, - "L": 25.29 - }, - "id": 4124, - "result_dir": "/tmp/paramer/simulation/4124" - }, - { - "parameters": { - "W": 70.42, - "L": 26.55 - }, - "id": 4125, - "result_dir": "/tmp/paramer/simulation/4125" - }, - { - "parameters": { - "W": 70.42, - "L": 27.88 - }, - "id": 4126, - "result_dir": "/tmp/paramer/simulation/4126" - }, - { - "parameters": { - "W": 70.42, - "L": 29.27 - }, - "id": 4127, - "result_dir": "/tmp/paramer/simulation/4127" - }, - { - "parameters": { - "W": 70.42, - "L": 30.73 - }, - "id": 4128, - "result_dir": "/tmp/paramer/simulation/4128" - }, - { - "parameters": { - "W": 70.42, - "L": 32.27 - }, - "id": 4129, - "result_dir": "/tmp/paramer/simulation/4129" - }, - { - "parameters": { - "W": 70.42, - "L": 33.88 - }, - "id": 4130, - "result_dir": "/tmp/paramer/simulation/4130" - }, - { - "parameters": { - "W": 70.42, - "L": 35.57 - }, - "id": 4131, - "result_dir": "/tmp/paramer/simulation/4131" - }, - { - "parameters": { - "W": 70.42, - "L": 37.35 - }, - "id": 4132, - "result_dir": "/tmp/paramer/simulation/4132" - }, - { - "parameters": { - "W": 70.42, - "L": 39.22 - }, - "id": 4133, - "result_dir": "/tmp/paramer/simulation/4133" - }, - { - "parameters": { - "W": 70.42, - "L": 41.18 - }, - "id": 4134, - "result_dir": "/tmp/paramer/simulation/4134" - }, - { - "parameters": { - "W": 70.42, - "L": 43.24 - }, - "id": 4135, - "result_dir": "/tmp/paramer/simulation/4135" - }, - { - "parameters": { - "W": 70.42, - "L": 45.4 - }, - "id": 4136, - "result_dir": "/tmp/paramer/simulation/4136" - }, - { - "parameters": { - "W": 70.42, - "L": 47.67 - }, - "id": 4137, - "result_dir": "/tmp/paramer/simulation/4137" - }, - { - "parameters": { - "W": 70.42, - "L": 50.05 - }, - "id": 4138, - "result_dir": "/tmp/paramer/simulation/4138" - }, - { - "parameters": { - "W": 70.42, - "L": 52.55 - }, - "id": 4139, - "result_dir": "/tmp/paramer/simulation/4139" - }, - { - "parameters": { - "W": 70.42, - "L": 55.18 - }, - "id": 4140, - "result_dir": "/tmp/paramer/simulation/4140" - }, - { - "parameters": { - "W": 70.42, - "L": 57.94 - }, - "id": 4141, - "result_dir": "/tmp/paramer/simulation/4141" - }, - { - "parameters": { - "W": 70.42, - "L": 60.84 - }, - "id": 4142, - "result_dir": "/tmp/paramer/simulation/4142" - }, - { - "parameters": { - "W": 70.42, - "L": 63.88 - }, - "id": 4143, - "result_dir": "/tmp/paramer/simulation/4143" - }, - { - "parameters": { - "W": 70.42, - "L": 67.07 - }, - "id": 4144, - "result_dir": "/tmp/paramer/simulation/4144" - }, - { - "parameters": { - "W": 70.42, - "L": 70.42 - }, - "id": 4145, - "result_dir": "/tmp/paramer/simulation/4145" - }, - { - "parameters": { - "W": 70.42, - "L": 73.94 - }, - "id": 4146, - "result_dir": "/tmp/paramer/simulation/4146" - }, - { - "parameters": { - "W": 70.42, - "L": 77.64 - }, - "id": 4147, - "result_dir": "/tmp/paramer/simulation/4147" - }, - { - "parameters": { - "W": 70.42, - "L": 81.52 - }, - "id": 4148, - "result_dir": "/tmp/paramer/simulation/4148" - }, - { - "parameters": { - "W": 70.42, - "L": 85.6 - }, - "id": 4149, - "result_dir": "/tmp/paramer/simulation/4149" - }, - { - "parameters": { - "W": 70.42, - "L": 89.88 - }, - "id": 4150, - "result_dir": "/tmp/paramer/simulation/4150" - }, - { - "parameters": { - "W": 70.42, - "L": 94.37 - }, - "id": 4151, - "result_dir": "/tmp/paramer/simulation/4151" - }, - { - "parameters": { - "W": 70.42, - "L": 99.09 - }, - "id": 4152, - "result_dir": "/tmp/paramer/simulation/4152" - }, - { - "parameters": { - "W": 73.94, - "L": 15.52 - }, - "id": 4162, - "result_dir": "/tmp/paramer/simulation/4162" - }, - { - "parameters": { - "W": 73.94, - "L": 16.3 - }, - "id": 4163, - "result_dir": "/tmp/paramer/simulation/4163" - }, - { - "parameters": { - "W": 73.94, - "L": 17.12 - }, - "id": 4164, - "result_dir": "/tmp/paramer/simulation/4164" - }, - { - "parameters": { - "W": 73.94, - "L": 17.98 - }, - "id": 4165, - "result_dir": "/tmp/paramer/simulation/4165" - }, - { - "parameters": { - "W": 73.94, - "L": 18.88 - }, - "id": 4166, - "result_dir": "/tmp/paramer/simulation/4166" - }, - { - "parameters": { - "W": 73.94, - "L": 19.82 - }, - "id": 4167, - "result_dir": "/tmp/paramer/simulation/4167" - }, - { - "parameters": { - "W": 73.94, - "L": 20.81 - }, - "id": 4168, - "result_dir": "/tmp/paramer/simulation/4168" - }, - { - "parameters": { - "W": 73.94, - "L": 21.85 - }, - "id": 4169, - "result_dir": "/tmp/paramer/simulation/4169" - }, - { - "parameters": { - "W": 73.94, - "L": 22.94 - }, - "id": 4170, - "result_dir": "/tmp/paramer/simulation/4170" - }, - { - "parameters": { - "W": 73.94, - "L": 24.09 - }, - "id": 4171, - "result_dir": "/tmp/paramer/simulation/4171" - }, - { - "parameters": { - "W": 73.94, - "L": 25.29 - }, - "id": 4172, - "result_dir": "/tmp/paramer/simulation/4172" - }, - { - "parameters": { - "W": 73.94, - "L": 26.55 - }, - "id": 4173, - "result_dir": "/tmp/paramer/simulation/4173" - }, - { - "parameters": { - "W": 73.94, - "L": 27.88 - }, - "id": 4174, - "result_dir": "/tmp/paramer/simulation/4174" - }, - { - "parameters": { - "W": 73.94, - "L": 29.27 - }, - "id": 4175, - "result_dir": "/tmp/paramer/simulation/4175" - }, - { - "parameters": { - "W": 73.94, - "L": 30.73 - }, - "id": 4176, - "result_dir": "/tmp/paramer/simulation/4176" - }, - { - "parameters": { - "W": 73.94, - "L": 32.27 - }, - "id": 4177, - "result_dir": "/tmp/paramer/simulation/4177" - }, - { - "parameters": { - "W": 73.94, - "L": 33.88 - }, - "id": 4178, - "result_dir": "/tmp/paramer/simulation/4178" - }, - { - "parameters": { - "W": 73.94, - "L": 35.57 - }, - "id": 4179, - "result_dir": "/tmp/paramer/simulation/4179" - }, - { - "parameters": { - "W": 73.94, - "L": 37.35 - }, - "id": 4180, - "result_dir": "/tmp/paramer/simulation/4180" - }, - { - "parameters": { - "W": 73.94, - "L": 39.22 - }, - "id": 4181, - "result_dir": "/tmp/paramer/simulation/4181" - }, - { - "parameters": { - "W": 73.94, - "L": 41.18 - }, - "id": 4182, - "result_dir": "/tmp/paramer/simulation/4182" - }, - { - "parameters": { - "W": 73.94, - "L": 43.24 - }, - "id": 4183, - "result_dir": "/tmp/paramer/simulation/4183" - }, - { - "parameters": { - "W": 73.94, - "L": 45.4 - }, - "id": 4184, - "result_dir": "/tmp/paramer/simulation/4184" - }, - { - "parameters": { - "W": 73.94, - "L": 47.67 - }, - "id": 4185, - "result_dir": "/tmp/paramer/simulation/4185" - }, - { - "parameters": { - "W": 73.94, - "L": 50.05 - }, - "id": 4186, - "result_dir": "/tmp/paramer/simulation/4186" - }, - { - "parameters": { - "W": 73.94, - "L": 52.55 - }, - "id": 4187, - "result_dir": "/tmp/paramer/simulation/4187" - }, - { - "parameters": { - "W": 73.94, - "L": 55.18 - }, - "id": 4188, - "result_dir": "/tmp/paramer/simulation/4188" - }, - { - "parameters": { - "W": 73.94, - "L": 57.94 - }, - "id": 4189, - "result_dir": "/tmp/paramer/simulation/4189" - }, - { - "parameters": { - "W": 73.94, - "L": 60.84 - }, - "id": 4190, - "result_dir": "/tmp/paramer/simulation/4190" - }, - { - "parameters": { - "W": 73.94, - "L": 63.88 - }, - "id": 4191, - "result_dir": "/tmp/paramer/simulation/4191" - }, - { - "parameters": { - "W": 73.94, - "L": 67.07 - }, - "id": 4192, - "result_dir": "/tmp/paramer/simulation/4192" - }, - { - "parameters": { - "W": 73.94, - "L": 70.42 - }, - "id": 4193, - "result_dir": "/tmp/paramer/simulation/4193" - }, - { - "parameters": { - "W": 73.94, - "L": 73.94 - }, - "id": 4194, - "result_dir": "/tmp/paramer/simulation/4194" - }, - { - "parameters": { - "W": 73.94, - "L": 77.64 - }, - "id": 4195, - "result_dir": "/tmp/paramer/simulation/4195" - }, - { - "parameters": { - "W": 73.94, - "L": 81.52 - }, - "id": 4196, - "result_dir": "/tmp/paramer/simulation/4196" - }, - { - "parameters": { - "W": 73.94, - "L": 85.6 - }, - "id": 4197, - "result_dir": "/tmp/paramer/simulation/4197" - }, - { - "parameters": { - "W": 73.94, - "L": 89.88 - }, - "id": 4198, - "result_dir": "/tmp/paramer/simulation/4198" - }, - { - "parameters": { - "W": 73.94, - "L": 94.37 - }, - "id": 4199, - "result_dir": "/tmp/paramer/simulation/4199" - }, - { - "parameters": { - "W": 73.94, - "L": 99.09 - }, - "id": 4200, - "result_dir": "/tmp/paramer/simulation/4200" - }, - { - "parameters": { - "W": 77.64, - "L": 15.52 - }, - "id": 4210, - "result_dir": "/tmp/paramer/simulation/4210" - }, - { - "parameters": { - "W": 77.64, - "L": 16.3 - }, - "id": 4211, - "result_dir": "/tmp/paramer/simulation/4211" - }, - { - "parameters": { - "W": 77.64, - "L": 17.12 - }, - "id": 4212, - "result_dir": "/tmp/paramer/simulation/4212" - }, - { - "parameters": { - "W": 77.64, - "L": 17.98 - }, - "id": 4213, - "result_dir": "/tmp/paramer/simulation/4213" - }, - { - "parameters": { - "W": 77.64, - "L": 18.88 - }, - "id": 4214, - "result_dir": "/tmp/paramer/simulation/4214" - }, - { - "parameters": { - "W": 77.64, - "L": 19.82 - }, - "id": 4215, - "result_dir": "/tmp/paramer/simulation/4215" - }, - { - "parameters": { - "W": 77.64, - "L": 20.81 - }, - "id": 4216, - "result_dir": "/tmp/paramer/simulation/4216" - }, - { - "parameters": { - "W": 77.64, - "L": 21.85 - }, - "id": 4217, - "result_dir": "/tmp/paramer/simulation/4217" - }, - { - "parameters": { - "W": 77.64, - "L": 22.94 - }, - "id": 4218, - "result_dir": "/tmp/paramer/simulation/4218" - }, - { - "parameters": { - "W": 77.64, - "L": 24.09 - }, - "id": 4219, - "result_dir": "/tmp/paramer/simulation/4219" - }, - { - "parameters": { - "W": 77.64, - "L": 25.29 - }, - "id": 4220, - "result_dir": "/tmp/paramer/simulation/4220" - }, - { - "parameters": { - "W": 77.64, - "L": 26.55 - }, - "id": 4221, - "result_dir": "/tmp/paramer/simulation/4221" - }, - { - "parameters": { - "W": 77.64, - "L": 27.88 - }, - "id": 4222, - "result_dir": "/tmp/paramer/simulation/4222" - }, - { - "parameters": { - "W": 77.64, - "L": 29.27 - }, - "id": 4223, - "result_dir": "/tmp/paramer/simulation/4223" - }, - { - "parameters": { - "W": 77.64, - "L": 30.73 - }, - "id": 4224, - "result_dir": "/tmp/paramer/simulation/4224" - }, - { - "parameters": { - "W": 77.64, - "L": 32.27 - }, - "id": 4225, - "result_dir": "/tmp/paramer/simulation/4225" - }, - { - "parameters": { - "W": 77.64, - "L": 33.88 - }, - "id": 4226, - "result_dir": "/tmp/paramer/simulation/4226" - }, - { - "parameters": { - "W": 77.64, - "L": 35.57 - }, - "id": 4227, - "result_dir": "/tmp/paramer/simulation/4227" - }, - { - "parameters": { - "W": 77.64, - "L": 37.35 - }, - "id": 4228, - "result_dir": "/tmp/paramer/simulation/4228" - }, - { - "parameters": { - "W": 77.64, - "L": 39.22 - }, - "id": 4229, - "result_dir": "/tmp/paramer/simulation/4229" - }, - { - "parameters": { - "W": 77.64, - "L": 41.18 - }, - "id": 4230, - "result_dir": "/tmp/paramer/simulation/4230" - }, - { - "parameters": { - "W": 77.64, - "L": 43.24 - }, - "id": 4231, - "result_dir": "/tmp/paramer/simulation/4231" - }, - { - "parameters": { - "W": 77.64, - "L": 45.4 - }, - "id": 4232, - "result_dir": "/tmp/paramer/simulation/4232" - }, - { - "parameters": { - "W": 77.64, - "L": 47.67 - }, - "id": 4233, - "result_dir": "/tmp/paramer/simulation/4233" - }, - { - "parameters": { - "W": 77.64, - "L": 50.05 - }, - "id": 4234, - "result_dir": "/tmp/paramer/simulation/4234" - }, - { - "parameters": { - "W": 77.64, - "L": 52.55 - }, - "id": 4235, - "result_dir": "/tmp/paramer/simulation/4235" - }, - { - "parameters": { - "W": 77.64, - "L": 55.18 - }, - "id": 4236, - "result_dir": "/tmp/paramer/simulation/4236" - }, - { - "parameters": { - "W": 77.64, - "L": 57.94 - }, - "id": 4237, - "result_dir": "/tmp/paramer/simulation/4237" - }, - { - "parameters": { - "W": 77.64, - "L": 60.84 - }, - "id": 4238, - "result_dir": "/tmp/paramer/simulation/4238" - }, - { - "parameters": { - "W": 77.64, - "L": 63.88 - }, - "id": 4239, - "result_dir": "/tmp/paramer/simulation/4239" - }, - { - "parameters": { - "W": 77.64, - "L": 67.07 - }, - "id": 4240, - "result_dir": "/tmp/paramer/simulation/4240" - }, - { - "parameters": { - "W": 77.64, - "L": 70.42 - }, - "id": 4241, - "result_dir": "/tmp/paramer/simulation/4241" - }, - { - "parameters": { - "W": 77.64, - "L": 73.94 - }, - "id": 4242, - "result_dir": "/tmp/paramer/simulation/4242" - }, - { - "parameters": { - "W": 77.64, - "L": 77.64 - }, - "id": 4243, - "result_dir": "/tmp/paramer/simulation/4243" - }, - { - "parameters": { - "W": 77.64, - "L": 81.52 - }, - "id": 4244, - "result_dir": "/tmp/paramer/simulation/4244" - }, - { - "parameters": { - "W": 77.64, - "L": 85.6 - }, - "id": 4245, - "result_dir": "/tmp/paramer/simulation/4245" - }, - { - "parameters": { - "W": 77.64, - "L": 89.88 - }, - "id": 4246, - "result_dir": "/tmp/paramer/simulation/4246" - }, - { - "parameters": { - "W": 77.64, - "L": 94.37 - }, - "id": 4247, - "result_dir": "/tmp/paramer/simulation/4247" - }, - { - "parameters": { - "W": 77.64, - "L": 99.09 - }, - "id": 4248, - "result_dir": "/tmp/paramer/simulation/4248" - }, - { - "parameters": { - "W": 81.52, - "L": 15.52 - }, - "id": 4258, - "result_dir": "/tmp/paramer/simulation/4258" - }, - { - "parameters": { - "W": 81.52, - "L": 16.3 - }, - "id": 4259, - "result_dir": "/tmp/paramer/simulation/4259" - }, - { - "parameters": { - "W": 81.52, - "L": 17.12 - }, - "id": 4260, - "result_dir": "/tmp/paramer/simulation/4260" - }, - { - "parameters": { - "W": 81.52, - "L": 17.98 - }, - "id": 4261, - "result_dir": "/tmp/paramer/simulation/4261" - }, - { - "parameters": { - "W": 81.52, - "L": 18.88 - }, - "id": 4262, - "result_dir": "/tmp/paramer/simulation/4262" - }, - { - "parameters": { - "W": 81.52, - "L": 19.82 - }, - "id": 4263, - "result_dir": "/tmp/paramer/simulation/4263" - }, - { - "parameters": { - "W": 81.52, - "L": 20.81 - }, - "id": 4264, - "result_dir": "/tmp/paramer/simulation/4264" - }, - { - "parameters": { - "W": 81.52, - "L": 21.85 - }, - "id": 4265, - "result_dir": "/tmp/paramer/simulation/4265" - }, - { - "parameters": { - "W": 81.52, - "L": 22.94 - }, - "id": 4266, - "result_dir": "/tmp/paramer/simulation/4266" - }, - { - "parameters": { - "W": 81.52, - "L": 24.09 - }, - "id": 4267, - "result_dir": "/tmp/paramer/simulation/4267" - }, - { - "parameters": { - "W": 81.52, - "L": 25.29 - }, - "id": 4268, - "result_dir": "/tmp/paramer/simulation/4268" - }, - { - "parameters": { - "W": 81.52, - "L": 26.55 - }, - "id": 4269, - "result_dir": "/tmp/paramer/simulation/4269" - }, - { - "parameters": { - "W": 81.52, - "L": 27.88 - }, - "id": 4270, - "result_dir": "/tmp/paramer/simulation/4270" - }, - { - "parameters": { - "W": 81.52, - "L": 29.27 - }, - "id": 4271, - "result_dir": "/tmp/paramer/simulation/4271" - }, - { - "parameters": { - "W": 81.52, - "L": 30.73 - }, - "id": 4272, - "result_dir": "/tmp/paramer/simulation/4272" - }, - { - "parameters": { - "W": 81.52, - "L": 32.27 - }, - "id": 4273, - "result_dir": "/tmp/paramer/simulation/4273" - }, - { - "parameters": { - "W": 81.52, - "L": 33.88 - }, - "id": 4274, - "result_dir": "/tmp/paramer/simulation/4274" - }, - { - "parameters": { - "W": 81.52, - "L": 35.57 - }, - "id": 4275, - "result_dir": "/tmp/paramer/simulation/4275" - }, - { - "parameters": { - "W": 81.52, - "L": 37.35 - }, - "id": 4276, - "result_dir": "/tmp/paramer/simulation/4276" - }, - { - "parameters": { - "W": 81.52, - "L": 39.22 - }, - "id": 4277, - "result_dir": "/tmp/paramer/simulation/4277" - }, - { - "parameters": { - "W": 81.52, - "L": 41.18 - }, - "id": 4278, - "result_dir": "/tmp/paramer/simulation/4278" - }, - { - "parameters": { - "W": 81.52, - "L": 43.24 - }, - "id": 4279, - "result_dir": "/tmp/paramer/simulation/4279" - }, - { - "parameters": { - "W": 81.52, - "L": 45.4 - }, - "id": 4280, - "result_dir": "/tmp/paramer/simulation/4280" - }, - { - "parameters": { - "W": 81.52, - "L": 47.67 - }, - "id": 4281, - "result_dir": "/tmp/paramer/simulation/4281" - }, - { - "parameters": { - "W": 81.52, - "L": 50.05 - }, - "id": 4282, - "result_dir": "/tmp/paramer/simulation/4282" - }, - { - "parameters": { - "W": 81.52, - "L": 52.55 - }, - "id": 4283, - "result_dir": "/tmp/paramer/simulation/4283" - }, - { - "parameters": { - "W": 81.52, - "L": 55.18 - }, - "id": 4284, - "result_dir": "/tmp/paramer/simulation/4284" - }, - { - "parameters": { - "W": 81.52, - "L": 57.94 - }, - "id": 4285, - "result_dir": "/tmp/paramer/simulation/4285" - }, - { - "parameters": { - "W": 81.52, - "L": 60.84 - }, - "id": 4286, - "result_dir": "/tmp/paramer/simulation/4286" - }, - { - "parameters": { - "W": 81.52, - "L": 63.88 - }, - "id": 4287, - "result_dir": "/tmp/paramer/simulation/4287" - }, - { - "parameters": { - "W": 81.52, - "L": 67.07 - }, - "id": 4288, - "result_dir": "/tmp/paramer/simulation/4288" - }, - { - "parameters": { - "W": 81.52, - "L": 70.42 - }, - "id": 4289, - "result_dir": "/tmp/paramer/simulation/4289" - }, - { - "parameters": { - "W": 81.52, - "L": 73.94 - }, - "id": 4290, - "result_dir": "/tmp/paramer/simulation/4290" - }, - { - "parameters": { - "W": 81.52, - "L": 77.64 - }, - "id": 4291, - "result_dir": "/tmp/paramer/simulation/4291" - }, - { - "parameters": { - "W": 81.52, - "L": 81.52 - }, - "id": 4292, - "result_dir": "/tmp/paramer/simulation/4292" - }, - { - "parameters": { - "W": 81.52, - "L": 85.6 - }, - "id": 4293, - "result_dir": "/tmp/paramer/simulation/4293" - }, - { - "parameters": { - "W": 81.52, - "L": 89.88 - }, - "id": 4294, - "result_dir": "/tmp/paramer/simulation/4294" - }, - { - "parameters": { - "W": 81.52, - "L": 94.37 - }, - "id": 4295, - "result_dir": "/tmp/paramer/simulation/4295" - }, - { - "parameters": { - "W": 81.52, - "L": 99.09 - }, - "id": 4296, - "result_dir": "/tmp/paramer/simulation/4296" - }, - { - "parameters": { - "W": 85.6, - "L": 15.52 - }, - "id": 4306, - "result_dir": "/tmp/paramer/simulation/4306" - }, - { - "parameters": { - "W": 85.6, - "L": 16.3 - }, - "id": 4307, - "result_dir": "/tmp/paramer/simulation/4307" - }, - { - "parameters": { - "W": 85.6, - "L": 17.12 - }, - "id": 4308, - "result_dir": "/tmp/paramer/simulation/4308" - }, - { - "parameters": { - "W": 85.6, - "L": 17.98 - }, - "id": 4309, - "result_dir": "/tmp/paramer/simulation/4309" - }, - { - "parameters": { - "W": 85.6, - "L": 18.88 - }, - "id": 4310, - "result_dir": "/tmp/paramer/simulation/4310" - }, - { - "parameters": { - "W": 85.6, - "L": 19.82 - }, - "id": 4311, - "result_dir": "/tmp/paramer/simulation/4311" - }, - { - "parameters": { - "W": 85.6, - "L": 20.81 - }, - "id": 4312, - "result_dir": "/tmp/paramer/simulation/4312" - }, - { - "parameters": { - "W": 85.6, - "L": 21.85 - }, - "id": 4313, - "result_dir": "/tmp/paramer/simulation/4313" - }, - { - "parameters": { - "W": 85.6, - "L": 22.94 - }, - "id": 4314, - "result_dir": "/tmp/paramer/simulation/4314" - }, - { - "parameters": { - "W": 85.6, - "L": 24.09 - }, - "id": 4315, - "result_dir": "/tmp/paramer/simulation/4315" - }, - { - "parameters": { - "W": 85.6, - "L": 25.29 - }, - "id": 4316, - "result_dir": "/tmp/paramer/simulation/4316" - }, - { - "parameters": { - "W": 85.6, - "L": 26.55 - }, - "id": 4317, - "result_dir": "/tmp/paramer/simulation/4317" - }, - { - "parameters": { - "W": 85.6, - "L": 27.88 - }, - "id": 4318, - "result_dir": "/tmp/paramer/simulation/4318" - }, - { - "parameters": { - "W": 85.6, - "L": 29.27 - }, - "id": 4319, - "result_dir": "/tmp/paramer/simulation/4319" - }, - { - "parameters": { - "W": 85.6, - "L": 30.73 - }, - "id": 4320, - "result_dir": "/tmp/paramer/simulation/4320" - }, - { - "parameters": { - "W": 85.6, - "L": 32.27 - }, - "id": 4321, - "result_dir": "/tmp/paramer/simulation/4321" - }, - { - "parameters": { - "W": 85.6, - "L": 33.88 - }, - "id": 4322, - "result_dir": "/tmp/paramer/simulation/4322" - }, - { - "parameters": { - "W": 85.6, - "L": 35.57 - }, - "id": 4323, - "result_dir": "/tmp/paramer/simulation/4323" - }, - { - "parameters": { - "W": 85.6, - "L": 37.35 - }, - "id": 4324, - "result_dir": "/tmp/paramer/simulation/4324" - }, - { - "parameters": { - "W": 85.6, - "L": 39.22 - }, - "id": 4325, - "result_dir": "/tmp/paramer/simulation/4325" - }, - { - "parameters": { - "W": 85.6, - "L": 41.18 - }, - "id": 4326, - "result_dir": "/tmp/paramer/simulation/4326" - }, - { - "parameters": { - "W": 85.6, - "L": 43.24 - }, - "id": 4327, - "result_dir": "/tmp/paramer/simulation/4327" - }, - { - "parameters": { - "W": 85.6, - "L": 45.4 - }, - "id": 4328, - "result_dir": "/tmp/paramer/simulation/4328" - }, - { - "parameters": { - "W": 85.6, - "L": 47.67 - }, - "id": 4329, - "result_dir": "/tmp/paramer/simulation/4329" - }, - { - "parameters": { - "W": 85.6, - "L": 50.05 - }, - "id": 4330, - "result_dir": "/tmp/paramer/simulation/4330" - }, - { - "parameters": { - "W": 85.6, - "L": 52.55 - }, - "id": 4331, - "result_dir": "/tmp/paramer/simulation/4331" - }, - { - "parameters": { - "W": 85.6, - "L": 55.18 - }, - "id": 4332, - "result_dir": "/tmp/paramer/simulation/4332" - }, - { - "parameters": { - "W": 85.6, - "L": 57.94 - }, - "id": 4333, - "result_dir": "/tmp/paramer/simulation/4333" - }, - { - "parameters": { - "W": 85.6, - "L": 60.84 - }, - "id": 4334, - "result_dir": "/tmp/paramer/simulation/4334" - }, - { - "parameters": { - "W": 85.6, - "L": 63.88 - }, - "id": 4335, - "result_dir": "/tmp/paramer/simulation/4335" - }, - { - "parameters": { - "W": 85.6, - "L": 67.07 - }, - "id": 4336, - "result_dir": "/tmp/paramer/simulation/4336" - }, - { - "parameters": { - "W": 85.6, - "L": 70.42 - }, - "id": 4337, - "result_dir": "/tmp/paramer/simulation/4337" - }, - { - "parameters": { - "W": 85.6, - "L": 73.94 - }, - "id": 4338, - "result_dir": "/tmp/paramer/simulation/4338" - }, - { - "parameters": { - "W": 85.6, - "L": 77.64 - }, - "id": 4339, - "result_dir": "/tmp/paramer/simulation/4339" - }, - { - "parameters": { - "W": 85.6, - "L": 81.52 - }, - "id": 4340, - "result_dir": "/tmp/paramer/simulation/4340" - }, - { - "parameters": { - "W": 85.6, - "L": 85.6 - }, - "id": 4341, - "result_dir": "/tmp/paramer/simulation/4341" - }, - { - "parameters": { - "W": 85.6, - "L": 89.88 - }, - "id": 4342, - "result_dir": "/tmp/paramer/simulation/4342" - }, - { - "parameters": { - "W": 85.6, - "L": 94.37 - }, - "id": 4343, - "result_dir": "/tmp/paramer/simulation/4343" - }, - { - "parameters": { - "W": 85.6, - "L": 99.09 - }, - "id": 4344, - "result_dir": "/tmp/paramer/simulation/4344" - }, - { - "parameters": { - "W": 89.88, - "L": 15.52 - }, - "id": 4354, - "result_dir": "/tmp/paramer/simulation/4354" - }, - { - "parameters": { - "W": 89.88, - "L": 16.3 - }, - "id": 4355, - "result_dir": "/tmp/paramer/simulation/4355" - }, - { - "parameters": { - "W": 89.88, - "L": 17.12 - }, - "id": 4356, - "result_dir": "/tmp/paramer/simulation/4356" - }, - { - "parameters": { - "W": 89.88, - "L": 17.98 - }, - "id": 4357, - "result_dir": "/tmp/paramer/simulation/4357" - }, - { - "parameters": { - "W": 89.88, - "L": 18.88 - }, - "id": 4358, - "result_dir": "/tmp/paramer/simulation/4358" - }, - { - "parameters": { - "W": 89.88, - "L": 19.82 - }, - "id": 4359, - "result_dir": "/tmp/paramer/simulation/4359" - }, - { - "parameters": { - "W": 89.88, - "L": 20.81 - }, - "id": 4360, - "result_dir": "/tmp/paramer/simulation/4360" - }, - { - "parameters": { - "W": 89.88, - "L": 21.85 - }, - "id": 4361, - "result_dir": "/tmp/paramer/simulation/4361" - }, - { - "parameters": { - "W": 89.88, - "L": 22.94 - }, - "id": 4362, - "result_dir": "/tmp/paramer/simulation/4362" - }, - { - "parameters": { - "W": 89.88, - "L": 24.09 - }, - "id": 4363, - "result_dir": "/tmp/paramer/simulation/4363" - }, - { - "parameters": { - "W": 89.88, - "L": 25.29 - }, - "id": 4364, - "result_dir": "/tmp/paramer/simulation/4364" - }, - { - "parameters": { - "W": 89.88, - "L": 26.55 - }, - "id": 4365, - "result_dir": "/tmp/paramer/simulation/4365" - }, - { - "parameters": { - "W": 89.88, - "L": 27.88 - }, - "id": 4366, - "result_dir": "/tmp/paramer/simulation/4366" - }, - { - "parameters": { - "W": 89.88, - "L": 29.27 - }, - "id": 4367, - "result_dir": "/tmp/paramer/simulation/4367" - }, - { - "parameters": { - "W": 89.88, - "L": 30.73 - }, - "id": 4368, - "result_dir": "/tmp/paramer/simulation/4368" - }, - { - "parameters": { - "W": 89.88, - "L": 32.27 - }, - "id": 4369, - "result_dir": "/tmp/paramer/simulation/4369" - }, - { - "parameters": { - "W": 89.88, - "L": 33.88 - }, - "id": 4370, - "result_dir": "/tmp/paramer/simulation/4370" - }, - { - "parameters": { - "W": 89.88, - "L": 35.57 - }, - "id": 4371, - "result_dir": "/tmp/paramer/simulation/4371" - }, - { - "parameters": { - "W": 89.88, - "L": 37.35 - }, - "id": 4372, - "result_dir": "/tmp/paramer/simulation/4372" - }, - { - "parameters": { - "W": 89.88, - "L": 39.22 - }, - "id": 4373, - "result_dir": "/tmp/paramer/simulation/4373" - }, - { - "parameters": { - "W": 89.88, - "L": 41.18 - }, - "id": 4374, - "result_dir": "/tmp/paramer/simulation/4374" - }, - { - "parameters": { - "W": 89.88, - "L": 43.24 - }, - "id": 4375, - "result_dir": "/tmp/paramer/simulation/4375" - }, - { - "parameters": { - "W": 89.88, - "L": 45.4 - }, - "id": 4376, - "result_dir": "/tmp/paramer/simulation/4376" - }, - { - "parameters": { - "W": 89.88, - "L": 47.67 - }, - "id": 4377, - "result_dir": "/tmp/paramer/simulation/4377" - }, - { - "parameters": { - "W": 89.88, - "L": 50.05 - }, - "id": 4378, - "result_dir": "/tmp/paramer/simulation/4378" - }, - { - "parameters": { - "W": 89.88, - "L": 52.55 - }, - "id": 4379, - "result_dir": "/tmp/paramer/simulation/4379" - }, - { - "parameters": { - "W": 89.88, - "L": 55.18 - }, - "id": 4380, - "result_dir": "/tmp/paramer/simulation/4380" - }, - { - "parameters": { - "W": 89.88, - "L": 57.94 - }, - "id": 4381, - "result_dir": "/tmp/paramer/simulation/4381" - }, - { - "parameters": { - "W": 89.88, - "L": 60.84 - }, - "id": 4382, - "result_dir": "/tmp/paramer/simulation/4382" - }, - { - "parameters": { - "W": 89.88, - "L": 63.88 - }, - "id": 4383, - "result_dir": "/tmp/paramer/simulation/4383" - }, - { - "parameters": { - "W": 89.88, - "L": 67.07 - }, - "id": 4384, - "result_dir": "/tmp/paramer/simulation/4384" - }, - { - "parameters": { - "W": 89.88, - "L": 70.42 - }, - "id": 4385, - "result_dir": "/tmp/paramer/simulation/4385" - }, - { - "parameters": { - "W": 89.88, - "L": 73.94 - }, - "id": 4386, - "result_dir": "/tmp/paramer/simulation/4386" - }, - { - "parameters": { - "W": 89.88, - "L": 77.64 - }, - "id": 4387, - "result_dir": "/tmp/paramer/simulation/4387" - }, - { - "parameters": { - "W": 89.88, - "L": 81.52 - }, - "id": 4388, - "result_dir": "/tmp/paramer/simulation/4388" - }, - { - "parameters": { - "W": 89.88, - "L": 85.6 - }, - "id": 4389, - "result_dir": "/tmp/paramer/simulation/4389" - }, - { - "parameters": { - "W": 89.88, - "L": 89.88 - }, - "id": 4390, - "result_dir": "/tmp/paramer/simulation/4390" - }, - { - "parameters": { - "W": 89.88, - "L": 94.37 - }, - "id": 4391, - "result_dir": "/tmp/paramer/simulation/4391" - }, - { - "parameters": { - "W": 89.88, - "L": 99.09 - }, - "id": 4392, - "result_dir": "/tmp/paramer/simulation/4392" - }, - { - "parameters": { - "W": 94.37, - "L": 15.52 - }, - "id": 4402, - "result_dir": "/tmp/paramer/simulation/4402" - }, - { - "parameters": { - "W": 94.37, - "L": 16.3 - }, - "id": 4403, - "result_dir": "/tmp/paramer/simulation/4403" - }, - { - "parameters": { - "W": 94.37, - "L": 17.12 - }, - "id": 4404, - "result_dir": "/tmp/paramer/simulation/4404" - }, - { - "parameters": { - "W": 94.37, - "L": 17.98 - }, - "id": 4405, - "result_dir": "/tmp/paramer/simulation/4405" - }, - { - "parameters": { - "W": 94.37, - "L": 18.88 - }, - "id": 4406, - "result_dir": "/tmp/paramer/simulation/4406" - }, - { - "parameters": { - "W": 94.37, - "L": 19.82 - }, - "id": 4407, - "result_dir": "/tmp/paramer/simulation/4407" - }, - { - "parameters": { - "W": 94.37, - "L": 20.81 - }, - "id": 4408, - "result_dir": "/tmp/paramer/simulation/4408" - }, - { - "parameters": { - "W": 94.37, - "L": 21.85 - }, - "id": 4409, - "result_dir": "/tmp/paramer/simulation/4409" - }, - { - "parameters": { - "W": 94.37, - "L": 22.94 - }, - "id": 4410, - "result_dir": "/tmp/paramer/simulation/4410" - }, - { - "parameters": { - "W": 94.37, - "L": 24.09 - }, - "id": 4411, - "result_dir": "/tmp/paramer/simulation/4411" - }, - { - "parameters": { - "W": 94.37, - "L": 25.29 - }, - "id": 4412, - "result_dir": "/tmp/paramer/simulation/4412" - }, - { - "parameters": { - "W": 94.37, - "L": 26.55 - }, - "id": 4413, - "result_dir": "/tmp/paramer/simulation/4413" - }, - { - "parameters": { - "W": 94.37, - "L": 27.88 - }, - "id": 4414, - "result_dir": "/tmp/paramer/simulation/4414" - }, - { - "parameters": { - "W": 94.37, - "L": 29.27 - }, - "id": 4415, - "result_dir": "/tmp/paramer/simulation/4415" - }, - { - "parameters": { - "W": 94.37, - "L": 30.73 - }, - "id": 4416, - "result_dir": "/tmp/paramer/simulation/4416" - }, - { - "parameters": { - "W": 94.37, - "L": 32.27 - }, - "id": 4417, - "result_dir": "/tmp/paramer/simulation/4417" - }, - { - "parameters": { - "W": 94.37, - "L": 33.88 - }, - "id": 4418, - "result_dir": "/tmp/paramer/simulation/4418" - }, - { - "parameters": { - "W": 94.37, - "L": 35.57 - }, - "id": 4419, - "result_dir": "/tmp/paramer/simulation/4419" - }, - { - "parameters": { - "W": 94.37, - "L": 37.35 - }, - "id": 4420, - "result_dir": "/tmp/paramer/simulation/4420" - }, - { - "parameters": { - "W": 94.37, - "L": 39.22 - }, - "id": 4421, - "result_dir": "/tmp/paramer/simulation/4421" - }, - { - "parameters": { - "W": 94.37, - "L": 41.18 - }, - "id": 4422, - "result_dir": "/tmp/paramer/simulation/4422" - }, - { - "parameters": { - "W": 94.37, - "L": 43.24 - }, - "id": 4423, - "result_dir": "/tmp/paramer/simulation/4423" - }, - { - "parameters": { - "W": 94.37, - "L": 45.4 - }, - "id": 4424, - "result_dir": "/tmp/paramer/simulation/4424" - }, - { - "parameters": { - "W": 94.37, - "L": 47.67 - }, - "id": 4425, - "result_dir": "/tmp/paramer/simulation/4425" - }, - { - "parameters": { - "W": 94.37, - "L": 50.05 - }, - "id": 4426, - "result_dir": "/tmp/paramer/simulation/4426" - }, - { - "parameters": { - "W": 94.37, - "L": 52.55 - }, - "id": 4427, - "result_dir": "/tmp/paramer/simulation/4427" - }, - { - "parameters": { - "W": 94.37, - "L": 55.18 - }, - "id": 4428, - "result_dir": "/tmp/paramer/simulation/4428" - }, - { - "parameters": { - "W": 94.37, - "L": 57.94 - }, - "id": 4429, - "result_dir": "/tmp/paramer/simulation/4429" - }, - { - "parameters": { - "W": 94.37, - "L": 60.84 - }, - "id": 4430, - "result_dir": "/tmp/paramer/simulation/4430" - }, - { - "parameters": { - "W": 94.37, - "L": 63.88 - }, - "id": 4431, - "result_dir": "/tmp/paramer/simulation/4431" - }, - { - "parameters": { - "W": 94.37, - "L": 67.07 - }, - "id": 4432, - "result_dir": "/tmp/paramer/simulation/4432" - }, - { - "parameters": { - "W": 94.37, - "L": 70.42 - }, - "id": 4433, - "result_dir": "/tmp/paramer/simulation/4433" - }, - { - "parameters": { - "W": 94.37, - "L": 73.94 - }, - "id": 4434, - "result_dir": "/tmp/paramer/simulation/4434" - }, - { - "parameters": { - "W": 94.37, - "L": 77.64 - }, - "id": 4435, - "result_dir": "/tmp/paramer/simulation/4435" - }, - { - "parameters": { - "W": 94.37, - "L": 81.52 - }, - "id": 4436, - "result_dir": "/tmp/paramer/simulation/4436" - }, - { - "parameters": { - "W": 94.37, - "L": 85.6 - }, - "id": 4437, - "result_dir": "/tmp/paramer/simulation/4437" - }, - { - "parameters": { - "W": 94.37, - "L": 89.88 - }, - "id": 4438, - "result_dir": "/tmp/paramer/simulation/4438" - }, - { - "parameters": { - "W": 94.37, - "L": 94.37 - }, - "id": 4439, - "result_dir": "/tmp/paramer/simulation/4439" - }, - { - "parameters": { - "W": 94.37, - "L": 99.09 - }, - "id": 4440, - "result_dir": "/tmp/paramer/simulation/4440" - }, - { - "parameters": { - "W": 99.09, - "L": 15.52 - }, - "id": 4450, - "result_dir": "/tmp/paramer/simulation/4450" - }, - { - "parameters": { - "W": 99.09, - "L": 16.3 - }, - "id": 4451, - "result_dir": "/tmp/paramer/simulation/4451" - }, - { - "parameters": { - "W": 99.09, - "L": 17.12 - }, - "id": 4452, - "result_dir": "/tmp/paramer/simulation/4452" - }, - { - "parameters": { - "W": 99.09, - "L": 17.98 - }, - "id": 4453, - "result_dir": "/tmp/paramer/simulation/4453" - }, - { - "parameters": { - "W": 99.09, - "L": 18.88 - }, - "id": 4454, - "result_dir": "/tmp/paramer/simulation/4454" - }, - { - "parameters": { - "W": 99.09, - "L": 19.82 - }, - "id": 4455, - "result_dir": "/tmp/paramer/simulation/4455" - }, - { - "parameters": { - "W": 99.09, - "L": 20.81 - }, - "id": 4456, - "result_dir": "/tmp/paramer/simulation/4456" - }, - { - "parameters": { - "W": 99.09, - "L": 21.85 - }, - "id": 4457, - "result_dir": "/tmp/paramer/simulation/4457" - }, - { - "parameters": { - "W": 99.09, - "L": 22.94 - }, - "id": 4458, - "result_dir": "/tmp/paramer/simulation/4458" - }, - { - "parameters": { - "W": 99.09, - "L": 24.09 - }, - "id": 4459, - "result_dir": "/tmp/paramer/simulation/4459" - }, - { - "parameters": { - "W": 99.09, - "L": 25.29 - }, - "id": 4460, - "result_dir": "/tmp/paramer/simulation/4460" - }, - { - "parameters": { - "W": 99.09, - "L": 26.55 - }, - "id": 4461, - "result_dir": "/tmp/paramer/simulation/4461" - }, - { - "parameters": { - "W": 99.09, - "L": 27.88 - }, - "id": 4462, - "result_dir": "/tmp/paramer/simulation/4462" - }, - { - "parameters": { - "W": 99.09, - "L": 29.27 - }, - "id": 4463, - "result_dir": "/tmp/paramer/simulation/4463" - }, - { - "parameters": { - "W": 99.09, - "L": 30.73 - }, - "id": 4464, - "result_dir": "/tmp/paramer/simulation/4464" - }, - { - "parameters": { - "W": 99.09, - "L": 32.27 - }, - "id": 4465, - "result_dir": "/tmp/paramer/simulation/4465" - }, - { - "parameters": { - "W": 99.09, - "L": 33.88 - }, - "id": 4466, - "result_dir": "/tmp/paramer/simulation/4466" - }, - { - "parameters": { - "W": 99.09, - "L": 35.57 - }, - "id": 4467, - "result_dir": "/tmp/paramer/simulation/4467" - }, - { - "parameters": { - "W": 99.09, - "L": 37.35 - }, - "id": 4468, - "result_dir": "/tmp/paramer/simulation/4468" - }, - { - "parameters": { - "W": 99.09, - "L": 39.22 - }, - "id": 4469, - "result_dir": "/tmp/paramer/simulation/4469" - }, - { - "parameters": { - "W": 99.09, - "L": 41.18 - }, - "id": 4470, - "result_dir": "/tmp/paramer/simulation/4470" - }, - { - "parameters": { - "W": 99.09, - "L": 43.24 - }, - "id": 4471, - "result_dir": "/tmp/paramer/simulation/4471" - }, - { - "parameters": { - "W": 99.09, - "L": 45.4 - }, - "id": 4472, - "result_dir": "/tmp/paramer/simulation/4472" - }, - { - "parameters": { - "W": 99.09, - "L": 47.67 - }, - "id": 4473, - "result_dir": "/tmp/paramer/simulation/4473" - }, - { - "parameters": { - "W": 99.09, - "L": 50.05 - }, - "id": 4474, - "result_dir": "/tmp/paramer/simulation/4474" - }, - { - "parameters": { - "W": 99.09, - "L": 52.55 - }, - "id": 4475, - "result_dir": "/tmp/paramer/simulation/4475" - }, - { - "parameters": { - "W": 99.09, - "L": 55.18 - }, - "id": 4476, - "result_dir": "/tmp/paramer/simulation/4476" - }, - { - "parameters": { - "W": 99.09, - "L": 57.94 - }, - "id": 4477, - "result_dir": "/tmp/paramer/simulation/4477" - }, - { - "parameters": { - "W": 99.09, - "L": 60.84 - }, - "id": 4478, - "result_dir": "/tmp/paramer/simulation/4478" - }, - { - "parameters": { - "W": 99.09, - "L": 63.88 - }, - "id": 4479, - "result_dir": "/tmp/paramer/simulation/4479" - }, - { - "parameters": { - "W": 99.09, - "L": 67.07 - }, - "id": 4480, - "result_dir": "/tmp/paramer/simulation/4480" - }, - { - "parameters": { - "W": 99.09, - "L": 70.42 - }, - "id": 4481, - "result_dir": "/tmp/paramer/simulation/4481" - }, - { - "parameters": { - "W": 99.09, - "L": 73.94 - }, - "id": 4482, - "result_dir": "/tmp/paramer/simulation/4482" - }, - { - "parameters": { - "W": 99.09, - "L": 77.64 - }, - "id": 4483, - "result_dir": "/tmp/paramer/simulation/4483" - }, - { - "parameters": { - "W": 99.09, - "L": 81.52 - }, - "id": 4484, - "result_dir": "/tmp/paramer/simulation/4484" - }, - { - "parameters": { - "W": 99.09, - "L": 85.6 - }, - "id": 4485, - "result_dir": "/tmp/paramer/simulation/4485" - }, - { - "parameters": { - "W": 99.09, - "L": 89.88 - }, - "id": 4486, - "result_dir": "/tmp/paramer/simulation/4486" - }, - { - "parameters": { - "W": 99.09, - "L": 94.37 - }, - "id": 4487, - "result_dir": "/tmp/paramer/simulation/4487" - }, - { - "parameters": { - "W": 99.09, - "L": 99.09 - }, - "id": 4488, - "result_dir": "/tmp/paramer/simulation/4488" - } -] \ No newline at end of file diff --git a/core/MultiPortOrthonormalBasis.py b/core/MultiPortOrthonormalBasis.py deleted file mode 100644 index ff162d4..0000000 --- a/core/MultiPortOrthonormalBasis.py +++ /dev/null @@ -1,626 +0,0 @@ -import numpy as np -from core.sk_iter import generate_starting_poles -from scipy.linalg import block_diag -import skrf as rf -from skrf import VectorFitting -from core.freqency import auto_select_multple_ports -import matplotlib.pyplot as plt -import random as rnd - -def cond_row_inf(A, use_pinv=True): - """行条件数 κ∞(A) = ||A||∞ * ||A^{-1}||∞;矩形阵用广义逆。""" - A = np.asarray(A) - Ainv = np.linalg.pinv(A) if (use_pinv or A.shape[0] != A.shape[1]) else np.linalg.inv(A) - return np.linalg.norm(A, ord=np.inf) * np.linalg.norm(Ainv, ord=np.inf) - -def cond_col_one(A, use_pinv=True): - """列条件数 κ1(A) = ||A||1 * ||A^{-1}||1;矩形阵用广义逆。""" - A = np.asarray(A) - Ainv = np.linalg.pinv(A) if (use_pinv or A.shape[0] != A.shape[1]) else np.linalg.inv(A) - return np.linalg.norm(A, ord=1) * np.linalg.norm(Ainv, ord=1) - -class MultiPortOrthonormalBasis: - def __init__(self,H,freqs,poles,weights=None,passivity=True,dc_enforce=True,fit_constant=True,fit_proportional=False): - self.least_squares_condition = None - self.least_squares_row_condition = None - self.least_squares_col_condition = None - self.least_squares_rms_error = None - self.eigenval_condition = None - self.eigenval_row_condition = None - self.eigenval_col_condition = None - self.eigenval_rms_error = None - self.Cr = None - - self.dc_tol = 1e-18 - - self.dc_enforce = dc_enforce - self.fit_constant = fit_constant - self.fit_proportional = fit_proportional - - self.freqs = freqs - self.H = H - self.ports = H.shape[1] - self.s = self.freqs * 2j * np.pi - self.P = len(poles) - self.poles = poles - - self.Phi = self.generate_basis(self.s, self.poles) - self.A = self.matrix_A(self.poles) - self.B = self.vector_B(self.poles) - self.C,self.w0,self.e = self.fit_denominator(self.H, weights=weights) - self.D = self.w0 - - self.residuals = self.C / np.sqrt(2 * np.real(-np.array(self.poles))) - - z = np.linalg.eigvals(self.A - self.B @ self.C) - - if passivity: - self.next_poles = self.passivity_enforce(z) - else: - self.next_poles = z - - self.eigenval_condition,\ - self.eigenval_row_condition,\ - self.eigenval_col_condition,\ - self.eigenval_rms_error = self.eigen_metric() - - self.Dt = self.eval_Dt_state_space() - self.Dt_Dt_1 = np.linalg.norm(self.Dt) / np.linalg.norm(weights) if weights is not None else np.linalg.norm(self.Dt) - pass - - def eigen_metric(self): - - """Return condition number and RMS error of eigenvalues of A-BC.""" - z = np.linalg.eigvals(self.A - self.B @ self.C) - cond = np.linalg.cond(self.A - self.B @ self.C) - rms = np.sqrt(np.mean(np.abs(np.real(z) - np.real(self.poles))**2 + np.abs(np.imag(z) - np.imag(self.poles))**2)) - - row_cond = cond_row_inf(self.A - self.B @ self.C) - col_cond = cond_col_one(self.A - self.B @ self.C) - - return cond,row_cond,col_cond,rms - - def least_squares_metric(self,A,b): - """Return condition number and RMS error of least-squares matrix A and rhs b.""" - cond = np.linalg.cond(A) - rms = np.sqrt(np.mean((A @ np.linalg.pinv(A) @ b - b)**2)) - - row_cond = cond_row_inf(A) - col_cond = cond_col_one(A) - - return cond,row_cond,col_cond,rms - - - def passivity_enforce(self,poles): - """enforce poles' real parts to be negative""" - enforced_poles = [] - for pole in poles: - if pole.real > 0: - pole = -np.conj(pole) - enforced_poles.append(pole) - return enforced_poles - - def eval_Dt_state_space(self): - """Return D(s_k)=C(s_k I - A)^(-1)B + D for all k (complex 1D array).""" - s = 1j * 2*np.pi * np.asarray(self.freqs, float).ravel() - A = np.asarray(self.A, float); n = A.shape[0] - B = np.asarray(self.B, float).reshape(n, 1) - C = np.asarray(self.C, float).reshape(1, n) - D = self.D - I = np.eye(n, dtype=float) - out = np.empty_like(s, dtype=float) - for k, sk in enumerate(s): - DS = D + (C @ np.linalg.inv(sk*I - A) @ B) - out[k] = DS[0, 0] - return out - - - def generate_basis(self,s, poles): - """Real basis of (15)-(16); returns Φ(s) and a layout for packing C.""" - def all_pass(s,ap_list): - res = 1.0 +0.0j - for ap in ap_list: - res *= (s - np.conj(ap)) / (s + ap) - return res - - cols = [] - ap_list = [] - i = 0 - while i < len(poles): - ap = -poles[i] - if ap.real < 0: - raise ValueError("poles must be in the LHP") - if i+1 < len(poles) and np.isclose(poles[i+1], np.conj(-ap)): - ap1 = - poles[i+1] - phi1 = np.sqrt(2 * ap.real) * all_pass(s, ap_list) * ((s - np.abs(ap))/((s + ap)*(s + ap1))) - phi2 = np.sqrt(2 * ap.real) * all_pass(s, ap_list) * ((s + np.abs(ap))/((s + ap)*(s + ap1))) - cols += [phi1, phi2] - i += 2 - ap_list.append(ap) - ap_list.append(ap1) - else: - basis = np.sqrt(2 * ap.real) * all_pass(s, ap_list) * (1/(s + ap)) - cols.append(basis) - i += 1 - ap_list.append(ap) - Phi = np.column_stack(cols).astype(np.complex128) - return Phi - - def matrix_A(self, poles): - def A_col(p:np.complex128,index:int): - ap = -p - if abs(ap.imag) < 1e-14: - col = [] - for i in range(index): - col.append(0.0) - col.append(-ap.real) - for i in range(len(poles)-index-1): - col.append(2*(-ap).real) - return np.array([col], float) - else: - col1 = [] - col2 = [] - for i in range(index): - col1.append(0.0) - col2.append(0.0) - col1.append(-ap.real); col2.append(-ap.real - np.abs(ap)) - col1.append(-ap.real + np.abs(ap)); col2.append(-ap.real) - for i in range(len(poles)-index-2): - col1.append(2*(-ap).real) - col2.append(2*(-ap).real) - return np.array([col1, col2], float) - - i = 0 - cols = [] - while i < len(poles): - p = poles[i] - cols.extend(A_col(p,i)) - if i+1 < len(poles) and np.isclose(poles[i+1], np.conj(p)): i += 2 - else: i += 1 - A = np.column_stack(cols).astype(float) - return A - - def vector_B(self, poles): - return np.ones((len(poles), 1), float) - - def fit_denominator(self, H, weights=None, d0 = 1.0): - """ - Solve formula (70) on the real basis Φ to obtain: - - d (real) → packs into C for this state's block structure - - gamma (complex) - Optional 'weights' (K,) apply row scaling: SK weighting if 1/|D_prev|. - """ - K, N = self.Phi.shape - one = np.ones((K, 1), np.complex128) - Phi = self.Phi - dc_tol = 1e-18 - has_dc = self.dc_enforce and self.freqs[0] < dc_tol - keep = np.ones(K, dtype=bool) - - # SK weighting (applied only to the (73) rows we keep in LS) - - if has_dc: - # Enforce DC response exactly: - k0 = int(np.argmin(np.abs(self.freqs))) - keep[k0] = False - - if self.fit_constant: - Phi_w = np.hstack([one, Phi]) - index = 0 - M_kp = None - for i in range(self.ports): - for j in range(self.ports): - M0 = np.zeros((K,N*self.ports**2),dtype=complex) - M0[:,index*N:(index+1)*N] = Phi - M0 = np.hstack([M0, -(H[:,i,j].reshape(-1,1) * Phi_w)]).reshape((K, -1))[keep,:] # (K, 2N), complex - index+=1 - M_kp = M0 if M_kp is None else np.vstack([M_kp, M0]) - assert M_kp is not None - else: - index = 0 - M_kp = None - for i in range(self.ports): - for j in range(self.ports): - M0 = np.zeros((K,N*self.ports**2),dtype=complex) - M0[:,index*N:(index+1)*N] = Phi - M0 = np.hstack([M0, -(H[:,i,j].reshape(-1,1) * Phi)]).reshape((K, -1))[keep,:] # (K, 2N), complex - index+=1 - M_kp = M0 if M_kp is None else np.vstack([M_kp, M0]) - assert M_kp is not None - - if weights is None: - weights_kp = np.diag(np.ones(len(self.freqs[keep]) * self.ports**2, np.complex128)) - else: - weights_kp0 = weights[keep] - weights0 = [] - for i in range(self.ports **2 ): - for res in weights_kp0: - weights0.append(1/res) - weights_kp = np.diag(np.array(weights0)) - - - if has_dc: - M_w_kp = weights_kp @ M_kp - A_re = np.real(M_w_kp) - A_im = np.imag(M_w_kp) - mask = np.ones(K, dtype=bool); mask[k0] = False - # exact (unweighted) DC rows: - # A_dc_re = np.real(M_kp).reshape(1, -1) - # A_dc_im = np.imag(M_kp).reshape(1, -1) - else: - M_w_kp = weights_kp @ M_kp - A_re = np.real(M_w_kp) - A_im = np.imag(M_w_kp) - # A_dc_re = A_dc_im = None - - A_blocks = [A_re, A_im] - - if self.fit_constant: - Hk_sum = [] - for i in range(self.ports): - Hk_sum.append([]) - for j in range(self.ports): - Hk_kp0 = H[:,i,j][keep] - Hk_sum[i].append(np.sum(np.abs(Hk_kp0)**2)) - # Hk_kp = Hk_kp0 if Hk_kp is None else np.hstack([Hk_kp, Hk_kp0]) - K_keep = int(np.count_nonzero(keep)) - A_w0 = [] - b_w0 = [] - # Hk_sum = np.sum(np.abs(Hk_kp)**2) - for i in range(self.ports): - for j in range(self.ports): - beta_ij = float(np.sqrt(Hk_sum[i][j])) - mean_row = (beta_ij / K_keep) * np.sum(Phi_w[keep, :], axis=0) - A_w0.append(np.concatenate([np.zeros(N*self.ports**2, float), - np.real(mean_row).astype(float)] - ).reshape(1, -1)) - b_w0.append(np.array([beta_ij], float)) - b_w0 = np.asarray(b_w0).ravel() - - A_blocks += A_w0 - m = A_re.shape[0] + A_im.shape[0] - b = np.zeros(m, float) - b = np.concatenate([b, b_w0]) - else: - H_kp = None - for i in range(self.ports): - for j in range(self.ports): - H_0 = H[:,i,j][keep] - H_kp = H_0 if H_kp is None else np.hstack([H_kp, H_0]) - assert H_kp is not None - H_kp = weights_kp @ H_kp.reshape(-1,1) - - b_re = np.real(d0 * H_kp) - b_im = np.imag(d0 * H_kp) - b = np.concatenate([b_re.ravel(), b_im.ravel()]).astype(float) - - # ---- build final stacked-real system ---- - - - # if A_dc_re is not None: - # A_blocks += [A_dc_re, A_dc_im] - # b = np.concatenate([b, np.zeros(2, float)]) # DC rows → 0 - - # ---- QR solve for x = [c_H (N); c_w (N+1)] ---- - A = np.vstack(A_blocks).astype(float) - Q, R = np.linalg.qr(A, mode="reduced") - - if self.fit_constant: - Q2 = Q[:,Phi.shape[1] * self.ports**2:] - R22 = R[Phi.shape[1] * self.ports**2:,Phi.shape[1] * self.ports**2:] - else: - Q2 = Q[:,Phi.shape[1] * self.ports**2:] - R22 = R[Phi.shape[1] * self.ports**2:,Phi.shape[1] * self.ports**2:] - - x = np.linalg.solve(R22, Q2.T @ b) - - # diagnostics - resid = Q2 @ R22 @ x - b - # self.least_squares_rms_error = float(np.sqrt(np.mean(resid**2))) - # self.least_squares_condition = float(np.linalg.cond(R)) - self.least_squares_condition,\ - self.least_squares_row_condition,\ - self.least_squares_col_condition,\ - self.least_squares_rms_error = self.least_squares_metric(A, b) - - return self.extract_C_d_e(x,N,d0) - - def extract_C_d_e(self,C,N,d0=1.0): - a = np.sqrt(2 * np.real(-np.array(self.poles))) - if self.fit_proportional and self.fit_constant: - d = C[1] - e = C[0] - C = a * C[2:] - return C.reshape(1, -1), d, e - elif self.fit_proportional and not self.fit_constant: - d = 0.0 - e = C[0] - C = a * C[1:] - return C.reshape(1, -1), d, e - elif not self.fit_proportional and self.fit_constant: - d = C[0] - e = 0.0 - C = a * C[1:] - return C.reshape(1, -1), d, e - else: - C = a * C - return C.reshape(1, -1), d0, 0.0 - - - def non_bias_Cr(self,w0): - A = np.asarray(self.Phi) - den = np.diag((w0 + self.Phi @ self.residuals.T).ravel()) - Cr = [] - for i in range(self.ports): - Cr.append([]) - for j in range(self.ports): - b = np.asarray(den) @ self.H[:,i,j].reshape(-1,1) - Cr_ij, residuals, rank, s = np.linalg.lstsq(A, b, rcond=None) - Cr[i].append(Cr_ij) - return Cr - - def get_model_responses(self,freqs): - H = np.zeros((len(freqs),self.ports,self.ports),dtype=complex) - s = 1j * 2*np.pi * np.asarray(freqs, float).ravel() - phi = self.generate_basis(s, self.poles) - den = self.w0 + phi @ self.residuals.T - if self.Cr is None: - self.Cr = self.non_bias_Cr(w0=self.w0) - for i in range(self.ports): - for j in range(self.ports): - num = phi @ self.Cr[i][j] - H[:,i,j] = (num / den).reshape(1,-1) - return H - -class VFUtils(): - def __init__(self,npoles_cplx,freqs,H,model=MultiPortOrthonormalBasis,iterations:int=5): - poles = generate_starting_poles(npoles_cplx,beta_min=1e4,beta_max=freqs[-1]*1.1) - self.model=model(H=H,freqs=freqs,poles=poles) - self.freqs=freqs - self.H=H - self.iterations=iterations - - self.nports = H.shape[1] - - self.least_squares_condition = [] - self.least_squares_row_condition = [] - self.least_squares_col_condition = [] - self.least_squares_rms_error = [] - self.eigenval_condition = [] - self.eigenval_row_condition = [] - self.eigenval_col_condition = [] - self.eigenval_rms_error = [] - - self.model_responses_freqs = None - self.model_responses_H = None - - def fit(self): - for i in range(self.iterations): - print(f"Iteration {i+1}/{self.iterations}") - poles = self.model.next_poles - weights = self.model.Dt - self.model = self.model.__class__(H=self.H,freqs=self.freqs,poles=poles,weights=weights) - print("A:",self.model.A) - print("B:",self.model.B) - print("C:",self.model.C) - print("D:",self.model.D) - print("next_pozles:",self.model.next_poles) - print("Dt:",self.model.Dt) - print("Dt/Dt_1:",np.linalg.norm(self.model.Dt_Dt_1)) - self.least_squares_condition.append(self.model.least_squares_condition) - self.least_squares_row_condition.append(self.model.least_squares_row_condition) - self.least_squares_col_condition.append(self.model.least_squares_col_condition) - self.least_squares_rms_error.append(self.model.least_squares_rms_error) - self.eigenval_condition.append(self.model.eigenval_condition) - self.eigenval_row_condition.append(self.model.eigenval_row_condition) - self.eigenval_col_condition.append(self.model.eigenval_col_condition) - self.eigenval_rms_error.append(self.model.eigenval_rms_error) - return self.model - - def plot_metrics(self): - plt.figure(figsize=(16, 12)) - plt.subplot(4, 2, 1) - plt.plot(self.least_squares_condition, label='Least Squares Condition') - plt.legend() - plt.subplot(4, 2, 2) - plt.plot(self.least_squares_row_condition, label='Least Squares Row Condition') - plt.legend() - plt.subplot(4, 2, 3) - plt.plot(self.least_squares_col_condition, label='Least Squares Col Condition') - plt.legend() - plt.subplot(4, 2, 4) - plt.plot(self.least_squares_rms_error, label='Least Squares RMS Error') - plt.legend() - plt.subplot(4, 2, 5) - plt.plot(self.eigenval_condition, label='Eigenvalue Condition') - plt.legend() - plt.subplot(4, 2, 6) - plt.plot(self.eigenval_row_condition, label='Eigenvalue Row Condition') - plt.legend() - plt.subplot(4, 2, 7) - plt.plot(self.eigenval_col_condition, label='Eigenvalue Col Condition') - plt.legend() - plt.subplot(4, 2, 8) - plt.plot(self.eigenval_rms_error, label='Eigenvalue RMS Error') - plt.legend() - plt.savefig("fit_metrics.png") - - def plot_model_responses(self): - assert self.model_responses_freqs is not None and self.model_responses_H is not None, "Please run get_model_responses() first." - for i in range(self.nports): - for j in range(self.nports): - plt.figure(figsize=(12, 6)) - plt.subplot(2, 2, 1) - plt.plot(self.freqs, np.abs(self.H[:,i,j]), 'o', ms=4, color='red', label='Input Samples') - plt.plot(self.model_responses_freqs, np.abs(self.model_responses_H[:,i,j]), '-', lw=2, color='k', label='Fit') - plt.title(f"Response i={i+1}, j={j+1}") - plt.ylabel("Magnitude") - plt.legend(loc="best") - plt.subplot(2, 2, 2) - plt.plot(self.freqs, np.angle(self.H[:,i,j],deg=True), 'o', ms=4, color='red', label='Input Samples') - plt.plot(self.model_responses_freqs, np.angle(self.model_responses_H[:,i,j],deg=True), '-', lw=2, color='k', label='Fit') - plt.title(f"Response i={i+1}, j={j+1}") - plt.ylabel("Phase (deg)") - plt.legend(loc="best") - plt.tight_layout() - plt.subplot(2, 2, 3) - plt.plot(self.freqs, np.real(self.H[:,i,j]), 'o', ms=4, color='red', label='Input Samples') - plt.plot(self.model_responses_freqs, np.real(self.model_responses_H[:,i,j]), '-', lw=2, color='k', label='Fit') - plt.title(f"Response i={i+1}, j={j+1}") - plt.ylabel("Real Part") - plt.legend(loc="best") - plt.subplot(2, 2, 4) - plt.plot(self.freqs, np.imag(self.H[:,i,j]), 'o', ms=4, color='red', label='Input Samples') - plt.plot(self.model_responses_freqs, np.imag(self.model_responses_H[:,i,j]), '-', lw=2, color='k', label='Fit') - plt.title(f"Response i={i+1}, j={j+1}") - plt.ylabel("Imag Part") - plt.legend(loc="best") - plt.tight_layout() - plt.savefig(f"model_response_{i+1}{j+1}.png") - print(f"Saved model_response_{i+1}{j+1}.png") - - def get_model_responses(self,freqs): - self.model_responses_freqs = freqs - self.model_responses_H = self.model.get_model_responses(freqs) - return self.model_responses_H - - -def noise(n:complex,coeff:float=0.05): - noise_r = rnd.gauss(-coeff * n.real, coeff * n.real) - noise_i = rnd.gauss(-coeff * n.imag, coeff * n.imag) - return complex(n.real + noise_r, n.imag + noise_i) - -if __name__ == "__main__": - start_point = 0 - id = 3000 - network = rf.Network(f"/tmp/paramer/simulation/{id}/{id}.s2p") - # network = rf.data.ring_slot - ports = network.nports - K = 100 - - full_freqences = network.f[start_point:] - noised_sampled_points = network.y[start_point:,:,:].reshape(-1,ports,ports) - sampled_points = network.y[start_point:,:,:].reshape(-1,ports,ports) - - # noised_sampled_points = network.y[start_point:,0,0].reshape(-1,1,1) - # sampled_points = network.y[start_point:,0,0].reshape(-1,1,1) - - H,freqs = auto_select_multple_ports(noised_sampled_points,full_freqences,max_points=20) - poles = generate_starting_poles(2,beta_min=1e4,beta_max=freqs[-1]*1.1) - - vf = VFUtils(npoles_cplx=2,freqs=freqs,H=H,model=MultiPortOrthonormalBasis,iterations=K) - model = vf.fit() - vf.plot_metrics() - model_responses = vf.get_model_responses(full_freqences) - vf.plot_model_responses() - - # # Original plot functions - - # Dt_1 = np.ones((len(freqs),1),np.complex128) - # # Levi step (no weighting): - # basis = MultiPortOrthonormalBasis(H,freqs,poles=poles) - # Dt = basis.Dt - # poles = basis.next_poles - - # print("Levi step (no weighting):") - # print("A:",basis.A) - # print("B:",basis.B) - # print("C:",basis.C) - # print("D:",basis.D) - # print("next_pozles:",basis.next_poles) - # print("Dt:",Dt, "norm:",np.linalg.norm(Dt)) - - # # SK weighting (optional, after first pass): - # least_squares_condition = [] - # least_squares_rms_error = [] - # eigenval_condition = [] - # eigenval_rms_error = [] - # for i in range(K): - # basis = MultiPortOrthonormalBasis(H,freqs,poles=poles,weights=Dt) - # Dt_1 = Dt - # Dt = basis.Dt - # poles = basis.next_poles - # print(f"SK Iteration {i+1}/{K}") - # print("A:",basis.A) - # print("B:",basis.B) - # print("C:",basis.C) - # print("D:",basis.D) - # print("z:",basis.next_poles) - # print("Dt:",Dt) - # print("Dt/Dt-1",np.linalg.norm(Dt) / np.linalg.norm(Dt_1)) - # least_squares_condition.append(basis.least_squares_condition) - # least_squares_rms_error.append(basis.least_squares_rms_error) - # eigenval_condition.append(basis.eigenval_condition) - # eigenval_rms_error.append(basis.eigenval_rms_error) - - # # H11_evaluated = basis.evaluate_pole_residue(network.f[1:],poles,basis.C[0]) - # H_evaluated = basis.get_model_responses(full_freqences) - # fitted_points = H_evaluated - # sliced_freqences = freqs - - # input_points = H - # for i in range(ports): - # for j in range(ports): - # fig, axes = plt.subplots(3, 2, figsize=(15, 16), sharex=False) - # ax00 = axes[0][0] - # ax00.plot(full_freqences, np.abs(sampled_points[:,i,j]), 'o', ms=4, color='red', label='Samples') - # ax00.plot(full_freqences, np.abs(fitted_points[:,i,j]), '-', lw=2, color='k', label='Fit') - # ax00.plot(sliced_freqences, np.abs(input_points[:,i,j]), 'x', ms=4, color='blue', label='Input Samples') - # ax00.set_title(f"Response i={i+1}, j={j+1}") - # ax00.set_ylabel("Magnitude") - # ax00.legend(loc="best") - - # ax01 = axes[0][1] - # ax01.set_title(f"Response i={i+1}, j={j+1}") - # ax01.set_ylabel("Phase (deg)") - # ax01.plot(full_freqences, np.angle(sampled_points[:,i,j],deg=True), 'o', ms=4, color='red', label='Samples') - # ax01.plot(full_freqences, np.angle(fitted_points[:,i,j],deg=True), '-', lw=2, color='k', label='Fit') - # ax01.plot(sliced_freqences, np.angle(input_points[:,i,j],deg=True), 'x', ms=4, color='blue', label='Input Samples') - # ax01.legend(loc="best") - - # # ax00 = axes[0][0] - # # ax00.plot(full_freqences, np.real(sampled_points[:,i,j]), 'o', ms=4, color='red', label='Samples') - # # ax00.plot(full_freqences, np.real(fitted_points[:,i,j]), '-', lw=2, color='k', label='Fit') - # # ax00.plot(sliced_freqences, np.real(input_points[:,i,j]), 'x', ms=4, color='blue', label='Input Samples') - # # ax00.set_title(f"Response i={i+1}, j={j+1}") - # # ax00.set_ylabel("Real Part") - # # ax00.legend(loc="best") - - # # ax01 = axes[0][1] - # # ax01.set_title(f"Response i={i+1}, j={j+1}") - # # ax01.set_ylabel("Imag Part") - # # ax01.plot(full_freqences, np.imag(sampled_points[:,i,j]), 'o', ms=4, color='red', label='Samples') - # # ax01.plot(full_freqences, np.imag(fitted_points[:,i,j]), '-', lw=2, color='k', label='Fit') - # # ax01.plot(sliced_freqences, np.imag(input_points[:,i,j]), 'x', ms=4, color='blue', label='Input Samples') - # # ax01.legend(loc="best") - - # ax10 = axes[1][0] - # ax10.plot(least_squares_condition, label='Least Squares Condition') - # ax10.set_title("least_squares_condition") - # ax10.set_ylabel("Magnitude") - # ax10.legend(loc="best") - - # ax11 = axes[1][1] - # ax11.plot(least_squares_rms_error, label='Least Squares RMS Error') - # ax11.set_title("least_squares_rms_error") - # ax11.set_ylabel("Magnitude") - # ax11.legend(loc="best") - - # ax20 = axes[2][0] - # ax20.plot(eigenval_condition, label='Eigenvalue Condition') - # ax20.set_title("eigenval_condition") - # ax20.set_ylabel("Magnitude") - # ax20.legend(loc="best") - - # ax21 = axes[2][1] - # ax21.plot(eigenval_rms_error, label='Eigenvalue RMS Error') - # ax21.set_title("eigenval_rms_error") - # ax21.set_ylabel("Magnitude") - # ax21.legend(loc="best") - # fig.tight_layout() - # plt.savefig(f"MultiplePortQR_port_{i+1}{j+1}.png") - # print(f"Saved MultiplePortQR_port_{i+1}{j+1}.png") - - - - diff --git a/core/VFManager.py b/core/VFManager.py new file mode 100644 index 0000000..d45c22b --- /dev/null +++ b/core/VFManager.py @@ -0,0 +1,176 @@ +import matplotlib.pyplot as plt +import numpy as np +from .basis.MultiPortOrthonormalBasis import MultiPortOrthonormalBasis +from .utils import generate_starting_poles + +class VFManager(): + def __init__( + self, + npoles_cplx, + freqs, + H, + model=MultiPortOrthonormalBasis, + iterations:int=5, + fit_constant:bool=True, + fit_proportional:bool=False, + dc_enforce:bool=False, + passivity_enforce:bool=True, + verbose:bool=True + ): + + + self.freqs=freqs + self.H=H + self.iterations=iterations + self.fit_constant=fit_constant + self.fit_proportional=fit_proportional + self.dc_enforce=dc_enforce + self.passivity_enforce=passivity_enforce + self.verbose=verbose + + self.nports = H.shape[1] + self.npoles_cplx = npoles_cplx + + self.least_squares_condition = [] + self.least_squares_row_condition = [] + self.least_squares_col_condition = [] + self.least_squares_rms_error = [] + self.eigenval_condition = [] + self.eigenval_row_condition = [] + self.eigenval_col_condition = [] + self.eigenval_rms_error = [] + + self.model_instance = None + self.model_responses_freqs = None + self.model_responses_H = None + + self.model=model + + def fit(self): + self.levi() + self.model_instance = self.sk_iteration() + return self.model + + def levi(self): + self.poles = generate_starting_poles(self.npoles_cplx,beta_min=1e4,beta_max=self.freqs[-1]*1.1) + self.model_instance=self.model( + H=self.H, + freqs=self.freqs, + poles=self.poles, + fit_constant=self.fit_constant, + fit_proportional=self.fit_proportional, + dc_enforce=self.dc_enforce, + passivity_enforce=self.passivity_enforce + ) + return self.model_instance + + def sk_iteration(self): + for i in range(self.iterations): + assert self.model_instance is not None ,"Please run levi() first." + self.poles = self.model_instance.next_poles + self.weights = self.model_instance.Dt + self.model_instance = self.model( + H=self.H, + freqs=self.freqs, + poles=self.poles, + weights=self.weights, + fit_constant=self.fit_constant, + fit_proportional=self.fit_proportional, + dc_enforce=self.dc_enforce, + passivity_enforce=self.passivity_enforce + ) + if self.verbose: + print(f"Iteration {i+1}/{self.iterations}") + print("A:",self.model_instance.A) + print("B:",self.model_instance.B) + print("C:",self.model_instance.C) + print("D:",self.model_instance.D) + print("next_pozles:",self.model_instance.next_poles) + print("Dt:",self.model_instance.Dt) + print("Dt/Dt_1:",np.linalg.norm(self.model_instance.Dt_Dt_1)) + self.least_squares_condition.append(self.model_instance.least_squares_condition) + self.least_squares_row_condition.append(self.model_instance.least_squares_row_condition) + self.least_squares_col_condition.append(self.model_instance.least_squares_col_condition) + self.least_squares_rms_error.append(self.model_instance.least_squares_rms_error) + self.eigenval_condition.append(self.model_instance.eigenval_condition) + self.eigenval_row_condition.append(self.model_instance.eigenval_row_condition) + self.eigenval_col_condition.append(self.model_instance.eigenval_col_condition) + self.eigenval_rms_error.append(self.model_instance.eigenval_rms_error) + return self.model_instance + + def plot_metrics(self,show:bool=True,save_path=None): + plt.figure(figsize=(16, 12)) + plt.subplot(4, 2, 1) + plt.plot(self.least_squares_condition, label='Least Squares Condition') + plt.legend() + plt.subplot(4, 2, 2) + plt.plot(self.least_squares_row_condition, label='Least Squares Row Condition') + plt.legend() + plt.subplot(4, 2, 3) + plt.plot(self.least_squares_col_condition, label='Least Squares Col Condition') + plt.legend() + plt.subplot(4, 2, 4) + plt.plot(self.least_squares_rms_error, label='Least Squares RMS Error') + plt.legend() + plt.subplot(4, 2, 5) + plt.plot(self.eigenval_condition, label='Eigenvalue Condition') + plt.legend() + plt.subplot(4, 2, 6) + plt.plot(self.eigenval_row_condition, label='Eigenvalue Row Condition') + plt.legend() + plt.subplot(4, 2, 7) + plt.plot(self.eigenval_col_condition, label='Eigenvalue Col Condition') + plt.legend() + plt.subplot(4, 2, 8) + plt.plot(self.eigenval_rms_error, label='Eigenvalue RMS Error') + plt.legend() + if show: + plt.show() + if save_path is not None: + if self.verbose: + print(f"Saving metrics plot to {save_path}/fitting_metrics.png") + plt.savefig(f"{save_path}/fitting_metrics.png") + + def plot_model_responses(self,show:bool=True,save_path=None): + assert self.model_responses_freqs is not None and self.model_responses_H is not None, "Please run get_model_responses() first." + for i in range(self.nports): + for j in range(self.nports): + plt.figure(figsize=(12, 6)) + plt.subplot(2, 2, 1) + plt.plot(self.freqs, np.abs(self.H[:,i,j]), 'o', ms=4, color='red', label='Input Samples') + plt.plot(self.model_responses_freqs, np.abs(self.model_responses_H[:,i,j]), '-', lw=2, color='k', label='Fit') + plt.title(f"Response i={i+1}, j={j+1}") + plt.ylabel("Magnitude") + plt.legend(loc="best") + plt.subplot(2, 2, 2) + plt.plot(self.freqs, np.angle(self.H[:,i,j],deg=True), 'o', ms=4, color='red', label='Input Samples') + plt.plot(self.model_responses_freqs, np.angle(self.model_responses_H[:,i,j],deg=True), '-', lw=2, color='k', label='Fit') + plt.title(f"Response i={i+1}, j={j+1}") + plt.ylabel("Phase (deg)") + plt.legend(loc="best") + plt.tight_layout() + plt.subplot(2, 2, 3) + plt.plot(self.freqs, np.real(self.H[:,i,j]), 'o', ms=4, color='red', label='Input Samples') + plt.plot(self.model_responses_freqs, np.real(self.model_responses_H[:,i,j]), '-', lw=2, color='k', label='Fit') + plt.title(f"Response i={i+1}, j={j+1}") + plt.ylabel("Real Part") + plt.legend(loc="best") + plt.subplot(2, 2, 4) + plt.plot(self.freqs, np.imag(self.H[:,i,j]), 'o', ms=4, color='red', label='Input Samples') + plt.plot(self.model_responses_freqs, np.imag(self.model_responses_H[:,i,j]), '-', lw=2, color='k', label='Fit') + plt.title(f"Response i={i+1}, j={j+1}") + plt.ylabel("Imag Part") + plt.legend(loc="best") + plt.tight_layout() + if show: + plt.show() + if save_path is not None: + if self.verbose: + print(f"Saving response plot for port {i+1},{j+1} to {save_path}/response_{i+1}_{j+1}.png") + plt.savefig(f"{save_path}/response_{i+1}_{j+1}.png") + + def get_model_responses(self,freqs): + assert self.model_instance is not None ,"Please run levi() and sk_iteration() first." + self.model_responses_freqs = freqs + self.model_responses_H = self.model_instance.get_model_responses(freqs) + return self.model_responses_H \ No newline at end of file diff --git a/core/basis/MultiPortOrthonormalBasis.py b/core/basis/MultiPortOrthonormalBasis.py new file mode 100644 index 0000000..e35144a --- /dev/null +++ b/core/basis/MultiPortOrthonormalBasis.py @@ -0,0 +1,362 @@ +import numpy as np +import skrf as rf +from ..utils import cond_row_inf, cond_col_one, generate_starting_poles + + +class MultiPortOrthonormalBasis: + def __init__(self,H,freqs,poles,weights=None,passivity_enforce=True,dc_enforce=True,fit_constant=True,fit_proportional=False): + self.least_squares_condition = None + self.least_squares_row_condition = None + self.least_squares_col_condition = None + self.least_squares_rms_error = None + self.eigenval_condition = None + self.eigenval_row_condition = None + self.eigenval_col_condition = None + self.eigenval_rms_error = None + self.Cr = None + + self.dc_tol = 1e-18 + + self.dc_enforce = dc_enforce + self.fit_constant = fit_constant + self.fit_proportional = fit_proportional + + self.freqs = freqs + self.H = H + self.ports = H.shape[1] + self.s = self.freqs * 2j * np.pi + self.P = len(poles) + self.poles = poles + + self.Phi = self.generate_basis(self.s, self.poles) + self.A = self.matrix_A(self.poles) + self.B = self.vector_B(self.poles) + self.C,self.w0,self.e = self.fit_denominator(self.H, weights=weights) + self.D = self.w0 + + self.residuals = self.C / np.sqrt(2 * np.real(-np.array(self.poles))) + + z = np.linalg.eigvals(self.A - self.B @ self.C) + + if passivity_enforce: + self.next_poles = self.passivity_enforce(z) + else: + self.next_poles = z + + self.eigenval_condition,\ + self.eigenval_row_condition,\ + self.eigenval_col_condition,\ + self.eigenval_rms_error = self.eigen_metric() + + self.Dt = self.eval_Dt_state_space() + self.Dt_Dt_1 = np.linalg.norm(self.Dt) / np.linalg.norm(weights) if weights is not None else np.linalg.norm(self.Dt) + pass + + def eigen_metric(self): + + """Return condition number and RMS error of eigenvalues of A-BC.""" + z = np.linalg.eigvals(self.A - self.B @ self.C) + cond = np.linalg.cond(self.A - self.B @ self.C) + rms = np.sqrt(np.mean(np.abs(np.real(z) - np.real(self.poles))**2 + np.abs(np.imag(z) - np.imag(self.poles))**2)) + + row_cond = cond_row_inf(self.A - self.B @ self.C) + col_cond = cond_col_one(self.A - self.B @ self.C) + + return cond,row_cond,col_cond,rms + + def least_squares_metric(self,A,b): + """Return condition number and RMS error of least-squares matrix A and rhs b.""" + cond = np.linalg.cond(A) + rms = np.sqrt(np.mean((A @ np.linalg.pinv(A) @ b - b)**2)) + + row_cond = cond_row_inf(A) + col_cond = cond_col_one(A) + + return cond,row_cond,col_cond,rms + + + def passivity_enforce(self,poles): + """enforce poles' real parts to be negative""" + enforced_poles = [] + for pole in poles: + if pole.real > 0: + pole = -np.conj(pole) + enforced_poles.append(pole) + return enforced_poles + + def eval_Dt_state_space(self): + """Return D(s_k)=C(s_k I - A)^(-1)B + D for all k (complex 1D array).""" + s = 1j * 2*np.pi * np.asarray(self.freqs, float).ravel() + A = np.asarray(self.A, float); n = A.shape[0] + B = np.asarray(self.B, float).reshape(n, 1) + C = np.asarray(self.C, float).reshape(1, n) + D = self.D + I = np.eye(n, dtype=float) + out = np.empty_like(s, dtype=np.complex128) + for k, sk in enumerate(s): + DS = D + (C @ np.linalg.inv(sk*I - A) @ B) + out[k] = DS[0, 0] + return out + + + def generate_basis(self,s, poles): + """Real basis of (15)-(16); returns Φ(s) and a layout for packing C.""" + def all_pass(s,ap_list): + res = 1.0 +0.0j + for ap in ap_list: + res *= (s - np.conj(ap)) / (s + ap) + return res + + cols = [] + ap_list = [] + i = 0 + while i < len(poles): + ap = -poles[i] + if ap.real < 0: + raise ValueError("poles must be in the LHP") + if i+1 < len(poles) and np.isclose(poles[i+1], np.conj(-ap)): + ap1 = - poles[i+1] + phi1 = np.sqrt(2 * ap.real) * all_pass(s, ap_list) * ((s - np.abs(ap))/((s + ap)*(s + ap1))) + phi2 = np.sqrt(2 * ap.real) * all_pass(s, ap_list) * ((s + np.abs(ap))/((s + ap)*(s + ap1))) + cols += [phi1, phi2] + i += 2 + ap_list.append(ap) + ap_list.append(ap1) + else: + basis = np.sqrt(2 * ap.real) * all_pass(s, ap_list) * (1/(s + ap)) + cols.append(basis) + i += 1 + ap_list.append(ap) + Phi = np.column_stack(cols).astype(np.complex128) + return Phi + + def matrix_A(self, poles): + def A_col(p:np.complex128,index:int): + ap = -p + if abs(ap.imag) < 1e-14: + col = [] + for i in range(index): + col.append(0.0) + col.append(-ap.real) + for i in range(len(poles)-index-1): + col.append(2*(-ap).real) + return np.array([col], float) + else: + col1 = [] + col2 = [] + for i in range(index): + col1.append(0.0) + col2.append(0.0) + col1.append(-ap.real); col2.append(-ap.real - np.abs(ap)) + col1.append(-ap.real + np.abs(ap)); col2.append(-ap.real) + for i in range(len(poles)-index-2): + col1.append(2*(-ap).real) + col2.append(2*(-ap).real) + return np.array([col1, col2], float) + + i = 0 + cols = [] + while i < len(poles): + p = poles[i] + cols.extend(A_col(p,i)) + if i+1 < len(poles) and np.isclose(poles[i+1], np.conj(p)): i += 2 + else: i += 1 + A = np.column_stack(cols).astype(float) + return A + + def vector_B(self, poles): + return np.ones((len(poles), 1), float) + + def fit_denominator(self, H, weights=None, d0 = 1.0): + """ + Solve formula (70) on the real basis Φ to obtain: + - d (real) → packs into C for this state's block structure + - gamma (complex) + Optional 'weights' (K,) apply row scaling: SK weighting if 1/|D_prev|. + """ + K, N = self.Phi.shape + one = np.ones((K, 1), np.complex128) + Phi = self.Phi + dc_tol = 1e-18 + has_dc = self.dc_enforce and self.freqs[0] < dc_tol + keep = np.ones(K, dtype=bool) + + # SK weighting (applied only to the (73) rows we keep in LS) + + if has_dc: + # Enforce DC response exactly: + k0 = int(np.argmin(np.abs(self.freqs))) + keep[k0] = False + + if self.fit_constant: + Phi_w = np.hstack([one, Phi]) + index = 0 + M_kp = None + for i in range(self.ports): + for j in range(self.ports): + M0 = np.zeros((K,N*self.ports**2),dtype=complex) + M0[:,index*N:(index+1)*N] = Phi + M0 = np.hstack([M0, -(H[:,i,j].reshape(-1,1) * Phi_w)]).reshape((K, -1))[keep,:] # (K, 2N), complex + index+=1 + M_kp = M0 if M_kp is None else np.vstack([M_kp, M0]) + assert M_kp is not None + else: + index = 0 + M_kp = None + for i in range(self.ports): + for j in range(self.ports): + M0 = np.zeros((K,N*self.ports**2),dtype=complex) + M0[:,index*N:(index+1)*N] = Phi + M0 = np.hstack([M0, -(H[:,i,j].reshape(-1,1) * Phi)]).reshape((K, -1))[keep,:] # (K, 2N), complex + index+=1 + M_kp = M0 if M_kp is None else np.vstack([M_kp, M0]) + assert M_kp is not None + + if weights is None: + weights_kp = np.diag(np.ones(len(self.freqs[keep]) * self.ports**2, np.complex128)) + else: + weights_kp = np.diag(np.ones(len(self.freqs[keep]) * self.ports**2, np.complex128)) + # weights_kp0 = weights[keep] + # weights0 = [] + # for i in range(self.ports **2 ): + # for res in weights_kp0: + # weights0.append(1/res) + # weights_kp = np.diag(np.array(weights0)) + + + if has_dc: + M_w_kp = weights_kp @ M_kp + A_re = np.real(M_w_kp) + A_im = np.imag(M_w_kp) + mask = np.ones(K, dtype=bool); mask[k0] = False + # exact (unweighted) DC rows: + # A_dc_re = np.real(M_kp).reshape(1, -1) + # A_dc_im = np.imag(M_kp).reshape(1, -1) + else: + M_w_kp = weights_kp @ M_kp + A_re = np.real(M_w_kp) + A_im = np.imag(M_w_kp) + # A_dc_re = A_dc_im = None + + A_blocks = [A_re, A_im] + + if self.fit_constant: + Hk_sum = [] + for i in range(self.ports): + Hk_sum.append([]) + for j in range(self.ports): + Hk_kp0 = H[:,i,j][keep] + Hk_sum[i].append(np.sum(np.abs(Hk_kp0)**2)) + # Hk_kp = Hk_kp0 if Hk_kp is None else np.hstack([Hk_kp, Hk_kp0]) + K_keep = int(np.count_nonzero(keep)) + A_w0 = [] + b_w0 = [] + # Hk_sum = np.sum(np.abs(Hk_kp)**2) + for i in range(self.ports): + for j in range(self.ports): + beta_ij = float(np.sqrt(Hk_sum[i][j])) + mean_row = (beta_ij / K_keep) * np.sum(Phi_w[keep, :], axis=0) + A_w0.append(np.concatenate([np.zeros(N*self.ports**2, float), + np.real(mean_row).astype(float)] + ).reshape(1, -1)) + b_w0.append(np.array([beta_ij], float)) + b_w0 = np.asarray(b_w0).ravel() + + A_blocks += A_w0 + m = A_re.shape[0] + A_im.shape[0] + b = np.zeros(m, float) + b = np.concatenate([b, b_w0]) + else: + H_kp = None + for i in range(self.ports): + for j in range(self.ports): + H_0 = H[:,i,j][keep] + H_kp = H_0 if H_kp is None else np.hstack([H_kp, H_0]) + assert H_kp is not None + H_kp = weights_kp @ H_kp.reshape(-1,1) + + b_re = np.real(d0 * H_kp) + b_im = np.imag(d0 * H_kp) + b = np.concatenate([b_re.ravel(), b_im.ravel()]).astype(float) + + # ---- build final stacked-real system ---- + + + # if A_dc_re is not None: + # A_blocks += [A_dc_re, A_dc_im] + # b = np.concatenate([b, np.zeros(2, float)]) # DC rows → 0 + + # ---- QR solve for x = [c_H (N); c_w (N+1)] ---- + A = np.vstack(A_blocks).astype(float) + Q, R = np.linalg.qr(A, mode="reduced") + + if self.fit_constant: + Q2 = Q[:,Phi.shape[1] * self.ports**2:] + R22 = R[Phi.shape[1] * self.ports**2:,Phi.shape[1] * self.ports**2:] + else: + Q2 = Q[:,Phi.shape[1] * self.ports**2:] + R22 = R[Phi.shape[1] * self.ports**2:,Phi.shape[1] * self.ports**2:] + + x = np.linalg.solve(R22, Q2.T @ b) + + # diagnostics + resid = Q2 @ R22 @ x - b + # self.least_squares_rms_error = float(np.sqrt(np.mean(resid**2))) + # self.least_squares_condition = float(np.linalg.cond(R)) + self.least_squares_condition,\ + self.least_squares_row_condition,\ + self.least_squares_col_condition,\ + self.least_squares_rms_error = self.least_squares_metric(A, b) + + return self.extract_C_d_e(x,N,d0) + + def extract_C_d_e(self,C,N,d0=1.0): + a = np.sqrt(2 * np.real(-np.array(self.poles))) + if self.fit_proportional and self.fit_constant: + d = C[1] + e = C[0] + C = a * C[2:] + return C.reshape(1, -1), d, e + elif self.fit_proportional and not self.fit_constant: + d = 0.0 + e = C[0] + C = a * C[1:] + return C.reshape(1, -1), d, e + elif not self.fit_proportional and self.fit_constant: + d = C[0] + e = 0.0 + C = a * C[1:] + return C.reshape(1, -1), d, e + else: + C = a * C + return C.reshape(1, -1), d0, 0.0 + + + def non_bias_Cr(self,w0): + A = np.asarray(self.Phi) + den = np.diag((w0 + self.Phi @ self.residuals.T).ravel()) + Cr = [] + for i in range(self.ports): + Cr.append([]) + for j in range(self.ports): + b = np.asarray(den) @ self.H[:,i,j].reshape(-1,1) + Cr_ij, residuals, rank, s = np.linalg.lstsq(A, b, rcond=None) + Cr[i].append(Cr_ij) + return Cr + + def get_model_responses(self,freqs): + H = np.zeros((len(freqs),self.ports,self.ports),dtype=complex) + s = 1j * 2*np.pi * np.asarray(freqs, float).ravel() + phi = self.generate_basis(s, self.poles) + den = self.w0 + phi @ self.residuals.T + if self.Cr is None: + self.Cr = self.non_bias_Cr(w0=self.w0) + for i in range(self.ports): + for j in range(self.ports): + num = phi @ self.Cr[i][j] + H[:,i,j] = (num / den).reshape(1,-1) + return H + + + + diff --git a/core/MultiplePortQR.py b/core/basis/MultiplePortQR.py similarity index 99% rename from core/MultiplePortQR.py rename to core/basis/MultiplePortQR.py index f080085..2ea21c8 100644 --- a/core/MultiplePortQR.py +++ b/core/basis/MultiplePortQR.py @@ -1,9 +1,9 @@ import numpy as np -from core.sk_iter import generate_starting_poles +from core.utils import generate_starting_poles from scipy.linalg import block_diag import skrf as rf from skrf import VectorFitting -from core.freqency import auto_select_multple_ports +from core.sample import auto_select_multple_ports import matplotlib.pyplot as plt import random as rnd diff --git a/core/robust.py b/core/basis/__init__.py similarity index 100% rename from core/robust.py rename to core/basis/__init__.py diff --git a/core/basis.py b/core/basis/basis.py similarity index 99% rename from core/basis.py rename to core/basis/basis.py index 2f16635..70bf970 100644 --- a/core/basis.py +++ b/core/basis/basis.py @@ -1,9 +1,9 @@ import numpy as np -from core.sk_iter import generate_starting_poles +from core.utils import generate_starting_poles from scipy.linalg import block_diag import skrf as rf from skrf import VectorFitting -from core.freqency import auto_select +from core.sample import auto_select class BasicBasis: def __init__(self,H,freqs,poles,weights=None): diff --git a/core/basisQR.py b/core/basis/basisQR.py similarity index 99% rename from core/basisQR.py rename to core/basis/basisQR.py index 6ddbfe7..6a00b1e 100644 --- a/core/basisQR.py +++ b/core/basis/basisQR.py @@ -1,9 +1,9 @@ import numpy as np -from core.sk_iter import generate_starting_poles +from core.utils import generate_starting_poles from scipy.linalg import block_diag import skrf as rf from skrf import VectorFitting -from core.freqency import auto_select +from core.sample import auto_select class BasicBasisQR: def __init__(self,H,freqs,poles,weights=None): diff --git a/core/relaxed_basisQR.py b/core/basis/relaxed_basisQR.py similarity index 99% rename from core/relaxed_basisQR.py rename to core/basis/relaxed_basisQR.py index dd65277..bf957ae 100644 --- a/core/relaxed_basisQR.py +++ b/core/basis/relaxed_basisQR.py @@ -1,9 +1,9 @@ import numpy as np -from core.sk_iter import generate_starting_poles +from core.utils import generate_starting_poles from scipy.linalg import block_diag import skrf as rf from skrf import VectorFitting -from core.freqency import auto_select +from core.sample import auto_select import random as rnd class RelaxedBasicBasisQR: diff --git a/core/freqency.py b/core/sample.py similarity index 100% rename from core/freqency.py rename to core/sample.py diff --git a/core/util.py b/core/util.py deleted file mode 100644 index 53659ef..0000000 --- a/core/util.py +++ /dev/null @@ -1,909 +0,0 @@ -""" - -.. currentmodule:: skrf.util -======================================== -util (:mod:`skrf.util`) -======================================== - -Holds utilities that are general conveniences. - - -Time-related utilities ----------------------- -.. autosummary:: - :toctree: generated/ - - now_string - now_string_2_dt - - ProgressBar - -Array-related functions ------------------------ -.. autosummary:: - :toctree: generated/ - - find_nearest - find_nearest_index - has_duplicate_value - smooth - -File-related functions ----------------------- -.. autosummary:: - :toctree: generated/ - - get_fid - get_extn - basename_noext - git_version - unique_name - findReplace - dict_2_recarray - -General Purpose Objects ------------------------ -.. autosummary:: - :toctree: generated/ - - HomoList - HomoDict - -""" -from __future__ import annotations - -import collections -import contextlib -import fnmatch -import os -import pprint -import re -import sys -import warnings -from datetime import datetime -from functools import wraps -from pathlib import Path -from subprocess import PIPE, Popen -from typing import Any, Callable, Iterable, TypeVar - -import numpy as np - -from skrf.constants import Number - -try: - import matplotlib.pyplot as plt - from matplotlib.axes import Axes - from matplotlib.figure import Figure -except ImportError: - Figure = TypeVar("Figure") - Axes = TypeVar("Axes") - pass - -def plotting_available() -> bool: - return "matplotlib" in sys.modules - -def partial_with_docs(func, *args1, **kwargs1): - @wraps(func) - def method(self, *args2, **kwargs2): - return func(self, *args1, *args2, **kwargs1, **kwargs2) - return method - -def axes_kwarg(func): - """ - This decorator checks if a :class:`matplotlib.axes.Axes` object is passed, - if not the current axis will be gathered through :func:`plt.gca`. - - Raises - ------ - RuntimeError - When trying to run the decorated function without matplotlib - """ - - @wraps(func) - def wrapper(*args, **kwargs): - ax = kwargs.pop('ax', None) - try: - if ax is None: - ax = plt.gca() - except NameError as err: - raise RuntimeError("Plotting is not available") from err - func(*args, ax=ax, **kwargs) - - return wrapper - -def copy_doc(copy_func: Callable) -> Callable: - """Use Example: copy_doc(self.copy_func)(self.func) or used as deco""" - def wrapper(func: Callable) -> Callable: - func.__doc__ = copy_func.__doc__ - return func - return wrapper - -def figure(*args, **kwargs) -> Figure: - """ - Wraps the matplotlib figure call and raises if not available. - - Raises - ------ - RuntimeError - When trying to get subplots without matplotlib installed. - """ - - try: - return plt.figure(*args, **kwargs) - except NameError as err: - raise RuntimeError("Plotting is not available") from err - -def subplots(*args, **kwargs) -> tuple[Figure, np.ndarray]: - """ - Wraps the matplotlib subplots call and raises if not available. - - Raises - ------ - RuntimeError - When trying to get subplots without matplotlib installed. - """ - - try: - return plt.subplots(*args, **kwargs) - except NameError as err: - raise RuntimeError("Plotting is not available") from err - -def now_string() -> str: - """ - Return a unique sortable string, representing the current time. - - Nice for generating date-time stamps to be used in file-names, - the companion function :func:`now_string_2_dt` can be used - to read these string back into datetime objects. - - Returns - ------- - now : string - curent date-time stamps. - - See Also - -------- - now_string_2_dt - - """ - return datetime.now().__str__().replace('-','.').replace(':','.').replace(' ','.') - - -def now_string_2_dt(s: str) -> datetime: - """ - Converts the output of :func:`now_string` to a datetime object. - - Parameters - ---------- - s : str - date-time stamps string as generated by :func:`now_string` - - Returns - ------- - dt : datetime - date-time stamps - - See Also - -------- - now_string - - """ - return datetime(*[int(k) for k in s.split('.')]) - - -def find_nearest(array: np.ndarray, value: Number) -> Number: - """ - Find the nearest value in array. - - Parameters - ---------- - array : np.ndarray - array we are searching for a value in - value : element of the array - value to search for - - Returns - -------- - found_value : an element of the array - the value that is numerically closest to `value` - - """ - idx = find_nearest_index(array, value) - return array[idx] - - -def find_nearest_index(array: np.ndarray, value: Number) -> int: - """ - Find the nearest index for a value in array. - - Parameters - ---------- - array : np.ndarray - array we are searching for a value in - value : element of the array - value to search for - - Returns - -------- - found_index : int - the index at which the numerically closest element to `value` - was found at - - References - ---------- - taken from http://stackoverflow.com/questions/2566412/find-nearest-value-in-numpy-array - - """ - return (np.abs(array-value)).argmin() - - -def slice_domain(x: np.ndarray, domain: tuple): - """ - Returns a slice object closest to the `domain` of `x` - - domain = x[slice_domain(x, (start, stop))] - - Parameters - ---------- - vector : np.ndarray - an array of values - domain : tuple - tuple of (start,stop) values defining the domain over - which to slice - - Examples - -------- - >>> x = linspace(0,10,101) - >>> idx = slice_domain(x, (2,6)) - >>> x[idx] - - """ - start = find_nearest_index(x, domain[0]) - stop = find_nearest_index(x, domain[1]) - return slice(start, stop+1) - -# file IO - - -def get_fid(file, *args, **kwargs): - r""" - Return a file object, given a filename or file object. - - Useful when you want to allow the arguments of a function to - be either files or filenames - - Parameters - ---------- - file : str/unicode, Path, or file-object - file to open - \*args, \*\*kwargs : arguments and keyword arguments to `open()` - - Returns - ------- - fid : file object - - """ - if isinstance(file, (str, Path)): - return open(file, *args, **kwargs) - else: - return file - - -def get_extn(filename: str | Path) -> str: - """ - Get the extension from a filename. - - The extension is defined as everything passed the last '.'. - Returns None if it ain't got one - - Parameters - ---------- - filename : string or Path - the filename - - Returns - ------- - ext : string, None - either the extension (not including '.') or None if there - isn't one - - """ - - if isinstance(filename, Path): - return filename.suffix.strip('.') or None - - ext = os.path.splitext(filename)[-1] - if len(ext) == 0: - return None - else: - return ext[1:] - - -def basename_noext(filename: str) -> str: - """ - Get the basename and strips extension. - - Parameters - ---------- - filename : string - the filename - - Returns - ------- - basename : str - file basename (ie. without extension) - - """ - return os.path.splitext(os.path.basename(filename))[0] - - -# git -def git_version(modname: str) -> str: - """ - Return output 'git describe', executed in a module's root directory. - - Parameters - ---------- - modname : str - module name - - Returns - ------- - out : str - output of 'git describe' - - """ - mod = __import__(modname) - mod_dir = os.path.split(mod.__file__)[0] - p = Popen(['git', 'describe'], stdout=PIPE, stderr=PIPE, cwd=mod_dir) - - try: - out, er = p.communicate() - except(OSError): - return None - - out = out.strip('\n') - if out == '': - return None - return out - - -def dict_2_recarray(d: dict, delim: str, dtype: list[tuple]) -> np.ndarray: - """ - Turn a dictionary of structured keys to a record array of objects. - - This is useful if you save data-base like meta-data in the form - or file-naming conventions, aka 'the poor-mans database' - - Parameters - ---------- - d : dict - dictionnary of structured keys - delim : str - delimiter string - dtype : list of tuple - list of type, where a type is tuple like ('type_name', type) - - Returns - ------- - ra : numpy.array - - Examples - -------- - Given a directory of networks like: - - >>> ls - a1,0.0,0.0.s1p a1,3.0,3.0.s1p a2,3.0,-3.0.s1p b1,-3.0,3.0.s1p - ... - - you can sort based on the values or each field, after defining their - type with `dtype`. The `values` field accesses the objects. - - >>> d = rf.read_all_networks('/tmp/') - >>> delim = ',' - >>> dtype = [('name', object), ('voltage', float), ('current', float)] - >>> ra = dict_2_recarray(d=rf.ran(dir), delim=delim, dtype =dtype) - - then you can sift like you do with numpy arrays - - >>> ra[ra['voltage'] < 3]['values'] - array([1-Port Network: 'a2,0.0,-3.0', 450-800 GHz, 101 pts, z0=[ 50.+0.j], - 1-Port Network: 'b1,0.0,3.0', 450-800 GHz, 101 pts, z0=[ 50.+0.j], - 1-Port Network: 'a1,0.0,-3.0', 450-800 GHz, 101 pts, z0=[ 50.+0.j], - """ - - split_keys = [tuple(k.split(delim)+[d[k]]) for k in d.keys()] - x = np.array(split_keys, dtype=dtype+[('values',object)]) - return x - - -def findReplace(directory: str, find: str, replace: str, file_pattern: str): - r""" - Find/replace some txt in all files in a directory, recursively. - - This was found in [1]_ . - - Parameters - ---------- - directory : str - path of a directory - find : str - pattern to search for - replace : str - string to replace with - file_pattern : str - file pattern for filtering. Ex: '\*.txt'. - - Examples - -------- - >>> rf.findReplace('some_dir', 'find this', 'replace with this', '*.txt') - - References - ---------- - .. [1] http://stackoverflow.com/questions/4205854/python-way-to-recursively-find-and-replace-string-in-text-files - """ - for path, _dirs, files in os.walk(os.path.abspath(directory)): - for filename in fnmatch.filter(files, file_pattern): - filepath = os.path.join(path, filename) - with open(filepath) as f: - s = f.read() - s = s.replace(find, replace) - with open(filepath, "w") as f: - f.write(s) - - -# general purpose objects - -class HomoList(collections.abc.Sequence): - """ - A Homogeneous Sequence. - - Provides a class for a list-like object which contains - homogeneous values. Attributes of the values can be accessed through - the attributes of HomoList. Searching is done like numpy arrays. - - Initialized from a list of all the same type - - >>> h = HomoDict([Foo(...), Foo(...)]) - - The individual values of `h` can be access in identical fashion to - Lists. - - >>> h[0] - - Assuming that `Foo` has property `prop` and function `func` ... - - Access elements' properties: - - >>> h.prop - - Access elements' functions: - - >>> h.func() - - Searching: - - >>> h[h.prop == value] - >>> h[h.prop < value] - - Multiple search: - - >>> h[set(h.prop==value1) & set( h.prop2==value2)] - - Combos: - - >>> h[h.prop==value].func() - """ - - - def __init__(self, list_): - self.store = list(list_) - - def __eq__(self, value): - return [k for k in range(len(self)) if self.store[k] == value ] - - def __ne__(self, value): - return [k for k in range(len(self)) if self.store[k] != value ] - - def __gt__(self, value): - return [k for k in range(len(self)) if self.store[k] > value ] - - def __ge__(self, value): - return [k for k in range(len(self)) if self.store[k] >= value ] - - def __lt__(self, value): - return [k for k in range(len(self)) if self.store[k] < value ] - - def __le__(self, value): - return [k for k in range(len(self)) if self.store[k] <= value ] - - def __getattr__(self, name): - return self.__class__( - [k.__getattribute__(name) for k in self.store]) - - def __getitem__(self, idx): - try: - return self.store[idx] - except(TypeError): - return self.__class__([self.store[k] for k in idx]) - - - def __call__(self, *args, **kwargs): - return self.__class__( - [k(*args,**kwargs) for k in self.store]) - - def __setitem__(self, idx, value): - self.store[idx] = value - - def __delitem__(self, idx): - del self.store[idx] - - def __iter__(self): - return iter(self.store) - - def __len__(self): - return len(self.store) - - def __str__(self): - return pprint.pformat(self.store) - - def __repr__(self): - return pprint.pformat(self.store) - - -class HomoDict(collections.abc.MutableMapping): - """ - A Homogeneous Mutable Mapping. - - Provides a class for a dictionary-like object which contains - homogeneous values. Attributes of the values can be accessed through - the attributes of HomoDict. Searching is done like numpy arrays. - - Initialized from a dictionary containing values of all the same type - - >>> h = HomoDict({'a':Foo(...),'b': Foo(...), 'c':Foo(..)}) - - The individual values of `h` can be access in identical fashion to - Dictionaries. - - >>> h['key'] - - Assuming that `Foo` has property `prop` and function `func` ... - - Access elements' properties: - - >>> h.prop - - Access elements' functions: - - >>> h.func() - - Searching: - - >>> h[h.prop == value] - >>> h[h.prop < value] - - Multiple search: - - >>> h[set(h.prop==value1) & set( h.prop2==value2)] - - Combos: - - >>> h[h.prop==value].func() - """ - def __init__(self, dict_): - self.store = dict(dict_) - - def __eq__(self, value): - return [k for k in self.store if self.store[k] == value ] - - def __ne__(self, value): - return [k for k in self.store if self.store[k] != value ] - - def __gt__(self, value): - return [k for k in self.store if self.store[k] > value ] - - def __ge__(self, value): - return [k for k in self.store if self.store[k] >= value ] - - def __lt__(self, value): - return [k for k in self.store if self.store[k] < value ] - - def __le__(self, value): - return [k for k in self.store if self.store[k] <= value ] - - def __getattr__(self, name): - return self.__class__( - {k: getattr(self.store[k],name) for k in self.store}) - - def __getitem__(self, key): - if isinstance(key, str): - return self.store[key] - else: - c = self.__class__({k:self.store[k] for k in key}) - return c - #if len(c) == 1: - # return c.store.values()[0] - #else: - # return c - - def __call__(self, *args, **kwargs): - return self.__class__( - {k: self.store[k](*args, **kwargs) for k in self.store}) - - def __setitem__(self, key, value): - self.store[key] = value - - def __delitem__(self, key): - del self.store[key] - - def __iter__(self): - return iter(self.store) - - def __len__(self): - return len(self.store) - - def __str__(self): - return pprint.pformat(self.store) - - def __repr__(self): - return pprint.pformat(self.store) - - - def copy(self): - return HomoDict(self.store) - - - def filter_nones(self): - self.store = {k:self.store[k] for k in self.store \ - if self.store[k] is not None} - - def filter(self, **kwargs): - """ - Filter self based on kwargs - - This is equivalent to: - - >>> h = HomoDict(...) - >>> for k in kwargs: - >>> h = h[k ==kwargs[k]] - >>> return h - - prefixing the kwarg value with a '!' causes a not equal test (!=) - - Examples - ---------- - >>> h = HomoDict(...) - >>> h.filter(name='jean', age = '18', gender ='!female') - - """ - a = self - for k in kwargs: - if kwargs[k][0] == '!': - a = a[a.__getattr__(k) != kwargs[k][1:]] - else: - a = a[a.__getattr__(k) == kwargs[k]] - return a - - -def has_duplicate_value(value: Any, values: Iterable, index: int) -> bool | int: - """ - Check if there is another value of the current index in the list. - - Parameters - ---------- - value : Any - any value in a list - values : Iterable - the iterable containing the values - index : int - the index of the current item we are checking for. - - Returns - ------- - index : bool or int - returns None if no duplicate found, or the index of the first found duplicate - - Examples - -------- - >>> rf.has_duplicate_value(0, [1, 2, 0, 3, 0], -1) # -> 2 - >>> rf.has_duplicate_value(0, [1, 2, 0, 3, 0], 2) # -> 4 - >>> rf.has_duplicate_value(3, [1, 2, 0, 3, 0], 0) # -> 3 - >>> rf.has_duplicate_value(3, [1, 2, 0, 3, 0], 3) # -> False - """ - - for i, val in enumerate(values): - if i == index: - continue - if value == val: - return i - return False - - -def unique_name(name: str, names: list, exclude: int = -1) -> str: - """ - Pass in a name and a list of names, and increment with _## as necessary to ensure a unique name. - - Parameters - ---------- - name : str - the chosen name, to be modified if necessary - names : list - list of names (str) - exclude : int, optional - the index of an item to be excluded from the search. Default is -1. - - Returns - ------- - unique_name : str - - """ - if not has_duplicate_value(name, names, exclude): - return name - else: - if re.match(r"_\d\d", name[-3:]): - name_base = name[:-3] - suffix = int(name[-2:]) - else: - name_base = name - suffix = 1 - - for num in range(suffix, 100, 1): - name = f"{name_base:s}_{num:02d}" - if not has_duplicate_value(name, names, exclude): - break - return name - - -def smooth(x: np.ndarray, window_len: int = 11, window: str = 'flat') -> np.ndarray: - """ - Smooth the data using a window with requested size. - - Based on the function from the scipy cookbook [#]_ - - This method is based on the convolution of a scaled window with the signal. - The signal is prepared by introducing reflected copies of the signal - (with the window size) in both ends so that transient parts are minimized - in the beginning and end part of the output signal. - - Parameters - ---------- - x : numpy.array - the input signal - window_len : int, optional - the dimension of the smoothing window; should be an odd integer. - Default is 11. - window : str, optional - the type of window from 'flat', 'hanning', 'hamming', 'bartlett', 'blackman' - flat window will produce a moving average smoothing. Default is 'flat' - - Returns - ------- - y : numpy.array - The smoothed signal - - Examples - -------- - >>> t = linspace(-2, 2, 0.1) - >>> x = sin(t) + randn(len(t))*0.1 - >>> y = smooth(x) - - See Also - -------- - numpy.hanning, numpy.hamming, numpy.bartlett, numpy.blackman, numpy.convolve - scipy.signal.lfilter - - Note - ---- - `length(output) != length(input)`. - To correct this: `return y[(window_len/2-1):-(window_len/2)]` instead of just `y`. - - References - ---------- - .. [#] http://scipy-cookbook.readthedocs.io/items/SignalSmooth.html - - """ - - if x.ndim != 1: - raise ValueError("smooth only accepts 1 dimension arrays.") - - if x.size < window_len: - raise ValueError("Input vector needs to be bigger than window size.") - - if window_len < 3: - return x - - if window not in ['flat', 'hanning', 'hamming', 'bartlett', 'blackman']: - raise ValueError("Window is one of 'flat', 'hanning', 'hamming', 'bartlett', 'blackman'") - - s = np.r_[x[window_len - 1:0:-1], x, x[-2:-window_len - 1:-1]] - if window == 'flat': # moving average - w = np.ones(window_len, 'd') - else: - w = eval('np.' + window + '(window_len)') - y = np.convolve(w / w.sum(), s, mode='same') - return y[window_len-1:-(window_len-1)] - - -class ProgressBar: - """ - A progress bar based off of the notebook/ipython progress bar from PyMC. - - Useful when waiting for long operations such as taking a large number - of VNA measurements that may take a few minutes. - - Examples - -------- - >>> from time import sleep - >>> pb = rf.ProgressBar(10) - >>> for idx in range(10): - >>> sleep(1) - >>> pb.animate(idx) - - """ - def __init__(self, iterations: int, label: str = "iterations"): - """ - Progress bar constructor. - - Parameters - ---------- - iterations : int - Number of expected iterations - label : str, optional - Progress bar label, by default "iterations" - """ - self.iterations = iterations - self.label = label - self.prog_bar = '[]' - self.fill_char = '*' - self.width = 50 - self.__update_amount(0) - - def animate(self, iteration: int): - """ - Animate the progress bar. - - Parameters - ---------- - iteration : int - current iteration - """ - print('\r', self, end='') - sys.stdout.flush() - self.update_iteration(iteration + 1) - - def update_iteration(self, elapsed_iter: int): - self.__update_amount((elapsed_iter / float(self.iterations)) * 100.0) - self.prog_bar += ' %d of %s %s complete' % (elapsed_iter, self.iterations, self.label) - - def __update_amount(self, new_amount: int): - percent_done = int(round((new_amount / 100.0) * 100.0)) - all_full = self.width - 2 - num_hashes = int(round((percent_done / 100.0) * all_full)) - self.prog_bar = '[' + self.fill_char * num_hashes + ' ' * (all_full - num_hashes) + ']' - pct_place = (len(self.prog_bar) // 2) - len(str(percent_done)) - pct_string = '%d%%' % percent_done - self.prog_bar = self.prog_bar[0:pct_place] + \ - (pct_string + self.prog_bar[pct_place + len(pct_string):]) - - def __str__(self): - return str(self.prog_bar) - - -@contextlib.contextmanager -def suppress_numpy_warnings(**kw): - olderr = np.seterr(**kw) - yield - np.seterr(**olderr) - - -def suppress_warning_decorator(msg): - def suppress_warnings_decorated(func): - @wraps(func) - def suppressed_func(*k, **kw): - with warnings.catch_warnings(): - warnings.filterwarnings("ignore", message=f"{msg}.*") - res = func(*k, **kw) - return res - return suppressed_func - return suppress_warnings_decorated diff --git a/core/sk_iter.py b/core/utils.py similarity index 56% rename from core/sk_iter.py rename to core/utils.py index 47681f6..dbeaabe 100644 --- a/core/sk_iter.py +++ b/core/utils.py @@ -2,6 +2,18 @@ import numpy as np from dataclasses import dataclass from typing import List, Dict, Tuple +def cond_row_inf(A, use_pinv=True): + """行条件数 κ∞(A) = ||A||∞ * ||A^{-1}||∞;矩形阵用广义逆。""" + A = np.asarray(A) + Ainv = np.linalg.pinv(A) if (use_pinv or A.shape[0] != A.shape[1]) else np.linalg.inv(A) + return np.linalg.norm(A, ord=np.inf) * np.linalg.norm(Ainv, ord=np.inf) + +def cond_col_one(A, use_pinv=True): + """列条件数 κ1(A) = ||A||1 * ||A^{-1}||1;矩形阵用广义逆。""" + A = np.asarray(A) + Ainv = np.linalg.pinv(A) if (use_pinv or A.shape[0] != A.shape[1]) else np.linalg.inv(A) + return np.linalg.norm(A, ord=1) * np.linalg.norm(Ainv, ord=1) + def generate_starting_poles(n_pairs: int, beta_min: float, beta_max: float, alpha_scale: float = 0.01): """ 仅生成复共轭对: p = -alpha + j beta, p*。 diff --git a/core/vectorFitting.py b/core/vectorFitting.py deleted file mode 100644 index 3317aff..0000000 --- a/core/vectorFitting.py +++ /dev/null @@ -1,2617 +0,0 @@ -from __future__ import annotations - -import logging -import os -import warnings -from timeit import default_timer as timer -from typing import TYPE_CHECKING, Any - -import numpy as np -from scipy.integrate import trapezoid - -from .util import Axes, axes_kwarg - -# imports for type hinting -if TYPE_CHECKING: - from skrf import Network - - -logger = logging.getLogger(__name__) - - -class VectorFitting: - """ - This class provides a Python implementation of the Vector Fitting algorithm and various functions for the fit - analysis, passivity evaluation and enforcement, and export of SPICE equivalent circuits. - - Parameters - ---------- - network : :class:`skrf.network.Network` - Network instance of the :math:`N`-port holding the frequency responses to be fitted, for example a - scattering, impedance or admittance matrix. - - Examples - -------- - Load the `Network`, create a `VectorFitting` instance, perform the fit with a given number of real and - complex-conjugate starting poles: - - >>> nw_3port = skrf.Network('my3port.s3p') - >>> vf = skrf.VectorFitting(nw_3port) - >>> vf.vector_fit(n_poles_real=1, n_poles_cmplx=4) - - Notes - ----- - The fitting code is based on the original algorithm [#Gustavsen_vectfit]_ and on two improvements for relaxed pole - relocation [#Gustavsen_relaxed]_ and efficient (fast) solving [#Deschrijver_fast]_. See also the Vector Fitting - website [#vectfit_website]_ for further information and download of the papers listed below. A Matlab implementation - is also available there for reference. - - References - ---------- - .. [#Gustavsen_vectfit] B. Gustavsen, A. Semlyen, "Rational Approximation of Frequency Domain Responses by Vector - Fitting", IEEE Transactions on Power Delivery, vol. 14, no. 3, pp. 1052-1061, July 1999, - DOI: https://doi.org/10.1109/61.772353 - - .. [#Gustavsen_relaxed] B. Gustavsen, "Improving the Pole Relocating Properties of Vector Fitting", IEEE - Transactions on Power Delivery, vol. 21, no. 3, pp. 1587-1592, July 2006, - DOI: https://doi.org/10.1109/TPWRD.2005.860281 - - .. [#Deschrijver_fast] D. Deschrijver, M. Mrozowski, T. Dhaene, D. De Zutter, "Marcomodeling of Multiport Systems - Using a Fast Implementation of the Vector Fitting Method", IEEE Microwave and Wireless Components Letters, - vol. 18, no. 6, pp. 383-385, June 2008, DOI: https://doi.org/10.1109/LMWC.2008.922585 - - .. [#vectfit_website] Vector Fitting website: https://www.sintef.no/projectweb/vectorfitting/ - """ - - def __init__(self, network: Network): - self.network = network - """ Instance variable holding the Network to be fitted. This is the Network passed during initialization, - which may be changed or set to *None*. """ - - self.poles = None - """ Instance variable holding the list of fitted poles. Will be initialized by :func:`vector_fit`. """ - - self.residues = None - """ Instance variable holding the list of fitted residues. Will be initialized by :func:`vector_fit`. """ - - self.proportional_coeff = None - """ Instance variable holding the list of fitted proportional coefficients. Will be initialized by - :func:`vector_fit`. """ - - self.constant_coeff = None - """ Instance variable holding the list of fitted constants. Will be initialized by :func:`vector_fit`. """ - - self.max_iterations = 100 - """ Instance variable specifying the maximum number of iterations for the fitting process and for the passivity - enforcement. To be changed by the user before calling :func:`vector_fit` and/or :func:`passivity_enforce`. """ - - self.max_tol = 1e-6 - """ Instance variable specifying the convergence criterion in terms of relative tolerance. To be changed by the - user before calling :func:`vector_fit`. """ - - self.wall_clock_time = 0 - """ Instance variable holding the wall-clock time (in seconds) consumed by the most recent fitting process with - :func:`vector_fit`. Subsequent calls of :func:`vector_fit` will overwrite this value. """ - - self.d_res_history = [] - self.delta_max_history = [] - self.history_max_sigma = [] - self.history_cond_A = [] - self.history_rank_deficiency = [] - - @staticmethod - def get_spurious(poles: np.ndarray, residues: np.ndarray, n_freqs: int = 101, gamma: float = 0.03) -> np.ndarray: - """ - Classifies fitted pole-residue pairs as spurious or not spurious. The implementation is based on the evaluation - of band-limited energy norms (p=2) of the resonance curves of individual pole-residue pairs, as proposed in - [#Grivet-Talocia]_. - - Parameters - ---------- - poles : ndarray, shape (N) - Array of fitted poles - - residues : ndarray, shape (M, N) - Array of fitted residues - - n_freqs : int, optional - Number of frequencies for the evaluation. The frequency range is chosen automatically and the default - 101 frequencies should be appropriate in most cases. - - gamma : float, optional - Sensitivity threshold for the classification. Typical values range from 0.01 to 0.05. - - Returns - ------- - ndarray, bool, shape (M) - Boolean array having the same shape as :attr:`poles`. `True` marks the respective pole as spurious. - - References - ---------- - .. [#Grivet-Talocia] S. Grivet-Talocia and M. Bandinu, "Improving the convergence of vector fitting for - equivalent circuit extraction from noisy frequency responses," in IEEE Transactions on Electromagnetic - Compatibility, vol. 48, no. 1, pp. 104-120, Feb. 2006, DOI: https://doi.org/10.1109/TEMC.2006.870814 - """ - - omega_eval = np.linspace(np.min(poles.imag) / 3, np.max(poles.imag) * 3, n_freqs) - h = (residues[:, None, :] / (1j * omega_eval[:, None] - poles) - + np.conj(residues[:, None, :]) / (1j * omega_eval[:, None] - np.conj(poles))) - norm2 = np.sqrt(trapezoid(h.real ** 2 + h.imag ** 2, omega_eval, axis=1)) - spurious = np.all(norm2 / np.mean(norm2) < gamma, axis=0) - return spurious - - @staticmethod - def get_model_order(poles: np.ndarray) -> int: - """ - Returns the model order calculated with :math:`N_{real} + 2 N_{complex}` for a given set of poles. - - Parameters - ---------- - poles: ndarray - The poles of the model as a list or NumPy array. - - Returns - ------- - order: int - """ - # poles.imag != 0 is True(1) for complex poles, False (0) for real poles. - # Adding one to each element gives 2 columns for complex and 1 column for real poles. - return np.sum((poles.imag != 0) + 1) - - def vector_fit(self, n_poles_real: int = 2, n_poles_cmplx: int = 2, init_pole_spacing: str = 'lin', - parameter_type: str = 's', fit_constant: bool = True, fit_proportional: bool = False) -> None: - """ - Main work routine performing the vector fit. The results will be stored in the class variables - :attr:`poles`, :attr:`residues`, :attr:`proportional_coeff` and :attr:`constant_coeff`. - - Parameters - ---------- - n_poles_real : int, optional - Number of initial real poles. See notes. - - n_poles_cmplx : int, optional - Number of initial complex conjugate poles. See notes. - - init_pole_spacing : str, optional - Type of initial pole spacing across the frequency interval of the S-matrix. Either *linear* (`'lin'`), - *logarithmic* (`'log'`), or `custom`. In case of `custom`, the initial poles must be stored in :attr:`poles` - as a NumPy array before calling this method. They will be overwritten by the final poles. The - initialization parameters `n_poles_real` and `n_poles_cmplx` will be ignored in case of `'custom'`. - - parameter_type : str, optional - Representation type of the frequency responses to be fitted. Either *scattering* (`'s'` or `'S'`), - *impedance* (`'z'` or `'Z'`) or *admittance* (`'y'` or `'Y'`). It's recommended to perform the fit on the - original S parameters. Otherwise, scikit-rf will convert the responses from S to Z or Y, which might work - for the fit but can cause other issues. - - fit_constant : bool, optional - Include a constant term **d** in the fit. - - fit_proportional : bool, optional - Include a proportional term **e** in the fit. - - Returns - ------- - None - No return value. - - Notes - ----- - The required number of real or complex conjugate starting poles depends on the behaviour of the frequency - responses. To fit a smooth response such as a low-pass characteristic, 1-3 real poles and no complex conjugate - poles is usually sufficient. If resonances or other types of peaks are present in some or all of the responses, - a similar number of complex conjugate poles is required. Be careful not to use too many poles, as excessive - poles will not only increase the computation workload during the fitting and the subsequent use of the model, - but they can also introduce unwanted resonances at frequencies well outside the fit interval. - - See Also - -------- - auto_fit : Automatic vector fitting routine with pole adding and skimming. - """ - - timer_start = timer() - - # use normalized frequencies during the iterations (seems to be more stable during least-squares fit) - norm = np.average(self.network.f) - # norm = np.exp(np.mean(np.log(self.network.f))) - freqs_norm = np.array(self.network.f) / norm - - # get initial poles - poles = self._init_poles(freqs_norm, n_poles_real, n_poles_cmplx, init_pole_spacing) - - # check and normalize custom poles - if poles is None: - if self.poles is not None and len(self.poles) > 0: - poles = self.poles / norm - else: - raise ValueError('Initial poles must be provided in `self.poles` when calling with ' - '`init_pole_spacing == \'custom\'`.') - - # save initial poles (un-normalize first) - initial_poles = poles * norm - max_singular = 1 - - logger.info('### Starting pole relocation process.\n') - - # select network representation type - if parameter_type.lower() == 's': - nw_responses = self.network.s - elif parameter_type.lower() == 'z': - nw_responses = self.network.z - elif parameter_type.lower() == 'y': - nw_responses = self.network.y - else: - warnings.warn('Invalid choice of matrix parameter type (S, Z, or Y); proceeding with scattering ' - 'representation.', UserWarning, stacklevel=2) - nw_responses = self.network.s - - # stack frequency responses as a single vector - # stacking order (row-major): - # s11, s12, s13, ..., s21, s22, s23, ... - freq_responses = [] - for i in range(self.network.nports): - for j in range(self.network.nports): - freq_responses.append(nw_responses[:, i, j]) - freq_responses = np.array(freq_responses) - - # responses will be weighted according to their norm; - # alternative: equal weights with weight_response = 1.0 - # or anti-proportional weights with weight_response = 1 / np.linalg.norm(freq_response) - weights_responses = np.linalg.norm(freq_responses, axis=1) - #weights_responses = np.ones(self.network.nports ** 2) - #weights_responses = 10 / np.exp(np.mean(np.log(np.abs(freq_responses)), axis=1)) - - # ITERATIVE FITTING OF POLES to the provided frequency responses - # initial set of poles will be replaced with new poles after every iteration - iterations = self.max_iterations - self.d_res_history = [] - self.delta_max_history = [] - self.history_cond_A = [] - self.history_rank_deficiency = [] - converged = False - - # POLE RELOCATION LOOP - while iterations > 0: - logger.info(f'Iteration {self.max_iterations - iterations + 1}') - - poles, d_res, cond, rank_deficiency, residuals, singular_vals = self._pole_relocation( - poles, freqs_norm, freq_responses, weights_responses, fit_constant, fit_proportional) - - logger.info(f'Condition number of coefficient matrix is {int(cond)}') - self.history_cond_A.append(cond) - - self.history_rank_deficiency.append(rank_deficiency) - logger.info(f'Rank deficiency is {rank_deficiency}.') - - self.d_res_history.append(d_res) - logger.info(f'd_res = {d_res}') - - # calculate relative changes in the singular values; stop iteration loop once poles have converged - new_max_singular = np.amax(singular_vals) - delta_max = np.abs(1 - new_max_singular / max_singular) - self.delta_max_history.append(delta_max) - logger.info(f'Max. relative change in residues = {delta_max}\n') - max_singular = new_max_singular - - stop = False - if delta_max < self.max_tol: - if converged: - # is really converged, finish - logger.info(f'Pole relocation process converged after {self.max_iterations - iterations + 1} ' - 'iterations.') - stop = True - else: - # might be converged, but do one last run to be sure - converged = True - else: - if converged: - # is not really converged, continue - converged = False - - iterations -= 1 - - if iterations == 0: - # loop ran into iterations limit; trying to assess the issue - max_cond = np.amax(self.history_cond_A) - max_deficiency = np.amax(self.history_rank_deficiency) - if max_cond > 1e10: - hint_illcond = ('\nHint: the linear system was ill-conditioned (max. condition number was ' - f'{max_cond}).') - else: - hint_illcond = '' - if max_deficiency < 0: - hint_rank = ('\nHint: the coefficient matrix was rank-deficient (max. rank deficiency was ' - f'{max_deficiency}).') - else: - hint_rank = '' - if converged and stop is False: - warnings.warn('Vector Fitting: The pole relocation process barely converged to tolerance. ' - f'It took the max. number of iterations (N_max = {self.max_iterations}). ' - 'The results might not have converged properly.' - + hint_illcond + hint_rank, RuntimeWarning, stacklevel=2) - else: - warnings.warn('Vector Fitting: The pole relocation process stopped after reaching the ' - f'maximum number of iterations (N_max = {self.max_iterations}). ' - 'The results did not converge properly.' - + hint_illcond + hint_rank, RuntimeWarning, stacklevel=2) - - if stop: - iterations = 0 - - # ITERATIONS DONE - logger.info('Initial poles before relocation:') - logger.info(initial_poles) - - logger.info('Final poles:') - logger.info(poles * norm) - - logger.info('\n### Starting residues calculation process.\n') - - # finally, solve for the residues with the previously calculated poles - residues, constant_coeff, proportional_coeff, residuals, rank, singular_vals = self._fit_residues( - poles, freqs_norm, freq_responses, fit_constant, fit_proportional) - - # save poles, residues, d, e in actual frequencies (un-normalized) - self.poles = poles * norm - self.residues = np.array(residues) * norm - self.constant_coeff = np.array(constant_coeff) - self.proportional_coeff = np.array(proportional_coeff) / norm - - timer_stop = timer() - self.wall_clock_time = timer_stop - timer_start - - logger.info(f'\n### Vector fitting finished in {self.wall_clock_time} seconds.\n') - - # raise a warning if the fitted Network is passive but the fit is not (only without proportional_coeff): - if self.network.is_passive() and not fit_proportional: - if not self.is_passive(): - warnings.warn('The fitted network is passive, but the vector fit is not passive. Consider running ' - '`passivity_enforce()` to enforce passivity before using this model.', - UserWarning, stacklevel=2) - - def auto_fit(self, n_poles_init_real: int = 3, n_poles_init_cmplx: int = 3, n_poles_add: int = 3, - model_order_max: int = 100, iters_start: int = 3, iters_inter: int = 3, iters_final: int = 5, - target_error: float = 1e-2, alpha: float = 0.03, gamma: float = 0.03, nu_samples: float = 1.0, - parameter_type: str = 's') -> (np.ndarray, np.ndarray): - """ - Automatic fitting routine implementing the "vector fitting with adding and skimming" algorithm as proposed in - [#Grivet-Talocia]_. This algorithm is able to provide high quality macromodels with automatic model order - optimization, while improving both the rate of convergence and the fit quality in case of noisy data. - The resulting model parameters will be stored in the class variables :attr:`poles`, :attr:`residues`, - :attr:`proportional_coeff` and :attr:`constant_coeff`. - - Parameters - ---------- - n_poles_init_real: int, optional - Number of real poles in the initial model. - - n_poles_init_cmplx: int, optional - Number of complex conjugate poles in the initial model. - - n_poles_add: int, optional - Number of new poles allowed to be added in each refinement iteration, if possible. This controls how fast - the model order is allowed to grow. Unnecessary poles will have to be skimmed and removed later. This - parameter has a strong effect on the convergence. - - model_order_max: int, optional - Maximum model order as calculated with :math:`N_{real} + 2 N_{complex}`. This parameter provides a stopping - criterion in case the refinement process is not converging. - - iters_start: int, optional - Number of initial iterations for pole relocations as in regular vector fitting. - - iters_inter: int, optional - Number of intermediate iterations for pole relocations during each iteration of the refinement process. - - iters_final: int, optional - Number of final iterations for pole relocations after the refinement process. - - target_error: float, optional - Target for the model error to be reached during the refinement process. The actual achievable error is - bound by the noise in the data. If specified with a number greater than the noise floor, this parameter - provides another stopping criterion for the refinement process. It therefore affects both the convergence, - the final error, and the final model order (number of poles used in the model). - - alpha: float, optional - Threshold for the error decay to stop the refinement loop in case of error stagnation. This parameter - provides another stopping criterion for cases where the model already has enough poles but the target error - still cannot be reached because of excess noise (target error too small for noise level in the data). - - gamma: float, optional - Threshold for the detection of spurious poles. - - nu_samples: float, optional - Required and enforced (relative) spacing in terms of frequency samples between existing poles and - relocated or added poles. The number can be a float, it does not have to be an integer. - - parameter_type: str, optional - Representation type of the frequency responses to be fitted. Either *scattering* (`'s'` or `'S'`), - *impedance* (`'z'` or `'Z'`) or *admittance* (`'y'` or `'Y'`). It's recommended to perform the fit on the - original S parameters. Otherwise, scikit-rf will convert the responses from S to Z or Y, which might work - for the fit but can cause other issues. - - Returns - ------- - None - No return value. - - See Also - -------- - vector_fit : Regular vector fitting routine. - - References - ---------- - .. [#Grivet-Talocia] S. Grivet-Talocia and M. Bandinu, "Improving the convergence of vector fitting for - equivalent circuit extraction from noisy frequency responses," in IEEE Transactions on Electromagnetic - Compatibility, vol. 48, no. 1, pp. 104-120, Feb. 2006, DOI: https://doi.org/10.1109/TEMC.2006.870814 - """ - - self.d_res_history = [] - self.delta_max_history = [] - self.history_cond_A = [] - self.history_rank_deficiency = [] - max_singular = 1 - error_peak_history = [] - model_order_history = [] - - timer_start = timer() - - # use normalized frequencies during the iterations (seems to be more stable during least-squares fit) - norm = np.average(self.network.f) - # norm = np.exp(np.mean(np.log(self.network.f))) - freqs_norm = np.array(self.network.f) / norm - omega_norm = 2 * np.pi * freqs_norm - nu = (omega_norm[1] - omega_norm[0]) * nu_samples - - # get initial poles - poles = self._init_poles(freqs_norm, n_poles_init_real, n_poles_init_cmplx, 'lin') - - logger.info('### Starting pole relocation process.\n') - - # select network representation type - if parameter_type.lower() == 's': - nw_responses = self.network.s - fit_constant = True - fit_proportional = False - elif parameter_type.lower() == 'z': - nw_responses = self.network.z - fit_constant = True - fit_proportional = True - elif parameter_type.lower() == 'y': - nw_responses = self.network.y - fit_constant = True - fit_proportional = True - else: - warnings.warn('Invalid choice of matrix parameter type (S, Z, or Y); proceeding with scattering ' - 'representation.', UserWarning, stacklevel=2) - nw_responses = self.network.s - fit_constant = True - fit_proportional = False - - # stack frequency responses as a single vector - # stacking order (row-major): - # s11, s12, s13, ..., s21, s22, s23, ... - freq_responses = [] - for i in range(self.network.nports): - for j in range(self.network.nports): - freq_responses.append(nw_responses[:, i, j]) - freq_responses = np.array(freq_responses) - - # responses will be weighted according to their norm; - # alternative: equal weights with weight_response = 1.0 - # or anti-proportional weights with weight_response = 1 / np.linalg.norm(freq_response) - weights_responses = np.linalg.norm(freq_responses, axis=1) - # weights_responses = np.ones(self.network.nports ** 2) - # weights_responses = 10 / np.exp(np.mean(np.log(np.abs(freq_responses)), axis=1)) - - # INITIAL POLE RELOCATION FOR i_start ITERATIONS - for _ in range(iters_start): - poles, d_res, cond, rank_deficiency, residuals, singular_vals = self._pole_relocation( - poles, freqs_norm, freq_responses, weights_responses, fit_constant, fit_proportional) - - self.d_res_history.append(d_res) - - logger.info(f'Condition number of coefficient matrix is {int(cond)}') - self.history_cond_A.append(cond) - - self.history_rank_deficiency.append(rank_deficiency) - logger.info(f'Rank deficiency is {rank_deficiency}.') - - new_max_singular = np.amax(singular_vals) - delta_max = np.abs(1 - new_max_singular / max_singular) - self.delta_max_history.append(delta_max) - logger.info(f'Max. relative change in residues = {delta_max}\n') - max_singular = new_max_singular - - # RESIDUE FITTING FOR ERROR COMPUTATION - residues, constant_coeff, proportional_coeff, residuals, rank, singular_vals = self._fit_residues( - poles, freqs_norm, freq_responses, fit_constant, fit_proportional, enforce_dc=False) - delta = self._get_delta(poles, residues, constant_coeff, proportional_coeff, freqs_norm, freq_responses, - weights_responses) - error_peak = np.max(delta) - error_peak_history.append(error_peak) - - model_order = self.get_model_order(poles) - model_order_history.append(model_order) - - delta_eps = 10 * alpha - - # POLE SKIMMING AND ADDING LOOP - while error_peak > target_error and model_order < model_order_max and delta_eps > alpha: - - # SKIMMING OF SPURIOUS POLES - spurious = self.get_spurious(poles, residues, gamma=gamma) - n_skim = np.sum(spurious) - poles = poles[~spurious] - - # REPLACING SPURIOUS POLE AND ADDING NEW POLES - idx_freqs_start, idx_freqs_stop, idx_freqs_max, delta_mean_bands = self._find_error_bands(freqs_norm, delta) - - n_bands = len(idx_freqs_max) - if n_bands < n_skim: - n_add = n_bands - elif n_bands < n_skim + n_poles_add: - n_add = n_bands - else: - n_add = n_skim + n_poles_add - - for i in range(n_add): - omega_add = omega_norm[idx_freqs_max[i]] - pole_add = (-0.01 + 1j) * omega_add - - # compute distance to neighbouring poles - abs_poles_existing = np.abs(poles) - pole_add.imag # (equation 16) - #abs_poles_existing = np.abs(poles - pole_add) # (equation 17) - - # avoid forbidden bands (too close to neighbour) - if np.min(abs_poles_existing) < nu or pole_add.imag < nu: - # decide shift direction (towards higher or lower frequencies) - if idx_freqs_max[i] > 0: - delta_below = delta[idx_freqs_max[i] - 1] - else: - delta_below = 0 - if idx_freqs_max[i] < len(omega_norm) - 1: - delta_above = delta[idx_freqs_max[i] + 1] - else: - delta_above = 0 - - if delta_above > delta_below: - # shift to higher frequencies - pole_add += 1j * nu - else: - # shift to lower frequencies - pole_add -= 1j * nu - - poles = np.append(poles, [pole_add]) - - # INTERMEDIATE POLE RELOCATION FOR i_inter ITERATIONS - for _ in range(iters_inter): - poles, d_res, cond, rank_deficiency, residuals, singular_vals = self._pole_relocation( - poles, freqs_norm, freq_responses, weights_responses, fit_constant, fit_proportional) - - self.d_res_history.append(d_res) - - logger.info(f'Condition number of coefficient matrix is {int(cond)}') - self.history_cond_A.append(cond) - - self.history_rank_deficiency.append(rank_deficiency) - logger.info(f'Rank deficiency is {rank_deficiency}.') - - new_max_singular = np.amax(singular_vals) - delta_max = np.abs(1 - new_max_singular / max_singular) - self.delta_max_history.append(delta_max) - logger.info(f'Max. relative change in residues = {delta_max}\n') - max_singular = new_max_singular - - # RESIDUE FITTING FOR ERROR COMPUTATION - residues, constant_coeff, proportional_coeff, residuals, rank, singular_vals = self._fit_residues( - poles, freqs_norm, freq_responses, fit_constant, fit_proportional, enforce_dc=False) - delta = self._get_delta(poles, residues, constant_coeff, proportional_coeff, freqs_norm, freq_responses, - weights_responses) - error_peak_history.append(np.max(delta)) - - m = 3 - if len(error_peak_history) > m: - delta_eps = np.mean(np.abs(np.diff(error_peak_history[-1-m:-1]))) - else: - delta_eps = 1 - - model_order = self.get_model_order(poles) - model_order_history.append(model_order) - - # SKIMMING OF SPURIOUS POLES - spurious = self.get_spurious(poles, residues, gamma=gamma) - poles = poles[~spurious] - - # FINAL POLE RELOCATION FOR i_final ITERATIONS - for _ in range(iters_final): - poles, d_res, cond, rank_deficiency, residuals, singular_vals = self._pole_relocation( - poles, freqs_norm, freq_responses, weights_responses, fit_constant, fit_proportional) - - self.d_res_history.append(d_res) - - logger.info(f'Condition number of coefficient matrix is {int(cond)}') - self.history_cond_A.append(cond) - - self.history_rank_deficiency.append(rank_deficiency) - logger.info(f'Rank deficiency is {rank_deficiency}.') - - new_max_singular = np.amax(singular_vals) - delta_max = np.abs(1 - new_max_singular / max_singular) - self.delta_max_history.append(delta_max) - logger.info(f'Max. relative change in residues = {delta_max}\n') - max_singular = new_max_singular - - # FINAL RESIDUE FITTING - residues, constant_coeff, proportional_coeff, residuals, rank, singular_vals = self._fit_residues( - poles, freqs_norm, freq_responses, fit_constant, fit_proportional, enforce_dc=True) - - # save poles, residues, d, e in actual frequencies (un-normalized) - self.poles = poles * norm - self.residues = np.array(residues) * norm - self.constant_coeff = np.array(constant_coeff) - self.proportional_coeff = np.array(proportional_coeff) / norm - - timer_stop = timer() - self.wall_clock_time = timer_stop - timer_start - - @staticmethod - def _init_poles(freqs: list, n_poles_real: int, n_poles_cmplx: int, init_pole_spacing: str): - # create initial poles and space them across the frequencies in the provided Touchstone file - - fmin = np.amin(freqs) - fmax = np.amax(freqs) - - # poles cannot be at f=0; hence, f_min for starting pole must be greater than 0 - if fmin == 0.0: - # random choice: use 1/1000 of first non-zero frequency - fmin = freqs[1] / 1000 - - init_pole_spacing = init_pole_spacing.lower() - if init_pole_spacing == 'log': - pole_freqs_real = np.geomspace(fmin, fmax, n_poles_real) - pole_freqs_cmplx = np.geomspace(fmin, fmax, n_poles_cmplx) - elif init_pole_spacing == 'lin': - pole_freqs_real = np.linspace(fmin, fmax, n_poles_real) - pole_freqs_cmplx = np.linspace(fmin, fmax, n_poles_cmplx) - elif init_pole_spacing == 'custom': - pole_freqs_real = None - pole_freqs_cmplx = None - else: - warnings.warn('Invalid choice of initial pole spacing; proceeding with linear spacing.', - UserWarning, stacklevel=2) - pole_freqs_real = np.linspace(fmin, fmax, n_poles_real) - pole_freqs_cmplx = np.linspace(fmin, fmax, n_poles_cmplx) - - if pole_freqs_real is not None and pole_freqs_cmplx is not None: - # init poles array of correct length - poles = np.zeros(n_poles_real + n_poles_cmplx, dtype=complex) - - # add real poles - for i, f in enumerate(pole_freqs_real): - omega = 2 * np.pi * f - poles[i] = -1 * omega - - # add complex-conjugate poles (store only positive imaginary parts) - i_offset = len(pole_freqs_real) - for i, f in enumerate(pole_freqs_cmplx): - omega = 2 * np.pi * f - poles[i_offset + i] = (-0.01 + 1j) * omega - - return poles - - else: - return None - - @staticmethod - def _pole_relocation(poles, freqs, freq_responses, weights_responses, fit_constant, fit_proportional): - n_responses, n_freqs = np.shape(freq_responses) - n_samples = n_responses * n_freqs - omega = 2 * np.pi * freqs - s = 1j * omega - - # weight of extra equation to avoid trivial solution - weight_extra = np.linalg.norm(weights_responses[:, None] * freq_responses) / n_samples - - # weights w are applied directly to the samples, which get squared during least-squares fitting; hence sqrt(w) - weights_responses = np.sqrt(weights_responses) - weight_extra = np.sqrt(weight_extra) - - # count number of rows and columns in final coefficient matrix to solve for (c_res, d_res) - # (ratio #real/#complex poles might change during iterations) - - # We need two columns for complex poles and one column for real poles in A matrix. - # This number equals the model order. - n_cols_unused = VectorFitting.get_model_order(poles) - - n_cols_used = n_cols_unused - n_cols_used += 1 - idx_constant = [] - idx_proportional = [] - if fit_constant: - idx_constant = [n_cols_unused] - n_cols_unused += 1 - if fit_proportional: - idx_proportional = [n_cols_unused] - n_cols_unused += 1 - - real_mask = poles.imag == 0 - # list of indices in 'poles' with real values - idx_poles_real = np.nonzero(real_mask)[0] - # list of indices in 'poles' with complex values - idx_poles_complex = np.nonzero(~real_mask)[0] - - # positions (columns) of coefficients for real and complex-conjugate terms in the rows of A determine the - # respective positions of the calculated residues in the results vector. - # to have them ordered properly for the subsequent assembly of the test matrix H for eigenvalue extraction, - # place real poles first, then complex-conjugate poles with their respective real and imaginary parts: - # [r1', r2', ..., (r3', r3''), (r4', r4''), ...] - n_real = len(idx_poles_real) - n_cmplx = len(idx_poles_complex) - idx_res_real = np.arange(n_real) - idx_res_complex_re = n_real + 2 * np.arange(n_cmplx) - idx_res_complex_im = idx_res_complex_re + 1 - - # complex coefficient matrix of shape [N_responses, N_freqs, n_cols_unused + n_cols_used] - # layout of each row: - # [pole1, pole2, ..., (constant), (proportional), pole1, pole2, ..., constant] - A = np.empty((n_responses, n_freqs, n_cols_unused + n_cols_used), dtype=complex) - - # calculate coefficients for real and complex residues in the solution vector - # - # real pole-residue term (r = r', p = p'): - # fractional term is r' / (s - p') - # coefficient for r' is 1 / (s - p') - coeff_real = 1 / (s[:, None] - poles[None, idx_poles_real]) - - # complex-conjugate pole-residue pair (r = r' + j r'', p = p' + j p''): - # fractional term is r / (s - p) + conj(r) / (s - conj(p)) - # = [1 / (s - p) + 1 / (s - conj(p))] * r' + [1j / (s - p) - 1j / (s - conj(p))] * r'' - # coefficient for r' is 1 / (s - p) + 1 / (s - conj(p)) - # coefficient for r'' is 1j / (s - p) - 1j / (s - conj(p)) - coeff_complex_re = (1 / (s[:, None] - poles[None, idx_poles_complex]) + - 1 / (s[:, None] - np.conj(poles[None, idx_poles_complex]))) - coeff_complex_im = (1j / (s[:, None] - poles[None, idx_poles_complex]) - - 1j / (s[:, None] - np.conj(poles[None, idx_poles_complex]))) - - # part 1: first sum of rational functions (variable c) - A[:, :, idx_res_real] = coeff_real - A[:, :, idx_res_complex_re] = coeff_complex_re - A[:, :, idx_res_complex_im] = coeff_complex_im - - # part 2: constant (variable d) and proportional term (variable e) - A[:, :, idx_constant] = 1 - A[:, :, idx_proportional] = s[:, None] - - # part 3: second sum of rational functions multiplied with frequency response (variable c_res) - A[:, :, n_cols_unused + idx_res_real] = -1 * freq_responses[:, :, None] * coeff_real - A[:, :, n_cols_unused + idx_res_complex_re] = -1 * freq_responses[:, :, None] * coeff_complex_re - A[:, :, n_cols_unused + idx_res_complex_im] = -1 * freq_responses[:, :, None] * coeff_complex_im - - # part 4: constant (variable d_res) - A[:, :, -1] = -1 * freq_responses - - A_ri = np.hstack((A.real, A.imag)) - - # calculation of matrix sizes after QR decomposition: - # stacked coefficient matrix (A.real, A.imag) has shape (L, M, N) - # with - # L = n_responses = n_ports ** 2 - # M = 2 * n_freqs (because of hstack with 2x n_freqs) - # N = n_cols_unused + n_cols_used - # then - # R has shape (L, K, N) with K = min(M, N) - dim_m = 2 * n_freqs - dim_n = n_cols_unused + n_cols_used - dim_k = min(dim_m, dim_n) - - # QR decomposition - # R = np.linalg.qr(A_ri, 'r') - - # direct QR of stacked matrices for linalg.qr() only works with numpy>=1.22.0 - # workaround for old numpy: - R = np.empty((n_responses, dim_k, dim_n)) - for i in range(n_responses): - R[i] = np.linalg.qr(A_ri[i], mode='r') - - # only R22 is required to solve for c_res and d_res - # R12 and R22 can have a different number of rows, depending on K - if dim_k == dim_m: - # K = M - n_rows_r12 = n_freqs - n_rows_r22 = n_freqs - else: - # K = N - n_rows_r12 = n_cols_unused - n_rows_r22 = n_cols_used - R22 = R[:, n_rows_r12:, n_cols_unused:] - - # weighting - R22 = weights_responses[:, None, None] * R22 - - # assemble compressed coefficient matrix A_fast by row-stacking individual upper triangular matrices R22 - dim0 = n_responses * n_rows_r22 + 1 - - A_fast = np.empty((dim0, n_cols_used)) - A_fast[:-1, :] = R22.reshape((dim0 - 1, n_cols_used)) - - # extra equation to avoid trivial solution - A_fast[-1, idx_res_real] = np.sum(coeff_real.real, axis=0) - A_fast[-1, idx_res_complex_re] = np.sum(coeff_complex_re.real, axis=0) - A_fast[-1, idx_res_complex_im] = np.sum(coeff_complex_im.real, axis=0) - A_fast[-1, -1] = n_freqs - - # weighting - A_fast[-1, :] = weight_extra * A_fast[-1, :] - - scaling = 1 / np.linalg.norm(A_fast, axis=0) - A_fast = scaling * A_fast - - # right hand side vector (weighted) - b = np.zeros(dim0) - b[-1] = weight_extra * n_samples - - # check condition of the linear system - cond = np.linalg.cond(A_fast) - full_rank = np.min(A_fast.shape) - - # solve least squares for real parts - x, residuals, rank, singular_vals = np.linalg.lstsq(A_fast, b, rcond=None) - - x = scaling * x - - # rank deficiency - rank_deficiency = full_rank - rank - - # assemble individual result vectors from single LS result x - c_res = x[:-1] - d_res = x[-1] - - # check if d_res is suited for zeros calculation - tol_res = 1e-8 - if np.abs(d_res) < tol_res: - # d_res is too small, discard solution and proceed the |d_res| = tol_res - logger.info(f'Replacing d_res solution as it was too small ({d_res}).') - d_res = tol_res * (d_res / np.abs(d_res)) - - # build test matrix H, which will hold the new poles as eigenvalues - H = np.zeros((len(c_res), len(c_res))) - - poles_real = poles[np.nonzero(real_mask)] - poles_cplx = poles[np.nonzero(~real_mask)] - - H[idx_res_real, idx_res_real] = poles_real.real - H[idx_res_real] -= c_res / d_res - - H[idx_res_complex_re, idx_res_complex_re] = poles_cplx.real - H[idx_res_complex_re, idx_res_complex_im] = poles_cplx.imag - H[idx_res_complex_im, idx_res_complex_re] = -1 * poles_cplx.imag - H[idx_res_complex_im, idx_res_complex_im] = poles_cplx.real - H[idx_res_complex_re] -= 2 * c_res / d_res - - poles_new = np.linalg.eigvals(H) - - # replace poles for next iteration - # complex poles need to come in complex conjugate pairs; append only the positive part - poles = poles_new[np.nonzero(poles_new.imag >= 0)] - - # flip real part of unstable poles (real part needs to be negative for stability) - poles.real = -1 * np.abs(poles.real) - - return poles, d_res, cond, rank_deficiency, residuals, singular_vals - - @staticmethod - def _fit_residues(poles, freqs, freq_responses, fit_constant, fit_proportional, enforce_dc=True): - n_responses, n_freqs = np.shape(freq_responses) - omega = 2 * np.pi * freqs - s = 1j * omega - - # We need two columns for complex poles and one column for real poles in A matrix. - # This number equals the model order. - n_cols = VectorFitting.get_model_order(poles) - - idx_constant = [] - idx_proportional = [] - if fit_constant: - idx_constant = [n_cols] - n_cols += 1 - if fit_proportional: - idx_proportional = [n_cols] - n_cols += 1 - - # list of indices in 'poles' with real and with complex values - real_mask = poles.imag == 0 - idx_poles_real = np.nonzero(real_mask)[0] - idx_poles_complex = np.nonzero(~real_mask)[0] - - # find and save indices of real and complex poles in the poles list - i = 0 - idx_res_real = [] - idx_res_complex_re = [] - idx_res_complex_im = [] - for pole in poles: - if pole.imag == 0: - idx_res_real.append(i) - i += 1 - else: - idx_res_complex_re.append(i) - idx_res_complex_im.append(i + 1) - i += 2 - - # complex coefficient matrix of shape [N_freqs, n_cols] - # layout of each row: - # [pole1, pole2, ..., (constant), (proportional)] - A = np.empty((n_freqs, n_cols), dtype=complex) - - # calculate coefficients for real and complex residues in the solution vector - # - # real pole-residue term (r = r', p = p'): - # fractional term is r' / (s - p') - # coefficient for r' is 1 / (s - p') - coeff_real = 1 / (s[:, None] - poles[None, idx_poles_real]) - - # complex-conjugate pole-residue pair (r = r' + j r'', p = p' + j p''): - # fractional term is r / (s - p) + conj(r) / (s - conj(p)) - # = [1 / (s - p) + 1 / (s - conj(p))] * r' + [1j / (s - p) - 1j / (s - conj(p))] * r'' - # coefficient for r' is 1 / (s - p) + 1 / (s - conj(p)) - # coefficient for r'' is 1j / (s - p) - 1j / (s - conj(p)) - coeff_complex_re = (1 / (s[:, None] - poles[None, idx_poles_complex]) + - 1 / (s[:, None] - np.conj(poles[None, idx_poles_complex]))) - coeff_complex_im = (1j / (s[:, None] - poles[None, idx_poles_complex]) - - 1j / (s[:, None] - np.conj(poles[None, idx_poles_complex]))) - - # part 1: first sum of rational functions (variable c) - A[:, idx_res_real] = coeff_real - A[:, idx_res_complex_re] = coeff_complex_re - A[:, idx_res_complex_im] = coeff_complex_im - - # part 2: constant (variable d) and proportional term (variable e) - A[:, idx_constant] = 1 - A[:, idx_proportional] = s[:, None] - - scaling = 1 / np.linalg.norm(A, axis=0) - A = scaling * A - - # DC POINT ENFORCEMENT - if enforce_dc and freqs[0] == 0.0: - # data contains the dc point; enforce dc point via linear equality constraint: - # 1: remove one variable from the solution vector (constant term, if possible). - # 2: solve remaining linear system (without data at dc) with regular least-squares, as usual. the size of - # the solution vector, the coefficient matrix, and the right-hand side are reduced by 1 - # 3: calculate the removed variable (constant term) with the data from the dc point - # - # linear system: A * x = b - # solution vector x contains the unknown residues - # right-hand side b contains the frequency response to be fitted, sorted by ascending frequency (dc first) - # coefficient matrix A and vector b are split: A = [[A11, A12], [A21, A22]], b = [[b1], [b2]] - # [A11, A12] is the first row used later for dc enforcement - # A21 is a column vector, which is not required anymore - # A22 is the rest of the matrix for usual least-squares fitting - - # indexing mask of constrained variable in the columns of matrix A - mask_idx_constrained = np.zeros(n_cols, dtype=bool) - if fit_constant: - # use constant term for constrained - mask_idx_constrained[idx_constant] = True - else: - # constant term not present; arbitrarily use first residue instead - mask_idx_constrained[0] = True - - A22 = A[1:, ~mask_idx_constrained] - b2 = freq_responses[:, 1:] - - A22_ri = np.vstack((A22.real, A22.imag)) - b22_ri = np.hstack((b2.real, b2.imag)) - - logger.info(f'Condition number of coefficient matrix = {int(np.linalg.cond(A22_ri))}') - - # solve least-squares and obtain results as stack of real part vector and imaginary part vector - x2, residuals, rank, singular_vals = np.linalg.lstsq(A22_ri, b22_ri.T, rcond=None) - - # solve for x1 using the first row (the dc row): - b1 = freq_responses[:, 0] - A11 = A[0, mask_idx_constrained] - A12 = A[0, ~mask_idx_constrained] - x1 = np.real(1 / A11 * (b1 - np.dot(A12, x2))) - - # reassemble x from x1 and x2 - x = np.empty((n_cols, n_responses)) - x[mask_idx_constrained, :] = x1 - x[~mask_idx_constrained, :] = x2 - else: - # dc point not included; use and solve the entire linear system with least-squares - A_ri = np.vstack((A.real, A.imag)) - b_ri = np.hstack((freq_responses.real, freq_responses.imag)) - - logger.info(f'Condition number of coefficient matrix = {int(np.linalg.cond(A_ri))}') - - # solve least-squares and obtain results as stack of real part vector and imaginary part vector - x, residuals, rank, singular_vals = np.linalg.lstsq(A_ri, b_ri.T, rcond=None) - - x = scaling[:, None] * x - - # extract residues from solution vector and align them with poles to get matching pole-residue pairs - residues = np.empty((len(freq_responses), len(poles)), dtype=complex) - residues[:, idx_poles_real] = np.transpose(x[idx_res_real]) - residues[:, idx_poles_complex] = np.transpose(x[idx_res_complex_re] + 1j * x[idx_res_complex_im]) - - # extract constant and proportional coefficient, if available - if fit_constant: - constant_coeff = x[idx_constant][0] - else: - constant_coeff = np.zeros(n_responses) - - if fit_proportional: - proportional_coeff = x[idx_proportional][0] - else: - proportional_coeff = np.zeros(n_responses) - - return residues, constant_coeff, proportional_coeff, residuals, rank, singular_vals - - @staticmethod - def _get_delta(poles, residues, constant_coeff, proportional_coeff, freqs, freq_responses, weights_responses): - s = 2j * np.pi * freqs - model = proportional_coeff[:, None] * s + constant_coeff[:, None] - for i, pole in enumerate(poles): - if np.imag(pole) == 0.0: - # real pole - model += residues[:, i, None] / (s - pole) - else: - # complex conjugate pole - model += (residues[:, i, None] / (s - pole) + - np.conjugate(residues[:, i, None]) / (s - np.conjugate(pole))) - - # compute weighted error and return global maximum at each frequency across all individual responses - delta = np.abs(model - freq_responses) * weights_responses[:, None] - - return np.max(delta, axis=0) - - @staticmethod - def _find_error_bands(freqs, delta): - # compute error bands (maximal fit deviation) - delta_mean = np.mean(delta) - error = delta - delta_mean - - # find limits of error bands - idx_limits = np.nonzero(np.diff(error > 0))[0] - idx_limits_filtered = idx_limits[np.diff(idx_limits, prepend=0) > 2] - - freqs_bands = np.split(freqs, idx_limits_filtered) - error_bands = np.split(error, idx_limits_filtered) - n_bands = len(freqs_bands) - - idx_freqs_start = [] - idx_freqs_stop = [] - idx_freqs_max = [] - delta_mean_bands = [] - for i_band in range(n_bands): - band_error_mean = np.mean(error_bands[i_band]) - if band_error_mean > 0: - # band with excess error; - # find frequency index of error maximum inside this band - i_band_max_error = np.argmax(error_bands[i_band]) - i_start = np.nonzero(freqs == freqs_bands[i_band][0])[0][0] - i_stop = np.nonzero(freqs == freqs_bands[i_band][-1])[0][0] - i_max = np.nonzero(freqs == freqs_bands[i_band][i_band_max_error])[0][0] - idx_freqs_start.append(i_start) - idx_freqs_stop.append(i_stop) - idx_freqs_max.append(i_max) - delta_mean_bands.append(np.mean(delta[i_start:i_stop])) - - idx_freqs_start = np.array(idx_freqs_start) - idx_freqs_stop = np.array(idx_freqs_stop) - idx_freqs_max = np.array(idx_freqs_max) - delta_mean_bands = np.array(delta_mean_bands) - - i_sort = np.flip(np.argsort(delta_mean_bands)) - - return idx_freqs_start[i_sort], idx_freqs_stop[i_sort], idx_freqs_max[i_sort], delta_mean_bands[i_sort] - - def get_rms_error(self, i=-1, j=-1, parameter_type: str = 's'): - r""" - Returns the root-mean-square (rms) error magnitude of the fit, i.e. - :math:`\sqrt{ \mathrm{mean}(|S - S_\mathrm{fit} |^2) }`, - either for an individual response :math:`S_{i+1,j+1}` or for larger slices of the network. - - Parameters - ---------- - i : int, optional - Row indices of the responses to be evaluated. Either a single row selected by an integer - :math:`i \in [0, N_\mathrm{ports}-1]`, or multiple rows selected by a list of integers, or all rows - selected by :math:`i = -1` (*default*). - - j : int, optional - Column indices of the responses to be evaluated. Either a single column selected by an integer - :math:`j \in [0, N_\mathrm{ports}-1]`, or multiple columns selected by a list of integers, or all columns - selected by :math:`j = -1` (*default*). - - parameter_type: str, optional - Representation type of the fitted frequency responses. Either *scattering* (:attr:`s` or :attr:`S`), - *impedance* (:attr:`z` or :attr:`Z`) or *admittance* (:attr:`y` or :attr:`Y`). - - Returns - ------- - rms_error : ndarray - The rms error magnitude between the vector fitted model and the original network data. - - Raises - ------ - ValueError - If the specified parameter representation type is not :attr:`s`, :attr:`z`, nor :attr:`y`. - """ - - if i == -1: - list_i = range(self.network.nports) - elif isinstance(i, int): - list_i = [i] - else: - list_i = i - - if j == -1: - list_j = range(self.network.nports) - elif isinstance(j, int): - list_j = [j] - else: - list_j = j - - if parameter_type.lower() == 's': - nw_responses = self.network.s - elif parameter_type.lower() == 'z': - nw_responses = self.network.z - elif parameter_type.lower() == 'y': - nw_responses = self.network.y - else: - raise ValueError(f'Invalid parameter type `{parameter_type}`. Valid options: `s`, `z`, or `y`') - - error_mean_squared = 0 - for i in list_i: - for j in list_j: - nw_ij = nw_responses[:, i, j] - fit_ij = self.get_model_response(i, j, self.network.f) - error_mean_squared += np.mean(np.square(np.abs(nw_ij - fit_ij))) - - return np.sqrt(error_mean_squared) - - def _get_ABCDE(self) -> tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray, np.ndarray]: - """ - Private method. - Returns the real-valued system matrices of the state-space representation of the current rational model, as - defined in [#]_. - - Returns - ------- - A : ndarray - State-space matrix A holding the poles on the diagonal as real values with imaginary parts on the sub- - diagonal - B : ndarray - State-space matrix B holding coefficients (1, 2, or 0), depending on the respective type of pole in A - C : ndarray - State-space matrix C holding the residues - D : ndarray - State-space matrix D holding the constants - E : ndarray - State-space matrix E holding the proportional coefficients (usually 0 in case of fitted S-parameters) - - Raises - ------ - ValueError - If the model parameters have not been initialized (by running :func:`vector_fit()` or :func:`read_npz()`). - - References - ---------- - .. [#] B. Gustavsen and A. Semlyen, "Fast Passivity Assessment for S-Parameter Rational Models Via a Half-Size - Test Matrix," in IEEE Transactions on Microwave Theory and Techniques, vol. 56, no. 12, pp. 2701-2708, - Dec. 2008, DOI: 10.1109/TMTT.2008.2007319. - """ - - # initial checks - if self.poles is None: - raise ValueError('self.poles = None; nothing to do. You need to run vector_fit() first.') - if self.residues is None: - raise ValueError('self.residues = None; nothing to do. You need to run vector_fit() first.') - if self.proportional_coeff is None: - raise ValueError('self.proportional_coeff = None; nothing to do. You need to run vector_fit() first.') - if self.constant_coeff is None: - raise ValueError('self.constant_coeff = None; nothing to do. You need to run vector_fit() first.') - - # assemble real-valued state-space matrices A, B, C, D, E from fitted complex-valued pole-residue model - - # determine size of the matrix system - n_ports = int(np.sqrt(len(self.constant_coeff))) - n_poles_real = 0 - n_poles_cplx = 0 - for pole in self.poles: - if np.imag(pole) == 0.0: - n_poles_real += 1 - else: - n_poles_cplx += 1 - n_matrix = (n_poles_real + 2 * n_poles_cplx) * n_ports - - # state-space matrix A holds the poles on the diagonal as real values with imaginary parts on the sub-diagonal - # state-space matrix B holds coefficients (1, 2, or 0), depending on the respective type of pole in A - # assemble A = [[poles_real, 0, 0], - # [0, real(poles_cplx), imag(poles_cplx], - # [0, -imag(poles_cplx), real(poles_cplx]] - A = np.identity(n_matrix) - B = np.zeros(shape=(n_matrix, n_ports)) - i_A = 0 # index on diagonal of A - for j in range(n_ports): - for pole in self.poles: - if np.imag(pole) == 0.0: - # adding a real pole - A[i_A, i_A] = np.real(pole) - B[i_A, j] = 1 - i_A += 1 - else: - # adding a complex-conjugate pole - A[i_A, i_A] = np.real(pole) - A[i_A, i_A + 1] = np.imag(pole) - A[i_A + 1, i_A] = -1 * np.imag(pole) - A[i_A + 1, i_A + 1] = np.real(pole) - B[i_A, j] = 2 - i_A += 2 - - # state-space matrix C holds the residues - # assemble C = [[R1.11, R1.12, R1.13, ...], [R2.11, R2.12, R2.13, ...], ...] - C = np.zeros(shape=(n_ports, n_matrix)) - for i in range(n_ports): - for j in range(n_ports): - # i: row index - # j: column index - i_response = i * n_ports + j - - j_residues = 0 - for zero in self.residues[i_response]: - if np.imag(zero) == 0.0: - C[i, j * (n_poles_real + 2 * n_poles_cplx) + j_residues] = np.real(zero) - j_residues += 1 - else: - C[i, j * (n_poles_real + 2 * n_poles_cplx) + j_residues] = np.real(zero) - C[i, j * (n_poles_real + 2 * n_poles_cplx) + j_residues + 1] = np.imag(zero) - j_residues += 2 - - # state-space matrix D holds the constants - # assemble D = [[d11, d12, ...], [d21, d22, ...], ...] - D = np.zeros(shape=(n_ports, n_ports)) - for i in range(n_ports): - for j in range(n_ports): - # i: row index - # j: column index - i_response = i * n_ports + j - D[i, j] = self.constant_coeff[i_response] - - # state-space matrix E holds the proportional coefficients (usually 0 in case of fitted S-parameters) - # assemble E = [[e11, e12, ...], [e21, e22, ...], ...] - E = np.zeros(shape=(n_ports, n_ports)) - for i in range(n_ports): - for j in range(n_ports): - # i: row index - # j: column index - i_response = i * n_ports + j - E[i, j] = self.proportional_coeff[i_response] - - return A, B, C, D, E - - @staticmethod - def _get_s_from_ABCDE(freqs: np.ndarray, - A: np.ndarray, B: np.ndarray, C: np.ndarray, D: np.ndarray, E: np.ndarray) -> np.ndarray: - """ - Private method. - Returns the S-matrix of the vector fitted model calculated from the real-valued system matrices of the state- - space representation, as provided by `_get_ABCDE()`. - - Parameters - ---------- - freqs : ndarray - Frequencies (in Hz) at which to calculate the S-matrices. - A : ndarray - B : ndarray - C : ndarray - D : ndarray - E : ndarray - - Returns - ------- - ndarray - Complex-valued S-matrices (fxNxN) calculated at frequencies `freqs`. - """ - - dim_A = np.shape(A)[0] - stsp_poles = np.linalg.inv(2j * np.pi * freqs[:, None, None] * np.identity(dim_A)[None, :, :] - A[None, :, :]) - stsp_S = np.matmul(np.matmul(C, stsp_poles), B) - stsp_S += D + 2j * np.pi * freqs[:, None, None] * E - return stsp_S - - def passivity_test(self, parameter_type: str = 's') -> np.ndarray: - """ - Evaluates the passivity of reciprocal vector fitted models by means of a half-size test matrix [#]_. Any - existing frequency bands of passivity violations will be returned as a sorted list. - - Parameters - ---------- - parameter_type: str, optional - Representation type of the fitted frequency responses. Either *scattering* (:attr:`s` or :attr:`S`), - *impedance* (:attr:`z` or :attr:`Z`) or *admittance* (:attr:`y` or :attr:`Y`). Currently, only scattering - parameters are supported for passivity evaluation. - - Raises - ------ - NotImplementedError - If the function is called for `parameter_type` different than `S` (scattering). - - ValueError - If the function is used with a model containing nonzero proportional coefficients. - - Returns - ------- - violation_bands : ndarray - NumPy array with frequency bands of passivity violation: - `[[f_start_1, f_stop_1], [f_start_2, f_stop_2], ...]`. - - See Also - -------- - is_passive : Query the model passivity as a boolean value. - passivity_enforce : Enforces the passivity of the vector fitted model, if required. - - Examples - -------- - Load and fit the `Network`, then evaluate the model passivity: - - >>> nw_3port = skrf.Network('my3port.s3p') - >>> vf = skrf.VectorFitting(nw_3port) - >>> vf.vector_fit(n_poles_real=1, n_poles_cmplx=4) - >>> violations = vf.passivity_test() - - References - ---------- - .. [#] B. Gustavsen and A. Semlyen, "Fast Passivity Assessment for S-Parameter Rational Models Via a Half-Size - Test Matrix," in IEEE Transactions on Microwave Theory and Techniques, vol. 56, no. 12, pp. 2701-2708, - Dec. 2008, DOI: 10.1109/TMTT.2008.2007319. - """ - - if parameter_type.lower() != 's': - raise NotImplementedError('Passivity testing is currently only supported for scattering (S) parameters.') - if parameter_type.lower() == 's' and len(np.flatnonzero(self.proportional_coeff)) > 0: - raise ValueError('Passivity testing of scattering parameters with nonzero proportional coefficients does ' - 'not make any sense; you need to run vector_fit() with option `fit_proportional=False` ' - 'first.') - - # # the network needs to be reciprocal for this passivity test method to work: S = transpose(S) - # if not np.allclose(self.residues, np.transpose(self.residues)) or \ - # not np.allclose(self.constant_coeff, np.transpose(self.constant_coeff)) or \ - # not np.allclose(self.proportional_coeff, np.transpose(self.proportional_coeff)): - # logger.error('Passivity testing with unsymmetrical model parameters is not supported. ' - # 'The model needs to be reciprocal.') - # return - - # get state-space matrices - A, B, C, D, E = self._get_ABCDE() - n_ports = np.shape(D)[0] - - # build half-size test matrix P from state-space matrices A, B, C, D - inv_neg = np.linalg.inv(D - np.identity(n_ports)) - inv_pos = np.linalg.inv(D + np.identity(n_ports)) - prod_neg = np.matmul(np.matmul(B, inv_neg), C) - prod_pos = np.matmul(np.matmul(B, inv_pos), C) - P = np.matmul(A - prod_neg, A - prod_pos) - - # extract eigenvalues of P - P_eigs = np.linalg.eigvals(P) - - # purely imaginary square roots of eigenvalues identify frequencies (2*pi*f) of borders of passivity violations - freqs_violation = [] - for sqrt_eigenval in np.sqrt(P_eigs): - if np.real(sqrt_eigenval) == 0.0: - freqs_violation.append(np.imag(sqrt_eigenval) / 2 / np.pi) - - # include dc (0) unless it's already included - if len(np.nonzero(np.array(freqs_violation) == 0.0)[0]) == 0: - freqs_violation.append(0.0) - - # sort the output from lower to higher frequencies - freqs_violation = np.sort(freqs_violation) - - # identify frequency bands of passivity violations - - # sweep the bands between crossover frequencies and identify bands of passivity violations - violation_bands = [] - for i, freq in enumerate(freqs_violation): - if i == len(freqs_violation) - 1: - # last band stops always at infinity - f_start = freq - f_stop = np.inf - f_center = 1.1 * f_start # 1.1 is chosen arbitrarily to have any frequency for evaluation - else: - # intermediate band between this frequency and the previous one - f_start = freq - f_stop = freqs_violation[i + 1] - f_center = 0.5 * (f_start + f_stop) - - # calculate singular values at the center frequency between crossover frequencies to identify violations - s_center = self._get_s_from_ABCDE(np.array([f_center]), A, B, C, D, E) - sigma = np.linalg.svd(s_center[0], compute_uv=False) - passive = True - for singval in sigma: - if singval > 1: - # passivity violation in this band - passive = False - if not passive: - # add this band to the list of passivity violations - if violation_bands is None: - violation_bands = [[f_start, f_stop]] - else: - violation_bands.append([f_start, f_stop]) - - return np.array(violation_bands) - - def is_passive(self, parameter_type: str = 's') -> bool: - """ - Returns the passivity status of the model as a boolean value. - - Parameters - ---------- - parameter_type : str, optional - Representation type of the fitted frequency responses. Either *scattering* (:attr:`s` or :attr:`S`), - *impedance* (:attr:`z` or :attr:`Z`) or *admittance* (:attr:`y` or :attr:`Y`). Currently, only scattering - parameters are supported for passivity evaluation. - - Returns - ------- - passivity : bool - :attr:`True` if model is passive, else :attr:`False`. - - See Also - -------- - passivity_test : Verbose passivity evaluation routine. - passivity_enforce : Enforces the passivity of the vector fitted model, if required. - - Examples - -------- - Load and fit the `Network`, then check whether or not the model is passive: - - >>> nw_3port = skrf.Network('my3port.s3p') - >>> vf = skrf.VectorFitting(nw_3port) - >>> vf.vector_fit(n_poles_real=1, n_poles_cmplx=4) - >>> vf.is_passive() # returns True or False - """ - - viol_bands = self.passivity_test(parameter_type) - if len(viol_bands) == 0: - return True - else: - return False - - def passivity_enforce(self, n_samples: int = 200, f_max: float = None, parameter_type: str = 's', - preserve_dc: bool = True) -> None: - """ - Enforces the passivity of the vector fitted model, if required. This is an implementation of the methods - presented in [#]_ and [#]_ using singular value perturbation. To preserve the dc point in the model during - passivity enforcement, only the residues are perturbed, not the constant term. - - Parameters - ---------- - n_samples : int, optional - Number of linearly spaced frequency samples at which passivity will be evaluated and enforced. - (Default: 200). If there are very narrow frequency bands of passivity violations, a sufficiently large - number of frequency samples is required. - - f_max : float or None, optional - Highest frequency of interest for the passivity enforcement (in Hz, not rad/s). This limit usually - equals the highest sample frequency of the fitted Network. If None, the highest frequency in - :attr:`self.network` is used, which must not be None is this case. If `f_max` is not None, it overrides the - highest frequency in :attr:`self.network`. - - parameter_type : str, optional - Representation type of the fitted frequency responses. Either *scattering* (:attr:`s` or :attr:`S`), - *impedance* (:attr:`z` or :attr:`Z`) or *admittance* (:attr:`y` or :attr:`Y`). Currently, only scattering - parameters are supported for passivity evaluation. - - preserve_dc : bool, optional - Enables dc point preservation during passivity enforcement. This only works if the fitted model is already - passive at the dc point, which is not always the case. If it is not passive, dc point preservation is - disabled and passivity is also enforced on the dc point. - - Returns - ------- - None - - Raises - ------ - NotImplementedError - If the function is called for `parameter_type` different than `S` (scattering). - - ValueError - If the function is used with a model containing nonzero proportional coefficients. Or if both `f_max` and - :attr:`self.network` are None. - - See Also - -------- - is_passive : Returns the passivity status of the model as a boolean value. - passivity_test : Verbose passivity evaluation routine. - plot_passivation : Convergence plot for passivity enforcement iterations. - - Examples - -------- - Load and fit the `Network`, then enforce the passivity of the model: - - >>> nw_3port = skrf.Network('my3port.s3p') - >>> vf = skrf.VectorFitting(nw_3port) - >>> vf.vector_fit(n_poles_real=1, n_poles_cmplx=4) - >>> vf.passivity_enforce() # won't do anything if model is already passive - - References - ---------- - .. [#] T. Dhaene, D. Deschrijver and N. Stevens, "Efficient Algorithm for Passivity Enforcement of S-Parameter- - Based Macromodels," in IEEE Transactions on Microwave Theory and Techniques, vol. 57, no. 2, pp. 415-420, - Feb. 2009, DOI: 10.1109/TMTT.2008.2011201 - - .. [#] D. Deschrijver and T. Dhaene, "DC-Preserving Passivity Enforcement for S-Parameter Based Macromodels," - in IEEE Transactions on Microwave Theory and Techniques, vol. 58, no. 4, pp. 923-928, April 2010, - DOI: 10.1109/TMTT.2010.2042556 - """ - - if parameter_type.lower() != 's': - raise NotImplementedError('Passivity testing is currently only supported for scattering (S) parameters.') - if parameter_type.lower() == 's' and len(np.flatnonzero(self.proportional_coeff)) > 0: - raise ValueError('Passivity testing of scattering parameters with nonzero proportional coefficients does ' - 'not make any sense; you need to run vector_fit() with option `fit_proportional=False` ' - 'first.') - - # always run passivity test first; this will write 'self.violation_bands' - if self.is_passive(): - # model is already passive; do nothing and return - logger.info('Passivity enforcement: The model is already passive. Nothing to do.') - return - - # check dc passivity and find the highest relevant frequency; either - # 1) the highest frequency of passivity violation (f_viol_max) - # or - # 2) the highest fitting frequency (f_samples_max) - violation_bands = self.passivity_test() - f_viol_min = violation_bands[0, 0] - f_viol_max = violation_bands[-1, 1] - - # check passivity at the dc point; 1) in the model, 2) in the original data, if available - if preserve_dc and f_viol_min == 0.0: - # cannot preserve a non-passive dc point during passivity enforcement - preserve_dc = False - hint = '' - - if self.network is not None: - if self.network.f[0] == 0.0 and not self.network.is_passive(): - hint = '\nHint: The dc point in the original network data is already non-passive.' - - warnings.warn('Passivity enforcement: The dc point in the model is not passive. Cannot ' - f'preserve the dc point during passivity enforcement. {hint}', UserWarning, stacklevel=2) - - if f_max is None: - if self.network is None: - raise RuntimeError('Both `self.network` and parameter `f_max` are None. One of them is required to ' - 'specify the frequency band of interest for the passivity enforcement.') - else: - f_samples_max = self.network.f[-1] - else: - f_samples_max = f_max - - # deal with unbounded violation interval (f_viol_max == np.inf) - if np.isinf(f_viol_max): - f_viol_max = 1.5 * violation_bands[-1, 0] - warnings.warn( - 'Passivity enforcement: The passivity violations of this model are unbounded. ' - 'Passivity enforcement might still work, but consider re-fitting with a lower number of poles ' - 'and/or without the constants (`fit_constant=False`) if the results are not satisfactory.', - UserWarning, stacklevel=2) - - # the frequency band for the passivity evaluation is from dc to 20% above the highest relevant frequency - if f_viol_max < f_samples_max: - f_eval_max = 1.2 * f_samples_max - else: - f_eval_max = 1.2 * f_viol_max - - # let's not automatically adjust n_samples. The calculated number can - # be huge (>100k). Combined with a high number of poles in the model, this can bust the memory. - freqs_eval = np.linspace(0, f_eval_max, n_samples) - - # get model state-space matrices - A, B, C_t, D, E = self._get_ABCDE() - dim_A = np.shape(A)[0] - - # ASYMPTOTIC PASSIVITY ENFORCEMENT - - # check if constant term has been fitted (not zero) - # a model without the constant term is always asymptotically passive - if len(np.nonzero(D)[0]) != 0: - # D was fitted; - # asymptotic passivity needs to be checked and enforced, if violated. - # for dc preservation, the asymptotic passivity violations in D are compensated using C - # D is not touched, because it contains the dc point ( lim s --> {inf S(s)} = D) - u, sigma, vh = np.linalg.svd(D, compute_uv=True) - - # find and perturb singular values that cause passivity violations - # sigma_viol = sigma * upsilon - psi with - # upsilon[sigma > delta] = 1 - # upsilon[sigma <= delta] = 0 - # psi[sigma > delta] = delta - # psi[sigma <= delta] = 0 - # (implemented below in a more compact form) - delta = 1 - idx_viol = np.nonzero(sigma > delta) - sigma_viol = np.zeros_like(sigma) - sigma_viol[idx_viol] = sigma[idx_viol] - delta - - # calculate S_viol from perturbed sigma and previous U and Vh - S_viol = np.dot(u * sigma_viol, vh) - - # find new set of residues C_viol by solving underdetermined least-squares problem - # S_viol = C_viol * B - # - # mind the transpose of the system to compensate for the exchanged order of matrix multiplication: - # S_viol = C_viol * B <==> transpose(S_viol) = transpose(B) * transpose(C_viol) - C_viol, residuals, rank, singular_vals = np.linalg.lstsq(np.vstack((B.T.real, B.T.imag)), - np.vstack((S_viol.T.real, S_viol.T.imag)), - rcond=None) - C_t -= C_viol.T - - # UNIFORM PASSIVITY ENFORCEMENT - - # preparing coefficient matrix; can be reused in every iteration - # S(s_eval) = D_t + s_eval * C_t * inv(s_eval * I - A) * B - # = D_t + s_eval * C_t * A_freq * B - # with - # A_freq = inv(s_eval * I - A) - # s_eval = j * omega_eval = 2j * pi * freqs_eval - A_freq = np.linalg.inv(2j * np.pi * freqs_eval[:, None, None] * np.identity(dim_A)[None, :, :] - A[None, :, :]) - - # construct coefficient matrix for least-squares residue fitting (C_viol) - coeffs = np.matmul(A_freq, B) - - C_viol = np.empty_like(C_t) - n_ports = np.shape(C_viol)[0] - model_order = self.get_model_order(self.poles) - - # predefined tolerance parameter (users should not need to change this) - delta_threshold = 0.999 - sigma_max = 1.1 # just to enter iteration loop for the first time - - # iterative compensation of passivity violations - t = 0 - self.history_max_sigma = [] - while t < self.max_iterations and sigma_max > 1.0: - logger.info(f'Passivity enforcement; Iteration {t + 1}') - - # calculate S-matrix of the model at freqs_eval (shape fxNxN) - #S_eval = self._get_s_from_ABCDE(freqs_eval, A, B, C_t, D, E) - S_eval = D + np.matmul(C_t, coeffs) # much faster! - - # singular value decomposition, - # shape(u) = (n_samples, n_ports, n_ports) - # shape(sigma) = (n_samples, n_ports) - # shape(vh) = (n_samples, n_ports, n_ports) - u, sigma, vh = np.linalg.svd(S_eval) - - # keep track of the greatest singular value in every iteration step - sigma_max = np.amax(sigma) - self.history_max_sigma.append(sigma_max) - - if sigma_max > delta_threshold: - delta = delta_threshold - else: - delta = sigma_max - - # find and perturb singular values that cause passivity violations - # sigma_viol = sigma * upsilon - psi with - # upsilon[sigma > delta] = 1 - # upsilon[sigma <= delta] = 0 - # psi[sigma > delta] = delta - # psi[sigma <= delta] = 0 - # (implemented below in a more compact form) - idx_viol = np.nonzero(sigma > delta) - sigma_viol = np.zeros_like(sigma) - sigma_viol[idx_viol] = sigma[idx_viol] - delta - - S_viol = np.matmul(u * sigma_viol[:, None, :], vh) - - # stack frequency responses as a single vector - # stacking order (row-major): - # s11, s12, s13, ..., s21, s22, s23, ... - S_viol_stacked = [] - for i in range(n_ports): - for j in range(n_ports): - S_viol_stacked.append(S_viol[:, i, j]) - S_viol_stacked = np.array(S_viol_stacked) - - # The existing method _fit_residues() can be use here to fit the violation residues. Enabling `fit_constant` - # in combination with `enforce_dc` removes the dc rows from the linear system and enforces the dc solution - # on the constant term. In case of dc preservation during passivity enforcement, we can ignore that constant - # term entirely and only use the violation residues. - # If dc preservation is disabled, we could also perturb the constant term. This is not currently done. In - # this new method, we always only perturb the residues. Disabling `fit_constant` and `preserve_dc` in this - # case will solve for the residues without the constant term in the linear system. - C_viol_stacked, D_viol_stacked, E_viol_stacked, residuals, rank, singular_vals = self._fit_residues( - self.poles, freqs_eval, S_viol_stacked, fit_constant=preserve_dc, fit_proportional=False, - enforce_dc=preserve_dc) - - # reshape C_viol into state-space format: [[R1.11, R2.11, R3.11, ..., R1.1N, R2.1N, R3.1N, ...], - # [R1.21, R2.21, R3.21, ..., R1.2N, R3.2N, R3.2N, ...], - # ... - # [R1.N1, R2.N1, R3.N1, ..., R1.NN, R3.NN, R3.NN, ...]] - for i_port in range(n_ports): - for j_port in range(n_ports): - j_residues = 0 - for residue in C_viol_stacked[i_port * n_ports + j_port]: - if np.imag(residue) == 0.0: - C_viol[i_port, j_port * model_order + j_residues] = np.real(residue) - j_residues += 1 - else: - C_viol[i_port, j_port * model_order + j_residues] = np.real(residue) - C_viol[i_port, j_port * model_order + j_residues + 1] = np.imag(residue) - j_residues += 2 - - # perturb residues by subtracting respective row and column in C_t - C_t = C_t - C_viol - - t += 1 - - # PASSIVATION PROCESS DONE; model is either passive or max. number of iterations have been exceeded - if t == self.max_iterations: - warnings.warn('Passivity enforcement: Aborting after the max. number of iterations has been ' - 'exceeded.', RuntimeWarning, stacklevel=2) - - # save/update model parameters (perturbed residues) - self.history_max_sigma = np.array(self.history_max_sigma) - - n_ports = np.shape(D)[0] - for i in range(n_ports): - k = 0 # column index in C_t - for j in range(n_ports): - i_response = i * n_ports + j - z = 0 # column index self.residues - for pole in self.poles: - if np.imag(pole) == 0.0: - # real pole --> real residue - self.residues[i_response, z] = C_t[i, k] - k += 1 - else: - # complex-conjugate pole --> complex-conjugate residue - self.residues[i_response, z] = C_t[i, k] + 1j * C_t[i, k + 1] - k += 2 - z += 1 - - # run final passivity test to make sure passivation was successful - violation_bands = self.passivity_test() - if len(violation_bands) > 0: - # trying to determine the required number of evaluation samples based on the bandwidth and separation - # distance of the violation bands - violation_band_separation = np.diff(violation_bands.flat) - min_spacing_nonzero = np.amin(violation_band_separation[violation_band_separation != 0.0]) - - # we should need an absolute minimum of 1 sample in each violating frequency band. - # in practice, the frequency spacing should preferrably be much more dense. - # let's recommend 2 samples per violation band. - n_samples_required = int(f_eval_max / min_spacing_nonzero * 2) - - if n_samples_required > n_samples: - hint = f'Consider trying again with n_samples > {n_samples_required}.' - else: - hint = '' - - warnings.warn('Passivity enforcement was not successful.\nModel is still non-passive in these ' - f'frequency bands: {violation_bands}.\nTry running this routine again with a larger number of' - f' samples (parameter `n_samples`). This run was using n_samples = {n_samples}. {hint}', - RuntimeWarning, stacklevel=2) - - def write_npz(self, path: str) -> None: - """ - Writes the model parameters in :attr:`poles`, :attr:`residues`, - :attr:`proportional_coeff` and :attr:`constant_coeff` to a labeled NumPy .npz file. - - Parameters - ---------- - path : str - Target path without filename for the export. The filename will be added automatically based on the network - name in :attr:`network` - - Returns - ------- - None - - See Also - -------- - read_npz : Reads all model parameters from a .npz file - - Examples - -------- - Load and fit the `Network`, then export the model parameters to a .npz file: - - >>> nw_3port = skrf.Network('my3port.s3p') - >>> vf = skrf.VectorFitting(nw_3port) - >>> vf.vector_fit(n_poles_real=1, n_poles_cmplx=4) - >>> vf.write_npz('./data/') - - The filename depends on the network name stored in `nw_3port.name` and will have the prefix `coefficients_`, for - example `coefficients_my3port.npz`. The coefficients can then be read using NumPy's load() function: - - >>> coeffs = numpy.load('./data/coefficients_my3port.npz') - >>> poles = coeffs['poles'] - >>> residues = coeffs['residues'] - >>> prop_coeffs = coeffs['proportionals'] - >>> constants = coeffs['constants'] - - Alternatively, the coefficients can be read directly into a new instance of `VectorFitting`, see - :func:`read_npz`. - """ - - if self.poles is None: - warnings.warn('Nothing to export; Poles have not been fitted.', RuntimeWarning, stacklevel=2) - return - if self.residues is None: - warnings.warn('Nothing to export; Residues have not been fitted.', RuntimeWarning, stacklevel=2) - return - if self.proportional_coeff is None: - warnings.warn('Nothing to export; Proportional coefficients have not been fitted.', RuntimeWarning, - stacklevel=2) - return - if self.constant_coeff is None: - warnings.warn('Nothing to export; Constants have not been fitted.', RuntimeWarning, stacklevel=2) - return - - filename = self.network.name - - logger.info(f'Exporting results as compressed NumPy array to {path}') - np.savez_compressed(os.path.join(path, f'coefficients_{filename}'), - poles=self.poles, residues=self.residues, proportionals=self.proportional_coeff, - constants=self.constant_coeff) - - def read_npz(self, file: str) -> None: - """ - Reads all model parameters :attr:`poles`, :attr:`residues`, :attr:`proportional_coeff` and - :attr:`constant_coeff` from a labeled NumPy .npz file. - - Parameters - ---------- - file : str - NumPy .npz file containing the parameters. See notes. - - Returns - ------- - None - - Raises - ------ - ValueError - If the shapes of the coefficient arrays in the provided file are not compatible. - - Notes - ----- - The .npz file needs to include the model parameters as individual NumPy arrays (ndarray) labeled '*poles*', - '*residues*', '*proportionals*' and '*constants*'. The shapes of those arrays need to match the network - properties in :class:`network` (correct number of ports). Preferably, the .npz file was created by - :func:`write_npz`. - - See Also - -------- - write_npz : Writes all model parameters to a .npz file - - Examples - -------- - Create an empty `VectorFitting` instance (with or without the fitted `Network`) and load the model parameters: - - >>> vf = skrf.VectorFitting(None) - >>> vf.read_npz('./data/coefficients_my3port.npz') - - This can be useful to analyze or process a previous vector fit instead of fitting it again, which sometimes - takes a long time. For example, the model passivity can be evaluated and enforced: - - >>> vf.passivity_enforce() - """ - - with np.load(file) as data: - poles = data['poles'] - - # legacy support for exported residues - if 'zeros' in data: - # old .npz file from deprecated write_npz() with residues called 'zeros' - residues = data['zeros'] - else: - # new .npz file from current write_npz() - residues = data['residues'] - - proportional_coeff = data['proportionals'] - constant_coeff = data['constants'] - - n_ports = int(np.sqrt(len(constant_coeff))) - n_resp = n_ports ** 2 - if np.shape(residues)[0] == np.shape(proportional_coeff)[0] == np.shape(constant_coeff)[0] == n_resp: - self.poles = poles - self.residues = residues - self.proportional_coeff = proportional_coeff - self.constant_coeff = constant_coeff - else: - raise ValueError('The shapes of the provided parameters are not compatible. The coefficient file needs ' - 'to contain NumPy arrays labled `poles`, `residues`, `proportionals`, and ' - '`constants`. Their shapes must match the number of network ports and the number of ' - 'frequencies.') - - def get_model_response(self, i: int, j: int, freqs: Any = None) -> np.ndarray: - """ - Returns one of the frequency responses :math:`H_{i+1,j+1}` of the fitted model :math:`H`. - - Parameters - ---------- - i : int - Row index of the response in the response matrix. - - j : int - Column index of the response in the response matrix. - - freqs : list of float or ndarray or None, optional - List of frequencies for the response plot. If None, the sample frequencies of the fitted network in - :attr:`network` are used. - - Returns - ------- - response : ndarray - Model response :math:`H_{i+1,j+1}` at the frequencies specified in `freqs` (complex-valued Numpy array). - - Examples - -------- - Get fitted S11 at 101 frequencies from 0 Hz to 10 GHz: - - >>> import skrf - >>> vf = skrf.VectorFitting(skrf.data.ring_slot) - >>> vf.vector_fit(3, 0) - >>> s11_fit = vf.get_model_response(0, 0, numpy.linspace(0, 10e9, 101)) - """ - - if self.poles is None: - warnings.warn('Returning a zero-vector; Poles have not been fitted.', - RuntimeWarning, stacklevel=2) - return np.zeros_like(freqs) - if self.residues is None: - warnings.warn('Returning a zero-vector; Residues have not been fitted.', - RuntimeWarning, stacklevel=2) - return np.zeros_like(freqs) - if self.proportional_coeff is None: - warnings.warn('Returning a zero-vector; Proportional coefficients have not been fitted.', - RuntimeWarning, stacklevel=2) - return np.zeros_like(freqs) - if self.constant_coeff is None: - warnings.warn('Returning a zero-vector; Constants have not been fitted.', - RuntimeWarning, stacklevel=2) - return np.zeros_like(freqs) - if freqs is None: - freqs = np.linspace(np.amin(self.network.f), np.amax(self.network.f), 1000) - - s = 2j * np.pi * np.array(freqs) - n_ports = int(np.sqrt(len(self.constant_coeff))) - i_response = i * n_ports + j - residues = self.residues[i_response] - - resp = self.proportional_coeff[i_response] * s + self.constant_coeff[i_response] - for i, pole in enumerate(self.poles): - if np.imag(pole) == 0.0: - # real pole - resp += residues[i] / (s - pole) - else: - # complex conjugate pole - resp += residues[i] / (s - pole) + np.conjugate(residues[i]) / (s - np.conjugate(pole)) - return resp - - @axes_kwarg - def plot(self, component: str, i: int = -1, j: int = -1, freqs: Any = None, - parameter: str = 's', *, ax: Axes = None) -> Axes: - """ - Plots the specified component of the parameter :math:`H_{i+1,j+1}` in the fit, where :math:`H` is - either the scattering (:math:`S`), the impedance (:math:`Z`), or the admittance (:math:`H`) response specified - in `parameter`. - - Parameters - ---------- - component : str - The component to be plotted. Must be one of the following items: - ['db', 'mag', 'deg', 'deg_unwrap', 're', 'im']. - `db` for magnitude in decibels, - `mag` for magnitude in linear scale, - `deg` for phase in degrees (wrapped), - `deg_unwrap` for phase in degrees (unwrapped/continuous), - `re` for real part in linear scale, - `im` for imaginary part in linear scale. - - i : int, optional - Row index of the response. `-1` to plot all rows. - - j : int, optional - Column index of the response. `-1` to plot all columns. - - freqs : list of float or ndarray or None, optional - List of frequencies for the response plot. If None, the sample frequencies of the fitted network in - :attr:`network` are used. This only works if :attr:`network` is not `None`. - - parameter : str, optional - The network representation to be used. This is only relevant for the plot of the original sampled response - in :attr:`network` that is used for comparison with the fit. Must be one of the following items unless - :attr:`network` is `None`: ['s', 'z', 'y'] for *scattering* (default), *impedance*, or *admittance*. - - ax : :class:`matplotlib.Axes` object or None - matplotlib axes to draw on. If None, the current axes is fetched with :func:`gca()`. - - Returns - ------- - :class:`matplotlib.Axes` - matplotlib axes used for drawing. Either the passed :attr:`ax` argument or the one fetch from the current - figure. - - Raises - ------ - ValueError - If the `freqs` parameter is not specified while the Network in :attr:`network` is `None`. - Also if `component` and/or `parameter` are not valid. - """ - - components = ['db', 'mag', 'deg', 'deg_unwrap', 're', 'im'] - if component.lower() in components: - if self.residues is None or self.poles is None: - raise RuntimeError('Poles and/or residues have not been fitted. Cannot plot the model response.') - - n_ports = int(np.sqrt(np.shape(self.residues)[0])) - - if i == -1: - list_i = range(n_ports) - elif isinstance(i, int): - list_i = [i] - else: - list_i = i - - if j == -1: - list_j = range(n_ports) - elif isinstance(j, int): - list_j = [j] - else: - list_j = j - - if self.network is not None: - # plot the original network response at each sample frequency (scatter plot) - if parameter.lower() == 's': - responses = self.network.s - elif parameter.lower() == 'z': - responses = self.network.z - elif parameter.lower() == 'y': - responses = self.network.y - else: - raise ValueError('The network parameter type is not valid, must be `s`, `z`, or `y`, ' - f'got `{parameter}`.') - - i_samples = 0 - for i in list_i: - for j in list_j: - if i_samples == 0: - label = 'Samples' - else: - label = '_nolegend_' - i_samples += 1 - - y_vals = None - if component.lower() == 'db': - y_vals = 20 * np.log10(np.abs(responses[:, i, j])) - elif component.lower() == 'mag': - y_vals = np.abs(responses[:, i, j]) - elif component.lower() == 'deg': - y_vals = np.rad2deg(np.angle(responses[:, i, j])) - elif component.lower() == 'deg_unwrap': - y_vals = np.rad2deg(np.unwrap(np.angle(responses[:, i, j]))) - elif component.lower() == 're': - y_vals = np.real(responses[:, i, j]) - elif component.lower() == 'im': - y_vals = np.imag(responses[:, i, j]) - - ax.scatter(self.network.f, y_vals, color='r', label=label) - - if freqs is None: - # get frequency array from the network - freqs = self.network.f - - if freqs is None: - raise ValueError( - 'Neither `freqs` nor `self.network` is specified. Cannot plot model response without any ' - 'frequency information.') - - # plot the fitted responses - y_label = '' - i_fit = 0 - for i in list_i: - for j in list_j: - if i_fit == 0: - label = 'Fit' - else: - label = '_nolegend_' - i_fit += 1 - - y_model = self.get_model_response(i, j, freqs) - y_vals = None - if component.lower() == 'db': - y_vals = 20 * np.log10(np.abs(y_model)) - y_label = 'Magnitude (dB)' - elif component.lower() == 'mag': - y_vals = np.abs(y_model) - y_label = 'Magnitude' - elif component.lower() == 'deg': - y_vals = np.rad2deg(np.angle(y_model)) - y_label = 'Phase (Degrees)' - elif component.lower() == 'deg_unwrap': - y_vals = np.rad2deg(np.unwrap(np.angle(y_model))) - y_label = 'Phase (Degrees)' - elif component.lower() == 're': - y_vals = np.real(y_model) - y_label = 'Real Part' - elif component.lower() == 'im': - y_vals = np.imag(y_model) - y_label = 'Imaginary Part' - - ax.plot(freqs, y_vals, color='k', label=label) - - ax.set_xlabel('Frequency (Hz)') - ax.set_ylabel(y_label) - ax.legend(loc='best') - - # only print title if a single response is shown - if i_fit == 1: - ax.set_title(f'Response i={i}, j={j}') - - return ax - else: - raise ValueError(f'The specified component ("{component}") is not valid. Must be in {components}.') - - def plot_s_db(self, *args, **kwargs) -> Axes: - """ - Plots the magnitude in dB of the scattering parameter response(s) in the fit. - - Parameters - ---------- - *args : any, optional - Additonal arguments to be passed to :func:`plot`. - - **kwargs : dict, optional - Additonal keyword arguments to be passed to :func:`plot`. - - Returns - ------- - :class:`matplotlib.Axes` - matplotlib axes used for drawing. Either the passed :attr:`ax` argument or the one fetch from the current - figure. - - Notes - ----- - This simply calls ``plot('db', *args, **kwargs)``. - """ - - return self.plot('db', *args, **kwargs) - - def plot_s_mag(self, *args, **kwargs) -> Axes: - """ - Plots the magnitude in linear scale of the scattering parameter response(s) in the fit. - - Parameters - ---------- - *args : any, optional - Additonal arguments to be passed to :func:`plot`. - - **kwargs : dict, optional - Additonal keyword arguments to be passed to :func:`plot`. - - Returns - ------- - :class:`matplotlib.Axes` - matplotlib axes used for drawing. Either the passed :attr:`ax` argument or the one fetch from the current - figure. - - Notes - ----- - This simply calls ``plot('mag', *args, **kwargs)``. - """ - - return self.plot('mag', *args, **kwargs) - - def plot_s_deg(self, *args, **kwargs) -> Axes: - """ - Plots the phase in degrees of the scattering parameter response(s) in the fit. - - Parameters - ---------- - *args : any, optional - Additonal arguments to be passed to :func:`plot`. - - **kwargs : dict, optional - Additonal keyword arguments to be passed to :func:`plot`. - - Returns - ------- - :class:`matplotlib.Axes` - matplotlib axes used for drawing. Either the passed :attr:`ax` argument or the one fetch from the current - figure. - - Notes - ----- - This simply calls ``plot('deg', *args, **kwargs)``. - """ - - return self.plot('deg', *args, **kwargs) - - def plot_s_deg_unwrap(self, *args, **kwargs) -> Axes: - """ - Plots the unwrapped phase in degrees of the scattering parameter response(s) in the fit. - - Parameters - ---------- - *args : any, optional - Additonal arguments to be passed to :func:`plot`. - - **kwargs : dict, optional - Additonal keyword arguments to be passed to :func:`plot`. - - Returns - ------- - :class:`matplotlib.Axes` - matplotlib axes used for drawing. Either the passed :attr:`ax` argument or the one fetch from the current - figure. - - Notes - ----- - This simply calls ``plot('deg_unwrap', *args, **kwargs)``. - """ - - return self.plot('deg_unwrap', *args, **kwargs) - - def plot_s_re(self, *args, **kwargs) -> Axes: - """ - Plots the real part of the scattering parameter response(s) in the fit. - - Parameters - ---------- - *args : any, optional - Additonal arguments to be passed to :func:`plot`. - - **kwargs : dict, optional - Additonal keyword arguments to be passed to :func:`plot`. - - Returns - ------- - :class:`matplotlib.Axes` - matplotlib axes used for drawing. Either the passed :attr:`ax` argument or the one fetch from the current - figure. - - Notes - ----- - This simply calls ``plot('re', *args, **kwargs)``. - """ - - return self.plot('re', *args, **kwargs) - - def plot_s_im(self, *args, **kwargs) -> Axes: - """ - Plots the imaginary part of the scattering parameter response(s) in the fit. - - Parameters - ---------- - *args : any, optional - Additonal arguments to be passed to :func:`plot`. - - **kwargs : dict, optional - Additonal keyword arguments to be passed to :func:`plot`. - - Returns - ------- - :class:`matplotlib.Axes` - matplotlib axes used for drawing. Either the passed :attr:`ax` argument or the one fetch from the current - figure. - - Notes - ----- - This simply calls ``plot('im', *args, **kwargs)``. - """ - - return self.plot('im', *args, **kwargs) - - @axes_kwarg - def plot_s_singular(self, freqs: Any = None, *, ax: Axes = None) -> Axes: - """ - Plots the singular values of the vector fitted S-matrix in linear scale. - - Parameters - ---------- - freqs : list of float or ndarray or None, optional - List of frequencies for the response plot. If None, the sample frequencies of the fitted network in - :attr:`network` are used. This only works if :attr:`network` is not `None`. - - ax : :class:`matplotlib.Axes` object or None - matplotlib axes to draw on. If None, the current axes is fetched with :func:`gca()`. - - Returns - ------- - :class:`matplotlib.Axes` - matplotlib axes used for drawing. Either the passed :attr:`ax` argument or the one fetch from the current - figure. - - Raises - ------ - ValueError - If the `freqs` parameter is not specified while the Network in :attr:`network` is `None`. - """ - - if freqs is None: - if self.network is None: - raise ValueError( - 'Neither `freqs` nor `self.network` is specified. Cannot plot model response without any ' - 'frequency information.') - else: - freqs = self.network.f - - # get system matrices of state-space representation - A, B, C, D, E = self._get_ABCDE() - - n_ports = np.shape(D)[0] - - # calculate and save singular values for each frequency - u, sigma, vh = np.linalg.svd(self._get_s_from_ABCDE(freqs, A, B, C, D, E)) - - # plot the frequency response of each singular value - for n in range(n_ports): - ax.plot(freqs, sigma[:, n], label=fr'$\sigma_{n + 1}$') - ax.set_xlabel('Frequency (Hz)') - ax.set_ylabel('Magnitude') - ax.legend(loc='best') - return ax - - @axes_kwarg - def plot_convergence(self, ax: Axes = None) -> Axes: - """ - Plots the history of the model residue parameter **d_res** during the iterative pole relocation process of the - vector fitting, which should eventually converge to a fixed value. Additionally, the relative change of the - maximum singular value of the coefficient matrix **A** are plotted, which serve as a convergence indicator. - - Parameters - ---------- - ax : :class:`matplotlib.Axes` object or None - matplotlib axes to draw on. If None, the current axes is fetched with :func:`gca()`. - - Returns - ------- - :class:`matplotlib.Axes` - matplotlib axes used for drawing. Either the passed :attr:`ax` argument or the one fetch from the current - figure. - """ - - ax.semilogy(np.arange(len(self.delta_max_history)) + 1, self.delta_max_history, color='darkblue') - ax.set_xlabel('Iteration step') - ax.set_ylabel('Max. relative change', color='darkblue') - ax2 = ax.twinx() - ax2.plot(np.arange(len(self.d_res_history)) + 1, self.d_res_history, color='orangered') - ax2.set_ylabel('Residue', color='orangered') - return ax - - @axes_kwarg - def plot_passivation(self, ax: Axes = None) -> Axes: - """ - Plots the history of the greatest singular value during the iterative passivity enforcement process, which - should eventually converge to a value slightly lower than 1.0 or stop after reaching the maximum number of - iterations specified in the class variable :attr:`max_iterations`. - - Parameters - ---------- - ax : :class:`matplotlib.Axes` object or None - matplotlib axes to draw on. If None, the current axes is fetched with :func:`gca()`. - - Returns - ------- - :class:`matplotlib.Axes` - matplotlib axes used for drawing. Either the passed :attr:`ax` argument or the one fetch from the current - figure. - """ - - ax.plot(np.arange(len(self.history_max_sigma)) + 1, self.history_max_sigma) - ax.set_xlabel('Iteration step') - ax.set_ylabel('Max. singular value') - return ax - - def write_spice_subcircuit_s(self, file: str, fitted_model_name: str = "s_equivalent", - create_reference_pins: bool = False) -> None: - """ - Creates an equivalent N-port subcircuit based on its vector fitted scattering (S) parameter responses - in spice simulator netlist syntax (compatible with LTspice, ngspice, Xyce, ...). The circuit synthesis is based - on a direct implementation of the state-space representation of the vector fitted model [#vf-book]_. - - Parameters - ---------- - file : str - Path and filename including file extension (usually .sp) for the subcircuit file. - - fitted_model_name: str - Name of the resulting subcircuit, default "s_equivalent" - - create_reference_pins: bool - If set to True, the synthesized subcircuit will have N pin-pairs: - p1 p1_ref p2 p2_ref ... pN pN_ref - - If set to False, the synthesized subcircuit will have N pins - p1 p2 ... pN - In this case, the reference nodes will be internally connected - to the global ground net 0. - - The default is False - - Returns - ------- - None - - Examples - -------- - Load and fit the `Network`, then export the equivalent subcircuit: - - >>> nw_3port = skrf.Network('my3port.s3p') - >>> vf = skrf.VectorFitting(nw_3port) - >>> vf.auto_fit() - >>> vf.write_spice_subcircuit_s('/my3port_model.sp') - - References - ---------- - .. [#vf-book] S. Grivet-Talocia and B. Gustavsen, "Passive Macromodeling", Wiley, 2016, - doi: https://doi.org/10.1002/9781119140931 - - """ - - if np.any(self.proportional_coeff): - build_e = True - else: - build_e = False - - with open(file, 'w') as f: - # write title line - f.write('* EQUIVALENT CIRCUIT FOR VECTOR FITTED S-MATRIX\n') - f.write('* Created using scikit-rf vectorFitting.py\n') - f.write('*\n') - - # Create subcircuit pin string and reference nodes - if create_reference_pins: - str_input_nodes = " ".join(map(lambda x: f'p{x + 1} p{x + 1}_ref', range(self.network.nports))) - else: - str_input_nodes = " ".join(map(lambda x: f'p{x + 1}', range(self.network.nports))) - - f.write(f'.SUBCKT {fitted_model_name} {str_input_nodes}\n') - - for i in range(self.network.nports): - f.write('*\n') - f.write(f'* Port network for port {i + 1}\n') - - if create_reference_pins: - node_ref_i = f'p{i + 1}_ref' - else: - node_ref_i = '0' - - # reference impedance (real, i.e. resistance) of port i - z0_i = np.real(self.network.z0[0, i]) - - # transfer gain of the controlled current sources representing the incident power wave a_i at port i - # - # the gain values result from the definition of the incident power wave: - # a_i = 1 / 2 / sqrt(Z0_i) * (V_i + Z0_i * I_i) = 1 / 2 / sqrt(Z0_i) * V_i + sqrt(Z0_i) / 2 * I_i - gain_vccs_a_i = 1 / 2 / np.sqrt(z0_i) - gain_cccs_a_i = np.sqrt(z0_i) / 2 - - # transfer gain of the controlled current source representing the reflected power wave b_i at port i - # - # the gain values result from the definition of the reflected power wave: - # b_i = 1 / 2 / sqrt(Z0_i) * (V_i - Z0_i * I_i) - # - # depending on the circuit topology used for the equivalent port network, this can be implemented - # with either controlled current and/or controlled voltage sources. in case of the Norton current - # source used in this implementation, the reflected power wave relates to the source current as: - # b_i = sqrt(Z0_i) / 2 * I_b_i <==> I_b_i = 2 / sqrt(Z0_i) * b_i - gain_b_i = 2 / np.sqrt(z0_i) - - # dummy voltage source (v = 0) for port current sensing (I_i) - f.write(f'V{i + 1} p{i + 1} s{i + 1} 0\n') - - # adding port reference resistor Ri = Z0_i - f.write(f'R{i + 1} s{i + 1} {node_ref_i} {z0_i}\n') - - # transfer of states and inputs from port j to input/output network of port i - for j in range(self.network.nports): - if create_reference_pins: - node_ref_j = f'p{j + 1}_ref' - else: - node_ref_j = '0' - - # reference impedance (real, i.e. resistance) of port i - z0_j = np.real(self.network.z0[0, j]) - - # Stacking order in VectorFitting class variables: - # s11, s12, s13, ..., s21, s22, s23, ... - idx_S_i_j = i * self.network.nports + j - - # VCCS and CCCS adding their currents to represent the incident wave a_j - gain_vccs_a_j = 1 / 2 / np.sqrt(z0_j) - gain_cccs_a_j = np.sqrt(z0_j) / 2 - - d = self.constant_coeff[idx_S_i_j] - e = self.proportional_coeff[idx_S_i_j] - - if d != 0.0: - # avoid zero-valued coefficients (in case of fit_constant=False) - - # input a_j is scaled by constant term d_i_j and by current gain for b_i - g_ij = gain_b_i * d * gain_vccs_a_j - f_ij = gain_b_i * d * gain_cccs_a_j - f.write(f'Gd{i + 1}_{j + 1} {node_ref_i} s{i + 1} p{j + 1} {node_ref_j} {g_ij}\n') - f.write(f'Fd{i + 1}_{j + 1} {node_ref_i} s{i + 1} V{j + 1} {f_ij}\n') - - if build_e and e != 0.0: - # avoid zero-valued coefficients (in case of fit_proportional=False) - # proportional coefficients require an extra node for the differentiation using an inductor - # [Y(s) ~ s * E * U(s)] - - # differentiated input a_j is scaled by proportional term e_i_j and by current gain for b_i - g_ij = gain_b_i * e - f.write(f'Ge{i + 1}_{j + 1} {node_ref_i} s{i + 1} e{j + 1} 0 {g_ij}\n') - - # each residue rk_i_j at port i is multiplied by its respective state signal xk_j - for k in range(len(self.poles)): - pole = self.poles[k] - residue = self.residues[idx_S_i_j, k] - g_re = gain_b_i * np.real(residue) - g_im = gain_b_i * np.imag(residue) - - if np.imag(pole) == 0.0: - # Real pole/residue pair; represented by one state - xkj = f'x{k + 1}_a{j + 1}' - f.write(f'Gr{k + 1}_{i + 1}_{j + 1} {node_ref_i} s{i + 1} {xkj} 0 {g_re}\n') - else: - # Complex-conjugate pole/residue pair; represented by two states - # real part at x_{k + 1}_re_{j + 1} - # imaginary part at x_{k + 1}_im_{j + 1} - xk_re_j = f'x{k + 1}_re_a{j + 1}' - xk_im_j = f'x{k + 1}_im_a{j + 1}' - f.write(f'Gr{k + 1}_re_{i + 1}_{j + 1} {node_ref_i} s{i + 1} {xk_re_j} 0 {g_re}\n') - f.write(f'Gr{k + 1}_im_{i + 1}_{j + 1} {node_ref_i} s{i + 1} {xk_im_j} 0 {g_im}\n') - - # create state networks driven by this port i (input variable u = a_i) - f.write('*\n') - f.write(f'* State networks driven by port {i + 1}\n') - for k in range(len(self.poles)): - pole = self.poles[k] - pole_re = np.real(pole) - pole_im = np.imag(pole) - - # Transfer of input (a_i) to state networks (node xk_i) using VCCS and CCCS - if pole_im == 0.0: - # Real pole; represented by one state, input a_i is scaled by b = 1 - xki = f'x{k + 1}_a{i + 1}' - f.write(f'Cx{k + 1}_a{i + 1} {xki} 0 1.0\n') # 1F capacitor makes math easy - f.write(f'Gx{k + 1}_a{i + 1} 0 {xki} p{i + 1} {node_ref_i} {1 * gain_vccs_a_i}\n') - f.write(f'Fx{k + 1}_a{i + 1} 0 {xki} V{i + 1} {1 * gain_cccs_a_i}\n') - f.write(f'Rp{k + 1}_a{i + 1} 0 {xki} {-1 / pole_re}\n') - else: - # Complex pole of a conjugate pair; represented by two states - # real part at x_{k + 1}_re_{i + 1}, input a_i is scaled by b = 2 - xk_re_i = f'x{k + 1}_re_a{i + 1}' - xk_im_i = f'x{k + 1}_im_a{i + 1}' - f.write(f'Cx{k + 1}_re_a{i + 1} {xk_re_i} 0 1.0\n') # 1F capacitor makes math easy - f.write( - f'Gx{k + 1}_re_a{i + 1} 0 {xk_re_i} p{i + 1} {node_ref_i} {2 * gain_vccs_a_i}\n') - f.write(f'Fx{k + 1}_re_a{i + 1} 0 {xk_re_i} V{i + 1} {2 * gain_cccs_a_i}\n') - f.write(f'Rp{k + 1}_re_re_a{i + 1} 0 {xk_re_i} {-1 / pole_re}\n') - f.write(f'Gp{k + 1}_re_im_a{i + 1} 0 {xk_re_i} {xk_im_i} 0 {pole_im}\n') - - # imaginary part at x_{k + 1}_im_{i + 1}, input a_i is inactive (b = 0) - f.write(f'Cx{k + 1}_im_a{i + 1} {xk_im_i} 0 1.0\n') # 1F capacitor makes math easy - f.write(f'Gp{k + 1}_im_re_a{i + 1} 0 {xk_im_i} {xk_re_i} 0 {-1 * pole_im}\n') - f.write(f'Rp{k + 1}_im_im_a{i + 1} 0 {xk_im_i} {-1 / pole_re}\n') - - # create differentiation network for this port i (input variable u = a_i) - if build_e: - f.write('*\n') - f.write(f'* Network with derivative of input a_{i + 1} for proportional term\n') - # voltage on node 'e{i + 1}' to gnd (0) represents time-derivative of input a_i for terms e_j_i - f.write(f'Le{i + 1} e{i + 1} 0 1.0\n') # 1H inductor makes math easy - f.write(f'Ge{i + 1} 0 e{i + 1} p{i + 1} {node_ref_i} {gain_vccs_a_i}\n') - f.write(f'Fe{i + 1} 0 e{i + 1} V{i + 1} {gain_cccs_a_i}\n') - - f.write(f'.ENDS {fitted_model_name}\n') diff --git a/main.py b/main.py index 4453f7c..b8e565e 100644 --- a/main.py +++ b/main.py @@ -1,446 +1,136 @@ -from core.orthonormal_basis import generate_laguerre_basis -from core.sk_iter import generate_starting_poles -import numpy as np import skrf as rf -import matplotlib.pyplot as plt -import sympy as sp -from scipy.linalg import null_space -from plotly.subplots import make_subplots -import plotly.graph_objs -from core.freqency import auto_select -from scipy.linalg import block_diag +from core.VFManager import VFManager +from core.utils import generate_starting_poles +from core.sample import auto_select_multple_ports +from core.basis.MultiPortOrthonormalBasis import MultiPortOrthonormalBasis -network = rf.Network("/tmp/paramer/simulation/3500/3500.s2p") -freqs = network.f -s = freqs * 2j * np.pi -vf = rf.VectorFitting(network) -vf.vector_fit(n_poles_real=2, n_poles_cmplx=1,parameter_type="y") - -poles = vf.poles -residues = vf.residues -y = vf.network.y - -# fig, ax = plt.subplots(2, 2) -# fig.set_size_inches(12, 8) -# vf.plot("mag",0,0,freqs,ax=ax[0][0],parameter="y") -# rms_error11 = vf.get_rms_error(0,0,"y") -# print("rms_error11",rms_error11) -# vf.plot("mag",1,0,freqs,ax=ax[1][0],parameter="y") -# rms_error21 = vf.get_rms_error(1,0,"y") -# print("rms_error21",rms_error21) -# vf.plot("mag",0,1,freqs,ax=ax[0][1],parameter="y") -# rms_error12 = vf.get_rms_error(0,1,"y") -# print("rms_error12",rms_error12) -# vf.plot("mag",1,1,freqs,ax=ax[1][1],parameter="y") -# rms_error22 = vf.get_rms_error(1,1,"y") -# print("rms_error22",rms_error22) -# fig.tight_layout() -# plt.show() -# plt.savefig(f"img.png") - -def formula_67(s,y): - diag_values = [y[i][0][0] for i in range(len(y))] - H = np.diag(diag_values) - P = 2 - start_poles = generate_starting_poles(P,beta_min=1e8,beta_max=freqs[-1]) - basis = generate_laguerre_basis(start_poles,s).T - print("start_poles",start_poles) - print("basis",basis) - - # first step iteration - # A*x = b - - A11 = np.real(basis) - print("A11 shape:",A11.shape) - A12 = np.real(- H @ basis[:,1:]) - print("A12 shape:",A12.shape) - # print("A11",A11) - A21 = np.imag(basis) - print("A21 shape:",A21.shape) - A22 = np.imag(- H @ basis[:,1:]) - print("A22 shape:",A22.shape) - A1 = np.hstack([A11,A12]) - A2 = np.hstack([A21,A22]) - A = np.vstack([A1,A2]) - print ("A shape:",A.shape) - - b1 = np.real(H @ basis[:,0]) - b2 = np.imag(H @ basis[:,0]) - b = np.hstack([b1,b2]) - Q, R = np.linalg.qr(A, mode='reduced') - print("Q :",Q) - print("R :",R) - print("b shape:",b.shape) - # x = np.linalg.solve(R, Q.T @ b) - x_star, residuals, rank, s = np.linalg.lstsq(A, b, rcond=None) - - # print("x_qr",x_star) - print("residuals",residuals) - # print("rank",rank) - # print("s",s) - - x_ne = np.linalg.inv(A.T @ A) @ A.T @ b - print("x_ne",x_ne) - - # sk iteration - target_vec = np.array([1+0j] + list(x_ne[len(x_ne)//2+1:])) - D_t = basis @ target_vec - print("D_t",D_t) - K = 25 - - for i in range(K): - print(f"Iteration {i+1}/{K}") - A11 = np.real(basis / D_t[:, np.newaxis]) - A12 = np.real(- H @ basis[:,1:] / D_t[:, np.newaxis]) - A21 = np.imag(basis / D_t[:, np.newaxis]) - A22 = np.imag(- H @ basis[:,1:] / D_t[:, np.newaxis]) - A1 = np.hstack([A11,A12]) - A2 = np.hstack([A21,A22]) - A = np.vstack([A1,A2]) - b1 = np.real(H @ basis[:,0]) - b2 = np.imag(H @ basis[:,0]) - b = np.hstack([b1,b2]) - x_star, residuals, rank, s = np.linalg.lstsq(A, b, rcond=None) - # print("x_lstsq",x_star) - # print("residuals",residuals) - # print("rank",rank) - # print("s",s) - x_ne = np.linalg.inv(A.T @ A) @ A.T @ b - # print("x_ne",x_ne) - target_vec = np.array([1+0j] + list(x_ne[len(x_ne)//2+1:])) - D_t_pre = D_t - D_t = basis @ target_vec - print("Dt", D_t) - # print("D_t/D_t_pre",D_t/D_t_pre) - # print("D_t",D_t) - n_target_vec = np.array(list(x_ne[:len(x_ne)//2+1])) - N_t = basis @ n_target_vec - # print("H = N_t / D_t",np.abs(N_t / D_t)) - -class formula_70_psi: - """ - VF-(70) with final pole-residue model. - After fit(): - self.poles : (P,) complex - self.res : (P, M) complex # residues per response (columns) - self.h : (M,) complex # optional constants - self.g : (M,) complex # optional proportional terms - """ - - # -------- internals -------- - - def __init__(self, s, P, H, beta_min, beta_max ,alpha_scale=0.01, n_iter=20, d0=1.0, include_const=True, include_linear=False, verbose=True): - self.s = s - self.P = P - self.H = H - self.beta_min = beta_min - self.beta_max = beta_max - self.alpha_scale = alpha_scale - self.z0 = self._generate_starting_poles(P, beta_min=beta_min, beta_max=beta_max,alpha_scale=alpha_scale) - self.z0 = np.array(self.z0, dtype=np.complex128) - self.n_iter = n_iter - self.d0 = d0 - self.include_const = include_const - self.include_linear = include_linear - self.verbose = verbose - - self.rel_iteration = [] - self.cond_iteration = [] - self.conf_poles_recognize = [] - self.rms_error_iteration = [] - self.rms_error_poles_recongnize = [] - - @staticmethod - def _generate_starting_poles(P, beta_min:float, beta_max:float, alpha_scale=0.01): - """ - 仅生成复共轭对: p = -alpha + j beta, p*。 - n_pairs: 复对数量 (总极点数 = 2*n_pairs) - beta_min,beta_max: 想要覆盖的虚部范围 (单位: rad/s) - alpha_scale: alpha = alpha_scale * beta (文中 {α_p}=0.01{β_p}) - 返回: list[complex] (正虚部先, 后跟共轭) - """ - betas = 2*np.pi*np.linspace(beta_min, beta_max, P) - poles = [] - for b in betas: - alpha = alpha_scale * b - p = -alpha + 1j * b - poles += [p, np.conj(p)] - return poles - - def _generate_laguerre_basis(self, s: np.ndarray, z: np.ndarray): - poles = z - poles = sorted(poles, key=lambda p: np.real(p)) - basis = np.zeros((len(poles)+1,len(s)),dtype=complex) - - product = np.ones(len(s),dtype=complex) - - basis[0] = np.ones(len(s),dtype=complex) # φ_0 = 1 - i = 0 - while i < len(poles): - if np.real(poles[i]) >= 0: - raise ValueError(f"极点必须在左半平面: {poles[i]}") - - # 复对首 (正虚部) - if np.iscomplex(poles[i]) and np.imag(poles[i]) > 0: - if i + 1 >= len(poles): - raise ValueError("复极点缺少共轭") - pn = poles[i] - pc = poles[i + 1] - if not np.isclose(pc, np.conj(pn)): - pc, pn = pn,pc - if not np.isclose(pc, np.conj(pn)): - raise ValueError("复极点未按 (p, p*) 顺序排列 (正虚部在前)") - poles[i], poles[i+1] = pc, pn # swap - sigma = -np.real(pn) # >0 - scale = np.sqrt(2 * sigma) - r = np.abs(pn) - denom = (s - pn) * (s - pc) - - # 两个基函数 - phi_p = scale * (s - r) / denom * product - phi_pc = scale * (s + r) / denom * product - - # product 先乘 (s + p^*)/(s - p),再乘 (s + p)/(s - p^*) - product = product * (s + pc) / (s - pn) - product = product * (s + pn) / (s - pc) - - basis[i + 1] = phi_p - basis[i + 2] = phi_pc - i += 2 - continue - - # 复对次 (负虚部) —— 应该被首元素处理,出现表示顺序错误 - if np.iscomplex(pn) and np.imag(pn) < 0: - raise ValueError("检测到负虚部复极点但其共轭尚未处理,请将正虚部成员放在前面。") - - # 实极点 - sigma = -np.real(pn) - if sigma <= 0: - raise ValueError("实极点实部应为负 (稳定)。") - scale = np.sqrt(2 * sigma) - phi = scale / (s - pn) * product - # 更新乘积 - product = product * (s + pn) / (s - pn) - i += 1 - basis[i + 1] = phi - return basis - - - def _orthonormal_psi(self,s,z): - s = np.asarray(s, np.complex128).reshape(-1) - z = np.asarray(z, np.complex128).reshape(-1) - return self._generate_laguerre_basis(s,z).T - - @staticmethod - def _psi(s, z): - s = np.asarray(s, np.complex128).reshape(-1) - z = np.asarray(z, np.complex128).reshape(-1) - return 1.0 / (s[:, None] + z[None, :]) - - # @staticmethod - # def _lhp(z): - # z = np.asarray(z, np.complex128).reshape(-1).copy() - # z[z.real > 0] = -np.conj(z[z.real > 0]) - # return z - - def _build_70(self, s, H_list, z_ref, d0): - Hs = [np.asarray(h, np.complex128).reshape(-1) for h in H_list] - K, P, M = len(s), len(z_ref), len(Hs) - Psi = self._psi(s, z_ref) - Z = np.zeros((K, P)) - rows, rhs = [], [] - for m, H in enumerate(Hs): - Hp = H[:, None] - L_re = np.real(Hp * Psi); L_im = np.imag(Hp * Psi) # acts on c - R_re = -np.real(Psi); R_im = -np.imag(Psi) # acts on r^(m) - rows.append(np.hstack([L_re] + [R_re if j == m else Z for j in range(M)])) - rhs.append(-np.real(d0 * H)) - rows.append(np.hstack([L_im] + [R_im if j == m else Z for j in range(M)])) - rhs.append(-np.imag(d0 * H)) - A = np.vstack(rows) - b = np.concatenate(rhs) - cond_poles_recognize = np.linalg.cond(A) - rms_error_poles_recongnize = np.sqrt(np.mean(np.abs(A @ np.zeros(A.shape[1]) - b)**2)) - return A, b, M, P, cond_poles_recognize, rms_error_poles_recongnize - - def _step_70(self, s, H_list, z_ref, d0=1.0, scale=True): - A, b, M, P, cond_poles_recognize, rms_error_poles_recongnize = self._build_70(s, H_list, z_ref, d0) - if scale: - coln = np.maximum(np.linalg.norm(A, axis=0), 1e-12) - x, *_ = np.linalg.lstsq(A / coln, b, rcond=None) - x = x / coln - cond_iteration = np.linalg.cond(A) - rms_error_iteration = np.sqrt(np.mean(np.abs(A @ x - b)**2)) - else: - x, *_ = np.linalg.lstsq(A, b, rcond=None) - cond_iteration = np.linalg.cond(A) - rms_error_iteration = np.sqrt(np.mean(np.abs(A @ x - b)**2)) - - c = x[:P] - res_ratio = np.empty((P, M), np.complex128) - off = P - for m in range(M): - res_ratio[:, m] = x[off:off+P]; off += P - # relocate poles with test matrix - Sigma = np.diag(-np.asarray(z_ref, np.complex128)) - T = Sigma - (np.ones((P, 1), np.complex128) @ (c.reshape(1, -1) / d0)) - z_new = -np.linalg.eigvals(T) - # z_new = self._lhp(z_new) - # cond = np.linalg.cond(T) - return z_new, c, cond_iteration, rms_error_iteration, cond_poles_recognize, rms_error_poles_recongnize, res_ratio - - # -------- public API -------- - def fit(self): - """ - s : (K,) complex samples (j*2π*f_sel) - H : (K,) complex or (K,M) or list of M vectors - z0: initial poles (P,) complex (LHP + conjugate pairs recommended) - """ - # normalize responses -> list - if isinstance(self.H, (list, tuple)): - H_list = [np.asarray(h, np.complex128).reshape(-1) for h in self.H] - else: - H_arr = np.asarray(self.H, np.complex128) - if H_arr.ndim == 1: - H_list = [H_arr] - elif H_arr.ndim == 2 and H_arr.shape[0] == len(self.s): - H_list = [H_arr[:, i].copy() for i in range(H_arr.shape[1])] - else: - raise ValueError("H must be (K,), list of (K,), or (K,M) with M responses.") - M = len(H_list) - - # z = self._lhp(np.asarray(self.z0, np.complex128)) - z = self.z0 - # SK/VF relocations - for it in range(self.n_iter): - z_next, c_last, cond_iteration, rms_error_iteration, cond_poles_recognize, rms_error_poles_recongnize, _ = self._step_70(self.s, H_list, z, d0=self.d0, scale=True) - rel = np.linalg.norm(z_next) / max(1.0, np.linalg.norm(z)) - if self.verbose: - print(f"[VF-70] iter {it+1:02d}/{self.n_iter:02d} Δz_rel={rel}") - self.cond_iteration.append(cond_iteration) - self.rms_error_iteration.append(rms_error_iteration) - self.conf_poles_recognize.append(cond_poles_recognize) - self.rms_error_poles_recongnize.append(rms_error_poles_recongnize) - self.rel_iteration.append(rel) - z = z_next - - # ---- Finalize: refit residues with fixed poles z (pole–residue model) ---- - Phi = self._psi(self.s, z) # K x P - # Build design matrix for extras - extras = [] - if self.include_const: extras.append(np.ones(len(self.s), np.complex128)) - if self.include_linear: extras.append(self.s.astype(np.complex128)) - if extras: - X_base = np.column_stack([Phi] + extras) # K x (P + E) - else: - X_base = Phi - - res = np.empty((len(z), M), np.complex128) - h = np.zeros(M, np.complex128) - g = np.zeros(M, np.complex128) - - for m, Hm in enumerate(H_list): - theta, *_ = np.linalg.lstsq(X_base, Hm, rcond=None) # complex LS - res[:, m] = theta[:len(z)] - e = len(theta) - len(z) - if e >= 1: h[m] = theta[len(z)] - if e >= 2: g[m] = theta[len(z)+1] - - # store the rational function - self.poles = z # (P,) - self.res = res # (P, M) - self.h = h # (M,) - self.g = g # (M,) - return self - - # Evaluate the stored **rational** model on any grid - def evaluate(self, s_eval, m=None): - if not hasattr(self, "poles"): - raise RuntimeError("Model not fitted. Call fit(...) first.") - s_eval = np.asarray(s_eval, np.complex128).reshape(-1) - Phi = self._psi(s_eval, self.poles) # K_eval x P - if m is None: - H = Phi @ self.res - if np.any(self.h): H += self.h - if np.any(self.g): H += s_eval[:, None] * self.g - return H # (K_eval, M) or (K_eval,1) - m = int(m) - H = Phi @ self.res[:, m] - H += self.h[m] - H += s_eval * self.g[m] - return H # (K_eval,) - - # def plot_rel_and_cond(self): - # fig, (ax1, ax2) = plt.subplots(2,1,figsize=(15,20)) - # ax1.plot(np.log(self.rel), 'g-', label='rel') - # ax2.plot(np.log(self.cond), 'b-', label='cond') - # ax1.set_xlabel('Iteration') - # ax1.set_ylabel('Relative Change', color='g') - # ax2.set_ylabel('Condition Number', color='b') - # ax1.tick_params(axis='y', labelcolor='g') - # ax2.tick_params(axis='y', labelcolor='b') - # fig.tight_layout() - # plt.title('Relative Change and Condition Number per Iteration') - # # plt.show() - # plt.savefig(f"img_rel_cond.png") - def plot_rel_and_cond(self): - fig = make_subplots(rows=3, cols=2) - fig.add_trace(plotly.graph_objs.Scatter(y=self.rel_iteration, mode='lines+markers', name='rel'), row=1, col=1) - fig.add_trace(plotly.graph_objs.Scatter(y=self.cond_iteration, mode='lines+markers', name='cond_iteration'), row=2, col=1) - fig.add_trace(plotly.graph_objs.Scatter(y=self.rms_error_iteration, mode='lines+markers', name='rms_error_iteration'), row=3, col=1) - fig.add_trace(plotly.graph_objs.Scatter(y=self.conf_poles_recognize, mode='lines+markers', name='cond_poles_recognize'), row=2, col=2) - fig.add_trace(plotly.graph_objs.Scatter(y=self.rms_error_poles_recongnize, mode='lines+markers', name='rms_error_poles_recognize'), row=3, col=2) - fig.update_xaxes(title_text='Iteration', row=1, col=1) - fig.update_yaxes(title_text='Relative Change', row=1, col=1) - fig.update_yaxes(title_text='Condition Number (Iteration)', row=2, col=1) - fig.update_yaxes(title_text='RMS Error (Iteration)', row=3, col=1) - fig.update_yaxes(title_text='Condition Number (Pole Recognition)', row=2, col=2) - fig.update_yaxes(title_text='RMS Error (Pole Recognition)', row=3, col=2) - fig.update_layout(height=800, width=800, title_text='Relative Change and Condition Number per Iteration') - fig.write_image("img_rel_cond.png") - # fig.show() - - def evaluate_on_freq(self, freq_eval, m=None): - return self.evaluate(1j * 2*np.pi * np.asarray(freq_eval, float), m=m) - - - if __name__ == "__main__": - # formula_67(s,y) - H11 = np.array([y[i,0,0] for i in range(len(y))]) - H11_slice,freqs_slice = auto_select(H11,freqs,max_points=20) - s_slice = freqs_slice * 2j * np.pi - P_pairs = 2 + start_point = 0 + id = 3000 + network = rf.Network(f"/tmp/paramer/simulation/{id}/{id}.s2p") + # network = rf.data.ring_slot + ports = network.nports + K = 100 - K = 10 - f70 = formula_70_psi(s_slice,P_pairs, H11_slice, beta_min=1e8, beta_max=freqs_slice[-1],alpha_scale=0.01, n_iter=K, d0=1.0, verbose=True) - model = f70.fit() - model.plot_rel_and_cond() + full_freqences = network.f[start_point:] + noised_sampled_points = network.y[start_point:,:,:].reshape(-1,ports,ports) + sampled_points = network.y[start_point:,:,:].reshape(-1,ports,ports) - Hfit_dense = model.evaluate_on_freq(freqs) + # noised_sampled_points = network.y[start_point:,0,0].reshape(-1,1,1) + # sampled_points = network.y[start_point:,0,0].reshape(-1,1,1) - fig, axes = plt.subplots(2, 1, figsize=(10, 8), sharex=False) + H,freqs = auto_select_multple_ports(noised_sampled_points,full_freqences,max_points=20) - # (1) Magnitude plot like your screenshot - ax0 = axes[0] - ax0.plot(freqs, np.abs(H11), 'o', ms=4, color='red', label='Samples') - ax0.plot(freqs, np.abs(Hfit_dense), '-', lw=2, color='k', label='Fit') - ax0.plot(freqs_slice, np.abs(H11_slice), 'x', ms=4, color='blue', label='Input Samples') - ax0.set_title("Response i=0, j=0") - ax0.set_ylabel("Magnitude") - ax0.legend(loc="best") + vf = VFManager(npoles_cplx=2,freqs=freqs,H=H,model=MultiPortOrthonormalBasis,iterations=K,verbose=False) + model = vf.fit() + vf.plot_metrics(show=False,save_path="outputs") + model_responses = vf.get_model_responses(full_freqences) + vf.plot_model_responses(show=False,save_path="outputs") - # (2) RMS error vs iteration - # ax1 = axes[1] - # its = np.arange(1, K+1) - # ax1.plot(its, hist["rms_rel"], '-o', lw=2) - # ax1.set_xlabel("Iteration") - # ax1.set_ylabel("RMS error (relative)") - # ax1.grid(True, alpha=0.3) - # ax1.set_title(f"RMS(final) = {hist['rms_rel'][-1]:.3e}") + # # Original plot functions + + # Dt_1 = np.ones((len(freqs),1),np.complex128) + # # Levi step (no weighting): + # basis = MultiPortOrthonormalBasis(H,freqs,poles=poles) + # Dt = basis.Dt + # poles = basis.next_poles - fig.tight_layout() - plt.savefig(f"img_formula_70.png") + # print("Levi step (no weighting):") + # print("A:",basis.A) + # print("B:",basis.B) + # print("C:",basis.C) + # print("D:",basis.D) + # print("next_pozles:",basis.next_poles) + # print("Dt:",Dt, "norm:",np.linalg.norm(Dt)) + # # SK weighting (optional, after first pass): + # least_squares_condition = [] + # least_squares_rms_error = [] + # eigenval_condition = [] + # eigenval_rms_error = [] + # for i in range(K): + # basis = MultiPortOrthonormalBasis(H,freqs,poles=poles,weights=Dt) + # Dt_1 = Dt + # Dt = basis.Dt + # poles = basis.next_poles + # print(f"SK Iteration {i+1}/{K}") + # print("A:",basis.A) + # print("B:",basis.B) + # print("C:",basis.C) + # print("D:",basis.D) + # print("z:",basis.next_poles) + # print("Dt:",Dt) + # print("Dt/Dt-1",np.linalg.norm(Dt) / np.linalg.norm(Dt_1)) + # least_squares_condition.append(basis.least_squares_condition) + # least_squares_rms_error.append(basis.least_squares_rms_error) + # eigenval_condition.append(basis.eigenval_condition) + # eigenval_rms_error.append(basis.eigenval_rms_error) + # # H11_evaluated = basis.evaluate_pole_residue(network.f[1:],poles,basis.C[0]) + # H_evaluated = basis.get_model_responses(full_freqences) + # fitted_points = H_evaluated + # sliced_freqences = freqs + + # input_points = H + # for i in range(ports): + # for j in range(ports): + # fig, axes = plt.subplots(3, 2, figsize=(15, 16), sharex=False) + # ax00 = axes[0][0] + # ax00.plot(full_freqences, np.abs(sampled_points[:,i,j]), 'o', ms=4, color='red', label='Samples') + # ax00.plot(full_freqences, np.abs(fitted_points[:,i,j]), '-', lw=2, color='k', label='Fit') + # ax00.plot(sliced_freqences, np.abs(input_points[:,i,j]), 'x', ms=4, color='blue', label='Input Samples') + # ax00.set_title(f"Response i={i+1}, j={j+1}") + # ax00.set_ylabel("Magnitude") + # ax00.legend(loc="best") + + # ax01 = axes[0][1] + # ax01.set_title(f"Response i={i+1}, j={j+1}") + # ax01.set_ylabel("Phase (deg)") + # ax01.plot(full_freqences, np.angle(sampled_points[:,i,j],deg=True), 'o', ms=4, color='red', label='Samples') + # ax01.plot(full_freqences, np.angle(fitted_points[:,i,j],deg=True), '-', lw=2, color='k', label='Fit') + # ax01.plot(sliced_freqences, np.angle(input_points[:,i,j],deg=True), 'x', ms=4, color='blue', label='Input Samples') + # ax01.legend(loc="best") + + # # ax00 = axes[0][0] + # # ax00.plot(full_freqences, np.real(sampled_points[:,i,j]), 'o', ms=4, color='red', label='Samples') + # # ax00.plot(full_freqences, np.real(fitted_points[:,i,j]), '-', lw=2, color='k', label='Fit') + # # ax00.plot(sliced_freqences, np.real(input_points[:,i,j]), 'x', ms=4, color='blue', label='Input Samples') + # # ax00.set_title(f"Response i={i+1}, j={j+1}") + # # ax00.set_ylabel("Real Part") + # # ax00.legend(loc="best") + + # # ax01 = axes[0][1] + # # ax01.set_title(f"Response i={i+1}, j={j+1}") + # # ax01.set_ylabel("Imag Part") + # # ax01.plot(full_freqences, np.imag(sampled_points[:,i,j]), 'o', ms=4, color='red', label='Samples') + # # ax01.plot(full_freqences, np.imag(fitted_points[:,i,j]), '-', lw=2, color='k', label='Fit') + # # ax01.plot(sliced_freqences, np.imag(input_points[:,i,j]), 'x', ms=4, color='blue', label='Input Samples') + # # ax01.legend(loc="best") + + # ax10 = axes[1][0] + # ax10.plot(least_squares_condition, label='Least Squares Condition') + # ax10.set_title("least_squares_condition") + # ax10.set_ylabel("Magnitude") + # ax10.legend(loc="best") + + # ax11 = axes[1][1] + # ax11.plot(least_squares_rms_error, label='Least Squares RMS Error') + # ax11.set_title("least_squares_rms_error") + # ax11.set_ylabel("Magnitude") + # ax11.legend(loc="best") + + # ax20 = axes[2][0] + # ax20.plot(eigenval_condition, label='Eigenvalue Condition') + # ax20.set_title("eigenval_condition") + # ax20.set_ylabel("Magnitude") + # ax20.legend(loc="best") + + # ax21 = axes[2][1] + # ax21.plot(eigenval_rms_error, label='Eigenvalue RMS Error') + # ax21.set_title("eigenval_rms_error") + # ax21.set_ylabel("Magnitude") + # ax21.legend(loc="best") + # fig.tight_layout() + # plt.savefig(f"MultiplePortQR_port_{i+1}{j+1}.png") + # print(f"Saved MultiplePortQR_port_{i+1}{j+1}.png") \ No newline at end of file diff --git a/models/basic.py b/models/basic.py deleted file mode 100644 index 722209c..0000000 --- a/models/basic.py +++ /dev/null @@ -1,155 +0,0 @@ -from abc import abstractmethod -from skrf import Network -from schemas.paramer import SimulationRequestUnit, UuidResponseUnit, SimulationResponseUnit -from typing import List, Literal, Union, Dict -import requests -import time -from utils import send_get_request -from pydantic import BaseModel, Field -import itertools -import json -import numpy as np - -class ModelBasicParametersUnit(BaseModel): - name: str - type: Literal["number","integer","string","boolean"] - range: List[Union[float,int,str,bool]] - -class ModelBasicInfo(BaseModel): - base_url: str = Field(default="http://localhost:8105/api/v1") - nports: int = Field(default=2) - cell_name: str - template_name: str - user_id: int = Field(default=0) - template_version: str = Field(default="") - -class ModelBasicDatasetUnit(BaseModel): - nports: int = Field(default=2) - parameters: Dict[str, Union[float, int, str, bool]] - id: int = Field(default=0) - result_dir: str = Field(default="") - - @property - def network(self) -> Network: - try: - network = Network(f"{self.result_dir}/{self.id}.s{self.nports}p") - return network - except Exception as e: - raise RuntimeError(f"Error loading network from {self.result_dir}: {e}") - - @property - def s_params(self) -> np.ndarray: - return self.network.s - - @property - def y_params(self) -> np.ndarray: - return self.network.y - - @property - def z_params(self) -> np.ndarray: - return self.network.z - - @property - def freqs(self) -> np.ndarray: - return self.network.f - - -class ModelBasic: - def __init__(self): - self._dataset:List[ModelBasicDatasetUnit] = [] - - @property - @abstractmethod - def info(self)->ModelBasicInfo: - pass - - @property - @abstractmethod - def parameters(self)->List[ModelBasicParametersUnit]: - pass - - @property - @abstractmethod - def settings(self)->dict: - pass - - def sweep(self): - parameters_list = [] - lst = [res.range for res in self.parameters] - parameters_name = [res.name for res in self.parameters] - result = [list(item) for item in itertools.product(*lst)] - for res in result: - parameters_list.append({parameters_name[i]:res[i] for i in range(len(res))}) - - for res in parameters_list: - print(f"Simulating with parameters: {res}") - request_unit = SimulationRequestUnit( - user_id=self.info.user_id, - template_name=self.info.template_name, - template_version=self.info.template_version, - cell_name=self.info.cell_name, - parameters=res, - settings=self.settings - ) - response = self.simulate(request_unit) - - self._dataset.append(ModelBasicDatasetUnit(nports=self.info.nports,parameters=res, id=response.id, result_dir=response.result_path)) - - @property - def results(self)->List[ModelBasicDatasetUnit]: - return self._dataset - - def export(self, path:str|None): - if path is None: - path = f"{self.info.cell_name}_dataset.json" - with open(path,"w") as f: - json.dump([dict(item) for item in self.results],f,indent=4) - - def load(self, path:str|None): - if path is None: - path = f"{self.info.cell_name}_dataset.json" - with open(path,"r") as f: - data = json.load(f) - self._dataset += [ModelBasicDatasetUnit(**item) for item in data] - - def clear(self): - self._dataset = [] - - def simulate(self,simulation_request:SimulationRequestUnit)->UuidResponseUnit: - def send_simulate_request(url, data:list)->list[dict]: - response = requests.post(url, json = data) - if response.status_code not in [200,201,202]: - raise RuntimeError(f"send_simulate_request: {response.status_code}, {response.text}") - return response.json() - - response = send_simulate_request(f"{self.info.base_url}/simulations/create", [dict(simulation_request)]) - - simulation_response_model:SimulationResponseUnit = SimulationResponseUnit(**(response[0])) - - time.sleep(0.05) - - response = send_get_request(f"{self.info.base_url}/simulations/input_hash/{simulation_response_model.input_hash}") - - assert isinstance(response, dict), "Response is not a dictionary." - uuid_model = UuidResponseUnit(**response) - - - time.sleep(0.05) # Wait for 2 seconds before checking the status again - - status = uuid_model.status - while status != "completed" and status != "failed": - time.sleep(0.05) # Wait for 2 seconds before checking again - response = send_get_request(f"{self.info.base_url}/simulations/input_hash/{simulation_response_model.input_hash}") - assert isinstance(response, dict), "Response is not a dictionary." - try: - uuid_model = UuidResponseUnit(**response) - except Exception as e: - print(f"Error parsing response: {e}") - continue - assert response is not None, "No response received from the server." - status = uuid_model.status - - if status == "failed": - raise RuntimeError(f"Simulation failed: {uuid_model.error_message}") - else: - return uuid_model \ No newline at end of file diff --git a/models/capa.py b/models/capa.py deleted file mode 100644 index 885253b..0000000 --- a/models/capa.py +++ /dev/null @@ -1,45 +0,0 @@ -from typing import List,Optional -from pydantic import BaseModel, Field -from schemas.paramer import SimulationRequestUnit -from skrf import Network -import re -from models.basic import ModelBasic, ModelBasicParametersUnit, ModelBasicInfo, ModelBasicDatasetUnit - -W = [] -L = [] -i = 15.52 -while i <= 100: - W.append(i) - L.append(i) - i = int(i*1.05*100 + 0.5) / 100.0 - -class Capa(ModelBasic): - def __init__(self): - super().__init__() - - @property - def info(self) -> ModelBasicInfo: - return ModelBasicInfo( - nports=2, - cell_name="capa", - template_name="em_interface_compound", - user_id=0, - template_version="" - ) - - @property - def settings(self) -> dict: - return {} - - @property - def parameters(self) -> List[ModelBasicParametersUnit]: - return [ - ModelBasicParametersUnit(name="W",type="number",range=W), - ModelBasicParametersUnit(name="L",type="number",range=L) - ] - - - - - - \ No newline at end of file diff --git a/models/mlin.py b/models/mlin.py deleted file mode 100644 index c080f67..0000000 --- a/models/mlin.py +++ /dev/null @@ -1,45 +0,0 @@ -from typing import List,Optional -from pydantic import BaseModel, Field -from schemas.paramer import SimulationRequestUnit -from skrf import Network -import re -from models.basic import ModelBasic, ModelBasicParametersUnit, ModelBasicInfo, ModelBasicDatasetUnit - -W = [] -L = [] -i = 15.52 -while i <= 100: - W.append(i) - L.append(i) - i = int(i*1.05*100 + 0.5) / 100.0 - -class Mlin(ModelBasic): - def __init__(self): - super().__init__() - - @property - def info(self) -> ModelBasicInfo: - return ModelBasicInfo( - nports=2, - cell_name="mlin", - template_name="em_interface_compound", - user_id=0, - template_version="" - ) - - @property - def settings(self) -> dict: - return {} - - @property - def parameters(self) -> List[ModelBasicParametersUnit]: - return [ - ModelBasicParametersUnit(name="W",type="number",range=W), - ModelBasicParametersUnit(name="L",type="number",range=L) - ] - - - - - - \ No newline at end of file diff --git a/outputs/capa_parametric.s2p b/outputs/capa_parametric.s2p deleted file mode 100644 index dccfb21..0000000 --- a/outputs/capa_parametric.s2p +++ /dev/null @@ -1,309 +0,0 @@ -! Created with skrf 1.8.0 (http://scikit-rf.org). -# Hz S RI R 50.0 -!freq ReS11 ImS11 ReS21 ImS21 ReS12 ImS12 ReS22 ImS22 -0.0 0.5169316987261682 -0.14305278198989352 0.4988694955145437 0.12530267192181432 0.4988694955145437 0.12530267192181432 0.5263854174928203 -0.14417829506357768 -1000.0 0.5169316947040424 -0.14305278151191225 0.4988694984093659 0.12530266799393616 0.4988694984093659 0.12530266799393616 0.5263854133767084 -0.14417829453782283 -10000.0 0.5169316585049104 -0.14305277721008075 0.4988695244627657 0.12530263264303276 0.4988695244627657 0.12530263264303276 0.5263853763317018 -0.14417828980602918 -12589.0 0.5169316480916267 -0.14305277597258723 0.4988695319574604 0.12530262247375623 0.4988695319574604 0.12530262247375623 0.5263853656750881 -0.14417828844484987 -15849.0 0.5169316349794967 -0.14305277441436826 0.4988695413945808 0.12530260966887344 0.4988695413945808 0.12530260966887344 0.5263853522565635 -0.14417828673088906 -19953.0 0.5169316184726925 -0.1430527724527331 0.4988695532749311 0.12530259354886147 0.4988695532749311 0.12530259354886147 0.5263853353640404 -0.14417828457319115 -25119.0 0.5169315976943908 -0.14305276998348182 0.4988695682295826 0.12530257325744293 0.4988695682295826 0.12530257325744293 0.5263853141002066 -0.14417828185714157 -31623.0 0.5169315715344848 -0.1430527668746916 0.4988695870575062 0.1253025477105234 0.4988695870575062 0.1253025477105234 0.526385287329015 -0.14417827843763203 -39811.0 0.5169315386013189 -0.14305276296098088 0.4988696107603104 0.12530251554905705 0.4988696107603104 0.12530251554905705 0.5263852536262912 -0.1441782741327513 -50119.0 0.5169314971412463 -0.14305275803394987 0.49886964060013766 0.12530247506048903 0.49886964060013766 0.12530247506048903 0.5263852111974101 -0.1441782687132703 -63096.0 0.5169314449461201 -0.14305275183118685 0.4988696781662454 0.1253024240884142 0.4988696781662454 0.1253024240884142 0.5263851577826266 -0.1441782618905496 -79433.0 0.5169313792366513 -0.14305274402240672 0.49886972545895575 0.12530235991866878 0.49886972545895575 0.12530235991866878 0.5263850905377072 -0.1441782533012926 -100000.0 0.5169312965135905 -0.14305273419176578 0.498869784996764 0.12530227913399875 0.498869784996764 0.12530227913399875 0.5263850058816346 -0.14417824248809258 -125893.0 0.5169311923686877 -0.14305272181539658 0.4988698599523953 0.12530217742944966 0.4988698599523953 0.12530217742944966 0.5263848993031504 -0.1441782288747222 -158489.0 0.5169310612634759 -0.14305270623511884 0.4988699543120198 0.12530204939633327 0.4988699543120198 0.12530204939633327 0.5263847651343683 -0.1441782117372171 -199526.0 0.5169308962075003 -0.14305268662020118 0.49887007310683856 0.1253018882079974 0.49887007310683856 0.1253018882079974 0.5263845962214859 -0.14417819016181527 -251189.0 0.5169306884124163 -0.14305266192625446 0.49887022266203807 0.12530168528202823 0.49887022266203807 0.12530168528202823 0.5263843835707991 -0.1441781629997424 -316228.0 0.5169304268173779 -0.14305263083883016 0.4988704109383793 0.12530142981676085 0.4988704109383793 0.12530142981676085 0.526384115863 -0.14417812880517264 -398107.0 0.5169300974897413 -0.14305259170220114 0.4988706479635265 0.12530110820602533 0.4988706479635265 0.12530110820602533 0.5263837788398773 -0.14417808575689117 -501187.0 0.5169296828890162 -0.14305254243189108 0.4988709463617992 0.125300703320345 0.4988709463617992 0.125300703320345 0.5263833545510671 -0.14417803156208114 -630957.0 0.5169291609377541 -0.14305248040426072 0.4988713220228765 0.12530019359959674 0.4988713220228765 0.12530019359959674 0.5263828204032315 -0.1441779633348741 -794328.0 0.5169285038390437 -0.14305240231598146 0.4988717949528746 0.12529955189821454 0.4988717949528746 0.12529955189821454 0.5263821479499213 -0.14417787744177832 -1000000.0 0.5169276766003909 -0.14305230400861618 0.49887239033674674 0.12529874404365846 0.49887239033674674 0.12529874404365846 0.5263813013809635 -0.14417776930872658 -1258925.0 0.5169266351714739 -0.14305218024731395 0.49887313987858567 0.12529772701780695 0.49887313987858567 0.12529772701780695 0.526380235616701 -0.14417763317765178 -1584893.0 0.5169253240871785 -0.14305202444071294 0.49887408349798956 0.12529644665522024 0.49887408349798956 0.12529644665522024 0.5263788938959513 -0.14417746179839447 -1995262.0 0.5169236735314454 -0.14305182829201415 0.4988752714432822 0.12529483477578932 0.4988752714432822 0.12529483477578932 0.5263772047712447 -0.144177246044902 -2511886.0 0.5169215956047378 -0.14305158135541474 0.49887676697790806 0.1252928055396649 0.49887676697790806 0.1252928055396649 0.5263750782890728 -0.1441769744273278 -3162278.0 0.5169189796463092 -0.14305127048021582 0.4988786497471103 0.12529025087913537 0.4988786497471103 0.12529025087913537 0.5263724012028501 -0.14417663248057871 -3981072.0 0.5169156863538554 -0.1430508791120138 0.49888102001016127 0.12528703475606862 0.49888102001016127 0.12528703475606862 0.5263690309551585 -0.14417620199566117 -5011872.0 0.5169115403466041 -0.14305038640891315 0.4988840039928882 0.12528298589926556 0.4988840039928882 0.12528298589926556 0.5263647880670566 -0.14417566004756066 -6309573.0 0.5169063208299607 -0.14304976613213158 0.49888776060655593 0.12527788868785483 0.49888776060655593 0.12527788868785483 0.5263594465845839 -0.14417497777496466 -7943282.0 0.5168997498468791 -0.14304898524981696 0.4988924899036425 0.12527147167796068 0.4988924899036425 0.12527147167796068 0.5263527220555985 -0.14417411884453263 -10000000.0 0.5168914774683946 -0.14304800217712021 0.4988984437365743 0.12526339314025572 0.4988984437365743 0.12526339314025572 0.5263442563742526 -0.14417303751506683 -12589254.0 0.516881063163137 -0.14304676456218599 0.49890593916654286 0.12525322286602916 0.49890593916654286 0.12525322286602916 0.526333598715163 -0.14417167620221563 -15848932.0 0.5168679523282272 -0.14304520649713184 0.498915375354792 0.12524041924801782 0.498915375354792 0.12524041924801782 0.5263201815158981 -0.14416996241069416 -19952623.0 0.5168514467668739 -0.14304324500966592 0.49892725481061334 0.12522430044978053 0.49892725481061334 0.12522430044978053 0.5263032902647165 -0.14416780487524355 -25118864.0 0.5168306674957757 -0.14304077564319373 0.49894221015976653 0.12520400808460874 0.49894221015976653 0.12520400808460874 0.5262820254388815 -0.14416508869897593 -31622777.0 0.5168045079396447 -0.14303766689455033 0.49896103783152573 0.12517846150680842 0.49896103783152573 0.12517846150680842 0.5262552546054668 -0.14416166923516513 -39810717.0 0.5167715750151072 -0.14303375321253045 0.49898474046203506 0.12514630027614093 0.49898474046203506 0.12514630027614093 0.5262215521285504 -0.14415736438598972 -50118723.0 0.5167301149184613 -0.14302882617865584 0.49901458030667317 0.12510581168454307 0.49901458030667317 0.12510581168454307 0.5261791232228341 -0.1441519449018302 -63095734.0 0.5166779197480051 -0.14302262341036215 0.49905214644624535 0.12505483956650784 0.49905214644624535 0.12505483956650784 0.5261257083939916 -0.14414512217534436 -79432823.0 0.5166122099212112 -0.1430148145876941 0.4990994394142159 0.12499066947149441 0.4990994394142159 0.12499066947149441 0.5260584631082538 -0.14413653287154995 -100000000.0 0.5165294861484319 -0.1430049838621606 0.49915897773484985 0.12490988410622846 0.49915897773484985 0.12490988410622846 0.525973806307144 -0.14412571957846906 -125892541.0 0.5164253430918343 -0.1429926077123401 0.4992339320374304 0.12480818136003487 0.4992339320374304 0.12480818136003487 0.5258672297121321 -0.1441121064494314 -158489319.0 0.5162942347507815 -0.14297702706275484 0.499328293914133 0.12468014518777729 0.499328293914133 0.12468014518777729 0.525733057727714 -0.14409496853526813 -199526231.0 0.516129179129203 -0.14295741218713942 0.4994470884781358 0.12451895719754857 0.4994470884781358 0.12451895719754857 0.5255641452076658 -0.14407339317971052 -251188643.0 0.5159213864101769 -0.14293271852146178 0.4995966419754571 0.1243160335379748 0.4995966419754571 0.1243160335379748 0.5253514969410836 -0.14404623141598272 -316227766.0 0.5156597908770215 -0.14290163103837383 0.49978491867278524 0.1240605677874669 0.49978491867278524 0.1240605677874669 0.5250837886357498 -0.14401203678155508 -398107171.0 0.5153304616115358 -0.14286249421578498 0.5000219449923526 0.12373895546115266 0.5000219449923526 0.12373895546115266 0.5247467638460045 -0.1439689882871723 -501187234.0 0.5149158606330113 -0.14281322387560505 0.5003203434474182 0.12333406953339042 0.5003203434474182 0.12333406953339042 0.5243224747764942 -0.1439147934439998 -630957344.0 0.514393908928449 -0.1427511961926681 0.50069600484314 0.12282434835303803 0.50069600484314 0.12282434835303803 0.5237883264880697 -0.14384656617914132 -794328235.0 0.5137368106564871 -0.14267310796550947 0.5011689345257409 0.12218264739897594 0.5011689345257409 0.12218264739897594 0.5231158736265745 -0.1437606731406718 -800000996.0 0.5137139940982403 -0.14267039649196073 0.5011853561602363 0.12216036548496063 0.5011853561602363 0.12216036548496063 0.5230925239077618 -0.14375769065905702 -1000000000.0 0.5129095729488049 -0.14257480071256423 0.5017643177176059 0.1213747937659555 0.5017643177176059 0.1213747937659555 0.5222693056360564 -0.14365254021249166 -1600000990.0 0.5104962935004823 -0.1422880114729652 0.5035012139053171 0.11901806298384085 0.5035012139053171 0.11901806298384085 0.5197996344470474 -0.14333708678134274 -2400000990.0 0.5072785928785918 -0.14190562645110177 0.505817071667767 0.11587576045915382 0.505817071667767 0.11587576045915382 0.5165067449616364 -0.14291648290047396 -3200000980.0 0.5040608922969224 -0.14152324143401826 0.5081329294012686 0.11273345797374554 0.5081329294012686 0.11273345797374554 0.5132138555173865 -0.14249587902486277 -4000000980.0 0.5008431916750319 -0.14114085641215496 0.5104487871637186 0.10959115544905842 0.5104487871637186 0.10959115544905842 0.5099209660319755 -0.1420752751439941 -4800000980.0 0.49762549105314136 -0.14075847139029166 0.5127646449261685 0.10644885292437128 0.5127646449261685 0.10644885292437128 0.5066280765465645 -0.14165467126312542 -5600000970.0 0.4944077904714721 -0.1403760863732082 0.5150805026596701 0.10330655043896295 0.5150805026596701 0.10330655043896295 0.5033351871023147 -0.1412340673875143 -6400000970.0 0.49119008984958146 -0.13999370135134492 0.51739636042212 0.10016424791427578 0.51739636042212 0.10016424791427578 0.5000422976169037 -0.14081346350664567 -7200000960.0 0.48797238926791214 -0.1396113163342615 0.5197122181556217 0.0970219454288674 0.5197122181556217 0.0970219454288674 0.4967494081726538 -0.14039285963103457 -8000000960.0 0.4847546886460215 -0.13922893131239825 0.5220280759180717 0.09387964290418022 0.5220280759180717 0.09387964290418022 0.49345651868724266 -0.13997225575016592 -8800000960.0 0.48153698802413086 -0.138846546290535 0.5243439336805215 0.09073734037949305 0.5243439336805215 0.09073734037949305 0.4901636292018316 -0.1395516518692973 -9600000950.0 0.47831928744246155 -0.13846416127345157 0.5266597914140232 0.08759503789408464 0.5266597914140232 0.08759503789408464 0.48687073975758166 -0.13913104799368622 -10400000900.0 0.4751015870216772 -0.1380817762754874 0.5289756490317319 0.08445273556579136 0.5289756490317319 0.08445273556579136 0.48357785047797625 -0.13871044413910533 -11200000900.0 0.47188388639978657 -0.13769939125362413 0.5312915067941818 0.08131043304110418 0.5312915067941818 0.08131043304110418 0.4802849609925652 -0.1382898402582367 -12000000900.0 0.4686661857778959 -0.13731700623176088 0.5336073645566316 0.078168130516417 0.5336073645566316 0.078168130516417 0.4769920715071541 -0.13786923637736806 -12800000900.0 0.4654484851560053 -0.13693462120989763 0.5359232223190815 0.07502582799172978 0.5359232223190815 0.07502582799172978 0.473699182021743 -0.13744863249649944 -13600000900.0 0.4622307845341146 -0.1365522361880344 0.5382390800815314 0.0718835254670426 0.5382390800815314 0.0718835254670426 0.4704062925363319 -0.13702802861563082 -14400000900.0 0.45901308391222395 -0.13616985116617114 0.5405549378439812 0.0687412229423554 0.5405549378439812 0.0687412229423554 0.46711340305092086 -0.13660742473476217 -15200000900.0 0.4557953832903334 -0.13578746614430787 0.5428707956064311 0.06559892041766822 0.5428707956064311 0.06559892041766822 0.4638205135655099 -0.13618682085389353 -16000000900.0 0.4525776826684428 -0.13540508112244465 0.545186653368881 0.06245661789298104 0.545186653368881 0.06245661789298104 0.46052762408009884 -0.1357662169730249 -16800000900.0 0.44935998204655214 -0.1350226961005814 0.5475025111313307 0.059314315368293846 0.5475025111313307 0.059314315368293846 0.4572347345946877 -0.13534561309215629 -17600000900.0 0.4461422814246615 -0.13464031107871813 0.5498183688937807 0.056172012843606664 0.5498183688937807 0.056172012843606664 0.45394184510927665 -0.13492500921128764 -18400000900.0 0.44292458080277086 -0.13425792605685488 0.5521342266562306 0.05302971031891947 0.5521342266562306 0.05302971031891947 0.4506489556238656 -0.134504405330419 -19200000900.0 0.4397068801808802 -0.13387554103499164 0.5544500844186804 0.049887407794232286 0.5544500844186804 0.049887407794232286 0.44735606613845447 -0.13408380144955034 -20000000900.0 0.4364891795589896 -0.1334931560131284 0.5567659421811303 0.04674510526954509 0.5567659421811303 0.04674510526954509 0.4440631766530434 -0.13366319756868175 -20800000900.0 0.43327147893709894 -0.13311077099126514 0.5590817999435801 0.04360280274485791 0.5590817999435801 0.04360280274485791 0.44077028716763234 -0.1332425936878131 -21600000900.0 0.43005377831520825 -0.13272838596940187 0.56139765770603 0.040460500220170684 0.56139765770603 0.040460500220170684 0.43747739768222127 -0.13282198980694446 -22400000900.0 0.4268360776933176 -0.13234600094753862 0.5637135154684798 0.03731819769548349 0.5637135154684798 0.03731819769548349 0.43418450819681015 -0.1324013859260758 -23200000900.0 0.42361837707142697 -0.13196361592567538 0.5660293732309296 0.03417589517079632 0.5660293732309296 0.03417589517079632 0.4308916187113991 -0.1319807820452072 -24000000900.0 0.4204006764495363 -0.1315812309038121 0.5683452309933795 0.031033592646109123 0.5683452309933795 0.031033592646109123 0.427598729225988 -0.13156017816433854 -24800000900.0 0.4171829758276457 -0.13119884588194886 0.5706610887558294 0.02789129012142194 0.5706610887558294 0.02789129012142194 0.42430583974057695 -0.1311395742834699 -25600000900.0 0.413965275205755 -0.13081646086008564 0.5729769465182792 0.024748987596734745 0.5729769465182792 0.024748987596734745 0.42101295025516583 -0.13071897040260128 -26400000900.0 0.41074757458386435 -0.13043407583822236 0.5752928042807292 0.02160668507204755 0.5752928042807292 0.02160668507204755 0.41772006076975476 -0.13029836652173266 -27200000900.0 0.4075298739619737 -0.13005169081635912 0.577608662043179 0.018464382547360367 0.577608662043179 0.018464382547360367 0.4144271712843437 -0.129877762640864 -28000000900.0 0.40431217334008307 -0.12966930579449584 0.5799245198056288 0.01532208002267317 0.5799245198056288 0.01532208002267317 0.41113428179893263 -0.12945715875999536 -28800000900.0 0.40109447271819243 -0.1292869207726326 0.5822403775680787 0.012179777497985989 0.5822403775680787 0.012179777497985989 0.40784139231352157 -0.1290365548791267 -29600000900.0 0.3978767720963018 -0.12890453575076935 0.5845562353305285 0.009037474973298792 0.5845562353305285 0.009037474973298792 0.40454850282811045 -0.1286159509982581 -30400000800.0 0.3946590718766237 -0.1285221507767042 0.5868720928034962 0.0058951728413994126 0.5868720928034962 0.0058951728413994126 0.4012556137543105 -0.12819534716996492 -31200000800.0 0.39144137125473305 -0.12813976575484096 0.589187950565946 0.0027528703167122442 0.589187950565946 0.0027528703167122442 0.39796272426889945 -0.1277747432890963 -32000000800.0 0.3882236706328424 -0.1277573807329777 0.5915038083283959 -0.0003894322079749657 0.5915038083283959 -0.0003894322079749657 0.3946698347834884 -0.12735413940822765 -32800000800.0 0.38500597001095177 -0.12737499571111444 0.5938196660908457 -0.003531734732662134 0.5938196660908457 -0.003531734732662134 0.3913769452980773 -0.126933535527359 -33333334200.0 0.38286083599488296 -0.1271200723313402 0.5953635714588004 -0.005626603344312142 0.5953635714588004 -0.005626603344312142 0.38918168536672915 -0.12665313290506292 -33600000800.0 0.3817882693890611 -0.12699261068925122 0.5961355238532955 -0.00667403725734933 0.5961355238532955 -0.00667403725734933 0.38808405581266625 -0.12651293164649038 -34400000800.0 0.37857056876717043 -0.12661022566738794 0.5984513816157454 -0.009816339782036526 0.5984513816157454 -0.009816339782036526 0.3847911663272552 -0.12609232776562176 -35200000800.0 0.3753528681452798 -0.1262278406455247 0.6007672393781952 -0.012958642306723722 0.6007672393781952 -0.012958642306723722 0.38149827684184406 -0.12567172388475312 -36000000800.0 0.37213516752338927 -0.12584545562366145 0.6030830971406451 -0.01610094483141089 0.6030830971406451 -0.01610094483141089 0.378205387356433 -0.12525112000388447 -36800000800.0 0.3689174669014986 -0.12546307060179818 0.6053989549030949 -0.019243247356098087 0.6053989549030949 -0.019243247356098087 0.374912497871022 -0.12483051612301584 -37600000800.0 0.365699766279608 -0.12508068557993493 0.6077148126655447 -0.022385549880785283 0.6077148126655447 -0.022385549880785283 0.3716196083856109 -0.12440991224214719 -38400000800.0 0.36248206565771734 -0.12469830055807167 0.6100306704279946 -0.02552785240547245 0.6100306704279946 -0.02552785240547245 0.36832671890019986 -0.12398930836127856 -39200000800.0 0.3592643650358267 -0.12431591553620841 0.6123465281904446 -0.028670154930159675 0.6123465281904446 -0.028670154930159675 0.3650338294147888 -0.12356870448040991 -40000000800.0 0.35604666441393606 -0.12393353051434516 0.6146623859528944 -0.03181245745484684 0.6146623859528944 -0.03181245745484684 0.3617409399293777 -0.12314810059954127 -40800000800.0 0.3528289637920454 -0.1235511454924819 0.6169782437153443 -0.03495475997953404 0.6169782437153443 -0.03495475997953404 0.35844805044396666 -0.12272749671867263 -41600000800.0 0.3496112631701548 -0.12316876047061864 0.6192941014777941 -0.03809706250422121 0.6192941014777941 -0.03809706250422121 0.3551551609585556 -0.122306892837804 -42400000800.0 0.3463935625482641 -0.12278637544875538 0.621609959240244 -0.041239365028908403 0.621609959240244 -0.041239365028908403 0.3518622714731445 -0.12188628895693535 -43200000800.0 0.34317586192637345 -0.12240399042689212 0.6239258170026938 -0.0443816675535956 0.6239258170026938 -0.0443816675535956 0.3485693819877334 -0.12146568507606671 -44000000800.0 0.3399581613044828 -0.12202160540502888 0.6262416747651436 -0.047523970078282796 0.6262416747651436 -0.047523970078282796 0.3452764925023223 -0.12104508119519806 -44800000800.0 0.3367404606825921 -0.12163922038316562 0.6285575325275935 -0.05066627260297002 0.6285575325275935 -0.05066627260297002 0.3419836030169112 -0.12062447731432943 -45600000800.0 0.3335227600607015 -0.12125683536130236 0.6308733902900433 -0.05380857512765719 0.6308733902900433 -0.05380857512765719 0.33869071353150015 -0.12020387343346078 -46400000800.0 0.33030505943881083 -0.12087445033943911 0.6331892480524932 -0.056950877652344384 0.6331892480524932 -0.056950877652344384 0.3353978240460891 -0.11978326955259215 -47200000800.0 0.3270873588169202 -0.12049206531757584 0.635505105814943 -0.06009318017703158 0.635505105814943 -0.06009318017703158 0.33210493456067797 -0.1193626656717235 -48000000800.0 0.32386965819502955 -0.12010968029571262 0.6378209635773928 -0.06323548270171878 0.6378209635773928 -0.06323548270171878 0.3288120450752669 -0.11894206179085487 -48800000800.0 0.3206519575731389 -0.11972729527384936 0.6401368213398427 -0.06637778522640594 0.6401368213398427 -0.06637778522640594 0.32551915558985584 -0.11852145790998625 -49600000800.0 0.3174342569512483 -0.1193449102519861 0.6424526791022925 -0.06952008775109311 0.6424526791022925 -0.06952008775109311 0.32222626610444477 -0.11810085402911762 -50400000700.0 0.31421655673157023 -0.11896252527792098 0.6447685365752602 -0.0726623898829925 0.6447685365752602 -0.0726623898829925 0.31893337703064484 -0.11768025020082445 -51200000700.0 0.3109988561096796 -0.11858014025605772 0.64708439433771 -0.0758046924076797 0.64708439433771 -0.0758046924076797 0.31564048754523377 -0.11725964631995581 -52000000700.0 0.30778115548778895 -0.11819775523419446 0.6494002521001598 -0.07894699493236687 0.6494002521001598 -0.07894699493236687 0.3123475980598227 -0.11683904243908717 -52800000700.0 0.3045634548658982 -0.11781537021233121 0.6517161098626097 -0.0820892974570541 0.6517161098626097 -0.0820892974570541 0.30905470857441164 -0.11641843855821853 -53600000700.0 0.3013457542440076 -0.11743298519046795 0.6540319676250597 -0.08523159998174126 0.6540319676250597 -0.08523159998174126 0.3057618190890005 -0.11599783467734989 -54400000700.0 0.298128053622117 -0.11705060016860469 0.6563478253875095 -0.08837390250642846 0.6563478253875095 -0.08837390250642846 0.30246892960358945 -0.11557723079648125 -55200000700.0 0.29491035300022633 -0.11666821514674144 0.6586636831499593 -0.09151620503111563 0.6586636831499593 -0.09151620503111563 0.2991760401181784 -0.11515662691561261 -56000000700.0 0.29169265237833564 -0.11628583012487817 0.6609795409124092 -0.09465850755580285 0.6609795409124092 -0.09465850755580285 0.29588315063276727 -0.11473602303474396 -56800000700.0 0.288474951756445 -0.11590344510301492 0.663295398674859 -0.09780081008049002 0.663295398674859 -0.09780081008049002 0.2925902611473562 -0.11431541915387533 -57600000700.0 0.28525725113455436 -0.11552106008115166 0.6656112564373089 -0.10094311260517722 0.6656112564373089 -0.10094311260517722 0.28929737166194514 -0.11389481527300668 -58400000700.0 0.2820395505126637 -0.1151386750592884 0.6679271141997587 -0.10408541512986441 0.6679271141997587 -0.10408541512986441 0.28600448217653407 -0.11347421139213805 -59200000700.0 0.2788218498907731 -0.11475629003742516 0.6702429719622085 -0.10722771765455161 0.6702429719622085 -0.10722771765455161 0.282711592691123 -0.1130536075112694 -60000000700.0 0.27560414926888244 -0.1143739050155619 0.6725588297246584 -0.11037002017923878 0.6725588297246584 -0.11037002017923878 0.27941870320571194 -0.11263300363040077 -60800000700.0 0.2723864486469918 -0.11399151999369864 0.6748746874871082 -0.11351232270392594 0.6748746874871082 -0.11351232270392594 0.2761258137203008 -0.11221239974953212 -61600000700.0 0.2691687480251011 -0.11360913497183538 0.6771905452495581 -0.11665462522861317 0.6771905452495581 -0.11665462522861317 0.2728329242348897 -0.11179179586866347 -62400000700.0 0.26595104740321046 -0.11322674994997212 0.6795064030120079 -0.11979692775330034 0.6795064030120079 -0.11979692775330034 0.26954003474947863 -0.11137119198779484 -63200000700.0 0.2627333467813198 -0.11284436492810887 0.6818222607744578 -0.12293923027798753 0.6818222607744578 -0.12293923027798753 0.26624714526406756 -0.1109505881069262 -64000000700.0 0.2595156461594292 -0.11246197990624561 0.6841381185369076 -0.1260815328026747 0.6841381185369076 -0.1260815328026747 0.2629542557786565 -0.11052998422605756 -64800000700.0 0.25629794553753854 -0.11207959488438235 0.6864539762993576 -0.12922383532736192 0.6864539762993576 -0.12922383532736192 0.2596613662932454 -0.11010938034518891 -65600000700.0 0.2530802449156479 -0.1116972098625191 0.6887698340618074 -0.1323661378520491 0.6887698340618074 -0.1323661378520491 0.2563684768078343 -0.10968877646432028 -66400000700.0 0.24986254429375726 -0.11131482484065584 0.6910856918242572 -0.13550844037673626 0.6910856918242572 -0.13550844037673626 0.25307558732242325 -0.10926817258345164 -66666667300.0 0.24878997768793537 -0.11118736319856684 0.6918576442187524 -0.1365558742897735 0.6918576442187524 -0.1365558742897735 0.25197795776836035 -0.10912797132487909 -67200000700.0 0.24664484367186656 -0.11093243981879258 0.6934015495867071 -0.13865074290142348 0.6934015495867071 -0.13865074290142348 0.24978269783701218 -0.108847568702583 -68000000700.0 0.24342714304997592 -0.11055005479692932 0.6957174073491569 -0.14179304542611065 0.6957174073491569 -0.14179304542611065 0.24648980835160106 -0.10842696482171435 -68800000700.0 0.24020944242808528 -0.11016766977506606 0.6980332651116068 -0.14493534795079788 0.6980332651116068 -0.14493534795079788 0.24319691886619 -0.10800636094084572 -69600000700.0 0.23699174180619464 -0.10978528475320282 0.7003491228740566 -0.14807765047548505 0.7003491228740566 -0.14807765047548505 0.23990402938077893 -0.10758575705997708 -70400000600.0 0.23377404158651655 -0.10940289977913768 0.7026649803470242 -0.1512199526073844 0.7026649803470242 -0.1512199526073844 0.23661114030697905 -0.10716515323168392 -71200000600.0 0.2305563409646259 -0.10902051475727442 0.7049808381094741 -0.15436225513207158 0.7049808381094741 -0.15436225513207158 0.23331825082156799 -0.10674454935081529 -72000000600.0 0.22733864034273527 -0.10863812973541118 0.7072966958719239 -0.1575045576567588 0.7072966958719239 -0.1575045576567588 0.23002536133615692 -0.10632394546994664 -72800000600.0 0.22412093972084463 -0.1082557447135479 0.7096125536343738 -0.16064686018144603 0.7096125536343738 -0.16064686018144603 0.2267324718507458 -0.10590334158907799 -73600000600.0 0.22090323909895399 -0.10787335969168466 0.7119284113968236 -0.1637891627061332 0.7119284113968236 -0.1637891627061332 0.22343958236533473 -0.10548273770820936 -74400000600.0 0.21768553847706335 -0.10749097466982141 0.7142442691592734 -0.16693146523082036 0.7142442691592734 -0.16693146523082036 0.22014669287992367 -0.10506213382734073 -75200000600.0 0.2144678378551727 -0.10710858964795814 0.7165601269217233 -0.17007376775550753 0.7165601269217233 -0.17007376775550753 0.2168538033945126 -0.10464152994647208 -76000000600.0 0.211250137233282 -0.10672620462609489 0.7188759846841732 -0.17321607028019476 0.7188759846841732 -0.17321607028019476 0.21356091390910148 -0.10422092606560343 -76800000600.0 0.20803243661139137 -0.10634381960423163 0.721191842446623 -0.17635837280488192 0.721191842446623 -0.17635837280488192 0.21026802442369041 -0.1038003221847348 -77600000600.0 0.20481473598950073 -0.10596143458236837 0.7235077002090728 -0.1795006753295691 0.7235077002090728 -0.1795006753295691 0.20697513493827935 -0.10337971830386616 -78400000600.0 0.2015970353676101 -0.10557904956050512 0.7258235579715228 -0.18264297785425632 0.7258235579715228 -0.18264297785425632 0.20368224545286823 -0.10295911442299752 -79200000600.0 0.19837933474571945 -0.10519666453864185 0.7281394157339726 -0.18578528037894348 0.7281394157339726 -0.18578528037894348 0.20038935596745716 -0.10253851054212887 -80000000600.0 0.1951616341238288 -0.1048142795167786 0.7304552734964225 -0.1889275829036307 0.7304552734964225 -0.1889275829036307 0.1970964664820461 -0.10211790666126024 -80800000600.0 0.19194393350193817 -0.10443189449491538 0.7327711312588723 -0.19206988542831788 0.7327711312588723 -0.19206988542831788 0.19380357699663503 -0.1016973027803916 -81600000600.0 0.18872623288004747 -0.10404950947305211 0.7350869890213221 -0.1952121879530051 0.7350869890213221 -0.1952121879530051 0.1905106875112239 -0.10127669889952295 -82400000600.0 0.18550853225815683 -0.10366712445118886 0.737402846783772 -0.19835449047769227 0.737402846783772 -0.19835449047769227 0.18721779802581284 -0.10085609501865433 -83200000600.0 0.1822908316362662 -0.1032847394293256 0.7397187045462218 -0.20149679300237944 0.7397187045462218 -0.20149679300237944 0.18392490854040178 -0.1004354911377857 -84000000600.0 0.17907313101437555 -0.10290235440746234 0.7420345623086717 -0.2046390955270666 0.7420345623086717 -0.2046390955270666 0.1806320190549907 -0.10001488725691707 -84800000600.0 0.1758554303924849 -0.1025199693855991 0.7443504200711215 -0.20778139805175383 0.7443504200711215 -0.20778139805175383 0.1773391295695796 -0.09959428337604842 -85600000600.0 0.17263772977059427 -0.10213758436373582 0.7466662778335714 -0.210923700576441 0.7466662778335714 -0.210923700576441 0.17404624008416852 -0.09917367949517977 -86400000600.0 0.16942002914870363 -0.10175519934187258 0.7489821355960212 -0.21406600310112817 0.7489821355960212 -0.21406600310112817 0.17075335059875746 -0.09875307561431114 -87200000600.0 0.16620232852681294 -0.10137281432000932 0.7512979933584711 -0.2172083056258154 0.7512979933584711 -0.2172083056258154 0.16746046111334634 -0.09833247173344249 -88000000600.0 0.16298462790492235 -0.10099042929814606 0.7536138511209209 -0.22035060815050256 0.7536138511209209 -0.22035060815050256 0.16416757162793533 -0.09791186785257386 -88800000600.0 0.15976692728303166 -0.10060804427628281 0.7559297088833707 -0.22349291067518978 0.7559297088833707 -0.22349291067518978 0.16087468214252415 -0.09749126397170521 -89600000600.0 0.15654922666114102 -0.10022565925441954 0.7582455666458207 -0.226635213199877 0.7582455666458207 -0.226635213199877 0.15758179265711308 -0.09707066009083656 -90400000500.0 0.15333152644146297 -0.09984327428035442 0.7605614241187882 -0.22977751533177632 0.7605614241187882 -0.22977751533177632 0.15428890358331326 -0.09665005626254342 -91200000500.0 0.15011382581957228 -0.09946088925849116 0.7628772818812382 -0.23291981785646354 0.7628772818812382 -0.23291981785646354 0.1509960140979021 -0.09622945238167477 -92000000500.0 0.14689612519768164 -0.0990785042366279 0.765193139643688 -0.2360621203811507 0.765193139643688 -0.2360621203811507 0.14770312461249102 -0.09580884850080613 -92800000500.0 0.143678424575791 -0.09869611921476465 0.7675089974061378 -0.23920442290583793 0.7675089974061378 -0.23920442290583793 0.14441023512707996 -0.0953882446199375 -93600000500.0 0.14046072395390036 -0.09831373419290139 0.7698248551685877 -0.2423467254305251 0.7698248551685877 -0.2423467254305251 0.1411173456416689 -0.09496764073906885 -94400000500.0 0.13724302333200972 -0.09793134917103813 0.7721407129310376 -0.24548902795521227 0.7721407129310376 -0.24548902795521227 0.13782445615625782 -0.0945470368582002 -95200000500.0 0.13402532271011908 -0.09754896414917488 0.7744565706934874 -0.24863133047989944 0.7744565706934874 -0.24863133047989944 0.13453156667084676 -0.09412643297733159 -96000000500.0 0.13080762208822844 -0.09716657912731162 0.7767724284559372 -0.2517736330045866 0.7767724284559372 -0.2517736330045866 0.1312386771854357 -0.09370582909646294 -96800000500.0 0.12758992146633774 -0.09678419410544836 0.7790882862183871 -0.2549159355292739 0.7790882862183871 -0.2549159355292739 0.12794578770002457 -0.09328522521559429 -97600000500.0 0.1243722208444471 -0.0964018090835851 0.781404143980837 -0.25805823805396105 0.781404143980837 -0.25805823805396105 0.12465289821461345 -0.09286462133472564 -98400000500.0 0.12115452022255646 -0.09601942406172184 0.7837200017432868 -0.2612005405786482 0.7837200017432868 -0.2612005405786482 0.12136000872920238 -0.09244401745385701 -99200000500.0 0.11793681960066582 -0.0956370390398586 0.7860358595057366 -0.2643428431033354 0.7860358595057366 -0.2643428431033354 0.11806711924379132 -0.09202341357298838 -100000000000.0 0.11471912098983805 -0.09525465425698598 0.7883517158207753 -0.2674851436640835 0.7883517158207753 -0.2674851436640835 0.1147742318164362 -0.09160280995499716 -100800000000.0 0.11150142036794741 -0.09487226923512272 0.7906675735832251 -0.2706274461887707 0.7906675735832251 -0.2706274461887707 0.11148134233102514 -0.09118220607412852 -101600000000.0 0.10828371974605677 -0.09448988421325946 0.7929834313456751 -0.2737697487134579 0.7929834313456751 -0.2737697487134579 0.10818845284561407 -0.09076160219325988 -102400000000.0 0.10506601912416613 -0.09410749919139622 0.7952992891081249 -0.27691205123814505 0.7952992891081249 -0.27691205123814505 0.104895563360203 -0.09034099831239123 -103200000000.0 0.10184831850227544 -0.09372511416953294 0.7976151468705748 -0.28005435376283233 0.7976151468705748 -0.28005435376283233 0.10160267387479183 -0.08992039443152258 -104000000000.0 0.0986306178803848 -0.0933427291476697 0.7999310046330246 -0.2831966562875195 0.7999310046330246 -0.2831966562875195 0.09830978438938076 -0.08949979055065395 -104800000000.0 0.09541291725849416 -0.09296034412580644 0.8022468623954745 -0.28633895881220667 0.8022468623954745 -0.28633895881220667 0.0950168949039697 -0.08907918666978532 -105600000000.0 0.09219521663660352 -0.09257795910394317 0.8045627201579243 -0.28948126133689384 0.8045627201579243 -0.28948126133689384 0.09172400541855863 -0.08865858278891667 -106400000000.0 0.08897751601471288 -0.09219557408207993 0.8068785779203742 -0.292623563861581 0.8068785779203742 -0.292623563861581 0.08843111593314756 -0.08823797890804803 -107200000000.0 0.08575981539282224 -0.09181318906021667 0.809194435682824 -0.2957658663862682 0.809194435682824 -0.2957658663862682 0.0851382264477365 -0.0878173750271794 -108000000000.0 0.0825421147709316 -0.09143080403835341 0.8115102934452738 -0.2989081689109554 0.8115102934452738 -0.2989081689109554 0.08184533696232543 -0.08739677114631075 -108800000000.0 0.0793244141490409 -0.09104841901649015 0.8138261512077237 -0.3020504714356426 0.8138261512077237 -0.3020504714356426 0.07855244747691426 -0.0869761672654421 -109600000000.0 0.07610671352715026 -0.09066603399462689 0.8161420089701736 -0.3051927739603298 0.8161420089701736 -0.3051927739603298 0.07525955799150319 -0.08655556338457346 -110400000000.0 0.07288901290525962 -0.09028364897276364 0.8184578667326234 -0.308335076485017 0.8184578667326234 -0.308335076485017 0.07196666850609212 -0.08613495950370482 -111200000000.0 0.06967131228336898 -0.08990126395090038 0.8207737244950732 -0.3114773790097042 0.8207737244950732 -0.3114773790097042 0.06867377902068106 -0.08571435562283619 -112000000000.0 0.06645361166147834 -0.08951887892903712 0.8230895822575232 -0.31461968153439135 0.8230895822575232 -0.31461968153439135 0.06538088953526999 -0.08529375174196754 -112800000000.0 0.0632359110395877 -0.08913649390717387 0.8254054400199731 -0.3177619840590785 0.8254054400199731 -0.3177619840590785 0.06208800004985893 -0.08487314786109891 -113600000000.0 0.06001821041769706 -0.08875410888531061 0.8277212977824229 -0.3209042865837657 0.8277212977824229 -0.3209042865837657 0.05879511056444786 -0.08445254398023028 -114400000000.0 0.05680050979580642 -0.08837172386344735 0.8300371555448727 -0.3240465891084529 0.8300371555448727 -0.3240465891084529 0.055502221079036795 -0.08403194009936163 -115200000000.0 0.053582809173915724 -0.0879893388415841 0.8323530133073226 -0.32718889163314013 0.8323530133073226 -0.32718889163314013 0.05220933159362562 -0.08361133621849298 -116000000000.0 0.050365108552025084 -0.08760695381972083 0.8346688710697725 -0.3303311941578273 0.8346688710697725 -0.3303311941578273 0.04891644210821455 -0.08319073233762433 -116800000000.0 0.047147407930134444 -0.08722456879785759 0.8369847288322223 -0.33347349668251447 0.8369847288322223 -0.33347349668251447 0.04562355262280349 -0.0827701284567557 -117600000000.0 0.043929707308243804 -0.08684218377599433 0.8393005865946721 -0.3366157992072017 0.8393005865946721 -0.3366157992072017 0.04233066313739242 -0.08234952457588707 -118400000000.0 0.040712006686353164 -0.08645979875413107 0.8416164443571219 -0.33975810173188886 0.8416164443571219 -0.33975810173188886 0.039037773651981356 -0.08192892069501842 -119200000000.0 0.037494306064462524 -0.08607741373226782 0.8439323021195718 -0.34290040425657603 0.8439323021195718 -0.34290040425657603 0.03574488416657029 -0.08150831681414979 -120000000000.0 0.034276605442571884 -0.08569502871040456 0.8462481598820216 -0.3460427067812632 0.8462481598820216 -0.3460427067812632 0.032451994681159224 -0.08108771293328114 -120800000000.0 0.031058904820681188 -0.0853126436885413 0.8485640176444715 -0.3491850093059505 0.8485640176444715 -0.3491850093059505 0.029159105195748103 -0.08066710905241249 -121600000000.0 0.027841204198790548 -0.08493025866667804 0.8508798754069213 -0.35232731183063765 0.8508798754069213 -0.35232731183063765 0.02586621571033698 -0.08024650517154386 -122400000000.0 0.024623503576899908 -0.08454787364481478 0.8531957331693713 -0.3554696143553248 0.8531957331693713 -0.3554696143553248 0.022573326224925916 -0.07982590129067521 -123200000000.0 0.021405802955009268 -0.08416548862295153 0.855511590931821 -0.358611916880012 0.855511590931821 -0.358611916880012 0.01928043673951485 -0.07940529740980658 -124000000000.0 0.018188102333118628 -0.08378310360108827 0.857827448694271 -0.36175421940469915 0.857827448694271 -0.36175421940469915 0.015987547254103784 -0.07898469352893794 -124800000000.0 0.014970401711227987 -0.08340071857922501 0.8601433064567208 -0.3648965219293864 0.8601433064567208 -0.3648965219293864 0.012694657768692719 -0.0785640896480693 -125600000000.0 0.011752701089337347 -0.08301833355736177 0.8624591642191706 -0.36803882445407354 0.8624591642191706 -0.36803882445407354 0.009401768283281653 -0.07814348576720066 -126400000000.0 0.008535000467446596 -0.0826359485354985 0.8647750219816205 -0.37118112697876077 0.8647750219816205 -0.37118112697876077 0.006108878797870476 -0.07772288188633202 -127200000000.0 0.005317299845555956 -0.08225356351363525 0.8670908797440704 -0.374323429503448 0.8670908797440704 -0.374323429503448 0.0028159893124594104 -0.07730227800546337 -128000000000.0 0.002099599223665316 -0.08187117849177199 0.8694067375065202 -0.37746573202813516 0.8694067375065202 -0.37746573202813516 -0.0004769001729516553 -0.07688167412459473 -128800000000.0 -0.001118101398225324 -0.08148879346990873 0.87172259526897 -0.3806080345528223 0.87172259526897 -0.3806080345528223 -0.003769789658362721 -0.07646107024372609 -129600000000.0 -0.004335802020115853 -0.08110640844804548 0.8740384530314198 -0.3837503370775095 0.8740384530314198 -0.3837503370775095 -0.007062679143773787 -0.07604046636285745 -130400000000.0 -0.007553502642006493 -0.08072402342618222 0.8763543107938697 -0.38689263960219666 0.8763543107938697 -0.38689263960219666 -0.010355568629184853 -0.07561986248198882 -131200000000.0 -0.010771203263897133 -0.08034163840431896 0.8786701685563195 -0.39003494212688383 0.8786701685563195 -0.39003494212688383 -0.013648458114595918 -0.07519925860112017 -132000000000.0 -0.013988903885787773 -0.07995925338245571 0.8809860263187694 -0.393177244651571 0.8809860263187694 -0.393177244651571 -0.016941347600006984 -0.07477865472025154 -132800000000.0 -0.017206604507678525 -0.07957686836059244 0.8833018840812192 -0.3963195471762583 0.8833018840812192 -0.3963195471762583 -0.02023423708541816 -0.07435805083938289 -133333334000.0 -0.019351740937022743 -0.07932194469402942 0.8848457911860673 -0.3984144181446352 0.8848457911860673 -0.3984144181446352 -0.022429499486433357 -0.07407764790163389 -133600000000.0 -0.020424305129569165 -0.0791944833387292 0.8856177418436691 -0.39946184970094545 0.8856177418436691 -0.39946184970094545 -0.023527126570829227 -0.07393744695851424 -134400000000.0 -0.023642005751459805 -0.07881209831686593 0.887933599606119 -0.4026041522256326 0.887933599606119 -0.4026041522256326 -0.026820016056240292 -0.07351684307764561 -135200000000.0 -0.026859706373350445 -0.07842971329500267 0.8902494573685689 -0.4057464547503198 0.8902494573685689 -0.4057464547503198 -0.030112905541651358 -0.07309623919677696 -136000000000.0 -0.030077406995241085 -0.07804732827313943 0.8925653151310187 -0.40888875727500695 0.8925653151310187 -0.40888875727500695 -0.033405795027062424 -0.07267563531590833 -136800000000.0 -0.033295107617131725 -0.07766494325127617 0.8948811728934685 -0.41203105979969423 0.8948811728934685 -0.41203105979969423 -0.03669868451247349 -0.0722550314350397 -137600000000.0 -0.036512808239022365 -0.0772825582294129 0.8971970306559183 -0.4151733623243814 0.8971970306559183 -0.4151733623243814 -0.039991573997884555 -0.07183442755417105 -138400000000.0 -0.039730508860913116 -0.07690017320754965 0.8995128884183683 -0.41831566484906857 0.8995128884183683 -0.41831566484906857 -0.04328446348329573 -0.0714138236733024 -139200000000.0 -0.042948209482803756 -0.07651778818568639 0.9018287461808181 -0.42145796737375585 0.9018287461808181 -0.42145796737375585 -0.0465773529687068 -0.07099321979243377 -140000000000.0 -0.046165910104694396 -0.07613540316382314 0.9041446039432679 -0.424600269898443 0.9041446039432679 -0.424600269898443 -0.049870242454117863 -0.07057261591156512 -140800000000.0 -0.04938361072658504 -0.07575301814195988 0.9064604617057177 -0.4277425724231302 0.9064604617057177 -0.4277425724231302 -0.05316313193952893 -0.07015201203069649 -141600000000.0 -0.05260131134847568 -0.07537063312009662 0.9087763194681676 -0.43088487494781735 0.9087763194681676 -0.43088487494781735 -0.056456021424939995 -0.06973140814982784 -142400000000.0 -0.05581901197036632 -0.07498824809823337 0.9110921772306175 -0.4340271774725045 0.9110921772306175 -0.4340271774725045 -0.05974891091035106 -0.0693108042689592 -143200000000.0 -0.059036712592256846 -0.07460586307637011 0.9134080349930673 -0.4371694799971917 0.9134080349930673 -0.4371694799971917 -0.06304180039576213 -0.06889020038809056 -144000000000.0 -0.0622544132141476 -0.07422347805450685 0.9157238927555171 -0.44031178252187897 0.9157238927555171 -0.44031178252187897 -0.06633468988117319 -0.06846959650722191 -144800000000.0 -0.06547211383603824 -0.07384109303264359 0.918039750517967 -0.44345408504656614 0.918039750517967 -0.44345408504656614 -0.06962757936658437 -0.06804899262635328 -145600000000.0 -0.06868981445792888 -0.07345870801078033 0.9203556082804168 -0.4465963875712533 0.9203556082804168 -0.4465963875712533 -0.07292046885199543 -0.06762838874548464 -146400000000.0 -0.07190751507981952 -0.07307632298891709 0.9226714660428668 -0.4497386900959405 0.9226714660428668 -0.4497386900959405 -0.0762133583374065 -0.067207784864616 -147200000000.0 -0.07512521570171016 -0.07269393796705383 0.9249873238053166 -0.45288099262062764 0.9249873238053166 -0.45288099262062764 -0.07950624782281757 -0.06678718098374736 -148000000000.0 -0.0783429163236008 -0.07231155294519057 0.9273031815677664 -0.4560232951453148 0.9273031815677664 -0.4560232951453148 -0.08279913730822863 -0.06636657710287872 -148800000000.0 -0.08156061694549144 -0.07192916792332732 0.9296190393302162 -0.459165597670002 0.9296190393302162 -0.459165597670002 -0.0860920267936397 -0.06594597322201008 -149600000000.0 -0.08477831756738208 -0.07154678290146406 0.9319348970926661 -0.46230790019468915 0.9319348970926661 -0.46230790019468915 -0.08938491627905076 -0.06552536934114143 -150400000000.0 -0.08799601818927283 -0.0711643978796008 0.934250754855116 -0.4654502027193764 0.934250754855116 -0.4654502027193764 -0.09267780576446183 -0.06510476546027279 -151200000000.0 -0.09121371881116347 -0.07078201285773754 0.9365666126175658 -0.4685925052440636 0.9365666126175658 -0.4685925052440636 -0.0959706952498729 -0.06468416157940415 -152000000000.0 -0.09443141943305411 -0.07039962783587428 0.9388824703800156 -0.47173480776875076 0.9388824703800156 -0.47173480776875076 -0.09926358473528407 -0.0642635576985355 -152800000000.0 -0.09764912005494475 -0.07001724281401103 0.9411983281424655 -0.47487711029343793 0.9411983281424655 -0.47487711029343793 -0.10255647422069514 -0.06384295381766687 -153600000000.0 -0.10086682067683539 -0.06963485779214777 0.9435141859049154 -0.4780194128181252 0.9435141859049154 -0.4780194128181252 -0.1058493637061062 -0.06342234993679824 -154400000000.0 -0.10408452129872603 -0.06925247277028451 0.9458300436673652 -0.4811617153428124 0.9458300436673652 -0.4811617153428124 -0.10914225319151727 -0.06300174605592959 -155200000000.0 -0.10730222192061667 -0.06887008774842127 0.948145901429815 -0.48430401786749955 0.948145901429815 -0.48430401786749955 -0.11243514267692833 -0.06258114217506096 -156000000000.0 -0.11051992254250731 -0.06848770272655799 0.9504617591922649 -0.4874463203921868 0.9504617591922649 -0.4874463203921868 -0.1157280321623394 -0.06216053829419231 -156800000000.0 -0.11373762316439795 -0.06810531770469475 0.9527776169547149 -0.490588622916874 0.9527776169547149 -0.490588622916874 -0.11902092164775047 -0.06173993441332366 -157600000000.0 -0.11695532378628859 -0.06772293268283149 0.9550934747171647 -0.49373092544156116 0.9550934747171647 -0.49373092544156116 -0.12231381113316153 -0.06131933053245503 -158400000000.0 -0.12017302440817923 -0.06734054766096823 0.9574093324796145 -0.49687322796624833 0.9574093324796145 -0.49687322796624833 -0.1256067006185726 -0.06089872665158638 -159200000000.0 -0.12339072503006987 -0.06695816263910498 0.9597251902420643 -0.5000155304909355 0.9597251902420643 -0.5000155304909355 -0.12889959010398377 -0.06047812277071775 -160000000000.0 -0.1266084256519605 -0.06657577761724172 0.9620410480045141 -0.5031578330156227 0.9620410480045141 -0.5031578330156227 -0.13219247958939484 -0.060057518889849115 -160800000000.0 -0.12982612627385115 -0.06619339259537846 0.964356905766964 -0.5063001355403098 0.964356905766964 -0.5063001355403098 -0.1354853690748059 -0.05963691500898047 -161600000000.0 -0.1330438268957419 -0.0658110075735152 0.9666727635294139 -0.5094424380649971 0.9666727635294139 -0.5094424380649971 -0.13877825856021697 -0.05921631112811182 -162400000000.0 -0.13626152751763254 -0.06542862255165194 0.9689886212918637 -0.5125847405896843 0.9689886212918637 -0.5125847405896843 -0.14207114804562804 -0.05879570724724319 -163200000000.0 -0.13947922813952318 -0.06504623752978869 0.9713044790543135 -0.5157270431143715 0.9713044790543135 -0.5157270431143715 -0.1453640375310391 -0.05837510336637454 -164000000000.0 -0.14269692876141382 -0.06466385250792543 0.9736203368167634 -0.5188693456390586 0.9736203368167634 -0.5188693456390586 -0.14865692701645017 -0.057954499485505906 -164800000000.0 -0.14591462938330446 -0.06428146748606217 0.9759361945792133 -0.5220116481637458 0.9759361945792133 -0.5220116481637458 -0.15194981650186123 -0.05753389560463726 -165600000000.0 -0.1491323300051951 -0.06389908246419893 0.9782520523416631 -0.525153950688433 0.9782520523416631 -0.525153950688433 -0.1552427059872723 -0.057113291723768625 -166400000000.0 -0.15235003062708574 -0.06351669744233567 0.9805679101041129 -0.5282962532131201 0.9805679101041129 -0.5282962532131201 -0.15853559547268348 -0.05669268784289999 -167200000000.0 -0.15556773124897638 -0.0631343124204724 0.9828837678665627 -0.5314385557378074 0.9828837678665627 -0.5314385557378074 -0.16182848495809454 -0.056272083962031344 -168000000000.0 -0.15878543187086702 -0.06275192739860914 0.9851996256290128 -0.5345808582624946 0.9851996256290128 -0.5345808582624946 -0.1651213744435056 -0.0558514800811627 -168800000000.0 -0.16200313249275766 -0.062369542376745885 0.9875154833914626 -0.5377231607871817 0.9875154833914626 -0.5377231607871817 -0.16841426392891667 -0.05543087620029406 -169600000000.0 -0.1652208331146483 -0.06198715735488264 0.9898313411539124 -0.5408654633118689 0.9898313411539124 -0.5408654633118689 -0.17170715341432774 -0.055010272319425416 -170400000000.0 -0.16843853373653894 -0.06160477233301938 0.9921471989163622 -0.5440077658365562 0.9921471989163622 -0.5440077658365562 -0.1750000428997388 -0.05458966843855678 -171200000000.0 -0.17165623435842958 -0.06122238731115612 0.9944630566788121 -0.5471500683612434 0.9944630566788121 -0.5471500683612434 -0.17829293238514987 -0.054169064557688135 -172000000000.0 -0.17487393498032022 -0.06084000228929287 0.9967789144412619 -0.5502923708859305 0.9967789144412619 -0.5502923708859305 -0.18158582187056094 -0.0537484606768195 -172800000000.0 -0.17809163560221086 -0.06045761726742961 0.9990947722037118 -0.5534346734106177 0.9990947722037118 -0.5534346734106177 -0.184878711355972 -0.05332785679595087 -173600000000.0 -0.1813093362241016 -0.06007523224556635 1.0014106299661616 -0.556576975935305 1.0014106299661616 -0.556576975935305 -0.18817160084138318 -0.052907252915082206 -174400000000.0 -0.18452703684599225 -0.05969284722370309 1.0037264877286116 -0.5597192784599921 1.0037264877286116 -0.5597192784599921 -0.19146449032679425 -0.05248664903421357 -175200000000.0 -0.1877447374678829 -0.05931046220183983 1.0060423454910614 -0.5628615809846793 1.0060423454910614 -0.5628615809846793 -0.1947573798122053 -0.05206604515334494 -176000000000.0 -0.19096243808977353 -0.058928077179976585 1.0083582032535112 -0.5660038835093665 1.0083582032535112 -0.5660038835093665 -0.19805026929761638 -0.05164544127247629 -176800000000.0 -0.19418013871166417 -0.058545692158113324 1.010674061015961 -0.5691461860340536 1.010674061015961 -0.5691461860340536 -0.20134315878302744 -0.05122483739160766 -177600000000.0 -0.19739783933355481 -0.058163307136250064 1.0129899187784108 -0.5722884885587408 1.0129899187784108 -0.5722884885587408 -0.2046360482684385 -0.05080423351073901 -178400000000.0 -0.20061553995544545 -0.05778092211438682 1.0153057765408606 -0.575430791083428 1.0153057765408606 -0.575430791083428 -0.20792893775384957 -0.05038362962987038 -179200000000.0 -0.2038332405773361 -0.05739853709252356 1.0176216343033104 -0.5785730936081152 1.0176216343033104 -0.5785730936081152 -0.21122182723926064 -0.049963025749001744 -180000000000.0 -0.20705094119922673 -0.0570161520706603 1.0199374920657602 -0.5817153961328023 1.0199374920657602 -0.5817153961328023 -0.2145147167246717 -0.049542421868133096 -180800000000.0 -0.21026864182111737 -0.05663376704879705 1.0222533498282103 -0.5848576986574895 1.0222533498282103 -0.5848576986574895 -0.21780760621008277 -0.04912181798726446 -181600000000.0 -0.21348634244300801 -0.05625138202693379 1.02456920759066 -0.5880000011821768 1.02456920759066 -0.5880000011821768 -0.22110049569549395 -0.048701214106395815 -182400000000.0 -0.21670404306489877 -0.05586899700507052 1.02688506535311 -0.591142303706864 1.02688506535311 -0.591142303706864 -0.22439338518090512 -0.048280610225527154 -183200000000.0 -0.2199217436867894 -0.05548661198320726 1.0292009231155599 -0.5942846062315512 1.0292009231155599 -0.5942846062315512 -0.2276862746663162 -0.04786000634465852 -184000000000.0 -0.22313944430868005 -0.05510422696134401 1.0315167808780097 -0.5974269087562384 1.0315167808780097 -0.5974269087562384 -0.23097916415172726 -0.04743940246378989 -184800000000.0 -0.2263571449305707 -0.05472184193948075 1.0338326386404595 -0.6005692112809256 1.0338326386404595 -0.6005692112809256 -0.23427205363713832 -0.04701879858292124 -185600000000.0 -0.22957484555246133 -0.05433945691761749 1.0361484964029093 -0.6037115138056127 1.0361484964029093 -0.6037115138056127 -0.2375649431225494 -0.046598194702052606 -186400000000.0 -0.23279254617435197 -0.053957071895754244 1.038464354165359 -0.6068538163302999 1.038464354165359 -0.6068538163302999 -0.24085783260796045 -0.04617759082118396 -187200000000.0 -0.2360102467962426 -0.053574686873890984 1.0407802119278091 -0.6099961188549872 1.0407802119278091 -0.6099961188549872 -0.24415072209337152 -0.045756986940315325 -188000000000.0 -0.23922794741813325 -0.053192301852027724 1.043096069690259 -0.6131384213796743 1.043096069690259 -0.6131384213796743 -0.24744361157878259 -0.04533638305944668 -188800000000.0 -0.2424456480400239 -0.05280991683016448 1.0454119274527087 -0.6162807239043615 1.0454119274527087 -0.6162807239043615 -0.25073650106419365 -0.044915779178578044 -189600000000.0 -0.24566334866191453 -0.05242753180830122 1.0477277852151587 -0.6194230264290487 1.0477277852151587 -0.6194230264290487 -0.2540293905496047 -0.04449517529770941 -190400000000.0 -0.24888104928380517 -0.05204514678643796 1.0500436429776085 -0.6225653289537358 1.0500436429776085 -0.6225653289537358 -0.2573222800350158 -0.04407457141684076 -191200000000.0 -0.2520987499056958 -0.05166276176457471 1.0523595007400584 -0.625707631478423 1.0523595007400584 -0.625707631478423 -0.26061516952042685 -0.04365396753597213 -192000000000.0 -0.25531645052758645 -0.05128037674271145 1.0546753585025082 -0.6288499340031102 1.0546753585025082 -0.6288499340031102 -0.2639080590058379 -0.04323336365510348 -192800000000.0 -0.2585341511494771 -0.05089799172084819 1.056991216264958 -0.6319922365277973 1.056991216264958 -0.6319922365277973 -0.267200948491249 -0.04281275977423485 -193600000000.0 -0.2617518517713677 -0.050515606698984944 1.0593070740274078 -0.6351345390524845 1.0593070740274078 -0.6351345390524845 -0.27049383797666005 -0.042392155893366215 -194400000000.0 -0.2649695523932585 -0.05013322167712167 1.0616229317898578 -0.6382768415771719 1.0616229317898578 -0.6382768415771719 -0.27378672746207133 -0.041971552012497554 -195200000000.0 -0.2681872530151491 -0.04975083665525841 1.0639387895523076 -0.6414191441018591 1.0639387895523076 -0.6414191441018591 -0.2770796169474824 -0.041550948131628906 -196000000000.0 -0.27140495363703976 -0.04936845163339515 1.0662546473147576 -0.6445614466265462 1.0662546473147576 -0.6445614466265462 -0.28037250643289346 -0.04113034425076027 -196800000000.0 -0.2746226542589304 -0.0489860666115319 1.0685705050772074 -0.6477037491512334 1.0685705050772074 -0.6477037491512334 -0.28366539591830453 -0.040709740369891625 -197600000000.0 -0.27784035488082104 -0.04860368158966864 1.0708863628396572 -0.6508460516759206 1.0708863628396572 -0.6508460516759206 -0.2869582854037156 -0.04028913648902299 -198400000000.0 -0.2810580555027117 -0.04822129656780538 1.073202220602107 -0.6539883542006077 1.073202220602107 -0.6539883542006077 -0.29025117488912666 -0.03986853260815436 -199200000000.0 -0.2842757561246023 -0.04783891154594214 1.0755180783645568 -0.6571306567252949 1.0755180783645568 -0.6571306567252949 -0.2935440643745377 -0.03944792872728571 -200000000000.0 -0.28749345674649296 -0.047456526524078876 1.0778339361270066 -0.6602729592499821 1.0778339361270066 -0.6602729592499821 -0.2968369538599488 -0.03902732484641708 diff --git a/outputs/pvf_test_sample.s2p b/outputs/pvf_test_sample.s2p deleted file mode 100644 index 0855f1c..0000000 --- a/outputs/pvf_test_sample.s2p +++ /dev/null @@ -1,309 +0,0 @@ -! Created with skrf 1.8.0 (http://scikit-rf.org). -# Hz S RI R 50.0 -!freq ReS11 ImS11 ReS21 ImS21 ReS12 ImS12 ReS22 ImS22 -0.0 0.54669299140207 -0.1662104177109195 0.46100154888068945 0.1530653599528759 0.46100154888068945 0.1530653599528759 0.5593473899566386 -0.16509997898188067 -1000.0 0.5466929861541492 -0.16621041680285528 0.46100155138238874 0.1530653541325667 0.46100155138238874 0.1530653541325667 0.559347384635358 -0.16509997772031268 -10000.0 0.5466929389228627 -0.16621040863027736 0.4610015738976825 0.15306530174978375 0.4610015738976825 0.15306530174978375 0.5593473367438332 -0.16509996636620083 -12589.0 0.546692925335996 -0.16621040627929912 0.46100158037458194 0.15306528668100317 0.46100158037458194 0.15306528668100317 0.5593473229670379 -0.16509996310000133 -15849.0 0.5466929082277745 -0.16621040331900977 0.4610015885301217 0.15306526770679513 0.4610015885301217 0.15306526770679513 0.5593473056196633 -0.1650999589872897 -19953.0 0.5466928866903079 -0.16621039959231423 0.4610015987970956 0.1530652438202461 0.4610015987970956 0.1530652438202461 0.559347283781128 -0.1650999538098147 -25119.0 0.5466928595795495 -0.1662103949012545 0.46100161172087417 0.15306521375252868 0.46100161172087417 0.15306521375252868 0.5593472562913927 -0.16509994729255453 -31623.0 0.5466928254470731 -0.16621038899520488 0.46100162799192645 0.15306517589723756 0.46100162799192645 0.15306517589723756 0.5593472216817841 -0.16509993908731635 -39811.0 0.5466927824770983 -0.16621038155997508 0.4610016484758403 0.1530651282405457 0.4610016484758403 0.1530651282405457 0.5593471781111391 -0.1650999287575977 -50119.0 0.5466927283815316 -0.16621037219964918 0.4610016742633567 0.1530650682447983 0.4610016742633567 0.1530650682447983 0.5593471232593793 -0.16509991575335498 -63096.0 0.5466926602792644 -0.16621036041569986 0.4610017067279085 0.15306499271464558 0.4610017067279085 0.15306499271464558 0.5593470542051218 -0.16509989938198727 -79433.0 0.5466925745439837 -0.1662103455806548 0.46100174759817003 0.15306489762825393 0.46100174759817003 0.15306489762825393 0.5593469672713616 -0.16509987877175114 -100000.0 0.5466924666099984 -0.16621032690449813 0.46100179905061955 0.15306477792195428 0.46100179905061955 0.15306477792195428 0.5593468578285848 -0.16509985282508244 -125893.0 0.5466923307255872 -0.16621030339199147 0.46100186382711955 0.15306462721668773 0.46100186382711955 0.15306462721668773 0.5593467200446678 -0.16509982015930266 -158489.0 0.5466921596643636 -0.16621027379273035 0.46100194537250994 0.1530644374978885 0.46100194537250994 0.1530644374978885 0.5593465465922074 -0.16509977903723272 -199526.0 0.5466919443054411 -0.16621023652849923 0.46100204803474415 0.1530641986498592 0.46100204803474415 0.1530641986498592 0.5593463282228179 -0.16509972726626743 -251189.0 0.5466916731821132 -0.16621018961517778 0.4610021772800351 0.15306389795522415 0.4610021772800351 0.15306389795522415 0.5593460533095016 -0.16509966208988075 -316228.0 0.5466913318625978 -0.1662101305555894 0.46100233998805595 0.15306351940813304 0.46100233998805595 0.15306351940813304 0.5593457072187367 -0.16509958003876077 -398107.0 0.5466909021680975 -0.16621005620419965 0.46100254482469305 0.1530630428470347 0.46100254482469305 0.1530630428470347 0.5593452715176075 -0.16509947674283593 -501187.0 0.54669036121243 -0.16620996260094054 0.46100280269985694 0.1530624428895607 0.46100280269985694 0.1530624428895607 0.5593447230000097 -0.16509934670040832 -630957.0 0.5466896801897587 -0.16620984476144754 0.46100312734537524 0.15306168758803368 0.46100312734537524 0.15306168758803368 0.5593440324574342 -0.16509918298673124 -794328.0 0.5466888228317034 -0.16620969641008893 0.4610035360504917 0.1530607367182967 0.4610035360504917 0.1530607367182967 0.5593431631145115 -0.1650989768831084 -1000000.0 0.5466877434813538 -0.166209509646706 0.46100405057999033 0.15305953964365956 0.46100405057999033 0.15305953964365956 0.5593420686761007 -0.16509871741389834 -1258925.0 0.5466863846634824 -0.16620927452617953 0.4610046983324818 0.15305803262009574 0.4610046983324818 0.15305803262009574 0.5593406908635374 -0.16509839076240854 -1584893.0 0.5466846740092625 -0.16620897852630398 0.46100551380639954 0.1530561353855411 0.46100551380639954 0.1530561353855411 0.5593389562963631 -0.16509797953161645 -1995262.0 0.5466825204252861 -0.16620860588490077 0.4610065404262399 0.1530537469110683 0.4610065404262399 0.1530537469110683 0.5593367726077901 -0.16509746182322513 -2511886.0 0.546679809223494 -0.16620813675713456 0.46100783286413954 0.15305073999963972 0.46100783286413954 0.15305073999963972 0.5593340235065535 -0.16509681006692783 -3162278.0 0.5466763960178437 -0.16620754615943462 0.4610094599493512 0.15304695451708789 0.4610094599493512 0.15304695451708789 0.559330562588262 -0.16509598955320468 -3981072.0 0.5466720990518489 -0.166206802641905 0.4610115083257286 0.1530421888828234 0.4610115083257286 0.1530421888828234 0.5593262055556852 -0.16509495658891016 -5011872.0 0.5466666894951747 -0.16620586660931375 0.46101408707736796 0.15303618930808321 0.46101408707736796 0.15303618930808321 0.5593207203797069 -0.16509365616463398 -6309573.0 0.5466598792632135 -0.16620468821347584 0.4610173335350524 0.15302863628699287 0.4610173335350524 0.15302863628699287 0.5593138149486316 -0.16509201902660173 -7943282.0 0.5466513056879083 -0.1662032047007977 0.46102142058371554 0.15301912759544334 0.46102142058371554 0.15301912759544334 0.5593051215247256 -0.1650899579916349 -10000000.0 0.546640512194909 -0.16620133706878468 0.4610265658736982 0.15300715686071253 0.4610265658736982 0.15300715686071253 0.5592941771512603 -0.16508736330205745 -12589254.0 0.5466269239952031 -0.16619898585988765 0.46103304340861984 0.15299208660179292 0.46103304340861984 0.15299208660179292 0.5592803990043426 -0.16508409678211294 -15848932.0 0.5466098174634991 -0.16619602586294838 0.46104119814279354 0.15297311426788723 0.46104119814279354 0.15297311426788723 0.5592630533432417 -0.16507998447671546 -19952623.0 0.5465882816184877 -0.1661922994480081 0.46105146434369926 0.1529492295173389 0.46105146434369926 0.1529492295173389 0.55924121645219 -0.1650748073915405 -25118864.0 0.5465611695953194 -0.16618760816943778 0.4610643887251971 0.1529191603972328 0.4610643887251971 0.1529191603972328 0.5592137254345031 -0.16506828982730595 -31622777.0 0.546527037575551 -0.16618170219879488 0.4610806595598022 0.15288130561245666 0.4610806595598022 0.15288130561245666 0.5591791162888364 -0.16506008469890535 -39810717.0 0.5464840679156028 -0.16617426702349875 0.4611011433235758 0.15283364926981186 0.4611011433235758 0.15283364926981186 0.5591355459630696 -0.16504975505596017 -50118723.0 0.5464299723173738 -0.1661649066921378 0.46112693085497947 0.152773653487488 0.46112693085497947 0.152773653487488 0.559080694171358 -0.16503675080562896 -63095734.0 0.5463618699925138 -0.1661531227328507 0.4611593954343257 0.15269812327076424 0.4611593954343257 0.15269812327076424 0.5590116398552845 -0.16502037942404513 -79432823.0 0.5462761342447099 -0.16613828760697735 0.46120026591845537 0.15260303636108943 0.46120026591845537 0.15260303636108943 0.5589247056215441 -0.16499976907563838 -100000000.0 0.5461681993304599 -0.1661196112895713 0.4612517188107773 0.15248332903124232 0.4612517188107773 0.15248332903124232 0.5588152619028559 -0.1649738221836484 -125892541.0 0.5460323173281535 -0.1660960991996931 0.46131649416249504 0.15233262643622567 0.46131649416249504 0.15233262643622567 0.5586774804283577 -0.16494115698294182 -158489319.0 0.5458612520216092 -0.16606649923211647 0.46139804149922853 0.1521429031088094 0.46139804149922853 0.1521429031088094 0.5585040238279905 -0.16490003393149014 -199526231.0 0.5456458935609996 -0.16602923508089748 0.46150070351328915 0.15190405559168585 0.46150070351328915 0.15190405559168585 0.5582856549068324 -0.16484826307721756 -251188643.0 0.545374773318821 -0.16598232229337812 0.46162994733327123 0.1516033643789841 0.46162994733327123 0.1516033643789841 0.5580107447193196 -0.1647830874323488 -316227766.0 0.5450334531578723 -0.1659232625933056 0.4617926556618101 0.1512248165719648 0.4617926556618101 0.1512248165719648 0.5576646532999023 -0.16470103615717366 -398107171.0 0.5446037565321509 -0.1658489108358039 0.46199749331205503 0.1507482531164152 0.46199749331205503 0.1507482531164152 0.5572289500156269 -0.164597739721414 -501187234.0 0.5440628005341162 -0.16575530751947015 0.4622553686335967 0.15014829527571583 0.4622553686335967 0.15014829527571583 0.556680432082547 -0.16446769721431742 -630957344.0 0.5433817772855165 -0.16563746792659956 0.46258001442705865 0.1493929931084779 0.46258001442705865 0.1493929931084779 0.5559898889218124 -0.16430398339847893 -794328235.0 0.5425244198022299 -0.16548911666695781 0.4629887192708573 0.14844212400590961 0.4629887192708573 0.14844212400590961 0.5551205465790867 -0.1640978799131498 -800000996.0 0.5424946496022605 -0.16548396543570207 0.46300291081308503 0.14840910678277924 0.46300291081308503 0.14840910678277924 0.5550903602263816 -0.16409072333950084 -1000000000.0 0.5414450706859694 -0.16530235349743766 0.4635032481815683 0.14724505073654004 0.4635032481815683 0.14724505073654004 0.5540261094188117 -0.163838410999558 -1600000990.0 0.5382963130608676 -0.16475751407036499 0.46500427023877794 0.1437528594446324 0.46500427023877794 0.1437528594446324 0.5508333358280478 -0.16308146896121212 -2400000990.0 0.5340979764879871 -0.16403106269957954 0.467005629679481 0.13909661207156374 0.467005629679481 0.13909661207156374 0.5465763113977863 -0.16207221457535398 -3200000980.0 0.5298996399675858 -0.16330461133787472 0.4690069890951671 0.13444036475669813 0.4690069890951671 0.13444036475669813 0.5423192870207375 -0.16106296020211155 -4000000980.0 0.5257013033947053 -0.16257815996708924 0.47100834853587015 0.12978411738362944 0.47100834853587015 0.12978411738362944 0.538062262590476 -0.16005370581625342 -4800000980.0 0.521502966821825 -0.16185170859630377 0.47300970797657327 0.12512787001056075 0.47300970797657327 0.12512787001056075 0.5338052381602144 -0.1590444514303953 -5600000970.0 0.5173046303014237 -0.16112525723459895 0.47501106739225935 0.12047162269569517 0.47501106739225935 0.12047162269569517 0.5295482137831657 -0.15803519705715285 -6400000970.0 0.5131062937285432 -0.1603988058638135 0.4770124268329624 0.11581537532262648 0.4770124268329624 0.11581537532262648 0.5252911893529042 -0.15702594267129472 -7200000960.0 0.508907957208142 -0.15967235450210868 0.47901378624864854 0.1111591280077609 0.47901378624864854 0.1111591280077609 0.5210341649758555 -0.1560166882980523 -8000000960.0 0.5047096206352615 -0.1589459031313232 0.4810151456893516 0.10650288063469221 0.4810151456893516 0.10650288063469221 0.516777140545594 -0.15500743391219415 -8800000960.0 0.5005112840623811 -0.15821945176053775 0.4830165051300547 0.10184663326162352 0.4830165051300547 0.10184663326162352 0.5125201161153324 -0.15399817952633604 -9600000950.0 0.4963129475419798 -0.15749300039883293 0.48501786454574075 0.09719038594675794 0.48501786454574075 0.09719038594675794 0.5082630917382837 -0.1529889251530936 -10400000900.0 0.49211461123149536 -0.15676654907345067 0.4870192238613589 0.09253413886470471 0.4870192238613589 0.09253413886470471 0.5040060675740862 -0.15197967083031386 -11200000900.0 0.4879162746586149 -0.15604009770266522 0.48902058330206194 0.08787789149163604 0.48902058330206194 0.08787789149163604 0.4997490431438247 -0.15097041644445575 -12000000900.0 0.4837179380857345 -0.15531364633187975 0.49102194274276506 0.08322164411856735 0.49102194274276506 0.08322164411856735 0.49549201871356313 -0.1499611620585976 -12800000900.0 0.479519601512854 -0.15458719496109427 0.4930233021834681 0.07856539674549864 0.4930233021834681 0.07856539674549864 0.4912349942833016 -0.1489519076727395 -13600000900.0 0.47532126493997356 -0.15386074359030882 0.4950246616241712 0.07390914937242997 0.4950246616241712 0.07390914937242997 0.4869779698530401 -0.14794265328688136 -14400000900.0 0.47112292836709313 -0.15313429221952335 0.4970260210648743 0.06925290199936128 0.4970260210648743 0.06925290199936128 0.48272094542277855 -0.14693339890102325 -15200000900.0 0.46692459179421264 -0.1524078408487379 0.4990273805055774 0.0645966546262926 0.4990273805055774 0.0645966546262926 0.478463920992517 -0.1459241445151651 -16000000900.0 0.4627262552213322 -0.15168138947795243 0.5010287399462805 0.059940407253223915 0.5010287399462805 0.059940407253223915 0.47420689656225545 -0.144914890129307 -16800000900.0 0.45852791864845177 -0.15095493810716698 0.5030300993869835 0.05528415988015524 0.5030300993869835 0.05528415988015524 0.4699498721319939 -0.14390563574344886 -17600000900.0 0.4543295820755713 -0.1502284867363815 0.5050314588276866 0.05062791250708655 0.5050314588276866 0.05062791250708655 0.4656928477017324 -0.14289638135759075 -18400000900.0 0.45013124550269085 -0.14950203536559603 0.5070328182683898 0.045971665134017875 0.5070328182683898 0.045971665134017875 0.46143582327147087 -0.1418871269717326 -19200000900.0 0.4459329089298104 -0.14877558399481058 0.5090341777090928 0.041315417760949186 0.5090341777090928 0.041315417760949186 0.4571787988412094 -0.1408778725858745 -20000000900.0 0.4417345723569299 -0.1480491326240251 0.5110355371497959 0.036659170387880496 0.5110355371497959 0.036659170387880496 0.45292177441094783 -0.13986861820001636 -20800000900.0 0.4375362357840495 -0.14732268125323966 0.5130368965904989 0.03200292301481182 0.5130368965904989 0.03200292301481182 0.4486647499806863 -0.13885936381415825 -21600000900.0 0.433337899211169 -0.1465962298824542 0.515038256031202 0.027346675641743118 0.515038256031202 0.027346675641743118 0.44440772555042474 -0.13785010942830012 -22400000900.0 0.42913956263828856 -0.1458697785116687 0.5170396154719051 0.02269042826867443 0.5170396154719051 0.02269042826867443 0.4401507011201632 -0.136840855042442 -23200000900.0 0.4249412260654081 -0.14514332714088327 0.5190409749126081 0.018034180895605767 0.5190409749126081 0.018034180895605767 0.4358936766899017 -0.13583160065658387 -24000000900.0 0.42074288949252764 -0.1444168757700978 0.5210423343533113 0.013377933522537078 0.5210423343533113 0.013377933522537078 0.43163665225964015 -0.13482234627072576 -24800000900.0 0.4165445529196472 -0.14369042439931234 0.5230436937940144 0.008721686149468444 0.5230436937940144 0.008721686149468444 0.42737962782937866 -0.13381309188486762 -25600000900.0 0.4123462163467667 -0.14296397302852687 0.5250450532347174 0.004065438776399727 0.5250450532347174 0.004065438776399727 0.4231226033991171 -0.13280383749900948 -26400000900.0 0.4081478797738862 -0.1422375216577414 0.5270464126754205 -0.0005908085966689625 0.5270464126754205 -0.0005908085966689625 0.41886557896885557 -0.13179458311315137 -27200000900.0 0.40394954320100585 -0.14151107028695595 0.5290477721161236 -0.005247055969737624 0.5290477721161236 -0.005247055969737624 0.414608554538594 -0.13078532872729326 -28000000900.0 0.39975120662812536 -0.14078461891617047 0.5310491315568266 -0.009903303342806341 0.5310491315568266 -0.009903303342806341 0.4103515301083325 -0.12977607434143512 -28800000900.0 0.3955528700552449 -0.14005816754538503 0.5330504909975298 -0.014559550715875003 0.5330504909975298 -0.014559550715875003 0.406094505678071 -0.128766819955577 -29600000900.0 0.3913545334823645 -0.13933171617459955 0.5350518504382329 -0.019215798088943692 0.5350518504382329 -0.019215798088943692 0.40183748124780944 -0.12775756556971887 -30400000800.0 0.3871561974342761 -0.1386052648946205 0.537053209628766 -0.023872044879981458 0.537053209628766 -0.023872044879981458 0.39758045734967595 -0.12674831131001754 -31200000800.0 0.3829578608613956 -0.13787881352383505 0.539054569069469 -0.02852829225305012 0.539054569069469 -0.02852829225305012 0.3933234329194144 -0.12573905692415943 -32000000800.0 0.3787595242885151 -0.13715236215304957 0.5410559285101721 -0.033184539626118836 0.5410559285101721 -0.033184539626118836 0.38906640848915286 -0.1247298025383013 -32800000800.0 0.37456118771563474 -0.13642591078226413 0.5430572879508753 -0.0378407869991875 0.5430572879508753 -0.0378407869991875 0.3848093840588914 -0.12372054815244318 -33333334200.0 0.3717622963171864 -0.13594160980786954 0.5443915277447906 -0.04094495230258724 0.5443915277447906 -0.04094495230258724 0.3819713674172983 -0.12304771181109989 -33600000800.0 0.37036285114275425 -0.13569945941147865 0.5450586473915783 -0.04249703437225619 0.5450586473915783 -0.04249703437225619 0.3805523596286299 -0.12271129376658504 -34400000800.0 0.3661645145698738 -0.1349730080406932 0.5470600068322814 -0.04715328174532485 0.5470600068322814 -0.04715328174532485 0.37629533519836833 -0.12170203938072693 -35200000800.0 0.3619661779969933 -0.13424655666990773 0.5490613662729845 -0.051809529118393566 0.5490613662729845 -0.051809529118393566 0.3720383107681068 -0.1206927849948688 -36000000800.0 0.3577678414241129 -0.13352010529912228 0.5510627257136875 -0.05646577649146223 0.5510627257136875 -0.05646577649146223 0.36778128633784524 -0.11968353060901069 -36800000800.0 0.3535695048512324 -0.1327936539283368 0.5530640851543906 -0.06112202386453092 0.5530640851543906 -0.06112202386453092 0.3635242619075837 -0.11867427622315255 -37600000800.0 0.34937116827835196 -0.13206720255755133 0.5550654445950938 -0.06577827123759963 0.5550654445950938 -0.06577827123759963 0.35926723747732214 -0.11766502183729442 -38400000800.0 0.34517283170547153 -0.13134075118676589 0.5570668040357968 -0.0704345186106683 0.5570668040357968 -0.0704345186106683 0.35501021304706065 -0.1166557674514363 -39200000800.0 0.34097449513259104 -0.1306142998159804 0.5590681634764999 -0.07509076598373698 0.5590681634764999 -0.07509076598373698 0.35075318861679916 -0.11564651306557817 -40000000800.0 0.3367761585597106 -0.12988784844519496 0.561069522917203 -0.07974701335680565 0.561069522917203 -0.07974701335680565 0.3464961641865376 -0.11463725867972002 -40800000800.0 0.33257782198683017 -0.12916139707440946 0.563070882357906 -0.08440326072987436 0.563070882357906 -0.08440326072987436 0.34223913975627607 -0.1136280042938619 -41600000800.0 0.3283794854139497 -0.128434945703624 0.5650722417986092 -0.08905950810294302 0.5650722417986092 -0.08905950810294302 0.3379821153260145 -0.11261874990800377 -42400000800.0 0.32418114884106924 -0.12770849433283854 0.5670736012393122 -0.09371575547601171 0.5670736012393122 -0.09371575547601171 0.333725090895753 -0.11160949552214565 -43200000800.0 0.3199828122681888 -0.12698204296205307 0.5690749606800153 -0.0983720028490804 0.5690749606800153 -0.0983720028490804 0.3294680664654915 -0.11060024113628752 -44000000800.0 0.3157844756953083 -0.12625559159126762 0.5710763201207183 -0.10302825022214904 0.5710763201207183 -0.10302825022214904 0.32521104203523 -0.10959098675042941 -44800000800.0 0.31158613912242783 -0.12552914022048214 0.5730776795614214 -0.10768449759521778 0.5730776795614214 -0.10768449759521778 0.3209540176049684 -0.10858173236457128 -45600000800.0 0.30738780254954745 -0.12480268884969667 0.5750790390021245 -0.11234074496828647 0.5750790390021245 -0.11234074496828647 0.3166969931747069 -0.10757247797871315 -46400000800.0 0.30318946597666696 -0.12407623747891122 0.5770803984428275 -0.1169969923413551 0.5770803984428275 -0.1169969923413551 0.31243996874444535 -0.10656322359285503 -47200000800.0 0.29899112940378647 -0.12334978610812575 0.5790817578835307 -0.12165323971442385 0.5790817578835307 -0.12165323971442385 0.3081829443141838 -0.10555396920699689 -48000000800.0 0.29479279283090604 -0.12262333473734029 0.5810831173242338 -0.12630948708749254 0.5810831173242338 -0.12630948708749254 0.30392591988392226 -0.10454471482113878 -48800000800.0 0.2905944562580256 -0.12189688336655483 0.5830844767649368 -0.13096573446056115 0.5830844767649368 -0.13096573446056115 0.29966889545366077 -0.10353546043528065 -49600000800.0 0.28639611968514517 -0.12117043199576934 0.5850858362056399 -0.13562198183362983 0.5850858362056399 -0.13562198183362983 0.2954118710233992 -0.1025262060494225 -50400000700.0 0.2821977836370567 -0.1204439807157903 0.587087195396173 -0.1402782286246676 0.587087195396173 -0.1402782286246676 0.29115484712526574 -0.10151695178972117 -51200000700.0 0.2779994470641763 -0.11971752934500482 0.5890885548368762 -0.1449344759977363 0.5890885548368762 -0.1449344759977363 0.28689782269500425 -0.10050769740386305 -52000000700.0 0.27380111049129585 -0.11899107797421937 0.5910899142775792 -0.14959072337080498 0.5910899142775792 -0.14959072337080498 0.2826407982647427 -0.09949844301800494 -52800000700.0 0.26960277391841536 -0.1182646266034339 0.5930912737182823 -0.15424697074387367 0.5930912737182823 -0.15424697074387367 0.27838377383448115 -0.0984891886321468 -53600000700.0 0.2654044373455349 -0.11753817523264844 0.5950926331589854 -0.15890321811694236 0.5950926331589854 -0.15890321811694236 0.2741267494042196 -0.09747993424628865 -54400000700.0 0.2612061007726545 -0.11681172386186295 0.5970939925996884 -0.16355946549001096 0.5970939925996884 -0.16355946549001096 0.2698697249739581 -0.09647067986043052 -55200000700.0 0.25700776419977406 -0.11608527249107749 0.5990953520403915 -0.16821571286307965 0.5990953520403915 -0.16821571286307965 0.26561270054369657 -0.09546142547457241 -56000000700.0 0.25280942762689357 -0.11535882112029203 0.6010967114810947 -0.1728719602361484 0.6010967114810947 -0.1728719602361484 0.261355676113435 -0.09445217108871427 -56800000700.0 0.24861109105401313 -0.11463236974950652 0.6030980709217977 -0.177528207609217 0.6030980709217977 -0.177528207609217 0.25709865168317353 -0.09344291670285612 -57600000700.0 0.24441275448113264 -0.11390591837872108 0.6050994303625008 -0.1821844549822857 0.6050994303625008 -0.1821844549822857 0.252841627252912 -0.092433662316998 -58400000700.0 0.24021441790825215 -0.1131794670079356 0.6071007898032039 -0.1868407023553544 0.6071007898032039 -0.1868407023553544 0.24858460282265044 -0.09142440793113984 -59200000700.0 0.23601608133537183 -0.1124530156371501 0.6091021492439069 -0.19149694972842304 0.6091021492439069 -0.19149694972842304 0.244327578392389 -0.09041515354528172 -60000000700.0 0.2318177447624914 -0.11172656426636465 0.61110350868461 -0.1961531971014917 0.61110350868461 -0.1961531971014917 0.2400705539621275 -0.0894058991594236 -60800000700.0 0.22761940818961096 -0.11100011289557918 0.6131048681253132 -0.2008094444745604 0.6131048681253132 -0.2008094444745604 0.23581352953186596 -0.08839664477356547 -61600000700.0 0.22342107161673058 -0.11027366152479372 0.6151062275660163 -0.20546569184762906 0.6151062275660163 -0.20546569184762906 0.23155650510160453 -0.08738739038770735 -62400000700.0 0.21922273504385015 -0.10954721015400828 0.6171075870067194 -0.21012193922069775 0.6171075870067194 -0.21012193922069775 0.22729948067134298 -0.08637813600184925 -63200000700.0 0.2150243984709697 -0.10882075878322288 0.6191089464474225 -0.2147781865937664 0.6191089464474225 -0.2147781865937664 0.2230424562410815 -0.08536888161599118 -64000000700.0 0.21082606189808928 -0.10809430741243745 0.6211103058881257 -0.21943443396683512 0.6211103058881257 -0.21943443396683512 0.21878543181082 -0.0843596272301331 -64800000700.0 0.2066277253252088 -0.10736785604165203 0.6231116653288288 -0.2240906813399039 0.6231116653288288 -0.2240906813399039 0.2145284073805584 -0.08335037284427502 -65600000700.0 0.2024293887523283 -0.10664140467086661 0.6251130247695318 -0.22874692871297256 0.6251130247695318 -0.22874692871297256 0.2102713829502969 -0.08234111845841692 -66400000700.0 0.19823105217944786 -0.10591495330008116 0.6271143842102349 -0.23340317608604128 0.6271143842102349 -0.23340317608604128 0.20601435852003536 -0.08133186407255882 -66666667300.0 0.19683160700501573 -0.10567280290369029 0.6277815038570227 -0.23495525815571028 0.6277815038570227 -0.23495525815571028 0.20459535073136687 -0.08099544602804397 -67200000700.0 0.19403271560656726 -0.10518850192929571 0.629115743650938 -0.23805942345911005 0.629115743650938 -0.23805942345911005 0.2017573340897737 -0.08032260968670073 -68000000700.0 0.18983437903368683 -0.10446205055851027 0.631117103091641 -0.24271567083217868 0.631117103091641 -0.24271567083217868 0.19750030965951215 -0.0793133553008426 -68800000700.0 0.1856360424608064 -0.10373559918772479 0.633118462532344 -0.2473719182052474 0.633118462532344 -0.2473719182052474 0.19324328522925066 -0.07830410091498448 -69600000700.0 0.18143770588792596 -0.10300914781693934 0.6351198219730472 -0.2520281655783161 0.6351198219730472 -0.2520281655783161 0.18898626079898911 -0.07729484652912635 -70400000600.0 0.17723936983983757 -0.10228269653696029 0.6371211811635804 -0.25668441236935385 0.6371211811635804 -0.25668441236935385 0.18472923690085563 -0.07628559226942502 -71200000600.0 0.17304103326695708 -0.10155624516617483 0.6391225406042834 -0.26134065974242254 0.6391225406042834 -0.26134065974242254 0.18047221247059414 -0.0752763378835669 -72000000600.0 0.16884269669407664 -0.10082979379538937 0.6411239000449864 -0.2659969071154912 0.6411239000449864 -0.2659969071154912 0.1762151880403326 -0.07426708349770879 -72800000600.0 0.16464436012119615 -0.1001033424246039 0.6431252594856895 -0.27065315448856 0.6431252594856895 -0.27065315448856 0.17195816361007105 -0.07325782911185065 -73600000600.0 0.16044602354831572 -0.09937689105381842 0.6451266189263927 -0.27530940186162867 0.6451266189263927 -0.27530940186162867 0.1677011391798095 -0.0722485747259925 -74400000600.0 0.15624768697543517 -0.09865043968303296 0.6471279783670957 -0.27996564923469724 0.6471279783670957 -0.27996564923469724 0.163444114749548 -0.07123932034013437 -75200000600.0 0.15204935040255474 -0.0979239883122475 0.6491293378077987 -0.28462189660776593 0.6491293378077987 -0.28462189660776593 0.15918709031928635 -0.07023006595427626 -76000000600.0 0.14785101382967425 -0.09719753694146202 0.6511306972485018 -0.28927814398083473 0.6511306972485018 -0.28927814398083473 0.1549300658890248 -0.06922081156841813 -76800000600.0 0.14365267725679381 -0.09647108557067656 0.6531320566892049 -0.2939343913539033 0.6531320566892049 -0.2939343913539033 0.15067304145876326 -0.06821155718256 -77600000600.0 0.13945434068391338 -0.0957446341998911 0.655133416129908 -0.298590638726972 0.655133416129908 -0.298590638726972 0.14641601702850177 -0.06720230279670188 -78400000600.0 0.1352560041110329 -0.09501818282910562 0.6571347755706112 -0.3032468861000407 0.6571347755706112 -0.3032468861000407 0.14215899259824022 -0.06619304841084375 -79200000600.0 0.1310576675381524 -0.09429173145832016 0.6591361350113142 -0.3079031334731094 0.6591361350113142 -0.3079031334731094 0.13790196816797867 -0.06518379402498563 -80000000600.0 0.12685933096527197 -0.0935652800875347 0.6611374944520172 -0.31255938084617807 0.6611374944520172 -0.31255938084617807 0.13364494373771718 -0.0641745396391275 -80800000600.0 0.12266099439239153 -0.09283882871674924 0.6631388538927203 -0.31721562821924676 0.6631388538927203 -0.31721562821924676 0.12938791930745563 -0.06316528525326938 -81600000600.0 0.11846265781951104 -0.09211237734596378 0.6651402133334234 -0.32187187559231545 0.6651402133334234 -0.32187187559231545 0.1251308948771941 -0.062156030867411255 -82400000600.0 0.1142643212466306 -0.09138592597517832 0.6671415727741266 -0.32652812296538414 0.6671415727741266 -0.32652812296538414 0.12087387044693254 -0.06114677648155313 -83200000600.0 0.11006598467375017 -0.09065947460439283 0.6691429322148296 -0.3311843703384528 0.6691429322148296 -0.3311843703384528 0.11661684601667105 -0.060137522095695006 -84000000600.0 0.10586764810086974 -0.08993302323360737 0.6711442916555327 -0.3358406177115215 0.6711442916555327 -0.3358406177115215 0.1123598215864095 -0.059128267709836854 -84800000600.0 0.10166931152798925 -0.0892065718628219 0.6731456510962357 -0.3404968650845902 0.6731456510962357 -0.3404968650845902 0.10810279715614796 -0.05811901332397873 -85600000600.0 0.09747097495510881 -0.08848012049203643 0.6751470105369388 -0.3451531124576589 0.6751470105369388 -0.3451531124576589 0.10384577272588646 -0.057109758938120606 -86400000600.0 0.09327263838222832 -0.08775366912125097 0.6771483699776419 -0.3498093598307276 0.6771483699776419 -0.3498093598307276 0.09958874829562492 -0.05610050455226248 -87200000600.0 0.08907430180934783 -0.0870272177504655 0.6791497294183451 -0.3544656072037963 0.6791497294183451 -0.3544656072037963 0.09533172386536337 -0.05509125016640436 -88000000600.0 0.08487596523646745 -0.08630076637968005 0.6811510888590481 -0.35912185457686496 0.6811510888590481 -0.35912185457686496 0.09107469943510188 -0.054081995780546246 -88800000600.0 0.08067762866358691 -0.08557431500889458 0.6831524482997512 -0.3637781019499336 0.6831524482997512 -0.3637781019499336 0.08681767500484028 -0.053072741394688094 -89600000600.0 0.07647929209070647 -0.08484786363810912 0.6851538077404542 -0.3684343493230023 0.6851538077404542 -0.3684343493230023 0.08256065057457873 -0.05206348700882997 -90400000500.0 0.0722809560426182 -0.08412141235813009 0.6871551669309873 -0.37309059611404 0.6871551669309873 -0.37309059611404 0.07830362667644536 -0.05105423274912867 -91200000500.0 0.06808261946973765 -0.0833949609873446 0.6891565263716904 -0.3777468434871088 0.6891565263716904 -0.3777468434871088 0.07404660224618376 -0.050044978363270515 -92000000500.0 0.06388428289685716 -0.08266850961655914 0.6911578858123935 -0.3824030908601775 0.6911578858123935 -0.3824030908601775 0.06978957781592221 -0.049035723977412404 -92800000500.0 0.059685946323976724 -0.08194205824577368 0.6931592452530966 -0.38705933823324606 0.6931592452530966 -0.38705933823324606 0.06553255338566072 -0.04802646959155428 -93600000500.0 0.05548760975109629 -0.08121560687498822 0.6951606046937997 -0.39171558560631475 0.6951606046937997 -0.39171558560631475 0.06127552895539917 -0.047017215205696156 -94400000500.0 0.051289273178215855 -0.08048915550420276 0.6971619641345027 -0.39637183297938344 0.6971619641345027 -0.39637183297938344 0.05701850452513768 -0.04600796081983803 -95200000500.0 0.04709093660533542 -0.0797627041334173 0.6991633235752058 -0.40102808035245213 0.6991633235752058 -0.40102808035245213 0.052761480094876134 -0.04499870643397992 -96000000500.0 0.042892600032454986 -0.07903625276263183 0.7011646830159088 -0.4056843277255208 0.7011646830159088 -0.4056843277255208 0.04850445566461459 -0.0439894520481218 -96800000500.0 0.038694263459574385 -0.07830980139184636 0.703166042456612 -0.4103405750985895 0.703166042456612 -0.4103405750985895 0.04424743123435304 -0.042980197662263644 -97600000500.0 0.034495926886694006 -0.0775833500210609 0.7051674018973151 -0.4149968224716582 0.7051674018973151 -0.4149968224716582 0.039990406804091494 -0.04197094327640552 -98400000500.0 0.030297590313813516 -0.07685689865027544 0.7071687613380182 -0.4196530698447269 0.7071687613380182 -0.4196530698447269 0.03573338237382995 -0.04096168889054741 -99200000500.0 0.026099253740933137 -0.07613044727948998 0.7091701207787212 -0.4243093172177956 0.7091701207787212 -0.4243093172177956 0.03147635794356851 -0.03995243450468927 -100000000000.0 0.02190091979201303 -0.07540399636273662 0.7111714789685747 -0.4289655616807096 0.7111714789685747 -0.4289655616807096 0.02721933617394723 -0.03894318074961514 -100800000000.0 0.01770258321913254 -0.07467754499195116 0.7131728384092777 -0.4336218090537783 0.7131728384092777 -0.4336218090537783 0.02296231174368568 -0.03793392636375703 -101600000000.0 0.01350424664625216 -0.0739510936211657 0.7151741978499808 -0.438278056426847 0.7151741978499808 -0.438278056426847 0.018705287313424135 -0.03692467197789892 -102400000000.0 0.00930591007337167 -0.07322464225038024 0.7171755572906839 -0.44293430379991566 0.7171755572906839 -0.44293430379991566 0.0144482628831627 -0.03591541759204078 -103200000000.0 0.00510757350049118 -0.07249819087959476 0.7191769167313871 -0.44759055117298446 0.7191769167313871 -0.44759055117298446 0.010191238452901041 -0.034906163206182644 -104000000000.0 0.0009092369276106904 -0.0717717395088093 0.7211782761720901 -0.45224679854605304 0.7211782761720901 -0.45224679854605304 0.005934214022639495 -0.033896908820324534 -104800000000.0 -0.0032890996452696886 -0.07104528813802384 0.7231796356127932 -0.45690304591912173 0.7231796356127932 -0.45690304591912173 0.0016771895923780589 -0.032887654434466396 -105600000000.0 -0.007487436218150179 -0.07031883676723838 0.7251809950534962 -0.4615592932921904 0.7251809950534962 -0.4615592932921904 -0.002579834837883488 -0.031878400048608285 -106400000000.0 -0.011685772791030558 -0.06959238539645292 0.7271823544941993 -0.4662155406652591 0.7271823544941993 -0.4662155406652591 -0.006836859268145035 -0.030869145662750147 -107200000000.0 -0.015884109363911048 -0.06886593402566746 0.7291837139349024 -0.4708717880383278 0.7291837139349024 -0.4708717880383278 -0.011093883698406581 -0.029859891276892037 -108000000000.0 -0.020082445936791538 -0.068139482654882 0.7311850733756055 -0.4755280354113965 0.7311850733756055 -0.4755280354113965 -0.015350908128668017 -0.028850636891033926 -108800000000.0 -0.024280782509672028 -0.06741303128409652 0.7331864328163086 -0.4801842827844652 0.7331864328163086 -0.4801842827844652 -0.019607932558929675 -0.02784138250517576 -109600000000.0 -0.028479119082552518 -0.06668657991331106 0.7351877922570116 -0.48484053015753387 0.7351877922570116 -0.48484053015753387 -0.02386495698919122 -0.02683212811931765 -110400000000.0 -0.0326774556554329 -0.0659601285425256 0.7371891516977147 -0.48949677753060256 0.7371891516977147 -0.48949677753060256 -0.028121981419452657 -0.02582287373345954 -111200000000.0 -0.03687579222831339 -0.06523367717174014 0.7391905111384178 -0.49415302490367125 0.7391905111384178 -0.49415302490367125 -0.032379005849714204 -0.0248136193476014 -112000000000.0 -0.041074128801193766 -0.06450722580095468 0.741191870579121 -0.49880927227673993 0.741191870579121 -0.49880927227673993 -0.03663603027997575 -0.02380436496174329 -112800000000.0 -0.045272465374074256 -0.0637807744301692 0.743193230019824 -0.5034655196498086 0.743193230019824 -0.5034655196498086 -0.0408930547102373 -0.022795110575885152 -113600000000.0 -0.049470801946954635 -0.06305432305938374 0.745194589460527 -0.5081217670228773 0.745194589460527 -0.5081217670228773 -0.04515007914049873 -0.021785856190027042 -114400000000.0 -0.053669138519835125 -0.06232787168859828 0.7471959489012301 -0.512778014395946 0.7471959489012301 -0.512778014395946 -0.04940710357076028 -0.02077660180416893 -115200000000.0 -0.057867475092715726 -0.06160142031781281 0.7491973083419332 -0.5174342617690146 0.7491973083419332 -0.5174342617690146 -0.05366412800102194 -0.019767347418310766 -116000000000.0 -0.062065811665596105 -0.06087496894702735 0.7511986677826363 -0.5220905091420833 0.7511986677826363 -0.5220905091420833 -0.057921152431283485 -0.018758093032452655 -116800000000.0 -0.0662641482384766 -0.060148517576241886 0.7532000272233395 -0.526746756515152 0.7532000272233395 -0.526746756515152 -0.06217817686154492 -0.017748838646594545 -117600000000.0 -0.07046248481135697 -0.059422066205456425 0.7552013866640425 -0.5314030038882207 0.7552013866640425 -0.5314030038882207 -0.06643520129180647 -0.016739584260736406 -118400000000.0 -0.07466082138423746 -0.058695614834670964 0.7572027461047455 -0.5360592512612894 0.7572027461047455 -0.5360592512612894 -0.07069222572206801 -0.015730329874878296 -119200000000.0 -0.07885915795711784 -0.057969163463885504 0.7592041055454486 -0.5407154986343581 0.7592041055454486 -0.5407154986343581 -0.07494925015232945 -0.014721075489020158 -120000000000.0 -0.08305749452999833 -0.05724271209310004 0.7612054649861517 -0.5453717460074268 0.7612054649861517 -0.5453717460074268 -0.079206274582591 -0.013711821103162047 -120800000000.0 -0.08725583110287882 -0.05651626072231457 0.7632068244268548 -0.5500279933804955 0.7632068244268548 -0.5500279933804955 -0.08346329901285265 -0.01270256671730391 -121600000000.0 -0.09145416767575931 -0.05578980935152911 0.765208183867558 -0.5546842407535642 0.765208183867558 -0.5546842407535642 -0.0877203234431142 -0.011693312331445771 -122400000000.0 -0.0956525042486398 -0.055063357980743646 0.767209543308261 -0.5593404881266328 0.767209543308261 -0.5593404881266328 -0.09197734787337564 -0.01068405794558766 -123200000000.0 -0.09985084082152018 -0.054336906609958185 0.769210902748964 -0.5639967354997015 0.769210902748964 -0.5639967354997015 -0.09623437230363718 -0.00967480355972955 -124000000000.0 -0.10404917739440067 -0.053610455239172725 0.7712122621896671 -0.5686529828727702 0.7712122621896671 -0.5686529828727702 -0.10049139673389873 -0.008665549173871412 -124800000000.0 -0.10824751396728105 -0.052884003868387264 0.7732136216303702 -0.5733092302458389 0.7732136216303702 -0.5733092302458389 -0.10474842116416028 -0.007656294788013301 -125600000000.0 -0.11244585054016154 -0.0521575524976018 0.7752149810710733 -0.5779654776189076 0.7752149810710733 -0.5779654776189076 -0.10900544559442171 -0.006647040402155163 -126400000000.0 -0.11664418711304203 -0.05143110112681633 0.7772163405117765 -0.5826217249919763 0.7772163405117765 -0.5826217249919763 -0.11326247002468337 -0.005637786016297025 -127200000000.0 -0.12084252368592252 -0.05070464975603087 0.7792176999524795 -0.587277972365045 0.7792176999524795 -0.587277972365045 -0.11751949445494492 -0.004628531630438915 -128000000000.0 -0.1250408602588029 -0.04997819838524539 0.7812190593931825 -0.5919342197381137 0.7812190593931825 -0.5919342197381137 -0.12177651888520635 -0.0036192772445807764 -128800000000.0 -0.1292391968316834 -0.049251747014459904 0.7832204188338856 -0.5965904671111824 0.7832204188338856 -0.5965904671111824 -0.1260335433154679 -0.002610022858722666 -129600000000.0 -0.13343753340456388 -0.04852529564367444 0.7852217782745887 -0.601246714484251 0.7852217782745887 -0.601246714484251 -0.13029056774572945 -0.0016007684728645277 -130400000000.0 -0.13763586997744426 -0.04779884427288898 0.7872231377152918 -0.6059029618573195 0.7872231377152918 -0.6059029618573195 -0.134547592175991 -0.0005915140870063895 -131200000000.0 -0.14183420655032475 -0.04707239290210352 0.7892244971559949 -0.6105592092303882 0.7892244971559949 -0.6105592092303882 -0.13880461660625243 0.0004177402988517209 -132000000000.0 -0.14603254312320513 -0.04634594153131806 0.7912258565966979 -0.6152154566034569 0.7912258565966979 -0.6152154566034569 -0.14306164103651398 0.0014269946847098591 -132800000000.0 -0.15023087969608573 -0.045619490160532586 0.793227216037401 -0.6198717039765258 0.793227216037401 -0.6198717039765258 -0.14731866546677563 0.0024362490705679973 -133333334000.0 -0.15302977424328645 -0.04513518864129948 0.794561457332336 -0.6229758727721109 0.794561457332336 -0.6229758727721109 -0.1501566853011369 0.0031090861688520544 -133600000000.0 -0.1544292162689661 -0.044893038789747125 0.7952285754781041 -0.6245279513495945 0.7952285754781041 -0.6245279513495945 -0.15157568989703707 0.0034455034564261078 -134400000000.0 -0.1586275528418466 -0.044166587418961664 0.7972299349188072 -0.6291841987226632 0.7972299349188072 -0.6291841987226632 -0.15583271432729862 0.004454757842284246 -135200000000.0 -0.16282588941472698 -0.0434401360481762 0.7992312943595102 -0.6338404460957316 0.7992312943595102 -0.6338404460957316 -0.16008973875756016 0.005464012228142356 -136000000000.0 -0.16702422598760747 -0.04271368467739074 0.8012326538002134 -0.6384966934688003 0.8012326538002134 -0.6384966934688003 -0.1643467631878217 0.006473266614000467 -136800000000.0 -0.17122256256048796 -0.04198723330660528 0.8032340132409164 -0.643152940841869 0.8032340132409164 -0.643152940841869 -0.16860378761808315 0.007482520999858605 -137600000000.0 -0.17542089913336834 -0.04126078193581982 0.8052353726816195 -0.6478091882149377 0.8052353726816195 -0.6478091882149377 -0.1728608120483447 0.008491775385716716 -138400000000.0 -0.17961923570624894 -0.04053433056503433 0.8072367321223226 -0.6524654355880066 0.8072367321223226 -0.6524654355880066 -0.17711783647860635 0.009501029771574854 -139200000000.0 -0.18381757227912932 -0.039807879194248885 0.8092380915630257 -0.6571216829610751 0.8092380915630257 -0.6571216829610751 -0.18137486090886779 0.010510284157432992 -140000000000.0 -0.1880159088520098 -0.03908142782346341 0.8112394510037287 -0.6617779303341438 0.8112394510037287 -0.6617779303341438 -0.18563188533912933 0.011519538543291102 -140800000000.0 -0.19221424542489018 -0.038354976452677964 0.8132408104444319 -0.6664341777072125 0.8132408104444319 -0.6664341777072125 -0.18988890976939088 0.01252879292914924 -141600000000.0 -0.19641258199777067 -0.03762852508189249 0.8152421698851349 -0.6710904250802812 0.8152421698851349 -0.6710904250802812 -0.19414593419965243 0.013538047315007351 -142400000000.0 -0.20061091857065105 -0.03690207371110704 0.817243529325838 -0.6757466724533499 0.817243529325838 -0.6757466724533499 -0.19840295862991386 0.014547301700865461 -143200000000.0 -0.20480925514353154 -0.03617562234032157 0.8192448887665411 -0.6804029198264185 0.8192448887665411 -0.6804029198264185 -0.2026599830601754 0.0155565560867236 -144000000000.0 -0.20900759171641203 -0.03544917096953609 0.8212462482072442 -0.6850591671994872 0.8212462482072442 -0.6850591671994872 -0.20691700749043707 0.016565810472581738 -144800000000.0 -0.21320592828929252 -0.034722719598750645 0.8232476076479472 -0.6897154145725559 0.8232476076479472 -0.6897154145725559 -0.2111740319206985 0.01757506485843985 -145600000000.0 -0.217404264862173 -0.03399626822796517 0.8252489670886504 -0.6943716619456246 0.8252489670886504 -0.6943716619456246 -0.21543105635096005 0.018584319244297987 -146400000000.0 -0.2216026014350534 -0.033269816857179724 0.8272503265293534 -0.6990279093186933 0.8272503265293534 -0.6990279093186933 -0.2196880807812216 0.019593573630156097 -147200000000.0 -0.22580093800793388 -0.03254336548639425 0.8292516859700565 -0.703684156691762 0.8292516859700565 -0.703684156691762 -0.22394510521148314 0.020602828016014235 -148000000000.0 -0.22999927458081426 -0.0318169141156088 0.8312530454107596 -0.7083404040648307 0.8312530454107596 -0.7083404040648307 -0.22820212964174458 0.021612082401872346 -148800000000.0 -0.23419761115369475 -0.031090462744823327 0.8332544048514626 -0.7129966514378994 0.8332544048514626 -0.7129966514378994 -0.23245915407200612 0.022621336787730456 -149600000000.0 -0.23839594772657513 -0.03036401137403788 0.8352557642921656 -0.717652898810968 0.8352557642921656 -0.717652898810968 -0.23671617850226767 0.023630591173588594 -150400000000.0 -0.24259428429945573 -0.029637560003252406 0.8372571237328688 -0.7223091461840367 0.8372571237328688 -0.7223091461840367 -0.24097320293252933 0.024639845559446732 -151200000000.0 -0.2467926208723361 -0.02891110863246693 0.8392584831735719 -0.7269653935571054 0.8392584831735719 -0.7269653935571054 -0.24523022736279076 0.025649099945304843 -152000000000.0 -0.2509909574452166 -0.028184657261681484 0.841259842614275 -0.7316216409301741 0.841259842614275 -0.7316216409301741 -0.2494872517930523 0.02665835433116298 -152800000000.0 -0.2551892940180971 -0.02745820589089601 0.8432612020549781 -0.7362778883032428 0.8432612020549781 -0.7362778883032428 -0.25374427622331386 0.02766760871702109 -153600000000.0 -0.25938763059097747 -0.026731754520110562 0.8452625614956811 -0.7409341356763115 0.8452625614956811 -0.7409341356763115 -0.2580013006535753 0.02867686310287923 -154400000000.0 -0.26358596716385796 -0.026005303149325087 0.8472639209363841 -0.7455903830493802 0.8472639209363841 -0.7455903830493802 -0.26225832508383684 0.02968611748873734 -155200000000.0 -0.26778430373673834 -0.02527885177853964 0.8492652803770873 -0.7502466304224489 0.8492652803770873 -0.7502466304224489 -0.2665153495140984 0.03069537187459545 -156000000000.0 -0.27198264030961894 -0.024552400407754138 0.8512666398177904 -0.7549028777955176 0.8512666398177904 -0.7549028777955176 -0.27077237394436005 0.03170462626045362 -156800000000.0 -0.2761809768824993 -0.02382594903696869 0.8532679992584935 -0.7595591251685863 0.8532679992584935 -0.7595591251685863 -0.2750293983746215 0.03271388064631173 -157600000000.0 -0.2803793134553798 -0.023099497666183216 0.8552693586991966 -0.764215372541655 0.8552693586991966 -0.764215372541655 -0.279286422804883 0.03372313503216984 -158400000000.0 -0.2845776500282602 -0.02237304629539777 0.8572707181398996 -0.7688716199147236 0.8572707181398996 -0.7688716199147236 -0.2835434472351446 0.034732389418027976 -159200000000.0 -0.2887759866011407 -0.021646594924612295 0.8592720775806026 -0.7735278672877923 0.8592720775806026 -0.7735278672877923 -0.287800471665406 0.035741643803886086 -160000000000.0 -0.29297432317402117 -0.020920143553826848 0.8612734370213058 -0.778184114660861 0.8612734370213058 -0.778184114660861 -0.29205749609566756 0.036750898189744224 -160800000000.0 -0.29717265974690155 -0.020193692183041373 0.8632747964620089 -0.7828403620339297 0.8632747964620089 -0.7828403620339297 -0.2963145205259291 0.037760152575602335 -161600000000.0 -0.30137099631978215 -0.019467240812255898 0.865276155902712 -0.7874966094069984 0.865276155902712 -0.7874966094069984 -0.30057154495619076 0.03876940696146047 -162400000000.0 -0.3055693328926625 -0.01874078944147045 0.8672775153434151 -0.7921528567800671 0.8672775153434151 -0.7921528567800671 -0.3048285693864522 0.03977866134731861 -163200000000.0 -0.309767669465543 -0.018014338070684977 0.8692788747841181 -0.7968091041531358 0.8692788747841181 -0.7968091041531358 -0.30908559381671374 0.04078791573317672 -164000000000.0 -0.3139660060384234 -0.01728788669989953 0.8712802342248211 -0.8014653515262045 0.8712802342248211 -0.8014653515262045 -0.3133426182469753 0.04179717011903483 -164800000000.0 -0.3181643426113039 -0.016561435329114055 0.8732815936655243 -0.8061215988992732 0.8732815936655243 -0.8061215988992732 -0.31759964267723684 0.04280642450489297 -165600000000.0 -0.32236267918418426 -0.015834983958328608 0.8752829531062274 -0.8107778462723418 0.8752829531062274 -0.8107778462723418 -0.3218566671074983 0.04381567889075108 -166400000000.0 -0.32656101575706475 -0.015108532587543133 0.8772843125469305 -0.8154340936454103 0.8772843125469305 -0.8154340936454103 -0.3261136915377598 0.04482493327660922 -167200000000.0 -0.33075935232994524 -0.014382081216757686 0.8792856719876335 -0.820090341018479 0.8792856719876335 -0.820090341018479 -0.33037071596802137 0.04583418766246733 -168000000000.0 -0.33495768890282573 -0.013655629845972211 0.8812870314283366 -0.8247465883915479 0.8812870314283366 -0.8247465883915479 -0.3346277403982829 0.04684344204832547 -168800000000.0 -0.3391560254757062 -0.012929178475186737 0.8832883908690397 -0.8294028357646166 0.8832883908690397 -0.8294028357646166 -0.33888476482854446 0.047852696434183606 -169600000000.0 -0.3433543620485866 -0.01220272710440129 0.8852897503097428 -0.8340590831376853 0.8852897503097428 -0.8340590831376853 -0.343141789258806 0.048861950820041716 -170400000000.0 -0.3475526986214671 -0.011476275733615815 0.8872911097504459 -0.8387153305107538 0.8872911097504459 -0.8387153305107538 -0.34739881368906755 0.04987120520589983 -171200000000.0 -0.35175103519434747 -0.010749824362830368 0.889292469191149 -0.8433715778838224 0.889292469191149 -0.8433715778838224 -0.351655838119329 0.050880459591757965 -172000000000.0 -0.35594937176722796 -0.010023372992044893 0.891293828631852 -0.8480278252568911 0.891293828631852 -0.8480278252568911 -0.35591286254959054 0.051889713977616075 -172800000000.0 -0.36014770834010834 -0.009296921621259446 0.893295188072555 -0.8526840726299598 0.893295188072555 -0.8526840726299598 -0.3601698869798521 0.052898968363474214 -173600000000.0 -0.36434604491298894 -0.008570470250473944 0.8952965475132582 -0.8573403200030285 0.8952965475132582 -0.8573403200030285 -0.36442691141011363 0.05390822274933235 -174400000000.0 -0.3685443814858693 -0.007844018879688497 0.8972979069539613 -0.8619965673760972 0.8972979069539613 -0.8619965673760972 -0.3686839358403752 0.05491747713519046 -175200000000.0 -0.3727427180587498 -0.007117567508903022 0.8992992663946644 -0.8666528147491659 0.8992992663946644 -0.8666528147491659 -0.3729409602706367 0.0559267315210486 -176000000000.0 -0.3769410546316303 -0.006391116138117575 0.9013006258353674 -0.8713090621222346 0.9013006258353674 -0.8713090621222346 -0.37719798470089827 0.05693598590690671 -176800000000.0 -0.3811393912045107 -0.0056646647673321004 0.9033019852760705 -0.8759653094953033 0.9033019852760705 -0.8759653094953033 -0.3814550091311597 0.05794524029276482 -177600000000.0 -0.38533772777739117 -0.0049382133965466535 0.9053033447167735 -0.880621556868372 0.9053033447167735 -0.880621556868372 -0.38571203356142125 0.05895449467862296 -178400000000.0 -0.38953606435027155 -0.004211762025761179 0.9073047041574767 -0.8852778042414406 0.9073047041574767 -0.8852778042414406 -0.3899690579916828 0.05996374906448107 -179200000000.0 -0.39373440092315204 -0.0034853106549757318 0.9093060635981798 -0.8899340516145093 0.9093060635981798 -0.8899340516145093 -0.39422608242194435 0.06097300345033921 -180000000000.0 -0.3979327374960324 -0.002758859284190257 0.9113074230388828 -0.894590298987578 0.9113074230388828 -0.894590298987578 -0.3984831068522058 0.06198225783619732 -180800000000.0 -0.4021310740689129 -0.00203240791340481 0.9133087824795859 -0.8992465463606467 0.9133087824795859 -0.8992465463606467 -0.40274013128246733 0.06299151222205543 -181600000000.0 -0.4063294106417933 -0.0013059565426193354 0.9153101419202889 -0.9039027937337152 0.9153101419202889 -0.9039027937337152 -0.4069971557127289 0.06400076660791357 -182400000000.0 -0.410527747214674 -0.0005795051718338606 0.9173115013609922 -0.9085590411067841 0.9173115013609922 -0.9085590411067841 -0.41125418014299053 0.06501002099377173 -183200000000.0 -0.4147260837875544 0.0001469461989516141 0.9193128608016952 -0.9132152884798528 0.9193128608016952 -0.9132152884798528 -0.4155112045732521 0.06601927537962984 -184000000000.0 -0.41892442036043487 0.0008733975697370611 0.9213142202423983 -0.9178715358529215 0.9213142202423983 -0.9178715358529215 -0.4197682290035136 0.06702852976548798 -184800000000.0 -0.42312275693331536 0.0015998489405225358 0.9233155796831014 -0.9225277832259902 0.9233155796831014 -0.9225277832259902 -0.4240252534337752 0.06803778415134609 -185600000000.0 -0.42732109350619574 0.0023263003113079828 0.9253169391238044 -0.9271840305990589 0.9253169391238044 -0.9271840305990589 -0.4282822778640366 0.0690470385372042 -186400000000.0 -0.4315194300790762 0.0030527516820934575 0.9273182985645074 -0.9318402779721275 0.9273182985645074 -0.9318402779721275 -0.43253930229429816 0.07005629292306234 -187200000000.0 -0.4357177666519566 0.0037792030528789045 0.9293196580052105 -0.9364965253451962 0.9293196580052105 -0.9364965253451962 -0.4367963267245597 0.07106554730892045 -188000000000.0 -0.4399161032248371 0.004505654423664379 0.9313210174459137 -0.9411527727182649 0.9313210174459137 -0.9411527727182649 -0.44105335115482114 0.07207480169477859 -188800000000.0 -0.4441144397977175 0.005232105794449826 0.9333223768866168 -0.9458090200913336 0.9333223768866168 -0.9458090200913336 -0.4453103755850827 0.0730840560806367 -189600000000.0 -0.44831277637059797 0.005958557165235301 0.9353237363273198 -0.9504652674644023 0.9353237363273198 -0.9504652674644023 -0.44956740001534423 0.07409331046649481 -190400000000.0 -0.45251111294347846 0.006685008536020748 0.9373250957680228 -0.9551215148374708 0.9373250957680228 -0.9551215148374708 -0.4538244244456058 0.07510256485235295 -191200000000.0 -0.45670944951635883 0.007411459906806223 0.9393264552087259 -0.9597777622105395 0.9393264552087259 -0.9597777622105395 -0.4580814488758673 0.07611181923821106 -192000000000.0 -0.4609077860892392 0.00813791127759167 0.941327814649429 -0.9644340095836081 0.941327814649429 -0.9644340095836081 -0.46233847330612887 0.0771210736240692 -192800000000.0 -0.4651061226621198 0.008864362648377144 0.9433291740901322 -0.9690902569566768 0.9433291740901322 -0.9690902569566768 -0.4665954977363902 0.07813032800992731 -193600000000.0 -0.4693044592350002 0.009590814019162591 0.9453305335308352 -0.9737465043297455 0.9453305335308352 -0.9737465043297455 -0.47085252216665174 0.07913958239578542 -194400000000.0 -0.4735027958078808 0.010317265389948094 0.9473318929715384 -0.9784027517028144 0.9473318929715384 -0.9784027517028144 -0.4751095465969135 0.08014883678164358 -195200000000.0 -0.4777011323807612 0.011043716760733568 0.9493332524122414 -0.9830589990758831 0.9493332524122414 -0.9830589990758831 -0.47936657102717506 0.08115809116750172 -196000000000.0 -0.4818994689536418 0.011770168131519015 0.9513346118529444 -0.9877152464489518 0.9513346118529444 -0.9877152464489518 -0.4836235954574366 0.08216734555335983 -196800000000.0 -0.48609780552652215 0.01249661950230449 0.9533359712936476 -0.9923714938220205 0.9533359712936476 -0.9923714938220205 -0.48788061988769815 0.08317659993921797 -197600000000.0 -0.49029614209940253 0.013223070873089937 0.9553373307343507 -0.9970277411950892 0.9553373307343507 -0.9970277411950892 -0.4921376443179597 0.08418585432507608 -198400000000.0 -0.49449447867228313 0.013949522243875412 0.9573386901750538 -1.0016839885681579 0.9573386901750538 -1.0016839885681579 -0.496394668748221 0.08519510871093419 -199200000000.0 -0.4986928152451635 0.014675973614660859 0.9593400496157568 -1.0063402359412263 0.9593400496157568 -1.0063402359412263 -0.5006516931784826 0.08620436309679233 -200000000000.0 -0.5028911518180439 0.015402424985446334 0.9613414090564599 -1.010996483314295 0.9613414090564599 -1.010996483314295 -0.5049087176087441 0.08721361748265047 diff --git a/schemas/paramer.py b/schemas/paramer.py deleted file mode 100644 index f0f4563..0000000 --- a/schemas/paramer.py +++ /dev/null @@ -1,49 +0,0 @@ -from pydantic import BaseModel, Field -from typing import List,Union,Literal,Optional - -class SimulationRequestUnit(BaseModel): - user_id:int = Field(default=0) - template_name:str = Field(default="em_interface_compound") - template_version:str = Field(default="") - cell_name:str = Field(default="capa") - parameters:dict = Field(default={"W":10,"L":10}) - settings:dict = Field(default={}) - -class UuidResponseUnit(BaseModel): - id:int - user_id:Optional[int] - template_name:str - template_version:str - cell_name:str - status:Literal["pending","running","completed","failed"] - parameters:dict - settings:dict - input_hash:str - storage_type: str - result_path:str - completed_at:Optional[str] - result_json:Optional[dict] - error_message:Optional[str] - failure_count:Optional[int] - last_failed_at:Optional[str] - cpu_usage:Optional[float] - memory_usage:Optional[float] - disk_usage:Optional[float] - gpu_usage:Optional[float] - node_name:Optional[str] - jobs:Optional[List] - results:Optional[List] - created_at:str - updated_at:str - -class SimulationResponseUnit(BaseModel): - template_name:str - template_version:str - template_id:int - cell_name:str - cell_id:int - parameters:dict - settings:dict - input_hash:str - status:str - message:str \ No newline at end of file diff --git a/sweep.py b/sweep.py deleted file mode 100644 index 7ae768d..0000000 --- a/sweep.py +++ /dev/null @@ -1,13 +0,0 @@ -from models.mlin import Mlin - -W = [] -L = [] -i = 15.52 -while i <= 100: - W.append(i) - L.append(i) - i = int(i*1.05*100 + 0.5) / 100.0 - -model = Mlin() -model.sweep() -model.export("mlin_sweep") \ No newline at end of file diff --git a/vector_fitting.py b/test/test_vector_fitting.py similarity index 100% rename from vector_fitting.py rename to test/test_vector_fitting.py diff --git a/utils.py b/utils.py deleted file mode 100644 index 36dd88a..0000000 --- a/utils.py +++ /dev/null @@ -1,55 +0,0 @@ -import requests -import time -from schemas.paramer import SimulationRequestUnit, SimulationResponseUnit, UuidResponseUnit -import skrf as rf -from typing import Literal -import matplotlib.pyplot as plt - - -def send_get_request(url): - try: - response = requests.get(url) - response.raise_for_status() # Raise an error for bad responses - return response.json() - except requests.exceptions.RequestException as e: - print(f"An error occurred: {e}") - return None - -def get_network(file_path: str) -> rf.Network: - network = rf.Network(file_path) - return network - -def get_rms_error(vf: rf.VectorFitting,parameter_type:Literal['s','y','z']): - rms_error = [] - for i in range(vf.network.nports): - rms_error_row = [] - for j in range(vf.network.nports): - rms_error = vf.get_rms_error(i, j, parameter_type) - rms_error_row.append(rms_error) - rms_error.append(rms_error_row) - return rms_error - -def show_rms_error(vf: rf.VectorFitting,parameter_type:Literal['s','y','z'],show_plot:bool=True,save_path:str|None=None): - freqs = vf.network.f - nports = vf.network.nports - fig, ax = plt.subplots(nports, nports) - fig.set_size_inches(6*nports, 4*nports) - for i in range(nports): - for j in range(nports): - vf.plot("mag",0,1,freqs,ax=ax[i][j],parameter=parameter_type) - fig.tight_layout() - if show_plot: - plt.show() - if save_path: - plt.savefig(save_path) - -def remove_simulation_with_high_rms_error(simulations:list[rf.VectorFitting],limit:float=0.015,parameter_type:Literal['s','y','z']='s'): - nports = simulations[0].network.nports - index_of_filtered_simulations = [] - for res in simulations: - for i in range(nports): - for j in range(nports): - rms_error = res.get_rms_error(i, j, parameter_type) - if rms_error > limit: - index_of_filtered_simulations.append(i*nports+j) - break