From c20e9247e329512d1de7e2f8ba2ea36fadd291a7 Mon Sep 17 00:00:00 2001
From: Adrienucl <adrien.payen@student.uclouvain.be>
Date: Fri, 3 May 2024 20:55:35 +0200
Subject: [PATCH] correction tmc et markovDecision

---
 ancien/markoVVV.py      |  61 +++++-----
 ancien/tmcccc.py        |  12 ++
 markovDecision.py       |  27 +++--
 plot.py                 |   4 +-
 strategy_comparison.png | Bin 22200 -> 22206 bytes
 tmc.py                  | 241 +++++++++++++++++++---------------------
 validation.py           |  23 ++--
 7 files changed, 192 insertions(+), 176 deletions(-)

diff --git a/ancien/markoVVV.py b/ancien/markoVVV.py
index 8e92921..5cd533d 100644
--- a/ancien/markoVVV.py
+++ b/ancien/markoVVV.py
@@ -1,18 +1,20 @@
 import numpy as np
-from ancien.tmc import TransitionMatrixCalculator as tmc
+from tmc import TransitionMatrixCalculator as tmc
 
 class MarkovDecisionSolver:
     def __init__(self, layout: list, circle: bool):
-        self.Numberk = 15
+        self.nSquares = 15
+        self.precision = 1e-9
+        self.layout = layout
+        self.circle = circle
         self.tmc_instance = tmc()
-        self.safe_dice = self.tmc_instance._compute_safe_matrix()
-        self.normal_dice = self.tmc_instance._compute_normal_matrix(layout, circle)
-        self.risky_dice = self.tmc_instance._compute_risky_matrix(layout, circle)
-        self.jail = [i for i, x in enumerate(layout) if x == 3]
-        self.Dice = np.zeros(self.Numberk)
+        self.matrix_safe = self.tmc_instance._compute_safe_matrix()
+        self.matrix_normal, self.jail_n = self.tmc_instance._compute_normal_matrix(layout, circle)
+        self.matrix_risky, self.jail_r = self.tmc_instance._compute_risky_matrix(layout, circle)
+        self.Dice = np.zeros(self.nSquares, dtype=int)
 
     def solve(self):
-        ValueI = np.zeros(self.Numberk)
+        ValueI = np.zeros(self.nSquares)
         ValueINew = np.array([8.5, 7.5, 6.5, 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, 1, 0])
 
         i = 0
@@ -23,36 +25,36 @@ class MarkovDecisionSolver:
             np.copyto(ValueI, ValueINew)
 
             # Mettez à jour les valeurs de ValueINew pour chaque état
-            for k in range(self.Numberk - 1):
+            for k in range(self.nSquares - 1):
                 ValueINew[k] = 1 + min(
-                    np.dot(self.safe_dice[k], ValueI),
-                    np.dot(self.normal_dice[k], ValueI) + np.sum(self.normal_dice[k][self.jail]),
-                    np.dot(self.risky_dice[k], ValueI) + np.sum(self.risky_dice[k][self.jail])
+                    np.dot(self.matrix_safe[k], ValueI),
+                    np.dot(self.matrix_normal[k], ValueI) + np.sum(self.jail_n[k]),
+                    np.dot(self.matrix_risky[k], ValueI) + np.sum(self.jail_r[k])
                 )
 
