Repository: AUTODIAL/AutoEIS (language: python)

Issue:
Parallelize Bayesian inference



Discussion / hints:

Fix patch:
diff --git a/.gitignore b/.gitignore
index 72b091f5..a63b470b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -174,3 +174,6 @@ sandbox.py
 sandbox.jl
 scratchpad.py
 test.py
+
+# macOS
+.DS_Store
diff --git a/autoeis/__init__.py b/autoeis/__init__.py
index 0e126773..b824c456 100644
--- a/autoeis/__init__.py
+++ b/autoeis/__init__.py
@@ -2,6 +2,3 @@
 from .core import *
 from .version import __equivalent_circuits_jl_version__, __version__  # noqa: F401
 from .visualization import rich_print  # noqa: F401
-
-# Set up rich traceback for nicer exception printing
-utils.setup_rich_tracebacks()
diff --git a/autoeis/assets/circuits_filtered.csv b/autoeis/assets/circuits_filtered.csv
new file mode 100644
index 00000000..5c522768
--- /dev/null
+++ b/autoeis/assets/circuits_filtered.csv
@@ -0,0 +1,16 @@
+circuitstring,Parameters,Resistors,Capacitors,Inductors,CPEs
+"[P1,R2]-R3","{'P1w': 1.986654419964975e-06, 'P1n': 0.9373079958623047, 'R2': 4629850.953391226, 'R3': 139.14713061653163}","['R2', 'R3']",[],[],"['P1w', 'P1n']"
+"R1-P2-[P3,R4]","{'R1': 130.21245496329337, 'P2w': 2.726518813253607e-06, 'P2n': 0.8681492329761771, 'P3w': 898179842.3135369, 'P3n': 0.8671955810406204, 'R4': 109781191.8272061}","['R1', 'R4']",[],[],"['P2w', 'P2n', 'P3w', 'P3n']"
+"P1-R2-[P3,R4]-[L5,R6]","{'P1w': 3.060047763952672e-05, 'P1n': 0.8656671998064308, 'R2': 139.68410290307114, 'P3w': 2.0355768962488757e-06, 'P3n': 0.9521824823343752, 'R4': 3756228.5668118354, 'L5': 3.992901235637166e-20, 'R6': 686733089.0863287}","['R2', 'R4', 'R6']",[],['L5'],"['P1w', 'P1n', 'P3w', 'P3n']"
+"R1-[R2-L3,P4]","{'R1': 139.14713070316256, 'R2': 4629850.951461096, 'L3': 4.16089662136513e-09, 'P4w': 1.9866544220375024e-06, 'P4n': 0.9373079958415903}","['R1', 'R2']",[],['L3'],"['P4w', 'P4n']"
+"R1-[R2-[R3,P4],[L5,R6]-P7]","{'R1': 141.23906880866465, 'R2': 2757765.1015891605, 'R3': 1499999987.9777336, 'P4w': 2.2882416023531487e-06, 'P4n': 0.4017278612838408, 'L5': 1.0269190149187605e-16, 'R6': 834372380.7853769, 'P7w': 1.817407466396406e-06, 'P7n': 0.954905888771501}","['R1', 'R2', 'R3', 'R6']",[],['L5'],"['P4w', 'P4n', 'P7w', 'P7n']"
+"P1-[P2,R3]-L4-R5","{'P1w': 3.060047791227673e-05, 'P1n': 0.8656672001651722, 'P2w': 2.0355768949833594e-06, 'P2n': 0.9521824822597936, 'R3': 3756228.5791262547, 'L4': 6.94937958919136e-21, 'R5': 139.68410298946637}","['R3', 'R5']",[],['L4'],"['P1w', 'P1n', 'P2w', 'P2n']"
+"[P1,P2]-[P3,R4]-R5","{'P1w': 1.4706292096441107e-06, 'P1n': 0.34376367445689265, 'P2w': 4.654516669629682e-06, 'P2n': 0.999999985635303, 'P3w': 2.8272405794492478e-06, 'P3n': 0.9398241617577261, 'R4': 2206492.89891646, 'R5': 141.32371538045382}","['R4', 'R5']",[],[],"['P1w', 'P1n', 'P2w', 'P2n', 'P3w', 'P3n']"
+"R1-[R2,P3-R4]","{'R1': 35.07220572671824, 'R2': 4629955.027337872, 'P3w': 1.986565107637467e-06, 'P3n': 0.9373079957841405, 'R4': 104.07726417290927}","['R1', 'R2', 'R4']",[],[],"['P3w', 'P3n']"
+"P1-R2-[P3,R4]-R5","{'P1w': 2.7265188153219155e-06, 'P1n': 0.868149232948759, 'R2': 77.43663917559485, 'P3w': 452987714.04031914, 'P3n': 0.8651039170000835, 'R4': 390587055.2351061, 'R5': 52.77581578101956}","['R2', 'R4', 'R5']",[],[],"['P1w', 'P1n', 'P3w', 'P3n']"
+"L1-[P2,R3]-[R4,L5]-P6-R7","{'L1': 7.336357952082608e-20, 'P2w': 2.035576896057408e-06, 'P2n': 0.9521824825733203, 'R3': 3756228.5744548813, 'R4': 862734206.1976002, 'L5': 4.4767342105739886e-20, 'P6w': 3.0600477686348286e-05, 'P6n': 0.8656671995057185, 'R7': 139.68410278904608}","['R3', 'R4', 'R7']",[],"['L1', 'L5']","['P2w', 'P2n', 'P6w', 'P6n']"
+"[P1,P2-R3]-R4","{'P1w': 1.8172983928967454e-06, 'P1n': 0.9549161213807512, 'P2w': 2.275503938969737e-06, 'P2n': 0.4002444280286115, 'R3': 2753990.312617316, 'R4': 141.2402327553605}","['R3', 'R4']",[],[],"['P1w', 'P1n', 'P2w', 'P2n']"
+"R1-[P2-R3,[L4,R5]-P6]","{'R1': 141.24023286281513, 'P2w': 2.27550393232863e-06, 'P2n': 0.4002444276409079, 'R3': 2753990.3122879867, 'L4': 9.778577835323835e-21, 'R5': 701831455.1908306, 'P6w': 1.8172983936370922e-06, 'P6n': 0.9549161213477311}","['R1', 'R3', 'R5']",[],['L4'],"['P2w', 'P2n', 'P6w', 'P6n']"
+"R1-[R2,P3-L4]","{'R1': 139.14713051318796, 'R2': 4629850.9504917, 'P3w': 1.986654421152103e-06, 'P3n': 0.9373079958117277, 'L4': 4.579783278040225e-21}","['R1', 'R2']",[],['L4'],"['P3w', 'P3n']"
+"[P1,P2-[R3,L4]]-R5","{'P1w': 9.503614832162238, 'P1n': 1.0, 'P2w': 932102500.0769538, 'P2n': 0.99999999985139, 'R3': 999999997.5006131, 'L4': 4.561727426090469, 'R5': 3224022.358994354}","['R3', 'R5']",[],['L4'],"['P1w', 'P1n', 'P2w', 'P2n']"
+"R1-[P2,[R3,P4]]","{'R1': 142.06322312672248, 'P2w': 1.7374203222790718e-06, 'P2n': 0.9624345575203931, 'R3': 999999999.9999995, 'P4w': 4.0628439493973436e-07, 'P4n': 0.1667769437233244}","['R1', 'R3']",[],[],"['P2w', 'P2n', 'P4w', 'P4n']"
diff --git a/autoeis/assets/circuits_unfiltered.csv b/autoeis/assets/circuits_unfiltered.csv
new file mode 100644
index 00000000..2e4ad2fe
--- /dev/null
+++ b/autoeis/assets/circuits_unfiltered.csv
@@ -0,0 +1,119 @@
+circuitstring,Parameters
+"[P1-R2,R3]","{'P1w': 1.986535009696659e-06, 'P1n': 0.9373079957705024, 'R2': 139.15131250606746, 'R3': 4629990.09507523}"
+"[P1,R2]-R3","{'P1w': 1.986654419964975e-06, 'P1n': 0.9373079958623047, 'R2': 4629850.953391226, 'R3': 139.14713061653163}"
+"P1-[L2,R3]-[P4,R5]","{'P1w': 0.007186637598734201, 'P1n': 5.5757649651288175e-18, 'L2': 1.141998475705314e-19, 'R3': 147026519.63048315, 'P4w': 1.9866544228564884e-06, 'P4n': 0.9373079956565878, 'R5': 4629850.952780835}"
+"[R1,L2]-[P3,R4]","{'R1': 575681380.7164713, 'L2': 2.552295283120748e-19, 'P3w': 2.3029244849630996e-06, 'P3n': 0.8696861394483308, 'R4': 5231046.110359364}"
+"[R1,[R2,R3]-P4]","{'R1': 3340406.185539958, 'R2': 891728744.7719296, 'R3': 421845567.34155893, 'P4w': 6.641384619399239e-05, 'P4n': 0.93695489085479}"
+"R1-P2-[P3,R4]","{'R1': 130.21245496329337, 'P2w': 2.726518813253607e-06, 'P2n': 0.8681492329761771, 'P3w': 898179842.3135369, 'P3n': 0.8671955810406204, 'R4': 109781191.8272061}"
+"[L1-R2-P3,P4]","{'L1': 7.524999998835388, 'R2': 4847243.105039916, 'P3w': 3.614916373336484e-05, 'P3n': 0.8286989771437115, 'P4w': 2.2329595598872403e-06, 'P4n': 0.8763203698281801}"
+"P1-[R2,P3-[L4,R5]]","{'P1w': 2.8062344286535294e-06, 'P1n': 0.8488456430793359, 'R2': 706160210.1336322, 'P3w': 984772769.4072356, 'P3n': 0.85061068420394, 'L4': 0.03603103951676124, 'R5': 138.55856522845784}"
+"[P1,R2]-R3","{'P1w': 1.9866544206273476e-06, 'P1n': 0.9373079958544709, 'R2': 4629850.953416649, 'R3': 139.14713046283842}"
+"[P1,L2-P3]-P4","{'P1w': 0.007216733512138039, 'P1n': 2.81566153338645e-18, 'L2': 0.03609096710348783, 'P3w': 0.002646542903039066, 'P3n': 1.5249999999999708, 'P4w': 2.8074252422833815e-06, 'P4n': 0.848834233586302}"
+"[P1-R2,R3]","{'P1w': 220744877.92529374, 'P1n': 0.09427042507446244, 'R2': 608377736.3161393, 'R3': 3319909.299871689}"
+"[L1,P2]-[P3,R4]","{'L1': 0.15678187139862657, 'P2w': 0.007111688462070404, 'P2n': 0.0009531232687701475, 'P3w': 2.0099727361290366e-06, 'P3n': 0.925568660356547, 'R4': 4710273.460775866}"
+"R1-[P2,R3]","{'R1': 139.14713051328738, 'P2w': 1.9866544217236513e-06, 'P2n': 0.9373079958333914, 'R3': 4629850.950876639}"
+"[R1-P2,R3]","{'R1': 656865633.5442209, 'P2w': 800.0335083738784, 'P2n': 0.9853932007418809, 'R3': 3318572.4498197054}"
+"[R1,P2]-R3","{'R1': 4629850.949876336, 'P2w': 1.9866544201228416e-06, 'P2n': 0.9373079956750696, 'R3': 139.14713029302203}"
+"[P1-R2,R3]","{'P1w': 1.986535011177553e-06, 'P1n': 0.9373079957796163, 'R2': 139.15131254352045, 'R3': 4629990.09732722}"
+"P1-[[[L2,R3]-P4,R5],R6]","{'P1w': 0.007186637596723201, 'P1n': 2.181217503370509e-17, 'L2': 2.7795158305591005e-19, 'R3': 178956705.5983494, 'P4w': 1.986654420095955e-06, 'P4n': 0.9373079960172214, 'R5': 4654573.380286079, 'R6': 871677637.3567853}"
+"[R1-C2,P3-[L4,R5]]","{'R1': 5072192.650099932, 'C2': 8.4626263669404e-05, 'P3w': 2.244840985220919e-06, 'P3n': 0.8751285996782849, 'L4': 2.9766689155807144e-20, 'R5': 655995652.8200465}"
+"P1-R2-[P3,R4]-[L5,R6]","{'P1w': 3.060047763952672e-05, 'P1n': 0.8656671998064308, 'R2': 139.68410290307114, 'P3w': 2.0355768962488757e-06, 'P3n': 0.9521824823343752, 'R4': 3756228.5668118354, 'L5': 3.992901235637166e-20, 'R6': 686733089.0863287}"
+"[R1,L2]-P3-[P4,R5]","{'R1': 552348954.9961827, 'L2': 5.477199431623559e-21, 'P3w': 0.0071866376060721335, 'P3n': 6.1649779750379895e-18, 'P4w': 1.9866544205226085e-06, 'P4n': 0.9373079958811735, 'R5': 4629850.952811408}"
+"R1-[R2-L3,P4]","{'R1': 139.14713070316256, 'R2': 4629850.951461096, 'L3': 4.16089662136513e-09, 'P4w': 1.9866544220375024e-06, 'P4n': 0.9373079958415903}"
+"[R1,L2-P3]-P4","{'R1': 188.9276100252854, 'L2': 0.0007108825947209154, 'P3w': 0.0024355085721782855, 'P3n': 6.789571858846744e-06, 'P4w': 2.7303296636564786e-06, 'P4n': 0.8675362425500577}"
+"P1-[P2,R3]","{'P1w': 0.007186637593470871, 'P1n': 2.2088533133164936e-17, 'P2w': 1.986654419120761e-06, 'P2n': 0.9373079958268301, 'R3': 4629850.948087294}"
+"[R1-P2,R3]","{'R1': 139.1513124659387, 'P2w': 1.986535011806426e-06, 'P2n': 0.9373079956095031, 'R3': 4629990.104102741}"
+"[P1,R2]-R3-C4","{'P1w': 1.975401306058415e-06, 'P1n': 0.9430055801968446, 'R2': 4086839.408263605, 'R3': 139.96167979375053, 'C4': 6.429085825107066e-05}"
+"[C1-R2,P3-R4]","{'C1': 1.478242913923032e-06, 'R2': 146.56715692344662, 'P3w': 5.323075136130549e-07, 'P3n': 0.22791419438536167, 'R4': 3.4640712949741957e-10}"
+"[R1,R2]-[R3-P4,[P5,R6]-P7]","{'R1': 141.21316008256093, 'R2': 124942034.1218622, 'R3': 3062765.0850987267, 'P4w': 2.320190559834662e-06, 'P4n': 0.44045398765101784, 'P5w': 1.820127328253194e-06, 'P5n': 0.9546050649708293, 'R6': 42750952.665714525, 'P7w': 613276000.2095516, 'P7n': 0.8332571755122978}"
+"R1-[R2-[R3,P4],[L5,R6]-P7]","{'R1': 141.23906880866465, 'R2': 2757765.1015891605, 'R3': 1499999987.9777336, 'P4w': 2.2882416023531487e-06, 'P4n': 0.4017278612838408, 'L5': 1.0269190149187605e-16, 'R6': 834372380.7853769, 'P7w': 1.817407466396406e-06, 'P7n': 0.954905888771501}"
+"[P1,R2-P3-R4]","{'P1w': 2.232959291365617e-06, 'P1n': 0.8763203640229478, 'R2': 2621886.5194698106, 'P3w': 3.614920549033842e-05, 'P3n': 0.8286991951653825, 'R4': 2225357.112721388}"
+"[P1,R2]-R3","{'P1w': 1.986654420475008e-06, 'P1n': 0.93730799594078, 'R2': 4629850.959250782, 'R3': 139.14713045557627}"
+"R1-[P2,R3]","{'R1': 139.14713060365597, 'P2w': 1.9866544201798177e-06, 'P2n': 0.937307995884344, 'R3': 4629850.949850612}"
+"[[R1,P2],P3]-[[R4,R5],L6]","{'R1': 999999999.9992135, 'P2w': 2.2486024813666595e-07, 'P2n': 0.042715852858139516, 'P3w': 2.2470931216776844e-06, 'P3n': 0.8747660684496594, 'R4': 161903173.38673615, 'R5': 143151165.16237673, 'L6': 8.140936917172586e-21}"
+"[P1-P2,R3]","{'P1w': 0.007186421614683248, 'P1n': 2.822738668611552e-17, 'P2w': 1.9865350118565337e-06, 'P2n': 0.937307995590296, 'R3': 4629990.092855144}"
+"P1-[P2,R3]-L4-R5","{'P1w': 3.060047791227673e-05, 'P1n': 0.8656672001651722, 'P2w': 2.0355768949833594e-06, 'P2n': 0.9521824822597936, 'R3': 3756228.5791262547, 'L4': 6.94937958919136e-21, 'R5': 139.68410298946637}"
+"[L1-P2,P3-R4]","{'L1': 1.5888006788612055e-19, 'P2w': 2.2329593012233813e-06, 'P2n': 0.8763203641744973, 'P3w': 3.614920827304423e-05, 'P3n': 0.8286992152781837, 'R4': 4847243.7221516855}"
+"[P1,R2]-R3","{'P1w': 1.9866544204135785e-06, 'P1n': 0.9373079957247575, 'R2': 4629850.948678838, 'R3': 139.14713041068788}"
+"[P1,P2]-[P3,R4]-R5","{'P1w': 1.4706292096441107e-06, 'P1n': 0.34376367445689265, 'P2w': 4.654516669629682e-06, 'P2n': 0.999999985635303, 'P3w': 2.8272405794492478e-06, 'P3n': 0.9398241617577261, 'R4': 2206492.89891646, 'R5': 141.32371538045382}"
+"[P1-R2-L3,P4-R5]","{'P1w': 2.275296946384252e-06, 'P1n': 0.4002318028024942, 'R2': 2754010.620175938, 'L3': 1.0198035850454261e-10, 'P4w': 1.8171284365025937e-06, 'P4n': 0.9549148901126632, 'R5': 141.24734637849284}"
+"[P1-R2,R3]","{'P1w': 2.098984569549625e-08, 'P1n': 0.9999999999999963, 'R2': 573739786.3097644, 'R3': 3321003.3987335074}"
+"[R1,P2]-R3","{'R1': 4629850.950489079, 'P2w': 1.986654418783627e-06, 'P2n': 0.9373079960849923, 'R3': 139.14713047605449}"
+"[R1-L2,P3-[[R4,R5],R6]]","{'R1': 609955184.3970064, 'L2': 0.0031444977982864465, 'P3w': 186056093.660555, 'P3n': 0.9377831130632818, 'R4': 734539006.0446563, 'R5': 3356271.778890835, 'R6': 524594073.0091415}"
+"[[L1,R2]-P3-C4-[R5,C6],R7]","{'L1': 4.999999878954241, 'R2': 145.0572708543285, 'P3w': 2.6624394179460344e-05, 'P3n': 0.7620593622024658, 'C4': 7.199807124129233e-06, 'R5': 3163085.682288233, 'C6': 2.468139864625004e-06, 'R7': 6160568.428667738}"
+"R1-[R2,P3-R4]","{'R1': 35.07220572671824, 'R2': 4629955.027337872, 'P3w': 1.986565107637467e-06, 'P3n': 0.9373079957841405, 'R4': 104.07726417290927}"
+"P1-R2-[P3,R4]-R5","{'P1w': 2.7265188153219155e-06, 'P1n': 0.868149232948759, 'R2': 77.43663917559485, 'P3w': 452987714.04031914, 'P3n': 0.8651039170000835, 'R4': 390587055.2351061, 'R5': 52.77581578101956}"
+"[R1,P2]-[R3,L4]","{'R1': 5231046.081811036, 'P2w': 2.3029244738823455e-06, 'P2n': 0.8696861409465443, 'R3': 255037330.77392218, 'L4': 3.48458615870188e-19}"
+"[P1,R2]-R3","{'P1w': 1.986654421287769e-06, 'P1n': 0.9373079956697399, 'R2': 4629850.948128927, 'R3': 139.1471305383522}"
+"L1-[P2,R3]-[R4,L5]-P6-R7","{'L1': 7.336357952082608e-20, 'P2w': 2.035576896057408e-06, 'P2n': 0.9521824825733203, 'R3': 3756228.5744548813, 'R4': 862734206.1976002, 'L5': 4.4767342105739886e-20, 'P6w': 3.0600477686348286e-05, 'P6n': 0.8656671995057185, 'R7': 139.68410278904608}"
+"[P1,R2]-R3","{'P1w': 1.986654420797904e-06, 'P1n': 0.9373079958624846, 'R2': 4629850.948011806, 'R3': 139.1471304537049}"
+"[R1,P2]-R3","{'R1': 4629850.944313462, 'P2w': 1.9866544183259468e-06, 'P2n': 0.9373079959458546, 'R3': 139.14713083179643}"
+"[P1-P2,R3-P4]","{'P1w': 1.80810747066919e-06, 'P1n': 0.9567733913733528, 'P2w': 0.006403530263630769, 'P2n': 0.009613595443385378, 'R3': 2663211.489720517, 'P4w': 2.091742612792224e-06, 'P4n': 0.38788778064911555}"
+"[P1,R2]-R3","{'P1w': 1.9866544216655444e-06, 'P1n': 0.9373079957860501, 'R2': 4629850.950950482, 'R3': 139.14713074426535}"
+"[R1,P2]-[P3,L4]","{'R1': 4710273.475528937, 'P2w': 2.009972736714147e-06, 'P2n': 0.9255686599735783, 'P3w': 0.007111688478589911, 'P3n': 0.0009531229984296323, 'L4': 0.1567818715601615}"
+"[[R1,R2-P3],R4]","{'R1': 4657704.173271249, 'R2': 139.15131257998814, 'P3w': 1.986535009374383e-06, 'P3n': 0.9373079958267864, 'R4': 778128772.9201634}"
+"[P1,R2]-R3","{'P1w': 1.9866544201076073e-06, 'P1n': 0.9373079957862003, 'R2': 4629850.952367045, 'R3': 139.1471304846839}"
+"[R1,R2-[P3,[C4,R5]]]","{'R1': 7147114.081603464, 'R2': 145.90078796151704, 'P3w': 5.92915365322092e-07, 'P3n': 0.4910837628422561, 'C4': 1.394896418594457e-06, 'R5': 819580271.2594645}"
+"[R1,P2]-R3","{'R1': 4629850.956180765, 'P2w': 1.9866544221018155e-06, 'P2n': 0.9373079957158876, 'R3': 139.14713058776246}"
+"[R1-P2,P3-P4]","{'R1': 2663879.876691756, 'P2w': 2.0895088650045375e-06, 'P2n': 0.38752353634694997, 'P3w': 0.0064080101593127345, 'P3n': 0.009466414768324537, 'P4w': 1.808492618839504e-06, 'P4n': 0.9567339540369166}"
+"[P1,P2-R3]-R4","{'P1w': 1.8172983928967454e-06, 'P1n': 0.9549161213807512, 'P2w': 2.275503938969737e-06, 'P2n': 0.4002444280286115, 'R3': 2753990.312617316, 'R4': 141.2402327553605}"
+"P1-[P2,R3]-R4","{'P1w': 2.726518808791454e-06, 'P1n': 0.8681492328987094, 'P2w': 510084354.02759504, 'P2n': 0.866984564484915, 'R3': 543545496.2875388, 'R4': 130.21245534654798}"
+"C1-[P2,R3]-[L4,R5]","{'C1': 6.628458756080084e-05, 'P2w': 1.9917567380562694e-06, 'P2n': 0.9332286629318175, 'R3': 4147244.4329099637, 'L4': 0.22461015979185117, 'R5': 139.64292222346782}"
+"P1-[P2,R3]","{'P1w': 2.7265188123426525e-06, 'P1n': 0.868149232840473, 'P2w': 0.007679755740912681, 'P2n': 1.3828511623984023e-16, 'R3': 847382116.7281077}"
+"[P1-R2,P3-P4-R5]","{'P1w': 1.8175280443473606e-06, 'P1n': 0.9548788447015121, 'R2': 141.238458319498, 'P3w': 2.2605360907986873e-06, 'P3n': 0.39635967656007143, 'P4w': 0.0009628897074670415, 'P4n': 0.7768554675511161, 'R5': 2753580.9167244053}"
+"C1-R2-[[P3,L4]-P5,R6]","{'C1': 6.429085816774265e-05, 'R2': 139.96167994441566, 'P3w': 927324914.9847283, 'P3n': 0.942204292961852, 'L4': 2.6690672140613865, 'P5w': 1.975401307844339e-06, 'P5n': 0.9430055802132763, 'R6': 4086839.411120082}"
+"[C1,R2]-C3-[R4,P5-R6]","{'C1': 2.886955363410058e-06, 'R2': 1484095.265399129, 'C3': 9.27383882567873e-05, 'R4': 3362688.4386531943, 'P5w': 5.1700291684344106e-06, 'P5n': 0.8958131608533371, 'R6': 139.6814119556694}"
+"R1-[P2,R3]","{'R1': 139.14713072460157, 'P2w': 1.986654421759351e-06, 'P2n': 0.9373079955379132, 'R3': 4629850.949414471}"
+"[P1-R2,R3]","{'P1w': 1.9865350127599464e-06, 'P1n': 0.9373079956077673, 'R2': 139.15131250298055, 'R3': 4629990.093933058}"
+"[P1-R2,R3]","{'P1w': 1.9865350093946752e-06, 'P1n': 0.9373079958094902, 'R2': 139.1513123881535, 'R3': 4629990.100122567}"
+"[R1,P2]-R3","{'R1': 4629850.948641628, 'P2w': 1.9866544195196855e-06, 'P2n': 0.9373079957731051, 'R3': 139.1471304723465}"
+"[R1,P2-R3]","{'R1': 3314927.351029509, 'P2w': 1.2619915575196403e-08, 'P2n': 1.5195225156265413, 'R3': 839605882.2936614}"
+"[P1-R2,R3]","{'P1w': 1.986535011187836e-06, 'P1n': 0.9373079956794794, 'R2': 139.15131253681943, 'R3': 4629990.103402648}"
+"[R1,P2-R3]","{'R1': 3318993.6960038454, 'P2w': 0.0012309889438413201, 'P2n': 0.9578932407269682, 'R3': 640769441.9660164}"
+"[R1,P2]-[L3,R4]","{'R1': 5231046.083355638, 'P2w': 2.3029244760634443e-06, 'P2n': 0.8696861408018655, 'L3': 2.24667476958042e-20, 'R4': 269864234.7310546}"
+"R1-[P2,R3]","{'R1': 139.14713045278253, 'P2w': 1.9866544203504423e-06, 'P2n': 0.9373079958161158, 'R3': 4629850.949831393}"
+"P1-[R2,P3-R4]","{'P1w': 2.7265187919229103e-06, 'P1n': 0.8681492343781227, 'R2': 130.21247298757615, 'P3w': 929794761.9309849, 'P3n': 0.5398775799491322, 'R4': 902892582.7291923}"
+"[R1,P2]-P3-[L4,R5]","{'R1': 508353445.77063453, 'P2w': 27449299.107404713, 'P2n': 0.8495854398783531, 'P3w': 2.8062344310841896e-06, 'P3n': 0.84884564273351, 'L4': 0.03603103998181308, 'R5': 138.5585367018435}"
+"[R1,P2]-R3","{'R1': 4629850.952057845, 'P2w': 1.986654421080037e-06, 'P2n': 0.9373079958431774, 'R3': 139.14713053373404}"
+"[P1-[L2,R3],R4]","{'P1w': 2.302924467541309e-06, 'P1n': 0.8696861406625583, 'L2': 2.331510898942402e-19, 'R3': 395788698.8637616, 'R4': 5231046.1391777145}"
+"R1-[P2,R3]","{'R1': 139.14713032047496, 'P2w': 1.9866544197110582e-06, 'P2n': 0.9373079956535199, 'R3': 4629850.95523476}"
+"L1-[P2,P3]-P4","{'L1': 5.631348724659867e-05, 'P2w': 0.00337330485064275, 'P2n': 1.3181235683909814e-16, 'P3w': 0.0043138621603042064, 'P3n': 1.0896330429204979e-16, 'P4w': 2.729553389701293e-06, 'P4n': 0.8674945634272905}"
+"[R1,P2]-R3","{'R1': 4629850.95212798, 'P2w': 1.9866544203238256e-06, 'P2n': 0.9373079959559908, 'R3': 139.147130530051}"
+"[R1,P2]-R3","{'R1': 4629850.951406691, 'P2w': 1.9866544211076762e-06, 'P2n': 0.9373079958821647, 'R3': 139.14713081131143}"
+"[R1-L2,[L3,R4]-P5]","{'R1': 5231045.86530769, 'L2': 7.5249999957564615, 'L3': 5.936329578730933e-20, 'R4': 542384608.5109726, 'P5w': 2.3029247214869133e-06, 'P5n': 0.8696861438065697}"
+"[R1,P2]-R3","{'R1': 4629850.95189938, 'P2w': 1.9866544210438603e-06, 'P2n': 0.9373079956351899, 'R3': 139.147130602619}"
+"[R1,P2]-R3","{'R1': 4629850.952741875, 'P2w': 1.9866544199494764e-06, 'P2n': 0.9373079958076802, 'R3': 139.1471305000629}"
+"[P1-R2,R3]","{'P1w': 1.9865350105161362e-06, 'P1n': 0.9373079958916543, 'R2': 139.1513125785908, 'R3': 4629990.09964109}"
+"[P1,R2]-R3","{'P1w': 1.9866544224337283e-06, 'P1n': 0.9373079956557138, 'R2': 4629850.945283861, 'R3': 139.1471304639056}"
+"R1-[P2,R3]","{'R1': 139.14713051228722, 'P2w': 1.9866544212627277e-06, 'P2n': 0.9373079958174674, 'R3': 4629850.95235325}"
+"[R1,P2]-R3","{'R1': 4629850.947671397, 'P2w': 1.9866544192637257e-06, 'P2n': 0.937307995958214, 'R3': 139.14713071585692}"
+"[R1-P2,[R3,P4]]-P5-L6","{'R1': 659566163.7713795, 'P2w': 689233625.7808126, 'P2n': 0.07414061607168304, 'R3': 519151601.3091496, 'P4w': 0.007687163464162865, 'P4n': 6.187916889250644e-19, 'P5w': 2.7295533862036934e-06, 'P5n': 0.8674945646518759, 'L6': 5.631347968997574e-05}"
+"R1-[P2,R3]","{'R1': 139.1471305970339, 'P2w': 1.9866544191078484e-06, 'P2n': 0.937307996052866, 'R3': 4629850.951571798}"
+"[P1-R2,P3-[R4,L5]]","{'P1w': 3.614919938058998e-05, 'P1n': 0.8286991688787145, 'R2': 4847243.696541981, 'P3w': 2.2329592928240353e-06, 'P3n': 0.8763203649257979, 'R4': 300408269.50945544, 'L5': 3.742758660169268e-19}"
+"[R1,P2-P3]-C4-R5","{'R1': 4086839.4112963774, 'P2w': 1.97540130620666e-06, 'P2n': 0.943005580162968, 'P3w': 720059265.0138572, 'P3n': 0.9368569243054821, 'C4': 6.429085821699534e-05, 'R5': 139.96167984015415}"
+"[R1-P2,R3]","{'R1': 586753245.4284022, 'P2w': 720256402.7910455, 'P2n': 0.8358847254109487, 'R3': 3320577.129726577}"
+"R1-[P2,R3]","{'R1': 139.14713047687007, 'P2w': 1.9866544220224028e-06, 'P2n': 0.9373079956027693, 'R3': 4629850.950717444}"
+"R1-[P2-R3,[L4,R5]-P6]","{'R1': 141.24023286281513, 'P2w': 2.27550393232863e-06, 'P2n': 0.4002444276409079, 'R3': 2753990.3122879867, 'L4': 9.778577835323835e-21, 'R5': 701831455.1908306, 'P6w': 1.8172983936370922e-06, 'P6n': 0.9549161213477311}"
+"R1-[R2,P3-L4]","{'R1': 139.14713051318796, 'R2': 4629850.9504917, 'P3w': 1.986654421152103e-06, 'P3n': 0.9373079958117277, 'L4': 4.579783278040225e-21}"
+"[P1,R2]-R3","{'P1w': 1.9866544192374376e-06, 'P1n': 0.9373079958368866, 'R2': 4629850.947915965, 'R3': 139.14713039828143}"
+"[P1-R2,R3]","{'P1w': 484927320.11251205, 'P1n': 0.44034623449947685, 'R2': 887219866.7925464, 'R3': 3314225.1972695445}"
+"[P1,R2]-R3","{'P1w': 1.9866544192050175e-06, 'P1n': 0.9373079958776939, 'R2': 4629850.945974767, 'R3': 139.14713045182972}"
+"[P1,[P2,[P3,R4]-R5]]","{'P1w': 2.2470931177657914e-06, 'P1n': 0.8747660680781553, 'P2w': 2.2486024870650594e-07, 'P2n': 0.04271585608097053, 'P3w': 621204717.790723, 'P3n': 0.6782346043063376, 'R4': 972431198.4472005, 'R5': 999999999.9981668}"
+"[P1,[R2,L3-P4]-P5-[R6,C7-L8]]","{'P1w': 2.253119804874191e-06, 'P1n': 0.8732442161667394, 'R2': 886290950.9438004, 'L3': 0.0017247658101483985, 'P4w': 963577070.6443596, 'P4n': 0.9537333539009033, 'P5w': 771124664.6998427, 'P5n': 0.5786848820344891, 'R6': 5186608.7587977685, 'C7': 1.8556739611778183e-08, 'L8': 0.009860087052335832}"
+"[[P1-R2,P3-R4],R5]-P6","{'P1w': 1.9865350688205285e-06, 'P1n': 0.9373079857042024, 'R2': 139.15132003645394, 'P3w': 909028263.473151, 'P3n': 0.514126126545651, 'R4': 4654858.493910734, 'R5': 855755151.0284638, 'P6w': 169.737716285277, 'P6n': 0.9999812013190588}"
+"P1-R2-L3-[P4,R5]","{'P1w': 3.060047776700008e-05, 'P1n': 0.8656672000491737, 'R2': 139.68410285230095, 'L3': 6.57215465719272e-20, 'P4w': 2.0355768962705954e-06, 'P4n': 0.9521824822248778, 'R5': 3756228.581116751}"
+"[P1,R2]-R3","{'P1w': 1.986654419760615e-06, 'P1n': 0.9373079958762898, 'R2': 4629850.947445267, 'R3': 139.14713063525465}"
+"[R1,P2-R3]","{'R1': 4629990.108511926, 'P2w': 1.986535012713702e-06, 'P2n': 0.9373079959207005, 'R3': 139.15131248288543}"
+"[R1,P2-R3]","{'R1': 4629990.094984876, 'P2w': 1.9865350129568558e-06, 'P2n': 0.9373079956064556, 'R3': 139.15131231086707}"
+"R1-[L2-R3,P4]","{'R1': 139.14713058077828, 'L2': 4.7179016403767095e-09, 'R3': 4629850.954565811, 'P4w': 1.9866544201489497e-06, 'P4n': 0.9373079959316698}"
+"[P1,P2-[R3,L4]]-R5","{'P1w': 9.503614832162238, 'P1n': 1.0, 'P2w': 932102500.0769538, 'P2n': 0.99999999985139, 'R3': 999999997.5006131, 'L4': 4.561727426090469, 'R5': 3224022.358994354}"
+"[P1,R2]-R3","{'P1w': 1.986654419024036e-06, 'P1n': 0.9373079959163314, 'R2': 4629850.9486976955, 'R3': 139.14713040477724}"
+"R1-[P2,R3]","{'R1': 139.14713067482847, 'P2w': 1.986654420023391e-06, 'P2n': 0.9373079955906576, 'R3': 4629850.950433112}"
+"[P1-R2,R3]","{'P1w': 1.9865350111508528e-06, 'P1n': 0.9373079957925347, 'R2': 139.15131257413293, 'R3': 4629990.095876444}"
+"P1-[R2,R3]-[L4,C5]-[R6,P7]","{'P1w': 695833803.0345474, 'P1n': 0.6577541181310834, 'R2': 3307425.2001328403, 'R3': 689583933.0054822, 'L4': 2.585774384707357, 'C5': 0.008999222444587545, 'R6': 226249052.70867103, 'P7w': 53.40290204129943, 'P7n': 0.9736598238131853}"
+"[R1,R2-P3]-[C4,R5]","{'R1': 146.969220606597, 'R2': 930302004.8329732, 'P3w': 532649182.8895862, 'P3n': 0.5410135738750281, 'C4': 1.6066698363423297e-06, 'R5': 4191773.45259434}"
+"[P1-[L2,P3],[[R4-C5,L6-P7],R8]]","{'P1w': 2.2534535379254496e-06, 'P1n': 0.8744535477575016, 'L2': 4.999975801304012, 'P3w': 0.0026345811449199176, 'P3n': 0.9999999333124114, 'R4': 486287686.8920995, 'C5': 3.503700537887585e-07, 'L6': 4.999991811064948, 'P7w': 2.2278651383598907e-07, 'P7n': 0.041820791634693696, 'R8': 984262411.2587428}"
+"R1-[P2,[R3,P4]]","{'R1': 142.06322312672248, 'P2w': 1.7374203222790718e-06, 'P2n': 0.9624345575203931, 'R3': 999999999.9999995, 'P4w': 4.0628439493973436e-07, 'P4n': 0.1667769437233244}"
+"[R1,P2]-R3","{'R1': 4629850.951700082, 'P2w': 1.9866544215207683e-06, 'P2n': 0.9373079957268895, 'R3': 139.14713051702412}"
+"[P1,R2]-R3","{'P1w': 1.986654419725023e-06, 'P1n': 0.9373079958645587, 'R2': 4629850.955720179, 'R3': 139.14713040805296}"
+"R1-[P2,R3]","{'R1': 139.14713051260458, 'P2w': 1.98665441825572e-06, 'P2n': 0.9373079957220549, 'R3': 4629850.956047877}"
diff --git a/autoeis/core.py b/autoeis/core.py
index 3a4911cf..29a6d8f8 100644
--- a/autoeis/core.py
+++ b/autoeis/core.py
@@ -8,7 +8,9 @@
 
     perform_full_analysis
     generate_equivalent_circuits
