diff --git a/python/energy_flow_proper/.ob-jupyter/29e17c4e83fb0f863495287a946e8a380fd25322.svg b/python/energy_flow_proper/.ob-jupyter/29e17c4e83fb0f863495287a946e8a380fd25322.svg
new file mode 100644
index 0000000..d17110e
--- /dev/null
+++ b/python/energy_flow_proper/.ob-jupyter/29e17c4e83fb0f863495287a946e8a380fd25322.svg
@@ -0,0 +1,753 @@
+
+
+
diff --git a/python/energy_flow_proper/03_gaussian/.ob-jupyter/67e5608a7e0453729d1d531fb8f6c92790037582.svg b/python/energy_flow_proper/03_gaussian/.ob-jupyter/67e5608a7e0453729d1d531fb8f6c92790037582.svg
deleted file mode 100644
index fd31abf..0000000
--- a/python/energy_flow_proper/03_gaussian/.ob-jupyter/67e5608a7e0453729d1d531fb8f6c92790037582.svg
+++ /dev/null
@@ -1,3595 +0,0 @@
-
-
-
diff --git a/python/energy_flow_proper/03_gaussian/.ob-jupyter/89b9116fbbb22dad042046a52a77ba3f137028dd.svg b/python/energy_flow_proper/03_gaussian/.ob-jupyter/89b9116fbbb22dad042046a52a77ba3f137028dd.svg
new file mode 100644
index 0000000..540d84a
--- /dev/null
+++ b/python/energy_flow_proper/03_gaussian/.ob-jupyter/89b9116fbbb22dad042046a52a77ba3f137028dd.svg
@@ -0,0 +1,5406 @@
+
+
+
diff --git a/python/energy_flow_proper/03_gaussian/.ob-jupyter/fcb24c52ebb5d9e374171da718bf814fa7ce9b80.svg b/python/energy_flow_proper/03_gaussian/.ob-jupyter/8ea9a10e8eb94231023fb1fd414cd976f05c541b.svg
similarity index 59%
rename from python/energy_flow_proper/03_gaussian/.ob-jupyter/fcb24c52ebb5d9e374171da718bf814fa7ce9b80.svg
rename to python/energy_flow_proper/03_gaussian/.ob-jupyter/8ea9a10e8eb94231023fb1fd414cd976f05c541b.svg
index 25fa306..d7d8b7c 100644
--- a/python/energy_flow_proper/03_gaussian/.ob-jupyter/fcb24c52ebb5d9e374171da718bf814fa7ce9b80.svg
+++ b/python/energy_flow_proper/03_gaussian/.ob-jupyter/8ea9a10e8eb94231023fb1fd414cd976f05c541b.svg
@@ -26,7 +26,7 @@ L 372.103125 248.518125
L 372.103125 0
L 0 0
z
-" style="fill:none;"/>
+" style="fill:#ffffff;"/>
@@ -40,7 +40,7 @@ z
-
@@ -48,10 +48,10 @@ L 45.321307 7.2
+" id="m86b34c0c9e" style="stroke:#555555;stroke-width:0.8;"/>
-
+
@@ -86,13 +86,13 @@ z
-
-
+
@@ -130,13 +130,13 @@ z
-
-
+
@@ -169,13 +169,13 @@ z
-
-
+
@@ -219,13 +219,13 @@ z
-
-
+
@@ -278,13 +278,13 @@ z
-
-
+
@@ -313,13 +313,13 @@ z
-
-
+
@@ -332,13 +332,13 @@ L 273.594034 7.2
-
-
+
@@ -351,13 +351,13 @@ L 311.639489 7.2
-
-
+
@@ -372,7 +372,7 @@ L 349.684943 7.2
-
@@ -380,10 +380,10 @@ L 364.903125 214.39424
+" id="m1ae4b0bb66" style="stroke:#555555;stroke-width:0.8;"/>
-
+
@@ -406,13 +406,13 @@ z
-
-
+
@@ -426,13 +426,13 @@ L 364.903125 171.418633
-
-
+
@@ -446,13 +446,13 @@ L 364.903125 128.443026
-
-
+
@@ -466,13 +466,13 @@ L 364.903125 85.467419
-
-
+
@@ -486,4809 +486,4809 @@ L 364.903125 42.491812
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/python/energy_flow_proper/03_gaussian/.ob-jupyter/b6bfa7556dc73a35795cab91ab6b7cc0d88b2118.svg b/python/energy_flow_proper/03_gaussian/.ob-jupyter/b6bfa7556dc73a35795cab91ab6b7cc0d88b2118.svg
new file mode 100644
index 0000000..abd58bb
--- /dev/null
+++ b/python/energy_flow_proper/03_gaussian/.ob-jupyter/b6bfa7556dc73a35795cab91ab6b7cc0d88b2118.svg
@@ -0,0 +1,6382 @@
+
+
+
diff --git a/python/energy_flow_proper/03_gaussian/.ob-jupyter/dccc2c78e24e15583a06d4875345490b56a15390.svg b/python/energy_flow_proper/03_gaussian/.ob-jupyter/dccc2c78e24e15583a06d4875345490b56a15390.svg
new file mode 100644
index 0000000..9bfb361
--- /dev/null
+++ b/python/energy_flow_proper/03_gaussian/.ob-jupyter/dccc2c78e24e15583a06d4875345490b56a15390.svg
@@ -0,0 +1,6852 @@
+
+
+
diff --git a/python/energy_flow_proper/03_gaussian/.ob-jupyter/facdca9188abacca9ba42ce98ab3b4ce56b042ea.svg b/python/energy_flow_proper/03_gaussian/.ob-jupyter/facdca9188abacca9ba42ce98ab3b4ce56b042ea.svg
new file mode 100644
index 0000000..8173ba2
--- /dev/null
+++ b/python/energy_flow_proper/03_gaussian/.ob-jupyter/facdca9188abacca9ba42ce98ab3b4ce56b042ea.svg
@@ -0,0 +1,2626 @@
+
+
+
diff --git a/python/energy_flow_proper/03_gaussian/comparison_with_hops.org b/python/energy_flow_proper/03_gaussian/comparison_with_hops.org
index d28b17a..b6fdd07 100644
--- a/python/energy_flow_proper/03_gaussian/comparison_with_hops.org
+++ b/python/energy_flow_proper/03_gaussian/comparison_with_hops.org
@@ -274,12 +274,10 @@ We calculate the sytem energy just for fun.
result.N,
stg.__HI_nonlinear,
)
- # for energy, var, n in zip(*e_sys):
- # plt.plot(result.τ, energy.real, label=f"n={n}", alpha=n / e_sys[2][-1])
#+end_src
#+RESULTS:
-: 100%|██████████| 999/999 [00:17<00:00, 56.69it/s]
+: 100%|██████████| 999/999 [00:21<00:00, 47.50it/s]
#+begin_src jupyter-python
@@ -289,7 +287,7 @@ We calculate the sytem energy just for fun.
#+RESULTS:
:RESULTS:
:
-[[file:./.ob-jupyter/fcb24c52ebb5d9e374171da718bf814fa7ce9b80.svg]]
+[[file:./.ob-jupyter/8ea9a10e8eb94231023fb1fd414cd976f05c541b.svg]]
:END:
** Heat Flow
@@ -308,20 +306,15 @@ And then we calculate the flow.
#+end_src
#+RESULTS:
-: 100%|██████████| 999/999 [01:13<00:00, 13.62it/s]
+: 100%|██████████| 999/999 [01:17<00:00, 12.82it/s]
#+begin_src jupyter-python
- for n, flow, flow_std in full_flow[:-1]:
- plt.plot(result.τ, -flow, label=f"n={n}", alpha=n / full_flow[-1][0], linestyle="--")
- plt.errorbar(result.τ, -full_flow[-1][1], yerr=full_flow[-1][2], ecolor="yellow", label="final")
- plt.legend()
+ with ut.hiro_style():
+ ut.plot_convergence(result.τ, full_flow, transform=lambda y: -y)
#+end_src
#+RESULTS:
-:RESULTS:
-:
-[[file:./.ob-jupyter/af7c0d19e2cd4cd0c6e57d6d98a30c968631eca2.svg]]
-:END:
+[[file:./.ob-jupyter/b6bfa7556dc73a35795cab91ab6b7cc0d88b2118.svg]]
** Analytic
#+begin_src jupyter-python :results none
@@ -330,7 +323,7 @@ And then we calculate the flow.
Setting up the BCFs.
#+begin_src jupyter-python :results none
- α = gf.BCF(
+ α_0 = gf.BCF(
stg.t_max,
stg.__bcf_zero_temp,
num_terms=4,
@@ -347,27 +340,26 @@ Setting up the BCFs.
We can now initialize the parameter object for the alogrithm.
#+begin_src jupyter-python :results none
- sys = gf.SystemParams(Ω=stg.OMEGA, η=stg.eta, α=α)
+ sys = gf.SystemParams(Ω=stg.OMEGA, η=stg.eta, α_0=α_0)
#+end_src
Now we can define the flow:
#+begin_src jupyter-python :results none
- flow = gf.Flow(sys, α_0_dot, n=1)
+ flow = gf.Flow(sys, α_0, α_0_dot, n=1)
flow_τ = flow(result.τ)
#+end_src
And plot it against the numerically obtained flow.
#+begin_src jupyter-python
- %matplotlib inline
- plt.errorbar(result.τ, -full_flow[-1][1], yerr=full_flow[-1][2]*2, ecolor="yellow", label="HOPS")
- plt.plot(result.τ, flow_τ, label="analytic")
- plt.legend()
+ fig, ax = ut.plot_convergence(result.τ, full_flow, transform=lambda y: -y)
+ ax.plot(result.τ, flow_τ, label="analytic", color="blue", linestyle="-.")
+ ax.legend()
#+end_src
#+RESULTS:
:RESULTS:
-:
-[[file:./.ob-jupyter/547af6e4599bfd19fc0d085fba9ce6e04ea19a58.svg]]
+:
+[[file:./.ob-jupyter/dccc2c78e24e15583a06d4875345490b56a15390.svg]]
:END:
#+begin_src jupyter-python
@@ -381,6 +373,6 @@ And plot it against the numerically obtained flow.
#+RESULTS:
:RESULTS:
-:
-[[file:./.ob-jupyter/67e5608a7e0453729d1d531fb8f6c92790037582.svg]]
+:
+[[file:./.ob-jupyter/facdca9188abacca9ba42ce98ab3b4ce56b042ea.svg]]
:END:
diff --git a/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/0c841367a3fb206d42cd99485373f85699844767.svg b/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/0c841367a3fb206d42cd99485373f85699844767.svg
new file mode 100644
index 0000000..7300f03
--- /dev/null
+++ b/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/0c841367a3fb206d42cd99485373f85699844767.svg
@@ -0,0 +1,5566 @@
+
+
+
diff --git a/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/0ca192801974f645c02aa266464a620273af7abd.svg b/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/0ca192801974f645c02aa266464a620273af7abd.svg
new file mode 100644
index 0000000..d24a71b
--- /dev/null
+++ b/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/0ca192801974f645c02aa266464a620273af7abd.svg
@@ -0,0 +1,5653 @@
+
+
+
diff --git a/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/12bd8c1c361e502dcda461df4f32460a0c99c07b.svg b/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/12bd8c1c361e502dcda461df4f32460a0c99c07b.svg
new file mode 100644
index 0000000..fb6b245
--- /dev/null
+++ b/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/12bd8c1c361e502dcda461df4f32460a0c99c07b.svg
@@ -0,0 +1,7531 @@
+
+
+
diff --git a/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/259a63f5959aa24ce8a82dbbc4d4d962bc328762.svg b/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/259a63f5959aa24ce8a82dbbc4d4d962bc328762.svg
new file mode 100644
index 0000000..085521e
--- /dev/null
+++ b/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/259a63f5959aa24ce8a82dbbc4d4d962bc328762.svg
@@ -0,0 +1,7162 @@
+
+
+
diff --git a/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/7b082f4a36aee70924c9078088dbec1a515e36b5.svg b/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/7b082f4a36aee70924c9078088dbec1a515e36b5.svg
new file mode 100644
index 0000000..91cc9a4
--- /dev/null
+++ b/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/7b082f4a36aee70924c9078088dbec1a515e36b5.svg
@@ -0,0 +1,6565 @@
+
+
+
diff --git a/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/9560167a44dc90d2312c88fc8e2d1953c3324e64.svg b/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/9560167a44dc90d2312c88fc8e2d1953c3324e64.svg
new file mode 100644
index 0000000..9bc2699
--- /dev/null
+++ b/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/9560167a44dc90d2312c88fc8e2d1953c3324e64.svg
@@ -0,0 +1,753 @@
+
+
+
diff --git a/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/9a6fc74b82954ac7bda8251a2643fac6836313fb.svg b/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/9a6fc74b82954ac7bda8251a2643fac6836313fb.svg
new file mode 100644
index 0000000..6b9e345
--- /dev/null
+++ b/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/9a6fc74b82954ac7bda8251a2643fac6836313fb.svg
@@ -0,0 +1,1100 @@
+
+
+
diff --git a/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/d1252a21ce23059a7d0626a4843582a6197972c8.svg b/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/d1252a21ce23059a7d0626a4843582a6197972c8.svg
new file mode 100644
index 0000000..8568027
--- /dev/null
+++ b/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/d1252a21ce23059a7d0626a4843582a6197972c8.svg
@@ -0,0 +1,8081 @@
+
+
+
diff --git a/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/f07dfb08f941c1627b6d3062b850e1b7477613ca.svg b/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/f07dfb08f941c1627b6d3062b850e1b7477613ca.svg
new file mode 100644
index 0000000..addbed3
--- /dev/null
+++ b/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/f07dfb08f941c1627b6d3062b850e1b7477613ca.svg
@@ -0,0 +1,883 @@
+
+
+
diff --git a/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/f64dc21b619eccec035d0c07ecfc4c3231ac7308.svg b/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/f64dc21b619eccec035d0c07ecfc4c3231ac7308.svg
new file mode 100644
index 0000000..a180bc8
--- /dev/null
+++ b/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/f64dc21b619eccec035d0c07ecfc4c3231ac7308.svg
@@ -0,0 +1,7283 @@
+
+
+
diff --git a/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/faeb0e303d1029daae64e0547b89da49507b8991.svg b/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/faeb0e303d1029daae64e0547b89da49507b8991.svg
new file mode 100644
index 0000000..e38ef78
--- /dev/null
+++ b/python/energy_flow_proper/04_gaussian_nonzero/.ob-jupyter/faeb0e303d1029daae64e0547b89da49507b8991.svg
@@ -0,0 +1,671 @@
+
+
+
diff --git a/python/energy_flow_proper/04_gaussian_nonzero/comparison_with_hops.org b/python/energy_flow_proper/04_gaussian_nonzero/comparison_with_hops.org
new file mode 100644
index 0000000..0bcd7a3
--- /dev/null
+++ b/python/energy_flow_proper/04_gaussian_nonzero/comparison_with_hops.org
@@ -0,0 +1,158 @@
+#+PROPERTY: header-args :session comparison_hops_gauss_nonzero :kernel python :pandoc yes :async yes
+
+* Setup Boilerplate
+#+begin_src jupyter-python :results none
+ import numpy as np
+ import matplotlib.pyplot as plt
+ import stg_helper
+ import stg
+ from hopsflow import util, hopsflow
+ import utilities as ut
+#+end_src
+
+* Load Hops Data
+#+begin_src jupyter-python :results none
+ system_params = stg_helper.get_system_param(stg)
+ class result:
+ hd = stg_helper.get_hierarchy_data(stg, read_only=True)
+ N = hd.samples[0]
+ τ = hd.get_time()
+ # ρ = hd.get_rho_t()
+ ψ_1 = hd.aux_states
+ ψ = hd.stoc_traj
+ therm_y = hd.therm_y
+#+end_src
+
+#+begin_src jupyter-python
+ _, e_sys, σ_e_sys = util.operator_expectation_ensemble(
+ iter(result.ψ),
+ system_params.H_sys.todense(),
+ result.N,
+ stg.__HI_nonlinear,
+ )
+#+end_src
+
+#+RESULTS:
+: 100%|██████████| 4581/4581 [01:35<00:00, 47.89it/s]
+
+#+begin_src jupyter-python
+ plt.errorbar(result.τ, e_sys.real, yerr=σ_e_sys.real, ecolor="yellow")
+#+end_src
+
+#+RESULTS:
+:RESULTS:
+:
+[[file:./.ob-jupyter/0c841367a3fb206d42cd99485373f85699844767.svg]]
+:END:
+
+* Heat Flow
+#+begin_src jupyter-python
+ hf_system = hopsflow.SystemParams(
+ system_params.L.todense(), stg.__g, stg.__w, stg.__bcf_scale, stg.__HI_nonlinear
+ )
+ ξ = stg_helper.get_eta_therm(stg)
+ ξ.calc_deriv = True
+ hf_therm = hopsflow.ThermalParams(ξ=ξ, τ=result.τ, num_deriv=False)
+
+ full_flow = hopsflow.heat_flow_ensemble(
+ iter(result.ψ), iter(result.ψ_1), hf_system, result.N, (iter(result.therm_y), hf_therm), every=int(result.N / 10)
+ )
+#+end_src
+
+#+RESULTS:
+: 100%|██████████| 4581/4581 [06:43<00:00, 11.36it/s]
+
+#+begin_src jupyter-python
+ with ut.hiro_style():
+ ut.plot_convergence(result.τ, full_flow, transform=lambda y: -y)
+#+end_src
+
+#+RESULTS:
+[[file:./.ob-jupyter/12bd8c1c361e502dcda461df4f32460a0c99c07b.svg]]
+
+#+RESULTS:
+
+* Analytic Solution
+#+begin_src jupyter-python :results none
+ from hopsflow import gaussflow as gf
+#+end_src
+
+
+Setting up the BCFs.
+#+begin_src jupyter-python :results none
+ α = gf.BCF(
+ stg.t_max,
+ stg.__bcf,
+ num_terms=6,
+ resolution=0.001,
+ )
+
+ α_0 = gf.BCF(
+ stg.t_max,
+ stg.__bcf_zero_temp,
+ num_terms=4,
+ resolution=0.001,
+ )
+
+ α_0_dot = gf.BCF(
+ stg.t_max,
+ lambda t: 2 / (1j * np.pi) * (stg.wc / (1 + 1j * stg.wc * t)) ** 3,
+ num_terms=5,
+ resolution=0.001,
+ )
+#+end_src
+
+
+LGTM.
+#+begin_src jupyter-python
+ fig, ax = ut.plot_complex(result.τ, α(result.τ)-α.approx(result.τ), label="finite")
+#+end_src
+
+#+RESULTS:
+[[file:./.ob-jupyter/9a6fc74b82954ac7bda8251a2643fac6836313fb.svg]]
+
+#+begin_src jupyter-python :results none
+ sys = gf.SystemParams(Ω=stg.OMEGA, η=stg.eta, α_0=α_0)
+ flow = gf.Flow(sys, α, α_0_dot, n=1)
+ flow_τ = flow(result.τ)
+#+end_src
+
+#+begin_src jupyter-python
+ plt.plot(result.τ, flow_τ)
+#+end_src
+
+#+RESULTS:
+:RESULTS:
+| |
+[[file:./.ob-jupyter/9560167a44dc90d2312c88fc8e2d1953c3324e64.svg]]
+:END:
+
+* Compare
+#+begin_src jupyter-python
+ fig, ax = ut.plot_convergence(result.τ, full_flow, transform=lambda y: -y)
+ ax.plot(result.τ, flow_τ, label="analytic")
+ ax.legend()
+#+end_src
+
+#+RESULTS:
+:RESULTS:
+:
+[[file:./.ob-jupyter/d1252a21ce23059a7d0626a4843582a6197972c8.svg]]
+:END:
+
+#+begin_src jupyter-python
+ fig, ax = ut.plot_diff_vs_sigma(result.τ, full_flow, flow_τ, transform=lambda y: -y)
+ ax.legend()
+#+end_src
+
+#+RESULTS:
+:RESULTS:
+:
+[[file:./.ob-jupyter/7b082f4a36aee70924c9078088dbec1a515e36b5.svg]]
+:END:
+
+
+* Cleanup
+#+begin_src jupyter-python :results none
+ result.hd.close()
+#+end_src
diff --git a/python/energy_flow_proper/04_gaussian_nonzero/stg.py b/python/energy_flow_proper/04_gaussian_nonzero/stg.py
new file mode 100644
index 0000000..dbc532a
--- /dev/null
+++ b/python/energy_flow_proper/04_gaussian_nonzero/stg.py
@@ -0,0 +1,203 @@
+# native
+import pathlib
+import traceback
+import pickle
+
+# third party
+import numpy as np
+from scipy.special import gamma as gamma_func
+import qutip
+
+# hops
+import hops.core.hierarchyData as hid
+import hops.util.bcf as bcf
+import hops.util.matrixLib as ml
+import hops.util.truncation_schemes as truncation_schemes
+import stg_helper
+
+from hops.data.path import get_path as get_hops_data_path
+
+################################################
+#
+# OVERALL PARAMETERS
+#
+# may be overwritten in later definitions
+#
+################################################
+
+max_HO_level = 25
+OMEGA = 1
+
+wc = 2
+s = 1
+__BCF_FIT_n = 5
+__T = 1
+
+__HI_eta_type = "fft"
+__HI_eta_temperature_type = "ts"
+
+eta = 0.5
+
+p_trunc = 1.5
+q_trunc = 0.5
+
+n_eq = None
+kfac = 1.4
+kmax_list_pre_sqrt = True
+
+__HI_k_max = None
+
+t_max = 16
+
+sp_tol = 1e-4
+__HI_seed = 0
+
+
+__HI_accum_only = False
+__HI_number_of_samples = 4582
+
+
+__BCF_FIT_good_data_path = get_hops_data_path() + "/good_fit_data_abs_brute_force"
+with open(__BCF_FIT_good_data_path, "rb") as f:
+ good_fit_data_abs = pickle.load(f)
+
+try:
+ _, g_tilde, w_tilde = good_fit_data_abs[(__BCF_FIT_n, s)]
+ __g = 1 / np.pi * gamma_func(s + 1) * wc ** (s + 1) * np.asarray(g_tilde)
+ __w = wc * np.asarray(w_tilde)
+ __HI_truncation_scheme = stg_helper.get_truncation_scheme(
+ kmax_list_pre_sqrt=kmax_list_pre_sqrt,
+ g=__g,
+ w=__w,
+ q=q_trunc,
+ p=p_trunc,
+ kfac=kfac,
+ )
+except KeyError:
+ raise KeyError(
+ "no fit data in {} for n={} and s={}".format(
+ __BCF_FIT_good_data_path, __BCF_FIT_n, s
+ )
+ )
+
+__BCF_FIT_gw_hash = None
+__temp_method = "stoc_pot"
+
+__bcf_scale = eta
+# print("eta", __bcf_scale)
+__bcf_zero_temp = bcf.OhmicBCF_zeroTemp(s=s, eta=1, w_c=wc)
+__spd_zero_temp = bcf.OhmicSD_zeroTemp(s=s, eta=1, w_c=wc)
+
+if __T == 0:
+ __bcf = __bcf_zero_temp
+ __spec_dens = __spd_zero_temp
+ __stoc_temp_corr = None
+ __stoc_temp_dens = None
+ beta = np.inf
+ __HI_save_therm_y = False
+else:
+ __bcf = bcf.OhmicBCF_nonZeroTemp(s=s, eta=1, w_c=wc, beta=1 / __T)
+ __spec_dens = bcf.PseudoSD(sd_at_t_zero=__spd_zero_temp, T=__T)
+ __stoc_temp_corr = bcf.Ohmic_StochasticPotentialCorrelations(
+ s=s, eta=1, w_c=wc, beta=1 / __T
+ )
+ __stoc_temp_dens = bcf.Ohmic_StochasticPotentialDensity(
+ s=s, eta=1, w_c=wc, beta=1 / __T
+ )
+ beta = 1 / __T
+ __HI_save_therm_y = True
+
+q = qutip.operators.create(max_HO_level) + qutip.operators.destroy(max_HO_level)
+p = (qutip.operators.destroy(max_HO_level) - qutip.operators.create(max_HO_level)) / 1j
+__L = 0.5 * q
+__H_sys = 0.25 * OMEGA * (p ** 2 + q ** 2)
+
+__L = ml.Operator(data=__L, fmt="coo")
+__H_sys = ml.Operator(data=__H_sys, fmt="coo")
+
+
+#################################################
+#
+# settings for stoc proc
+#
+#################################################
+__SP_t_max = t_max
+
+__SP_db_name = "SPCache"
+__SP_db_path = "."
+
+__SP_KLE_tol = sp_tol
+__SP_KLE_ng_fac = 4
+__SP_KLE_meth = "fourpoint"
+# __SP_KLE_meth = 'trapz'
+# __SP_KLE_diff_method = 'full'
+# __SP_KLE_dm_random_samples = None
+
+__SP_KLE_diff_method = "random"
+__SP_KLE_dm_random_samples = 10000
+
+
+if __temp_method == "stoc_pot":
+ __SP_FFT_neg_frequ = False
+else:
+ if __T == 0:
+ __SP_FFT_neg_frequ = False
+ else:
+ __SP_FFT_neg_frequ = True
+
+# __SP_FFT_intgr_tol = 5e-3
+# __SP_FFT_intpl_tol = 5e-3
+
+__SP_FFT_intgr_tol = sp_tol
+__SP_FFT_intpl_tol = sp_tol
+
+################################################
+#
+# System and Hierarchy parameters
+#
+################################################
+
+# __g = None
+# __w = None
+__H_dyn = []
+
+__psi0 = np.array(qutip.states.fock(max_HO_level, n=1).data.todense()).flatten()
+
+# for image: stoch_trj.png
+# __INTGR_t_max = 6
+# __INTGR_t_steps = 750
+__INTGR_t_max = t_max
+__INTGR_t_steps = int(t_max / 0.01)
+
+__INTGR_name = "zvode"
+__INTGR_atol = "1e-8"
+__INTGR_rtol = "1e-8"
+__INTGR_order = 5
+__INTGR_nsteps = 10_000
+__INTGR_method = "bdf"
+
+__HI_g_scale = None
+__HI_sample_method = "random"
+
+__HI_nonlinear = True
+__HI_normalized = False
+__HI_normalized_by_hand = True
+__HI_with_terminator = False
+# __HI_result_data = hid.RESULT_TYPE_ZEROTH_ORDER_ONLY
+__HI_result_data = hid.ResultType.ZEROTH_AND_FIRST_ORDER
+
+
+#################################################
+#
+# DB and Server/Client parameters
+#
+#################################################
+__db_name = "SBM"
+__db_path = "."
+__host = "localhost"
+__verbose = 1
+__authkey = __db_name
+__desc = __db_name
+__port = 35254
+__nproc = 0
+__nice = 19
diff --git a/python/energy_flow_proper/03_gaussian/.ob-jupyter/af7c0d19e2cd4cd0c6e57d6d98a30c968631eca2.svg b/python/energy_flow_proper/hopsflow/.ob-jupyter/104c1adbefe1f3072d2cd2524fd6f84fdf515518.svg
similarity index 63%
rename from python/energy_flow_proper/03_gaussian/.ob-jupyter/af7c0d19e2cd4cd0c6e57d6d98a30c968631eca2.svg
rename to python/energy_flow_proper/hopsflow/.ob-jupyter/104c1adbefe1f3072d2cd2524fd6f84fdf515518.svg
index 9196ad2..988fca2 100644
--- a/python/energy_flow_proper/03_gaussian/.ob-jupyter/af7c0d19e2cd4cd0c6e57d6d98a30c968631eca2.svg
+++ b/python/energy_flow_proper/hopsflow/.ob-jupyter/104c1adbefe1f3072d2cd2524fd6f84fdf515518.svg
@@ -40,7 +40,7 @@ z
-
@@ -48,10 +48,10 @@ L 45.321307 7.2
+" id="m99ef0e1cbd" style="stroke:#555555;stroke-width:0.8;"/>
-
+
@@ -86,13 +86,13 @@ z
-
-
+
@@ -130,13 +130,13 @@ z
-
-
+
@@ -169,13 +169,13 @@ z
-
-
+
@@ -219,13 +219,13 @@ z
-
-
+
@@ -278,13 +278,13 @@ z
-
-
+
@@ -313,13 +313,13 @@ z
-
-
+
@@ -332,13 +332,13 @@ L 273.594034 7.2
-
-
+
@@ -351,13 +351,13 @@ L 311.639489 7.2
-
-
+
@@ -372,7 +372,7 @@ L 349.684943 7.2
-
@@ -380,10 +380,10 @@ L 364.903125 214.756364
+" id="mc5c0405fce" style="stroke:#555555;stroke-width:0.8;"/>
-
+
@@ -406,13 +406,13 @@ z
-
-
+
@@ -426,13 +426,13 @@ L 364.903125 181.027576
-
-
+
@@ -446,13 +446,13 @@ L 364.903125 147.298789
-
-
+
@@ -500,13 +500,13 @@ z
-
-
+
@@ -520,13 +520,13 @@ L 364.903125 79.841214
-
-
+
@@ -567,13 +567,13 @@ z
-
-
+
@@ -587,4809 +587,4809 @@ L 364.903125 12.383639
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/python/energy_flow_proper/03_gaussian/.ob-jupyter/547af6e4599bfd19fc0d085fba9ce6e04ea19a58.svg b/python/energy_flow_proper/hopsflow/.ob-jupyter/600288338108038013eee40bb2a493b528bf4bff.svg
similarity index 59%
rename from python/energy_flow_proper/03_gaussian/.ob-jupyter/547af6e4599bfd19fc0d085fba9ce6e04ea19a58.svg
rename to python/energy_flow_proper/hopsflow/.ob-jupyter/600288338108038013eee40bb2a493b528bf4bff.svg
index d728b14..499ef6c 100644
--- a/python/energy_flow_proper/03_gaussian/.ob-jupyter/547af6e4599bfd19fc0d085fba9ce6e04ea19a58.svg
+++ b/python/energy_flow_proper/hopsflow/.ob-jupyter/600288338108038013eee40bb2a493b528bf4bff.svg
@@ -40,7 +40,7 @@ z
-
@@ -48,15 +48,15 @@ L 45.321307 7.2
+" id="m0e2a2743a8" style="stroke:#555555;stroke-width:0.8;"/>
-
+
-
+
-
-
+
-
+
-
-
+
-
+
-
-
+
-
+
-
-
+
-
+
-
-
+
-
+
-
-
+
-
+
@@ -332,18 +332,18 @@ L 273.594034 7.2
-
-
+
-
+
@@ -351,18 +351,18 @@ L 311.639489 7.2
-
-
+
-
+
@@ -372,7 +372,7 @@ L 349.684943 7.2
-
@@ -380,10 +380,10 @@ L 364.903125 214.756364
+" id="m9c9acde513" style="stroke:#555555;stroke-width:0.8;"/>
-
+
@@ -406,13 +406,13 @@ z
-
-
+
@@ -426,13 +426,13 @@ L 364.903125 180.977767
-
-
+
@@ -446,13 +446,13 @@ L 364.903125 147.19917
-
-
+
@@ -500,13 +500,13 @@ z
-
-
+
@@ -520,13 +520,13 @@ L 364.903125 79.641976
-
-
+
@@ -567,13 +567,13 @@ z
-
-
+
@@ -587,4947 +587,4956 @@ L 364.903125 12.084783
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+