-            ValueINew[self.Numberk - 1] = min(
-                np.dot(self.safe_dice[self.Numberk - 1], ValueI),
-                np.dot(self.normal_dice[self.Numberk - 1], ValueI),
-                np.dot(self.risky_dice[self.Numberk - 1], ValueI)
+            ValueINew[self.nSquares - 1] = min(
+                np.dot(self.matrix_safe[self.nSquares - 1], ValueI),
+                np.dot(self.matrix_normal[self.nSquares - 1], ValueI),
+                np.dot(self.matrix_risky[self.nSquares - 1], ValueI)
             )
 
             # Calculer les actions optimales (indice de l'action + 1)
-            for k in range(self.Numberk):
+            for k in range(self.nSquares):
                 self.Dice[k] = np.argmin([
-                    np.dot(self.safe_dice[k], ValueI),
-                    np.dot(self.normal_dice[k], ValueI) + np.sum(self.normal_dice[k][self.jail]),
-                    np.dot(self.risky_dice[k], ValueI) + np.sum(self.risky_dice[k][self.jail]),
+                    np.dot(self.matrix_safe[k], ValueINew),
+                    np.dot(self.matrix_normal[k], ValueINew) + np.sum(self.jail_n[k]),
+                    np.dot(self.matrix_risky[k], ValueINew) + np.sum(self.jail_r[k]),
                 ]) + 1
 
             # Vérifiez la convergence en utilisant une petite tolérance
-            if np.sum(np.abs(ValueINew - ValueI)) < 1e-9:
+            if np.sum(np.abs(ValueINew - ValueI)) < self.precision:
                 break
 
         # Retourne les valeurs finales de ValueINew et les actions optimales (Dice)
         return ValueINew, self.Dice
 
 
-def markovDecision(layout : list, circle : bool):
+def markovDecision(layout: list, circle: bool):
     solver = MarkovDecisionSolver(layout, circle)
     return solver.solve()
 
@@ -60,12 +62,17 @@ def markovDecision(layout : list, circle : bool):
 # Exemple d'utilisation de la fonction markovDecision avec les paramètres layout et circle
 layout = [0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 1, 0]
 
-
 # Résolution du problème avec différents modes de jeu
 result_false = markovDecision(layout, circle=False)
-print("\nWin as soon as land on or overstep the final square")
-print(result_false)
+print("\nStopping on the square to win")
+print("Expected costs for each square:")
+print(result_false[0])
+print("Dice choices for each square:")
+print(result_false[1])
 
 result_true = markovDecision(layout, circle=True)
-print("\nStopping on the square to win")
-print(result_true)
+print("\nWin as soon as land on or overstep the final square")
+print("Expected costs for each square:")
+print(result_true[0])
+print("Dice choices for each square:")
+print(result_true[1])
diff --git a/ancien/tmcccc.py b/ancien/tmcccc.py
index 388cc13..29086c4 100644
--- a/ancien/tmcccc.py
+++ b/ancien/tmcccc.py
@@ -192,6 +192,18 @@ class TransitionMatrixCalculator:
                         continue
                 self.matrix_risky[k,k_prime] += p
         return self.matrix_risky
+    
+    def print_matrix_with_layout(self, title, matrix):
+        print(f"{title}:")
+        for i in range(matrix.shape[0]):
+            row_str = " | ".join(f"{matrix[i, j]:.3f}" for j in range(matrix.shape[1]))
+            print(row_str)
+        print()
+
+# Example Usage:
+layout_example = [0]*15
+calculator = TransitionMatrixCalculator()
+print(calculator.compute_transition_matrix(layout_example, circle=True))
 
 #tmc = TransitionMatrixCalculator()
 #tmc.tst_transition_matrix()
diff --git a/markovDecision.py b/markovDecision.py
index 276043e..5b6e73d 100644
--- a/markovDecision.py
+++ b/markovDecision.py
@@ -1,28 +1,28 @@
 import numpy as np
-from tmc_2 import TransitionMatrixCalculator as tmc
+from tmc import TransitionMatrixCalculator as tmc
 
 class MarkovDecisionSolver:
     def __init__(self, layout: list, circle: bool):
         self.Numberk = 15
         self.tmc_instance = tmc()
-        self.safe_dice = self.tmc_instance.proba_security_dice()
-        self.normal_dice, _ = self.tmc_instance.proba_normal_dice(layout, circle)  # Make sure to capture only the normal_dice component
-        self.risky_dice, _ = self.tmc_instance.proba_risky_dice(layout, circle)    # Make sure to capture only the risky_dice component
+        self.safe_dice = self.tmc_instance._compute_safe_matrix()
+        self.normal_dice, _ = self.tmc_instance._compute_normal_matrix(layout, circle)  # Make sure to capture only the normal_dice component
+        self.risky_dice, _ = self.tmc_instance._compute_risky_matrix(layout, circle)    # Make sure to capture only the risky_dice component
         self.jail = [i for i, x in enumerate(layout) if x == 3]
         self.ValueI = np.zeros(self.Numberk)
         self.DiceForStates = np.zeros(self.Numberk - 1)
 
     def _compute_vi_safe(self, k):
-        return np.sum(self.safe_dice[k] * self.ValueI) + np.sum(self.normal_dice[k][self.jail])
+        return np.dot(self.safe_dice[k], self.ValueI) + np.sum(self.normal_dice[k][self.jail])
 
 
     def _compute_vi_normal(self, k):
-        vi_normal = np.sum(self.normal_dice[k] * self.ValueI) + np.sum(self.normal_dice[k][self.jail])
+        vi_normal = np.dot(self.normal_dice[k], self.ValueI) + np.sum(self.normal_dice[k][self.jail])
         return vi_normal
 
 
     def _compute_vi_risky(self, k):
-        vi_risky = np.sum(self.risky_dice[k] * self.ValueI) + np.sum(self.risky_dice[k][self.jail])
+        vi_risky = np.dot(self.risky_dice[k], self.ValueI) + np.sum(self.risky_dice[k][self.jail])
         return vi_risky
 
     def solve(self):
@@ -36,15 +36,21 @@ class MarkovDecisionSolver:
                 vi_normal = self._compute_vi_normal(k)
                 vi_risky = self._compute_vi_risky(k)
 
-                ValueINew[k] = 1 + min(vi_safe, vi_normal, vi_risky)
+                # Compute the minimum value among vi_safe, vi_normal, and vi_risky
+                min_value = min(vi_safe, vi_normal, vi_risky)
 
-                if ValueINew[k] == 1 + vi_safe:
+                # Find which index (safe, normal, or risky) corresponds to the minimum value
+                if min_value == vi_safe:
+                    ValueINew[k] = 1 + vi_safe
                     self.DiceForStates[k] = 1
-                elif ValueINew[k] == 1 + vi_normal:
+                elif min_value == vi_normal:
+                    ValueINew[k] = 1 + vi_normal
                     self.DiceForStates[k] = 2
                 else:
+                    ValueINew[k] = 1 + vi_risky
                     self.DiceForStates[k] = 3
 
+
             if np.allclose(ValueINew, self.ValueI):
                 self.ValueI = ValueINew
                 break
@@ -59,7 +65,6 @@ def markovDecision(layout : list, circle : bool):
     return solver.solve()
 
 """
-
 # Exemple d'utilisation de la fonction markovDecision avec les paramètres layout et circle
 layout = [0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 1, 0]
 
diff --git a/plot.py b/plot.py
index 46b023a..cf39b57 100644
--- a/plot.py
+++ b/plot.py
@@ -1,5 +1,5 @@
 import matplotlib.pyplot as plt
-from valid import validation
+from validation import validation
 import numpy as np
 
 # Example layout and circle settings
@@ -48,7 +48,7 @@ def plot_state_based_turns(save=True):
 
     plt.show()
 
-def plot_state_based_comparison(validation_instance, num_games=1000):
+def plot_state_based_comparison(validation_instance, num_games=100000):
     optimal_turns, empirical_turns = validation_instance.compare_state_based_turns(num_games=num_games)
 
     # Plotting the state-based average turns comparison
diff --git a/strategy_comparison.png b/strategy_comparison.png
index d8b19f2ae884d963e9a1a6f2a97b07cd2f744384..089723dd698d20af173f314912b2e90a01d89143 100644
GIT binary patch
literal 22206
zcmeIa2UL|=w<UVivM`{S6$LSX0R>bP1SJ>{j|c{mWKocubEZngjEW+Ph#*J~N)8e%
zL{L;RNJbIKU?52DxsLw-t$yRa+x>dH?%V(9W|Squ3E$b@UTe)Y=Un^JQ3csKvzE_d
zFc@=~2lpRmFs8LL7*kKo_#Hp_y7CPl{t~m5Ibo}4amLm`*IJ(;uWM^*YGG??bZV8o
zzO{{!g}JccPQh)PR~g#cTH1&U37P%#0fH9R212VwCtl!1W?CLpvtckebm`BO2&r%*
z218{NbN?PC$AF#&C&$AMlapVod2cfH_HCYj?S;zzm|%6|>n|0em7*7`%T;D8+hm@$
zIQu9fwo;`cHiAFZI9g_7aD{@!p>AU{-~AC0pT;J>6uHXZdcWW^dvSr?TRX9biCG5L
zZ{C<lKD6=9-@?8R7r|iU25WL@vA$!h3YtdWoSgNWE$at|Jw4~rH=Z-+l}w>;woI8S
zPJc7jNlUZQ-?_idz~bQRE@KKe>zjrDc#*09_eK8yUlU6nwarWB@JQB|>g(0jr`srp
z9p-F(?JMW>?UR+QSXhF6k2)R@tCd+*`k288;KEI@)ZrGlJ=l<8r}*__e(Q%1t95jA
zDr3|XZ>>L4rQ<Q)+WyUw&3$}8)vo*fF}_2$OJdX#`#)UZX|x{x@xyV4dHo5Q%ZqMa
zxNza}5`n1CZ|`>{7E2}y*tEW0jLR6yK3{8*J^VTNhwg8TFNRN-dFk%Vn8C=+>*$Kl
zQMoT-rkAW<8N83}{Q2`8waF%zuV1hJn17}6>FI(xF9`#OfllT0^z>J6-@Yw<T%UMP
z*dWSfsQ1vpgGXQa@L8mHKa#o9|JQ7xh~tkB8CS<W`1bj2^jcYOLwuCizMK52V${|$
zM_R5+DFsPSnX^KqJNvheKnWM)+9V_Ac{(;_Wo5QKwL8)?GmG-iXLB%evuqkIW-}Oy
zyR1K5#I=MsH=i8;lE=ZXnfAm?`}#@=+b_*~+{Op0=f-@QU~-tQT)FbwmoJvKVm0=?
z^<vD7kl>!Y3mmG3h7lrWwY&}vLx)psgamc6Hwy{HyJ%0kTU%K<ZJ2n+U=*|%Xftx%
zwwl-P<XgYK3m2F&yRGBUoz0PwZX@r*;&pQ3j)feE+<$37f_m(%nKMgsCI*Bahlak7
zUAkbwqcd;)je2U6qtuh5c1uVoXS+Jp9qkax89Uxu<mZRG@K;`5^67%PnFG7*yEj-^
zSa3_ap167Q=C^O(j-NakbikYIUT~`2*pIJK$3ncu#>ZPbIwJ8Y+`i^7<qW)%f9hCq
zpu`S~#@)V~R25XBl{cxxJb9a$e&I*iW4X?{)cC!7_u`HzKRLN)hw1yHb*UDqb)Rt;
z7Oh+<c;v{D*5ZdcxReBiz}@#cY{Z<tg{mhT^Wh>EZ#XJFjcu-yv9a+I4^Efz@FS^}
zT+5b4tdwwW$NjdCA9|vj$IF~PYf)N{*uaIk+{crRE4Q7qVe+4N62#llUK+xGG{}?J
z=*7kP2`4t&*U5Wm(}QlUlmFDx5;E9RC+AZYuM>}jk1#BKM9Vg7*6|$o@oojb_V-Ui
z!sPF-W2TsCY+h0~mXx$z-hVq2F>wp4HES_{sCh$1$6x1X+Yf|2er)vP%ZFL)>`J}$
z>B{li5<Lx>s;gJ8?!;@DrN_M6)AY<Karq8oUMVT5)^`sy>^dt-z2>awzLQ?wG6mZ^
zh>fDjb)Zs}U;9~_aYclcY>`86y_(JEH>KZ;rQ)Yd``z&S=eL)yU8~G?8%@%CwIEZU
zW99A$KW%3wHf?#4P)^L(mV#)f@1Om}Y{Di6;ypU9i8kKg&42ka%B(J>Hpe5Up`@jv
zLTQI_#la(z!=W#)tq5PdNyYH}6Wt8=@eJHvBMtL!pI#Z4K005UY7uWz9cT3X&*{eH
zVb|^m>BM0nYAgHmIHcNfIjXqTzEU3U=g*zf8`+IWx1(LqS(6yPci%p{i7}`Af&!DK
zY`3W6k1z9X6cki=AZ|zZWzmWi(TN7d#(10BC%R|tyWi_p-+JKhA5~a*5R0bOQgFRG
zN;!JF?q9$8ZaB8LA=4qJ)kM<uhvl_pTldbNKfkjvD|4`~DV|gKjA79o0eTJV*4K}j
zx7Kx(ACao`;gj2b`X#%Qi%az0^Rv{<g?H{e5v>|uWsx%;R<P1#bGiPkMH_<f<Ot*f
z=fN6-fqI)_rcZ-C1r9DjV!Xe6xs>}e>$Z0S9WObSs>W#^8|rOn?dyww=rN(zmou5|
zKH4KHpq_Nlry^EE6rbwQCe^qKBunA$9F0`-l<G8xzD99mfiQ&!QQW)i-v_4h%E-!^
z)Tdb)H$F>WvvzH=NwuKNfdieLmC>oLT8~#0>}z>>ZSl&Lak_b4uk!O{uskZ`BLm6q
z<IWOaUo7<L?RI1^cJF0pFsx6UI`wGvE5n+ER&IeDn>K}gKBeh42AP9@Ok-Q_bCt*a
z$MdQsTwJCHw~3h78=8#vX7;f&y~4x8t-9ZD)fi>taXoo(8#3EzlPi}mZ{y|6avn%X
ze*E|`r~G}99rX<j*P1*g8>-xqeKVcov@*|}JAa;YpsPC7#7{3REp6H4Xw&4j-J;Bw
zh&R)6cX#&#NNfqN0`$;Dn@^O?m_1u~Vx&t*WAs~V(H!Q>lHh&9yZvsim8~@k!A&~g
z=;(N7bPIdlPKVxr552wSyT88?K45Gd73<bn5$VO-a_flX(`4k@H#hW#YV}%?+eCOd
zdwY8i;5x6~y}Rr*R>huP;K%q-lkhW<Nmp%)tN|4-r^&JVs0}Y(zFfZKN`9|JQ;00b
z+QfLVuIhMEUQWbJqKVGaQ|GltQ3KdTMMXoDqgCvSsLtKc+b<(iQ%g(Y5I_s@_>k{5
z+@fm;^vv2Ti#MIwZu-8Y%0817p}H4$F;*4u@$oTzTwPsz4Tn*j4)|2$cz9$EB03Kq
z_p+(nw{PD-h2oK#Fzh-(W|U4&HY%Hc@c5Sxd7Ohai3UgNa>_46=w#Z<N2|mpB)d2}
z*G{;7_-i`fx^+=1vFi8cO2sLLdn1M{z8|&-D9Cd9eg=DtzkC>bt1{iDt^ef;i}w$z
z>ywNWeK#tuEB`)7v6tC_T&X`2V3A^6$*+YMcN-l{UZGX;SZ?X?$VlV&fhpQ<1In={
zp6<2ls#11!eRkm5^2c~eq*CPZ+BB;cEwfFD^BJO(@+dhmQWHP+Aw}HKUB;<kQ1}KJ
z`cqq5I8s&Tb*YIb5~vZaJw0Zb7aOpF?Z!v!>I|>i;tpl>NTQZSo;&wjR)3kCxW~jZ
zGaf%79hI}c&q*?G5Xb5=GseF%7>-F>UT`yRw79yt@ipws8C2lfWq(*uP>?fj-pYCN
zf_6K7L)JZQ-y?d#lKJiX_glQvr%%_fohY`sqNS;+^vuyJGo^sXL$mDK_mFY{oovkz
z+3QvB9_;FQcRpv>^|NjM<;6wch8s)~Z<jA$K7RD*4P0<#D087*d&zT^BO^8fS{b%p
zc15>0h5&(Nig0jn)D72np#0zeAU3I}GHT`Epb9J_{Oq&C+HKp8qx@x9w_Z*$s|!0n
zd#Ul~H}{OIV(t;7sY`E9{rLIwosN0K$XX`tCBf<`rfObockkYHtm|3F%e!Ig)~!X$
z%Y^j&CdMY64u3B4JA&k#)g#Hfk)NNxNPoe?g}$N|jdd$I7@o4T0j5}svKXaJ$9=dp
zuBvGBk25bTD+l6gueqdER*ejFRX&oLT^XmPff}g#;ji<kvx08}CF*+J8#~N<YqETC
zm9&f06Z9@+PfoaGAp<PmWgnA0_Dv30>qlJIn@+L&d#FA|s|Zv^Da#FiZ>zpIe{FwH
zYE$F3w6H|=SWa`bJ4nZLyNjhJE1I95B^2o7<ka!$)h()Jv8p2~fImto<8SYa3Y8B}
zjy-MB4z2!*Y=dln=$>FpPmjRHw(D#RPn)&C{JmEIJ33G|Dvn5v>xptn2tR-R{E(cS
z;@-V~zP=-1Vj|@-7$d0tETXx&nJZR6KtTQi2T#g?zg!v88t*H6tJM4}ON;XI_BFW;
zJ%~|>HcLkw8MsX1c2upfcor<$=(w-#-2+8me&znbI*VwlmX|4Q86K1FmGL@F=2_#T
zLv8O(tiHRO_r_+~_xO8ri9Nb_@gi5vkqi`?Lp}-*B?UU(d0b7e0lu?s&Ykl1p0F%H
z?UUqq&Gc<~32J6JKvM`7U)*@7A|B;3orh=HIBKtX@AQ}$Gm~9^8+EGe8c$U3C%b2r
ztPO5CSDewD?fCtzXlrZhV{Fc@?wUl-&pbfNz{PiXcNmrJ_t|b##+#|XP9b0elQZsa
z;6l_3<Iz;zW&YxJQB=}?pR@d6Myasb(-Yn1s`mZu$FOnx1BdSU`}^xIvqxRVMloEm
zS0~w6dGY2GM}-aEC9P1I#EmpY*%cd9-@ku<VMBwKV%XuQD|EknE#TR-b?eu_p+x6_
z&ck)(@xnJGLnX(fx<#AHdhE+&XV+`S>n=-aX+P63ba=9Dur9?c8c^Zd@*Vtn;??mw
zsRB(wd!_+T8@;^BX<t<DTCc~qd$%S*`X66gd;<akbSF?91v}n(voUf*&abouN<H>y
z|4cU&S?3SumntDP5Q2Mjb#*gv7f_%gWUef!>E+XUdP)XgtPO%2tsJhvJwEom*k9Pd
z8;kxJm)mM+2E43}6#nSZBc&{7JGarE)RB>{ctD)-B9RyAM&)7tJFOl8T!j)E!e%H>
zGAdU}&|~&AW{n08x^$HBNesR}?L0Buri`}(JTSrTuT9XuvhMKRRZIf>FTJ^=0a7CI
z#~Db*ELCmx%$dgk1Fb*p*Z}<aC?sUZsTVT{JE8iQOpK52a2v5j9LWQ;ev>du)i1ik
zuM%_DU(_OQ0pFo^lt9`u*(05s=s^e-Kiihuo+Twm1vJx+B9o@!5#djsY(e*;pWd@g
z|8)em+47y1K>)xT(M1VpKigTpvIqE@dAzSNYcVJ1Mpac+fCmL2$78AH4Fshg>~iS5
zXApQSPBZ=XjT=E&Q6nHL*5`~kx_Y3aTz28Q!$+?y5vYhbwid`=uE~8g_FG%AN6~x+
za_&fb$n}aetJ4J73839vBV+sR6EjvV@j!MqE<HNFx1GSpDK4j(PH4RPa{riiz)w)?
z>Wv%o@){Z%zI^?<6;WaIY;t1sWo5LgS<yI3^GjrutEciWbEaFjZu|4kKd-j88)oXW
zx4bl~@)t4l*Ol_wRv*_{cyldkeuG0(ax!i|r?$5C%iw(%t{Mb7y)1mNEA<$z|1^*(
zr}^|jY~B@AnGyWQkc>_bcGsk6csH0gi5AP{_?|d)=<-&>l2sviORwwKuYYK5)mMr+
zQF>R>&Dm>UiJ+#TQk-VZ6ZO~w*{;J^f%jMBj1S&#*w#_p`fywH)=i4x3Oiok-gx@c
zYu};`N)b0ovs@fnfa&j<_bHesig--8hM=S#xU_(e9c@Y;zGlpsv%`y>^As;1UyVSf
zRm*|3yLZ=HIyj`dJV<cX_R?JjaJgg6nl<d`Ue+Q>u$Bz3!Rd1qsjKczCeU_iw5m{u
z^dD2b@=v|`;_Uk4!v)}@v=1E}Mn8W1ScZN~w9)mud`m^7qJ7=POP97zojR4?KE!=|
z<R$PwyN8EI%Rn{aa;Ug2=5gKA(-*!1%5qLjOn6lq@A&iV*=r~U%Yi~f*jsv8G5P$|
zvLVY>E;Q~+1>W2P`Ac>5#QT?}J-D(|h~J{|*>VZzBz&lk?bcw7IN$9715@|{;KDap
zU|f7AaD&^Ed<J9X%z(3CZEjpb_T>kxM>}*gH8u5POUn){lmrl6lv-j~NYOOL?sF{i
z=3d0n;6Ll@>$g+KiuDrY5_Rr3l=b_a;dsyrd6K@?<%<13d7fsje%Zt7>i*c4d^|kF
zOUU{WeU!V0JrA(PZ_%=48<s8|F@NjnIdM_UuJbnb8J8B3XpCDstv;Sx>C(Mb)^E!E
z5*{&0Nl72`vGx4}19p}>=mA`O8#gld?AeoYl~J%ZNa|GCh2+tZkp(Og%Ca;1lI0^7
z9reF84dr=1WH!Sy;3TK6mF>(z-IrVPN{Kq$eYF1<%l4l@kgZDq&O`sN`NtoBpwm{*
zur>11N4$kE5l}BIE<S<~2RiZh=8>9czA~Ne#HS5YGcIXnyQ-lLtw74&_Q0dPWHmKm
z{EA^$tKzhx(Ex5*x9$M)KSvtKQU*g>!N$gR$`7e)D@0Y$Hzfv0=@rhSf=d5LM$h<h
z&u!K=NGopN<FLTU$cR-bezaWQ1T;5&_7bIm&PrkK-#rp<-(Ex;Qi5KU@p+%L!vaDP
z*47EAa3KK59ix3Y)!?I|+X7t_0E$oF=|U_0y12M_aK@}z&YsFFI<t4tlm=!fz^xC^
zUnHV45*Wz2D>k(vMosu_fS7R607{4N-MfY^0oa&(e9^}-7-_Qu&i3*m5euOoIq&6F
zo9ri`q4M?XSG72UWOe;y^*#qDdYq@}Ben)+T4rW6iV1b_TB86(i@3PDgQDp73^7#N
zg-iv7s^@3f%*tiGxk>>ye1&u*7YnE>0eY9s7J3#0LMmE2%b6-D)gvPCtYlbMZ+#9-
zZC<HNvlj|W6duD_8}jJUqNPjMGe<t%IzlA|6+<2YSB0crk)U6+t5Np&ai6iVvD<g=
zZqU(b3gG9q+*vf^N{F2FTw$-TUw>odj_()Q!ZUSbt=Hr^#}kM^N#bgIg%bW4CSXKg
z|Fa2ROKcIm4F}(q{L;m%!a2P{HZi{32m!-FU;kPpvZ(A*?1M<xGgh|K3yp+0z2orD
zU3)qHM^@5&O;=T{B06GV#|>BVAK|{9N$&=mDu{o8Ly>qg!djsrjwucMsTaJwcoR{c
zshZ{>P4UgGsne$M9Mz`>d5(fuo!&f&#C`(7nBBT<{gFVWc<roy)bvO|GLDFC^tjyd
z0~{F(nR0UFo8q56+H>~zNX>L>Z$TEpf8#7-bj|4kZ{Pd(?>i6mx)pSVhK6q7<I5L$
zaQn8c)FIX;)mtdhu5b#7)PJ{A!pDyv^`4&Sb<BGI{>1R`aLr02@}Z}PSnrgzCTQ0s
z5EfmaWBApRB2acdef}JV*Eh=boB}rVm30=d2zu?>mFpD(94&taLGQAC^$%Xq)m^+e
zBQpgwP}aBCo4`pZ-sw_{RZ)wr8r51!Z?NkAjP`Xt0Rb_D|HH1MkpTYU*U5IJHv=Eq
zbEg<c5|vsh!?uG>i=XwJ3-e3l^|0(ws_}tlXiFx1LL(wJ<mcy$MX(-_dsbRn^k#-#
z*Xu1;cWF<6t{jSA#`-wZ@?}2KH~&WqBj(<Mv;@+h51cr#Gvl{<w!Evl-hxxs$@~um
z0H6zY?thoy)UdxQRwEp=z@{x*jxM<(Bj+cW{B{&IVTa?FlgO~BX4=H|f=jmTtk_tv
zn3dQIxBh0kFx_=H0lh#3f<XVS1L!ofrfe;c0kzp~nbeE-H09`^iLjJ@%(|R_&!5|;
ze(_i?Y90eh)<7H;<_Ji|B$NAS1p^&F&g7PI*95e8o5wemp3u8+YQ{pj!-sE!aSudD
zXs+Yqli9d&V@d~thwUgQJ*L@w>x%}aR+h6e_G;A?p=`?4oBgg_yXO1w;lrN!ix%}W
zqJN`D)^EhCjo@=tg5>7(3I;h^Z(Z~EFp*aN`L@3!Ob$Eml(O%>>khoCF&HT4Q)%p5
zY3wFl$wExMi>EYP3cc_h91yh-z@pxQGwD5U?E8NU9Oxr~9urQqKt+B+s$c`(1&FO>
zzV;J(2ttxuS%jXxif!J%7eiq1G{FJi;#H1PdS#xq!=x$#bUa7YVR}xk+rNd?=C&qd
zRsiRwTP=2=-!lG}i;o1@azoypLKaWsLCIZASMlxw`ege0Uw%3Nk$4y=UvQnr5A<K{
zoV*f93fxEM(>3OD&M!%fJn{6@2+^-elf!Kfso|Z*&)OY3*G_d7;q+R4CEq7lLQG5z
zh;44f40>Mk)p{;1&&1BAoE+X)r=D&AoCA@W@>Wh>z7pZ39C@6NO_@~=EJc3ncS(W(
z#T0ce8S1WC>)_x}w;TUcjyZ7*5|FJD3luTd?~~4vHK~fZ$%|H)Nt8-_eEiu>Kd(dh
z-JaqwYO~IN4-Mr7X`+-fF%ms3`sZ&~;3|{N>QvD5`SL=K(;+Ra7GwvyaTCyfbK_Vk
zqIvU-_8Ousi6rwOu?3NVM#&hBA~i~9qgj<{=WM(j$_do~pHP6<2=qy>(Y>P2jXHPk
zTxM+*5_`onC!6WN|Ni>aQ^St3$M)Z`s-VV|(=2tJoSpgCtoax>#0sA+>+xz}J3GQ3
zx|g8?Og@!Ai#jTw(Ai4`>j&IQg#N7}-+RX+Y90`F_}(Ls+Qz8pq|xc=g~n-T`S-N3
zUe0oJ+{Zv-f|W-HdqCO7LX)hF)le<F*7yaVwy84Z-!je?cG9&bCx&t=6ZGYnWw?SU
z2q;FlUWlVwDS<!r_^0hyTjJZK#`|wc4u4t*m8U4b^`)HpGsmx75^UpW>cwq7Uq$b0
zY6gJ-h%&={q$8ZGj)S#>w&M9yK!+$}S@oBBvFF`D3M&tjx3T3hco%S!cQL<GVO-YH
z;JqnM_n1uPF?9B3;>c{WU97wJiQT!xCYP=a*I!g#t{4~?7=`xo^ScLK?Fqchr%#`P
zF;0|V^@0oN9ak;<t>2Wmp$vz<xOMXWBwbavJ@kkpe2=?d?b4U!cY1W@j2Sn0A4s@V
z#f^ih!<%37_Ev$`(qr}U#U-xjpE=BC8J3e2pfhjo2G8Xde_yMfWEc#pj&#3HaAe-y
z;fRh|GiH>48K-T{6!nTmXRU@Nrr25{x{^P-(tj<h1!eT|;9ftFbW;bRR9K=Na$pYr
zF%p*oChgxv7bAl`(WN1>(ID(8=uVwFg$_6ZT(ABRj2-ymy1KfzhA1yLkX)R#O9eGa
z*>0#zNilDT0>KrH3-t*FZAITK7q^Yz?RYENM0l+t*+i8ns#mXGp+m^mYO-L#<dc&9
zK?dbS4nrj;S)3YsUZXs(IqIO`!k&+-bXLV~%G;6<VDa?CcI!_EuW^ZO)7Zg^i#Hcm
z_L~|vWF(7NG{%e#e>cHCLOU3VhKHr26-$oB5J!NooilMyr9pj6e1AB(GlNw`Jr{<s
zjjtqajdb7R$B%nCUAlB>`F6vjUK&4p^Baq&j!4jb_3`of)YWxgHxN}#P%9(!(!%xP
zK`h+qDZD1ADFiY3zF~Cip}1{(5JE~S_cFaH<K0zH_v^$2L)|zdHu<z*WjR)tM{^JB
zx8VnnU$D1Q*_&mruk;NMZ#%o`XDX|h(LNLbO45IqgZZ8Bhyq2D=s2FNq33xDw}_Yw
z88+wsVf_9{Fj}PTV5P975Bk^+cB=s+D_B`sjZBR8acfeq&d61pSJHP3(#dwS+U>;E
z^<@nOLKe|~dIHT=1YmLpGOa39FK(@MtS2z%l_Um32_gwXa&pXud$;3JFWq+VW7Q-P
zL*aZ=+R6(4fEiOH?q6QC@ew*wv0tltt7VN9z07}XrwN=!T>N#(k%OhBr6YJ*J|?94
z>Q}ecb8E7oMXs9V;vv)8ESFS-IY~oMV4{GIsAdzoA+++)eIznOj)gCFPH{%r0PZF6
zV8Ma~pFVuhHL)lQy##pGmiwA@LGR9a2Fh!sm=dkIEote-<NJ{gtfXaFzckn{UA!*3
zG78{^y@zcs*U>+wPUrf2Ndh!lE@mA%F)?bv^vOR}ijqYbE!n)G_W4g>5-=UB0jf9X
z(<eP5%RR;i{DAL6AQ!(bD3FCZobu1@NJ$f^OFiBCF<7l+mmzZ)Eus(k@?XAq(bD#3
zu&v)KUA!7<MpB^rh!JQex=zdElxnu=9}4RMT15HdS4#**@)S^2t!DeRa`$lmI<kfu
z%aKOn0P!{;JFv3*1}OdC1_!H97)jzH^n|`<Zrl=j<&!F!yn^=|o!Yo5OlQuVN#feO
zhf?u~4%TJ_1_Y@R=jq8n^HW^<n3XIKUquX#4CPG5f>n<Ox15rKk82F~1_kC^9?2L8
zC00eObd)PldNxo#{K&&9ynt|$PL8`4D<7k3b;7*Ck+Gew!*k*4AOl70S5m%v-apN&
zN<po*>uc1)v;25_Y7%9kzS$^Uq6ah9OG_7rf#*Ik{H;|H@eT48|A7FCavlEG0de;Z
zFY)kyotrr~ZV^4<<e30m#FQyhXz58{<KAg0?Sodz$X8ISHsvthm`nL5j6)pQ9K5$p
zUkPmR-<F^2OPxiIQB8urxcgWdsnVhr$lr6LX3@(xAEuJ-JYbw`Sh^QWQXQW&5e5F8
zTf$k%OE&^H*jtcQrJ8xu4r+>!W{*g&O*FW^d-v`n$FHXz?6lfT)H{qvTtEB4T#82{
z$Ss{E!Do5lG?J%{^(-rE2c<*qT~&YIe$SpgGi`f-ynF&3L&DoptN@oX>;C4xvYhKI
zA~F2w7A#DvxO|c;=PcVI?K0S1>Zju#x&EPR*+1g?H`>Vx0TI~A%ra!>+b9^|Vxv$P
zG@r8)w`Bo7=nZIi#M~hL+^{{JHu~nCFt;WPbLMhd;oZ_QGDtWm#Zy-nP8?TMT)c20
z5$LZ_RY}x|I2NL}?B%o?Db~_W1hYxp|Ld>6Y=3;wMMmw;?lb9r|I~l$X)oxZr0pA_
z!9_sbLei_qbm$w+_MqqGj_<=BKw_npggSGZv}3UIqD|G+q6LG=V9t|GYmUQx;L8gm
ziQ&Z9@CZ<)jVTX3n^CX|+YL4yUM89)Acd#ND+pgcs;H>os#AqDMNYC#ND|ItUkk`p
z0W@N>mBouV&Y(N<)_(_wsSZ2>cTgs1ucT*W@bB26Oz{qb%fnW}7KfP3r}FFh_#`eK
zXT`C@CFCO9XQz{+BhaD9&qNv)ziM0n>D%Dm`Oy#_J9g||+(OV}^Vc5O{bV`onL}RD
zX>FdwKeYPksNniYOJSCQj9ARW^DtzTbGzY<M&~X8(r{3Vs)=zxdfq4^B2r}cH<ECT
ztjRC91B?I}h-Ja*@2>!rYL@qE;lhOj?{@WlYR`t~vu5eiQK@^;(a}(36Eq8qlV4X?
zSNF261{9pL$hDOc>QDy3MJC>cSghfKB}oP(<Z4g_W*mTA+6DHf3b!a37*{@E=P{IK
zQ}13D-22i@JB6B6T=Bb-UZi?J;Lq*ZjUJP3`7d6y!(LQ^j73NUjh7J=aIp;5t;;<t
ziyM!8L<I^SDEl5zo3J%GdiNF~-{PK@g)(nh+h+c}&!;cCh}d<M$+(U5m!cy;{iBW=
zlGzce|M1^%|0CW?kRj-P;^S68kJL)Hmcg~%sWh&{Hh=&nB<uIHlURUc3=VqvHoc1w
zQbW-M^P?#V4h}|^wf{#J|7+fm=}581L<mwbX{GqJ^T$i;XSC5}d1fBKXCOlN<nuqB
zJ0AP>121jZv7@q-kF~x5^AL#;k7L0p7oK_=0gDy6{ha&TgHh_m|CTauf!y-nVG;)M
zzXO}W8D-uUdM+;a2tv)$_E%H$T;`+oQE2l}`XT}N$pt~1G(?WI8CW<e7ed{3Y)Im}
zVVo?*BKCJD7I%6~j^c6u#8Zip5S!GqUDIJ>iiHfskCy9*#K7&4qMt9tiJgH^=tOZ>
zMbDtArPcF!{9BRGtl6_|ev*3(15`M=;2L?I3|r>+w&H489=A|@MytA?6@&W&S3egK
z{t)jXEkFE4t|@@vcm%Up#%9(6-U?!qSb=svBrR>H8$$HZp+m>P;`#dc5b?;reS5_}
zlG+Rjz$&~Ozg9+)eP3fN*||W!IZuucaclj|k<8Mw?$@)&2Q>zI8#Dl@Rl&1!X|bBM
z+*kBF6l?4uzVjC@L=!**bu#gzg+tbFI$aADXP163+CWZf;%*~JXv@NI<2E3aArVl;
z0ebw@zJPUW6$p-i-f@N*51|_`;WB6l0&%(UnX9vwY>t4Ou`^@$&yTn&s4WN;lI&e0
z(B8L01p6seF)Y{o)<2qCS*aYWo?HgvoJ)&UhNx!zjL&~DxAU%hXtX<#+3w`z<ot4v
znl)rpmg=)UPQoi<gWqYTS?&Q51C@S&OeIlJILUI`_{@o0YdI|$ai|J<s2*@xmZ8})
zGb7A!k_GiV1OA%lus*@GW*Zhw*{n9{7;Fy8>DKzlT3vTo)bPfQul||dG8T%t{&+&&
z7&@Jf%)V?zq>9Q+2Mahj))(2GI(@pet<AvYx9QU*axb$k(&4ga?|w3`JU+BI>-)Q1
zQJU!qa3e(F-W#Hlsl_ei=8k>wVt-xBi%UTDr|5!nAAnW92|aidHf&t1X-xvqh2x#B
z6R|4rR@MHSe6$9iy8;bXPwiZ;ok3`}*_2rTxNzfdw(HB{b)@itn0?Q_d(VYy6KVD^
z{CdGi7a!Wo=zSP9`=uS$pfN5d6C?H!i~&ZF?fthK`5+JU{o_$D+)5rCPCWCL^rc_e
zr%?AlQT1b8`~L|B{q-Ve-YkO<J<wBEP5yU$C0z3C4NWnvdBh?4LmE)a(sm>L*po|I
z+F>vHX;^WxV19c1%;~#$29$U3*mG9}?Fxo<naE*QNAc?!AHe}zIxN|IBB-Y>)daMr
zLy{}#4>Z4~<)A`_qFE4JTBPJ`?|y}VoxxxW3=vguk*9_HeXBRL@w2x2(4W}q<XW?7
zdlw0CYi(mgb;y0}tE~LJZ8GNO=7;3v-#$^WwM~K#&FuQZ^$I(KtmzVSd$zo2xP;!7
z@aI#LF2FjlULg<|iz+L3<cY)Ctr9)3$CuR+r^#Y-BlU&=NoR@(2?-64jv5%UYVgjb
zUTLh7baHBc(5`gUY4HqJKuFIeuQPr9YbkO6qSGns38orXM!f>^BK;f2(<Hd#epSZ8
zbyG8L4TC|bglm>E6xo^K1CE6e=K%bhzrd2GDQT){yU5dj-}}lHMPz31s3LG9*6mUL
zSplwi_I|=%;$x!YE3$R}+wSEEWr;Ys4Z0UI7s|o<hn`6}@r*oqpE3@cn#Q1SFufiW
z6vXzE8EICSSMuNl+{OKHwHxBC)CB+Q%)FO&Pws<L7c*~>=bY^6U|u`G;}ltov52-2
z#wOP0tDlX}x0QV#3Q`#oYZ7Ky(80X<1>&q3QyO0Nx0mjF=r(w70{&*A16Zvuv_<qn
z<-a<(-o<S}yY4|6fv58rd1&FjG`o)G=@-sp#ibs5o~7+fx-!pE&;K2X{r?Z@*S}PJ
zJ}7~AWYK~JYhdQ3Ap)t%vBY1nS#Ke3@MbvfU<0j&Z#~Iv)SlD?*m}ibL;nSu^`_xb
zhtd7O8+<HW;lZNi%cH=n^MjQk8wA%c=&}Mr2BWtgnJfug9}GcVt)`~tqWSZK!FO#e
zw?neN?c;Omz5=v4c*FP_nofN^XjAyXu5!xg3%AxMLy?=jYXo}NN`Akg$Yr@%t94p$
zu-=`%j~#Z)ygoD^y5WtKO`!F0SQu#Sz4krlXDu!RP2t}m4r+V()>Hev1`#Bq$Jef6
zy1T;&z%eanE7!ro)ml66+}QWSbKhLf7SWfbeDBk3JAB4=X3PKKIdS6(sO-s!akFx=
z!T|AOmO<!B{>R+cD+N$j2!(+&1&7+zZr%I>ucL@R3wL_c-&}cH*s&r^_<6hqr%&=g
z-TQ<oow&F-aaeY>MxnASo;UAC$Ip^b87FWgaQ9I3{(7(Ycp)C~!uecsg&Xl_CYLPz
z&9PFV?ekwU9|JCCW@gf)5x5u)4S2j%;<aPL1D#+0;rlC(th8NU4p%*O7RX!Fl95?f
z3qB!m!qz{#H&0U((tAs_9rxr+PGow`<&Hw1OO!V_Y#FcF1<y6XHo?Vw=Y#FEW^=2}
ztHUifuU>D-MSo8bJ;5Fq$s&6^^Zsc<`}c+p(~7+~c;Zk#CAN?5d8Yvi8>3d_!vqKr
zl}&X+8wW(tQ=cv@n|kF!HH<dYyh2CH)J}!%09UW<U45=Q{r=D&Y{P-i+m@IY{8WLw
z1*bU%&1m-wMcr+$RMk<&d=&)G#avu5sO;_F%pH;+ypcTk`&=$Vhd$@sn(mY14n(zq
z?1bW~EG_Lxqa+v^+0}RetZ6@}iY|awuq+kav5KkYTDUIyFIHtS=v4I5)nJlf<bWZb
zn${;zo@6>}7jj}k1u}B!-L0p)Yhmo<$Ib|f>Q!()nR;R~hR$w+RtNJDBiiJu2zoF@
z!yfk1%U7=091gzzq`&12<UEYXkRm~DMUtD#&bsj&<oMCS0oNYcN+q28kHYBPkl-pQ
zexZ(Ahhe>B3itJAn0BL@gx;V8pVbc2aqvnh(x{H&5sAkLU}25Ap}|4)8Xj|%XD1qg
zvc#-Vu$ax~c69o%THS;C;8Gyf%Zn*EG}V`{URA;p(p-jP6ZULrM|n8x#;b`wL0eA~
zegOK$8t~IAgJQI{X^Hdq{`lcTFs21N0q(_8-eTOT^?gb&L3q$V8_jAGWJo)QNqo_g
zC1L0R-{1NA{ktL*_mz%jH^^)Z8-5oCJE)=Wf6m53gH%3T-zA@52!o`ZO#7a)U473&
zz_&z#TC@KnpjfueD!OI1^t&}dEjO!Ca4|sG1?gQC`&uc<@E8q5qCA&@Y~KM}8}s<V
zgBNL3W2uhoG4!MS$3rh-3hPXr0)EchQDgAX7p$24q|FSSk$EK!jZU&i7{_seB*$oh
z#DxLuI83ko?@wPhf@#*?4z0%t@*Wd0fY~{+)_I`Gc5^ecG+8R7U4a>c9roQPh?;;&
zpCWG&IwCZ@2YrZiB-yQ~NDkDrbIUbRP>-8C4ixJ-ufp_H_U0v5VA$KlBn}fT?<dR#
z1_iC6ZXGBhrOtzx4a|2yqd3eOK7-$yP%}E2GAuE#zNF>=(HI~~*1`RZ@laB?Aluw9
zn;_}|9rSC=0O-HIUE1GK-d8R6;~-r8M-d0;^Aa`BAm)goL(pT)kjBR{hdcVD;N!mm
zZJ2sIkPxk}Zpo6%0BV#k1RROUvF|k7K^!Iw&8=_mt7f?jslbC^rUBGUB4sO(Eody(
zL<@?6*+W?}-qXjx2nzhv<;XBJA&SUsNO>c5AuSwZfZzg%`^TlwRBLLJd!5K6Lesb|
zB^J>W0{S}=W^r+}e%#NZeuVeW-;D)DF!(}GNwRJ|#N=#Z6Vyx#0^b*n{`p&fKgiw3
z+gv|~l4KqopB)9aI4N=n&{C)<J$LS*M}+0q_s*R&Cf|pKRIw_TmkPz*5zwFvL@KPd
zOV5tFuXk(a4Po(L40;5EvLWPT)(9#bgGB~3WeLwWO)S~>)cQ8~&2?y2DX7MP$iT-d
zLQw~At|46;8c#faR2Qp*3`6%8BT!-372#MU8mKbA2k!?>s6hXiHD^w;+2k2C5yv25
zVODe_Jj-@HwUvYS_!~wYHs^wncMKf|;X8uS5gKeN1mH5)#>J!GjR&}Ty@j1whQ2<U
zY-sQ-vuu^&M|kSk3h~i+nV6KTLY$kG-x~%KOq^k?MydibY6U7i^~ZEe?~7Vgf#Zy$
zNln~~#Ml<xQ)~tr&!j13nn-SR>1*wm`!ll{lPmCSlW73VFeX_(etfi1F|3_7ChZb*
z?0e`F^F|^n$&MMiVoDFTBhAA?5e~&qBY_S{8-wpWf(DF)qSP*74hgNAFuUCm2Qb34
zJm{gM#=e}T{!CTJO&Q{`A20Ep`!39_goY7|l+p3Pq4C(^!&mXXHbO%4Z9|5>;U}fY
z78XMu;thCe1q?gDA_^oEAPs@Rzom=!{MusHCk3~WPbi?gAzC-}Cnx_<i8&FB$95uT
zR3e#&(C8ZWcqL{6gM_kw{FU+mWmE&U*D~lPNwyuwNftqIc-GZMQ@+(Y9$G6zObfR)
z%R(1<b9d|IOP5L;vs?!7dXc2pi=!G*uz>wGfkX_JRRu4`wQX;+E{Me(L%4IT9UO{n
z-A9^Q@BwLrl?F92^edHTjkTsBQ=-@L{AlbybjF4A%+C}D#(Hz_dY#YL74M62h0gNu
z>-cvVXh{8xH&;1@E0995qm*d{kRV9@t{cN3Z#yc&2*_>fP$0z1%vrv@aPXjL{R5Ac
zI;!#7%8;Y7Cq_(&^X#lmj@EW+T}(44_FXjlgG5`4QC*sjrP;;oeHdNqNN)?g1=vD*
zHW@CyG(WfRg6TsIIP&#<(RktjX!rur#wod?uXWdwll;GbnNbJF<my)^a9LsBVK_8A
zxb0n_gvoDgY%8D+B;22bvc3#taf-Y_N-Rn_CpwcPd09+DAo;Q;BV%nl$_^l#nwDdW
zh(bcTis&;?8%0o<oV#$rAf0FTG9A~i=WmKyXwzf@WE-#f+}vi}waJ@`T9*o_>-`uV
ztqT*<O#8>=r%O+A^;O*C+SpVKnC8KU_yf_wp10+yxLxNmFz~Nzd6527x&2@!-pb2~
zNpLuXw?Lk_Mk5_CgA~~|V8CS=bxc}yc*Co}Zu~`U=VEA#LqH>CJ02eB`i<EFShEA)
z-`T8oD%9h*983isz}D!gS^*to{_^F<_vg-?D*|7$e(D<#ffyJi4>Kr5J7JV3GtCU!
zS5-?mIgM<)ssxIbr<&HBI+zfPa<P1$j}_Xl!{HW#U>Gs?ioh{&%m$dH$p_Faz8&sx
za+}<SYIsmiE-@M7@5`X(zjSDF^V82N+`!NO+S1N$2Ue3ky3+XIHemRx6a!nXUhSKP
z7Zb%w-0nyz^Fs;EDuv9@0!NMrRB^-mIhG&xu7zkz!!C2MX4r|Gm^s~vdK)&HQA2|n
z%$I-@bMgv*q|<;FJLfju@(j$ETl@f7ICwt}LhMTfon>A1jG<op0@X9H3K_F6+mb7y
zg~=y+rxcAaEXqqv-qAbsWsknIw6PJ!RFKjAhZ7S%6Iq>@rQ42yMH673x;w)dgqpK-
z>CzTRd@1TSA9pQjJ_tI{C-%aaeV}t^BzrmRKbc+Q0Augs!h;d4a4S7Cs|65(LC-$x
zIJ5>O5Ui+btC0J~(F9jPLGN>JDpW%{t%_6(PXZ%LgHJ$6%9ye<&3Xusavb17DfHlc
zRO)tLRqax2Ogjw5Z%$1oB`!a|#<@K!i^i5BF-*%XX8kE;2dCG~*6D>5=J<dc0US9$
z6R3wCT4oZTbtbhBI#k`9KMJz2>tc}iZheqA4W@vMCt4b~MBf`XPKs{NLQUgLxrYJ{
zxBp)vS{M|9cvx6hR~OgwdB_L1B$A{ASaN{|m9VJHjPRjb{X_5Gc&8$-ZiHEq@_}sw
zM3N4y^0%*FpK_akvna<+6>IF>1F9ei!_{VR?m*@vSyMgL{6R+oREO$6r_V+)=F1xX
zd>@0er@i#GUBAlEhX7@gMJz@SqSXh29CrO0CXh1e<)-0w4X<Op{g7};)=1s0?Q`oE
z`Y?;33ENMF^S%ApP-@BhNLUZmbQ3ZQxdCXyevo(!BbI$R%3(^DD7e8R01NP)CcT|(
zbBOEjTIT5FR8tFCgO<6@aC=8%_US2S_DUD5jn#YQ0|`vctD8PGHZ6`pkoN8!diY_(
z`0I#CQ#q-JeehBp$Mzt>nPzDb>?Jo=?_2h}@d6ZZa<RZ@lmwZUj_*M1l1T=qdk8B>
z9NhycunI-Uv|1povPlr)8UnW*!v|*9v923euYN9gRev4CR`?arADjsLKIz0?AT_j!
zi4abx8^YAwBWOhpz52Ok6{v_vq?f(Dv%?20CXV~}nm5UnUAQ<hGGdIvNppGvh7Cod
z%n=uZGatHD3jA$b9A|TIr0%Ms%><FK{jr~RMwj|ZJ3`68UU<g{0G<6*`~lShIuej(
ztAO<@z{6{7Scx&ahHbFCmG(Ad4&dN`nq(yRXjET+36~UP$1vjO<1sA3U3u62ncm=p
z?fL>aBpqQcq0ynf>YzPmdkrVk98$%z8{LMq<O6rBQL6y#N*hP!z=1Q4N75@@6csY+
zhGcS0(_(~H8X?$dLBozbjDx6H<F;ofjB-#r!^ukK-ZN=%um;tF24e5OgNt12x~f7=
znpFs3o!QcuTcPMCTYtFU5XNYDGRiY{xjY(r|1G+I_Ee8yQg<w+3zC=&CeM<04SiFf
zLI$rvVM1FBwhs+c!XDGdu5*G8t;o%lrjtFenR2?^S_Wy}1ubqQYE4QC%IKLifhOSE
ze$31e<10Hfi3-t)HjM-@c<XpK=1tG(t-x&9V-BgYqkt9f`eoms^(ONGS~wMCU*R|L
zIQfA<5F!Sm^iZI&^k*d6evE9&fr}~rR^UB#`Yhz)Lx?dn0Cz~HMc%3VjPnz;FeOT-
zP*9PsJ2;!!S)ZN=`@wchTvA(8EHPAXW`Yso^4l8~G3vKfIZjh7&lMdfxd<@d1FyZd
z*D!3sr6|@I0kD_N8c2i9*wyU)lRYR=6@Vn0J6<-8pqB(p&1x|No>W1FE&-e*V<wX`
z$Ho^wf?+EIX6_!gBAiQ5h^*EtvDnhSAKja%U8fQX%LWV;!TV4S4kZb8O*+^F!tB$`
zk6*BYH1kF#7C0Qs0S_t&x{mb=Ed{~&s#Jp?sq_$>wv<zB(W-)$&#&s5ULXc{4=JgW
zV{KA|B*~^m*aB^ZaZSQwI_rh78aWZk#RCDJrqWXzdXdY>QZdk7qqxhVR|#D=F`8%6
z=3zgn+J1h+ISxofLma<ztc)Q<N4~`V*>Sw|43tl5lF2Oy2><rMu4<9pmN+tn&Ktoh
z(_l0id<b%*mr0!ba}O*Gs>mHX^j|O1sPmjMjl4C0HHTo)DhUv?*^VZfUBX{17>B9=
z`lWK;f~ZjrywGddK#36Lin@PFs9=J}!9c@Lav-e8#nI6a@X8s}(*vl6u-5FOYmTiZ
zQ2hF#R1VEqk;wvHQ?%Hz7#n$;f8SafwwzC$oyHESH*E<;1G4Lo`+yFuNOB#v&g8jY
zj-4R~vziJr&>|il3lkxYlo&!PbI=t70GtZTYHBNfSdBenTA;Rn|2g-GVFMDb)h51d
z#}Op*cem`pIQ20sY>Guw+)$H;PT950)w^-v19fjSaZjjug{XN2l4$R+?7I5Q`_~Z%
zhm24dQ7-7PnQ-bu0CyacvoLKU0lE*z6tF-y;8>=@%#N2XUN~C@lg=#e8&wZxQa?hd
zb@}W6xG;st6M98#IyxtYtjj=S5h%?xU;?x4dfb=dly15qc3mon3^h6-0rw20*yz3#
zI^$T)^y4TZ_Xg+HN29fmfZdB)L4M_^P-My4xR2}wUxDATS_5c|A_2!?3{XTXf~l5A
zfCEtgg5<rVk!i?2KumpiQfm*X2Jf9dj+`NG+3bn+cns4i9g1Mz_8C6dM`U~=W06g<
zL^!%^V<gkmX9E7vk}*rbMix7add}kDs760#n$>~9nks7hK`}<7VUEI~7?}J?;M#UQ
zQxsq;GuW4+o1DC);&0x3nC>}tL|@12&QwKo<cL+H(nm6g?n)xJoaHSZBfrtW2EadM
zJgh$9|I}{2E9hmgT-$Bik5bGFJ^S)!&$D8*5GE*Tgd+l7dd28B@mYiZFjybD?mQQe
zOp#7IGOtf#Pc^i~nGq1u_?04P)(%NidG?acg|@q}V=HNH4&^n|rcwtzIBKIn(T5(K
zWJ6{VYNt~ho#j9WRH70kj(t6vVYT!!><>mG{T;+-kZ%O>h!y1ZKtx1oWu^d~>SZ=G
zp_t7um}~j{>yDGT3~F*vL8CNM<1l{IZJz459?6z`>*R4K9;bp1ikZ6r+lz2;I0}X$
znw4@8!tuzwhCn%DKi)735|=qR+ih;1Pp3rz%|=-?WrO-<FfNdN3!5brIb&DGB8Fo`
z3C#g}?xJxh99JO&Lp`YXEV5+mwq;HJrmY2MMyt(Y>QpV*81-U*Qv`oWga7e4ZfWbW
zu|aZ`f~DXl0|m!)QsFq>lYtT|7X9nQrWrGi!pI_G`hFGj*W{^pcNa#f@Q+%2aBtJT
zGXSuZ-C+svYpMI4(R}O^6jvNaQURO4I@+3Y<Sg=D!UnEFJS6aJpW_Pr0)5}8Tg<mX
zqG#vLYc7F}!SODA`rK(?dSzmDa<oyLm4Wjxml?A@&~Yz}vsAr6MDa2KBw|2~nK{EG
z4wIgb<VgEkw0VbtuUHcU?Z|N|pzJ>3h#@*B1L-bhoF3q#1mgo3Tv+z2MfyUnOCE<a
z5GSk!6ZwPPVV{h>cMLVe2kC-rmGIQm4!krFc_ASwsg0wSd~om&sx|z0767O<A|AA*
zl%sCL&Zq>;Ozf9f|LduY<}tcmyQLc&8wqs6%>svxkM6{OO|kgU31-Bm;$}Y<;HBP|
zBo)w4#N(%@rL}_!PzIaN+kvRO!wVREhzzA*oi{RZC_*4n^x$7KP%_Gi6~%!*1X6r%
z-@Y9R7(`J{^HBtW(FZntOQ(b7P*145k_(rPO@NDxG8He&ZrG5SiX*EcaTO-8kRUSb
zMYQEHp)Sa7#l~m`#cQLesTn{y3kf|60EdzYoy`Ua6aik%ClqJR=q;0U$3bpx7*a^l
z4_%ShYBBg~{X_b7ZKgv!Fo$W;2s&sp3vjyxwkQ=~I;9p)6Bd05@G=4i7Df`cn^bLf
za&+9VeY+A3LV`?Ba5aZ)LmmLQ_ct+V?P*{G@oR_#1Q$sfT2P{?&_Zp%K~<>I*+WYg
zGCVJ^OVAxT`R})1n9g-58UQZr`7525kC(R{ll)4cKU=%HOja!LfWdcjs?G2>eOf=t
zSh2EAb#)pj0x5H@H-WQ4mO8oOkP!38?yoNdy6Tcm{E%6@Q#k+GsqF{WQL?mrLKLE^
zwv!B;g5|h2^K@EWKC+rLGk&!P%SB8ha3k$-P8r$*MR0V9ngvBgoAznYkSW4JE%D68
zpB^jJka9r9gn9*xSo0czcOzc1VK?m2E-rf~Ju;DO6>-po@S9CEy4lbGpQ1fRl~t&-
zqRsOm?*jQEUf)_@EYY_Vt2CVsg<Ock7?K;*1<*~x(2&(5P8FO^=fLeif|Dz|b|tA{
z^Z21YQHyx=z9;|{cp>7S4yQsVFdA=@nmh)n8f-0Z%>#~y_i&pGaT(|$^zIa;rKfLP
zvxW{H!zaB<>@6L#B~q~xC-!jS?LFB@sv+`<4p^eL2&WCyX4pj&dxQWw<bxzYz=+O7
z1nGyy^sTK1{_l&zCpq?I-(r+S!hjkUS^BAmK`s;9hVXBPluc*Mp{3l8V@HT;g()4U
z!rg?(NQIq@Ruq78LRq1!_jwTjAbQkx?1$Ag9x3gzYokd9X9!1qd$qn2=T6ZrB4!J_
zS|v_15@p;NEw4BXRDgZ4FsO9ix5z$*_&ww&_~2~(7R*Rov4K;~(Gz}VBsV+Q)?KLl
zASM>UD@>Lt6b+xynG4q$0^UGK%xIOVpsI87`BZ98fZ+jSA5w#qsZS?B04TbBdCo@7
z>-Y>9M-ANiOJ%9yqB4l6*dQqQ&R#<V?7tg~cgWi;NP-V%2pHj`=b%0EmMScd$Jj9%
z13-qM6gh`mTnPfDkGbZLUch=KaLvj%Ylh?`*cMfB21&xuqp2AGe)8-5NXAKb+y&ID
z2Q<QtGd0Mtm%H!6>R!0h6lrpSHvSr!%Z5n)%Xd3I0mhQsiIgI_8e8A<@B=ZM1B5n^
zRg};wBpa0<_&Gp;R2rN=?;rDpS6;Bx%#;5K2QiQZ;XfYo_-{G^CV0voP5gPMXBlfg
Oktw6FKW^{IKmQ98coypb

literal 22200
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
Ru@s8p5tYM9hfe?b-vF1(JLUiY

diff --git a/tmc.py b/tmc.py
index 04b0392..cb3b32b 100644
--- a/tmc.py
+++ b/tmc.py
@@ -2,156 +2,149 @@ import numpy as np
 
 class TransitionMatrixCalculator:
     def __init__(self):
-        self.nSquares = 15
-        self.matrix_safe = np.zeros((self.nSquares, self.nSquares))
-        self.matrix_normal = np.zeros((self.nSquares, self.nSquares))
-        self.matrix_risky = np.zeros((self.nSquares, self.nSquares))
+        self.size = 15
+        self.matrix_safe = np.zeros((self.size , self.size ))
+        self.matrix_normal = np.zeros((self.size , self.size ))
+        self.matrix_risky = np.zeros((self.size , self.size ))
 
-    def proba_security_dice(self):
-        proba = np.zeros((self.nSquares, self.nSquares))
+    def compute_transition_matrix(self, layout, circle=False):
+        self.matrix_safe = self._compute_safe_matrix()
+        self.matrix_normal, _ = self._compute_normal_matrix(layout, circle)
+        self.matrix_risky, _ = self._compute_risky_matrix(layout, circle)
 
-        for i in range(self.nSquares - 1):
-            proba[i][i] = 0.5
-            if i == 2:
-                proba[i][i + 1] = 0.25  # slow lane
-                proba[i][i + 8] = 0.25  # fast lane
-            elif i == 9:
-                proba[i][i + 5] = 0.5
-            else:
-                proba[i][i + 1] = 0.5
+        return self.matrix_safe, self.matrix_normal, self.matrix_risky
 
-        proba[self.nSquares - 1][self.nSquares - 1] = 1
-        return proba
 
-    def proba_normal_dice(self, layout, circle=False):
-        proba = np.zeros((self.nSquares, self.nSquares))
-        proba_prison = np.zeros((self.nSquares, self.nSquares))
+    def _compute_safe_matrix(self):
+        p = np.zeros((self.size ,self.size ))
+        for k in range(self.size  - 1):
+            if k == 2:
+                p[k,k+1] = 1/4  # slow lane
+                p[k,k+8] = 1/4  # fast lane
+            elif k == 9:
+                p[k,k+5] = 1/2
+            else:
+                p[k,k+1] = 1/2
+            p[k, k] = 1 - np.sum(p[k])
+        p[self.size -1,self.size -1] = 1
+        return p
+
+    def _compute_normal_matrix(self, layout, circle=False):
+        p = np.zeros((self.size ,self.size ))
+        jail = np.zeros((self.size ,self.size ))
 
-        for i in range(self.nSquares - 1):
-            proba[i][i] = 1 / 3
-            if i == 2:
-                proba[i][i + 1] = 1 / 6  # slow lane
-                proba[i][i + 2] = 1 / 6  # slow lane
-                proba[i][i + 8] = 1 / 6  # fast lane
-                proba[i][i + 9] = 1 / 6  # fast lane
-            elif i == 8:
-                proba[i][i + 1] = 1 / 3
-                proba[i][i + 6] = 1 / 3
-            elif i == 9:
+        for k in range(self.size  - 1):
+            if k == 2:
+                p[k,k+1:k+3] = 1/6  # slow lane # slow lane
+                p[k,k+8:k+10] = 1/6  # fast lane  # fast lane
+            elif k == 8:
+                p[k,k+1] = 1/3
+                p[k,k+6] = 1/3
+            elif k == 9:
                 if circle:
-                    proba[i][i + 5] = 1 / 3
-                    proba[i][0] = 1 / 3
+                    p[k,k+5] = 1/3
+                    p[k,0] = 1/3
                 else:
-                    proba[i][i + 5] = 2 / 3
-            elif i == 13:
+                    p[k,k+5] = 2/3
+            elif k == 13:
                 if circle:
-                    proba[i][i + 1] = 1 / 3
-                    proba[i][0] = 1 / 3
+                    p[k,k+1] = 1/3
+                    p[k,0] = 1/3
                 else:
-                    proba[i][i + 1] = 2 / 3
+                    p[k,k+1] = 2/3
             else:
-                proba[i][i + 1] = 1 / 3
-                proba[i][i + 2] = 1 / 3
+                p[k,k+1] = 1/3
+                p[k,k+2] = 1/3
+            p[k, k] = 1 - np.sum(p[k])
 
-        for i in range(self.nSquares - 1):
-            for j in range(self.nSquares - 1):
-                case_value = layout[j]
-                if case_value == 1:
+        for k in range(self.size  - 1):
+            for j in range(self.size  - 1):
+                s = layout[j]
+                if s == 1:
                     if j != 0:
-                        proba[i][0] += proba[i][j] / 2
-                        proba[i][j] /= 2
-                elif case_value == 2:
-                    proba[i][j - 3 if j - 3 >= 0 else 0] += proba[i][j] / 2
-                    proba[i][j] /= 2
-                elif case_value == 3:
-                    proba_prison[i][j] = proba[i][j] / 2
-                elif case_value == 4:
-                    proba[i][j] /= 2
-                    if j != 0:
-                        proba[i][0] += proba[i][j] / 6
-                    proba[i][j - 3 if j - 3 >= 0 else 0] += proba[i][j] / 6
-                    proba_prison[i][j] = proba[i][j] / 6
+                        p[k,0] += p[k,j]/2
+                        p[k,j] /= 2
+                elif s == 2:
+                    p[k,j-3 if j-3 >= 0 else 0] += p[k,j]/2
+                    p[k,j] /= 2
+                elif s == 3:
+                    jail[k,j] = p[k,j]/2
 
-        proba[self.nSquares - 1][self.nSquares - 1] = 1
-        return proba, proba_prison
+        p[self.size -1,self.size -1] = 1
+        return p, jail
 
-    def proba_risky_dice(self, layout, circle=False):
-        proba = np.zeros((self.nSquares, self.nSquares))
-        proba_prison = np.zeros((self.nSquares, self.nSquares))
+    def _compute_risky_matrix(self, layout, circle=False):
+        p = np.zeros((self.size ,self.size ))
+        jail = np.zeros((self.size ,self.size ))
 
-        for i in range(self.nSquares - 1):
-            proba[i][i] = 1 / 4
-            if i == 2:
-                proba[i][i + 1] = 1 / 8  # slow lane
-                proba[i][i + 2] = 1 / 8  # slow lane
-                proba[i][i + 3] = 1 / 8  # slow lane
-                proba[i][i + 8] = 1 / 8  # fast lane
-                proba[i][i + 9] = 1 / 8  # fast lane
-                proba[i][i + 10] = 1 / 8  # fast lane
-            elif i == 7:
-                proba[i][i + 1] = 1 / 4
-                proba[i][i + 2] = 1 / 4
-                proba[i][i + 7] = 1 / 4
-            elif i == 8:
+        for k in range(self.size -1):
+            if k == 2:
+                p[k,k+1:k+4] = 1/8  # slow lane
+                p[k,k+8:k+11] = 1/8  # fast lane
+            elif k == 7:
+                p[k,k+1:k+3] = 1/4
+                p[k,k+7] = 1/4
+            elif k == 8:
                 if circle:
-                    proba[i][i + 1] = 1 / 4
-                    proba[i][i + 6] = 1 / 4
-                    proba[i][0] = 1 / 4
+                    p[k,k+1] = 1/4
+                    p[k,k+6] = 1/4
+                    p[k,0] = 1/4
                 else:
-                    proba[i][i + 1] = 1 / 4
-                    proba[i][i + 6] = 1 / 2
-            elif i == 9:
+                    p[k,k+1] = 1/4
+                    p[k,k+6] = 1/2
+            elif k == 9:
                 if circle:
-                    proba[i][i + 5] = 1 / 4
-                    proba[i][0] = 1 / 4
-                    proba[i][1] = 1 / 4
+                    p[k,k + 5] = 1/4
+                    p[k,0] = 1/4
+                    p[k,1] = 1/4
                 else:
-                    proba[i][i + 5] = 3 / 4
-            elif i == 12:
+                    p[k,k+5] = 3/4
+            elif k == 12:
                 if circle:
-                    proba[i][i + 1] = 1 / 4
-                    proba[i][i + 2] = 1 / 4
-                    proba[i][0] = 1 / 4
+                    p[k,k+1:k+3] = 1/4
+                    p[k,0] = 1/4
                 else:
-                    proba[i][i + 1] = 1 / 4
-                    proba[i][i + 2] = 1 / 2
-            elif i == 13:
+                    p[k,k+1] = 1/4
+                    p[k,k+2] = 1/2
+            elif k == 13:
                 if circle:
-                    proba[i][i + 1] = 1 / 4
-                    proba[i][0] = 1 / 4
-                    proba[i][1] = 1 / 4
+                    p[k,k+1] = 1/4
+                    p[k,0] = 1/4
+                    p[k,1] = 1/4
                 else:
-                    proba[i][self.nSquares - 1] = 3 / 4
+                    p[k,self.size -1] = 3/4
             else:
-                proba[i][i + 1] = 1 / 4
-                proba[i][i + 2] = 1 / 4
-                proba[i][i + 3] = 1 / 4
+                p[k,k+1:k+4] = 1/4
+            p[k, k] = 1 - np.sum(p[k])
 
-        for i in range(self.nSquares - 1):
-            for j in range(self.nSquares - 1):
-                case_value = layout[j]
-                if case_value == 1:
-                    if j != 0:
-                        proba[i][0] += proba[i][j]
-                        proba[i][j] = 0
-                elif case_value == 2:
-                    proba[i][j - 3 if j - 3 >= 0 else 0] += proba[i][j]
-                    proba[i][j] = 0
-                elif case_value == 3:
-                    proba_prison[i][j] = proba[i][j]
-                elif case_value == 4:
+        for k in range(self.size  - 1):
+            for j in range(self.size  - 1):
+                s = layout[j]
+                if s == 1:
                     if j != 0:
-                        proba[i][0] += proba[i][j] / 3
-                    proba[i][j - 3 if j - 3 >= 0 else 0] += proba[i][j] / 3
-                    proba_prison[i][j] = proba[i][j] / 3
-                    proba[i][j] /= 3
+                        p[k,0] += p[k,j]
+                        p[k,j] = 0
+                elif s == 2:
+                    p[k,j-3 if j-3 >= 0 else 0] += p[k,j]
+                    p[k,j] = 0
+                elif s == 3:
+                    jail[k,j] = p[k,j]
 
-        proba[self.nSquares - 1][self.nSquares - 1] = 1
-        return proba, proba_prison
+        p[self.size -1,self.size-1] = 1
+        return p, jail
 
-    def compute_transition_matrix(self, layout, circle=False):
-        self.matrix_safe = self.proba_security_dice()
-        self.matrix_normal, _ = self.proba_normal_dice(layout, circle)
-        self.matrix_risky, _ = self.proba_risky_dice(layout, circle)
+"""
+    def display_matrices(self):
+        print("Safe Matrix:")
+        print(self.matrix_safe)
+        print("\nNormal Matrix:")
+        print(self.matrix_normal)
+        print("\nRisky Matrix:")
+        print(self.matrix_risky)
 
-        return self.matrix_safe, self.matrix_normal, self.matrix_risky
+# Example Usage:
+layout_example = [0]*15
+calculator = TransitionMatrixCalculator()
+calculator.compute_transition_matrix(layout_example, circle=True)
+calculator.display_matrices()
+"""
\ No newline at end of file
diff --git a/validation.py b/validation.py
index 16174fc..c86c663 100644
--- a/validation.py
+++ b/validation.py
@@ -1,8 +1,8 @@
 import random as rd
 import numpy as np
 import matplotlib.pyplot as plt
-from tmc_2 import TransitionMatrixCalculator as tmc
-from mdp import MarkovDecisionSolver as mD
+from tmc import TransitionMatrixCalculator as tmc
+from markovDecision import MarkovDecisionSolver as mD
 
 class validation:
     def __init__(self, layout, circle=False):
@@ -11,9 +11,9 @@ class validation:
         self.layout = layout
         self.circle = circle
         self.tmc_instance = tmc()
-        self.safe_dice = self.tmc_instance.proba_security_dice()
-        self.normal_dice, _ = self.tmc_instance.proba_normal_dice(layout, circle)  # Make sure to capture only the normal_dice component
-        self.risky_dice, _ = self.tmc_instance.proba_risky_dice(layout, circle)    # Make sure to capture only the risky_dice component
+        self.safe_dice = self.tmc_instance._compute_safe_matrix()
+        self.normal_dice, _ = self.tmc_instance._compute_normal_matrix(layout, circle)  # Make sure to capture only the normal_dice component
+        self.risky_dice, _ = self.tmc_instance._compute_risky_matrix(layout, circle)
         solver = mD(self.layout, self.circle)
         self.expec, self.optimal_policy = solver.solve()
 
@@ -74,9 +74,9 @@ class validation:
 
     def simulate_state(self, strategy, layout, circle, n_iterations=10000):
         # Compute transition matrices for each dice
-        safe_dice = self.tmc_instance.proba_security_dice()
-        normal_dice = self.tmc_instance.proba_normal_dice(layout, circle)[0]  # Get only the normal dice transition matrix
-        risky_dice = self.tmc_instance.proba_risky_dice(layout, circle)[0]    # Get only the risky dice transition matrix
+        safe_dice = self.tmc_instance._compute_safe_matrix()
+        normal_dice = self.tmc_instance._compute_normal_matrix(layout, circle)[0]  # Make sure to capture only the normal_dice component
+        risky_dice = self.tmc_instance._compute_risky_matrix(layout, circle)[0]
 
         transition_matrices = [safe_dice, normal_dice, risky_dice]
         number_turns = []
@@ -162,7 +162,7 @@ class validation:
 
     
     def compare_empirical_vs_value_iteration(self, num_games=1000):
-       value_iteration_turns = self.optimal_policy
+       value_iteration_turns = self.expec
        empirical_turns = self.simulate_state(self.optimal_policy, self.layout, self.circle, n_iterations=num_games)
     
        # Calculate the mean turns for each state
@@ -175,7 +175,7 @@ class validation:
 
 
     
-    def compare_state_based_turns(self, num_games=1000):
+    def compare_state_based_turns(self, num_games=100000):
         value_iteration = self.expec
         empirical_turns = self.simulate_state(self.optimal_policy, self.layout, self.circle, n_iterations=num_games)
 
@@ -183,7 +183,7 @@ class validation:
 
 
 
-    def compare_strategies(self, num_games=1000):
+    def compare_strategies(self, num_games=100000):
         optimal_cost = self.simulate_game(self.optimal_policy, n_iterations=num_games)
         dice1_cost = self.simulate_game(self.safe_strategy, n_iterations=num_games)
         dice2_cost = self.simulate_game(self.normal_strategy, n_iterations=num_games)
@@ -265,5 +265,4 @@ random_dice_strategy = validation_instance.random_strategy
 mean_turns_random_dice = validation_instance.simulate_state(random_dice_strategy, layout, circle, n_iterations=10000)
 print("Mean Turns for Random Dice Strategy:", mean_turns_random_dice)
 
-
 """
\ No newline at end of file
-- 
GitLab