From 307365e519a29ec0b45f47da66ecf5dc93b55316 Mon Sep 17 00:00:00 2001 From: Adam Amer <136176500+adamamer20@users.noreply.github.com> Date: Wed, 21 Aug 2024 12:13:09 +0200 Subject: [PATCH 1/9] adding polars implementation --- examples/sugarscape_ig/ss_polars/__init__.py | 0 examples/sugarscape_ig/ss_polars/agents.py | 125 +++++++++++++++++++ examples/sugarscape_ig/ss_polars/model.py | 49 ++++++++ 3 files changed, 174 insertions(+) create mode 100644 examples/sugarscape_ig/ss_polars/__init__.py create mode 100644 examples/sugarscape_ig/ss_polars/agents.py create mode 100644 examples/sugarscape_ig/ss_polars/model.py diff --git a/examples/sugarscape_ig/ss_polars/__init__.py b/examples/sugarscape_ig/ss_polars/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/sugarscape_ig/ss_polars/agents.py b/examples/sugarscape_ig/ss_polars/agents.py new file mode 100644 index 00000000..6b3cba4a --- /dev/null +++ b/examples/sugarscape_ig/ss_polars/agents.py @@ -0,0 +1,125 @@ +import numpy as np +import polars as pl + +from mesa_frames import AgentSetPolars, ModelDF + + +class AntPolars(AgentSetPolars): + def __init__( + self, + model: ModelDF, + n_agents: int, + initial_sugar: np.ndarray | None = None, + metabolism: np.ndarray | None = None, + vision: np.ndarray | None = None, + ): + super().__init__(model) + + if initial_sugar is None: + initial_sugar = model.random.integers(6, 25, n_agents) + if metabolism is None: + metabolism = model.random.integers(2, 4, n_agents) + if vision is None: + vision = model.random.integers(1, 6, n_agents) + + agents = pl.DataFrame( + { + "unique_id": pl.arange(n_agents, eager=True), + "sugar": model.random.integers(6, 25, n_agents), + "metabolism": model.random.integers(2, 4, n_agents), + "vision": model.random.integers(1, 6, n_agents), + } + ) + self.add(agents) + + def move(self): + neighborhood: pl.DataFrame = self.space.get_neighborhood( + radius=self["vision"], agents=self, include_center=True + ) + + # Join self.space.cells to obtain properties ('sugar') per cell + neighborhood = neighborhood.join(self.space.cells, on=["dim_0", "dim_1"]) + + # Join self.pos to obtain the agent_id of the center cell + # TODO: get_neighborhood/get_neighbors should return 'agent_id_center' instead of center position when input is AgentLike + neighborhood = neighborhood.with_columns( + agent_id_center=neighborhood.join( + self.pos, + left_on=["dim_0_center", "dim_1_center"], + right_on=["dim_0", "dim_1"], + )["unique_id"] + ) + + # Order of agents moves based on the original order of agents. + # The agent in his cell has order 0 (highest) + agent_order = neighborhood.unique( + subset=["agent_id_center"], keep="first", maintain_order=True + ).with_row_count("agent_order") + + neighborhood = neighborhood.join(agent_order, on="agent_id_center") + + neighborhood = neighborhood.join( + agent_order.select( + pl.col("agent_id_center").alias("agent_id"), + pl.col("agent_order").alias("blocking_agent_order"), + ), + on="agent_id", + ) + + # Filter impossible moves + neighborhood = neighborhood.filter( + pl.col("agent_order") >= pl.col("blocking_agent_order") + ) + + # Sort cells by sugar and radius (nearest first) + neighborhood = neighborhood.sort(["sugar", "radius"], descending=[True, False]) + + best_moves = pl.DataFrame() + # While there are agents that do not have a best move, keep looking for one + while len(best_moves) < len(self.agents): + # Get the best moves for each agent and if duplicates are found, select the one with the highest order + new_best_moves = ( + neighborhood.group_by("agent_id_center", maintain_order=True) + .first() + .sort("agent_order") + .unique(subset=["dim_0", "dim_1"], keep="first") + ) + + # Agents can make the move if: + # - There is no blocking agent + # - The agent is in its own cell + # - The blocking agent has moved before him + condition = pl.col("agent_id").is_null() | ( + pl.col("agent_id") == pl.col("agent_id_center") + ) + if len(best_moves) > 0: + condition = condition | pl.col("agent_id").is_in( + best_moves["agent_id_center"] + ) + new_best_moves = new_best_moves.filter(condition) + + best_moves = pl.concat([best_moves, new_best_moves]) + + # Remove agents that have already moved + neighborhood = neighborhood.filter( + ~pl.col("agent_id_center").is_in(best_moves["agent_id_center"]) + ) + + # Remove cells that have been already selected + neighborhood = neighborhood.join( + best_moves.select(["dim_0", "dim_1"]), on=["dim_0", "dim_1"], how="anti" + ) + + self.space.move_agents(self, best_moves.select(["dim_0", "dim_1"])) + + def eat(self): + cells = self.space.cells.filter(pl.col("agent_id").is_not_null()) + self[cells["agent_id"], "sugar"] = ( + self[cells["agent_id"], "sugar"] + + cells["sugar"] + - self[cells["agent_id"], "metabolism"] + ) + + def step(self): + self.shuffle().do("move").do("eat") + self.discard(self.agents.filter(pl.col("sugar") <= 0)) diff --git a/examples/sugarscape_ig/ss_polars/model.py b/examples/sugarscape_ig/ss_polars/model.py new file mode 100644 index 00000000..70830e02 --- /dev/null +++ b/examples/sugarscape_ig/ss_polars/model.py @@ -0,0 +1,49 @@ +import numpy as np +import polars as pl + +from mesa_frames import GridPolars, ModelDF + +from .agents import AntPolars + + +class SugarscapePolars(ModelDF): + def __init__( + self, + n_agents: int, + sugar_grid: np.ndarray | None = None, + initial_sugar: np.ndarray | None = None, + metabolism: np.ndarray | None = None, + vision: np.ndarray | None = None, + width: int | None = None, + height: int | None = None, + ): + super().__init__() + if sugar_grid is None: + sugar_grid = self.random.integers(0, 4, (width, height)) + grid_dimensions = sugar_grid.shape + self.space = GridPolars( + self, grid_dimensions, neighborhood_type="von_neumann", capacity=1 + ) + dim_0 = pl.Series("dim_0", pl.arange(grid_dimensions[0], eager=True)).to_frame() + dim_1 = pl.Series("dim_1", pl.arange(grid_dimensions[1], eager=True)).to_frame() + sugar_grid = dim_0.join(dim_1, how="cross").with_columns( + sugar=sugar_grid.flatten(), max_sugar=sugar_grid.flatten() + ) + self.space.set_cells(sugar_grid) + self.agents += AntPolars(self, n_agents, initial_sugar, metabolism, vision) + self.space.place_to_empty(self.agents) + + def run_model(self, steps: int) -> list[int]: + for _ in range(steps): + if len(self.agents) == 0: + return + self.step() + empty_cells = self.space.empty_cells + full_cells = self.space.full_cells + + max_sugar = self.space.cells.join( + empty_cells, on=["dim_0", "dim_1"] + ).select(pl.col("max_sugar")) + + self.space.set_cells(full_cells, {"sugar": 0}) + self.space.set_cells(empty_cells, {"sugar": max_sugar}) From 00450499c46adb4c496bfd1e6f7cbdd6aed5918d Mon Sep 17 00:00:00 2001 From: Adam Amer <136176500+adamamer20@users.noreply.github.com> Date: Wed, 21 Aug 2024 13:24:26 +0200 Subject: [PATCH 2/9] benchmarking actual execution and comparison with flame2 --- .../sugarscape_ig/performance_comparison.py | 44 ++++++++++++++----- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/examples/sugarscape_ig/performance_comparison.py b/examples/sugarscape_ig/performance_comparison.py index c46e3c3b..cbb3a127 100644 --- a/examples/sugarscape_ig/performance_comparison.py +++ b/examples/sugarscape_ig/performance_comparison.py @@ -6,12 +6,17 @@ import seaborn as sns from ss_mesa.model import SugarscapeMesa from ss_pandas.model import SugarscapePandas +from ss_polars.model import SugarscapePolars class SugarScapeSetup: def __init__(self, n: int): + if n >= 10**6: + density = 0.17 # FLAME2-GPU + else: + density = 0.04 # mesa self.n = n - dimension = math.ceil(5 * math.sqrt(n)) + dimension = math.ceil(math.sqrt(n / density)) self.sugar_grid = np.random.randint(0, 4, (dimension, dimension)) self.initial_sugar = np.random.randint(6, 25, n) self.metabolism = np.random.randint(2, 4, n) @@ -21,13 +26,19 @@ def __init__(self, n: int): def mesa_implementation(setup: SugarScapeSetup): return SugarscapeMesa( setup.n, setup.sugar_grid, setup.initial_sugar, setup.metabolism, setup.vision - ) + ).run_model(100) def mesa_frames_pandas_concise(setup: SugarScapeSetup): return SugarscapePandas( setup.n, setup.sugar_grid, setup.initial_sugar, setup.metabolism, setup.vision - ) + ).run_model(100) + + +def mesa_frames_polars_concise(setup: SugarScapeSetup): + return SugarscapePolars( + setup.n, setup.sugar_grid, setup.initial_sugar, setup.metabolism, setup.vision + ).run_model(100) def plot_and_print_benchmark(labels, kernels, n_range, title, image_path): @@ -40,10 +51,8 @@ def plot_and_print_benchmark(labels, kernels, n_range, title, image_path): equality_check=None, title=title, ) - plt.ylabel("Execution time (s)") out.save(image_path) - print("\nExecution times:") for i, label in enumerate(labels): print(f"---------------\n{label}:") @@ -53,22 +62,37 @@ def plot_and_print_benchmark(labels, kernels, n_range, title, image_path): def main(): + # Mesa comparison sns.set_theme(style="whitegrid") - labels_0 = [ "mesa", - "mesa-frames (pd concise)", + # "mesa-frames (pd concise)", + "mesa-frames (pl concise)", ] kernels_0 = [ mesa_implementation, - mesa_frames_pandas_concise, + # mesa_frames_pandas_concise, + mesa_frames_polars_concise, ] - n_range_0 = [k for k in range(0, 100000, 10000)] + n_range_0 = [k for k in range(1, 100002, 10000)] title_0 = "100 steps of the SugarScape IG model:\n" + " vs ".join(labels_0) image_path_0 = "benchmark_plot_0.png" - plot_and_print_benchmark(labels_0, kernels_0, n_range_0, title_0, image_path_0) + # FLAME2-GPU comparison + labels_1 = [ + # "mesa-frames (pd concise)", + "mesa-frames (pl concise)", + ] + kernels_1 = [ + # mesa_frames_pandas_concise, + mesa_frames_polars_concise, + ] + n_range_1 = [k for k in range(1, 3 * 10**6 + 2, 10**6)] + title_1 = "100 steps of the SugarScape IG model:\n" + " vs ".join(labels_1) + image_path_1 = "benchmark_plot_1.png" + plot_and_print_benchmark(labels_1, kernels_1, n_range_1, title_1, image_path_1) + if __name__ == "__main__": main() From 8e5a1b5b4daa99cc604d5e327a5aeced2636da68 Mon Sep 17 00:00:00 2001 From: Adam Amer <136176500+adamamer20@users.noreply.github.com> Date: Wed, 21 Aug 2024 17:03:12 +0200 Subject: [PATCH 3/9] performance comparison with polars --- benchmark_plot_0.png | Bin 0 -> 26557 bytes examples/benchmark_plot_0.png | Bin 31147 -> 0 bytes examples/sugarscape_ig/benchmark_plot_0.png | Bin 0 -> 31211 bytes examples/sugarscape_ig/benchmark_plot_1.png | Bin 0 -> 32040 bytes .../sugarscape_ig/performance_comparison.py | 5 ++--- 5 files changed, 2 insertions(+), 3 deletions(-) create mode 100644 benchmark_plot_0.png delete mode 100644 examples/benchmark_plot_0.png create mode 100644 examples/sugarscape_ig/benchmark_plot_0.png create mode 100644 examples/sugarscape_ig/benchmark_plot_1.png diff --git a/benchmark_plot_0.png b/benchmark_plot_0.png new file mode 100644 index 0000000000000000000000000000000000000000..5d2bc8c6c74822c520a14f1ca3ea4e3f3d249b32 GIT binary patch literal 26557 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 literal 0 HcmV?d00001 diff --git a/examples/benchmark_plot_0.png b/examples/benchmark_plot_0.png deleted file mode 100644 index 3132939dcdd5ee159bfa903829d9a8693b7c3df2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31147 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 diff --git a/examples/sugarscape_ig/benchmark_plot_0.png b/examples/sugarscape_ig/benchmark_plot_0.png new file mode 100644 index 0000000000000000000000000000000000000000..92408c49ed0a63a4f914085b53cd115852a1835c GIT binary patch literal 31211 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 literal 0 HcmV?d00001 diff --git a/examples/sugarscape_ig/benchmark_plot_1.png b/examples/sugarscape_ig/benchmark_plot_1.png new file mode 100644 index 0000000000000000000000000000000000000000..198d50ac6390d26aaa81133f5997d031c5316cb4 GIT binary patch literal 32040 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 CC~^G& literal 0 HcmV?d00001 diff --git a/examples/sugarscape_ig/performance_comparison.py b/examples/sugarscape_ig/performance_comparison.py index cbb3a127..c6b2ad4c 100644 --- a/examples/sugarscape_ig/performance_comparison.py +++ b/examples/sugarscape_ig/performance_comparison.py @@ -3,7 +3,6 @@ import matplotlib.pyplot as plt import numpy as np import perfplot -import seaborn as sns from ss_mesa.model import SugarscapeMesa from ss_pandas.model import SugarscapePandas from ss_polars.model import SugarscapePolars @@ -62,7 +61,7 @@ def plot_and_print_benchmark(labels, kernels, n_range, title, image_path): def main(): - # Mesa comparison + """# Mesa comparison sns.set_theme(style="whitegrid") labels_0 = [ "mesa", @@ -77,7 +76,7 @@ def main(): n_range_0 = [k for k in range(1, 100002, 10000)] title_0 = "100 steps of the SugarScape IG model:\n" + " vs ".join(labels_0) image_path_0 = "benchmark_plot_0.png" - plot_and_print_benchmark(labels_0, kernels_0, n_range_0, title_0, image_path_0) + plot_and_print_benchmark(labels_0, kernels_0, n_range_0, title_0, image_path_0)""" # FLAME2-GPU comparison labels_1 = [ From 40d1de1b2846033aa913bf9d3fef688fd1bf2080 Mon Sep 17 00:00:00 2001 From: Adam Amer <136176500+adamamer20@users.noreply.github.com> Date: Wed, 21 Aug 2024 17:37:11 +0200 Subject: [PATCH 4/9] wrong file --- benchmark_plot_0.png | Bin 26557 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 benchmark_plot_0.png diff --git a/benchmark_plot_0.png b/benchmark_plot_0.png deleted file mode 100644 index 5d2bc8c6c74822c520a14f1ca3ea4e3f3d249b32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26557 zcmdSBc{r5s`!_y|ZR|^y5D}7nPu3DbL}e>tw2bWgmTl(Uw4exyK}ks|Ym=Sak-RZd zN{C@1TQRmWG?wSO_4$5(-{*Hc|2%&_j>F+N-0u6nuJbz2*ZF##=Q)xbP8{Rm6z4=B z5Ioja=BE${)Lrnshl36L=4$Y~3ixp-+`={dbPz5)$}98|!p|rr3iVe1w3{vi9)bzBIunLK@Oi=C$Y-WceGmw5 zC2R8|j?ww^)QISdlS3U#LCzr}3=zdiwzEYlPgK6Ja_&0Bt>RJiVfoRMf8U&|S;Gbt z?n*xG&Wq+sQ7b=kcCNTRnK@oMwK)-U{r(<>p^N)Ft+iTuBPMexVRH{Mt*72Uwo_GA zy$OHWRwTr*@0A5#&3S@00^qA8<^TR?y2)Eg?s96O@~{2@dD%V}?tcvt>7(x`B5V)P zdJzmwr{Q~u_lPeD1=IkFy^%RB%%q_5x&3)5s1d%oX}ZTT+pC03{C~xl`@AQhucHN&|IBhgL z$_<%eh=rdI8~^M zo?z=DwXaX;+4WOJXo|l8jTgHrK71X)K&&8JSb14%kmV&`e-}Xah{Q|Burf3c?YzgS zA4CwVtZZLGQjH{eHuwi`1*`k6o0_!_sZ#v+V7V7{E4eC7f>kP&7VAix&l=DBq`Ahr zp(0tg*!)>Gt}phsuS2uz76XSU{&>{5EIrI!&*dbD@rj$G`c9xVT>CTf3Z6Vi3VmsNC7*CZeT1b@yAz}z6lEJ z#xV8RisiOFM`#x{wqeoar&R!_^OV>`l#c{RW}+I8vC&I*-NDaE^R`xEmTxyL z1#{E7F+aj$uzT=2|^?sDn5$_OPnilPkSX%;Q0A-c2`r%fP z_6R>g-wi!>5B5MU^89#U8~*9UfQIk>*$(t$Ji~V`%;?+I#=|qUe-a^0VNFTSjr)sy zhfy2X?tI>CuC7z2w`*uO4p0)jaVgmc>zJk^o5enoro!680(Cie>V!Fx7VHjhC&%C0 zzfo#}s!3fkIc$~jJTEj&=GPl4;X}oWiCIQi7U{k}uC3eDGip1nv0$9O(D75n+$!gu zoSf6JP{ZYs09@F+?*ZK3;u}OOrGiCdkk7Zgz16Y0W@a%Qg(aI`mJ!c+UvGb1RyOmT za2^YyZv{n-wNm{QGKFhyPcw}x?KiewuWcfU=JCR`ib?eOmsjM!y$(1rvsKAj_~pvG zy53}BqF~3n0B@%biG}Xl5S!)=*vaRTjM-TMzR(+Yw^qJE$ zT#UKBtd1WtsI*sYVWEdJUW~73;#TDs35{vmicy5wU7QT*7+ zr9w>pJiVhM-V$w(JSLD)ughWmrju@>Mqklf4Ab`Wy##e^5xeTYksudw)1?m$nBg_Gigvb~7r3(S)8Z z-4vYOKMrl1kC%Vmrk;wtIo6AmL~c;2+YTY~(;Qc4BNaZQq&edd{^N9^aT96n-@WrL zOJ|22KU<}yE=*@q<_hR0RR*-=G4FIKJIoWSX`dJG5<}TnOC~+A4E@%)UBP~bkfrip zbjncqoI0d4>rtCdGz&BB@JaSR@{>U$&Fz#xMCxr_4Tga4(+Aq*pX0w56dA~X_F&pK zab3%7q1?f2Svis4(GP#D`w_Q@{Jz@WEP>_G^ZdE)GEG~#m?w>C?2+2!#~8apKcPR0 zbj~?{+;AO}XCCvR_1U&Ge@2Fl%c*pS2IeK`5>D?bNfon^qmdDVkU^IIvb~)ntwEL+ z^4PvYWSZV`INJ1>R3^$4Dd#mhHB`_?9h2q0rR3H|`P06#nWM4S*XQ+iOnO#k=M1iu z!q%cgX3h>WD^$xi-%B35TwETmB3%7hx5;(L)^3Jv>16-En`tDinLy#z&4TAOnxhK` zIT-7bt)}Omglg?R$LCmMUV3!qO0Zvl>@v>GZppr6i7Y&;`uV$RUyR8FojPR#%KDU>@mT{N-KQge6vz?oOi zHzdu*D9bLfpMCc{OOSTT)i$YF^^iJM<#}n$=X}70OGEC&*frMEV`2t7pb2f1GrCRF6EXFNq)j@OfiD%^tUkHj{4LhdIr^S@ce( zK*;y#`-hQZe5zwM<06&5J$T=9_igF+XK$~2$qQr2X)8|i z+Clv*WRCcS8WcU0QE}cVKp`=t;02+6WYfiIDZv+)xYzca(}PGKmD3p`U16n1*KT-; zc`Xhcfh>f{!tO`KR2+Ti&%=Iscg4@n05^&fWc%fBZ6W__a#G)MM zw3Q1Bb|XTzb(L31Hl@v1hA5{1wJ2!Z&RRTjF7SE2@13;9#3M88^>-Uh&uq!+tVne; zm~8=PLz)#@X;;}VY*Ri_=8^_Im;Itzu4&+r#eqs?;nJ1QNlrmy4;;v!()oI8EHBnh zooxL+%H`C&l|(F_YCn63eyR1}$@sG+*L2J_CQo)1pt)S;$!FUcK?23%UrT)p1e|(Z z*y$0BQdyFujn!81@2Ed5&{tfI&Fug#!O_I+)LvQKr?h zqY6g}mNs*!rk>c2GRR z866ytUx54|OzaQ)BP967lb-CCs z|FBg<+FtIr_5Xkuc;PI}5g7gVYJia?VEp6Whw`B)|YDC;E zs>F0ml?@l|q|8OP_Qp&`&&`|s4!!I z80p9?Oa7;uGI1YTcuG&}x<33`PJE-n&hM+0#-g^@cJrSbPxjdFmou&<4IPeZx$1EI zC5OyX6F_#x3-QO#88-*&(idf#%NtGkd*dYvXV;z*i?U zCItfmzTuqx`|b{ZlWo0wba%*!uGL`1K1|XgN9&FC14Qu#-4|?`j?z(5Ugq>;M7deD z)?S|kY(P|ne=D`%&c%Go=-Zxx#UDzH#!Ly+@k7UnU(1*OT~SwlAGS{hQ-7_}tk_UDg4!aaZ{t15_%bdAS{ ze;+Puh{?GSZr^HpRNgFLyc+s3`SoJdHlLTm^&}!QMDAPE@66;CTZLa1uaocir{TJG znGL@ZXuVC`dL(On_Vn@N6=%ks%neA@Re>+VdATxMO`Q%=?~nq_tt7Lf7>Sc2BjGPK zhE~O*#tuw7m>1mul=-IBz}E*FInPI4HL(;<1=$AKDp;8No-{ik+gBYar_$*{cVn0o zcK&)+!z(B-YX`C(tezu2K9u~co^zWl%nkm9HLSdC#joT>b?w_nuiUSb`tu30q>uh6 zVmfu)LIyLwofADXJ(G;|!Rd*9d$8F@_567&EcurRKtzGry2qHzh9JwCeM6%6Sw}`j zFTNCQ$kL$pHQtXfi`vf7;Q3$?LO`TnFBG>CNKehoUAkj>RbpPDzz{us-X( zx$-VSzh{pj-M#hVQl93ePN#Ged%$uIri87XW8s!5RnX3i4aw%u?5KjkHb07uE=@m7WQM5`Kn`X*JXUrg9Rb?=_%O)k~8n1+fZd zJWKw>Cp?VQ%v;%v;X8{So`lNW&pk`kX=Q=Sfzu1``S6(-p_*QV5lWIqx6fuIb!T}< zFBA&e_=x!~i*z2daXo~SXiYX~K|YX+bJ&#r*7oeMRXIX~e3Z~4B-q2U#uXf_qTHDO zp&}@%^|`D)Iy-0R?2=@+P)2GRhw_>nvHwDiSp81#EV`mUOjWeJ^u4` zz2n5Uvz=?=iT1ALp^ok1)cpd*^h11Wy5C;+V%%M-6~d~$h|E9X8(UvoM++9iHsj+q z)gx)*DF}AF=xoj>FF@LtHHaMT$O@_o__0RC4>~xw(*OjCOHm%(Gkku?0!ah z2exiXac&S6w-(q(JgfiVC;AjRC!6j|zy46%COs~W*MFWagz?kZzULsZlCt~~A2R== zf1E)Ux))~HOYQDnrF!9{(V{s+v-B+^uk~6`s3?vei6?#!aW}#pYR!l+yz95GXYPdA zxL$sxio0qyx`fmtHXsrtE0;4+$Bfo?y9#0rR%j0x7iiPCFOF5K5vrgVF}swbj=^+H z&=VY0V(;D2DYvmwi`rWn(QM;Rmeg*%UFpH-gnBX6722r%cm1q-=2Xr8(b8UI^}7F~ zZDh0Ydl%)kyxghocKz2KRB2suZ}(WoL|5MSclsoYkhb4~E)KOC&KRCB>E_S)IF{`< zHJ(cw5D=X3=GbP5vvciQT&e4&601A-Zh5w_c%Zk$6Gs{Cu}0oy10rQe?put8uNPZi z=1($aZV;a!2iOCHCh{*a1$@6J3TIENY{yB?$%&}0uNzdEkp*vj ztumc)u{G9@*(FrZ^v3ClxR&-C%Jg+S>vWTouKrUI-~Vnati9tTaSK0L5jtLljT^bH z(e-PZSlm}jnTym`PQ>=Ya_LW|@zKl9?m7=%^y7|4ZL1fy4AxX#c54kk#Md#OhL8~S z?O5Ia%O!4@vKly{n`PJAoKsM;(8fahTo+H!=b->!9#SK+d^6UTI1~6lmz+hJ3o*-_ zxojrnU(e^0Nm4yKA>MNTo!|P)<<3{-C+mZh6UG-Rba*S4?NJW`=?~feQ%NLmW#6*$jS>4wi@5Z02wqJj}nlkN^`>y(V z^?KvcoAJW06I&Q4T*XJbapmHX;~?kh-j!``8(gc~Q=Ru=^oE1B*^F{zu;hlrUOB;O z{y&ZPS^ba9oQ}+HOk~C4=GSS>w?1TtM4GLP)@Mmj<8=ySLKUz9X419fp1G4ziQ}=} zc?lN?+x&u0&U&OQ8S&oIATJ|GRE~JH0$uV)qTGrnWRK4Vr4Y%tRWU}rhQ#mVvD1Nk z+IeMr2A*}enk9Zce>-5TKcSJC1!XNw*GPTa47o-!9_+%Gq>WG9NnYrlDvvwwh5a=0 z$}~jcxNAbF60U|9@KAe>s~OK#9fXHp#aW7d(CM!}zdc-?(=a7^d0^qatC`&fvdlfq zy?^D90e^*61zfO=iryv0r}CY?ts;6>%qLzcI8M@kd2eMwqvtf8H~&1Yjl-^tU+_gN z)%b;eheIp-!mG0?) zbkw$|1@{es+=W_gay%w}^xmy_g9S}8&P;amDE5Ha?N4XuTW0O`2XCfrj>H>zIrRR@ zoznfGe~`$m$sy&8a$(#)6SY=`&?BB6 ze}|@n{2Ap)BEe&R2~qii)H6?)ZqJ#Pmm6ia54_4E@x1U|9euF4RncFu5<9YaTs!vq zhi2@>_F^86eHGbdBc@->PW+6THW@b!&#LakMT&frS~z)9kG;^-f88VbSB#CK#TCL} z+Tt#=aeaxxg%LC2_j1-~z186>DGti|5?&WqZHUD)LK7uY`{S?+C&X+kjl8-Zh_qs} zYR<2{rC1_k1^>L+tUbR%B^J|Ddgek~Umao>@Xe=}Fn+t#-_+<@J)v!gT$3*BrM-a) zsPX@hs7J*fhCL>2UURrmYgi~!Vt(0dQ&N9~q9B;7R=fAtr>j0ADUr)+uiu4$+F@&%WknyLL>#w1Y*SHQ`zZze+?PlJMf8b-d-%rFhk=>m)a6@h2T|%A**H!6nE4& zz0}}+J(Q|p#$am=Kj?{UGt@ff75f(VM;D`O^OT>>;?`c<3*^L+X;0$UlA-e|2L*k( z23Ba=X7gu-yzYFwL_A{YCuoVU_=pLKoYfuobHBRS3tb`#(6|tJ4NRVpf)%`}pzlAd_QGx_MQFrn!01$G2Y_j}hd@5l@#dj)S(x(+%05>lA;SS?k8|@-B1P z+lK)t$!ZBlC1yChxI%linzb-=U*npKUfCXtKZ5e$+No|2$TB1&!iSyf#q1pWoc`^4 z6N^8Rx-luBXJ>T|RFHQ>2dqk9@$vuK&sitT6O!)ao~t`8$biGgBK63ckot>cH@rF_ zo1jhITz-!Uc>Yt3JD+`ywMnYmgZ*6{^Thr5=E%3&l6AF@EQ{&r+^;g{xTQ}hY^u^#`D zz?;_Q;E3Jq?9GO9gYY3lg&hOF|ncvC1UJaW05PU9w>pn zRY#g(+majCfR4d%Q)e8+lyCD&%7HWrN=pLzIY&3oBaC87W z=x(}1eQ(bjGJ;5;(ZWxYr-etgyxKPnE6v$};-{UBofJ05xE?Id(&`V6RV^ zIcH}zH^p9lkh}$z+4?9+9U1N!5k+jX3DU~z7AA-nqgaBCgB_YYV(#>UCIvJLDL`$I z6Rze0yJy=Zq_yNO!Qa5nRcyEO=(1v0yaOhNM8)GI#>01}qlSsyF8(ejtD9+)GwBm_;PZ#3?Nom8ca@#St zUsik_OjLV_S$mW<&(*g@43(g1VExQ8|6J5=6dLTIj$NKU1iZlf%Ke7@dQl7p=Bkf~ z3^)FOUsBrU3trNbQNPGXRm3-jra_ZGzd5Isj?)Y3nQuZWKc0dLp&!tp`w}nV#q{aC-c%F$QXyC9gT$BBW*Bfa=KpZcpeX^zjv$4YbHE zs1eLYWy*O`*k}RRz@cRH=E+tsG&dWgDwbvS~j%>Q~Rq;gzfv@_K!uY!WV_ z#9Kb?chGxwiQ=E-Gk+0xbt1v^$Mqc8&J9l9tA+mNiPtm+FN+I3R7V;08OtOA6Nan* z7bN~y9p?WQ3O~M`f?fQOP2XHZYait(eh>Z))B}OK2s8?nLg%3JC+ELSM31OJ36LPf zgg`s_$$2lhFcPd#dBTWs9GV4x(3k92fsy1b<)&~q@wkJ+h?0mxEkhT~6oA#sB_3Er zV z=WdF)a;#aDxUO;UwI=i6`!jU%_UH@hS2(K738l5{vnHnzxH5DMn;lh*_%<>eK1H84 z+A=X))>o4vO9t<+JX)`(Wlc6D*x|oHPV+n-m`lByVw*-_FITQvXS)4KT%Rvm_a+r? zKit~PHJG@Y)^YLWTs*BCw1?ukRk*-(220?HzEZ6y#rBQ}Fpv>TxR9yC+#PJF@!U~G za*g`Fy%qGdtaE$r6b)rSX#`=8^?zxpEEO!p)6t^XnGc02(|f??ZoX2pCQsts2uGNK zTH8f3WbT<;U)p>9?#B0by@vHnnZKuoNg!I%^78vpRF0(I-Y8{Zt{^!dy?u+`W-UDg z$PWM;%fq8*Uhd4aq(|EH`5V&=TKAGfz3-Q7s~jR~>X`(xH@RP6G7(jgD_9y$uIJVV z_7z2%Bz7N7#q3eNaIgz7BPTE;pMm(D|2)R3Z;k=Q98Sb?YdlJ9DV~xvi-Ebeqmszh z8G$iQs03QF&i##+Vp#?28OTazWj|rv=Py?1BY};ejh?Eys(!AhfwhVLF3Am>{C@5<@NQNbin# z52Q0nkLARzr&lBgm8{8Bf+%5T1cE8yck-dCC! zJK^K&<5RLCZ|!|KFfc(_NAVbV`ctbu{}VI?EDu(8F%g8pcvt+d^*um!!mqZ;z@-TJ zZr##A#jc#H3U+yY^0zx6+~AUuoKFp>*KAu1{vd(pczbKux@AAPgzpJBajUyULmaI{ z+6uxR`9hJDuh;JY+}x@yWnVpmHJNDL9K>34K$y#OYPU-eT>TUf@VOkKvvLNSC0<;1 z$DWqYoPYZF*RH_5xZN>wRWk_MuTxbIeS!@RW8hcl6v_2W?WeTp?^+WXEObriUdj2vwdoXeq>XMaRs<_ADh-bat64(ZC3!!maUc+>+whj`$45QUfZOBCbV(z+Ne zyKHXDEvn@+bx?ZHfr zJyveNkj-xLY|w@L18~dlD%RvIyr72ZqF&|664z)w zaCiB2J8<_Anvt3CT6Y%cG-W=I-$s;jt1Qqbi6LibVNu&I2Z_pH>GOAs&Y;{`DJ&Z) zcWhs01v$pM?X#EAfkT7c=*!m=I6b~Xwy>hc*!JQ{ylA728Em9Gay_f4Kv}uW#{}KG zwvo-(%L>C8f`v+w+J1fmR|yq_PtUuuS=n-i<{?hV4ICoN#p4Qp;Xls{b^XnTq;Pu5K+X{K`d1t` zcg^rg+F2Y<8XnABmNd~Q48sxkhly-1J7e0zT9&2L*VI#k0 zo_gOZ7<{Rs;kC5RE?xc39@qF-;%HsHL`DCF1BL#>I7l%{+O7EwwWXwLJM8WA)mfbo zfPwb?Ax*IBTlG=!Kk@B&dqV3O_N_mJnzSG8Jv}`* zi`0V^U|L@tHf1wGTi#8+7Q1}g#=vH08Q*2C$zFhMj6f35b#T|UxW^f@g(pX07?{t{ z8AjD*-?25Z&JnTdyr}+U2iIoxU_&1W_El-vy=DhelTypGA`iH0B#<7MUNnTDRoGf9 zY}?Lgmt1_AeVPY0Pk22rDzcnSkL4_W6YQ2$&nAE0a%TnMCBUcv=@Z!E(Efn61X2zv z&D!q3bWt~eX_a8*N{&UDJ7C=%@VfKBxW`My4B?ef>G;ko*%A3`93s+j_40f1rM#-oh#;=fzk1(Fn-+9eyULxO`I zofpUcB6x{g1}+S75Ya}kh5~_cq`|7Ge^>ok-kRKwKM9?JL?IDyDHYg_{?|*2!ClH| zd8`Lb725`uumE2wHi3~<>l`rYF0rFl3I)i7!iz68|DGx@2oq_ug3jHT9;)BHDLV0%#WXTeQJ70;CBucv+mYakJn@n$LpV*1sNDzCnaX8mH> zvBSk&z_-#g)~2SRova&d2kc;9xZ}lNL4xZeCS;_bq|w*F`W(uSSf@QYatJ>1=W;#Q z(R@N6!=T#k+S=&u&Z%RLjmwCDQi2}N3^o!dU82_hDeL1l*|7j zZRi14*#Gy)qfo`MMLSqC%yv*!Q5wEvvhFyh&M;DbY*s9%NHIQkZV4J z9B5216;jHfv($i4FPN0b`en)EdDI6Ni`wVsf0kDt>H2W|=d|!}8p|q6B&##)A2b+b zaL8s;0Tq&`;ArH1B9#_h%+!Kq3Q2CAMYh=>dFYT?2`l(&eD;ePT>%660x(0`uOG>O z2Oc~wtMd1w?ZJl8y2@{Rn44ex15?G|1CDN<$8npi zO^%%1(N$R&To5=`x|(Pm(^Wf`(^UvIS|1u90^c2E8%F`51tfo$?_dk8;QoeKj3P4U z%S#u*oI2);&dtknDV>N0p_?ley|p6!YoViH zza8#dv4V+b;73wl&-I@5MlwOJ?4F zVL*4ozBedu>4rY~>yMMD$v_I!R~ub;?M={PkYrVIwl1k?BI+pF7v3@4O(s ztT9DS*D*Vm*28eCQj3aS*!Ksk;)2^52yK3atM@&EP?#2%q#CC7`fY&ms2 z+0VPj;8%%3D$uF0|0&S+(%!m;Ppl=W4lh&=iF;0qITw5y85vpZp+5Av>Z?UQ-ZNMJ ze0=%tkzRB!ssP=loVpuTYLz4D47AiifE9=>w)|Zw@8u|(B^OUM5PcQ>8hQVv%qh}1 zvDU5b=eENc*$B#OKJO-ShC##r2_{?}r2QYoJeFm-@U5nyEE}*RegOUXd$|OF4eFvduC&5Ds9JK5C zy-ub&fe?>61y}I;Qa}`O72-mjvD}qs!A-`!IYmpC9a2FOR|lNRlom~^bPeBKdA!8+ zgN|O`{9PD?e`)Q&CaUJPMF*+_Br2X;cieXZcGd#yldDd^^{PhOzi>9n03Zktaf5sa zBlj^#v329$0%RV@(~T>)ZOq|RU{wLcn9^ZPj>MXDr59L)$=EY<)a_+pw%Kn0I3;&- zkp-NKihhax-A-YKjvs0jeFB}!@d+JpT1n(JMOPzT>F-5ChK>YcW4EGUMrRn_F3Z-& zz6i#kbSXeDNQ4*o+XN9Bg2rvfC1;!kQ|WXmIcqX2$JLXn;v zJqczxA~WpJvBQ9pNC8@q?sHmt=QiL|)r1=yo!`5O=_57@Ph1>eqh^r7EnK(QaO_en z&Z;}aJj;q%0&5ew{UK)`KAsRI67&thdx8L{7ftNg^gDRg5r`Gyt(q~X-TceT&5P4^ zmKS)hXh;(J4V{JLuxUWhB)mSEWNW&Eom53@vIWS5*=(;_YCxKJ9L8f)bYf@a4b~tZ zA#1^h34+iPS;^PD;Y}ro!v&8%9$;3My0kmCTPYf1?Xy(@Yh6OtIGTtovZ`~{`T>9v#|0bN#AYbVRiZS09^542kx)} zso%9t{+q(G<$5Cbl_qF&1s{YXY|RsF@)tK4z5vwqXa;T*jPhSS|FIn=8eVaMN0NSN z?3nZ{U{u`D6X;&mj3V}8iRM!2sx~U!E5fpIx5kRSF0;Psp;~p#pbT$thiLpx?UzaA? znDnysNWDJ~?cLgMZ7d(C9aRW7s%AN}}aV4D)qa~lPVuU{&4 z@8W9q21`|nEQa<^QSq_VP2$>yDK1iMkxzTLjoKlgK#m`!j{U58XklJ-96*kI@NNyU zXhAER_J6kCr`R5CQ@9H`V2uikmlUxdlLIVTwa#WKpwWaggpj4Wvv#Au#XgLTG@ajH zaN69w*sJfm$orPft9uCX2%Pvx5GB>GH-2p+jQeb5eSOTE{I<*o0sJxrmoM+6!z7IY zF`RSr{A|}WC~po*NB2=pliN*MO|;1S3D*dTXpkHyB8b%-4>6$@<_#ZjGp`R1;k z81@fBiiQ4H;es}ro87XGDTJVJ6_a|9ag$(x{Ixwo85JwUwq%=@1j=pk&*_kbIZX82 z`0K7|tSw8>4o>fR{ml-L)aDaFcD5aix+>V^Od3K#0mRo?KO32wS;N$L|Na$_l~9H2 z0EVtq%Jtlnx8-`Jv553qv@Ilj@f0q zsKl1xe}o0nBdz;NG5S*aMk42qxY~rc18DiR$3_tuHC8gtv?j8Iob6~r`G36Tm2}f; zKPU@n1j{Vux#|e&gNh$atE|Qz!PxN!h`1>^mB)<=8Ull50Elvc*T?Sw>})15X1+$o zFus?d3b5lo&}4lFVUC_|0@!R8=0#!8aaW!5j{!yjRxdc)s1tApq`?E$xdCjqWaKjK zg^F2EX&vah21A5Z0SMjK&~M_KtjBm=AbJeJ$@C$1%EZkcAmRz12&V5IwIE|b21tTo zN`L3J3V`wy$dq7r{^JqICs)L(hzTP|x`(ngc^z{#$QktxX$aJiAB^Kme=h;Vxx}$4 zm&g&v4eMnoKr7PU6~Uao?S}6Umbgl<}w2u~w1`{k6~A*#wKjdF(!sle!&R>A z8hq)f(v;=tD0_-;hm;3^jFRb~Tz^F6k8))qxUT@droMAc6@c#U!j|vnLAMPSm3_eQ z>F*!HlDiL(Go~thR&l~&fZ-J_IKb*ToCJy$LR0rfj76xNa}J;!(xa*FIZTEZ}C9oIZ%dE1!St|#m*_75XyEiLg*)b z;9TXdi~&STx3|u`$ZzLBPJrk6Ll)3Y*KkbbF_5Pe;1f37xvv2{QYRQ)xl04NwlDa> zJ%?RB+;EaAQUd{iap$0*n(Qu*C#b-0GTeFEYzABpFgGi(#>Wx@KuECzKbMX9@ahQI ztrs{E_K{AIj(1^=!NPA_!%gWv8IbW&?(8ZoahN%v^~!q>DhYJ%R7ZWX_2oZE5wn8W zQ0mA$KxML*Zyh&Zeo7RC=M;Zak54sDm1c`IY4B3x8$bi>@izUp#-*WeSZ%^oJ;s<%9E9SbMAs z*6E?C##ahk#IX_3<^|Csjf91=H8CO64LE1|%l}RJ=`C>HVvh`CBta>-)eAI!+M^tu zV(1M$!Ov*y3uFjQL0QxlCD2y_p&^0H7CL+01OYRQ3(L2x&96MLEH4Bz{^Hr_=hMgC z&~@qxnU@%dmP5`WNdj%@Wm%a=b^$D&@}4|sQE(=tIjVc8c!?j70A z9V;`m4_PI#QHDoGjDkj&03Er?A?(Og<|WkSlYE>nm!x(@tm~(29S?@Xg0<|hnuqcp>Be*ib+_6beI6?>wnT@ z>AW5I{Lahem0HY7MOL>*$=7Mm2=}P*4~0hyp2N?9iz*tyY+k9>_>-9m?W%24dq|EfLQ>F%_o9XWFr>W7RVS8OA| zN~M8^=0z^2%z)TS#NvLUy@iTVS48zcP}NHY=M`Hw8xc9_K$*R6w4b3zgAs07wZdpb zuwdbnAG@)jf3fKMASB6Zq5pGVUq%!+O6TCg7EX=unGfwNsTSsc%0YpRRZUi<6#=RV zaNHVzxV@tOAKmA}|NnvW7DqlPvpJIY{+-(BLjVns@xe4sq}5*-M&}<+t$*v6T17Rdr#m33yB5u>MQ;0IWus zV^dxf{hBor6jQRN#P8nJ(Sa2xENF)XqKTlZz{Y)A>ws*`&SuqtV#U(9TO~6QkMZ*$ z$3KPfO%U$77To{~^rD%VX$_$y(Q@#Pp2Bc$#Ru~H|KBalpYJT3FfN$Pj@U17HuC{e z53H?X3gj;{{hUP#9iJEfH^(&G<>u@<981?qP>x5LiP@`YX>P*fOG<;6SI~( ziI+PcR6Q%u&d$Jg%_KNO!9biMRLpW#Du-K=dzY^KotwWR;q5dW0how#K^(>NVIJ2l z^yn%Iq@RHEdl8qs&lf&@r377M8p;h6N^3)TY|V>=;8Zg!`+qvuqLrO%D6sOwGwStX zi>j4wz*lsDub4O7v;@OU;V*$MW03;ntpW*3p2=38a7j4*1V~(aY24UeR~^p5*N!T2 zxgdkfo`YvOW$yzLbdA8|=)A}k%zX#Y-*ihb#4V6+00Kg?PCQ3cj0-MgTTY5)+_b8N z8Iaa}aIgo01wTkf->W2!zo=(Z05*f&(e}p9v9i?M{GZ1vCk@-d0BHIrnA0d#m{B3O zisg4%6rBX^nrkE;_Oosx^SV) zugN7L5T`9PmEHK3s-E25jhb#`#_FDsk&QRcz^w>chVZ3XJVo6A2{dWPb*=*G($YpC zaqKhDB)@?&pp+OkdD(M-v^oK@b`6YG-3Rdz0XtwH8T>7~b{_j6pZ;5_X;OPPe=%mL zmGYhqx7XG;?oMNi;r(p!9i>M_rdUxG>;k_%GBh3e=fhiL?BVU=0T)l)m+-Zh4+1<1q-MW#>O2IpXgM&S|$YR0WGGCBDualTV^2kVw=i zx^z}IW$sYxvtB!n%`$@@cGyn_7lhLdjF$UExu`31(@#(2d_E6-U!N9>UKM%K6LV%e zA-Cy>xo^Xv1;iDU{M}DjTsJZW?cx~p!d78oC8}rc0`}W%)5u#eJYk}Hza!ZS)F*}! zbu2mPHU7ar8~gP91O8|T2!QgQ#Orzq(CzEUh1ls^6f8C|~4C^OyKF z8kns@=~qAnn%w~fCOR{x5iO1&Jo^%!7v|Tn;?rJmQJaS-dMv5v2dLMqS~PsS{D{~2(0^6@G&GHc}`qy3>th_(@1D+)Rf$*+{|<2AIn+(sf#rSXs-YV z-IW7?1ot_BLX5fVZ{Pntx|-qE4%}_@_i9D4#G+IIwMxpc7D)dC!;d&<542%c+TL^B zVyyw-{5X``+PtV2&Mfg~GjMi?IrGh3)qbBbOYC$BgJFRWZhplBenke-!|m;(Zaft@ z-~bHJeGCA%=_WumJ>ghsSNj`Z&PpOWWdLsX!-y7tA_JF)7Dba03;cjV$-!&?qXDno z8`uk>kJQ%?xs8Me0T!l3?%uRQ@2mqXaRudq^lN|g34av4>@6sb3G8s>q5;6rL_u0? z1!?g;h|LB#Hhm;PoEHrwpGM8I<@0c}c*xpfew{BTB;C{zE4#Z-w)qs`swh$9G^k+y zBxGgTCf^J<1@j126(G{bi7cV4Sgl|UhtGEp%gV09D`*BI0ul%pL>NLEYH zssbRmqv{f%bm-$@p+zyTgw7r8GzS=D)te2M6(^zVRWt6`7C=R?f~gPi({ zs$Qz}N|1<}Oj@A0=K1O9aj+?l$P5A+Js8xi~N(eO@E+z;Da zw(O%3FyCW9srZAX0c*HGxD9XUmpjlg=~7@K=o{clO^~Zu+4r(T*X2MnAI|fkqS+23 z()zn+_>7Lbnl1Iii6uP}?&!e{&oh|njHh5Aq8snD^DHU&StH;TyMRp5`R{BfFnbQ( zs2Yeb$vUwd*616RKYI27IW8;v$pYlb@E2gki2VrmcaJn7J#adkBmW2rq&L7`5(rG) z1UW%xt7dd)AAof9Ko`r8Z4M(=u(A(SR zKh{GDpsWa&Om135!OM#P4IXD1jBTw&e) z2}qtJU`q5s)r=mN33gYo|c2y!qW0b7}bAK5h+H$!Gbu*0r@k z3qh!E_uw8^R{ajj>tIGogYl_!HIe`J2rk(3JURi;33T2U?5a`aYMP@jI0tEv;|WVp zAl*bD`XeR5)|ChJ7vL&Q59bDYP)p>TrC8@?#Ln_TPxNI#H?pkkP!n6Qr>#Oa9m%Up zULV=qoUI$hPfbk;Kb_D|R|^{pD^NFhnE1&@Xn(Z|o2~oh@*__-1F13P^J5i0CE)Lx z+Jpo;hxeMXo<0f^QOzYn8f7j4!fzw?Q8y!jgN!*bTZE)Vkzlgao#n&+SHHy6o7Q>w znipBY6E%L`+8p%#UC*YX)k{0dp$j@_f=&0L5O7Z8)Rq7>m8Qcp2UibOs)GN#^Mw_M zdhUW)*E4yqaX&j=XfWI$O?XyEePiM0p}@o+WYf5<-$iyvHa>sft>4Kl;To0vh_!_7i?u>reO;_zW$=*s) z5coqELPAD}_l`zNR=s=c%(qLx$KgLJ3gpS}bk8q}3A}5%g?b@xo(D`$2Sr_Smpuon zND-J%Sk*l#xrF~!+n2{fxxf9-f-%|2ax7UAEkcd0tVg7>w4P{Vv`i&2h>@|(oaRK< zL^2UA;wXitn2eayLS!kjWt#{&_L9L^p6edp=l9R=uix)^J@e1}alhui@6YFRt?%o7 zU1JNuS~L={Iv};)Co!hUNvI6AAU)RA7MF#~LWclTc-&@#-!U~ZW%;hp z4#ZA}!eP6p91qgEC#cfpHFAqV{CyMef%qFeU_4WVF${I`JO`dCqz|i$prsinOvtK# zQ0Un1#T(%|O6RjJexGaQ<}*50p~f*YVCap$DFLTt8dR%OcId{!3AN5_)YV`w2c2Jl zQ;EK|{r$q*`)zpB5y))LogV;^Og00%dmc!Z^-}74zn6THnZ3PF;0bl+-siyuP}h78 z=4JQ|xI(+{ZB%t*CxePr7O>EA<}o6`AbH5u2LMRMeJo#W_Lw#Ro~uB(h4VV#hay}6 zw$hbkcWhOPz^F@S7M`bp&EACkXf2qRWaFDH+KfLk^sqx1C!qgrX08W|0o;XMM#_2U zFX|Rjv)%@4cBG4a_qzNJj7h={!3I7SRr7cUm5Nh?~a+ z>R%qyRMNIJ!6u(EvqQJZ#P)`4_2puK*U7YZ@|JW&@3X5b&U5KG|-;I zLT(_Zp`!u52uXmXunl5|V;zm;(wxiJB96deyBpHe4CeHAo-Q%kV|p7|auVTBY8SHM zYVIxhJ;{EMOc05huhnm`WOLDFvKHlV-|Vx#aNl2GjD=M=aSH_x9VP2Ma3a?b=L7K* z*zmG_H%QKyvnaKy`+V9J+9uecZ(SI8*9*L)7{_HaLJ}<<1mqQ3&tdBkX2T#5 zkRp}iDj@i405rEhNWul=D+A<<=?2??S+euk8c^a9jwhdk*v@?A#!R^JFr>uujPta# zSjW8>1lo2ALe5)PA6|GnBpjOPJZ#3>`!cj0^f*%~fX_`f!oH8euM8M(r%*&$8e;AKQXR#<_pNZgoSjw#&=veHd7??D3r=; z2xefVD(vuQq(~(qMTSLX9NX0&X2c?;d;!iv4~nh{;`4vR9r|)3=SURM9ppEts_y~~ z3-QA8$_6Lxw?ES9#NEkF8Ng8dx3H9m()MGgC3ttjyV2kvHii7yrq+~@6#lG_yX1;< zP5=Dk6pg-^vBavAAz1~pyo1cJLFVS>jdy}#KzYq2?Kh{Iym5It(Pj^Zm2XN2L1H|bE~omEIc%{gxuv++TOX9VF5T@-oJ6|VlY}}YjtPh zs`>VS@AS9Yxg%IMZ|G3z?)QekLwz6sc9HsV8-PJHH%i(U=kC7khS0xm7 z{^hI;S%f|#yK#H*_su|EP!(F}CMZY%sd5IjCKDq40y9(w=N6a=B^=F%^kg`fh-O3svDjwE_o+Z zwQdPrSd(??zS>I=13{=rmNcdsRH$39!NH{<5r9t9B5YDLtj5s$dVN#z-%PO6Z-n`v z&Sf~%F$g*O?Bv=_lp@5{#g2pN)*C<+BIX;gT3vv6NWey8aHuQv-Hc#%6727(AW2v7 zVPPoP!bcWTA0b5JzAm0MBxb`p?foEij@gw2PQeE_C8DoQ?2w?0zDRRvMj=<$txH8H zi-Tf`xDe5Kv=>$%^A3LJy0SlwK;T4ytfGo6wVCSjafKLZaDDzl4UL%wipyWR^{qN4 z{>vsx*3RIlmyq;cF1g1Ze+CPR8O=SUjD@UD z8L38x-&ol=sO$P_1*qPw$ETz$YbhmZyI`jaSGK&z6@TUmyvmW+f!6>|SO&iBt6Vhl zw6OK}M*Bgq6fBh5vEOCFB{C&5q2yc9Ak>6mz=>w|LqQ0)B%^|_Q;aLbNkbvDa7ehR zNHQq^PD`tn3--CaL0A?XhBboTfi+8$ueAaClOq_1izh#MK>gPrV&;>c0m#1ff@eaI zc(K>0j5jnUltU)CNCp4Fikeh_|1na^LvKXoVdLKQ;qdjHdsmdtBoztBnxV@35Q@zS z&?0e>XU@G1XgDaJW&YJ?w?J^j$tIJy*Ny&GJXX;C&706s^k#q@bzkX;h`&VEP#@=Q0ki>x`MnsoX-qOn?L6^V!ka2x+p~ zh2R(eE8k+@G-$h=n85HmM^q;MH$Ap?sS|yxt^IjAr?SVCU%(5fB5_JLNg;qvYvjsVRcy{#d zL_w&9@w2k7?u@dn4L#htLD5)lA^kUe_O^UZ<>%TZsX594)6^z44g4s6bXCEsY240? zj=P6vyrfmI2=j<^%jt`AdPmmhS>yb#+j-T{ld1&K$IBBcM+=+ig1`BvN1o~|c=}5e zh*)8}yrKB{fGH)ivpVlFhAO*crrxqSdB%6FBI#2g_e}V*^#-!S*NL91+(x=TjZ^QN z3#}9HD^nibOZ8l*m#~3c#OYQ2P$JfYHq&3w_qce3=LLgmOGS}4_>+4XXm}r*+bJr> z>K;|yUh!u*n9__6@A0J&<><~+!QX6lhV4cCDryAtm?PLx?CWn||1l)oc7GRUR=X&c z6Sc}p`9g}DDNCU%;yB;2H^`+rf-#w8sDS^Kx>0mF(?HhbL})4@*ky za{5SpW(tkuL0JaMY^uapYcr>W#Wqw{Y|ZHoYldErVwqvxn!+9YPjzBg=llF`e6}EO zd?_RLbl@7IEpIdLFV$$1(caxH`}X*=$l(Qks^K_~oUozU-T`~ADyc--Sb5Tde4SI8 zr$~!M)uP<;)0|1ZwZD?SY7#oLCqlA3DQiUX(UKcX{?-pLnH@ zkCMV0?b*q3uu8G^uaG77lt3Y6tXRen+ep_p{0 z3JMOHpNVjuUF$KHH&v`zq)-&xH39SQ3O8X!-;nwQe2t@(`~w+1DbUUN7=TpsR1W)4 z{;#YBGn;>{e|ynylh&K!g+7L<#HC@zOMKdfiICGDG7=Y$`$fYox~Pj)ZR2nTZ^5 z#20H_@e+q`8i{`%9UX;v6H7Y=hP<$aTOQ6G|1#wIXq>99YpVRDi<<8`QB%U~(4?t} zcZ-{a@coZ<{Gv|O#12UQ2|wq>_?k zf}<>6rSzm+B(SV$wg@eywY$2sSg^>Aom#s2L@NAumA^WR;IQj`bC@rgrhlYvUR9US zlk!vHHoI+u^4sA@hjV7`W`Z<#KqY(Y*ei!HS%N^JNNv*6p7kc5d!G?$mx8aq2K~zB zq!Mv&`(7&kr+b5VrnrIF!t*D~?P>|o;%;y>>w0J1JmJ?XU(6aUlkQP;9p<=rJj9+s z_%fVNb;M^Xq*5iilj>v%Z=0Guy>AP*(f9V*MgP{fw2YS4>v|(WXLT>O`$?2XGZO_C zt3%Vt6AfCr`_E#$uon)s=9=pe)ErelK9`uplU2M|JW=59UNou6Jgt9++%DtFH|2Bxtmx}n_vWakpkFYjM!hyC{vzN+?bWn%1vNvDHH z^Z2I)7txX;W^21xwS_Ekh2Tmx&1?LTHilen5_$*~C7L)f&ZVX&_EeKz=X8IN%O!Hq zp{l!7t(oy9qT@O)O3N1a=E9^X%bN3+a~i_d#Q%?J48IwVoq!<9VP1@2nQBa#nv`Bs zx|S>sbFo&D<2hcPb8<6o2)jrw`6>}sj@qZuhJ0qvfS{;~fVRI{IDm#AmuJ+8<4e7Pbg0YDpl47}EJGbeuPLzb zJHo3J7ZR2oR6A?9rlgS7WW^$J?}i%p?nP@9!BW(swysBP4X#9c`r#qX+Fe%y;ZSnC zUkZY`ty~g=H1+|4rkL1>ofrsWFrKIq5g>)8`$?Bp`#>*jjinfDtK9HAAuaBII)o#b zz{)K@C7Zl(ZnMAKa3IM{%tOQDU3Ydt@nSGBo-^@Ts`$8YvIJ-TsD?KQOOv40)0OV> z#`%M4Ezg-9vOHh=QT~uxLd-WusFF9Gn8zxE?=Hs<-;0!5P_n?bt3WFP`O8I7B5wM! zPSZ!^t-A*ZJbh>_|GKTZNugd*(U6jjWp;(Leb&#+RwuYFnlz1@E zH1|F*oz7AGV;hac2628UX)z^{EKG=48YHigA`5CT93eZutm-L*cUI7QjUHdR^lnBI zrH>uK5>QEp#!r#rFooz1MVp`_-iT89ch$(S%&6EX+5jCczMx=H)m@oTI8YkEcds9{ zp=kEhzB-a}{d(blx781gr}W!M$ogz=!``MnrYF(IHfGG%`zjMFRhosZ`7r6dZ;g@U zaWu>qmkpJJP{`k$_0{g>k)@u%F4D|{(8U(oZ}hYMmz`R|Ty>fR`Pb|n%9<+}r~ke0 z<}>f9IEyW^)lNPxrsBAZoFLzp;c#P;qbaBzy!g`6{J@_$n=^{SL zXu_QJ@Nq-1r1n%7n$5at(THsj@e?saFJVTdP6rr&nBu-?Plyv6kLqt>4bVCCB-#_Y zNT^mt+LJz;D|D)OO_vSVjX@fI{_k<oUizH&qMD;M{=^g3} zk;p=JuO~N))GEXN>-y+8YPERHXg#UKVH4lUA#58`m4sc}TkmVmBia8M=x`@5Q?b3a z+Y4jN^1^ViBW!_n@n|&+0ylfxU0u~bkA-PD3IW+pba%Qf28NK14PxLw1Rr9qn6LSC6DUj3tkes6qfkJZd3 zo(+s1t?a4uj1j!zjT@zREKJS!w(Ppy(a*@CkT39oj%O}hTp(Ybyp3GMeBv=QY_l0g zq6wy^iesN8^~2DtXYLh+o#OjE7G+HQtJ(TT3bt(0C_mD8jTOaQuy8MXAlXC-D|f0??g^I?>G5wz-Wm>>Kx5?5Hf zy41a*N(SyfeK8;e+t(a_sbR~ZKn#3S=#?|=}HHPNO z58vZNnI`o2Jl;QpHg;NwG$bk#?OWPBxuYbrgYN>o-1?6OwU*^__Ud+B(QdX_vLu;3 zV4kp3;Y~{dI&d!jiIvPZtEm@+gT^8qS1qL3)6K#JCG1WCML`Fg&sjdBr z@o{;26)%Fo*>08+w@Whz+7^dHiifEbo}PX4h0TkPvl^SOY1bWj;2W8%d-4>%z6|#~ zaDgp-d<5pER_-^9zc$^)$a(gv0aKzieXIO&rbWh)GnhH0qQeQNhMvqu`i6H&hrX<; zm}pyn!JHBm{V_Yxh&ZS6Q=8FN=6(!V6B9^NPt9MPvy9}1XnCKOjS+4t76;G2a4Ro= zm;8P}KTcL`Hr2_X7pF4$OgOMva_d~g<<*xgyOlLdpKR>CdfmjfogVZ=x@%yi(_`gbHx;gR;DZbn%9%xS#8uxPtPq=CYjaM^_a7=In+3gZU4BF z?9R^RBJ7Z2vZn*szZ-e4@QaE=k2h9|w(Ci!%^7*;1fETlT}t~HHA%KVK(V@4IB+CD zFwFQiWk|5x?ANI}Yx|mZCnOI0haoyK&UJvVu=9lGj$K6m3GOg>h}ah#BYB_YM6H5? zgX7J!d+jgsTuC7!_sjyL?4<_Ow&W(&kFMs05;CM9Q*vO-Y-XH~{Bi*{?|q$(XqKKy zikDJeSeVT0AK~?9TP!>s=23`H`*kfUyzYu`nbDV&-6q9O{J3}Ox?B15K^P41l9Ak6 zh`PWQL~nUY5jRaM#74yx7r6X=$0}(1Q$F=Ik2xm3sKnRNbyrJsx=`A@#K@1{DSu=9 zL?3?$`=+iSYBb|zWO%|r8{f*iqG4j5S|&)I3SWEDB~Lb2>u7Vg?TDRAqk@?FBAWfW zyK-G!)LeLY!UKG>)Y#y-GKE(TJ!t?1KmUe|Xu2d%5a7MPWU2L`n1OTs++*W5I;A{d ze;h!#gS}fN$eYQD%x=3`%Su!4KYv{LDe2-cZ-_)k(_2U-qTaz75An@-YpM84d`pBf yHg5nW2lyON7B(5JRQkb{3M>BqPu~l+zMIRJ|2*~86aGpEwcF9n;i*0G&;J5dP#pgN From f82ee2ec71a0e1eb87f909129212a036859e1e9c Mon Sep 17 00:00:00 2001 From: Adam Amer <136176500+adamamer20@users.noreply.github.com> Date: Sat, 24 Aug 2024 22:49:22 +0200 Subject: [PATCH 5/9] adding matplotlib to docs requirements --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 1e68eb0d..7b0ba9ec 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,6 +29,7 @@ polars = [ docs = [ "perfplot", #readme_script "seaborn", #readme_script + "matplotlib", #readme_script "mkdocs-material", "mkdocs-jupyter", "mkdocs-git-revision-date-localized-plugin", From 1a1e6c899c1ac75c4eb83c6615ce9e9a14d74ae6 Mon Sep 17 00:00:00 2001 From: Adam Amer <136176500+adamamer20@users.noreply.github.com> Date: Sun, 25 Aug 2024 08:32:08 +0200 Subject: [PATCH 6/9] fix: df_constructor when data contains DF/SRS --- mesa_frames/concrete/pandas/mixin.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/mesa_frames/concrete/pandas/mixin.py b/mesa_frames/concrete/pandas/mixin.py index 27579a86..2bee4a52 100644 --- a/mesa_frames/concrete/pandas/mixin.py +++ b/mesa_frames/concrete/pandas/mixin.py @@ -2,12 +2,12 @@ from typing import Literal import numpy as np -from mesa_frames.abstract.mixin import DataFrameMixin -from mesa_frames.types_ import DataFrame, PandasMask -from typing_extensions import Any, overload - import pandas as pd import polars as pl +from typing_extensions import Any, overload + +from mesa_frames.abstract.mixin import DataFrameMixin +from mesa_frames.types_ import DataFrame, PandasMask class PandasMixin(DataFrameMixin): @@ -117,7 +117,17 @@ def _df_constructor( elif isinstance(data, pl.DataFrame): df = data.to_pandas() else: - df = pd.DataFrame(data=data, columns=columns, index=index) + # We need to try setting the index after, + # otherwise if data contains DF/SRS, the values will not be aligned to the index + try: + df = pd.DataFrame(data=data, columns=columns) + if index is not None: + df.index = index + except ValueError as e: + if str(e) == "If using all scalar values, you must pass an index": + df = pd.DataFrame(data=data, columns=columns, index=index) + else: + raise e if dtypes: df = df.astype(dtypes) if index_cols: From 9b919d4bff3c6135794b38453e38403f6296b284 Mon Sep 17 00:00:00 2001 From: Adam Amer <136176500+adamamer20@users.noreply.github.com> Date: Sun, 25 Aug 2024 09:32:14 +0200 Subject: [PATCH 7/9] fix: substituting directly cells_df if there are properties --- mesa_frames/abstract/space.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mesa_frames/abstract/space.py b/mesa_frames/abstract/space.py index 7b618c86..940fa219 100644 --- a/mesa_frames/abstract/space.py +++ b/mesa_frames/abstract/space.py @@ -756,10 +756,9 @@ def set_cells( ) if properties: - properties = obj._df_constructor( + cells_df = obj._df_constructor( data=properties, index=self._df_index(cells_df, obj._pos_col_names) ) - cells_df = obj._df_join(cells_df, properties, on=obj._pos_col_names) if "capacity" in obj._df_column_names(cells_df): obj._cells_capacity = obj._update_capacity_cells(cells_df) From 0aa5f1d19e0d2b3897d906bbb30a945504c18634 Mon Sep 17 00:00:00 2001 From: Adam Amer <136176500+adamamer20@users.noreply.github.com> Date: Sun, 25 Aug 2024 10:06:20 +0200 Subject: [PATCH 8/9] performance: setting the indexes speeds up the merging operation --- mesa_frames/concrete/pandas/mixin.py | 34 ++++++++++++++++------------ 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/mesa_frames/concrete/pandas/mixin.py b/mesa_frames/concrete/pandas/mixin.py index 2bee4a52..af965f31 100644 --- a/mesa_frames/concrete/pandas/mixin.py +++ b/mesa_frames/concrete/pandas/mixin.py @@ -266,35 +266,39 @@ def _df_join( | Literal["cross"] = "left", suffix="_right", ) -> pd.DataFrame: + # Preparing the DF allows to speed up the merge operation + # https://stackoverflow.com/questions/40860457/improve-pandas-merge-performance + def _prepare_df(df: pd.DataFrame, on: str | list[str] | None) -> pd.DataFrame: + if df.index.name == on or df.index.names == on: + return df + # Reset index if it is not used as a key to keep it in the DataFrame + if df.index.name is not None or df.index.names[0] is not None: + df = df.reset_index() + df = df.set_index(on) + return df + left_index = False right_index = False if on: left_on = on right_on = on - if left.index.name and left.index.name == left_on: + if how != "cross": + left = _prepare_df(left, left_on) + right = _prepare_df(right, right_on) left_index = True - left_on = None - if right.index.name and right.index.name == right_on: right_index = True - right_on = None - # Reset index if it is not used as a key to keep it in the DataFrame - if not left_index and left.index.name: - left = left.reset_index() - if not right_index and right.index.name: - right = right.reset_index() df = left.merge( right, how=how, - left_on=left_on, - right_on=right_on, left_index=left_index, right_index=right_index, suffixes=("", suffix), ) - if index_cols: - return df.set_index(index_cols) - else: - return df + if how != "cross": + df = df.reset_index() + if index_cols is not None: + df = df.set_index(index_cols) + return df def _df_lt( self, From e0bb12c826859265a5d244ee883fc873a72875a1 Mon Sep 17 00:00:00 2001 From: Adam Amer <136176500+adamamer20@users.noreply.github.com> Date: Sun, 25 Aug 2024 10:34:59 +0200 Subject: [PATCH 9/9] performance: inplace operation speed up --- mesa_frames/concrete/pandas/mixin.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mesa_frames/concrete/pandas/mixin.py b/mesa_frames/concrete/pandas/mixin.py index af965f31..7847bcde 100644 --- a/mesa_frames/concrete/pandas/mixin.py +++ b/mesa_frames/concrete/pandas/mixin.py @@ -268,13 +268,14 @@ def _df_join( ) -> pd.DataFrame: # Preparing the DF allows to speed up the merge operation # https://stackoverflow.com/questions/40860457/improve-pandas-merge-performance + # Tried sorting the index after, but it did not improve the performance def _prepare_df(df: pd.DataFrame, on: str | list[str] | None) -> pd.DataFrame: if df.index.name == on or df.index.names == on: return df # Reset index if it is not used as a key to keep it in the DataFrame if df.index.name is not None or df.index.names[0] is not None: df = df.reset_index() - df = df.set_index(on) + df = df.set_index(on) return df left_index = False @@ -295,9 +296,9 @@ def _prepare_df(df: pd.DataFrame, on: str | list[str] | None) -> pd.DataFrame: suffixes=("", suffix), ) if how != "cross": - df = df.reset_index() + df.reset_index(inplace=True) if index_cols is not None: - df = df.set_index(index_cols) + df.set_index(index_cols, inplace=True) return df def _df_lt(