+    filter_implausible_circuits
     perform_bayesian_inference
+    perform_bayesian_inference_batch
     preprocess_impedance_data 
 
 """
@@ -25,7 +27,6 @@
 import pandas as pd
 import psutil
 from impedance.validation import linKK
-from jax import random
 from mpire import WorkerPool
 from numpyro.infer import MCMC, NUTS
 from scipy.optimize import curve_fit
@@ -34,10 +35,7 @@
 import autoeis.julia_helpers as julia_helpers
 import autoeis.visualization as viz
 from autoeis import io, metrics, parser, utils
-from autoeis.models import (
-    circuit_component_regression,
-    circuit_component_regression_fn_wrapped,
-)
+from autoeis.models import circuit_regression, circuit_regression_wrapped  # noqa: F401
 
 # AutoEIS datasets are not small-enough that CPU is much faster than GPU
 numpyro.set_platform("cpu")
@@ -52,7 +50,7 @@
     "perform_full_analysis",
     "preprocess_impedance_data",
     "generate_equivalent_circuits",
-    "apply_heuristic_rules",
+    "filter_implausible_circuits",
     "perform_bayesian_inference",
 ]
 
@@ -66,13 +64,13 @@ def compute_ohmic_resistance(Z: np.ndarray[complex], freq: np.ndarray[float]) ->
     Z : np.ndarray[complex]
         Impedance measurements.
     freq : np.ndarray[float]
-        Frequencies corresponding to impedance measurements.        
+        Frequencies corresponding to impedance measurements.
 
     Returns
     -------
     ohmic_resistance: float
         The ohmic resistance of impedance data.
-    
+
     Raises
     ------
     ValueError
@@ -90,8 +88,8 @@ def compute_ohmic_resistance(Z: np.ndarray[complex], freq: np.ndarray[float]) ->
     y = 1 / Z.real[:]
 
     def func(x, a, b, c):
-        return (a*x + b) / (x + c)
-    
+        return (a * x + b) / (x + c)
+
     fallback = False
     bounds = ([0, -np.inf, -np.inf], np.inf)
 
@@ -100,7 +98,7 @@ def func(x, a, b, c):
         R = 1 / a
     except RuntimeError:
         fallback = True
-    if R < 0 or R < 0.2*Z.real[0]:
+    if R < 0 or R < 0.2 * Z.real[0]:
         fallback = True
     if fallback:
         R = Z.real[0]
@@ -108,6 +106,7 @@ def func(x, a, b, c):
     return R
 
 
+# TODO: Needs heavy refactoring
 def preprocess_impedance_data(
     impedance: np.ndarray[complex],
     freq: np.ndarray[float],
@@ -226,7 +225,9 @@ def preprocess_impedance_data(
             ohmic_resistance = compute_ohmic_resistance(Z_mask, freq_mask)
             ohmic_resistance_found = True
         except ValueError:
-            log.error("Ohmic resistance not found. Check data or increase KK threshold.")
+            log.error(
+                "Ohmic resistance not found. Check data or increase KK threshold."
+            )
             ohmic_resistance_found = False
 
         # Convert the data to a dataframe for easier manipulation
@@ -258,7 +259,7 @@ def generate_equivalent_circuits(
     population_size: int = 100,
     seed: int = None,
 ) -> pd.DataFrame:
-    """Generate potential ECMs using evolutionary algorithms.
+    """Generates candidate circuits that fit impedance data using genetic algorithm.
 
     Parameters
     ----------
@@ -284,13 +285,13 @@ def generate_equivalent_circuits(
     Returns
     -------
     pd.DataFrame or None
-        DataFrame containing ECM solutions or None if no solutions are found.
+        Dataframe containing circuits.
     """
     log.info("Generating equivalent circuits via evolutionary algorithms.")
 
     # Set the seed for reproducibility (if not set, use current time in nanoseconds)
     seed = seed or time.time_ns() % 2**32
