From 85ac40cc7063c580fd93a0384cf53ec28cd4264a Mon Sep 17 00:00:00 2001 From: ClaraBuettner Date: Thu, 15 Aug 2024 09:27:02 +0200 Subject: [PATCH 01/13] Remove duplicate entries from calc_dispatch per carrier and avoid warnings There were entries for each generator (assuming that there is only one generator for each bus and carrier). But when redispatch is eplicitly considered, there are up to three generators for each combination. To avoid duplicate entries, only unique combinations are used as an index for the series --- etrago/analyze/plot.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/etrago/analyze/plot.py b/etrago/analyze/plot.py index 07dd75d6..d8616acc 100644 --- a/etrago/analyze/plot.py +++ b/etrago/analyze/plot.py @@ -841,16 +841,18 @@ def calc_dispatch_per_carrier(network, timesteps, dispatch_type="total"): ] dist = pd.Series( - index=pd.MultiIndex.from_tuples(index, names=["bus", "carrier"]), + index=pd.MultiIndex.from_tuples( + index, names=["bus", "carrier"] + ).unique(), dtype=float, - ) + ).sort_index() for i in dist.index: gens = network.generators[ (network.generators.bus == i[0]) & (network.generators.carrier == i[1]) ].index - dist[i] = ( + dist.loc[i] = ( ( network.generators_t.p[gens].transpose()[ network.snapshots[timesteps] From bfb932d86d19fdb9bcaf1ac39f5783619c33d9f5 Mon Sep 17 00:00:00 2001 From: ClaraBuettner Date: Thu, 15 Aug 2024 09:36:30 +0200 Subject: [PATCH 02/13] Avoid deprecation warning when initializing the busmap --- etrago/cluster/spatial.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etrago/cluster/spatial.py b/etrago/cluster/spatial.py index 9f782c1d..30d7779e 100755 --- a/etrago/cluster/spatial.py +++ b/etrago/cluster/spatial.py @@ -759,7 +759,7 @@ def kmedoids_dijkstra_clustering( kmeans.fit(points) busmap = pd.Series( - data=kmeans.predict(buses.loc[buses_i, ["x", "y"]]), + data=kmeans.predict(buses.loc[buses_i, ["x", "y"]].values), index=buses_i, dtype=object, ) From e432de95f866d01f8606e2d36679fce294b50d33 Mon Sep 17 00:00:00 2001 From: ClaraBuettner Date: Thu, 15 Aug 2024 11:28:48 +0200 Subject: [PATCH 03/13] Delete print statement --- etrago/execute/market_optimization.py | 1 - 1 file changed, 1 deletion(-) diff --git a/etrago/execute/market_optimization.py b/etrago/execute/market_optimization.py index e175ed44..6d8eb5b1 100644 --- a/etrago/execute/market_optimization.py +++ b/etrago/execute/market_optimization.py @@ -209,7 +209,6 @@ def optimize_with_rolling_horizon( n.storage_units.state_of_charge_initial = ( n.storage_units_t.state_of_charge.loc[snapshots[start - 1]] ) - print(i) # Make sure that state of charge of batteries and pumped hydro # plants are cyclic over the year by using the state_of_charges # from the pre_market_model From 94532fc4dbfd8312e0a46c535e69d5a287e65e23 Mon Sep 17 00:00:00 2001 From: CarlosEpia Date: Sat, 12 Oct 2024 10:52:23 +0200 Subject: [PATCH 04/13] rename functions in electrical clustering strategies --- etrago/cluster/spatial.py | 74 +++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/etrago/cluster/spatial.py b/etrago/cluster/spatial.py index 9f782c1d..54e4a1e1 100755 --- a/etrago/cluster/spatial.py +++ b/etrago/cluster/spatial.py @@ -121,38 +121,38 @@ def strategies_lines(): def strategies_one_ports(): return { "StorageUnit": { - "marginal_cost": np.mean, - "capital_cost": np.mean, - "efficiency_dispatch": np.mean, - "standing_loss": np.mean, - "efficiency_store": np.mean, - "p_min_pu": np.min, + "marginal_cost": "mean", + "capital_cost": "mean", + "efficiency_dispatch": "mean", + "standing_loss": "mean", + "efficiency_store": "mean", + "p_min_pu": "min", "p_nom_extendable": ext_storage, "p_nom_max": sum_with_inf, }, "Store": { - "marginal_cost": np.mean, - "capital_cost": np.mean, - "standing_loss": np.mean, - "e_nom": np.sum, - "e_nom_min": np.sum, + "marginal_cost": "mean", + "capital_cost": "mean", + "standing_loss": "mean", + "e_nom": "sum", + "e_nom_min": "sum", "e_nom_max": sum_with_inf, - "e_initial": np.sum, - "e_min_pu": np.mean, - "e_max_pu": np.mean, + "e_initial": "sum", + "e_min_pu": "mean", + "e_max_pu": "mean", }, } def strategies_generators(): return { - "p_nom_min": np.min, + "p_nom_min": "min", "p_nom_max": sum_with_inf, - "weight": np.sum, - "p_nom": np.sum, - "p_nom_opt": np.sum, - "marginal_cost": np.mean, - "capital_cost": np.mean, + "weight": "sum", + "p_nom": "sum", + "p_nom_opt": "sum", + "marginal_cost": "mean", + "capital_cost": "mean", "e_nom_max": sum_with_inf, } @@ -163,30 +163,30 @@ def strategies_links(): "bus0": _make_consense_links, "bus1": _make_consense_links, "carrier": _make_consense_links, - "p_nom": np.sum, + "p_nom": "sum", "p_nom_extendable": _make_consense_links, "p_nom_max": sum_with_inf, - "capital_cost": np.mean, - "length": np.mean, + "capital_cost": "mean", + "length": "mean", "geom": nan_links, "topo": nan_links, "type": nan_links, - "efficiency": np.mean, - "p_nom_min": np.sum, - "p_set": np.mean, - "p_min_pu": np.min, - "p_max_pu": np.max, - "marginal_cost": np.mean, + "efficiency": "mean", + "p_nom_min": "sum", + "p_set": "mean", + "p_min_pu": "min", + "p_max_pu": "max", + "marginal_cost": "mean", "terrain_factor": _make_consense_links, - "p_nom_opt": np.mean, + "p_nom_opt": "mean", "country": nan_links, - "build_year": np.mean, - "lifetime": np.mean, - "min_up_time": np.mean, - "min_down_time": np.mean, - "up_time_before": np.mean, - "down_time_before": np.mean, - "committable": np.all, + "build_year": "mean", + "lifetime": "mean", + "min_up_time": "mean", + "min_down_time": "mean", + "up_time_before": "mean", + "down_time_before": "mean", + "committable": "all", } From 7da69d10dd99b9c99a81d852523e1bcbbd9d613f Mon Sep 17 00:00:00 2001 From: CarlosEpia Date: Sat, 12 Oct 2024 10:53:20 +0200 Subject: [PATCH 05/13] deal with axis=1 warning in groupby --- etrago/cluster/spatial.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/etrago/cluster/spatial.py b/etrago/cluster/spatial.py index 54e4a1e1..17479ffd 100755 --- a/etrago/cluster/spatial.py +++ b/etrago/cluster/spatial.py @@ -255,7 +255,7 @@ def arrange_dc_bus0_bus1(network): strategies.pop("topo") strategies.pop("geom") - new_df = links.groupby(grouper, axis=0).agg(strategies) + new_df = links.groupby(grouper).agg(strategies) new_df.index = flatten_multiindex(new_df.index).rename("name") new_df = pd.concat( [new_df, network.links.loc[~links_agg_b]], axis=0, sort=False @@ -275,7 +275,7 @@ def arrange_dc_bus0_bus1(network): df_agg = df_agg.multiply( weighting.loc[df_agg.columns], axis=1 ) - pnl_df = df_agg.groupby(grouper, axis=1).sum() + pnl_df = df_agg.T.groupby(grouper).sum().T pnl_df.columns = flatten_multiindex(pnl_df.columns).rename( "name" ) From 26cbf1f1d022cb0878c502d5b40e156414a3ec1e Mon Sep 17 00:00:00 2001 From: CarlosEpia Date: Sat, 12 Oct 2024 10:54:18 +0200 Subject: [PATCH 06/13] deal with features names warning in kmeans --- etrago/cluster/spatial.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etrago/cluster/spatial.py b/etrago/cluster/spatial.py index 17479ffd..e7cf8c19 100755 --- a/etrago/cluster/spatial.py +++ b/etrago/cluster/spatial.py @@ -759,7 +759,7 @@ def kmedoids_dijkstra_clustering( kmeans.fit(points) busmap = pd.Series( - data=kmeans.predict(buses.loc[buses_i, ["x", "y"]]), + data=kmeans.predict(buses.loc[buses_i, ["x", "y"]].values), index=buses_i, dtype=object, ) From 1f66b0e95d9bea7bf8ad7b25cee7aa5f66c301fb Mon Sep 17 00:00:00 2001 From: CarlosEpia Date: Sat, 12 Oct 2024 17:30:12 +0200 Subject: [PATCH 07/13] rename functions in gas clustering strategies --- etrago/cluster/gas.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/etrago/cluster/gas.py b/etrago/cluster/gas.py index b31f4e1e..e59d9c8b 100644 --- a/etrago/cluster/gas.py +++ b/etrago/cluster/gas.py @@ -417,20 +417,20 @@ def gas_postprocessing(etrago, busmap, medoid_idx=None): }, one_port_strategies={ "Generator": { - "marginal_cost": np.mean, - "capital_cost": np.mean, - "p_nom_max": np.sum, - "p_nom_min": np.sum, - "e_nom_max": np.sum, + "marginal_cost": "mean", + "capital_cost": "mean", + "p_nom_max": "sum", + "p_nom_min": "sum", + "e_nom_max": "sum", }, "Store": { - "marginal_cost": np.mean, - "capital_cost": np.mean, - "e_nom": np.sum, + "marginal_cost": "mean", + "capital_cost": "mean", + "e_nom": "sum", "e_nom_max": sum_with_inf, }, "Load": { - "p_set": np.sum, + "p_set": "sum", }, }, ) From a5468e2f44f158baad107380eec0549787c4ead8 Mon Sep 17 00:00:00 2001 From: CarlosEpia Date: Wed, 16 Oct 2024 10:55:53 +0200 Subject: [PATCH 08/13] solve geopandas deprecation warning about naturalearth_lowres --- etrago/tools/shapes_europe/shapes_europe.cpg | 1 + etrago/tools/shapes_europe/shapes_europe.dbf | Bin 0 -> 3225 bytes etrago/tools/shapes_europe/shapes_europe.prj | 1 + etrago/tools/shapes_europe/shapes_europe.shp | Bin 0 -> 34664 bytes etrago/tools/shapes_europe/shapes_europe.shx | Bin 0 -> 412 bytes etrago/tools/utilities.py | 8 +++++--- 6 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 etrago/tools/shapes_europe/shapes_europe.cpg create mode 100644 etrago/tools/shapes_europe/shapes_europe.dbf create mode 100644 etrago/tools/shapes_europe/shapes_europe.prj create mode 100644 etrago/tools/shapes_europe/shapes_europe.shp create mode 100644 etrago/tools/shapes_europe/shapes_europe.shx diff --git a/etrago/tools/shapes_europe/shapes_europe.cpg b/etrago/tools/shapes_europe/shapes_europe.cpg new file mode 100644 index 00000000..cd89cb97 --- /dev/null +++ b/etrago/tools/shapes_europe/shapes_europe.cpg @@ -0,0 +1 @@ +ISO-8859-1 \ No newline at end of file diff --git a/etrago/tools/shapes_europe/shapes_europe.dbf b/etrago/tools/shapes_europe/shapes_europe.dbf new file mode 100644 index 0000000000000000000000000000000000000000..1a2f3f2f8e26dab864ac6a4d8c014c68a34ec302 GIT binary patch literal 3225 zcmb`J&1%Ci5QGiA6$(A~q+4%&ha_!&$PZ~u9$;fHwy>-%E6Hg?AHFi_sXb)kIJQ^Cpw!-r#?+95l~{h{4FIEM&`R@`LhgW7BnSMGjd^9?lXf`KM{gt7 zW^H{_3&K6C3f#le$-u~jom-Ec@>n5tz_^)RxN3nsGnFuQaP;<)_40DFfASw}Y|WM` ft})xMWIZ7jo2~fBo*R{$#a;nx2{NEy8Ts@B9?0Pd literal 0 HcmV?d00001 diff --git a/etrago/tools/shapes_europe/shapes_europe.prj b/etrago/tools/shapes_europe/shapes_europe.prj new file mode 100644 index 00000000..f45cbadf --- /dev/null +++ b/etrago/tools/shapes_europe/shapes_europe.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/etrago/tools/shapes_europe/shapes_europe.shp b/etrago/tools/shapes_europe/shapes_europe.shp new file mode 100644 index 0000000000000000000000000000000000000000..443b060ef857ee96c30f96fafdf78c54752391b2 GIT binary patch literal 34664 zcmaI83piBY7e72vk#1B_P1Jsh}$X`@n#FCd2~qB+Sw8^+<%+>w6TEkuRMd7o>+p5 z;C9KF7ITniX!QwHSVBR_TcGYShbGU?i}f@ra8wOF6FyMj@YCbVxb4|q+PvKMx4WM7 z4ZkfxKAik+V_? zweQ>f0>^#bD>iM-7YgLq!eY-J3+Uf8xah@Pa|mXpim8=ZfUU-$gd3Pczuw2^O%w}| zdU!oW#?2f`US{{G{xAm@df#V$OLKtvRhAFC&7t6H`2Ob}<`DDfcVVQOIV5L0*QuSu z{#-Y*1i~r67EYplEHH4BC#%50CoM+#b}_-xey^z7LvYj*BAP|=FMTxwPNvtn3JEI2OL~7<*NX2?lxR8lP$4zPlkO}) z0caF@?V3%6{sqxCt^7!z%vOz|dMec1U6>+oZ3a2n#WttLs320j&E0*58A!RN`D%Q} zcF?i6?uDi>oIv(krD_GKq$3nLhAHr$?^5U%w}Sq%_gW|OO`v^yY}#8ZD+mbeShu0T z1mfc@b_jY~fuQzeZ)>axP;U;E9!s+V`NbWT)#4^llSuY@m|+FMulQY+7MXxfT9!df zjTP`GGW2BCOu*$`+?~L8RuG~5V24XLK*1BeyFF`Yz?MBIaNZ3dA|PbWffY26*U@B^ zYXDFWj(r=I#rv%}2LqM>lyKLRj|MAN3pHrf8iQMt#UtMNG$3Ev?x2ZnvO{hMw;d1^ zm}PXx7?ymUI5z2l_s^0trEQI&Rms0FB7p|MDvum}qm993?Io8jCuxvVcVf>^Ie_@2 z6vbc3G+?B9(raA+_=nxyCa=*T?C_!NkLmzfKHB2qjWm$DE>x&-&luRwRSz!q(IEF| zQgvFLG5kC<_Kh<|gYLsg)j?jy(8RMPNOTDuc8J=QeSTmB6n|~;et$Z|^UgG?8#jWp z90mE{Lv(Pqq{f!KF@l}GX}$-l=}>ShE-AFn5Xz*Tr04h1;YWVIqvQrdcyqAq;G-9G zAb&aP{XowU8j6Z-lD^X+nWNrfplkqClg@cpgspLWGF785^&x4K_BmBgYpBSVsgiu8 z4`G5i9cCA-LH=}DWVMw(ypkVvzF%ey-3EOn5qI>#G|yzzz0VpT&}Q_=CVl8{DJ(8` zw}GarCV@NB2H?@vwsr3n8^{P%xV~mmA4r^&gY9KD&_7p0S`ph>@<;ePunqTFr=(XH zLWX^q>}g(GkU8ge`IC?Vtb2Hp5el}zE?E)BZ4U>(cjmT@uhS*xY8e54k;!OVk1Z7N zWrnq`GzOWn$nF|tJLrCLDt*O%V_0{Y>?OF>4q|ArLn?EOz~X8{YGt(@kT&skwuTsi zy-in@@O%bH3EP!zNHm1)vw!j5FXSoL{ z;4*`J-sCj{V284_WHJRf0t&{tg$(Fkb@k3{9t!x}Ze2F#7y|-GTldaXHG_xF`PSpn zI6spGwAAkaWuHw$(+e07Kj&5H+0(echQu~R<}e`j?Mg3NfC&`5DPM4IC(d7hM{;|x z3GkZ)4t#WDfFMq@Il=^j&sEHc6J>z>SJ{Cy36vL?j_b|fV?cZBPnpcUrVw+YOz-ia z9n|d2U!-*06ks5#XOl1k3UYWp3!0lkQ1!)uK{Afl=kTuhQ>KuNYHp1czW*UmaqNj1 z1jU`W;2_O_9HGniA81qlJ}>fPd-u7wW-$0i{QZ*+4Ct@hzu_b5nQv{_(Rl_m-8Mfn zKNj^u!9(7>ezmh;JUV)2EC`8%-+poLUNaO`ItK$imI@K*-Ri=|0>HZ zp~I5>$dKYV{-v?vCvtG#-xP{(lVAcArVnNN+598tb(j!?+cIX{24av5&xEjlWV5jZ zTTt56Vy0ohgbc16#(mwtYsqy>PbLKT;m^YMpTFUF|MZqc`#5$WA|MpZkNkgPmUVZl z4$=wX2%jAjc60eeiU~^RmX`I;V#2k`cGF}!6ULDp{Z=!f7pHSTfC*u@@2VPF;s1kc zL$djCT&-K~H90Y1|5dXs2ks%?oIT_qvYrX`>H+;1nvjkf-|T`T@%{OoOMS01;6%DY zm`6Sn%C>9UZNG-!&zj15`2hE8#53n)87Al)T-xz;k_qug;}wosGr^@m=iG!Q3*3)Z zewW|PgqrX2?ng~o&}+WIByAN7QV&DfbyXJ1xu(@$)mR`>mk=(zfCbj;)@-#LW5Sej zXsOam#D56Gmaf46i&&o2JXLLGfOyB#ANEx& zDC=`SlsAlYau9LjKhJ`A+_npZkHyu&l^+8QHWUVqdb*vr?=!Vfj>YdD8hmT8o{5ooPWiHeuR6xcUf@a%B_?K zd@LC3dC5?{iu8Gf14eqoxrrCzbu9R1wyfoj77H9COEbzpu|Vnq58Gfd3yQ4AFYjq) zAzr=GwDSe>OJHoy z|9w8$0fM=F9**PUen-I(tdX5hgd!hwD<@|ZIYJR`r|*$0@M%rVJQw2#B*PN@P3bHM zUh+gazs?b2jy0VMear%e$(_?0OPnC0R7p;&7S|oO)1_o5P~tLPKMOKC>7ti(oq_*> zxZ$1=7O>9@(|_4IL(MWd`&qp9(96ZQKb(QgeV*SQ_J@6}^H+2MkvW@nPya+ZaqWS7 zE}&70ibmWX$lP@xyFxdgRB?isJy3L?T{ks#g{d3YG!(S$A*feraAUM9l;HCFv+N;> zX_X$cbRDptUM{&BWDoUnxbgR|14as~>9eyvB!6O-tWaJD1#Ab_YN|b)yR-7#((-js zAIB^0YGerMR zZAW)7__0DocY!?=9C&DWD&8Gt7Pj3p9>e(@ex`Rd!X0#?`eT2#Abo=Bgu7JTfwJ$w z?>Uu7&$lRu65Jr@0UA)q$LG%A&(#fv@#}HO_qdBIzvsBYL+*Z#MSdWOG-mL*gLp8% zW8gLxa13wBf{8n{uLziRU=Ir-R`0vi>*)>|(nq$3II(2JMadSOLHMnS``(m3b7ayz#Ywox#@qK@R^tO7BfAobB3rG|9 zZK9hzK(LQ;Phcy4AGbHtWdr1J<*GM6k7i?3`39&**g*DS!K=;7(mpL>L(7a<-CZb; zlDc+0OMS zM7gWVe@#4|4b~gC4##~*`Q+s_8gh^QkA7-L`HE_Ia)b>c%BUCyP=8QH`kfhgFtsMES+F!}j_BnQMmzqJG-{Ja$<*J|CMX ztm%PxkB_(U{!bq;*!-uC=8NNd-#-$m<_iy_By{|hm|&24;O)wFzL3S$&w%gmx~yad zzEH#e_E|Od-#<4cH`dk{>Q$KcH4h;Dx%jEb7eMvXBSsjGKX42bfB3>R(Y3E-BbcC} zjz4?9fB6{c&;6lqB);mU_BF%*)0XX#O1fo)cuscL@<-8rz+r0#xnVo_N3Un5lOH4x z%%K~|Fkqa!&z1fD!BcXGC&E%hX43qCQW!Jm)l9tKY~v-k-VXw5j~s>!J7`KWf8Mdl z4+@YCtE227i>sfv`a$r`i?g3o?O-Z*q}j$F+io{22IcJFl_5Gv6#anQyYGC1sU3*# z$-SW6>m8G1A+Ico%wG2uO@E*g!Q*~p?$jb%yZwz-XJ2=EqHa@3JOl;e>Xpa{LiJw zUaNoP=wWZj;L@`L?RiueWzl%Q0~h854Xzaq9qQif4NbnbrymvI_g(LOHjVOz@$r}H zbT4bD|596Jnu_fpr>N`Ktzq6FbU0xD>_|VWn2$Ig5AV}CPrQN3?rW0avjKjtJuuS; zlDT$6jt!J7-@^HzkMlK44EliUm$TsR@-5qapqtdiGv~N1T;uAAqu35YLRi=VESdF_ z5`fQh@sz$DJmlhcM;{PGbzs50{@7-cVrJBrxwSt{+!Vdm_EK&cx$rkM?(5`?=g3hN&ulq(f{# zcANUEn0_xH^(@!;=4}JXyc?xem z<^_x(qwDieqWxQrgk0K6^#x$l{KLc!wCYqGj& zfZF+Bg{vp%oLM7sQi={q-O-92yHTEUai<6!f-W3+JTDL5Uw58wMp!xrXxh z;uqdz^ruj`<4W;_RFrc0=h2^YutIKAvL^)WK}9^v3X-_;elN;*Uj!<;RG4WiPvI~< zLF(?*!Ee!Mw=AZ-=0kbkgs>`bwIxiw5SL07^8`{9I>3%wKvOieB5Ifo)HetKf1ATR zE`M~gfgN!=alFtRl2A>n+++g>)p?h{IV{;UqCiSV{lt~ee&#S0yL(Sp1 z;#q2@59(W0yAN}An8P`TA8q=mKmC5bwXj%V0aNCtZco{45d4G&X`}@tB|bJW-_3@0 z$ChTXT=XAK_?;EI#0L4c1BXJ8KA^pAFr$PG^`3d*KNeU*>e%cJsa0$kKd?Db?W`p* zxPrBb4asY*uL#sx!mETeiEZ6%sG1PCq-9724YE%3w>&nGvsp7EmrG*oe1}LWwN~EK_p(^x`9q;vk_FJys@0QZw z{IOk*rAIwL=P{|?^bS6s=XFR8JRp-ib3i$R1|=?6H#yGrfS47d&e3e-|LjNhp(-B0 zSu9?(*pvo>yR`C*)_Oqdo6c|klgPh}H)`4Vd_i7*`-WyK5Ya>h{A@j>E@Mlk)2zV4 zY-(kA^LqFxQ#Wa~$OL~BWcKvv~dL3|n9KKy2ZE7#0pxRll_$T zyQ1G*^d2SC3OEHcStCU(V&_?4dnP)*jIChr zrz87jEp!H@sIr6kepX=oS+Vq5z7w2J4s48AV+FGisvJ>w0_o#?v-QfT@NjwM?IpvG zaJ$s|q`(y_{7m@6nbYP70&}9H_MgT5ldP+r8s3E{50`KFd|A{HN(z%kI#(n8$vFQ>2grFqs&5X#{h@9tv#;F& z1XtBfzKpj5pMvq(iMt(u;Ttk%%pcpo7H{>GbpZM5be`gyR&e5I=vfOM2Vmb(kT2L` z1sO&z>ZYOg5WuPKs=9^xeV5mvbJF%OY|uF`XDJ<~X2;j^>DohgZ+}d!5giO}BhXJ} zK}kOZqkoOL(*^w!!SSv}T4Xu| zP&ZNzK0zG1I67*f5FH)a;|JJ?o0IJmTJD~t1ABFEyF1$T-PaPYpPyXnADjQx`zi2f6(=~E(R;EMh9f*C0diZ~Mo~Txg zC|lI8{V^+E(16qTV%3=rTWCMScOWBcBENT?Eg|RGLTZo97fa+1auq|* z?}rWUFV@V4O(?G}J+aklwt-=d&Uw$wkw1SeFyE_!dfJWGZ56IpP6TwE@J9bvSNGhM zI4kH*Jzwy!6X{gHOZ9{u#wR+qxoc98E?zCoZu@Y(sW$10F-{RtMXI0bw1Q#p=6Go@ z?5Ck^>$P?(ka{bX^}&@2-7|7J!fdd=5!K=`D=OqDWlD|@QGt>6YJ+37B{YdAA5quC z{trH})nH@1EwLf>SU&P!s080>j3enhNaqPp!F~o#>?zX6cwUM3$xt;aNU7DlLp6=L2XfO~`SryUY}pIxXBVfRbrdIHAvxON*I<9}~5<(n)mff#RG z{BoPhqY!6!&Yi!B11#a<^(p7Su~+ok|4EK;ftX3X;HPUH;3C)GHP;m?Un6iFv4_Gq zDZW)xE?~TM4a>8{9##rhFO3a$f%$efPWTqs!__pYk4ELrp!E?QqLucL)%!wswu3XA zAIh$#ciMv~*FPiU43XUN&v5{^MHyF4J#hk2-MNu3g&lx6KAOeT%JappfZnuhQnNkC zqj~c3|DCJ zRlPa!)E?4fouohMxF;LYcte}!viF1z6geEewm&9Vna zG>9r?yuhQ>Y93E73(~l_dyW?fbM22J7F^lW<&cGVi{_E;4Yyf9 z?gd=<^5hK*i2XlEevyA3?Rn8h=;(H4LFG^5gA->w;RM&OjQ$QDbVE!%!11EH>0LMr zdbn|%Ax~J@Ik6|ugY{3GeAE-xE*nWtwPC@7nOj~rRC)r}yjg|q(#tQBbr5eBzG@Dn zI^cc6_oz}lk{g38K=kcw3f5agSyMDw$RH%02p{Z$>{)veWCRq|ALI(txCSt{mNR%nHm`gfj)D_hW(< z%I^<1<3fAXVa3W(=dLYuSZI+YbeEzDsmsNSJX7hAlfT*IIYSE?3yW>O@1=taKf7V- zffms24(Vl~{TYzl@0fQ*3&dTkOit6#9wdA}>yuR0!Ur^HEX^LBLjTmf#b(v}M(N;I zB5+?mhXw5sxk^1vba*UK)v1a6x4-pl$=V@n$W90Y(g*aPRo>!#c+wVx=2dmB5VVH{ zCL1Yzk_@0*kasUff8@-Og3B?784wj-9r0Y<9+sGIq|8TsGpf?}Yo&obr0E~eIHbjd zyw8T@E*X1hC9R4%GM5QL7UZc>^be|KseP-JXFzeM(gy7z^!wg@wV|NS77_!8913wi zagrqXgbZyU^!t(%k5gFCCel4+yT=+LU)7#uaQ%6OOB=2g)8SGcF61(7x4&3*w~-Dn zj`xe6d58X?o`osL9$Ld;-=QVq*O{PS_i)Mg2y6KDdB^KL=-&<~X6O~Q(qQ|QQ(lb) zOgJ1oZ>+3{1|J%~j_5Wp!8-BSTY&~Euqnw7_3B~*@1IRFPNi0md%dY~l*9r-RUSzl zLmFgfO(@<#J-y*{K-^0m8swWdsGY?4f}q1efihfYlREYOE|xYe_#anyU{m+ zOXZUmum#6E>%J$H`cd=c{W0$K+h6!J#}j-U(tJC6(EibRp*d3K2{~K(dL}kg;R?U; zPM3!$AI^2<-hYbvP=8xc_ zfu7!iF1kgpeK|$4V58i?fXO|9WntaEoYI$ve)(QzfG@fy-qiVWq`C2klMHZwALeS^ z?91ukfB5NV6$6C1{(?wf&XydJ4_iwyelzorTdjdF2es4k#61kKKB9klpSv$-qll5r z6)*JPVHoO1GQQ7^fX3)o!`lkMlKkZ{7F~22i+xhRuE)*=X|cD^~`fx036xG-QT8v^RKwmejkb7d;er^ zK@SstS{2(pX8Uo{cHe3^jBQU0gY8lCzelKH% z&i1Ew0CIk})cQ|ZK(f2pkAocmB*w-uQE`j|uhN|xuVDf)&6WzeB+T#e{8V1J-UOPw zsY7YV@2Psu8g^SuAV81aVE+!|%E~Jn&+jz>j`P09o4c?-dahC~=FjAGR>-Imk4rF+s#&YM6+ z5viUTf$#J4NRAC-{>%%RFBBCE$k<`5P?HOweyx*-}j%fwM-qifCO3dR@pX{YR!M3=+8tF6kN1zANAG6|ky12P_ zF@X(?o*#?RR*LKv5kOyByFi2l-5Ab%e|crWntx(!F8^CF5@`|srQpTDYh?4!Tas2P zu+bTV?w{=87N$BR&Rq++=o;gj;Q%kWKILCzP*Sv^neaNm3pot7gBpDM)e=2zqP2jRB`My2q_xhF0;8TY}6F4TRyRS`Jc*xE;XAku@FQ$ox+A?Bn+NL8Jh;xz=bbt0+@LNLa> zv1`wcd-~9^JY;3;A+-H`Ba0`M^9=Cj8XgwBT~Zo@H+|F~;j$EK_8p3Ch-4PQ}is zGZkG^%r9%e;W66>^%fYjZ}j7fn5_XT>m2nJ(Y9opnNSD1)xl(Qb;Lr9amx?HD{T3# z3d=-7Rx&WhqWjPD?7UJ{*s!+j?KKh;+P|IAd-0GAH)vT-z1RlJp`$HgWbmDg-{STh zWBqmuZtvAr0Xy+LMnDn+hQ;jG?-N%9I|$76P-DP`YWHWqS{31@X3C?z;>g?yL*!;z zMR>Ex`-Utp1BBFCsGsE(pzTNe7Xyrekc0+PLSL zdv6Od<9<1-%oO0Yf7OGO%eK%RDss5?j68f>xFtwrp)E*ljC6W1BnMW7UAZoIY+z^~ z$&`129GKq29K6jo&={(4{>W`v7!jI#Nd|MI*i4bbC#$63w5d_+a(Qegl0`qMivQh5 zY@3h=O}R@UD~6g+rK1nqCAK+JUl?xBJYCb9?R z3>3vF!y6lu!*541XJ|1;I(0tU}49Bzm_szO99rh3tAD3jjSOcuK4z*bH+GFn0 zW|Lce>aa0f!F1p|+LSx4_dA8F!2=blCI1hMK|kg-((+J+xX`300ZSa9r^%a7{VAO&9Ku?|3bQHUx3J3Z7R! zZ@8-im?^RAa=1Onq$Hh-i_!va=ya#MJ>(oaRo8h}13b7nQJc^g#LbBb)PzqMDr$?g z2d4|@{A|>K)t50_AlV)?6lT5lc&7zo8*|Gf((Pd{y3}V;wZWbnz%YzfD&un$iE}V#8JS?WHSLVw`jV@T6D)K1ibB#r-YD%M347=?g__Emj;-c98ev z1wrWk^py5dlEz^VKOL(4JO}w_WKhSF#))ZtI&^W)Ot`rz=7vQC-Vc7|UHpdxvu!8M zl8b47zjZe zexC>8#vj#W)p5>U1`W461mU7;c)OV)ozt{cUefZ^VgR`d8ks+7oFT{hqeZiqLC#*4 z9SV&&J`0!Pxu=%G_2Er3J_ge`!3WMw+_)qR^Pcas_8zd}B=c65xR@;hB7I0dC^dEE zB0vi6>sfyfG3^7rk=YkTVUL9JqmDCFV3U4jwWvwKwrfMB7P08tQK`E%xM2mT6jys> ztig6=_0qA|62Q(K(%agIImz#3t~5OqhpD-DKOVb_J|H`Gf$>*S2;Avf?ut3aFsyz@ zVX+tt$z@)6o`pH)uO_UlyoD|-Vp!(LTt$^7-D1sXV5mSt~FV4I#0q4bL z4m7r#L-!8X@UIf05NjZp7@cemq_8ee2fam*DIZa_`j$DwY&2Sw)xZyd;VFt43FZK9 z{#)#O_#o1#>OrCbK3`ycBvJ2|@v*=%zHf@=Fhi|XZcFHU;{_6#7hd|}eYH0+M=!oG zK0iuHR-s`#DJa=>?s&!UHSd$__GAAur&vRqepl>19?4#D8{09BuC=SiDx|E_`g(aR zfOK*s^2zei3Mc25=KdK-FR`!ts845b7OW4MV;GP0e3~dxSH#Ep?UNTys>S;bdz9Dx z5aJxjPa4txiS&%!F`DeLh$A;JaqPG=73a6=&hzyG9Nt?BIf0?rzSte8_j;m&hB2Gn zSPKvnPup^O=y!#DT#Dj`9xD8yeSTV+J5;g#NMK|5HN5|3W`6Rf@5aevO`4X1RuCO^ zSkqPar|~+sG~YE`8>ux(xn6AM-#r{-o?N$$G7C~I1||OZ;{7fW`%P2)PRcPL7?~COG~9; zH!CFJg%mzd=pRMYOcH5^3s=5P>tYMdnHz1c)8WkP+9tCP+JCVMmVS`r@#6lbpPkm* zM7>Vb`$Swo#0^ATLBt(ITtdVxL|j9}Jw#kY#7#t8MZ{f1Tt>ugL|jL{w%KIwPff53 zBl+#ZT+Nun*ZV~eX@l;HyyOp)h@+gl_PkEkhSwpa_bz7`e`!5uZd!Cm4CdZ;XN2{t zXu%)bt}5mhv~4dp3FK;Nf;2CC(Nz`3x!$T7WUS;S;V6Jidi3vZS$LjE|JhFS% zQ^aL{dJFhFR3Thr)Om0N=9mgg%AG|VKb$Pd%)^)fyKRTa^A=U~m6<0;GHpS}x>zQs zRt=iZrYP2SlUUi zTZq0sRrQcAvGWF4)0E&)aoY-9&W1(4G&BIkw5&3tT73UW_I1NBeHcF4klOUb3X;EO zgzb0IgK>-@#ecMd)sHBB1NOQge>sw!{0+x5M~ey1v^zEP=_%p^M=jyVzuGt%$$zdyfm2Ro#*r3SvVTeph-55o?5RB z!*`NKw!2^q-i)j*_*5He_ee5#W6lVJzv|SygW7QAZqkTS84X_Y{5HV(bPzQGGbCn|Z;k_rEnP$kMa95S6s8@^Agqbo~%_AFRiV`y;M9v3BS`wMB&5BVuh5v37}A+eEB=BGyI` zYo~~{Rm9pWVr>?&c8gfsMXddrrp`$=<-*SX(ET zDcK&2zTD2IpG-YXF$XH0XRE6v1UH}9vt_^pNZxs4*I5_?jladK5{b1WL9wFaGKh-^ zzA>WjjObe<`re4XIijyh$K5$h`wG_DD0a?c3SdmNvSK2-+!&-@SIFkAv4n1B>`?bL zV~9AKW#G3C$LEnkx?W)f?TLJ|FVS%PgN|cY*+vj^ku_6prX|)=NXmtz8UE$P3lef{ z2RW1r=sSzOX907@{P<>HHvmVGy2y`LEP%W;L7`6H0LCXMf-&Xj%PT*XuD9C&wk4Z{ z`qx`PFeP^ATaE#=&WMg;jw7yae=Ej6WB|e4?rzf3mXKU1Q}yYU0jOG5J(#Cs2_wTw zY1ocrkhfcH_g58X~_;T#o9E#yzqg=7;BLF#rr5uAM*Mqj@9X7yLk^Qty2%4?rV|pHw|BOA89tcFxns@lVU5V>rHfT8Miw z*4AgK1qr83La%JZ@s_<6dv`<&90KyfCk|mvFZNeetpzRmg#~-}QK3UgQts}4EeIC8 z`*HStDh!LXWUt+<4H4#p5>c3IQh?Z0cTgMpJNsk2Ft;W~T~aQePX`KgBC2TX{ww#1 zdV#1nhoI~mB=vRZy<)r#re7=2VOSb<@HIUjn7Ph~F3NG>~q*Fd> zz>hg^iD>V|Jo4i+y`l;hA$>g-vk{M6c`G)4SQR2Tr22I#n1eU@xhI}oh5SX>pkPM96VjDYGv^Qh33fYq? zARSf4x6KE0X!7-L+~QXO+wbbp*@rP_thOTUg_bhLC|X!vZ*ZR|CDh&XP=>DcX}Fy=Z>763AW^SvF}$gK1t#txe}i!<-{VLUC1JkrLQ+USIt10@f7wP!3ocDnSGz z!QnmT*fI|nR|%h0h64_AiBYpLhMuI}GH*Q@YA{B4!vtgQmneN97gS-I*EnA*PYs_} z12yf;3mcp}~O`On*iR_pvXW>1Xi6Jze}Q=h(WH`0cJ{bdLBF-A$`U)%@$ zxDSAfhd?nlx%|5flr+-o%(YSGO=yKY`ALSa2gqKeIO_lQ!76-?`SVYt zRyQfS8TG^d3BM^GG8|fxd?W_X1W1lG86aDzz}}nH9t;Odi0;j{dv2!ucWm7@eXbwR zDT2$@q!F?S>eK3`yh@Hd=7L4CjlC@4*fx>Fp0@JP$|tVz=m_ewQ$qGW4stNtpPC;R zfpa@4WdBM;4(4XD_A6n|)UaQ1Rqi`kxLToicf&T6@4dWlHojg7%>s7=Uv9_u|E0}| zw8(Dx!>I2KQ!*D)R)Ud~zuF$uUj-YJ{Ef&fL1t^LsAd)FkJq&!wRJ0@eN$hLSsnJL zkT>|cK^C&nuXg7O_V-3fzjo;==wGh!lpjV_N{S^*e`0vkK;SwhH%61KtoHLya_$m!fO{NA=M z$=rtu&~$aElxGzcDk37C&g@|bZ!P}nPEpi_FYW%}Ln(ZY`y=X2qFyEH-HhL>*oT&D!IfFjQHzj{f^-wA zcZMdIV2+zvH0Dru8Rngzr3qhqCXQ{FN4_W#OYqRqfLA(p9~gp&b4FLOPo=7ZZ@8<` zq%i9JEp3$G7Bx7rDOS|!n+4oysPo;5?dYFhK09KYBS?+qgsH*wT!K;FS!b$(EcX9= z0(0EwP-6#?E;(j$i6w}$YBWr!r<2L>M0)1HF3j~2bn*`D@IXI;qxQK1%#oO;&Gfz@ z?knQHBkoHg-Cb;kj?Rlx1v^0}={Z9%rQ(*9~o-r~M(G0d|?`BQ|rrV4RO zeCH04Pt|JBzMt&1Lx767^Q+P&C3WyR)0Jzo0Ofr&UD6J7ibSj1wo1uh`>7w_)I)WM z{dB5kWH}Y2I}P*H3^ky+Qt$3(1@!l=E_2u4sR2|wcEnsN;-q?|H0cHnm|km6-^;hO zH=3|CtGMAC=4KJs8(BaAuVF6VOk=!hOgxQIr!gT{kBi~O{Y^hRjR%Q%k%%XWc$0`n ziFlQWXNh>1h=+-InTV&S=Q54AiFlld*NJ$Zi1&&10MT9`+7m>3BcQNiVraer$V>RE z^`m_Orm;g~@&-^@BeeeLT9n`7Ri~<@4B(qqVZnWWly|aeddm;%gVEW@?w7Zak4X_C zZ}jy+PtYmz`2fmKQFg2*VG;u1p1Bjzda%TU4t7 zJPne3HW7yL2)BmKT}KR{+%H!2$V+pKbH@(3jO#-Nj`jBkto?7G^vyTYhsc4Z;sZ-9 zVE8ky(RD#R5Y({qe>jf*Ysy&dy<@sCJvaHPw_?@HbzrxU@}rks=+91*sS5?&NmOY-0NS0iyKsI4 z`AL+oMEOgU&qVqCAG?ZRcMxgzA(JmzNA(2msd`#r?|Lg<8J|XTSBEKRF z&%>*L%lD*}u|w1anty#|)4nj#XX!jQ)>{7$pK;@;+#k^|HvR0h-;C&2Bl_KlemNp; zB;raU?j+`d5_3g~xunEg)9JacN)NRA$!iUaIlp+L)wRI3P-K~*qBYc%Q~F+XYlBl> zS1#X5tfhQg+vNC42c~JkzdTLPkfaMgSB*L^#ItK+cfcXj!h$_i<&q*i(`P}Np8f$XSoUk;*p_Z= zvx{X8FttGd;~4cZ)^NkSSf+o44wMF@^;zx1_s`2zEn}d6nPvCk2%h;fyolW(vql%D zY1f47z)aHx_mGz6$U$qknWVSiYPcTgloZ?i#5044^h6SKk6HU4|GVa?w@f){|2365k9wMGiL_E8QI4Q9~%?fGpqAj*IFg^G2712>YPGjBRRWK_v4Y)~I-P?a_a&3)8e14j(%D^Q#{4Kl2tAylVqG+Ie*D*-HEz)_(3;N<{h~ zjTfSR?dS48XOvRo^=;W-TV>j2P91f3YmNHHAEJlPaeqX6muL?Y?Pa1p{U3XqV2@9K zd)i*_eh{auDXR>bcNB80WAIEcy|hkpx)OvhbIRm7if#UxZ)(MrfRmbKa5)_9e~*+* z$^11CtAg?R_2}pNrldb>NCCp$#A%OVjTp%V^RafxgU*1v+cFt^Kdr4Vr9~c08p7n} zO`+X$TJJ`cfC8w@7cUa3M!U(f&s9Kh4J2btjV!Ly2~3@K}6Z%3Ns>T$X&qpZZdGz0SW4=Mm&$qt=Gem%&mf+BhHCWTU z*d6OyKI1d4=Wj~QAvaO(SthiF*yaS}sVv8Q5_U}4K|=}j*DQ$EH1iM#{t*;U|u@Y08h9+p%qGbfmak5=!nX$k)8V=k)^38Aeht zEG%Ahq>6_53%qY8&PYQ{RIF$&4;}M4eq{~HN&~}DE-_1u4jCeOgPZ3|Lp%GIihd-v z=~;yV$ueMrHEynf7_T}QCO)%$B~0&~j7G=Pf^Sy>m_$^0Skv)r#4gG0?^i*<4r=}( z%o&Gk?$2htT?H8(La)VVV2zws-r$*m)gb@8ZL8dJ{Ql>oGehPm0DBMm84R%h(XS0L zbVUe|9(BGt2W!g+{wLg`++(K3x%-;W9qT_lwV-uC;1ch7%3rKHjTO1LSsX9!kBB3Q zIFpD&i8z&rV~IGIh=YkZnTVtN!-{2i1PtIrdDxW$m(4+H*U-`Z*Yx3HawL1)${cdN zvxF4>=))FXC+QIqo>lp&wy8o!A0phT%HoU6A$0^1xP%^v-%RIeAE1Dsd`Op~m>#6Q zaCcjN6=`8QRvW3N`3akxM`1N#D z3wXlGUS@d|U^qt>XTH^feqfLH|DnJ%txe=2%zn!wPA{SK#Uk(mSY^>KW?hItRS zYQgMvd1IECHzXh3MrldYg2BUGxjdnmw}ky|n$iLn-2?}|v*wVor;Q>IqXq53uH}}^ zXa@-V;$6H^3s`scbopmk{0H~r5(=R_uj8&enNK^!UrqxkClur>x0?Wa`_R#AY5#{7 zm~>6j!i)PuBa0*zN6Iv$>A{z?-ok!Y@VvGSCRD>UdN3tkSa2x@+w_LbshDFp-JhkH zc8CJz_-3iH$GZ=iz=sG@=8JvW@Nj8FRqG{;(IHk-y`>G!=e$oEzBB>J<=P>ujCCNa z#@$Wqh6zaR_73!)jaW^k%Ea%s38V_M8$M#pSBjPw&dA662h!W_mg~aT-CYU-r?E{K zA8{>+Yeig3;#w1VfygV<^m4gU?J@co&&RvhB(RCD2Su1QmBGX*m8Cj4f8)&VIWNv7^jY)gc6{kp9UB7@l-qt2LfbnR67 zwg4SSo}>Ke&qCy-Re5xu_uA0@O8t+_q!|ngup6E_qs=EP{Bs7jo9w&xcs8L;w>PWo zvjOsM5?#_ULkl8atN&@0q5#PzODLfOc`b)z?bBigF)c^E&$?oN6?7Ua)eOk_O#%`V zm=nsIe8gfmwpAtNZeWaF{!!c=OA|bQ^sOIXz-%2TIWbf!kLQgx@g^u33Fv@GGHZX^ zb5n@9s@@VTp$&}3GG8jcn*w>g$lz#zHUyVkPuW#u3LKxIqdpj$l5d(gCXkKip?+Or z7r9y+n*3ApmS~xRU~E|AHq1#SZz8|jrD2M(O1{nmd71!6ux>X9`)jUkilb{ncXm3@ z(Pq5Ae&}fF3Qdr5pyrpXMtam7_3kOfgFNFSyN`I80V%m+;-0n!1V;omCgtIL{^j@X zcbf=d@j5m>5|?gV2Af3O2e)M72&)|X?n(o)S;=SKSur) z(y@uxNNIyQl*kM3vLB{^zWHM{ZrepF`vkW=J@-_U(F>NF16d+=Xt)fY|99?Ecf=C3 z8nFLSiXbnb%zUosyL^!b`V{Q-T<9nxS;aD0ROEwyWo%4{*!=D|j9qchc@Z;*L&u)_ zik{Yh=letj_I$>5>&OV>w#hrl@1n3>pdXlZJX`~G?zC%O#^D2^1|mN z{+ADM3DCTr5zJk;jCO(L8yJcp)$Z;VY>4uhOx7OrR{!g_<*u6|Ufdtir%Uwt5`Dr% zpE1#=3~ma)G8UP9^%@{{1%RWreK8c?&R>wG8&3p$?`F-xS2RV6Fg3JLJM) zH9QBb>|n?t%oXrXZ%cor3dzso?&QT|POVa4RuV}Snrzd22h-8#BR*C;g0Y&C9b?~w z&!W#qps!>blMKoC^mGr#;PdB)$ZDU~{(T;T#{zj{)`AYmB|br)7^!a+dmYB$O4dY} zeN{pq(3n<8M;IBXb4Q&mXW{$b&*&w5Bt!RenJ+tD;JQCG%#*TKh19i$1=4svCI@Ra z9$&-pm9`CK??ay$_uRLmYC!(q`BmmHsuOCf5vm3UCu+U8v?pzDqj1~PYe9DN4m=#I z3ObmhTOWkyKd=%ag-lk#y4|t7+c`>GVuWjof2j71&!N+n{fe4?z9w|v2 zUr}4%C5{T@95xBPDUZ1m9+HpM+LR%uqay2o2c9>5p}OTf#zs=-k2;qnApIR$kUDs{+PbI7NAONp}xMX0#0i>=jFY|bE;({?lwEGg)mdO#77@3Fji}~{&d1x z_-vfuuxrJCV-Co&Oa7m_u05X0?CYP(AdGRV@_6Cud-{4fKMk$UaC z=;3e0SapnLACb*4)*WNvF;*U9=`q$G+gjKb!?qfhH}u&!*!`IKiN#T~xM|kzV(l!Z z-v9tHv|$^JJ(so7unmVX+3d4e%rL0!I~p1I>xGFEV~TW9b@6mLw^1$Nr{x$ zH>SFr1Yd*aoy#WB_S>2f!L$>Hj~lA%opFXXZPZ;a;HwdSLiujHqhQ;Pi|-3*(JYrcb0kp1EsY8UMT9 z;ttCx=jq(T_tlMP(ZZONbFf}%KAr3_Hi%0lH(nYS8FPICD5#4-Dwjg2&ml`=ziBej0u8>(zQRvn6uq=JI)TsXOs~&YL${YRal?xFCdiM^P zPNKhR%?W%3*i7N)pr|~lK8@IWcK)tZ7qCgQ8co+5jL0^*_0sp8tA;dmf9iYhZ7zg& zH@eUMHkSs~R+`vtfb*l=MvqG1(ui_zua#g|M68ld){<~(pnklomXRw_^Lo9}D$9r( zomYR>Y6*79aNmVql4!180d~O3?6Ss}Ms(_L4l}JwT?tRy|JzI2M)c^iwigA>a9pSJ zWOz51?z>xQvRccH= zqA9ut=cE1ywU`L&zad|A&dVQEcsGnFZ!JI6_7iZhdpL^E{1i!HWcltJ&;QjU!LS}- zIbk_sIpco7{e=4w_cPW5tS4BHu%2N(#CnSL80$G62Y8&|afIc}1Gy`FLI5JVVsxnlTx>pI|aQ|I<_0e1!qB!@3OXMl^Sc7 z&RK5??UNemi<;Uh%}V16W`I4-shHh+aLhlI9&u}Z&s_j}Jt=cZr^P6`_*U?8uRu7i zob+PXB4v8TrJ+7>F<`EL(3(>9y*k}-)hMbOjz^nGs&)D_X|#LHSdlr*p%W$^oz&8yK`;lOj+dQBVA$xu zo;b9Q*{HPNt=pK|A89&K`~Y&c^&RV|;c8RffMD>k=-*fb6S!kG>9n}Oqc^qb@~WB@ zDxF><=MH4>TXVC3n^Bf5cXP5X&Gs|f>&*r3!r|}iQVqBx_a?*7+5^v$1MWuhz34up z03%v{$((mG$_wg^{59`Kp)vJ^d}q=w$S3wm{^NfN4QWDZPq%7-H<704u6{Ld(#X5f z-=3CBztyKcXZ?4%fv=Z6?))&W;G_c7+qk~6=#W&G>OGTaZUEmcet-BRfUAsdVC2B^ zAXl$iTCv<0WSXxO|9-RW2)=C$oU;UWW^;jkKI}5nJxk(|oW#1EKYYM$S);JE#L}GfWNm3atqgWjhWVkI zFD-~eWn6*7Eq4;LNnGmo)l}j#pnE1_6^#4V$kqW*E0TD?U(Tf${Ahuy=j@(Z6Z1mQ zhdwvR$7(7}u;7#JYB&3;n&AIjslF)ax;1fe?YDA)`JOiz-SnZBPjbLd*Pjh_F>1%m zdA-Yq6zmYs_K1dhMDMR;M+pJzW!<5lWC?zw;XY{6l=~)c9QcT5JA3MS11D@lG{L0uonUGR7!pM-)R z&St;`F!%jpvcj6EuFJ9r=>E4oTWC$9{?k(Poi6xyvd>nZuC*rq(frm)LhuVNtP%7> z?t}52Egs))fx1Bz>WdVkts$>!lezdB_f63*KFGK0f>6x>VsQqLD_}LOXL30%yPYkF&q>bhi8*fM{Y`0c zX^lDAyi+`TO+Kt|ZYoVYY|kSNn&GxqPvQT&Ry)l()Ql{tmSiPZg1@Kulfoos-Q**rD^%3j7`k z>WkJl8WQ1Fert|C=;O1v71rSfSHiYzs8hw6;v1su zZ$(rTZfos$xqlqMc4o=QG1*^&Fxc9`c$ z%=USO7DVTMw&$ue_)mzTzy9En-W!!Bo9?&}&e-^i{wC(6V_LPdrJ5^=w##jd-(o=y z`l!2|~{iNSNYTLPvOa3-5EwPOSeFOXd$8|-=aQzUhFAJr`W_euTbT+D}#DV_j3pROy zzHAhKJ#KKnE6Mk2GPqG=NOEC)y`B%xD=zeXx6qJ8=*@X}0Q~s)ePGIE!e>vJ`P#7V zMvS_ZA=y#9r8z7N=K3&&t)8pQ$sb|;Rx!_f2orN*{kn`ZSSC)0;)poTn3!s``hcS$ z(nueP`#zdte^*yiLTPAL*rdn#&ewjz!9;nN4QHAdt zmZxoKzm*p7{`hwaeKoCkBl7ONTIlON-i$wS>g-s{vH(Jz_1aQ;x=&43G-4Z!m<>kgU!`tZ7d z{qO&O>jHL7LrNF?ys1-%mT9zl7-mD=t{0h&4~~zgW%=US{T~0vI>FtB2SRur8^|a+#0SC^@e^ zVTZ?j!jXK_=cEMRH{2hbFY-zcc&pLJm;86#sDbOZ+1HAr6=`y?*smyIs4{l_UNK=@JlIJDDC!UGPrIFXXhvN5619tf;oB6w4&XglYj zE#zF_Jc+H}`ECq-95VeNhk)PckHLR77AR29di4+iaAFec$l>HJ6`Jf@UFDz;ekaq{ z{M{BB^g_JB!YT`BcRyR&-m67f{ZFi$8!}CI0u6%W(OPhPeoIfJqdG0xY_PB;7oI1I zw#!?nOg;0QV|N2bIk7#iqHL8i?UMZc;V9Ey+S1eCsYylV;iWymQBGXZ(sNdQ94+dV z+PxZJjtAV6yilVv)-=>-nt?wjSa)@TmL|RMA=@))9q4bNz0bRapl|HnYX2W|zgv zS<+9Q;y}wh$UAJcw(9g|OS(MEDEUe(FmcJhT5p{^(75D;aTJ-BB{ColJ(G=G90 z*|j{$OL)tMj!se~Ef0N3kiGe(!9v@SXBSQ05-a~nK*tCIkA&9yl3S7tu79;XeLIGl zwD4y}gYp}w2AIr`wn+cxxk=V`BBwnM$N zdVA}hDf|)HVR?ZF4PY-~P;CKj*m*98`j4c8mQ^$2mjLR`-f*E_`Z5OKXkTu%|#Tg3GkalJ-d&#}a_JeaBH zc;;HC15?kDr`tbfk+TET*96prJ+$v$s5II>g9P?fngl99yDGt7++@44lNX-asmV@vL@ zRwYM(xB1by=f-ghTjKFvFi4L=dw1ohHDR_SqV`ee!Xi%+4V+VrbXyVyd2xe*ql-Da zGMrw-`Nf=I%o)acLo?*@==5%7tC+37=&M3x0 zW2`jBQe&(&+t(}>8)LOGmK$TeF%}$S#j$>X$}p-UW%P{2u&@{tPOSR#lmmce8pgyh zdd37>nGNGnFkS`YSuoxO<6$sfhJ6|STIvCG`@je(2gz-XtwI;?4eyDku ziyVU=@`JKK(^m+HaORoXZ=o%ftSr%;Bp^i}LV1(z0q-*`E7DcDzXSYm!ca(b9VZ}< zBc~;vhj@%A$?-p3(*=+#Wi6D#13&G%R(l;q0r}{5$Ry-E#AoJaJa0S$_#LLs;Q?8^ z4~X0Z_Mvqqi`il^a4hzd#o03b#I7?j1{Y&=*=t!0FUIX*Tpz~$VO$`_=V3e<`|d2> z4CB!-Ud>SZZvK(;(;(+1)IIBfxY5GD-s%Cjj(oOTdQ9G(P#-8f}#&Tn< zH`YVkFSy_QT%iCitV>JW&;8vG*l|BdtA6%`9eK^vtDFIT?`oG*-_+RsTgP_^w3#}0 zN9~A+slyfs<4Y~`3!i8^qPD+bY(x}{r`ciowjO|Ig>sycaS;Dx3U!#+k&jTO_hvG* znR4x!*$3LDQ@cbe3UqJs2 J{9nQH`yZ$dd&K|% literal 0 HcmV?d00001 diff --git a/etrago/tools/shapes_europe/shapes_europe.shx b/etrago/tools/shapes_europe/shapes_europe.shx new file mode 100644 index 0000000000000000000000000000000000000000..be514f84f944489a29d1f6b42929b6a1704e8cab GIT binary patch literal 412 zcmaKnJxD@P97oT4QA4x^ks)MBT4HJz6n)_3(XNA#YYChHz*Q zC%2*@LL8)_slh269700+$;B=lj{c62=|G{GxfP zRWHVJc{42ehiRCs>2|>VfT@Of2mueA0?gcsJ_P4MOPP&W58aCf=Dx&f2oK(>8R5SC z1Qt%^6^JCnXR&8J`k;IpmTu(V5WAAUK>R@7f@LE=g2bcsFtn zNE@*Nt6lVSSkrE|3G3?N9X7Pz5jQ8~RZ(x@4z`XJFTnPjowK8UCk2^Bt08!{{nb(J_7&% literal 0 HcmV?d00001 diff --git a/etrago/tools/utilities.py b/etrago/tools/utilities.py index b5f73f92..8d3436af 100755 --- a/etrago/tools/utilities.py +++ b/etrago/tools/utilities.py @@ -24,6 +24,7 @@ from collections.abc import Mapping from copy import deepcopy +from pathlib import Path import json import logging import math @@ -287,9 +288,10 @@ def buses_by_country(self, apply_on="grid_model"): con = self.engine germany_sh = gpd.read_postgis(query, con, geom_col="geometry") - path = gpd.datasets.get_path("naturalearth_lowres") - shapes = gpd.read_file(path) - shapes = shapes[shapes.name.isin([*countries])].set_index(keys="name") + # read Europe borders. Original data downloaded from naturalearthdata.com/ + # under Public Domain license + path = Path(".") / "tools" / "shapes_europe" + shapes = gpd.read_file(path).set_index("name") # Use Germany borders from egon-data if not using the SH test case if len(germany_sh.gen.unique()) > 1: From fc5c4a81c91a71b3a24ab43d780ac0e203ff566d Mon Sep 17 00:00:00 2001 From: CarlosEpia Date: Tue, 22 Oct 2024 10:58:54 +0200 Subject: [PATCH 09/13] delete shape_files from repository --- etrago/tools/shapes_europe/shapes_europe.cpg | 1 - etrago/tools/shapes_europe/shapes_europe.dbf | Bin 3225 -> 0 bytes etrago/tools/shapes_europe/shapes_europe.prj | 1 - etrago/tools/shapes_europe/shapes_europe.shp | Bin 34664 -> 0 bytes etrago/tools/shapes_europe/shapes_europe.shx | Bin 412 -> 0 bytes 5 files changed, 2 deletions(-) delete mode 100644 etrago/tools/shapes_europe/shapes_europe.cpg delete mode 100644 etrago/tools/shapes_europe/shapes_europe.dbf delete mode 100644 etrago/tools/shapes_europe/shapes_europe.prj delete mode 100644 etrago/tools/shapes_europe/shapes_europe.shp delete mode 100644 etrago/tools/shapes_europe/shapes_europe.shx diff --git a/etrago/tools/shapes_europe/shapes_europe.cpg b/etrago/tools/shapes_europe/shapes_europe.cpg deleted file mode 100644 index cd89cb97..00000000 --- a/etrago/tools/shapes_europe/shapes_europe.cpg +++ /dev/null @@ -1 +0,0 @@ -ISO-8859-1 \ No newline at end of file diff --git a/etrago/tools/shapes_europe/shapes_europe.dbf b/etrago/tools/shapes_europe/shapes_europe.dbf deleted file mode 100644 index 1a2f3f2f8e26dab864ac6a4d8c014c68a34ec302..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3225 zcmb`J&1%Ci5QGiA6$(A~q+4%&ha_!&$PZ~u9$;fHwy>-%E6Hg?AHFi_sXb)kIJQ^Cpw!-r#?+95l~{h{4FIEM&`R@`LhgW7BnSMGjd^9?lXf`KM{gt7 zW^H{_3&K6C3f#le$-u~jom-Ec@>n5tz_^)RxN3nsGnFuQaP;<)_40DFfASw}Y|WM` ft})xMWIZ7jo2~fBo*R{$#a;nx2{NEy8Ts@B9?0Pd diff --git a/etrago/tools/shapes_europe/shapes_europe.prj b/etrago/tools/shapes_europe/shapes_europe.prj deleted file mode 100644 index f45cbadf..00000000 --- a/etrago/tools/shapes_europe/shapes_europe.prj +++ /dev/null @@ -1 +0,0 @@ -GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/etrago/tools/shapes_europe/shapes_europe.shp b/etrago/tools/shapes_europe/shapes_europe.shp deleted file mode 100644 index 443b060ef857ee96c30f96fafdf78c54752391b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34664 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 J{9nQH`yZ$dd&K|% diff --git a/etrago/tools/shapes_europe/shapes_europe.shx b/etrago/tools/shapes_europe/shapes_europe.shx deleted file mode 100644 index be514f84f944489a29d1f6b42929b6a1704e8cab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 412 zcmaKnJxD@P97oT4QA4x^ks)MBT4HJz6n)_3(XNA#YYChHz*Q zC%2*@LL8)_slh269700+$;B=lj{c62=|G{GxfP zRWHVJc{42ehiRCs>2|>VfT@Of2mueA0?gcsJ_P4MOPP&W58aCf=Dx&f2oK(>8R5SC z1Qt%^6^JCnXR&8J`k;IpmTu(V5WAAUK>R@7f@LE=g2bcsFtn zNE@*Nt6lVSSkrE|3G3?N9X7Pz5jQ8~RZ(x@4z`XJFTnPjowK8UCk2^Bt08!{{nb(J_7&% From b85dcd77b0af16a1d3658c5236330e5a8146ebe2 Mon Sep 17 00:00:00 2001 From: CarlosEpia Date: Tue, 22 Oct 2024 11:00:52 +0200 Subject: [PATCH 10/13] download shape files when not available --- etrago/tools/utilities.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/etrago/tools/utilities.py b/etrago/tools/utilities.py index 8d3436af..b8dc8f41 100755 --- a/etrago/tools/utilities.py +++ b/etrago/tools/utilities.py @@ -25,10 +25,12 @@ from collections.abc import Mapping from copy import deepcopy from pathlib import Path +from urllib.request import urlretrieve import json import logging import math import os +import zipfile from pyomo.environ import Constraint, PositiveReals, Var import numpy as np @@ -290,8 +292,22 @@ def buses_by_country(self, apply_on="grid_model"): # read Europe borders. Original data downloaded from naturalearthdata.com/ # under Public Domain license - path = Path(".") / "tools" / "shapes_europe" - shapes = gpd.read_file(path).set_index("name") + path_countries = Path(".") / "tools" / "shapes_europe" + + if not os.path.exists(path_countries): + path_countries.mkdir(exist_ok=True, parents=True) + url_countries = "https://naciscdn.org/naturalearth/110m/cultural/ne_110m_admin_0_countries.zip" + urlretrieve(url_countries, path_countries / "shape_countries.zip") + with zipfile.ZipFile( + path_countries / "shape_countries.zip", "r" + ) as zip_ref: + zip_ref.extractall(path_countries) + + shapes = ( + gpd.read_file(path_countries) + .rename(columns={"NAME": "name"}) + .set_index("name") + ) # Use Germany borders from egon-data if not using the SH test case if len(germany_sh.gen.unique()) > 1: From 712eda0ba489fc31c33dcd7f5cf4449abffa1609 Mon Sep 17 00:00:00 2001 From: CarlosEpia Date: Wed, 23 Oct 2024 14:06:26 +0200 Subject: [PATCH 11/13] change path for shape-files --- etrago/tools/utilities.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/etrago/tools/utilities.py b/etrago/tools/utilities.py index b8dc8f41..0514c35d 100755 --- a/etrago/tools/utilities.py +++ b/etrago/tools/utilities.py @@ -292,11 +292,14 @@ def buses_by_country(self, apply_on="grid_model"): # read Europe borders. Original data downloaded from naturalearthdata.com/ # under Public Domain license - path_countries = Path(".") / "tools" / "shapes_europe" + path_countries = Path(".") / "data" / "shapes_europe" if not os.path.exists(path_countries): path_countries.mkdir(exist_ok=True, parents=True) - url_countries = "https://naciscdn.org/naturalearth/110m/cultural/ne_110m_admin_0_countries.zip" + url_countries = ( + "https://naciscdn.org/naturalearth/110m/cultural/" + + "ne_110m_admin_0_countries.zip" + ) urlretrieve(url_countries, path_countries / "shape_countries.zip") with zipfile.ZipFile( path_countries / "shape_countries.zip", "r" From 8ac9acbde29590953708398a6c40d3e4b692889c Mon Sep 17 00:00:00 2001 From: ClaraBuettner Date: Wed, 23 Oct 2024 15:20:59 +0200 Subject: [PATCH 12/13] Do not overwrite clustering ans busmap object when creating the market_model --- etrago/execute/market_optimization.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/etrago/execute/market_optimization.py b/etrago/execute/market_optimization.py index 6d8eb5b1..38fcd56a 100644 --- a/etrago/execute/market_optimization.py +++ b/etrago/execute/market_optimization.py @@ -301,7 +301,7 @@ def build_market_model(self): logger.info("Start market zone specifc clustering") - self.clustering, busmap = postprocessing( + clustering, busmap = postprocessing( self, busmap, busmap_foreign, @@ -311,9 +311,8 @@ def build_market_model(self): apply_on="market_model", ) - self.update_busmap(busmap) - net = self.clustering.network + net = clustering.network # links_col = net.links.columns ac = net.lines[net.lines.carrier == "AC"] str1 = "transshipment_" From b0ad7be42a2bc99883080379c01e92ba391ffcc0 Mon Sep 17 00:00:00 2001 From: ClaraBuettner Date: Wed, 23 Oct 2024 15:23:24 +0200 Subject: [PATCH 13/13] Apply black --- etrago/execute/market_optimization.py | 1 - 1 file changed, 1 deletion(-) diff --git a/etrago/execute/market_optimization.py b/etrago/execute/market_optimization.py index 38fcd56a..47436a7e 100644 --- a/etrago/execute/market_optimization.py +++ b/etrago/execute/market_optimization.py @@ -311,7 +311,6 @@ def build_market_model(self): apply_on="market_model", ) - net = clustering.network # links_col = net.links.columns ac = net.lines[net.lines.carrier == "AC"]