-        
+
     ec_kwargs = {
         "head": complexity,
         "terminals": "RLP",
@@ -312,14 +313,13 @@ def generate_equivalent_circuits(
 
 
 def _generate_ecm_serial(impedance, freq, iters, ec_kwargs, seed):
-    """Generates candidate circuit models in serial."""
+    """Generates candidate circuits in serial."""
     Main = julia_helpers.init_julia()
     ec = julia_helpers.import_backend(Main)
 
-    # Set random seed for reproducibility (Python and Julia)
-    np.random.seed(seed)
-    Main.eval(f"import Random; Random.seed!({seed})")            
-    
+    # Set random seed for reproducibility
+    Main.eval(f"import Random; Random.seed!({seed})")
+
     circuits = []
     for _ in tqdm(range(iters), desc="Circuit Evolution"):
         try:
@@ -339,13 +339,12 @@ def _generate_ecm_serial(impedance, freq, iters, ec_kwargs, seed):
 
 # TODO: This function is deprecated, use _generate_ecm_parallel_julia instead
 def _generate_ecm_parallel_mpire(impedance, freq, iters, ec_kwargs, seed):
-    """Generates candidate circuit models in parallel via Python multiprocessing."""
+    """Generates candidate circuits in parallel via Python multiprocessing."""
 
     def circuit_evolution(seed: int):
         """Closure to generate a single circuit to be used with multiprocessing."""
         Main = julia_helpers.init_julia()
-        # Set random seed for reproducibility (Python and Julia)
-        np.random.seed(seed)
+        # Set random seed for reproducibility
         Main.eval(f"import Random; Random.seed!({seed})")
         ec = julia_helpers.import_backend(Main)
         try:
@@ -368,7 +367,7 @@ def circuit_evolution(seed: int):
 
     # Julia cannot be initialized in the main process -> guard against this
     runtime_error = False
-    
+
     # Set a different seed for each process
     seed = [seed + i for i in range(iters)]
 
@@ -379,7 +378,9 @@ def circuit_evolution(seed: int):
             runtime_error = True
 
     if runtime_error:
-        raise RuntimeError("Julia must not be manually initialized, restart the kernel.")
+        raise RuntimeError(
+            "Julia must not be manually initialized, restart the kernel."
+        )
 
     # Remove None values
     circuits = [circuit for circuit in circuits if circuit is not None]
@@ -391,11 +392,10 @@ def circuit_evolution(seed: int):
 
 
 def _generate_ecm_parallel_julia(impedance, freq, iters, ec_kwargs, seed):
-    """Generates candidate circuit models in parallel directly from Julia."""
+    """Generates candidate circuits in parallel using Julia multiprocessing."""
     Main = julia_helpers.init_julia()
     # Set random seed for reproducibility (Python and Julia)
     # FIXME: This doesn't work when multiprocessing, use @everywhere instead
-    np.random.seed(seed)
     Main.eval(f"import Random; Random.seed!({seed})")
     Main.eval("import Logging; Logging.disable_logging(Logging.Warn)")
     ec = julia_helpers.import_backend(Main)
@@ -415,7 +415,9 @@ def _generate_ecm_parallel_julia(impedance, freq, iters, ec_kwargs, seed):
         sys.stderr.flush()
         for iters_ in iters_chunked:
             try:
-                circuits_ = ec.circuit_evolution_batch(impedance, freq, **ec_kwargs, iters=iters_)
+                circuits_ = ec.circuit_evolution_batch(
+                    impedance, freq, **ec_kwargs, iters=iters_
+                )
             except Exception as e:
                 log.error(f"Error generating circuits: {e}")
                 circuits_ = []
@@ -423,7 +425,7 @@ def _generate_ecm_parallel_julia(impedance, freq, iters, ec_kwargs, seed):
             pbar.update(iters_)
             # HACK: Flush every iteration to refresh progress bar
             sys.stderr.flush()
-   
+
     # Format output as list of strings since Julia objects cannot be pickled
     circuits_py = []
     for circuit in circuits:
@@ -437,7 +439,7 @@ def _generate_ecm_parallel_julia(impedance, freq, iters, ec_kwargs, seed):
 
 
 def split_components(circuits: pd.DataFrame) -> pd.DataFrame:
-    """Adds an individual column for each component in the circuit with its value."""
+    """Augments the circuits dataframe with additional columns for each component."""
     # Initialize lists to populate the component columns later
     components = {"R": [], "C": [], "L": [], "P": []}
     labels = {"R": "Resistors", "C": "Capacitors", "L": "Inductors", "P": "CPEs"}
@@ -458,18 +460,7 @@ def split_components(circuits: pd.DataFrame) -> pd.DataFrame:
 
 
 def capacitance_filter(circuits: pd.DataFrame) -> pd.DataFrame:
-    """Exclude ideal capacitors from the circuits dataframe.
-
-    Parameters
-    ----------
-    circuits: pd.DataFrame
-       Dataframe containing ECMs (6 columns)
-
-    Returns
-    -------
-    df_circuits: pd.DataFrame
-       Dataframe containing ECMs without ideal capacitors (6 columns)
-    """
+    """Excludes ideal capacitors from the circuits dataframe."""
     circuits = circuits.copy()
 
     for row in circuits.itertuples():
@@ -483,7 +474,7 @@ def capacitance_filter(circuits: pd.DataFrame) -> pd.DataFrame:
 
 
 def ohmic_resistance_filter(circuits: pd.DataFrame) -> pd.DataFrame:
-    """Filters the circuits that don't have ohmic resistance in the main chain."""
+    """Excludes circuits without an ohmic resistance from the circuits dataframe."""
     circuits = circuits.copy()
 
     for row in circuits.itertuples():
@@ -497,7 +488,7 @@ def ohmic_resistance_filter(circuits: pd.DataFrame) -> pd.DataFrame:
 
 
 def series_filter(circuits: pd.DataFrame) -> pd.DataFrame:
-    """Filters out circuits without any components connected in parallel."""
+    """Excludes circuits with series-only components from the circuits dataframe."""
     circuits = circuits.copy()
 
     for row in circuits.itertuples():
@@ -511,19 +502,19 @@ def series_filter(circuits: pd.DataFrame) -> pd.DataFrame:
 
 
 def merge_identical_circuits(circuits: "pd.DataFrame") -> "pd.DataFrame":
-    """Merges identical circuits (removes rows with equivalent circuits)."""
+    """Merges identical circuits from the circuits dataframe."""
     circuits = circuits.copy()
 
     for i, row_i in circuits.iterrows():
         circuit_i = row_i.circuitstring
-        for j, row_j in circuits.loc[i+1:].iterrows():
+        for j, row_j in circuits.loc[i + 1 :].iterrows():
             if utils.are_circuits_equivalent(circuit_i, row_j.circuitstring):
                 circuits.drop(j, inplace=True)
 
     circuits.reset_index(drop=True, inplace=True)
     return circuits
- 
- 
+
+
 def perform_bayesian_inference(
     circuit: str,
     Z: np.ndarray[complex],
@@ -532,10 +523,10 @@ def perform_bayesian_inference(
     num_warmup=1000,
     num_samples=1000,
     num_chains=1,
-    seed: int = None,
+    seed: Union[int, jax.Array] = None,
     progress_bar: bool = True,
-) -> numpyro.infer.mcmc.MCMC:
-    """Performs Bayesian inference on the circuit based on EIS measurements.
+) -> tuple[numpyro.infer.mcmc.MCMC, int]:
+    """Performs Bayesian inference on the circuit based on impedance data.
 
     Parameters
     ----------
@@ -547,64 +538,147 @@ def perform_bayesian_inference(
         Frequency data.
     p0 : Union[np.ndarray[float], dict[str, float]], optional
         Initial guess for the circuit parameters (default is None).
-    seed : int, optional
+    seed : Union[int, jax.Array], optional
         Random seed for reproducibility (default is None).
-        
+
     Returns
     -------
-    mcmc : numpyro.infer.mcmc.MCMC
-        MCMC object.
+    tuple(numpyro.infer.mcmc.MCMC, int)
+        MCMC object and exit code (0 if successful, -1 if failed).
     """
     log.info("Performing Bayesian inference on the circuit {circuit}.")
 
-    # Set the seed for reproducibility (if not set, use current time in nanoseconds)
-    seed = seed or time.time_ns() % 2**32
-    np.random.seed(seed)
-    rng_key = random.PRNGKey(seed)
+    # If the seed is already set using JAX, use it
+    assert isinstance(seed, (int, jax.Array, type(None)))
+    if isinstance(seed, jax.Array) and len(seed) == 2:
+        subkey = seed
+    # If seed is int -> use it, else generate a new seed using time
+    else:
+        seed = time.time_ns() % 2**32 if seed is None else seed
+        key = jax.random.PRNGKey(seed)
+        key, subkey = jax.random.split(key)
 
     # Deal with initial values for the circuit parameters
     if p0 is None:
         p0 = utils.fit_circuit_parameters(circuit, Z, freq)
     assert isinstance(p0, dict), "p0 must be a dictionary"
 
-    circuit_fn = utils.generate_circuit_fn(circuit)
-    circuit_fn = jax.jit(circuit_fn)
+    circuit_fn = utils.generate_circuit_fn(circuit, jit=True)
 
     # Compute prior predictive distribution using the initial guess
     priors = utils.initialize_priors(p0, variables=p0.keys())
-    rng_key, rng_subkey = random.split(rng_key)   
-    # nuts_kernel = NUTS(circuit_component_regression)
     nuts_kernel = NUTS(
-        model=circuit_component_regression_fn_wrapped,
-        init_strategy=numpyro.infer.init_to_median
+        model=circuit_regression_wrapped,
+        init_strategy=numpyro.infer.init_to_median,
     )
     kwargs_mcmc = {
         "num_samples": num_samples,
         "num_warmup": num_warmup,
         "num_chains": num_chains,
-        "progress_bar": progress_bar
+        "progress_bar": progress_bar,
     }
     mcmc = MCMC(nuts_kernel, **kwargs_mcmc)
-    rng_key, rng_subkey = jax.random.split(rng_key)
-    # kwargs_inference = {"Z": Z, "freq": freq, "priors": priors, "circuit": circuit}
-    kwargs_inference = {"Z": Z, "freq": freq, "priors": priors, "circuit_fn": circuit_fn}
-    mcmc.run(rng_subkey, **kwargs_inference)
+    kwargs_inference = {
+        "Z": Z,
+        "freq": freq,
+        "priors": priors,
+        "circuit_fn": circuit_fn,
+    }
+
+    try:
+        mcmc.run(subkey, **kwargs_inference)
+    except RuntimeError:
+        log.error(f"Inference failed for circuit: {circuit}")
+        return mcmc, -1
+    return mcmc, 0
+
+
+def perform_bayesian_inference_batch(
+    circuits: Union[pd.DataFrame, list],
+    Z: np.ndarray[complex],
+    freq: np.ndarray[float],
+    p0: list[dict[str, float]] = None,
+    num_warmup=2500,
+    num_samples=1000,
+    num_chains=1,
+    seed: Union[int, jax.Array] = None,
+    progress_bar=True,
+):
+    """Performs Bayesian inference on a list of circuits in parallel.
 
-    return mcmc
+    Parameters
+    ----------
+    circuits : pd.DataFrame or list[str]
+        Dataframe containing circuits or list of circuit strings.
+    Z : np.ndarray[complex]
+        Complex impedance data.
+    freq: np.ndarray[float]
+        Frequency data.
+    p0 : list[dict[str, float]], optional
+        Initial guess for the circuit parameters (default is None).
+    seed : int, optional
+        Random seed for reproducibility (default is None).
 
+    Returns
+    -------
+    list[tuple[numpyro.infer.mcmc.MCMC, int]]
+        List of MCMC objects and exit codes (0 if successful, -1 if failed).
+    """
+    if len(circuits) == 0:
+        log.warning("Circuits' dataframe is empty!")
+        return []
 
-def apply_heuristic_rules(circuits: pd.DataFrame) -> pd.DataFrame:
+    # Validate inputs
+    if isinstance(circuits, pd.DataFrame):
+        utils.validate_circuits_dataframe(circuits)
+        p0 = circuits["Parameters"].tolist() if p0 is None else p0
+        circuits = circuits["circuitstring"].tolist()
+    assert all(isinstance(circuit, str) for circuit in circuits)
+
+    # Generate a random seed for each circuit
+    N = len(circuits)
+    seed = seed or time.time_ns() % 2**32
+    key = jax.random.PRNGKey(seed)
+    key, *subkeys = jax.random.split(key, N + 1)
+
+    # Multiprocessing requires all inputs to be iterables of the same length
+    bi_kwargs = {
+        "circuits": circuits,
+        "Z": [Z] * N,
+        "freq": [freq] * N,
+        "p0": p0 if isinstance(p0, list) else [p0] * N,
+        "num_warmup": [num_warmup] * N,
+        "num_samples": [num_samples] * N,
+        "num_chains": [num_chains] * N,
+        "seed": subkeys,
+        "progress_bar": [False] * N,
+    }
+
+    # Perform Bayesian inference in parallel
+    with WorkerPool(use_dill=True) as pool:
+        mcmcs = pool.map(
+            perform_bayesian_inference,
+            zip(*bi_kwargs.values()),
+            progress_bar=progress_bar,
+            progress_bar_style="notebook",
+            iterable_len=len(circuits),
+        )
+
+    return mcmcs
+
+
+def filter_implausible_circuits(circuits: pd.DataFrame) -> pd.DataFrame:
     """Apply heuristic rules to filter the generated ECMs.
 
     Parameters
     ----------
     circuits : pd.DataFrame
-        DataFrame containing the generated ECMs.
+        Dataframe containing circuits.
 
     Returns
     -------
     circuits : pd.DataFrame
-        DataFrame containing the filtered ECMs.
+        Dataframe containing circuits (filtered for plausibility)
     """
     log.info("Filtering the circuits using heuristic rules.")
 
@@ -618,6 +692,15 @@ def apply_heuristic_rules(circuits: pd.DataFrame) -> pd.DataFrame:
     circuits = ohmic_resistance_filter(circuits)
     circuits = merge_identical_circuits(circuits)
 
+    # Drop the columns added by split_components
+    circuits = circuits.drop(columns=["Resistors", "Capacitors", "Inductors", "CPEs"])
+
+    if len(circuits) == 0:
+        log.warning(
+            "No plausible circuits found. Increase `iters` or `tol` and rerun"
+            " `generate_equivalent_circuits`"
+        )
+
     return circuits
 
 
@@ -626,9 +709,13 @@ def perform_full_analysis(
     freq: np.ndarray[float],
     iters: int = 100,
     parallel: bool = True,
+    linKK_threshold: float = 5e-2,
+    tol: float = 1e-2,
+    num_warmup: int = 2500,
+    num_samples: int = 1000,
 ) -> pd.DataFrame:
-    """Performs automated EIS analysis by generating plausible ECMs
-    followed by Bayesian inference on component values.
+    """Performs automated EIS analysis by generating plausible ECMs that
+    fit the impedance data, followed by Bayesian inference on components.
 
     Parameters
     ----------
@@ -640,35 +727,37 @@ def perform_full_analysis(
         Number of iterations for ECM generation. Default is 100.
     parallel : bool, optional
         If True, the ECM generation will be done in parallel. Default is True.
+    linKK_threshold : float, optional
+        Threshold for the Lin-KK validation. Default is 5e-2.
+    tol : float, optional
+        Convergence threshold for the ECM generation. Default is 1e-2.
+    num_warmup : int, optional
+        Number of warmup samples for the MCMC. Default is 2500.
+    num_samples : int, optional
+        Number of samples for the MCMC. Default is 1000.
 
     Returns
     -------
     results: pd.DataFrame
-        Dataframe containing plausible ECMs with Bayesian inference results.
+        Dataframe containing circuits, parameters, and MCMC results.
     """
     # Filter out bad impedance data
-    Z, freq, rmse = preprocess_impedance_data(Z, freq, threshold=0.05)
-    
+    Z, freq, rmse = preprocess_impedance_data(Z, freq, threshold=linKK_threshold)
+
     # Generate a pool of potential ECMs via an evolutionary algorithm
-    kwargs = {"iters": iters, "complexity": 12, "tol": 1e-2, "parallel": parallel}
+    kwargs = {"iters": iters, "complexity": 12, "tol": tol, "parallel": parallel}
     circuits_unfiltered = generate_equivalent_circuits(Z, freq, **kwargs)
 
     # Apply heuristic rules to filter unphysical circuits
-    circuits = apply_heuristic_rules(circuits_unfiltered)
+    circuits = filter_implausible_circuits(circuits_unfiltered)
 
     # Perform Bayesian inference on the filtered ECMs
-    mcmc_list = []
-
-    for row in tqdm(circuits.itertuples(), total=len(circuits), desc="Bayesian Inference"):
-        circuit = row.circuitstring
-        p0_dict = row.Parameters
-        # Get another set of initial guesses using impedance.py (not guaranteed to converge)
-        p0_fit = utils.fit_circuit_parameters(circuit, Z, freq, p0=p0_dict)
-        kwargs_mcmc = {"num_warmup": 2500, "num_samples": 1000, "progress_bar": False}
-        mcmc = perform_bayesian_inference(circuit, Z, freq, p0_fit, **kwargs_mcmc)
-        mcmc_list.append(mcmc)
+    kwargs_mcmc = {"num_warmup": num_warmup, "num_samples": num_samples}
+    mcmcs = perform_bayesian_inference_batch(circuits, Z, freq, **kwargs_mcmc)
 
     # Add the results to the circuits dataframe as a new column
-    circuits["MCMC"] = mcmc_list
+    chains, status = zip(*mcmcs)
+    circuits["MCMC (chain)"] = chains
+    circuits["MCMC (status)"] = status
 
     return circuits
diff --git a/autoeis/io.py b/autoeis/io.py
index 753a2211..308e8339 100644
--- a/autoeis/io.py
+++ b/autoeis/io.py
@@ -8,6 +8,7 @@
 
     get_assets_path
     load_test_dataset
+    load_test_circuits
     parse_ec_output
 
 """
@@ -35,10 +36,21 @@ def load_test_dataset() -> tuple[np.ndarray[complex], np.ndarray[float]]:
     fpath = os.path.join(PATH, "test_data.txt")
     freq, Zreal, Zimag = np.loadtxt(fpath, skiprows=1, unpack=True, usecols=(0, 1, 2))
     # Convert to complex impedance (the file contains -Im(Z) hence the minus sign)
-    Z = Zreal - 1j*Zimag
+    Z = Zreal - 1j * Zimag
     return Z, freq
 
 
+def load_test_circuits(filtered=False) -> pd.DataFrame:
+    """Returns equivalent circuits fitted to test dataset for testing."""
+    PATH = get_assets_path()
+    fname = "circuits_filtered.csv" if filtered else "circuits_unfiltered.csv"
+    fpath = os.path.join(PATH, fname)
+    circuits = pd.read_csv(fpath)
+    # Convert stringified list to proper Python objects
+    circuits["Parameters"] = circuits["Parameters"].apply(eval)
+    return circuits
+
+
 def parse_ec_output(circuits: pd.DataFrame) -> pd.DataFrame:
     """
     Parses the output of EquivalentCircuits.jl's ``circuit_evolution``
@@ -55,5 +67,5 @@ def parse_ec_output(circuits: pd.DataFrame) -> pd.DataFrame:
         pdict = {pair.split("=")[0]: float(pair.split("=")[1]) for pair in pstr}
         # Replace the stringified list with a proper dict
         circuits.at[row.Index, "Parameters"] = pdict
-    
+
     return circuits
diff --git a/autoeis/models.py b/autoeis/models.py
index 7c2ba627..84c82816 100644
--- a/autoeis/models.py
+++ b/autoeis/models.py
@@ -6,8 +6,8 @@
 .. autosummary::
    :toctree: generated/
 
-    circuit_component_regression
-    circuit_component_regression_fn_wrapped
+    circuit_regression
+    circuit_regression_wrapped
 
 """
 import jax
@@ -19,7 +19,7 @@
 from autoeis import utils
 
 
-def circuit_component_regression(
+def circuit_regression(
     Z: np.ndarray[complex],
     freq: np.ndarray[float],
     priors: dict[str, dist.Distribution],
@@ -39,7 +39,7 @@ def circuit_component_regression(
     numpyro.sample("obs_imag", dist.Normal(Z_pred.imag, sigma_imag), obs=Z.imag)
 
 
-def circuit_component_regression_fn_wrapped(
+def circuit_regression_wrapped(
     Z: np.ndarray[complex],
     freq: np.ndarray[float],
     priors: dict[str, dist.Distribution],
diff --git a/autoeis/parser.py b/autoeis/parser.py
index dcbb4163..66c9de9a 100644
--- a/autoeis/parser.py
+++ b/autoeis/parser.py
@@ -107,7 +107,7 @@ def get_parameter_labels(circuit: str, types: list[str] = None) -> list[str]:
 
 
 def get_parameter_types(circuit: str, unique: bool = False) -> list[str]:
-    """Returns a list of parameter types in a circuit string."""        
+    """Returns a list of parameter types in a circuit string."""
     ptypes = [parse_parameter(p) for p in get_parameter_labels(circuit)]
     return list(set(ptypes)) if unique else ptypes
 
@@ -161,7 +161,7 @@ def cleanup(lst: list, chars: list[str]):
                 if el.strip(chars):
                     result.append(el.strip(chars))
         return result
-   
+
     def parse(circuit: str):
         # Enclose circuit with brackets to make it a valid nested expression
         circuit = f"[{circuit}]"
@@ -186,38 +186,59 @@ def find_ohmic_resistors(circuit: list) -> list[str]:
     """Finds all ohmic resistors in a nested circuit expression."""
     series_elements = find_series_elements(circuit)
     return re.findall(r"R\d+", str(series_elements))
-  
 
-def generate_mathematical_expr(circuit:str) -> str:
-    """Converts a circuit string to a mathematical expression.
-    
-    Each variable in the expression is the impedance of the
-    corresponding component.
+
+def generate_mathematical_expr(circuit: str) -> str:
+    """Converts a circuit string to a mathematical expression for impedance.
+     
+    The returned string can be evaluated assuming 'x' is an array of
+    component values and 'f' is the frequency (scalar/array).
     """
+    # Apply series-parallel conversion, e.g., [R1,R2] -> (1/R1+1/R2)**(-1)
     replacements = {
         "-": "+",
         "[": "((",
         ",": ")**(-1)+(",
         "]": ")**(-1))**(-1)"
     }
+    expr = circuit
     for j, k in replacements.items():
-        circuit = circuit.replace(j, k)
-    return circuit
+        expr = expr.replace(j, k)
+
+    # Embed impedance expressions, e.g., C1 -> (1/(2*1j*pi*f*C1))
+    expr = replace_components_with_impedance(expr)
 
+    # Replace parameters with array indexing, e.g., R1, P2w, P2n -> x[0], x[1], x[2]
+    parameters = get_parameter_labels(circuit)    
+    for i, var in enumerate(parameters):
+        expr = expr.replace(var, f"x[{i}]", 1)
+    
+    return expr
+
+
+def replace_components_with_impedance(expr: str) -> str:
+    """Updates the circuit expression with the impedance of the components.
+    
+    Notes
+    -----
+    The impedance expressions are described 'parameter' labels, not 'component'
+    labels, although the two are often the same (except for components defined
+    by more than one parameter). For example, a CPE element P1 has impedance
+    expression as a function of of P1w and P1n.
+    """
 
-def embed_impedance_expr(circuit_expr: str) -> str:
-    """Updates the circuit expression with the impedance of a component."""
     def replacement(var):
         eltype = get_component_types(var)[0]
         return {
             "R": f"{var}",
-            "C": f"(1/(2*1j*pi*F*{var}))",
-            "L": f"(2*1j*pi*F*{var})",
-            "P": f"(1/({var}w*(2*1j*pi*F)**{var}n))"
+            "C": f"(1/(2*1j*pi*f*{var}))",
+            "L": f"(2*1j*pi*f*{var})",
+            "P": f"(1/({var}w*(2*1j*pi*f)**{var}n))",
         }[eltype]
+
     # Get component lables
-    components = get_component_labels(circuit_expr)
-    # Replace components with impedance expression, e.g., C1 -> (1/(2*1j*pi*F*C1))
+    components = get_component_labels(expr)
+    # Replace components with impedance expression, e.g., C1 -> (1/(2*1j*pi*f*C1))
     for c in components:
-        circuit_expr = circuit_expr.replace(c, replacement(c))
-    return circuit_expr
+        expr = expr.replace(c, replacement(c))
+    return expr
diff --git a/autoeis/utils.py b/autoeis/utils.py
index 914154ac..f874199a 100644
--- a/autoeis/utils.py
+++ b/autoeis/utils.py
@@ -13,6 +13,7 @@
     are_circuits_equivalent
     initialize_priors
     initialize_priors_from_posteriors
+    validate_circuits_dataframe
 
 """
 import logging
@@ -21,14 +22,14 @@
 import signal
 import sys
 from collections.abc import Iterable
-from functools import wraps
+from functools import partial, wraps
 from typing import Union
 
 import jax  # NOQA: F401
 import jax.numpy as jnp
 import numpy as np
 import numpyro.distributions as dist
-import rich.traceback
+import pandas as pd
 from impedance.models.circuits import CustomCircuit
 from numpy import pi  # NOQA: F401
 from rich.logging import RichHandler
@@ -39,13 +40,14 @@
 
 # >>> Logging utils
 
+
 def get_logger(name: str) -> logging.Logger:
     """Get a logger with the given name."""
     logger = logging.getLogger(name)
     if logger.hasHandlers():
         # If logger has handlers, do not add another to avoid duplicate logs
         return logger
-    
+
     logger.setLevel(logging.WARNING)
     handler = RichHandler(rich_tracebacks=True)
     handler.setFormatter(logging.Formatter("%(message)s", datefmt="[%X]"))
@@ -53,17 +55,15 @@ def get_logger(name: str) -> logging.Logger:
     return logger
 
 
-def setup_rich_tracebacks():
-    """Set up rich traceback for nicer exception printing."""
-    rich.traceback.install()
-
 # <<< Logging utils
 
 
 # >>> General utils
 
+
 def flatten(xs: list) -> list:
     """Returns a list of all elements in a nested iterable."""
+
     def _flatten(xs):
         """Returns a generator that flattens a nested iterable."""
         for x in xs:
@@ -71,6 +71,7 @@ def _flatten(xs):
                 yield from flatten(x)
             else:
                 yield x
+
     return list(_flatten(xs))
 
 
@@ -81,7 +82,7 @@ def find_identical_rows(a: np.ndarray) -> list[list[int]]:
     for i in range(a.shape[0]):
         if i not in flatten(idx):
             idx.append([i])
-        for j in range(i+1, a.shape[0]):
+        for j in range(i + 1, a.shape[0]):
             if np.allclose(a[i, :], a[j, :]):
                 idx[-1].append(j)
     return idx
@@ -91,8 +92,8 @@ class _SuppressOutput:
     def __enter__(self):
         self._original_stdout = sys.stdout
         self._original_stderr = sys.stderr
-        sys.stdout = open(os.devnull, 'w')
-        sys.stderr = open(os.devnull, 'w')
+        sys.stdout = open(os.devnull, "w")
+        sys.stderr = open(os.devnull, "w")
 
     def __exit__(self, exc_type, exc_val, exc_tb):
         sys.stdout.close()
@@ -103,18 +104,22 @@ def __exit__(self, exc_type, exc_val, exc_tb):
 
 def suppress_output(func):
     """Suppresses the output of a function."""
+
     @wraps(func)
     def wrapped(*args, **kwargs):
         with _SuppressOutput():
             return func(*args, **kwargs)
+
     return wrapped
 
 
 class TimeoutException(Exception):
     pass
 
+
 def timeout(seconds):
     """Raises a TimeoutException if decorated function doesn't return in time."""
+
     def decorator(func):
         def _handle_timeout(signum, frame):
             raise TimeoutException("Didn't converge in time!")
@@ -132,19 +137,22 @@ def wrapper(*args, **kwargs):
             return result
 
         return wrapper
+
     return decorator
 
+
 # <<< General utils
 
 
 # >>> Circuit utils
 
+
 def fit_circuit_parameters(
     circuit: str,
     Z: np.ndarray[complex],
     freq: np.ndarray[float],
     p0: Union[np.ndarray[float], dict[str, float]] = None,
-    iters: int = 1
+    iters: int = 1,
 ) -> dict[str, float]:
     """Fits a circuit to impedance data and returns the parameters."""
     # Deal with initial guess
@@ -157,14 +165,13 @@ def fit_circuit_parameters(
 
     # Fit circuit parameters
     circuit_impy = CustomCircuit(
-        circuit=parser.convert_to_impedance_format(circuit),
-        initial_guess=p0
+        circuit=parser.convert_to_impedance_format(circuit), initial_guess=p0
     )
     # HACK: Use multiple random initial guesses to avoid local minima
     err_min = np.inf
     for _ in range(iters):
         circuit_impy.fit(freq, Z)
-        err = np.mean(np.abs(circuit_impy.predict(freq) - Z)**2)
+        err = np.mean(np.abs(circuit_impy.predict(freq) - Z) ** 2)
         if err < err_min:
             err_min = err
             p0 = circuit_impy.parameters_
@@ -173,29 +180,21 @@ def fit_circuit_parameters(
     labels = parser.get_parameter_labels(circuit)
     return dict(zip(labels, p0))
 
+
 # FIXME: Timeout logic doesn't work on Windows -> module 'signal' has no attribute 'SIGALRM'.
 if os.name != "nt":
     fit_circuit_parameters = timeout(300)(fit_circuit_parameters)
 
 
-def generate_circuit_fn(
-    circuit: str,
-    return_str: bool = False,
-    label: str = "X",
-) -> Union[callable, str]:
-    assert isinstance(circuit, str), "Circuit must be a string."
-    """Converts a circuit string to a function of (params, freq)"""
-    # Apply series-parallel conversion, e.g., [R1,R2] -> (1/R1+1/R2)**(-1)
-    circuit_expr = parser.generate_mathematical_expr(circuit)
-    # Embed impedance expressions, e.g., C1 -> (1/(2*1j*pi*F*C1))
-    circuit_expr = parser.embed_impedance_expr(circuit_expr)
-    # Replace variables with array indexing, e.g., R1, P2w, P2n -> X[0], X[1], X[2]
-    variables = parser.get_parameter_labels(circuit)
-    for i, var in enumerate(variables):
-        circuit_expr = circuit_expr.replace(var, f"{label}[{i}]", 1)
-    if return_str:
-        return circuit_expr
-    return lambda X, F: eval(circuit_expr)
+def eval_circuit(circuit: str, x: np.ndarray[float], f: np.ndarray[float]) -> np.ndarray:
+    """Converts a circuit string to a function of (params, freq) and evaluates it."""
+    Z_expr = parser.generate_mathematical_expr(circuit)
+    return eval(Z_expr)
+
+
+def generate_circuit_fn(circuit: str, jit=False):
+    fn = partial(eval_circuit, circuit)
+    return jax.jit(fn) if jit else fn
 
 
 def generate_circuit_fn_impedance_backend(circuit: str) -> callable:
@@ -206,17 +205,20 @@ def generate_circuit_fn_impedance_backend(circuit: str) -> callable:
     # Convert circuit string to function
     p0 = np.full(num_params, np.nan)
     circuit = CustomCircuit(circuit, initial_guess=p0)
+
     def func(params, freq):
         circuit.parameters_ = params
         return circuit.predict(freq)
+
     return func
 
 
 def circuit_complexity(circuit: str) -> list[int]:
     """Computes the component complexity of the circuit."""
+
     def increment(arr):
         """Add one to each element in a nested list."""
-        return [increment(e) if isinstance(e, list) else e+1 for e in arr]
+        return [increment(e) if isinstance(e, list) else e + 1 for e in arr]
 
     def depth(arr: list):
         """Compute the depth of each element in a nested list."""
@@ -242,9 +244,10 @@ def split(arr: list, chars: list[str]):
 
 def are_circuits_equivalent(circuit1: str, circuit2: str) -> bool:
     """Checks if two circuit strings are equivalent."""
-    def x0(circuit:str) -> np.ndarray[float]:
+
+    def x0(circuit: str) -> np.ndarray[float]:
         """Custom x0 to test if two circuits are equivalent by comparing Z(x0).
-        
+
         The idea is that if two circuits are equivalent, then Z(x0) should be
         the same for both circuits, given that x0 corresponds to the same
         component values in both circuits. Since the order of the components
@@ -264,14 +267,15 @@ def x0(circuit:str) -> np.ndarray[float]:
     Z2 = generate_circuit_fn(circuit2)(x0(circuit2), freq)
     return np.allclose(Z1, Z2)
 
+
 # <<< Circuit utils
 
 
 # >>> Statistics utils
 
+
 def initialize_priors(
-    p0: dict[str, float],
-    variables: list[str]
+    p0: dict[str, float], variables: list[str]
 ) -> dict[str, dist.Distribution]:
     """Initializes priors for a given circuit."""
     priors = {}
@@ -302,17 +306,19 @@ def initialize_priors_from_posteriors(
         if "n" in var:
             # Exponent of CPE elements is bounded between 0 and 1
             loc, scale = stats.norm.fit(samples)
-            priors[var] = dist.TruncatedNormal(loc=loc, scale=1*scale, low=0, high=1)
+            priors[var] = dist.TruncatedNormal(loc=loc, scale=1 * scale, low=0, high=1)
         # Fit data to a log-normal distribution for all other parameters
         else:
             # NOTE: s and scale in scipy.stats -> scale and np.exp(loc) in numpyro
             # NOTE: above conversion is only valid when loc = 0
             if dist_type == "lognormal":
                 s, loc, scale = stats.lognorm.fit(samples, floc=0)
-                priors[var] = dist.LogNormal(loc=np.log(scale), scale=8*s)
+                priors[var] = dist.LogNormal(loc=np.log(scale), scale=8 * s)
             elif dist_type == "normal":
                 loc, scale = stats.norm.fit(samples)
-                priors[var] = dist.TruncatedNormal(loc=loc, scale=1*scale, low=0, high=np.inf)
+                priors[var] = dist.TruncatedNormal(
+                    loc=loc, scale=1 * scale, low=0, high=np.inf
+                )
             elif dist_type == "weibull":
                 c, loc, scale = stats.weibull_min.fit(samples, floc=1)
                 priors[var] = dist.Weibull(scale=scale, concentration=c)
@@ -323,4 +329,27 @@ def initialize_priors_from_posteriors(
                 raise ValueError(f"Unknown distribution: {dist_type}")
     return priors
 
+
 # <<< Statistics utils
+
+
+# >>> Miscellaneous utils
+
+
+def validate_circuits_dataframe(circuits: pd.DataFrame):
+    """Validates the circuits dataframe format (columns and dtype)."""
+    # Check if the dataframe has the required columns
+    required_columns = ["circuitstring", "Parameters"]
+    missing = set(required_columns).difference(circuits.columns)
+    assert not missing, f"Missing columns: {missing}"
+    # Check if the circuitstring column contains only strings
+    assert (
+        circuits["circuitstring"].apply(lambda x: isinstance(x, str)).all()
+    ), "circuitstring column must contain only strings."
+    # Check if the Parameters column contains only dictionaries
+    assert (
+        circuits["Parameters"].apply(lambda x: isinstance(x, dict)).all()
+    ), "Parameters column must contain only dictionaries."
+
+
+# <<< Miscellaneous utils
diff --git a/autoeis/visualization.py b/autoeis/visualization.py
index dd0f18cb..bc115d39 100644
--- a/autoeis/visualization.py
+++ b/autoeis/visualization.py
@@ -47,13 +47,13 @@ def is_ipython_notebook() -> bool:  # pragma: no cover
     """Returns True if the code is running in a Jupyter notebook, False otherwise."""
     try:
         shell = get_ipython().__class__.__name__
-        if shell == 'ZMQInteractiveShell':
-            return True     # Jupyter notebook or qtconsole
-        if shell == 'TerminalInteractiveShell':
-            return False    # Terminal running IPython
-        return False        # Other type (?)
+        if shell == "ZMQInteractiveShell":
+            return True  # Jupyter notebook or qtconsole
+        if shell == "TerminalInteractiveShell":
+            return False  # Terminal running IPython
+        return False  # Other type (?)
     except NameError:
-        return False        # Probably standard Python interpreter
+        return False  # Probably standard Python interpreter
 
 
 def rich_print(*args, **kwargs):
@@ -136,7 +136,7 @@ def plot_impedance_combo(
     Z: np.ndarray[complex],
     freq: np.ndarray[float],
     size: int = 10,
-    ax: list[plt.Axes]=None
+    ax: list[plt.Axes] = None,
 ) -> tuple[plt.Figure, list[plt.Axes]]:
     """Plots EIS data in Nyquist and Bode plots."""
     Re_Z = Z.real
@@ -154,7 +154,7 @@ def plot_impedance_combo(
 
     # Bode plot (magnitude) <- Re(Z)
     ax1 = ax[1]
-    ax1.scatter(freq, Re_Z, s=size, color='blue', label=r'$Re(Z)$')
+    ax1.scatter(freq, Re_Z, s=size, color="blue", label=r"$Re(Z)$")
     ax1.set_xscale("log")
     ax1.set_xlabel("freq (Hz)")
     ax1.set_ylabel(r"$Re(Z) / \Omega$")
@@ -162,13 +162,13 @@ def plot_impedance_combo(
 
     # Bode plot (phase) <- Im(Z)
     ax2 = ax1.twinx()  # instantiate a second y-axis sharing the same x-axis
-    ax2.scatter(freq, -Im_Z, s=size, color='red', label=r'$-Im(Z)$')
+    ax2.scatter(freq, -Im_Z, s=size, color="red", label=r"$-Im(Z)$")
     ax2.set_ylabel(r"$-Im(Z) / \Omega$")
     ax2.yaxis.label.set_color("red")
     # Don't show grid lines for the second y-axis (ax1 already has them)
     ax2.grid(False)
     fig.tight_layout()
-    
+
     return ax[0].figure, ax
 
 
@@ -187,7 +187,7 @@ def plot_linKK_residuals(
     ax.set_ylabel("delta %")
     ax.set_xscale("log")
     ax.set_title("Lin-KK validation")
-    ax.ticklabel_format(axis='y', style='sci', scilimits=(-2, 2))
+    ax.ticklabel_format(axis="y", style="sci", scilimits=(-2, 2))
     ax.legend()
     return ax.figure, ax
 
@@ -237,7 +237,7 @@ def override_mpl_colors(override_named_colors: bool = True):
         "purple": "#8B7EC8",
         "yellow": "#D0A215",
         "cyan": "#3AA99F",
-        "magenta": "#CE5D97"
+        "magenta": "#CE5D97",
     }
 
     # Override default named colors
@@ -270,9 +270,7 @@ def override_mpl_colors(override_named_colors: bool = True):
 
 
 def set_plot_style(
-    use_arviz: bool = True,
-    use_seaborn: bool = True,
-    use_flexoki: bool = True
+    use_arviz: bool = True, use_seaborn: bool = True, use_flexoki: bool = True
 ):
     """Modifies the default arviz/matplotlib config for prettier plots."""
     # Arviz
@@ -290,7 +288,13 @@ def set_plot_style(
     legend_size = label_size - 1
 
     plt.rcParams["font.family"] = "sans-serif"
-    plt.rcParams["font.sans-serif"] = ["Helvetica", "Arial", "Verdana", "Tahoma", "DejaVu Sans"]
+    plt.rcParams["font.sans-serif"] = [
+        "Helvetica",
+        "Arial",
+        "Verdana",
+        "Tahoma",
+        "DejaVu Sans",
+    ]
     plt.rcParams["mathtext.fontset"] = "dejavuserif"
     plt.rcParams["xtick.labelsize"] = tick_size
     plt.rcParams["ytick.labelsize"] = tick_size
@@ -306,7 +310,8 @@ def set_plot_style(
     # Set up Jupyter notebook
     try:
         import IPython
-        IPython.display.set_matplotlib_formats('retina')
+
+        IPython.display.set_matplotlib_formats("retina")
     except ImportError:
         pass
 
diff --git a/examples/autoeis_demo.ipynb b/examples/autoeis_demo.ipynb
index 5bb0637f..e8296d04 100644
--- a/examples/autoeis_demo.ipynb
+++ b/examples/autoeis_demo.ipynb
@@ -38,7 +38,6 @@
     "import pandas as pd\n",
     "import seaborn as sns\n",
     "from IPython.display import display\n",
-    "from tqdm.notebook import tqdm\n",
     "\n",
     "import autoeis as ae\n",
     "from autoeis import julia_helpers\n",
@@ -176,20 +175,6 @@
    "execution_count": 5,
    "metadata": {},
    "outputs": [
-    {
-     "data": {
-      "application/vnd.jupyter.widget-view+json": {
-       "model_id": "c0946df14c3542b98e109140664761d1",
-       "version_major": 2,
-       "version_minor": 0
-      },
-      "text/plain": [
-       "Circuit Evolution:   0%|          | 0/24 [00:00<?, ?it/s]"
-      ]
-     },
-     "metadata": {},
-     "output_type": "display_data"
-    },
     {
      "data": {
       "text/html": [
@@ -218,180 +203,92 @@
        "  <tbody>\n",
        "    <tr>\n",
        "      <th>0</th>\n",
-       "      <td>R1-[P2,R3]</td>\n",
-       "      <td>{'R1': 139.14713059888192, 'P2w': 1.9866544193...</td>\n",
+       "      <td>[P1-R2,R3]</td>\n",
+       "      <td>{'P1w': 1.986535009696659e-06, 'P1n': 0.937307...</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>1</th>\n",
-       "      <td>R1-[R2,P3]</td>\n",
-       "      <td>{'R1': 139.1471305850334, 'R2': 4629850.954866...</td>\n",
+       "      <td>[P1,R2]-R3</td>\n",
+       "      <td>{'P1w': 1.986654419964975e-06, 'P1n': 0.937307...</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>2</th>\n",
-       "      <td>R1-[L2,R3]-[P4,P5]</td>\n",
-       "      <td>{'R1': 142.06139721718435, 'L2': 8.43681910105...</td>\n",
+       "      <td>P1-[L2,R3]-[P4,R5]</td>\n",
+       "      <td>{'P1w': 0.007186637598734201, 'P1n': 5.5757649...</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>3</th>\n",
-       "      <td>[P1,R2]-R3</td>\n",
-       "      <td>{'P1w': 1.9866544197335516e-06, 'P1n': 0.93730...</td>\n",
+       "      <td>[R1,L2]-[P3,R4]</td>\n",
+       "      <td>{'R1': 575681380.7164713, 'L2': 2.552295283120...</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>4</th>\n",
-       "      <td>[R1-P2,P3-R4]</td>\n",
-       "      <td>{'R1': 141.2473462865248, 'P2w': 1.81712843813...</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>5</th>\n",
-       "      <td>[R1-P2,P3-R4]</td>\n",
-       "      <td>{'R1': 2754010.655590384, 'P2w': 2.27529707151...</td>\n",
+       "      <td>[R1,[R2,R3]-P4]</td>\n",
+       "      <td>{'R1': 3340406.185539958, 'R2': 891728744.7719...</td>\n",
        "    </tr>\n",
        "    <tr>\n",
-       "      <th>6</th>\n",
-       "      <td>P1-R2-[P3,[P4,R5]]</td>\n",
-       "      <td>{'P1w': 5.28017526126197e-05, 'P1n': 0.8001289...</td>\n",
+       "      <th>...</th>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
        "    </tr>\n",
        "    <tr>\n",
-       "      <th>7</th>\n",
-       "      <td>P1-[P2,R3]</td>\n",
-       "      <td>{'P1w': 2.7265188029432905e-06, 'P1n': 0.86814...</td>\n",
+       "      <th>113</th>\n",
+       "      <td>[P1-[L2,P3],[[R4-C5,L6-P7],R8]]</td>\n",
+       "      <td>{'P1w': 2.2534535379254496e-06, 'P1n': 0.87445...</td>\n",
        "    </tr>\n",
        "    <tr>\n",
-       "      <th>8</th>\n",
-       "      <td>[P1,L2]-[P3-R4,P5]</td>\n",
-       "      <td>{'P1w': 0.0068072596635226305, 'P1n': 0.004033...</td>\n",
+       "      <th>114</th>\n",
+       "      <td>R1-[P2,[R3,P4]]</td>\n",
+       "      <td>{'R1': 142.06322312672248, 'P2w': 1.7374203222...</td>\n",
        "    </tr>\n",
        "    <tr>\n",
-       "      <th>9</th>\n",
-       "      <td>[[R1,P2],R3]-R4</td>\n",
-       "      <td>{'R1': 4656579.086437493, 'P2w': 1.98665442036...</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>10</th>\n",
-       "      <td>[P1-R2,R3]</td>\n",
-       "      <td>{'P1w': 1.9865350114849734e-06, 'P1n': 0.93730...</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>11</th>\n",
-       "      <td>R1-[P2,R3]</td>\n",
-       "      <td>{'R1': 139.14713052587953, 'P2w': 1.9866544198...</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>12</th>\n",
-       "      <td>[P1-[L2,R3],R4]</td>\n",
-       "      <td>{'P1w': 2.3029244842871657e-06, 'P1n': 0.86968...</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>13</th>\n",
-       "      <td>[[P1,P2-R3],R4]</td>\n",
-       "      <td>{'P1w': 2.302924497337585e-06, 'P1n': 0.869686...</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>14</th>\n",
-       "      <td>R1-[R2,P3]-P4</td>\n",
-       "      <td>{'R1': 139.68410281993843, 'R2': 3756228.57499...</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>15</th>\n",
-       "      <td>[R1,[P2,C3-R4]-[R5,[R6,L7]]]</td>\n",
-       "      <td>{'R1': 8584535.611040385, 'P2w': 2.23090725482...</td>\n",
+       "      <th>115</th>\n",
+       "      <td>[R1,P2]-R3</td>\n",
+       "      <td>{'R1': 4629850.951700082, 'P2w': 1.98665442152...</td>\n",
        "    </tr>\n",
        "    <tr>\n",
-       "      <th>16</th>\n",
-       "      <td>[R1-P2,R3-P4]-[P5,L6]</td>\n",
-       "      <td>{'R1': 2724875.0402365704, 'P2w': 2.2168999612...</td>\n",
+       "      <th>116</th>\n",
+       "      <td>[P1,R2]-R3</td>\n",
+       "      <td>{'P1w': 1.986654419725023e-06, 'P1n': 0.937307...</td>\n",
        "    </tr>\n",
        "    <tr>\n",
-       "      <th>17</th>\n",
+       "      <th>117</th>\n",
        "      <td>R1-[P2,R3]</td>\n",
-       "      <td>{'R1': 139.14713045352516, 'P2w': 1.9866544183...</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>18</th>\n",
-       "      <td>[R1,L2]-[R3-L4,P5]</td>\n",
-       "      <td>{'R1': 991910816.6759088, 'L2': 1.490342058091...</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>19</th>\n",
-       "      <td>[L1,R2]-[P3,R4]</td>\n",
-       "      <td>{'L1': 8.156807374110227e-19, 'R2': 412855315....</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>20</th>\n",
-       "      <td>[P1-R2,R3]</td>\n",
-       "      <td>{'P1w': 1.9865350096583837e-06, 'P1n': 0.93730...</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>21</th>\n",
-       "      <td>[P1-R2,R3]</td>\n",
-       "      <td>{'P1w': 3.230466244494574e-08, 'P1n': 0.973660...</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>22</th>\n",
-       "      <td>[R1,P2]-R3</td>\n",
-       "      <td>{'R1': 4629850.958279881, 'P2w': 1.98665441804...</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>23</th>\n",
-       "      <td>[R1,P2]-R3</td>\n",
-       "      <td>{'R1': 4629850.949071481, 'P2w': 1.98665441956...</td>\n",
+       "      <td>{'R1': 139.14713051260458, 'P2w': 1.9866544182...</td>\n",
        "    </tr>\n",
        "  </tbody>\n",
        "</table>\n",
+       "<p>118 rows × 2 columns</p>\n",
        "</div>"
       ],
       "text/plain": [
-       "                   circuitstring  \\\n",
-       "0                     R1-[P2,R3]   \n",
-       "1                     R1-[R2,P3]   \n",
-       "2             R1-[L2,R3]-[P4,P5]   \n",
-       "3                     [P1,R2]-R3   \n",
-       "4                  [R1-P2,P3-R4]   \n",
-       "5                  [R1-P2,P3-R4]   \n",
-       "6             P1-R2-[P3,[P4,R5]]   \n",
-       "7                     P1-[P2,R3]   \n",
-       "8             [P1,L2]-[P3-R4,P5]   \n",
-       "9                [[R1,P2],R3]-R4   \n",
-       "10                    [P1-R2,R3]   \n",
-       "11                    R1-[P2,R3]   \n",
-       "12               [P1-[L2,R3],R4]   \n",
-       "13               [[P1,P2-R3],R4]   \n",
-       "14                 R1-[R2,P3]-P4   \n",
-       "15  [R1,[P2,C3-R4]-[R5,[R6,L7]]]   \n",
-       "16         [R1-P2,R3-P4]-[P5,L6]   \n",
-       "17                    R1-[P2,R3]   \n",
-       "18            [R1,L2]-[R3-L4,P5]   \n",
-       "19               [L1,R2]-[P3,R4]   \n",
-       "20                    [P1-R2,R3]   \n",
-       "21                    [P1-R2,R3]   \n",
-       "22                    [R1,P2]-R3   \n",
-       "23                    [R1,P2]-R3   \n",
+       "                       circuitstring  \\\n",
+       "0                         [P1-R2,R3]   \n",
+       "1                         [P1,R2]-R3   \n",
+       "2                 P1-[L2,R3]-[P4,R5]   \n",
+       "3                    [R1,L2]-[P3,R4]   \n",
+       "4                    [R1,[R2,R3]-P4]   \n",
+       "..                               ...   \n",
+       "113  [P1-[L2,P3],[[R4-C5,L6-P7],R8]]   \n",
+       "114                  R1-[P2,[R3,P4]]   \n",
+       "115                       [R1,P2]-R3   \n",
+       "116                       [P1,R2]-R3   \n",
+       "117                       R1-[P2,R3]   \n",
+       "\n",
+       "                                            Parameters  \n",
+       "0    {'P1w': 1.986535009696659e-06, 'P1n': 0.937307...  \n",
+       "1    {'P1w': 1.986654419964975e-06, 'P1n': 0.937307...  \n",
+       "2    {'P1w': 0.007186637598734201, 'P1n': 5.5757649...  \n",
+       "3    {'R1': 575681380.7164713, 'L2': 2.552295283120...  \n",
+       "4    {'R1': 3340406.185539958, 'R2': 891728744.7719...  \n",
+       "..                                                 ...  \n",
+       "113  {'P1w': 2.2534535379254496e-06, 'P1n': 0.87445...  \n",
+       "114  {'R1': 142.06322312672248, 'P2w': 1.7374203222...  \n",
+       "115  {'R1': 4629850.951700082, 'P2w': 1.98665442152...  \n",
+       "116  {'P1w': 1.986654419725023e-06, 'P1n': 0.937307...  \n",
+       "117  {'R1': 139.14713051260458, 'P2w': 1.9866544182...  \n",
        "\n",
-       "                                           Parameters  \n",
-       "0   {'R1': 139.14713059888192, 'P2w': 1.9866544193...  \n",
-       "1   {'R1': 139.1471305850334, 'R2': 4629850.954866...  \n",
-       "2   {'R1': 142.06139721718435, 'L2': 8.43681910105...  \n",
-       "3   {'P1w': 1.9866544197335516e-06, 'P1n': 0.93730...  \n",
-       "4   {'R1': 141.2473462865248, 'P2w': 1.81712843813...  \n",
-       "5   {'R1': 2754010.655590384, 'P2w': 2.27529707151...  \n",
-       "6   {'P1w': 5.28017526126197e-05, 'P1n': 0.8001289...  \n",
-       "7   {'P1w': 2.7265188029432905e-06, 'P1n': 0.86814...  \n",
-       "8   {'P1w': 0.0068072596635226305, 'P1n': 0.004033...  \n",
-       "9   {'R1': 4656579.086437493, 'P2w': 1.98665442036...  \n",
-       "10  {'P1w': 1.9865350114849734e-06, 'P1n': 0.93730...  \n",
-       "11  {'R1': 139.14713052587953, 'P2w': 1.9866544198...  \n",
-       "12  {'P1w': 2.3029244842871657e-06, 'P1n': 0.86968...  \n",
-       "13  {'P1w': 2.302924497337585e-06, 'P1n': 0.869686...  \n",
-       "14  {'R1': 139.68410281993843, 'R2': 3756228.57499...  \n",
-       "15  {'R1': 8584535.611040385, 'P2w': 2.23090725482...  \n",
-       "16  {'R1': 2724875.0402365704, 'P2w': 2.2168999612...  \n",
-       "17  {'R1': 139.14713045352516, 'P2w': 1.9866544183...  \n",
-       "18  {'R1': 991910816.6759088, 'L2': 1.490342058091...  \n",
-       "19  {'L1': 8.156807374110227e-19, 'R2': 412855315....  \n",
-       "20  {'P1w': 1.9865350096583837e-06, 'P1n': 0.93730...  \n",
-       "21  {'P1w': 3.230466244494574e-08, 'P1n': 0.973660...  \n",
-       "22  {'R1': 4629850.958279881, 'P2w': 1.98665441804...  \n",
-       "23  {'R1': 4629850.949071481, 'P2w': 1.98665441956...  "
+       "[118 rows x 2 columns]"
       ]
      },
      "execution_count": 5,
@@ -401,7 +298,7 @@
    ],
    "source": [
     "kwargs = {\n",
-    "    \"iters\": 24,\n",
+    "    \"iters\": 120,\n",
     "    \"complexity\": 12,\n",
     "    \"population_size\": 100,\n",
     "    \"generations\": 30,\n",
@@ -463,67 +360,211 @@
        "  <tbody>\n",
        "    <tr>\n",
        "      <th>0</th>\n",
-       "      <td>R1-[P2,R3]</td>\n",
-       "      <td>{'R1': 139.14713059888192, 'P2w': 1.9866544193...</td>\n",
-       "      <td>[R1, R3]</td>\n",
+       "      <td>[P1,R2]-R3</td>\n",
+       "      <td>{'P1w': 1.986654419964975e-06, 'P1n': 0.937307...</td>\n",
+       "      <td>['R2', 'R3']</td>\n",
        "      <td>[]</td>\n",
        "      <td>[]</td>\n",
-       "      <td>[P2w, P2n]</td>\n",
+       "      <td>['P1w', 'P1n']</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>1</th>\n",
-       "      <td>R1-[L2,R3]-[P4,P5]</td>\n",
-       "      <td>{'R1': 142.06139721718435, 'L2': 8.43681910105...</td>\n",
-       "      <td>[R1, R3]</td>\n",
+       "      <td>R1-P2-[P3,R4]</td>\n",
+       "      <td>{'R1': 130.21245496329337, 'P2w': 2.7265188132...</td>\n",
+       "      <td>['R1', 'R4']</td>\n",
        "      <td>[]</td>\n",
-       "      <td>[L2]</td>\n",
-       "      <td>[P4w, P4n, P5w, P5n]</td>\n",
+       "      <td>[]</td>\n",
+       "      <td>['P2w', 'P2n', 'P3w', 'P3n']</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>2</th>\n",
-       "      <td>P1-R2-[P3,[P4,R5]]</td>\n",
-       "      <td>{'P1w': 5.28017526126197e-05, 'P1n': 0.8001289...</td>\n",
-       "      <td>[R2, R5]</td>\n",
-       "      <td>[]</td>\n",
+       "      <td>P1-R2-[P3,R4]-[L5,R6]</td>\n",
+       "      <td>{'P1w': 3.060047763952672e-05, 'P1n': 0.865667...</td>\n",
+       "      <td>['R2', 'R4', 'R6']</td>\n",
        "      <td>[]</td>\n",
-       "      <td>[P1w, P1n, P3w, P3n, P4w, P4n]</td>\n",
+       "      <td>['L5']</td>\n",
+       "      <td>['P1w', 'P1n', 'P3w', 'P3n']</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>3</th>\n",
-       "      <td>[[R1,P2],R3]-R4</td>\n",
-       "      <td>{'R1': 4656579.086437493, 'P2w': 1.98665442036...</td>\n",
-       "      <td>[R1, R3, R4]</td>\n",
+       "      <td>R1-[R2-L3,P4]</td>\n",
+       "      <td>{'R1': 139.14713070316256, 'R2': 4629850.95146...</td>\n",
+       "      <td>['R1', 'R2']</td>\n",
        "      <td>[]</td>\n",
-       "      <td>[]</td>\n",
-       "      <td>[P2w, P2n]</td>\n",
+       "      <td>['L3']</td>\n",
+       "      <td>['P4w', 'P4n']</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>4</th>\n",
-       "      <td>R1-[R2,P3]-P4</td>\n",
-       "      <td>{'R1': 139.68410281993843, 'R2': 3756228.57499...</td>\n",
-       "      <td>[R1, R2]</td>\n",
+       "      <td>R1-[R2-[R3,P4],[L5,R6]-P7]</td>\n",
+       "      <td>{'R1': 141.23906880866465, 'R2': 2757765.10158...</td>\n",
+       "      <td>['R1', 'R2', 'R3', 'R6']</td>\n",
+       "      <td>[]</td>\n",
+       "      <td>['L5']</td>\n",
+       "      <td>['P4w', 'P4n', 'P7w', 'P7n']</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>5</th>\n",
+       "      <td>P1-[P2,R3]-L4-R5</td>\n",
+       "      <td>{'P1w': 3.060047791227673e-05, 'P1n': 0.865667...</td>\n",
+       "      <td>['R3', 'R5']</td>\n",
+       "      <td>[]</td>\n",
+       "      <td>['L4']</td>\n",
+       "      <td>['P1w', 'P1n', 'P2w', 'P2n']</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>6</th>\n",
+       "      <td>[P1,P2]-[P3,R4]-R5</td>\n",
+       "      <td>{'P1w': 1.4706292096441107e-06, 'P1n': 0.34376...</td>\n",
+       "      <td>['R4', 'R5']</td>\n",
+       "      <td>[]</td>\n",
+       "      <td>[]</td>\n",
+       "      <td>['P1w', 'P1n', 'P2w', 'P2n', 'P3w', 'P3n']</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>7</th>\n",
+       "      <td>R1-[R2,P3-R4]</td>\n",
+       "      <td>{'R1': 35.07220572671824, 'R2': 4629955.027337...</td>\n",
+       "      <td>['R1', 'R2', 'R4']</td>\n",
+       "      <td>[]</td>\n",
+       "      <td>[]</td>\n",
+       "      <td>['P3w', 'P3n']</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>8</th>\n",
+       "      <td>P1-R2-[P3,R4]-R5</td>\n",
+       "      <td>{'P1w': 2.7265188153219155e-06, 'P1n': 0.86814...</td>\n",
+       "      <td>['R2', 'R4', 'R5']</td>\n",
        "      <td>[]</td>\n",
        "      <td>[]</td>\n",
-       "      <td>[P3w, P3n, P4w, P4n]</td>\n",
+       "      <td>['P1w', 'P1n', 'P3w', 'P3n']</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>9</th>\n",
+       "      <td>L1-[P2,R3]-[R4,L5]-P6-R7</td>\n",
+       "      <td>{'L1': 7.336357952082608e-20, 'P2w': 2.0355768...</td>\n",
+       "      <td>['R3', 'R4', 'R7']</td>\n",
+       "      <td>[]</td>\n",
+       "      <td>['L1', 'L5']</td>\n",
+       "      <td>['P2w', 'P2n', 'P6w', 'P6n']</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>10</th>\n",
+       "      <td>[P1,P2-R3]-R4</td>\n",
+       "      <td>{'P1w': 1.8172983928967454e-06, 'P1n': 0.95491...</td>\n",
+       "      <td>['R3', 'R4']</td>\n",
+       "      <td>[]</td>\n",
+       "      <td>[]</td>\n",
+       "      <td>['P1w', 'P1n', 'P2w', 'P2n']</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>11</th>\n",
+       "      <td>R1-[P2-R3,[L4,R5]-P6]</td>\n",
+       "      <td>{'R1': 141.24023286281513, 'P2w': 2.2755039323...</td>\n",
+       "      <td>['R1', 'R3', 'R5']</td>\n",
+       "      <td>[]</td>\n",
+       "      <td>['L4']</td>\n",
+       "      <td>['P2w', 'P2n', 'P6w', 'P6n']</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>12</th>\n",
+       "      <td>R1-[R2,P3-L4]</td>\n",
+       "      <td>{'R1': 139.14713051318796, 'R2': 4629850.95049...</td>\n",
+       "      <td>['R1', 'R2']</td>\n",
+       "      <td>[]</td>\n",
+       "      <td>['L4']</td>\n",
+       "      <td>['P3w', 'P3n']</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>13</th>\n",
+       "      <td>[P1,P2-[R3,L4]]-R5</td>\n",
+       "      <td>{'P1w': 9.503614832162238, 'P1n': 1.0, 'P2w': ...</td>\n",
+       "      <td>['R3', 'R5']</td>\n",
+       "      <td>[]</td>\n",
+       "      <td>['L4']</td>\n",
+       "      <td>['P1w', 'P1n', 'P2w', 'P2n']</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>14</th>\n",
+       "      <td>R1-[P2,[R3,P4]]</td>\n",
+       "      <td>{'R1': 142.06322312672248, 'P2w': 1.7374203222...</td>\n",
+       "      <td>['R1', 'R3']</td>\n",
+       "      <td>[]</td>\n",
+       "      <td>[]</td>\n",
+       "      <td>['P2w', 'P2n', 'P4w', 'P4n']</td>\n",
        "    </tr>\n",
        "  </tbody>\n",
        "</table>\n",
        "</div>"
       ],
       "text/plain": [
-       "        circuitstring                                         Parameters  \\\n",
-       "0          R1-[P2,R3]  {'R1': 139.14713059888192, 'P2w': 1.9866544193...   \n",
-       "1  R1-[L2,R3]-[P4,P5]  {'R1': 142.06139721718435, 'L2': 8.43681910105...   \n",
-       "2  P1-R2-[P3,[P4,R5]]  {'P1w': 5.28017526126197e-05, 'P1n': 0.8001289...   \n",
-       "3     [[R1,P2],R3]-R4  {'R1': 4656579.086437493, 'P2w': 1.98665442036...   \n",
-       "4       R1-[R2,P3]-P4  {'R1': 139.68410281993843, 'R2': 3756228.57499...   \n",
+       "                 circuitstring  \\\n",
+       "0                   [P1,R2]-R3   \n",
+       "1                R1-P2-[P3,R4]   \n",
+       "2        P1-R2-[P3,R4]-[L5,R6]   \n",
+       "3                R1-[R2-L3,P4]   \n",
+       "4   R1-[R2-[R3,P4],[L5,R6]-P7]   \n",
+       "5             P1-[P2,R3]-L4-R5   \n",
+       "6           [P1,P2]-[P3,R4]-R5   \n",
+       "7                R1-[R2,P3-R4]   \n",
+       "8             P1-R2-[P3,R4]-R5   \n",
+       "9     L1-[P2,R3]-[R4,L5]-P6-R7   \n",
+       "10               [P1,P2-R3]-R4   \n",
+       "11       R1-[P2-R3,[L4,R5]-P6]   \n",
+       "12               R1-[R2,P3-L4]   \n",
+       "13          [P1,P2-[R3,L4]]-R5   \n",
+       "14             R1-[P2,[R3,P4]]   \n",
        "\n",
-       "      Resistors Capacitors Inductors                            CPEs  \n",
-       "0      [R1, R3]         []        []                      [P2w, P2n]  \n",
-       "1      [R1, R3]         []      [L2]            [P4w, P4n, P5w, P5n]  \n",
-       "2      [R2, R5]         []        []  [P1w, P1n, P3w, P3n, P4w, P4n]  \n",
-       "3  [R1, R3, R4]         []        []                      [P2w, P2n]  \n",
-       "4      [R1, R2]         []        []            [P3w, P3n, P4w, P4n]  "
+       "                                           Parameters  \\\n",
+       "0   {'P1w': 1.986654419964975e-06, 'P1n': 0.937307...   \n",
+       "1   {'R1': 130.21245496329337, 'P2w': 2.7265188132...   \n",
+       "2   {'P1w': 3.060047763952672e-05, 'P1n': 0.865667...   \n",
+       "3   {'R1': 139.14713070316256, 'R2': 4629850.95146...   \n",
+       "4   {'R1': 141.23906880866465, 'R2': 2757765.10158...   \n",
+       "5   {'P1w': 3.060047791227673e-05, 'P1n': 0.865667...   \n",
+       "6   {'P1w': 1.4706292096441107e-06, 'P1n': 0.34376...   \n",
+       "7   {'R1': 35.07220572671824, 'R2': 4629955.027337...   \n",
+       "8   {'P1w': 2.7265188153219155e-06, 'P1n': 0.86814...   \n",
+       "9   {'L1': 7.336357952082608e-20, 'P2w': 2.0355768...   \n",
+       "10  {'P1w': 1.8172983928967454e-06, 'P1n': 0.95491...   \n",
+       "11  {'R1': 141.24023286281513, 'P2w': 2.2755039323...   \n",
+       "12  {'R1': 139.14713051318796, 'R2': 4629850.95049...   \n",
+       "13  {'P1w': 9.503614832162238, 'P1n': 1.0, 'P2w': ...   \n",
+       "14  {'R1': 142.06322312672248, 'P2w': 1.7374203222...   \n",
+       "\n",
+       "                   Resistors Capacitors     Inductors  \\\n",
+       "0               ['R2', 'R3']         []            []   \n",
+       "1               ['R1', 'R4']         []            []   \n",
+       "2         ['R2', 'R4', 'R6']         []        ['L5']   \n",
+       "3               ['R1', 'R2']         []        ['L3']   \n",
+       "4   ['R1', 'R2', 'R3', 'R6']         []        ['L5']   \n",
+       "5               ['R3', 'R5']         []        ['L4']   \n",
+       "6               ['R4', 'R5']         []            []   \n",
+       "7         ['R1', 'R2', 'R4']         []            []   \n",
+       "8         ['R2', 'R4', 'R5']         []            []   \n",
+       "9         ['R3', 'R4', 'R7']         []  ['L1', 'L5']   \n",
+       "10              ['R3', 'R4']         []            []   \n",
+       "11        ['R1', 'R3', 'R5']         []        ['L4']   \n",
+       "12              ['R1', 'R2']         []        ['L4']   \n",
+       "13              ['R3', 'R5']         []        ['L4']   \n",
+       "14              ['R1', 'R3']         []            []   \n",
+       "\n",
+       "                                          CPEs  \n",
+       "0                               ['P1w', 'P1n']  \n",
+       "1                 ['P2w', 'P2n', 'P3w', 'P3n']  \n",
+       "2                 ['P1w', 'P1n', 'P3w', 'P3n']  \n",
+       "3                               ['P4w', 'P4n']  \n",
+       "4                 ['P4w', 'P4n', 'P7w', 'P7n']  \n",
+       "5                 ['P1w', 'P1n', 'P2w', 'P2n']  \n",
+       "6   ['P1w', 'P1n', 'P2w', 'P2n', 'P3w', 'P3n']  \n",
+       "7                               ['P3w', 'P3n']  \n",
+       "8                 ['P1w', 'P1n', 'P3w', 'P3n']  \n",
+       "9                 ['P2w', 'P2n', 'P6w', 'P6n']  \n",
+       "10                ['P1w', 'P1n', 'P2w', 'P2n']  \n",
+       "11                ['P2w', 'P2n', 'P6w', 'P6n']  \n",
+       "12                              ['P3w', 'P3n']  \n",
+       "13                ['P1w', 'P1n', 'P2w', 'P2n']  \n",
+       "14                ['P2w', 'P2n', 'P4w', 'P4n']  "
       ]
      },
      "execution_count": 6,
@@ -532,7 +573,7 @@
     }
    ],
    "source": [
-    "circuits = ae.core.apply_heuristic_rules(circuits_unfiltered)\n",
+    "circuits = ae.core.filter_implausible_circuits(circuits_unfiltered)\n",
     "# Let's save the filtered circuits to a CSV file as well\n",
     "circuits.to_csv(\"circuits_filtered.csv\", index=False)\n",
     "# To load from file, uncomment the next 2 lines (line 2 is to convert str -> Python objects)\n",
@@ -552,49 +593,27 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 22,
+   "execution_count": 7,
    "metadata": {},
    "outputs": [
     {
      "data": {
       "application/vnd.jupyter.widget-view+json": {
-       "model_id": "5202ad54c7c24bd2bc2ffe7092586fd4",
+       "model_id": "d7ef751d3922415db7843de42eb07bac",
        "version_major": 2,
        "version_minor": 0
       },
       "text/plain": [
-       "Bayesian Inference:   0%|          | 0/5 [00:00<?, ?it/s]"
+       "  0%|          | 0/15 [00:00<?, ?it/s]"
       ]
      },
      "metadata": {},
      "output_type": "display_data"
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Inference failed for circuit: R1-[L2,R3]-[P4,P5]\n"
-     ]
     }
    ],
    "source": [
-    "# Make a copy of the dataframe to avoid modifying the original\n",
-    "circuits_copy = circuits.copy()\n",
-    "mcmc_list = []\n",
-    "\n",
-    "for row in tqdm(circuits_copy.itertuples(), total=len(circuits_copy), desc=\"Bayesian Inference\"):\n",
-    "    try:\n",
-    "        circuit = row.circuitstring\n",
-    "        p0_dict = row.Parameters\n",
-    "        # FIXME: Doesn't always converge, breaks the loop\n",
-    "        # p0_fit = ae.utils.fit_circuit_parameters(circuit, Z, freq, p0=p0_dict)\n",
-    "        kwargs_mcmc = {\"num_warmup\": 2500, \"num_samples\": 1000, \"progress_bar\": False}\n",
-    "        mcmc = ae.core.perform_bayesian_inference(circuit, Z, freq, p0_dict, **kwargs_mcmc)\n",
-    "    except RuntimeError:\n",
-    "        print(f\"Inference failed for circuit: {circuit}\")\n",
-    "        circuits_copy.drop(row.Index, inplace=True)\n",
-    "        continue\n",
-    "    mcmc_list.append(mcmc)"
+    "mcmc_results = ae.core.perform_bayesian_inference_batch(circuits, Z, freq)\n",
+    "mcmcs, status = zip(*mcmc_results)"
    ]
   },
   {
@@ -610,36 +629,342 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 23,
+   "execution_count": 8,
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/html": [
-       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-style: italic\">                   R1-[P2,R3], 0/1000 divergences                    </span>\n",
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-style: italic\">                   [P1,R2]-R3, 0/1000 divergences                    </span>\n",
+       "┏━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┓\n",
+       "┃<span style=\"font-weight: bold\">  Parameter </span>┃<span style=\"font-weight: bold\">     Mean </span>┃<span style=\"font-weight: bold\">      Std </span>┃<span style=\"font-weight: bold\">   Median </span>┃<span style=\"font-weight: bold\">     5.0% </span>┃<span style=\"font-weight: bold\">    95.0% </span>┃\n",
+       "┡━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━┩\n",
+       "│        P1n │ 6.27e-01 │ 1.31e-03 │ 6.27e-01 │ 6.25e-01 │ 6.29e-01 │\n",
+       "│        P1w │ 1.44e-06 │ 4.42e-09 │ 1.44e-06 │ 1.44e-06 │ 1.45e-06 │\n",
+       "│         R2 │ 7.39e+06 │ 2.47e+04 │ 7.39e+06 │ 7.35e+06 │ 7.43e+06 │\n",
+       "│<span style=\"background-color: #808000\">         R3 </span>│<span style=\"background-color: #808000\"> 2.40e+01 </span>│<span style=\"background-color: #808000\"> 2.95e+01 </span>│<span style=\"background-color: #808000\"> 1.26e+01 </span>│<span style=\"background-color: #808000\"> 9.86e-01 </span>│<span style=\"background-color: #808000\"> 8.23e+01 </span>│\n",
+       "│ sigma_imag │ 1.11e+04 │ 7.15e+01 │ 1.11e+04 │ 1.10e+04 │ 1.12e+04 │\n",
+       "│ sigma_real │ 1.11e+04 │ 6.99e+01 │ 1.11e+04 │ 1.10e+04 │ 1.13e+04 │\n",
+       "└────────────┴──────────┴──────────┴──────────┴──────────┴──────────┘\n",
+       "</pre>\n"
+      ],
+      "text/plain": [
+       "\u001b[3m                   [P1,R2]-R3, 0/1000 divergences                    \u001b[0m\n",
+       "┏━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┓\n",
+       "┃\u001b[1m \u001b[0m\u001b[1m Parameter\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m    Mean\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m     Std\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m  Median\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m    5.0%\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m   95.0%\u001b[0m\u001b[1m \u001b[0m┃\n",
+       "┡━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━┩\n",
+       "│        P1n │ 6.27e-01 │ 1.31e-03 │ 6.27e-01 │ 6.25e-01 │ 6.29e-01 │\n",
+       "│        P1w │ 1.44e-06 │ 4.42e-09 │ 1.44e-06 │ 1.44e-06 │ 1.45e-06 │\n",
+       "│         R2 │ 7.39e+06 │ 2.47e+04 │ 7.39e+06 │ 7.35e+06 │ 7.43e+06 │\n",
+       "│\u001b[43m \u001b[0m\u001b[43m        R3\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.40e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.95e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.26e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m9.86e-01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m8.23e+01\u001b[0m\u001b[43m \u001b[0m│\n",
+       "│ sigma_imag │ 1.11e+04 │ 7.15e+01 │ 1.11e+04 │ 1.10e+04 │ 1.12e+04 │\n",
+       "│ sigma_real │ 1.11e+04 │ 6.99e+01 │ 1.11e+04 │ 1.10e+04 │ 1.13e+04 │\n",
+       "└────────────┴──────────┴──────────┴──────────┴──────────┴──────────┘\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-style: italic\">                  R1-P2-[P3,R4], 0/1000 divergences                  </span>\n",
+       "┏━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┓\n",
+       "┃<span style=\"font-weight: bold\">  Parameter </span>┃<span style=\"font-weight: bold\">     Mean </span>┃<span style=\"font-weight: bold\">      Std </span>┃<span style=\"font-weight: bold\">   Median </span>┃<span style=\"font-weight: bold\">     5.0% </span>┃<span style=\"font-weight: bold\">    95.0% </span>┃\n",
+       "┡━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━┩\n",
+       "│        P2n │ 3.51e-01 │ 6.14e-04 │ 3.51e-01 │ 3.50e-01 │ 3.52e-01 │\n",
+       "│        P2w │ 1.00e-06 │ 2.71e-09 │ 1.00e-06 │ 1.00e-06 │ 1.01e-06 │\n",
+       "│        P3n │ 4.90e-01 │ 2.85e-01 │ 4.85e-01 │ 5.47e-02 │ 9.51e-01 │\n",
+       "│<span style=\"background-color: #808000\">        P3w </span>│<span style=\"background-color: #808000\"> 1.36e+10 </span>│<span style=\"background-color: #808000\"> 7.22e+10 </span>│<span style=\"background-color: #808000\"> 8.37e+08 </span>│<span style=\"background-color: #808000\"> 1.68e+07 </span>│<span style=\"background-color: #808000\"> 3.88e+10 </span>│\n",
+       "│<span style=\"background-color: #808000\">         R1 </span>│<span style=\"background-color: #808000\"> 2.26e+01 </span>│<span style=\"background-color: #808000\"> 2.76e+01 </span>│<span style=\"background-color: #808000\"> 1.28e+01 </span>│<span style=\"background-color: #808000\"> 7.43e-01 </span>│<span style=\"background-color: #808000\"> 7.58e+01 </span>│\n",
+       "│<span style=\"background-color: #808000\">         R4 </span>│<span style=\"background-color: #808000\"> 1.46e+09 </span>│<span style=\"background-color: #808000\"> 1.17e+10 </span>│<span style=\"background-color: #808000\"> 1.18e+08 </span>│<span style=\"background-color: #808000\"> 2.20e+06 </span>│<span style=\"background-color: #808000\"> 4.28e+09 </span>│\n",
+       "│ sigma_imag │ 1.58e+04 │ 7.57e+01 │ 1.58e+04 │ 1.57e+04 │ 1.59e+04 │\n",
+       "│ sigma_real │ 1.95e+04 │ 8.87e+01 │ 1.95e+04 │ 1.94e+04 │ 1.97e+04 │\n",
+       "└────────────┴──────────┴──────────┴──────────┴──────────┴──────────┘\n",
+       "</pre>\n"
+      ],
+      "text/plain": [
+       "\u001b[3m                  R1-P2-[P3,R4], 0/1000 divergences                  \u001b[0m\n",
+       "┏━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┓\n",
+       "┃\u001b[1m \u001b[0m\u001b[1m Parameter\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m    Mean\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m     Std\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m  Median\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m    5.0%\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m   95.0%\u001b[0m\u001b[1m \u001b[0m┃\n",
+       "┡━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━┩\n",
+       "│        P2n │ 3.51e-01 │ 6.14e-04 │ 3.51e-01 │ 3.50e-01 │ 3.52e-01 │\n",
+       "│        P2w │ 1.00e-06 │ 2.71e-09 │ 1.00e-06 │ 1.00e-06 │ 1.01e-06 │\n",
+       "│        P3n │ 4.90e-01 │ 2.85e-01 │ 4.85e-01 │ 5.47e-02 │ 9.51e-01 │\n",
+       "│\u001b[43m \u001b[0m\u001b[43m       P3w\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.36e+10\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m7.22e+10\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m8.37e+08\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.68e+07\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m3.88e+10\u001b[0m\u001b[43m \u001b[0m│\n",
+       "│\u001b[43m \u001b[0m\u001b[43m        R1\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.26e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.76e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.28e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m7.43e-01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m7.58e+01\u001b[0m\u001b[43m \u001b[0m│\n",
+       "│\u001b[43m \u001b[0m\u001b[43m        R4\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.46e+09\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.17e+10\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.18e+08\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.20e+06\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m4.28e+09\u001b[0m\u001b[43m \u001b[0m│\n",
+       "│ sigma_imag │ 1.58e+04 │ 7.57e+01 │ 1.58e+04 │ 1.57e+04 │ 1.59e+04 │\n",
+       "│ sigma_real │ 1.95e+04 │ 8.87e+01 │ 1.95e+04 │ 1.94e+04 │ 1.97e+04 │\n",
+       "└────────────┴──────────┴──────────┴──────────┴──────────┴──────────┘\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-style: italic\">                  R1-[R2-L3,P4], 0/1000 divergences                  </span>\n",
+       "┏━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┓\n",
+       "┃<span style=\"font-weight: bold\">  Parameter </span>┃<span style=\"font-weight: bold\">     Mean </span>┃<span style=\"font-weight: bold\">      Std </span>┃<span style=\"font-weight: bold\">   Median </span>┃<span style=\"font-weight: bold\">     5.0% </span>┃<span style=\"font-weight: bold\">    95.0% </span>┃\n",
+       "┡━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━┩\n",
+       "│<span style=\"background-color: #808000\">         L3 </span>│<span style=\"background-color: #808000\"> 3.70e-08 </span>│<span style=\"background-color: #808000\"> 1.23e-07 </span>│<span style=\"background-color: #808000\"> 4.05e-09 </span>│<span style=\"background-color: #808000\"> 1.17e-10 </span>│<span style=\"background-color: #808000\"> 1.57e-07 </span>│\n",
+       "│        P4n │ 6.27e-01 │ 1.32e-03 │ 6.27e-01 │ 6.25e-01 │ 6.29e-01 │\n",
+       "│        P4w │ 1.44e-06 │ 4.35e-09 │ 1.44e-06 │ 1.44e-06 │ 1.45e-06 │\n",
+       "│<span style=\"background-color: #808000\">         R1 </span>│<span style=\"background-color: #808000\"> 2.27e+01 </span>│<span style=\"background-color: #808000\"> 2.82e+01 </span>│<span style=\"background-color: #808000\"> 1.22e+01 </span>│<span style=\"background-color: #808000\"> 9.03e-01 </span>│<span style=\"background-color: #808000\"> 7.79e+01 </span>│\n",
+       "│         R2 │ 7.39e+06 │ 2.55e+04 │ 7.39e+06 │ 7.35e+06 │ 7.43e+06 │\n",
+       "│ sigma_imag │ 1.11e+04 │ 6.76e+01 │ 1.11e+04 │ 1.10e+04 │ 1.12e+04 │\n",
+       "│ sigma_real │ 1.11e+04 │ 6.64e+01 │ 1.11e+04 │ 1.10e+04 │ 1.12e+04 │\n",
+       "└────────────┴──────────┴──────────┴──────────┴──────────┴──────────┘\n",
+       "</pre>\n"
+      ],
+      "text/plain": [
+       "\u001b[3m                  R1-[R2-L3,P4], 0/1000 divergences                  \u001b[0m\n",
+       "┏━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┓\n",
+       "┃\u001b[1m \u001b[0m\u001b[1m Parameter\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m    Mean\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m     Std\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m  Median\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m    5.0%\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m   95.0%\u001b[0m\u001b[1m \u001b[0m┃\n",
+       "┡━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━┩\n",
+       "│\u001b[43m \u001b[0m\u001b[43m        L3\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m3.70e-08\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.23e-07\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m4.05e-09\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.17e-10\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.57e-07\u001b[0m\u001b[43m \u001b[0m│\n",
+       "│        P4n │ 6.27e-01 │ 1.32e-03 │ 6.27e-01 │ 6.25e-01 │ 6.29e-01 │\n",
+       "│        P4w │ 1.44e-06 │ 4.35e-09 │ 1.44e-06 │ 1.44e-06 │ 1.45e-06 │\n",
+       "│\u001b[43m \u001b[0m\u001b[43m        R1\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.27e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.82e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.22e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m9.03e-01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m7.79e+01\u001b[0m\u001b[43m \u001b[0m│\n",
+       "│         R2 │ 7.39e+06 │ 2.55e+04 │ 7.39e+06 │ 7.35e+06 │ 7.43e+06 │\n",
+       "│ sigma_imag │ 1.11e+04 │ 6.76e+01 │ 1.11e+04 │ 1.10e+04 │ 1.12e+04 │\n",
+       "│ sigma_real │ 1.11e+04 │ 6.64e+01 │ 1.11e+04 │ 1.10e+04 │ 1.12e+04 │\n",
+       "└────────────┴──────────┴──────────┴──────────┴──────────┴──────────┘\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-style: italic\">          R1-[R2-[R3,P4],[L5,R6]-P7], 465/1000 divergences           </span>\n",
+       "┏━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┓\n",
+       "┃<span style=\"font-weight: bold\">  Parameter </span>┃<span style=\"font-weight: bold\">     Mean </span>┃<span style=\"font-weight: bold\">      Std </span>┃<span style=\"font-weight: bold\">   Median </span>┃<span style=\"font-weight: bold\">     5.0% </span>┃<span style=\"font-weight: bold\">    95.0% </span>┃\n",
+       "┡━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━┩\n",
+       "│         L5 │ 1.99e-16 │ 0.00e+00 │ 1.99e-16 │ 1.99e-16 │ 1.99e-16 │\n",
+       "│        P4n │ 4.64e-01 │ 2.98e-08 │ 4.64e-01 │ 4.64e-01 │ 4.64e-01 │\n",
+       "│        P4w │ 3.69e-06 │ 0.00e+00 │ 3.69e-06 │ 3.69e-06 │ 3.69e-06 │\n",
+       "│        P7n │ 8.58e-01 │ 5.96e-08 │ 8.58e-01 │ 8.58e-01 │ 8.58e-01 │\n",
+       "│        P7w │ 1.62e-06 │ 1.14e-13 │ 1.62e-06 │ 1.62e-06 │ 1.62e-06 │\n",
+       "│         R1 │ 1.50e+02 │ 0.00e+00 │ 1.50e+02 │ 1.50e+02 │ 1.50e+02 │\n",
+       "│         R2 │ 3.58e+06 │ 0.00e+00 │ 3.58e+06 │ 3.58e+06 │ 3.58e+06 │\n",
+       "│         R3 │ 1.18e+09 │ 0.00e+00 │ 1.18e+09 │ 1.18e+09 │ 1.18e+09 │\n",
+       "│         R6 │ 6.98e+08 │ 6.40e+01 │ 6.98e+08 │ 6.98e+08 │ 6.98e+08 │\n",
+       "│ sigma_imag │ 1.76e+00 │ 0.00e+00 │ 1.76e+00 │ 1.76e+00 │ 1.76e+00 │\n",
+       "│ sigma_real │ 2.46e+00 │ 0.00e+00 │ 2.46e+00 │ 2.46e+00 │ 2.46e+00 │\n",
+       "└────────────┴──────────┴──────────┴──────────┴──────────┴──────────┘\n",
+       "</pre>\n"
+      ],
+      "text/plain": [
+       "\u001b[3m          R1-[R2-[R3,P4],[L5,R6]-P7], 465/1000 divergences           \u001b[0m\n",
+       "┏━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┓\n",
+       "┃\u001b[1m \u001b[0m\u001b[1m Parameter\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m    Mean\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m     Std\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m  Median\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m    5.0%\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m   95.0%\u001b[0m\u001b[1m \u001b[0m┃\n",
+       "┡━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━┩\n",
+       "│         L5 │ 1.99e-16 │ 0.00e+00 │ 1.99e-16 │ 1.99e-16 │ 1.99e-16 │\n",
+       "│        P4n │ 4.64e-01 │ 2.98e-08 │ 4.64e-01 │ 4.64e-01 │ 4.64e-01 │\n",
+       "│        P4w │ 3.69e-06 │ 0.00e+00 │ 3.69e-06 │ 3.69e-06 │ 3.69e-06 │\n",
+       "│        P7n │ 8.58e-01 │ 5.96e-08 │ 8.58e-01 │ 8.58e-01 │ 8.58e-01 │\n",
+       "│        P7w │ 1.62e-06 │ 1.14e-13 │ 1.62e-06 │ 1.62e-06 │ 1.62e-06 │\n",
+       "│         R1 │ 1.50e+02 │ 0.00e+00 │ 1.50e+02 │ 1.50e+02 │ 1.50e+02 │\n",
+       "│         R2 │ 3.58e+06 │ 0.00e+00 │ 3.58e+06 │ 3.58e+06 │ 3.58e+06 │\n",
+       "│         R3 │ 1.18e+09 │ 0.00e+00 │ 1.18e+09 │ 1.18e+09 │ 1.18e+09 │\n",
+       "│         R6 │ 6.98e+08 │ 6.40e+01 │ 6.98e+08 │ 6.98e+08 │ 6.98e+08 │\n",
+       "│ sigma_imag │ 1.76e+00 │ 0.00e+00 │ 1.76e+00 │ 1.76e+00 │ 1.76e+00 │\n",
+       "│ sigma_real │ 2.46e+00 │ 0.00e+00 │ 2.46e+00 │ 2.46e+00 │ 2.46e+00 │\n",
+       "└────────────┴──────────┴──────────┴──────────┴──────────┴──────────┘\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-style: italic\">                P1-[P2,R3]-L4-R5, 0/1000 divergences                 </span>\n",
+       "┏━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┓\n",
+       "┃<span style=\"font-weight: bold\">  Parameter </span>┃<span style=\"font-weight: bold\">     Mean </span>┃<span style=\"font-weight: bold\">      Std </span>┃<span style=\"font-weight: bold\">   Median </span>┃<span style=\"font-weight: bold\">     5.0% </span>┃<span style=\"font-weight: bold\">    95.0% </span>┃\n",
+       "┡━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━┩\n",
+       "│<span style=\"background-color: #808000\">         L4 </span>│<span style=\"background-color: #808000\"> 1.57e-19 </span>│<span style=\"background-color: #808000\"> 2.12e-18 </span>│<span style=\"background-color: #808000\"> 6.19e-21 </span>│<span style=\"background-color: #808000\"> 1.60e-22 </span>│<span style=\"background-color: #808000\"> 2.33e-19 </span>│\n",
+       "│        P1n │ 5.55e-01 │ 1.70e-03 │ 5.55e-01 │ 5.53e-01 │ 5.58e-01 │\n",
+       "│        P1w │ 5.93e-06 │ 6.91e-08 │ 5.93e-06 │ 5.82e-06 │ 6.05e-06 │\n",
+       "│        P2n │ 8.94e-01 │ 1.34e-03 │ 8.94e-01 │ 8.92e-01 │ 8.96e-01 │\n",
+       "│        P2w │ 2.41e-06 │ 1.22e-08 │ 2.41e-06 │ 2.39e-06 │ 2.43e-06 │\n",
+       "│         R3 │ 3.21e+06 │ 1.17e+04 │ 3.21e+06 │ 3.19e+06 │ 3.23e+06 │\n",
+       "│<span style=\"background-color: #808000\">         R5 </span>│<span style=\"background-color: #808000\"> 1.73e+01 </span>│<span style=\"background-color: #808000\"> 2.01e+01 </span>│<span style=\"background-color: #808000\"> 9.98e+00 </span>│<span style=\"background-color: #808000\"> 8.08e-01 </span>│<span style=\"background-color: #808000\"> 5.95e+01 </span>│\n",
+       "│ sigma_imag │ 3.50e+03 │ 3.74e+01 │ 3.50e+03 │ 3.45e+03 │ 3.57e+03 │\n",
+       "│ sigma_real │ 5.27e+03 │ 4.33e+01 │ 5.27e+03 │ 5.20e+03 │ 5.34e+03 │\n",
+       "└────────────┴──────────┴──────────┴──────────┴──────────┴──────────┘\n",
+       "</pre>\n"
+      ],
+      "text/plain": [
+       "\u001b[3m                P1-[P2,R3]-L4-R5, 0/1000 divergences                 \u001b[0m\n",
+       "┏━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┓\n",
+       "┃\u001b[1m \u001b[0m\u001b[1m Parameter\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m    Mean\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m     Std\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m  Median\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m    5.0%\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m   95.0%\u001b[0m\u001b[1m \u001b[0m┃\n",
+       "┡━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━┩\n",
+       "│\u001b[43m \u001b[0m\u001b[43m        L4\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.57e-19\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.12e-18\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m6.19e-21\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.60e-22\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.33e-19\u001b[0m\u001b[43m \u001b[0m│\n",
+       "│        P1n │ 5.55e-01 │ 1.70e-03 │ 5.55e-01 │ 5.53e-01 │ 5.58e-01 │\n",
+       "│        P1w │ 5.93e-06 │ 6.91e-08 │ 5.93e-06 │ 5.82e-06 │ 6.05e-06 │\n",
+       "│        P2n │ 8.94e-01 │ 1.34e-03 │ 8.94e-01 │ 8.92e-01 │ 8.96e-01 │\n",
+       "│        P2w │ 2.41e-06 │ 1.22e-08 │ 2.41e-06 │ 2.39e-06 │ 2.43e-06 │\n",
+       "│         R3 │ 3.21e+06 │ 1.17e+04 │ 3.21e+06 │ 3.19e+06 │ 3.23e+06 │\n",
+       "│\u001b[43m \u001b[0m\u001b[43m        R5\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.73e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.01e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m9.98e+00\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m8.08e-01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m5.95e+01\u001b[0m\u001b[43m \u001b[0m│\n",
+       "│ sigma_imag │ 3.50e+03 │ 3.74e+01 │ 3.50e+03 │ 3.45e+03 │ 3.57e+03 │\n",
+       "│ sigma_real │ 5.27e+03 │ 4.33e+01 │ 5.27e+03 │ 5.20e+03 │ 5.34e+03 │\n",
+       "└────────────┴──────────┴──────────┴──────────┴──────────┴──────────┘\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-style: italic\">              [P1,P2]-[P3,R4]-R5, 122/1000 divergences               </span>\n",
+       "┏━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┓\n",
+       "┃<span style=\"font-weight: bold\">  Parameter </span>┃<span style=\"font-weight: bold\">     Mean </span>┃<span style=\"font-weight: bold\">      Std </span>┃<span style=\"font-weight: bold\">   Median </span>┃<span style=\"font-weight: bold\">     5.0% </span>┃<span style=\"font-weight: bold\">    95.0% </span>┃\n",
+       "┡━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━┩\n",
+       "│        P1n │ 5.54e-01 │ 5.96e-08 │ 5.54e-01 │ 5.54e-01 │ 5.54e-01 │\n",
+       "│        P1w │ 1.85e-06 │ 1.14e-13 │ 1.85e-06 │ 1.85e-06 │ 1.85e-06 │\n",
+       "│        P2n │ 5.46e-01 │ 5.96e-08 │ 5.46e-01 │ 5.46e-01 │ 5.46e-01 │\n",
+       "│        P2w │ 3.80e-06 │ 2.27e-13 │ 3.80e-06 │ 3.80e-06 │ 3.80e-06 │\n",
+       "│        P3n │ 8.97e-01 │ 0.00e+00 │ 8.97e-01 │ 8.97e-01 │ 8.97e-01 │\n",
+       "│        P3w │ 2.43e-06 │ 0.00e+00 │ 2.43e-06 │ 2.43e-06 │ 2.43e-06 │\n",
+       "│         R4 │ 3.15e+06 │ 0.00e+00 │ 3.15e+06 │ 3.15e+06 │ 3.15e+06 │\n",
+       "│         R5 │ 9.20e+01 │ 0.00e+00 │ 9.20e+01 │ 9.20e+01 │ 9.20e+01 │\n",
+       "│ sigma_imag │ 3.00e+00 │ 2.38e-07 │ 3.00e+00 │ 3.00e+00 │ 3.00e+00 │\n",
+       "│ sigma_real │ 6.76e+00 │ 4.77e-07 │ 6.76e+00 │ 6.76e+00 │ 6.76e+00 │\n",
+       "└────────────┴──────────┴──────────┴──────────┴──────────┴──────────┘\n",
+       "</pre>\n"
+      ],
+      "text/plain": [
+       "\u001b[3m              [P1,P2]-[P3,R4]-R5, 122/1000 divergences               \u001b[0m\n",
+       "┏━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┓\n",
+       "┃\u001b[1m \u001b[0m\u001b[1m Parameter\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m    Mean\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m     Std\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m  Median\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m    5.0%\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m   95.0%\u001b[0m\u001b[1m \u001b[0m┃\n",
+       "┡━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━┩\n",
+       "│        P1n │ 5.54e-01 │ 5.96e-08 │ 5.54e-01 │ 5.54e-01 │ 5.54e-01 │\n",
+       "│        P1w │ 1.85e-06 │ 1.14e-13 │ 1.85e-06 │ 1.85e-06 │ 1.85e-06 │\n",
+       "│        P2n │ 5.46e-01 │ 5.96e-08 │ 5.46e-01 │ 5.46e-01 │ 5.46e-01 │\n",
+       "│        P2w │ 3.80e-06 │ 2.27e-13 │ 3.80e-06 │ 3.80e-06 │ 3.80e-06 │\n",
+       "│        P3n │ 8.97e-01 │ 0.00e+00 │ 8.97e-01 │ 8.97e-01 │ 8.97e-01 │\n",
+       "│        P3w │ 2.43e-06 │ 0.00e+00 │ 2.43e-06 │ 2.43e-06 │ 2.43e-06 │\n",
+       "│         R4 │ 3.15e+06 │ 0.00e+00 │ 3.15e+06 │ 3.15e+06 │ 3.15e+06 │\n",
+       "│         R5 │ 9.20e+01 │ 0.00e+00 │ 9.20e+01 │ 9.20e+01 │ 9.20e+01 │\n",
+       "│ sigma_imag │ 3.00e+00 │ 2.38e-07 │ 3.00e+00 │ 3.00e+00 │ 3.00e+00 │\n",
+       "│ sigma_real │ 6.76e+00 │ 4.77e-07 │ 6.76e+00 │ 6.76e+00 │ 6.76e+00 │\n",
+       "└────────────┴──────────┴──────────┴──────────┴──────────┴──────────┘\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-style: italic\">                  R1-[R2,P3-R4], 0/1000 divergences                  </span>\n",
+       "┏━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┓\n",
+       "┃<span style=\"font-weight: bold\">  Parameter </span>┃<span style=\"font-weight: bold\">     Mean </span>┃<span style=\"font-weight: bold\">      Std </span>┃<span style=\"font-weight: bold\">   Median </span>┃<span style=\"font-weight: bold\">     5.0% </span>┃<span style=\"font-weight: bold\">    95.0% </span>┃\n",
+       "┡━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━┩\n",
+       "│        P3n │ 6.27e-01 │ 1.43e-03 │ 6.27e-01 │ 6.25e-01 │ 6.29e-01 │\n",
+       "│        P3w │ 1.44e-06 │ 4.69e-09 │ 1.44e-06 │ 1.44e-06 │ 1.45e-06 │\n",
+       "│<span style=\"background-color: #808000\">         R1 </span>│<span style=\"background-color: #808000\"> 1.53e+01 </span>│<span style=\"background-color: #808000\"> 2.20e+01 </span>│<span style=\"background-color: #808000\"> 7.12e+00 </span>│<span style=\"background-color: #808000\"> 4.22e-01 </span>│<span style=\"background-color: #808000\"> 6.20e+01 </span>│\n",
+       "│         R2 │ 7.39e+06 │ 2.72e+04 │ 7.39e+06 │ 7.35e+06 │ 7.44e+06 │\n",
+       "│<span style=\"background-color: #808000\">         R4 </span>│<span style=\"background-color: #808000\"> 2.18e+01 </span>│<span style=\"background-color: #808000\"> 2.52e+01 </span>│<span style=\"background-color: #808000\"> 1.26e+01 </span>│<span style=\"background-color: #808000\"> 8.96e-01 </span>│<span style=\"background-color: #808000\"> 7.49e+01 </span>│\n",
+       "│ sigma_imag │ 1.11e+04 │ 7.08e+01 │ 1.11e+04 │ 1.10e+04 │ 1.12e+04 │\n",
+       "│ sigma_real │ 1.11e+04 │ 6.73e+01 │ 1.11e+04 │ 1.10e+04 │ 1.13e+04 │\n",
+       "└────────────┴──────────┴──────────┴──────────┴──────────┴──────────┘\n",
+       "</pre>\n"
+      ],
+      "text/plain": [
+       "\u001b[3m                  R1-[R2,P3-R4], 0/1000 divergences                  \u001b[0m\n",
+       "┏━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┓\n",
+       "┃\u001b[1m \u001b[0m\u001b[1m Parameter\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m    Mean\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m     Std\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m  Median\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m    5.0%\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m   95.0%\u001b[0m\u001b[1m \u001b[0m┃\n",
+       "┡━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━┩\n",
+       "│        P3n │ 6.27e-01 │ 1.43e-03 │ 6.27e-01 │ 6.25e-01 │ 6.29e-01 │\n",
+       "│        P3w │ 1.44e-06 │ 4.69e-09 │ 1.44e-06 │ 1.44e-06 │ 1.45e-06 │\n",
+       "│\u001b[43m \u001b[0m\u001b[43m        R1\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.53e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.20e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m7.12e+00\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m4.22e-01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m6.20e+01\u001b[0m\u001b[43m \u001b[0m│\n",
+       "│         R2 │ 7.39e+06 │ 2.72e+04 │ 7.39e+06 │ 7.35e+06 │ 7.44e+06 │\n",
+       "│\u001b[43m \u001b[0m\u001b[43m        R4\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.18e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.52e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.26e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m8.96e-01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m7.49e+01\u001b[0m\u001b[43m \u001b[0m│\n",
+       "│ sigma_imag │ 1.11e+04 │ 7.08e+01 │ 1.11e+04 │ 1.10e+04 │ 1.12e+04 │\n",
+       "│ sigma_real │ 1.11e+04 │ 6.73e+01 │ 1.11e+04 │ 1.10e+04 │ 1.13e+04 │\n",
+       "└────────────┴──────────┴──────────┴──────────┴──────────┴──────────┘\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-style: italic\">                P1-R2-[P3,R4]-R5, 0/1000 divergences                 </span>\n",
+       "┏━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┓\n",
+       "┃<span style=\"font-weight: bold\">  Parameter </span>┃<span style=\"font-weight: bold\">     Mean </span>┃<span style=\"font-weight: bold\">      Std </span>┃<span style=\"font-weight: bold\">   Median </span>┃<span style=\"font-weight: bold\">     5.0% </span>┃<span style=\"font-weight: bold\">    95.0% </span>┃\n",
+       "┡━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━┩\n",
+       "│        P1n │ 3.51e-01 │ 6.10e-04 │ 3.51e-01 │ 3.50e-01 │ 3.52e-01 │\n",
+       "│        P1w │ 1.00e-06 │ 2.78e-09 │ 1.00e-06 │ 1.00e-06 │ 1.01e-06 │\n",
+       "│        P3n │ 5.09e-01 │ 2.84e-01 │ 5.16e-01 │ 6.13e-02 │ 9.38e-01 │\n",
+       "│<span style=\"background-color: #808000\">        P3w </span>│<span style=\"background-color: #808000\"> 5.13e+09 </span>│<span style=\"background-color: #808000\"> 2.06e+10 </span>│<span style=\"background-color: #808000\"> 4.94e+08 </span>│<span style=\"background-color: #808000\"> 9.63e+06 </span>│<span style=\"background-color: #808000\"> 1.99e+10 </span>│\n",
+       "│<span style=\"background-color: #808000\">         R2 </span>│<span style=\"background-color: #808000\"> 1.96e+01 </span>│<span style=\"background-color: #808000\"> 2.59e+01 </span>│<span style=\"background-color: #808000\"> 1.10e+01 </span>│<span style=\"background-color: #808000\"> 1.04e+00 </span>│<span style=\"background-color: #808000\"> 6.57e+01 </span>│\n",
+       "│<span style=\"background-color: #808000\">         R4 </span>│<span style=\"background-color: #808000\"> 5.66e+09 </span>│<span style=\"background-color: #808000\"> 3.14e+10 </span>│<span style=\"background-color: #808000\"> 3.61e+08 </span>│<span style=\"background-color: #808000\"> 8.50e+06 </span>│<span style=\"background-color: #808000\"> 1.90e+10 </span>│\n",
+       "│<span style=\"background-color: #808000\">         R5 </span>│<span style=\"background-color: #808000\"> 1.70e+01 </span>│<span style=\"background-color: #808000\"> 2.28e+01 </span>│<span style=\"background-color: #808000\"> 8.70e+00 </span>│<span style=\"background-color: #808000\"> 3.79e-01 </span>│<span style=\"background-color: #808000\"> 6.41e+01 </span>│\n",
+       "│ sigma_imag │ 1.58e+04 │ 7.46e+01 │ 1.58e+04 │ 1.57e+04 │ 1.59e+04 │\n",
+       "│ sigma_real │ 1.95e+04 │ 9.00e+01 │ 1.95e+04 │ 1.94e+04 │ 1.97e+04 │\n",
+       "└────────────┴──────────┴──────────┴──────────┴──────────┴──────────┘\n",
+       "</pre>\n"
+      ],
+      "text/plain": [
+       "\u001b[3m                P1-R2-[P3,R4]-R5, 0/1000 divergences                 \u001b[0m\n",
+       "┏━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┓\n",
+       "┃\u001b[1m \u001b[0m\u001b[1m Parameter\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m    Mean\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m     Std\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m  Median\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m    5.0%\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m   95.0%\u001b[0m\u001b[1m \u001b[0m┃\n",
+       "┡━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━┩\n",
+       "│        P1n │ 3.51e-01 │ 6.10e-04 │ 3.51e-01 │ 3.50e-01 │ 3.52e-01 │\n",
+       "│        P1w │ 1.00e-06 │ 2.78e-09 │ 1.00e-06 │ 1.00e-06 │ 1.01e-06 │\n",
+       "│        P3n │ 5.09e-01 │ 2.84e-01 │ 5.16e-01 │ 6.13e-02 │ 9.38e-01 │\n",
+       "│\u001b[43m \u001b[0m\u001b[43m       P3w\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m5.13e+09\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.06e+10\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m4.94e+08\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m9.63e+06\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.99e+10\u001b[0m\u001b[43m \u001b[0m│\n",
+       "│\u001b[43m \u001b[0m\u001b[43m        R2\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.96e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.59e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.10e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.04e+00\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m6.57e+01\u001b[0m\u001b[43m \u001b[0m│\n",
+       "│\u001b[43m \u001b[0m\u001b[43m        R4\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m5.66e+09\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m3.14e+10\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m3.61e+08\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m8.50e+06\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.90e+10\u001b[0m\u001b[43m \u001b[0m│\n",
+       "│\u001b[43m \u001b[0m\u001b[43m        R5\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.70e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.28e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m8.70e+00\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m3.79e-01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m6.41e+01\u001b[0m\u001b[43m \u001b[0m│\n",
+       "│ sigma_imag │ 1.58e+04 │ 7.46e+01 │ 1.58e+04 │ 1.57e+04 │ 1.59e+04 │\n",
+       "│ sigma_real │ 1.95e+04 │ 9.00e+01 │ 1.95e+04 │ 1.94e+04 │ 1.97e+04 │\n",
+       "└────────────┴──────────┴──────────┴──────────┴──────────┴──────────┘\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-style: italic\">                  [P1,P2-R3]-R4, 0/1000 divergences                  </span>\n",
        "┏━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┓\n",
        "┃<span style=\"font-weight: bold\">  Parameter </span>┃<span style=\"font-weight: bold\">     Mean </span>┃<span style=\"font-weight: bold\">      Std </span>┃<span style=\"font-weight: bold\">   Median </span>┃<span style=\"font-weight: bold\">     5.0% </span>┃<span style=\"font-weight: bold\">    95.0% </span>┃\n",
        "┡━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━┩\n",
-       "│        P2n │ 6.27e-01 │ 1.37e-03 │ 6.27e-01 │ 6.25e-01 │ 6.29e-01 │\n",
-       "│        P2w │ 1.44e-06 │ 4.56e-09 │ 1.44e-06 │ 1.44e-06 │ 1.45e-06 │\n",
-       "│<span style=\"background-color: #808000\">         R1 </span>│<span style=\"background-color: #808000\"> 2.29e+01 </span>│<span style=\"background-color: #808000\"> 2.81e+01 </span>│<span style=\"background-color: #808000\"> 1.30e+01 </span>│<span style=\"background-color: #808000\"> 1.04e+00 </span>│<span style=\"background-color: #808000\"> 7.94e+01 </span>│\n",
-       "│         R3 │ 7.39e+06 │ 2.57e+04 │ 7.39e+06 │ 7.35e+06 │ 7.44e+06 │\n",
-       "│ sigma_imag │ 1.11e+04 │ 6.74e+01 │ 1.11e+04 │ 1.10e+04 │ 1.12e+04 │\n",
-       "│ sigma_real │ 1.11e+04 │ 7.14e+01 │ 1.11e+04 │ 1.10e+04 │ 1.12e+04 │\n",
+       "│        P1n │ 9.55e-01 │ 0.00e+00 │ 9.55e-01 │ 9.55e-01 │ 9.55e-01 │\n",
+       "│        P1w │ 1.76e-06 │ 1.14e-13 │ 1.76e-06 │ 1.76e-06 │ 1.76e-06 │\n",
+       "│        P2n │ 3.80e-01 │ 2.98e-08 │ 3.80e-01 │ 3.80e-01 │ 3.80e-01 │\n",
+       "│        P2w │ 1.95e-06 │ 0.00e+00 │ 1.95e-06 │ 1.95e-06 │ 1.95e-06 │\n",
+       "│         R3 │ 2.58e+06 │ 0.00e+00 │ 2.58e+06 │ 2.58e+06 │ 2.58e+06 │\n",
+       "│         R4 │ 4.80e+01 │ 3.81e-06 │ 4.80e+01 │ 4.80e+01 │ 4.80e+01 │\n",
+       "│ sigma_imag │ 1.39e+01 │ 9.54e-07 │ 1.39e+01 │ 1.39e+01 │ 1.39e+01 │\n",
+       "│ sigma_real │ 1.48e+01 │ 9.54e-07 │ 1.48e+01 │ 1.48e+01 │ 1.48e+01 │\n",
        "└────────────┴──────────┴──────────┴──────────┴──────────┴──────────┘\n",
        "</pre>\n"
       ],
       "text/plain": [
-       "\u001b[3m                   R1-[P2,R3], 0/1000 divergences                    \u001b[0m\n",
+       "\u001b[3m                  [P1,P2-R3]-R4, 0/1000 divergences                  \u001b[0m\n",
        "┏━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┓\n",
        "┃\u001b[1m \u001b[0m\u001b[1m Parameter\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m    Mean\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m     Std\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m  Median\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m    5.0%\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m   95.0%\u001b[0m\u001b[1m \u001b[0m┃\n",
        "┡━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━┩\n",
-       "│        P2n │ 6.27e-01 │ 1.37e-03 │ 6.27e-01 │ 6.25e-01 │ 6.29e-01 │\n",
-       "│        P2w │ 1.44e-06 │ 4.56e-09 │ 1.44e-06 │ 1.44e-06 │ 1.45e-06 │\n",
-       "│\u001b[43m \u001b[0m\u001b[43m        R1\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.29e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.81e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.30e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.04e+00\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m7.94e+01\u001b[0m\u001b[43m \u001b[0m│\n",
-       "│         R3 │ 7.39e+06 │ 2.57e+04 │ 7.39e+06 │ 7.35e+06 │ 7.44e+06 │\n",
-       "│ sigma_imag │ 1.11e+04 │ 6.74e+01 │ 1.11e+04 │ 1.10e+04 │ 1.12e+04 │\n",
-       "│ sigma_real │ 1.11e+04 │ 7.14e+01 │ 1.11e+04 │ 1.10e+04 │ 1.12e+04 │\n",
+       "│        P1n │ 9.55e-01 │ 0.00e+00 │ 9.55e-01 │ 9.55e-01 │ 9.55e-01 │\n",
+       "│        P1w │ 1.76e-06 │ 1.14e-13 │ 1.76e-06 │ 1.76e-06 │ 1.76e-06 │\n",
+       "│        P2n │ 3.80e-01 │ 2.98e-08 │ 3.80e-01 │ 3.80e-01 │ 3.80e-01 │\n",
+       "│        P2w │ 1.95e-06 │ 0.00e+00 │ 1.95e-06 │ 1.95e-06 │ 1.95e-06 │\n",
+       "│         R3 │ 2.58e+06 │ 0.00e+00 │ 2.58e+06 │ 2.58e+06 │ 2.58e+06 │\n",
+       "│         R4 │ 4.80e+01 │ 3.81e-06 │ 4.80e+01 │ 4.80e+01 │ 4.80e+01 │\n",
+       "│ sigma_imag │ 1.39e+01 │ 9.54e-07 │ 1.39e+01 │ 1.39e+01 │ 1.39e+01 │\n",
+       "│ sigma_real │ 1.48e+01 │ 9.54e-07 │ 1.48e+01 │ 1.48e+01 │ 1.48e+01 │\n",
        "└────────────┴──────────┴──────────┴──────────┴──────────┴──────────┘\n"
       ]
      },
@@ -649,38 +974,32 @@
     {
      "data": {
       "text/html": [
-       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-style: italic\">               P1-R2-[P3,[P4,R5]], 0/1000 divergences                </span>\n",
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-style: italic\">                  R1-[R2,P3-L4], 0/1000 divergences                  </span>\n",
        "┏━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┓\n",
        "┃<span style=\"font-weight: bold\">  Parameter </span>┃<span style=\"font-weight: bold\">     Mean </span>┃<span style=\"font-weight: bold\">      Std </span>┃<span style=\"font-weight: bold\">   Median </span>┃<span style=\"font-weight: bold\">     5.0% </span>┃<span style=\"font-weight: bold\">    95.0% </span>┃\n",
        "┡━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━┩\n",
-       "│        P1n │ 5.87e-01 │ 2.01e-03 │ 5.87e-01 │ 5.84e-01 │ 5.90e-01 │\n",
-       "│        P1w │ 1.23e-05 │ 2.24e-07 │ 1.23e-05 │ 1.19e-05 │ 1.27e-05 │\n",
-       "│        P3n │ 1.25e-01 │ 6.75e-04 │ 1.25e-01 │ 1.24e-01 │ 1.26e-01 │\n",
-       "│        P3w │ 4.37e-07 │ 4.64e-10 │ 4.37e-07 │ 4.36e-07 │ 4.38e-07 │\n",
-       "│        P4n │ 1.00e+00 │ 4.52e-05 │ 1.00e+00 │ 1.00e+00 │ 1.00e+00 │\n",
-       "│        P4w │ 2.05e-06 │ 6.77e-09 │ 2.05e-06 │ 2.04e-06 │ 2.06e-06 │\n",
-       "│<span style=\"background-color: #808000\">         R2 </span>│<span style=\"background-color: #808000\"> 2.33e+01 </span>│<span style=\"background-color: #808000\"> 2.83e+01 </span>│<span style=\"background-color: #808000\"> 1.30e+01 </span>│<span style=\"background-color: #808000\"> 9.67e-01 </span>│<span style=\"background-color: #808000\"> 8.84e+01 </span>│\n",
-       "│<span style=\"background-color: #808000\">         R5 </span>│<span style=\"background-color: #808000\"> 4.63e+10 </span>│<span style=\"background-color: #808000\"> 1.40e+11 </span>│<span style=\"background-color: #808000\"> 1.04e+10 </span>│<span style=\"background-color: #808000\"> 1.80e+09 </span>│<span style=\"background-color: #808000\"> 1.68e+11 </span>│\n",
-       "│ sigma_imag │ 2.01e+03 │ 3.72e+01 │ 2.01e+03 │ 1.95e+03 │ 2.07e+03 │\n",
-       "│ sigma_real │ 2.31e+03 │ 3.83e+01 │ 2.31e+03 │ 2.24e+03 │ 2.37e+03 │\n",
+       "│<span style=\"background-color: #808000\">         L4 </span>│<span style=\"background-color: #808000\"> 5.23e-20 </span>│<span style=\"background-color: #808000\"> 3.57e-19 </span>│<span style=\"background-color: #808000\"> 4.87e-21 </span>│<span style=\"background-color: #808000\"> 1.29e-22 </span>│<span style=\"background-color: #808000\"> 2.05e-19 </span>│\n",
+       "│        P3n │ 6.27e-01 │ 1.35e-03 │ 6.27e-01 │ 6.25e-01 │ 6.29e-01 │\n",
+       "│        P3w │ 1.44e-06 │ 4.49e-09 │ 1.44e-06 │ 1.44e-06 │ 1.45e-06 │\n",
+       "│<span style=\"background-color: #808000\">         R1 </span>│<span style=\"background-color: #808000\"> 2.28e+01 </span>│<span style=\"background-color: #808000\"> 3.00e+01 </span>│<span style=\"background-color: #808000\"> 1.27e+01 </span>│<span style=\"background-color: #808000\"> 1.06e+00 </span>│<span style=\"background-color: #808000\"> 7.70e+01 </span>│\n",
+       "│         R2 │ 7.39e+06 │ 2.61e+04 │ 7.39e+06 │ 7.35e+06 │ 7.44e+06 │\n",
+       "│ sigma_imag │ 1.11e+04 │ 7.03e+01 │ 1.11e+04 │ 1.10e+04 │ 1.12e+04 │\n",
+       "│ sigma_real │ 1.11e+04 │ 7.10e+01 │ 1.11e+04 │ 1.10e+04 │ 1.12e+04 │\n",
        "└────────────┴──────────┴──────────┴──────────┴──────────┴──────────┘\n",
        "</pre>\n"
       ],
       "text/plain": [
-       "\u001b[3m               P1-R2-[P3,[P4,R5]], 0/1000 divergences                \u001b[0m\n",
+       "\u001b[3m                  R1-[R2,P3-L4], 0/1000 divergences                  \u001b[0m\n",
        "┏━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┓\n",
        "┃\u001b[1m \u001b[0m\u001b[1m Parameter\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m    Mean\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m     Std\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m  Median\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m    5.0%\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m   95.0%\u001b[0m\u001b[1m \u001b[0m┃\n",
        "┡━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━┩\n",
-       "│        P1n │ 5.87e-01 │ 2.01e-03 │ 5.87e-01 │ 5.84e-01 │ 5.90e-01 │\n",
-       "│        P1w │ 1.23e-05 │ 2.24e-07 │ 1.23e-05 │ 1.19e-05 │ 1.27e-05 │\n",
-       "│        P3n │ 1.25e-01 │ 6.75e-04 │ 1.25e-01 │ 1.24e-01 │ 1.26e-01 │\n",
-       "│        P3w │ 4.37e-07 │ 4.64e-10 │ 4.37e-07 │ 4.36e-07 │ 4.38e-07 │\n",
-       "│        P4n │ 1.00e+00 │ 4.52e-05 │ 1.00e+00 │ 1.00e+00 │ 1.00e+00 │\n",
-       "│        P4w │ 2.05e-06 │ 6.77e-09 │ 2.05e-06 │ 2.04e-06 │ 2.06e-06 │\n",
-       "│\u001b[43m \u001b[0m\u001b[43m        R2\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.33e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.83e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.30e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m9.67e-01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m8.84e+01\u001b[0m\u001b[43m \u001b[0m│\n",
-       "│\u001b[43m \u001b[0m\u001b[43m        R5\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m4.63e+10\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.40e+11\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.04e+10\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.80e+09\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.68e+11\u001b[0m\u001b[43m \u001b[0m│\n",
-       "│ sigma_imag │ 2.01e+03 │ 3.72e+01 │ 2.01e+03 │ 1.95e+03 │ 2.07e+03 │\n",
-       "│ sigma_real │ 2.31e+03 │ 3.83e+01 │ 2.31e+03 │ 2.24e+03 │ 2.37e+03 │\n",
+       "│\u001b[43m \u001b[0m\u001b[43m        L4\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m5.23e-20\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m3.57e-19\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m4.87e-21\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.29e-22\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.05e-19\u001b[0m\u001b[43m \u001b[0m│\n",
+       "│        P3n │ 6.27e-01 │ 1.35e-03 │ 6.27e-01 │ 6.25e-01 │ 6.29e-01 │\n",
+       "│        P3w │ 1.44e-06 │ 4.49e-09 │ 1.44e-06 │ 1.44e-06 │ 1.45e-06 │\n",
+       "│\u001b[43m \u001b[0m\u001b[43m        R1\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.28e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m3.00e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.27e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.06e+00\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m7.70e+01\u001b[0m\u001b[43m \u001b[0m│\n",
+       "│         R2 │ 7.39e+06 │ 2.61e+04 │ 7.39e+06 │ 7.35e+06 │ 7.44e+06 │\n",
+       "│ sigma_imag │ 1.11e+04 │ 7.03e+01 │ 1.11e+04 │ 1.10e+04 │ 1.12e+04 │\n",
+       "│ sigma_real │ 1.11e+04 │ 7.10e+01 │ 1.11e+04 │ 1.10e+04 │ 1.12e+04 │\n",
        "└────────────┴──────────┴──────────┴──────────┴──────────┴──────────┘\n"
       ]
      },
@@ -690,32 +1009,36 @@
     {
      "data": {
       "text/html": [
-       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-style: italic\">                [[R1,P2],R3]-R4, 32/1000 divergences                 </span>\n",
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-style: italic\">               [P1,P2-[R3,L4]]-R5, 5/1000 divergences                </span>\n",
        "┏━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┓\n",
        "┃<span style=\"font-weight: bold\">  Parameter </span>┃<span style=\"font-weight: bold\">     Mean </span>┃<span style=\"font-weight: bold\">      Std </span>┃<span style=\"font-weight: bold\">   Median </span>┃<span style=\"font-weight: bold\">     5.0% </span>┃<span style=\"font-weight: bold\">    95.0% </span>┃\n",
        "┡━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━┩\n",
-       "│        P2n │ 6.27e-01 │ 1.46e-03 │ 6.27e-01 │ 6.25e-01 │ 6.30e-01 │\n",
-       "│        P2w │ 1.44e-06 │ 4.81e-09 │ 1.44e-06 │ 1.44e-06 │ 1.45e-06 │\n",
-       "│         R1 │ 7.42e+06 │ 4.09e+04 │ 7.42e+06 │ 7.36e+06 │ 7.50e+06 │\n",
-       "│<span style=\"background-color: #808000\">         R3 </span>│<span style=\"background-color: #808000\"> 1.59e+10 </span>│<span style=\"background-color: #808000\"> 1.05e+11 </span>│<span style=\"background-color: #808000\"> 2.61e+09 </span>│<span style=\"background-color: #808000\"> 6.11e+08 </span>│<span style=\"background-color: #808000\"> 5.24e+10 </span>│\n",
-       "│<span style=\"background-color: #808000\">         R4 </span>│<span style=\"background-color: #808000\"> 2.08e+01 </span>│<span style=\"background-color: #808000\"> 2.63e+01 </span>│<span style=\"background-color: #808000\"> 1.11e+01 </span>│<span style=\"background-color: #808000\"> 7.44e-01 </span>│<span style=\"background-color: #808000\"> 7.50e+01 </span>│\n",
-       "│ sigma_imag │ 1.11e+04 │ 7.70e+01 │ 1.11e+04 │ 1.10e+04 │ 1.13e+04 │\n",
-       "│ sigma_real │ 1.11e+04 │ 7.89e+01 │ 1.11e+04 │ 1.10e+04 │ 1.13e+04 │\n",
+       "│<span style=\"background-color: #808000\">         L4 </span>│<span style=\"background-color: #808000\"> 5.41e+01 </span>│<span style=\"background-color: #808000\"> 2.81e+02 </span>│<span style=\"background-color: #808000\"> 4.39e+00 </span>│<span style=\"background-color: #808000\"> 1.07e-01 </span>│<span style=\"background-color: #808000\"> 2.14e+02 </span>│\n",
+       "│        P1n │ 4.93e-01 │ 2.80e-01 │ 4.82e-01 │ 6.32e-02 │ 9.39e-01 │\n",
+       "│<span style=\"background-color: #808000\">        P1w </span>│<span style=\"background-color: #808000\"> 1.15e+02 </span>│<span style=\"background-color: #808000\"> 6.78e+02 </span>│<span style=\"background-color: #808000\"> 9.59e+00 </span>│<span style=\"background-color: #808000\"> 2.56e-01 </span>│<span style=\"background-color: #808000\"> 3.55e+02 </span>│\n",
+       "│        P2n │ 5.02e-01 │ 2.89e-01 │ 5.01e-01 │ 5.30e-02 │ 9.45e-01 │\n",
+       "│<span style=\"background-color: #808000\">        P2w </span>│<span style=\"background-color: #808000\"> 9.39e+09 </span>│<span style=\"background-color: #808000\"> 4.32e+10 </span>│<span style=\"background-color: #808000\"> 8.36e+08 </span>│<span style=\"background-color: #808000\"> 2.53e+07 </span>│<span style=\"background-color: #808000\"> 3.70e+10 </span>│\n",
+       "│<span style=\"background-color: #808000\">         R3 </span>│<span style=\"background-color: #808000\"> 1.09e+10 </span>│<span style=\"background-color: #808000\"> 4.34e+10 </span>│<span style=\"background-color: #808000\"> 1.01e+09 </span>│<span style=\"background-color: #808000\"> 2.38e+07 </span>│<span style=\"background-color: #808000\"> 4.55e+10 </span>│\n",
+       "│         R5 │ 7.31e+05 │ 6.14e+03 │ 7.31e+05 │ 7.20e+05 │ 7.41e+05 │\n",
+       "│ sigma_imag │ 3.68e+04 │ 1.18e+02 │ 3.68e+04 │ 3.66e+04 │ 3.70e+04 │\n",
+       "│ sigma_real │ 4.95e+04 │ 1.27e+02 │ 4.95e+04 │ 4.93e+04 │ 4.97e+04 │\n",
        "└────────────┴──────────┴──────────┴──────────┴──────────┴──────────┘\n",
        "</pre>\n"
       ],
       "text/plain": [
-       "\u001b[3m                [[R1,P2],R3]-R4, 32/1000 divergences                 \u001b[0m\n",
+       "\u001b[3m               [P1,P2-[R3,L4]]-R5, 5/1000 divergences                \u001b[0m\n",
        "┏━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┓\n",
        "┃\u001b[1m \u001b[0m\u001b[1m Parameter\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m    Mean\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m     Std\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m  Median\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m    5.0%\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m   95.0%\u001b[0m\u001b[1m \u001b[0m┃\n",
        "┡━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━┩\n",
-       "│        P2n │ 6.27e-01 │ 1.46e-03 │ 6.27e-01 │ 6.25e-01 │ 6.30e-01 │\n",
-       "│        P2w │ 1.44e-06 │ 4.81e-09 │ 1.44e-06 │ 1.44e-06 │ 1.45e-06 │\n",
-       "│         R1 │ 7.42e+06 │ 4.09e+04 │ 7.42e+06 │ 7.36e+06 │ 7.50e+06 │\n",
-       "│\u001b[43m \u001b[0m\u001b[43m        R3\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.59e+10\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.05e+11\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.61e+09\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m6.11e+08\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m5.24e+10\u001b[0m\u001b[43m \u001b[0m│\n",
-       "│\u001b[43m \u001b[0m\u001b[43m        R4\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.08e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.63e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.11e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m7.44e-01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m7.50e+01\u001b[0m\u001b[43m \u001b[0m│\n",
-       "│ sigma_imag │ 1.11e+04 │ 7.70e+01 │ 1.11e+04 │ 1.10e+04 │ 1.13e+04 │\n",
-       "│ sigma_real │ 1.11e+04 │ 7.89e+01 │ 1.11e+04 │ 1.10e+04 │ 1.13e+04 │\n",
+       "│\u001b[43m \u001b[0m\u001b[43m        L4\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m5.41e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.81e+02\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m4.39e+00\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.07e-01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.14e+02\u001b[0m\u001b[43m \u001b[0m│\n",
+       "│        P1n │ 4.93e-01 │ 2.80e-01 │ 4.82e-01 │ 6.32e-02 │ 9.39e-01 │\n",
+       "│\u001b[43m \u001b[0m\u001b[43m       P1w\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.15e+02\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m6.78e+02\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m9.59e+00\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.56e-01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m3.55e+02\u001b[0m\u001b[43m \u001b[0m│\n",
+       "│        P2n │ 5.02e-01 │ 2.89e-01 │ 5.01e-01 │ 5.30e-02 │ 9.45e-01 │\n",
+       "│\u001b[43m \u001b[0m\u001b[43m       P2w\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m9.39e+09\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m4.32e+10\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m8.36e+08\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.53e+07\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m3.70e+10\u001b[0m\u001b[43m \u001b[0m│\n",
+       "│\u001b[43m \u001b[0m\u001b[43m        R3\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.09e+10\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m4.34e+10\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.01e+09\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.38e+07\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m4.55e+10\u001b[0m\u001b[43m \u001b[0m│\n",
+       "│         R5 │ 7.31e+05 │ 6.14e+03 │ 7.31e+05 │ 7.20e+05 │ 7.41e+05 │\n",
+       "│ sigma_imag │ 3.68e+04 │ 1.18e+02 │ 3.68e+04 │ 3.66e+04 │ 3.70e+04 │\n",
+       "│ sigma_real │ 4.95e+04 │ 1.27e+02 │ 4.95e+04 │ 4.93e+04 │ 4.97e+04 │\n",
        "└────────────┴──────────┴──────────┴──────────┴──────────┴──────────┘\n"
       ]
      },
@@ -725,34 +1048,34 @@
     {
      "data": {
       "text/html": [
-       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-style: italic\">                 R1-[R2,P3]-P4, 67/1000 divergences                  </span>\n",
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-style: italic\">                 R1-[P2,[R3,P4]], 0/1000 divergences                 </span>\n",
        "┏━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┓\n",
        "┃<span style=\"font-weight: bold\">  Parameter </span>┃<span style=\"font-weight: bold\">     Mean </span>┃<span style=\"font-weight: bold\">      Std </span>┃<span style=\"font-weight: bold\">   Median </span>┃<span style=\"font-weight: bold\">     5.0% </span>┃<span style=\"font-weight: bold\">    95.0% </span>┃\n",
        "┡━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━┩\n",
-       "│        P3n │ 8.34e-01 │ 5.96e-08 │ 8.34e-01 │ 8.34e-01 │ 8.34e-01 │\n",
-       "│        P3w │ 1.95e-06 │ 0.00e+00 │ 1.95e-06 │ 1.95e-06 │ 1.95e-06 │\n",
-       "│        P4n │ 6.49e-01 │ 0.00e+00 │ 6.49e-01 │ 6.49e-01 │ 6.49e-01 │\n",
-       "│        P4w │ 1.13e-05 │ 0.00e+00 │ 1.13e-05 │ 1.13e-05 │ 1.13e-05 │\n",
-       "│         R1 │ 3.03e+02 │ 3.05e-05 │ 3.03e+02 │ 3.03e+02 │ 3.03e+02 │\n",
-       "│         R2 │ 3.82e+06 │ 2.50e-01 │ 3.82e+06 │ 3.82e+06 │ 3.82e+06 │\n",
-       "│ sigma_imag │ 5.65e+00 │ 0.00e+00 │ 5.65e+00 │ 5.65e+00 │ 5.65e+00 │\n",
-       "│ sigma_real │ 7.92e+00 │ 0.00e+00 │ 7.92e+00 │ 7.92e+00 │ 7.92e+00 │\n",
+       "│        P2n │ 2.08e-01 │ 3.24e-04 │ 2.08e-01 │ 2.07e-01 │ 2.08e-01 │\n",
+       "│        P2w │ 4.98e-07 │ 6.80e-10 │ 4.98e-07 │ 4.97e-07 │ 4.99e-07 │\n",
+       "│        P4n │ 1.00e+00 │ 2.51e-05 │ 1.00e+00 │ 1.00e+00 │ 1.00e+00 │\n",
+       "│        P4w │ 1.55e-06 │ 3.00e-09 │ 1.55e-06 │ 1.54e-06 │ 1.55e-06 │\n",
+       "│<span style=\"background-color: #808000\">         R1 </span>│<span style=\"background-color: #808000\"> 4.18e+01 </span>│<span style=\"background-color: #808000\"> 5.55e+01 </span>│<span style=\"background-color: #808000\"> 2.30e+01 </span>│<span style=\"background-color: #808000\"> 1.57e+00 </span>│<span style=\"background-color: #808000\"> 1.50e+02 </span>│\n",
+       "│<span style=\"background-color: #808000\">         R3 </span>│<span style=\"background-color: #808000\"> 2.24e+11 </span>│<span style=\"background-color: #808000\"> 1.03e+12 </span>│<span style=\"background-color: #808000\"> 7.86e+10 </span>│<span style=\"background-color: #808000\"> 2.04e+10 </span>│<span style=\"background-color: #808000\"> 6.49e+11 </span>│\n",
+       "│ sigma_imag │ 5.06e+03 │ 4.61e+01 │ 5.06e+03 │ 4.99e+03 │ 5.14e+03 │\n",
+       "│ sigma_real │ 4.71e+03 │ 4.33e+01 │ 4.71e+03 │ 4.64e+03 │ 4.79e+03 │\n",
        "└────────────┴──────────┴──────────┴──────────┴──────────┴──────────┘\n",
        "</pre>\n"
       ],
       "text/plain": [
-       "\u001b[3m                 R1-[R2,P3]-P4, 67/1000 divergences                  \u001b[0m\n",
+       "\u001b[3m                 R1-[P2,[R3,P4]], 0/1000 divergences                 \u001b[0m\n",
        "┏━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┓\n",
        "┃\u001b[1m \u001b[0m\u001b[1m Parameter\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m    Mean\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m     Std\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m  Median\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m    5.0%\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m   95.0%\u001b[0m\u001b[1m \u001b[0m┃\n",
        "┡━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━┩\n",
-       "│        P3n │ 8.34e-01 │ 5.96e-08 │ 8.34e-01 │ 8.34e-01 │ 8.34e-01 │\n",
-       "│        P3w │ 1.95e-06 │ 0.00e+00 │ 1.95e-06 │ 1.95e-06 │ 1.95e-06 │\n",
-       "│        P4n │ 6.49e-01 │ 0.00e+00 │ 6.49e-01 │ 6.49e-01 │ 6.49e-01 │\n",
-       "│        P4w │ 1.13e-05 │ 0.00e+00 │ 1.13e-05 │ 1.13e-05 │ 1.13e-05 │\n",
-       "│         R1 │ 3.03e+02 │ 3.05e-05 │ 3.03e+02 │ 3.03e+02 │ 3.03e+02 │\n",
-       "│         R2 │ 3.82e+06 │ 2.50e-01 │ 3.82e+06 │ 3.82e+06 │ 3.82e+06 │\n",
-       "│ sigma_imag │ 5.65e+00 │ 0.00e+00 │ 5.65e+00 │ 5.65e+00 │ 5.65e+00 │\n",
-       "│ sigma_real │ 7.92e+00 │ 0.00e+00 │ 7.92e+00 │ 7.92e+00 │ 7.92e+00 │\n",
+       "│        P2n │ 2.08e-01 │ 3.24e-04 │ 2.08e-01 │ 2.07e-01 │ 2.08e-01 │\n",
+       "│        P2w │ 4.98e-07 │ 6.80e-10 │ 4.98e-07 │ 4.97e-07 │ 4.99e-07 │\n",
+       "│        P4n │ 1.00e+00 │ 2.51e-05 │ 1.00e+00 │ 1.00e+00 │ 1.00e+00 │\n",
+       "│        P4w │ 1.55e-06 │ 3.00e-09 │ 1.55e-06 │ 1.54e-06 │ 1.55e-06 │\n",
+       "│\u001b[43m \u001b[0m\u001b[43m        R1\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m4.18e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m5.55e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.30e+01\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.57e+00\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.50e+02\u001b[0m\u001b[43m \u001b[0m│\n",
+       "│\u001b[43m \u001b[0m\u001b[43m        R3\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.24e+11\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m1.03e+12\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m7.86e+10\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m2.04e+10\u001b[0m\u001b[43m \u001b[0m│\u001b[43m \u001b[0m\u001b[43m6.49e+11\u001b[0m\u001b[43m \u001b[0m│\n",
+       "│ sigma_imag │ 5.06e+03 │ 4.61e+01 │ 5.06e+03 │ 4.99e+03 │ 5.14e+03 │\n",
+       "│ sigma_real │ 4.71e+03 │ 4.33e+01 │ 4.71e+03 │ 4.64e+03 │ 4.79e+03 │\n",
        "└────────────┴──────────┴──────────┴──────────┴──────────┴──────────┘\n"
       ]
      },
@@ -761,8 +1084,9 @@
     }
    ],
    "source": [
-    "for mcmc, circuit in zip(mcmc_list, circuits_copy.circuitstring):\n",
-    "    ae.visualization.print_summary_statistics(mcmc, circuit)"
+    "for mcmc, stat, circuit in zip(mcmcs, status, circuits.circuitstring):\n",
+    "    if stat == 0:\n",
+    "        ae.visualization.print_summary_statistics(mcmc, circuit)"
    ]
   },
   {
@@ -780,7 +1104,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 24,
+   "execution_count": null,
    "metadata": {
     "tags": []
    },
@@ -835,8 +1159,13 @@
     "    display(dropdown, output)\n",
     "\n",
     "# Cache rendered plots to avoid re-rendering\n",
-    "circuits_str = circuits_copy[\"circuitstring\"].tolist()\n",
-    "trace_plots = [plot_trace_all(mcmc, cstr) for mcmc, cstr in zip(mcmc_list, circuits_str)]\n",
+    "circuits_str = circuits[\"circuitstring\"].tolist()\n",
+    "trace_plots = []\n",
+    "for mcmc, stat, circuit in zip(mcmcs, status, circuits_str):\n",
+    "    if stat == 0:\n",
+    "        trace_plots.append(plot_trace_all(mcmc, circuit))\n",
+    "    else:\n",
+    "        trace_plots.append(\"Inference failed\")\n",
     "\n",
     "if interactive:\n",
     "    dropdown_trace_plots()"
@@ -857,7 +1186,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 26,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -895,8 +1224,13 @@
     "    display(dropdown, output)\n",
     "\n",
     "# Cache rendered plots to avoid re-rendering\n",
-    "circuits_str = circuits_copy[\"circuitstring\"].tolist()\n",
-    "nyquist_plots = [plot_nyquist(mcmc, circuit) for mcmc, circuit in zip(mcmc_list, circuits_str)]\n",
+    "circuits_str = circuits[\"circuitstring\"].tolist()\n",
+    "nyquist_plots = []\n",
+    "for mcmc, stat, circuit in zip(mcmcs, status, circuits_str):\n",
+    "    if stat == 0:\n",
+    "        nyquist_plots.append(plot_nyquist(mcmc, circuit))\n",
+    "    else:\n",
+    "        nyquist_plots.append(\"Inference failed\")\n",
     "\n",
     "if interactive:\n",
     "    dropdown_nyquist_plots()"
diff --git a/pyproject.toml b/pyproject.toml
index 99658fb8..9cec92b5 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -39,7 +39,7 @@ dependencies = [
     "jax",
     "julia",
     "matplotlib",
-    "mpire",
+    "mpire[dill]",
     "numpy",
     "numpyro",
     "pandas",
@@ -81,3 +81,6 @@ testpaths = [
     "tests",
     "integration",
 ]
+
+[tool.ruff]
+line-length = 88


Test patch:
diff --git a/tests/test_core.py b/tests/test_core.py
index 5c5d1245..0587e464 100644
--- a/tests/test_core.py
+++ b/tests/test_core.py
@@ -1,5 +1,7 @@
 import numpy as np
+import numpyro
 import pandas as pd
+import pytest
 
 from autoeis import core, io, utils
 
@@ -56,3 +58,56 @@ def test_gep_parallel():
     }
     circuits = core.generate_equivalent_circuits(Z, freq, **kwargs)
     assert isinstance(circuits, pd.DataFrame)
+
+
+def test_filter_implausible_circuits():
+    Z, freq = io.load_test_dataset()
+    circuits_unfiltered = io.load_test_circuits()
+    N1 = len(circuits_unfiltered)
+    circuits = core.filter_implausible_circuits(circuits_unfiltered)
+    N2 = len(circuits)
+    assert N2 < N1
+
+
+def test_bayesian_inference():
+    Z, freq = io.load_test_dataset()
+    circuits = io.load_test_circuits(filtered=True)
+    mcmcs = []
+    for row in circuits.itertuples():
+        circuit = row.circuitstring
+        p0_dict = row.Parameters
+        kwargs_mcmc = {
+            "num_warmup": 2500,
+            "num_samples": 1000,
+            "progress_bar": False,
+        }
+        mcmc, exist_code = core.perform_bayesian_inference(
+            circuit, Z, freq, p0_dict, **kwargs_mcmc
+        )
+        mcmcs.append((mcmc, exist_code))
+        assert exist_code in [-1, 0]
+        assert isinstance(mcmc, numpyro.infer.mcmc.MCMC)
+    assert len(mcmcs) == len(circuits)
+
+
+def test_bayesian_inference_batch():
+    Z, freq = io.load_test_dataset()
+    circuits = io.load_test_circuits(filtered=True)
+    mcmcs = core.perform_bayesian_inference_batch(circuits, Z, freq)
+    assert len(mcmcs) == len(circuits)
+    for mcmc, exist_code in mcmcs:
+        assert exist_code in [-1, 0]
+        assert isinstance(mcmc, numpyro.infer.mcmc.MCMC)
+
+
+@pytest.mark.skip(reason="This test is too slow!")
+def test_perform_full_analysis():
+    Z, freq = io.load_test_dataset()
+    results = core.perform_full_analysis(Z, freq)
+    required_columns = [
+        "circuitstring",
+        "Parameters",
+        "MCMC (chains)",
+        "MCMC (status)",
+    ]
+    assert all(col in results.columns for col in required_columns)