From 1c988af76993f8aba3f2eb5c2d26982c440961e5 Mon Sep 17 00:00:00 2001 From: yzhou-cmap Date: Thu, 26 Mar 2026 15:13:07 -0500 Subject: [PATCH 01/12] import_tg_results translate Macro to python: import_tg_results Also update trip_gen.bat to run the new script --- Database/prep_macros/import_tg_results.py | 67 +++++++++++++++++++++++ Database/trip_gen.bat | 2 +- 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 Database/prep_macros/import_tg_results.py diff --git a/Database/prep_macros/import_tg_results.py b/Database/prep_macros/import_tg_results.py new file mode 100644 index 0000000..e5c7103 --- /dev/null +++ b/Database/prep_macros/import_tg_results.py @@ -0,0 +1,67 @@ +import os +import sys +import re +from pathlib import Path +import inro.modeller as _m +sys.path.append(str(Path(__file__).resolve().parents[2].joinpath('Scripts'))) # Assumes script is in Database/ANOTHERSUBFOLDER; [2] goes up two folders to find cmap_trip-based_model/Scripts +from tbmtools import project as tbm + +def main(): + # Define the path to the Emme project (.emp file) + proj_dir = Path(__file__).resolve().parents[2] + my_modeller = tbm.connect(proj_dir) + + # Connect to the Modeller + delete_matrix = my_modeller.tool('inro.emme.data.matrix.delete_matrix') + matrix_init = my_modeller.tool('inro.emme.data.matrix.create_matrix') + process = my_modeller.tool('inro.emme.data.matrix.matrix_transaction') + my_emmebank = my_modeller.emmebank + + # proceed with all the tools you need + + directory = os.getcwd().replace('\\prep_macros','') + tgdata_path = Path(directory + "\\tg\\data") + for file in tgdata_path.glob("*.in"): + with open(file, "r") as f: + lines = f.readlines() + + third_row = lines[2] + + # Extract matrix_id + match = re.search(r"matrix=(.*?) ", third_row) + matrix_id = match.group(1).strip() + + # Parse the row + parts = third_row.split() + matrix_name = parts[2] + matrix_description = " ".join(parts[4:]) + + matrix_file = os.path.join(tgdata_path, file) + + # Delete old matrix + delete_matrix(matrix=my_emmebank.matrix(matrix_id)) + + # Dynamically name the variable: new_ + var_name = f"new_{matrix_id}" + globals()[var_name] = matrix_init( + matrix_id=matrix_id, + matrix_name=matrix_name, + matrix_description=matrix_description, + overwrite=True, + default_value=0 + ) + + # Process the transaction file + process( + transaction_file=matrix_file, + throw_on_error=True, + scenario=_m.Modeller().scenario + ) + print(f'Successfully process {file}') + + + # END + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/Database/trip_gen.bat b/Database/trip_gen.bat index 4c03dbd..84e8db1 100644 --- a/Database/trip_gen.bat +++ b/Database/trip_gen.bat @@ -287,7 +287,7 @@ call python useful_macros\cleanup_for_rerun.py %val%>> tg.rpt echo. echo Importing production and attraction matrices (used only for b/l/m truck distribution)... -call emme -ng 000 -m prep_macros\import.tg.results 1 >> tg.rpt +call python prep_macros\import_tg_results.py >> tg.rpt echo. echo Skimming highway network... From 137cc366d746bbe80979e2f74ca64ae3bb93c52e Mon Sep 17 00:00:00 2001 From: tinleycraig Date: Fri, 27 Mar 2026 09:15:22 -0500 Subject: [PATCH 02/12] File and script updates to support the Python version of trip generation code --- Database/choice_model_params.yaml | 1 - Database/tg/fortran/TG_INPUT.TXT | 25 - Database/tg/fortran/TG_PopSyn.exe | Bin 1565696 -> 0 bytes Database/tg/fortran/create_HHvtype_file.py | 45 - Database/tg/fortran/highinc_workers.csv | 4 - Database/trip_gen.bat | 17 +- .../household_trip_enumeration.py | 115 ++ Database/trip_generation/trip_generation.yaml | 39 + .../trip_generation/trip_generation_model.py | 987 ++++++++++++++++++ .../trip_generation/vehicle_availability.py | 326 ++++++ copy_scenario_data.ps1 | 5 - 11 files changed, 1478 insertions(+), 86 deletions(-) delete mode 100644 Database/tg/fortran/TG_INPUT.TXT delete mode 100644 Database/tg/fortran/TG_PopSyn.exe delete mode 100644 Database/tg/fortran/create_HHvtype_file.py delete mode 100644 Database/tg/fortran/highinc_workers.csv create mode 100644 Database/trip_generation/household_trip_enumeration.py create mode 100644 Database/trip_generation/trip_generation.yaml create mode 100644 Database/trip_generation/trip_generation_model.py create mode 100644 Database/trip_generation/vehicle_availability.py diff --git a/Database/choice_model_params.yaml b/Database/choice_model_params.yaml index f0f2098..3ad2d23 100644 --- a/Database/choice_model_params.yaml +++ b/Database/choice_model_params.yaml @@ -77,7 +77,6 @@ HBWL: intrazonal : 0.02173059479852062 log_attraction : 1.0 metra_longtrip : 5.625 - ovtt_dist : -0.076 ovtt_dist : -0.07639147912439262 samp_af : 1.0 totaltime : -0.014712168298471244 diff --git a/Database/tg/fortran/TG_INPUT.TXT b/Database/tg/fortran/TG_INPUT.TXT deleted file mode 100644 index aeed33c..0000000 --- a/Database/tg/fortran/TG_INPUT.TXT +++ /dev/null @@ -1,25 +0,0 @@ - &PARAM - TITLE = 'CMAP Trip Generation' - SUBZONES = 17418 - PUMA5 = 74 - ZONES = 3632 - COUNTIES = 21 - TRIPGEN = .TRUE. - HHENUM = .FALSE. - SAVE_FILE = .TRUE. - EXP_TTYPE = .TRUE. - SYNTH_VEH = .FALSE. - MODE_CHOICE = .TRUE. - IN_EMPFACT = 1.000 - WI_EMPFACT = 1.000 - SWIDX_MAX = 40.0 - REPLICATE_MAX = 1900 - RESAMPLE_MAX = 100 - REGMED_INC = 68300 - GQATT1 = 1.00,2.00,1.00 - GQATT2 = 0.385,0.77,1.00 - GQATT3 = 0.306,0.612,1.00 - GQATT4 = 0.12,0.24,1.00 - RNSEED = 211 - &END - \ No newline at end of file diff --git a/Database/tg/fortran/TG_PopSyn.exe b/Database/tg/fortran/TG_PopSyn.exe deleted file mode 100644 index bd09732fe6344770c5c572767d4c6459ef181ce1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1565696 zcmd?Se|*-{|37|JyO_weFydvkxMIpODzCA|R$E=m$`D4yvdW?|{h<8F(xzS3#SpJB z40#Em2$N_@HNTf%uO&Yg@p`5(MJ8;Y`~5u5^V)e{*R!tI_x+hxS@^sAuIt@At0jl>dJ3(It~- zB$rOV=E~{grzRJVpEm89naNj7OrAb#TJq#+$vNj(0JBQ(@czN2oCEfNF%yzeimU zP;%!_E-qo3U4nvKk7vSd2YN33YHo?0*5WzNb8zRb9?z8S9?wh>Eqv7H@gyjTtWFFV z@9gn-`3L{(&{GzdL8JA5tq1IvHP6nZ^FmUT*a7qE6h=K$&Q0_TW~8Na#!3R!cFt%y zg9-M(E*UKY?D+qOu&lc$ixs+$fBk1poIMlwF1{LNCLxxcm2dn@_IQf=PoFS;=6H|i zxX+;sIz3+?EJbMi%YvKq7co!4z#q@_6eW5*pFkiVq46)vOXV(_~MBkPjx(QHA4>77g?xG)w*lTz+|R4{sKj1m_Nrr8*!CdMyS zG0L$_FlGtHhLK{c*)AANvoXp{j8H6$GQr3bjA90#&FqmdzEH^R6$HMqaDfg}yj7b`!&IN;M zHb%XP@pmvrIT{7ye!)0YV>Gy6FwMqjG%@avg|S31rV7T(=ZLMETriksV>Fu>gJNOK z7L07cxJ+YME*MO+FUz3Fp>ph`wZn* z&y5gU#Y0DAf6O!+Bf-QtC>F-AO1bxS!MI3c^l-sonvIccVmz@RhOHU|<1WEy%ad}X zxL`2N#z-?UvSVS?2*yOg__xMLcfnwqjge(ye0f`pa+C_j8G6?n zVdMx#H^JBw5L*?xU@*&BmxUF}9b-D90kf7$+F_X^h1#7)-M< zYE6uaSQsUOajIaPr7@PeU@*avnr1OtUeXO^n}ejZuy|!I&o)U*(Fe zEEf!>*%&P*#$B;677E6Nf^nP1Xm!D0nvLN((0G2N#=EzZF#g8$5@YJma>Q0WTriksV7`9q27;^;UgP~%pfC~oGY>WaE;)5cq3bEwbTWJX*R}k6JzVmG0Jh1VB`wMB#lw$g26N!qu#{0ITl8NU>q$N zhiZ%l7YwG^7>y>z(XlZ6g7M=tER30gktrCLYK$H(7)-Mg@;#>K*DQOdoq3dZ>wBjAF;G#jJ9#Q0-QjB>ms z7$L#fnZM9V2schvt2Nl zW@D6@81LhbxlS3?KC%SkAi>x*SZr14g26N!quRun91G(J!T1tO{TN?8pfMJ^U@*kXE*MO+F_xPck6s_cR;vZ0LNI>F5L?x`U@*NCJ08VV4SHjnp`lLW@9v)7_(wwqzgtT!T9D(v6bb5 z!89AA#l+|y3*!*M_!L`7@T=Q3Mym@3(`*dSLB{jr*;z4c)vT0zpAwAIG)6phL_I%{ zW@99n7`RjSTEN*7xNTriksV-%Peug-{Jt2n`UUodXa z7=}=6v6mq zvhu4pPZwJ)b-`eojj`Os7#|DcFQweOUNElG7*{hVYy&1&BkakF*aQj z!&do%kti5lHAbro2GeW|o(KrfKc>dQNEVFkCCaZ}7$~-ihmNS{2hwbe1QX++SQx)5 z<=)o?<5G>$!v%wB_Ixne#CT#_3|ln_#$AHZS!1NQU@*F>JL{Dfhl47$Y>sY!?is*%)Oe#>iM0^@0%; zj9sUSttwqGm}X;Cn;6@#j!}+9f-z1o9?%$zT`-ttW7L`$6|pc%1mje}7@{$jx?nKP zZs*HQjNTC#QD;8}3WirOen=Br)wy6W?F79pT5n>!epL)xc?4tAB;{8RXp9CI45rx_ zjV8t=z_6AahaN7}E%WHCBrD}PCumf`UQ=k^g#vnp25oWyWtt7zY=Ul^?8Jzg=q?b9 zLc!R6iWtvw!C;z=(PCnh0mFJ`6b>n!KAF#e{T%-pFKEXI+V2{z)dh`dnYyYxI0Y4c zv>Xn;4@oTa|L}%YyOe$zreu7YwG^7>y>z zbYKL6%>zC{H}?SabR7T79q@KwV^%VVd90eJ;^B|8j-WqQY{l8n?d3?`ufxodWsMQC zbaJ@eci>ziow60-iBQ2UFOSLRn+b{!*kmE+Djs9(pp^aUM&fYp9E^cD_# zWh(!OcG`58=E$^THJ>cAIi3$bCPtJ)eJ9iGHw5EcjS+CcV496lU}F4K%rgHs;y9?W z#c-Ek+{(Z_|B170g&K$<>?nJPObcF~Y^`6}QMs2ObB86(%3bqhyr+%^4a|FsCs?z` zT|Q==wfUoP1t&o9sxc7g$d5CsmE%>9Fj)mj*Qwwpe-;Tc1OEj!=J>OC+Bp!+@dtQS zAm>uY`U`ngL{xP;^~NLOJ*&>8B+kS#dk2)M(E9kbcu#d8xXfRTthobz)dgq^}8Z5VwfWi$uegkI6K)I{Z71Rerx-zRl3Sm$)ozh z4O9{GKF**@s1U!A^c|%yS82yE9e&<~P!)Dm_k%pudBJbPB%_?FOb{j_$PXpVE`jy(gG>BnD*Y?Fc7p2y!SBLFWZgRI;n~Y0>tUtR6bRm& zY`xbI@4*4(iqBcH;vMj|2llXYOT2}-w2RQzg(wdGQ$=EYWN7qLf8_@k`HOI2dA}Al z_fSnJafFeXHYk8hK9qgIFt|`%TbsUOo>|3^KQ2PP1y&RkYhpVRn!;=@9^3-2};1qwlbrrI~(`FvrzAiiCOWz%hZSC!WDluw) zl{TjBT+%nVJL6M8fivF5z;r$|j20FfX$);AY-JkzhPMwr$g}DaUhTidjjuE7ex1tR zQTH^3UEyqtvvD0n1N`3BsvsN{?}=m@T&=PNf|n&*A8%0BKRZy2rakD1qFtR)51);5 zR(c6+NprFe8P5;pKZi<3#o)q9_|mrQ`s@t2>osV!IU5@Pnq1y# z{%Qs586H}4d>X1KH@M`Lv6avDoYgDXk{w+1$k?JQ{YZOc?0uj1$qtr3GWNZpCkEQr z?MPC$*NlDR*yP;cqBUcGy}dVXuNm9-kK+RE8w2y(4)>KGdN|6}z9BE;H{TsEx-_hO zG&E)VDzUxo7N*godi|4?@w|VGak>Rg<1~ z#*p_D1nnQTzndRQnsY)T{9%zl0e%t8Y+th?C75({{fZQ`u2mfO|Do}EAU-m9Av*tY zDOSxG)%ic6G)w0XH_K9OrCf#9NotRKKhL0Qp*0x+ozAq;*drKQdJ9ID3kK6hXpDe~(KiAks+PwK#xB8_uQ3W-FqmeSqtL|I zaEY@VQ5asq_(?DZXpABk45r!TC^0dv0ERUcr);eB_YOo&?q_vi%_Yiei&c=hDOs#m z>Vn2Jd*sV@7oK+hTIeiMRLv|9jIn|-Ph*t1U@$FN*G#2}Q5_589KrAl#z`8Z+69AY zNg89ZiE(lSMpVuC1j8y+Uc9N7*s9hAgK4&{mYNt17dvegh4CMy+`CLL=4p)OE*MO+ zZB=JtOo)Z?pkT}tjFU7*y$c4@Y+E&$7#?6)TfX(~-?=UmpaBB(UQaPtqYDtz?7}pe zK>xbPX|O2gIzcf0yjWGrO&X)w1%qiehGk+5h=uXJQtn+R7=De>;)21nqqTFjniwBm z=qyK6#Xlz)^9AF*B(aqT%SP-L%`TE@b~)k^4>!cCV_{q;80QGaO&TM?1%qieMh_F? zz*rck3&!Ds;nx_+E*MO+ZIxnTJU$xE_1vy5`**J2E>b<$2P(+ic&r#K%>{^Q_M8&(9}V2Gi^jex-?#9SdWTU`!Q^ca9N*Rl8s?&F&%>n;2i7=PXB5#TN?3 zse&{QCV>jmSTqs3PB zE*MO+ZPj36tSEqUeX*wV{#)Z~0#q(QQ#DYd3lP)njjbjVC;*`Sw)pD>qfjuCG)A)v z2GfqxUA<*uY&$mwMuuPh{0N1Fqmc=tkuLQi@=C-E}vjDU7#v{s>a|OfzX)ZuavkjJR0__;-EKF3-b&O#AdA_QY9vUOd1%qj} z!2%}6f>;=zE9Kr-1f%{)F<5~M2Gi{4Z=s2Cd;~^Rr93AX*9%68#wc>ZV47{K5))%h zzSCAw7*`3#IfBtcW0bmJFwM5rY!hQlER4Q_aiCz-CyK4gTriks+p5yU`28F>*YxXS zI9DeDdhab+69Pdr|Vv2u?chsfXtpN%3xnA<=%${<8X~p>w>{F8)K=7(KiAk z%7LF1j2i@F-4SB2g}7i;j13p5*h6;!M@r~sKa9Q)&SRak~SbP*K_iM1Fk7zGP^P7n#!{WU93cLn~8cjx=N@VV!lcmSJceEi!wDn^-IT zwOWRu^&576v#XY^Da4|qO$huxKpyg03K^(nV7+6DVx7_ueMXBe7f}Y*Bep1)Fm*AZ zwNi`Li6{eWCPb^Z_ukRo?(0>C1dk3bxai{S(b*SfUzB|@ze5v$5H{@a1tu(oZOzB3 zJiWy6eVI>WZ1*YxtnIzYE6fxNAjW_B!AlfpUaLnw!b6bGg*7@E(^?SXKgcdpo4MAj zc)N+;l)1;x%1QcRZc$uz9oCbTr<5S2^_dkZ`Pghr=%fU?VYtsrSsTDQWVh=Tsl;l^ zg}Pmfs{vc`;WJrvZ0L*?ydIBNsPaLh7K-2Ki9Z1>`_tgaeMC^@0^GYr zT@A{Ydv~d;%n=BJ-fh30ofJ%ZL;YRMl%y9_`g{0`CFO}K>1%b7l%n#dp2vcRQlCbi zNx?zI>S~Z0PX=$o9&ISI6nFB2qy2?o7l%Cg!3qA^;3n~9{xW62)I4bA9tIm&erV7x zj8C|g!M230jH`(WD>UE|L|Qp|L1j0o%cPLHyUgFLE>pi(cUQ`ORcO$i>h5ZPtGb){ ziPF4C?X!TADnB}bWK|b^9#b@y`BT(o>P98JQmy}j)e?0VE8psF=1U3)oeVC)>U#x* z?O%17^t`%@Zb4n9TIw!(0ChR&esy=Xf4REM?7N#*TI8?8Wj=b=tc~7#o?4OO@sypt z(fd?5wnoL0hivpFLfv~^J9##GckDVl={4-fnN3dZh8M8F*ek@TV!2z1(2h4E4(C_7 zEQAN>xCaE#+*NuHBc6shwsll`z(_Ab9EY`3`fMX!ZOAM|yqlJ(N1TnHTUU*UlXVk9 z>c~fL*Niy*z|!|x5Rx06p;f1O;Q5HEya`6U2jc8Rs52RHF6J|yg1BA2bVEL1#0wC& z^A;j*=Pg3q&Rc5B!xLvCPTgg88se3R+d8Tdw{ov|5D&mE%?Q=r(7^K!Qp)X~7dyhf^64i~O6{OBeO1&j=QJ4} z_*9VU8Nnx3jXFj{qC~cLd*c!3zG@&iEyY@p&C?+J(c7lR8{RD{NUh5gz1()DUYjH1 zOtUe1m>9>$!gx+F9u$lsjgjnv!8GNlsJs*tV@;MC6--eobnhGT&Y4{lr}i|psx*YE zK_PoO;#T_QF^WGxs2wZRzEp#S8nsy#S^O;Mvmc1u#R{9)4{ABSHJJ;Su#>g9C2l>J zeLX&AhU%P@0|#Kldh)Uugx)|lbW_i$Aa#N!R6xLp`e2&s1W;HWg9sD4=WIo2P==Gx z6itY|3ka?BGh!VXi_l0Rbh;4Qp@vE|>ZnB|p(2p5EmUF>>MVp(Z-3ljp+9kUkrs*< zLO7>FLKWj;Sg1)IdGxMVLF#l(sFZ*a7Gj!hq1h&(YtK>^>T`yZ&~2Jff)HBbXTvL@N>N%!+r&S?jrU@CJ zCR6J|hH2{Q1IsK$TvnB?O0hN!1{v@2M;)FsNRvq+8GHi~Eeip!tYNV@br(*1^I1)) z_vA`#EqCF>G@DbM$>}u3X|R*iS}0U~k#I^7PHE)yLdQO_yPY0VWW2Wtr=v8ddKXSi zvpF@GoF2}gof>K#b{eTUr3|0{m?r00(Zwh_V{qUGr!D&_I!Q-3={%)0Vj8LF)Tq!}jxA$2 z?!5}so;+fVLbzaa^k{FPQi9nf1Tc+$mWMkc9&WtF$#8zKAUQu+i1R=Hq!<1BAxDj! zquG>#4JOm+s5M5dUP5SK1fjsb2=&v1vV_n;7ec(nLkwX;2ZIm_-Ktk$SPz^Y7VZmU zHw1YCsz5Nl$cipBZ}m1Yo;+P))JI^H>SRfrvFn7F%{4JKYpc{jgm zRqIQO{M8VEU#&em+QhuYCrr2+bA;M@HPEt$x8Av$S}mbKjiF6#DdN`a*Z>B#`^;>h zR!4a^Y89H=atMIhSuWIgi{Hl%Q+sNlvfBA3M#$SmQ>!Nws4=vuH6U&sC)AENvw>O@ z<=v!xH);<;kZq;~0-%=eLXEfB#fPmnV*opfao;$`cb6(fm@-R8kp@sktv%Sz1)-r4 zgyJ#1B_TR-$4W6)x=z=GIR6EqHJQ=2;w?@j!-T#$O<{D2!053rj6E12siTsDakUFZ zLL|mq!C0rpRvkTX%DyoEtuc}X<8T)Y-jWp&-2)$^FcN2&7&zlOSx-_4g*s0|7@nje zZry{2I!v5nW`p?yly@_6KTRzQ0x)s);Aj)`7X2!0;#*E7Mq;ZPGD-2(q_hlmta=#M zbyp#>#Sl^*_P&U`0YTMa3z1$fL<(?=Q?M|RJ!y(am4Trqqm`NnLu($kl3|f)h7gIA z?2E{Snn;llc`hT`BE03W$W$S6oPhx%I2WynFtl2+7Yrg^Lx@CX?~90qp%yJtDnv3} zi13!fBHK<;7I{gH(!y1<#J^Y*VQ5_=L>3!DBvQFAA~$LxWkTe=GovlSTbzuBt7eQ4 z2^bidcGhYd3@r;=y|72BAwn99_eCQ?)2J32<6LO)mZKGY(qGx*OEn}Ddtk!3RMTK+ zjTahk8X}~zbYC={f*`ARBskgpfngY1Z=JAVVC4#%@6~zWj*hNjUu@o2 zI&hv{*mQPb!&?qErwSX+Ck@+FX*Tu3hJp18wuoVy*%54-_QmFM&8AVwr0~L zY#3PGgiZelHr#x3eF`OMHr$}VQ>d>C8{Tq^JpSmb*l^xxu-Ss49=*6(*f6ke!LBlF z)4)-nVVfTNV)LTXfww1w&C1iGZNpo#i(QbcCQMg@4W5Z*1_tMk7Vt@jq4j%!)Blcn zWYl=)GL_pqRN*I%CN5sCNhVJ`>pAD)KgO9Bo<|~{7ra{Lk>8%AcpU5Cfj7A{4~Et? ziibLwujaE+JPr^ZUvmH$O5HYyL5)Ang$L7Q7Znpw#e=U*V5w~kcvNAI7&dq)u@35J zi&k);Ym&;g;m#G2C@Rk=4&HL1a;>J4c{4 zd_WYM7*k?lWC%urU~C#FCM|NoVA}B-qr}9BkA?9&$CV*(lL}HRG)Acl2GcnCVL4`- z7)wr6?(>pTp*#GL_l=OAI%-vA2<@3hCE`}nuoxyT7itrQ+M$|Swbo~PHq&fsixCem zA{`{uhB&DW)zoUWDuy<-rHEU%=Ek7bU8wEifHRc(uK`js%e6j}8q;iQb%=+lO*=tZ z?L(y^Y_*1kVzqj$ilI%d0decUIWed`tQ2~05o*brTBFuyQe&D;tqJikwU7HKYGa+$ zMrvx!S`|Z^nuWNPAB$Q)p>~K+d+Ic?T8q|aQe&FED%gs6m|8lhp^LyT9N8vI{1Rha zb`c!Z!ZjIKYlp^rax2<>cXUPnmp!k2>3BSr?hN4~w_=a)jw7)6nLWR4g73};5L53= z_QoVNd;Z@&eRn>ISZ>8O-yQw&EX$tvS1q1rzB^ao;`fc*i=BDM?;9BUDqaV(0rj~9 z>L>YruHWsu#k*>3QQUxb#_ADc*nlwT{Yd?7RDVCf->N~?{F`_;{&pEu$-jxWGbL5U zcU5&`SS4vm3wb|vI{$W?$-jx$@$dF7Nh!q8#7vb6(L*% zcWv6c_J^KbK3luDb1-otGKS*r1$$4wmicY?&PNe?)cI|ledXA5L8ObX{2%OU6aNXx zU}CEJdp!Q?*Q!}b>a>Yt&ixpN)gkXak)vxo0Mw%v4|jCpVI1k||f%d;=b9+y4#^2^5HUG)8Ie810uZpizX3R1s4MapK|%WMry zJKkYCy}90(xIARntrA-H|J{mFIK{PJK68Z65aCm-`RvQqscyD@ptsFupc@~2y#xah z{T+=rCdS~?NBI22F>fgK+x}voebvj!nvbJix`z2QLrau>?lk%IkHu%RBI12O_!MhC zYI+voCrslT%Y0HMn|^XbvTdJ5ZhT(ju++BC!|IzP`|+Qk@EIk1zD*VTq!2HH57YR2 zgyfTE^7)~c%_ql=PcNlQ*Vm!3_?#+y+Bgmmr50;G=`MVj)>re%GWlE@=Cc!8qUvkD z$!D(me#w69vsn@G{#*Ebd$QQ4%!LorPSSiTO+N4RwC%IVjn98gK0jR%!=G;!KBI(B zvF20l!iQ-mYCeliK4*scq`UEPw6Duz@#!smcBvUd>bL#GKD91H|LXVl_F!Tc zL_QtwV-1@Ol$`C$_& z9_NbobG~P|Z1Knt<%=8XFLvKLESP{Gjvpnr5VoaIkzalUG-E&$X?}K`-?w?NU#q7m+0uJ zbR#dWez-Lx+wA zBv>o7j@7t;j>qC&G<7_wbu7nS>R{;5QAZt9m5y0AA^)2j9r>@(`D=B4hK~G8kzl1t z{=vw9+*1?HI{By0U#;^qbl7q+^Z&R=f8ypcEM?byJo1W!Ayo^X{cG{dDZg)D`$w;} zdk^ThDQEJVwYPQh4C_?>>{zrt^b-q{&O(FD&G^7qaWwMz)+|c;3JtgYoq2l~V87S5 z;CVP2Q_n&xp1-$~Z$W?b8BBN>tyv{Js}tHrtwg^0d%O4+^u@$|`$K<)JK!wTP4pp< zF(?;$yc89ro~LF;sslFrDRjp2>@z##yAtgOO)q3#MPr%|;$meeJ+OQUhpzZhH98?^ z;LADf1GeZd)4B6HPT{XtU-+6&`BT=ye2siygtSH;|QDA zyD=XUN#M0#8mkq)w?b%~uW1ypASR6hnVRI_>vJ}Z>52xv&eN@oH0Ud)c{XBQA+Rww znPsu=E98QYS^##p#yo|edKLook6YBd1bu8IjiNJ^HKzDW!e7eSaX3pz8o8u_?$AL) zhLf6x4>ZvIRL;UnF`>by2SS5ig1Bdh@0EpTp7qL=aaGICtm##k63q9Ps*ZYz`o2_0 zsqAh8ttU>HetIgr%dk~`@QP%-@zECrKr}_UBkz~O41PedW8=F6)<8uY4}&G@oeEcs zl~4|AJnD||873zVj56rOtNMrKZR-{SF9* z2h?&VMfljlffrn(bTieo$Q~^iUt2s;sYyKoL4NT3WCyzrZz@-M)Sw_J?~GU{2-BZc z>lDR2TU~}WN2(017t-KEYrn&1%~ChcK%>WdN`|;95yXa7ElgFt4jxaH%yuKPY5KK7 z|9v%UaiL$W^rg;0uwVMr!<{^Sacn6~bY*vC=t6@J*jH=z46R?WEnGDPe%0~hIh8ml z-D2EVFV#`*J#HV1wU-Os)AvR9AfdYpZFawOsmG>UN4j+hitZ-W*gLFUtNAjta@00< z>bU8&w8+5X|0WhFFNKKjm6{~>#*^^O=e5-xS@MG0Z1L!>xJ&^iO;$=0uTztwW&V0l zGMf*e2LNpqMXhJ*> zkh&13OCcUn{ai;4)ag<%wBE$_Fvh?)4mXBQ_^e?wG@&M@AZxaICb2%^k;tya4twxA zbVxrA(h?B2W>FbC;BFbn7}ZP4BzI^sL_OB_^Oc3KC~a@AsyTCT@4A%zcHKv+LZtqe z-BBp9=_GbGtNk7nA+lDP#!irCk4HS*ho5+8jK{+U)#IeTC>Z4$Bf$lOX=>C8j2L3nEU-+~yWT&1{qXQ&|6uS=<1(|8!N#7xUnb&ln8#KWZ= zaEQ%k7WqUzw|7(4p6Xs4i_di7bBgd;aw2^Yd%sGDIgr7W18Fjdz(%ae=kbGWKB;be z9Lt&;&y8W9uEOWPs*6kYYd%G&he$7An*EJ~65h9$0uB%JSr08y_Hit0{xcSzrxg+J zEy8EX31Xj87d}kut?O&H$!C67+ddQB_&Am|pBxp#KEs4hFX7|Ye41VOFwOqJh-LEG zeUQzk6Zu3AKYJZ-_|H+X`23){aqk)xq%P^B{l|q*3(}IceOgUE#bG{AKuZ*#WRnlS zCxT@uF2*>vTKJ|Y8_f2+U(xq+wIMVNuWw6Y6~@CkRakAvL98Id@>SIAM(Zzrf51m- zvE+rT+S{{Vz2&~eo`s%q}x%1BPe z=W_?DA{90rfhS6}B+RuvOaFB1|(B!%+<5UWlQ&dV82Fkg?&3Wx_a+xGQ zW7G5(tMN@!E^f5f2j;g<@ZE~>b^Cxl=t_Hn6ZaJ-`L26=x9^&o7YKkAmN+DSg#WkU z#^(q(Px9^kc9O5{EqsM^!t_rk`L1ciS4b!MW_%ux)HiY6go`c6*0yevZ|<8Jdwms) zFu_oZG29~MoH|haA3T7bncUv4)?w`8{>U#cUj$(e`G@;nUU+6tlqo-StQz}guiY9y z)c11DnZ1yhbMU)EtICg|*&tYc6|IoHwpj^W^(ZcK4qi7jqx@+aZk8WkZLLw$hTMz> zU&RMlcO33pQ+^cjqY#Et)j43x zfREIgmv=`As`0f)Fo6zKY+*GnT+BysZpGWE#!aY3ERvxD&ly&=vYJa;IT^d=o|c=j z`{qvOuiliQ^sH)E@>V%{I^?Me>{%RTJ(pmJpKwm|TM9AEdF z{ArVNeAoQJCAi>rRnvHD{-rBnHRTQJ)8?5^bi&Hv+jFnUuBus}MlhjeN6{7mj3F_T z#=IJnJj`XASIJ;udtR_LFSvFz49%!{o)(@J&kt&UiXNt;Ho2mgpYhZ5 z*8^2lSOtYuRLBg*vtRQev(c31obf0VY{gzBD~{VEMh7pbVfE^iptROWH*GbiKSxd}NL z@7#Pa8tV$rtMK9AJL>K?`?{OgUZ0;)KYjJ^P`;;AZYaAwJHxuJ=g8u>k*z$B>oPeR z>*jXL$$0bT_?%$5Qc8cF*QO2;+~GM)mO2tV+B47CW<~wKR21Zx%YAvq`sHLE4KxpBVk{9M#pM=brVdYQ9Vzq&T>BE;TrOQS8F(W(|b@X)klcxAA6B*>gif_^tz0kK~w88TJ`6h<2~$r zlhz)4W!!)t**nI;Fo9yMd92n``#!%Mi|K=!2;o}~vnTK~H{S$Xl=1BOo1>&5@PKa{ zgFEgXK<&uj4Vcqhkzy4CHoL0)W!1xX%oxWaBZs7=kVO^-mX!=q-z(+)`6#jB;85vW zb~c12L71WS8iaAruM8nmC4M|X&2*rbA-|82fRO1um}dd=z-86a`})p-jNg5?{sV5S z&wnUC;g*M^h#&P-ezJ~%QBFEb5m(}hIK-fXlmvL}<8jWCjF~``b37pW7N{V#?jPcJ zr4HTvWQEKDa{RNyL%$xKoT|aR-9hyNQJp2Krz+Jo{xb42nIq0Ldy>HgpD@Ns55I?V zJsQu*;-6Ii72F`b6W3U_cip9K1lRLpMft(6M}&@;%0*3n>4hVdb3$WNJ=_1Y6Dj&p z7HVy8-=2n^8~WU(|HQ|4s`0%Yd}gPBwHEUBJ03B{a?y8t$k zP7@lt;S}(V(VB*8+om;2<%4f%+hJ=A4%66!%u$u%nD!Qd2BryYEb1T@R$zCka(xy+ z&)2A;>voI@6ql>?s)gz+K^XY^zra0=9R1BIT;$)TLL6j6I4QVr_!}6{VK84l{NWQ+ zWa03+{ZwSp@XOLvq-HpOk3fHyKzSw`XUC=`o__bTOEy~r7bz%&pT@FsaMFguCL*Hy zzE*eN)WpX@g9?Q(7pZt{Ro@_aR!W}Sh&=T=4-3aUytc;bJY~25&e0KhmLr)zJkrb% zd3bH5s64X@ApeW%LZ!#yFOH;BnAXb2_%PjSn?pvkPJrZx5t3H^2hgHP;Lsz*eq#-q-K^=PfS2&(_$!^d<2J}KEHhF>fhA*xS| zP>si(i|SLg>QbnF)|D?FTFEc!P;bLP>>D0OjhIgMJk- zso!f9HV zp;crHv+*0kaauTC3p2C^*uv}}4B@ZgTcp836=^WE4zPvUi5SAGv~WNRGqg4ziQcyT zt(;(U-n_rK{^YykEi@wjmJe;Y{g1tzXXyFG1s8REtS^9vJK94g+dPnGLm5qc1SLewc^5Y>by7 zZVxaj5my6@A8`6!Riw_uPx~E+oAzJ>$@;gojM{%zxv=+c6{J3>{gkytRSabZM+V(Y zqn(M(#dMmHX$1)J9|q<4^_nZdW5ACb^K<2z>!Dl+-f>`;W&SUizyXRFNmO$9H#h+7CJ$-Lc;S$0m!xWDh^1aYn*l4_76eMG(*(D z_6M2uyoLbP(adfO?*Z|lq1YfiK@}Nmw+O@U{`~hhm|P9GRv>58Lv=Cz#2#=Rj8B*B zm&0Si;cDS9MRTBC9TtIgn0B(}6R(P<-$lAO%x9b%pKnb*H=YrLPfy`YjXad>UT={z-(=dOr62|7<9L*(JL z)mSR!5rv5pBl0xTHNo*c?V`N4YIL4~f^$Yh9!}eshvP%y@Y*WTc~qMWC3cI*Q>pWm z>pZ-+2I@Qt9R75)X*bNm2~wsq;KDjUOFzt%P~vM5(nSFb6~}T|S7dFuM)ii*L#!r3 zEI=`g&M^A3R*D$MoHs{^;Z;G|QCG7_>voakm~%{oWEv%xtE$Ds(<*|b`tIQb7_UnD z_w0>(nMC&hC26Fk*&gT$h)8@zvEq&;b&X&Sf!(040h4A3*G`t^$ zGCpZw;3?CrG+^Hlp|uA4!l1Fx5Fw3v+~b2j0ik2eJ73e_umLoh5~FGG7Wb3FG@kic z(I_x5K*LfRuw{wRN(YVYuW($i&nmJS8eyf}0Z7__)rZs1>*zyvj0+TFkp#E%+BfDG zOSN!Pwhc-7n3UBa3`~Bf9!vcEoU?_?5us!6Z!hn)8nrMCKgo8}%QH?M6$W3>ge45(D*U#;9!OrpAzWXR=iP=SwXdpNv*;;XtG|xkr5K5dz zSv>+^*Rfb7qXv|Gjk>n}o+5eJKO@hOh&*LF4~xcCI9^+C>pV*&&yf*%dgwgL49LT4 z>t3CwRPy{l2Qs)-tK=I0Scb^MYiqpDGg$JxVdSAq3X)kahSnf0%YF*wcpyTyNmn;R z>mV)5X&_{;i;%6=vJ9;+uNM2ztsr}Tglx5zWoWI?vI|AFze9E`zZ8sx0;@_%&AJNO zj);)Jx1h25XiXLg^e%~e>EYT=0W8&FvX|p8u!f5SyO3r>f;Y1`5TwgdJj+Ugq?)z{ z{^lC6I-%EsyV1*GuPH^|#SHM{e=VwH@Ln3!cqlT?G|n#BR$CBP!_j*l-La|{fAG_({LbOnaiRouuf z{xL7(XJ5s9oRuH&Be$9M`0l*U>+t}f2}0287$ipZG~E<}_lG0MG4aXntOjGC3KjgP z_#(7_X|NUX@SycHa5XI+h4Cqr!(dMf#swNfJ@g{%z_euI!JhGmhcQ0*AqK`nf-zk% z+7qN4J)k4f)=aZ8l1+@OVqr`aj57t}NsY1C1%qkF>2lPX7zY3&cfcNw+PFW59g!(Y zP15VkA|lC6p)*pXyAlE#8`sKzecH5&(D_Yay0(AJ6yJDh5<1u9y7ZGQ}SJ3kax z8JNE|VbU;PTaA~MC$YwGtT`NOVb#w2Ls8!tXn!-{t;Z}pFn@2{^q0vN6A|nt0?@WS zi8rar=k0epYF-gQ^|zrxQD`$;?oxVV$omb_(4J2@6cugw1LKs4)4sXf^v$dOtDNH% z)js9H47GD>)cY2!`U05S`qj&!Oyd0!QcL`WxJxO9)(0YWqbcQ^yV_r*g&0~-L1@1n zN1@8@%|w90+|W%LbsdWsQ7ER_U(={J3w7`J&W7+0 zI29Px+pB-!d5vH4L#e+E$MAD&%gEvlf#S7!^IH>q3mai@RNu7nXX$;}!FO=@VN~eY z+w;n;G-@-rHyzq_A}WSmA2^|=GKsgN9pWtU}vRA=Mo`7%7pj-0rURC#%%7d^@ zC6jWr)jhbt*Mp%E5qzstB1_csO|55@NeWJEBf^YX4A-Piqrx>w!x7-1f$xsv;nDfU zThJP24#Nnx_`8ZNzB^t9I(G2xMc~Ps|7Vj^=c>5NgH5c9McsL6=QoxTa*FqoN`?R))ioN#IPE%@a;RK9QS+kxV@^D@@W=$l=&T0v)L zte!`m`Js|d`9Uksm-GI}j2+Xh9q~46p7?oAvHuI~AA=sUw}d@UhnwuX?w>vPv-iOs zrESef@xToZIj%IEM7$T=gT1>+>?+nvqQY1SfxL)%-{La@LQ`*g4(8>7kY9 z@eLSxvkaH3&*S?qfzS>3>GPFpAcS!($EbMtcu=F~-~`fSwJbb&2Vc1fbon6=8u%qE z4qNeO&{4BHmES-3qG@pmPdfIcNjL!WWnk@h2L}566bQ`>d60bSwhM84KEI>T4$9f{ z+dIvQXST70)8Yb?w^YL$M}$tEufWu@a{Ic#yJ@9^m#2u90HXC;p+#Dy|jWeU*)WUQW9Mn7DYHkp?Kc~CFJ&3ysZg+vBbPwMU z1*ev_okfFg2iBT0!Rk534eJfuRam7?thHrPSZZb5i3QyzR?V0S!OFhH1uKVlfhBb{ zcpR_7HHRx*b2xp*%2U;Z9D#Wo*+J#$4(g6o9QNaBil6mvMLly70nUSC=5(+8jL&>` z{D8Ft{j{mZ06BWneT-V9@cypm-iZqj=F>*+lQRSV@%TiVeF!E!yce2=udnP^^~Y*b z?yVQqxmtA=pJJx!taxH@nI)|H)30NwE)&&%%QJFsS7EL8vrW|n0j;`YKl_GQs#8UE zXG~b|XnbC)E{bGbWUKDjqwWROxdXPb6Ar=tf#P?$z@Xknax{M&?s+QU1Dxp)?%E zxcsKB>+;O8SP9^ajslp`J$jIgvTS>YXK_8gQX{J0^z@haaq!Jr@s~>e#z=+*_+46# zpBP$qK%~ms^k_L6lJLQp>s4f+1ixAfdJL?IqU%0W7v2Uibq!Ivs-3!~y68Gubd4}{ zadzNP_8YcttGvUV%934_y{Gng6aUsTSeBim2ZyqyN?BX2qm&=3>9Vtww}`TOhqBfF zMqNyX))>fO_boqTg1^*v>vHr5?wvuE_pU`#!)C3@T!1Up8RS$Y-hz0?06V8DX*v=x zsJIxwIleJ{F2*G+&$WP@(8=j=j^QEyF}YoKaze+SaG>k0$3(pZ5;%}{6!Q5t)O&mv zH25xA%l``B=1-*+;kIvVLyqr~tvIc$esYSIE?_P!!s8t1yaUx1U!PAOfpHw&1pE>} zI0g(+yqm>=PjGgMwQP%Ws+ZIpRa}O?mWxg6Dq(DR(miSli%nuQPLzj%^$$vVClas2 z?q{O2J*&#|>g86!yzp7j5rDsLJ~fr#8P9q#9e>5(?@y`wo@6^c2!0c!N^; z-op-po3x;*@;p&l2x}TFA8}E6qEdOYQ{`M2m2LR$RZh?{)D>x|9*Cj!!|$x(fzV{>9Mm7+SAD1`d*Tx5GjD;L>)GB*aYz>5gkSNPlRBgZzG%a*!Ul`X3x*so@}u z@54c+cM%6!ZaT=g2epHY{*NlwOKO>_qhI-vJHw&G$Bbk;NTV(-L+fqGRCy1FCcCDP zW44-T%jzT?q=|yHqU=J4GFkAaw<%>eDP`|G;851jMcD^`|;=3hIU3a_aS|vNcw-~zUAkErj46XYhv)_?qp33e0 zAf8+kzwJa`H(}S$@rc0ApFJk)IIvgsX$;kSxL6eOek`gNE7hz0Wq8mywURJiiVf*WSW z4aao@!ko~+enUcW{d2msu>bo?eK_!ep=#iVVP4<&@&9MM^PStcuX?eJ`xZ)=SSewj za)fwK=E;b0pZ(?k1QyL)X#E1KLu%t+jXRR&VL8Y&O?cdw{E4&~wV2e=W?tPTZN^B( z!@pS%Vi;QYK?J`?^Dl>&&rz`0j(`L#&cK=~x-K$x;hkDj*9fI+u~S#7i>}_HtE;JN zrBheiFXUC=)V1{xX)q?QPa%j_{swN@4Td8d2eB1O*?~@Fi(Hgdin4hQW%!XuT}p=5 z1jwji-xB3zzFSx9XXN*@_qN>aguI!Ot1>zlbjgjAMB%tF>1U5!~N#k%y+ha@- zJ@TtV&uNeRDmjJ=4f+&wyvY8RBfm1-mXY6Pj{Ig*AM8`gTr%>zye)yNVM$x=g%dcM zHJ-b6kIs=a;%emg!X{<%8ERJ9;ce$&TN(o^GPY|16>}b>*r!@(bSw`$o!*r6UQN7? z5m=fQY!N{QRx7rc9V5RkF4{hZP?fj0Q`BPGu2i^@0%I!AszwN$HEhJp3fPwK(`Pk4z9jFI2TxU?Va ze#AQ*tSYkyuHj!>F?Ym+y=@t<65qwu|L|aMu-yP7KgJ^+O^^Jt|4L9JzebAKBfs){ z^n?Az50%@LaPn%5{Ek3L;3pRv$$YT$h#o7Dq1EyutN2W4vU4IwKjff9JS5;*46Kb1 z#I1OTGW7VSvd5LOU+#7&`$|28oXTzxWv}6u4avhOr;-{uvZ+U*>sTNyR?H``o1dG3_#lU=G0)fY)uy#$#jq& zy0i?f4~M!N911j*-Kvx|Ry&k!KOkD!C8BHt zZrQMO5QnlsO4$OZvKkjA>cEZD`E&( zEf`ZZMlE$kV5l^vqb8Rk3=aYQz;GJ^E?2^lL%@yFc%Mj51g{7z=;9YU_yG80Jm@v7%=yz0uVVdv|FzFpt ziUNBJ$BTFuAZW64Q|1ihm3O35*L^O!K9YUp8HO$naU9B? zQ_A9;%JN*4Rfw|F9m-bv6Eri1)_BP1At1eM|3kn<8?fP_pLbQ6x8q88z=^ja-qGSP z1e}EgG`x2@t07?GrMQIcn>b{PTKu!nh1x^Fr5wzK2HlQ)ksU9GfIJW)L%>ZO0xqUL z*oWIwdI&i1H#G!IY^s727~aJ=f$YUU{)D6&0zSV{xm5}f?XuC^0@#?w2#bvEWH{de zkYfFtCpmgj(py5jjv?T8m;zETT{>(A)^FcM3<2x3kg2T^LRH?LPHq2k(e@+-vHs{J zIMGGr%}V8mw>t>txTqX0Drr@tD2KVI?5k9kIaU6GIbCF#J3-Jn1pHV_Wr<}NSX;KK zC;UKoi4BY);7Pc&pYXjA?{KiH%tTznzwU!FJmLRb&#S~TT>TGE_*UBuFa%^g($Vw~ z@W|crg!kZ)5*`B13+gBQ?DfiRk^pH_rrUH!N#G}4jbuLI11Kd;!_fNiTUPNup~=pP z9L?&vfrBDq76#T^5X7z5am$vZw>y;8DrG-aI+WexqU?H6R_ai;#Hs88rR)i(vSBXD z`iipS4P|&JJBS^qbd7WB+KUMq?O>Mjt8Y{(|BG84rCjYV)FxwSt%3}OfCJugI7kXE zZ3jt4+;os5a194}6k6dRd)FxkslwI&;2`m+an(=2K^WhMgY@}D93;VXkfH_JK`vgW zij`s%iw@GVRV61H$#jq+U0R0LdyuK}9tlmhLEr^D{ua}fKmuJU1M6{7)__~KBpt+| z>=vc${o5SM9(GZ7ktn;-p=^m$*=b5yxl`GBF3JuPW&I6ha1aNv@3HfXZx=gtd0lk9 z4nY`T7p7z#rNn_wZ8C<|{gB!3;@@hO+k4&~S~2mypQ&rL9A=MrN~qD69-h^i!?TLD zF))e*W29gV(HQmA6@j7Bn2wrkKo}kZ_6COA5U^1RM-Bnk9p@YZ;_!eP0;&*0!1^*7 z0wQ!B0$z%@9I^Trdlm5Zav1{NCSl^O684#k&}9hN149ef-QQt<()^436u=O$-%qFp z!!+R`;4$^8%6mcFu5vb>7iClU5F;6*fMh+OVQ5uDq{{pGe22S#yI0yy3M6202G*6L zs~)#(2s9mst{kQ7Zl|t)x#;?b=$dKj!r3g7SL>JLHNvUu92Z?5LJ;1bV(4OdtK;~YwO2)F=Os}hij`@e{H zbimyIMFM)@TY&8wlUax>n7$EXi=3ztU=Q@5_6V>65*PtyG24dvsO{f++*VKHKR5ua zqdHh;IWx%`;K4hQv3q9IJa~ZNT8tCM9{(jHF5|z~mA#wQgso!Pbm&3Gq6{e-CNFG7)58{f2F3#}Z(vi?&7xVf^RRcCL%ICn<<6Ih5SM zO>$9rvr_qCnSJ%Cc)97l14RDzN010GWS&~%bY5oa#7g{g3j?@m6oa$%P_FE zd@kcZ_=pY6@gFX=clGIwc!zgk{D*5e*C;6C`0p!TC8p!*e|Ws7*lvKwJL8dVrpJFj zZHI+0=SZW7y#zS#7JK~nnsS>@(bwCQ)%Xu3fuFo-B(uR)qm;BZL+eNE8)N(jO?FP? zSgalz*qIiyFtFZ|4dz)6Wti=l%4(IepXNH0o#UeHdQq0*P=ZJ1G! zyUDDtDBFTtb{X(^cj!7$=^E$M^@5A8ubPy}9x-%rg{M{%V`!~{499<8IvgYgm$ri> zBW^m#5x9nfTmr2e|9znxWGJrw2M0+v9E9Uy1%u82~;4nY{; zX+swsq)wNTp>;oG_B;Mtu5x>)D*cJmz9%p2Msrvd@swbi{dG_tgba_(Dqe|!Q7srF z1>+cv(d>f3G#kT0JdDvB7z5gQ`0r5cjo=kc3)H*Woznr{&hK-_i;Hi<7~%XgBI zj7NHw9-}a{Rzal78wXx?MmR*Kg2kj75@-<&th+?lF{ZASPF>TKuGMoKx_;qY4t{6q z$`xH7;FgWbv4(?KZ>4O8Q`r(1Wvw5pvft%UhEx5zlnkv;DAT?%knyMQ)+D}aYM;oJ zim&p{m|h+SFYn@=hKS9ni+2L9R6mHZeA30Z*q!6+YvIq_LD|d^-iL=zT=r$QZ_H=8 zzLek4J01=;xxNj1R9k3)ALjZlXv_AcY{35?X8SJLnC&Z6A%BOZC4p9M=12?gFMpeW znM3!aIkU^-a`2B@m(GY#}ENolwW z*YxqY*k4W02TDgxCpc>Q>uYFFZy`mDnr{7CYPx!+)HK7$nx-PVrhAw*J!ZM8=_8E7 zv8I3hfHgf$0m@7Z6}TJoH5R!=Dv*Kot`bZnWXF{1BQ4k}f()$3lwh(`Rh{bn<-&psf2x|AmrG|{sb!P6GbS*^WAmql>P(Ve~}Wv*lF_@Fp1mPDIUc}Yv~Sg z+l$zw9>tb1lG`v>wUaSKDbk|~hSpq&RCybW-UAsv<>VIbR{{ypV_;n;&B@37B{d9YL2U>9YpWkdLAhq8!LE>_BZa`ps2ThXPw zMwESlTeihG0V~zTWN4j389fkt(L56;1F`)!)d!VgZ@CIGGq(_?#vgzi;AC2#Y!Wo; zmvP>+e~q^Q@vy5O@r)2EETUb zM^re|a&+Iu!h|dQ_@`oETqPJ+3&yb;L)kb2gK2jE$!ZN_tXUef|D4iQ_n&whQ}v%W z&y@aiE<^O6Wjs~v)_<eL)jBb+3#05h)r-& zc9ST}b|{M|Wua2`oKx9RF3L_3WpNH=SmD$rV`v>rng3(|xlWA@yvt;WFy}LAMupOU zCUqh~qkb9ZJ-h!bGW*X@o=}xLN2%&q+MoKC>P9TI3cH^0M7$VMZ1c&|<{4N+Dd`PO zc3AjyEtn#L46I{BWu;SPoQuj9YztR;&vL5#_8Y-ARc@qUdE^n_6?L!8E)7WVMDdZUF{X==L}MJlU)J zPrP2P`p?=Mr2l-BA^Ok9c_h!R|2)6@|Jr}HPLlrfR|ykaB=|8b!WiPYOANm2f)kDhzxxc zEY3ed0{tfg>r)8gR%cV!N~f+DlrE1`*JeBo*>X)?LDBWHdQeK!XaDISHc=^iWuk-F zLKkI&McHJBvWQalP|Bt`m7VRP?B_MAlqWls;m7N=$rxJiQs)2If9_BdH}5AZ$b4y& zG@}yfKNHtZKxvKoWt{iy{DHi=8TOb5Yq<>)K>r!~00uHl5$-<&52>~kRP(`(wzO5Yk*_n7(SO$K&VZry21Kg7 z@!(}NqLB&~hle16{*!@qujuM)>cYEDrmpEqSACH~S0@);d7|qp^`PwNKOM^YC}r0> zm90b$HZYUeU#nEv?{X-MC}k65s=WQ3%C2-#_Pi(??NEldXLT_dT2++!KlY!8E5+Ww z)Z8lbm-nO@%|^e7Qzf@v4$B$U%Q$b@-DjEEeO~yWD)u`{Q%9BmgpFY|`9?Gfqe7QL zigqiICeOfni;~_$iP_P8F3^I7BFMmcP*gTJRbJ?#@>->G&1DXi16@=GL}k5GWoH+a zJ(bE*r^>CEhp{*&%iro$!RwqVpVyLR!QZ8%x3^Q}9WE*#6P3%IDyL}4A~6vIYc?eJ z+kM`MOz7IuRgl@|U8#4aIikXuhIc2>AKY<#u=^epPHjcnx zTDHbuwT3Y~z~BKvj6b`o_0Jyz=rF{YR{NXa{q}k&e>WBg*egTEi@bB1k!iH1Ie^6kf zps*haV|h9mri&cX;h+@VZ{dL(k-lHBm(vDE%X5^%YF|;0lNR@Zn7>8TGj|`Ns zAOR=_*0rMRX;T;8*EMyGQo3rKy5_m)>La=?Gjwr(*rBYGQg(q;*+3U%O)sgk_jV}5 z`?{JLLu(~u?2~%%3E!ly)+OVVv3tTM!~?<0lkrpW zDb_jnslrWADm!|@ZP)>>@;-clqt=E(h_zNCjhBJ-niBL9vZEtBP79WbAOq`eC0O9p z_zR|aks2o}!B;MEXl&Girp7EK*x9M^5f_a|DZ$B3jdNWz{`8{i2AgT1j?#?PlCz~W z46L^xi68dF*J=5ozB`XYd&l?kHlVGAzjDd#1$;YCezgrZKj>(1_BSq1fM$sN!cSZh z6ra;;LEo^OGriEDx(x{)d>h4Rm5ftPzTS&HNyPC5R5a1)Db~D2swO{InRQ#lhYrA& z7G`K23fB5Z(a0{^!CqCFy$`D(^#Ty!3V93d5kZ4#_GVTq@7q6&yZ0U^M%1S%uN91o z1fzYuVDNJZkr+&~G2(gO#<)*md}r5@{(%hR+p$T4aVP_mI0}=Xff&LjP>RK5r5wK+ zHx=)Q_!8ucj{KE{EZo44E69f$5vft1&{jXUP%5{u*C7%6gOB>R8SqOCt>_pWzaJai zjo%!5`q#Gh`QNq#ir3-CRPhbXRp5{v+>9CfsL<#Ne9^H!VbTy^+sf|h)0rx!KAovz z>eHDjCZEo%pN>y%{y*m4Jg%zZ{~yQYx+Pr{DO*S^ELAqfD)g zOpVI7so-*jtCmz&R8~~Ji+XEOQdxqe;!={fXj-AA9o%wBMN|1cpEGmrJp(7GU!OmI zJoL_-*SzMn&UR+z%xuCfkvJ9;rx+d_ACBWOQ@oB<*L)Ijqj$JBAo=*#lons5wy5ae zqVIg1B$tW{MgQRWtkYJNiIXr-QV-{JTqa&u(+BG*(PcH4zlVo4I3cp^+60{Y_(#pR z0090S;kf28YwfkM8^<55se6~FWv;Dx9N_3Ok0ao=+?F24nOpgL3coeeahxU-eiNWw z;`bNvyMxJ5xJ8%Al>)R{{C**RS2FqQ12Xx)0`!*neM9`d&gAhmGI@>w%@)5i#cwW? zgMa0@rQIGt9KjeFjAF`XKVWBm+%1TD;%*YZgT-$u6W3KS@frcRTKrxmexsQ9_G%`c zCjjS)-w^Q|%)~j%nRp7VxhL+V_^lPc$M9P-@qJ7?@#saqHsKsVXKwEQVDMS^5n#?n z32-xlTbf`_@(b`2Fn!Gw{0MBWoeJ<#c%Y^hKYw*zDHcWoK5>guzJoXFl%dvRtqc1> zQ8xYU5kTf_cwom(;wwEI-T)MIHhVB4LVA%}APhNx=M>MdFjl?{kZ1j3$Unx(LR=Jx zdR2)yVO0pRCqV4k-J)RC2+?i?7{e0SVEks%6XNBUXgt!ZZQ0tCU`{lAaNM(AdP|IVko2d{0oB#7{XeW763-Vs1TqH z;<8QUJu6Sr#PV}!+2GHQ~c8qQ2^is5r&V#HDWf5q^urWjr- z89wxX#qfoEnpE5bAj%|bw^m&~LqWkAzui5 zM5pbqb^`^SW_7taVThsHiTM(*W0EL$p-+eaWxIZnfY%5!Z!vYN^fZL5@+?m2gn3Y( z#>L6YJ;fCZ@^V(813D1>2GyGcH^=!Rh`jF()~n(2a!+4bsyl~A%`uI__nQVrdCO{)IbWfy@II*wRAxkEM}UazArO(h2L?FoU97FuqPGEv z&6``I*QU-`>ztc_8i0~<8CV|{{pCSuzyma+U?oC|#U9%fFK+5m5Pa~D@`f*}_T17b z0DFSbFLxGz$Y!A8>@Wc(-W#_IiAaNE@jE0u1HXmg^FjQGGbp5JOh<-+i$&N0U9Cs} z2KUEf8*ov0H6n+}p1aw3L3qa7G`zXQ!TB6(+mASHCVT4Q@EF8X zJX69_Jd+}f!dWN*-jJ#?L$$dY&RxDm&# z*?6x)2i;w=oM~lQ5}pne@?~gz^hWCdc`CfOF;fyF>ffRnaH*C!j=j~-IBv0N4zX7lo z8V(Apa z*`Yw(dx%J(xP2UvB5^yS5e_~ex%LRAJ}Qqmhkb>}?Q2miQQMJ~%mtkY3Uz!ug(?we zNYEWi02HWch@{~A5;sB`OnxkbCr)M190&c($6DTq?Igt}G798r7F zh4lC2zS_6TM{IkhdEDV4~xXn1+{H8nHPSK#Kag$k^Th>#FzLV~j>CuwJ5^oZz)tV`&|L2ziaXIvFY-&R`EVk`*(%Id;Zzl7A)FGO zAleeshLbOeUYk&g1eQsbhZYIW)Jir+%#GfJL}}zJg!KU+b=vwOU&b>n6P$@64>g*V?13&&Mv4S=Bo&JdIj~(196%t_($P#a zVmj)%yQQQ4C&O-e3{hAQ!h4Y~^8rU!$33s0xWyv^O;!3K{6CEUNAUj-{O9Le>Bk}K zF?@|<41#b#tUK&XUxQ}F)dIN>17Rh9%F*PEsO3);e=0GiNdKNc_^cyv$Lo(?W3k3iAB~GY!CXa$rUXC<9nS*dH_iS@|FuAuCckIa{PIK-X=0M zw`5?P=~W{A8j%iD_y{u2^xE;~Apbc?N5L?;A&oz?*<)O2qYo zGNh3-L*r}U)UAodr;^C(oVyQ`TPQD>I1xiG#C&}adcSH24wqv@r}`jtjiL`?h9D4N zR@w8AQ5!&rF1sgQQ!V-;^nsKUxIvDOGFW(nTrV>Oz%@)oB4bpfTTc}UJx4`C%I}iM zaV3bP;9fX4$fcl*TY?aGPbAm7Z{nuo__PfddU)d=N`|w%k=f<6oE)-Zpqe0{a!iX$ zqxvA#9g9g(XzQGN4sL6624T=DW@(&3Vx$=)#;rjZZ$f40UfZQ-RcdBk>X^E+J2Aw&fB)5k zGYhB3qr>*L#K%=Zj;XMdw-aVc%LZe(b^A{(-;YSbEiU6ZOzU|Vj4<6l$lH?3I6XGI zor#B1y%RnRIMN?|#Z^Y;41DS{9Npe9e8V~HYcWi6-oA+~L2mPy)-zf%R?s{J3h1+bhzBn6YykMp00Kw%8Y|^rdd`#VUQN zh7Y#I2TSw8;sI047!%BVXc<1VG#@O>2g?AAcZ|7X*Ey#rKzDCiv&7iL>*K@ovm% zXMW}GS?SI>fs2A(#LBK`9r~}Gr|`Yo-9J+4O)1`%p8*wDjjd^!>TN&u$Uvyyj_S)8 z)t51$t4O8(?%0##E8MYPKazx=ALN2b&fE7HL91>h$j%z*$!|_V3`vF|voa(x}2ioy16m z+BtH!3+>PmK3O!i`ng#xWi0D?GZyfo8Jk}?i?_Q$oR#A@Qll%Q%Rr$YC?t4t=QA@y zW@X5X3`I691VD)`Faayu5!O4;;RMg03FUjbpo==Q4K&L4c1ddSU1E!$6TUu~@b#a# zcPkZFQe{@C_r>UKXunv6Z^+E`u=cs@%5KOk@UT*evimx;{0!-6$bU+mv1!r}yjP}p z`>qm}#$87kaX-Z?tCD;Eo)}wvh+j5O3{3G(J{o{KRj;iaiG^^06Ls(gfZe!wFZS^G zb>0WAY37|+ml%6&QXkwLnO7pnrFeV2OBVfNOS<=E=8KX&tK8nJ1>a=wP3d_c+55n| z=+e4>0cvyz=YmA#!!=B)Gqz2_6)jJ36rVE2m=6tNOKP}!J~1%WJ9)p5F74S_Ededk zp+f-0ZDYx}^=gB6LS!@VxVqTWldeGP0aXP(Z?6xfY{lIRnK#%iIpET#4z-Y68^-%ick5c+IJ4b9MP_mwMjzmpzj@Sz60Ht)3 z&IZ+e#FB#G^UoyD$xjBto94hln~a@}HG>4yGRtHG4@;yiQ$3kssh;~IjLJ!^(Z>cp z6(?7`GmwU1&TYuau?M$daQfQ}xmSYZ4kF~RaIm-22@bTX6}%Q9J2#{2GlJ~nx1pw( zYc<}G){1NZxo~`;!XSnq+ZmyiY#Rj+Lnz3u!!k2(PUe^JT~OB0tvA)V!$_tC!cv-r zW`4{um*Y_e7AtY%UKCz?31et3)y5z$F05UNPdcK}{09#E{tT88FuL`lWIy@M;iT@0 zOOOp0!b~ombuQx1jrhYSLgmUIZLA7a~Lxyco}fFJTC~l_G>w zM7#`fQLNA49SfIeUKEC6;Une^Iae46bIHI<#Jf2|V-s-MspYJ~Xrlr(N8OL(h8x-XJ*PPH7rkz=TD0rhMVvrFYhm*}-ED!#78IF|kC%*T+1 zmVNOi*5O>{$Gc7LI@aIRF_q+%l3BFw9`SfeJ{GQv$0Q-K5)r!V$}uK-fwg$Bx8QlA z;JG7f@?dY#EcJXbp8=mvJU6aaeZf1VZ8LAby4Wp~t`$S(z-|yBIWzYu&MvwoYqTU! z^#ul!9WuXlh!b~oUbS{64L*Z;} z#r;J=zDV4Cf%4WKY^N$oX$i*YXKM{8$Lf;yvv6zhSyq}qAt^PqmG|YMc3tnPid?Qw!tIbA2G+|oPwf+NG z4Q$M|S}DMJD4zm9KPVJfOjO^9#PQjK|3ZPjLV?E%GzA8Ofta?jC=lF~0`2S-;8@6~ zz(rDl-`>|02>3S&aJ@Ru@!0}Rfw^E%UxAy=g>C8ih8{?!R1G}<8~7Et^8w+3ODzhd zc)Rs~prHpi2lcm#&?i`1&T|Cl3VgY=p#o0tlo>EfK@HV z2{U_zC5WebhK8kj?usz}bHC7Ul%S-l2&dh&Kjnyz!RXCW-d}wc9u{Q8{KGz(ol{IR=B};_;9!7vp_3$;)emtM2 zzWoTh20F44u14HvzqqkY_$XiUNR>QZRy=qnPJJGPnT;b)j`8u>I;II8qa}~-lE)2- z2M?90&x0_N2c72QF%di(ZGPJe;#hA-E-O`aQt1v?rvQ`-rphK5S5bB)O>f8#|I;e} zpQB~nnN9Ifq-2O*M?Ei8VlP6-Vnt?)5f{zx6f7<0IZEegm46x-u&{;!9sXfp+zLds zkDm=}!^+=RNF^n<>Z6okGo0+{hf0D4?ex(?kq){d*ZdnrKAcHKj?C2*DSfY@BKbgU zRFOxJ$qnu6J4Pu2%lQ?Vcb`ziEwZTE?sYtT-@ow4z8O^Ha$S+%-)*Q!1rQrm+jJxgyd=gJwd5MmE#55#l&b6pQxc zz*Vw6X#>fvC5&;x%=S14abG>$f3Hw%HAwh+d{mMpN-+_lJubyFD^D3i(5pmfw#QY7 z(^$q$xn_HO-S^H}7ep$=n6v z=sMq&JnmOKB5ZgNW;U5oRv!JD;!!SnOqV>)RXk#Bco1gth_~|iDHFw^u~G58g7|WA zh_khjsb=}TDA6ougC_sPsCW)(dPAaxbiPL5o=n*YEatQ(N|p?{U5$HNct3p4#EgONUU=IH#Y~d68VY{&GO$WQwy->o#)s(OVeN` zDA(6uED#%QPeuxH95;)+p`S*|_QYMUgt4>{W;V-di2K@;+cJcQy3|vwN+~8nG|OA? z%*s>E5cCX$X0v<{anUS)GR16`tIGdgvz(o2+bpYL@*GfUVwlVo-T&{yG&2+$n4S7T~f-$xwdH#%F_YnEW6@vpudwT(rkSC$sK6m8;dA zYlLW+@Pq*H4+G*$5m2~H6n+v6$|<|ddz!*dVHCq=`jur z*alej7zM;e_2@43Xl}0u8!?|h#ts+$s4LR^kuv;W_+!oE)T6Dg$D3eKUyql8*l2%0 zl2XC#X022Ge2?y;pJ&-(VG#ZNYj+4edRz5S1&M4~pg3ny&4ScafodfbNSUrVV%O^p z75MQnI--$%&o#FT)g}vCs;EJQ0ANuy z5u!P6L#luWF$BfV2+ig=3~|vM_k_gw2pv<33Cr0WH$8=2bEjnr+cII%EdT`25*O$b z76q0GixlocMoU~+Z^ELJWx}Eni$t7NLDZf$Dp-ms_~)PU8%vtrkl$a`>VIOotp7`dQSnBmj9aRn%NT+jx1pKs zaTVgCJzj$a>pVxZC$;MHEEuq~&IWgQiGlGl5F4%kH&H5!uayEQ%zg#_J5(rexvs#h zq5ndGRziV9Y(DUJQ6b+hYN)`E6Pr+AJ~G)Tz!umyYi!&m6nK!R{%P-ZxBUwRk|0-} zW7dB(1v=R%a3K&IZNPqig;F`H5ugsb!ezOQhxe>%F;1A-fVmO3)WKF#!*>KNe*?x( zP(<4-tbtG55sJ2%At)Y1Xf|NAh>HenELOa&8wP@qpsh4KCM6yqBo2A;5>x>%rg&{6 zCagPop**G|p6q!f40{J6jN5K)f=8(2G36OrC1jxDkzvDwuoT5(w3WxOzc@!9|~bl1{#RCkIrC&hW6EvXL5Ly z+PZ~4B>?0S@(P!6pBt{NSjK&B33pvdrSo2*TW~Nl5Kw5p=&HAZzJr|}x60&I(89)>h(-u;7pqKKrp!`Xx))F5ZI0jmlXHhoP~8 zINXGH%sG7-&JMsQ_m=>GQ%8P!H zq2UEip5v`)e!Y<+06B=U5E#&mfpL!{_TvkF9(1HeEM5>Bp%eQ6IqDNTR}!0VAqIUk zT3oNjy+%5%`)p{fC!#dJsXSD0DNNFY3PRUc1<5s2HC;Q|kjy4xVtBTN-qGi!7K#oy#+lJmwxl}w0NhV2tZ9yVF;XVgWo}*eHN8M>d z>=`2RGi~4aC**P);l>Gi1v z972qF-0)1E<2O8^kaW5bAK2!F{D>zMl5bgF`g=QFCko2|?}b4LEjD9>^epJ3%&bHa ziV|g`e!)p@w5%YvudKYqaa+BzLWx*b+;CJH;>PGlS#`_k|WP%S@Sa z3q#{F;N&?H^wHtrXQh2ArF|F}XRzE0(``hO$%8)Di2VSZJV)(hX*d>d1o zAL%-G6Qox!5K<46q>Xc>)M@oer^(Y<6T{Peq>Dg0Df$@Q`4U1i(Q{Au=tR#0;aRGL;Hbf6{2&CMPc7pIA^kDb=LaDJG1TV= zA&K4xTmjax{%v?a^Nsa?#5l3XZvOnvu|7X-kt6(S#(1mQh=cg)5V|{Cj`h3kP?5;( zD&qPc5sPQ>!Sgcv6A52?TG)T%Ir<7~+ib$vOoq!9^)VJOO`t}v z42@1_p}R zLLzRLtIMexF^t2l#7cpa=lE`-M(h$BV)G=i01GjW!>zO)5VYp%w7#F$P_X_)Y%mUg zLt&C8R1mtJCrDnelgzatc@PWG=)kSx@Ou^7B1w;dv6k!9jqT%0M<%q*SBk(jE?Bm5 z8TDJajEg|cjnURo?SQ;C*I(u*YN@{Y3XP9>pwqdCGP1I&an-8_kBd%xBJ z^J@xA#ka#jp`YO!0#wYPZlx*``GJbK-b18j(@BZwY7^cupeDXdJ~>+9iAO}_o>_qd z;F_D@BbN}|e8RSx-vK9G*RKH8RDZ76?Gy;e_c9(S?p@G3DpT}0DAHYYvj*UP@iXr5PG3DsoK#tIzJ_e!N z5EXL#f}X0L9Ibt5t^h>;Pmiq_{F*$rV!1keMX1pOiuKsUK3tq#v4cvr180PRtz;O| zT!x`%x(ax=lMJe{<5B1LQ2j73wO!zkMPyPs4EfY@g=Olmr)5-FXMXOf=VTh+G}{FNTAIB$4yopM{GdPtg|7AG+pa*a+nDb`_0+Az%-56o zt}wx``tn@}kSJC&S+{u5%_tGE7OQS=16{QVuQMmxgex1?#rrNY(Oembin_=$;S>c1 zV+oW89vFkStv_Do2^l;h0F#0!poy5w9E~s`=g($v>eux57W%O@_#q5!!7vHmxIWLr zUy_`On_+-qf!o1{xI8)uhvNXUNkYWgIq9q6T|m=uen5JKQ1d=fX`tpn5wWTn`hidW z&|*Y|njMLz*PenaE3ocZJ90-SGLC0%|I&%d~ zzpr@;M~;D5kZTK2YtE?h8af3$M9Ib~cU?`H3BF%|*@wPsmh2Md`&pIjZnv5FUIL`% zRTJFbmv1gWzVlcUhTiI)wr>l{-X~pPK(|L6!^-(Z?O4H&XNp0~3kdK!`xc)tqBsa8 z`DY%t%4fov-8>hW^G1Ym&Ip|naIr3exY2xHD~$*~K%4j51spz$Ex)AoNf)}nC78Km4KNdRUwWqG{TJg_qGb4 zDBnXA9)mcW@_T{IkfULQJbq8^IpPd{86e!*u?S(Z=L>$!w;0i+=>43PU&2(cYsib3 zl98Vo3(aWkZJjf>D^oK|gdlaRaGVR#N;jw89faz$k<~EwqYFbWzv}pYTr6GbsY&qE zl%H%>exggyuM@|tG~f(W=C$t3ACr1kqONqv|0!l8P8gUmOGvkqj?Dl?|9IMOg}`TX zMcI550hOX{_?LpWF|5J;(HaZKxF|pz@5gk~Iaj0?gpWqt*x6f*?T0eIvMoG06-m^a zq45xwky(%eX6&DGZC-&a6PP2)O*|hhZEV3z9-#K*xy~6wSdKIEXYwF5ckChO+zWsp zhniEqa-(S$r3xpwu{611r-fvL6W$hyP!^yRq_gx`D+Fer^n*yNawx9jzX+h^rPLA& zk6|QhF#_X+;fh*#SuPv-HVf8VBNU%2D9J(v#j_|06lZ8m66?|adfDKm<}oS8%~FgN zt<>%k8!@6RV#FZs6XR|vMsHn=Y@kpKhQ{w$PIhO08(rocS|(3LIsF_O!7`k1>8XTI zV*AJDic@zccCRbXIe|{~2<(2iKNdz;#=o8&h*&yeC{hZB7*5hj!NDY};;88O4^lEi zy6?I!6yMjs2GXfxR?dgNh0o;~a~{XKH*X2*=gDoB=DbygJJNABU2|vtX0$KplM}sn z;!Ki1TZldyhm%~0{w&EmyeEMzaWV>CU(CkEY*_~66~!f@&?Uz1n2>a1W^r6DN?fXEPx6?P6g<&Wfe#1De`$Gx_i8VE zA8>=W@4Q6sBh4`-@9GN$5XPmLAr#qrJF=L_$Y+wgA#-^g_f;`(O6>0wFjZ;t5G3o9 z304C55<$CPUVfY#vL?iCm~j1#nI&+TdN3dkY=^Pd>b1${=N;E9X4?MQyUDi+MvM32Ce)u$ddBcHehz| zpjQ9L2I*ECEVQvfYd`;{$^o;(2Ce_84Tf87P-tU=HhvkJvH`Pu2etV}HpsBrV3Cat z+WPr7Wdml14ch)w8{A{HL6MCO+WBQ@$_C8t9n|h0*fc|+Mv|N22MZ!rfk6Muz~ZR+F-KP2Fq=15agGkDH|}mcTmtjvcXhk zgDY>$EQl)uft-pC$zu+)A4k8`&r|4SkBxSCuBT9TE(qAUpeHIaGo;4uVo$VFb*k)% zbmZ22MlOtdl5^I?r*et&BTRl`ZG_{Hg!1Z^378Z8r(@L2N_QQOse8OGId-EnrxHUA z-%!OHIdtxsI&;L5lvn8Gh$Shu&>N3%LT@YudpT@L@O+gz<_D#2LeA>u13e`|<-y(y z^AHc^Kt+U9IwirgJ}Iw6=FF*Ro)lZ+

2slg#f@rP&61ubw;5Q|OWz5i(j}=r!egrE2d-I#!EP9l@-WRH zL{mLg+@r${qvqhwe2@H_qq^u#soo1`W6krt>Y!VLoI}?R%qu>xdS`l2e^0?v)g{A& zl4AEc^T*?LNgR!qfk>j~_xKM35-=;ZCZ{gUnIDHCdUEDBSZh81WSjOl5AL~BDV{U# zoZU{(k>lHPDuT-QHpjt@Nk za|KhxdbD4LwKg#a#6h(Hr^Fr`|EoA)Qa)xLaSq*v1K2PXwG~#usu@-hg@xAQuzH+X z?;QH8bLf6`J`@hx6HD>#oYi5e-oDQbbl$Q2+P)9AYme!tpT$FpeE42G43`fZ#lr*g zVU2j0EFX@GhkW@^Cmssr!*AlDSU&uYJ%QtM>MES+KRDAXaa=CWYjdV=#R0mQh*9#U z|KyCQaCQXF7H7nI=j!!Gq4-urp=^hIp)AiBD}tY~+@0L>O#Dc zc7#0Tn6+}Qt|G^kWG7ASj{Vu0(;L^M(X%ZM)95l`khgd#jfS`El$Y?LiOpk}rnBZ7 z|Enl7*TE6VnfsHliqvxtwqdx%o6AwW{bODrE%}Zhu?+)T6*kwpJwLm1esj8=NoP{L zPc~1E{oR?r0f-5nQ=S6}$G0c8*v->W6MFuE&pB{(Af=I3anGom)C)%)EjrGU_rNo! zpfpl@B));y`w^HvyuFME)V2IYTuArZ`05mIxHu!zxq58?G8CMG*)oyYc}sb6i*Ip- zfit4oISk&xFD5akbadyeY~#FRk8}7h&SCqUw;vtl?0NN{IAOE7JNC@@jn4NDnia;Z zL+;q4k0fFHvDIXS!eoQI1&0=XKAg1-)@%O(Cnh)vf%DwkAI9cU z3(RQ*<#w14c8ukBScDiZ8|AcMZU;)iNe>l+2j!DM%2|mcNY9L~^bWbcnRk3$>`#*} z!%>plUDIL@Y30@^s_D5kvrR$*#*^2km5F9`nz~G@@J}9uD;qAfYAo?=xZHWN)lyx- zKkWk&Jm>?;6LQL$U-3kJ3Z_12I|xgNSt9=|6FPuO(BL#67u|8<%ITxQ4JKHaB$terhc6QJ z`h|&$?`C%s6D(dqLQSxUJ0Yro1#uY|!HGbUpPmZ|8ceZFV)lA-I@E+LdFQ|q5%MUe ztOz4Svb@2{5+5}Z1xhe9Uc+j#b4AFDo+S}8HaX|M2UyNYoMP*07Z5PEWx_B|)hOq< z!k2g)XioL1QO@6SaDAD3Vf0!YJ2`GGZdofwZGI^50!K$&3z)TyKbr_C@^Zh-DCeYK zMmhKHOmwDgNSd*BLhB??C471aXX)Yq-ZPav_G=TagP71M$@v*3aCkGstp8#L1=Ob; zP4JW@#;$xMG%sK9$ABa@e+J27ox;F88WP9vk+U+Tye2L=^UF_I!s&Yi2_EdPmQIDQ zhE;wX;r1?nx$k4>!}B`DBvIXd=rdEi?dSB%D+%QAfQK0O1N$2@^8-0d@J?xlx|`(L zj;7u0*m)7jL70gfFY)n0uVZdR+~`|BJd(mqnKyb%;^JfPX`SlXh}622o^?Ej5`rv* zOerYDS(pk+!M-PKoBGM^NePdEoY#uSFqy;ZBN{Nc)$W#{!umwICUK( zlRe<;_J|qKQi_18N=?m~O0BF;&eBT?Zhug-pp%ZUrePK|OsIjYrx6;)#jOJd^<2OG}x+RSPT+B#5%yoh-~*(n9eS7EvonE*U5(c`4!PCIVkAB zA`qh>oKH0BZ1p@Jq0x@nJty55Md2)S+S@trE~?56W4N$H>={e;eB;JheOcJaw+k4M zrTqyQYIz`ALFY^^GSPs6egoDKORjEYBh@sZT4J!A8$aS98|w`V!|ZC>VOnpP&qh2b zm9&hvy4o7>LQtYrrjj4jWN7q^7Y1xYE`9^fMiNmO8f}1*g0&}6Y`h`EKEJ!QI9eQb z+&T`~Kq^DwGvsp?!c_0@kBiAaRg38lh2gJ-12W9Kbb!DY3hq(qFd=m+jeN_6#Yw88Q!LJ>gT(f^6JH3lGQO9b#IU zyr)r2l!{4I=iFIX1H~W&%O3j=2E){{D)KB!HdtuM=R8R5<8EPq7ZK=s(9s z1Tf|jMLMItP8lZY(LS9fgLF-Euy52^D<%CrNk2o;hqK@y^Y$>mgCamvbe(}uBSVAR z!?@YTccoeiwr4fUdX{9JB3U0jAg$KWT~Rb2%8B1yuZEgp46+lW$STIFk-(ky#TLA0 z;)1e@R8NgNcFU7DC3xf-lH1#A_&KiE_&B?y)%AEx@GPIncYzx3FSzFkdjnc-!`VUJmJ8jPYq31(KE5>pS3b2^ zk6sGHHMXizIQSd|I>zl;uU=SFJZln4*-B$Wv>2JYkN=26Mz16DWN*QBmm);<`4ES* z7F-^~xB0xn%d_$Jo#ZLFoQq&dp2Eu~jTkSLhPZm2p&d2(8x_9UQ5A5`7=l@GP z4ff=l3tmCFV!^AX(=J?w%V~qyBUnPr{HEsUA#8R#RO-E z$a5x%ZXoSXyzU337Sw;itNaARKp>Y!H(s%*6<)gb%SQ9zpMgu2xUv41${W+55s z&`X{z9136nU|L#^0nCvB)-4}<94}xT9r(uuHNRj+(b*+2AmEnUh9(S2xHaK6Y&0od zj6Tk|;k>ia^zCDutEJ8r-8%ng3C2{RSAtGz=C8OQ%d=x_vpdCM8Bi=CXGd+GV+e4f zkKqD73pV)oE`hBxulH zoQ;Gx7eOCf3PWpoPUC2AcqXU~-qv>E;O6~fn~k9U1Yk)VnkMlZ49-+Y6Qn^Px2Go6 zvtIZ^(?8(OK2raHJQWEtAwec2%!GuQkSG%p1xQNlkDC6K2|oRA^yFVa4k83<1N}L+ zm-;7J^!G!rQ2H+f-X~L07Wop2+gn0fuevT2-zW!X4MHtPn4!Wn6~-fU=j@4}_ye&& z&f3*mWG8Cc@!h={#;Y(&g<%N&SuVZm+F)OngQb0fnWb8VRVpk)=+Cks+LC4dCo;=a z6=tb01ED`lfXk94YPrl3rotc<1|aljdGH!bma5NWmNFGCQQ;zlG7DznoO4ABms5x8 za1Gjm1kVW+Bvz{EW2if*zvU0@>W#*Cr3gYQ5IDQUo9FjCZ_kYmII+7ou6$3=tq8c| zyckv(5#f}r^Y+vLCgoQI$s`%UlqQnSV@hE~m`sroy#FKRVx|;TM9CBx!Nu}zFs~Pe zTZYDaQn-rn`Sr~Lj^Ij-+&oI4rVZ0`*Ha2kAj%llMu0v3yL!6b+}lpqklWwI_j-Zn zh#=%#1ZKma=A)@^{IBoDNPXi6?2!60qU)O`lkzJV(e%xbDTNh`X!>T!l%fho>g)SR z52-7;`*kH_sVid^T|Y*pK*jzl8JA6|cUzo3mH+2?m|w1*d9- z@roAo1!Y`JlDoO~b{G)d;O6X`h6e+(3jgyr$AE#zu>47*x4?@TeIYY!Ac`b4b_oH< zc+0PnRQAL!jNqO@aGKm|4>RU(F3tFjP?>4@p`{YHbo#}9+`itu61VojJpva36>iS{ zZL*_zE+asz9gG4RL@36>lz`{u(2> zn@bN)MFb>jYbKLK(dN?h_I(gRuD5%VdhzC%#TO9*+g#)!PT}U5<4;QD+IyWy>L7)K zo`nl0cRfhii#EqR(vi7%0}Mo&8bUmiF=Xq-ECNE86j4S=FR%=k#+XU{&!WRpw!m%^mAr*mjGm}}k}0kc0lC6h`!%#=yBFI>Q+a?mQ;EUAO1qz)Ix{MMgD3l}W^@DF9yO;=N{ z+|A^NoWF?VzKahbnI-#=0hCMT1O(nYYZgTY~e|&uMBuv`E%oC z6bEX(c8p0Cpkky8H+mouUPk7ko@Sl#MU0WJJ^lK_O`%1yYn21BxOUU z+y#Bl|CG3(*DIfVS#E)M?L0iNpuhbNGx&0v5`$K0vm2z5C-*%j9i07PS4s@zpL>%i z9JVr?kR4!^zo2i$aT*3HcJq>`NgbvtU2wm$?PZ@cCrZLC&rlpBt*ZkBn#)}2STkbL zes2Y!pjCTzsuYmo2pvn8y+?>73JC476cE~WUmsG3vOo5qT(HBQNJeVJL+SA-K7i7+32Kd`@0&|WV>z|ecLS7u5w8xyGtKQIHq+1 zA*ceo97?@jaZF-~N4=^#Nt)n$Z9Ji{_Te_f+b3Cmx>C}M8Q5Ra%kGp&h|E2C=qZ^y zd&mHpyR_~sf9~b|z925F&~>0cQ{SIXD>d3X{kW6Yu9CR5m*3#WJ#|l=#Em(>qaU|# z+8T))(>K+RyL@i|AE3cyA%5Ib-&IQ7?Bp~*?&R^!C2r}}o&C7W?_4KwOK-cykK6Y| z3yE8saDl*udr(QQnlF7WU5(Nib730&gaY2F9W$Vz9J!DgP;m3^l923iFA`EM@J>DH zkkHa6UIr8ejztSe=r4X<2xg2{DXD^{<+ z#hj=bo}1|#RE;HXtL!2dM9%Jh3$nABh+lvRaB4q$SLUkCyp42_6z~}#;J$tdBh}z% zst-HFy!S9AkR*ic%UiWpvQN59(u#R_7$IAQfPL@(k`K6(nhoxuulN8-rVK{}ge5(; z1D{TyY^X4)&q~>1246&afNc4Ik*(sPbk|3GK!)L65kbw#{&^WQ{3tj~_O>C1{LQ5! zla(39gfqh~0j(XE0w_#MQ%Lc%tB`@M%{8|PGQca^T)XgYIRxlCbF&mw$p=#${+RU8 zSVHR3%14#3xjg_yo1ny((k$;9NNFJKQ;`%lcXQ0-!4wOPARbC@f1bIKDX@&Wr7ps3 zr(QUVIe~M21=;No54D%A<^xK^oA=7(7}r`tlzH2KE1}u_Hb}he4@MKBY_s@mMRV{* zCPVy}qx`v-FZfO-*ACw#bC;Ig@6X-$iXfRBGxl4VyY`)Ef9}cWZ;{E_k8Y8>357n}9`@rd?;9*}vsYj1$31n~Hi?^UOz`7QuIMCjOE>rR z<1T-1yTmO$`luhb?+xcj+}i5v{kW4|KS|u$=1=%>PgR{Oabphj6S!~~3e~<(;4l;) z78dvkE%5T6iHD?TZ>3|mi-+3R(^<^S@_}L@T@9bt_8$fkY*FqjWCX3iiO*OH&}1*Y zgCtN$f~H93rMcV495{gwGYJLc^AQp!J9L`FseS4vi4$|d1c_6+ex$@H?UAdLcx8vg z$&Pqb;?!=rN8;4>o+WXzi+`0krLM;%PR#E65P|SgW;O#tX0}|W%-KiAO61ajaYQz4 z1Y^~H`?%CA`_Cj&MpBz(8L16Pk&&271|x!8M8-vE?%400a|ir^Rg)R=V?gKJ3M@uq z#e64)=s-;kP(^s!YNx4jw0m$Me&|D#EbTU5Su;#}8s!gvwt&4S3ug zeGFHrW_`n@-pI>;>%ev2opJ>jA2B^t_yG?|1IDCn_}RNX$(gp^vi^$=C#zdxiTBJN z?yLBU3&6n%&d;i_Bs*(y_hz6oWhFN?#NsP|2=&ONc_o59FR~{fw&Wdo2-|;}xjm=d z&cyGNV{6CPKnH4UQHk?GQ0WQK^r=J?rIJ|HwpHnl-3?U|3)+9B(wFusm2p9PUxZMp zk{4`2B?=`}B73St08}DPdI40<{51H|{z_oTrp7+pKOPcXktD~eSwf<@7_b0nxF zmT!TqpFK-4bw#X#o?9?^HOhHTVYG2)pI~_PoT6C183I%kZD3-Dppsa=5&~4*b4w)9 z0V?QOyBaaLn_|>r(%|dv66}mOump+VXSz`L##NKuV|!F7|VA( z#)@P4Cgz^DX6pH^xJ@8^8-I53XD`Wq%O76EnSK-%LefV>lE($K%||(drShYk=PG5K z!BTfXq%Q7htE%9a^wx zefFTXeen6=UcA3Up<0hHF@~`;>iW`eUhczvKl}N1uTp`wK4#@3*CNwtap7oe?J{J7 zMko1L)S|QuKEdP9{MjdN{gfym8G2~xb)lr)t@6%YG-vuY{_Nt)H8nNX90hv04E|LU0bbAy8#bo?lJ)2?66Shj!p#A}3dd3r`fNKm$_zv+?#Xf}yxx-q3nY({ zWXX|5m_n1pt3Q(@m-jTw%JQDFgsc)J1VoRM^6xAJA|E1B62Xi4QFpOh=?vT#jmbuG z4()M~EccNkyNZZ3<6fk}jQA1$>sHhSiNM}|u|(oH>qlv2IQ0i0b_lHw6=|>^kpYQ3 zn=#!dUSooMcI!_Ql_;l7c?$AjxCWtU1IBmL@>#T%{0T(gcJ_ zg_5V0i)x7^X$dCz^a@rs8Gwo@G)$gWAuHzTcFyU~$ckCKUi9a1alv|a=%{4-g@&

IwSqfn+I0TmmaH45UN!f&xL7syAs-hqT0YuG2ePjX(%}9~EL${9+irV-_ zxT=j+m!LKZWlDlsh#>9qy;JX2`bMw-Cf$Dh3domhy- zG!_eNONHZlvP!~y1{Fu%$S$V+kaNGZAIR>ZX~Qdoi6e&-#We3;Xa$`9&b%?wS0Ir3{VtEZcvUBcMtYdL@ zN9~_Y=y9&(5q6L8L7d`IMOyWE5H?8h*ka{T&=ikPr;@niLdj#-P107?q*adxVe-H= zxq;TFM^sZh?vgw@OCDau!b~2ui2HbKIN5})T1Xz9BoCM35r8pNeLV;>d9*>? z$73{jV5f&zxID>>SjgvKKgEmiJUn|NYtn*%@2fWb@^Zy{K*Q=Y`AHbkVnFzwBvL)& z!@w`XICTQ24tPWEBpO!JSqJgHV?5Kjb-)dIxqG=@X~Kcl2WVV~?@TE`ilH&a#Kq9p zf_sj_4O6%bjW~sSP^Y_diVfWkCazBRbA_wX-F2>%w|ayo!yG%hADg)O8ty1Nx?Y7_ zb(e;Fl^xxYCazb*J=>113%Ic7$^YnPzX;%D?4*c2;G7gAmOj)?{*T_TOD+*wd%eOEPA?3xsRbSU82Tz)KI4?)JlcQ z&=@LFvvsPec2s*w)cqYasy*zeHj}75bgIW6w~_U`V4>D4I@NC!swV3@5_P*%6W~=l zs#7KEO*+*nc2sXAsyAdT(yX4o4&X*Tog^|it`UK2=pgB7ZfdeN;*1k!dYW6Be7#4H zKZK`S)MH)IQJCaH-F-VAlh&(J?qg^yl&DVyYbN9#A42=gR>Q}l+^6aSglc@c5 zs-x|wo-0wO>Qr5JRQGidY8}

S#x`T%um3Q~f#H#sbeu)VFl1%N43-f%}PyJK~XM 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�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¨3X~<%g6Q2>VZ-|srsyR*<#E%RZ%mg~Y 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 JDDbfY{{@jJ2+jZi diff --git a/Database/tg/fortran/create_HHvtype_file.py b/Database/tg/fortran/create_HHvtype_file.py deleted file mode 100644 index 18e1126..0000000 --- a/Database/tg/fortran/create_HHvtype_file.py +++ /dev/null @@ -1,45 +0,0 @@ -''' -##################################################################################### -CREATE_HHVYTPE_FILE.PY - Craig Heither, rev. 04-15-2021 - - Script reads enumerated household file created by TG (HI_HHENUM_TRIP_OUT.TXT) - and geography correspondence file (GEOG_IN.TXT) to create the file - Database\TG_HHENUM_OUTPUT.TXT required by the non-work vehicle occupancy - procedures. The file has the following fields: - subzone, zone, household type (vehicle definition) - -##################################################################################### -''' -import os -import pandas as pd - -geog_input = os.getcwd() + "\\tg\\fortran\\GEOG_IN.TXT" ### subzone-zone correspondence file -hh_input = os.getcwd() + "\\tg\\fortran\\HI_HHENUM_TRIP_OUT.TXT" ### enumerated HH file -hh_output = os.getcwd() + "\\tg\\fortran\\TG_HHENUM_OUTPUT.TXT" - -if os.path.exists(hh_output): - os.remove(hh_output) - -print("Creating File of Household Types by Subzone ...") - -# ---------------------------------------------------------------------------- -# Read in Geography file. -# ---------------------------------------------------------------------------- -geo=pd.read_csv(geog_input, sep=',', header=None) -geo.columns=['subzone','county','name','state','puma','zone','chicago','cbd','rc','area','cmap'] -geo.drop(columns=['county','name','state','puma','chicago','cbd','rc','area','cmap'], axis=1, inplace=True) ### drop unnecessary columns - -# ---------------------------------------------------------------------------- -# Read in Trip Enumeration file. -# ---------------------------------------------------------------------------- -hh=pd.read_fwf(hh_input, widths=[5,7,4,4], header=None) -hh.columns=['subzone','puma','hhtype','hhvtype'] -hh.drop(columns=['puma','hhtype'], axis=1, inplace=True) ### drop unnecessary columns - -# ---------------------------------------------------------------------------- -# Merge dataframes, sort data and write file. -# ---------------------------------------------------------------------------- -hh1 = hh.merge(geo, how='left', on='subzone', copy=False) -hh1.sort_values(by=['zone', 'subzone'], inplace=True) -hh1.to_csv(hh_output, columns=['subzone','zone','hhvtype'], header=False, index=False) diff --git a/Database/tg/fortran/highinc_workers.csv b/Database/tg/fortran/highinc_workers.csv deleted file mode 100644 index dc147d4..0000000 --- a/Database/tg/fortran/highinc_workers.csv +++ /dev/null @@ -1,4 +0,0 @@ -0.0,0.0,0.0,0.0,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000 -0.0,0.0,0.0,0.0,0.538,0.318,0.217,0.164,0.065,0.061,0.045,0.013,0.013 -0.0,0.0,0.0,0.0,1.000,0.821,0.624,0.589,0.429,0.352,0.288,0.179,0.117 -0.0,0.0,0.0,0.0,1.000,0.953,0.842,0.813,0.836,0.713,0.617,0.545,0.410 diff --git a/Database/trip_gen.bat b/Database/trip_gen.bat index 4c03dbd..59b4bd6 100644 --- a/Database/trip_gen.bat +++ b/Database/trip_gen.bat @@ -198,13 +198,20 @@ if not exist GQ_IN.TXT (goto socec_data_error) if not exist ATTR_IN.TXT (goto socec_data_error) if not exist POPSYN_HH.CSV (goto socec_data_error) -rem Delete old output files. +rem Delete old output files and deprecated files. if exist *OUT.TXT (del *OUT.TXT) if exist *OUTPUT.TXT (del *OUTPUT.TXT) if exist MCHW_HH.TXT (del MCHW_HH.TXT) - -TG_PopSyn.exe -cd ..\scripts +if exist TG_PopSyn.exe (del TG_PopSyn.exe) +if exist TG_INPUT.TXT (del TG_INPUT.TXT) +if exist highinc_workers.csv (del highinc_workers.csv) + +cd ..\.. +@echo ============================================================= +@echo BEGIN CMAP TRIP GENERATION MODEL +@echo ============================================================= +call python trip_generation\trip_generation_model.py +cd tg\scripts echo Creating summary files ... python summarize_tg_results.py %project% %run% @@ -226,8 +233,6 @@ if not exist m01type.csv (goto m01_data_error) cd %~dp0 -python tg\fortran\create_HHvtype_file.py - echo Module 1 finished. echo. echo =================================================================== diff --git a/Database/trip_generation/household_trip_enumeration.py b/Database/trip_generation/household_trip_enumeration.py new file mode 100644 index 0000000..ed7574b --- /dev/null +++ b/Database/trip_generation/household_trip_enumeration.py @@ -0,0 +1,115 @@ +""" +Filename: household_trip_enumeration.py +Author: Craig Heither +Description: This function completes the household trip enumeration process + for trip generation. +""" + +import numpy as np + +def tripEnumeration(starts, ends, selection_array, probability_array, + rng=None, households_chosen=None, replicateMax=3000, + resampleMax=200): + """ + Select travel survey households to attach daily trips to synthetic households. + + Parameters + ---------- + starts : array_like + 0-based inclusive start indices (length N) + ends : array_like + 0-based inclusive end indices (length N) + selection_array : ndarray + 1D array of survey identifiers (length M) + probability_array : ndarray + 1D array of probabilities for each survey (length M) + rng : numpy.random.Generator, optional + NumPy Generator instance for reproducible draws. If None, uses + np.random.default_rng(). + households_chosen : dict, optional + Dictionary to track selected households and their replication counts. + If None, no resampling occurs when thresholds are reached. + replicateMax : int, optional + Maximum times a specific survey household can be matched to synthetic + households before resampling occurs. Default is 3000. + resampleMax : int, optional + Maximum times resampling will occur once replicateMax has been reached. + Default is 200. + + Returns + ------- + ndarray + Integer array (dtype int64) of length N with selected survey identifiers. + """ + # Use provided generator or default + if rng is None: + rng = np.random.default_rng() + + # Read inputs into numpy arrays, + 1 to ends to be inclusive of selection + # Example: array = [1,2,3,4,5,6,7] + # the slice for (1,2,3) is [0:3], slice for (4,5,6,7) is [3:7] + starts = np.asarray(starts, dtype=np.int64) + ends = np.asarray(ends + 1, dtype=np.int64) + selection_array = np.asarray(selection_array).astype(np.int64) + probability_array = np.asarray(probability_array).astype(float) + + # Cumulative probabilities with a leading zero for easy slice arithmetic + cumul_prob = np.concatenate(([0.0], np.cumsum(probability_array))) + + # Compute total mass for each slice + masses = cumul_prob[ends] - cumul_prob[starts] + + # Draw uniform random values within each slice's mass using RNG + u = rng.random(size=masses.shape) * masses + cumul_prob[starts] + # Map cumulative draws to travel survey household index + idx = np.searchsorted(cumul_prob, u, side='right') - 1 + selected_households = selection_array[idx].astype(np.int64) + + # Place current selections into output + keep_output = selected_households + + # Update counts and resample if threshold reached + if households_chosen is not None: + for survey_id in selected_households: + households_chosen[survey_id] = households_chosen.get(survey_id, 0) + 1 + ### households_chosen[survey_id] += 1 + + # Identify households needing resample + needs_resample = np.array( + [households_chosen.get(int(survey_id), 0) > replicateMax for + survey_id in selected_households], dtype=bool, + ) + if np.any(needs_resample): + # Iterate only on houseohlds above threshold + for i, need in enumerate(needs_resample): + if not need: + continue + + start_i = int(starts[i]) + end_i = int(ends[i]) + choices = selection_array[start_i : end_i] + probs = probability_array[start_i : end_i] + total_p = np.nansum(probs) + + if not np.isfinite(total_p) or total_p <= 0: + # Uniform if invalid probabilities + new_sel = int(rng.choice(choices)) + else: + probs = probs / total_p + new_sel = int(selected_households[i]) # default to current + for _ in range(resampleMax): + candidate = int(rng.choice(choices, p=probs)) + if households_chosen.get(candidate, 0) < replicateMax: + # Roll back previous count of selected[i] + households_chosen[int(selected_households[i])] -= 1 + # Use the candidate and increment its count + new_sel = candidate + households_chosen[new_sel] = households_chosen.get(new_sel, 0) + 1 + break + # If we never found below-threshold, keep the last selection (new_sel) + selected_households[i] = new_sel + + # Write back selections to out for the resampled subset + keep_output = selected_households + + return keep_output.astype(np.int64) \ No newline at end of file diff --git a/Database/trip_generation/trip_generation.yaml b/Database/trip_generation/trip_generation.yaml new file mode 100644 index 0000000..738087e --- /dev/null +++ b/Database/trip_generation/trip_generation.yaml @@ -0,0 +1,39 @@ +## -- Name identifying the model run +rtpVersion: '2026 LRTP' +## -- Number of trip generation subzones in the modeling area +subzones: 17418 +## -- Number of Census 2010 five percent sample PUMAs in the modeling area +puma5: 74 +## -- Zones used for trip distribution, mode choice, and assignment +## -- (excluding Points of entry) +zones: 3632 +## -- Number of counties in the modeling area +counties: 21 +## -- Maximum value used by the vehicle availability submodel for subzone +## -- sidewalk density (miles of sidewalk per square mile) +sidewalkMaxDensity: 40.0 +## -- Regional median household income, in 2019 dollars +incomeRegMed: 72800 +## -- Seed for random number generator +randomSeed: 211 +## -- Maximum times a specific survey household can be matched to synthetic +## -- households before resampling occurs +replicateMax: 1900 +## -- Maximum times resampling will occur once replicateMax has been reached +resampleMax: 100 +## -- Group quarters trip information +### --- Workers per person by GQ type +militaryWorkersPerPerson: 1.00 +univWorkersPerPerson: 0.385 +other1664WorkersPerPerson: 0.306 +other65WorkersPerPerson: 0.12 +### --- Person work trip rates by GQ type +militaryWorkTrips: 2.00 +univWorkTrips: 0.77 +other1664WorkTrips: 0.612 +other65WorkTrips: 0.24 +## -- Flag to write optional files (HI_HHENUM_TRIP_OUT.CSV, PRODS_HH_OUT.CSV, +## -- PRODS_GQ_OUT.CSV, FIRST_PA_OUT.CSV, EXTERNAL_PA_OUT.CSV). These are +## -- useful for debugging and model validation, but are not required for +## -- production model runs. +writeOptionalFiles: False diff --git a/Database/trip_generation/trip_generation_model.py b/Database/trip_generation/trip_generation_model.py new file mode 100644 index 0000000..9bda35c --- /dev/null +++ b/Database/trip_generation/trip_generation_model.py @@ -0,0 +1,987 @@ +""" +Filename: trip_generation_model.py +Author: Craig Heither +Description: This is the Python translation of CMAP's Trip Generation model, + originally written by Ronald W. Eash. It creates the subzone- + level trip productions and attractions by trip type used in the + trip-based model. Trip generation has seven major steps: + 1. Load the input files + 2. Run the vehicle availability model to estimate the number + of vehicles for each synthetic household + 3. Run the household trip enumeration process to create + productions for each synthetic household + 4. Calculate non-institutional group quarters trip productions + 5. Allocate trip productions and attractions for non-home trip + ends + 6. Factor external home-based productions and attractions + 7. Finalize productions and attractions +Input files: + - POPSYN_HH.CSV: contains information about each synthetic household + - GEOG_IN.TXT: defines various geographies for each zone and subzone + - HH_IN.TXT: contains subzone totals of household and person level attributes + - HH_WFH_STATUS.CSV: contains the telework status for each synthetic household + - tg_hhvtype_lookup.csv: defines the attributes in household vehicle type categories + - HHID_choices1.csv: defines the range of survey households available for trip + enumeration for non-telework households based on synthetic household attributes + - HHID_choices2.csv: lists the survey households in each group defined in HHID_choices1.csv + - HHID_wfh1.csv: defines the range of survey households available for trip + enumeration for telework households based on synthetic household attributes + - HHID_wfh2.csv: lists the survey households in each group defined in HHID_wfh1.csv + - HI_HHENUM_IN.TXT: contains travel survey households including the number of weekday + household trips by purpose + - GQ_IN.TXT: contains the number of workers and nonworking adults in non-institutionalized + group quarters for each subzone + - GQ_TRIPRATES.csv: contains group quarters trip rates for non-work trips developed from + the household travel survey + - airport_sz.csv: contains subzones representing airports + - SCHOOL_IN.CSV: lists high school and college enrollment values for subzones containing + these institutions + - ATTR_IN.TXT: contains subzone-level employment information + - coefficients_attractions.csv: contains the trip type coefficients used to allocate + attractions + - coefficients_nonhome_productions.csv: contains the trip type coefficients used to + allocate non-home productions + - EXT_IN.TXT: PUMA-level adjustment factors to modify workplace trips from internal + households to external workplaces and vice-versa +Output files: + - SIMULATED_HHVEH.TXT: stores the category of simulated vehicles available for each + household following the vehicle availability model + - TRIP49_PA_OUT.TXT: contains subzone-level productions and attractions by trip type + for non-telework households + - TRIP49_PA_WFH_OUT.TXT: contains subzone-level productions and attractions by trip type + for telework households + - TG_HHENUM_OUTPUT.TXT: lists the subzone, zone and household vehicle type of each + enumerated household + - households_selected_noWFH_enumeration_count.csv: lists the number of times each survey + household was selected during trip enumeration for non-telework households + - households_selected_WFH_enumeration_count.csv: lists the number of times each survey + household was selected during trip enumeration for telework households + - trip_generation_model_log.txt: trip generation model log file + - HI_HHENUM_TRIP_OUT.CSV (optional): contains the number of trips by type for each + synthetic household + - PRODS_HH_OUT.CSV (optional): contains a subzone-level summary of trip productions + by trip type within four categories of households + - PRODS_GQ_OUT.CSV (optional): contains a subzone-level summary of trip productions for + workers and nonworking adults within each group quarters resident category + - FIRST_PA_OUT.CSV (optional): contains preliminary subzone-level productions and + attractions by trip type prior to external adjustments + - EXTERNAL_PA_OUT.CSV (optional): contains subzone-level external productions and + attractions by trip type +""" + +# ---------------------------------------------------------------------------- +# Import packages, set paths and variables. +# ---------------------------------------------------------------------------- +import os +import pandas as pd +import numpy as np +from pathlib import Path +import numexpr as ne +import yaml +import timeit +import logging +import vehicle_availability as veh +import household_trip_enumeration as enumer + +t_alpha = timeit.default_timer() + +# Input Files +baseDir = Path(__file__).resolve().parents[1] +fileDir = Path(__file__).resolve().parents[1].joinpath('tg', 'fortran') +yamlDir = Path(__file__).resolve().parent +configDir = Path(__file__).resolve().parents[2].joinpath('Scripts', + 'prepare', + 'conformity_scenario', + 'hand') +popSynFile = fileDir / 'POPSYN_HH.CSV' +geoFile = fileDir / 'GEOG_IN.TXT' +szAttributesFile = fileDir / 'HH_IN.TXT' +wfhFile = fileDir / 'HH_WFH_STATUS.CSV' +hhvtypeFile = fileDir / 'tg_hhvtype_lookup.csv' +enumerateNoWfhDataFile1 = fileDir / 'HHID_choices1.csv' +enumerateNoWfhDataFile2 = fileDir / 'HHID_choices2.csv' +enumerateWfhDataFile1 = fileDir / 'HHID_wfh1.csv' +enumerateWfhDataFile2 = fileDir / 'HHID_wfh2.csv' +travelSurveyFile = fileDir / 'HI_HHENUM_IN.TXT' +groupQuartersFile = fileDir / 'GQ_IN.TXT' +groupQuartersTripsFile = fileDir / 'GQ_TRIPRATES.csv' +airportFile = fileDir / 'airport_sz.csv' +enrollmentFile = fileDir / 'SCHOOL_IN.CSV' +attractionsFile = fileDir / 'ATTR_IN.TXT' +coeffsAttractFile = fileDir / 'coefficients_attractions.csv' +coeffsProdsFile = fileDir / 'coefficients_nonhome_productions.csv' +externalShares = fileDir / 'EXT_IN.TXT' +yamlBatchin = baseDir / 'batch_file.yaml' +yamlTg = yamlDir / 'trip_generation.yaml' +yamlConfig = configDir / 'config.yaml' + +# Output Files +simVehicles = fileDir / 'SIMULATED_HHVEH.TXT' +nowfhEnumCount = fileDir / 'households_selected_noWFH_enumeration_count.csv' +wfhEnumCount = fileDir / 'households_selected_WFH_enumeration_count.csv' +finalProdsAttrs = fileDir / 'TRIP49_PA_OUT.TXT' +finalWfhProdsAttrs = fileDir / 'TRIP49_PA_WFH_OUT.TXT' +logFile = fileDir / 'trip_generation_model_log.txt' +hhVehtypeFile = fileDir / 'TG_HHENUM_OUTPUT.TXT' +syntheticHHTrips = fileDir / 'HI_HHENUM_TRIP_OUT.CSV' +householdProductions = fileDir / 'PRODS_HH_OUT.CSV' +groupQuartersProductions = fileDir / 'PRODS_GQ_OUT.CSV' +firstProdsAttrs = fileDir / 'FIRST_PA_OUT.CSV' +extrnlProdsAttrs = fileDir / 'EXTERNAL_PA_OUT.CSV' + +for fl1 in [syntheticHHTrips, householdProductions, groupQuartersProductions, + firstProdsAttrs, extrnlProdsAttrs]: + if os.path.exists(fl1): + os.remove(fl1) + +# Configure the logging +handlers = [logging.FileHandler(logFile, mode='w'), + logging.StreamHandler()] +logging.basicConfig(level=logging.DEBUG, handlers = handlers, + format='%(asctime)s - %(levelname)s - %(message)s') +logger = logging.getLogger() + +# Read configuration file attributes +with open(yamlTg, 'r') as file: + tgConfig = yaml.safe_load(file) + +with open(yamlBatchin, 'r') as file: + batchConfig = yaml.safe_load(file) + +with open(yamlConfig, 'r') as file: + config = yaml.safe_load(file) + +# Create a NumPy Generator seeded from config to pass to functions +rng = np.random.default_rng(tgConfig['randomSeed']) +# Model version +modelVersion = tgConfig['rtpVersion'] +# Set maximum sidewalk density value +sidewalkMax = float(tgConfig['sidewalkMaxDensity']) +# Set threshold for enumeration replicates to trigger resampling +replicateMax = int(tgConfig['replicateMax']) +# Set replicate resampling maximum +resampleMax = int(tgConfig['resampleMax']) +# Get regional median household income +regionalMedianIncome = int(tgConfig['incomeRegMed']) +# Get military group quarters workers per person +militaryWorkers = float(tgConfig['militaryWorkersPerPerson']) +# Get dormitory group quarters workers per person +univWorkers = float(tgConfig['univWorkersPerPerson']) +# Get other 16-64 group quarters workers per person +other1664Workers = float(tgConfig['other1664WorkersPerPerson']) +# Get other 65+ group quarters workers per person +other65Workers = float(tgConfig['other65WorkersPerPerson']) +# Get military group quarters worker trip rates +militaryWorkTrips = float(tgConfig['militaryWorkTrips']) +# Get dormitory group quarters worker trip ratesn +univWorkTrips = float(tgConfig['univWorkTrips']) +# Get other 16-64 group quarters worker trip rates +other1664WorkTrips = float(tgConfig['other1664WorkTrips']) +# Get other 65+ group quarters worker trip rates +other65WorkTrips = float(tgConfig['other65WorkTrips']) +# Write optional files +writeOptional = bool(tgConfig['writeOptionalFiles']) + +scen_code = batchConfig['scenario_code'] +real_year = int(config['scenario_years'][scen_code]) + +pdVersion = pd.__version__ +if float(pdVersion[:3]) >= 1.5: + pdEngine = 'pyarrow' +else: + pdEngine = 'c' + +# ---------------------------------------------------------------------------- +# Functions. +# ---------------------------------------------------------------------------- +def run_formula(df): + """ + Evaluate weight formulas from a DataFrame column using numexpr to calculate + non-home trip production weights or trip allocation weights. + + For each unique formula in the 'weight_formula' column, evaluates the + formula expression using numexpr on the subset of rows with that formula. + Results are aggregated into a single output array. + + Parameters + ---------- + df : DataFrame + Input DataFrame containing a 'weight_formula' column with formula + expressions and numeric columns referenced in those formulas. + + Returns + ------- + ndarray + Numeric array (float64) of evaluated results with length equal to + the number of rows in df. NaN values are returned for rows where + formula evaluation fails. + """ + result = np.zeros(len(df)) + for formula in df['weight_formula'].unique(): + mask = df['weight_formula'] == formula + subset = df[mask] + # Filter the data to only needed columns for this formula + local_dict = {col: subset[col].values for col in df.columns} + try: + result[mask.values] = ne.evaluate(formula, local_dict) + except Exception as e: + logging.error(f"Error evaluating formula '{formula}': {e}") + result[mask.values] = np.nan + return result + +def fixed_width(outfile, df): + """ + Write DataFrame to fixed-width format file. + + Extracts specified columns from the input DataFrame and writes them + to a file with right-justified fields of fixed widths. Suitable for + output compatibility with legacy fixed-format data files. + + Parameters + ---------- + outfile : str or Path + Path where the fixed-width file will be written. + df : DataFrame + Input DataFrame containing at least the columns: 'subzone', 'zone', + 'trip_type', 'sz_prods', 'sz_attrs'. + + Returns + ------- + None + Writes data directly to outfile. + + Notes + ----- + Field widths are: subzone (6), zone (6), trip_type (2), sz_prods (9), + sz_attrs (9). All numeric values are right-justified. sz_prods and + sz_attrs are formatted with 1 decimal place. + """ + data = df[['subzone', 'zone', 'trip_type', 'sz_prods', 'sz_attrs']].values + with open(outfile, 'w') as f: + for row in data: + # write right-justified fields of specified width + f.write('{:>6.0f}{:>6.0f}{:>2.0f}{:>9.1f}{:>9.1f}\n'.format(*row)) + +# ---------------------------------------------------------------------------- +# Step 1. Load data files and prepare data. +# ---------------------------------------------------------------------------- +logging.info("Beginning CMAP Trip Generation model: {0} Scenario {1}" + .format(modelVersion, batchConfig['scenario_code'])) +logging.info("Loading data files") + +# Load synthetic households +popSynCols = ['subzone','hh_type','vehicles','serial_number','state_puma', + 'row_column','adults','workers','children','income_category', + 'age_category','hh_veh_type','income'] +popSynDrop = ['vehicles','hh_veh_type'] +hh = pd.read_csv(popSynFile, names=popSynCols, dtype='Int64', engine=pdEngine) +hh['household_record'] = hh.index + 1 +hh.drop(popSynDrop, axis=1, inplace=True) +numberHouseholds = len(hh) + +# Load geography file +geogCols = ['subzone','county','county_name','state','puma','zone','chicago', + 'cbd','row_column','area','cmap'] +geogDrop = ['state','puma','row_column','state_puma'] +geog = pd.read_csv(geoFile, names=geogCols, engine=pdEngine) +geog.loc[geog.state.eq('IL'), 'state_puma'] = 1700000 + geog['puma'] +geog.loc[geog.state.eq('IN'), 'state_puma'] = 1800000 + geog['puma'] +geog.loc[geog.state.eq('WI'), 'state_puma'] = 5500000 + geog['puma'] +pumas = geog[['subzone','state_puma']].copy().reset_index(drop=True) +geog.drop(geogDrop, axis=1, inplace=True) + +# Load subzone summary data file +szCols = ['subzone','households','adults','workers','children', + 'income_category1','income_category2','income_category3', + 'income_category4','age_category1','age_category2','age_category3', + 'auto_commute_share','sidewalk_density'] +szDrop = ['adults','workers','children','income_category1', + 'income_category2','income_category3','income_category4', + 'age_category1','age_category2','age_category3'] +sz = pd.read_csv(szAttributesFile, names=szCols, engine=pdEngine) +totalHHs = sz['households'].sum() +sz.drop(szDrop, axis=1, inplace=True) + +# Load household work from home flag file +wfhCols = ['serial_number','wfh_flag','number_WFH_workers','tc14_not_working'] +wfhDrop = ['number_WFH_workers','tc14_not_working'] +wfh = pd.read_csv(wfhFile, names=wfhCols, engine=pdEngine) +wfh['household_record'] = wfh.index + 1 +wfh['wfh_flag'] = wfh['wfh_flag'].clip(upper=1) +wfh.drop(wfhDrop, axis=1, inplace=True) + +# Load household vehicle type category file +hhvtype = pd.read_csv(hhvtypeFile, dtype='Int64', engine=pdEngine) +hhvtype.rename(columns={'ADULT': 'adults', 'WORKER': 'workers', 'CHILD': + 'children', 'VEH': 'vehicles', 'AGE_INDEX': + 'age_category', 'HHVTYPE': 'hh_veh_type'}, + inplace=True) + +# Load trip enumeration data for non-Work From Home households +# This identifies the set of survey households that will be sampled +enumNoWfhData1Cols = ['state_puma','hh_veh_type','match_category', + 'choice_start','choice_end'] +enumData1 = pd.read_csv(enumerateNoWfhDataFile1, names=enumNoWfhData1Cols, + dtype='Int64', engine=pdEngine) + +# Load trip enumeration choices data for non-Work From Home households +# This identifies the survey household numbers and probability of selection +enumNoWfhData2Cols = ['survey_number','cumul_probability'] +enumData2 = pd.read_csv(enumerateNoWfhDataFile2, names=enumNoWfhData2Cols, + engine=pdEngine) + +# Load trip enumeration data for Work From Home households +# This identifies the set of survey households that will be sampled +enumWfhData1Cols = ['state_puma','hh_type','match_category','choice_start', + 'choice_end'] +enumWfhData1 = pd.read_csv(enumerateWfhDataFile1, names=enumWfhData1Cols, + dtype='Int64', engine=pdEngine) + +# Load trip enumeration choices data for Work From Home households +# This identifies the survey household numbers and probability of selection +enumWfhData2 = pd.read_csv(enumerateWfhDataFile2, names=enumNoWfhData2Cols, + engine=pdEngine) + +# convert enumeration selection boundaries from FORTRAN index to Python index +# (1-based to 0-based) +enumData1['choice_start'] = enumData1['choice_start'] - 1 +enumWfhData1['choice_start'] = enumWfhData1['choice_start'] - 1 +enumData1['choice_end'] = enumData1['choice_end'] - 1 +enumWfhData1['choice_end'] = enumWfhData1['choice_end'] - 1 + +# Convert Lee County state_puma to match GEOG_IN.TXT values, if needed +enumData1.loc[enumData1['state_puma'] == 1700104, 'state_puma'] = 1717104 +enumWfhData1.loc[enumWfhData1['state_puma'] == 1700104, 'state_puma'] = 1717104 + +# Convert from cumulative probability to individual probabilities +enumData2['p'] = enumData2['cumul_probability'].shift(1).fillna(0) +enumData2['probability'] = np.where(enumData2['p'] < 1, + enumData2['cumul_probability'] + - enumData2['p'], + enumData2['cumul_probability']) +enumWfhData2['p'] = enumWfhData2['cumul_probability'].shift(1).fillna(0) +enumWfhData2['probability'] = np.where(enumWfhData2['p'] < 1, + enumWfhData2['cumul_probability'] + - enumWfhData2['p'], + enumWfhData2['cumul_probability']) + +# Load file of household travel survey data +surveyCols = ['state_puma','hh_veh_type','survey_number','adults_survey', + 'workers_survey','nonworkers_survey','children_survey', + 'children12-15_survey','vehicles_survey'] +for i in range(1,50): + fieldName = f"trips{i}" + surveyCols.append(fieldName) +surveyDrop = ['state_puma','hh_veh_type','adults_survey','workers_survey', + 'nonworkers_survey','children_survey','children12-15_survey', + 'vehicles_survey'] +surveyHouseholds = pd.read_csv(travelSurveyFile, names=surveyCols, + engine=pdEngine) +surveyHouseholds.drop(surveyDrop, axis=1, inplace=True) + +# Load file of group quarters residents +gqCols = ['subzone','military','college','other16-64','other65'] +gq = pd.read_csv(groupQuartersFile, names=gqCols, dtype='Int64', + engine=pdEngine) +groupQuarters = pd.melt(gq, id_vars='subzone', var_name='gq_type', + value_name='gq_persons') +groupQuarters['gq_persons'] = groupQuarters['gq_persons'].astype(int) +numberGqHousholds = groupQuarters['gq_persons'].sum() + +# Load file of group quarters trip rates 3-33, add trip type 1 placeholder +gqTripRates = pd.read_csv(groupQuartersTripsFile, names=['trip_type', + 'trip_production_rate'], + engine=pdEngine) +new_row = {'trip_type': 1, 'trip_production_rate': 0.0} +gqTripRates.loc[len(gqTripRates)] = new_row +gqTripRates.sort_values('trip_type', inplace=True) + +# Load airport subzone file +airports = pd.read_csv(airportFile, usecols=['subzone','year_open'], + engine=pdEngine) +airports['notairport_flag'] = np.where(real_year >= airports['year_open'], 0, 1) +airports.drop('year_open', axis=1, inplace=True) + +# Load subzone high school and college enrollment file +schools = pd.read_csv(enrollmentFile, names=['subzone','enrollment'], + engine=pdEngine) + +# Load subzone attractions file +attrCols = ['subzone','retail_employment','total_employment', + 'high_earner_share'] +attractions = pd.read_csv(attractionsFile, names=attrCols, engine=pdEngine) +attractions['high_earner_share'] = attractions['high_earner_share'].round(3) +attractions['nonretail_employment'] = (attractions['total_employment'] + - attractions['retail_employment']) +attractions['low_earner_share'] = (1.0 - attractions['high_earner_share'] + ).round(3) + +# Load file of coefficients for attractions allocation +coeffsAttr = pd.read_csv(coeffsAttractFile) + +# Load file of coefficients for nonhome productions allocation +coeffsProd = pd.read_csv(coeffsProdsFile) + +# Load file of external home-workplace production and attraction shares +extCols = ['state_puma','ext_prod_factor','ext_attr_factor'] +extrnShare = pd.read_csv(externalShares, names=extCols, engine=pdEngine) +# Convert Lee County state_puma to match GEOG_IN.TXT values, if needed +extrnShare.loc[extrnShare['state_puma'] == 1700104, 'state_puma'] = 1717104 + +# Attach data to synthetic households +hh = hh.merge(geog, how='left', on='subzone', copy=False) +hh = hh.merge(sz, how='left', on='subzone', copy=False) +hh = hh.merge(wfh, how='left', on=['household_record','serial_number'], + copy=False) + +# Prepare variables +# Set household category attributes to maximum values for HHTYPE and HHVTYPE +hh['adults'] = hh['adults'].clip(upper=4) +hh['workers'] = hh['workers'].clip(upper=3) +hh['children'] = hh['children'].clip(upper=3) +hh['nonworkers'] = hh['adults'] - hh['workers'] +# Set sidewalk density to maximum subzone value +hh['sidewalk_density'] = hh['sidewalk_density'].clip(upper=sidewalkMax) + +# ---------------------------------------------------------------------------- +# Verify values are within acceptable ranges. +# ---------------------------------------------------------------------------- +assert totalHHs == len(hh), "Number of households is not consistent" +assert hh['adults'].min() == 1, "Minimum number of adults for HHTYPE is " \ + "below 1" +assert hh['adults'].max() == 4, "Maximum number of adults for HHTYPE is not 4" +assert hh['workers'].min() == 0, "Minimum number of workers for HHTYPE is" \ + "not 0" +assert hh['workers'].max() == 3, "Maximum number of workers for HHTYPE is " \ + "not 3" +assert hh['children'].min() == 0, "Minimum number of children for HHTYPE is" \ + "not 0" +assert hh['children'].max() == 3, "Maximum number of children for HHTYPE is" \ + "not 3" +assert hh['age_category'].min() == 1, "Minimum age of head of householder " \ + "category for HHTYPE is not 1" +assert hh['age_category'].max() == 3, "Maximum age of head of householder" \ + "category for HHTYPE is not 3" +assert hh['income_category'].min() == 1, "Minimum income category for HHTYPE" \ + "is not 1" +assert hh['income_category'].max() == 4, "Maximum income category for HHTYPE" \ + "is not 4" +assert hh['sidewalk_density'].max() == tgConfig['sidewalkMaxDensity'], "Maximum" \ + "sidewalk density does not match yaml file " \ + "parameter" +assert hh['nonworkers'].min() == 0, "Minimum number of nonworkers is not 0" +assert hh['wfh_flag'].min() == 0, "Minimum WFH flag is not 0" +assert hh['wfh_flag'].max() == 1, "Maximum WFH flag is not 1" +logging.info(' -- Number of households to process: {0:,}'.format(len(hh))) + +# ---------------------------------------------------------------------------- +# Step 2. Run the vehicle availability model for each household. +# ---------------------------------------------------------------------------- +logging.info("Running the Vehicle Availability model") + +# Separate households by number of adults to apply the appropriate model +adult1 = hh[hh.adults.eq(1)].copy().reset_index() +adult2 = hh[hh.adults.eq(2)].copy().reset_index() +adult3 = hh[hh.adults.gt(2)].copy().reset_index() + +# Apply vehicle availability model +adult1['vehicles'] = veh.vehOwnOneAdult(adult1[['sidewalk_density', + 'row_column', 'age_category', + 'workers', 'income_category', + 'auto_commute_share'] + ].to_numpy(), rng=rng + ).astype(int) +adult2['vehicles'] = veh.vehOwnTwoAdult(adult2[['sidewalk_density', + 'row_column', 'age_category', + 'workers', 'income_category', + 'auto_commute_share', + 'children']].to_numpy(), + rng=rng).astype(int) +adult3['vehicles'] = veh.vehOwnThreeAdult(adult3[['sidewalk_density', + 'row_column', 'age_category', + 'workers', 'income_category', + 'auto_commute_share', + 'nonworkers']].to_numpy(), + rng=rng).astype(int) + +# Re-combine the households and write simulated vehicles file +hh = pd.concat([adult1, adult2, adult3], ignore_index=True, sort=False) +hh.sort_values('household_record', inplace=True) +logging.info(' - 0-vehicle households: {0:>10,}'.format((hh['vehicles'] + == 0).sum())) +logging.info(' - 1-vehicle households: {0:>10,}'.format((hh['vehicles'] + == 1).sum())) +logging.info(' - 2-vehicle households: {0:>10,}'.format((hh['vehicles'] + == 2).sum())) +logging.info(' - 3+-vehicle households: {0:>9,}'.format((hh['vehicles'] + == 3).sum())) +logging.info(' --> Writing {0:,} records to {1}'.format(len(hh), + Path(simVehicles).name)) +hh.to_csv(simVehicles, columns=['serial_number','vehicles', + 'household_record'], index=False) + +# Apply household vehicle type category (HHVTYPE) +hh = hh.merge(hhvtype, how='left', on=['adults','workers','children', + 'vehicles','age_category'], + copy=False) +assert hh['vehicles'].min() == 0, "Minimum household vehicles is not 0" +assert hh['vehicles'].max() < 4, "Maximum household vehicles is not within " \ + "range" +assert hh['hh_veh_type'].min() > 0, "Minimum household vehicle type code " \ + "is not greater than 0" +assert hh['hh_veh_type'].max() < 625, "Maximum household vehicle type code " \ + "is not within range" + +# Write household vehicle type file +veh = hh[['subzone','zone','hh_veh_type']].reset_index(drop=True) +veh.sort_values(by=['zone', 'subzone'], inplace=True) +logging.info(' --> Writing {0:,} records to {1}'.format( + len(veh), Path(hhVehtypeFile).name)) +veh.to_csv(hhVehtypeFile, header=False, index=False) + +# ---------------------------------------------------------------------------- +# Step 3. Run the household trip enumeration process. +# ---------------------------------------------------------------------------- +logging.info('Running the Household Trip Enumeration Process') +logging.info(' -- Non-Work From Home households') +logging.info(' -- Preparing the data') + +# Attach trip enumeration data to households +nowfh = hh[hh.wfh_flag.eq(0)].reset_index(drop=True) +nowfh = nowfh.merge(enumData1, how='left', on=['state_puma','hh_veh_type'], + copy=False) +assert nowfh.isnull().any().sum() == 0, "Non-work from home data have" \ + "missing values" +# Create data arrays +selection_array = enumData2['survey_number'].to_numpy().astype(np.int64) +probability_array = enumData2['probability'].to_numpy() + +# Create a dictionary of survey household ids to track how many times each is +# selected during the trip enumeration process +households_chosen = {key: 0 for key in enumData2['survey_number'].unique()} + +# Implement household trip enumeration +logging.info(' -- Running trip enumeration') +nowfh['survey_number'] = enumer.tripEnumeration( + nowfh['choice_start'].to_numpy(), + nowfh['choice_end'].to_numpy(), + selection_array, + probability_array, + rng=rng, + households_chosen=households_chosen, + replicateMax=replicateMax, + resampleMax=resampleMax +) + +assert nowfh['survey_number'].min() >= enumData2['survey_number'].min(), \ + "Invalid non-work from home survey household selected during enumeration" +assert nowfh['survey_number'].max() <= enumData2['survey_number'].max(), \ + "Invalid non-work from home survey household selected during enumeration" + +# Output dictionary of households selected during trip enumeration +dictList = [[key, value] for key, value in households_chosen.items()] +nowfhCount = pd.DataFrame(dictList, columns=['survey_household', + 'selection_count']) +nowfhCount.sort_values(['selection_count'], ascending=False, inplace=True) +nowfhCount.to_csv(nowfhEnumCount, index=False) +# ---------------------------------------------------------------------------- +logging.info(' -- Work From Home households') +logging.info(' -- Preparing the data') + +# Attach trip enumeration data to households +wfh = hh[hh.wfh_flag.eq(1)].reset_index(drop=True) +wfh = wfh.merge(enumWfhData1, how='left', on=['state_puma','hh_type'], + copy=False) +assert wfh.isnull().any().sum() == 0, "Work from home data have" \ + "missing values" +# Create data arrays +selection_array = enumWfhData2['survey_number'].to_numpy() +probability_array = enumWfhData2['probability'].to_numpy() + +# Create a dictionary of survey household ids to track selections +wfh_households_chosen = {key: 0 for key in enumWfhData2['survey_number']. + unique()} + +# Implement household trip enumeration +logging.info(' -- Running trip enumeration') +wfh['survey_number'] = enumer.tripEnumeration( + wfh['choice_start'].to_numpy(), + wfh['choice_end'].to_numpy(), + selection_array, + probability_array, + rng=rng, + households_chosen=wfh_households_chosen, + replicateMax=replicateMax, + resampleMax=resampleMax +) +assert wfh['survey_number'].min() >= enumWfhData2['survey_number'].min(), \ + "Invalid work from home survey household selected during enumeration" +assert wfh['survey_number'].max() <= enumWfhData2['survey_number'].max(), \ + "Invalid work from home survey household selected during enumeration" + +# Output dictionary of households selected during trip enumeration +dictList = [[key, value] for key, value in wfh_households_chosen.items()] +wfhCount = pd.DataFrame(dictList, columns=['survey_household', + 'selection_count']) +wfhCount.sort_values(['selection_count'], ascending=False, inplace=True) +wfhCount.to_csv(wfhEnumCount, index=False) + +# recombine the household data +households = pd.concat([nowfh, wfh], ignore_index=True, sort=False) +households.sort_values('household_record', inplace=True) + +# split out fields for HI_HHENUM_TRIP_OUT.CSV +housholds_out = households[['household_record', 'subzone', 'survey_number', + 'state_puma', 'hh_type', 'hh_veh_type', + 'vehicles', 'row_column', 'serial_number', + 'match_category', 'wfh_flag', 'income', + 'children']].copy().reset_index(drop=True) +householdEnum = housholds_out.merge(surveyHouseholds, how='left', + on='survey_number', copy=True + ).reset_index(drop=True) + +# Redefine work trips for high income households +householdEnum['trips2'] = np.where(householdEnum['income'] >= regionalMedianIncome, + householdEnum['trips1'], + 0) +householdEnum['trips1'] = np.where(householdEnum['income'] >= regionalMedianIncome, + 0, + householdEnum['trips1']) +householdEnum.sort_values('household_record', inplace=True) + +if writeOptional: + logging.info(' --> Writing {0:,} records to {1}'.format( + len(householdEnum), Path(syntheticHHTrips).name)) + householdEnum.to_csv(syntheticHHTrips, index=False) + +# prepare data for PRODS_HH_OUT.CSV +# Summarize household productions by subzone, trip type and four household +# categories: +# 1 = 0 children and 0 vehicles +# 2 = 1 or more children and 0 vehicles +# 3 = 0 children and 1 or more vehicles +# 4 = 1 or more children and 1 or more vehicles +householdEnum.loc[householdEnum.children.eq(0) & householdEnum.vehicles.eq(0), + 'household_category'] = 1 +householdEnum.loc[householdEnum.children.ge(1) & householdEnum.vehicles.eq(0), + 'household_category'] = 2 +householdEnum.loc[householdEnum.children.eq(0) & householdEnum.vehicles.ge(1), + 'household_category'] = 3 +householdEnum.loc[householdEnum.children.ge(1) & householdEnum.vehicles.ge(1), + 'household_category'] = 4 +dropCols = ['children','vehicles','survey_number','household_record', + 'state_puma','hh_type','hh_veh_type','vehicles', 'row_column', + 'serial_number', 'match_category', 'income'] +householdEnum.drop(dropCols, axis=1, inplace=True) +hhProds = pd.melt(householdEnum, id_vars=['subzone','wfh_flag', + 'household_category'], + var_name='trip_type', + value_name='productions') +prods = hhProds.groupby(['subzone','wfh_flag','household_category', + 'trip_type']).agg({'productions': 'sum'} + ).reset_index() +prods['trip_type'] = prods['trip_type'].str.replace('trips', '', + regex=False).astype(int) +prods.sort_values(['subzone','wfh_flag','household_category','trip_type'], + inplace=True) + +if writeOptional: + logging.info(' --> Writing {0:,} records to {1}'.format( + len(prods), Path(householdProductions).name)) + prods.to_csv(householdProductions, index=False) + +# Prepare household data for production and attraction allocations +# Summarize household productions by trip type, subzone and WFH flag +# Summarize household productions by trip type and WFH flag +householdTrips = prods.groupby(['subzone','trip_type','wfh_flag']).agg({ + 'productions': 'sum'}).reset_index() +householdTrips.rename(columns={'productions':'hh_productions'}, + inplace=True) +tripWfh = prods.groupby(['trip_type','wfh_flag']).agg({'productions': 'sum'} + ).reset_index() +tripWfh.rename(columns={'productions':'trip_hh_productions'}, inplace=True) + +# ---------------------------------------------------------------------------- +# Step 4. Calculate group quarters trip productions +# ---------------------------------------------------------------------------- +logging.info('Calculating Group Quarters Trip Productions') + +# Determine workers and nonworkers +groupQuarters['workers'] = 0.0 +groupQuarters.loc[groupQuarters.gq_type.eq('military'), 'workers'] = ( + groupQuarters['gq_persons'] * militaryWorkers) +groupQuarters.loc[groupQuarters.gq_type.eq('college'), 'workers'] = ( + groupQuarters['gq_persons'] * univWorkers) +groupQuarters.loc[groupQuarters.gq_type.eq('other16-64'), 'workers'] = ( + groupQuarters['gq_persons'] * other1664Workers) +groupQuarters.loc[groupQuarters.gq_type.eq('other65'), 'workers'] = ( + groupQuarters['gq_persons'] * other65Workers) +groupQuarters['workers'] = groupQuarters['workers'].round(3) +groupQuarters['nonworkers'] = 0.0 +groupQuarters['nonworkers'] = (groupQuarters['gq_persons'] + - groupQuarters['workers']).round(3) +groupQuarters = groupQuarters.merge(gqTripRates, how='cross', copy=False) + +# Calculate Worker trip productions +# 1 - Home-work low income household +groupQuarters.loc[groupQuarters.gq_type.eq('military') & + groupQuarters.trip_type.eq(1), 'productions'] = ( + groupQuarters['workers'] * militaryWorkTrips) +groupQuarters.loc[groupQuarters.gq_type.eq('college') & + groupQuarters.trip_type.eq(1), 'productions'] = ( + groupQuarters['workers'] * univWorkTrips) +groupQuarters.loc[groupQuarters.gq_type.eq('other16-64') & + groupQuarters.trip_type.eq(1), 'productions'] = ( + groupQuarters['workers'] * other1664WorkTrips) +groupQuarters.loc[groupQuarters.gq_type.eq('other65') & + groupQuarters.trip_type.eq(1), 'productions'] = ( + groupQuarters['workers'] * other65WorkTrips) +# 4 - Home-school (only for 16-64) +groupQuarters.loc[groupQuarters.gq_type.eq('other16-64') & + groupQuarters.trip_type.eq(4), 'productions'] = ( + groupQuarters['workers'] + * groupQuarters['trip_production_rate']) +# Remaining Worker trip types applied to all GQ persons +workTypes = [3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] +groupQuarters.loc[groupQuarters['trip_type'].isin(workTypes), 'productions'] = ( + groupQuarters['workers'] + * groupQuarters['trip_production_rate']) + +# Calculate Nonworker trip productions +# 21 - Home-school (only for 16-64) +groupQuarters.loc[groupQuarters.gq_type.eq('other16-64') & + groupQuarters.trip_type.eq(21), 'productions'] = ( + groupQuarters['nonworkers'] + * groupQuarters['trip_production_rate']) +# Remaining Nonworker trip types applied to all GQ persons except military +skipType = ['military'] +nonworkTypes = [22,23,24,25,26,27,28,29,30,31,32,33] +groupQuarters.loc[groupQuarters['trip_type'].isin(nonworkTypes) & + ~groupQuarters['gq_type'].isin(skipType), 'productions'] = ( + groupQuarters['nonworkers'] + * groupQuarters['trip_production_rate']) + +groupQuarters.fillna(0, inplace=True) +groupQuarters['productions'] = groupQuarters['productions'].round(3) +groupQuarters.drop('trip_production_rate', axis=1, inplace=True) + +if writeOptional: + logging.info(' --> Writing {0:,} records to {1}'.format(len(groupQuarters), + Path(groupQuartersProductions).name)) + groupQuarters.to_csv(groupQuartersProductions, index=False) + +# Prepare GQ data for production and attraction allocations +# Summarize GQ productions by trip type and subzone +# Summarize GQ productions by trip type +groupQuartersTrips = groupQuarters.groupby(['subzone','trip_type']).agg( + {'productions': 'sum'}).reset_index() +groupQuartersTrips['wfh_flag'] = 0 +groupQuartersTrips.rename(columns={'productions':'gq_productions'}, + inplace=True) +gqTripTypeTrips = groupQuarters.groupby(['trip_type']).agg( + {'productions': 'sum'}).reset_index() +gqTripTypeTrips.rename(columns={'productions':'trip_gq_productions'}, + inplace=True) +groupQuartersTrips = groupQuartersTrips.merge(gqTripTypeTrips, how='left', + on='trip_type', copy=False) +gq1Sum = int(groupQuarters['productions'].sum()) +gq2Sum = int(groupQuartersTrips['gq_productions'].sum()) +assert gq1Sum == gq2Sum, "Mismatch in GQ productions" + +# ---------------------------------------------------------------------------- +# Step 5. Allocate trip productions and attractions for non-home trip ends +# ---------------------------------------------------------------------------- +logging.info('Allocating Productions and Attractions for Non-Home Trip Ends') +logging.info(' -- Preparing the data') + +totalHouseholds = numberGqHousholds + numberHouseholds + +# Create complete template of subzone-trip type-wfh flag options +prodTemplate = geog[['subzone', 'zone', 'cbd']].copy().reset_index(drop=True) +hhPart = sz[['subzone', 'households']].copy().reset_index(drop=True) +tripTypes = coeffsAttr[['trip_type']].copy().reset_index(drop=True) +tripTypes.drop_duplicates(subset=['trip_type'], keep='first', inplace=True) +prodTemplate = prodTemplate.merge(hhPart, how='left', on='subzone', + copy=False) +prodTemplate = prodTemplate.merge(attractions, how='left', on='subzone', + copy=False) +prodTemplate = prodTemplate.merge(airports, how='left', on='subzone', + copy=False) +prodTemplate = prodTemplate.merge(schools, how='left', on='subzone', + copy=False) +prodTemplate = prodTemplate.merge(tripTypes, how='cross', copy=False) +prodTemplate['notairport_flag'] = prodTemplate['notairport_flag'].fillna(1) +prodTemplate['wfh_flag'] = 0 +prodWFH = prodTemplate.copy() +prodWFH['wfh_flag'] = 1 +prodTemplate = pd.concat([prodTemplate, prodWFH], ignore_index=True, + sort=False) +assert len(prodTemplate) == (17418 * 49 * 2), "prodTemplate is not complete" + +logging.info(' -- Allocating non-home productions') +# Attach household and group quarters productions +prodTemplate = prodTemplate.merge(householdTrips, how='left', + on=['subzone','trip_type','wfh_flag'], + copy=False) +prodTemplate = prodTemplate.merge(tripWfh, how='left', on=['trip_type', + 'wfh_flag'], + copy=False) +prodTemplate = prodTemplate.merge(groupQuartersTrips, how='left', + on=['subzone','trip_type','wfh_flag'], + copy=False) +prodTemplate.fillna(0, inplace=True) + +# Attach nonhome production coefficients and calculate shares +prodTemplate = prodTemplate.merge(coeffsProd, how='left', + on=['cbd','trip_type','wfh_flag'], + copy=False) +prodTemplate['sz_share'] = run_formula(prodTemplate) +prodTemplate.drop('weight_formula', axis=1, inplace=True) + +logging.info(' -- Allocating attractions') +# Attach attraction coefficients and calculate shares +prodTemplate = prodTemplate.merge(coeffsAttr, how='left', + on=['cbd','trip_type','wfh_flag'], + copy=False) +prodTemplate['sz_share_attr'] = run_formula(prodTemplate) + +# Sum subzone shares to determine trip type totals +tripTotals = prodTemplate.groupby(['trip_type','wfh_flag']).agg( + {'sz_share': 'sum', + 'sz_share_attr': 'sum'} + ).round(3).reset_index() +tripTotals.rename(columns={'sz_share':'tripShare', + 'sz_share_attr':'tripShareAttr'}, inplace=True) +prodTemplate = prodTemplate.merge(tripTotals, how='left', + on=['trip_type','wfh_flag'], copy=False) + +logging.info(' -- Updating productions') +homeTypes = [1,2,3,4,5,6,7,21,22,23,24,34,35,36,37] +prodTemplate['sz_prods'] = np.where(prodTemplate['trip_type'].isin(homeTypes), + prodTemplate['hh_productions'], + prodTemplate['sz_share'] + / prodTemplate['tripShare'] + * prodTemplate['trip_hh_productions'] + ).round(1) + +prodTemplate['sz_gq_prods'] = np.where(prodTemplate['trip_type'].isin(homeTypes), + prodTemplate['gq_productions'], + prodTemplate['sz_share'] + / prodTemplate['tripShare'] + * prodTemplate['trip_gq_productions'] + ).round(1) + +logging.info(' -- Updating attractions') +notUsed = [2,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49] +prodTemplate['sz_attrs'] = (prodTemplate['sz_share_attr'] + / prodTemplate['tripShareAttr'] + * prodTemplate['trip_hh_productions']).round(1) +prodTemplate['sz_gq_attrs'] = np.where(prodTemplate['trip_type'].isin(notUsed), + prodTemplate['gq_productions'], + prodTemplate['sz_share_attr'] + / prodTemplate['tripShareAttr'] + * prodTemplate['trip_gq_productions'] + ).round(1) + +firstPass = prodTemplate[['subzone', 'zone', 'wfh_flag', 'trip_type', + 'sz_prods', 'sz_attrs', 'sz_gq_prods', + 'sz_gq_attrs']].copy().reset_index(drop=True) + +if writeOptional: + logging.info(' --> Writing {0:,} records to {1}'.format(len(firstPass), + Path(firstProdsAttrs).name)) + firstPass.to_csv(firstProdsAttrs, index=False) + +# ---------------------------------------------------------------------------- +# Step 6. Factor external home-based productions and attractions +# ---------------------------------------------------------------------------- +logging.info('Factoring External Home-Workplace Productions and Attractions') + +# Apply external factors to trip type 1 and 2 +adjusted = firstPass[firstPass.trip_type.le(2)].copy().reset_index(drop=True) +unadjusted = firstPass[firstPass.trip_type.gt(2)].copy().reset_index(drop=True) +adjusted = adjusted.merge(pumas, how='left', on='subzone', copy=False) +adjusted = adjusted.merge(extrnShare, how='left', on='state_puma', + copy=False) +adjusted['sz_ext_prods'] = (adjusted['sz_prods'] * adjusted['ext_prod_factor'] + ).round(1) +adjusted['sz_ext_attrs'] = adjusted['sz_attrs'] * adjusted['ext_attr_factor'] + +# Balance external attractions to productions +extTotals = adjusted.groupby(['wfh_flag','trip_type']).agg( + {'sz_ext_prods': 'sum', + 'sz_ext_attrs': 'sum'} + ).reset_index() + +extTotals.rename(columns={'sz_ext_prods':'total_ext_prods', + 'sz_ext_attrs':'total_ext_attrs'}, inplace=True) +adjusted = adjusted.merge(extTotals, how='left', on=['wfh_flag', 'trip_type'], + copy=True) +adjusted['sz_ext_attrs'] = (adjusted['sz_ext_attrs'] + * adjusted['total_ext_prods'] + / adjusted['total_ext_attrs']) + +# Update productions and attractions, adjust external attractions if needed +adjusted['sz_ext_attrs'] = np.where(adjusted['sz_ext_attrs'] + > adjusted['sz_attrs'], + adjusted['sz_attrs'], + adjusted['sz_ext_attrs']).round(1) +adjusted['sz_prods'] = (adjusted['sz_prods'] - adjusted['sz_ext_prods'] + ).round(1) +adjusted['sz_attrs'] = (adjusted['sz_attrs'] - adjusted['sz_ext_attrs'] + ).round(1) + +if writeOptional: + logging.info(' --> Writing {0:,} records to {1}'.format(len(adjusted), + Path(extrnlProdsAttrs).name)) + writeCols = ['subzone', 'zone', 'wfh_flag', 'trip_type', 'sz_ext_prods', + 'sz_ext_attrs'] + adjusted.to_csv(extrnlProdsAttrs, columns=writeCols, index=False) + +# ---------------------------------------------------------------------------- +# Step 7. Finalize productions and attractions +# ---------------------------------------------------------------------------- +logging.info('Finalizing Productions and Attractions') + +dropCols = ['state_puma', 'ext_prod_factor', 'ext_attr_factor', 'sz_ext_prods', + 'sz_ext_attrs', 'total_ext_prods', 'total_ext_attrs'] +adjusted.drop(dropCols, axis=1, inplace=True) +prodsAttrs = pd.concat([adjusted, unadjusted], ignore_index=True, sort=False) +prodsAttrs.sort_values(['trip_type','subzone'], inplace=True) +prodsAttrs['sz_prods'] = prodsAttrs['sz_prods'] + prodsAttrs['sz_gq_prods'] +prodsAttrs['sz_attrs'] = prodsAttrs['sz_attrs'] + prodsAttrs['sz_gq_attrs'] + +# Write final productions and attractions +noWfhPA = prodsAttrs[prodsAttrs.wfh_flag.eq(0)].copy().reset_index(drop=True) +fixed_width(finalProdsAttrs, noWfhPA) +logging.info(' --> Writing {0:,} records to {1}'.format(len(noWfhPA), + Path(finalProdsAttrs).name)) +# +wfhPA = prodsAttrs[prodsAttrs.wfh_flag.eq(1)].copy().reset_index(drop=True) +fixed_width(finalWfhProdsAttrs, wfhPA) +logging.info(' --> Writing {0:,} records to {1}'.format(len(wfhPA), + Path(finalWfhProdsAttrs).name)) + +# Final summary +workers = prodsAttrs[prodsAttrs.trip_type.le(20)].copy() +nonworkers = prodsAttrs[prodsAttrs.trip_type.ge(21) & + prodsAttrs.trip_type.le(33)].copy() +children = prodsAttrs[prodsAttrs.trip_type.ge(34)].copy() +logging.info('Final Results') +logging.info(' - Workers') +logging.info(' - Productions: {0:>12,.1f}'.format(workers['sz_prods'].sum())) +logging.info(' - Attractions: {0:>12,.1f}'.format(workers['sz_attrs'].sum())) +logging.info(' - Nonworking Adults') +logging.info(' - Productions: {0:>12,.1f}'.format(nonworkers['sz_prods'].sum())) +logging.info(' - Attractions: {0:>12,.1f}'.format(nonworkers['sz_attrs'].sum())) +logging.info(' - Children 12-15') +logging.info(' - Productions: {0:>12,.1f}'.format(children['sz_prods'].sum())) +logging.info(' - Attractions: {0:>12,.1f}'.format(children['sz_attrs'].sum())) +logging.info(' - Total') +logging.info(' - Productions: {0:>12,.1f}'.format(prodsAttrs['sz_prods'].sum())) +logging.info(' - Attractions: {0:>12,.1f}'.format(prodsAttrs['sz_attrs'].sum())) + +t_omega = timeit.default_timer() +logging.info('Trip Generation model took {0:.2f} minutes for {1:,} households' + .format((t_omega-t_alpha)/60, len(hh))) +logging.info('Trip Generation model finished') \ No newline at end of file diff --git a/Database/trip_generation/vehicle_availability.py b/Database/trip_generation/vehicle_availability.py new file mode 100644 index 0000000..3349c74 --- /dev/null +++ b/Database/trip_generation/vehicle_availability.py @@ -0,0 +1,326 @@ +""" +Filename: vehicle_availability.py +Author: Craig Heither +Description: These functions are the household vehicle availability model + for trip generation. +""" + +import numpy as np + +def vehOwnOneAdult(rows, rng=None): + """ + Vehicle ownership model for 1-adult households. + + Parameters + ---------- + rows : array_like + Six inputs: [sidewalk_density, row_column, age_category, workers, + income_category, auto_commute_share] + rng : numpy.random.Generator, optional + A Numpy Generator instance for reproducible results. If None, uses + np.random.default_rng(). + + Returns + ------- + ndarray + Integer array of vehicle counts (0..2). + """ + + # Read household parameters + rows = np.asarray(rows) + if rows.ndim == 1: + rows = rows.reshape(1, -1) + sidewalk = rows[:, 0].astype(float) + rowcol = rows[:, 1] + age = rows[:, 2] + workers = rows[:, 3] + income = rows[:, 4] + auto_comm = rows[:, 5].astype(float) + if rng is None: + rng = np.random.default_rng() + + # Lookup tables + bias1_lookup = np.array([-2.600, -2.676, -2.869, -3.082]) + bias2_lookup = np.array([-5.077, -4.823, -4.914, -4.984]) + hh_lookup = np.array([0.392, 0.401, 0.249]) + hh2_lookup = np.array([0.394, 0.465, 0.218]) + + # Safe indexing (rowcol and age are 1-based) + rowcol_idx = np.clip(rowcol.astype(int) - 1, 0, 3) + age_idx = np.clip(age.astype(int) - 1, 0, 2) + + # Utility for zero vehicles + COEF_PEF0 = 0.06165 + UTIL0 = COEF_PEF0 * sidewalk + + # Utility for one vehicle + COEF_WORKER = 0.4731 + COEF_HINC2 = 1.182 + COEF_HINC3 = 0.9910 + COEF_AUTOMS = 4.677 + COEF_PEF1 = 0.03188 + + bias1 = bias1_lookup[rowcol_idx] + hh_bias = hh_lookup[age_idx] + temp1 = (workers.astype(int) == 1).astype(int) + temp2 = (income.astype(int) != 1).astype(int) + temp3 = (income.astype(int) >= 3).astype(int) + + UTIL1 = (COEF_WORKER * temp1 + COEF_HINC2 * temp2 + COEF_HINC3 * temp3 + + COEF_AUTOMS * auto_comm + COEF_PEF1 * sidewalk + bias1 + hh_bias) + + # Utility for two or more vehicles + COEF_WORKER = 0.4731 + COEF_HINC2 = 1.766 + COEF_HINC3 = 1.690 + COEF_HINC4 = 0.4668 + COEF_AUTOMS = 4.677 + + bias2 = bias2_lookup[rowcol_idx] + hh_bias2 = hh2_lookup[age_idx] + temp1 = (workers.astype(int) == 1).astype(int) + temp2 = (income.astype(int) != 1).astype(int) + temp3 = (income.astype(int) >= 3).astype(int) + temp4 = (income.astype(int) == 4).astype(int) + + UTIL2 = (COEF_WORKER * temp1 + COEF_HINC2 * temp2 + COEF_HINC3 * temp3 + + COEF_HINC4 * temp4 + COEF_AUTOMS * auto_comm + bias2 + hh_bias2) + + # Vehicle ownership probabilities + expU = np.exp(np.vstack([UTIL0, UTIL1, UTIL2]).T) + denom = expU.sum(axis=1, keepdims=True) + probs = expU / denom + cumul_probs = probs.cumsum(axis=1) + + # Determine vehicle ownership level + u = rng.random(size=cumul_probs.shape[0]) + # Vectorized row-wise mapping: count how many cumulative probs are < u + idx = np.sum(u[:, None] > cumul_probs, axis=1) + # idx maps to 0->0 vehicles, 1->1, 2->2+ + return idx.astype(int) + +def vehOwnTwoAdult(rows, rng=None): + """ + Vehicle ownership model for 2-adult households. + + Parameters + ---------- + rows : array_like + Seven inputs: [sidewalk_density, row_column, age_category, workers, + income_category, auto_commute_share, children] + rng : numpy.random.Generator, optional + A Numpy Generator instance for reproducible results. If None, uses + np.random.default_rng(). + + Returns + ------- + ndarray + Integer array of vehicle counts (0..3). + """ + rows = np.asarray(rows) + if rows.ndim == 1: + rows = rows.reshape(1, -1) + sidewalk = rows[:, 0].astype(float) + rowcol = rows[:, 1] + age = rows[:, 2] + workers = rows[:, 3].astype(int) + income = rows[:, 4].astype(int) + auto_comm = rows[:, 5].astype(float) + children = rows[:, 6].astype(float) + if rng is None: + rng = np.random.default_rng() + + # Lookup tables + bias1_lookup = np.array([2.018, 2.259, 2.151, 1.925]) + bias2_lookup = np.array([-2.827, -2.637, -2.728, -3.144]) + bias3_lookup = np.array([-4.393, -3.944, -4.126, -4.302]) + hh_lookup = np.array([0.392, 0.401, 0.249]) + hh2_lookup = np.array([0.394, 0.465, 0.218]) + hh3_lookup = np.array([0.403, 0.574, 0.007]) + + # Safe indexing (rowcol and age are 1-based) + rowcol_idx = np.clip(rowcol.astype(int) - 1, 0, 3) + age_idx = np.clip(age.astype(int) - 1, 0, 2) + + # Utility for zero vehicles + COEF_PEF = 0.1280 + UTIL0 = COEF_PEF * sidewalk + + # Utility for one vehicle + COEF_HINC2 = 1.702 + COEF_PEF = 0.06309 + bias1 = bias1_lookup[rowcol_idx] + hh_bias = hh_lookup[age_idx] + temp1 = (income != 1).astype(int) + + UTIL1 = COEF_HINC2 * temp1 + COEF_PEF * sidewalk + bias1 + hh_bias + + # Utility for two vehicles + COEF_WORK1 = 0.6940 + COEF_WORK2 = 0.5198 + COEF_HINC2 = 2.466 + COEF_HINC3 = 0.8650 + COEF_HINC4 = 0.4517 + COEF_AUTOMS = 5.284 + COEF_CHILD = 0.2218 + COEF_PEF = 0.03359 + + bias2 = bias2_lookup[rowcol_idx] + hh_bias2 = hh2_lookup[age_idx] + temp1 = (workers > 0).astype(int) + temp2 = (workers > 1).astype(int) + temp3 = (income > 1).astype(int) + temp4 = (income > 2).astype(int) + temp5 = (income == 4).astype(int) + + UTIL2 = (COEF_WORK1 * temp1 + COEF_WORK2 * temp2 + COEF_HINC2 * temp3 + + COEF_HINC3 * temp4 + COEF_HINC4 * temp5 + COEF_AUTOMS * auto_comm + + COEF_CHILD * children + COEF_PEF * sidewalk + bias2 + hh_bias2) + + # Utility for three plus vehicles + COEF_WORK1 = 0.6940 + COEF_WORK2 = 0.5198 + COEF_HINC2 = 2.466 + COEF_HINC3 = 0.8650 + COEF_HINC4 = 0.8827 + COEF_AUTOMS = 5.284 + + bias3 = bias3_lookup[rowcol_idx] + hh_bias3 = hh3_lookup[age_idx] + temp1 = (workers > 0).astype(int) + temp2 = (workers > 1).astype(int) + temp3 = (income > 1).astype(int) + temp4 = (income > 2).astype(int) + temp5 = (income == 4).astype(int) + + UTIL3 = (COEF_WORK1 * temp1 + COEF_WORK2 * temp2 + COEF_HINC2 * temp3 + + COEF_HINC3 * temp4 + COEF_HINC4 * temp5 + COEF_AUTOMS * auto_comm + + bias3 + hh_bias3) + + # Vehicle ownership probabilities + expU = np.exp(np.vstack([UTIL0, UTIL1, UTIL2, UTIL3]).T) + denom = expU.sum(axis=1, keepdims=True) + probs = expU / denom + cumul_probs = probs.cumsum(axis=1) + + # Determine vehicle ownership level + u = rng.random(size=cumul_probs.shape[0]) + # Vectorized row-wise mapping: count how many cumulative probs are < u + idx = np.sum(u[:, None] > cumul_probs, axis=1) + return idx.astype(int) + +def vehOwnThreeAdult(rows, rng=None): + """ + Vehicle ownership model for 3-or-more-adult households. + + Parameters + ---------- + rows : array_like + Seven inputs: [sidewalk_density, row_column, age_category, workers, + income_category, auto_commute_share, nonworkers] + rng : numpy.random.Generator, optional + A Numpy Generator instance for reproducible results. If None, uses + np.random.default_rng(). + + Returns + ------- + ndarray + Integer array of vehicle counts (0..3). + """ + rows = np.asarray(rows) + if rows.ndim == 1: + rows = rows.reshape(1, -1) + sidewalk = rows[:, 0].astype(float) + rowcol = rows[:, 1] + age = rows[:, 2] + workers = rows[:, 3].astype(int) + income = rows[:, 4].astype(int) + auto_comm = rows[:, 5].astype(float) + nonworkers = rows[:, 6].astype(float) + if rng is None: + rng = np.random.default_rng() + + # Lookup tables + bias1_lookup = np.array([2.806, 2.552, 1.547, 2.272]) + bias2_lookup = np.array([-1.836, -2.139, -2.783, -2.430]) + bias3_lookup = np.array([-1.631, -1.789, -2.668, -2.278]) + hh_lookup = np.array([0.392, 0.401, 0.249]) + hh2_lookup = np.array([0.394, 0.465, 0.218]) + hh3_lookup = np.array([0.403, 0.574, 0.007]) + + # Safe indexing (rowcol and age are 1-based) + rowcol_idx = np.clip(rowcol.astype(int) - 1, 0, 3) + age_idx = np.clip(age.astype(int) - 1, 0, 2) + + # Utility for zero vehicles + COEF_PEF = 0.1703 + UTIL0 = COEF_PEF * sidewalk + + # Utility for one vehicle + COEF_WORK1 = 1.114 + COEF_HINC2 = 0.9492 + COEF_PEF = 0.06586 + + bias1 = bias1_lookup[rowcol_idx] + hh_bias = hh_lookup[age_idx] + temp1 = (workers > 0).astype(int) + temp2 = (income > 1).astype(int) + + UTIL1 = (COEF_WORK1 * temp1 + COEF_HINC2 * temp2 + COEF_PEF * sidewalk + + bias1 + hh_bias) + + # Utility for two vehicles + COEF_WORK1 = 1.114 + COEF_WORK2 = 0.7934 + COEF_HINC2 = 1.487 + COEF_HINC3 = 0.8723 + COEF_HINC4 = 1.390 + COEF_AUTOMS = 4.959 + COEF_PEF2 = 0.06586 + + bias2 = bias2_lookup[rowcol_idx] + hh_bias2 = hh2_lookup[age_idx] + temp1 = (workers > 0).astype(int) + temp2 = (workers > 1).astype(int) + temp3 = (income > 1).astype(int) + temp4 = (income > 2).astype(int) + temp5 = (income == 4).astype(int) + + UTIL2 = (COEF_WORK1 * temp1 + COEF_WORK2 * temp2 + COEF_HINC2 * temp3 + + COEF_HINC3 * temp4 + COEF_HINC4 * temp5 + COEF_AUTOMS * auto_comm + + COEF_PEF2 * sidewalk + bias2 + hh_bias2) + + # Utility for three plus vehicles + COEF_WORK1 = 1.114 + COEF_WORK2 = 0.7934 + COEF_WORK3 = 1.389 + COEF_HINC2 = 1.487 + COEF_HINC3 = 1.571 + COEF_HINC4 = 1.834 + COEF_ADULT = 0.1491 + COEF_AUTOMS = 4.959 + + bias3 = bias3_lookup[rowcol_idx] + hh_bias3 = hh3_lookup[age_idx] + temp1 = (workers > 0).astype(int) + temp2 = (workers > 1).astype(int) + temp3 = (workers > 2).astype(int) + temp4 = (income > 1).astype(int) + temp5 = (income > 2).astype(int) + temp6 = (income == 4).astype(int) + + UTIL3 = (COEF_WORK1 * temp1 + COEF_WORK2 * temp2 + COEF_WORK3 * temp3 + + COEF_HINC2 * temp4 + COEF_HINC3 * temp5 + COEF_HINC4 * temp6 + + COEF_ADULT * nonworkers + COEF_AUTOMS * auto_comm + bias3 + hh_bias3) + + # Vehicle ownership probabilities + expU = np.exp(np.vstack([UTIL0, UTIL1, UTIL2, UTIL3]).T) + denom = expU.sum(axis=1, keepdims=True) + probs = expU / denom + cumul_probs = probs.cumsum(axis=1) + + # Determine vehicle ownership level + u = rng.random(size=cumul_probs.shape[0]) + # Vectorized row-wise mapping: count how many cumulative probs are < u + idx = np.sum(u[:, None] > cumul_probs, axis=1) + return idx.astype(int) \ No newline at end of file diff --git a/copy_scenario_data.ps1 b/copy_scenario_data.ps1 index fdd0ca8..b6a6b43 100644 --- a/copy_scenario_data.ps1 +++ b/copy_scenario_data.ps1 @@ -8,11 +8,6 @@ $destination_db = "$destination_dir\Database\" $items = @("emmebank" "emmemat" "tg\UrbanSim_inputs" - "tg\fortran\ATTR_IN.TXT" - "tg\fortran\HH_IN.TXT" - "tg\fortran\GQ_IN.TXT" - "tg\fortran\POPSYN_HH.CSV" - "tg\fortran\airport_sz.csv" "tg\fortran\SCHOOL_IN.CSV" "tg\fortran\wfhmodule\indusmix.csv") From 5dfc2e6cefbe12fcf9c52bb9b760e09881e8f829 Mon Sep 17 00:00:00 2001 From: tinleycraig Date: Wed, 8 Apr 2026 14:59:04 -0500 Subject: [PATCH 03/12] run_transit_assignment.bat revised for c26q2 --- Database/transit_asmt_macros/run_transit_assignment.bat | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Database/transit_asmt_macros/run_transit_assignment.bat b/Database/transit_asmt_macros/run_transit_assignment.bat index 434dae4..f143a5a 100644 --- a/Database/transit_asmt_macros/run_transit_assignment.bat +++ b/Database/transit_asmt_macros/run_transit_assignment.bat @@ -21,11 +21,11 @@ echo. rem -- Read model run settings from batch_file.yaml -- for /f "eol=# skip=2 tokens=2 delims=:" %%a in (batch_file.yaml) do (set val=%%a & goto break1) :break1 -for /f "eol=# skip=14 tokens=2 delims=:" %%f in (batch_file.yaml) do (set transitAsmt=%%f & goto break2) +for /f "eol=# skip=10 tokens=2 delims=:" %%f in (batch_file.yaml) do (set transitAsmt=%%f & goto break2) :break2 -for /f "eol=# skip=16 tokens=2 delims=:" %%h in (batch_file.yaml) do (set selLineFile=%%h & goto break4) +for /f "eol=# skip=12 tokens=2 delims=:" %%h in (batch_file.yaml) do (set selLineFile=%%h & goto break4) :break4 -for /f "eol=# skip=22 tokens=2 delims=:" %%k in (batch_file.yaml) do (set RSPrun=%%k & goto break5) +for /f "eol=# skip=18 tokens=2 delims=:" %%k in (batch_file.yaml) do (set RSPrun=%%k & goto break5) :break5 set val=%val:~1,3% From 62fbe9da95e8ea15955af631b9736bb03d3f0eba Mon Sep 17 00:00:00 2001 From: Nicholas Ferguson Date: Wed, 25 Mar 2026 16:38:59 -0500 Subject: [PATCH 04/12] Install cmap_modedest package from GitHub --- .gitignore | 4 - Scripts/manage/env/CMAP-TRIP2.yml | 4 +- src/Mode-Dest-TOD/.gitignore | 1 - src/Mode-Dest-TOD/README.md | 81 - src/Mode-Dest-TOD/TECHNICALGUIDE.md | 66 - src/Mode-Dest-TOD/USERGUIDE.md | 495 --- src/Mode-Dest-TOD/cmap_modedest/__init__.py | 6 - src/Mode-Dest-TOD/cmap_modedest/__main__.py | 274 -- src/Mode-Dest-TOD/cmap_modedest/addict.py | 203 - .../cmap_modedest/ae_distance_sim.py | 80 - .../cmap_modedest/application.py | 1495 ------- .../cmap_modedest/choice_model.py | 544 --- .../cmap_modedest/cmap_logging.py | 121 - .../cmap_modedest/configuration.py | 0 .../cmap_modedest/data_handlers/__init__.py | 267 -- .../data_handlers/distr_handler.py | 28 - .../cmap_modedest/data_handlers/filepaths.py | 284 -- .../data_handlers/household_types.csv | 625 --- .../data_handlers/household_types.py | 23 - .../data_handlers/m01_handler.py | 171 - .../data_handlers/m023_handler.py | 39 - .../data_handlers/pa_trip_types.csv | 50 - .../data_handlers/parking_handler.py | 74 - .../data_handlers/shp_handler.py | 11 - .../data_handlers/skims_handler.py | 226 - .../cmap_modedest/data_handlers/tabler.py | 1 - .../cmap_modedest/data_handlers/tg_handler.py | 129 - .../cmap_modedest/data_handlers/visitors.py | 39 - .../cmap_modedest/deadheading.py | 144 - .../cmap_modedest/estimation/__init__.py | 12 - .../cmap_modedest/estimation/est_choice.py | 863 ---- .../cmap_modedest/estimation/est_config.py | 137 - .../cmap_modedest/estimation/est_data.py | 25 - .../cmap_modedest/estimation/est_logging.py | 13 - .../estimation/est_sample_dest.py | 270 -- .../estimation/est_skims_convol.py | 29 - .../cmap_modedest/estimation/est_survey.py | 565 --- .../cmap_modedest/estimation/est_timeofday.py | 60 - .../cmap_modedest/fast/__init__.py | 0 .../cmap_modedest/fast/__sc/S1/__init__.py | 467 --- .../fast/__sc/S1/__init__.py.lock | 0 .../cmap_modedest/fast/__sc/S1/extra_funcs.py | 6 - .../fast/__sc/S1/extra_funcs.py.lock | 0 .../cmap_modedest/fast/__sc/S1/extra_vars.py | 7 - .../fast/__sc/S1/extra_vars.py.lock | 0 .../fast/__sc/S1/f_auto_dist_OFFPEAK.py | 16 - .../fast/__sc/S1/f_auto_dist_OFFPEAK.py.lock | 0 .../fast/__sc/S1/f_auto_dist_PEAK.py | 16 - .../fast/__sc/S1/f_auto_dist_PEAK.py.lock | 0 .../fast/__sc/S1/f_auto_opcost_OFFPEAK.py | 16 - .../__sc/S1/f_auto_opcost_OFFPEAK.py.lock | 0 .../fast/__sc/S1/f_auto_opcost_PEAK.py | 16 - .../fast/__sc/S1/f_auto_opcost_PEAK.py.lock | 0 .../fast/__sc/S1/f_auto_opcost_hov_PEAK.py | 16 - .../__sc/S1/f_auto_opcost_hov_PEAK.py.lock | 0 .../fast/__sc/S1/f_auto_time_OFFPEAK.py | 16 - .../fast/__sc/S1/f_auto_time_OFFPEAK.py.lock | 0 .../fast/__sc/S1/f_auto_time_PEAK.py | 16 - .../fast/__sc/S1/f_auto_time_PEAK.py.lock | 0 .../fast/__sc/S1/f_auto_toll_OFFPEAK.py | 16 - .../fast/__sc/S1/f_auto_toll_OFFPEAK.py.lock | 0 .../fast/__sc/S1/f_auto_toll_hiinc_PEAK.py | 16 - .../__sc/S1/f_auto_toll_hiinc_PEAK.py.lock | 0 .../__sc/S1/f_auto_toll_hov_hiinc_PEAK.py | 16 - .../S1/f_auto_toll_hov_hiinc_PEAK.py.lock | 0 .../__sc/S1/f_auto_toll_hov_loinc_PEAK.py | 16 - .../S1/f_auto_toll_hov_loinc_PEAK.py.lock | 0 .../fast/__sc/S1/f_auto_toll_loinc_PEAK.py | 16 - .../__sc/S1/f_auto_toll_loinc_PEAK.py.lock | 0 .../fast/__sc/S1/f_autopropensity.py | 16 - .../fast/__sc/S1/f_autopropensity.py.lock | 0 ...__areatype___1_OWXSNW5EFKHSRO2IUCB6DHTR.py | 16 - ...atype___1_OWXSNW5EFKHSRO2IUCB6DHTR.py.lock | 0 ...__areatype___2_FIT25FYRGELBEONPX2MTPZFN.py | 16 - ...atype___2_FIT25FYRGELBEONPX2MTPZFN.py.lock | 0 ...__areatype___3_LIPIKNXA6ZB3PUNRJBVIHATL.py | 16 - ...atype___3_LIPIKNXA6ZB3PUNRJBVIHATL.py.lock | 0 ...__areatype___4_J3D56DXM2MR6NEMIQ6ALSFID.py | 16 - ...atype___4_J3D56DXM2MR6NEMIQ6ALSFID.py.lock | 0 ...__areatype___1_OTNZJFEFZT7N3JG6YKEUWGTF.py | 16 - ...atype___1_OTNZJFEFZT7N3JG6YKEUWGTF.py.lock | 0 ...__areatype___2_FY4D7BMCO2N4QRIA6QIIWTZI.py | 16 - ...atype___2_FY4D7BMCO2N4QRIA6QIIWTZI.py.lock | 0 ...__areatype___3_34BD5WGYZOPLALWPB2MCWKA7.py | 16 - ...atype___3_34BD5WGYZOPLALWPB2MCWKA7.py.lock | 0 ...__areatype___4_64S6AODYPVZP57LTAC522OHX.py | 16 - ...atype___4_64S6AODYPVZP57LTAC522OHX.py.lock | 0 .../fast/__sc/S1/f_log_attractions_HBO.py | 16 - .../__sc/S1/f_log_attractions_HBO.py.lock | 0 ...ons_HBO____666_5VORECHSLO2A6MKP5I3SGJVQ.py | 16 - ...BO____666_5VORECHSLO2A6MKP5I3SGJVQ.py.lock | 0 .../fast/__sc/S1/f_log_attractions_HBS.py | 16 - .../__sc/S1/f_log_attractions_HBS.py.lock | 0 ...ons_HBS____666_L3ZMVRT365KFSBLEDVABFEGL.py | 16 - ...BS____666_L3ZMVRT365KFSBLEDVABFEGL.py.lock | 0 .../fast/__sc/S1/f_log_attractions_HBWH.py | 16 - .../__sc/S1/f_log_attractions_HBWH.py.lock | 0 ...ns_HBWH____666_GW3RKVJQOVET3XE7MYE2MA7V.py | 16 - ...WH____666_GW3RKVJQOVET3XE7MYE2MA7V.py.lock | 0 .../fast/__sc/S1/f_log_attractions_HBWL.py | 16 - .../__sc/S1/f_log_attractions_HBWL.py.lock | 0 ...ns_HBWL____666_IQGLCTAX7EZOXKEFCIBK33BD.py | 16 - ...WL____666_IQGLCTAX7EZOXKEFCIBK33BD.py.lock | 0 .../fast/__sc/S1/f_log_attractions_NHB.py | 16 - .../__sc/S1/f_log_attractions_NHB.py.lock | 0 ...ons_NHB____666_3GFB7KMY3JN5TSJE4MRRR2HM.py | 16 - ...HB____666_3GFB7KMY3JN5TSJE4MRRR2HM.py.lock | 0 ...o_zone____dtaz_HXCH5HUPIDPV3EWONWFXBZHM.py | 16 - ...e____dtaz_HXCH5HUPIDPV3EWONWFXBZHM.py.lock | 0 ...FPEAK_0_5_1_0__HZLL3YOGUR763JRQHG7SM6TX.py | 16 - ..._0_5_1_0__HZLL3YOGUR763JRQHG7SM6TX.py.lock | 0 ...FPEAK_10_None__6EE7X5PWAQKBS6WQUONWVI63.py | 16 - ..._10_None__6EE7X5PWAQKBS6WQUONWVI63.py.lock | 0 ...PEAK_1_0_None__FBK6GF2KEWWDN7AL3ENVH3VS.py | 16 - ...1_0_None__FBK6GF2KEWWDN7AL3ENVH3VS.py.lock | 0 ..._OFFPEAK_5_10__5RQTWWGPPCPP6EQU6ZV5MX2R.py | 16 - ...EAK_5_10__5RQTWWGPPCPP6EQU6ZV5MX2R.py.lock | 0 ...PEAK_None_0_5__537AWC5AWFXLM3TRB3PPSGYZ.py | 16 - ...None_0_5__537AWC5AWFXLM3TRB3PPSGYZ.py.lock | 0 ...FFPEAK_None_5__YWXA4HRZAVEZKC7EV5M2AX3B.py | 16 - ...K_None_5__YWXA4HRZAVEZKC7EV5M2AX3B.py.lock | 0 ..._PEAK_0_5_1_0__4K5ZPM55FQJVFMWKUPZIQ2ET.py | 16 - ..._0_5_1_0__4K5ZPM55FQJVFMWKUPZIQ2ET.py.lock | 0 ..._PEAK_10_None__L3GKJNRUTTFCDUYV65K7KFQD.py | 16 - ..._10_None__L3GKJNRUTTFCDUYV65K7KFQD.py.lock | 0 ...PEAK_1_0_None__FMBHM5APW4TIH6B5EKSKSXYD.py | 16 - ...1_0_None__FMBHM5APW4TIH6B5EKSKSXYD.py.lock | 0 ...ist_PEAK_5_10__DSXTFACXD5HSWU7YKUPQEGAK.py | 16 - ...EAK_5_10__DSXTFACXD5HSWU7YKUPQEGAK.py.lock | 0 ...PEAK_None_0_5__NZ6HG4EJYEENT2OAOBDF3W5W.py | 16 - ...None_0_5__NZ6HG4EJYEENT2OAOBDF3W5W.py.lock | 0 ...t_PEAK_None_5__7D72ALZRBNSP634JYUY7IV5P.py | 16 - ...K_None_5__7D72ALZRBNSP634JYUY7IV5P.py.lock | 0 ...EAK__20__None__2SYXPZCTOY3PKAO2L4ALLHLI.py | 16 - ...20__None__2SYXPZCTOY3PKAO2L4ALLHLI.py.lock | 0 ...EAK__None__20__54N5BOFSYCN6SMRBKXM4V4TW.py | 16 - ...None__20__54N5BOFSYCN6SMRBKXM4V4TW.py.lock | 0 .../fast/__sc/S1/f_taxi_fare_OFFPEAK.py | 16 - .../fast/__sc/S1/f_taxi_fare_OFFPEAK.py.lock | 0 .../fast/__sc/S1/f_taxi_fare_PEAK.py | 16 - .../fast/__sc/S1/f_taxi_fare_PEAK.py.lock | 0 .../fast/__sc/S1/f_taxi_wait_time_OFFPEAK.py | 16 - .../__sc/S1/f_taxi_wait_time_OFFPEAK.py.lock | 0 ...o_dist_OFFPEAK_HC62HOLRZIWJJDAOIFX5XHV6.py | 16 - ...t_OFFPEAK_HC62HOLRZIWJJDAOIFX5XHV6.py.lock | 0 .../fast/__sc/S1/f_taxi_wait_time_PEAK.py | 16 - .../__sc/S1/f_taxi_wait_time_PEAK.py.lock | 0 ...auto_dist_PEAK_CBYSKDURSGAJ4RHX2ASS76Q2.py | 16 - ...dist_PEAK_CBYSKDURSGAJ4RHX2ASS76Q2.py.lock | 0 .../fast/__sc/S1/f_tnc_pool_fare_OFFPEAK.py | 16 - .../__sc/S1/f_tnc_pool_fare_OFFPEAK.py.lock | 0 .../fast/__sc/S1/f_tnc_pool_fare_PEAK.py | 16 - .../fast/__sc/S1/f_tnc_pool_fare_PEAK.py.lock | 0 .../__sc/S1/f_tnc_pool_wait_time_OFFPEAK.py | 16 - .../S1/f_tnc_pool_wait_time_OFFPEAK.py.lock | 0 ...o_dist_OFFPEAK_FNBOP5IL57Q6SQM4VB7EXQBB.py | 16 - ...t_OFFPEAK_FNBOP5IL57Q6SQM4VB7EXQBB.py.lock | 0 .../fast/__sc/S1/f_tnc_pool_wait_time_PEAK.py | 16 - .../__sc/S1/f_tnc_pool_wait_time_PEAK.py.lock | 0 ...auto_dist_PEAK_NHA453KUTMUKTUCSMA2XQQZV.py | 16 - ...dist_PEAK_NHA453KUTMUKTUCSMA2XQQZV.py.lock | 0 .../fast/__sc/S1/f_tnc_solo_fare_OFFPEAK.py | 16 - .../__sc/S1/f_tnc_solo_fare_OFFPEAK.py.lock | 0 .../fast/__sc/S1/f_tnc_solo_fare_PEAK.py | 16 - .../fast/__sc/S1/f_tnc_solo_fare_PEAK.py.lock | 0 .../__sc/S1/f_tnc_solo_wait_time_OFFPEAK.py | 16 - .../S1/f_tnc_solo_wait_time_OFFPEAK.py.lock | 0 ...o_dist_OFFPEAK_CA5RZWRWZJWFNZATH2HHD3TO.py | 16 - ...t_OFFPEAK_CA5RZWRWZJWFNZATH2HHD3TO.py.lock | 0 .../fast/__sc/S1/f_tnc_solo_wait_time_PEAK.py | 16 - .../__sc/S1/f_tnc_solo_wait_time_PEAK.py.lock | 0 ...auto_dist_PEAK_2EZZEATSM4EAHST74DMGSFSS.py | 16 - ...dist_PEAK_2EZZEATSM4EAHST74DMGSFSS.py.lock | 0 .../fast/__sc/S1/f_transit_fare_OFFPEAK.py | 16 - .../__sc/S1/f_transit_fare_OFFPEAK.py.lock | 0 .../fast/__sc/S1/f_transit_fare_PEAK.py | 16 - .../fast/__sc/S1/f_transit_fare_PEAK.py.lock | 0 .../fast/__sc/S1/f_transit_ivtt_OFFPEAK.py | 16 - .../__sc/S1/f_transit_ivtt_OFFPEAK.py.lock | 0 .../fast/__sc/S1/f_transit_ivtt_PEAK.py | 16 - .../fast/__sc/S1/f_transit_ivtt_PEAK.py.lock | 0 .../fast/__sc/S1/f_transit_ovtt_OFFPEAK.py | 16 - .../__sc/S1/f_transit_ovtt_OFFPEAK.py.lock | 0 .../fast/__sc/S1/f_transit_ovtt_PEAK.py | 16 - .../fast/__sc/S1/f_transit_ovtt_PEAK.py.lock | 0 .../cmap_modedest/fast/__sc/S2/__init__.py | 312 -- .../fast/__sc/S2/__init__.py.lock | 0 ...auto_avail_HBO_EKWWH33ZEA3VXLR4UYBVLRUX.py | 16 - ...avail_HBO_EKWWH33ZEA3VXLR4UYBVLRUX.py.lock | 0 ...auto_avail_HBS_JA6SY3LPJJDVZQF7IFNL4EWX.py | 16 - ...avail_HBS_JA6SY3LPJJDVZQF7IFNL4EWX.py.lock | 0 ...uto_avail_HBWH_RSSCN3EFDQ2CM4RPVZVAP7K3.py | 16 - ...vail_HBWH_RSSCN3EFDQ2CM4RPVZVAP7K3.py.lock | 0 ...uto_avail_HBWL_VWN3Q4WQRAVVJ5ZTYY4OHM63.py | 16 - ...vail_HBWL_VWN3Q4WQRAVVJ5ZTYY4OHM63.py.lock | 0 ...auto_avail_NHB_XHHWLREMVWOEBM6NUQF7EFH6.py | 16 - ...avail_NHB_XHHWLREMVWOEBM6NUQF7EFH6.py.lock | 0 ...nsit_avail_HBO_K3RWOEPC3IXNAPRPQQJCHORY.py | 16 - ...avail_HBO_K3RWOEPC3IXNAPRPQQJCHORY.py.lock | 0 ...nsit_avail_HBS_5CZV3HKDPQJDWZME2XMN7NW6.py | 16 - ...avail_HBS_5CZV3HKDPQJDWZME2XMN7NW6.py.lock | 0 ...sit_avail_HBWH_NMEWQX35KIWZJMZ5IZZTZHOE.py | 16 - ...vail_HBWH_NMEWQX35KIWZJMZ5IZZTZHOE.py.lock | 0 ...sit_avail_HBWL_MPZ7IOPMILS7SZEG5T2D6HG2.py | 16 - ...vail_HBWL_MPZ7IOPMILS7SZEG5T2D6HG2.py.lock | 0 ...nsit_avail_NHB_WN7OPNQOSVQ544PG5Q2ZGTNF.py | 16 - ...avail_NHB_WN7OPNQOSVQ544PG5Q2ZGTNF.py.lock | 0 .../fast/__sc/S2/f_auto_avail_HBO.py | 16 - .../fast/__sc/S2/f_auto_avail_HBO.py.lock | 0 .../fast/__sc/S2/f_auto_avail_HBS.py | 16 - .../fast/__sc/S2/f_auto_avail_HBS.py.lock | 0 .../fast/__sc/S2/f_auto_avail_HBWH.py | 16 - .../fast/__sc/S2/f_auto_avail_HBWH.py.lock | 0 .../fast/__sc/S2/f_auto_avail_HBWL.py | 16 - .../fast/__sc/S2/f_auto_avail_HBWL.py.lock | 0 .../fast/__sc/S2/f_auto_avail_NHB.py | 16 - .../fast/__sc/S2/f_auto_avail_NHB.py.lock | 0 .../fast/__sc/S2/f_auto_parking_cost_HBO.py | 16 - .../__sc/S2/f_auto_parking_cost_HBO.py.lock | 0 .../fast/__sc/S2/f_auto_parking_cost_HBOR.py | 16 - .../__sc/S2/f_auto_parking_cost_HBOR.py.lock | 0 .../fast/__sc/S2/f_auto_parking_cost_HBS.py | 16 - .../__sc/S2/f_auto_parking_cost_HBS.py.lock | 0 .../fast/__sc/S2/f_auto_parking_cost_HBWH.py | 16 - .../__sc/S2/f_auto_parking_cost_HBWH.py.lock | 0 .../fast/__sc/S2/f_auto_parking_cost_HBWL.py | 16 - .../__sc/S2/f_auto_parking_cost_HBWL.py.lock | 0 .../fast/__sc/S2/f_auto_parking_cost_NHB.py | 16 - .../__sc/S2/f_auto_parking_cost_NHB.py.lock | 0 .../fast/__sc/S2/f_auto_parking_cost_NHBR.py | 16 - .../__sc/S2/f_auto_parking_cost_NHBR.py.lock | 0 .../fast/__sc/S2/f_auto_parking_cost_NHBS.py | 16 - .../__sc/S2/f_auto_parking_cost_NHBS.py.lock | 0 ...EAK__4_0__2_0__FPYQ4GNCVUNJNUMJTUIBMLKO.py | 16 - ...4_0__2_0__FPYQ4GNCVUNJNUMJTUIBMLKO.py.lock | 0 ...EAK__4_0__2_0__AJ26DYAVZX7MOBOG5SOJABST.py | 16 - ...4_0__2_0__AJ26DYAVZX7MOBOG5SOJABST.py.lock | 0 ...og_1_samp_wgt__PLSMOODNF77UOPHIVH6I2WBL.py | 16 - ...samp_wgt__PLSMOODNF77UOPHIVH6I2WBL.py.lock | 0 .../cmap_modedest/fast/__sc/S2/f_samp_wgt.py | 16 - .../fast/__sc/S2/f_samp_wgt.py.lock | 0 ...o_dist_OFFPEAK_U2242PIA3ZL4MJS726HCCG73.py | 16 - ...t_OFFPEAK_U2242PIA3ZL4MJS726HCCG73.py.lock | 0 ...auto_dist_PEAK_SVETJXGBSVYEYM7OVBAQW2PX.py | 16 - ...dist_PEAK_SVETJXGBSVYEYM7OVBAQW2PX.py.lock | 0 ...o_dist_OFFPEAK_22UIGWVENT7RTALQKKOHEPXM.py | 16 - ...t_OFFPEAK_22UIGWVENT7RTALQKKOHEPXM.py.lock | 0 ...auto_dist_PEAK_YHJNF2B3VEICSZL64Y2XLV4S.py | 16 - ...dist_PEAK_YHJNF2B3VEICSZL64Y2XLV4S.py.lock | 0 ...o_dist_OFFPEAK_ITAE2YOSBIY76DBTPIPT6QD2.py | 16 - ...t_OFFPEAK_ITAE2YOSBIY76DBTPIPT6QD2.py.lock | 0 ...auto_dist_PEAK_T52CC4SUBMFSLGDNMCSO7A7J.py | 16 - ...dist_PEAK_T52CC4SUBMFSLGDNMCSO7A7J.py.lock | 0 .../fast/__sc/S2/f_transit_avail_HBO.py | 16 - .../fast/__sc/S2/f_transit_avail_HBO.py.lock | 0 .../fast/__sc/S2/f_transit_avail_HBS.py | 16 - .../fast/__sc/S2/f_transit_avail_HBS.py.lock | 0 .../fast/__sc/S2/f_transit_avail_HBWH.py | 16 - .../fast/__sc/S2/f_transit_avail_HBWH.py.lock | 0 .../fast/__sc/S2/f_transit_avail_HBWL.py | 16 - .../fast/__sc/S2/f_transit_avail_HBWL.py.lock | 0 .../fast/__sc/S2/f_transit_avail_NHB.py | 16 - .../fast/__sc/S2/f_transit_avail_NHB.py.lock | 0 ...o_dist_OFFPEAK_IY4UAVBMS2HPHNYZJLSMWG3V.py | 16 - ...t_OFFPEAK_IY4UAVBMS2HPHNYZJLSMWG3V.py.lock | 0 ...auto_dist_PEAK_UIAXX4VIE5PP53PJMCSMEFOP.py | 16 - ...dist_PEAK_UIAXX4VIE5PP53PJMCSMEFOP.py.lock | 0 .../cmap_modedest/fast/application_data.py | 335 -- .../cmap_modedest/fast/parking_cost.py | 102 - .../cmap_modedest/fast/random_generator.py | 42 - .../cmap_modedest/fast/tnc_los.py | 388 -- .../cmap_modedest/fast/transit/__init__.py | 0 .../fast/transit/access_egress_distance.py | 165 - .../cmap_modedest/fast/transit/approach.py | 836 ---- .../cmap_modedest/hh_sampling.py | 25 - src/Mode-Dest-TOD/cmap_modedest/incomes.py | 99 - src/Mode-Dest-TOD/cmap_modedest/modecodes.py | 60 - .../cmap_modedest/numexpr_patch.py | 31 - .../cmap_modedest/parking_costs.py | 371 -- src/Mode-Dest-TOD/cmap_modedest/purposes.py | 60 - .../cmap_modedest/random_states.py | 46 - src/Mode-Dest-TOD/cmap_modedest/runtime.py | 40 - .../cmap_modedest/skims/__init__.py | 57 - .../cmap_modedest/skims/compression.py | 191 - .../cmap_modedest/skims/names.py | 15 - .../cmap_modedest/time_of_day_model.py | 130 - .../cmap_modedest/timeperiods.py | 51 - src/Mode-Dest-TOD/cmap_modedest/tnc_costs.py | 124 - .../cmap_modedest/transit_approach.py | 731 ---- .../cmap_modedest/transit_skim_convolution.py | 265 -- src/Mode-Dest-TOD/cmap_modedest/util.py | 138 - src/Mode-Dest-TOD/cmap_modedest/validation.py | 96 - src/Mode-Dest-TOD/nesting-tree.png | Bin 43030 -> 0 bytes src/Mode-Dest-TOD/requirements.txt | 5 - src/Mode-Dest-TOD/setup.py | 62 - .../sharrow/.idea/sharrow_lite.iml | 12 - src/Mode-Dest-TOD/sharrow/LICENSE | 29 - src/Mode-Dest-TOD/sharrow/README.md | 4 - src/Mode-Dest-TOD/sharrow/requirements.txt | 5 - src/Mode-Dest-TOD/sharrow/setup.py | 64 - src/Mode-Dest-TOD/sharrow/sharrow/__init__.py | 19 - src/Mode-Dest-TOD/sharrow/sharrow/dataset.py | 457 --- .../sharrow/sharrow/interface.py | 90 - .../sharrow/sharrow/local_dir.py | 6 - src/Mode-Dest-TOD/sharrow/sharrow/logging.py | 142 - src/Mode-Dest-TOD/sharrow/sharrow/maths.py | 80 - src/Mode-Dest-TOD/sharrow/sharrow/tables.py | 102 - src/Mode-Dest-TOD/tests/__init__.py | 0 .../tests/data/HH_VTYPE_TRIPS_IN.TXT | 624 --- src/Mode-Dest-TOD/tests/data/MCHO_DISTR.TXT | 3632 ---------------- src/Mode-Dest-TOD/tests/data/MCHO_M01.TXT | 3632 ---------------- src/Mode-Dest-TOD/tests/data/MCHO_M023.TXT | 6 - src/Mode-Dest-TOD/tests/data/MCHW_CBDPARK.TXT | 315 -- src/Mode-Dest-TOD/tests/data/MCHW_DISTR.TXT | 3632 ---------------- src/Mode-Dest-TOD/tests/data/MCHW_HH.TXT | 3632 ---------------- src/Mode-Dest-TOD/tests/data/MCHW_M01.TXT | 3632 ---------------- src/Mode-Dest-TOD/tests/data/MCHW_M023.TXT | 6 - src/Mode-Dest-TOD/tests/data/MCNH_DISTR.TXT | 3632 ---------------- src/Mode-Dest-TOD/tests/data/MCNH_M01.TXT | 3632 ---------------- src/Mode-Dest-TOD/tests/data/MCNH_M023.TXT | 6 - .../tests/data/MC_HO_NAMELIST.TXT | 46 - .../tests/data/MC_HWhigh_NAMELIST.TXT | 62 - .../tests/data/MC_HWlow_NAMELIST.TXT | 62 - .../tests/data/MC_NH_NAMELIST.TXT | 46 - src/Mode-Dest-TOD/tests/data/PDHO_DISTR.TXT | 3632 ---------------- src/Mode-Dest-TOD/tests/data/PDHO_M01.TXT | 3632 ---------------- src/Mode-Dest-TOD/tests/data/PDHO_M023.TXT | 6 - .../tests/data/PDHO_NAMELIST.TXT | 38 - src/Mode-Dest-TOD/tests/data/PDHW_CBDPARK.TXT | 315 -- src/Mode-Dest-TOD/tests/data/PDHW_DISTR.TXT | 3632 ---------------- src/Mode-Dest-TOD/tests/data/PDHW_M01.TXT | 3632 ---------------- src/Mode-Dest-TOD/tests/data/PDHW_M023.TXT | 6 - .../tests/data/PDHW_NAMELIST.TXT | 39 - src/Mode-Dest-TOD/tests/data/PDNH_DISTR.TXT | 3632 ---------------- src/Mode-Dest-TOD/tests/data/PDNH_M01.TXT | 3632 ---------------- src/Mode-Dest-TOD/tests/data/PDNH_M023.TXT | 6 - .../tests/data/PDNH_NAMELIST.TXT | 38 - .../tests/data/TG_HHENUM_OUTPUT.TXT.gz | Bin 3006579 -> 0 bytes .../tests/data/TRIP49_PA_OUT.TXT.gz | Bin 4741040 -> 0 bytes .../tests/data/TRIP49_PA_WFH_OUT.TXT.gz | Bin 4099457 -> 0 bytes src/Mode-Dest-TOD/tests/data/__HW_CBDPARK.TXT | 310 -- .../tests/data/__HW_CBDPARK2.TXT | 5 - .../tests/data/cmap_trip_config.yaml | 243 -- .../tests/data/default_auto_propensity.csv | 3633 ----------------- 344 files changed, 1 insertion(+), 68513 deletions(-) delete mode 100644 src/Mode-Dest-TOD/.gitignore delete mode 100644 src/Mode-Dest-TOD/README.md delete mode 100644 src/Mode-Dest-TOD/TECHNICALGUIDE.md delete mode 100644 src/Mode-Dest-TOD/USERGUIDE.md delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/__init__.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/__main__.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/addict.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/ae_distance_sim.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/application.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/choice_model.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/cmap_logging.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/configuration.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/data_handlers/__init__.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/data_handlers/distr_handler.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/data_handlers/filepaths.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/data_handlers/household_types.csv delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/data_handlers/household_types.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/data_handlers/m01_handler.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/data_handlers/m023_handler.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/data_handlers/pa_trip_types.csv delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/data_handlers/parking_handler.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/data_handlers/shp_handler.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/data_handlers/skims_handler.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/data_handlers/tabler.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/data_handlers/tg_handler.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/data_handlers/visitors.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/deadheading.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/estimation/__init__.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/estimation/est_choice.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/estimation/est_config.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/estimation/est_data.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/estimation/est_logging.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/estimation/est_sample_dest.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/estimation/est_skims_convol.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/estimation/est_survey.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/estimation/est_timeofday.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__init__.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/__init__.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/__init__.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/extra_funcs.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/extra_funcs.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/extra_vars.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/extra_vars.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_dist_OFFPEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_dist_OFFPEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_dist_PEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_dist_PEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_opcost_OFFPEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_opcost_OFFPEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_opcost_PEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_opcost_PEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_opcost_hov_PEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_opcost_hov_PEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_time_OFFPEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_time_OFFPEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_time_PEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_time_PEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_OFFPEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_OFFPEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_hiinc_PEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_hiinc_PEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_hov_hiinc_PEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_hov_hiinc_PEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_hov_loinc_PEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_hov_loinc_PEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_loinc_PEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_loinc_PEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_autopropensity.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_autopropensity.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___1_OWXSNW5EFKHSRO2IUCB6DHTR.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___1_OWXSNW5EFKHSRO2IUCB6DHTR.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___2_FIT25FYRGELBEONPX2MTPZFN.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___2_FIT25FYRGELBEONPX2MTPZFN.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___3_LIPIKNXA6ZB3PUNRJBVIHATL.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___3_LIPIKNXA6ZB3PUNRJBVIHATL.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___4_J3D56DXM2MR6NEMIQ6ALSFID.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___4_J3D56DXM2MR6NEMIQ6ALSFID.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___1_OTNZJFEFZT7N3JG6YKEUWGTF.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___1_OTNZJFEFZT7N3JG6YKEUWGTF.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___2_FY4D7BMCO2N4QRIA6QIIWTZI.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___2_FY4D7BMCO2N4QRIA6QIIWTZI.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___3_34BD5WGYZOPLALWPB2MCWKA7.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___3_34BD5WGYZOPLALWPB2MCWKA7.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___4_64S6AODYPVZP57LTAC522OHX.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___4_64S6AODYPVZP57LTAC522OHX.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBO.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBO.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBO____666_5VORECHSLO2A6MKP5I3SGJVQ.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBO____666_5VORECHSLO2A6MKP5I3SGJVQ.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBS.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBS.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBS____666_L3ZMVRT365KFSBLEDVABFEGL.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBS____666_L3ZMVRT365KFSBLEDVABFEGL.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWH.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWH.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWH____666_GW3RKVJQOVET3XE7MYE2MA7V.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWH____666_GW3RKVJQOVET3XE7MYE2MA7V.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWL.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWL.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWL____666_IQGLCTAX7EZOXKEFCIBK33BD.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWL____666_IQGLCTAX7EZOXKEFCIBK33BD.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_NHB.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_NHB.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_NHB____666_3GFB7KMY3JN5TSJE4MRRR2HM.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_NHB____666_3GFB7KMY3JN5TSJE4MRRR2HM.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_o_zone____dtaz_HXCH5HUPIDPV3EWONWFXBZHM.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_o_zone____dtaz_HXCH5HUPIDPV3EWONWFXBZHM.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_0_5_1_0__HZLL3YOGUR763JRQHG7SM6TX.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_0_5_1_0__HZLL3YOGUR763JRQHG7SM6TX.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_10_None__6EE7X5PWAQKBS6WQUONWVI63.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_10_None__6EE7X5PWAQKBS6WQUONWVI63.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_1_0_None__FBK6GF2KEWWDN7AL3ENVH3VS.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_1_0_None__FBK6GF2KEWWDN7AL3ENVH3VS.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_5_10__5RQTWWGPPCPP6EQU6ZV5MX2R.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_5_10__5RQTWWGPPCPP6EQU6ZV5MX2R.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_None_0_5__537AWC5AWFXLM3TRB3PPSGYZ.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_None_0_5__537AWC5AWFXLM3TRB3PPSGYZ.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_None_5__YWXA4HRZAVEZKC7EV5M2AX3B.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_None_5__YWXA4HRZAVEZKC7EV5M2AX3B.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_0_5_1_0__4K5ZPM55FQJVFMWKUPZIQ2ET.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_0_5_1_0__4K5ZPM55FQJVFMWKUPZIQ2ET.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_10_None__L3GKJNRUTTFCDUYV65K7KFQD.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_10_None__L3GKJNRUTTFCDUYV65K7KFQD.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_1_0_None__FMBHM5APW4TIH6B5EKSKSXYD.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_1_0_None__FMBHM5APW4TIH6B5EKSKSXYD.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_5_10__DSXTFACXD5HSWU7YKUPQEGAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_5_10__DSXTFACXD5HSWU7YKUPQEGAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_None_0_5__NZ6HG4EJYEENT2OAOBDF3W5W.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_None_0_5__NZ6HG4EJYEENT2OAOBDF3W5W.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_None_5__7D72ALZRBNSP634JYUY7IV5P.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_None_5__7D72ALZRBNSP634JYUY7IV5P.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_transit_ivtt_OFFPEAK__20__None__2SYXPZCTOY3PKAO2L4ALLHLI.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_transit_ivtt_OFFPEAK__20__None__2SYXPZCTOY3PKAO2L4ALLHLI.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_transit_ivtt_OFFPEAK__None__20__54N5BOFSYCN6SMRBKXM4V4TW.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_transit_ivtt_OFFPEAK__None__20__54N5BOFSYCN6SMRBKXM4V4TW.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_fare_OFFPEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_fare_OFFPEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_fare_PEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_fare_PEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_OFFPEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_OFFPEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_OFFPEAK_auto_dist_OFFPEAK_HC62HOLRZIWJJDAOIFX5XHV6.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_OFFPEAK_auto_dist_OFFPEAK_HC62HOLRZIWJJDAOIFX5XHV6.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_PEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_PEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_PEAK_auto_dist_PEAK_CBYSKDURSGAJ4RHX2ASS76Q2.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_PEAK_auto_dist_PEAK_CBYSKDURSGAJ4RHX2ASS76Q2.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_fare_OFFPEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_fare_OFFPEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_fare_PEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_fare_PEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_OFFPEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_OFFPEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_OFFPEAK_auto_dist_OFFPEAK_FNBOP5IL57Q6SQM4VB7EXQBB.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_OFFPEAK_auto_dist_OFFPEAK_FNBOP5IL57Q6SQM4VB7EXQBB.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_PEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_PEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_PEAK_auto_dist_PEAK_NHA453KUTMUKTUCSMA2XQQZV.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_PEAK_auto_dist_PEAK_NHA453KUTMUKTUCSMA2XQQZV.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_fare_OFFPEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_fare_OFFPEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_fare_PEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_fare_PEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_OFFPEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_OFFPEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_OFFPEAK_auto_dist_OFFPEAK_CA5RZWRWZJWFNZATH2HHD3TO.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_OFFPEAK_auto_dist_OFFPEAK_CA5RZWRWZJWFNZATH2HHD3TO.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_PEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_PEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_PEAK_auto_dist_PEAK_2EZZEATSM4EAHST74DMGSFSS.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_PEAK_auto_dist_PEAK_2EZZEATSM4EAHST74DMGSFSS.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_fare_OFFPEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_fare_OFFPEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_fare_PEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_fare_PEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ivtt_OFFPEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ivtt_OFFPEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ivtt_PEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ivtt_PEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ovtt_OFFPEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ovtt_OFFPEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ovtt_PEAK.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ovtt_PEAK.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/__init__.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/__init__.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBO_EKWWH33ZEA3VXLR4UYBVLRUX.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBO_EKWWH33ZEA3VXLR4UYBVLRUX.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBS_JA6SY3LPJJDVZQF7IFNL4EWX.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBS_JA6SY3LPJJDVZQF7IFNL4EWX.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBWH_RSSCN3EFDQ2CM4RPVZVAP7K3.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBWH_RSSCN3EFDQ2CM4RPVZVAP7K3.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBWL_VWN3Q4WQRAVVJ5ZTYY4OHM63.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBWL_VWN3Q4WQRAVVJ5ZTYY4OHM63.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_NHB_XHHWLREMVWOEBM6NUQF7EFH6.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_NHB_XHHWLREMVWOEBM6NUQF7EFH6.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBO_K3RWOEPC3IXNAPRPQQJCHORY.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBO_K3RWOEPC3IXNAPRPQQJCHORY.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBS_5CZV3HKDPQJDWZME2XMN7NW6.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBS_5CZV3HKDPQJDWZME2XMN7NW6.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBWH_NMEWQX35KIWZJMZ5IZZTZHOE.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBWH_NMEWQX35KIWZJMZ5IZZTZHOE.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBWL_MPZ7IOPMILS7SZEG5T2D6HG2.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBWL_MPZ7IOPMILS7SZEG5T2D6HG2.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_NHB_WN7OPNQOSVQ544PG5Q2ZGTNF.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_NHB_WN7OPNQOSVQ544PG5Q2ZGTNF.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBO.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBO.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBS.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBS.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBWH.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBWH.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBWL.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBWL.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_NHB.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_NHB.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBO.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBO.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBOR.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBOR.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBS.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBS.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBWH.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBWH.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBWL.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBWL.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_NHB.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_NHB.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_NHBR.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_NHBR.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_NHBS.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_NHBS.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_hard_sigmoid_transit_approach_walktime_OFFPEAK__4_0__2_0__FPYQ4GNCVUNJNUMJTUIBMLKO.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_hard_sigmoid_transit_approach_walktime_OFFPEAK__4_0__2_0__FPYQ4GNCVUNJNUMJTUIBMLKO.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_hard_sigmoid_transit_approach_walktime_PEAK__4_0__2_0__AJ26DYAVZX7MOBOG5SOJABST.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_hard_sigmoid_transit_approach_walktime_PEAK__4_0__2_0__AJ26DYAVZX7MOBOG5SOJABST.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_log_1_samp_wgt__PLSMOODNF77UOPHIVH6I2WBL.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_log_1_samp_wgt__PLSMOODNF77UOPHIVH6I2WBL.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_samp_wgt.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_samp_wgt.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_drivetime_OFFPEAK_auto_dist_OFFPEAK_U2242PIA3ZL4MJS726HCCG73.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_drivetime_OFFPEAK_auto_dist_OFFPEAK_U2242PIA3ZL4MJS726HCCG73.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_drivetime_PEAK_auto_dist_PEAK_SVETJXGBSVYEYM7OVBAQW2PX.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_drivetime_PEAK_auto_dist_PEAK_SVETJXGBSVYEYM7OVBAQW2PX.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_waittime_OFFPEAK_auto_dist_OFFPEAK_22UIGWVENT7RTALQKKOHEPXM.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_waittime_OFFPEAK_auto_dist_OFFPEAK_22UIGWVENT7RTALQKKOHEPXM.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_waittime_PEAK_auto_dist_PEAK_YHJNF2B3VEICSZL64Y2XLV4S.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_waittime_PEAK_auto_dist_PEAK_YHJNF2B3VEICSZL64Y2XLV4S.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_walktime_OFFPEAK_auto_dist_OFFPEAK_ITAE2YOSBIY76DBTPIPT6QD2.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_walktime_OFFPEAK_auto_dist_OFFPEAK_ITAE2YOSBIY76DBTPIPT6QD2.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_walktime_PEAK_auto_dist_PEAK_T52CC4SUBMFSLGDNMCSO7A7J.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_walktime_PEAK_auto_dist_PEAK_T52CC4SUBMFSLGDNMCSO7A7J.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBO.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBO.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBS.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBS.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBWH.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBWH.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBWL.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBWL.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_NHB.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_NHB.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_ovtt_OFFPEAK_auto_dist_OFFPEAK_IY4UAVBMS2HPHNYZJLSMWG3V.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_ovtt_OFFPEAK_auto_dist_OFFPEAK_IY4UAVBMS2HPHNYZJLSMWG3V.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_ovtt_PEAK_auto_dist_PEAK_UIAXX4VIE5PP53PJMCSMEFOP.py delete mode 100755 src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_ovtt_PEAK_auto_dist_PEAK_UIAXX4VIE5PP53PJMCSMEFOP.py.lock delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/application_data.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/parking_cost.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/random_generator.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/tnc_los.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/transit/__init__.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/transit/access_egress_distance.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/fast/transit/approach.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/hh_sampling.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/incomes.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/modecodes.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/numexpr_patch.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/parking_costs.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/purposes.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/random_states.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/runtime.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/skims/__init__.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/skims/compression.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/skims/names.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/time_of_day_model.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/timeperiods.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/tnc_costs.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/transit_approach.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/transit_skim_convolution.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/util.py delete mode 100644 src/Mode-Dest-TOD/cmap_modedest/validation.py delete mode 100644 src/Mode-Dest-TOD/nesting-tree.png delete mode 100644 src/Mode-Dest-TOD/requirements.txt delete mode 100644 src/Mode-Dest-TOD/setup.py delete mode 100644 src/Mode-Dest-TOD/sharrow/.idea/sharrow_lite.iml delete mode 100644 src/Mode-Dest-TOD/sharrow/LICENSE delete mode 100644 src/Mode-Dest-TOD/sharrow/README.md delete mode 100644 src/Mode-Dest-TOD/sharrow/requirements.txt delete mode 100644 src/Mode-Dest-TOD/sharrow/setup.py delete mode 100644 src/Mode-Dest-TOD/sharrow/sharrow/__init__.py delete mode 100644 src/Mode-Dest-TOD/sharrow/sharrow/dataset.py delete mode 100644 src/Mode-Dest-TOD/sharrow/sharrow/interface.py delete mode 100644 src/Mode-Dest-TOD/sharrow/sharrow/local_dir.py delete mode 100644 src/Mode-Dest-TOD/sharrow/sharrow/logging.py delete mode 100644 src/Mode-Dest-TOD/sharrow/sharrow/maths.py delete mode 100644 src/Mode-Dest-TOD/sharrow/sharrow/tables.py delete mode 100644 src/Mode-Dest-TOD/tests/__init__.py delete mode 100644 src/Mode-Dest-TOD/tests/data/HH_VTYPE_TRIPS_IN.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/MCHO_DISTR.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/MCHO_M01.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/MCHO_M023.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/MCHW_CBDPARK.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/MCHW_DISTR.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/MCHW_HH.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/MCHW_M01.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/MCHW_M023.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/MCNH_DISTR.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/MCNH_M01.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/MCNH_M023.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/MC_HO_NAMELIST.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/MC_HWhigh_NAMELIST.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/MC_HWlow_NAMELIST.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/MC_NH_NAMELIST.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/PDHO_DISTR.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/PDHO_M01.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/PDHO_M023.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/PDHO_NAMELIST.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/PDHW_CBDPARK.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/PDHW_DISTR.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/PDHW_M01.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/PDHW_M023.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/PDHW_NAMELIST.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/PDNH_DISTR.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/PDNH_M01.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/PDNH_M023.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/PDNH_NAMELIST.TXT delete mode 100755 src/Mode-Dest-TOD/tests/data/TG_HHENUM_OUTPUT.TXT.gz delete mode 100644 src/Mode-Dest-TOD/tests/data/TRIP49_PA_OUT.TXT.gz delete mode 100644 src/Mode-Dest-TOD/tests/data/TRIP49_PA_WFH_OUT.TXT.gz delete mode 100644 src/Mode-Dest-TOD/tests/data/__HW_CBDPARK.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/__HW_CBDPARK2.TXT delete mode 100644 src/Mode-Dest-TOD/tests/data/cmap_trip_config.yaml delete mode 100644 src/Mode-Dest-TOD/tests/data/default_auto_propensity.csv diff --git a/.gitignore b/.gitignore index ed0389f..646db4c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,6 @@ # Ignore compiled Python. **/__pycache__ -# Ignore files generated by installing Python eggs. -src/Mode-Dest-TOD/cmap_modedest.egg-info -src/Mode-Dest-TOD/sharrow/sharrow.egg-info - # Ignore large Emme project files. Database/emmemat Database/emmebank diff --git a/Scripts/manage/env/CMAP-TRIP2.yml b/Scripts/manage/env/CMAP-TRIP2.yml index 674f2a1..40a9b10 100644 --- a/Scripts/manage/env/CMAP-TRIP2.yml +++ b/Scripts/manage/env/CMAP-TRIP2.yml @@ -52,6 +52,4 @@ dependencies: - zarr=2.10 - pip: - emat - # Uses relative paths to local packages - - -e ../../../src/Mode-Dest-TOD - - -e ../../../src/Mode-Dest-TOD/sharrow \ No newline at end of file + - cmap_modedest @ git+https://github.com/CMAP-REPOS/cmap_modedest@v24.4.1 \ No newline at end of file diff --git a/src/Mode-Dest-TOD/.gitignore b/src/Mode-Dest-TOD/.gitignore deleted file mode 100644 index bee8a64..0000000 --- a/src/Mode-Dest-TOD/.gitignore +++ /dev/null @@ -1 +0,0 @@ -__pycache__ diff --git a/src/Mode-Dest-TOD/README.md b/src/Mode-Dest-TOD/README.md deleted file mode 100644 index 82de4bf..0000000 --- a/src/Mode-Dest-TOD/README.md +++ /dev/null @@ -1,81 +0,0 @@ -# CMAP Trip-based Model - -This directory contains the code needed to run the CMAP trip-based model's -mode, destination and time-of-day model components. - -## Installation Instructions - -- First, if "conda" is not already installed and accessible by the current user - on the target development machine, install it. An easy installation solution - is using the "Mambaforge" installer, which can be downloaded for windows here: - - > https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-Windows-x86_64.exe - - Once downloaded, double-click and run the installer. Mamba is a somewhat faster - implementation of the conda package installer, and can be used interchangably - with conda - nearly any command you might run as `conda foo` can also be run as - `mamba foo`. - -- Then if needed also install git and (optionally) the GitHub command line interface. - From either the Anaconda Prompt or the Miniforge Prompt, run: - - > mamba install git gh -c conda-forge - -- Now clone the CMAP trip-based model code from GitHub, and checkout the CS2021 branch. - - > gh repo clone camsys/cmap_trip-based_model - > cd cmap_trip-based_model - > git checkout CS2021 - - To clone into a different directory than the current directory (probably the - user's home directory) change to that directory using `cd` first. - -- Next, create a conda environment to use for the mode, destination and - time-of-day model components, which are written in Python. - Creating a unique environment will ensure that all the necessary computational - libraries are installed, and no conflicts are introduced with other tools - (including Emme). A conda environment file is included in the GitHub repository, - which installs everything you need into an environment called "CMAP-TRIP". - - > conda env create --file src/Mode-Dest-TOD/conda-environment.yml - - All the necessary files for a basic run of the model using the default base year - inputs are already in the `Database` folder of this repository, except for the - skim data, which is quite large. - -- Skim data can be accessed by the mode, destination and time-of-day model - components in one of two formats: either as uncompressed raw "emx" files stored - in the `Database/emmemat` directory, or as compressed and chunked files stored - in the `Database/emmemat.zarr` directory. A base year set of skims in zarr - format is available here: - - > https://camsys-my.sharepoint.com/:u:/p/jeffnewman/Eckzo0ouKfpKkpfiGtsLJBYB4zUQt6dZ5eloVisGIJV9gg?e=CNsW0M - -## Execution Instructions - -- To run the mode, destination, and time-of-day components for the CMAP Trip-based - model, first activate the correct conda environment. From either the Anaconda Prompt - or the Miniforge Prompt, run: - - > conda activate CMAP-TRIP - - (If you created an environment with some other name, activate that other environment instead.) - -- Then, you can run the model by calling its executable version right from that - same command prompt, pointing at the correct `Database` directory: - - > cmap_modedest .\path\to\Database - -- The `cmap_modedest` command line tool has a number of available options. The most important - of these include the number of jobs and maximum number of origin zones processed per chunk, - each of which needs to be set appropriately for the computer running the model to maximize - resource usage (CPU's, RAM) without exceeding available resources, which can cause - out-of-memory errors or processor thrashing that can slow the overall runtime. - These options can be reviewed in the online help: - - > cmap_modedest --help - - - - -cmap_modedest Database --njobs 12 --max_zone_chunk 5 \ No newline at end of file diff --git a/src/Mode-Dest-TOD/TECHNICALGUIDE.md b/src/Mode-Dest-TOD/TECHNICALGUIDE.md deleted file mode 100644 index 6ec0825..0000000 --- a/src/Mode-Dest-TOD/TECHNICALGUIDE.md +++ /dev/null @@ -1,66 +0,0 @@ -# Mode, Destination, and Time of Day Technical Guide - -## Functional Flow - -When you invoke the `cmap_modedest` tool on the command line, a Python session -is started and the `run` function (see `cmap_modedest/__main__.py`) is called. - -- `run()` in `cmap_modedest/__main__.py` - - This is the main control loop function. It processes command line arguments - and then launches `choice_simulator_trips_many` as configured. - -- `choice_simulator_trips_many()` in `cmap_modedest/application.py` - - This is the workhorse function, it breaks TAZ's into batches, starts multiple - parallel processes to handle trip simulation on the batches, and aggregates - the results. The other principal functions that this function calls include - `choice_simulator_trips`, `compute_deadhead_trip_table`, and `assemble_trips`. - -- `choice_simulator_trips()` in `cmap_modedest/application.py` - - This is the single-process function to model trips by mode/dest/time, called - once for each job started by `choice_simulator_trips_many`. - -- `compute_deadhead_trip_table()` in `cmap_modedest/application.py` - - This is where deadhead trips are created. - -- `assemble_trips()` in `cmap_modedest/application.py` - - This is where all the various parquet trip-list files are assembled into - a common dask DataFrame for processing. - -- `choice_simulator_initialize` in `cmap_modedest/application.py` - - This function checks if the mode+destination choice models have already been - loaded into memory for this process. If they have not, it then checks if - a pickled version of the choice models has been saved to disk, and loads that - if it is available. Otherwise, it initializes the choice models from scratch - using the `model_builder` function. - -- `model_builder` in `cmap_modedest/choice_model.py` - - This function creates the structure of the model and sets parameter - values within that structure if given. - -- `choice_simulator_prob` in `cmap_modedest/application.py` - - Here, the choice model is used to compute the probabilities for the mode and - destintion choices. - - - - -## Statefulness - -The program avoids creating a global "state" to facilitate passing the state to -subprocesses that actually execute jobs. Instead, a common DataHandler object -is used to pass state (i.e. the names of the input files, configuration options, -etc) from the main process to subprocessed. - -The main state object is a `DataHandler` object. This class is defined in -`cmap_modedest/data_handlers/__init__.py`. An instance of the DataHandler is passed -around between functions, generally as the first argument to each function that -needs it, as an argument named `dh`. - diff --git a/src/Mode-Dest-TOD/USERGUIDE.md b/src/Mode-Dest-TOD/USERGUIDE.md deleted file mode 100644 index 07a1111..0000000 --- a/src/Mode-Dest-TOD/USERGUIDE.md +++ /dev/null @@ -1,495 +0,0 @@ -# Mode, Destination, and Time of Day User Guide - -This document describes the Mode, Destination, and Time of Day (MDT) models, -including the basic conceptual structure, input files used, output files -generated, and method of operation. - -## Model Structure - -The CMAP trip-based model's MDT models are implemented in Python, using modern -multiprocessing techniques to greatly enhance the sensitivity and detail of the -model, without significantly increasing the overall model runtime. - -### Joint Mode and Destination - -The model includes an integrated mode and destination choice model. The mode and -destination choice model was estimated as a single model using full-information -maximum likelihood methods, which represents a significant theoretical enhancement -over two-step models (i.e. models where mode choice logsums are computed based on -the estimated mode choice model, and those logsums are used as static input values -when estimating parameters for a destination choice model). - -The integrated mode and destination choice model is represented as a hierarchical -nested logit model. The top of the nesting hierarchy represents the attraction -zone for each trip. For all home-based trips the attraction end is the non-home, -while for non-home-based trips it is modeled as the actual destination of the -trip in the normal sense. Below the attraction nest, the mode choice is further -sub-nested, with all private auto modes (SOV, HOV2, HOV3) grouped in one nest, -and all public auto modes (Taxi, TNC1, TNC2) grouped in a different nest. - -![](nesting-tree.png) - -For application, as this is a semi-aggregate model, there is no sampling of -alternatives. Thus, for each trip, the number of mode and destination alternatives -is 3632 zones times 9 modes = 32,688 alternatives. - -### Mode Choices - -The set of alternatives included explicitly in the mode choice level of the model -includes 9 discrete alternatives: - -1. SOV: Single occupant private vehicle (driving alone) -2. HOV2: 2-person trip in a private vehicle -3. HOV3: 3 or more persons sharing a private vehicle -4. Taxi -5. TNC1: Regular ride hail (e.g. Uber or Lyft) -6. TNC2: Shared ride hail (e.g. Uber Pool or Lyft Line) -7. Transit -8. Bike -9. Walk - - -### Transit Access and Egress - -To facilitate the implementation for these models, the calculation of transit -access and egress levels of service has been ported from Fortran to Python. -The actual mathematical logic underpinning these level of service calculations -is unchanged from the previous model, and is still based on a random distribution -of transit access characteristics computed based on the geography of each zone. - -### Work from Home Segmentation - -The unfolding pandemic has introduced a new wrinkle in travel demand forecasting: -unexpectedly large and deep uncertainty about the future of “work from home” -(WFH) behaviors. - -A fundamental challenge in modeling changing WFH behavior is that it impacts not -just the presence or absence of work trips, but also the number and temporal and -geographic distribution of non-work trips. A remote worker has much more limited -opportunity to undertake non-home-based trips in the middle of the day around the -workplace (e.g. going out for lunch in the loop) and much greater opportunity to -make home-based trips. - -The trip-based model has been built to include sensitivity to changes -in WFH, by bifurcating the regional population into two groups: households -that have at least one worker who works from home at least sometimes, and -households that have no WFH activity. Athough the parameters of the mode and -destination choice models are the same for both groups, the trip productions and -attractions by zone for these two groups differ, resulting in unique utility -functions and different behavior patterns for each. - -### Time of Day Models - -Although the mode and destination models are fully integrated, the time of day -models are estimated and applied separately as an independent step. These models, -which are applied only to automobile based modes (of both private and hired car -varieties), are sensitive to changes in congested travel times over the course -of the day. They are structured as a simple multinomial logit model, despite the -fact that the 8 modeled time periods are heterogeneously sized. This is not -problematic, as these models all include a complete set of alternative specific -constants, which represent not only behavioral preferences but also the aggregate -size (i.e. duration) of each time period. - -The utility functions for the time of day models are relatively simple compared -to the mode and destination models, as the differentiation available across the -alternatives is limited. Nevertheless, the models are structured to be sensitive -to congested travel times, as well as mode choice, as TNC usage exhibits a vastly -different temporal pattern than private auto usage, with many TNC rides clustered -in the evening and overnight hours. - - -## Input Files - -The descriptions here are focused on technical implementation, -i.e. what appears in these files, not where these values should come from. - -In most cases, there are several possible locations for each input file, which -are identified as "alternative file search locations"`under each heading. In -each case, the model checks each location in the order shown to find the file, -and the first location where a file exists is the location actually used. -Typically, files stored directly in the "Database" directory are preferred, but -fallback files from other locations can also used. This allows the MDT models to -run even if, for example, EMME has not been used to prepare a scenario specific -input file. - -In addition to the files below, the MDT models also read a wide variety of skim -data from various EMME matrix files found in the `emmemat` directory. - - -### HW_CBDPARK.TXT - -Alternative file search locations: -- HW_CBDPARK.TXT -- defaults_base_year/HW_CBDPARK.TXT - -This file contains CBD parking cost inputs. Two different sets of records are -included in the file. The first set identifies the parking supply characteristics -of each CBD zone that contains parking. Each zone in this set has five records -with the following information: - -- CBD parking zone number. -- The probability of finding parking within the zone at the threshold parking - cost (this value must be 100 percent in each zone’s fifth record). -- The threshold parking cost in cents per hour. -- The savings in parking costs in cents per hour determined by subtracting the - threshold parking cost from the maximum parking cost in the zone. -- The amount of time needed to walk one block in the CBD (180 seconds). - -Parking user characteristics are included in the second set of records in the -CBD parking file – these correspond to the final five records in the file. These -records are ordered by household income ranges and include the following variables -for CBD commuters: - -- The upper value of the household income quintile range (last record is the - lower bound of the highest quintile). -- The percentage of CBD auto commuters with free parking. -- The percentage of all CBD workers taking transit to CBD. -- The percentage of CBD auto commuters in single occupant vehicles. -- The percentage of CBD auto commuters ridesharing in two person vehicles -- The percentage of CBD auto commuters carpooling in three person vehicles. -- The percentage of CBD auto commuters carpooling in four or more person vehicles. - - -### ALLPURPOSE_M01.TXT - -Alternative file search locations: -- ALLPURPOSE_M01.TXT -- defaults_base_year/ALLPURPOSE_M01.TXT - -The M01 file stores several variables to provide the mode choice and distribution -models with zonal transit availability and park and ride characteristic parameters. -Some of the parameters are calculated using transit network characteristics and -are specific to each scenario network. The contents of the M01 file are summarized: - -1. Zone Number -2. Zone Type - - 1=Chicago downtown - - 2=Rest of Chicago - - 3=dense suburban CBD - - 4=all other zones -3. Park and Ride Cost - The cost of parking at the park and ride lot closest to the zone’s geographic - centroid. This represents the lowest rate of either the daily parking rate or the cost of a monthly parking pass divided by twenty work days. -4. Median zone household income - The median household income in the zone (in $100s) -5. Park and ride availability - A binary value indicating that the zone has park and ride access if - there is a park and ride location within ten miles of the zone’s - geographic centroid. -6. Average waiting time for bus service in zone for home-work trips -7. Average waiting time for bus service in zone for non-work trips -8. Average waiting time for feeder bus service in zone for home-work trips -9. Average waiting time for feeder bus service in zone for non-work trips -10. Home-work trip auto work end auto occupancy - -> Note: In prior version of the CMAP trip-based model, separate nearly identical copies -> of the M01 files were needed to support pre-distribution and mode choice -> components, e.g. PDHW_M01 and MCHW_M01. The current model does not require -> separate files, so the model reads only a common file with an ALLPURPOSE prefix. - - -### ALLPURPOSE_M023.TXT - -Alternative file search locations: -- ALLPURPOSE_M023.TXT -- defaults_base_year/ALLPURPOSE_M023.TXT - -The M023 file contains transit fare and auto operating cost data used by the -distribution and mode choice models. The file is composed of six records: - -1. CTA fares; -2. Pace feeder bus fares; -3. Pace regional bus fares; -4. Auto operating costs in 5 mile per hour increments for speeds - between 0-40 miles per hour; -5. Auto operating costs in 5 mile per hour increments for speeds - between 40-80 miles per hour; -6. Average auto operating costs per mile by zone type used to estimate - transit access/egress costs. - -The last record in the file contains the average per mile auto operating cost -for each of the four zone types (defined in the M01 file). The M023 data is -collapsed into six records. All values are reported in cents. - -> Note: In prior version of the CMAP trip-based model, separate identical copies -> of the M023 files were needed to support pre-distribution and mode choice -> components, e.g. PDHW_M023 and MCHW_M023. The current model does not require -> separate files, so the model reads only a common file with an ALLPURPOSE prefix. - - -### ??_DISTR.TXT - -Variants: -- HW_DISTR.TXT -- HO_DISTR.TXT -- NH_DISTR.TXT - -Alternative file search locations: -- ??_DISTR.TXT -- defaults_base_year/??_DISTR.TXT - -The DISTR files contain zonal transit approach distribution parameters. The -parameters are calculated using transit network characteristics and are thus -specific to each scenario network. The following describes the DISTR file fields. - -1. CMAP modeling zone number -2. Commuter Rail: Mean distance in miles to station -3. Commuter Rail: Standard deviation of distance to station -4. Commuter Rail: Type of Mode Choice distribution, with - - 101 = normal distribution. - - 102 = exponential distribution. -5. CTA Rail: Mean distance in miles to station -6. CTA Rail: Standard deviation of distance to station -7. CTA Rail: Type of Mode Choice distribution, with - - 101 = normal distribution. - - 102 = exponential distribution. -8. Regular Bus: Minimum bus stop distance -9. Regular Bus: Maximum bus stop distance -10. Regular Bus: Proportion of the zone within minimum walking distance -11. Feeder Bus: Minimum bus stop distance -12. Feeder Bus: Maximum bus stop distance -13. Feeder Bus: Proportion of the zone within minimum walking distance -14. Park and Ride: Mean distance in miles to lot -15. Park and Ride: Standard deviation of distance to lot -16. Park and Ride: Type of Mode Choice distribution, with - - 101 = normal distribution. - - 102 = exponential distribution. - -> Note: In prior version of the CMAP trip-based model, separate identical copies -> of the DISTR files were needed to support pre-distribution and mode choice -> components, e.g. PDHW_DISTR and MCHW_DISTR. The current model does not require -> separate files by component, so the model reads only a common file without the component- -> specific prefix. The purpose-specific prefix is still required, as the data in -> these files can vary by purpose. - - -### cmap_trip_config.yaml - -This yaml file contains a variety of model configurations, including: -- Taxi and TNC fare parameters -- Parking costs for zones other than those enumerated explicitly in `CBD_PARK` -- Intrazonal auto speeds by area type -- The regional income distribution across 5 income buckets -- Average occupancy of HOV3+ vehicles by trip purpose -- Activity durations by purpose (used to compute total parking costs) -- The number of replications used to simulate transit access and egress factors -- Factors by purpose to split trips into production-attraction and attraction-production -- Superdistrict codes for geographic validation summaries - - -### choice_model_params.yaml - -Alternative file search locations: -- choice_model_params.yaml -- cache/choice_model_params.yaml - -This file contains the choice model parameters used in the mode and destination -model. Mode and destination are modeled simultaneously in a single multi-level -nested logit structure. - - -### tod_model_params.yaml - -Alternative file search locations: -- tod_model_params.yaml -- cache/tod_model_params.yaml - -This file contains the choice model parameters used in the time-of-day model. -This model is only applied to auto trips, both private auto (sov, hov) and -hired-car (taxi, tnc) modes. - - -### CMAP_Zone_Districts.csv.gz - -Alternative file search locations: -- CMAP_Zone_Districts.csv.gz -- cache/CMAP_Zone_Districts.csv.gz - -This file is used to attach district and super-district codes to the resulting -trip tables, primarily for validation purposes. - - -### TG_HHENUM_OUTPUT.TXT.gz - -Alternative file search locations: -- TG_HHENUM_OUTPUT.TXT.gz -- cache/TG_HHENUM_OUTPUT.TXT.gz -- TG_HHENUM_OUTPUT.TXT -- cache/TG_HHENUM_OUTPUT.TXT -- defaults_base_year/TG_HHENUM_OUTPUT.TXT.gz - -This file, which is created as an output of the trip generation model, lists the -subzone and zone of each enumerated household, as well as the HHVTYPE. - - -### value_of_time_buckets.csv - -Alternative file search locations: -- value_of_time_buckets.csv -- cache/value_of_time_buckets.csv - -This file describes the share of single occupant vehicles to put into each of the -value of time buckets, based on trip purpose and household income group. If a -row does not sum to 1.0, the values will be scaled linearly so that the totals -are 1 and all trips are assigned to a bucket. - - -### CMAP_TripTable_VisitorsWeekday.csv.gz - -Alternative file search locations: -- cache/CMAP_TripTable_VisitorsWeekday.csv.gz -- CMAP_TripTable_VisitorsWeekday.csv.gz -- defaults_base_year/CMAP_TripTable_VisitorsWeekday.csv.gz - -This file contains a pre-computed trip table for weekday visitors (i.e. non-CMAP -region residents). It is used to replace the destination choice component for -visitor trips, although a mode choice model is still applied to distribute -visitor trips across modes. - - -### default_auto_propensity.csv.gz - -Alternative file search locations: -- cache/computed_auto_propensity.csv -- computed_auto_propensity.csv -- defaults_base_year/default_auto_propensity.csv -- defaults_base_year/default_auto_propensity.csv.gz - -This file contains the propensity of home-based trips to be attracted to a given -zone using a private auto mode (SOV or HOV). It is used to adjust the probability -that non-home-based trips produced in this zone will also use a private auto mode. - -To aid in computational efficiency, the model implementation uses computed auto -propensity lagged by one feedback iteration. That is, the computed auto propensity -from the prior global iteration is used at each iteration. When there is no prior -iteration (i.e. on the first iteration) then the default auto propensity is used. - - -## Output Files - -### cache/choice_simulator_trips_out/choice_simulator_trips_*.pq - -The primary output of the MDT models is a roster of trips. When the model is -run in multiprocessing/parallel mode, which is the default, individual trip -roster files are written out for each "job", so there will be numerous individual -trip roster files, which should be considered as different parts that can be -concatenated into one master trip roster table. The overall computational work is -split into numerous independent jobs, where just a few trip production/origin -zones are processed together in a batch. Moreover, the trips made by -work-from-home (WFH) households are modeled independently from trips made by -"typical" households that do not include a WFH person, so these trips are -seperated into two computational jobs even for the same zones. - -Each *.pq file is a [parquet format](https://parquet.apache.org/) file containing -a roster of trips, segmented on the following dimensions: - -- Trip Purpose - - HBWH: Home-based work trips by high-income households - - HBWL: Home-based work trips by low-income households - - HBS: Home-based shopping trips - - HBO: Home-based other purpose trips - - NHB: Non-home based trips - - VISIT: Trips made by visitors to the region - - DEAD: Deadhead trips made taxis and rideshare vehicles between revenue trips -- Mode - - 1: SOV - - 2: HOV2 - - 3: HOV3+ - - 4: TAXI - - 5: TNC Private / Regular - - 6: TNC Shared / Pooled - - 7: TRANSIT - - 8: WALK - - 9: BIKE -- Origin Zone - - TAZ number for the trip origin. Note this is always the beginning of the - actual trip, and not necessarily the home/production zone, e.g. for trips - returning home from a workplace, the origin zone is the workplace. -- Destination Zone - - TAZ number for the trip destination. Note this is always the end of the - actual trip, and not necessarily the attraction zone, e.g. for trips - returning home from a workplace, the destination zone is home. -- Attraction Zone - - TAZ number for the trip attraction zone. This can be either the production - or attraction zone, depending on directionality of the trip. For trips modeled - as O-D instead of P-A, the attraction zone is always the destination. -- Number of Autos Owned by Household - - The number of automobiles (0, 1, or 2) owned by the household of the person - making the trip. This is only applicable for home-based trips, as consistent - tours are not maintained and the model cannot use auto ownership for - anything other than home-based trips. -- Household Income Category - - The household income category (1 through 5 inclusive) of the person - making the trip. This is computed based on the income profile of zone households - for home-based trips, and based on the regional average income profile for - non-home-based trips, as consistent tours are not maintained. -- Time Period - - One of 9 time periods {EA, AM1, AM2, AM3, MD, PM1, PM2, PM3} is assigned for - all public and hired auto trips. No time period is actually assigned for - transit or non-motorized trips, trips by these modes are marked with 'NA'. - -Each new run of the MDT model generates a new `choice_simulator_trips_out` -directory in the `Database\cache` folder. Previous output directories are -rotated with a dot-number extensions, so that the un-numbered output directory is -the most recent output. - -### emmemat/mf*.emx - -Unless the "--no-aggregate" option is set, the trip roster is also aggregated -into Emme matrix files of vehicle trips for automobile modes, and person trips -for transit. In contrast to the trip roster files, which are written to a -rotated directory that prevents data loss, new EMX files will overwrite any -existing data stored with the same filename. - -For all automobile modes, trips are aggregated from person trips to vehicle -trips. SOV trips are split into three value of time categories according to the -ratios given in the `value_of_time_buckets.csv` input file. HOV2 and HOV3+ modes -are each in a single bucket, but are converted from person trips to vehicle trips -based on auto occupancy, which is 2 for HOV2 and slightly over 3 for HOV3+, the -exact value varies by purpose and is given by the `hov3_occupancy` key in the -`cmap_trip_config.yaml` input file. - -The time of day dimension for auto trips is preserved, along with origin and -destination, yielding 8 full matrix tables per bucket, organized as follows: - -- SOV low value of time – mf411-mf418 -- SOV med value of time – mf421-mf428 -- SOV high value of time – mf431-mf438 -- HOV2 not diff'd by vot – mf441-mf448 -- HOV3 not diff'd by vot – mf451-mf458 - -In each group, the time of day ordering is the same, with the last digit of the -file name representing the time period: - -- 1: EA -- 2: AM1 -- 3: AM2 -- 4: AM3 -- 5: MD -- 6: PM1 -- 7: PM2 -- 8: PM3 - -Unlike auto trips, transit person trips are not aggregated to vehicles nor -segmented by time period. Instead, transit person trips are segmented only by -trip purpose, yielding just 5 full matrix tables: - -- home-based work low income - mf40 -- home-based work high income - mf41 -- home-based shopping - mf39 -- home-based other - mf42 -- non-home-based - mf43 - - -### cache/choice_simulator_trips_out/validation_data.xlsx - -This excel file contains some extra validation output of the MDT models. -The file contains the following worksheets of partially aggregated data, -consistent with the format of the validation template: - -- Autos: Regional trips aggregated by purpose, mode, and auto ownership. -- Incomes: Regional trips aggregated by purpose, mode, and household income category. -- TimePeriod: Regional trips aggregated by purpose, mode, and time period. -- FlowsByPurp&Mode: Selected superdistrict-to-superdistrict trip flows by mode and purpose. -- FlowsByPurp&Mode%: Selected superdistrict-to-superdistrict mode shares by purpose. - diff --git a/src/Mode-Dest-TOD/cmap_modedest/__init__.py b/src/Mode-Dest-TOD/cmap_modedest/__init__.py deleted file mode 100644 index ba3e4a8..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# CMAP Trip-based model tools - -__version__ = '21.01.1' - -from .cmap_logging import * -from .numexpr_patch import CacheDictSafe diff --git a/src/Mode-Dest-TOD/cmap_modedest/__main__.py b/src/Mode-Dest-TOD/cmap_modedest/__main__.py deleted file mode 100644 index e1c0832..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/__main__.py +++ /dev/null @@ -1,274 +0,0 @@ -import sys -import os -import shutil -import time -import datetime - -import numpy as np -import pandas as pd -import argparse -import cmap_modedest - -def main(*args): - - parser = argparse.ArgumentParser( - prog='cmap_modedest', - description='Mode, destination, and time-of-day for CMAP trip-based model.', - ) - parser.add_argument( - 'database_dir', - type=str, - help='The path of the current database directory, which is used as the ' - 'base location for loading all input files.', - ) - parser.add_argument( - '-l', '--loglevel', - type=int, - help='The logging level, or how verbose the log output should be. Set to ' - '10 or less for debug-level output.', - default=20, - ) - parser.add_argument( - '--max_zone_chunk', - type=int, - help='Maximum number of zones to process in one chunk. Each job can ' - 'process a few zones at once, but trying to run too many can ' - 'trigger out-of-memory problems.', - default=4, - ) - parser.add_argument( - '--njobs', - type=int, - help=""" - Number of jobs to process in parallel. Larger computers with more CPUs - can handle more jobs at the same time.""", - default=10, - ) - parser.add_argument( - '--stagger', - type=int, - help=""" - Number of seconds to pause between initial parallel starts. - This can stagger storage-heavy and cpu-heavy sections of code to - better distribute workload.""", - default=5, - ) - parser.add_argument( - '--short', - type=float, - help=""" - Whether to shorten runtime by processing only a subset of origin zones. - Give a fraction less than one to run that fraction of zones spread over - the entire region, or an integer 1 or more to run in a single process - that number of zones starting from the first zone. This feature is - primarily for testing and quick validation. - """, - ) - parser.add_argument( - '--no-aggregate', - action="store_true", - help=""" - Disable vehicle trip table aggregation. If not set, the vehicle trip - tables in Database/emmemat will be overwritten. - """, - ) - parser.add_argument( - '--subdir', - type=str, - help="""cache subdirectory into which results are saved""", - default="choice_simulator_trips_out", - ) - parser.add_argument( - '--check', - help='Check input arguments to this command (including default arguments) ' - 'and the exit without processing anything.', - action="store_true", - ) - parser.add_argument( - '--rebuild', - help='Rebuild all numba caches. Try setting this argument in the model is ' - 'crashing unexpectedly. Rebuilding caches takes a little time but is ' - 'potentially necessary when switching the code to a new computer.', - action="store_true", - ) - parser.add_argument( - '--profile', - help='Run in profiler mode. This will slow down the model run somewhat, ' - 'but provide a profiling report for code optization. This features ' - 'requires that the pyinstrument library is installed.', - action="store_true", - ) - parser.add_argument( - '--tbb', - help='Use the TBB backend for numba. Experimental', - action="store_true", - ) - parser.add_argument( - '--zarr-to-emmemat', - help='Convert all matrix files that are only found in the emmemat.zarr ' - 'format into standard emmemat .EMX files, and then quit. Note that ' - 'EMME may not recognize these files as included in the model data ' - 'unless they were previously initialized.', - action="store_true", - ) - - args = parser.parse_args() - return run(args) - - -def run(args): - if args.tbb or os.environ.get("NUMBA_THREADING_LAYER", None) in ("safe", "tbb"): - from numba import config, njit, threading_layer - # set the threading layer before any parallel target compilation - config.THREADING_LAYER = 'tbb' - - @njit(parallel=True) - def foo(a, b): - return a + b - - x = np.arange(10.) - y = x.copy() - - # this will force the compilation of the function, select a threading layer - # and then execute in parallel - foo(x, y) - - # demonstrate the threading layer chosen - print("Threading layer chosen: %s" % threading_layer()) - os.environ["NUMBA_THREADING_LAYER"] = "tbb" - - - log_dir = os.path.join(args.database_dir, "cache", "logs") - os.makedirs(log_dir, exist_ok=True) - log = cmap_modedest.log_to_stderr( - level=args.loglevel, - log_dir=log_dir, - ) - - if args.profile: - from pyinstrument import Profiler - profiler = Profiler() - profiler.start() - - from cmap_modedest.runtime import working_dir, log_info - log.info(time.strftime("RUN STARTED %A, %d %B %Y, %I:%M:%S %p")) - start_time = time.time() - try: - log_info("###################################################################") - log_info("## CMAP TRIP-BASED MODEL: MODE, DESTINATION, AND TIME OF DAY ##") - log_info("###################################################################") - if not os.path.isdir(args.database_dir): - raise NotADirectoryError(args.database_dir) - log_info(f"# database_dir = {args.database_dir}") - log_info(f"# (full path) = {os.path.abspath(args.database_dir)}") - log_info(f"# --max_zone_chunk = {args.max_zone_chunk}") - log_info(f"# --njobs = {args.njobs}") - if args.short is not None and args.short >= 1.0 and args.njobs > 1: - log_info(f"# -> n_jobs is set to 1 when running in sequential short mode") - log_info(f"# --stagger = {args.stagger}") - log_info(f"# --short = {args.short}") - log_info(f"# --subdir = {args.subdir}") - log_info(f"# --check = {args.check}") - log_info(f"# --rebuild = {args.rebuild}") - log_info(f"# --tbb = {args.tbb}") - log_info(f"# --zarr-to-emmemat = {args.zarr_to_emmemat}") - log_info("###################################################################") - - if args.check: return # early exit if only checking arguments - - if args.rebuild: - import pathlib - here = os.path.dirname(__file__) - for p in pathlib.Path(here).rglob('*.py[co]'): - p.unlink() - for p in pathlib.Path(here).rglob('*.nb[ci]'): - p.unlink() - - - from cmap_modedest.application import choice_simulator_trips_many, choice_simulator_trips, assemble_trips - - if args.zarr_to_emmemat: - working_dir(args.database_dir, backfill_uncompressed_skims=True) - return - - dh = working_dir(args.database_dir) - - ## Rename subdir folder if it already exists. - cache_subdir = dh.filenames.cache_dir / args.subdir - if os.path.exists(cache_subdir): - n = 1 - while os.path.exists(cache_subdir.with_suffix(f".{n:03d}")): - n += 1 - shutil.move(cache_subdir, cache_subdir.with_suffix(f".{n:03d}")) - - - if args.short is None: - otaz = None - n_jobs = args.njobs - elif args.short < 1.0: - otaz = np.linspace(1, 3632, int(np.round(3632 * args.short)), dtype=int) - n_jobs = args.njobs - else: # args.short >= 1.0: - otaz = np.arange(0, int(args.short)) + 1 - n_jobs = 1 - - choice_simulator_trips_many( - dh, - otaz=otaz, - max_chunk_size=args.max_zone_chunk, - n_jobs=n_jobs, - cache_subdir=args.subdir, - with_wfh=True, - staggertime=args.stagger, - ) - - sim_trips_many = assemble_trips( - dh, - from_dir=dh.filenames.cache_dir / args.subdir, - pattern="choice_simulator_trips_*.pq", - compute_auto_propensity=False, - ) - - if True: - from cmap_modedest.validation import validation_aggregation - validation_aggregation(dh, sim_trips_many, to_dir=dh.filenames.cache_dir / args.subdir) - - if sim_trips_many is not None and not args.no_aggregate: - log.info("Aggregating trips to vehicle trip tables by value of time and time of day") - from cmap_modedest.application import aggregate_to_vehicle_matrixes - aggregate_to_vehicle_matrixes(dh, sim_trips_many) - - if sim_trips_many is not None: - s = str( - sim_trips_many - .groupby(["mode", "purpose"])['trips'] - .sum() - .compute() - .unstack(0) - .fillna(0) - ) - log_info(f"Trip Summary by Mode and Purpose ------\n{s}") - - s = str( - sim_trips_many - .groupby(["hh_inc5", "purpose"])['trips'] - .sum() - .compute() - .unstack(0) - .fillna(0) - ) - log_info(f"Trip Summary by Income and Purpose ------\n{s}") - - log_info("#### COMPLETED: MODE, DESTINATION, AND TIME OF DAY ####") - finally: - log.info(time.strftime("RUN ENDED %A, %d %B %Y, %I:%M:%S %p")) - end_time = time.time() - log.info(f"ELAPSED TIME {datetime.timedelta(seconds=end_time-start_time)}") - - if args.profile: - profiler.stop() - print(profiler.output_text(unicode=True, color=True)) - - -if __name__ == "__main__": - sys.exit(main()) \ No newline at end of file diff --git a/src/Mode-Dest-TOD/cmap_modedest/addict.py b/src/Mode-Dest-TOD/cmap_modedest/addict.py deleted file mode 100644 index 734665a..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/addict.py +++ /dev/null @@ -1,203 +0,0 @@ -# - from https://github.com/mewwts/addict -# - edited to allow pickling -# -# The MIT License (MIT) -# -# Copyright (c) 2014 Mats Julian Olsen -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - - -import copy - - -class Dict(dict): - - def __init__(__self, *args, **kwargs): - object.__setattr__(__self, '__parent', kwargs.pop('__parent', None)) - object.__setattr__(__self, '__key', kwargs.pop('__key', None)) - object.__setattr__(__self, '__frozen', False) - for arg in args: - if not arg: - continue - elif isinstance(arg, dict): - for key, val in arg.items(): - __self[key] = __self._hook(val) - elif isinstance(arg, tuple) and (not isinstance(arg[0], tuple)): - __self[arg[0]] = __self._hook(arg[1]) - else: - for key, val in iter(arg): - __self[key] = __self._hook(val) - - for key, val in kwargs.items(): - __self[key] = __self._hook(val) - - def __setattr__(self, name, value): - if hasattr(self.__class__, name): - raise AttributeError("'Dict' object attribute " - "'{0}' is read-only".format(name)) - else: - self[name] = value - - def __setitem__(self, name, value): - isFrozen = (hasattr(self, '__frozen') and - object.__getattribute__(self, '__frozen')) - if isFrozen and name not in super(Dict, self).keys(): - raise KeyError(name) - super(Dict, self).__setitem__(name, value) - try: - p = object.__getattribute__(self, '__parent') - key = object.__getattribute__(self, '__key') - except AttributeError: - p = None - key = None - if p is not None: - p[key] = self - object.__delattr__(self, '__parent') - object.__delattr__(self, '__key') - - def __add__(self, other): - if not self.keys(): - return other - else: - self_type = type(self).__name__ - other_type = type(other).__name__ - msg = "unsupported operand type(s) for +: '{}' and '{}'" - raise TypeError(msg.format(self_type, other_type)) - - @classmethod - def _hook(cls, item): - if isinstance(item, dict): - return cls(item) - elif isinstance(item, (list, tuple)): - try: - return type(item)(cls._hook(elem) for elem in item) - except TypeError: - # some subclasses don't implement a constructor that - # accepts a generator, e.g. namedtuple - return type(item)(*(cls._hook(elem) for elem in item)) - return item - - def __getattr__(self, item): - return self.__getitem__(item) - - def __missing__(self, name): - if object.__getattribute__(self, '__frozen'): - raise KeyError(name) - return self.__class__(__parent=self, __key=name) - - def __delattr__(self, name): - del self[name] - - def to_dict(self): - base = {} - for key, value in self.items(): - if isinstance(value, type(self)): - base[key] = value.to_dict() - elif isinstance(value, (list, tuple)): - try: - base[key] = type(value)( - item.to_dict() if isinstance(item, type(self)) else - item for item in value) - except TypeError: - # some subclasses don't implement a constructor that - # accepts a generator, e.g. namedtuple - base[key] = type(value)(*( - item.to_dict() if isinstance(item, type(self)) else - item for item in value)) - else: - base[key] = value - return base - - def copy(self): - return copy.copy(self) - - def deepcopy(self): - return copy.deepcopy(self) - - def __deepcopy__(self, memo): - other = self.__class__() - memo[id(self)] = other - for key, value in self.items(): - other[copy.deepcopy(key, memo)] = copy.deepcopy(value, memo) - return other - - def update(self, *args, **kwargs): - other = {} - if args: - if len(args) > 1: - raise TypeError() - other.update(args[0]) - other.update(kwargs) - for k, v in other.items(): - if ((k not in self) or - (not isinstance(self[k], dict)) or - (not isinstance(v, dict))): - self[k] = v - else: - self[k].update(v) - - def __getnewargs__(self): - return tuple(self.items()) - - def __getstate__(self): - state = self.to_dict() - isFrozen = (hasattr(self, '__frozen') and - object.__getattribute__(self, '__frozen')) - state['__addict__frozen__'] = isFrozen - return state - - def __setstate__(self, state): - shouldFreeze = state.pop('__addict__frozen__', False) - self.update(state) - self.freeze(shouldFreeze) - - def __or__(self, other): - if not isinstance(other, (Dict, dict)): - return NotImplemented - new = Dict(self) - new.update(other) - return new - - def __ror__(self, other): - if not isinstance(other, (Dict, dict)): - return NotImplemented - new = Dict(other) - new.update(self) - return new - - def __ior__(self, other): - self.update(other) - return self - - def setdefault(self, key, default=None): - if key in self: - return self[key] - else: - self[key] = default - return default - - def freeze(self, shouldFreeze=True): - object.__setattr__(self, '__frozen', shouldFreeze) - for key, val in self.items(): - if isinstance(val, Dict): - val.freeze(shouldFreeze) - - def unfreeze(self): - self.freeze(False) diff --git a/src/Mode-Dest-TOD/cmap_modedest/ae_distance_sim.py b/src/Mode-Dest-TOD/cmap_modedest/ae_distance_sim.py deleted file mode 100644 index b24f9fd..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/ae_distance_sim.py +++ /dev/null @@ -1,80 +0,0 @@ -import numpy as np -import pandas as pd -from scipy import stats -import logging -log = logging.getLogger('CMAP') - -def sloped_linear(x_min, x_max, ratio=1.0, random_state=None, replication=1): - if isinstance(replication, int): - replication = [replication] - x_max = np.asarray(x_max) - x_min = np.asarray(x_min) - reps = list(x_min.shape)+replication - if isinstance(ratio, float) and ratio == 1.0: - return stats.uniform(x_min, x_max).rvs(reps, random_state=random_state) - else: - span = x_max - x_min - slope = (1.0-ratio)/np.where(span!=0, span, 1.0) - area =.5*(1+ratio)*span - if len(replication) == 1: - y = stats.uniform().rvs(reps, random_state=random_state)*area[:,None] - zp = np.sqrt(ratio[:,None] ** 2 + 2 * slope[:,None] * y) - return (zp - ratio[:,None]) / np.where(slope != 0, slope, 1.0)[:,None] + x_min[:,None] - elif len(replication) == 2: - y = stats.uniform().rvs(reps, random_state=random_state)*area[:,None,None] - zp = np.sqrt(ratio[:,None,None] ** 2 + 2 * slope[:,None,None] * y) - return (zp - ratio[:,None,None]) / np.where(slope != 0, slope, 1.0)[:,None,None] + x_min[:,None,None] - else: - raise ValueError('too many dims') - - -def trunc_normal(*arg, random_state=None, replication=1): - if isinstance(replication, int): - replication = [replication] - rv = stats.norm(*(np.asarray(j) for j in arg)) - reps = replication+list(rv.args[0].shape) - return np.fmax(rv.rvs(reps, random_state=random_state), 0.06) - - -def simulate_ae_dist(p1,p2,p3, random_state=None, replication=1): - p1 = np.asarray(p1).reshape(-1) - p2 = np.asarray(p2).reshape(-1) - p3 = np.asarray(p3).reshape(-1) - if isinstance(replication, int): - replication = [replication] - reps = list(p1.shape)+replication - result = np.full(reps, np.nan, dtype=np.float32) - - use_normal = (p3 == 101) - if use_normal.any(): - result[use_normal,...] = trunc_normal( - p1[use_normal], - p2[use_normal], - random_state=random_state, - replication=replication, - ).T - - use_slopey = (p3 < 101) - n = use_slopey.sum() - if n: - result[use_slopey,...] = sloped_linear( - p1[use_slopey], - p2[use_slopey], - p3[use_slopey], - random_state=random_state, - replication=replication, - ) - - use_nan = (p3 == 999) - result[use_nan,...] = 255.0 - return result - - -ae_mode_speeds = { # minutes per mile - 1: 20, # walk - 2: 20, # bus - 3: 2, # pnr - 4: 2, # knr - 5: 20, # feeder - 999: 1, # not available -} \ No newline at end of file diff --git a/src/Mode-Dest-TOD/cmap_modedest/application.py b/src/Mode-Dest-TOD/cmap_modedest/application.py deleted file mode 100644 index 1de062a..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/application.py +++ /dev/null @@ -1,1495 +0,0 @@ -import pickle - -import numpy as np -import pandas as pd -import xarray as xr -import os -import time -import larch -from larch.util import piece -from larch.util.dataframe import columnize -import re -from .addict import Dict -import pyarrow as pa -import pyarrow.feather as pf -import pyarrow.compute as pc -import sharrow as sh -from scipy.stats import binom -from pathlib import Path - -from .tnc_costs import taxi_cost, tnc_solo_cost, tnc_pool_cost -from .transit_approach import transit_approach -from .modecodes import mode9codes -from .choice_model import model_builder, alt_codes_and_names -from .random_states import check_random_generator -from .data_handlers import DataHandler -from .data_handlers.tabler import Table -from .data_handlers.m01_handler import attach_areatypes, sample_hh_income_cats -from .hh_sampling import sample_hh_from_zone -from .fast.random_generator import multichoices -from .deadheading import compute_deadhead_trip_table -from .purposes import purposesA, purposes_to_5, purposes_to_3 -from .time_of_day_model import time_of_day_simulator_initialize - -from .cmap_logging import getSubLogger, get_worker_log, LOGGER_NAME - -app_floatdtype = np.float32 - - -n_modes = len(mode9codes) - -av = {} - - -def _data_for_application_1(dh, otaz=1, replication=None): - """ - - Parameters - ---------- - dh : DataHandler - otaz : int - peak : bool - replication : int, optional - - Returns - ------- - pd.DataFrame - """ - global av - log = getSubLogger("application.DATA1") - log.info(f"prepare tier 1 data for otaz {otaz}") - - try: - fast_application_data = dh.fast_application_data - except AttributeError: - from .fast.application_data import application_data - fast_application_data = dh.fast_application_data = application_data(dh) - - from .purposes import purposes5 - purposes = purposes5 - - log.debug("prepare availability") - n_zones = dh.n_internal_zones - for purpose in purposes: - av_purpose = av.get(purpose, {}) - if len(av_purpose) != n_zones * n_modes: - av_purpose = {} - num = n_modes - for i in range(n_zones): - av_purpose[num + mode9codes.AUTO] = f"altdest{i + 1:04d}_auto_avail_{purpose}" - av_purpose[num + mode9codes.HOV2] = f"altdest{i + 1:04d}_auto_avail_{purpose}" - av_purpose[num + mode9codes.HOV3] = f"altdest{i + 1:04d}_auto_avail_{purpose}" - av_purpose[num + mode9codes.TNC1] = f"altdest{i + 1:04d}_auto_avail_{purpose}" - av_purpose[num + mode9codes.TNC2] = f"altdest{i + 1:04d}_auto_avail_{purpose}" - av_purpose[num + mode9codes.TAXI] = f"altdest{i + 1:04d}_auto_avail_{purpose}" - av_purpose[num + mode9codes.TRANSIT] = f"altdest{i + 1:04d}_transit_avail_{purpose}" - av_purpose[num + mode9codes.WALK] = f"altdest{i + 1:04d}_walk_avail_{purpose}" - av_purpose[num + mode9codes.BIKE] = f"altdest{i + 1:04d}_bike_avail_{purpose}" - num += n_modes - av[purpose] = av_purpose - - if replication is None: - replication = dh.cfg.get('n_replications', 50) - - log.debug("initialize dtaz and tbl") - dtaz = pd.Index(np.arange(n_zones) + 1) - otaz_series = pd.Series(otaz, index=dtaz) - - tbl = pa.table({ - 'otaz_idx': np.full_like(dtaz, otaz) - 1, - 'dtaz_idx': dtaz - 1, - 'otaz': np.full_like(dtaz, otaz), - 'dtaz': dtaz, - }) - - log.debug("load t1") - t1 = fast_application_data.load(tbl, as_table=True) - - log.debug("concat_tables t2") - t2 = sh.concat_tables([t1] * replication) - - log.debug("prepare transit approach function") - from .fast.transit.approach import compile_transit_approach, transit_approach_wrap, transit_approach_distances - if not dh.cfg.transit_approach_func: - trapp_struct = compile_transit_approach(dh) - dh.cfg.transit_approach_struct = trapp_struct - - oz = np.full(3632, otaz) - dz = np.arange(3632) + 1 - - random_generator = np.random.default_rng([otaz, 1234]) - - log.debug("run trapp_dist_HW") - trapp_dist_HW = transit_approach_distances(dh.cfg.transit_approach_struct, oz, dz, 'HW', random_seed=random_generator)[0] - log.debug("run trapp_HW") - trapp_HW = transit_approach_wrap(dh.cfg.transit_approach_struct, oz, dz, 'HW', trapp_dist_HW, ) - - log.debug("run trapp_dist_HO") - trapp_dist_HO = transit_approach_distances(dh.cfg.transit_approach_struct, oz, dz, 'HO', random_seed=random_generator)[0] - log.debug("run trapp_HO") - trapp_HO = transit_approach_wrap(dh.cfg.transit_approach_struct, oz, dz, 'HO', trapp_dist_HO, ) - - log.debug("run add peak transit approach columns on t2") - t2['transit_approach_drivetime_PEAK'] = trapp_HW['drivetime'].T.reshape(-1) - t2['transit_approach_waittime_PEAK'] = trapp_HW['waittime'].T.reshape(-1) - t2['transit_approach_walktime_PEAK'] = trapp_HW['walktime'].T.reshape(-1) - t2['transit_approach_cost_PEAK'] = trapp_HW['cost'].T.reshape(-1) - ##-- Heither, flag KnR-PnR approaches for HBW trips -- ## - t2['M_drive_PEAK'] = np.where((trapp_HW['drivetime']>0) & (trapp_HW['drivetime']=hhadults'] = (hh_data['N_VEHICLES'] >= hh_data['N_ADULTS']).astype(app_floatdtype) - - df2 = t2.to_pandas() - - # This can be fairly fast because we're not adding new columns, just overwriting dummy columns. - # parking cost - from .parking_costs import parking_cost_v3, parking_is_free - dtazs = sh.concat_tables([tbl.select(['dtaz'])] * replication).to_pandas().values - hhincs = hh_data['hhinc5'].repeat(len(tbl)).values - - # Whether a trip gets free parking is a function of income but not destination or purpose - paid_parking = parking_is_free( - dh, - hhincs, - random_state=random_generator, - ) - - for purp in purposesA: - temp_parking_cost = parking_cost_v3( - dh, - dtazs, - dh.cfg.default_activity_durations[purposes_to_3[purp]], - purposes_to_3[purp], - random_state=random_generator, - ).values - temp_parking_cost *= paid_parking.astype(temp_parking_cost.dtype).values - df2[f'auto_parking_cost_{purp}'] = temp_parking_cost - - df2_array = df2.to_numpy(dtype=app_floatdtype).reshape(replication, -1) - - col_names = getattr(dh, 'column_2_replacement', []) - try: - df3 = pd.DataFrame( - df2_array, - columns=col_names, - ) - except ValueError: - df3 = pd.DataFrame( - df2.to_numpy(dtype=app_floatdtype).reshape(replication, -1), - columns=pd.MultiIndex.from_product([ - [f"altdest{x:04d}" for x in range(1, n_zones + 1)], - df2.columns, - ]) - ) - need_to_fix_column_names = True - else: - need_to_fix_column_names = False - hh_data.index = df3.index - - addon = hh_data[[ - 'o_zone', 'ozone_autopropensity', 'hhveh==0', 'hhveh>=hhadults', - 'hhinc5', 'hhinc5g', - 'hhinc5==1', 'hhinc5==2', 'hhinc5==3', 'hhinc5==4', 'hhinc5==5', - 'hhinc5l', 'hhinc5l==1', 'hhinc5l==2', - 'hhinc5h', 'hhinc5h==3', 'hhinc5h==4', 'hhinc5h==5', - ]] - df3 = pd.concat([df3, addon], axis=1) - if need_to_fix_column_names: - _fix_column_names(dh, df3) - return df3 - - -def _fix_column_names(dh, dfx): - column_2_replacement = getattr(dh, 'column_2_replacement', []) - if len(dfx.columns) != len(column_2_replacement): - columns = [(f"{j[0]}_{j[1]}" if isinstance(j, tuple) else j) for j in dfx.columns] - if columns[-1] == '_o_zone': - columns[-1] = 'o_zone' - s0f = lambda c: c.replace("_dtaz", "") - - s1 = re.compile("(altdest[0-9]+)_o_zone == dtaz") - s1f = lambda c: s1.sub("o_zone == \g<1>", c) - - s2 = re.compile("(altdest[0-9]+_)piece\((.*)\)") - s2f = lambda c: s2.sub(r"piece(\g<1>\g<2>)", c) - - s3 = re.compile(r"(altdest[0-9]+_)log\(attractions\)") - s3f = lambda c: s3.sub(r"log(\g<1>attractions)", c) - - s4 = re.compile(r"(altdest[0-9]+_)log\(1/samp_wgt\)") - s4f = lambda c: s4.sub(r"log(1/\g<1>samp_wgt)", c) - - s5 = re.compile("(altdest[0-9]+_)1-(.*)") - s5f = lambda c: s5.sub(r"1-\g<1>\g<2>", c) - - s6 = re.compile(r"(altdest[0-9]+_)(.*)(time|ovtt)(.*)/auto_dist_(.*)") - s6f = lambda c: s6.sub(r"\g<1>\g<2>\g<3>\g<4>/\g<1>auto_dist_\g<5>", c) - - s7 = re.compile("(altdest[0-9]+_)(fm..)\(ozone_areatype, areatype\)==(.*)") - s7f = lambda c: s7.sub(r"\g<2>(ozone_areatype, \g<1>areatype)==\g<3>", c) - - s8 = re.compile("(altdest[0-9]+_)hard_sigmoid\((.*)\)") - s8f = lambda c: s8.sub(r"hard_sigmoid(\g<1>\g<2>)", c) - - column_2_replacement = [s8f(s7f(s6f(s5f(s4f(s3f(s2f(s1f(s0f(j))))))))) for j in columns] - dh.column_2_replacement = column_2_replacement - - dfx.columns = column_2_replacement - - -to_disk = False - - -def _data_for_application_2(dh, df2, filename): - # _fix_column_names(dh, df2) - log = getSubLogger("DATA2") - - n_zones = dh.n_internal_zones - alt_codes, alt_names = alt_codes_and_names( - n_sampled_dests=n_zones, - include_actual_dest=False, - ) - - log.debug("initialize dataframes") - dfas = larch.DataFrames( - co=df2.astype(app_floatdtype), - alt_codes=alt_codes, - av=True, - ) - - if to_disk: - log.debug("writing dataframes to disk") - dfas.to_feathers(filename) - return _reload_data_for_application_2(dh, filename) - - log.debug("completed _data_for_application_2") - return dfas - - -def _reload_data_for_application_2(dh, filename): - return larch.DataFrames.from_feathers(filename) - - -def data_for_application(dh, otaz=1, replication=None): - """ - - Parameters - ---------- - otaz : int or array-like - peak : bool - purpose : str - replication : int, optional - - Returns - ------- - - """ - log = getSubLogger("DATA") - if replication is None: - replication = dh.cfg.get('n_replications', 50) - - if isinstance(otaz, int): - df2 = _data_for_application_1(dh, otaz=otaz, replication=replication) - filename = dh.filenames.cache_dir / f"data_for_application_{otaz}" - else: - log.debug("data_for_application::_data_for_application_1") - df2_list = [ - _data_for_application_1(dh, otaz=z, replication=replication) - for z in otaz - ] - log.debug("data_for_application::concat") - df2 = pd.concat(df2_list) - log.debug("data_for_application::filename") - filename = dh.filenames.cache_dir / f"data_for_application_{otaz[0]}_{otaz[-1]}" - return _data_for_application_2(dh, df2.reset_index(drop=True), filename) - - -def blockwise_mean(a, blocksize): - """ - - Parameters - ---------- - a : array-like - blocksize : int - - Returns - ------- - array - """ - n_blocks = a.shape[0] // blocksize + (1 if a.shape[0] % blocksize else 0) - mean = np.zeros([n_blocks, *a.shape[1:]]) - for j in range(n_blocks): - mean[j] = a[j * blocksize:(j + 1) * blocksize].mean(0) - return mean - - -choice_simulator_global = Dict() - - -def choice_simulator_initialize(dh, n_threads=1, cache=True): - """ - Load or create the choice models. - - This function checks if the mode+destination choice models have already been - loaded into memory for this process. If they have not, it then checks if - a pickled version of the choice models has been saved to disk, and loads that - if it is available. Otherwise, it initializes the choice models from scratch - using the `model_builder` function. - - Not coincidentally, these three ways of making the choice model available in - the current process are ordered from fastest to slowest. - - Parameters - ---------- - dh : DataHandler - n_threads : int - How many threads each model should use in computation. - cache : bool - Whether to write pickles to disk. - - Returns - ------- - Dict - """ - global choice_simulator_global - log = getSubLogger("SIM_INIT") - - get_worker_log( - os.path.join(dh.filenames.cache_dir, 'logs'), - level=10, - ) - - log.debug(f"choice_simulator_initialize(n_threads={n_threads}), cache={cache}") - n_zones = dh.n_internal_zones - choice_model_params = dh.choice_model_params - - if len(choice_model_params) == 0: - raise ValueError("no choice_model_params") - - pickle_name = dh.filenames.cache_dir / f"choice_models_{n_zones}.pkl" - - if n_zones not in choice_simulator_global: - log.debug("choice_simulator_initialize: preloaded choice_simulator not available") - if os.path.exists(pickle_name): - import cloudpickle - with open(pickle_name, 'rb') as pkl_f: - log.debug("loading pickled choice_simulator") - choice_simulator_global[n_zones] = cloudpickle.load(pkl_f) - if n_zones in choice_simulator_global: - cache = False - else: - log.debug("pickled choice_simulator not available") - - if n_zones in choice_simulator_global: - log.info("using existing choice_simulator") - choice_simulator = choice_simulator_global[n_zones] - for purpose in purposesA: - choice_simulator[purpose].set_values(choice_model_params[purpose]) - else: - log.info("creating fresh choice_simulator") - choice_simulator = Dict() - for purpose in purposesA: - choice_simulator[purpose] = model_builder( - purpose=purpose, - include_actual_dest=False, - n_sampled_dests=n_zones, # 3632, - parameter_values=choice_model_params[purpose], - constraints=False, - n_threads=n_threads, - explicit_av=False, - ) - choice_simulator_global[n_zones] = choice_simulator - - if cache and not os.path.exists(pickle_name): - import cloudpickle - with open(pickle_name, 'wb') as pkl_f: - log.debug("pickling choice_simulator for future reload") - cloudpickle.dump( - choice_simulator_global[n_zones], - pkl_f, - ) - - return choice_simulator - - -def attach_dataframes(sim, purpose, dfa): - log = getSubLogger("ATTACH_DFS") - if sim.dataframes is None: - log.debug(f"attach_dataframes {purpose} attach dataframes new") - sim.dataframes = dfa - else: - log.debug(f"attach_dataframes {purpose} attach dataframes direct injection") - sim.set_dataframes(dfa, False) - # TODO: explore using inject_feathers instead - - -def _sim_prob(purpose, sim): - sim_pr = sim.probability() - return sim_pr - - -def choice_simulator_prob( - dh, - otaz, - n_threads=1, - temp_dir=None, - purposes=None, -): - """ - Compute probabilities for mode and destination choice. - - Parameters - ---------- - dh : DataHandler - otaz : int or array-like - n_threads : int - temp_dir : Path-like, optional - purposes : Collection, optional - Only compute probabilities for these purposes. - - Returns - ------- - simulated_probability : dict - By purpose, the average choice probabilities. Averages are computed by - simulation of a number of random households and transit accessibility - in the zone, and averaging over the simulation. - simulated_probability_disagg : dict - By purpose, the simulated disaggregated choice probabilities. - validation_useful_data : DataFrame - Validation data extracted from the simulation. - simulated_utility : DataFrame - By purpose, the simulated utilities for auto and transit - """ - if purposes is None: - purposes = purposesA - get_worker_log( - os.path.join(dh.filenames.cache_dir, 'logs'), - level=10, - ) - - data_cache_file = None - if temp_dir: - os.makedirs(temp_dir, exist_ok=True) - if isinstance(otaz, int): - data_cache_file = os.path.join(temp_dir, f"cached_data_for_application_{otaz}.feathers") - else: - data_cache_file = os.path.join(temp_dir, f"cached_data_for_application_{otaz[0]}_{otaz[-1]}.feathers") - - log = getSubLogger("CHOICE_SIM") - - log.debug("data_for_application") - if data_cache_file and os.path.exists(data_cache_file+".data_co"): - log.debug("data_for_application load") - dfa = larch.DataFrames.from_feathers(data_cache_file) - else: - log.debug("data_for_application make") - dfa = data_for_application(dh, otaz=otaz) - if data_cache_file: - dfa.to_feathers(data_cache_file) - - log.debug("settings") - replication = dh.cfg.get('n_replications', 50) - - choice_simulator = choice_simulator_initialize(dh, n_threads=n_threads) - simulated_utility = {} - simulated_probability = {} - simulated_probability_disagg = {} - - for purpose in purposes: - sim = choice_simulator[purpose] - attach_dataframes(sim, purpose, dfa) - log.critical("--- GENERATING SIMULATED UTILITY ---") - sim_u = sim.utility() - sim_u_auto = sim_u[:,mode9codes.AUTO-1:dh.n_internal_zones*9:9] - sim_u_transit = sim_u[:,mode9codes.TRANSIT-1:dh.n_internal_zones*9:9] - simulated_utility[purpose] = pd.concat([ - pd.DataFrame(blockwise_mean(sim_u_auto, replication), index=otaz).rename_axis('otaz', axis=0), - pd.DataFrame(blockwise_mean(sim_u_transit, replication), index=otaz).rename_axis('otaz', axis=0), - ], keys=['AUTO', 'TRANSIT'], names=['MODE']) - sim_pr = _sim_prob(purpose, sim) - simulated_probability_disagg[purpose] = sim_pr - simulated_probability[purpose] = blockwise_mean(sim_pr, replication) - if np.any(np.isnan(simulated_probability[purpose])): - raise ValueError(f"nan in simulated_probability[{purpose}]") - - simulated_utility = pd.concat( - objs=simulated_utility.values(), - keys=simulated_utility.keys(), - names=['PURPOSE'] - ) - - #transit_approach_walktime_cols = [i for i in dfa.data_co.columns if 'transit_approach_walktime' in i and 'auto' not in i and 'sigmoid' not in i] - validation_useful_data = pd.DataFrame(data=np.int8(0), index=dfa.data_co.index, columns=["hh_auto_own", 'hhinc5', 'hhinc5l', 'hhinc5h', 'hhinc5g']) - validation_useful_data.loc[dfa.data_co['hhveh==0'] == 0, "hh_auto_own"] = 1 - validation_useful_data.loc[dfa.data_co['hhveh==0'] > 0, "hh_auto_own"] = 0 - validation_useful_data.loc[dfa.data_co['hhveh>=hhadults'] > 0, "hh_auto_own"] = 2 - validation_useful_data['hhinc5'] = dfa.data_co['hhinc5'] - validation_useful_data['hhinc5g'] = dfa.data_co['hhinc5g'] - validation_useful_data['hhinc5l'] = dfa.data_co['hhinc5l'] - validation_useful_data['hhinc5h'] = dfa.data_co['hhinc5h'] - log.debug("complete") - return simulated_probability, simulated_probability_disagg, validation_useful_data, simulated_utility - - -def choice_simulator_trips( - dh, - otaz, - purposes=None, - random_state=None, - n_threads=1, - save_dir=None, - delay=0, - temp_dir=None, - disagg_choices=True, - use_wfh_pa=False, -): - """ - The single-process function to model trips by mode/dest/time. - - Parameters - ---------- - otaz : int or array-like - purposes : Collection, optional - - Returns - ------- - - """ - get_worker_log( - os.path.join(dh.filenames.cache_dir, 'logs'), - level=10, - ) - log = getSubLogger("TRIP_SIM") - try: - if delay: - log.debug(f"DELAY choice_simulator_trips {delay})") - time.sleep(delay) - - if use_wfh_pa: - dh['tripclass'] = 'wfh' - else: - dh['tripclass'] = 'typical' - - if purposes is None: - purposes = purposesA - - if isinstance(otaz, int): - otaz = [otaz] - - log.debug(f"CALL choice_simulator_trips({len(otaz)} OTAZ's starting from {otaz[0]})") - - simulated_probability, simulated_probability_disagg, validation_data, simulated_utility = choice_simulator_prob( - dh, - otaz=otaz, - n_threads=n_threads, - temp_dir=temp_dir, - ) - simulated_choices = {} - - tod_models = time_of_day_simulator_initialize(dh, cache=True) - - for purpose in purposes: - log.debug(f" choice_simulator_trips processing time-of-day for purpose {purpose})") - choices_data = {} - n = 0 - - for _o in otaz: - random_state = check_random_generator([_o, 534]) - - num_productions = dh.zone_productions5.loc[_o, purpose] - log.debug(f" {purpose} productions for {_o} = {num_productions}") - - if disagg_choices: - c = np.empty(num_productions, dtype=np.int32) - hh_autos = np.zeros(num_productions, dtype=np.int8) - hh_inc5 = np.zeros(num_productions, dtype=np.int8) - c_position = 0 - num_reps = 50 - for _rep in range(num_reps): - num_productions_rep = (num_productions // num_reps) + (1 if (num_productions % num_reps)>_rep else 0) - p = simulated_probability_disagg[purpose][n] - try: - c_ = random_state.choice(p.size, size=num_productions_rep, p=p) - except ValueError as err: - if 'probabilities do not sum to 1' in str(err): - log.error(f"probabilities sum to {np.sum(p)}, correcting") - p /= np.sum(p) - c_ = random_state.choice(p.size, size=num_productions, p=p) - else: - raise - c[c_position:c_position+c_.size] = c_ - hh_autos[c_position:c_position+c_.size] = validation_data["hh_auto_own"][n] - if purpose == 'HBWH': - hh_inc5[c_position:c_position+c_.size] = validation_data["hhinc5h"][n] - elif purpose == 'HBWL': - hh_inc5[c_position:c_position + c_.size] = validation_data["hhinc5l"][n] - elif purpose == 'NHB': - hh_inc5[c_position:c_position + c_.size] = validation_data["hhinc5g"][n] - hh_autos[c_position:c_position + c_.size] = 0 - else: - hh_inc5[c_position:c_position+c_.size] = validation_data["hhinc5"][n] - c_position += c_.size - n += 1 - - else: - p = simulated_probability[purpose][n] - try: - c = random_state.choice(p.size, size=num_productions, p=p) - except ValueError as err: - if 'probabilities do not sum to 1' in str(err): - log.error(f"probabilities sum to {np.sum(p)}, correcting") - p /= np.sum(p) - c = random_state.choice(p.size, size=num_productions, p=p) - else: - raise - n += 1 - hh_autos = np.zeros_like(c) - hh_inc5 = np.zeros_like(c) - - choices_data[_o] = pd.DataFrame(dict( - mode=(c % n_modes) + 1, - zone=(c // n_modes) + 1, - - # other things to track for calibration / validation - hh_autos=hh_autos, - hh_inc5=hh_inc5, - - )).value_counts().sort_index().rename(_o).astype(np.int16) - - full_index = pd.MultiIndex.from_product( - [ - np.arange(n_modes) + 1, - np.arange(dh.n_internal_zones) + 1, - np.arange(3), - np.arange(5) + 1, - ], - names=[ - 'mode', - 'a_zone', - 'hh_autos', - 'hh_inc5', - ], - ) - - simulated_choices_purpose = pd.concat( - choices_data, - axis=1, - ).reindex(full_index).fillna(0).astype(np.int16) - simulated_choices_purpose.columns.name = 'p_zone' - - # simulated_choices_purpose is now a dataframe, with columns giving - # the production zones (by batch) and a dense 2-level index (mode, a_zone) - - simtrips = simulated_choices_purpose.stack().rename("trips").reset_index() - - reg_auto_trips = simtrips.query("(mode in (1,2,3)) and (trips > 0)") - - def apply_tod(base_trips, is_hired_car=0.0, random_gen=123): - - time_data = dh.skims.raw[[f'mf46{j}' for j in range(1, 9)]].iat_df( - base_trips.rename(columns={'a_zone': 'dtaz', 'p_zone': 'otaz'})[['otaz', 'dtaz']] - 1 - ) - time_data["mode9 in ('TAXI','TNC1','TNC2')"] = is_hired_car - time_data["paFlip"] = 0.0 - time_data["(mode9 in ('TAXI','TNC1','TNC2'))*paFlip"] = 0.0 - time_dfs = larch.DataFrames( - co=time_data.astype(np.float64), - av=1, - alt_codes=[1, 2, 3, 4, 5, 6, 7, 8], - alt_names=['EA', 'AM1', 'AM2', 'AM3', 'MD', 'PM1', 'PM2', 'PM3'], - ) - tod_model = tod_models[purposes_to_5[purpose]] - tod_model.dataframes = time_dfs - tod_model_pr = tod_model.probability().copy() - tod_model.dataframes.data_co["paFlip"] = 1.0 - tod_model.dataframes.data_co["(mode9 in ('TAXI','TNC1','TNC2'))*paFlip"] = is_hired_car - tod_model_pr_flip = tod_model.probability().copy() - n_flipped_trips = binom.rvs( - n=base_trips["trips"].values, - p=dh.cfg.time_of_day.pa_split.get(purpose, 0.0 if purpose=='NHB' else 0.5), - random_state=random_gen, - ) - n_unflipped_trips = base_trips["trips"].values - n_flipped_trips - - # forward trips, which go from production to attraction (PA = OD) - reg_auto_trips_tod = pd.DataFrame( - multichoices( - tod_model_pr, - n_unflipped_trips, - seeds=base_trips.index.values+base_trips["p_zone"].values<<16, - ), - index=base_trips.index, - columns=['EA', 'AM1', 'AM2', 'AM3', 'MD', 'PM1', 'PM2', 'PM3'], - ) - reg_auto_trips_fwd = pd.concat([base_trips.drop(columns=['trips']), reg_auto_trips_tod], axis=1) - reg_auto_trips_fwd_= reg_auto_trips_fwd.rename(columns={'p_zone': 'o_zone', 'a_zone': 'd_zone'}) - reg_auto_trips_fwd_['a_zone'] = reg_auto_trips_fwd['a_zone'] - reg_auto_trips_fwd = reg_auto_trips_fwd_.set_index(['mode', 'o_zone', 'd_zone', 'a_zone', 'hh_autos', 'hh_inc5']) - reg_auto_trips_fwd.columns.name = "timeperiod" - reg_auto_trips_fwd = reg_auto_trips_fwd.stack().rename("trips") - - # flipped trips, which go from attraction to production - if isinstance(n_flipped_trips, int): - n_flipped_trips = np.asarray([n_flipped_trips]) - try: - reg_auto_trips_tod_r = pd.DataFrame( - multichoices( - tod_model_pr_flip, - n_flipped_trips, - seeds=base_trips.index.values+base_trips["p_zone"].values<<18, - ), - index=base_trips.index, - columns=['EA', 'AM1', 'AM2', 'AM3', 'MD', 'PM1', 'PM2', 'PM3'], - ) - except: - log.error(f"{tod_model_pr_flip=}") - log.error(f"{n_flipped_trips=}") - log.exception("error in reg_auto_trips_tod_r") - raise - reg_auto_trips_bwd = pd.concat([base_trips.drop(columns=['trips']), reg_auto_trips_tod_r], axis=1) - reg_auto_trips_bwd_ = reg_auto_trips_bwd.rename(columns={'p_zone': 'd_zone', 'a_zone': 'o_zone'}) - reg_auto_trips_bwd_['a_zone'] = reg_auto_trips_bwd['a_zone'] - reg_auto_trips_bwd = reg_auto_trips_bwd_.set_index(['mode', 'o_zone', 'd_zone', 'a_zone', 'hh_autos', 'hh_inc5']) - reg_auto_trips_bwd.columns.name = "timeperiod" - reg_auto_trips_bwd = reg_auto_trips_bwd.stack().rename("trips") - - return pd.concat([ - reg_auto_trips_fwd[reg_auto_trips_fwd > 0], - reg_auto_trips_bwd[reg_auto_trips_bwd > 0], - ]) - - - hired_auto_trips = simtrips.query("(mode in (4,5,6)) and (trips > 0)") - - log.debug(f" applying TOD to reg_auto_trips") - reg_auto_trips = apply_tod(reg_auto_trips, 0.0, random_state) - log.debug(f" applying TOD to hired_auto_trips") - hired_auto_trips = apply_tod(hired_auto_trips, 1.0, random_state) - - log.debug(f" applying directionality to non-auto trips") - # non-auto trips - non_auto_trips = simtrips.query("(mode in (7,8,9)) and (trips > 0)") - non_auto_trips = non_auto_trips.reset_index(drop=True) - non_auto_trips["timeperiod"] = "NA" - n_flipped_trips = binom.rvs( - n=non_auto_trips["trips"].values, - p=dh.cfg.time_of_day.pa_split.get(purpose, 0.5), - random_state=random_state, - ) - n_unflipped_trips = non_auto_trips["trips"].values - n_flipped_trips - - non_auto_trips_attractions = non_auto_trips['a_zone'] - - non_auto_trips_r = non_auto_trips.copy(deep=True) - non_auto_trips_r["trips"] = n_flipped_trips - non_auto_trips_r = non_auto_trips_r.rename(columns={'p_zone': 'o_zone', 'a_zone': 'd_zone'}) - non_auto_trips_r['a_zone'] = non_auto_trips_attractions - non_auto_trips_r = non_auto_trips_r.set_index(['mode', 'o_zone', 'd_zone', 'a_zone', 'hh_autos', 'hh_inc5', 'timeperiod'])["trips"] - - non_auto_trips["trips"] = n_unflipped_trips - non_auto_trips = non_auto_trips.rename(columns={'p_zone': 'd_zone', 'a_zone': 'o_zone'}) - non_auto_trips['a_zone'] = non_auto_trips_attractions - non_auto_trips = non_auto_trips.set_index(['mode', 'o_zone', 'd_zone', 'a_zone', 'hh_autos', 'hh_inc5', 'timeperiod'])["trips"] - - non_auto_trips = pd.concat([non_auto_trips[non_auto_trips>0], non_auto_trips_r[non_auto_trips_r>0]]) - #non_auto_trips = non_auto_trips.reset_index() - - sim_mode_dest_tod = pd.concat([reg_auto_trips, hired_auto_trips, non_auto_trips]) - if isinstance(sim_mode_dest_tod, pd.Series): - sim_mode_dest_tod = pd.DataFrame(sim_mode_dest_tod) - # if save_dir is not None: - # sim_mode_dest_tod.to_parquet(os.path.join(save_dir, f"choice_simulator_trips_{purpose}_{otaz[0]}_{otaz[-1]}.pq")) - simulated_choices[purpose] = sim_mode_dest_tod - - if purpose == 'NHB': - - # Visitor trips - visitor_choices_data = [] - for otaz_n, otaz_ in enumerate(otaz): - - visitor_pr = simulated_probability['NHB'][otaz_n] - k = 0 - for dtaz_ in range(1, dh.n_internal_zones+1): - n_visitor_trips_here = dh.visitor_trips.iloc[otaz_-1, dtaz_-1] - if n_visitor_trips_here == 0: - k += 9 - continue - else: - visitor_mode_pr = np.nan_to_num(visitor_pr[k:k+9]) - visitor_mode_pr[mode9codes.TAXI-1] *= dh.cfg.get('visitor_taxi_multiple', 5.0) - visitor_mode_pr[mode9codes.TNC1-1] *= dh.cfg.get('visitor_tnc1_multiple', 5.0) - visitor_mode_pr[mode9codes.TNC2-1] *= dh.cfg.get('visitor_tnc2_multiple', 5.0) - k += 9 - visitor_mode_pr_sum = visitor_mode_pr.sum() - if visitor_mode_pr_sum == 0: continue # this OD pair is not valid - visitor_mode_pr /= visitor_mode_pr_sum - c = random_state.choice( - 9, - size=n_visitor_trips_here, - p=visitor_mode_pr, - ) - visitor_choices_data.append(pd.DataFrame(dict( - mode=c+1, - p_zone=otaz_, - a_zone=dtaz_, - hh_autos=-1, - hh_inc5=-1, - )).value_counts().sort_index().rename('trips').astype(np.int16)) - - visitor_choices = pd.concat(visitor_choices_data).reset_index() - visitor_reg_auto_trips = apply_tod(visitor_choices.query("(mode in (1,2,3)) and (trips > 0)"), 0.0) - visitor_hired_auto_trips = apply_tod(visitor_choices.query("(mode in (4,5,6)) and (trips > 0)"), 1.0) - visitor_nonauto_trips = visitor_choices.query("(mode in (7,8,9)) and (trips > 0)").copy() - visitor_nonauto_trips['timeperiod'] = 'NA' - visitor_nonauto_trips = visitor_nonauto_trips.rename(columns={'p_zone': 'o_zone', 'a_zone': 'd_zone'}) - visitor_nonauto_trips['a_zone'] = visitor_nonauto_trips['d_zone'] - visitor_choices_with_time = pd.concat([ - visitor_reg_auto_trips.reset_index(), - visitor_hired_auto_trips.reset_index(), - visitor_nonauto_trips, - ], ignore_index=True).set_index(['mode','o_zone','d_zone','a_zone','hh_autos','hh_inc5','timeperiod']) - simulated_choices['VISIT'] = visitor_choices_with_time - - concatd = pd.concat(simulated_choices) - concatd.index.set_names('purpose', level=0, inplace=True) - if save_dir is not None: - os.makedirs(save_dir, exist_ok=True) - concise = pd.DataFrame(concatd) - concise.to_parquet(os.path.join( - save_dir, - f"choice_simulator_trips_{otaz[0]}_{otaz[-1]}_{'_'.join(purposes)}_{dh['tripclass']}.pq" - )) - log.critical(f"--- SAVING SIMULATED UTILITY to {save_dir} ---") - simulated_utility.columns = [f'dest{i+1}' for i in range(dh.n_internal_zones)] - simulated_utility.to_parquet(os.path.join( - save_dir, - f"choice_simulator_util_{otaz[0]}_{otaz[-1]}_{'_'.join(purposes)}_{dh['tripclass']}.pq" - )) - else: - log.critical(f"--- NOT SAVING SIMULATED UTILITY (save_dir is None) ---") - log.debug(f"COMPLETED choice_simulator_trips({len(otaz)} OTAZ's starting from {otaz[0]})") - - return concatd - except: - log.exception(f"error in choice_simulator_trips for otaz={otaz}") - raise - -def stagger_starts(iterable, delay=3, n_jobs=4): - pause = 0 - for n, i in enumerate(iterable, start=1): - yield (pause, i) - if n >= n_jobs: - pause = 0 - else: - pause += delay - - -def choice_simulator_trips_many( - dh, - otaz=None, - max_chunk_size=20, - n_jobs=5, - thread_saturation=1, - cache_subdir="choice_simulator_trips", - temp_dir=None, - with_nonhome_auto=False, - disagg_choices=True, - with_wfh=True, - staggertime=15, -): - """ - Run the choice simulators, batching a few TAZ's at at time in parallel jobs. - - Parameters - ---------- - dh : DataHandler - otaz : array-like, optional - The OTAZ's to process. Defaults to generating trips originating from - all internal zones. - max_chunk_size : int, default 20 - The number of OTAZ's to group together in each chunk. Larger chunks - run faster but require more RAM. - n_jobs : int, default 5 - Number of parallel jobs to start. - thread_saturation : int, default 1 - Number of threads per job to allow. Some parts of some computations are - multi-threaded, and can run faster if multiple threads are allowed. - However, if enough RAM is available, it is more efficent to have more - jobs than use more threads per job. - cache_subdir : Path-like, default "choice_simulator_trips" - Relative path, within the cache directory, in which partial results are - stored from each job. - temp_dir : Path-like, optional - A temporary directory used to store processed data during a job. This - feature is made available to handle the case where non-home-based trips - need to be processed separately from home-based trips, so that auto - propensity can be used from the current iteration. The model as - implemented (October 2021) uses lagged auto propensity from the prior - global iteration, so storing this data is not necessary. - with_nonhome_auto : bool, default False - Set to True to use auto propensity from the current home-based trips in - the current global iteration. Warning: This massively increases model - runtime. - disagg_choices : bool, default True - Keep a record of trip choices by disaggregate validation categories - (income, auto ownership, etc). The computed behavioral choices are the - same, but the output files are generated with more detail suitable for - validation (but they are also much larger). - with_wfh : bool, default True - Run the entire model a second time, using the WFH production and - attractions. - staggertime : int, default 15 - Number of seconds to stagger the initial launch of jobs. Staggering - helps prevent resource contention across jobs (i.e. trying to read - inputs from disk at the same time, which can saturate the bandwidth for - disk reading and cause slowdowns in processes). - - Returns - ------- - dask dataframe - The modeled trips - """ - log = getSubLogger("TRIP_SIM_MULTI") - - if otaz is None: - otaz = np.arange(dh.n_internal_zones) + 1 - - # auto chunk size calculation - n_chunks_per_job = 0 - chunk_size = np.inf - while chunk_size > max_chunk_size: - n_chunks_per_job += 1 - chunk_size = int(np.ceil(len(otaz) / n_jobs / n_chunks_per_job)) - if chunk_size == 1: - break - - log.info(f"using chunk_size={chunk_size} to process {len(otaz)} otazs across {n_jobs} jobs") - - otaz_chunks = [otaz[i:i + chunk_size] for i in range(0, len(otaz), chunk_size)] - # inits = [None for _ in range(0, min(len(otaz), n_jobs))] - - import joblib - save_dir = dh.filenames.cache_dir / cache_subdir - os.makedirs(save_dir, exist_ok=True) - n_threads = max(int(thread_saturation * joblib.cpu_count() // n_jobs), 1) - log.info(f"using n_threads={n_threads} (per job)") - - # if temp_dir is None: - # temp_dir = save_dir/"temp" - if temp_dir is not None: - os.makedirs(temp_dir, exist_ok=True) - - # The model allows for using auto propensity for non-home trips - # that is lagged by one global iteration. This allows all trip purposes - # to be processed together, greating improving runtime. - if with_nonhome_auto: - first_purposes = tuple(j for j in purposesA if 'NHB' not in j) - second_purposes = tuple(j for j in purposesA if j not in first_purposes) - else: - first_purposes = purposesA - second_purposes = () - - with joblib.Parallel(n_jobs=n_jobs, verbose=100) as parallel: - # IMPORTANT: Do not run the initialize step as show below - # the memory usage of the worker will be much smaller - # than for a real step, and loky will think there is - # a memory leak and kill the worker. - # if init_step: - # log.info("joblib model init starting") - # _ = parallel( - # joblib.delayed(choice_simulator_initialize)(dh, False) - # for _ in inits - # ) - # log.info("joblib model init complete") - # else: - log.info("joblib model body starting") - parallel( - joblib.delayed(choice_simulator_trips)( - dh, - otaz_chunk, - purposes=first_purposes, - save_dir=save_dir, - n_threads=n_threads, - delay=delay, - temp_dir=temp_dir, - disagg_choices=disagg_choices, - ) - for delay, otaz_chunk in stagger_starts(otaz_chunks, delay=staggertime, n_jobs=n_jobs) - ) - if with_wfh: - log.info("joblib model WFH starting") - parallel( - joblib.delayed(choice_simulator_trips)( - dh, - otaz_chunk, - purposes=first_purposes, - save_dir=save_dir, - n_threads=n_threads, - delay=delay, - temp_dir=temp_dir, - disagg_choices=disagg_choices, - use_wfh_pa=True, - ) - for delay, otaz_chunk in stagger_starts(otaz_chunks, delay=staggertime, n_jobs=n_jobs) - ) - log.info("joblib first purposes complete") - - log.info("computing auto propensity by zone") - trips = assemble_trips( - dh, - from_dir=save_dir, - pattern="choice_simulator_trips_*.pq", - compute_auto_propensity=True, - ) - if second_purposes: - with joblib.Parallel(n_jobs=n_jobs, verbose=100) as parallel: - log.info("joblib model second purposes starting") - parallel( - joblib.delayed(choice_simulator_trips)( - dh, - otaz_chunk, - purposes=second_purposes, - save_dir=save_dir, - n_threads=n_threads, - delay=delay, - temp_dir=temp_dir, - disagg_choices=disagg_choices, - ) - for delay, otaz_chunk in stagger_starts(otaz_chunks, delay=staggertime, n_jobs=n_jobs) - ) - if with_wfh: - log.info("joblib model second purposes WFH starting") - parallel( - joblib.delayed(choice_simulator_trips)( - dh, - otaz_chunk, - purposes=second_purposes, - save_dir=save_dir, - n_threads=n_threads, - delay=delay, - temp_dir=temp_dir, - disagg_choices=disagg_choices, - use_wfh_pa=True, - ) - for delay, otaz_chunk in stagger_starts(otaz_chunks, delay=staggertime, n_jobs=n_jobs) - ) - - log.info("joblib second purposes complete") - trips = assemble_trips( - dh, - from_dir=save_dir, - pattern="choice_simulator_trips_*.pq", - compute_auto_propensity=False, - ) - - log.info("computing deadhead trips by hired cars") - try: - deadheads = compute_deadhead_trip_table( - dh, - trips, - ) - except KeyError: - import numexpr as ne - ne.necompiler._numexpr_cache.clear() - deadheads = compute_deadhead_trip_table( - dh, - trips, - ) - if disagg_choices: - deadheads['hh_autos'] = -1 - deadheads['hh_inc5'] = -1 - deadheads.to_parquet(os.path.join(save_dir, "choice_simulator_trips_deadhead.pq")) - - return assemble_trips( - dh, - from_dir=save_dir, - pattern="choice_simulator_trips_*.pq", - compute_auto_propensity=False, - ) - - - -def assemble_trips( - dh, - from_dir, - pattern="choice_simulator_trips_*.pq", - compute_auto_propensity=False, - validation_dump=None, -): - """ - Assemble trip list files into a single dask DataFrame for processing. - - Parameters - ---------- - dh - from_dir - pattern - compute_auto_propensity - validation_dump - - Returns - ------- - - """ - from_dir = Path(from_dir) - - import dask.dataframe as ddf - import glob - - trips = ddf.read_parquet(glob.glob(os.fspath(from_dir/pattern))) - - if compute_auto_propensity: - homebased_trips_by_mode = ( - trips - .query("purpose not in ('NHB', 'NHBR', 'NHBS')") - .groupby(["mode", "a_zone"])['trips'] - .sum() - .compute() - .unstack(0) - .fillna(0) - ) - auto_propensity = ( - homebased_trips_by_mode.loc[:, [1, 2, 3]].sum(1) / homebased_trips_by_mode.sum(1) - ) - auto_propensity = auto_propensity.reindex(pd.RangeIndex(1, 3632 + 1)).fillna(0.95).rename("auto_propensity") - auto_propensity.index.name = "TAZ" - auto_propensity.to_csv(dh.filenames.emme_database_dir / "computed_auto_propensity.csv") - - if validation_dump is not None: - trips.to_csv( - os.fspath(from_dir/validation_dump), - single_file=True, - compression='gzip' if validation_dump.endswith(".gz") else None, - ) - - return trips - - -def aggregate_to_vehicle_matrixes( - dh, - trips, -): - """ - Aggregate person trips into emme matrix vehicle trips. - - This function writes vehicle trip tables to mfNNN.emx files in the - `Database/emmemat` directory, according to the following guide: - - Automobile Vehicle Trips (by 8 time of day periods EA AM1 AM2 AM3 MD PM1 PM2 PM3) - - SOV low value of time – mf411-mf418 - - SOV med value of time – mf421-mf428 - - SOV high value of time – mf431-mf438 - - HOV2 not diff'd by vot – mf441-mf448 - - HOV3 not diff'd by vot – mf451-mf458 - - Transit Person Trips (not by time of day) - - home-based work low income - mf40 - - home-based work high income - mf41 - - home-based shopping - mf39 - - home-based other - mf42 - - non-home-based - mf43 - - Parameters - ---------- - dh : DataHandler - trips : DataFrame - The output trip table from the mode/dest/time-of-day models - - Returns - ------- - vehicle_trips : xarray.DataArray - """ - - log = getSubLogger("application.ToMatrix") - log.info(f"running aggregate_to_vehicle_matrixes") - - # If we receive a dask dataframe, load it into a pandas dataframe now - import dask.dataframe as ddf - if isinstance(trips, ddf.DataFrame): - log.debug(f"converting trips from dask.dataframe to pandas.dataframe") - trips = trips.compute() - - # hov3_occupancy = { - # 'HBW': 3.36, - # 'HBO': 3.31, - # 'NHB': 3.39, - # } - - from .modecodes import mode9codes - from .time_of_day_model import time_period_names - n_timeperiods = len(time_period_names) - n_zones = dh.skims.raw.dims['otaz'] - z_range = pd.RangeIndex(1, n_zones + 1) - vot_names = ['sovL', 'sovM', 'sovH', 'hov2', 'hov3'] - - votb = pd.read_csv( - dh.filenames.value_of_time_buckets, - comment="#", - skipinitialspace=True, - ) - votb = votb.set_index(["Purpose", "Income Group"]) - votb = votb.div(votb.sum(1), axis=0) - - vehicle_trips = xr.DataArray( - data=np.float32(0.0), - dims=['vot', 'timeperiod', 'o_zone', 'd_zone'], - coords={ - 'vot': vot_names, - 'timeperiod': time_period_names, - 'o_zone': z_range, - 'd_zone': z_range, - } - ) - - for purpose, income in votb.index: - log.info(f" sov for purpose {purpose} income {income}") - - sov_array = xr.DataArray.from_series( - trips - .query(f"purpose == '{purpose}' and mode == {1} and hh_inc5 == {income}") - .groupby(["timeperiod", "o_zone", "d_zone"])['trips'] - .sum() - ).reindex( - timeperiod=time_period_names, o_zone=z_range, d_zone=z_range, - ).fillna(0).values - - log.info(f" sov for purpose {purpose} income {income} total={np.sum(sov_array)}") - - for vot_bucket in range(3): - vehicle_trips[vot_bucket] += sov_array * votb.loc[(purpose, income)].iloc[vot_bucket] - - # count up all HOV2 person trips, divide by 2 - #for modecode, vot_bucket in zip([mode9codes.HOV2, mode9codes.HOV3], [3,4]): - log.info(f" hov2") - vehicle_trips[3, ...] = xr.DataArray.from_series( - trips - .query(f"mode in ({mode9codes.HOV2},{mode9codes.TAXI},{mode9codes.TNC1})") ##-- Heither .query(f"mode == {mode9codes.HOV2}") - .groupby(["timeperiod", "o_zone", "d_zone"])['trips'] - .sum() - ).reindex( - timeperiod=time_period_names, o_zone=z_range, d_zone=z_range, - ).fillna(0).values / 2 - - log.info(f" hov3") - # count up all HOV3 person trips, divide by occupancy - vehicle_trips[4, ...] += xr.DataArray.from_series( - trips - .query(f"purpose in ('HBWH', 'HBWL') and mode in ({mode9codes.HOV3},{mode9codes.TNC2})") ##-- Heither .query(f"purpose in ('HBWH', 'HBWL') and mode == {mode9codes.HOV3}") - .groupby(["timeperiod", "o_zone", "d_zone"])['trips'] - .sum() - ).reindex( - timeperiod=time_period_names, o_zone=z_range, d_zone=z_range, - ).fillna(0).values / dh.cfg.hov3_occupancy['HBW'] - vehicle_trips[4, ...] += xr.DataArray.from_series( - trips - .query(f"purpose in ('HBO', 'HBS') and mode in ({mode9codes.HOV3},{mode9codes.TNC2})") ##-- Heither .query(f"purpose in ('HBO', 'HBS') and mode == {mode9codes.HOV3}") - .groupby(["timeperiod", "o_zone", "d_zone"])['trips'] - .sum() - ).reindex( - timeperiod=time_period_names, o_zone=z_range, d_zone=z_range, - ).fillna(0).values / dh.cfg.hov3_occupancy['HBO'] - vehicle_trips[4, ...] += xr.DataArray.from_series( - trips - .query(f"purpose in ('NHB', 'VISIT') and mode in ({mode9codes.HOV3},{mode9codes.TNC2})") ##-- Heither .query(f"purpose in ('NHB', 'VISIT') and mode == {mode9codes.HOV3}") - .groupby(["timeperiod", "o_zone", "d_zone"])['trips'] - .sum() - ).reindex( - timeperiod=time_period_names, o_zone=z_range, d_zone=z_range, - ).fillna(0).values / dh.cfg.hov3_occupancy['NHB'] - - output_mf_numbers = { - 'sovL': 411, # SOV low value of time – mf411-mf418 - 'sovM': 421, # SOV med value of time – mf421-mf428 - 'sovH': 431, # SOV high value of time – mf431-mf438 - 'hov2': 441, # HOV2 not diff'd by vot – mf441-mf448 - 'hov3': 451, # HOV3 not diff'd by vot – mf451-mf458 - } - - for vot in vot_names: - for t, time_period_name in enumerate(time_period_names): - n = output_mf_numbers[vot] + t - mtx_filename = os.fspath(dh.filenames.emme_database_dir / f"emmemat/mf{n}.emx") - write_out = vehicle_trips \ - .sel(vot=vot, timeperiod=time_period_name) \ - .transpose("o_zone", "d_zone") \ - .values - if os.path.exists(mtx_filename): - mmap_mode = 'r+' - else: - mmap_mode = 'w+' - # We write into the existing file instead of deleting and rewriting the file - # emme may be happier this way if the file handle was previously held open - mmap = np.memmap( - mtx_filename, - dtype=np.float32, - mode=mmap_mode, - shape=write_out.shape, - ) - mmap[:,:] = write_out - mmap.flush() - - # transit person trips - - purposes6 = np.asarray(( - 'HBWH', # Home-based Work, High Income - 'HBWL', # Home-based Work, Low Income - 'HBS', # Home-based Shopping - 'HBO', # Home-based Other Purpose Not Enumerated - 'NHB', # Non-home-based - 'VISIT', - ),) - - transit_trips = xr.DataArray.from_series( - trips - .query(f"mode == {mode9codes.TRANSIT}") - .groupby(["purpose", "o_zone", "d_zone"])['trips'] - .sum() - ).reindex( - purpose=purposes6, o_zone=z_range, d_zone=z_range, - ).astype(np.float32).fillna(0) - - transit_trip_mtx_numbers = { - 'HBWL': 'mf40', - 'HBWH': 'mf41', - 'HBS': 'mf39', - 'HBO': 'mf42', - 'NHB': 'mf43', - 'VISIT': 'mf38', - } - - for purpose, purp_mtx in transit_trip_mtx_numbers.items(): - mtx_filename = os.fspath(dh.filenames.emme_database_dir / f"emmemat/{purp_mtx}.emx") - write_out = transit_trips.sel(purpose=purpose).transpose("o_zone", "d_zone").values #.tofile(mtx_filename) - if os.path.exists(mtx_filename): - mmap_mode = 'r+' - else: - mmap_mode = 'w+' - # We write into the existing file instead of deleting and rewriting the file - # emme may be happier this way if the file handle was previously held open - mmap = np.memmap( - mtx_filename, - dtype=np.float32, - mode=mmap_mode, - shape=write_out.shape, - ) - mmap[:, :] = write_out - mmap.flush() - - # Example: home-based work high and low income auto person-trips - if False: - custom_person_trips = xr.DataArray.from_series( - trips - .query(f"purpose in ('HBWH', 'HBWL') and mode in ({mode9codes.AUTO},{mode9codes.HOV2},{mode9codes.HOV3})") - .groupby(["o_zone", "d_zone"])['trips'] - .sum() - ).reindex( - o_zone=z_range, d_zone=z_range, - ).astype(np.float32).fillna(0) - - custom_matrix_number = 1234 - mtx_filename = os.fspath(dh.filenames.emme_database_dir / f"emmemat/{custom_matrix_number}.emx") - write_out = custom_person_trips.transpose("o_zone", "d_zone").values # use "transpose" to ensure ozone is rows and dzone is cols - if os.path.exists(mtx_filename): - mmap_mode = 'r+' - else: - mmap_mode = 'w+' - # We write into the existing file instead of deleting and rewriting the file - # emme may be happier this way if the file handle was previously held open - mmap = np.memmap( - mtx_filename, - dtype=np.float32, - mode=mmap_mode, - shape=write_out.shape, - ) - mmap[:, :] = write_out - mmap.flush() - - return vehicle_trips \ No newline at end of file diff --git a/src/Mode-Dest-TOD/cmap_modedest/choice_model.py b/src/Mode-Dest-TOD/cmap_modedest/choice_model.py deleted file mode 100755 index 165c1f5..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/choice_model.py +++ /dev/null @@ -1,544 +0,0 @@ -import numpy as np -import pandas as pd -import larch -from larch import P,X -from larch.util.data_expansion import piecewise_linear -from .addict import Dict -from .cmap_logging import getLogger -from .modecodes import mode5codes, mode9codes, mode9names - -log = getLogger() - - - -def alt_codes_and_names( - n_sampled_dests=5, - include_actual_dest=True, -): - """ - Generate alternative names and codes for mode-destination model. - - Parameters - ---------- - n_sampled_dests : int - The number of destinations that will be used. In estimation, this - is the number of destinations to be sampled. In application, this - is the total number of destinations, as sampling is not used. - include_actual_dest : bool - Whether to include the "actual" destination. This destination is - included in estimation, where it is used to populate the actually - chosen alternative. In appplication, the "actual" destination is - not applicable and should be turned off. - - Returns - ------- - alt_codes : ndarray - alt_names : list - """ - n_modes = len(mode9names) - alt_codes = np.arange(n_modes * (n_sampled_dests + 1)) + 1 - alt_names = [i for i in mode9names] - for i in range(n_sampled_dests): - alt_names.extend([(j + f"d{i + 1:04d}") for j in mode9names]) - if not include_actual_dest: - alt_codes = alt_codes[n_modes:] - alt_names = alt_names[n_modes:] - return alt_codes, alt_names - - -def model_utility_for_dest( - m, - dest_number, - purpose, - n_modes, -): - """ - Construct some utility functions for the mode and destination model. - - This method constructs the utility functions for all of the modes, for - a single destination. It is called multiple times to build the complete - set of utility functions across all destinations. - - Parameters - ---------- - m : larch.Model - dest_number : int - The number of the destination. In application, this is - the TAZ index (TAZ ID minus 1). In estimation, this is - the sampling slot, or for actual destination, give -1. - purpose : str - n_modes : int - - Returns - ------- - - """ - if dest_number == -1: - dest_label = "actualdest" - else: - dest_label = f'altdest{dest_number + 1:04d}' - - alts_per_dest = n_modes - utility_destination = ( - + P("samp_af") * X(f"log(1/{dest_label}_samp_wgt)") - + P("log_attraction") * X(f"{dest_label}_log_attractions_{purpose}") - + P("intrazonal") * X(f"o_zone == {dest_label}") - + piecewise_linear(f"{dest_label}_auto_dist_OFFPEAK", "distance", breaks=[5, 10]) - ) - shift = (dest_number+1) * alts_per_dest - jAUTO = mode9codes.AUTO + shift - jHOV2 = mode9codes.HOV2 + shift - jHOV3 = mode9codes.HOV3 + shift - jTNC1 = mode9codes.TNC1 + shift - jTNC2 = mode9codes.TNC2 + shift - jTAXI = mode9codes.TAXI + shift - jTRANSIT = mode9codes.TRANSIT + shift - jWALK = mode9codes.WALK + shift - jBIKE = mode9codes.BIKE + shift - peaky = 'PEAK' if 'W' in purpose else 'OFFPEAK' - peaky_hov = 'hov_PEAK' if 'W' in purpose else 'OFFPEAK' - - - m.utility_co[jAUTO] = ( - + P("cost") * X(f"{dest_label}_auto_opcost_{peaky}") / 100 # cost in dollars - + P("totaltime") * X(f"{dest_label}_auto_time_{peaky}") - + P("cost") * X(f"{dest_label}_auto_parking_cost_{purpose}") / 100 # cost in dollars - # TODO add walk terminal time cost - + P("unavail") * X(f"1-{dest_label}_auto_avail_{purpose}") - ) + utility_destination - if purpose.upper()[-1] == 'H': - m.utility_co[jAUTO] += P("cost") * X(f"{dest_label}_auto_toll_hiinc_PEAK") / 100 # cost in dollars - elif purpose.upper()[-1] == 'L': - m.utility_co[jAUTO] += P("cost") * X(f"{dest_label}_auto_toll_loinc_PEAK") / 100 # cost in dollars - else: - m.utility_co[jAUTO] += P("cost") * X(f"{dest_label}_auto_toll_OFFPEAK") / 100 # cost in dollars - if purpose.upper() in {'NH', 'NHB'}: - m.utility_co[jAUTO] += ( - + P("AUTO_ozone_autopropensity") * X(f"ozone_autopropensity") - + P("AUTO_dzone_autopropensity") * X(f"{dest_label}_autopropensity") - ) - else: - m.utility_co[jAUTO] += ( - + P("AUTO_no_veh") * X("hhveh==0") - + P("AUTO_sufficient_veh") * X("hhveh>=hhadults") - ) - - - m.utility_co[jHOV2] = ( - P.Const_HOV2 - + P("cost") * X(f"{dest_label}_auto_opcost_{peaky_hov}") * 0.5 / 100 # cost in dollars - + P("totaltime") * X(f"{dest_label}_auto_time_{peaky}") - + P("cost") * 0.5 * X(f"{dest_label}_auto_parking_cost_{purpose}") / 100 # cost in dollars - # TODO add walk terminal time cost - + P("unavail") * X(f"1-{dest_label}_auto_avail_{purpose}") - + piecewise_linear(f"{dest_label}_auto_dist_OFFPEAK", "HOV2_distance", breaks=[5, 10]) - ) + utility_destination - if purpose.upper()[-1] == 'H': - m.utility_co[jHOV2] += P("cost") * X(f"{dest_label}_auto_toll_hov_hiinc_PEAK") / 2 / 100 # cost in dollars - elif purpose.upper()[-1] == 'L': - m.utility_co[jHOV2] += P("cost") * X(f"{dest_label}_auto_toll_hov_loinc_PEAK") / 2 / 100 # cost in dollars - else: - m.utility_co[jHOV2] += P("cost") * X(f"{dest_label}_auto_toll_OFFPEAK") / 2 / 100 # cost in dollars - if purpose.upper() in {'NH', 'NHB'}: - m.utility_co[jHOV2] += ( - + P("HOV_ozone_autopropensity") * X(f"ozone_autopropensity") - + P("HOV_dzone_autopropensity") * X(f"{dest_label}_autopropensity") - ) - else: - m.utility_co[jHOV2] += ( - + P("HOV_no_veh") * X("hhveh==0") - + P("HOV_sufficient_veh") * X("hhveh>=hhadults") - ) - - - - - m.utility_co[jHOV3] = ( - P.Const_HOV3 - + P("cost") * X(f"{dest_label}_auto_opcost_{peaky_hov}") * 0.33 / 100 # cost in dollars - + P("totaltime") * X(f"{dest_label}_auto_time_{peaky}") - + P("cost") * 0.33 * X(f"{dest_label}_auto_parking_cost_{purpose}") / 100 # cost in dollars - # TODO add walk terminal time cost - + P("unavail") * X(f"1-{dest_label}_auto_avail_{purpose}") - + piecewise_linear(f"{dest_label}_auto_dist_OFFPEAK", "HOV3_distance", breaks=[5, 10]) - ) + utility_destination - if purpose.upper()[-1] == 'H': - m.utility_co[jHOV3] += P("cost") * X(f"{dest_label}_auto_toll_hov_hiinc_PEAK") / 3 / 100 # cost in dollars - elif purpose.upper()[-1] == 'L': - m.utility_co[jHOV3] += P("cost") * X(f"{dest_label}_auto_toll_hov_loinc_PEAK") / 3 / 100 # cost in dollars - else: - m.utility_co[jHOV3] += P("cost") * X(f"{dest_label}_auto_toll_OFFPEAK") / 3 / 100 # cost in dollars - if purpose.upper() in {'NH', 'NHB'}: - m.utility_co[jHOV3] += ( - + P("HOV_ozone_autopropensity") * X(f"ozone_autopropensity") - + P("HOV_dzone_autopropensity") * X(f"{dest_label}_autopropensity") - ) - else: - m.utility_co[jHOV3] += ( - + P("HOV_no_veh") * X("hhveh==0") - + P("HOV_sufficient_veh") * X("hhveh>=hhadults") - ) - m.utility_co[jTNC1] = ( - P.Const_TNC1 - + P("cost") * X(f"{dest_label}_tnc_solo_fare_{peaky}") / 100 # cost in dollars - + P("ovtt_dist") * X(f"{dest_label}_tnc_solo_wait_time_{peaky}")/X(f"{dest_label}_auto_dist_{peaky}") - + P("totaltime") * X(f"{dest_label}_tnc_solo_wait_time_{peaky}") - + P("totaltime") * X(f"{dest_label}_auto_time_{peaky}") - + P("unavail") * X(f"1-{dest_label}_auto_avail_{purpose}") - ) + utility_destination - m.utility_co[jTNC2] = ( - P.Const_TNC2 - + P("cost") * X(f"{dest_label}_tnc_pool_fare_{peaky}") / 100 # cost in dollars - + P("ovtt_dist") * X(f"{dest_label}_tnc_pool_wait_time_{peaky}")/X(f"{dest_label}_auto_dist_{peaky}") - + P("totaltime") * X(f"{dest_label}_tnc_pool_wait_time_{peaky}") - + P("totaltime") * X(f"{dest_label}_auto_time_{peaky}") - + P("unavail") * X(f"1-{dest_label}_auto_avail_{purpose}") - ) + utility_destination - m.utility_co[jTAXI] = ( - P.Const_TAXI - + P("cost") * X(f"{dest_label}_taxi_fare_{peaky}") / 100 # cost in dollars - + P("ovtt_dist") * X(f"{dest_label}_taxi_wait_time_{peaky}")/X(f"{dest_label}_auto_dist_{peaky}") - + P("totaltime") * X(f"{dest_label}_taxi_wait_time_{peaky}") - + P("totaltime") * X(f"{dest_label}_auto_time_{peaky}") - + P("unavail") * X(f"1-{dest_label}_auto_avail_{purpose}") - ) + utility_destination - - if purpose.upper()[-1] == 'H': - m.utility_co[jTNC1] += P("cost") * X(f"{dest_label}_auto_toll_hiinc_PEAK") / 100 # cost in dollars - m.utility_co[jTNC2] += P("cost") * X(f"{dest_label}_auto_toll_hiinc_PEAK") / 2 / 100 # cost in dollars - m.utility_co[jTAXI] += P("cost") * X(f"{dest_label}_auto_toll_hiinc_PEAK") / 100 # cost in dollars - elif purpose.upper()[-1] == 'L': - m.utility_co[jTNC1] += P("cost") * X(f"{dest_label}_auto_toll_loinc_PEAK") / 100 # cost in dollars - m.utility_co[jTNC2] += P("cost") * X(f"{dest_label}_auto_toll_loinc_PEAK") / 2 / 100 # cost in dollars - m.utility_co[jTAXI] += P("cost") * X(f"{dest_label}_auto_toll_loinc_PEAK") / 100 # cost in dollars - else: - m.utility_co[jTNC1] += P("cost") * X(f"{dest_label}_auto_toll_OFFPEAK") / 100 # cost in dollars - m.utility_co[jTNC2] += P("cost") * X(f"{dest_label}_auto_toll_OFFPEAK") / 2 / 100 # cost in dollars - m.utility_co[jTAXI] += P("cost") * X(f"{dest_label}_auto_toll_OFFPEAK") / 100 # cost in dollars - - - m.utility_co[jWALK] = ( - P.Const_WALK - #+ P("walk_time") * X(f"{dest_label}_auto_dist_OFFPEAK") * 20 # minutes per mile - + piecewise_linear(f"{dest_label}_auto_dist_OFFPEAK", "walk_time", breaks = [0.5,1.0]) * 20 # minutes per mile - + P("walk_intrazonal") * X(f"o_zone == {dest_label}") - + P("walk_areatype2") * X(f"fmax(ozone_areatype, {dest_label}_areatype)==2") - + P("walk_areatype3") * X(f"fmax(ozone_areatype, {dest_label}_areatype)==3") - + P("walk_areatype4") * X(f"fmax(ozone_areatype, {dest_label}_areatype)==4") - ) + utility_destination - m.utility_co[jBIKE] = ( - P.Const_BIKE - + P("bike_time") * X(f"{dest_label}_auto_dist_OFFPEAK") * 5 # minutes per mile - + P("bike_intrazonal") * X(f"o_zone == {dest_label}") - ) + utility_destination - m.utility_co[jTRANSIT] = ( - P.Const_Transit - + P("cost") * X(f"{dest_label}_transit_fare_{peaky}") / 100 # cost in dollars - + P("totaltime") * X(f"{dest_label}_transit_ovtt_{peaky}") - + P("cost") * X(f"{dest_label}_transit_approach_cost_{peaky}") / 100 # cost in dollars - + P("totaltime") * X(f"{dest_label}_transit_approach_drivetime_{peaky}") - + P("totaltime") * X(f"{dest_label}_transit_approach_walktime_{peaky}") - + P("totaltime") * X(f"{dest_label}_transit_approach_waittime_{peaky}") - + P("unavail") * X(f"1-{dest_label}_transit_avail_{purpose}") - + P("ovtt_dist") * X(f"{dest_label}_transit_ovtt_{peaky}")/X(f"{dest_label}_auto_dist_{peaky}") - + P("ovtt_dist") * X(f"{dest_label}_transit_approach_walktime_{peaky}")/X(f"{dest_label}_auto_dist_{peaky}") - + P("ovtt_dist") * X(f"{dest_label}_transit_approach_waittime_{peaky}")/X(f"{dest_label}_auto_dist_{peaky}") - + P("transit_intrazonal") * X(f"o_zone == {dest_label}") - - ) + utility_destination - if 'W' not in purpose.upper(): - m.utility_co[jTRANSIT] += ( - + P("transit_walk_is_short") * X(f"hard_sigmoid({dest_label}_transit_approach_walktime_{peaky}, 4.0, 2.0)") - + P("transit_areatype3") * X(f"fmax(ozone_areatype, {dest_label}_areatype)==3") - ) - else: - m.utility_co[jTRANSIT] += ( - + P("transit_areatype2") * X(f"fmin(ozone_areatype, {dest_label}_areatype)==2") - + P("transit_areatype3") * X(f"fmin(ozone_areatype, {dest_label}_areatype)==3") - + P("transit_areatype4") * X(f"fmin(ozone_areatype, {dest_label}_areatype)==4") - + P("metra_longtrip") * X(f"{dest_label}_Metra_drive_{peaky}") - ) - - if purpose.upper() in {'NH', 'NHB'}: - m.utility_co[jTRANSIT] += ( - + P("totaltime") * X(f"piece({dest_label}_transit_ivtt_{peaky}, None, 20)") - + P("ivtt_longtransit") * X(f"piece({dest_label}_transit_ivtt_{peaky}, 20, None)") - ) - else: - m.utility_co[jTRANSIT] += ( - + P("totaltime") * X(f"{dest_label}_transit_ivtt_{peaky}") - ) - - ## IMPORTANT be sure to change `nests_per_dest` elsewhere (i.e. estimation code) - # if/when the number of nests per destination is altered here - - private_car = m.graph.new_node( - parameter="Mu-PrivateCar", - children=[jAUTO, jHOV2, jHOV3], - name=f"privatecar-{dest_label}", - ) - hired_car = m.graph.new_node( - parameter="Mu-HiredCar", - children=[jTAXI, jTNC1, jTNC2], - name=f"hiredcar-{dest_label}", - ) - m.graph.new_node( - parameter="Mu-Dest", - children=[private_car, hired_car, jTRANSIT, jWALK, jBIKE], - name=f"{dest_label}", - ) - - -def _lock_value(self, name, value, note=None, change_check=True): - """ - Set a fixed value for a model parameter. - - Parameters with a fixed value (i.e., with "holdfast" set to 1) - will not be changed during estimation by the likelihood - maximization algorithm. - - Parameters - ---------- - name : str - The name of the parameter to set to a fixed value. - value : float - The numerical value to set for the parameter. - note : str, optional - A note as to why this parameter is set to a fixed value. - This will not affect the mathematical treatment of the - parameter in any way, but may be useful for reporting. - change_check : bool, default True - Whether to trigger a check to see if any parameter frame - values have changed. Can be set to false to skip this - check if you know that the values have not changed or want - to delay this check for later, but this may result in - problems if the check is needed but not triggered before - certain other modeling tasks are performed. - - """ - name = str(name) - if value == 'null': - value = self.pf.loc[name, 'nullvalue'] - self.set_value(name, value, holdfast=1, initvalue=value, nullvalue=value, minimum=value, maximum=value) - if note is not None: - self._frame.loc[name, 'note'] = note - if change_check: - self._check_if_frame_values_changed() - - -def purpose_peakiness(purpose): - from .purposes import purposes_to_peaky - if purposes_to_peaky[purpose]: - return 'PEAK' - else: - return 'OFFPEAK' - - -def model_choice_availability(purpose, n_sampled_dests, include_actual_dest=False): - """ - Build a dictionary that has expressions for availability of each mode to each destination. - - Parameters - ---------- - purpose : str - The trip purpose, which in turn determines the available skims used. - n_sampled_dests : int - The number of destinations that will be used. In estimation, this - is the number of destinations to be sampled. In application, this - is the total number of destinations, as sampling is not used. - include_actual_dest : bool - Whether to include the "actual" destination. This destination is - included in estimation, where it is used to populate the actually - chosen alternative. In appplication, the "actual" destination is - not applicable and should be turned off. - - Returns - ------- - Dict[int, str] - """ - - peaky = purpose_peakiness(purpose) - n_modes = len(mode9codes) - - # Define the alternative availability for each alternative in this model. - av = {} - dzone_has_nonzero_attractions = f"actualdest_log_attractions_{purpose} > -666" - if include_actual_dest: - av[mode9codes.AUTO] = dzone_has_nonzero_attractions - av[mode9codes.HOV2] = dzone_has_nonzero_attractions - av[mode9codes.HOV3] = dzone_has_nonzero_attractions - av[mode9codes.TNC1] = dzone_has_nonzero_attractions - av[mode9codes.TNC2] = dzone_has_nonzero_attractions - av[mode9codes.TAXI] = dzone_has_nonzero_attractions - av[mode9codes.TRANSIT] = ( - f"(actualdest_transit_ivtt_{peaky} < 999) " - f"& (actualdest_transit_approach_walktime_{peaky} < 999) " - f"& (actualdest_transit_approach_drivetime_{peaky} < 999) " - f"& ({dzone_has_nonzero_attractions})" - ) - av[mode9codes.WALK] = f"(actualdest_log_attractions_{purpose} > -666)&(actualdest_auto_dist_OFFPEAK < 3)" - av[mode9codes.BIKE] = f"(actualdest_log_attractions_{purpose} > -666)&(actualdest_auto_dist_OFFPEAK < 12)" - num = n_modes - for i in range(n_sampled_dests): - altdest_has_nonzero_attractions = f"altdest{i + 1:04d}_auto_avail_{purpose}" - av[num + mode9codes.AUTO] = altdest_has_nonzero_attractions - av[num + mode9codes.HOV2] = altdest_has_nonzero_attractions - av[num + mode9codes.HOV3] = altdest_has_nonzero_attractions - av[num + mode9codes.TNC1] = altdest_has_nonzero_attractions - av[num + mode9codes.TNC2] = altdest_has_nonzero_attractions - av[num + mode9codes.TAXI] = altdest_has_nonzero_attractions - av[num + mode9codes.TRANSIT] = f"altdest{i + 1:04d}_transit_avail_{purpose}" - av[num + mode9codes.WALK] = f"altdest{i + 1:04d}_walk_avail_{purpose}" - av[num + mode9codes.BIKE] = f"altdest{i + 1:04d}_bike_avail_{purpose}" - num += n_modes - - return av - - -def model_builder( - purpose, - include_actual_dest=True, - n_sampled_dests=5, - parameter_values=None, - constraints=True, - n_threads=-1, - application_mode=False, - explicit_av=True, -): - """ - Construct a larch Model for mode and destination choice. - - This function creates the structure of the model and sets parameter - values within that structure if given. To ensure consistency, the - same code is used to contruct models for estimation and for application, - although slight changes in structure are applied based on the arguments - as documented below. - - Parameters - ---------- - purpose : str - include_actual_dest : bool - The "actual" observed destination is included for estimation, but - not in application. - n_sampled_dests : int - For estimation, only a subset of destinations are sampled using a - weighted importance sampling. In application, this is set to the - full number of zones and no sampling weights are applied. - parameter_values : Mapping - The values to use for model parameters. Typically not provided here - for estimation, but should be provided for application. - constraints : bool - Whether to include estimation constraints in the model specification. - In application, parameters are not changed so constraints are - unnecessary. - n_threads : int, default -1 - Number of threads to use for computation. Set to -1 to use threads for - all processessor cores. - application_mode - explicit_av - - Returns - ------- - - """ - - - log.debug(f"model_builder({purpose}, n_sampled_dests={n_sampled_dests})") - - n_modes = len(mode9names) - - alt_codes, alt_names = alt_codes_and_names( - n_sampled_dests=n_sampled_dests, - include_actual_dest=include_actual_dest, - ) - from larch.numba import DataFrames - dummy_dfs = DataFrames( - alt_codes=alt_codes, - alt_names=alt_names, - ) - - if explicit_av: - av = model_choice_availability(purpose, n_sampled_dests, include_actual_dest) - - import larch.numba - m = larch.numba.Model( - dataservice=dummy_dfs, - n_threads=n_threads, - ) - - m.title = f"{purpose} Mode & Destination" - - if explicit_av: - m.availability_co_vars = av - - if include_actual_dest: - model_utility_for_dest( - m, - dest_number=-1, - purpose=purpose, - n_modes=n_modes, - ) - - for i in range(n_sampled_dests): - model_utility_for_dest( - m, - dest_number=i, - purpose=purpose, - n_modes=n_modes, - ) - - m.unmangle() - _lock_value(m, "samp_af", value=1.0) - _lock_value(m, "log_attraction", value=1.0) - _lock_value(m, "unavail", value=-999) - - # initial setting of nesting parameters - m.set_value("Mu-HiredCar", 0.4) - m.set_value("Mu-Dest", 0.7) - - m.set_value("cost", maximum=-0.00001) - # m.set_value("auto_time", maximum=-0.01, minimum=-0.03) - # m.set_value("tnc_time", maximum=-0.01, minimum=-0.03) - # m.set_value("transit_ivtt", maximum=-0.01, minimum=-0.03) - m.set_value("totaltime", maximum=-0.01, minimum=-0.03) - if "ivtt_longtransit" in m: - m.set_value("ivtt_longtransit", maximum=-0.0001, minimum=-0.03) - m.set_value("ovtt_dist", maximum=-0.001) - if parameter_values is None: - m.set_values( - cost=-0.0001, - # auto_time=-0.01, - tnc_time=-0.02, - totaltime=-0.015, - ovtt_dist=-0.03, - Const_TNC1=-1.0, - Const_TNC2=-1.0, - Const_Transit=-1.0, - intrazonal=-0.1, - ) - else: - m.set_values(**parameter_values) - - if constraints: - from larch.model.constraints import RatioBound - if purpose=='HBWL': - vot_constraint = RatioBound(P("totaltime"), P("cost"), min_ratio=0.0001, max_ratio=0.5, scale=1) - elif purpose=='HBWH': - vot_constraint = RatioBound(P("totaltime"), P("cost"), min_ratio=0.5, max_ratio=1.5, scale=1) - else: - vot_constraint = RatioBound(P("totaltime"), P("cost"), min_ratio=0.0001, max_ratio=1.0, scale=1) - - m.constraints = [ - # RatioBound(P("ovtt"), P("totaltime"), min_ratio=1.5, max_ratio=3.0, scale=1), - RatioBound(P("Mu-HiredCar"), P("Mu-Dest"), min_ratio=1e-5, max_ratio=0.75, scale=1), - RatioBound(P("Mu-PrivateCar"), P("Mu-Dest"), min_ratio=1e-5, max_ratio=0.75, scale=1), - vot_constraint, - ] - - if application_mode: - m._preload_tree_structure() - - m.set_cap() - return m - - diff --git a/src/Mode-Dest-TOD/cmap_modedest/cmap_logging.py b/src/Mode-Dest-TOD/cmap_modedest/cmap_logging.py deleted file mode 100644 index 4962486..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/cmap_logging.py +++ /dev/null @@ -1,121 +0,0 @@ -import os -import logging -from logging.handlers import RotatingFileHandler -LOGGER_NAME = 'CMAP' -LOG_FORMAT = '[{elapsedTime}] {name:s}:{levelname:s}: {message:s}' -WORKERLOG_FORMAT = '[{asctime}][{elapsedTime}] {name:s}:{levelname:s}: {message:s}' - -def format_elapsed_time(duration_milliseconds): - hours, rem = divmod(duration_milliseconds/1000, 3600) - minutes, seconds = divmod(rem, 60) - if hours: - return ("{:0>2}:{:0>2}:{:05.2f}".format(int(hours),int(minutes),seconds)) - else: - return ("{:0>2}:{:05.2f}".format(int(minutes),seconds)) - - -class ElapsedTimeFormatter(logging.Formatter): - def format(self, record): - record.elapsedTime = format_elapsed_time(record.relativeCreated) - return super(ElapsedTimeFormatter, self).format(record) - -def getLogger(name=None): - return logging.getLogger(name or LOGGER_NAME) - -def getSubLogger(subname): - return logging.getLogger(f"{LOGGER_NAME}.{subname}") - -def log_to_stderr(level=30, log_dir=None): - """ - Turn on logging and add a handler which prints to stderr - - Parameters - ---------- - level : int - minimum level of the messages that will be logged - """ - import time - logger = logging.getLogger(LOGGER_NAME) - - # avoid creation of multiple stream handlers for logging to console - for entry in logger.handlers: - if isinstance(entry, logging.StreamHandler) and (entry.formatter._fmt == LOG_FORMAT): - return logger - - formatter = ElapsedTimeFormatter(LOG_FORMAT, style='{') - handler = logging.StreamHandler() - handler.setLevel(level) - handler.setFormatter(formatter) - logger.addHandler(handler) - if log_dir is not None: - # also log to a file - filehandler = RotatingFileHandler( - filename=os.path.join(log_dir, f"{time.strftime('cmap_trip_log_master_%Y%m%d_%H%M%S')}.log"), - mode='a', - maxBytes=1_000_000, - backupCount=10, - ) - filehandler.setLevel(level) - filehandler.setFormatter(formatter) - logger.addHandler(filehandler) - else: - filehandler = None - logger.propagate = False - logger.setLevel(level) - - larch_logger = logging.getLogger("Larch") - if filehandler is not None: - larch_logger.addHandler(filehandler) - larch_logger.addHandler(handler) - larch_logger.setLevel(level) - - return logger - - -def log_df(df, logger=None, level=20, verbose=0, indent=" "): - from io import StringIO - if logger is None or isinstance(logger, str): - from logging import getLogger - logger = getLogger(logger) - with StringIO() as buffer: - df.info(verbose=verbose, buf=buffer) - info = buffer.getvalue() - if indent: - import textwrap - info = textwrap.indent(info, indent, lambda line: True) - logger.log(level, info) - - -def get_worker_log(log_dir, level=20): - """ - Turn on logging and add a handler which writes to a process-specific log file - - Parameters - ---------- - level : int - minimum level of the messages that will be logged - """ - - os.makedirs(log_dir, exist_ok=True) - - logger = logging.getLogger(LOGGER_NAME) - - # avoid creation of multiple stream handlers for logging to worker log - for entry in logger.handlers: - if isinstance(entry, RotatingFileHandler) and (entry.formatter._fmt == WORKERLOG_FORMAT): - return logger - - formatter = ElapsedTimeFormatter(WORKERLOG_FORMAT, style='{') - handler = RotatingFileHandler( - filename=os.path.join(log_dir, f"cmap_trip_log_{os.getpid()}.log"), - mode='a', - maxBytes=1_000_000, - backupCount=10, - ) - handler.setLevel(level) - handler.setFormatter(formatter) - logger.addHandler(handler) - logger.propagate = False - logger.setLevel(level) - - return logger diff --git a/src/Mode-Dest-TOD/cmap_modedest/configuration.py b/src/Mode-Dest-TOD/cmap_modedest/configuration.py deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/data_handlers/__init__.py b/src/Mode-Dest-TOD/cmap_modedest/data_handlers/__init__.py deleted file mode 100644 index fd1c057..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/data_handlers/__init__.py +++ /dev/null @@ -1,267 +0,0 @@ -import cloudpickle -import numpy as np -import pandas as pd -import tempfile -import larch -from ..addict import Dict -from pathlib import Path -try: - from sharrow import Flow -except ImportError: - Flow = type(np) - -try: - from geopandas import GeoDataFrame -except ImportError: - GeoDataFrame = () - -from .filepaths import FileNames, PathAttr -from .skims_handler import DictSkims -from logging import getLogger -log = getLogger("CMAP") - -class DataHandler: - - serial_dir = PathAttr() - - def __init__( - self, - filenames=None, - serial_dir=None, - tg_detail=False, - tripclass='typical', - backfill_uncompressed_skims=False, - **kwargs, - ): - - self._jedi_names = set() - - self.artifacts = {} - # artifacts tell how to reload things if they are not cached - # this makes it easier to pass this DataHandler to subprocesses, - # as we don't need to serialize data that is already serialized. - - self._cache = {} - # the _cache is where we store things that we have already loaded - # in this process, so they are available in RAM already. - - log.info("loading filenames") - if filenames is None: - filenames = FileNames(**kwargs) - - if serial_dir is None: - log.debug("create serial temp dir") - self._temporary_dir = tempfile.TemporaryDirectory() - serial_dir = self._temporary_dir.name - - log.debug("serial_dir init") - self.serial_dir = serial_dir - - log.debug("filenames init") - self.filenames = filenames - - log.info("loading hhv_types") - from .household_types import load_household_types - self['hhv_types'] = load_household_types() - - log.info("loading distr") - from .distr_handler import load_distr - self['distr'] = load_distr(filenames) - self._jedi_names.add('distr') - - log.info("loading m01") - from .m01_handler import load_m01 - self['m01'] = load_m01(filenames) - self._jedi_names.add('m01') - - log.info("loading m023") - from .m023_handler import load_m023 - self['m023'] = load_m023(filenames) - self._jedi_names.add('m023') - - log.info("loading shapes") - from .shp_handler import load_zone_shapes - self['zone_shp'] = load_zone_shapes(filenames) - self._jedi_names.add('zone_shp') - - log.info("loading skims") - from .skims_handler import load_skims - self['skims'] = load_skims( - filenames, self, backfill_uncompressed_skims=backfill_uncompressed_skims, - ) - self._jedi_names.add('skims') - - log.info("loading tg") - from .tg_handler import load_tg, load_hh_enum - tripgens = load_tg(filenames, with_detail=tg_detail) - self['tripclass'] = tripclass - for k, tg in tripgens.items(): - # self[f'trip_attractions8_{k}'] = tg.trip_attractions8 - # self[f'trip_productions8_{k}'] = tg.trip_productions8 - # self[f'zone_productions8_{k}'] = tg.zone_productions8 - self[f'trip_attractions5_{k}'] = tg.trip_attractions5 # needed - # self[f'trip_productions5_{k}'] = tg.trip_productions5 - self[f'zone_productions5_{k}'] = tg.zone_productions5 # needed - # if tg_detail: - # self[f'trip_attractions_detail_{k}'] = tg.trip_attractions_detail - # self[f'trip_productions_detail_{k}'] = tg.trip_productions_detail - self._jedi_names.add('tripclass') - self._jedi_names.add('trip_attractions5') - self._jedi_names.add('zone_productions5') - - log.info("loading hh enumeration") - hh_enum, hh_tabulation = load_hh_enum(filenames) - self['hh_enum'] = hh_enum - self['hh_tabulation'] = hh_tabulation - self._jedi_names.add('hh_enum') - self._jedi_names.add('hh_tabulation') - - log.info("loading parking") - from .parking_handler import load_cbd_parking - parking = load_cbd_parking(filenames) - self['cbd_parking_prices'] = parking.cbd_parking_prices - self['cbd_parking_price_prob'] = parking.cbd_parking_price_prob - self['cbd_parking'] = parking.cbd_parking - self['cbd_parking2'] = parking.cbd_parking2 - self['CBD_PARKING_ZONES'] = parking.CBD_PARKING_ZONES - self._jedi_names.add('cbd_parking_prices') - self._jedi_names.add('cbd_parking_price_prob') - self._jedi_names.add('cbd_parking') - self._jedi_names.add('cbd_parking2') - self._jedi_names.add('CBD_PARKING_ZONES') - - log.info("loading visitor trip tables") - from .visitors import load_visitor_trips - visitor_trip_growth = self.cfg.get("visitor_trips_growth_factor", 1.0) - self['visitor_trips'] = load_visitor_trips(filenames, scale_factor=visitor_trip_growth) - self._jedi_names.add('visitor_trips') - - log.info("loading of data handlers complete") - - def __dir__(self): - return self._jedi_names | self.__dict__.keys() - - @property - def cfg(self): - return self.filenames.cfg - - @property - def choice_model_params(self): - return self.filenames.choice_model_params - - def __getstate__(self): - return { - 'artifacts': self.artifacts, - 'filenames': self.filenames, - '_serial_dir': self._serial_dir, - } - - def __setstate__(self, state): - self._cache = {} - self.artifacts = state['artifacts'] - self.filenames = state['filenames'] - self._serial_dir = state['_serial_dir'] - - def __setitem__(self, key, value): - self._cache[key] = value - if not isinstance(key, str): - raise ValueError("keys must be str") - if isinstance(value, GeoDataFrame): - filename = self.serial_dir / f"{key}.pkl" - with open(filename, "wb") as f: - cloudpickle.dump(value, f) - self.artifacts[key] = ('pickle', filename) - elif isinstance(value, pd.DataFrame): - filename = self.serial_dir / f"{key}.pq" - try: - value.to_parquet(filename) - except ValueError: - filename = self.serial_dir / f"{key}.h5" - value.to_hdf(filename, key) - self.artifacts[key] = ('DataFrame.h5', filename) - else: - self.artifacts[key] = ('DataFrame', filename) - elif isinstance(value, pd.Series): - filename = self.serial_dir / f"{key}.spq" - pd.DataFrame(value).to_parquet(filename) - self.artifacts[key] = ('Series', filename) - elif isinstance(value, np.ndarray): - filename = self.serial_dir / f"{key}.nm" - mm = np.memmap( - filename, - dtype=value.dtype, - mode='w+', - shape=value.shape, - ) - mm[:] = value[:] - self.artifacts[key] = ('array', filename, value.dtype, value.shape) - elif isinstance(value, larch.OMX): - filename = value.filename - self.artifacts[key] = ('OMX', filename) - elif isinstance(value, DictSkims): - filename = self.serial_dir / f"{key}.pkl" - with open(filename, "wb") as f: - cloudpickle.dump(value, f) - self.artifacts[key] = ('DictSkims', filename) - elif isinstance(value, Dict): - self.artifacts[key] = ('Dict', set(value.keys())) - for k1, v1 in value.items(): - self[f"{key}.{k1}"] = v1 - elif isinstance(value, Flow): - pass # Flow objects are thread-local - else: - filename = self.serial_dir / f"{key}.pkl" - with open(filename, "wb") as f: - cloudpickle.dump(value, f) - self.artifacts[key] = ('pickle', filename) - - def __getitem__(self, key): - if key == 'trip_attractions5': - return self[f'trip_attractions5_{self.tripclass}'] - elif key == 'zone_productions5': - return self[f'zone_productions5_{self.tripclass}'] - if key in self._cache: - return self._cache[key] - art = self.artifacts[key] - if art[0] == 'DataFrame': - result = pd.read_parquet(art[1]) - elif art[0] == 'DataFrame.h5': - result = pd.read_hdf(art[1], key) - elif art[0] == 'Series': - result = pd.read_parquet(art[1]).iloc[:,0] - elif art[0] == 'array': - result = np.memmap( - art[1], - dtype=art[2], - mode='r+', - shape=art[3], - ) - elif art[0] == 'OMX': - result = larch.OMX(art[1], 'r') - elif art[0] == 'Dict': - result = Dict() - for k1 in art[1]: - result[k1] = self[f"{key}.{k1}"] - elif art[0] == 'pickle': - with open(art[1], "rb") as f: - result = cloudpickle.load(f) - elif art[0] == 'DictSkims': - with open(art[1], "rb") as f: - result = cloudpickle.load(f) - from .skims_handler import _load_skims_step_2 - _load_skims_step_2(result, self) - else: - raise TypeError(art[0]) - self._cache[key] = result - return result - - def __getattr__(self, item): - try: - return self[item] - except: - raise AttributeError(item) - - @property - def n_internal_zones(self): - return len(self.m01) - diff --git a/src/Mode-Dest-TOD/cmap_modedest/data_handlers/distr_handler.py b/src/Mode-Dest-TOD/cmap_modedest/data_handlers/distr_handler.py deleted file mode 100644 index 47f7201..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/data_handlers/distr_handler.py +++ /dev/null @@ -1,28 +0,0 @@ -import logging -log = logging.getLogger('CMAP') -import pandas as pd -from ..addict import Dict - -def read_distr(filename): - raw = pd.read_csv(filename, header=None, index_col=0) - raw.columns = pd.MultiIndex.from_product( - [ - ['metra','ctarail','bus','feederbus','pnr'], - ['p1','p2','p3'], - ], - names = ['submode', 'param'] - ) - raw.index.name = 'zone' - result = raw.stack('submode') - return result - -def load_distr(filenames): - distr = Dict() - log.info(f"reading HW distr file from: {filenames.HW_DISTR}") - distr.HW = read_distr(filenames.HW_DISTR) - log.info(f"reading HO distr file from: {filenames.HO_DISTR}") - distr.HO = read_distr(filenames.HO_DISTR) - log.info(f"reading NH distr file from: {filenames.NH_DISTR}") - distr.NH = read_distr(filenames.NH_DISTR) - return distr - diff --git a/src/Mode-Dest-TOD/cmap_modedest/data_handlers/filepaths.py b/src/Mode-Dest-TOD/cmap_modedest/data_handlers/filepaths.py deleted file mode 100644 index 6ff5d17..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/data_handlers/filepaths.py +++ /dev/null @@ -1,284 +0,0 @@ -from pathlib import Path -import os -import glob -import time -import pandas as pd -import numpy as np -import yaml -from ..addict import Dict -from ..util import search_path - -import logging -log = logging.getLogger('CMAP') - -_here = os.path.abspath(os.path.dirname(__file__)) -emme_database_dir = os.path.normpath(os.path.join(_here, "../tests/data")) - - -class PathAttr: - - def __set_name__(self, owner, name): - self.public_name = name - self.private_name = '_' + name - - def __init__(self, can_null=True, change_callback=None): - self.can_null = can_null - self.change_callback = change_callback - - def __get__(self, obj, objtype): - return getattr(obj, self.private_name) - - def __set__(self, obj, value): - if value is None: - if not self.can_null: - raise ValueError(f'cannot set {self.private_name[1:]} to None') - else: - value = Path(value) - try: - prior = getattr(obj, self.private_name) - except AttributeError: - self.on_change(obj, value) - else: - if prior != value: - self.on_change(obj, value) - log.debug(f"setattr {self.private_name} = {value}") - setattr(obj, self.private_name, value) - - def on_change(self, obj, new_value): - log.debug(f"on_change {self.public_name}") - if self.change_callback: - self.change_callback(obj, new_value) - - -def _changed_emme_database_dir(filenames, new_db_dir): - cfgfile = new_db_dir / f"cmap_trip_config.yaml" - with open(cfgfile, 'r') as f: - filenames.cfg = Dict(yaml.load(f, Loader=yaml.SafeLoader)) - -def _make_dirs(filenames, new_dir): - if new_dir and not os.path.exists(new_dir): - os.makedirs(new_dir) - - -class FileNames: - - emme_database_dir = PathAttr(can_null=False, change_callback=_changed_emme_database_dir) - emmemat_dir = PathAttr(can_null=True) - cache_dir = PathAttr(change_callback=_make_dirs) - zone_shapefile = PathAttr() - - def __init__( - self, - emme_database_dir, - cache_dir=None, - emmemat_dir=None, - zone_shapefile=None, - ): - self._memory_mapped_skim = {} - self.emme_database_dir = emme_database_dir - self.emmemat_dir = emmemat_dir - self.cache_dir = cache_dir - self.zone_shapefile = zone_shapefile - self._temporary_dir = None - if self.choice_model_param_file and os.path.exists(self.choice_model_param_file): - with open(self.choice_model_param_file, 'r') as f: - self.choice_model_params = Dict(yaml.load(f, Loader=yaml.SafeLoader)) - else: - self.choice_model_params = Dict() - - - def __getattr__(self, item): - - def _log_path_search(label, *args): - pth = search_path(*args) - log.debug(f"FILEPATH({label})={pth}") - return pth - - if item == 'temp_dir': - if self._temporary_dir is None: - import tempfile - self._temporary_dir = tempfile.TemporaryDirectory() - return Path(self._temporary_dir.name) - if item[-6:] == "_DISTR": - return _log_path_search( - item, - self.emme_database_dir / f"{item}.TXT", - self.emme_database_dir / f"defaults_base_year/{item}.TXT", - ) - if item[-4:] == "_M01": - return _log_path_search( - item, - self.emme_database_dir / f"{item}.TXT", - self.emme_database_dir / f"defaults_base_year/{item}.TXT", - ) - if item[-5:] == "_M023": - return _log_path_search( - item, - self.emme_database_dir / f"{item}.TXT", - self.emme_database_dir / f"defaults_base_year/{item}.TXT", - ) - if item[-9:] == "_CBDPARK0": - return _log_path_search( - item, - self.emme_database_dir / f"{item[:-1]}.TXT", - self.emme_database_dir / f"defaults_base_year/{item[:-1]}.TXT", - ) - if item[-8:] == "_CBDPARK": - return self.cache_dir / f"__{item}.TXT" - if item[-9:] == "_CBDPARK2": - return self.cache_dir / f"__{item}.TXT" - if item[-6:] == "_skims": - raise NotImplementedError - # if self.omx_skims_dir: - # return self.omx_skims_dir / f"{item}.omx" - # else: - # return self.emme_database_dir / f"{item}.omx" - if item[:2] == "mf": - if self.emmemat_dir: - return self.emmemat_dir / f"{item}.emx" - else: - return self.emme_database_dir / "emmemat" / f"{item}.emx" - if item != "_memory_mapped_skim" and item in self._memory_mapped_skim: - return self._memory_mapped_skim[item] - if item[:6] == "map_mf": - if self.emmemat_dir: - pth = self.emmemat_dir / f"{item[4:]}.emx" - else: - pth = self.emme_database_dir / "emmemat" / f"{item[4:]}.emx" - mapped_skim = np.memmap(pth, dtype='f4', mode='r') - nzones = int(np.sqrt(mapped_skim.shape[0])) - mapped_skim = self._memory_mapped_skim[item] = mapped_skim.reshape([nzones,nzones]) - return mapped_skim - if item == "config": - return self._emme_database_dir / f"cmap_trip_config.yaml" - if item == "choice_model_param_file": - result = search_path( - self.emme_database_dir / f"choice_model_params.yaml", - self.cache_dir / f"choice_model_params.yaml", - ) - if result is None: - result = self.cache_dir / f"choice_model_params.yaml" - return result - if item == "tod_model_param_file": - return search_path( - self.emme_database_dir / f"tod_model_params.yaml", - self.cache_dir / f"tod_model_params.yaml", - ) - if item == "zone_districts": - return search_path( - self.emme_database_dir / f"CMAP_Zone_Districts.csv.gz", - self.cache_dir / f"CMAP_Zone_Districts.csv.gz", - ) - if item == "emmemat": - if self.emmemat_dir: - return self.emmemat_dir - else: - return self.emme_database_dir/"emmemat" - if item == "value_of_time_buckets": - return search_path( - self.emme_database_dir / f"value_of_time_buckets.csv", - self.cache_dir / f"value_of_time_buckets.csv", - ) - raise AttributeError(item) - - @property - def tripgen_sas(self): - return latest_matching( - self.emme_database_dir / "tg/sas/data/tg*.sas7bdat" - ) or latest_matching( - self.emme_database_dir / "tg*.sas7bdat" - ) or latest_matching( - self.cache_dir / "tg*.sas7bdat" - ) - - @property - def hh_enum(self): - return latest_matching( - self.emme_database_dir / "TG_HHENUM_OUTPUT.TXT.gz" - ) or latest_matching( - self.cache_dir / "TG_HHENUM_OUTPUT.TXT.gz" - ) or latest_matching( - self.emme_database_dir / "TG_HHENUM_OUTPUT.TXT" - ) or latest_matching( - self.cache_dir / "TG_HHENUM_OUTPUT.TXT" - ) or latest_matching( - self.emme_database_dir / "defaults_base_year/TG_HHENUM_OUTPUT.TXT.gz" - ) - - def save(self, name, data): - try: - if isinstance(data, pd.DataFrame): - if self.cache_dir: - pth = self.cache_dir / f"{name}.pq" - else: - pth = f"{name}.pq" - data.to_parquet(pth) - else: - raise TypeError(str(type(data))) - except Exception as err: - import warnings - warnings.warn(f"failed to save {name}: {err}") - - def load(self, name): - if self.cache_dir: - pth = self.cache_dir / f"{name}.pq" - else: - pth = f"{name}.pq" - if os.path.exists(pth): - return pd.read_parquet(pth) - # else file does not exist - return None - - # def use_emmemat_archive(self, archive_file): - # import zipfile - # import tempfile - # self.temp_emmemat_dir = tempfile.TemporaryDirectory() - # with zipfile.ZipFile(archive_file, 'r') as zip_ref: - # zip_ref.extractall(self.temp_emmemat_dir.name) - # self.emmemat_dir = self.temp_emmemat_dir.name - - - -def _insensitive_glob(pattern): - def either(c): - return '[%s%s]' % (c.lower(), c.upper()) if c.isalpha() else c - return ''.join(map(either, pattern)) - - -def latest_matching(pattern, echo=False, case_insensitive=False, expanduser=True): - """Get the most recently modified file matching the glob pattern - - Parameters - ---------- - pattern : str - A glob pattern to match on - echo : bool, default False - If true, print the last modified time for each matching file - case_insensitive : bool, default False - Tf true, the glob pattern will be modified to be case insensitive. - expanduser : bool, default true - Should each pattern be passed through the `os.path.expanduser` function? - - Returns - ------- - str - The filename of the most recently modified file matching the glob pattern - - """ - if expanduser: - pattern = os.path.expanduser(pattern) - if case_insensitive: - pattern = _insensitive_glob(pattern) - files = glob.glob(pattern) - propose = None - propose_mtime = 0 - for file in files: - (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime) = os.stat(file) - if echo: - print (file,"last modified: %s" % time.ctime(mtime)) - if mtime > propose_mtime: - propose_mtime = mtime - propose = file - return propose - - diff --git a/src/Mode-Dest-TOD/cmap_modedest/data_handlers/household_types.csv b/src/Mode-Dest-TOD/cmap_modedest/data_handlers/household_types.csv deleted file mode 100644 index 9ca1106..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/data_handlers/household_types.csv +++ /dev/null @@ -1,625 +0,0 @@ -CODE,N_CHILDREN,N_WORKERS,N_ADULTS,N_VEHICLES,HOUSEHOLDER_AGE -1,0,0,1,0,<35 -2,0,0,2,0,<35 -3,0,0,3,0,<35 -4,0,0,4+,0,<35 -5,0,1,1,0,<35 -6,0,1,2,0,<35 -7,0,1,3,0,<35 -8,0,1,4+,0,<35 -9,0,2,2,0,<35 -10,0,2,3,0,<35 -11,0,2,4+,0,<35 -12,0,3+,3,0,<35 -13,0,3+,4+,0,<35 -14,1,0,1,0,<35 -15,1,0,2,0,<35 -16,1,0,3,0,<35 -17,1,0,4+,0,<35 -18,1,1,1,0,<35 -19,1,1,2,0,<35 -20,1,1,3,0,<35 -21,1,1,4+,0,<35 -22,1,2,2,0,<35 -23,1,2,3,0,<35 -24,1,2,4+,0,<35 -25,1,3+,3,0,<35 -26,1,3+,4+,0,<35 -27,2,0,1,0,<35 -28,2,0,2,0,<35 -29,2,0,3,0,<35 -30,2,0,4+,0,<35 -31,2,1,1,0,<35 -32,2,1,2,0,<35 -33,2,1,3,0,<35 -34,2,1,4+,0,<35 -35,2,2,2,0,<35 -36,2,2,3,0,<35 -37,2,2,4+,0,<35 -38,2,3+,3,0,<35 -39,2,3+,4+,0,<35 -40,3+,0,1,0,<35 -41,3+,0,2,0,<35 -42,3+,0,3,0,<35 -43,3+,0,4+,0,<35 -44,3+,1,1,0,<35 -45,3+,1,2,0,<35 -46,3+,1,3,0,<35 -47,3+,1,4+,0,<35 -48,3+,2,2,0,<35 -49,3+,2,3,0,<35 -50,3+,2,4+,0,<35 -51,3+,3+,3,0,<35 -52,3+,3+,4+,0,<35 -53,0,0,1,1,<35 -54,0,0,2,1,<35 -55,0,0,3,1,<35 -56,0,0,4+,1,<35 -57,0,1,1,1,<35 -58,0,1,2,1,<35 -59,0,1,3,1,<35 -60,0,1,4+,1,<35 -61,0,2,2,1,<35 -62,0,2,3,1,<35 -63,0,2,4+,1,<35 -64,0,3+,3,1,<35 -65,0,3+,4+,1,<35 -66,1,0,1,1,<35 -67,1,0,2,1,<35 -68,1,0,3,1,<35 -69,1,0,4+,1,<35 -70,1,1,1,1,<35 -71,1,1,2,1,<35 -72,1,1,3,1,<35 -73,1,1,4+,1,<35 -74,1,2,2,1,<35 -75,1,2,3,1,<35 -76,1,2,4+,1,<35 -77,1,3+,3,1,<35 -78,1,3+,4+,1,<35 -79,2,0,1,1,<35 -80,2,0,2,1,<35 -81,2,0,3,1,<35 -82,2,0,4+,1,<35 -83,2,1,1,1,<35 -84,2,1,2,1,<35 -85,2,1,3,1,<35 -86,2,1,4+,1,<35 -87,2,2,2,1,<35 -88,2,2,3,1,<35 -89,2,2,4+,1,<35 -90,2,3+,3,1,<35 -91,2,3+,4+,1,<35 -92,3+,0,1,1,<35 -93,3+,0,2,1,<35 -94,3+,0,3,1,<35 -95,3+,0,4+,1,<35 -96,3+,1,1,1,<35 -97,3+,1,2,1,<35 -98,3+,1,3,1,<35 -99,3+,1,4+,1,<35 -100,3+,2,2,1,<35 -101,3+,2,3,1,<35 -102,3+,2,4+,1,<35 -103,3+,3+,3,1,<35 -104,3+,3+,4+,1,<35 -105,0,0,1,2,<35 -106,0,0,2,2,<35 -107,0,0,3,2,<35 -108,0,0,4+,2,<35 -109,0,1,1,2,<35 -110,0,1,2,2,<35 -111,0,1,3,2,<35 -112,0,1,4+,2,<35 -113,0,2,2,2,<35 -114,0,2,3,2,<35 -115,0,2,4+,2,<35 -116,0,3+,3,2,<35 -117,0,3+,4+,2,<35 -118,1,0,1,2,<35 -119,1,0,2,2,<35 -120,1,0,3,2,<35 -121,1,0,4+,2,<35 -122,1,1,1,2,<35 -123,1,1,2,2,<35 -124,1,1,3,2,<35 -125,1,1,4+,2,<35 -126,1,2,2,2,<35 -127,1,2,3,2,<35 -128,1,2,4+,2,<35 -129,1,3+,3,2,<35 -130,1,3+,4+,2,<35 -131,2,0,1,2,<35 -132,2,0,2,2,<35 -133,2,0,3,2,<35 -134,2,0,4+,2,<35 -135,2,1,1,2,<35 -136,2,1,2,2,<35 -137,2,1,3,2,<35 -138,2,1,4+,2,<35 -139,2,2,2,2,<35 -140,2,2,3,2,<35 -141,2,2,4+,2,<35 -142,2,3+,3,2,<35 -143,2,3+,4+,2,<35 -144,3+,0,1,2,<35 -145,3+,0,2,2,<35 -146,3+,0,3,2,<35 -147,3+,0,4+,2,<35 -148,3+,1,1,2,<35 -149,3+,1,2,2,<35 -150,3+,1,3,2,<35 -151,3+,1,4+,2,<35 -152,3+,2,2,2,<35 -153,3+,2,3,2,<35 -154,3+,2,4+,2,<35 -155,3+,3+,3,2,<35 -156,3+,3+,4+,2,<35 -157,0,0,1,3+,<35 -158,0,0,2,3+,<35 -159,0,0,3,3+,<35 -160,0,0,4+,3+,<35 -161,0,1,1,3+,<35 -162,0,1,2,3+,<35 -163,0,1,3,3+,<35 -164,0,1,4+,3+,<35 -165,0,2,2,3+,<35 -166,0,2,3,3+,<35 -167,0,2,4+,3+,<35 -168,0,3+,3,3+,<35 -169,0,3+,4+,3+,<35 -170,1,0,1,3+,<35 -171,1,0,2,3+,<35 -172,1,0,3,3+,<35 -173,1,0,4+,3+,<35 -174,1,1,1,3+,<35 -175,1,1,2,3+,<35 -176,1,1,3,3+,<35 -177,1,1,4+,3+,<35 -178,1,2,2,3+,<35 -179,1,2,3,3+,<35 -180,1,2,4+,3+,<35 -181,1,3+,3,3+,<35 -182,1,3+,4+,3+,<35 -183,2,0,1,3+,<35 -184,2,0,2,3+,<35 -185,2,0,3,3+,<35 -186,2,0,4+,3+,<35 -187,2,1,1,3+,<35 -188,2,1,2,3+,<35 -189,2,1,3,3+,<35 -190,2,1,4+,3+,<35 -191,2,2,2,3+,<35 -192,2,2,3,3+,<35 -193,2,2,4+,3+,<35 -194,2,3+,3,3+,<35 -195,2,3+,4+,3+,<35 -196,3+,0,1,3+,<35 -197,3+,0,2,3+,<35 -198,3+,0,3,3+,<35 -199,3+,0,4+,3+,<35 -200,3+,1,1,3+,<35 -201,3+,1,2,3+,<35 -202,3+,1,3,3+,<35 -203,3+,1,4+,3+,<35 -204,3+,2,2,3+,<35 -205,3+,2,3,3+,<35 -206,3+,2,4+,3+,<35 -207,3+,3+,3,3+,<35 -208,3+,3+,4+,3+,<35 -209,0,0,1,0,35-64 -210,0,0,2,0,35-64 -211,0,0,3,0,35-64 -212,0,0,4+,0,35-64 -213,0,1,1,0,35-64 -214,0,1,2,0,35-64 -215,0,1,3,0,35-64 -216,0,1,4+,0,35-64 -217,0,2,2,0,35-64 -218,0,2,3,0,35-64 -219,0,2,4+,0,35-64 -220,0,3+,3,0,35-64 -221,0,3+,4+,0,35-64 -222,1,0,1,0,35-64 -223,1,0,2,0,35-64 -224,1,0,3,0,35-64 -225,1,0,4+,0,35-64 -226,1,1,1,0,35-64 -227,1,1,2,0,35-64 -228,1,1,3,0,35-64 -229,1,1,4+,0,35-64 -230,1,2,2,0,35-64 -231,1,2,3,0,35-64 -232,1,2,4+,0,35-64 -233,1,3+,3,0,35-64 -234,1,3+,4+,0,35-64 -235,2,0,1,0,35-64 -236,2,0,2,0,35-64 -237,2,0,3,0,35-64 -238,2,0,4+,0,35-64 -239,2,1,1,0,35-64 -240,2,1,2,0,35-64 -241,2,1,3,0,35-64 -242,2,1,4+,0,35-64 -243,2,2,2,0,35-64 -244,2,2,3,0,35-64 -245,2,2,4+,0,35-64 -246,2,3+,3,0,35-64 -247,2,3+,4+,0,35-64 -248,3+,0,1,0,35-64 -249,3+,0,2,0,35-64 -250,3+,0,3,0,35-64 -251,3+,0,4+,0,35-64 -252,3+,1,1,0,35-64 -253,3+,1,2,0,35-64 -254,3+,1,3,0,35-64 -255,3+,1,4+,0,35-64 -256,3+,2,2,0,35-64 -257,3+,2,3,0,35-64 -258,3+,2,4+,0,35-64 -259,3+,3+,3,0,35-64 -260,3+,3+,4+,0,35-64 -261,0,0,1,1,35-64 -262,0,0,2,1,35-64 -263,0,0,3,1,35-64 -264,0,0,4+,1,35-64 -265,0,1,1,1,35-64 -266,0,1,2,1,35-64 -267,0,1,3,1,35-64 -268,0,1,4+,1,35-64 -269,0,2,2,1,35-64 -270,0,2,3,1,35-64 -271,0,2,4+,1,35-64 -272,0,3+,3,1,35-64 -273,0,3+,4+,1,35-64 -274,1,0,1,1,35-64 -275,1,0,2,1,35-64 -276,1,0,3,1,35-64 -277,1,0,4+,1,35-64 -278,1,1,1,1,35-64 -279,1,1,2,1,35-64 -280,1,1,3,1,35-64 -281,1,1,4+,1,35-64 -282,1,2,2,1,35-64 -283,1,2,3,1,35-64 -284,1,2,4+,1,35-64 -285,1,3+,3,1,35-64 -286,1,3+,4+,1,35-64 -287,2,0,1,1,35-64 -288,2,0,2,1,35-64 -289,2,0,3,1,35-64 -290,2,0,4+,1,35-64 -291,2,1,1,1,35-64 -292,2,1,2,1,35-64 -293,2,1,3,1,35-64 -294,2,1,4+,1,35-64 -295,2,2,2,1,35-64 -296,2,2,3,1,35-64 -297,2,2,4+,1,35-64 -298,2,3+,3,1,35-64 -299,2,3+,4+,1,35-64 -300,3+,0,1,1,35-64 -301,3+,0,2,1,35-64 -302,3+,0,3,1,35-64 -303,3+,0,4+,1,35-64 -304,3+,1,1,1,35-64 -305,3+,1,2,1,35-64 -306,3+,1,3,1,35-64 -307,3+,1,4+,1,35-64 -308,3+,2,2,1,35-64 -309,3+,2,3,1,35-64 -310,3+,2,4+,1,35-64 -311,3+,3+,3,1,35-64 -312,3+,3+,4+,1,35-64 -313,0,0,1,2,35-64 -314,0,0,2,2,35-64 -315,0,0,3,2,35-64 -316,0,0,4+,2,35-64 -317,0,1,1,2,35-64 -318,0,1,2,2,35-64 -319,0,1,3,2,35-64 -320,0,1,4+,2,35-64 -321,0,2,2,2,35-64 -322,0,2,3,2,35-64 -323,0,2,4+,2,35-64 -324,0,3+,3,2,35-64 -325,0,3+,4+,2,35-64 -326,1,0,1,2,35-64 -327,1,0,2,2,35-64 -328,1,0,3,2,35-64 -329,1,0,4+,2,35-64 -330,1,1,1,2,35-64 -331,1,1,2,2,35-64 -332,1,1,3,2,35-64 -333,1,1,4+,2,35-64 -334,1,2,2,2,35-64 -335,1,2,3,2,35-64 -336,1,2,4+,2,35-64 -337,1,3+,3,2,35-64 -338,1,3+,4+,2,35-64 -339,2,0,1,2,35-64 -340,2,0,2,2,35-64 -341,2,0,3,2,35-64 -342,2,0,4+,2,35-64 -343,2,1,1,2,35-64 -344,2,1,2,2,35-64 -345,2,1,3,2,35-64 -346,2,1,4+,2,35-64 -347,2,2,2,2,35-64 -348,2,2,3,2,35-64 -349,2,2,4+,2,35-64 -350,2,3+,3,2,35-64 -351,2,3+,4+,2,35-64 -352,3+,0,1,2,35-64 -353,3+,0,2,2,35-64 -354,3+,0,3,2,35-64 -355,3+,0,4+,2,35-64 -356,3+,1,1,2,35-64 -357,3+,1,2,2,35-64 -358,3+,1,3,2,35-64 -359,3+,1,4+,2,35-64 -360,3+,2,2,2,35-64 -361,3+,2,3,2,35-64 -362,3+,2,4+,2,35-64 -363,3+,3+,3,2,35-64 -364,3+,3+,4+,2,35-64 -365,0,0,1,3+,35-64 -366,0,0,2,3+,35-64 -367,0,0,3,3+,35-64 -368,0,0,4+,3+,35-64 -369,0,1,1,3+,35-64 -370,0,1,2,3+,35-64 -371,0,1,3,3+,35-64 -372,0,1,4+,3+,35-64 -373,0,2,2,3+,35-64 -374,0,2,3,3+,35-64 -375,0,2,4+,3+,35-64 -376,0,3+,3,3+,35-64 -377,0,3+,4+,3+,35-64 -378,1,0,1,3+,35-64 -379,1,0,2,3+,35-64 -380,1,0,3,3+,35-64 -381,1,0,4+,3+,35-64 -382,1,1,1,3+,35-64 -383,1,1,2,3+,35-64 -384,1,1,3,3+,35-64 -385,1,1,4+,3+,35-64 -386,1,2,2,3+,35-64 -387,1,2,3,3+,35-64 -388,1,2,4+,3+,35-64 -389,1,3+,3,3+,35-64 -390,1,3+,4+,3+,35-64 -391,2,0,1,3+,35-64 -392,2,0,2,3+,35-64 -393,2,0,3,3+,35-64 -394,2,0,4+,3+,35-64 -395,2,1,1,3+,35-64 -396,2,1,2,3+,35-64 -397,2,1,3,3+,35-64 -398,2,1,4+,3+,35-64 -399,2,2,2,3+,35-64 -400,2,2,3,3+,35-64 -401,2,2,4+,3+,35-64 -402,2,3+,3,3+,35-64 -403,2,3+,4+,3+,35-64 -404,3+,0,1,3+,35-64 -405,3+,0,2,3+,35-64 -406,3+,0,3,3+,35-64 -407,3+,0,4+,3+,35-64 -408,3+,1,1,3+,35-64 -409,3+,1,2,3+,35-64 -410,3+,1,3,3+,35-64 -411,3+,1,4+,3+,35-64 -412,3+,2,2,3+,35-64 -413,3+,2,3,3+,35-64 -414,3+,2,4+,3+,35-64 -415,3+,3+,3,3+,35-64 -416,3+,3+,4+,3+,35-64 -417,0,0,1,0,>65 -418,0,0,2,0,>65 -419,0,0,3,0,>65 -420,0,0,4+,0,>65 -421,0,1,1,0,>65 -422,0,1,2,0,>65 -423,0,1,3,0,>65 -424,0,1,4+,0,>65 -425,0,2,2,0,>65 -426,0,2,3,0,>65 -427,0,2,4+,0,>65 -428,0,3+,3,0,>65 -429,0,3+,4+,0,>65 -430,1,0,1,0,>65 -431,1,0,2,0,>65 -432,1,0,3,0,>65 -433,1,0,4+,0,>65 -434,1,1,1,0,>65 -435,1,1,2,0,>65 -436,1,1,3,0,>65 -437,1,1,4+,0,>65 -438,1,2,2,0,>65 -439,1,2,3,0,>65 -440,1,2,4+,0,>65 -441,1,3+,3,0,>65 -442,1,3+,4+,0,>65 -443,2,0,1,0,>65 -444,2,0,2,0,>65 -445,2,0,3,0,>65 -446,2,0,4+,0,>65 -447,2,1,1,0,>65 -448,2,1,2,0,>65 -449,2,1,3,0,>65 -450,2,1,4+,0,>65 -451,2,2,2,0,>65 -452,2,2,3,0,>65 -453,2,2,4+,0,>65 -454,2,3+,3,0,>65 -455,2,3+,4+,0,>65 -456,3+,0,1,0,>65 -457,3+,0,2,0,>65 -458,3+,0,3,0,>65 -459,3+,0,4+,0,>65 -460,3+,1,1,0,>65 -461,3+,1,2,0,>65 -462,3+,1,3,0,>65 -463,3+,1,4+,0,>65 -464,3+,2,2,0,>65 -465,3+,2,3,0,>65 -466,3+,2,4+,0,>65 -467,3+,3+,3,0,>65 -468,3+,3+,4+,0,>65 -469,0,0,1,1,>65 -470,0,0,2,1,>65 -471,0,0,3,1,>65 -472,0,0,4+,1,>65 -473,0,1,1,1,>65 -474,0,1,2,1,>65 -475,0,1,3,1,>65 -476,0,1,4+,1,>65 -477,0,2,2,1,>65 -478,0,2,3,1,>65 -479,0,2,4+,1,>65 -480,0,3+,3,1,>65 -481,0,3+,4+,1,>65 -482,1,0,1,1,>65 -483,1,0,2,1,>65 -484,1,0,3,1,>65 -485,1,0,4+,1,>65 -486,1,1,1,1,>65 -487,1,1,2,1,>65 -488,1,1,3,1,>65 -489,1,1,4+,1,>65 -490,1,2,2,1,>65 -491,1,2,3,1,>65 -492,1,2,4+,1,>65 -493,1,3+,3,1,>65 -494,1,3+,4+,1,>65 -495,2,0,1,1,>65 -496,2,0,2,1,>65 -497,2,0,3,1,>65 -498,2,0,4+,1,>65 -499,2,1,1,1,>65 -500,2,1,2,1,>65 -501,2,1,3,1,>65 -502,2,1,4+,1,>65 -503,2,2,2,1,>65 -504,2,2,3,1,>65 -505,2,2,4+,1,>65 -506,2,3+,3,1,>65 -507,2,3+,4+,1,>65 -508,3+,0,1,1,>65 -509,3+,0,2,1,>65 -510,3+,0,3,1,>65 -511,3+,0,4+,1,>65 -512,3+,1,1,1,>65 -513,3+,1,2,1,>65 -514,3+,1,3,1,>65 -515,3+,1,4+,1,>65 -516,3+,2,2,1,>65 -517,3+,2,3,1,>65 -518,3+,2,4+,1,>65 -519,3+,3+,3,1,>65 -520,3+,3+,4+,1,>65 -521,0,0,1,2,>65 -522,0,0,2,2,>65 -523,0,0,3,2,>65 -524,0,0,4+,2,>65 -525,0,1,1,2,>65 -526,0,1,2,2,>65 -527,0,1,3,2,>65 -528,0,1,4+,2,>65 -529,0,2,2,2,>65 -530,0,2,3,2,>65 -531,0,2,4+,2,>65 -532,0,3+,3,2,>65 -533,0,3+,4+,2,>65 -534,1,0,1,2,>65 -535,1,0,2,2,>65 -536,1,0,3,2,>65 -537,1,0,4+,2,>65 -538,1,1,1,2,>65 -539,1,1,2,2,>65 -540,1,1,3,2,>65 -541,1,1,4+,2,>65 -542,1,2,2,2,>65 -543,1,2,3,2,>65 -544,1,2,4+,2,>65 -545,1,3+,3,2,>65 -546,1,3+,4+,2,>65 -547,2,0,1,2,>65 -548,2,0,2,2,>65 -549,2,0,3,2,>65 -550,2,0,4+,2,>65 -551,2,1,1,2,>65 -552,2,1,2,2,>65 -553,2,1,3,2,>65 -554,2,1,4+,2,>65 -555,2,2,2,2,>65 -556,2,2,3,2,>65 -557,2,2,4+,2,>65 -558,2,3+,3,2,>65 -559,2,3+,4+,2,>65 -560,3+,0,1,2,>65 -561,3+,0,2,2,>65 -562,3+,0,3,2,>65 -563,3+,0,4+,2,>65 -564,3+,1,1,2,>65 -565,3+,1,2,2,>65 -566,3+,1,3,2,>65 -567,3+,1,4+,2,>65 -568,3+,2,2,2,>65 -569,3+,2,3,2,>65 -570,3+,2,4+,2,>65 -571,3+,3+,3,2,>65 -572,3+,3+,4+,2,>65 -573,0,0,1,3+,>65 -574,0,0,2,3+,>65 -575,0,0,3,3+,>65 -576,0,0,4+,3+,>65 -577,0,1,1,3+,>65 -578,0,1,2,3+,>65 -579,0,1,3,3+,>65 -580,0,1,4+,3+,>65 -581,0,2,2,3+,>65 -582,0,2,3,3+,>65 -583,0,2,4+,3+,>65 -584,0,3+,3,3+,>65 -585,0,3+,4+,3+,>65 -586,1,0,1,3+,>65 -587,1,0,2,3+,>65 -588,1,0,3,3+,>65 -589,1,0,4+,3+,>65 -590,1,1,1,3+,>65 -591,1,1,2,3+,>65 -592,1,1,3,3+,>65 -593,1,1,4+,3+,>65 -594,1,2,2,3+,>65 -595,1,2,3,3+,>65 -596,1,2,4+,3+,>65 -597,1,3+,3,3+,>65 -598,1,3+,4+,3+,>65 -599,2,0,1,3+,>65 -600,2,0,2,3+,>65 -601,2,0,3,3+,>65 -602,2,0,4+,3+,>65 -603,2,1,1,3+,>65 -604,2,1,2,3+,>65 -605,2,1,3,3+,>65 -606,2,1,4+,3+,>65 -607,2,2,2,3+,>65 -608,2,2,3,3+,>65 -609,2,2,4+,3+,>65 -610,2,3+,3,3+,>65 -611,2,3+,4+,3+,>65 -612,3+,0,1,3+,>65 -613,3+,0,2,3+,>65 -614,3+,0,3,3+,>65 -615,3+,0,4+,3+,>65 -616,3+,1,1,3+,>65 -617,3+,1,2,3+,>65 -618,3+,1,3,3+,>65 -619,3+,1,4+,3+,>65 -620,3+,2,2,3+,>65 -621,3+,2,3,3+,>65 -622,3+,2,4+,3+,>65 -623,3+,3+,3,3+,>65 -624,3+,3+,4+,3+,>65 \ No newline at end of file diff --git a/src/Mode-Dest-TOD/cmap_modedest/data_handlers/household_types.py b/src/Mode-Dest-TOD/cmap_modedest/data_handlers/household_types.py deleted file mode 100644 index 7b55f95..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/data_handlers/household_types.py +++ /dev/null @@ -1,23 +0,0 @@ -import os -import pandas as pd - -def load_household_types(): - - hhv_cats = { - 'N_CHILDREN': ['0', '1', '2', '3+'], - 'N_WORKERS': ['0', '1', '2', '3+'], - 'N_ADULTS': ['1', '2', '3', '4+'], - 'N_VEHICLES': ['0', '1', '2', '3+'], - 'HOUSEHOLDER_AGE': ['<35', '35-64', '>65'], - } - - hhv_types = pd.read_csv( - os.path.join(os.path.dirname(__file__), "household_types.csv"), - index_col=0, - ) - - for k, v in hhv_cats.items(): - hhv_types[k] = hhv_types[k].astype(pd.CategoricalDtype(v, ordered=True)) - - return hhv_types - diff --git a/src/Mode-Dest-TOD/cmap_modedest/data_handlers/m01_handler.py b/src/Mode-Dest-TOD/cmap_modedest/data_handlers/m01_handler.py deleted file mode 100755 index ca5e0bf..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/data_handlers/m01_handler.py +++ /dev/null @@ -1,171 +0,0 @@ - -import logging -log = logging.getLogger('CMAP') -import pandas as pd -import numpy as np -from ..addict import Dict -from .filepaths import latest_matching -from ..util import search_path - -def read_m01(filename): - raw = pd.read_csv(filename, header=None, index_col=0) - - columns = [ - 'zone_type', - 'pnr_parking_cost', - 'zone_income', - 'pnr_flag', - 'first_wait_bus_peak', - 'first_wait_bus_offpeak', - 'first_wait_feeder_peak', - 'first_wait_feeder_offpeak', - ] - - # autocc column only appears in HW files - if len(raw.columns) == len(columns)+1: - columns.append('autocc') - - raw.columns = columns - raw.index.name = 'zone' - return raw - - -def load_m01(filenames): - m01 = Dict() - - m01.HW = read_m01(filenames.ALLPURPOSE_M01) - # There is only one unique m01 file - # the others are simply copies - # m01.HO = read_m01(filenames.PDHO_M01) - # m01.NH = read_m01(filenames.PDNH_M01) - - m01.HW['taxi_wait_pk'] = m01.HW.zone_type.map(filenames.cfg.taxi.wait_time.peak) - m01.HW['taxi_wait_op'] = m01.HW.zone_type.map(filenames.cfg.taxi.wait_time.offpeak) - - m01.HW['tnc_solo_wait_pk'] = m01.HW.zone_type.map(filenames.cfg.tnc.wait_time.peak) - m01.HW['tnc_solo_wait_op'] = m01.HW.zone_type.map(filenames.cfg.tnc.wait_time.offpeak) - m01.HW['tnc_pool_wait_pk'] = m01.HW.zone_type.map(filenames.cfg.tnc_pooled.wait_time.peak) - m01.HW['tnc_pool_wait_op'] = m01.HW.zone_type.map(filenames.cfg.tnc_pooled.wait_time.offpeak) - - return m01.HW - - -def attach_areatypes(dh, df, prefix, suffix, targetzone): - """ - Attach area type and default auto propensity - - Parameters - ---------- - dh - df - prefix - suffix - targetzone - - Returns - ------- - - """ - m01 = dh.m01 - - if isinstance(targetzone, str): - targetzone = np.asarray(df[targetzone]) - - if prefix and prefix[-1]!="_": - prefix = f"{prefix}_" - - if suffix and suffix[0]!="_": - suffix = f"_{suffix}" - - def _map(x, y): - if isinstance(x, pd.Series): - return x.map(y) - else: - return y[x] - - areatype = m01['zone_type'] - - # auto propensity is reloaded every time we attach to ensure it is up-to-date - auto_propensity_file = search_path( - dh.filenames.cache_dir / "computed_auto_propensity.csv", - dh.filenames.emme_database_dir / "computed_auto_propensity.csv", - dh.filenames.emme_database_dir / "defaults_base_year/default_auto_propensity.csv", - dh.filenames.emme_database_dir / "defaults_base_year/default_auto_propensity.csv.gz", - ) - autopropensity = pd.read_csv(auto_propensity_file, index_col=0)['auto_propensity'] - df[f'{prefix}areatype{suffix}'] = np.asarray(_map(targetzone,areatype)) - df[f'{prefix}autopropensity{suffix}'] = np.asarray(_map(targetzone,autopropensity)) - return df - - -def attach_hired_car_waits(dh, df, prefix, origin_zone): - """ - Attach taxi and TNC wait times to a dataframe. - - Parameters - ---------- - dh : DataHandler - df : DataFrame - New columns will be added to this dataframe. - prefix : str - This prefix will be added to the new columns. - origin_zone : str or pd.Series or int - The origin zone for each row in `df`, given as the column - name or a separate indexed-alike Series. - - Returns - ------- - df : DataFrame - """ - m01 = dh.m01 - - if isinstance(origin_zone, str): - origin_zone = df[origin_zone] - - if prefix and prefix[-1]!="_": - prefix = f"{prefix}_" - - def _map(x, y): - if isinstance(x, pd.Series): - return x.map(y) - else: - return y[x] - - # Add taxi and TNC wait time data - taxi_wait_pk = m01['taxi_wait_pk'] - taxi_wait_op = m01['taxi_wait_op'] - df[f'{prefix}taxi_wait_time_PEAK'] = _map(origin_zone,taxi_wait_pk) - df[f'{prefix}taxi_wait_time_OFFPEAK'] = _map(origin_zone,taxi_wait_op) - # df[f'{prefix}taxi_wait_time'] = ( - # origin_zone.map(taxi_wait_pk) * trips.in_peak - # + origin_zone.map(taxi_wait_op) * ~trips.in_peak - # ) - tnc_solo_wait_pk = m01['tnc_solo_wait_pk'] - tnc_solo_wait_op = m01['tnc_solo_wait_op'] - df[f'{prefix}tnc_solo_wait_time_PEAK'] = _map(origin_zone,tnc_solo_wait_pk) - df[f'{prefix}tnc_solo_wait_time_OFFPEAK'] = _map(origin_zone,tnc_solo_wait_op) - # df[f'{prefix}tnc_solo_wait_time'] = ( - # origin_zone.map(tnc_solo_wait_pk) * trips.in_peak - # + origin_zone.map(tnc_solo_wait_op) * ~trips.in_peak - # ) - tnc_pool_wait_pk = m01['tnc_pool_wait_pk'] - tnc_pool_wait_op = m01['tnc_pool_wait_op'] - df[f'{prefix}tnc_pool_wait_time_PEAK'] = _map(origin_zone,tnc_pool_wait_pk) - df[f'{prefix}tnc_pool_wait_time_OFFPEAK'] = _map(origin_zone,tnc_pool_wait_op) - # df[f'{prefix}tnc_pool_wait_time'] = ( - # origin_zone.map(tnc_pool_wait_pk) * trips.in_peak - # + origin_zone.map(tnc_pool_wait_op) * ~trips.in_peak - # ) - return df - -def sample_hh_income_cats(dh, otaz, n, income_breaks='5', random_state=None, sigma=1.2, trunc_min=None, trunc_max=None): - from ..incomes import random_incomes - return random_incomes( - median_income=dh.m01.zone_income[otaz]*100, - replications=n, - random_state=random_state, - sigma=sigma, - bins=income_breaks, - trunc_min=trunc_min, - trunc_max=trunc_max, - ) diff --git a/src/Mode-Dest-TOD/cmap_modedest/data_handlers/m023_handler.py b/src/Mode-Dest-TOD/cmap_modedest/data_handlers/m023_handler.py deleted file mode 100644 index 74fb202..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/data_handlers/m023_handler.py +++ /dev/null @@ -1,39 +0,0 @@ -import pandas as pd -import numpy as np -from ..addict import Dict - -def read_m023(filename): - m023 = Dict() - with open(filename, 'rt') as f: - line = f.readline().split() - m023.CTA_BUS_BOARDING_FARE = int(line[0]) - m023.CTA_RAIL_BOARDING_FARE = int(line[1]) - m023.CTA_FIRST_XFER_FARE = int(line[2]) - m023.CTA_CBD_LINK_UP_FARE = int(line[3]) - - line = f.readline().split() - m023.FEEDER_BUS_BOARDING_FARE = int(line[0]) - m023.FEEDER_BUS_CBD_FARE = int(line[1]) - - line = f.readline().split() - m023.PACE_BUS_BOARDING_FARE = int(line[0]) - m023.PACE_BUS_FIRST_XFER_FARE = int(line[1]) - - line = f.readline().split() - m023.AUTO_OPERATING_COST_BY_SPEED = [int(j) for j in line[:8]] - line = f.readline().split() - m023.AUTO_OPERATING_COST_BY_SPEED.extend([int(j) for j in line[:8]]) - m023.AUTO_OPERATING_COST_BY_SPEED = np.asarray(m023.AUTO_OPERATING_COST_BY_SPEED) - - line = f.readline().split() - m023.AUTO_OPERATING_COST_BY_ZONETYPE = [int(j) for j in line[:4]] - m023.AUTO_OPERATING_COST_BY_ZONETYPE = np.asarray(m023.AUTO_OPERATING_COST_BY_ZONETYPE) - - return m023 - - -def load_m023(filenames): - - m023 = read_m023(filenames.ALLPURPOSE_M023) - return m023 - diff --git a/src/Mode-Dest-TOD/cmap_modedest/data_handlers/pa_trip_types.csv b/src/Mode-Dest-TOD/cmap_modedest/data_handlers/pa_trip_types.csv deleted file mode 100644 index 91101cd..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/data_handlers/pa_trip_types.csv +++ /dev/null @@ -1,50 +0,0 @@ -trip_type,description,purpose_category,pair_type -1,worker home-based work low-income,HBWL,PA -2,worker home-based work hi-income,HBWH,PA -3,worker home-based work-related,HBW,PA -4,worker home-based school,HBW,PA -5,worker home-based nonhome/work at residence,HBOR,PA -6,worker home-based nonhome/work not at residence,HBO,PA -7,worker home-based shop,HBS,PA -8,worker work-based nonhome/work at residence,NHBR,PA -9,worker work-based nonhome/work not at residence,NHB,PA -10,worker work-based shop,NHBS,PA -11,worker work-based work,NHB,PA -12,worker nonhome/work at residence nonhome/work at residence,NHBR,OD -13,worker nonhome/work at residence nonhome/work not at residence,NHB,OD -14,worker nonhome/work at residence shop,NHBS,OD -15,worker nonhome/work not at residence nonhome/work at residence,NHBR,OD -16,worker nonhome/work not at residence nonhome/work not at residence,NHB,OD -17,worker nonhome/work not at residence shop,NHBS,OD -18,worker shop nonhome/work at residence,NHBR,OD -19,worker shop nonhome/work not at residence,NHB,OD -20,worker shop shop,NHBS,OD -21,non-working adult home-based school,HBW,PA -22,non-working adult home-based nonhome at residence,HBOR,PA -23,non-working adult home-based nonhome not at residence,HBO,PA -24,non-working adult home-based shop,HBS,PA -25,non-working adult nonhome at residence nonhome at residence,NHBR,OD -26,non-working adult nonhome at residence nonhome not at residence,NHB,OD -27,non-working adult nonhome at residence shop,NHBS,OD -28,non-working adult nonhome not at residence nonhome at residence,NHBR,OD -29,non-working adult nonhome not at residence nonhome not at residence,NHB,OD -30,non-working adult nonhome not at residence shop,NHBS,OD -31,non-working adult shop nonhome at residence,NHBR,OD -32,non-working adult shop nonhome not at residence,NHB,OD -33,non-working adult shop shop,NHBS,OD -34,child home-based school,EXCLUDE,PA -35,child home-based nonhome at residence,HBOR,PA -36,child home-based nonhome not at residence,HBO,PA -37,child home-based shop,HBS,PA -38,child school nonhome at residence,NHBR,PA -39,child school nonhome not at residence,NHB,PA -40,child school shop,NHBS,PA -41,child nonhome at residence nonhome at residence,NHBR,OD -42,child nonhome at residence nonhome not at residence,NHB,OD -43,child nonhome at residence shop,NHBS,OD -44,child nonhome not at residence nonhome at residence,NHBR,OD -45,child nonhome not at residence nonhome not at residence,NHB,OD -46,child nonhome not at residence shop,NHBS,OD -47,child shop nonhome at residence,NHBR,OD -48,child shop nonhome not at residence,NHB,OD -49,child shop shop,NHBS,OD \ No newline at end of file diff --git a/src/Mode-Dest-TOD/cmap_modedest/data_handlers/parking_handler.py b/src/Mode-Dest-TOD/cmap_modedest/data_handlers/parking_handler.py deleted file mode 100644 index 6b3136a..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/data_handlers/parking_handler.py +++ /dev/null @@ -1,74 +0,0 @@ -import os - -import numpy as np -import pandas as pd -from ..addict import Dict - -def load_cbd_parking(filenames): - - if os.path.exists(filenames.HW_CBDPARK0): - # split the HW_CBDPARK file into its two primary parts - with open(filenames.HW_CBDPARK0, 'rt') as f: - lines = f.readlines() - def secondpart(line): - beginning = line.split(",", 1)[0] - try: - beginning = int(beginning) - except: - return 0 - if beginning < 10_000: - return 0 - return 1 - with open(filenames.HW_CBDPARK, 'wt') as f: - f.write("".join(i for i in lines if not secondpart(i))) - with open(filenames.HW_CBDPARK2, 'wt') as f: - f.write("".join(i for i in lines if secondpart(i))) - - cbd_parking = pd.read_csv( - filenames.HW_CBDPARK, - header=None, - names=['ZoneID', 'CumProb', 'ThresholdPrice', 'SavePrice', 'WalkSeconds'], - ) - cbd_parking.CumProb /= 10000. - # cbd_parking['SumPrice'] = cbd_parking.ThresholdPrice + cbd_parking.SavePrice - cbd_parking['rownum'] = cbd_parking.groupby(['ZoneID']).cumcount() - - def decumulate(x): - x_ = np.array(x) - x_[1:] -= x[:-1] - return x_ - cbd_parking['Prob'] = cbd_parking.groupby("ZoneID")['CumProb'].transform(decumulate) - cbd_parking['WeightedPrice'] = cbd_parking['Prob'] * cbd_parking['ThresholdPrice'] - cbd_parking_prices = cbd_parking.set_index(["ZoneID",'rownum']).ThresholdPrice.unstack() - cbd_parking_price_prob = cbd_parking.set_index(["ZoneID",'rownum']).Prob.unstack() - - for zone_to, zone_source in filenames.cfg.parking_costs.cbd_nearby.items(): - cbd_parking_prices.loc[zone_to] = cbd_parking_prices.loc[zone_source] - cbd_parking_price_prob.loc[zone_to] = cbd_parking_price_prob.loc[zone_source] - - cbd_parking_prices.sort_index(inplace=True) - cbd_parking_price_prob.sort_index(inplace=True) - - CBD_PARKING_ZONES = dict(zip(cbd_parking_prices.index, np.arange(len(cbd_parking_prices.index)))) - - cbd_parking2 = pd.read_csv( - filenames.HW_CBDPARK2, - header=None, - names=[ - 'IncomeCeiling', - 'FreeParkingPct', - 'TransitPct', - 'AutoOcc1Pct', - 'AutoOcc2Pct', - 'AutoOcc3Pct', - 'AutoOcc4Pct', - ], - ) - - parking = Dict() - parking.cbd_parking = cbd_parking - parking.cbd_parking_prices = cbd_parking_prices - parking.cbd_parking_price_prob = cbd_parking_price_prob - parking.cbd_parking2 = cbd_parking2 - parking.CBD_PARKING_ZONES = CBD_PARKING_ZONES - return parking diff --git a/src/Mode-Dest-TOD/cmap_modedest/data_handlers/shp_handler.py b/src/Mode-Dest-TOD/cmap_modedest/data_handlers/shp_handler.py deleted file mode 100644 index 7ede3c6..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/data_handlers/shp_handler.py +++ /dev/null @@ -1,11 +0,0 @@ - -import geopandas as gpd - - -def load_zone_shapes(filenames): - zone_shp = gpd.read_file( - filenames.zone_shapefile - ).set_index('zone17') - return zone_shp - - diff --git a/src/Mode-Dest-TOD/cmap_modedest/data_handlers/skims_handler.py b/src/Mode-Dest-TOD/cmap_modedest/data_handlers/skims_handler.py deleted file mode 100644 index d4bba73..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/data_handlers/skims_handler.py +++ /dev/null @@ -1,226 +0,0 @@ -import numpy as np -import logging -log = logging.getLogger('CMAP') - - -""" -# Mode Choice Model Impedances - -## Highway Costs - -### Times and distances - -Skims: -HBW trips - Times – mf44 (SOV AM peak), mf76 (HOV AM peak) - Distances - mf45 (SOV AM peak), mf77 (HOV AM peak) - -HBO/NHB trips -Times – mf46 (SOV midday) -Distances - mf47 (SOV midday) - -### Parking Costs - -HBW trips to the Central Area – Monte Carlo simulation using -costs from MCHW_CBDPARK.TXT - -All other trips – zonal Park and Ride cost from MCxx_M01.TXT - -Hours of parking: HBW=10, HBO=6, NHB=3 - -### Auto Operating Costs - -Supplied by MCxx_M023.TXT in 5 MPH increments - -## Transit Costs - -Times and fares Skims: -HBW trips -In-vehicle time – mf822 (AM peak) -Out of vehicle time – mf823 (AM peak) [walk transfer but not access/egress] -Headway – mf838 (AM peak) -Fare – mf828 (AM peak) - -HBO/NHB trips -In-vehicle time – mf922 (midday) -Out of vehicle time – mf923 (midday) [walk transfer but not access/egress] -Headway – mf938 (midday) -Fare – mf928 (midday) - -Access/egress are simulated for each traveler. - First mode and last mode are obtained from transit skims - (mf829|mf929 and mf831|mf931) – these are used to determine - which of the 5 access/egress modes (walk, bus, feeder bus, P&R, K&R) - are simulated. That information is used to pull the appropriate data - from MCxx_DISTR: average zonal distance and standard deviation of - the modes to simulate actual distance. - -""" - -from ..addict import Dict -import larch -import os -from os.path import join as pj -from ..skims import read_skims - - -class DictSkims(Dict): - # defines special pickling - def __getstate__(self): - return self.get('filename', None) - def __setstate__(self, state): - self.update(_load_skims(state)) - def __reduce__(self): - return ( - type(self), - (), - self.__getstate__(), - ) - - -def load_skims(filenames, dh=None, backfill_uncompressed_skims=False): - from ..util import search_path - return _load_skims( - search_path(filenames.emmemat), - dh=dh, - backfill_uncompressed_skims=backfill_uncompressed_skims, - ) - - -def _load_skims( - filename_emmemat, - dh=None, - backfill_uncompressed_skims=False, - use_compressed_skims=None, -): - try: - if use_compressed_skims is None: - if dh is None: - use_compressed_skims = False - else: - use_compressed_skims = dh.cfg.get("use_compressed_skims", False) - - skims = DictSkims() - log.debug(f"filename emmemat = {filename_emmemat}") - skims.filename = filename_emmemat - skims.raw = read_skims( - filename_emmemat, - backfill_uncompressed_skims=backfill_uncompressed_skims, - use_compressed_skims=use_compressed_skims, - ) - - skims.raw['mf45'] = skims.raw['mf45'].load() - skims.raw['mf47'] = skims.raw['mf47'].load() - - skims.auto.col_mapping = dict( - am_time='mf44', - am_dist='mf45', - am_toll_loinc='mf111', - am_toll_hiinc='mf114', - md_time='mf46', - md_dist='mf47', - md_toll='mf117', - am_time_hov='mf76', - am_dist_hov='mf77', - am_toll_hov_loinc='mf112', - am_toll_hov_hiinc='mf115', - am_opcost='am_opcost', - am_opcost_hov='am_opcost_hov', - md_opcost='md_opcost', - ) - - skims.transit_pk.col_mapping = Dict( - ivtt= 'mf822', - ovtt= 'mf823', - headway= 'mf838', - fare= 'mf828', - firstmode= 'mf829', - prioritymode='mf830', - lastmode= 'mf831', - ) - - skims.transit_op.col_mapping = Dict( - ivtt= 'mf922', - ovtt= 'mf923', - headway= 'mf938', - fare= 'mf928', - firstmode= 'mf929', - prioritymode='mf930', - lastmode= 'mf931', - ) - - if dh is not None: - skims = _load_skims_step_2(skims, dh) - return skims - except: - log.exception("exception in _load_skims") - raise - -def _load_skims_step_2(skims, dh): - """ - Some post-processing when `dh` is available - - Parameters - ---------- - skims - dh - - Returns - ------- - skimss - """ - try: - try: - skims.raw['mf829'] - except KeyError: - if dh is None: - raise ValueError("no data_handler defined, and transit skim convolution is needed") - from ..transit_skim_convolution import skim_convol - dh['skims'] = skims - skim_convol(dh, peak=True) - - try: - skims.raw['mf929'] - except KeyError: - if dh is None: - raise ValueError("no data_handler defined, and transit skim convolution is needed") - from ..transit_skim_convolution import skim_convol - dh['skims'] = skims - skim_convol(dh, peak=False) - - # skims.first_mode_peak = skims.transit_pk.raw[pick_in(skims.transit_pk.raw, 'mf829_$', 'mf829')][:].astype(np.int8)+1 - # skims.priority_mode_peak = skims.transit_pk.raw[pick_in(skims.transit_pk.raw, 'mf830_$', 'mf830')][:].astype(np.int8)+1 - # skims.last_mode_peak = skims.transit_pk.raw[pick_in(skims.transit_pk.raw, 'mf831_$', 'mf831')][:].astype(np.int8)+1 - # skims.first_mode_offpeak = skims.transit_op.raw[pick_in(skims.transit_op.raw, 'mf929_$', 'mf929')][:].astype(np.int8)+1 - # skims.priority_mode_offpeak = skims.transit_op.raw[pick_in(skims.transit_op.raw, 'mf930_$', 'mf930')][:].astype(np.int8)+1 - # skims.last_mode_offpeak = skims.transit_op.raw[pick_in(skims.transit_op.raw, 'mf931_$', 'mf931')][:].astype(np.int8)+1 - skims.first_mode_peak = skims.raw['mf829'].load().values.astype(np.int8)+1 - skims.priority_mode_peak = skims.raw['mf830'].load().values.astype(np.int8)+1 - skims.last_mode_peak = skims.raw['mf831'].load().values.astype(np.int8)+1 - - skims.first_mode_offpeak = skims.raw['mf929'].load().values.astype(np.int8)+1 - skims.priority_mode_offpeak = skims.raw['mf930'].load().values.astype(np.int8)+1 - skims.last_mode_offpeak = skims.raw['mf931'].load().values.astype(np.int8)+1 - - def to_speed_bucket(_d, _t): - return np.where( - skims.raw[skims.auto.col_mapping[_t]].load(), - np.round(np.ceil( - skims.raw[skims.auto.col_mapping[_d]].load() / - skims.raw[skims.auto.col_mapping[_t]].load() * 60. / 5. - )), - 0 - ).astype(np.uint8) - def to_opcost(_d, _t): - return ( - dh.m023.AUTO_OPERATING_COST_BY_SPEED[to_speed_bucket(_d, _t)] / 100. - * skims.raw[skims.auto.col_mapping[_d]].load() - ) - skims.raw['am_opcost'] = to_opcost('am_dist', 'am_time') - skims.raw['am_opcost_hov'] = to_opcost('am_dist_hov', 'am_time_hov') - skims.raw['md_opcost'] = to_opcost('md_dist', 'md_time') - - return skims - except: - log.exception("exception in _load_skims") - raise diff --git a/src/Mode-Dest-TOD/cmap_modedest/data_handlers/tabler.py b/src/Mode-Dest-TOD/cmap_modedest/data_handlers/tabler.py deleted file mode 100644 index b3daa55..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/data_handlers/tabler.py +++ /dev/null @@ -1 +0,0 @@ -from sharrow import Table \ No newline at end of file diff --git a/src/Mode-Dest-TOD/cmap_modedest/data_handlers/tg_handler.py b/src/Mode-Dest-TOD/cmap_modedest/data_handlers/tg_handler.py deleted file mode 100644 index 5fc2d18..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/data_handlers/tg_handler.py +++ /dev/null @@ -1,129 +0,0 @@ -import os.path -import numpy as np -import pandas as pd -import gzip -from ..addict import Dict -from ..util import search_path -import logging - - - -def load_hh_enum(filenames): - - hhv = pd.read_csv( - filenames.hh_enum, - header=None, - names=["subzone", 'zone', 'hhvtype'] - ) - tabulation = ( - hhv - .groupby(["zone","hhvtype"]) - .size() - .unstack() - .reindex(pd.RangeIndex(1, 3633, name='TAZ')) - .reindex(pd.RangeIndex(1, 625, name='hhvtype'), axis=1) - .fillna(0) - ) - return hhv, tabulation - - - -def load_tg(filenames, with_detail=False): - - - pa_trip_types = pd.read_csv( - os.path.join(os.path.dirname(__file__), "pa_trip_types.csv"), - index_col=0, - ) - purpose_categories = pa_trip_types.purpose_category - - trip49_filenames = {} - trip49_filenames['typical'] = search_path( - filenames.cache_dir / "TRIP49_PA_OUT.TXT.gz", - filenames.cache_dir / "TRIP49_PA_OUT.TXT", - filenames.emme_database_dir / "TRIP49_PA_OUT.TXT.gz", - filenames.emme_database_dir / "TRIP49_PA_OUT.TXT", - filenames.emme_database_dir / "defaults_base_year/TRIP49_PA_OUT.TXT.gz", - filenames.emme_database_dir / "defaults_base_year/TRIP49_PA_OUT.TXT", - ) - # secondary WFH trip generation - trip49_filenames['wfh'] = search_path( - filenames.cache_dir / "TRIP49_PA_WFH_OUT.TXT.gz", - filenames.cache_dir / "TRIP49_PA_WFH_OUT.TXT", - filenames.emme_database_dir / "TRIP49_PA_WFH_OUT.TXT.gz", - filenames.emme_database_dir / "TRIP49_PA_WFH_OUT.TXT", - filenames.emme_database_dir / "defaults_base_year/TRIP49_PA_WFH_OUT.TXT.gz", - filenames.emme_database_dir / "defaults_base_year/TRIP49_PA_WFH_OUT.TXT", - ) - - log = logging.getLogger('CMAP') - result = {} - for tripclass, trip49_filename in trip49_filenames.items(): - - log.info(f"reading {tripclass} trip generation from: {trip49_filename}") - - if os.path.splitext(trip49_filename)[1] == '.gz': - f = gzip.open(trip49_filename, 'rb') - else: - f = open(trip49_filename, 'rb') - try: - trip49 = pd.read_fwf( - f, - widths=[6, 6, 2, 9, 9], - names=['subzone', 'zone', 'trip_type', 'productions', 'attractions'], - ) - finally: - f.close() - - trip49["purpose_category"] = trip49["trip_type"].map(purpose_categories) - - # Certain trip types are NHB but generated as P-A, convert them to O-D - nhb_pa = (pa_trip_types['purpose_category'].isin(['NHB', 'NHBR', 'NHBS'])) & (pa_trip_types['pair_type'] == 'PA') - trip49["mix_PA"] = trip49["trip_type"].map(nhb_pa) - mixed_PA = (trip49['productions'] + trip49['attractions']) / 2 - trip49.loc[trip49["mix_PA"], 'productions'] = mixed_PA.loc[trip49["mix_PA"]] - trip49.loc[trip49["mix_PA"], 'attractions'] = mixed_PA.loc[trip49["mix_PA"]] - - trip49z = trip49.groupby(["zone", "purpose_category"])[['productions', 'attractions']].sum() - prodns = trip49z['productions'].unstack().fillna(0.0) - attrns = trip49z['attractions'].unstack().fillna(0.0) - - if with_detail: - trip49z_detail = trip49.groupby(["zone", "trip_type"])[['productions', 'attractions']].sum() - prodns_detail = trip49z_detail['productions'].unstack().fillna(0.0) - attrns_detail = trip49z_detail['attractions'].unstack().fillna(0.0) - - for xns in (prodns, attrns): - # There are high and low income work purposes. We push all the non-income bound - # home-based mandatory purposes into income-related groups based on the relative - # share in the income-bound values - income_generic_mandatory = xns["HBW"] - lo_income_share_mandatory = (xns["HBWL"] / (xns["HBWL"] + xns["HBWH"])).where((xns["HBWL"] + xns["HBWH"])>0, 0) - hi_income_share_mandatory = 1 - lo_income_share_mandatory - xns["HBWL"] += income_generic_mandatory * lo_income_share_mandatory - xns["HBWH"] += income_generic_mandatory * hi_income_share_mandatory - xns.drop(columns=['HBW', 'EXCLUDE'], inplace=True) - - pd.concat([prodns.stack().rename("productions"), attrns.stack().rename("attractions")], axis=1).to_csv( - filenames.cache_dir / "trips_PA_by_purpose.csv" - ) - - tg = Dict() - tg.trip_attractions8 = attrns.copy() - tg.trip_productions8 = prodns.copy() - tg.zone_productions8 = prodns.round().astype(int).copy() - - for xns in (prodns, attrns): - xns['HBO'] = xns['HBO'] + xns['HBOR'] - xns['NHB'] = xns['NHB'] + xns['NHBR'] + xns['NHBS'] - xns.drop(columns=['HBOR', 'NHBR', 'NHBS'], inplace=True) - - tg.trip_attractions5 = attrns - tg.trip_productions5 = prodns - tg.zone_productions5 = prodns.round().astype(int) - if with_detail: - tg.trip_attractions_detail = attrns_detail - tg.trip_productions_detail = prodns_detail - result[tripclass] = tg - - return result diff --git a/src/Mode-Dest-TOD/cmap_modedest/data_handlers/visitors.py b/src/Mode-Dest-TOD/cmap_modedest/data_handlers/visitors.py deleted file mode 100644 index 0c0612b..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/data_handlers/visitors.py +++ /dev/null @@ -1,39 +0,0 @@ -import numpy as np -import pandas as pd -import logging -from ..util import search_path - - -def load_visitor_trips(filenames, scale_factor=1.0): - """ - Generate visitor trips. - - The raw visitor table includes fractional trips. - This function converts to integer trips by making - random draws from the trip table. - - Parameters - ---------- - filenames : Filenames - scale_factor : float, default 1.0 - - Returns - ------- - trips : pd.DataFrame - A square trip table with integer O-D trips by visitors - """ - filename = search_path( - filenames.cache_dir / "CMAP_TripTable_VisitorsWeekday.csv.gz", - filenames.emme_database_dir / "CMAP_TripTable_VisitorsWeekday.csv.gz", - filenames.emme_database_dir / "defaults_base_year/CMAP_TripTable_VisitorsWeekday.csv.gz", - ) - logging.getLogger('CMAP').info(f"reading visitor trip table from: {filename}") - trips = pd.read_csv(filename) - n = trips['trips'].sum() - trip_wt = trips['trips'] / n - n_trips = int(np.round(n * scale_factor)) - visit_trips = np.random.default_rng(42).choice(len(trips), n_trips, p=trip_wt) - trips.drop(columns=['trips'], inplace=True) - trips['visitor_trips'] = pd.Series(visit_trips).value_counts() - trips.fillna(0, inplace=True) - return trips.pivot("start_taz", "end_taz", "visitor_trips").fillna(0).astype(int) diff --git a/src/Mode-Dest-TOD/cmap_modedest/deadheading.py b/src/Mode-Dest-TOD/cmap_modedest/deadheading.py deleted file mode 100644 index 8ac89c9..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/deadheading.py +++ /dev/null @@ -1,144 +0,0 @@ -import numpy as np -import pandas as pd -import warnings -from .time_of_day_model import time_period_names, time_period_codes - -import logging -log = logging.getLogger('CMAP') - -def compute_deadhead_trip_table( - dh, - trips, - intrazonal_factor=0.5, - traveltime_factor=-1.0, - stats=False, -): - """ - Compute a trip table of deadhead trips taken by taxis and TNCs. - - Parameters - ---------- - dh : DataHandler - trips : dask.DataFrame - The assembled primary trips (not including hired car deadheading) - as a dask DataFrame. - intrazonal_factor : float - The pseudo-value of travel time for intrazonal trips, which include - implied travel time as well as a constant adjustment. - traveltime_factor : float, default -1.0 - A parameter to calibrate the overall length of deadhead trips, used as - the coefficient in a gravity model. - stats : bool - Display length distribution of deadhead trips, when in a Jupyter - notebook. - - Returns - ------- - DataFrame - """ - result = {} - random_generator = np.random.default_rng([12345,67890]) - - for tname, tcode in zip(time_period_names, time_period_codes): - log.info(f"compute_deadhead_trip_table: {tname}") - - # We try this twice, as there is a rare sync problem in numexpr that - # makes this fail. - try: - trips_by_od = ( - trips - .query("mode in (4,5,6)") - .query(f"timeperiod in ('{tname}',)") - .groupby(["o_zone", "d_zone"])['trips'] - .sum() - .compute() - .unstack(0) - .fillna(0) - ).reindex( - index=dh.skims.raw[f'mf46{tcode}'].indexes['otaz'], - columns=dh.skims.raw[f'mf46{tcode}'].indexes['dtaz'], - ).fillna(0) - except KeyError: - import numexpr.necompiler - numexpr.necompiler._numexpr_cache.clear() - trips_by_od = ( - trips - .query("mode in (4,5,6)") - .query(f"timeperiod in ('{tname}',)") - .groupby(["o_zone", "d_zone"])['trips'] - .sum() - .compute() - .unstack(0) - .fillna(0) - ).reindex( - index=dh.skims.raw[f'mf46{tcode}'].indexes['otaz'], - columns=dh.skims.raw[f'mf46{tcode}'].indexes['dtaz'], - ).fillna(0) - - deadhead_dests = trips_by_od.sum() # hired car trip origins - deadhead_origs = trips_by_od.sum(1) # hired car trip destinations - - auto_travel_time = dh.skims.raw[f'mf46{tcode}'].values - intrazonal_value = np.eye(auto_travel_time.shape[0]) * intrazonal_factor - wgt_matrix = np.exp(traveltime_factor*(auto_travel_time + intrazonal_value)) - - # Fratar the deadhead weights to the deadhead productions and attractions - for iter in range(10): - with warnings.catch_warnings(): - warnings.simplefilter("ignore", category=RuntimeWarning) - w = np.nan_to_num(wgt_matrix / wgt_matrix.sum(0)) * np.expand_dims(deadhead_dests, 0) - wgt_matrix = np.nan_to_num(w / np.expand_dims(w.sum(1), 1)) * np.expand_dims(deadhead_origs, 1) - - chx = {} - - triptable = np.zeros(wgt_matrix.shape, dtype=np.int32) - - for row in range(wgt_matrix.shape[0]): - rowsum = wgt_matrix[row].sum() - n = int(np.round(rowsum)) - if n: - chx[row] = random_generator.choice(wgt_matrix.shape[1], size=n, p=wgt_matrix[row] / rowsum) - for k in chx[row]: - triptable[row, k] += 1 - - triptable = pd.DataFrame( - triptable, - index=dh.skims.raw[f'mf46{tcode}'].indexes['otaz'], - columns=dh.skims.raw[f'mf46{tcode}'].indexes['dtaz'], - ).fillna(0) - triptable.index.name = 'o_zone' - triptable.columns.name = 'd_zone' - triptable = triptable.stack().fillna(0).reset_index() - - triptable['timeperiod'] = tname - triptable['mode'] = 1 - triptable['purpose'] = 'DEAD' - triptable['a_zone'] = triptable['d_zone'] - - triptable = triptable.set_index([ - 'purpose', 'mode', 'o_zone', 'd_zone', 'a_zone', 'timeperiod' - ]) - - result[tname] = triptable.loc[triptable.iloc[:,0] > 0].copy() - result[tname].columns = ['trips'] - - if stats: - import matplotlib.pyplot as plt - from xmle import Show - from IPython.display import display - - tt = dh.skims.raw[[f'mf46{tcode}']].at_df( - result[tname] - .reset_index()[['o_zone', 'd_zone']] - .rename(columns=dict(o_zone='otaz', d_zone='dtaz')) - ) - rr = result[tname].copy() - rr['time'] = tt[f'mf46{tcode}'].values - fig, ax = plt.subplots() - ax.hist(rr['time'], weights=rr['trips']) - ax.set_title(tname) - ax.set_xlabel("minutes") - display(Show(fig)) - plt.close() - - return pd.concat([r for r in result.values()]) diff --git a/src/Mode-Dest-TOD/cmap_modedest/estimation/__init__.py b/src/Mode-Dest-TOD/cmap_modedest/estimation/__init__.py deleted file mode 100644 index c523523..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/estimation/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -import larch -from larch import P,X,PX -import os -import pandas as pd -import numpy as np -import cmap_modedest -from ..addict import Dict -from pathlib import Path - -from ..util import resource_usage, start_memory_tracing, ping_memory_tracing - - diff --git a/src/Mode-Dest-TOD/cmap_modedest/estimation/est_choice.py b/src/Mode-Dest-TOD/cmap_modedest/estimation/est_choice.py deleted file mode 100644 index f36f588..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/estimation/est_choice.py +++ /dev/null @@ -1,863 +0,0 @@ -import numpy as np -import pandas as pd -import os -from ..addict import Dict -import larch as larch -from larch import P,X -from larch.util.figures import distribution_figure, share_figure -from larch.util.data_expansion import piecewise_linear -from IPython.display import display, HTML - -import logging -log = logging.getLogger('CMAP') - -def L(*args): - if len(args)==1 and isinstance(args[0], str) and args[0][0]=="#": - log.info(args[0]) - else: - s = "\n".join(str(i) for i in args) - s = "\n"+s - log.info(s.replace("\n","\n ")) - - -from ..transit_approach import transit_approach -from .est_data import dh -from ..choice_model import model_builder - -from .est_config import mode_modeled, n_sampled_dests -from .est_survey import trips -from .est_sample_dest import sample_dest_zones_and_data -from ..util import resource_usage -from ..modecodes import mode9names - - -L( - "###### data statistics ######", - trips['tripPurpose'].value_counts(), - trips.mode3.value_counts() -) - -L("###### sample_dest_zones_and_data ######") - -# Null out invalid data # now in survey_data -# transit_cols = ['ivtt','ovtt','headway','fare','firstmode','lastmode'] -# for a in transit_cols: -# to_nan = trips[f'transit_{a}'] > 999 -# trips.loc[to_nan,f'transit_{a}'] = np.nan - - -L("## ae_approach_los ##") -from .est_survey import ae_approach_los - -trip_approach_distances, ae_los = ae_approach_los(trips) - -L("## sample_dest_zones_and_data ##") -TRIP_ALTS_CACHE_FILE = f"trip_alts_n{n_sampled_dests}_vx14" - -trip_alt_df = dh.filenames.load(TRIP_ALTS_CACHE_FILE) -if trip_alt_df is None: - trip_alt_df = sample_dest_zones_and_data( - trips, - n_zones=dh.n_internal_zones, - n_sampled_dests=n_sampled_dests, - keep_trips_cols=[ - 'd_zone', - 'mode5', - 'mode5code', - 'mode7', - 'mode7code', - 'mode9', - 'mode9code', - 'incomeLevel', - 'tripCat', - 'tripPurpose', - 'auto_dist', - 'auto_time', - 'auto_parking_cost', - 'transit_fare', - 'transit_ivtt', - 'transit_ovtt', - 'transit_headway', - 'transit_approach_cost', - 'transit_approach_drivetime', - 'transit_approach_walktime', - 'transit_approach_waittime', - 'taxi_wait_time', - 'taxi_fare', - 'tnc_solo_wait_time', - 'tnc_pool_wait_time', - 'tnc_solo_fare', - 'tnc_pool_fare', - 'hhinc_dollars', - 'timeperiod', - 'mode_and_time', - 'actualdest', - 'ozone_areatype', - 'ozone_autopropensity', - 'autopropensity', - 'areatype', - 'hhveh', - 'hhsize', - 'hhadults', - 'paFlip', - 'auto_time_hov', - 'auto_toll', - 'auto_toll_hiinc', - 'auto_toll_loinc', - 'auto_toll_hov_loinc', - 'auto_toll_hov_hiinc', - 'auto_opcost', - 'auto_opcost_hov', - ] - ) - - # - # display(HTML(f"

auto_dist statistics

")) - # display(trip_alt_df['auto_dist'].statistics()) - # - # display(HTML(f"

altdest0001_auto_dist statistics

")) - # display(trip_alt_df['altdest0001_auto_dist'].statistics()) - # - - - L("## invalid_walktime ##") - for peaky in ['PEAK', 'OFFPEAK']: - invalid_walktime = trip_alt_df[f'actualdest_transit_approach_walktime_{peaky}'] > 180 - trip_alt_df.loc[invalid_walktime, f'actualdest_transit_approach_walktime_{peaky}'] = np.nan - - L("## invalid_drivetime ##") - for peaky in ['PEAK', 'OFFPEAK']: - invalid_drivetime = trip_alt_df[f'actualdest_transit_approach_drivetime_{peaky}'] > 180 - trip_alt_df.loc[invalid_drivetime, f'actualdest_transit_approach_drivetime_{peaky}'] = np.nan - - for i in range(n_sampled_dests): - for peaky in ['PEAK', 'OFFPEAK']: - L(f"# approach simulate for altdest{i + 1:04d} {peaky} ") - # q = (trips.tripPurpose == purpose) - # _trips_by_purpose = trip_alt_df[q] - result_purpose = transit_approach( - dh, - trip_alt_df.o_zone, - trip_alt_df[f'altdest{i + 1:04d}'], - 'HW' if peaky=='PEAK' else 'HO', - replication=1, - approach_distances=None, - trace=False, - random_state=123 + i, - ) - for key in ['drivetime', 'walktime', 'cost', 'waittime']: - v = result_purpose[key][:, 0].astype(float) - if key in ['drivetime', 'walktime', 'waittime']: - v[v > 180] = np.nan - trip_alt_df.loc[:, f'altdest{i + 1:04d}_transit_approach_{key}_{peaky}'] = v - - dh.filenames.save(TRIP_ALTS_CACHE_FILE, trip_alt_df) - -from ..choice_model import alt_codes_and_names - -alt_codes, alt_names = alt_codes_and_names( - n_sampled_dests=n_sampled_dests, - include_actual_dest=True, -) - - -dats = Dict() -mods = Dict() -mods_preload = Dict() - -from ..purposes import purposes5, purposes_to_peaky -purposes = purposes5 - - -altdest_tags = lambda suffix: [ - f'altdest{i + 1:04d}_{suffix}' - for i in range(n_sampled_dests) -] - -altdest_tags_div = lambda suffix1, suffix2: [ - f'altdest{i + 1:04d}_{suffix1}/altdest{i + 1:04d}_{suffix2}' - for i in range(n_sampled_dests) -] - - -# `ca_folds` defines how ca_folded (see below) is built -ca_folds = { - "nAttractions_HBWH": ['actualdest_log_attractions_HBWH'] + altdest_tags("log_attractions_HBWH"), - "nAttractions_HBWL": ['actualdest_log_attractions_HBWL'] + altdest_tags("log_attractions_HBWL"), - "nAttractions_HBS": ['actualdest_log_attractions_HBS'] + altdest_tags("log_attractions_HBS"), - "nAttractions_HBO": ['actualdest_log_attractions_HBO'] + altdest_tags("log_attractions_HBO"), - "nAttractions_NHB": ['actualdest_log_attractions_NHB'] + altdest_tags("log_attractions_NHB"), - "auto_dist_OFFPEAK": ['actualdest_auto_dist_OFFPEAK'] + altdest_tags("auto_dist_OFFPEAK"), - "auto_dist_PEAK": ['actualdest_auto_dist_PEAK'] + altdest_tags("auto_dist_PEAK"), - "auto_time_OFFPEAK": ['actualdest_auto_time_OFFPEAK'] + altdest_tags("auto_time_OFFPEAK"), - "auto_time_PEAK": ['actualdest_auto_time_PEAK'] + altdest_tags("auto_time_PEAK"), - "transit_ivtt_PEAK": ['actualdest_transit_ivtt_PEAK'] + altdest_tags("transit_ivtt_PEAK"), - "transit_ivtt_OFFPEAK": ['actualdest_transit_ivtt_OFFPEAK'] + altdest_tags("transit_ivtt_OFFPEAK"), - "transit_ovtt_OFFPEAK": ['actualdest_transit_ovtt_OFFPEAK'] + altdest_tags("transit_ovtt_OFFPEAK"), - "transit_approach_waittime_OFFPEAK": ['actualdest_transit_approach_waittime_OFFPEAK'] + altdest_tags("transit_approach_waittime_OFFPEAK"), - "transit_approach_walktime_OFFPEAK": ['actualdest_transit_approach_walktime_OFFPEAK'] + altdest_tags("transit_approach_walktime_OFFPEAK"), -} - -# TODO check data on transit_approach_waittime_OFFPEAK - -# `ca_folded` will contain, by purpose, destination-specific data for later analysis -ca_folded = Dict() - -cached_model_filename = lambda purpose: dh.filenames.cache_dir / f"choicemodel_{purpose}_hc.xlsx" -cached_model_filereport = lambda purpose: dh.filenames.cache_dir / f"choicemodel_{purpose}_hc_report.xlsx" - -for purpose in purposes: - - # define filter for this trip purpose - q = (trip_alt_df['tripCat'] == purpose) - - # assemble quantitative (size) factors - # We use the attractions defined in the model's Trip Generation step. - log.debug(f"size_of_altdests for {purpose}") - size_of_altdests = [ - np.log(np.fmax( - dh.trip_attractions5.loc[ - trip_alt_df[q][f"altdest{i + 1:04d}"], - purpose, - ].reset_index( - drop=True - ), - 1e-300, # nonzero but tiny - )).rename( - f'altdest{i + 1:04d}_log_attractions_{purpose}' - ) - for i in range(n_sampled_dests) - ] - - log.debug(f"actualdest_log_attractions for {purpose}") - _df = pd.concat( - [ - trip_alt_df[q].reset_index(), - np.log(np.fmax( - dh.trip_attractions5.loc[ - trips[q].d_zone, - purpose, - ].reset_index( - drop=True - ), - 1e-300, # nonzero but tiny - )).rename( - f'actualdest_log_attractions_{purpose}' - ), - ] + size_of_altdests, - axis=1, - ) - - peaky = 'PEAK' if 'W' in purpose else 'OFFPEAK' - - positive_attractions = (_df[f'actualdest_log_attractions_{purpose}'] > -666) - _df[f'actualdest_transit_avail_{purpose}'] = ( - (_df[f'actualdest_transit_ivtt_{peaky}'] < 999) - & (_df[f'actualdest_transit_approach_walktime_{peaky}'] < 999) - & (_df[f'actualdest_transit_approach_drivetime_{peaky}'] < 999) - & positive_attractions - ) - _df[f'actualdest_auto_avail_{purpose}'] = positive_attractions - _df[f'actualdest_walk_avail_{purpose}'] = positive_attractions & (_df[f'actualdest_auto_dist_OFFPEAK'] < 3) - _df[f'actualdest_bike_avail_{purpose}'] = positive_attractions & (_df[f'actualdest_auto_dist_OFFPEAK'] < 12) - for i in range(n_sampled_dests): - positive_attractions = (_df[f'altdest{i + 1:04d}_log_attractions_{purpose}'] > -666) - _df[f'altdest{i + 1:04d}_transit_avail_{purpose}'] = ( - ( _df[f'altdest{i + 1:04d}_transit_ivtt_{peaky}'] < 999) - & (_df[f'altdest{i + 1:04d}_transit_ovtt_{peaky}'] < 999) - & (_df[f'altdest{i + 1:04d}_transit_approach_walktime_{peaky}'] < 999) - & (_df[f'altdest{i + 1:04d}_transit_approach_drivetime_{peaky}'] < 999) - & positive_attractions - ) - _df[f'altdest{i + 1:04d}_auto_avail_{purpose}'] = positive_attractions - _df[f'altdest{i + 1:04d}_walk_avail_{purpose}'] = positive_attractions & (_df[f'altdest{i + 1:04d}_auto_dist_OFFPEAK'] < 3) - _df[f'altdest{i + 1:04d}_bike_avail_{purpose}'] = positive_attractions & (_df[f'altdest{i + 1:04d}_auto_dist_OFFPEAK'] < 12) - # Build IDCA folded data for later analysis - _ca_folded = {} - for k, v in ca_folds.items(): - if 'nAttractions' in k: - if purpose not in k: - continue - folder = np.exp(_df[v]) - else: - folder = _df[v] - folder.columns = range(len(v)) - _ca_folded[k] = folder.stack().rename(k) - ca_folded[purpose] = pd.DataFrame(_ca_folded) - - ca_folded[purpose]['walktime_dist'] = ( - ca_folded[purpose]['transit_approach_walktime_OFFPEAK'] - / ca_folded[purpose]['auto_dist_OFFPEAK'] - ) - - # Model's actual data - dfs = dats[purpose] = larch.DataFrames( - co=_df, - alt_codes=alt_codes, - alt_names=alt_names, - ch='mode9code', - # av=pd.DataFrame({ - # k: _df.eval(v) - # for k, v in av.items() - # }).astype(np.int8), - ) - - cached_model_file = cached_model_filename(purpose) - if 0 and os.path.exists(cached_model_file) and purpose != "NHB": - m = mods[purpose] = larch.Model.load( - cached_model_file - ) - mods_preload[purpose] = True - else: - m = mods[purpose] = model_builder( - purpose, - include_actual_dest=True, - n_sampled_dests=n_sampled_dests, - parameter_values=None, - constraints=True, - ) - mods_preload[purpose] = False - m.dataservice = dfs - m.load_data() - m.diagnosis = m.doctor(repair_ch_av="-") - - - - -L("## model parameter estimation ##") - -Pr = Dict() - -nests_per_dest = 3 # CHANGE ME if/when the number of nests per destination is altered in `model_builder` - - - -figures = Dict() - -def dest_profiler( - purpose, -): - n_modes = len(mode9names) - _offset = (n_sampled_dests + 1) * n_modes + nests_per_dest-1 - _ch = mods[purpose].dataframes.data_ch_cascade(mods[purpose].graph)\ - .iloc[:, _offset:-1:nests_per_dest].stack().values - _av = mods[purpose].dataframes.data_av_cascade(mods[purpose].graph)\ - .iloc[:, _offset:-1:nests_per_dest].stack().values - - if purposes_to_peaky[purpose]: - - figdef = Dict() - figdef[f'auto_dist_PEAK'].bins = 50 - figdef[f'auto_dist_PEAK'].range = (0, 50) - # figdef[f'auto_dist_{peaky}'].xscale = {'value':'symlog', 'linthresh':2, 'linscale':0.3} - # figdef[f'auto_dist_{peaky}'].xmajorticks = [0, 1, 2, 5, 10, 20, 50] - # figdef[f'auto_dist_{peaky}'].xminorticks = np.concatenate([ - # np.arange(0, 10), - # np.arange(10, 20, 2), - # np.arange(20, 50, 3), - # ]) - - figdef[f'auto_time_PEAK'].bins = 90 - figdef[f'auto_time_PEAK'].range = (0, 90) - # figdef[f'auto_time_{peaky}'].xscale = {'value':'symlog', 'linthresh':2, 'linscale':0.3} - # figdef[f'auto_time_{peaky}'].xmajorticks = [0, 1, 2, 5, 10, 20, 50] - # figdef[f'auto_time_{peaky}'].xminorticks = np.concatenate([ - # np.arange(0, 10), - # np.arange(10, 20, 2), - # np.arange(20, 50, 3), - # np.arange(50, 90, 5), - # ]) - else: - figdef = Dict() - figdef[f'auto_dist_OFFPEAK'].bins = 50 - figdef[f'auto_dist_OFFPEAK'].range = (0, 50) - figdef[f'auto_time_OFFPEAK'].bins = 60 - figdef[f'auto_time_OFFPEAK'].range = (0, 60) - - for x in figdef: - tag = x.replace("_OFFPEAK","").replace("_PEAK","") - figures.distribution[purpose][tag] = distribution_figure( - ca_folded[purpose][x], - probability=Pr.ByDest[purpose].stack().values, - choices=_ch, - availability=_av, - xlabel=None, - ylabel='Relative Frequency', - style='hist', - bins=figdef[x].bins, - pct_bins=20, - range=figdef[x].range, - prob_label="Modeled", - obs_label="Observed", - bw_method=None, - discrete=None, - ax=None, - format='png', - #header=f"{purpose} / {x} Distribution", - accumulator=True, - xscale=figdef[x].xscale or None, - xmajorticks=figdef[x].xmajorticks or None, - xminorticks=figdef[x].xminorticks or None, - coincidence_ratio=True, - ) - display(HTML(f"

{mods[purpose].title} Destinations by {tag}

")) - display(figures.distribution[purpose][tag]) - - - - -def transit_profiler_X( - purpose, -): - n_modes = len(mode9names) - _offset = (n_sampled_dests + 1) * n_modes + nests_per_dest-1 - _ch = mods[purpose].dataframes.data_ch_cascade(mods[purpose].graph)\ - .iloc[:, :(n_sampled_dests + 1) * n_modes] - _ch.columns = pd.MultiIndex.from_product([ - np.arange(n_sampled_dests + 1), - mode9names, - ], names=['dest', 'mode']) - _ch = _ch.xs("TRANSIT", axis=1, level="mode").stack().values - - _av = mods[purpose].dataframes.data_av_cascade(mods[purpose].graph)\ - .iloc[:, :(n_sampled_dests + 1) * n_modes] - _av.columns = pd.MultiIndex.from_product([ - np.arange(n_sampled_dests + 1), - mode9names, - ], names=['dest', 'mode']) - _av = _av.xs("TRANSIT", axis=1, level="mode").stack().values - - if purposes_to_peaky[purpose]: - - figdef = Dict() - figdef[f'auto_dist_PEAK'].bins = 50 - figdef[f'auto_dist_PEAK'].range = (0, 50) - figdef[f'transit_ivtt_PEAK'].bins = int(120/5) - figdef[f'transit_ivtt_PEAK'].range = (0, 120) - else: - figdef = Dict() - figdef[f'auto_dist_OFFPEAK'].bins = 30 - figdef[f'auto_dist_OFFPEAK'].range = (0, 30) - figdef[f'transit_ivtt_OFFPEAK'].bins = int(120/5) - figdef[f'transit_ivtt_OFFPEAK'].range = (0, 120) - - for x in figdef: - tag = x.replace("_OFFPEAK","").replace("_PEAK","") - figures.transit_dist[purpose][tag] = distribution_figure( - ca_folded[purpose][x], - probability=Pr.ByMode[purpose].xs("TRANSIT", axis=1, level="mode").stack().values, - choices=_ch, - availability=_av, - xlabel=None, - ylabel='Relative Frequency', - style='hist', - bins=figdef[x].bins, - pct_bins=20, - range=figdef[x].range, - prob_label="Modeled", - obs_label="Observed", - bw_method=None, - discrete=None, - ax=None, - format='png', - #header=f"{purpose} / {x} Distribution", - accumulator=True, - xscale=figdef[x].xscale or None, - xmajorticks=figdef[x].xmajorticks or None, - xminorticks=figdef[x].xminorticks or None, - coincidence_ratio=True, - ) - display(HTML(f"

{mods[purpose].title} Transit Usage by {tag}

")) - display(figures.transit_dist[purpose][tag]) - - - - -def mode_usage_profiler( - purpose, - modename, - figdef, -): - n_modes = len(mode9names) - _offset = (n_sampled_dests + 1) * n_modes + nests_per_dest-1 - _ch = mods[purpose].dataframes.data_ch_cascade(mods[purpose].graph)\ - .iloc[:, :(n_sampled_dests + 1) * n_modes] - _ch.columns = pd.MultiIndex.from_product([ - np.arange(n_sampled_dests + 1), - mode9names, - ], names=['dest', 'mode']) - _ch = _ch.xs(modename, axis=1, level="mode").stack().values - - _av = mods[purpose].dataframes.data_av_cascade(mods[purpose].graph)\ - .iloc[:, :(n_sampled_dests + 1) * n_modes] - _av.columns = pd.MultiIndex.from_product([ - np.arange(n_sampled_dests + 1), - mode9names, - ], names=['dest', 'mode']) - _av = _av.xs(modename, axis=1, level="mode").stack().values - - for x in figdef: - tag = x.replace("_OFFPEAK","").replace("_PEAK","") - figures[f'{modename}_dist'][purpose][tag] = distribution_figure( - ca_folded[purpose][x], - probability=Pr.ByMode[purpose].xs(modename, axis=1, level="mode").stack().values, - choices=_ch, - availability=_av, - xlabel=None, - ylabel='Relative Frequency', - style='hist', - bins=figdef[x].bins, - pct_bins=20, - range=figdef[x].range, - prob_label="Modeled", - obs_label="Observed", - bw_method=None, - discrete=None, - ax=None, - format='png', - #header=f"{purpose} / {x} Distribution", - accumulator=True, - xscale=figdef[x].xscale or None, - xmajorticks=figdef[x].xmajorticks or None, - xminorticks=figdef[x].xminorticks or None, - coincidence_ratio=True, - ) - display(HTML(f"

{mods[purpose].title} {modename} Usage by {tag}

")) - display(figures[f'{modename}_dist'][purpose][tag]) - - -def walk_profiler(purpose): - figdef = Dict() - figdef[f'auto_dist_OFFPEAK'].bins = 20 - figdef[f'auto_dist_OFFPEAK'].range = (0, 5) - return mode_usage_profiler(purpose, "WALK", figdef) - -def transit_profiler(purpose): - figdef = Dict() - if purposes_to_peaky[purpose]: - figdef[f'auto_dist_PEAK'].bins = 50 - figdef[f'auto_dist_PEAK'].range = (0, 50) - figdef[f'transit_ivtt_PEAK'].bins = int(120/5) - figdef[f'transit_ivtt_PEAK'].range = (0, 120) - else: - figdef[f'auto_dist_OFFPEAK'].bins = 30 - figdef[f'auto_dist_OFFPEAK'].range = (0, 30) - figdef[f'transit_ivtt_OFFPEAK'].bins = int(120/5) - figdef[f'transit_ivtt_OFFPEAK'].range = (0, 120) - return mode_usage_profiler(purpose, "TRANSIT", figdef) - - - -def value_of_time_profiler(purpose): - m = mods[purpose] - time_params = [ - 'ivtt', - 'totaltime', - 'auto_time', - 'tnc_time', - 'transit_ivtt', - 'transit_ovtt', - 'ovtt', - 'walk_time', - 'bike_time', - 'walk_time[1]: up to 0.5', - 'walk_time[2]: 0.5 to 1.0', - 'walk_time[3]: over 1.0', - ] - result = {} - for t in time_params: - if t in m: - result[t] = ((P(t) * 60) / (P.cost)).set_fmt("${:.2f}/hr").string(m) - result = pd.DataFrame(pd.Series(result, name='Value of Time')) - figures.vot[purpose] = result - display(result) - -def mode_share_profiler( - purpose, -): - d_codes = np.arange(n_sampled_dests+1) - - _pr = Pr.ByMode[purpose].stack(0) - # _pr = _pr.stack([0,2]).sum(1).unstack() - - _ch = mods[purpose].dataframes.data_ch.copy() - _ch.columns=pd.MultiIndex.from_product([ - d_codes, - mode9names, - ]) - _ch = _ch.stack(0) - # _ch = _ch.stack([0,2]).sum(1).unstack() - - peaky = 'PEAK' if purposes_to_peaky[purpose] else 'OFFPEAK' - - figdef = Dict() - figdef[f'auto_dist_{peaky}'].bins = np.logspace(np.log10(1),np.log10(51),10)-1 - # np.concatenate([ - # np.arange(0, 10, 1), # first 1 mile bins to 10 miles - # np.arange(10, 20, 2), # then 2 mile bins to 20 miles - # np.arange(20, 51, 5), # then 5 mile bins to 50 miles - # ]) - - for x in figdef: - tag = x.replace("_OFFPEAK","").replace("_PEAK","") - figures.share[purpose][tag] = share_figure( - x=ca_folded[purpose][x], - probability=_pr.fillna(0), - choices=_ch, - style='stacked', - bins=figdef[x].bins, - format='png', - #header=f"{purpose} Mode Share by {x}" - xscale={'value':'symlog', 'linthresh':2, 'linscale':0.5}, - xmajorticks=[0, 1, 2, 5, 10, 20, 50], - xminorticks=np.concatenate([ - np.arange(0, 10), - np.arange(10, 20, 2), - np.arange(20, 50, 3), - ]), - ) - display(HTML(f"

{mods[purpose].title} Mode Shares by {tag}

")) - display(figures.share[purpose][tag]) - - - -def mode_choice_summary(m): - ch_av_summary = m.dataframes.choice_avail_summary().iloc[:-1] - for k in ['available', 'available weighted', 'available unweighted']: - try: - ch_av_summary[k] = ch_av_summary[k].astype(int) - except KeyError: - pass - pr_summary = m.probability(return_dataframe=True).sum() - ch_av_summary['model prob'] = pr_summary - ch_av_summary.index = pd.MultiIndex.from_product( - [ - np.arange(n_sampled_dests + 1), - mode9names, - ], - names=['dest', 'mode'], - ) - result = ch_av_summary.groupby('mode').sum() - display(HTML(f"

{m.title} Mode Choices Summary

")) - display(result) - return result - -def estimation(n_mu_dest_search_grids=5, n_mu_car_search_grids=5, purposes=None, force_reestimate=False): - - if purposes is None: - from ..purposes import purposes5 - purposes = purposes5 - - for purpose, m in mods.items(): - - if purposes is not None and purpose not in purposes: continue - - m.dataframes.autoscale_weights() - display(HTML(f"

{m.title}

")) - if not mods_preload[purpose] or force_reestimate: - holdfast_cache = m.pf.holdfast.copy() - minimums_cache = m.pf.minimum.copy() - maximums_cache = m.pf.maximum.copy() - # GRID SEARCH on MU - r = None - - n_search_grids = n_mu_dest_search_grids*n_mu_car_search_grids - search_grid_num = 1 - - for mu_Dest in np.linspace(0.25, 1.0, n_mu_dest_search_grids): - for mu_HiredCar in np.linspace(0.05, mu_Dest*0.75, n_mu_car_search_grids): # force some mu on hired car - m.set_values("init") - m.lock_value("Mu-Dest", mu_Dest) - m.lock_value("Mu-HiredCar", mu_HiredCar) - m.lock_value("Mu-PrivateCar", mu_HiredCar) - r = m.maximize_loglike( - prior_result=r, - return_dashboard=True, - method='SLSQP', - options={'maxiter': 1000}, - bhhh_start=5, - iteration_number_tail=f" Grid Search {search_grid_num}/{n_search_grids}" - ) - search_grid_num += 1 - m.pf['holdfast'] = holdfast_cache - m.pf['minimum'] = minimums_cache - m.pf['maximum'] = maximums_cache - m.set_values("best", respect_holdfast=False) - # small perturbation to encourage a little movement - log.info(f"loglike currently {r.get('loglike', 'missing')}") - - m.set_value('Const_WALK', m['Const_WALK'].value * 0.5) - m.set_value('Const_Transit', m['Const_Transit'].value * 0.5) - m.set_value('Const_HOV2', m['Const_HOV2'].value * 0.5) - m.set_value('Const_HOV3', m['Const_HOV3'].value * 0.5) - m.set_value('Const_TAXI', m['Const_TAXI'].value * 0.5) - m.set_value('Const_TNC1', m['Const_TNC1'].value * 0.5) - m.set_value('Const_TNC2', m['Const_TNC2'].value * 0.5) - - log.info(f"loglike perturbed {m.loglike()}") - - - log.info(f"Unlocked Estimation from iteration number {r.get('iteration_number', 'NO ITER NUM')}") - # final maximize from grid search best, probably minimal improvement from here - r = m.maximize_loglike( - prior_result=r, - return_dashboard=True, - method='SLSQP', - options={'maxiter': 1000}, - ) - log.info(f"Final Estimation at iteration number {r.get('iteration_number', 'NO ITER NUM')}") - - # # holdfast_cache = mods.HBO.pf.holdfast.copy() - # # mu_params = [i for i in mods.HBO.pf.index if 'Mu-' in i] - # # m.pf.loc[mu_params, 'holdfast'] = 1 - # # m.constraint_intensity = 100.0 - # # r = m.maximize_loglike(method='SLSQP', options={'maxiter': 20}, bhhh_start=5, return_dashboard=True) - # # m.pf['holdfast'] = holdfast_cache - # # m.constraint_intensity = 0.0 - # m.maximize_loglike( - # method='SLSQP', - # options={'maxiter':1000}, - # #prior_result=r, - # bhhh_start=5, - # ) - m.calculate_parameter_covariance() - m.to_xlsx( - cached_model_filename(purpose) - ) - summary = m.most_recent_estimation_result.copy() - summary.pop('x', None) - summary.pop('d_loglike', None) - summary.pop('nit', None) - display(larch.util.dictx(summary).__xml__()) - display(m.estimation_statistics()) - _pr = m.probability(return_dataframe='names', include_nests=True) - n_elemental_alts = (n_sampled_dests+1)*len(mode9names) - Pr.ByDest[purpose] = _pr.iloc[:,n_elemental_alts+nests_per_dest-1:-1:nests_per_dest] - Pr.ByMode[purpose] = _pr.iloc[:,:n_elemental_alts] - Pr.ByMode[purpose].columns = pd.MultiIndex.from_product([ - np.arange(n_sampled_dests+1), - mode9names, - ], names=['dest','mode']) - - display(HTML(f"

{m.title}

")) - display(m.parameter_summary()) - - try: - mode_choice_summary_table = mode_choice_summary(m) - except: - log.exception("exception in mode_choice_summary") - mode_choice_summary_success = False - else: - mode_choice_summary_success = True - - try: - dest_profiler(purpose) - except: - log.exception("exception in dest_profiler") - dest_profiler_success = False - else: - dest_profiler_success = True - - try: - mode_share_profiler(purpose) - except: - log.exception("exception in mode_share_profiler") - mode_share_profiler_success = False - else: - mode_share_profiler_success = True - - try: - transit_profiler(purpose) - except: - log.exception("exception in transit_profiler") - transit_profiler_success = False - else: - transit_profiler_success = True - - try: - walk_profiler(purpose) - except: - log.exception("exception in walk_profiler") - walk_profiler_success = False - else: - walk_profiler_success = True - - try: - value_of_time_profiler(purpose) - except: - log.exception("exception in value_of_time_profiler") - value_of_time_profiler_success = False - else: - value_of_time_profiler_success = True - - xl = m.to_xlsx( - cached_model_filereport(purpose), - save_now=False - ) - try: - if dest_profiler_success: - xl.add_content_tab( - figures.distribution[purpose]['auto_dist'], - sheetname="Figures", - heading="Destination Probabilities by Distance", - ) - xl.add_content_tab( - figures.distribution[purpose]['auto_time'], - sheetname="Figures", - heading="Destination Probabilities by Auto Travel Time", - ) - if mode_share_profiler_success: - xl.add_content_tab( - figures.share[purpose]['auto_dist'], - sheetname="Figures", - heading="Mode Choice by Distance", - ) - if mode_choice_summary_success: - xl.add_content_tab( - mode_choice_summary_table, - sheetname="Applied", - heading="Mode Choice Summary", - ) - if transit_profiler_success: - xl.add_content_tab( - figures.TRANSIT_dist[purpose]['auto_dist'], - sheetname="Figures", - heading="Transit Usage by Distance", - ) - xl.add_content_tab( - figures.TRANSIT_dist[purpose]['transit_ivtt'], - sheetname="Figures", - heading="Transit Usage by Transit IVTT", - ) - else: - log.warning("transit_profiler_success is False") - if walk_profiler_success: - xl.add_content_tab( - figures.WALK_dist[purpose]['auto_dist'], - sheetname="Figures", - heading="Total Walking by Distance", - ) - if value_of_time_profiler_success: - xl.add_content_tab( - figures.vot[purpose], - sheetname="Figures", - heading="Value of Time", - ) - finally: - xl.save() - - with open(dh.filenames.choice_model_param_file, 'w', encoding="utf-8") as cmp_yaml: - print("---", file=cmp_yaml) - for purpose in purposes: - print(f"{purpose}:", file=cmp_yaml) - for k, v in mods[purpose].pf.value.items(): - if ':' in k: - k = f'"{k}"' - print(f' {k:24s}: {v}', file=cmp_yaml) - print("", file=cmp_yaml) - print("...", file=cmp_yaml) - - return mods - -resource_usage.check() -L("## est_choice complete ##") diff --git a/src/Mode-Dest-TOD/cmap_modedest/estimation/est_config.py b/src/Mode-Dest-TOD/cmap_modedest/estimation/est_config.py deleted file mode 100644 index c2a3ca9..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/estimation/est_config.py +++ /dev/null @@ -1,137 +0,0 @@ -from ..util import search_path - -## CONFIG ## - -n_sampled_dests = 25 -# The number of destination to sample during estimation -# This has no effect on application, where there is no sampling used. - -EstimationDir = search_path( - "~/Cambridge Systematics/PROJ CMAP Trip-Based - General/Estimation", - "~/OneDrive/Cambridge Systematics/PROJ CMAP Trip-Based - General/Estimation", - "other/possible/path/to/Estimation", -) -# Add local paths to the "Estimation" directory here. -# The contents of this directory itself are not to be published on GitHub - -EstimationSkimsDir = search_path( - "~/LocalGit/cmap-trip-model/Database/emmemat", - "~/Git/cmap-trip-model/Database/emmemat", -) - -############ - - -mode_complete = { - 101:'Walk', - 102:'My own bike', - 103:'Divvy bike', - 104:'Zagster bike', - 201:'Motorcycle/moped', - 202:'Auto / van / truck (as the driver) ', - 203:'Auto / van / truck (as the passenger) ', - 301:'Carpool/vanpool', - 401:'School bus', - 500:'Rail and Bus', - 501:'Bus (CTA, PACE, Huskie Line, Indiana)', - 502:'Dial-a-Ride', - 503:'Call-n-Ride', - 504:'Paratransit', - 505:'Train (CTA, METRA, South Shore Line)', - 506:'Local transit (NIRPC region)', - 509:'Transit (specific mode not reported or imputed)', - 601:'Private shuttle bus', - 701:'Taxi', - 702:'Private limo', - 703:'Private car', - 704:'Uber/Lyft', - 705:'Via/Uber Pool/Lyft Line (shared ride)', - 801:'Airplane', - 997:'[$MODE2_O]', -} - -mode_modeled = { - 101: None, # 'Walk', - 102: None, # 'My own bike', - 103: None, # 'Divvy bike', - 104: None, # 'Zagster bike', - 201: 'AUTO', - 202: 'AUTO', - 203: 'AUTO', - 301: 'AUTO', - 401: None, # 'School bus', - 500: 'TRANSIT', - 501: 'TRANSIT', - 502: None, # 'Dial-a-Ride', - 503: None, # 'Call-n-Ride', - 504: None, # 'Paratransit', - 505: 'TRANSIT', - 506: 'TRANSIT', - 509: 'TRANSIT', - 601: None, # 'Private shuttle bus', - 701: 'TNC', # 'Taxi', - 702: None, # 'Private limo', - 703: None, # 'Private car', - 704: 'TNC', # 'Uber/Lyft', - 705: 'TNC', # 'Via/Uber Pool/Lyft Line (shared ride)', - 801: None, # Airplane - 997: None, # Fill-in-the-blank -} - - -mode_modeled5 = { - 101: None, # 'Walk', - 102: None, # 'My own bike', - 103: None, # 'Divvy bike', - 104: None, # 'Zagster bike', - 201: 'AUTO', - 202: 'AUTO', - 203: 'AUTO', - 301: 'AUTO', - 401: None, # 'School bus', - 500: 'TRANSIT', - 501: 'TRANSIT', - 502: None, # 'Dial-a-Ride', - 503: None, # 'Call-n-Ride', - 504: None, # 'Paratransit', - 505: 'TRANSIT', - 506: 'TRANSIT', - 509: 'TRANSIT', - 601: None, # 'Private shuttle bus', - 701: 'TAXI', # 'Taxi', - 702: None, # 'Private limo', - 703: None, # 'Private car', - 704: 'TNC1', # 'Uber/Lyft', - 705: 'TNC2', # 'Via/Uber Pool/Lyft Line (shared ride)', - 801: None, # Airplane - 997: None, # Fill-in-the-blank -} - - -mode_modeled7 = { - 101: 'WALK', # 'Walk', - 102: 'BIKE', # 'My own bike', - 103: 'BIKE', # 'Divvy bike', - 104: 'BIKE', # 'Zagster bike', - 201: 'AUTO', - 202: 'AUTO', - 203: 'AUTO', - 301: 'AUTO', - 401: None, # 'School bus', - 500: 'TRANSIT', - 501: 'TRANSIT', - 502: None, # 'Dial-a-Ride', - 503: None, # 'Call-n-Ride', - 504: None, # 'Paratransit', - 505: 'TRANSIT', - 506: 'TRANSIT', - 509: 'TRANSIT', - 601: None, # 'Private shuttle bus', - 701: 'TAXI', # 'Taxi', - 702: None, # 'Private limo', - 703: None, # 'Private car', - 704: 'TNC1', # 'Uber/Lyft', - 705: 'TNC2', # 'Via/Uber Pool/Lyft Line (shared ride)', - 801: None, # Airplane - 997: None, # Fill-in-the-blank -} \ No newline at end of file diff --git a/src/Mode-Dest-TOD/cmap_modedest/estimation/est_data.py b/src/Mode-Dest-TOD/cmap_modedest/estimation/est_data.py deleted file mode 100644 index a584775..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/estimation/est_data.py +++ /dev/null @@ -1,25 +0,0 @@ -import os -import cmap_modedest - -from .est_logging import L -from .est_config import EstimationDir, EstimationSkimsDir - -L("###### Set Directories and Prep Data ######") - -from ..data_handlers import DataHandler - - -dh = DataHandler( - emme_database_dir=os.path.join(cmap_modedest.__path__[0], "../tests/data"), - #omx_skims_dir=EstimationDir/"SkimsForEstimation", - cache_dir=EstimationDir/"cache", - zone_shapefile=EstimationDir/"../GIS/From CMAP/zones17.shp", - #emmemat_archive=EstimationDir/"SkimsForEstimation/emmemat.zip", - emmemat_dir=EstimationSkimsDir, - tg_detail=True, -) - -dh.SURVEY_DATA_DIR = EstimationDir/"../HTS/preproc" -dh.AE_DATA_DIR = EstimationDir/"../HTS/cmap-proc" - -L("Data Handlers Ready") diff --git a/src/Mode-Dest-TOD/cmap_modedest/estimation/est_logging.py b/src/Mode-Dest-TOD/cmap_modedest/estimation/est_logging.py deleted file mode 100644 index b240d38..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/estimation/est_logging.py +++ /dev/null @@ -1,13 +0,0 @@ -import cmap_modedest - -log = cmap_modedest.log_to_stderr(level=10) - - -def L(*args): - """Short logging function for estimation""" - if len(args) == 1 and isinstance(args[0], str) and args[0][0] == "#": - log.info(args[0]) - else: - s = "\n".join(str(i) for i in args) - s = "\n"+s - log.info(s.replace("\n", "\n ")) diff --git a/src/Mode-Dest-TOD/cmap_modedest/estimation/est_sample_dest.py b/src/Mode-Dest-TOD/cmap_modedest/estimation/est_sample_dest.py deleted file mode 100644 index 1c78d21..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/estimation/est_sample_dest.py +++ /dev/null @@ -1,270 +0,0 @@ -import numpy as np -import pandas as pd -import cmap_modedest -import sharrow as sh - -from .est_data import dh -skims = dh.skims -aggregate_attractions = np.fmin( - dh.trip_attractions5.sum(1), - np.percentile(dh.trip_attractions5.sum(1), 99.5), -) -zone_shp = dh.zone_shp -m01 = dh.m01 -from ..tnc_costs import taxi_cost, tnc_solo_cost, tnc_pool_cost -from ..purposes import purposes5, purposes3, purposes8, purposesA - -log = cmap_modedest.log_to_stderr(level=10) - - -def default_weighting_by_distance(distances): - return 1 / distances ** 2 - - -def sample_dest_zones(trips, n_zones, n_sampled_dests=20, wgt_func=None): - """ - Sample destinations for a set of origins. - - Parameters - ---------- - trips : DataFrame - n_zones : int - n_sampled_dests : int - wgt_func : callable, optional - This callable takes a 1-d array of distances to candidate - destination zones as input, and returns a same-shape array - of sampling weights. If not provided, the default scheme is - used, see `default_weighting_by_distance`. - - Returns - ------- - trip_alt_dest : array[len(trips), n_sampled_dests] of int - trip_alt_wgts : array[len(trips), n_sampled_dests] of float - trip_obs_wgts : array[len(trips)] of float - """ - if wgt_func is None: - wgt_func = default_weighting_by_distance - trip_alt_dest = np.zeros([len(trips), n_sampled_dests], dtype=np.int32) - trip_alt_wgts = np.zeros([len(trips), n_sampled_dests], dtype=np.float32) - trip_obs_wgts = np.zeros([len(trips)], dtype=np.float32) - for zone_index in range(n_zones): - zone_id = zone_index+1 - trips_from_this_zone = trips['o_zone'] == zone_id - n_trips_from_this_zone = trips_from_this_zone.sum() - if n_trips_from_this_zone == 0: - continue - zone_rgen = np.random.default_rng(zone_id) - from ..skims.names import skim_tags - distances = skims.raw[skim_tags.auto_md_dist].load()[zone_index, :n_zones] - distances[zone_index] = float(np.sqrt(zone_shp.loc[[zone_id]].area)/5280) - #distances = np.fmax(distances, 0.33) - zone_weight = wgt_func(distances).astype(np.float64) - zone_weight *= aggregate_attractions - zone_weight /= zone_weight.sum() - samp_dest = zone_rgen.choice( - n_zones, - size=(n_trips_from_this_zone,n_sampled_dests), - p=zone_weight, - ) - trip_alt_dest[trips_from_this_zone] = samp_dest+1 - trip_alt_wgts[trips_from_this_zone] = zone_weight.values[samp_dest] - trip_obs_wgts[trips_from_this_zone] = zone_weight.values[trips.loc[trips_from_this_zone, 'd_zone']-1] - return trip_alt_dest, trip_alt_wgts, trip_obs_wgts - - -def sample_dest_zones_and_data( - trips, - n_zones, - n_sampled_dests=20, - wgt_func=None, - ozone_col='o_zone', - labeler=lambda i: f'altdest{i + 1:04d}', - keep_trips_cols=(), -): - log.debug("sample_dest_zones()") - trip_alt_dest, trip_alt_wgts, trip_obs_wgts = sample_dest_zones( - trips, n_zones, n_sampled_dests, wgt_func, - ) - - _keep_trips_cols = [] - for k in keep_trips_cols: - if k in trips.columns: - _keep_trips_cols.append(k) - k = f"actualdest_{k}" - if k in trips.columns: - _keep_trips_cols.append(k) - for t in ['PEAK', 'OFFPEAK']: - if f"{k}_{t}" in trips.columns: - _keep_trips_cols.append(f"{k}_{t}") - for purpose in purposesA: - if f"{k}_{purpose}" in trips.columns: - _keep_trips_cols.append(f"{k}_{purpose}") - for purpose3 in purposes3: - if f"{k}_{purpose3}" in trips.columns: - _keep_trips_cols.append(f"{k}_{purpose3}") - - trip_alt_dest_df = trips[[ozone_col, 'in_peak', *_keep_trips_cols]] - - log.debug("trip_alt_dest_df.join()") - trip_alt_dest_df = trip_alt_dest_df.join( - pd.DataFrame( - trip_alt_dest, - index=trips.index, - columns=[labeler(i) for i in range(trip_alt_dest.shape[1])], - ) - ) - trip_alt_dest_df['actualdest_samp_wgt'] = trip_obs_wgts - trip_alt_dest_df = trip_alt_dest_df.join( - pd.DataFrame( - trip_alt_wgts, - index=trips.index, - columns=[f'{labeler(i)}_samp_wgt' for i in range(trip_alt_dest.shape[1])], - ), - ) - - flipY = trips.paFlip - flipN = 1-trips.paFlip - - from .est_survey import attach_selected_skims_sh - for i in range(n_sampled_dests): - - origin_zone = trip_alt_dest_df.o_zone * flipN + trip_alt_dest_df[labeler(i)] * flipY - destin_zone = trip_alt_dest_df.o_zone * flipY + trip_alt_dest_df[labeler(i)] * flipN - - # attach auto skims - log.debug(f"attach auto skims <{i}>") - flow = sh.SharedData( - ['otaz', 'dtaz', 'in_peak'], - skims=dh.skims.raw - ).setup_flow({ - f'{labeler(i)}_auto_time': f'skims.mf44 if in_peak else skims.mf46', - f'{labeler(i)}_auto_dist': f'skims.mf45 if in_peak else skims.mf47', - f'{labeler(i)}_auto_op_dist': 'skims.mf47', - f'{labeler(i)}_auto_time_PEAK': 'skims.mf44', - f'{labeler(i)}_auto_time_hov_PEAK': 'skims.mf76', - f'{labeler(i)}_auto_time_OFFPEAK': 'skims.mf46', - f'{labeler(i)}_auto_dist_PEAK': 'skims.mf45', - f'{labeler(i)}_auto_dist_OFFPEAK': 'skims.mf47', - f'{labeler(i)}_auto_toll_loinc_PEAK': f'skims.mf111', - f'{labeler(i)}_auto_toll_hiinc_PEAK': f'skims.mf114', - f'{labeler(i)}_auto_toll_OFFPEAK': f'skims.mf117', - f'{labeler(i)}_auto_toll_hov_loinc_PEAK': f'skims.mf112', - f'{labeler(i)}_auto_toll_hov_hiinc_PEAK': f'skims.mf115', - f'{labeler(i)}_auto_opcost_PEAK': 'skims.am_opcost', - f'{labeler(i)}_auto_opcost_hov_PEAK': 'skims.am_opcost_hov', - f'{labeler(i)}_auto_opcost_OFFPEAK': 'skims.md_opcost', - }) - auto_cols = flow.load( - trip_alt_dest_df[['o_zone', labeler(i), 'in_peak']].rename( - columns={'o_zone':'otaz', labeler(i):'dtaz'} - ), - as_dataframe=True, - ) - trip_alt_dest_df = pd.concat([trip_alt_dest_df, auto_cols], axis=1) - - # add areatypes - from ..data_handlers.m01_handler import attach_areatypes - trip_alt_dest_df = attach_areatypes(dh, trip_alt_dest_df, labeler(i), '', labeler(i)) # altdest0000_areatype - - # set intrazonal auto_dist - intrazonal = (trip_alt_dest_df['o_zone'] == trip_alt_dest_df[labeler(i)]) - intrazonal_zone_area = dh.zone_shp.loc[trip_alt_dest_df.loc[intrazonal, labeler(i)]].Shape_Area # square feet - intrazonal_dist = np.sqrt(intrazonal_zone_area).to_numpy() / 5280 * 0.667 - trip_alt_dest_df.loc[intrazonal, f'{labeler(i)}_auto_dist_OFFPEAK'] = intrazonal_dist - trip_alt_dest_df.loc[intrazonal, f'{labeler(i)}_auto_dist_PEAK'] = intrazonal_dist - - # set intrazonal auto_time - trip_alt_dest_df.loc[intrazonal, f'{labeler(i)}_auto_time_PEAK'] = ( - trip_alt_dest_df.loc[intrazonal, f'{labeler(i)}_auto_dist_PEAK'] - * 60 / (trip_alt_dest_df.loc[intrazonal, f'{labeler(i)}_areatype'].map( - lambda y: dh.cfg.intrazonal_auto_speed.peak.get(y, 15))) - ) - trip_alt_dest_df.loc[intrazonal, f'{labeler(i)}_auto_time_OFFPEAK'] = ( - trip_alt_dest_df.loc[intrazonal, f'{labeler(i)}_auto_dist_OFFPEAK'] - * 60 / (trip_alt_dest_df.loc[intrazonal, f'{labeler(i)}_areatype'].map( - lambda y: dh.cfg.intrazonal_auto_speed.offpeak.get(y, 15))) - ) - - # Add taxi and TNC wait time data - from ..data_handlers.m01_handler import attach_hired_car_waits - trip_alt_dest_df = attach_hired_car_waits(dh, trip_alt_dest_df, labeler(i), origin_zone) - # Add taxi and TNC fare data - for t in ['PEAK', 'OFFPEAK']: - trip_alt_dest_df[f'{labeler(i)}_taxi_fare_{t}'] = taxi_cost( - dh, - trip_alt_dest_df[f'{labeler(i)}_auto_time_{t}'], - trip_alt_dest_df[f'{labeler(i)}_auto_dist_{t}'], - origin_zone, - destin_zone, - ) - trip_alt_dest_df[f'{labeler(i)}_tnc_solo_fare_{t}'] = tnc_solo_cost( - dh, - trip_alt_dest_df[f'{labeler(i)}_auto_time_{t}'], - trip_alt_dest_df[f'{labeler(i)}_auto_dist_{t}'], - origin_zone, - destin_zone, - 1 if (t=='PEAK') else 0, - ) - trip_alt_dest_df[f'{labeler(i)}_tnc_pool_fare_{t}'] = tnc_pool_cost( - dh, - trip_alt_dest_df[f'{labeler(i)}_auto_time_{t}'], - trip_alt_dest_df[f'{labeler(i)}_auto_dist_{t}'], - origin_zone, - destin_zone, - 1 if (t=='PEAK') else 0, - ) - - # attach transit skims - log.debug(f"attach transit skims <{i}>") - skim_tags = ('ivtt','ovtt','headway','fare','firstmode','prioritymode','lastmode') - - transit_joint = {} - for k in skim_tags: - _pk = dh.skims.transit_pk.col_mapping[k] - _op = dh.skims.transit_op.col_mapping[k] - transit_joint[f'{labeler(i)}_transit_{k}'] = f"skims.{_pk} if in_peak else skims.{_op}" - transit_joint[f'{labeler(i)}_transit_{k}_PEAK'] = f"skims.{_pk}" - transit_joint[f'{labeler(i)}_transit_{k}_OFFPEAK'] = f"skims.{_op}" - flow = sh.SharedData( - ['otaz', 'dtaz', 'in_peak'], - skims=dh.skims.raw - ).setup_flow(transit_joint) - new_cols = flow.load( - trip_alt_dest_df[['o_zone', labeler(i), 'in_peak']].rename(columns={'o_zone':'otaz', labeler(i):'dtaz'}), - as_dataframe=True, - ) - trip_alt_dest_df = pd.concat([trip_alt_dest_df, new_cols], axis=1) - - if np.any(trip_alt_dest_df.isna()): - print(trip_alt_dest_df.isna().sum()) - pass - else: - pass - - # clipping to set invalid skim values to NaN?, facilitates more useful statistics. - log.debug(f"clipping to set invalid skim values to NaN <{i}>") - for j in ['ivtt', 'ovtt', 'headway', 'fare']: - x = trip_alt_dest_df[f'{labeler(i)}_transit_{j}'] - trip_alt_dest_df.loc[x>9999, f'{labeler(i)}_transit_{j}'] = np.nan - for t in ['PEAK', 'OFFPEAK']: - varname = f'{labeler(i)}_transit_{j}_{t}' - x = trip_alt_dest_df[varname] - trip_alt_dest_df.loc[x > 9999, varname] = np.nan - - # parking costs - from ..parking_costs import parking_cost_v2 - from ..purposes import purposes_to_3 - for purpose in purposes5: - _parking_cost, _free_parking = parking_cost_v2( - dh, - destin_zone, - trip_alt_dest_df['hhinc_dollars'], - dh.cfg.default_activity_durations[purposes_to_3[purpose]], - purposes_to_3[purpose], - random_state=hash(purpose) + 1, - ) - trip_alt_dest_df[f'{labeler(i)}_auto_parking_cost_{purpose}'] = _parking_cost - trip_alt_dest_df[f'{labeler(i)}_auto_parking_free_{purpose}'] = _free_parking - - return trip_alt_dest_df - diff --git a/src/Mode-Dest-TOD/cmap_modedest/estimation/est_skims_convol.py b/src/Mode-Dest-TOD/cmap_modedest/estimation/est_skims_convol.py deleted file mode 100644 index d9664a6..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/estimation/est_skims_convol.py +++ /dev/null @@ -1,29 +0,0 @@ -import os - -from .est_logging import L -from .est_data import dh -filenames = dh.filenames - -L("###### Skims Convolution ######") -from cmap_modedest.transit_skim_convolution import skim_convol -emmemat_in_dir = os.path.dirname(filenames.mf822) - -filenames.pk_transit_skims = filenames.cache_dir / "peak.omx" -if not os.path.exists(filenames.pk_transit_skims): - skim_convol( - dh, - peak=True, - ) -else: - L("# using cached peak skims") - -filenames.op_transit_skims = filenames.cache_dir / "offpeak.omx" -if not os.path.exists(filenames.op_transit_skims): - skim_convol( - dh, - peak=False, - ) -else: - L("# using cached offpeak skims") - - diff --git a/src/Mode-Dest-TOD/cmap_modedest/estimation/est_survey.py b/src/Mode-Dest-TOD/cmap_modedest/estimation/est_survey.py deleted file mode 100644 index cec5e4e..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/estimation/est_survey.py +++ /dev/null @@ -1,565 +0,0 @@ -import logging -log = logging.getLogger('CMAP') -import re -from ..addict import Dict - -import pandas as pd -import numpy as np -from os.path import join as pj -from .est_config import mode_modeled, mode_modeled5, mode_modeled7 -from ..incomes import income_levels_1, income_levels_2 -from ..timeperiods import hours_by_timeperiod -from ..purposes import purposes_to_3, purposes5 - -import cmap_modedest -from .est_data import dh -from cmap_modedest.modecodes import ( - N_DIST_TO_TYPES, - DIST_TO_BUS, - DIST_TO_CTA_RAIL, - DIST_TO_METRA, - DIST_TO_FEEDER_BUS, - DIST_TO_PARK_N_RIDE_STATION, -) -from cmap_modedest.transit_approach import N_TRIP_ENDS, transit_approach -cfg = dh.cfg -skims = dh.skims - - -TRIPS_CACHE_FILE = "trips_with_ae_vx24" - -hh = pd.read_csv(dh.SURVEY_DATA_DIR / 'household.csv') -ae = pd.read_csv(dh.AE_DATA_DIR / 'access_egress.csv') - -core_cbd_zones = [ - 1, 2, 3, 4, 5, 6, - 8, 9, 10, 11, 12, 13, - 14, 15, 16, 17, 18, - 20, 21, 22, 23, 24, - 26, 27, 28, 29, 30, - 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, - 43, 44, 45, 46, 47, -] - -trips = dh.filenames.load(TRIPS_CACHE_FILE) -if trips is None: - - trips = pd.read_csv(dh.SURVEY_DATA_DIR / 'trips.csv') - trips.info() - - raw_place = pd.read_csv(dh.SURVEY_DATA_DIR / "../RawData/place.csv") - trips = trips.join( - raw_place[['sampno', 'placeno', 'perno', 'companions']].set_index(['sampno', 'placeno', 'perno']), - on=['sampno', 'placeno', 'perno'] - ) - trips.info() - - # attach tpurp from origin end of trip - trips['previous_placeno'] = trips.placeno - 1 - trips = trips.join( - raw_place - [['sampno', 'placeno', 'perno', 'tpurp']] - .rename(columns={'tpurp': 'previous_tpurp'}) - .set_index(['sampno', 'placeno', 'perno']), - on=['sampno', 'previous_placeno', 'perno'], - ) - trips.info() - - - raw_person = pd.read_csv(dh.SURVEY_DATA_DIR / "../RawData/person.csv") - raw_person["is_adult"] = ((raw_person['age'] >= 18) | (raw_person['aage'] >= 5) | (raw_person['age18'] == 1)) - hhadults = raw_person.groupby("sampno")["is_adult"].sum().rename("hhadults") - trips = trips.join(hhadults, on="sampno") - - from ..modecodes import mode7names, mode9names - - # Convert trips to 3 modes only (auto, transit, tnc), and drop all other trips - trips['mode3'] = trips['mode'].map(mode_modeled).astype('category') - trips['mode5'] = trips['mode'].map(mode_modeled5).astype('category') - trips['mode7'] = trips['mode'].map(mode_modeled7).astype(pd.CategoricalDtype(mode7names)) - trips['mode9'] = trips['mode'].map(mode_modeled7) - trips.loc[(trips.companions == 1) & (trips.mode7 == 'AUTO'),'mode9'] = "HOV2" - trips.loc[(trips.companions >= 2) & (trips.mode7 == 'AUTO'),'mode9'] = "HOV3" - trips['mode9'] = trips['mode9'].astype(pd.CategoricalDtype(mode9names)) - - trips_filter = ~trips['mode9'].isna() - - trips = trips.merge(ae, how='left', on=['sampno', 'perno', 'placeno']) - - # identify home-based other trips that are actually home-based shopping trips - is_HBShop = (trips['tripCat'] == 'HBO') & ( - ( - (trips['previous_tpurp'] == 1) & (trips['tpurp'].isin([8, 9, 10])) - ) | ( - (trips['tpurp'] == 1) & (trips['previous_tpurp'].isin([8, 9, 10])) - ) - ) - trips.loc[is_HBShop, 'tripCat'] = 'HBS' - - oz = 'o_zone' - dz = 'd_zone' - pz = 'p_zone' - az = 'a_zone' - - - # develop production & attraction zones - trips[pz] = trips[oz] - trips[az] = trips[dz] - - flip_pa = (trips['PA'] == 0) - # trips.loc[flip_pa, [pz,az]] = trips.loc[flip_pa, [az,pz]].values - trips_filter &= ~trips[pz].isna() - trips_filter &= ~trips[az].isna() - - # Filter trips based on rules - trips = trips[trips_filter].copy() - - # Convert zone codes to integers - trips[[pz,az,oz,dz]] = trips[[pz,az,oz,dz]].astype(int) - - # Convert tripCat to category - trips['tripCat'] = trips['tripCat'].astype('category') - - trips['tripPurpose'] = trips['tripCat'].map(purposes_to_3) - - # hour_re = re.compile(r'.*\s([0-9]+):[0-9]+:[0-9]+') - # def get_hour(y): - # match = hour_re.match(y) - # if match: - # return int(match.group(1)) - # else: - # return -1 - trips['arrHalfHour'] = np.floor(trips['arrHour']*2)/2 - trips['depHalfHour'] = np.floor(trips['depHour']*2)/2 - trips['in_am_peak'] = trips['depHour'].between(6.5,9.5) | trips['arrHour'].between(6.5,9.5) - trips['in_pm_peak'] = trips['depHour'].between(14.5,19) | trips['arrHour'].between(14.5,19) - trips['in_peak'] = trips['in_am_peak'] | trips['in_pm_peak'] - - trips['timeperiod'] = np.floor(trips.depHour).astype(int).map(hours_by_timeperiod) - - hhinc_dollars = trips.hhinc.map(income_levels_1) - hhinc_dollars = hhinc_dollars.fillna(trips.hhinc2.map(income_levels_2)) - hhinc_dollars = hhinc_dollars.fillna(57_999) - trips['hhinc_dollars'] = hhinc_dollars - - # Append skims to trips - for k, s in skims.items(): - if k not in ('auto', 'transit_pk', 'transit_op'): continue - log.debug(f"adding skims for {k}") - trips_1 = skims.raw[list(s.col_mapping.values())].iat_df( - pd.DataFrame({ - 'otaz': trips[pz] - 1, - 'dtaz': trips[az] - 1, - }) - ) - renames = dict([(value, f"{k}_{key}") for key, value in s.col_mapping.items()]) - trips_2 = trips_1[s.col_mapping.values()].rename(columns=renames) - trips = pd.concat([trips, trips_2], axis=1) - - # Append reverse transit skims to trips - for k, s in skims.items(): - if k not in ('transit_pk', 'transit_op'): continue - log.debug(f"adding reverse skims for {k}") - trips_1 = skims.raw[list(s.col_mapping.values())].iat_df( - pd.DataFrame({ - 'otaz': trips[az] - 1, - 'dtaz': trips[pz] - 1, - }) - ) - renames = dict([(value, f"{k}_{key}_reverse") for key, value in s.col_mapping.items()]) - trips_2 = trips_1[s.col_mapping.values()].rename(columns=renames) - trips = pd.concat([trips, trips_2], axis=1) - - # Match time period skims - peak = trips['in_peak'] - hw = trips['tripPurpose'] == 'HW' - auto_cols = ['time','dist'] - for a in auto_cols: - trips[f'auto_{a}'] = trips[f'auto_md_{a}'] - trips.loc[peak,f'auto_{a}'] = trips.loc[peak,f'auto_am_{a}'] - trips[f'actualdest_auto_{a}'] = trips[f'auto_{a}'] - trips[f'actualdest_auto_{a}_OFFPEAK' ] = trips[f'auto_md_{a}'] - trips[f'actualdest_auto_{a}_PEAK' ] = trips[f'auto_am_{a}'] - - trips[f'actualdest_auto_time_hov_PEAK'] = trips[f'auto_am_time_hov'] - trips[f'actualdest_auto_toll_loinc_PEAK'] = trips[f'auto_am_toll_loinc'] - trips[f'actualdest_auto_toll_hiinc_PEAK'] = trips[f'auto_am_toll_hiinc'] - trips[f'actualdest_auto_toll_OFFPEAK'] = trips[f'auto_md_toll'] - trips[f'actualdest_auto_toll_hov_loinc_PEAK'] = trips[f'auto_am_toll_hov_loinc'] - trips[f'actualdest_auto_toll_hov_hiinc_PEAK'] = trips[f'auto_am_toll_hov_hiinc'] - - trips[f'actualdest_auto_opcost_PEAK'] = trips[f'auto_am_opcost'] - trips[f'actualdest_auto_opcost_hov_PEAK'] = trips[f'auto_am_opcost_hov'] - trips[f'actualdest_auto_opcost_OFFPEAK'] = trips[f'auto_md_opcost'] - - # add areatypes - log.debug(f"attach areatypes") - from ..data_handlers.m01_handler import attach_areatypes - trips = attach_areatypes(dh, trips, 'actualdest', '', 'd_zone') # actualdest_areatype - trips = attach_areatypes(dh, trips, 'ozone', '', 'o_zone') # ozone_areatype - - # set intrazonal auto_dist - log.debug(f"set intrazonal auto_dist") - intrazonal = (trips['o_zone'] == trips['d_zone']) - intrazonal_zone_area = dh.zone_shp.loc[trips.loc[intrazonal, 'o_zone']].Shape_Area # square feet - intra_dist = np.sqrt(intrazonal_zone_area).to_numpy() / 5280 * 0.667 - trips.loc[intrazonal, f'actualdest_auto_dist_OFFPEAK'] = intra_dist - trips.loc[intrazonal, f'actualdest_auto_dist_PEAK'] = intra_dist - - # set intrazonal auto_time - trips.loc[intrazonal, f'actualdest_auto_time_PEAK'] = ( - trips.loc[intrazonal, f'actualdest_auto_dist_PEAK'] - * 60/(trips.loc[intrazonal, 'actualdest_areatype'].map(lambda y: dh.cfg.intrazonal_auto_speed.peak.get(y, 15))) - ) - trips.loc[intrazonal, f'actualdest_auto_time_OFFPEAK'] = ( - trips.loc[intrazonal, f'actualdest_auto_dist_OFFPEAK'] - * 60/(trips.loc[intrazonal, 'actualdest_areatype'].map(lambda y: dh.cfg.intrazonal_auto_speed.offpeak.get(y, 15))) - ) - - transit_cols = ['ivtt','ovtt','headway','fare','firstmode','lastmode','prioritymode'] - for a in transit_cols: - trips[f'transit_{a}'] = trips[f'transit_op_{a}'] - trips.loc[peak,f'transit_{a}'] = trips.loc[peak,f'transit_pk_{a}'] - # convert invalid to nan - to_nan = trips[f'transit_{a}'] >= 9999 - trips.loc[to_nan,f'transit_{a}'] = np.nan - to_nan = trips[f'transit_pk_{a}'] >= 9999 - trips.loc[to_nan,f'transit_pk_{a}'] = np.nan - to_nan = trips[f'transit_op_{a}'] >= 9999 - trips.loc[to_nan,f'transit_op_{a}'] = np.nan - trips[f'actualdest_transit_{a}'] = trips[f'transit_{a}'] - trips[f'actualdest_transit_{a}_OFFPEAK'] = trips[f'transit_op_{a}'] - trips[f'actualdest_transit_{a}_PEAK' ] = trips[f'transit_pk_{a}'] - - # trips = trips.drop([f'auto_am_{a}' for a in auto_cols], axis=1) - # trips = trips.drop([f'auto_md_{a}' for a in auto_cols], axis=1) - # trips = trips.drop([f'transit_pk_{a}' for a in transit_cols], axis=1) - # trips = trips.drop([f'transit_op_{a}' for a in transit_cols], axis=1) - - - # attach transit_approach model data - for t in ['single', 'max', 'mean']: - trips[f'ae_drivetime_{t}'] = 0 - trips[f'ae_walktime_{t}'] = 0 - trips[f'ae_cost_{t}'] = 0 - trips[f'ae_waittime_{t}'] = 0 - - #trips[f'actualdest_auto_parking_cost'] = 0 # Check this is never used - from ..transit_approach import transit_approach - from ..parking_costs import parking_cost_v2 - - for purpose in ['HW','HO','NH']: - # HW gets peak period - # HO gets off-peak period - # NH gets off-peak period AND cannot use park-and-ride - q = (trips.tripPurpose == purpose) - _trips_by_purpose = trips[q] - result_purpose = transit_approach( - dh, - _trips_by_purpose.o_zone, - _trips_by_purpose.d_zone, - purpose, - replication=50, - approach_distances=None, - trace=False, - random_state=hash(purpose), - ) - - for key in ['drivetime', 'walktime', 'cost', 'waittime']: - trips.loc[q, f'ae_{key}_max'] = result_purpose[key].max(1) - trips.loc[q, f'ae_{key}_mean'] = result_purpose[key].mean(1) - trips.loc[q, f'ae_{key}_single'] = result_purpose[key][:,0] - - for purpose in purposes5: - - # Attach parking costs - _parking_cost, _free_parking = parking_cost_v2( - dh, - trips.d_zone, - trips.hhinc_dollars, - cfg.default_activity_durations[purposes_to_3[purpose]], - purposes_to_3[purpose], - random_state=hash(purpose)+1, - ) - trips[f'actualdest_auto_parking_cost_{purpose}'] = _parking_cost - trips[f'actualdest_auto_parking_free_{purpose}'] = _free_parking - - trips[f'actualdest_auto_parking_free_{purpose}'] = trips[f'actualdest_auto_parking_free_{purpose}'].fillna(0) - - # for n in trips.index: - # out = transit_approach( - # trips.o_zone[n], trips.d_zone[n], 'HW' if trips.in_peak[n] else 'HO', replication=50 - # ) - # trips.loc[n, 'ae_drivetime_max'] = out.drivetime.max() - # trips.loc[n, 'ae_walktime_max'] = out.walktime.max() - # trips.loc[n, 'ae_cost_max'] = out.cost.max() - # trips.loc[n, 'ae_waittime_max'] = out.waittime.max() - # trips.loc[n, 'ae_drivetime_mean'] = out.drivetime.mean() - # trips.loc[n, 'ae_walktime_mean'] = out.walktime.mean() - # trips.loc[n, 'ae_cost_mean'] = out.cost.mean() - # trips.loc[n, 'ae_waittime_mean'] = out.waittime.mean() - # trips.loc[n, 'ae_drivetime_single'] = out.drivetime[0] - # trips.loc[n, 'ae_walktime_single'] = out.walktime[0] - # trips.loc[n, 'ae_cost_single'] = out.cost[0] - # trips.loc[n, 'ae_waittime_single'] = out.waittime[0] - - trips['touches_core_cbd'] = trips['o_zone'].isin(core_cbd_zones) | trips['d_zone'].isin(core_cbd_zones) - trips['transit_trip_not_in_skim'] = trips.eval("~(0 < transit_ivtt < 999) and mode3=='TRANSIT'") - trips['crow_distance'] = np.sqrt((trips.X_coord1 - trips.X_coord2)**2 + (trips.Y_coord1 - trips.Y_coord2)**2) / 5280 - - flipY = trips.paFlip - flipN = 1 - trips.paFlip - - trips_origin = trips.o_zone * flipN + trips.d_zone * flipY - - from ..data_handlers.m01_handler import attach_hired_car_waits - - trips = attach_hired_car_waits(dh, trips, 'actualdest', trips_origin) - - # taxi_wait_pk = dh.m01['taxi_wait_pk'] - # taxi_wait_op = dh.m01['taxi_wait_op'] - # trips['actualdest_taxi_wait_time_PEAK'] = trips_origin.map(taxi_wait_pk) - # trips['actualdest_taxi_wait_time_OFFPEAK'] = trips_origin.map(taxi_wait_op) - # trips['actualdest_taxi_wait_time'] = ( - # trips['actualdest_taxi_wait_time_PEAK'] * trips.in_peak - # + trips['actualdest_taxi_wait_time_OFFPEAK'] * ~trips.in_peak - # ) - # - # tnc_solo_wait_pk = dh.m01['tnc_solo_wait_pk'] - # tnc_solo_wait_op = dh.m01['tnc_solo_wait_op'] - # trips['actualdest_tnc_solo_wait_time_PEAK'] = trips_origin.map(tnc_solo_wait_pk) - # trips['actualdest_tnc_solo_wait_time_OFFPEAK'] = trips_origin.map(tnc_solo_wait_op) - # trips['actualdest_tnc_solo_wait_time'] = ( - # trips['actualdest_tnc_solo_wait_time_PEAK'] * trips.in_peak - # + trips['actualdest_tnc_solo_wait_time_OFFPEAK'] * ~trips.in_peak - # ) - # - # tnc_pool_wait_pk = dh.m01['tnc_pool_wait_pk'] - # tnc_pool_wait_op = dh.m01['tnc_pool_wait_op'] - # trips['actualdest_tnc_pool_wait_time_PEAK'] = trips_origin.map(tnc_pool_wait_pk) - # trips['actualdest_tnc_pool_wait_time_OFFPEAK'] = trips_origin.map(tnc_pool_wait_op) - # trips['actualdest_tnc_pool_wait_time'] = ( - # trips['actualdest_tnc_pool_wait_time_PEAK'] * trips.in_peak - # + trips['actualdest_tnc_pool_wait_time_OFFPEAK'] * ~trips.in_peak - # ) - - from ..tnc_costs import tnc_solo_cost, taxi_cost, tnc_pool_cost, peak_tnc_pricing - - for t in ['PEAK', 'OFFPEAK']: - - trips[f'actualdest_taxi_fare_{t}'] = taxi_cost( - dh, - trips[f'actualdest_auto_time_{t}'], - trips[f'actualdest_auto_dist_{t}'], - trips['o_zone'], - trips['d_zone'], - ) - - trips[f'actualdest_tnc_solo_fare_{t}'] = tnc_solo_cost( - dh, - trips[f'actualdest_auto_time_{t}'], - trips[f'actualdest_auto_dist_{t}'], - trips['o_zone'], - trips['d_zone'], - 1 if (t=='PEAK') else 0, - ) - - trips[f'actualdest_tnc_pool_fare_{t}'] = tnc_pool_cost( - dh, - trips[f'actualdest_auto_time_{t}'], - trips[f'actualdest_auto_dist_{t}'], - trips['o_zone'], - trips['d_zone'], - 1 if (t=='PEAK') else 0, - ) - - trips['actualdest'] = trips['d_zone'] - trips['mode3code'] = trips.mode3.cat.codes + 1 - trips['mode5code'] = trips.mode5.cat.codes + 1 - trips['mode7code'] = trips.mode7.cat.codes + 1 - trips['mode9code'] = trips.mode9.cat.codes + 1 - - trips['mode_and_time'] = trips.mode5code + trips.timeperiod * 5 - - dh.filenames.save(TRIPS_CACHE_FILE, trips) - -# columns not compatible with Parquet -trips['crow_distance_q5'] = pd.qcut(trips.crow_distance, 5) - - - -def attach_selected_skims( - od_df, - o_col, - d_col, - omx, - skim_cols, -): - """ - Attach selected columns from an OMX file to a DataFrame. - - Parameters - ---------- - od_df : pandas.DataFrame - o_col, d_col : str - Names of the O and D columns in `od_df`. - omx : OMX - skim_cols : Tuple[str, Dict[str, str]] - Top level keys of this pseudo-dict give filters on `od_df` that - ideally give a mutually exclusive and collectively exhaustive - partition. Top level values are dicts, from which the keys - are the skim columns to pull for this partition group and the - values are the names of the ultimate columns to attach. - Final column value names in all partition groups should be - the same to populate a common set of columns in the output. - - Returns - ------- - pandas.DataFrame - """ - cols_to_add = {} - for filter_qry, use_cols in skim_cols: - for c in use_cols.values(): - if c not in od_df.columns: - cols_to_add[c] = np.nan - df = od_df.assign(**cols_to_add) - for filter_qry, use_cols in skim_cols: - if filter_qry: - group = od_df.query(filter_qry) - else: - group = od_df - s = omx.get_rc_dataframe( - group[o_col] - 1, - group[d_col] - 1, - use_cols, - ) - df.update(s) - return df - - -def attach_selected_skims_sh( - od_df, - o_col, - d_col, - dataset, - skim_cols, -): - """ - Attach selected columns from an OMX file to a DataFrame. - - Parameters - ---------- - od_df : pandas.DataFrame - o_col, d_col : str - Names of the O and D columns in `od_df`. - dataset : sharrow.Dataset - skim_cols : Tuple[str, Dict[str, str]] - Top level keys of this pseudo-dict give filters on `od_df` that - ideally give a mutually exclusive and collectively exhaustive - partition. Top level values are dicts, from which the keys - are the skim columns to pull for this partition group and the - values are the names of the ultimate columns to attach. - Final column value names in all partition groups should be - the same to populate a common set of columns in the output. - - Returns - ------- - pandas.DataFrame - """ - cols_to_add = {} - for filter_qry, use_cols in skim_cols: - for c in use_cols.values(): - if c not in od_df.columns: - cols_to_add[c] = np.nan - df = od_df.assign(**cols_to_add) - for filter_qry, use_cols in skim_cols: - if filter_qry: - group = od_df.query(filter_qry) - else: - group = od_df - s = dataset[list(use_cols.keys())].iat_df(pd.DataFrame(dict( - otaz=group[o_col].values - 1, - dtaz=group[d_col].values - 1, - ))).rename(columns=use_cols) - df.update(s) - return df - -# pMode == 3 -# walk -> DIST_TO_BUS -# -# pMode == 6 -# bus -> DIST_TO_BUS -# walk -> DIST_TO_CTA_RAIL -# pnr -> DIST_TO_PARK_N_RIDE_STATION -# -# pMode == 7 -# bus -> DIST_TO_BUS -# walk -> DIST_TO_METRA -# pnr -> DIST_TO_PARK_N_RIDE_STATION -# feeder -> DIST_TO_FEEDER_BUS - -def ae_approach_los(trips): - approach_distances = np.full([len(trips), N_DIST_TO_TYPES, N_TRIP_ENDS], 999.0) - fm3 = trips.transit_firstmode == 3 - approach_distances[fm3, DIST_TO_BUS, 0] = trips[fm3].walkAccDistance - fm6 = trips.transit_firstmode == 6 - approach_distances[fm6, DIST_TO_BUS, 0] = trips[fm6].busAccDistance - approach_distances[fm6, DIST_TO_CTA_RAIL, 0] = trips[fm6].walkAccDistance - approach_distances[fm6, DIST_TO_PARK_N_RIDE_STATION, 0] = trips[fm6].pnrAccDistance - fm7 = trips.transit_firstmode == 7 - approach_distances[fm7, DIST_TO_BUS, 0] = trips[fm7].busAccDistance - approach_distances[fm7, DIST_TO_METRA, 0] = trips[fm7].walkAccDistance - approach_distances[fm7, DIST_TO_PARK_N_RIDE_STATION, 0] = trips[fm7].pnrAccDistance - approach_distances[fm7, DIST_TO_FEEDER_BUS, 0] = trips[fm7].feederAccDistance - - lm3 = trips.transit_lastmode == 3 - approach_distances[lm3, DIST_TO_BUS, 1] = trips[lm3].walkEgrDistance - lm6 = trips.transit_lastmode == 6 - approach_distances[lm6, DIST_TO_BUS, 1] = trips[lm6].busEgrDistance - approach_distances[lm6, DIST_TO_CTA_RAIL, 1] = trips[lm6].walkEgrDistance - lm7 = trips.transit_lastmode == 7 - approach_distances[lm7, DIST_TO_BUS, 1] = trips[lm7].busEgrDistance - approach_distances[lm7, DIST_TO_METRA, 1] = trips[lm7].walkEgrDistance - - result = Dict() - for peaky in ['PEAK','OFFPEAK']: - # q = (trips.tripPurpose == purpose3) - # _trips_by_purpose = trips[q] - result[peaky] = transit_approach( - dh, - trips.o_zone, - trips.d_zone, - 'HW' if peaky=='PEAK' else 'HO', - replication=1, - approach_distances=approach_distances, - trace=False, - random_state=123, - ) - - for key in ['drivetime', 'walktime', 'cost', 'waittime']: - trips[f'transit_approach_{key}_{peaky}'] = result[peaky][key].reshape(-1) - trips[f'actualdest_transit_approach_{key}_{peaky}'] = result[peaky][key].reshape(-1) - trips[f'transit_approach_acc_mode_{peaky}'] = result[peaky]['approach_mode'][...,0].reshape(-1) - trips[f'transit_approach_egr_mode_{peaky}'] = result[peaky]['approach_mode'][...,1].reshape(-1) - - ad = pd.DataFrame( - approach_distances.reshape([-1, 10]), - columns=[ - 'acc_DIST_TO_BUS', - 'egr_DIST_TO_BUS', - 'acc_DIST_TO_CTA_RAIL', - 'egr_DIST_TO_CTA_RAIL', - 'acc_DIST_TO_METRA', - 'egr_DIST_TO_METRA', - 'acc_DIST_TO_FEEDER_BUS', - 'egr_DIST_TO_FEEDER_BUS', - 'acc_DIST_TO_PARK_N_RIDE_STATION', - 'egr_DIST_TO_PARK_N_RIDE_STATION', - ], - index=trips.index, - ) - for c in ad.columns: - trips[c] = ad[c] - - return approach_distances, result diff --git a/src/Mode-Dest-TOD/cmap_modedest/estimation/est_timeofday.py b/src/Mode-Dest-TOD/cmap_modedest/estimation/est_timeofday.py deleted file mode 100644 index 2bb06f8..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/estimation/est_timeofday.py +++ /dev/null @@ -1,60 +0,0 @@ -import numpy as np -import pandas as pd -from pathlib import Path -from larch.numba import P, X, Model, OMX, DataFrames -# from larch import P, X, Model, OMX, DataFrames -from IPython.display import display, HTML -from larch.util.data_expansion import piecewise_linear - -from ..time_of_day_model import tod_model_builder - -def estimate_tod(dh, mods, to_pickle=True): - cached_todmodel_filename = lambda purpose: dh.filenames.cache_dir / f"choicemodel_{purpose}_timeofday.xlsx" - - tod_models = {} - tod_skims = dh.skims.raw[[f'mf46{j}' for j in range(1,9)]] - - for purpose, mode_dest_model in mods.items(): - co = mode_dest_model.dataservice.data_co.query("mode9 in ('AUTO','HOV2','HOV3','TAXI','TNC1','TNC2')").copy() - co['timeperiod1'] = co['timeperiod'] + 1 - co = co.join( - tod_skims.iat_df( - pd.DataFrame({ - 'otaz': co['o_zone'] - 1, - 'dtaz': co['d_zone'] - 1, - }) - ) - ) - tod_model = tod_model_builder(purpose, data_co=co, ch_name='timeperiod1') - tod_model.estimate() - display(HTML(f"

{tod_model.title}

")) - display(tod_model.parameter_summary()) - display(tod_model.estimation_statistics()) - - xl = tod_model.to_xlsx( - cached_todmodel_filename(purpose), - save_now=True - ) - tod_models[purpose] = tod_model - - if to_pickle: - if to_pickle is True: - to_pickle = dh.filenames.cache_dir / "tod_models.pkl" - import cloudpickle - with open(to_pickle, "wb") as f: - cloudpickle.dump(tod_models, f) - - # save cached parameters - param_yaml_file = dh.filenames.cache_dir / "tod_model_parameters.yaml" - with open(param_yaml_file, 'w', encoding="utf-8") as cmp_yaml: - print("---", file=cmp_yaml) - for purpose in tod_models.keys(): - print(f"{purpose}:", file=cmp_yaml) - for k, v in tod_models[purpose].pf.value.items(): - if ':' in k: - k = f'"{k}"' - print(f' {k:24s}: {v}', file=cmp_yaml) - print("", file=cmp_yaml) - print("...", file=cmp_yaml) - - return tod_models \ No newline at end of file diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__init__.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__init__.py deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/__init__.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/__init__.py deleted file mode 100644 index d81e905..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/__init__.py +++ /dev/null @@ -1,467 +0,0 @@ -import numba -import numpy as np - -from .f_o_zone____dtaz_HXCH5HUPIDPV3EWONWFXBZHM import o_zone____dtaz_HXCH5HUPIDPV3EWONWFXBZHM -from .f_transit_ivtt_PEAK import transit_ivtt_PEAK -from .f_transit_ivtt_OFFPEAK import transit_ivtt_OFFPEAK -from .f_transit_ovtt_PEAK import transit_ovtt_PEAK -from .f_transit_ovtt_OFFPEAK import transit_ovtt_OFFPEAK -from .f_transit_fare_PEAK import transit_fare_PEAK -from .f_transit_fare_OFFPEAK import transit_fare_OFFPEAK -from .f_piece_transit_ivtt_OFFPEAK__None__20__54N5BOFSYCN6SMRBKXM4V4TW import piece_transit_ivtt_OFFPEAK__None__20__54N5BOFSYCN6SMRBKXM4V4TW -from .f_piece_transit_ivtt_OFFPEAK__20__None__2SYXPZCTOY3PKAO2L4ALLHLI import piece_transit_ivtt_OFFPEAK__20__None__2SYXPZCTOY3PKAO2L4ALLHLI -from .f_autopropensity import autopropensity -from .f_auto_time_PEAK import auto_time_PEAK -from .f_auto_dist_PEAK import auto_dist_PEAK -from .f_auto_time_OFFPEAK import auto_time_OFFPEAK -from .f_auto_dist_OFFPEAK import auto_dist_OFFPEAK -from .f_auto_opcost_PEAK import auto_opcost_PEAK -from .f_auto_opcost_hov_PEAK import auto_opcost_hov_PEAK -from .f_auto_opcost_OFFPEAK import auto_opcost_OFFPEAK -from .f_auto_toll_hiinc_PEAK import auto_toll_hiinc_PEAK -from .f_auto_toll_loinc_PEAK import auto_toll_loinc_PEAK -from .f_auto_toll_hov_hiinc_PEAK import auto_toll_hov_hiinc_PEAK -from .f_auto_toll_hov_loinc_PEAK import auto_toll_hov_loinc_PEAK -from .f_auto_toll_OFFPEAK import auto_toll_OFFPEAK -from .f_piece_auto_dist_PEAK_None_0_5__NZ6HG4EJYEENT2OAOBDF3W5W import piece_auto_dist_PEAK_None_0_5__NZ6HG4EJYEENT2OAOBDF3W5W -from .f_piece_auto_dist_PEAK_0_5_1_0__4K5ZPM55FQJVFMWKUPZIQ2ET import piece_auto_dist_PEAK_0_5_1_0__4K5ZPM55FQJVFMWKUPZIQ2ET -from .f_piece_auto_dist_PEAK_1_0_None__FMBHM5APW4TIH6B5EKSKSXYD import piece_auto_dist_PEAK_1_0_None__FMBHM5APW4TIH6B5EKSKSXYD -from .f_piece_auto_dist_PEAK_None_5__7D72ALZRBNSP634JYUY7IV5P import piece_auto_dist_PEAK_None_5__7D72ALZRBNSP634JYUY7IV5P -from .f_piece_auto_dist_PEAK_5_10__DSXTFACXD5HSWU7YKUPQEGAK import piece_auto_dist_PEAK_5_10__DSXTFACXD5HSWU7YKUPQEGAK -from .f_piece_auto_dist_PEAK_10_None__L3GKJNRUTTFCDUYV65K7KFQD import piece_auto_dist_PEAK_10_None__L3GKJNRUTTFCDUYV65K7KFQD -from .f_piece_auto_dist_OFFPEAK_None_0_5__537AWC5AWFXLM3TRB3PPSGYZ import piece_auto_dist_OFFPEAK_None_0_5__537AWC5AWFXLM3TRB3PPSGYZ -from .f_piece_auto_dist_OFFPEAK_0_5_1_0__HZLL3YOGUR763JRQHG7SM6TX import piece_auto_dist_OFFPEAK_0_5_1_0__HZLL3YOGUR763JRQHG7SM6TX -from .f_piece_auto_dist_OFFPEAK_1_0_None__FBK6GF2KEWWDN7AL3ENVH3VS import piece_auto_dist_OFFPEAK_1_0_None__FBK6GF2KEWWDN7AL3ENVH3VS -from .f_piece_auto_dist_OFFPEAK_None_5__YWXA4HRZAVEZKC7EV5M2AX3B import piece_auto_dist_OFFPEAK_None_5__YWXA4HRZAVEZKC7EV5M2AX3B -from .f_piece_auto_dist_OFFPEAK_5_10__5RQTWWGPPCPP6EQU6ZV5MX2R import piece_auto_dist_OFFPEAK_5_10__5RQTWWGPPCPP6EQU6ZV5MX2R -from .f_piece_auto_dist_OFFPEAK_10_None__6EE7X5PWAQKBS6WQUONWVI63 import piece_auto_dist_OFFPEAK_10_None__6EE7X5PWAQKBS6WQUONWVI63 -from .f_taxi_fare_PEAK import taxi_fare_PEAK -from .f_taxi_fare_OFFPEAK import taxi_fare_OFFPEAK -from .f_tnc_solo_fare_PEAK import tnc_solo_fare_PEAK -from .f_tnc_solo_fare_OFFPEAK import tnc_solo_fare_OFFPEAK -from .f_tnc_pool_fare_PEAK import tnc_pool_fare_PEAK -from .f_tnc_pool_fare_OFFPEAK import tnc_pool_fare_OFFPEAK -from .f_taxi_wait_time_PEAK import taxi_wait_time_PEAK -from .f_taxi_wait_time_OFFPEAK import taxi_wait_time_OFFPEAK -from .f_tnc_solo_wait_time_PEAK import tnc_solo_wait_time_PEAK -from .f_tnc_solo_wait_time_OFFPEAK import tnc_solo_wait_time_OFFPEAK -from .f_tnc_pool_wait_time_PEAK import tnc_pool_wait_time_PEAK -from .f_tnc_pool_wait_time_OFFPEAK import tnc_pool_wait_time_OFFPEAK -from .f_taxi_wait_time_PEAK_auto_dist_PEAK_CBYSKDURSGAJ4RHX2ASS76Q2 import taxi_wait_time_PEAK_auto_dist_PEAK_CBYSKDURSGAJ4RHX2ASS76Q2 -from .f_taxi_wait_time_OFFPEAK_auto_dist_OFFPEAK_HC62HOLRZIWJJDAOIFX5XHV6 import taxi_wait_time_OFFPEAK_auto_dist_OFFPEAK_HC62HOLRZIWJJDAOIFX5XHV6 -from .f_tnc_solo_wait_time_PEAK_auto_dist_PEAK_2EZZEATSM4EAHST74DMGSFSS import tnc_solo_wait_time_PEAK_auto_dist_PEAK_2EZZEATSM4EAHST74DMGSFSS -from .f_tnc_solo_wait_time_OFFPEAK_auto_dist_OFFPEAK_CA5RZWRWZJWFNZATH2HHD3TO import tnc_solo_wait_time_OFFPEAK_auto_dist_OFFPEAK_CA5RZWRWZJWFNZATH2HHD3TO -from .f_tnc_pool_wait_time_PEAK_auto_dist_PEAK_NHA453KUTMUKTUCSMA2XQQZV import tnc_pool_wait_time_PEAK_auto_dist_PEAK_NHA453KUTMUKTUCSMA2XQQZV -from .f_tnc_pool_wait_time_OFFPEAK_auto_dist_OFFPEAK_FNBOP5IL57Q6SQM4VB7EXQBB import tnc_pool_wait_time_OFFPEAK_auto_dist_OFFPEAK_FNBOP5IL57Q6SQM4VB7EXQBB -from .f_fmax_ozone_areatype__areatype___1_OWXSNW5EFKHSRO2IUCB6DHTR import fmax_ozone_areatype__areatype___1_OWXSNW5EFKHSRO2IUCB6DHTR -from .f_fmax_ozone_areatype__areatype___2_FIT25FYRGELBEONPX2MTPZFN import fmax_ozone_areatype__areatype___2_FIT25FYRGELBEONPX2MTPZFN -from .f_fmax_ozone_areatype__areatype___3_LIPIKNXA6ZB3PUNRJBVIHATL import fmax_ozone_areatype__areatype___3_LIPIKNXA6ZB3PUNRJBVIHATL -from .f_fmax_ozone_areatype__areatype___4_J3D56DXM2MR6NEMIQ6ALSFID import fmax_ozone_areatype__areatype___4_J3D56DXM2MR6NEMIQ6ALSFID -from .f_fmin_ozone_areatype__areatype___1_OTNZJFEFZT7N3JG6YKEUWGTF import fmin_ozone_areatype__areatype___1_OTNZJFEFZT7N3JG6YKEUWGTF -from .f_fmin_ozone_areatype__areatype___2_FY4D7BMCO2N4QRIA6QIIWTZI import fmin_ozone_areatype__areatype___2_FY4D7BMCO2N4QRIA6QIIWTZI -from .f_fmin_ozone_areatype__areatype___3_34BD5WGYZOPLALWPB2MCWKA7 import fmin_ozone_areatype__areatype___3_34BD5WGYZOPLALWPB2MCWKA7 -from .f_fmin_ozone_areatype__areatype___4_64S6AODYPVZP57LTAC522OHX import fmin_ozone_areatype__areatype___4_64S6AODYPVZP57LTAC522OHX -from .f_log_attractions_HBWH import log_attractions_HBWH -from .f_log_attractions_HBWL import log_attractions_HBWL -from .f_log_attractions_HBS import log_attractions_HBS -from .f_log_attractions_HBO import log_attractions_HBO -from .f_log_attractions_NHB import log_attractions_NHB -from .f_log_attractions_HBWH____666_GW3RKVJQOVET3XE7MYE2MA7V import log_attractions_HBWH____666_GW3RKVJQOVET3XE7MYE2MA7V -from .f_log_attractions_HBWL____666_IQGLCTAX7EZOXKEFCIBK33BD import log_attractions_HBWL____666_IQGLCTAX7EZOXKEFCIBK33BD -from .f_log_attractions_HBS____666_L3ZMVRT365KFSBLEDVABFEGL import log_attractions_HBS____666_L3ZMVRT365KFSBLEDVABFEGL -from .f_log_attractions_HBO____666_5VORECHSLO2A6MKP5I3SGJVQ import log_attractions_HBO____666_5VORECHSLO2A6MKP5I3SGJVQ -from .f_log_attractions_NHB____666_3GFB7KMY3JN5TSJE4MRRR2HM import log_attractions_NHB____666_3GFB7KMY3JN5TSJE4MRRR2HM - - -@numba.jit(cache=True, parallel=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def runner(argarray, inputarray, __attractions__HBO, __attractions__HBS, __attractions__HBWH, __attractions__HBWL, __attractions__NHB, __auto_skims__am_dist, __auto_skims__am_opcost, __auto_skims__am_opcost_hov, __auto_skims__am_time, __auto_skims__am_toll_hiinc, __auto_skims__am_toll_hov_hiinc, __auto_skims__am_toll_hov_loinc, __auto_skims__am_toll_loinc, __auto_skims__md_dist, __auto_skims__md_opcost, __auto_skims__md_time, __auto_skims__md_toll, __d_autopropensity__autopropensity, __dzone__zone_type, __ozone__taxi_wait_op, __ozone__taxi_wait_pk, __ozone__tnc_pool_wait_op, __ozone__tnc_pool_wait_pk, __ozone__tnc_solo_wait_op, __ozone__tnc_solo_wait_pk, __ozone__zone_type, __transit_op__fare, __transit_op__ivtt, __transit_op__ovtt, __transit_pk__fare, __transit_pk__ivtt, __transit_pk__ovtt, dtype=np.float64, min_shape_0=0): - out_size = max(argarray.shape[0], min_shape_0) - if out_size != argarray.shape[0]: - result = np.zeros((out_size, 70), dtype=dtype) - else: - result = np.empty((out_size, 70), dtype=dtype) - if out_size > 1000: - for j in numba.prange(out_size): - result[j, 0] = o_zone____dtaz_HXCH5HUPIDPV3EWONWFXBZHM(argarray[j], inputarray[j], result[j], ) - result[j, 1] = transit_ivtt_PEAK(argarray[j], inputarray[j], result[j], __transit_pk__ivtt) - result[j, 2] = transit_ivtt_OFFPEAK(argarray[j], inputarray[j], result[j], __transit_op__ivtt) - result[j, 3] = transit_ovtt_PEAK(argarray[j], inputarray[j], result[j], __transit_pk__ovtt) - result[j, 4] = transit_ovtt_OFFPEAK(argarray[j], inputarray[j], result[j], __transit_op__ovtt) - result[j, 5] = transit_fare_PEAK(argarray[j], inputarray[j], result[j], __transit_pk__fare) - result[j, 6] = transit_fare_OFFPEAK(argarray[j], inputarray[j], result[j], __transit_op__fare) - result[j, 7] = piece_transit_ivtt_OFFPEAK__None__20__54N5BOFSYCN6SMRBKXM4V4TW(argarray[j], inputarray[j], result[j], ) - result[j, 8] = piece_transit_ivtt_OFFPEAK__20__None__2SYXPZCTOY3PKAO2L4ALLHLI(argarray[j], inputarray[j], result[j], ) - result[j, 9] = autopropensity(argarray[j], inputarray[j], result[j], __d_autopropensity__autopropensity) - result[j, 10] = auto_time_PEAK(argarray[j], inputarray[j], result[j], __auto_skims__am_time) - result[j, 11] = auto_dist_PEAK(argarray[j], inputarray[j], result[j], __auto_skims__am_dist) - result[j, 12] = auto_time_OFFPEAK(argarray[j], inputarray[j], result[j], __auto_skims__md_time) - result[j, 13] = auto_dist_OFFPEAK(argarray[j], inputarray[j], result[j], __auto_skims__md_dist) - result[j, 14] = auto_opcost_PEAK(argarray[j], inputarray[j], result[j], __auto_skims__am_opcost) - result[j, 15] = auto_opcost_hov_PEAK(argarray[j], inputarray[j], result[j], __auto_skims__am_opcost_hov) - result[j, 16] = auto_opcost_OFFPEAK(argarray[j], inputarray[j], result[j], __auto_skims__md_opcost) - result[j, 17] = auto_toll_hiinc_PEAK(argarray[j], inputarray[j], result[j], __auto_skims__am_toll_hiinc) - result[j, 18] = auto_toll_loinc_PEAK(argarray[j], inputarray[j], result[j], __auto_skims__am_toll_loinc) - result[j, 19] = auto_toll_hov_hiinc_PEAK(argarray[j], inputarray[j], result[j], __auto_skims__am_toll_hov_hiinc) - result[j, 20] = auto_toll_hov_loinc_PEAK(argarray[j], inputarray[j], result[j], __auto_skims__am_toll_hov_loinc) - result[j, 21] = auto_toll_OFFPEAK(argarray[j], inputarray[j], result[j], __auto_skims__md_toll) - result[j, 22] = piece_auto_dist_PEAK_None_0_5__NZ6HG4EJYEENT2OAOBDF3W5W(argarray[j], inputarray[j], result[j], __auto_skims__am_dist) - result[j, 23] = piece_auto_dist_PEAK_0_5_1_0__4K5ZPM55FQJVFMWKUPZIQ2ET(argarray[j], inputarray[j], result[j], __auto_skims__am_dist) - result[j, 24] = piece_auto_dist_PEAK_1_0_None__FMBHM5APW4TIH6B5EKSKSXYD(argarray[j], inputarray[j], result[j], __auto_skims__am_dist) - result[j, 25] = piece_auto_dist_PEAK_None_5__7D72ALZRBNSP634JYUY7IV5P(argarray[j], inputarray[j], result[j], __auto_skims__am_dist) - result[j, 26] = piece_auto_dist_PEAK_5_10__DSXTFACXD5HSWU7YKUPQEGAK(argarray[j], inputarray[j], result[j], __auto_skims__am_dist) - result[j, 27] = piece_auto_dist_PEAK_10_None__L3GKJNRUTTFCDUYV65K7KFQD(argarray[j], inputarray[j], result[j], __auto_skims__am_dist) - result[j, 28] = piece_auto_dist_OFFPEAK_None_0_5__537AWC5AWFXLM3TRB3PPSGYZ(argarray[j], inputarray[j], result[j], __auto_skims__md_dist) - result[j, 29] = piece_auto_dist_OFFPEAK_0_5_1_0__HZLL3YOGUR763JRQHG7SM6TX(argarray[j], inputarray[j], result[j], __auto_skims__md_dist) - result[j, 30] = piece_auto_dist_OFFPEAK_1_0_None__FBK6GF2KEWWDN7AL3ENVH3VS(argarray[j], inputarray[j], result[j], __auto_skims__md_dist) - result[j, 31] = piece_auto_dist_OFFPEAK_None_5__YWXA4HRZAVEZKC7EV5M2AX3B(argarray[j], inputarray[j], result[j], __auto_skims__md_dist) - result[j, 32] = piece_auto_dist_OFFPEAK_5_10__5RQTWWGPPCPP6EQU6ZV5MX2R(argarray[j], inputarray[j], result[j], __auto_skims__md_dist) - result[j, 33] = piece_auto_dist_OFFPEAK_10_None__6EE7X5PWAQKBS6WQUONWVI63(argarray[j], inputarray[j], result[j], __auto_skims__md_dist) - result[j, 34] = taxi_fare_PEAK(argarray[j], inputarray[j], result[j], __auto_skims__am_dist, __auto_skims__am_time) - result[j, 35] = taxi_fare_OFFPEAK(argarray[j], inputarray[j], result[j], __auto_skims__md_dist, __auto_skims__md_time) - result[j, 36] = tnc_solo_fare_PEAK(argarray[j], inputarray[j], result[j], __auto_skims__am_dist, __auto_skims__am_time) - result[j, 37] = tnc_solo_fare_OFFPEAK(argarray[j], inputarray[j], result[j], __auto_skims__md_dist, __auto_skims__md_time) - result[j, 38] = tnc_pool_fare_PEAK(argarray[j], inputarray[j], result[j], __auto_skims__am_dist, __auto_skims__am_time) - result[j, 39] = tnc_pool_fare_OFFPEAK(argarray[j], inputarray[j], result[j], __auto_skims__md_dist, __auto_skims__md_time) - result[j, 40] = taxi_wait_time_PEAK(argarray[j], inputarray[j], result[j], __ozone__taxi_wait_pk) - result[j, 41] = taxi_wait_time_OFFPEAK(argarray[j], inputarray[j], result[j], __ozone__taxi_wait_op) - result[j, 42] = tnc_solo_wait_time_PEAK(argarray[j], inputarray[j], result[j], __ozone__tnc_solo_wait_pk) - result[j, 43] = tnc_solo_wait_time_OFFPEAK(argarray[j], inputarray[j], result[j], __ozone__tnc_solo_wait_op) - result[j, 44] = tnc_pool_wait_time_PEAK(argarray[j], inputarray[j], result[j], __ozone__tnc_pool_wait_pk) - result[j, 45] = tnc_pool_wait_time_OFFPEAK(argarray[j], inputarray[j], result[j], __ozone__tnc_pool_wait_op) - result[j, 46] = taxi_wait_time_PEAK_auto_dist_PEAK_CBYSKDURSGAJ4RHX2ASS76Q2(argarray[j], inputarray[j], result[j], __auto_skims__am_dist, __ozone__taxi_wait_pk) - result[j, 47] = taxi_wait_time_OFFPEAK_auto_dist_OFFPEAK_HC62HOLRZIWJJDAOIFX5XHV6(argarray[j], inputarray[j], result[j], __auto_skims__md_dist, __ozone__taxi_wait_op) - result[j, 48] = tnc_solo_wait_time_PEAK_auto_dist_PEAK_2EZZEATSM4EAHST74DMGSFSS(argarray[j], inputarray[j], result[j], __auto_skims__am_dist, __ozone__tnc_solo_wait_pk) - result[j, 49] = tnc_solo_wait_time_OFFPEAK_auto_dist_OFFPEAK_CA5RZWRWZJWFNZATH2HHD3TO(argarray[j], inputarray[j], result[j], __auto_skims__md_dist, __ozone__tnc_solo_wait_op) - result[j, 50] = tnc_pool_wait_time_PEAK_auto_dist_PEAK_NHA453KUTMUKTUCSMA2XQQZV(argarray[j], inputarray[j], result[j], __auto_skims__am_dist, __ozone__tnc_pool_wait_pk) - result[j, 51] = tnc_pool_wait_time_OFFPEAK_auto_dist_OFFPEAK_FNBOP5IL57Q6SQM4VB7EXQBB(argarray[j], inputarray[j], result[j], __auto_skims__md_dist, __ozone__tnc_pool_wait_op) - result[j, 52] = fmax_ozone_areatype__areatype___1_OWXSNW5EFKHSRO2IUCB6DHTR(argarray[j], inputarray[j], result[j], __dzone__zone_type, __ozone__zone_type) - result[j, 53] = fmax_ozone_areatype__areatype___2_FIT25FYRGELBEONPX2MTPZFN(argarray[j], inputarray[j], result[j], __dzone__zone_type, __ozone__zone_type) - result[j, 54] = fmax_ozone_areatype__areatype___3_LIPIKNXA6ZB3PUNRJBVIHATL(argarray[j], inputarray[j], result[j], __dzone__zone_type, __ozone__zone_type) - result[j, 55] = fmax_ozone_areatype__areatype___4_J3D56DXM2MR6NEMIQ6ALSFID(argarray[j], inputarray[j], result[j], __dzone__zone_type, __ozone__zone_type) - result[j, 56] = fmin_ozone_areatype__areatype___1_OTNZJFEFZT7N3JG6YKEUWGTF(argarray[j], inputarray[j], result[j], __dzone__zone_type, __ozone__zone_type) - result[j, 57] = fmin_ozone_areatype__areatype___2_FY4D7BMCO2N4QRIA6QIIWTZI(argarray[j], inputarray[j], result[j], __dzone__zone_type, __ozone__zone_type) - result[j, 58] = fmin_ozone_areatype__areatype___3_34BD5WGYZOPLALWPB2MCWKA7(argarray[j], inputarray[j], result[j], __dzone__zone_type, __ozone__zone_type) - result[j, 59] = fmin_ozone_areatype__areatype___4_64S6AODYPVZP57LTAC522OHX(argarray[j], inputarray[j], result[j], __dzone__zone_type, __ozone__zone_type) - result[j, 60] = log_attractions_HBWH(argarray[j], inputarray[j], result[j], __attractions__HBWH) - result[j, 61] = log_attractions_HBWL(argarray[j], inputarray[j], result[j], __attractions__HBWL) - result[j, 62] = log_attractions_HBS(argarray[j], inputarray[j], result[j], __attractions__HBS) - result[j, 63] = log_attractions_HBO(argarray[j], inputarray[j], result[j], __attractions__HBO) - result[j, 64] = log_attractions_NHB(argarray[j], inputarray[j], result[j], __attractions__NHB) - result[j, 65] = log_attractions_HBWH____666_GW3RKVJQOVET3XE7MYE2MA7V(argarray[j], inputarray[j], result[j], __attractions__HBWH) - result[j, 66] = log_attractions_HBWL____666_IQGLCTAX7EZOXKEFCIBK33BD(argarray[j], inputarray[j], result[j], __attractions__HBWL) - result[j, 67] = log_attractions_HBS____666_L3ZMVRT365KFSBLEDVABFEGL(argarray[j], inputarray[j], result[j], __attractions__HBS) - result[j, 68] = log_attractions_HBO____666_5VORECHSLO2A6MKP5I3SGJVQ(argarray[j], inputarray[j], result[j], __attractions__HBO) - result[j, 69] = log_attractions_NHB____666_3GFB7KMY3JN5TSJE4MRRR2HM(argarray[j], inputarray[j], result[j], __attractions__NHB) - else: - for j in range(out_size): - result[j, 0] = o_zone____dtaz_HXCH5HUPIDPV3EWONWFXBZHM(argarray[j], inputarray[j], result[j], ) - result[j, 1] = transit_ivtt_PEAK(argarray[j], inputarray[j], result[j], __transit_pk__ivtt) - result[j, 2] = transit_ivtt_OFFPEAK(argarray[j], inputarray[j], result[j], __transit_op__ivtt) - result[j, 3] = transit_ovtt_PEAK(argarray[j], inputarray[j], result[j], __transit_pk__ovtt) - result[j, 4] = transit_ovtt_OFFPEAK(argarray[j], inputarray[j], result[j], __transit_op__ovtt) - result[j, 5] = transit_fare_PEAK(argarray[j], inputarray[j], result[j], __transit_pk__fare) - result[j, 6] = transit_fare_OFFPEAK(argarray[j], inputarray[j], result[j], __transit_op__fare) - result[j, 7] = piece_transit_ivtt_OFFPEAK__None__20__54N5BOFSYCN6SMRBKXM4V4TW(argarray[j], inputarray[j], result[j], ) - result[j, 8] = piece_transit_ivtt_OFFPEAK__20__None__2SYXPZCTOY3PKAO2L4ALLHLI(argarray[j], inputarray[j], result[j], ) - result[j, 9] = autopropensity(argarray[j], inputarray[j], result[j], __d_autopropensity__autopropensity) - result[j, 10] = auto_time_PEAK(argarray[j], inputarray[j], result[j], __auto_skims__am_time) - result[j, 11] = auto_dist_PEAK(argarray[j], inputarray[j], result[j], __auto_skims__am_dist) - result[j, 12] = auto_time_OFFPEAK(argarray[j], inputarray[j], result[j], __auto_skims__md_time) - result[j, 13] = auto_dist_OFFPEAK(argarray[j], inputarray[j], result[j], __auto_skims__md_dist) - result[j, 14] = auto_opcost_PEAK(argarray[j], inputarray[j], result[j], __auto_skims__am_opcost) - result[j, 15] = auto_opcost_hov_PEAK(argarray[j], inputarray[j], result[j], __auto_skims__am_opcost_hov) - result[j, 16] = auto_opcost_OFFPEAK(argarray[j], inputarray[j], result[j], __auto_skims__md_opcost) - result[j, 17] = auto_toll_hiinc_PEAK(argarray[j], inputarray[j], result[j], __auto_skims__am_toll_hiinc) - result[j, 18] = auto_toll_loinc_PEAK(argarray[j], inputarray[j], result[j], __auto_skims__am_toll_loinc) - result[j, 19] = auto_toll_hov_hiinc_PEAK(argarray[j], inputarray[j], result[j], __auto_skims__am_toll_hov_hiinc) - result[j, 20] = auto_toll_hov_loinc_PEAK(argarray[j], inputarray[j], result[j], __auto_skims__am_toll_hov_loinc) - result[j, 21] = auto_toll_OFFPEAK(argarray[j], inputarray[j], result[j], __auto_skims__md_toll) - result[j, 22] = piece_auto_dist_PEAK_None_0_5__NZ6HG4EJYEENT2OAOBDF3W5W(argarray[j], inputarray[j], result[j], __auto_skims__am_dist) - result[j, 23] = piece_auto_dist_PEAK_0_5_1_0__4K5ZPM55FQJVFMWKUPZIQ2ET(argarray[j], inputarray[j], result[j], __auto_skims__am_dist) - result[j, 24] = piece_auto_dist_PEAK_1_0_None__FMBHM5APW4TIH6B5EKSKSXYD(argarray[j], inputarray[j], result[j], __auto_skims__am_dist) - result[j, 25] = piece_auto_dist_PEAK_None_5__7D72ALZRBNSP634JYUY7IV5P(argarray[j], inputarray[j], result[j], __auto_skims__am_dist) - result[j, 26] = piece_auto_dist_PEAK_5_10__DSXTFACXD5HSWU7YKUPQEGAK(argarray[j], inputarray[j], result[j], __auto_skims__am_dist) - result[j, 27] = piece_auto_dist_PEAK_10_None__L3GKJNRUTTFCDUYV65K7KFQD(argarray[j], inputarray[j], result[j], __auto_skims__am_dist) - result[j, 28] = piece_auto_dist_OFFPEAK_None_0_5__537AWC5AWFXLM3TRB3PPSGYZ(argarray[j], inputarray[j], result[j], __auto_skims__md_dist) - result[j, 29] = piece_auto_dist_OFFPEAK_0_5_1_0__HZLL3YOGUR763JRQHG7SM6TX(argarray[j], inputarray[j], result[j], __auto_skims__md_dist) - result[j, 30] = piece_auto_dist_OFFPEAK_1_0_None__FBK6GF2KEWWDN7AL3ENVH3VS(argarray[j], inputarray[j], result[j], __auto_skims__md_dist) - result[j, 31] = piece_auto_dist_OFFPEAK_None_5__YWXA4HRZAVEZKC7EV5M2AX3B(argarray[j], inputarray[j], result[j], __auto_skims__md_dist) - result[j, 32] = piece_auto_dist_OFFPEAK_5_10__5RQTWWGPPCPP6EQU6ZV5MX2R(argarray[j], inputarray[j], result[j], __auto_skims__md_dist) - result[j, 33] = piece_auto_dist_OFFPEAK_10_None__6EE7X5PWAQKBS6WQUONWVI63(argarray[j], inputarray[j], result[j], __auto_skims__md_dist) - result[j, 34] = taxi_fare_PEAK(argarray[j], inputarray[j], result[j], __auto_skims__am_dist, __auto_skims__am_time) - result[j, 35] = taxi_fare_OFFPEAK(argarray[j], inputarray[j], result[j], __auto_skims__md_dist, __auto_skims__md_time) - result[j, 36] = tnc_solo_fare_PEAK(argarray[j], inputarray[j], result[j], __auto_skims__am_dist, __auto_skims__am_time) - result[j, 37] = tnc_solo_fare_OFFPEAK(argarray[j], inputarray[j], result[j], __auto_skims__md_dist, __auto_skims__md_time) - result[j, 38] = tnc_pool_fare_PEAK(argarray[j], inputarray[j], result[j], __auto_skims__am_dist, __auto_skims__am_time) - result[j, 39] = tnc_pool_fare_OFFPEAK(argarray[j], inputarray[j], result[j], __auto_skims__md_dist, __auto_skims__md_time) - result[j, 40] = taxi_wait_time_PEAK(argarray[j], inputarray[j], result[j], __ozone__taxi_wait_pk) - result[j, 41] = taxi_wait_time_OFFPEAK(argarray[j], inputarray[j], result[j], __ozone__taxi_wait_op) - result[j, 42] = tnc_solo_wait_time_PEAK(argarray[j], inputarray[j], result[j], __ozone__tnc_solo_wait_pk) - result[j, 43] = tnc_solo_wait_time_OFFPEAK(argarray[j], inputarray[j], result[j], __ozone__tnc_solo_wait_op) - result[j, 44] = tnc_pool_wait_time_PEAK(argarray[j], inputarray[j], result[j], __ozone__tnc_pool_wait_pk) - result[j, 45] = tnc_pool_wait_time_OFFPEAK(argarray[j], inputarray[j], result[j], __ozone__tnc_pool_wait_op) - result[j, 46] = taxi_wait_time_PEAK_auto_dist_PEAK_CBYSKDURSGAJ4RHX2ASS76Q2(argarray[j], inputarray[j], result[j], __auto_skims__am_dist, __ozone__taxi_wait_pk) - result[j, 47] = taxi_wait_time_OFFPEAK_auto_dist_OFFPEAK_HC62HOLRZIWJJDAOIFX5XHV6(argarray[j], inputarray[j], result[j], __auto_skims__md_dist, __ozone__taxi_wait_op) - result[j, 48] = tnc_solo_wait_time_PEAK_auto_dist_PEAK_2EZZEATSM4EAHST74DMGSFSS(argarray[j], inputarray[j], result[j], __auto_skims__am_dist, __ozone__tnc_solo_wait_pk) - result[j, 49] = tnc_solo_wait_time_OFFPEAK_auto_dist_OFFPEAK_CA5RZWRWZJWFNZATH2HHD3TO(argarray[j], inputarray[j], result[j], __auto_skims__md_dist, __ozone__tnc_solo_wait_op) - result[j, 50] = tnc_pool_wait_time_PEAK_auto_dist_PEAK_NHA453KUTMUKTUCSMA2XQQZV(argarray[j], inputarray[j], result[j], __auto_skims__am_dist, __ozone__tnc_pool_wait_pk) - result[j, 51] = tnc_pool_wait_time_OFFPEAK_auto_dist_OFFPEAK_FNBOP5IL57Q6SQM4VB7EXQBB(argarray[j], inputarray[j], result[j], __auto_skims__md_dist, __ozone__tnc_pool_wait_op) - result[j, 52] = fmax_ozone_areatype__areatype___1_OWXSNW5EFKHSRO2IUCB6DHTR(argarray[j], inputarray[j], result[j], __dzone__zone_type, __ozone__zone_type) - result[j, 53] = fmax_ozone_areatype__areatype___2_FIT25FYRGELBEONPX2MTPZFN(argarray[j], inputarray[j], result[j], __dzone__zone_type, __ozone__zone_type) - result[j, 54] = fmax_ozone_areatype__areatype___3_LIPIKNXA6ZB3PUNRJBVIHATL(argarray[j], inputarray[j], result[j], __dzone__zone_type, __ozone__zone_type) - result[j, 55] = fmax_ozone_areatype__areatype___4_J3D56DXM2MR6NEMIQ6ALSFID(argarray[j], inputarray[j], result[j], __dzone__zone_type, __ozone__zone_type) - result[j, 56] = fmin_ozone_areatype__areatype___1_OTNZJFEFZT7N3JG6YKEUWGTF(argarray[j], inputarray[j], result[j], __dzone__zone_type, __ozone__zone_type) - result[j, 57] = fmin_ozone_areatype__areatype___2_FY4D7BMCO2N4QRIA6QIIWTZI(argarray[j], inputarray[j], result[j], __dzone__zone_type, __ozone__zone_type) - result[j, 58] = fmin_ozone_areatype__areatype___3_34BD5WGYZOPLALWPB2MCWKA7(argarray[j], inputarray[j], result[j], __dzone__zone_type, __ozone__zone_type) - result[j, 59] = fmin_ozone_areatype__areatype___4_64S6AODYPVZP57LTAC522OHX(argarray[j], inputarray[j], result[j], __dzone__zone_type, __ozone__zone_type) - result[j, 60] = log_attractions_HBWH(argarray[j], inputarray[j], result[j], __attractions__HBWH) - result[j, 61] = log_attractions_HBWL(argarray[j], inputarray[j], result[j], __attractions__HBWL) - result[j, 62] = log_attractions_HBS(argarray[j], inputarray[j], result[j], __attractions__HBS) - result[j, 63] = log_attractions_HBO(argarray[j], inputarray[j], result[j], __attractions__HBO) - result[j, 64] = log_attractions_NHB(argarray[j], inputarray[j], result[j], __attractions__NHB) - result[j, 65] = log_attractions_HBWH____666_GW3RKVJQOVET3XE7MYE2MA7V(argarray[j], inputarray[j], result[j], __attractions__HBWH) - result[j, 66] = log_attractions_HBWL____666_IQGLCTAX7EZOXKEFCIBK33BD(argarray[j], inputarray[j], result[j], __attractions__HBWL) - result[j, 67] = log_attractions_HBS____666_L3ZMVRT365KFSBLEDVABFEGL(argarray[j], inputarray[j], result[j], __attractions__HBS) - result[j, 68] = log_attractions_HBO____666_5VORECHSLO2A6MKP5I3SGJVQ(argarray[j], inputarray[j], result[j], __attractions__HBO) - result[j, 69] = log_attractions_NHB____666_3GFB7KMY3JN5TSJE4MRRR2HM(argarray[j], inputarray[j], result[j], __attractions__NHB) - return result - -def _map_index(dim_name, values): - raise KeyError(dim_name) - - -def set_shared_data(transit_pk, transit_op, auto_skims, ozone, dzone, attractions, o_autopropensity, d_autopropensity): - global name_space - name_space = {} - name_space['__transit_pk__ivtt'] = transit_pk['ivtt'] - name_space['__transit_pk__ovtt'] = transit_pk['ovtt'] - name_space['__transit_pk__headway'] = transit_pk['headway'] - name_space['__transit_pk__fare'] = transit_pk['fare'] - name_space['__transit_pk__firstmode'] = transit_pk['firstmode'] - name_space['__transit_pk__prioritymode'] = transit_pk['prioritymode'] - name_space['__transit_pk__lastmode'] = transit_pk['lastmode'] - name_space['__transit_op__ivtt'] = transit_op['ivtt'] - name_space['__transit_op__ovtt'] = transit_op['ovtt'] - name_space['__transit_op__headway'] = transit_op['headway'] - name_space['__transit_op__fare'] = transit_op['fare'] - name_space['__transit_op__firstmode'] = transit_op['firstmode'] - name_space['__transit_op__prioritymode'] = transit_op['prioritymode'] - name_space['__transit_op__lastmode'] = transit_op['lastmode'] - name_space['__auto_skims__am_time'] = auto_skims['am_time'] - name_space['__auto_skims__am_dist'] = auto_skims['am_dist'] - name_space['__auto_skims__am_toll_loinc'] = auto_skims['am_toll_loinc'] - name_space['__auto_skims__am_toll_hiinc'] = auto_skims['am_toll_hiinc'] - name_space['__auto_skims__md_time'] = auto_skims['md_time'] - name_space['__auto_skims__md_dist'] = auto_skims['md_dist'] - name_space['__auto_skims__md_toll'] = auto_skims['md_toll'] - name_space['__auto_skims__am_time_hov'] = auto_skims['am_time_hov'] - name_space['__auto_skims__am_dist_hov'] = auto_skims['am_dist_hov'] - name_space['__auto_skims__am_toll_hov_loinc'] = auto_skims['am_toll_hov_loinc'] - name_space['__auto_skims__am_toll_hov_hiinc'] = auto_skims['am_toll_hov_hiinc'] - name_space['__auto_skims__am_opcost'] = auto_skims['am_opcost'] - name_space['__auto_skims__am_opcost_hov'] = auto_skims['am_opcost_hov'] - name_space['__auto_skims__md_opcost'] = auto_skims['md_opcost'] - name_space['__ozone__zone_type'] = ozone['zone_type'] - name_space['__ozone__pnr_parking_cost'] = ozone['pnr_parking_cost'] - name_space['__ozone__zone_income'] = ozone['zone_income'] - name_space['__ozone__pnr_flag'] = ozone['pnr_flag'] - name_space['__ozone__first_wait_bus_peak'] = ozone['first_wait_bus_peak'] - name_space['__ozone__first_wait_bus_offpeak'] = ozone['first_wait_bus_offpeak'] - name_space['__ozone__first_wait_feeder_peak'] = ozone['first_wait_feeder_peak'] - name_space['__ozone__first_wait_feeder_offpeak'] = ozone['first_wait_feeder_offpeak'] - name_space['__ozone__autocc'] = ozone['autocc'] - name_space['__ozone__taxi_wait_pk'] = ozone['taxi_wait_pk'] - name_space['__ozone__taxi_wait_op'] = ozone['taxi_wait_op'] - name_space['__ozone__tnc_solo_wait_pk'] = ozone['tnc_solo_wait_pk'] - name_space['__ozone__tnc_solo_wait_op'] = ozone['tnc_solo_wait_op'] - name_space['__ozone__tnc_pool_wait_pk'] = ozone['tnc_pool_wait_pk'] - name_space['__ozone__tnc_pool_wait_op'] = ozone['tnc_pool_wait_op'] - name_space['__dzone__zone_type'] = dzone['zone_type'] - name_space['__dzone__pnr_parking_cost'] = dzone['pnr_parking_cost'] - name_space['__dzone__zone_income'] = dzone['zone_income'] - name_space['__dzone__pnr_flag'] = dzone['pnr_flag'] - name_space['__dzone__first_wait_bus_peak'] = dzone['first_wait_bus_peak'] - name_space['__dzone__first_wait_bus_offpeak'] = dzone['first_wait_bus_offpeak'] - name_space['__dzone__first_wait_feeder_peak'] = dzone['first_wait_feeder_peak'] - name_space['__dzone__first_wait_feeder_offpeak'] = dzone['first_wait_feeder_offpeak'] - name_space['__dzone__autocc'] = dzone['autocc'] - name_space['__dzone__taxi_wait_pk'] = dzone['taxi_wait_pk'] - name_space['__dzone__taxi_wait_op'] = dzone['taxi_wait_op'] - name_space['__dzone__tnc_solo_wait_pk'] = dzone['tnc_solo_wait_pk'] - name_space['__dzone__tnc_solo_wait_op'] = dzone['tnc_solo_wait_op'] - name_space['__dzone__tnc_pool_wait_pk'] = dzone['tnc_pool_wait_pk'] - name_space['__dzone__tnc_pool_wait_op'] = dzone['tnc_pool_wait_op'] - name_space['__attractions__HBO'] = attractions['HBO'] - name_space['__attractions__HBS'] = attractions['HBS'] - name_space['__attractions__HBWH'] = attractions['HBWH'] - name_space['__attractions__HBWL'] = attractions['HBWL'] - name_space['__attractions__NHB'] = attractions['NHB'] - name_space['__o_autopropensity__autopropensity'] = o_autopropensity['autopropensity'] - name_space['__d_autopropensity__autopropensity'] = d_autopropensity['autopropensity'] - - -meta_match_names_idx = {'otaz_idx': 0, 'dtaz_idx': 1} - - -import numpy as np -import numba as nb -import pandas as pd -import pyarrow as pa -import xarray as xr -import sharrow as sh -import inspect -import warnings -from contextlib import suppress - - - - -def load_raw(args, inputs, name_space, runner, dtype=None): - with warnings.catch_warnings(): - warnings.filterwarnings('ignore', category=nb.NumbaExperimentalFeatureWarning) - if len(args): - assembled_args = np.stack(args).T - else: - assembled_args = None - if len(inputs): - assembled_inputs = np.stack(inputs).T - else: - assembled_inputs = np.empty([assembled_args.shape[0], 0], dtype=np.float32) - if assembled_args is None: - assembled_args = np.empty([assembled_inputs.shape[0], 0], dtype=np.float32) - try: - named_args = ['__attractions__HBO', '__attractions__HBS', '__attractions__HBWH', '__attractions__HBWL', '__attractions__NHB', '__auto_skims__am_dist', '__auto_skims__am_opcost', '__auto_skims__am_opcost_hov', '__auto_skims__am_time', '__auto_skims__am_toll_hiinc', '__auto_skims__am_toll_hov_hiinc', '__auto_skims__am_toll_hov_loinc', '__auto_skims__am_toll_loinc', '__auto_skims__md_dist', '__auto_skims__md_opcost', '__auto_skims__md_time', '__auto_skims__md_toll', '__d_autopropensity__autopropensity', '__dzone__zone_type', '__ozone__taxi_wait_op', '__ozone__taxi_wait_pk', '__ozone__tnc_pool_wait_op', '__ozone__tnc_pool_wait_pk', '__ozone__tnc_solo_wait_op', '__ozone__tnc_solo_wait_pk', '__ozone__zone_type', '__transit_op__fare', '__transit_op__ivtt', '__transit_op__ovtt', '__transit_pk__fare', '__transit_pk__ivtt', '__transit_pk__ovtt'] - arguments = [] - for arg in named_args: - next_arg = name_space[arg] - if isinstance(next_arg, xr.DataArray): - next_arg = next_arg.load() - arguments.append(np.asarray(next_arg)) - if dtype is not None: - return runner(assembled_args, assembled_inputs, *arguments, dtype=dtype) - else: - return runner(assembled_args, assembled_inputs, *arguments) - except nb.TypingError: - raise - except KeyError as err: - # raise the inner key error which is more helpful - context = getattr(err, "__context__", None) - if context: - raise context - else: - raise err - - -def load( - source, - as_dataframe=False, - as_table=False, - dtype=None, -): - if source is None: - raise ValueError("no base table or source table") - indexes = _get_indexes(source)[0] - inputs = _get_inputs(source) - result = load_raw(indexes, inputs, name_space, runner=runner, dtype=dtype) - if as_dataframe: - index = getattr(source, 'index', None) - return pd.DataFrame(result, index=index, columns=function_names) - elif as_table: - return pa.table({k: result[:, n] for n, k in enumerate(function_names)}) - return result - - -def merge(source, dtype=None): - """ - Merge the data created by this flow into the source. - - Parameters - ---------- - source : Dataset or Table or DataFrame - dtype : str or dtype - The loaded data will be generated with this dtype. - - Returns - ------- - merged : Dataset or Table or DataFrame - The same data type as `source` is returned. - """ - assert isinstance(source, (xr.Dataset, pa.Table, pd.DataFrame, sh.Table)) - new_cols = load(source, dtype=dtype) - if isinstance(source, (pa.Table, sh.Table)): - for n, k in enumerate(function_names): - source = source.append_column(k, [new_cols[:, n]]) - else: - for n, k in enumerate(function_names): - source[k] = new_cols[:, n] - return source - - -def _get_indexes(source_table, cache_dynamic_indexes=None): - if cache_dynamic_indexes is None: - cache_dynamic_indexes = True - - def geti(i): - nonlocal source_table - if i is not None: - try: - return np.asarray(source_table[i]) - except KeyError: - if i[:10] == '__dynamic_': - if "@" in i: - i_complete = i - i, i_from = i.split("@", 1) - else: - i_complete = i - i_from = i[10:] - index_to_map = None - with suppress(KeyError): - index_to_map = source_table[i_from] - if index_to_map is None: - if isinstance(source_table, pd.DataFrame): - if i_from == "index" and source_table.index.names == [None]: - index_to_map = source_table.index - elif i_from in source_table.index.names: - index_to_map = source_table.index.get_level_values(i_from) - if index_to_map is None: - raise KeyError(i_complete) - indexed_vals = _map_index(i[10:], index_to_map) - if cache_dynamic_indexes: - if isinstance(source_table, (pa.Table)): - source_table = source_table.append_column(i_complete, [indexed_vals]) - else: - source_table[i_complete] = indexed_vals - return indexed_vals - else: - idx = getattr(source_table, 'index', None) - if idx is not None: - if i in idx.names: - return np.asarray(idx.get_level_values(i)) - if i == 'index' and len(idx.names)==1: - return np.asarray(idx) - raise - else: - return np.arange(source_table.shape[0]) - index_keys = meta_match_names_idx.keys() - return tuple(geti(i) for i in index_keys), source_table - - -def _get_inputs(source_table, dtype=np.float32): - input_keys = input_name_positions.keys() - return tuple( - np.asarray(source_table[i], dtype=dtype) - for i in input_keys - ) - - - -input_name_positions = {'dtaz': 0, 'otaz': 1} -function_names = ['o_zone == dtaz', 'transit_ivtt_PEAK', 'transit_ivtt_OFFPEAK', 'transit_ovtt_PEAK', 'transit_ovtt_OFFPEAK', 'transit_fare_PEAK', 'transit_fare_OFFPEAK', 'piece(transit_ivtt_OFFPEAK, None, 20)', 'piece(transit_ivtt_OFFPEAK, 20, None)', 'autopropensity', 'auto_time_PEAK', 'auto_dist_PEAK', 'auto_time_OFFPEAK', 'auto_dist_OFFPEAK', 'auto_opcost_PEAK', 'auto_opcost_hov_PEAK', 'auto_opcost_OFFPEAK', 'auto_toll_hiinc_PEAK', 'auto_toll_loinc_PEAK', 'auto_toll_hov_hiinc_PEAK', 'auto_toll_hov_loinc_PEAK', 'auto_toll_OFFPEAK', 'piece(auto_dist_PEAK,None,0.5)', 'piece(auto_dist_PEAK,0.5,1.0)', 'piece(auto_dist_PEAK,1.0,None)', 'piece(auto_dist_PEAK,None,5)', 'piece(auto_dist_PEAK,5,10)', 'piece(auto_dist_PEAK,10,None)', 'piece(auto_dist_OFFPEAK,None,0.5)', 'piece(auto_dist_OFFPEAK,0.5,1.0)', 'piece(auto_dist_OFFPEAK,1.0,None)', 'piece(auto_dist_OFFPEAK,None,5)', 'piece(auto_dist_OFFPEAK,5,10)', 'piece(auto_dist_OFFPEAK,10,None)', 'taxi_fare_PEAK', 'taxi_fare_OFFPEAK', 'tnc_solo_fare_PEAK', 'tnc_solo_fare_OFFPEAK', 'tnc_pool_fare_PEAK', 'tnc_pool_fare_OFFPEAK', 'taxi_wait_time_PEAK', 'taxi_wait_time_OFFPEAK', 'tnc_solo_wait_time_PEAK', 'tnc_solo_wait_time_OFFPEAK', 'tnc_pool_wait_time_PEAK', 'tnc_pool_wait_time_OFFPEAK', 'taxi_wait_time_PEAK/auto_dist_PEAK', 'taxi_wait_time_OFFPEAK/auto_dist_OFFPEAK', 'tnc_solo_wait_time_PEAK/auto_dist_PEAK', 'tnc_solo_wait_time_OFFPEAK/auto_dist_OFFPEAK', 'tnc_pool_wait_time_PEAK/auto_dist_PEAK', 'tnc_pool_wait_time_OFFPEAK/auto_dist_OFFPEAK', 'fmax(ozone_areatype, areatype)==1', 'fmax(ozone_areatype, areatype)==2', 'fmax(ozone_areatype, areatype)==3', 'fmax(ozone_areatype, areatype)==4', 'fmin(ozone_areatype, areatype)==1', 'fmin(ozone_areatype, areatype)==2', 'fmin(ozone_areatype, areatype)==3', 'fmin(ozone_areatype, areatype)==4', 'log_attractions_HBWH', 'log_attractions_HBWL', 'log_attractions_HBS', 'log_attractions_HBO', 'log_attractions_NHB', 'log_attractions_HBWH > -666', 'log_attractions_HBWL > -666', 'log_attractions_HBS > -666', 'log_attractions_HBO > -666', 'log_attractions_NHB > -666'] - -# Greetings, tinkerer! The `defs_hash` included here is a safety -# measure to prevent unknowing users creating a mess by modifying -# the code in this module so that it no longer matches the expected -# variable definitions. If you want to modify this code, you should -# delete this hash to allow the code to run without any checks, but -# you do so at your own risk. -defs_hash = 'XUCQEOOTEO3UREF2YYT73XUJ24======' diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/__init__.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/__init__.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/extra_funcs.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/extra_funcs.py deleted file mode 100644 index 4a2efbf..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/extra_funcs.py +++ /dev/null @@ -1,6 +0,0 @@ -import numba -import numpy as np -import pickle - -taxi_cost = pickle.loads(b'\x80\x05\x95\x17\x05\x00\x00\x00\x00\x00\x00\x8c\x14numba.core.serialize\x94\x8c\x0ecustom_rebuild\x94\x93\x94h\x00\x8c\x18_unpickle__CustomPickled\x94\x93\x94B\xbf\x04\x00\x00\x80\x04\x95\xb4\x04\x00\x00\x00\x00\x00\x00\x8c\x13numba.core.registry\x94\x8c\rCPUDispatcher\x94\x93\x94}\x94(\x8c\x04uuid\x94\x8c$6003875c-d52d-11eb-8449-acde48001122\x94\x8c\x07py_func\x94\x8c\x14numba.core.serialize\x94\x8c\x11_rebuild_function\x94\x93\x94(K\x04C\x04a\r\r\n\x94B"\x03\x00\x00\xe3\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x03\x00\x00\x00C\x00\x00\x00s^\x00\x00\x00|\x04j\x00|\x00|\x04j\x01\x14\x00\x17\x00|\x01|\x04j\x02\x14\x00\x17\x00}\x05|\x04j\x03rZd\x01}\x06t\x04|\x04j\x05j\x06\x83\x01D\x00]\x1a}\x07|\x04j\x05|\x07\x19\x00|\x02k\x02r0d\x02}\x06\x01\x00qLq0|\x06rZ|\x05|\x04j\x037\x00}\x05|\x05S\x00)\x03\xe1U\x01\x00\x00\n Compute taxi fare.\n\n A single set of rates (Chicago medallion rates for in-city trips)\n is used; fares for taxi trips outside Chicago are close to this\n rate and rare enough that more precision is unneeded.\n\n Parameters\n ----------\n auto_time, auto_dist : array-like\n\n Returns\n -------\n fare : array-like\n FT)\x07\xda\tflag_pull\xda\nper_minute\xda\x08per_mile\xda\x12airport_pickup_fee\xda\x05range\xda\x14airport_pickup_zones\xda\x04size)\x08\xda\tauto_time\xda\tauto_dist\xda\x06o_zone\xda\x06d_zone\xda\x10taxi_cost_struct\xda\x04cost\xda\x0ebucket_applies\xda\x01i\xa9\x00r\x11\x00\x00\x00\xfa`/Users/jeffnewman/LocalGit/cmap_trip-based_model/src/Mode-Dest-TOD/cmap_modedest/fast/tnc_los.py\xda\ttaxi_cost \x00\x00\x00s\x1e\x00\x00\x00\x00\x12\x04\x01\x08\xff\x02\x02\x08\xfe\x02\xff\x02\x05\x06\x01\x04\x01\x10\x01\x0e\x01\x04\x01\x06\x01\x04\x01\n\x02\x94\x87\x94}\x94(\x8c\x05range\x94\x8c\x08builtins\x94\x8c\x05range\x94\x93\x94\x8c\x08__name__\x94\x8c\x1acmap_modedest.fast.tnc_los\x94u\x8c\ttaxi_cost\x94NNt\x94R\x94h\x07\x8c\x12_function_setstate\x94\x93\x94h\x16}\x94\x8c\x05cells\x94)s\x86R0\x8c\x06locals\x94}\x94\x8c\rtargetoptions\x94}\x94(\x8c\x08nopython\x94\x88\x8c\x0bboundscheck\x94Nu\x8c\timpl_kind\x94\x8c\x06direct\x94\x8c\x0bcan_compile\x94\x88\x8c\x04sigs\x94]\x94u\x86\x94.\x94\x85\x94R\x94\x85\x94R\x94.') -tnc_cost = pickle.loads(b'\x80\x05\x95\xf2\x05\x00\x00\x00\x00\x00\x00\x8c\x14numba.core.serialize\x94\x8c\x0ecustom_rebuild\x94\x93\x94h\x00\x8c\x18_unpickle__CustomPickled\x94\x93\x94B\x9a\x05\x00\x00\x80\x04\x95\x8f\x05\x00\x00\x00\x00\x00\x00\x8c\x13numba.core.registry\x94\x8c\rCPUDispatcher\x94\x93\x94}\x94(\x8c\x04uuid\x94\x8c$60039bfc-d52d-11eb-8449-acde48001122\x94\x8c\x07py_func\x94\x8c\x14numba.core.serialize\x94\x8c\x11_rebuild_function\x94\x93\x94(K\x04C\x04a\r\r\n\x94B\xe5\x03\x00\x00\xe3\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x03\x00\x00\x00C\x00\x00\x00s\xcc\x00\x00\x00|\x04j\x00|\x00\x14\x00|\x04j\x01|\x01\x14\x00\x17\x00|\x04j\x02\x17\x00}\x05t\x03|\x05|\x04j\x04\x83\x02|\x04j\x05\x17\x00}\x05|\x04j\x06rzd\x01}\x06t\x07|\x04j\x08j\t\x83\x01D\x00](}\x07|\x04j\x08|\x07\x19\x00|\x02k\x02sb|\x04j\x08|\x07\x19\x00|\x03k\x02rBd\x02}\x06\x01\x00qlqB|\x06rz|\x05|\x04j\x067\x00}\x05|\x04j\nr\xc8d\x01}\x06t\x07|\x04j\x0bj\t\x83\x01D\x00](}\x07|\x04j\x0b|\x07\x19\x00|\x02k\x02s\xb0|\x04j\x0b|\x07\x19\x00|\x03k\x02r\x90d\x02}\x06\x01\x00q\xbaq\x90|\x06r\xc8|\x05|\x04j\n7\x00}\x05|\x05S\x00)\x03\xe1n\x01\x00\x00\n Compute the TNC cost.\n\n Parameters\n ----------\n auto_time, auto_dist : float\n The auto travel time and distance for a set of trips.\n o_zone, d_zone : int\n Zone numbers for origin and destination\n tnc_cost_struct : TncCostStruct\n Use the correct struct for peak/offpeak and solo/shared.\n\n Returns\n -------\n float\n FT)\x0c\xda\nper_minute\xda\x08per_mile\xda\tbase_fare\xda\x03max\xda\x08min_fare\xda\x0bbooking_fee\xda\x0bspecial_fee\xda\x05range\xda\rspecial_zones\xda\x04size\xda\x0cdowntown_fee\xda\x0edowntown_zones)\x08\xda\tauto_time\xda\tauto_dist\xda\x06o_zone\xda\x06d_zone\xda\x0ftnc_cost_struct\xda\x04cost\xda\x0ebucket_applies\xda\x01i\xa9\x00r\x16\x00\x00\x00\xfa`/Users/jeffnewman/LocalGit/cmap_trip-based_model/src/Mode-Dest-TOD/cmap_modedest/fast/tnc_los.py\xda\x08tnc_costA\x00\x00\x00s0\x00\x00\x00\x00\x13\x08\x01\x08\xff\x02\x02\x04\xfe\x02\xff\x02\x05\x12\x02\x06\x01\x04\x01\x10\x01\x1c\x01\x04\x01\x06\x01\x04\x01\n\x02\x06\x01\x04\x01\x10\x01\x1c\x01\x04\x01\x06\x01\x04\x01\n\x02\x94\x87\x94}\x94(\x8c\x03max\x94\x8c\x08builtins\x94\x8c\x03max\x94\x93\x94\x8c\x05range\x94\x8c\x08builtins\x94\x8c\x05range\x94\x93\x94\x8c\x08__name__\x94\x8c\x1acmap_modedest.fast.tnc_los\x94u\x8c\x08tnc_cost\x94NNt\x94R\x94h\x07\x8c\x12_function_setstate\x94\x93\x94h\x1a}\x94\x8c\x05cells\x94)s\x86R0\x8c\x06locals\x94}\x94\x8c\rtargetoptions\x94}\x94(\x8c\x08nopython\x94\x88\x8c\x0bboundscheck\x94Nu\x8c\timpl_kind\x94\x8c\x06direct\x94\x8c\x0bcan_compile\x94\x88\x8c\x04sigs\x94]\x94u\x86\x94.\x94\x85\x94R\x94\x85\x94R\x94.') diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/extra_funcs.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/extra_funcs.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/extra_vars.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/extra_vars.py deleted file mode 100644 index 4f90f20..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/extra_vars.py +++ /dev/null @@ -1,7 +0,0 @@ -import pickle - -taxi_cost_struct = pickle.loads(b'\x80\x05\x95\xd9\x00\x00\x00\x00\x00\x00\x00\x8c\x1acmap_modedest.fast.tnc_los\x94\x8c\x0eTaxiCostStruct\x94\x93\x94(ME\x01G@D\xd5`A\x897LK\xe1M\x90\x01\x8c\x12numpy.core.numeric\x94\x8c\x0b_frombuffer\x94\x93\x94(\x96 \x00\x00\x00\x00\x00\x00\x00}\x00\x00\x00\x00\x00\x00\x00~\x00\x00\x00\x00\x00\x00\x00\xee\x01\x00\x00\x00\x00\x00\x00\xf3\x01\x00\x00\x00\x00\x00\x00\x94\x8c\x05numpy\x94\x8c\x05dtype\x94\x93\x94\x8c\x02i8\x94\x89\x88\x87\x94R\x94(K\x03\x8c\x01<\x94NNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00t\x94bK\x04\x85\x94\x8c\x01C\x94t\x94R\x94t\x94\x81\x94.') -tnc_solo_peak_struct = pickle.loads(b'\x80\x05\x95\xd1\x02\x00\x00\x00\x00\x00\x00\x8c\x1acmap_modedest.fast.tnc_los\x94\x8c\rTncCostStruct\x94\x93\x94(K\x88K\x1cKmM\xe5\x01M\x01\x01M\xf4\x01K\x00\x8c\x12numpy.core.numeric\x94\x8c\x0b_frombuffer\x94\x93\x94(\x968\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00}\x00\x00\x00\x00\x00\x00\x00~\x00\x00\x00\x00\x00\x00\x00\xee\x01\x00\x00\x00\x00\x00\x00\xf3\x01\x00\x00\x00\x00\x00\x00p\x00\x00\x00\x00\x00\x00\x00q\x00\x00\x00\x00\x00\x00\x00\x94\x8c\x05numpy\x94\x8c\x05dtype\x94\x93\x94\x8c\x02i8\x94\x89\x88\x87\x94R\x94(K\x03\x8c\x01<\x94NNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00t\x94bK\x07\x85\x94\x8c\x01C\x94t\x94R\x94h\x05(\x96\xc8\x01\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\x00\x00"\x00\x00\x00\x00\x00\x00\x00#\x00\x00\x00\x00\x00\x00\x00$\x00\x00\x00\x00\x00\x00\x00%\x00\x00\x00\x00\x00\x00\x00&\x00\x00\x00\x00\x00\x00\x00\'\x00\x00\x00\x00\x00\x00\x00(\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00\x00\x00\x00\x00*\x00\x00\x00\x00\x00\x00\x00+\x00\x00\x00\x00\x00\x00\x00,\x00\x00\x00\x00\x00\x00\x00-\x00\x00\x00\x00\x00\x00\x00.\x00\x00\x00\x00\x00\x00\x00/\x00\x00\x00\x00\x00\x00\x001\x00\x00\x00\x00\x00\x00\x002\x00\x00\x00\x00\x00\x00\x003\x00\x00\x00\x00\x00\x00\x004\x00\x00\x00\x00\x00\x00\x007\x00\x00\x00\x00\x00\x00\x008\x00\x00\x00\x00\x00\x00\x009\x00\x00\x00\x00\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00=\x00\x00\x00\x00\x00\x00\x00>\x00\x00\x00\x00\x00\x00\x00?\x00\x00\x00\x00\x00\x00\x00\x94h\x0cK9\x85\x94h\x10t\x94R\x94t\x94\x81\x94.') -tnc_solo_offpeak_struct = pickle.loads(b'\x80\x05\x95\xd1\x02\x00\x00\x00\x00\x00\x00\x8c\x1acmap_modedest.fast.tnc_los\x94\x8c\rTncCostStruct\x94\x93\x94(K\x88K\x1cKmM\xe5\x01M\x01\x01M\xf4\x01K\x00\x8c\x12numpy.core.numeric\x94\x8c\x0b_frombuffer\x94\x93\x94(\x968\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00}\x00\x00\x00\x00\x00\x00\x00~\x00\x00\x00\x00\x00\x00\x00\xee\x01\x00\x00\x00\x00\x00\x00\xf3\x01\x00\x00\x00\x00\x00\x00p\x00\x00\x00\x00\x00\x00\x00q\x00\x00\x00\x00\x00\x00\x00\x94\x8c\x05numpy\x94\x8c\x05dtype\x94\x93\x94\x8c\x02i8\x94\x89\x88\x87\x94R\x94(K\x03\x8c\x01<\x94NNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00t\x94bK\x07\x85\x94\x8c\x01C\x94t\x94R\x94h\x05(\x96\xc8\x01\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\x00\x00"\x00\x00\x00\x00\x00\x00\x00#\x00\x00\x00\x00\x00\x00\x00$\x00\x00\x00\x00\x00\x00\x00%\x00\x00\x00\x00\x00\x00\x00&\x00\x00\x00\x00\x00\x00\x00\'\x00\x00\x00\x00\x00\x00\x00(\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00\x00\x00\x00\x00*\x00\x00\x00\x00\x00\x00\x00+\x00\x00\x00\x00\x00\x00\x00,\x00\x00\x00\x00\x00\x00\x00-\x00\x00\x00\x00\x00\x00\x00.\x00\x00\x00\x00\x00\x00\x00/\x00\x00\x00\x00\x00\x00\x001\x00\x00\x00\x00\x00\x00\x002\x00\x00\x00\x00\x00\x00\x003\x00\x00\x00\x00\x00\x00\x004\x00\x00\x00\x00\x00\x00\x007\x00\x00\x00\x00\x00\x00\x008\x00\x00\x00\x00\x00\x00\x009\x00\x00\x00\x00\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00=\x00\x00\x00\x00\x00\x00\x00>\x00\x00\x00\x00\x00\x00\x00?\x00\x00\x00\x00\x00\x00\x00\x94h\x0cK9\x85\x94h\x10t\x94R\x94t\x94\x81\x94.') -tnc_pool_peak_struct = pickle.loads(b'\x80\x05\x95\xd0\x02\x00\x00\x00\x00\x00\x00\x8c\x1acmap_modedest.fast.tnc_los\x94\x8c\rTncCostStruct\x94\x93\x94(KDK\x00KjK\x00M\x01\x01M\xf4\x01K\x00\x8c\x12numpy.core.numeric\x94\x8c\x0b_frombuffer\x94\x93\x94(\x968\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00}\x00\x00\x00\x00\x00\x00\x00~\x00\x00\x00\x00\x00\x00\x00\xee\x01\x00\x00\x00\x00\x00\x00\xf3\x01\x00\x00\x00\x00\x00\x00p\x00\x00\x00\x00\x00\x00\x00q\x00\x00\x00\x00\x00\x00\x00\x94\x8c\x05numpy\x94\x8c\x05dtype\x94\x93\x94\x8c\x02i8\x94\x89\x88\x87\x94R\x94(K\x03\x8c\x01<\x94NNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00t\x94bK\x07\x85\x94\x8c\x01C\x94t\x94R\x94h\x05(\x96\xc8\x01\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\x00\x00"\x00\x00\x00\x00\x00\x00\x00#\x00\x00\x00\x00\x00\x00\x00$\x00\x00\x00\x00\x00\x00\x00%\x00\x00\x00\x00\x00\x00\x00&\x00\x00\x00\x00\x00\x00\x00\'\x00\x00\x00\x00\x00\x00\x00(\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00\x00\x00\x00\x00*\x00\x00\x00\x00\x00\x00\x00+\x00\x00\x00\x00\x00\x00\x00,\x00\x00\x00\x00\x00\x00\x00-\x00\x00\x00\x00\x00\x00\x00.\x00\x00\x00\x00\x00\x00\x00/\x00\x00\x00\x00\x00\x00\x001\x00\x00\x00\x00\x00\x00\x002\x00\x00\x00\x00\x00\x00\x003\x00\x00\x00\x00\x00\x00\x004\x00\x00\x00\x00\x00\x00\x007\x00\x00\x00\x00\x00\x00\x008\x00\x00\x00\x00\x00\x00\x009\x00\x00\x00\x00\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00=\x00\x00\x00\x00\x00\x00\x00>\x00\x00\x00\x00\x00\x00\x00?\x00\x00\x00\x00\x00\x00\x00\x94h\x0cK9\x85\x94h\x10t\x94R\x94t\x94\x81\x94.') -tnc_pool_offpeak_struct = pickle.loads(b'\x80\x05\x95\xd0\x02\x00\x00\x00\x00\x00\x00\x8c\x1acmap_modedest.fast.tnc_los\x94\x8c\rTncCostStruct\x94\x93\x94(KDK\x00KjK\x00M\x01\x01M\xf4\x01K\x00\x8c\x12numpy.core.numeric\x94\x8c\x0b_frombuffer\x94\x93\x94(\x968\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00}\x00\x00\x00\x00\x00\x00\x00~\x00\x00\x00\x00\x00\x00\x00\xee\x01\x00\x00\x00\x00\x00\x00\xf3\x01\x00\x00\x00\x00\x00\x00p\x00\x00\x00\x00\x00\x00\x00q\x00\x00\x00\x00\x00\x00\x00\x94\x8c\x05numpy\x94\x8c\x05dtype\x94\x93\x94\x8c\x02i8\x94\x89\x88\x87\x94R\x94(K\x03\x8c\x01<\x94NNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00t\x94bK\x07\x85\x94\x8c\x01C\x94t\x94R\x94h\x05(\x96\xc8\x01\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\x00\x00"\x00\x00\x00\x00\x00\x00\x00#\x00\x00\x00\x00\x00\x00\x00$\x00\x00\x00\x00\x00\x00\x00%\x00\x00\x00\x00\x00\x00\x00&\x00\x00\x00\x00\x00\x00\x00\'\x00\x00\x00\x00\x00\x00\x00(\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00\x00\x00\x00\x00*\x00\x00\x00\x00\x00\x00\x00+\x00\x00\x00\x00\x00\x00\x00,\x00\x00\x00\x00\x00\x00\x00-\x00\x00\x00\x00\x00\x00\x00.\x00\x00\x00\x00\x00\x00\x00/\x00\x00\x00\x00\x00\x00\x001\x00\x00\x00\x00\x00\x00\x002\x00\x00\x00\x00\x00\x00\x003\x00\x00\x00\x00\x00\x00\x004\x00\x00\x00\x00\x00\x00\x007\x00\x00\x00\x00\x00\x00\x008\x00\x00\x00\x00\x00\x00\x009\x00\x00\x00\x00\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00=\x00\x00\x00\x00\x00\x00\x00>\x00\x00\x00\x00\x00\x00\x00?\x00\x00\x00\x00\x00\x00\x00\x94h\x0cK9\x85\x94h\x10t\x94R\x94t\x94\x81\x94.') diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/extra_vars.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/extra_vars.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_dist_OFFPEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_dist_OFFPEAK.py deleted file mode 100644 index a50153a..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_dist_OFFPEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def auto_dist_OFFPEAK( - _args, - _inputs, - _outputs, - __auto_skims__md_dist -): - return __auto_skims__md_dist[_args[0], _args[1]] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_dist_OFFPEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_dist_OFFPEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_dist_PEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_dist_PEAK.py deleted file mode 100644 index 53e50be..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_dist_PEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def auto_dist_PEAK( - _args, - _inputs, - _outputs, - __auto_skims__am_dist -): - return __auto_skims__am_dist[_args[0], _args[1]] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_dist_PEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_dist_PEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_opcost_OFFPEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_opcost_OFFPEAK.py deleted file mode 100644 index 4107f13..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_opcost_OFFPEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def auto_opcost_OFFPEAK( - _args, - _inputs, - _outputs, - __auto_skims__md_opcost -): - return __auto_skims__md_opcost[_args[0], _args[1]] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_opcost_OFFPEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_opcost_OFFPEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_opcost_PEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_opcost_PEAK.py deleted file mode 100644 index 043d805..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_opcost_PEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def auto_opcost_PEAK( - _args, - _inputs, - _outputs, - __auto_skims__am_opcost -): - return __auto_skims__am_opcost[_args[0], _args[1]] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_opcost_PEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_opcost_PEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_opcost_hov_PEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_opcost_hov_PEAK.py deleted file mode 100644 index 3cb9fcc..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_opcost_hov_PEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def auto_opcost_hov_PEAK( - _args, - _inputs, - _outputs, - __auto_skims__am_opcost_hov -): - return __auto_skims__am_opcost_hov[_args[0], _args[1]] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_opcost_hov_PEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_opcost_hov_PEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_time_OFFPEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_time_OFFPEAK.py deleted file mode 100644 index fcface8..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_time_OFFPEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def auto_time_OFFPEAK( - _args, - _inputs, - _outputs, - __auto_skims__md_time -): - return __auto_skims__md_time[_args[0], _args[1]] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_time_OFFPEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_time_OFFPEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_time_PEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_time_PEAK.py deleted file mode 100644 index 308ec21..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_time_PEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def auto_time_PEAK( - _args, - _inputs, - _outputs, - __auto_skims__am_time -): - return __auto_skims__am_time[_args[0], _args[1]] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_time_PEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_time_PEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_OFFPEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_OFFPEAK.py deleted file mode 100644 index c169b1c..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_OFFPEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def auto_toll_OFFPEAK( - _args, - _inputs, - _outputs, - __auto_skims__md_toll -): - return np.fmax(__auto_skims__md_toll[_args[0], _args[1]], 0) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_OFFPEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_OFFPEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_hiinc_PEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_hiinc_PEAK.py deleted file mode 100644 index 61d7089..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_hiinc_PEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def auto_toll_hiinc_PEAK( - _args, - _inputs, - _outputs, - __auto_skims__am_toll_hiinc -): - return np.fmax(__auto_skims__am_toll_hiinc[_args[0], _args[1]], 0) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_hiinc_PEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_hiinc_PEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_hov_hiinc_PEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_hov_hiinc_PEAK.py deleted file mode 100644 index d77ec33..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_hov_hiinc_PEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def auto_toll_hov_hiinc_PEAK( - _args, - _inputs, - _outputs, - __auto_skims__am_toll_hov_hiinc -): - return np.fmax(__auto_skims__am_toll_hov_hiinc[_args[0], _args[1]], 0) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_hov_hiinc_PEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_hov_hiinc_PEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_hov_loinc_PEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_hov_loinc_PEAK.py deleted file mode 100644 index 22c7941..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_hov_loinc_PEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def auto_toll_hov_loinc_PEAK( - _args, - _inputs, - _outputs, - __auto_skims__am_toll_hov_loinc -): - return np.fmax(__auto_skims__am_toll_hov_loinc[_args[0], _args[1]], 0) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_hov_loinc_PEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_hov_loinc_PEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_loinc_PEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_loinc_PEAK.py deleted file mode 100644 index bda3b6a..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_loinc_PEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def auto_toll_loinc_PEAK( - _args, - _inputs, - _outputs, - __auto_skims__am_toll_loinc -): - return np.fmax(__auto_skims__am_toll_loinc[_args[0], _args[1]], 0) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_loinc_PEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_loinc_PEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_autopropensity.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_autopropensity.py deleted file mode 100644 index 26d0d4d..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_autopropensity.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def autopropensity( - _args, - _inputs, - _outputs, - __d_autopropensity__autopropensity -): - return __d_autopropensity__autopropensity[_args[1],] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_autopropensity.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_autopropensity.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___1_OWXSNW5EFKHSRO2IUCB6DHTR.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___1_OWXSNW5EFKHSRO2IUCB6DHTR.py deleted file mode 100644 index 78cb643..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___1_OWXSNW5EFKHSRO2IUCB6DHTR.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def fmax_ozone_areatype__areatype___1_OWXSNW5EFKHSRO2IUCB6DHTR( - _args, - _inputs, - _outputs, - __dzone__zone_type, __ozone__zone_type -): - return max(__ozone__zone_type[_args[0],], __dzone__zone_type[_args[1],]) == 1 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___1_OWXSNW5EFKHSRO2IUCB6DHTR.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___1_OWXSNW5EFKHSRO2IUCB6DHTR.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___2_FIT25FYRGELBEONPX2MTPZFN.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___2_FIT25FYRGELBEONPX2MTPZFN.py deleted file mode 100644 index 63aa595..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___2_FIT25FYRGELBEONPX2MTPZFN.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def fmax_ozone_areatype__areatype___2_FIT25FYRGELBEONPX2MTPZFN( - _args, - _inputs, - _outputs, - __dzone__zone_type, __ozone__zone_type -): - return max(__ozone__zone_type[_args[0],], __dzone__zone_type[_args[1],]) == 2 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___2_FIT25FYRGELBEONPX2MTPZFN.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___2_FIT25FYRGELBEONPX2MTPZFN.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___3_LIPIKNXA6ZB3PUNRJBVIHATL.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___3_LIPIKNXA6ZB3PUNRJBVIHATL.py deleted file mode 100644 index fffecee..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___3_LIPIKNXA6ZB3PUNRJBVIHATL.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def fmax_ozone_areatype__areatype___3_LIPIKNXA6ZB3PUNRJBVIHATL( - _args, - _inputs, - _outputs, - __dzone__zone_type, __ozone__zone_type -): - return max(__ozone__zone_type[_args[0],], __dzone__zone_type[_args[1],]) == 3 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___3_LIPIKNXA6ZB3PUNRJBVIHATL.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___3_LIPIKNXA6ZB3PUNRJBVIHATL.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___4_J3D56DXM2MR6NEMIQ6ALSFID.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___4_J3D56DXM2MR6NEMIQ6ALSFID.py deleted file mode 100644 index 576db9b..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___4_J3D56DXM2MR6NEMIQ6ALSFID.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def fmax_ozone_areatype__areatype___4_J3D56DXM2MR6NEMIQ6ALSFID( - _args, - _inputs, - _outputs, - __dzone__zone_type, __ozone__zone_type -): - return max(__ozone__zone_type[_args[0],], __dzone__zone_type[_args[1],]) == 4 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___4_J3D56DXM2MR6NEMIQ6ALSFID.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___4_J3D56DXM2MR6NEMIQ6ALSFID.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___1_OTNZJFEFZT7N3JG6YKEUWGTF.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___1_OTNZJFEFZT7N3JG6YKEUWGTF.py deleted file mode 100644 index 14d4e60..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___1_OTNZJFEFZT7N3JG6YKEUWGTF.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def fmin_ozone_areatype__areatype___1_OTNZJFEFZT7N3JG6YKEUWGTF( - _args, - _inputs, - _outputs, - __dzone__zone_type, __ozone__zone_type -): - return min(__ozone__zone_type[_args[0],], __dzone__zone_type[_args[1],]) == 1 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___1_OTNZJFEFZT7N3JG6YKEUWGTF.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___1_OTNZJFEFZT7N3JG6YKEUWGTF.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___2_FY4D7BMCO2N4QRIA6QIIWTZI.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___2_FY4D7BMCO2N4QRIA6QIIWTZI.py deleted file mode 100644 index 1e743ea..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___2_FY4D7BMCO2N4QRIA6QIIWTZI.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def fmin_ozone_areatype__areatype___2_FY4D7BMCO2N4QRIA6QIIWTZI( - _args, - _inputs, - _outputs, - __dzone__zone_type, __ozone__zone_type -): - return min(__ozone__zone_type[_args[0],], __dzone__zone_type[_args[1],]) == 2 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___2_FY4D7BMCO2N4QRIA6QIIWTZI.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___2_FY4D7BMCO2N4QRIA6QIIWTZI.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___3_34BD5WGYZOPLALWPB2MCWKA7.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___3_34BD5WGYZOPLALWPB2MCWKA7.py deleted file mode 100644 index c7c4a5d..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___3_34BD5WGYZOPLALWPB2MCWKA7.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def fmin_ozone_areatype__areatype___3_34BD5WGYZOPLALWPB2MCWKA7( - _args, - _inputs, - _outputs, - __dzone__zone_type, __ozone__zone_type -): - return min(__ozone__zone_type[_args[0],], __dzone__zone_type[_args[1],]) == 3 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___3_34BD5WGYZOPLALWPB2MCWKA7.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___3_34BD5WGYZOPLALWPB2MCWKA7.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___4_64S6AODYPVZP57LTAC522OHX.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___4_64S6AODYPVZP57LTAC522OHX.py deleted file mode 100644 index 44f26be..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___4_64S6AODYPVZP57LTAC522OHX.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def fmin_ozone_areatype__areatype___4_64S6AODYPVZP57LTAC522OHX( - _args, - _inputs, - _outputs, - __dzone__zone_type, __ozone__zone_type -): - return min(__ozone__zone_type[_args[0],], __dzone__zone_type[_args[1],]) == 4 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___4_64S6AODYPVZP57LTAC522OHX.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___4_64S6AODYPVZP57LTAC522OHX.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBO.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBO.py deleted file mode 100644 index ad7884f..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBO.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def log_attractions_HBO( - _args, - _inputs, - _outputs, - __attractions__HBO -): - return log(__attractions__HBO[_args[1],]) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBO.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBO.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBO____666_5VORECHSLO2A6MKP5I3SGJVQ.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBO____666_5VORECHSLO2A6MKP5I3SGJVQ.py deleted file mode 100644 index bcdbdeb..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBO____666_5VORECHSLO2A6MKP5I3SGJVQ.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def log_attractions_HBO____666_5VORECHSLO2A6MKP5I3SGJVQ( - _args, - _inputs, - _outputs, - __attractions__HBO -): - return log(__attractions__HBO[_args[1],]) > -666 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBO____666_5VORECHSLO2A6MKP5I3SGJVQ.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBO____666_5VORECHSLO2A6MKP5I3SGJVQ.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBS.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBS.py deleted file mode 100644 index 50a1cb5..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBS.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def log_attractions_HBS( - _args, - _inputs, - _outputs, - __attractions__HBS -): - return log(__attractions__HBS[_args[1],]) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBS.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBS.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBS____666_L3ZMVRT365KFSBLEDVABFEGL.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBS____666_L3ZMVRT365KFSBLEDVABFEGL.py deleted file mode 100644 index dac95e3..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBS____666_L3ZMVRT365KFSBLEDVABFEGL.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def log_attractions_HBS____666_L3ZMVRT365KFSBLEDVABFEGL( - _args, - _inputs, - _outputs, - __attractions__HBS -): - return log(__attractions__HBS[_args[1],]) > -666 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBS____666_L3ZMVRT365KFSBLEDVABFEGL.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBS____666_L3ZMVRT365KFSBLEDVABFEGL.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWH.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWH.py deleted file mode 100644 index 2e92b51..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWH.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def log_attractions_HBWH( - _args, - _inputs, - _outputs, - __attractions__HBWH -): - return log(__attractions__HBWH[_args[1],]) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWH.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWH.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWH____666_GW3RKVJQOVET3XE7MYE2MA7V.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWH____666_GW3RKVJQOVET3XE7MYE2MA7V.py deleted file mode 100644 index 638cd9e..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWH____666_GW3RKVJQOVET3XE7MYE2MA7V.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def log_attractions_HBWH____666_GW3RKVJQOVET3XE7MYE2MA7V( - _args, - _inputs, - _outputs, - __attractions__HBWH -): - return log(__attractions__HBWH[_args[1],]) > -666 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWH____666_GW3RKVJQOVET3XE7MYE2MA7V.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWH____666_GW3RKVJQOVET3XE7MYE2MA7V.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWL.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWL.py deleted file mode 100644 index bf302cc..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWL.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def log_attractions_HBWL( - _args, - _inputs, - _outputs, - __attractions__HBWL -): - return log(__attractions__HBWL[_args[1],]) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWL.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWL.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWL____666_IQGLCTAX7EZOXKEFCIBK33BD.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWL____666_IQGLCTAX7EZOXKEFCIBK33BD.py deleted file mode 100644 index 03e9d24..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWL____666_IQGLCTAX7EZOXKEFCIBK33BD.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def log_attractions_HBWL____666_IQGLCTAX7EZOXKEFCIBK33BD( - _args, - _inputs, - _outputs, - __attractions__HBWL -): - return log(__attractions__HBWL[_args[1],]) > -666 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWL____666_IQGLCTAX7EZOXKEFCIBK33BD.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWL____666_IQGLCTAX7EZOXKEFCIBK33BD.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_NHB.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_NHB.py deleted file mode 100644 index a76ad09..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_NHB.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def log_attractions_NHB( - _args, - _inputs, - _outputs, - __attractions__NHB -): - return log(__attractions__NHB[_args[1],]) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_NHB.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_NHB.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_NHB____666_3GFB7KMY3JN5TSJE4MRRR2HM.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_NHB____666_3GFB7KMY3JN5TSJE4MRRR2HM.py deleted file mode 100644 index 529c3ff..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_NHB____666_3GFB7KMY3JN5TSJE4MRRR2HM.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def log_attractions_NHB____666_3GFB7KMY3JN5TSJE4MRRR2HM( - _args, - _inputs, - _outputs, - __attractions__NHB -): - return log(__attractions__NHB[_args[1],]) > -666 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_NHB____666_3GFB7KMY3JN5TSJE4MRRR2HM.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_NHB____666_3GFB7KMY3JN5TSJE4MRRR2HM.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_o_zone____dtaz_HXCH5HUPIDPV3EWONWFXBZHM.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_o_zone____dtaz_HXCH5HUPIDPV3EWONWFXBZHM.py deleted file mode 100644 index 8d0d860..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_o_zone____dtaz_HXCH5HUPIDPV3EWONWFXBZHM.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def o_zone____dtaz_HXCH5HUPIDPV3EWONWFXBZHM( - _args, - _inputs, - _outputs, - -): - return _inputs[1] == _inputs[0] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_o_zone____dtaz_HXCH5HUPIDPV3EWONWFXBZHM.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_o_zone____dtaz_HXCH5HUPIDPV3EWONWFXBZHM.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_0_5_1_0__HZLL3YOGUR763JRQHG7SM6TX.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_0_5_1_0__HZLL3YOGUR763JRQHG7SM6TX.py deleted file mode 100644 index 11bc0b9..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_0_5_1_0__HZLL3YOGUR763JRQHG7SM6TX.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def piece_auto_dist_OFFPEAK_0_5_1_0__HZLL3YOGUR763JRQHG7SM6TX( - _args, - _inputs, - _outputs, - __auto_skims__md_dist -): - return piece(__auto_skims__md_dist[_args[0], _args[1]], 0.5, 1.0) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_0_5_1_0__HZLL3YOGUR763JRQHG7SM6TX.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_0_5_1_0__HZLL3YOGUR763JRQHG7SM6TX.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_10_None__6EE7X5PWAQKBS6WQUONWVI63.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_10_None__6EE7X5PWAQKBS6WQUONWVI63.py deleted file mode 100644 index 0d67afc..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_10_None__6EE7X5PWAQKBS6WQUONWVI63.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def piece_auto_dist_OFFPEAK_10_None__6EE7X5PWAQKBS6WQUONWVI63( - _args, - _inputs, - _outputs, - __auto_skims__md_dist -): - return piece(__auto_skims__md_dist[_args[0], _args[1]], 10, None) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_10_None__6EE7X5PWAQKBS6WQUONWVI63.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_10_None__6EE7X5PWAQKBS6WQUONWVI63.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_1_0_None__FBK6GF2KEWWDN7AL3ENVH3VS.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_1_0_None__FBK6GF2KEWWDN7AL3ENVH3VS.py deleted file mode 100644 index cbe8bc9..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_1_0_None__FBK6GF2KEWWDN7AL3ENVH3VS.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def piece_auto_dist_OFFPEAK_1_0_None__FBK6GF2KEWWDN7AL3ENVH3VS( - _args, - _inputs, - _outputs, - __auto_skims__md_dist -): - return piece(__auto_skims__md_dist[_args[0], _args[1]], 1.0, None) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_1_0_None__FBK6GF2KEWWDN7AL3ENVH3VS.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_1_0_None__FBK6GF2KEWWDN7AL3ENVH3VS.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_5_10__5RQTWWGPPCPP6EQU6ZV5MX2R.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_5_10__5RQTWWGPPCPP6EQU6ZV5MX2R.py deleted file mode 100644 index d93d41c..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_5_10__5RQTWWGPPCPP6EQU6ZV5MX2R.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def piece_auto_dist_OFFPEAK_5_10__5RQTWWGPPCPP6EQU6ZV5MX2R( - _args, - _inputs, - _outputs, - __auto_skims__md_dist -): - return piece(__auto_skims__md_dist[_args[0], _args[1]], 5, 10) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_5_10__5RQTWWGPPCPP6EQU6ZV5MX2R.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_5_10__5RQTWWGPPCPP6EQU6ZV5MX2R.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_None_0_5__537AWC5AWFXLM3TRB3PPSGYZ.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_None_0_5__537AWC5AWFXLM3TRB3PPSGYZ.py deleted file mode 100644 index 55a397b..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_None_0_5__537AWC5AWFXLM3TRB3PPSGYZ.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def piece_auto_dist_OFFPEAK_None_0_5__537AWC5AWFXLM3TRB3PPSGYZ( - _args, - _inputs, - _outputs, - __auto_skims__md_dist -): - return piece(__auto_skims__md_dist[_args[0], _args[1]], None, 0.5) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_None_0_5__537AWC5AWFXLM3TRB3PPSGYZ.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_None_0_5__537AWC5AWFXLM3TRB3PPSGYZ.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_None_5__YWXA4HRZAVEZKC7EV5M2AX3B.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_None_5__YWXA4HRZAVEZKC7EV5M2AX3B.py deleted file mode 100644 index 8aa0e5c..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_None_5__YWXA4HRZAVEZKC7EV5M2AX3B.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def piece_auto_dist_OFFPEAK_None_5__YWXA4HRZAVEZKC7EV5M2AX3B( - _args, - _inputs, - _outputs, - __auto_skims__md_dist -): - return piece(__auto_skims__md_dist[_args[0], _args[1]], None, 5) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_None_5__YWXA4HRZAVEZKC7EV5M2AX3B.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_None_5__YWXA4HRZAVEZKC7EV5M2AX3B.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_0_5_1_0__4K5ZPM55FQJVFMWKUPZIQ2ET.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_0_5_1_0__4K5ZPM55FQJVFMWKUPZIQ2ET.py deleted file mode 100644 index f3e83e1..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_0_5_1_0__4K5ZPM55FQJVFMWKUPZIQ2ET.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def piece_auto_dist_PEAK_0_5_1_0__4K5ZPM55FQJVFMWKUPZIQ2ET( - _args, - _inputs, - _outputs, - __auto_skims__am_dist -): - return piece(__auto_skims__am_dist[_args[0], _args[1]], 0.5, 1.0) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_0_5_1_0__4K5ZPM55FQJVFMWKUPZIQ2ET.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_0_5_1_0__4K5ZPM55FQJVFMWKUPZIQ2ET.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_10_None__L3GKJNRUTTFCDUYV65K7KFQD.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_10_None__L3GKJNRUTTFCDUYV65K7KFQD.py deleted file mode 100644 index 5cdfe54..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_10_None__L3GKJNRUTTFCDUYV65K7KFQD.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def piece_auto_dist_PEAK_10_None__L3GKJNRUTTFCDUYV65K7KFQD( - _args, - _inputs, - _outputs, - __auto_skims__am_dist -): - return piece(__auto_skims__am_dist[_args[0], _args[1]], 10, None) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_10_None__L3GKJNRUTTFCDUYV65K7KFQD.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_10_None__L3GKJNRUTTFCDUYV65K7KFQD.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_1_0_None__FMBHM5APW4TIH6B5EKSKSXYD.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_1_0_None__FMBHM5APW4TIH6B5EKSKSXYD.py deleted file mode 100644 index aaadc74..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_1_0_None__FMBHM5APW4TIH6B5EKSKSXYD.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def piece_auto_dist_PEAK_1_0_None__FMBHM5APW4TIH6B5EKSKSXYD( - _args, - _inputs, - _outputs, - __auto_skims__am_dist -): - return piece(__auto_skims__am_dist[_args[0], _args[1]], 1.0, None) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_1_0_None__FMBHM5APW4TIH6B5EKSKSXYD.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_1_0_None__FMBHM5APW4TIH6B5EKSKSXYD.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_5_10__DSXTFACXD5HSWU7YKUPQEGAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_5_10__DSXTFACXD5HSWU7YKUPQEGAK.py deleted file mode 100644 index 552904b..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_5_10__DSXTFACXD5HSWU7YKUPQEGAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def piece_auto_dist_PEAK_5_10__DSXTFACXD5HSWU7YKUPQEGAK( - _args, - _inputs, - _outputs, - __auto_skims__am_dist -): - return piece(__auto_skims__am_dist[_args[0], _args[1]], 5, 10) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_5_10__DSXTFACXD5HSWU7YKUPQEGAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_5_10__DSXTFACXD5HSWU7YKUPQEGAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_None_0_5__NZ6HG4EJYEENT2OAOBDF3W5W.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_None_0_5__NZ6HG4EJYEENT2OAOBDF3W5W.py deleted file mode 100644 index 869dc31..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_None_0_5__NZ6HG4EJYEENT2OAOBDF3W5W.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def piece_auto_dist_PEAK_None_0_5__NZ6HG4EJYEENT2OAOBDF3W5W( - _args, - _inputs, - _outputs, - __auto_skims__am_dist -): - return piece(__auto_skims__am_dist[_args[0], _args[1]], None, 0.5) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_None_0_5__NZ6HG4EJYEENT2OAOBDF3W5W.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_None_0_5__NZ6HG4EJYEENT2OAOBDF3W5W.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_None_5__7D72ALZRBNSP634JYUY7IV5P.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_None_5__7D72ALZRBNSP634JYUY7IV5P.py deleted file mode 100644 index b605969..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_None_5__7D72ALZRBNSP634JYUY7IV5P.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def piece_auto_dist_PEAK_None_5__7D72ALZRBNSP634JYUY7IV5P( - _args, - _inputs, - _outputs, - __auto_skims__am_dist -): - return piece(__auto_skims__am_dist[_args[0], _args[1]], None, 5) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_None_5__7D72ALZRBNSP634JYUY7IV5P.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_None_5__7D72ALZRBNSP634JYUY7IV5P.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_transit_ivtt_OFFPEAK__20__None__2SYXPZCTOY3PKAO2L4ALLHLI.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_transit_ivtt_OFFPEAK__20__None__2SYXPZCTOY3PKAO2L4ALLHLI.py deleted file mode 100644 index 4e77239..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_transit_ivtt_OFFPEAK__20__None__2SYXPZCTOY3PKAO2L4ALLHLI.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def piece_transit_ivtt_OFFPEAK__20__None__2SYXPZCTOY3PKAO2L4ALLHLI( - _args, - _inputs, - _outputs, - -): - return piece(_outputs[2], 20, None) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_transit_ivtt_OFFPEAK__20__None__2SYXPZCTOY3PKAO2L4ALLHLI.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_transit_ivtt_OFFPEAK__20__None__2SYXPZCTOY3PKAO2L4ALLHLI.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_transit_ivtt_OFFPEAK__None__20__54N5BOFSYCN6SMRBKXM4V4TW.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_transit_ivtt_OFFPEAK__None__20__54N5BOFSYCN6SMRBKXM4V4TW.py deleted file mode 100644 index 59e58bd..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_transit_ivtt_OFFPEAK__None__20__54N5BOFSYCN6SMRBKXM4V4TW.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def piece_transit_ivtt_OFFPEAK__None__20__54N5BOFSYCN6SMRBKXM4V4TW( - _args, - _inputs, - _outputs, - -): - return piece(_outputs[2], None, 20) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_transit_ivtt_OFFPEAK__None__20__54N5BOFSYCN6SMRBKXM4V4TW.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_transit_ivtt_OFFPEAK__None__20__54N5BOFSYCN6SMRBKXM4V4TW.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_fare_OFFPEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_fare_OFFPEAK.py deleted file mode 100644 index 07b281b..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_fare_OFFPEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def taxi_fare_OFFPEAK( - _args, - _inputs, - _outputs, - __auto_skims__md_dist, __auto_skims__md_time -): - return taxi_cost(__auto_skims__md_time[_args[0], _args[1]], __auto_skims__md_dist[_args[0], _args[1]], _inputs[1], _inputs[0], taxi_cost_struct) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_fare_OFFPEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_fare_OFFPEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_fare_PEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_fare_PEAK.py deleted file mode 100644 index 2dc2c8b..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_fare_PEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def taxi_fare_PEAK( - _args, - _inputs, - _outputs, - __auto_skims__am_dist, __auto_skims__am_time -): - return taxi_cost(__auto_skims__am_time[_args[0], _args[1]], __auto_skims__am_dist[_args[0], _args[1]], _inputs[1], _inputs[0], taxi_cost_struct) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_fare_PEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_fare_PEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_OFFPEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_OFFPEAK.py deleted file mode 100644 index f40744c..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_OFFPEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def taxi_wait_time_OFFPEAK( - _args, - _inputs, - _outputs, - __ozone__taxi_wait_op -): - return __ozone__taxi_wait_op[_args[0],] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_OFFPEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_OFFPEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_OFFPEAK_auto_dist_OFFPEAK_HC62HOLRZIWJJDAOIFX5XHV6.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_OFFPEAK_auto_dist_OFFPEAK_HC62HOLRZIWJJDAOIFX5XHV6.py deleted file mode 100644 index 0156f1a..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_OFFPEAK_auto_dist_OFFPEAK_HC62HOLRZIWJJDAOIFX5XHV6.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def taxi_wait_time_OFFPEAK_auto_dist_OFFPEAK_HC62HOLRZIWJJDAOIFX5XHV6( - _args, - _inputs, - _outputs, - __auto_skims__md_dist, __ozone__taxi_wait_op -): - return __ozone__taxi_wait_op[_args[0],] / __auto_skims__md_dist[_args[0], _args[1]] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_OFFPEAK_auto_dist_OFFPEAK_HC62HOLRZIWJJDAOIFX5XHV6.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_OFFPEAK_auto_dist_OFFPEAK_HC62HOLRZIWJJDAOIFX5XHV6.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_PEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_PEAK.py deleted file mode 100644 index 8a09c16..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_PEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def taxi_wait_time_PEAK( - _args, - _inputs, - _outputs, - __ozone__taxi_wait_pk -): - return __ozone__taxi_wait_pk[_args[0],] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_PEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_PEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_PEAK_auto_dist_PEAK_CBYSKDURSGAJ4RHX2ASS76Q2.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_PEAK_auto_dist_PEAK_CBYSKDURSGAJ4RHX2ASS76Q2.py deleted file mode 100644 index 585a40a..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_PEAK_auto_dist_PEAK_CBYSKDURSGAJ4RHX2ASS76Q2.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def taxi_wait_time_PEAK_auto_dist_PEAK_CBYSKDURSGAJ4RHX2ASS76Q2( - _args, - _inputs, - _outputs, - __auto_skims__am_dist, __ozone__taxi_wait_pk -): - return __ozone__taxi_wait_pk[_args[0],] / __auto_skims__am_dist[_args[0], _args[1]] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_PEAK_auto_dist_PEAK_CBYSKDURSGAJ4RHX2ASS76Q2.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_PEAK_auto_dist_PEAK_CBYSKDURSGAJ4RHX2ASS76Q2.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_fare_OFFPEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_fare_OFFPEAK.py deleted file mode 100644 index 90bf1df..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_fare_OFFPEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def tnc_pool_fare_OFFPEAK( - _args, - _inputs, - _outputs, - __auto_skims__md_dist, __auto_skims__md_time -): - return tnc_cost(__auto_skims__md_time[_args[0], _args[1]], __auto_skims__md_dist[_args[0], _args[1]], _inputs[1], _inputs[0], tnc_pool_offpeak_struct) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_fare_OFFPEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_fare_OFFPEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_fare_PEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_fare_PEAK.py deleted file mode 100644 index 68906b3..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_fare_PEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def tnc_pool_fare_PEAK( - _args, - _inputs, - _outputs, - __auto_skims__am_dist, __auto_skims__am_time -): - return tnc_cost(__auto_skims__am_time[_args[0], _args[1]], __auto_skims__am_dist[_args[0], _args[1]], _inputs[1], _inputs[0], tnc_pool_peak_struct) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_fare_PEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_fare_PEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_OFFPEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_OFFPEAK.py deleted file mode 100644 index a190a78..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_OFFPEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def tnc_pool_wait_time_OFFPEAK( - _args, - _inputs, - _outputs, - __ozone__tnc_pool_wait_op -): - return __ozone__tnc_pool_wait_op[_args[0],] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_OFFPEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_OFFPEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_OFFPEAK_auto_dist_OFFPEAK_FNBOP5IL57Q6SQM4VB7EXQBB.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_OFFPEAK_auto_dist_OFFPEAK_FNBOP5IL57Q6SQM4VB7EXQBB.py deleted file mode 100644 index 88e23d4..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_OFFPEAK_auto_dist_OFFPEAK_FNBOP5IL57Q6SQM4VB7EXQBB.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def tnc_pool_wait_time_OFFPEAK_auto_dist_OFFPEAK_FNBOP5IL57Q6SQM4VB7EXQBB( - _args, - _inputs, - _outputs, - __auto_skims__md_dist, __ozone__tnc_pool_wait_op -): - return __ozone__tnc_pool_wait_op[_args[0],] / __auto_skims__md_dist[_args[0], _args[1]] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_OFFPEAK_auto_dist_OFFPEAK_FNBOP5IL57Q6SQM4VB7EXQBB.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_OFFPEAK_auto_dist_OFFPEAK_FNBOP5IL57Q6SQM4VB7EXQBB.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_PEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_PEAK.py deleted file mode 100644 index 8e749a2..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_PEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def tnc_pool_wait_time_PEAK( - _args, - _inputs, - _outputs, - __ozone__tnc_pool_wait_pk -): - return __ozone__tnc_pool_wait_pk[_args[0],] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_PEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_PEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_PEAK_auto_dist_PEAK_NHA453KUTMUKTUCSMA2XQQZV.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_PEAK_auto_dist_PEAK_NHA453KUTMUKTUCSMA2XQQZV.py deleted file mode 100644 index 90bfa02..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_PEAK_auto_dist_PEAK_NHA453KUTMUKTUCSMA2XQQZV.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def tnc_pool_wait_time_PEAK_auto_dist_PEAK_NHA453KUTMUKTUCSMA2XQQZV( - _args, - _inputs, - _outputs, - __auto_skims__am_dist, __ozone__tnc_pool_wait_pk -): - return __ozone__tnc_pool_wait_pk[_args[0],] / __auto_skims__am_dist[_args[0], _args[1]] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_PEAK_auto_dist_PEAK_NHA453KUTMUKTUCSMA2XQQZV.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_PEAK_auto_dist_PEAK_NHA453KUTMUKTUCSMA2XQQZV.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_fare_OFFPEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_fare_OFFPEAK.py deleted file mode 100644 index 83a3231..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_fare_OFFPEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def tnc_solo_fare_OFFPEAK( - _args, - _inputs, - _outputs, - __auto_skims__md_dist, __auto_skims__md_time -): - return tnc_cost(__auto_skims__md_time[_args[0], _args[1]], __auto_skims__md_dist[_args[0], _args[1]], _inputs[1], _inputs[0], tnc_solo_offpeak_struct) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_fare_OFFPEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_fare_OFFPEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_fare_PEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_fare_PEAK.py deleted file mode 100644 index d6256cf..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_fare_PEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def tnc_solo_fare_PEAK( - _args, - _inputs, - _outputs, - __auto_skims__am_dist, __auto_skims__am_time -): - return tnc_cost(__auto_skims__am_time[_args[0], _args[1]], __auto_skims__am_dist[_args[0], _args[1]], _inputs[1], _inputs[0], tnc_solo_peak_struct) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_fare_PEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_fare_PEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_OFFPEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_OFFPEAK.py deleted file mode 100644 index 8e40c74..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_OFFPEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def tnc_solo_wait_time_OFFPEAK( - _args, - _inputs, - _outputs, - __ozone__tnc_solo_wait_op -): - return __ozone__tnc_solo_wait_op[_args[0],] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_OFFPEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_OFFPEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_OFFPEAK_auto_dist_OFFPEAK_CA5RZWRWZJWFNZATH2HHD3TO.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_OFFPEAK_auto_dist_OFFPEAK_CA5RZWRWZJWFNZATH2HHD3TO.py deleted file mode 100644 index ea179b2..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_OFFPEAK_auto_dist_OFFPEAK_CA5RZWRWZJWFNZATH2HHD3TO.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def tnc_solo_wait_time_OFFPEAK_auto_dist_OFFPEAK_CA5RZWRWZJWFNZATH2HHD3TO( - _args, - _inputs, - _outputs, - __auto_skims__md_dist, __ozone__tnc_solo_wait_op -): - return __ozone__tnc_solo_wait_op[_args[0],] / __auto_skims__md_dist[_args[0], _args[1]] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_OFFPEAK_auto_dist_OFFPEAK_CA5RZWRWZJWFNZATH2HHD3TO.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_OFFPEAK_auto_dist_OFFPEAK_CA5RZWRWZJWFNZATH2HHD3TO.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_PEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_PEAK.py deleted file mode 100644 index d3a8667..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_PEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def tnc_solo_wait_time_PEAK( - _args, - _inputs, - _outputs, - __ozone__tnc_solo_wait_pk -): - return __ozone__tnc_solo_wait_pk[_args[0],] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_PEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_PEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_PEAK_auto_dist_PEAK_2EZZEATSM4EAHST74DMGSFSS.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_PEAK_auto_dist_PEAK_2EZZEATSM4EAHST74DMGSFSS.py deleted file mode 100644 index 7c55798..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_PEAK_auto_dist_PEAK_2EZZEATSM4EAHST74DMGSFSS.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def tnc_solo_wait_time_PEAK_auto_dist_PEAK_2EZZEATSM4EAHST74DMGSFSS( - _args, - _inputs, - _outputs, - __auto_skims__am_dist, __ozone__tnc_solo_wait_pk -): - return __ozone__tnc_solo_wait_pk[_args[0],] / __auto_skims__am_dist[_args[0], _args[1]] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_PEAK_auto_dist_PEAK_2EZZEATSM4EAHST74DMGSFSS.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_PEAK_auto_dist_PEAK_2EZZEATSM4EAHST74DMGSFSS.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_fare_OFFPEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_fare_OFFPEAK.py deleted file mode 100644 index e401cfc..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_fare_OFFPEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def transit_fare_OFFPEAK( - _args, - _inputs, - _outputs, - __transit_op__fare -): - return __transit_op__fare[_args[0], _args[1]] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_fare_OFFPEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_fare_OFFPEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_fare_PEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_fare_PEAK.py deleted file mode 100644 index 3f1b119..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_fare_PEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def transit_fare_PEAK( - _args, - _inputs, - _outputs, - __transit_pk__fare -): - return __transit_pk__fare[_args[0], _args[1]] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_fare_PEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_fare_PEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ivtt_OFFPEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ivtt_OFFPEAK.py deleted file mode 100644 index 5862f24..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ivtt_OFFPEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def transit_ivtt_OFFPEAK( - _args, - _inputs, - _outputs, - __transit_op__ivtt -): - return __transit_op__ivtt[_args[0], _args[1]] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ivtt_OFFPEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ivtt_OFFPEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ivtt_PEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ivtt_PEAK.py deleted file mode 100644 index 09e64ce..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ivtt_PEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def transit_ivtt_PEAK( - _args, - _inputs, - _outputs, - __transit_pk__ivtt -): - return __transit_pk__ivtt[_args[0], _args[1]] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ivtt_PEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ivtt_PEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ovtt_OFFPEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ovtt_OFFPEAK.py deleted file mode 100644 index d149882..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ovtt_OFFPEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def transit_ovtt_OFFPEAK( - _args, - _inputs, - _outputs, - __transit_op__ovtt -): - return __transit_op__ovtt[_args[0], _args[1]] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ovtt_OFFPEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ovtt_OFFPEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ovtt_PEAK.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ovtt_PEAK.py deleted file mode 100644 index 3a13606..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ovtt_PEAK.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid -from .extra_funcs import * -from .extra_vars import * - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def transit_ovtt_PEAK( - _args, - _inputs, - _outputs, - __transit_pk__ovtt -): - return __transit_pk__ovtt[_args[0], _args[1]] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ovtt_PEAK.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ovtt_PEAK.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/__init__.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/__init__.py deleted file mode 100644 index a7c1930..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/__init__.py +++ /dev/null @@ -1,312 +0,0 @@ -import numba -import numpy as np - -from .f_transit_approach_drivetime_PEAK_auto_dist_PEAK_SVETJXGBSVYEYM7OVBAQW2PX import transit_approach_drivetime_PEAK_auto_dist_PEAK_SVETJXGBSVYEYM7OVBAQW2PX -from .f_transit_approach_waittime_PEAK_auto_dist_PEAK_YHJNF2B3VEICSZL64Y2XLV4S import transit_approach_waittime_PEAK_auto_dist_PEAK_YHJNF2B3VEICSZL64Y2XLV4S -from .f_transit_approach_walktime_PEAK_auto_dist_PEAK_T52CC4SUBMFSLGDNMCSO7A7J import transit_approach_walktime_PEAK_auto_dist_PEAK_T52CC4SUBMFSLGDNMCSO7A7J -from .f_transit_ovtt_PEAK_auto_dist_PEAK_UIAXX4VIE5PP53PJMCSMEFOP import transit_ovtt_PEAK_auto_dist_PEAK_UIAXX4VIE5PP53PJMCSMEFOP -from .f_transit_approach_drivetime_OFFPEAK_auto_dist_OFFPEAK_U2242PIA3ZL4MJS726HCCG73 import transit_approach_drivetime_OFFPEAK_auto_dist_OFFPEAK_U2242PIA3ZL4MJS726HCCG73 -from .f_transit_approach_waittime_OFFPEAK_auto_dist_OFFPEAK_22UIGWVENT7RTALQKKOHEPXM import transit_approach_waittime_OFFPEAK_auto_dist_OFFPEAK_22UIGWVENT7RTALQKKOHEPXM -from .f_transit_approach_walktime_OFFPEAK_auto_dist_OFFPEAK_ITAE2YOSBIY76DBTPIPT6QD2 import transit_approach_walktime_OFFPEAK_auto_dist_OFFPEAK_ITAE2YOSBIY76DBTPIPT6QD2 -from .f_transit_ovtt_OFFPEAK_auto_dist_OFFPEAK_IY4UAVBMS2HPHNYZJLSMWG3V import transit_ovtt_OFFPEAK_auto_dist_OFFPEAK_IY4UAVBMS2HPHNYZJLSMWG3V -from .f_hard_sigmoid_transit_approach_walktime_PEAK__4_0__2_0__AJ26DYAVZX7MOBOG5SOJABST import hard_sigmoid_transit_approach_walktime_PEAK__4_0__2_0__AJ26DYAVZX7MOBOG5SOJABST -from .f_hard_sigmoid_transit_approach_walktime_OFFPEAK__4_0__2_0__FPYQ4GNCVUNJNUMJTUIBMLKO import hard_sigmoid_transit_approach_walktime_OFFPEAK__4_0__2_0__FPYQ4GNCVUNJNUMJTUIBMLKO -from .f_auto_parking_cost_HBWH import auto_parking_cost_HBWH -from .f_auto_parking_cost_HBWL import auto_parking_cost_HBWL -from .f_auto_parking_cost_HBO import auto_parking_cost_HBO -from .f_auto_parking_cost_HBS import auto_parking_cost_HBS -from .f_auto_parking_cost_NHB import auto_parking_cost_NHB -from .f_auto_parking_cost_HBOR import auto_parking_cost_HBOR -from .f_auto_parking_cost_NHBR import auto_parking_cost_NHBR -from .f_auto_parking_cost_NHBS import auto_parking_cost_NHBS -from .f_samp_wgt import samp_wgt -from .f_log_1_samp_wgt__PLSMOODNF77UOPHIVH6I2WBL import log_1_samp_wgt__PLSMOODNF77UOPHIVH6I2WBL -from .f_transit_avail_HBWH import transit_avail_HBWH -from .f_transit_avail_HBWL import transit_avail_HBWL -from .f_transit_avail_HBS import transit_avail_HBS -from .f_transit_avail_HBO import transit_avail_HBO -from .f_transit_avail_NHB import transit_avail_NHB -from .f_auto_avail_HBWH import auto_avail_HBWH -from .f__1_auto_avail_HBWH_RSSCN3EFDQ2CM4RPVZVAP7K3 import _1_auto_avail_HBWH_RSSCN3EFDQ2CM4RPVZVAP7K3 -from .f__1_transit_avail_HBWH_NMEWQX35KIWZJMZ5IZZTZHOE import _1_transit_avail_HBWH_NMEWQX35KIWZJMZ5IZZTZHOE -from .f_auto_avail_HBWL import auto_avail_HBWL -from .f__1_auto_avail_HBWL_VWN3Q4WQRAVVJ5ZTYY4OHM63 import _1_auto_avail_HBWL_VWN3Q4WQRAVVJ5ZTYY4OHM63 -from .f__1_transit_avail_HBWL_MPZ7IOPMILS7SZEG5T2D6HG2 import _1_transit_avail_HBWL_MPZ7IOPMILS7SZEG5T2D6HG2 -from .f_auto_avail_HBS import auto_avail_HBS -from .f__1_auto_avail_HBS_JA6SY3LPJJDVZQF7IFNL4EWX import _1_auto_avail_HBS_JA6SY3LPJJDVZQF7IFNL4EWX -from .f__1_transit_avail_HBS_5CZV3HKDPQJDWZME2XMN7NW6 import _1_transit_avail_HBS_5CZV3HKDPQJDWZME2XMN7NW6 -from .f_auto_avail_HBO import auto_avail_HBO -from .f__1_auto_avail_HBO_EKWWH33ZEA3VXLR4UYBVLRUX import _1_auto_avail_HBO_EKWWH33ZEA3VXLR4UYBVLRUX -from .f__1_transit_avail_HBO_K3RWOEPC3IXNAPRPQQJCHORY import _1_transit_avail_HBO_K3RWOEPC3IXNAPRPQQJCHORY -from .f_auto_avail_NHB import auto_avail_NHB -from .f__1_auto_avail_NHB_XHHWLREMVWOEBM6NUQF7EFH6 import _1_auto_avail_NHB_XHHWLREMVWOEBM6NUQF7EFH6 -from .f__1_transit_avail_NHB_WN7OPNQOSVQ544PG5Q2ZGTNF import _1_transit_avail_NHB_WN7OPNQOSVQ544PG5Q2ZGTNF - - -@numba.jit(cache=True, parallel=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def runner(argarray, inputarray, dtype=np.float64, min_shape_0=0): - out_size = max(argarray.shape[0], min_shape_0) - if out_size != argarray.shape[0]: - result = np.zeros((out_size, 40), dtype=dtype) - else: - result = np.empty((out_size, 40), dtype=dtype) - if out_size > 1000: - for j in numba.prange(out_size): - result[j, 0] = transit_approach_drivetime_PEAK_auto_dist_PEAK_SVETJXGBSVYEYM7OVBAQW2PX(argarray[j], inputarray[j], result[j], ) - result[j, 1] = transit_approach_waittime_PEAK_auto_dist_PEAK_YHJNF2B3VEICSZL64Y2XLV4S(argarray[j], inputarray[j], result[j], ) - result[j, 2] = transit_approach_walktime_PEAK_auto_dist_PEAK_T52CC4SUBMFSLGDNMCSO7A7J(argarray[j], inputarray[j], result[j], ) - result[j, 3] = transit_ovtt_PEAK_auto_dist_PEAK_UIAXX4VIE5PP53PJMCSMEFOP(argarray[j], inputarray[j], result[j], ) - result[j, 4] = transit_approach_drivetime_OFFPEAK_auto_dist_OFFPEAK_U2242PIA3ZL4MJS726HCCG73(argarray[j], inputarray[j], result[j], ) - result[j, 5] = transit_approach_waittime_OFFPEAK_auto_dist_OFFPEAK_22UIGWVENT7RTALQKKOHEPXM(argarray[j], inputarray[j], result[j], ) - result[j, 6] = transit_approach_walktime_OFFPEAK_auto_dist_OFFPEAK_ITAE2YOSBIY76DBTPIPT6QD2(argarray[j], inputarray[j], result[j], ) - result[j, 7] = transit_ovtt_OFFPEAK_auto_dist_OFFPEAK_IY4UAVBMS2HPHNYZJLSMWG3V(argarray[j], inputarray[j], result[j], ) - result[j, 8] = hard_sigmoid_transit_approach_walktime_PEAK__4_0__2_0__AJ26DYAVZX7MOBOG5SOJABST(argarray[j], inputarray[j], result[j], ) - result[j, 9] = hard_sigmoid_transit_approach_walktime_OFFPEAK__4_0__2_0__FPYQ4GNCVUNJNUMJTUIBMLKO(argarray[j], inputarray[j], result[j], ) - result[j, 10] = auto_parking_cost_HBWH(argarray[j], inputarray[j], result[j], ) - result[j, 11] = auto_parking_cost_HBWL(argarray[j], inputarray[j], result[j], ) - result[j, 12] = auto_parking_cost_HBO(argarray[j], inputarray[j], result[j], ) - result[j, 13] = auto_parking_cost_HBS(argarray[j], inputarray[j], result[j], ) - result[j, 14] = auto_parking_cost_NHB(argarray[j], inputarray[j], result[j], ) - result[j, 15] = auto_parking_cost_HBOR(argarray[j], inputarray[j], result[j], ) - result[j, 16] = auto_parking_cost_NHBR(argarray[j], inputarray[j], result[j], ) - result[j, 17] = auto_parking_cost_NHBS(argarray[j], inputarray[j], result[j], ) - result[j, 18] = samp_wgt(argarray[j], inputarray[j], result[j], ) - result[j, 19] = log_1_samp_wgt__PLSMOODNF77UOPHIVH6I2WBL(argarray[j], inputarray[j], result[j], ) - result[j, 20] = transit_avail_HBWH(argarray[j], inputarray[j], result[j], ) - result[j, 21] = transit_avail_HBWL(argarray[j], inputarray[j], result[j], ) - result[j, 22] = transit_avail_HBS(argarray[j], inputarray[j], result[j], ) - result[j, 23] = transit_avail_HBO(argarray[j], inputarray[j], result[j], ) - result[j, 24] = transit_avail_NHB(argarray[j], inputarray[j], result[j], ) - result[j, 25] = auto_avail_HBWH(argarray[j], inputarray[j], result[j], ) - result[j, 26] = _1_auto_avail_HBWH_RSSCN3EFDQ2CM4RPVZVAP7K3(argarray[j], inputarray[j], result[j], ) - result[j, 27] = _1_transit_avail_HBWH_NMEWQX35KIWZJMZ5IZZTZHOE(argarray[j], inputarray[j], result[j], ) - result[j, 28] = auto_avail_HBWL(argarray[j], inputarray[j], result[j], ) - result[j, 29] = _1_auto_avail_HBWL_VWN3Q4WQRAVVJ5ZTYY4OHM63(argarray[j], inputarray[j], result[j], ) - result[j, 30] = _1_transit_avail_HBWL_MPZ7IOPMILS7SZEG5T2D6HG2(argarray[j], inputarray[j], result[j], ) - result[j, 31] = auto_avail_HBS(argarray[j], inputarray[j], result[j], ) - result[j, 32] = _1_auto_avail_HBS_JA6SY3LPJJDVZQF7IFNL4EWX(argarray[j], inputarray[j], result[j], ) - result[j, 33] = _1_transit_avail_HBS_5CZV3HKDPQJDWZME2XMN7NW6(argarray[j], inputarray[j], result[j], ) - result[j, 34] = auto_avail_HBO(argarray[j], inputarray[j], result[j], ) - result[j, 35] = _1_auto_avail_HBO_EKWWH33ZEA3VXLR4UYBVLRUX(argarray[j], inputarray[j], result[j], ) - result[j, 36] = _1_transit_avail_HBO_K3RWOEPC3IXNAPRPQQJCHORY(argarray[j], inputarray[j], result[j], ) - result[j, 37] = auto_avail_NHB(argarray[j], inputarray[j], result[j], ) - result[j, 38] = _1_auto_avail_NHB_XHHWLREMVWOEBM6NUQF7EFH6(argarray[j], inputarray[j], result[j], ) - result[j, 39] = _1_transit_avail_NHB_WN7OPNQOSVQ544PG5Q2ZGTNF(argarray[j], inputarray[j], result[j], ) - else: - for j in range(out_size): - result[j, 0] = transit_approach_drivetime_PEAK_auto_dist_PEAK_SVETJXGBSVYEYM7OVBAQW2PX(argarray[j], inputarray[j], result[j], ) - result[j, 1] = transit_approach_waittime_PEAK_auto_dist_PEAK_YHJNF2B3VEICSZL64Y2XLV4S(argarray[j], inputarray[j], result[j], ) - result[j, 2] = transit_approach_walktime_PEAK_auto_dist_PEAK_T52CC4SUBMFSLGDNMCSO7A7J(argarray[j], inputarray[j], result[j], ) - result[j, 3] = transit_ovtt_PEAK_auto_dist_PEAK_UIAXX4VIE5PP53PJMCSMEFOP(argarray[j], inputarray[j], result[j], ) - result[j, 4] = transit_approach_drivetime_OFFPEAK_auto_dist_OFFPEAK_U2242PIA3ZL4MJS726HCCG73(argarray[j], inputarray[j], result[j], ) - result[j, 5] = transit_approach_waittime_OFFPEAK_auto_dist_OFFPEAK_22UIGWVENT7RTALQKKOHEPXM(argarray[j], inputarray[j], result[j], ) - result[j, 6] = transit_approach_walktime_OFFPEAK_auto_dist_OFFPEAK_ITAE2YOSBIY76DBTPIPT6QD2(argarray[j], inputarray[j], result[j], ) - result[j, 7] = transit_ovtt_OFFPEAK_auto_dist_OFFPEAK_IY4UAVBMS2HPHNYZJLSMWG3V(argarray[j], inputarray[j], result[j], ) - result[j, 8] = hard_sigmoid_transit_approach_walktime_PEAK__4_0__2_0__AJ26DYAVZX7MOBOG5SOJABST(argarray[j], inputarray[j], result[j], ) - result[j, 9] = hard_sigmoid_transit_approach_walktime_OFFPEAK__4_0__2_0__FPYQ4GNCVUNJNUMJTUIBMLKO(argarray[j], inputarray[j], result[j], ) - result[j, 10] = auto_parking_cost_HBWH(argarray[j], inputarray[j], result[j], ) - result[j, 11] = auto_parking_cost_HBWL(argarray[j], inputarray[j], result[j], ) - result[j, 12] = auto_parking_cost_HBO(argarray[j], inputarray[j], result[j], ) - result[j, 13] = auto_parking_cost_HBS(argarray[j], inputarray[j], result[j], ) - result[j, 14] = auto_parking_cost_NHB(argarray[j], inputarray[j], result[j], ) - result[j, 15] = auto_parking_cost_HBOR(argarray[j], inputarray[j], result[j], ) - result[j, 16] = auto_parking_cost_NHBR(argarray[j], inputarray[j], result[j], ) - result[j, 17] = auto_parking_cost_NHBS(argarray[j], inputarray[j], result[j], ) - result[j, 18] = samp_wgt(argarray[j], inputarray[j], result[j], ) - result[j, 19] = log_1_samp_wgt__PLSMOODNF77UOPHIVH6I2WBL(argarray[j], inputarray[j], result[j], ) - result[j, 20] = transit_avail_HBWH(argarray[j], inputarray[j], result[j], ) - result[j, 21] = transit_avail_HBWL(argarray[j], inputarray[j], result[j], ) - result[j, 22] = transit_avail_HBS(argarray[j], inputarray[j], result[j], ) - result[j, 23] = transit_avail_HBO(argarray[j], inputarray[j], result[j], ) - result[j, 24] = transit_avail_NHB(argarray[j], inputarray[j], result[j], ) - result[j, 25] = auto_avail_HBWH(argarray[j], inputarray[j], result[j], ) - result[j, 26] = _1_auto_avail_HBWH_RSSCN3EFDQ2CM4RPVZVAP7K3(argarray[j], inputarray[j], result[j], ) - result[j, 27] = _1_transit_avail_HBWH_NMEWQX35KIWZJMZ5IZZTZHOE(argarray[j], inputarray[j], result[j], ) - result[j, 28] = auto_avail_HBWL(argarray[j], inputarray[j], result[j], ) - result[j, 29] = _1_auto_avail_HBWL_VWN3Q4WQRAVVJ5ZTYY4OHM63(argarray[j], inputarray[j], result[j], ) - result[j, 30] = _1_transit_avail_HBWL_MPZ7IOPMILS7SZEG5T2D6HG2(argarray[j], inputarray[j], result[j], ) - result[j, 31] = auto_avail_HBS(argarray[j], inputarray[j], result[j], ) - result[j, 32] = _1_auto_avail_HBS_JA6SY3LPJJDVZQF7IFNL4EWX(argarray[j], inputarray[j], result[j], ) - result[j, 33] = _1_transit_avail_HBS_5CZV3HKDPQJDWZME2XMN7NW6(argarray[j], inputarray[j], result[j], ) - result[j, 34] = auto_avail_HBO(argarray[j], inputarray[j], result[j], ) - result[j, 35] = _1_auto_avail_HBO_EKWWH33ZEA3VXLR4UYBVLRUX(argarray[j], inputarray[j], result[j], ) - result[j, 36] = _1_transit_avail_HBO_K3RWOEPC3IXNAPRPQQJCHORY(argarray[j], inputarray[j], result[j], ) - result[j, 37] = auto_avail_NHB(argarray[j], inputarray[j], result[j], ) - result[j, 38] = _1_auto_avail_NHB_XHHWLREMVWOEBM6NUQF7EFH6(argarray[j], inputarray[j], result[j], ) - result[j, 39] = _1_transit_avail_NHB_WN7OPNQOSVQ544PG5Q2ZGTNF(argarray[j], inputarray[j], result[j], ) - return result - -def _map_index(dim_name, values): - raise KeyError(dim_name) - - -def set_shared_data(): - global name_space - name_space = {} - - -meta_match_names_idx = {} - - -import numpy as np -import numba as nb -import pandas as pd -import pyarrow as pa -import xarray as xr -import sharrow as sh -import inspect -import warnings -from contextlib import suppress - - - - -def load_raw(args, inputs, name_space, runner, dtype=None): - with warnings.catch_warnings(): - warnings.filterwarnings('ignore', category=nb.NumbaExperimentalFeatureWarning) - if len(args): - assembled_args = np.stack(args).T - else: - assembled_args = None - if len(inputs): - assembled_inputs = np.stack(inputs).T - else: - assembled_inputs = np.empty([assembled_args.shape[0], 0], dtype=np.float32) - if assembled_args is None: - assembled_args = np.empty([assembled_inputs.shape[0], 0], dtype=np.float32) - try: - named_args = [] - arguments = [] - for arg in named_args: - next_arg = name_space[arg] - if isinstance(next_arg, xr.DataArray): - next_arg = next_arg.load() - arguments.append(np.asarray(next_arg)) - if dtype is not None: - return runner(assembled_args, assembled_inputs, *arguments, dtype=dtype) - else: - return runner(assembled_args, assembled_inputs, *arguments) - except nb.TypingError: - raise - except KeyError as err: - # raise the inner key error which is more helpful - context = getattr(err, "__context__", None) - if context: - raise context - else: - raise err - - -def load( - source, - as_dataframe=False, - as_table=False, - dtype=None, -): - if source is None: - raise ValueError("no base table or source table") - indexes = _get_indexes(source)[0] - inputs = _get_inputs(source) - result = load_raw(indexes, inputs, name_space, runner=runner, dtype=dtype) - if as_dataframe: - index = getattr(source, 'index', None) - return pd.DataFrame(result, index=index, columns=function_names) - elif as_table: - return pa.table({k: result[:, n] for n, k in enumerate(function_names)}) - return result - - -def merge(source, dtype=None): - """ - Merge the data created by this flow into the source. - - Parameters - ---------- - source : Dataset or Table or DataFrame - dtype : str or dtype - The loaded data will be generated with this dtype. - - Returns - ------- - merged : Dataset or Table or DataFrame - The same data type as `source` is returned. - """ - assert isinstance(source, (xr.Dataset, pa.Table, pd.DataFrame, sh.Table)) - new_cols = load(source, dtype=dtype) - if isinstance(source, (pa.Table, sh.Table)): - for n, k in enumerate(function_names): - source = source.append_column(k, [new_cols[:, n]]) - else: - for n, k in enumerate(function_names): - source[k] = new_cols[:, n] - return source - - -def _get_indexes(source_table, cache_dynamic_indexes=None): - if cache_dynamic_indexes is None: - cache_dynamic_indexes = True - - def geti(i): - nonlocal source_table - if i is not None: - try: - return np.asarray(source_table[i]) - except KeyError: - if i[:10] == '__dynamic_': - if "@" in i: - i_complete = i - i, i_from = i.split("@", 1) - else: - i_complete = i - i_from = i[10:] - index_to_map = None - with suppress(KeyError): - index_to_map = source_table[i_from] - if index_to_map is None: - if isinstance(source_table, pd.DataFrame): - if i_from == "index" and source_table.index.names == [None]: - index_to_map = source_table.index - elif i_from in source_table.index.names: - index_to_map = source_table.index.get_level_values(i_from) - if index_to_map is None: - raise KeyError(i_complete) - indexed_vals = _map_index(i[10:], index_to_map) - if cache_dynamic_indexes: - if isinstance(source_table, (pa.Table)): - source_table = source_table.append_column(i_complete, [indexed_vals]) - else: - source_table[i_complete] = indexed_vals - return indexed_vals - else: - idx = getattr(source_table, 'index', None) - if idx is not None: - if i in idx.names: - return np.asarray(idx.get_level_values(i)) - if i == 'index' and len(idx.names)==1: - return np.asarray(idx) - raise - else: - return np.arange(source_table.shape[0]) - index_keys = meta_match_names_idx.keys() - return tuple(geti(i) for i in index_keys), source_table - - -def _get_inputs(source_table, dtype=np.float32): - input_keys = input_name_positions.keys() - return tuple( - np.asarray(source_table[i], dtype=dtype) - for i in input_keys - ) - - - -input_name_positions = {'auto_dist_OFFPEAK': 0, 'auto_dist_PEAK': 1, 'log_attractions_HBO': 2, 'log_attractions_HBS': 3, 'log_attractions_HBWH': 4, 'log_attractions_HBWL': 5, 'log_attractions_NHB': 6, 'transit_approach_drivetime_OFFPEAK': 7, 'transit_approach_drivetime_PEAK': 8, 'transit_approach_waittime_OFFPEAK': 9, 'transit_approach_waittime_PEAK': 10, 'transit_approach_walktime_OFFPEAK': 11, 'transit_approach_walktime_PEAK': 12, 'transit_ivtt_OFFPEAK': 13, 'transit_ivtt_PEAK': 14, 'transit_ovtt_OFFPEAK': 15, 'transit_ovtt_PEAK': 16} -function_names = ['transit_approach_drivetime_PEAK/auto_dist_PEAK', 'transit_approach_waittime_PEAK/auto_dist_PEAK', 'transit_approach_walktime_PEAK/auto_dist_PEAK', 'transit_ovtt_PEAK/auto_dist_PEAK', 'transit_approach_drivetime_OFFPEAK/auto_dist_OFFPEAK', 'transit_approach_waittime_OFFPEAK/auto_dist_OFFPEAK', 'transit_approach_walktime_OFFPEAK/auto_dist_OFFPEAK', 'transit_ovtt_OFFPEAK/auto_dist_OFFPEAK', 'hard_sigmoid(transit_approach_walktime_PEAK, 4.0, 2.0)', 'hard_sigmoid(transit_approach_walktime_OFFPEAK, 4.0, 2.0)', 'auto_parking_cost_HBWH', 'auto_parking_cost_HBWL', 'auto_parking_cost_HBO', 'auto_parking_cost_HBS', 'auto_parking_cost_NHB', 'auto_parking_cost_HBOR', 'auto_parking_cost_NHBR', 'auto_parking_cost_NHBS', 'samp_wgt', 'log(1/samp_wgt)', 'transit_avail_HBWH', 'transit_avail_HBWL', 'transit_avail_HBS', 'transit_avail_HBO', 'transit_avail_NHB', 'auto_avail_HBWH', '1-auto_avail_HBWH', '1-transit_avail_HBWH', 'auto_avail_HBWL', '1-auto_avail_HBWL', '1-transit_avail_HBWL', 'auto_avail_HBS', '1-auto_avail_HBS', '1-transit_avail_HBS', 'auto_avail_HBO', '1-auto_avail_HBO', '1-transit_avail_HBO', 'auto_avail_NHB', '1-auto_avail_NHB', '1-transit_avail_NHB'] - -# Greetings, tinkerer! The `defs_hash` included here is a safety -# measure to prevent unknowing users creating a mess by modifying -# the code in this module so that it no longer matches the expected -# variable definitions. If you want to modify this code, you should -# delete this hash to allow the code to run without any checks, but -# you do so at your own risk. -defs_hash = 'JLORNT6V2GU5GKGOGY25DSK2SA======' diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/__init__.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/__init__.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBO_EKWWH33ZEA3VXLR4UYBVLRUX.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBO_EKWWH33ZEA3VXLR4UYBVLRUX.py deleted file mode 100644 index 196f0d0..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBO_EKWWH33ZEA3VXLR4UYBVLRUX.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def _1_auto_avail_HBO_EKWWH33ZEA3VXLR4UYBVLRUX( - _args, - _inputs, - _outputs, - -): - return 1 - _outputs[34] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBO_EKWWH33ZEA3VXLR4UYBVLRUX.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBO_EKWWH33ZEA3VXLR4UYBVLRUX.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBS_JA6SY3LPJJDVZQF7IFNL4EWX.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBS_JA6SY3LPJJDVZQF7IFNL4EWX.py deleted file mode 100644 index 6021d18..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBS_JA6SY3LPJJDVZQF7IFNL4EWX.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def _1_auto_avail_HBS_JA6SY3LPJJDVZQF7IFNL4EWX( - _args, - _inputs, - _outputs, - -): - return 1 - _outputs[31] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBS_JA6SY3LPJJDVZQF7IFNL4EWX.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBS_JA6SY3LPJJDVZQF7IFNL4EWX.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBWH_RSSCN3EFDQ2CM4RPVZVAP7K3.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBWH_RSSCN3EFDQ2CM4RPVZVAP7K3.py deleted file mode 100644 index 50955fe..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBWH_RSSCN3EFDQ2CM4RPVZVAP7K3.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def _1_auto_avail_HBWH_RSSCN3EFDQ2CM4RPVZVAP7K3( - _args, - _inputs, - _outputs, - -): - return 1 - _outputs[25] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBWH_RSSCN3EFDQ2CM4RPVZVAP7K3.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBWH_RSSCN3EFDQ2CM4RPVZVAP7K3.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBWL_VWN3Q4WQRAVVJ5ZTYY4OHM63.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBWL_VWN3Q4WQRAVVJ5ZTYY4OHM63.py deleted file mode 100644 index 7bae017..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBWL_VWN3Q4WQRAVVJ5ZTYY4OHM63.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def _1_auto_avail_HBWL_VWN3Q4WQRAVVJ5ZTYY4OHM63( - _args, - _inputs, - _outputs, - -): - return 1 - _outputs[28] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBWL_VWN3Q4WQRAVVJ5ZTYY4OHM63.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBWL_VWN3Q4WQRAVVJ5ZTYY4OHM63.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_NHB_XHHWLREMVWOEBM6NUQF7EFH6.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_NHB_XHHWLREMVWOEBM6NUQF7EFH6.py deleted file mode 100644 index 01950cd..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_NHB_XHHWLREMVWOEBM6NUQF7EFH6.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def _1_auto_avail_NHB_XHHWLREMVWOEBM6NUQF7EFH6( - _args, - _inputs, - _outputs, - -): - return 1 - _outputs[37] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_NHB_XHHWLREMVWOEBM6NUQF7EFH6.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_NHB_XHHWLREMVWOEBM6NUQF7EFH6.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBO_K3RWOEPC3IXNAPRPQQJCHORY.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBO_K3RWOEPC3IXNAPRPQQJCHORY.py deleted file mode 100644 index 62e033c..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBO_K3RWOEPC3IXNAPRPQQJCHORY.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def _1_transit_avail_HBO_K3RWOEPC3IXNAPRPQQJCHORY( - _args, - _inputs, - _outputs, - -): - return 1 - _outputs[23] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBO_K3RWOEPC3IXNAPRPQQJCHORY.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBO_K3RWOEPC3IXNAPRPQQJCHORY.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBS_5CZV3HKDPQJDWZME2XMN7NW6.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBS_5CZV3HKDPQJDWZME2XMN7NW6.py deleted file mode 100644 index 8e1bdce..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBS_5CZV3HKDPQJDWZME2XMN7NW6.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def _1_transit_avail_HBS_5CZV3HKDPQJDWZME2XMN7NW6( - _args, - _inputs, - _outputs, - -): - return 1 - _outputs[22] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBS_5CZV3HKDPQJDWZME2XMN7NW6.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBS_5CZV3HKDPQJDWZME2XMN7NW6.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBWH_NMEWQX35KIWZJMZ5IZZTZHOE.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBWH_NMEWQX35KIWZJMZ5IZZTZHOE.py deleted file mode 100644 index 905c093..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBWH_NMEWQX35KIWZJMZ5IZZTZHOE.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def _1_transit_avail_HBWH_NMEWQX35KIWZJMZ5IZZTZHOE( - _args, - _inputs, - _outputs, - -): - return 1 - _outputs[20] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBWH_NMEWQX35KIWZJMZ5IZZTZHOE.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBWH_NMEWQX35KIWZJMZ5IZZTZHOE.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBWL_MPZ7IOPMILS7SZEG5T2D6HG2.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBWL_MPZ7IOPMILS7SZEG5T2D6HG2.py deleted file mode 100644 index 132b894..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBWL_MPZ7IOPMILS7SZEG5T2D6HG2.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def _1_transit_avail_HBWL_MPZ7IOPMILS7SZEG5T2D6HG2( - _args, - _inputs, - _outputs, - -): - return 1 - _outputs[21] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBWL_MPZ7IOPMILS7SZEG5T2D6HG2.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBWL_MPZ7IOPMILS7SZEG5T2D6HG2.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_NHB_WN7OPNQOSVQ544PG5Q2ZGTNF.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_NHB_WN7OPNQOSVQ544PG5Q2ZGTNF.py deleted file mode 100644 index 15d6136..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_NHB_WN7OPNQOSVQ544PG5Q2ZGTNF.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def _1_transit_avail_NHB_WN7OPNQOSVQ544PG5Q2ZGTNF( - _args, - _inputs, - _outputs, - -): - return 1 - _outputs[24] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_NHB_WN7OPNQOSVQ544PG5Q2ZGTNF.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_NHB_WN7OPNQOSVQ544PG5Q2ZGTNF.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBO.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBO.py deleted file mode 100644 index 97f64e8..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBO.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def auto_avail_HBO( - _args, - _inputs, - _outputs, - -): - return _inputs[2] > -9998 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBO.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBO.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBS.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBS.py deleted file mode 100644 index efa8332..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBS.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def auto_avail_HBS( - _args, - _inputs, - _outputs, - -): - return _inputs[3] > -9998 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBS.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBS.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBWH.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBWH.py deleted file mode 100644 index 003f33a..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBWH.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def auto_avail_HBWH( - _args, - _inputs, - _outputs, - -): - return _inputs[4] > -9998 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBWH.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBWH.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBWL.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBWL.py deleted file mode 100644 index 2c4dd9b..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBWL.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def auto_avail_HBWL( - _args, - _inputs, - _outputs, - -): - return _inputs[5] > -9998 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBWL.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBWL.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_NHB.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_NHB.py deleted file mode 100644 index 212f7a2..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_NHB.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def auto_avail_NHB( - _args, - _inputs, - _outputs, - -): - return _inputs[6] > -9998 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_NHB.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_NHB.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBO.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBO.py deleted file mode 100644 index e672b1f..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBO.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def auto_parking_cost_HBO( - _args, - _inputs, - _outputs, - -): - return 0.0 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBO.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBO.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBOR.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBOR.py deleted file mode 100644 index 66268b7..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBOR.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def auto_parking_cost_HBOR( - _args, - _inputs, - _outputs, - -): - return 0.0 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBOR.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBOR.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBS.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBS.py deleted file mode 100644 index df6d3ab..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBS.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def auto_parking_cost_HBS( - _args, - _inputs, - _outputs, - -): - return 0.0 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBS.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBS.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBWH.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBWH.py deleted file mode 100644 index 0191aa2..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBWH.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def auto_parking_cost_HBWH( - _args, - _inputs, - _outputs, - -): - return 0.0 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBWH.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBWH.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBWL.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBWL.py deleted file mode 100644 index bb94bb2..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBWL.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def auto_parking_cost_HBWL( - _args, - _inputs, - _outputs, - -): - return 0.0 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBWL.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBWL.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_NHB.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_NHB.py deleted file mode 100644 index d08c175..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_NHB.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def auto_parking_cost_NHB( - _args, - _inputs, - _outputs, - -): - return 0.0 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_NHB.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_NHB.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_NHBR.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_NHBR.py deleted file mode 100644 index 47c2972..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_NHBR.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def auto_parking_cost_NHBR( - _args, - _inputs, - _outputs, - -): - return 0.0 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_NHBR.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_NHBR.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_NHBS.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_NHBS.py deleted file mode 100644 index 2b02df6..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_NHBS.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def auto_parking_cost_NHBS( - _args, - _inputs, - _outputs, - -): - return 0.0 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_NHBS.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_NHBS.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_hard_sigmoid_transit_approach_walktime_OFFPEAK__4_0__2_0__FPYQ4GNCVUNJNUMJTUIBMLKO.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_hard_sigmoid_transit_approach_walktime_OFFPEAK__4_0__2_0__FPYQ4GNCVUNJNUMJTUIBMLKO.py deleted file mode 100644 index fac81d8..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_hard_sigmoid_transit_approach_walktime_OFFPEAK__4_0__2_0__FPYQ4GNCVUNJNUMJTUIBMLKO.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def hard_sigmoid_transit_approach_walktime_OFFPEAK__4_0__2_0__FPYQ4GNCVUNJNUMJTUIBMLKO( - _args, - _inputs, - _outputs, - -): - return hard_sigmoid(_inputs[11], 4.0, 2.0) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_hard_sigmoid_transit_approach_walktime_OFFPEAK__4_0__2_0__FPYQ4GNCVUNJNUMJTUIBMLKO.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_hard_sigmoid_transit_approach_walktime_OFFPEAK__4_0__2_0__FPYQ4GNCVUNJNUMJTUIBMLKO.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_hard_sigmoid_transit_approach_walktime_PEAK__4_0__2_0__AJ26DYAVZX7MOBOG5SOJABST.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_hard_sigmoid_transit_approach_walktime_PEAK__4_0__2_0__AJ26DYAVZX7MOBOG5SOJABST.py deleted file mode 100644 index e0bd3be..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_hard_sigmoid_transit_approach_walktime_PEAK__4_0__2_0__AJ26DYAVZX7MOBOG5SOJABST.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def hard_sigmoid_transit_approach_walktime_PEAK__4_0__2_0__AJ26DYAVZX7MOBOG5SOJABST( - _args, - _inputs, - _outputs, - -): - return hard_sigmoid(_inputs[12], 4.0, 2.0) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_hard_sigmoid_transit_approach_walktime_PEAK__4_0__2_0__AJ26DYAVZX7MOBOG5SOJABST.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_hard_sigmoid_transit_approach_walktime_PEAK__4_0__2_0__AJ26DYAVZX7MOBOG5SOJABST.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_log_1_samp_wgt__PLSMOODNF77UOPHIVH6I2WBL.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_log_1_samp_wgt__PLSMOODNF77UOPHIVH6I2WBL.py deleted file mode 100644 index 571d66e..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_log_1_samp_wgt__PLSMOODNF77UOPHIVH6I2WBL.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def log_1_samp_wgt__PLSMOODNF77UOPHIVH6I2WBL( - _args, - _inputs, - _outputs, - -): - return 0.0 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_log_1_samp_wgt__PLSMOODNF77UOPHIVH6I2WBL.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_log_1_samp_wgt__PLSMOODNF77UOPHIVH6I2WBL.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_samp_wgt.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_samp_wgt.py deleted file mode 100644 index 24f6e4a..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_samp_wgt.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def samp_wgt( - _args, - _inputs, - _outputs, - -): - return 1.0 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_samp_wgt.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_samp_wgt.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_drivetime_OFFPEAK_auto_dist_OFFPEAK_U2242PIA3ZL4MJS726HCCG73.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_drivetime_OFFPEAK_auto_dist_OFFPEAK_U2242PIA3ZL4MJS726HCCG73.py deleted file mode 100644 index ec46953..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_drivetime_OFFPEAK_auto_dist_OFFPEAK_U2242PIA3ZL4MJS726HCCG73.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def transit_approach_drivetime_OFFPEAK_auto_dist_OFFPEAK_U2242PIA3ZL4MJS726HCCG73( - _args, - _inputs, - _outputs, - -): - return _inputs[7] / _inputs[0] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_drivetime_OFFPEAK_auto_dist_OFFPEAK_U2242PIA3ZL4MJS726HCCG73.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_drivetime_OFFPEAK_auto_dist_OFFPEAK_U2242PIA3ZL4MJS726HCCG73.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_drivetime_PEAK_auto_dist_PEAK_SVETJXGBSVYEYM7OVBAQW2PX.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_drivetime_PEAK_auto_dist_PEAK_SVETJXGBSVYEYM7OVBAQW2PX.py deleted file mode 100644 index 607fb27..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_drivetime_PEAK_auto_dist_PEAK_SVETJXGBSVYEYM7OVBAQW2PX.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def transit_approach_drivetime_PEAK_auto_dist_PEAK_SVETJXGBSVYEYM7OVBAQW2PX( - _args, - _inputs, - _outputs, - -): - return _inputs[8] / _inputs[1] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_drivetime_PEAK_auto_dist_PEAK_SVETJXGBSVYEYM7OVBAQW2PX.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_drivetime_PEAK_auto_dist_PEAK_SVETJXGBSVYEYM7OVBAQW2PX.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_waittime_OFFPEAK_auto_dist_OFFPEAK_22UIGWVENT7RTALQKKOHEPXM.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_waittime_OFFPEAK_auto_dist_OFFPEAK_22UIGWVENT7RTALQKKOHEPXM.py deleted file mode 100644 index 79f01ca..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_waittime_OFFPEAK_auto_dist_OFFPEAK_22UIGWVENT7RTALQKKOHEPXM.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def transit_approach_waittime_OFFPEAK_auto_dist_OFFPEAK_22UIGWVENT7RTALQKKOHEPXM( - _args, - _inputs, - _outputs, - -): - return _inputs[9] / _inputs[0] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_waittime_OFFPEAK_auto_dist_OFFPEAK_22UIGWVENT7RTALQKKOHEPXM.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_waittime_OFFPEAK_auto_dist_OFFPEAK_22UIGWVENT7RTALQKKOHEPXM.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_waittime_PEAK_auto_dist_PEAK_YHJNF2B3VEICSZL64Y2XLV4S.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_waittime_PEAK_auto_dist_PEAK_YHJNF2B3VEICSZL64Y2XLV4S.py deleted file mode 100644 index 1d62e39..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_waittime_PEAK_auto_dist_PEAK_YHJNF2B3VEICSZL64Y2XLV4S.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def transit_approach_waittime_PEAK_auto_dist_PEAK_YHJNF2B3VEICSZL64Y2XLV4S( - _args, - _inputs, - _outputs, - -): - return _inputs[10] / _inputs[1] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_waittime_PEAK_auto_dist_PEAK_YHJNF2B3VEICSZL64Y2XLV4S.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_waittime_PEAK_auto_dist_PEAK_YHJNF2B3VEICSZL64Y2XLV4S.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_walktime_OFFPEAK_auto_dist_OFFPEAK_ITAE2YOSBIY76DBTPIPT6QD2.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_walktime_OFFPEAK_auto_dist_OFFPEAK_ITAE2YOSBIY76DBTPIPT6QD2.py deleted file mode 100644 index 71aa571..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_walktime_OFFPEAK_auto_dist_OFFPEAK_ITAE2YOSBIY76DBTPIPT6QD2.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def transit_approach_walktime_OFFPEAK_auto_dist_OFFPEAK_ITAE2YOSBIY76DBTPIPT6QD2( - _args, - _inputs, - _outputs, - -): - return _inputs[11] / _inputs[0] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_walktime_OFFPEAK_auto_dist_OFFPEAK_ITAE2YOSBIY76DBTPIPT6QD2.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_walktime_OFFPEAK_auto_dist_OFFPEAK_ITAE2YOSBIY76DBTPIPT6QD2.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_walktime_PEAK_auto_dist_PEAK_T52CC4SUBMFSLGDNMCSO7A7J.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_walktime_PEAK_auto_dist_PEAK_T52CC4SUBMFSLGDNMCSO7A7J.py deleted file mode 100644 index 3c18880..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_walktime_PEAK_auto_dist_PEAK_T52CC4SUBMFSLGDNMCSO7A7J.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def transit_approach_walktime_PEAK_auto_dist_PEAK_T52CC4SUBMFSLGDNMCSO7A7J( - _args, - _inputs, - _outputs, - -): - return _inputs[12] / _inputs[1] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_walktime_PEAK_auto_dist_PEAK_T52CC4SUBMFSLGDNMCSO7A7J.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_walktime_PEAK_auto_dist_PEAK_T52CC4SUBMFSLGDNMCSO7A7J.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBO.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBO.py deleted file mode 100644 index 1486d27..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBO.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def transit_avail_HBO( - _args, - _inputs, - _outputs, - -): - return (_inputs[13] < 999) & (_inputs[11] < 999) & (_inputs[7] < 999) & (_inputs[2] > -9998) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBO.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBO.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBS.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBS.py deleted file mode 100644 index cfd01f6..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBS.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def transit_avail_HBS( - _args, - _inputs, - _outputs, - -): - return (_inputs[13] < 999) & (_inputs[11] < 999) & (_inputs[7] < 999) & (_inputs[3] > -9998) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBS.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBS.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBWH.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBWH.py deleted file mode 100644 index 3a39e56..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBWH.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def transit_avail_HBWH( - _args, - _inputs, - _outputs, - -): - return (_inputs[14] < 999) & (_inputs[12] < 999) & (_inputs[8] < 999) & (_inputs[4] > -9998) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBWH.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBWH.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBWL.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBWL.py deleted file mode 100644 index 9ae5ea4..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBWL.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def transit_avail_HBWL( - _args, - _inputs, - _outputs, - -): - return (_inputs[14] < 999) & (_inputs[12] < 999) & (_inputs[8] < 999) & (_inputs[5] > -9998) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBWL.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBWL.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_NHB.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_NHB.py deleted file mode 100644 index a6d4ee2..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_NHB.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def transit_avail_NHB( - _args, - _inputs, - _outputs, - -): - return (_inputs[13] < 999) & (_inputs[11] < 999) & (_inputs[7] < 999) & (_inputs[6] > -9998) diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_NHB.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_NHB.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_ovtt_OFFPEAK_auto_dist_OFFPEAK_IY4UAVBMS2HPHNYZJLSMWG3V.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_ovtt_OFFPEAK_auto_dist_OFFPEAK_IY4UAVBMS2HPHNYZJLSMWG3V.py deleted file mode 100644 index 530c3d6..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_ovtt_OFFPEAK_auto_dist_OFFPEAK_IY4UAVBMS2HPHNYZJLSMWG3V.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def transit_ovtt_OFFPEAK_auto_dist_OFFPEAK_IY4UAVBMS2HPHNYZJLSMWG3V( - _args, - _inputs, - _outputs, - -): - return _inputs[15] / _inputs[0] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_ovtt_OFFPEAK_auto_dist_OFFPEAK_IY4UAVBMS2HPHNYZJLSMWG3V.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_ovtt_OFFPEAK_auto_dist_OFFPEAK_IY4UAVBMS2HPHNYZJLSMWG3V.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_ovtt_PEAK_auto_dist_PEAK_UIAXX4VIE5PP53PJMCSMEFOP.py b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_ovtt_PEAK_auto_dist_PEAK_UIAXX4VIE5PP53PJMCSMEFOP.py deleted file mode 100644 index f9af209..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_ovtt_PEAK_auto_dist_PEAK_UIAXX4VIE5PP53PJMCSMEFOP.py +++ /dev/null @@ -1,16 +0,0 @@ - -import numba -import numpy as np -from numpy import log, exp, log1p, expm1 -from sharrow.maths import piece, hard_sigmoid - - - -@numba.jit(cache=True, error_model='numpy', boundscheck=False, nopython=True, fastmath=True) -def transit_ovtt_PEAK_auto_dist_PEAK_UIAXX4VIE5PP53PJMCSMEFOP( - _args, - _inputs, - _outputs, - -): - return _inputs[16] / _inputs[1] diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_ovtt_PEAK_auto_dist_PEAK_UIAXX4VIE5PP53PJMCSMEFOP.py.lock b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_ovtt_PEAK_auto_dist_PEAK_UIAXX4VIE5PP53PJMCSMEFOP.py.lock deleted file mode 100755 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/application_data.py b/src/Mode-Dest-TOD/cmap_modedest/fast/application_data.py deleted file mode 100644 index 8d839fe..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/application_data.py +++ /dev/null @@ -1,335 +0,0 @@ -import larch -import numpy as np -from numba import njit, vectorize -import pandas as pd -import pyarrow as pa -from sharrow import Dataset, SharedData, Table, local_cache - -from .tnc_los import tnc_los_functions, taxi_cost, tnc_cost -from ..cmap_logging import getLogger, getSubLogger -from ..purposes import purposesA -log = getLogger() - -def application_data(dh): - """ - This function precompiles the application data flow. - - It includes a bunch of random data formatted the same manner as the real - data will be, so that the code can be optimized ahead of time. - - Parameters - ---------- - dh - - Returns - ------- - sharrow.Flow - """ - log = getSubLogger("fast.application_data") - - log.info("preparing application data") - - #taxi_cost, tnc_solo_cost, tnc_pool_cost = \ - tnc_los_functions(dh) - - otazi, dtazi = np.random.choice(3000, 60000), np.random.choice(3000, 60000) - - tbl = Table({ - 'otaz_idx': otazi, - 'dtaz_idx': dtazi, - 'otaz': otazi + 1, - 'dtaz': dtazi + 1, - 'chooser_row': np.arange(otazi.size) - }) - - ozones = Dataset.from_dataframe( - dh.m01.set_index( - dh.m01.index.rename("otaz"), - ), - ).squash_index(otaz='otaz_idx') - - attractions = Dataset.from_dataframe( - dh.trip_attractions5.astype(np.float64).set_index( - dh.trip_attractions5.index.rename("dtaz"), - ), - ).squash_index(dtaz='dtaz_idx') - - omx_auto = dh.skims.raw.select_and_rename( - {v:k for k,v in dh.skims.auto.col_mapping.items()} - ).squash_index(otaz='otaz_idx', dtaz='dtaz_idx') - - # inject intrazonal distance into auto skims - # set intrazonal auto_dist - intrazonal_zone_area = dh.zone_shp.area # square feet - intrazonal_dist = np.sqrt(intrazonal_zone_area) / 5280 * 0.667 - np.fill_diagonal( - omx_auto['am_dist'].values, - intrazonal_dist, - ) - np.fill_diagonal( - omx_auto['md_dist'].values, - intrazonal_dist, - ) - - omx_transit_pk = dh.skims.raw.select_and_rename( - {v:k for k,v in dh.skims.transit_pk.col_mapping.items()} - ).squash_index(otaz='otaz_idx', dtaz='dtaz_idx') - - omx_transit_op = dh.skims.raw.select_and_rename( - {v:k for k,v in dh.skims.transit_op.col_mapping.items()} - ).squash_index(otaz='otaz_idx', dtaz='dtaz_idx') - - # load lastest computed autopropensity as a pd.DataFrame - from ..data_handlers.m01_handler import attach_areatypes - autopropensity = attach_areatypes( - dh, - pd.DataFrame(index=dh.m01.index), - "", - "", - targetzone=dh.m01.index, - )[['autopropensity']] - o_autopropensity = Dataset.from_dataframe( - autopropensity.set_index( - autopropensity.index.rename("otaz"), - ) - ).squash_index(otaz='otaz_idx') - d_autopropensity = Dataset.from_dataframe( - autopropensity.set_index( - autopropensity.index.rename("dtaz"), - ) - ).squash_index(dtaz='dtaz_idx') - - - tg = SharedData( - tbl, - **{ - 'transit_pk': omx_transit_pk, - 'transit_op': omx_transit_op, - 'auto_skims': omx_auto, - 'ozone': ozones, - 'dzone': ozones.set_match_names({"otaz_idx":'dtaz_idx'}), - 'attractions': attractions, - 'o_autopropensity': o_autopropensity, - 'd_autopropensity': d_autopropensity, - }, - extra_funcs=( - taxi_cost, tnc_cost, - ), - extra_vars=dict( - taxi_cost_struct=dh.cfg['taxi_cost_struct'], - tnc_solo_peak_struct=dh.cfg['tnc_cost_struct_solo_peak'], - tnc_solo_offpeak_struct=dh.cfg['tnc_cost_struct_solo_peak'], - tnc_pool_peak_struct=dh.cfg['tnc_cost_struct_pool_peak'], - tnc_pool_offpeak_struct=dh.cfg['tnc_cost_struct_pool_peak'], - ), - ) - - log.info("setup application data flow") - ss = tg.setup_flow({ - - 'o_zone == dtaz': 'otaz == dtaz', #### fails dtype - - 'transit_ivtt_PEAK' : 'transit_pk.ivtt', - 'transit_ivtt_OFFPEAK': 'transit_op.ivtt', - 'transit_ovtt_PEAK' : 'transit_pk.ovtt', - 'transit_ovtt_OFFPEAK': 'transit_op.ovtt', - 'transit_fare_PEAK' : 'transit_pk.fare', - 'transit_fare_OFFPEAK': 'transit_op.fare', - - 'piece(transit_ivtt_OFFPEAK, None, 20)': 'piece(transit_ivtt_OFFPEAK, None, 20)', - 'piece(transit_ivtt_OFFPEAK, 20, None)': 'piece(transit_ivtt_OFFPEAK, 20, None)', - 'autopropensity': 'd_autopropensity.autopropensity', - - 'auto_time_PEAK': 'auto_skims.am_time', - 'auto_dist_PEAK': 'auto_skims.am_dist', - 'auto_time_OFFPEAK': 'auto_skims.md_time', - 'auto_dist_OFFPEAK': 'auto_skims.md_dist', - 'auto_opcost_PEAK': 'auto_skims.am_opcost', - 'auto_opcost_hov_PEAK': 'auto_skims.am_opcost_hov', - 'auto_opcost_OFFPEAK': 'auto_skims.md_opcost', - 'auto_toll_hiinc_PEAK': 'np.fmax(auto_skims.am_toll_hiinc, 0)', - 'auto_toll_loinc_PEAK': 'np.fmax(auto_skims.am_toll_loinc, 0)', - 'auto_toll_hov_hiinc_PEAK': 'np.fmax(auto_skims.am_toll_hov_hiinc, 0)', - 'auto_toll_hov_loinc_PEAK': 'np.fmax(auto_skims.am_toll_hov_loinc, 0)', - 'auto_toll_OFFPEAK': 'np.fmax(auto_skims.md_toll, 0)', - - 'piece(auto_dist_PEAK,None,0.5)': 'piece(auto_skims.am_dist,None,0.5)', - 'piece(auto_dist_PEAK,0.5,1.0)' : 'piece(auto_skims.am_dist,0.5,1.0)', - 'piece(auto_dist_PEAK,1.0,None)': 'piece(auto_skims.am_dist,1.0,None)', - 'piece(auto_dist_PEAK,None,5)' : 'piece(auto_skims.am_dist,None,5)', - 'piece(auto_dist_PEAK,5,10)' : 'piece(auto_skims.am_dist,5,10)', - 'piece(auto_dist_PEAK,10,None)' : 'piece(auto_skims.am_dist,10,None)', - - 'piece(auto_dist_OFFPEAK,None,0.5)': 'piece(auto_skims.md_dist,None,0.5)', - 'piece(auto_dist_OFFPEAK,0.5,1.0)' : 'piece(auto_skims.md_dist,0.5,1.0)', - 'piece(auto_dist_OFFPEAK,1.0,None)': 'piece(auto_skims.md_dist,1.0,None)', - 'piece(auto_dist_OFFPEAK,None,5)' : 'piece(auto_skims.md_dist,None,5)', - 'piece(auto_dist_OFFPEAK,5,10)' : 'piece(auto_skims.md_dist,5,10)', - 'piece(auto_dist_OFFPEAK,10,None)' : 'piece(auto_skims.md_dist,10,None)', - - 'taxi_fare_PEAK': 'taxi_cost(auto_skims.am_time, auto_skims.am_dist, otaz, dtaz, taxi_cost_struct)', - 'taxi_fare_OFFPEAK': 'taxi_cost(auto_skims.md_time, auto_skims.md_dist, otaz, dtaz, taxi_cost_struct)', - 'tnc_solo_fare_PEAK': 'tnc_cost(auto_skims.am_time, auto_skims.am_dist, otaz, dtaz, tnc_solo_peak_struct)', - 'tnc_solo_fare_OFFPEAK': 'tnc_cost(auto_skims.md_time, auto_skims.md_dist, otaz, dtaz, tnc_solo_offpeak_struct)', - 'tnc_pool_fare_PEAK': 'tnc_cost(auto_skims.am_time, auto_skims.am_dist, otaz, dtaz, tnc_pool_peak_struct)', - 'tnc_pool_fare_OFFPEAK': 'tnc_cost(auto_skims.md_time, auto_skims.md_dist, otaz, dtaz, tnc_pool_offpeak_struct)', - - 'taxi_wait_time_PEAK' : 'ozone.taxi_wait_pk', - 'taxi_wait_time_OFFPEAK' : 'ozone.taxi_wait_op', - 'tnc_solo_wait_time_PEAK' : 'ozone.tnc_solo_wait_pk', - 'tnc_solo_wait_time_OFFPEAK': 'ozone.tnc_solo_wait_op', - 'tnc_pool_wait_time_PEAK' : 'ozone.tnc_pool_wait_pk', - 'tnc_pool_wait_time_OFFPEAK': 'ozone.tnc_pool_wait_op', - - 'taxi_wait_time_PEAK/auto_dist_PEAK' : 'ozone.taxi_wait_pk/auto_skims.am_dist', - 'taxi_wait_time_OFFPEAK/auto_dist_OFFPEAK' : 'ozone.taxi_wait_op/auto_skims.md_dist', - 'tnc_solo_wait_time_PEAK/auto_dist_PEAK' : 'ozone.tnc_solo_wait_pk/auto_skims.am_dist', - 'tnc_solo_wait_time_OFFPEAK/auto_dist_OFFPEAK': 'ozone.tnc_solo_wait_op/auto_skims.md_dist', - 'tnc_pool_wait_time_PEAK/auto_dist_PEAK' : 'ozone.tnc_pool_wait_pk/auto_skims.am_dist', - 'tnc_pool_wait_time_OFFPEAK/auto_dist_OFFPEAK': 'ozone.tnc_pool_wait_op/auto_skims.md_dist', - - 'fmax(ozone_areatype, areatype)==1': 'max(ozone.zone_type, dzone.zone_type)==1', - 'fmax(ozone_areatype, areatype)==2': 'max(ozone.zone_type, dzone.zone_type)==2', - 'fmax(ozone_areatype, areatype)==3': 'max(ozone.zone_type, dzone.zone_type)==3', - 'fmax(ozone_areatype, areatype)==4': 'max(ozone.zone_type, dzone.zone_type)==4', - - 'fmin(ozone_areatype, areatype)==1': 'min(ozone.zone_type, dzone.zone_type)==1', - 'fmin(ozone_areatype, areatype)==2': 'min(ozone.zone_type, dzone.zone_type)==2', - 'fmin(ozone_areatype, areatype)==3': 'min(ozone.zone_type, dzone.zone_type)==3', - 'fmin(ozone_areatype, areatype)==4': 'min(ozone.zone_type, dzone.zone_type)==4', - - 'log_attractions_HBWH': 'log(attractions.HBWH)', - 'log_attractions_HBWL': 'log(attractions.HBWL)', - 'log_attractions_HBS': 'log(attractions.HBS)', - 'log_attractions_HBO': 'log(attractions.HBO)', - 'log_attractions_NHB': 'log(attractions.NHB)', - # 'log_attractions_HBOR': 'log(attractions.HBOR)', - # 'log_attractions_NHBR': 'log(attractions.NHBR)', - # 'log_attractions_NHBS': 'log(attractions.NHBS)', - - 'log_attractions_HBWH > -666': 'log(attractions.HBWH) > -666', - 'log_attractions_HBWL > -666': 'log(attractions.HBWL) > -666', - 'log_attractions_HBS > -666': 'log(attractions.HBS) > -666', - 'log_attractions_HBO > -666': 'log(attractions.HBO) > -666', - 'log_attractions_NHB > -666': 'log(attractions.NHB) > -666', - # 'log_attractions_HBOR > -666': 'log(attractions.HBOR) > -666', - # 'log_attractions_NHBR > -666': 'log(attractions.NHBR) > -666', - # 'log_attractions_NHBS > -666': 'log(attractions.NHBS) > -666', - - }, dtype="float64", cache_dir=local_cache(), name="S1") - - try: - log.debug("load first run") - df = ss.load(tbl, as_dataframe=True, dtype=np.float64) - log.debug("load second run") - df2 = ss.load(tbl, as_dataframe=True, dtype=np.float64) - log.debug("check first and second run are equal") - try: - pd.testing.assert_frame_equal(df, df2) - except AssertionError as err: - log.exception(err) - # from ..cmap_logging import log_df - # log_df(df2, logger=log, verbose=1, level=10) - - return ss - finally: - log.info("application_data flow ready") - - - - -def application_data2(dh, in_table): - log = getSubLogger("fast.application_data2") - log.info("prepare application_data2") - - coldefs = { - - 'transit_approach_drivetime_PEAK/auto_dist_PEAK': f'transit_approach_drivetime_PEAK/auto_dist_PEAK', - 'transit_approach_waittime_PEAK/auto_dist_PEAK': f'transit_approach_waittime_PEAK/auto_dist_PEAK', - 'transit_approach_walktime_PEAK/auto_dist_PEAK': f'transit_approach_walktime_PEAK/auto_dist_PEAK', - 'transit_ovtt_PEAK/auto_dist_PEAK': f'transit_ovtt_PEAK/auto_dist_PEAK', - - 'transit_approach_drivetime_OFFPEAK/auto_dist_OFFPEAK': f'transit_approach_drivetime_OFFPEAK/auto_dist_OFFPEAK', - 'transit_approach_waittime_OFFPEAK/auto_dist_OFFPEAK': f'transit_approach_waittime_OFFPEAK/auto_dist_OFFPEAK', - 'transit_approach_walktime_OFFPEAK/auto_dist_OFFPEAK': f'transit_approach_walktime_OFFPEAK/auto_dist_OFFPEAK', - 'transit_ovtt_OFFPEAK/auto_dist_OFFPEAK': f'transit_ovtt_OFFPEAK/auto_dist_OFFPEAK', - - 'hard_sigmoid(transit_approach_walktime_PEAK, 4.0, 2.0)': f'hard_sigmoid(transit_approach_walktime_PEAK, 4.0, 2.0)', - 'hard_sigmoid(transit_approach_walktime_OFFPEAK, 4.0, 2.0)': f'hard_sigmoid(transit_approach_walktime_OFFPEAK, 4.0, 2.0)', - - # # TODO fix auto parking cost - # # _parking_cost, _free_parking = parking_cost_v2( - - 'auto_parking_cost_HBWH': '0.0', - 'auto_parking_cost_HBWL': '0.0', - 'auto_parking_cost_HBO': '0.0', - 'auto_parking_cost_HBS': '0.0', - 'auto_parking_cost_NHB': '0.0', - 'auto_parking_cost_HBOR': '0.0', - 'auto_parking_cost_NHBR': '0.0', - 'auto_parking_cost_NHBS': '0.0', - - 'samp_wgt': '1.0', - 'log(1/samp_wgt)': '0.0', - - 'transit_avail_HBWH': ( - "(transit_ivtt_PEAK < 999)" - "& (transit_approach_walktime_PEAK < 999)" - "& (transit_approach_drivetime_PEAK < 999)" - "& (log_attractions_HBWH > -9998)" - ), - 'transit_avail_HBWL': ( - "(transit_ivtt_PEAK < 999)" - "& (transit_approach_walktime_PEAK < 999)" - "& (transit_approach_drivetime_PEAK < 999)" - "& (log_attractions_HBWL > -9998)" - ), - 'transit_avail_HBS': ( - "(transit_ivtt_OFFPEAK < 999)" - "& (transit_approach_walktime_OFFPEAK < 999)" - "& (transit_approach_drivetime_OFFPEAK < 999)" - "& (log_attractions_HBS > -9998)" - ), - 'transit_avail_HBO': ( - "(transit_ivtt_OFFPEAK < 999)" - "& (transit_approach_walktime_OFFPEAK < 999)" - "& (transit_approach_drivetime_OFFPEAK < 999)" - "& (log_attractions_HBO > -9998)" - ), - 'transit_avail_NHB': ( - "(transit_ivtt_OFFPEAK < 999)" - "& (transit_approach_walktime_OFFPEAK < 999)" - "& (transit_approach_drivetime_OFFPEAK < 999)" - "& (log_attractions_NHB > -9998)" - ), - } - - for purpose in purposesA: - coldefs.update({ - f'auto_avail_{purpose}': f'log_attractions_{purpose} > -9998', - f'1-auto_avail_{purpose}': f'1-auto_avail_{purpose}', - f'1-transit_avail_{purpose}': f'1-transit_avail_{purpose}', - }) - - log.info("setup application data step 2 flow") - processor = SharedData(in_table).setup_flow( - coldefs, - cache_dir=local_cache(), - name="S2", - dtype="float64", - ) - - try: - log.debug("load first hit") - df = processor.load(in_table, as_dataframe=True) - log.debug("load second hit") - df2 = processor.load(in_table, as_dataframe=True) - log.debug("check first and second hits are equal") - try: - pd.testing.assert_frame_equal(df, df2) - except AssertionError as err: - log.exception(err) - return processor - finally: - log.info("application_data2 flow ready") - diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/parking_cost.py b/src/Mode-Dest-TOD/cmap_modedest/fast/parking_cost.py deleted file mode 100644 index c4f8c91..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/parking_cost.py +++ /dev/null @@ -1,102 +0,0 @@ -import numpy as np -import numba as nb - -def compile_parking_cost_v2(dh): - - cbd_parking_price_prob_array = np.zeros([dh.cbd_parking_price_prob.index.max(), 5], dtype=np.float32) - for dtaz, priceprob in dh.cbd_parking_price_prob.iterrows(): - cbd_parking_price_prob_array[dtaz-1, :] = priceprob.to_numpy() - - cbd_parking_prices_array = np.zeros([dh.cbd_parking_price_prob.index.max(), 5], dtype=np.float32) - for dtaz, prices in dh.cbd_parking_prices.iterrows(): - cbd_parking_prices_array[dtaz-1, :] = prices.to_numpy() - - zone_type_array = dh.m01.zone_type.to_numpy().astype(np.int32) - - default_parking_costs_array = np.zeros([ - 4, # purposes - 4, # zonetypes - ]) - - default_parking_costs_array[0, 0] = dh.cfg.parking_costs.defaults.HW[1] - default_parking_costs_array[0, 1] = dh.cfg.parking_costs.defaults.HW[2] - default_parking_costs_array[0, 2] = dh.cfg.parking_costs.defaults.HW[3] - default_parking_costs_array[0, 3] = dh.cfg.parking_costs.defaults.HW[4] - - default_parking_costs_array[1, 0] = dh.cfg.parking_costs.defaults.HW[1] - default_parking_costs_array[1, 1] = dh.cfg.parking_costs.defaults.HW[2] - default_parking_costs_array[1, 2] = dh.cfg.parking_costs.defaults.HW[3] - default_parking_costs_array[1, 3] = dh.cfg.parking_costs.defaults.HW[4] - - default_parking_costs_array[2, 0] = dh.cfg.parking_costs.defaults.HO[1] - default_parking_costs_array[2, 1] = dh.cfg.parking_costs.defaults.HO[2] - default_parking_costs_array[2, 2] = dh.cfg.parking_costs.defaults.HO[3] - default_parking_costs_array[2, 3] = dh.cfg.parking_costs.defaults.HO[4] - - default_parking_costs_array[3, 0] = dh.cfg.parking_costs.defaults.NH[1] - default_parking_costs_array[3, 1] = dh.cfg.parking_costs.defaults.NH[2] - default_parking_costs_array[3, 2] = dh.cfg.parking_costs.defaults.NH[3] - default_parking_costs_array[3, 3] = dh.cfg.parking_costs.defaults.NH[4] - - IncomeCeiling = dh.cbd_parking2.IncomeCeiling.to_numpy() - FreeParkingPct = dh.cbd_parking2.FreeParkingPct.to_numpy() - - @nb.njit - def parking_cost_v2( - DEST, - INCOME, - HOURS, - purpose, - random_seed=None, - ): - - """ - Draw a parking cost from the random distribution in the destination zone. - - Parameters - ---------- - DEST : int - TAZ ID for destination - INCOME : float - HOURS : float - Number of hours of parking to pay for - purpose : int - 0:'HW', 1:'HW, 2:'HO', 3:'NH' - random_seed : int, optional - - Returns - ------- - CAPK, WALK3, INTOCC, BLK, SI : array, shape[ITER] - parking cost, walktime, vehicle occupancy, blocks walked, savings rate - """ - - if random_seed is not None: - np.random.seed(random_seed) - - rand_free_parking = np.random.rand() * 100. # Free Parking randomizer - rand_parking_price = np.random.rand() # Parking Rate randomizer - #RAN5 = np.random.rand() * 100. # Auto Occupancy randomizer - - hourly_cost = 0 - if DEST <= cbd_parking_price_prob_array.shape[0]: - for i in range(5): - rand_parking_price -= cbd_parking_price_prob_array[DEST-1, i] - if rand_parking_price < 0: - hourly_cost = cbd_parking_prices_array[DEST-1, i] - break - - if hourly_cost == 0: - dest_zone_type = zone_type_array[DEST-1] - hourly_cost = default_parking_costs_array[purpose, dest_zone_type-1] - - free_parking = False - for j2 in range(5): - if INCOME <= IncomeCeiling[j2]: - if rand_free_parking <= FreeParkingPct[j2]: - hourly_cost = 0.0 - free_parking = True - break - - return hourly_cost*HOURS, free_parking - - return parking_cost_v2 \ No newline at end of file diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/random_generator.py b/src/Mode-Dest-TOD/cmap_modedest/fast/random_generator.py deleted file mode 100644 index 7fc05c1..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/random_generator.py +++ /dev/null @@ -1,42 +0,0 @@ -import numba as nb -import numbers -import numpy as np - -@nb.njit -def check_random_generator(seed): - """ - Turn a seed into a numpy RandomState instance - - Parameters - ---------- - seed : None | int | instance of Generator - If seed is None, return a default Generator. - If seed is an int, return a new Generator instance seeded with seed. - If seed is already a Generator instance, return it. - Otherwise raise ValueError. - """ - if seed is not None: - return default_rng() - if isinstance(seed, numbers.Integral): - return default_rng(SeedSequence(seed % 1<<32)) - if isinstance(seed, Generator): - return seed - raise ValueError('%r cannot be used to seed a random generator instance' % seed) - - -@nb.njit -def multichoices(probs, samplesizes, seeds=None): - choice_table = np.zeros(probs.shape, dtype=np.int32) - for i in range(probs.shape[0]): - if seeds is not None: - np.random.seed(seeds[i]) - pr = probs[i] - samplesize = samplesizes[i] - for k in range(samplesize): - rando = np.random.random() - for j in range(probs.shape[1]): - rando -= pr[j] - if rando < 0: - choice_table[i, j] += 1 - break - return choice_table diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/tnc_los.py b/src/Mode-Dest-TOD/cmap_modedest/fast/tnc_los.py deleted file mode 100644 index 1b05655..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/tnc_los.py +++ /dev/null @@ -1,388 +0,0 @@ -import numba as nb -import numpy as np -import pandas as pd -import yaml -from ..addict import Dict -from collections import namedtuple -from typing import NamedTuple - -zone_to_cents_t = nb.types.DictType(nb.int32, nb.float32) - - -class TaxiCostStruct(NamedTuple): - flag_pull: float - per_minute: float - per_mile: float - airport_pickup_fee: float - airport_pickup_zones: np.ndarray - - -class TncCostStruct(NamedTuple): - base_fare: float - per_minute: float - per_mile: float - min_fare: float - booking_fee: float - special_fee: float - downtown_fee: float - special_zones: np.ndarray - downtown_zones: np.ndarray - - -@nb.njit(cache=True) -def taxi_cost(auto_time, auto_dist, o_zone, d_zone, taxi_cost_struct): - """ - Compute taxi fare. - - A single set of rates (Chicago medallion rates for in-city trips) - is used; fares for taxi trips outside Chicago are close to this - rate and rare enough that more precision is unneeded. - - Parameters - ---------- - auto_time, auto_dist : array-like - - Returns - ------- - fare : array-like - """ - cost = ( - taxi_cost_struct.flag_pull - + auto_time * taxi_cost_struct.per_minute - + auto_dist * taxi_cost_struct.per_mile - ) - if taxi_cost_struct.airport_pickup_fee: - bucket_applies = False - for i in range(taxi_cost_struct.airport_pickup_zones.size): - if taxi_cost_struct.airport_pickup_zones[i] == o_zone: - bucket_applies = True - break - if bucket_applies: - cost += taxi_cost_struct.airport_pickup_fee - - return cost - -@nb.njit(cache=True) -def tnc_cost(auto_time, auto_dist, o_zone, d_zone, tnc_cost_struct): - """ - Compute the TNC cost. - - Parameters - ---------- - auto_time, auto_dist : float - The auto travel time and distance for a set of trips. - o_zone, d_zone : int - Zone numbers for origin and destination - tnc_cost_struct : TncCostStruct - Use the correct struct for peak/offpeak and solo/shared. - - Returns - ------- - float - """ - cost = ( - tnc_cost_struct.per_minute * auto_time - + tnc_cost_struct.per_mile * auto_dist - + tnc_cost_struct.base_fare - ) - cost = max(cost, tnc_cost_struct.min_fare) + tnc_cost_struct.booking_fee - - if tnc_cost_struct.special_fee: - bucket_applies = False - for i in range(tnc_cost_struct.special_zones.size): - if tnc_cost_struct.special_zones[i] == o_zone or tnc_cost_struct.special_zones[i] == d_zone: - bucket_applies = True - break - if bucket_applies: - cost += tnc_cost_struct.special_fee - - if tnc_cost_struct.downtown_fee: - bucket_applies = False - for i in range(tnc_cost_struct.downtown_zones.size): - if tnc_cost_struct.downtown_zones[i] == o_zone or tnc_cost_struct.downtown_zones[i] == d_zone: - bucket_applies = True - break - if bucket_applies: - cost += tnc_cost_struct.downtown_fee - - return cost - - -### CONFIG ### - -def tnc_los_functions(dh): - - with open(dh.filenames.config, 'rt') as yf: - cfg = Dict(yaml.safe_load(yf)) - cfg.freeze() - - taxi_cost_flag_pull = cfg.taxi.cost.flag_pull - taxi_cost_per_minute = cfg.taxi.cost.per_minute - taxi_cost_per_mile = cfg.taxi.cost.per_mile - - tnc_cost_peak_per_minute = cfg.tnc.cost.peak.per_minute - tnc_cost_peak_per_mile = cfg.tnc.cost.peak.per_mile - tnc_cost_peak_base_fare = cfg.tnc.cost.peak.base_fare - tnc_cost_peak_min_fare = cfg.tnc.cost.peak.min_fare - tnc_cost_peak_booking_fee = cfg.tnc.cost.peak.booking_fee - tnc_cost_offpeak_per_minute = cfg.tnc.cost.offpeak.per_minute - tnc_cost_offpeak_per_mile = cfg.tnc.cost.offpeak.per_mile - tnc_cost_offpeak_base_fare = cfg.tnc.cost.offpeak.base_fare - tnc_cost_offpeak_min_fare = cfg.tnc.cost.offpeak.min_fare - tnc_cost_offpeak_booking_fee= cfg.tnc.cost.offpeak.booking_fee - - tnc_surcharge_rates = {} - for k,v in cfg.tnc.surcharge_rates.items(): - tnc_surcharge_rates[k] = np.float32(v) - - tnc_surcharge_zones = {} - for k, v in cfg.tnc.surcharge_zones.items(): - tnc_surcharge_zones[k] = np.asarray(v, dtype=np.int32) - - tnc_surcharges = tuple( - (k, tnc_surcharge_rates[k], tnc_surcharge_zones[k]) - for k in tnc_surcharge_zones - ) - - tncpool_cost_peak_per_minute = cfg.tnc_pooled.cost.peak.per_minute - tncpool_cost_peak_per_mile = cfg.tnc_pooled.cost.peak.per_mile - tncpool_cost_peak_base_fare = cfg.tnc_pooled.cost.peak.base_fare - tncpool_cost_peak_min_fare = cfg.tnc_pooled.cost.peak.min_fare - tncpool_cost_peak_booking_fee = cfg.tnc_pooled.cost.peak.booking_fee - tncpool_cost_offpeak_per_minute = cfg.tnc_pooled.cost.offpeak.per_minute - tncpool_cost_offpeak_per_mile = cfg.tnc_pooled.cost.offpeak.per_mile - tncpool_cost_offpeak_base_fare = cfg.tnc_pooled.cost.offpeak.base_fare - tncpool_cost_offpeak_min_fare = cfg.tnc_pooled.cost.offpeak.min_fare - tncpool_cost_offpeak_booking_fee= cfg.tnc_pooled.cost.offpeak.booking_fee - - tncpool_surcharge_rates = {} - for k,v in cfg.tnc_pooled.surcharge_rates.items(): - tncpool_surcharge_rates[k] = np.float32(v) - - tncpool_surcharge_zones = {} - for k, v in cfg.tnc_pooled.surcharge_zones.items(): - tncpool_surcharge_zones[k] = np.asarray(v, dtype=np.int32) - - tncpool_surcharges = tuple( - (k, tncpool_surcharge_rates[k], tncpool_surcharge_zones[k]) - for k in tncpool_surcharge_zones - ) - - dh.cfg['taxi_cost_struct'] = TaxiCostStruct( - flag_pull = cfg.taxi.cost.flag_pull, - per_minute = cfg.taxi.cost.per_minute, - per_mile = cfg.taxi.cost.per_mile, - airport_pickup_fee = cfg.taxi.cost.airport_departure, - airport_pickup_zones=np.asarray(cfg.taxi.cost.airport_zones), - ) - - dh.cfg['tnc_cost_struct_solo_peak'] = TncCostStruct( - base_fare=cfg.tnc.cost.peak.base_fare, - per_minute=cfg.tnc.cost.peak.per_minute, - per_mile=cfg.tnc.cost.peak.per_mile, - min_fare=cfg.tnc.cost.peak.min_fare, - booking_fee=cfg.tnc.cost.peak.booking_fee, - special_fee=cfg.tnc.surcharge_rates.special, - special_zones=np.asarray(cfg.tnc.surcharge_zones.special), - downtown_fee=cfg.tnc.surcharge_rates.downtown, - downtown_zones=np.asarray(cfg.tnc.surcharge_zones.downtown), - ) - - dh.cfg['tnc_cost_struct_solo_offpeak'] = TncCostStruct( - base_fare=cfg.tnc.cost.offpeak.base_fare, - per_minute=cfg.tnc.cost.offpeak.per_minute, - per_mile=cfg.tnc.cost.offpeak.per_mile, - min_fare=cfg.tnc.cost.offpeak.min_fare, - booking_fee=cfg.tnc.cost.offpeak.booking_fee, - special_fee=cfg.tnc.surcharge_rates.special, - special_zones=np.asarray(cfg.tnc.surcharge_zones.special), - downtown_fee=cfg.tnc.surcharge_rates.downtown, - downtown_zones=np.asarray(cfg.tnc.surcharge_zones.downtown), - ) - - dh.cfg['tnc_cost_struct_pool_peak'] = TncCostStruct( - base_fare=cfg.tnc_pooled.cost.peak.base_fare, - per_minute=cfg.tnc_pooled.cost.peak.per_minute, - per_mile=cfg.tnc_pooled.cost.peak.per_mile, - min_fare=cfg.tnc_pooled.cost.peak.min_fare, - booking_fee=cfg.tnc_pooled.cost.peak.booking_fee, - special_fee=cfg.tnc_pooled.surcharge_rates.special, - special_zones=np.asarray(cfg.tnc_pooled.surcharge_zones.special), - downtown_fee=cfg.tnc_pooled.surcharge_rates.downtown, - downtown_zones=np.asarray(cfg.tnc_pooled.surcharge_zones.downtown), - ) - - dh.cfg['tnc_cost_struct_pool_offpeak'] = TncCostStruct( - base_fare=cfg.tnc_pooled.cost.offpeak.base_fare, - per_minute=cfg.tnc_pooled.cost.offpeak.per_minute, - per_mile=cfg.tnc_pooled.cost.offpeak.per_mile, - min_fare=cfg.tnc_pooled.cost.offpeak.min_fare, - booking_fee=cfg.tnc_pooled.cost.offpeak.booking_fee, - special_fee=cfg.tnc_pooled.surcharge_rates.special, - special_zones=np.asarray(cfg.tnc_pooled.surcharge_zones.special), - downtown_fee=cfg.tnc_pooled.surcharge_rates.downtown, - downtown_zones=np.asarray(cfg.tnc_pooled.surcharge_zones.downtown), - ) - - - ############## - # - # @nb.njit(cache=True) - # def taxi_cost(auto_time, auto_dist, taxi_cost_struct): - # """ - # Compute taxi fare. - # - # A single set of rates (Chicago medallion rates for in-city trips) - # is used; fares for taxi trips outside Chicago are close to this - # rate and rare enough that more precision is unneeded. - # - # Parameters - # ---------- - # auto_time, auto_dist : array-like - # - # Returns - # ------- - # fare : array-like - # """ - # return ( - # taxi_cost_struct.flag_pull - # + auto_time * taxi_cost_struct.per_minute - # + auto_dist * taxi_cost_struct.per_mile - # ) - # - # - # @nb.njit - # def tnc_cost(auto_time, auto_dist, o_zone, d_zone, tnc_cost_struct): - # """ - # Compute the TNC cost. - # - # Parameters - # ---------- - # auto_time, auto_dist : float - # The auto travel time and distance for a set of trips. - # o_zone, d_zone : int - # Zone numbers for origin and destination - # tnc_cost_struct : TncCostStruct - # Use the correct struct for peak/offpeak and solo/shared. - # - # Returns - # ------- - # float - # """ - # cost = ( - # tnc_cost_struct.per_minute * auto_time - # + tnc_cost_struct.per_mile * auto_dist - # + tnc_cost_struct.base_fare - # ) - # cost = max(cost, tnc_cost_struct.min_fare) + tnc_cost_struct.booking_fee - # - # if tnc_cost_struct.special_fee: - # bucket_applies = False - # for i in range(tnc_cost_struct.special_zones.size): - # if tnc_cost_struct.special_zones[i] == o_zone or tnc_cost_struct.special_zones[i] == d_zone: - # bucket_applies = True - # break - # if bucket_applies: - # cost += tnc_cost_struct.special_fee - # - # if tnc_cost_struct.downtown_fee: - # bucket_applies = False - # for i in range(tnc_cost_struct.downtown_zones.size): - # if tnc_cost_struct.downtown_zones[i] == o_zone or tnc_cost_struct.downtown_zones[i] == d_zone: - # bucket_applies = True - # break - # if bucket_applies: - # cost += tnc_cost_struct.downtown_fee - # - # return cost - # - # - # - # @nb.njit - # def tnc_solo_cost(auto_time, auto_dist, o_zone, d_zone, peak): - # """ - # Compute the solo rider TNC cost. - # - # Parameters - # ---------- - # auto_time, auto_dist : float - # The auto travel time and distance for a set of trips. - # o_zone, d_zone : int - # Zone numbers for origin and destination - # peak : bool - # Whether this trip is peak or offpeak. - # - # Returns - # ------- - # float - # """ - # if peak: - # cost = ( - # tnc_cost_peak_per_minute * auto_time - # + tnc_cost_peak_per_mile * auto_dist - # + tnc_cost_peak_base_fare - # ) - # cost = max(cost, tnc_cost_peak_min_fare) + tnc_cost_peak_booking_fee - # else: - # cost = ( - # tnc_cost_offpeak_per_minute * auto_time - # + tnc_cost_offpeak_per_mile * auto_dist - # + tnc_cost_offpeak_base_fare - # ) - # cost = max(cost, tnc_cost_offpeak_min_fare) + tnc_cost_offpeak_booking_fee - # - # for bucket_name, bucket_price, bucket_zones in tnc_surcharges: - # if bucket_price: - # bucket_applies = False - # for i in range(bucket_zones.size): - # if bucket_zones[i] == o_zone or bucket_zones[i] == d_zone: - # bucket_applies = True - # if bucket_applies: - # cost += bucket_price - # return cost - # - # - # @nb.njit - # def tnc_pool_cost(auto_time, auto_dist, o_zone, d_zone, peak): - # """ - # Compute the solo rider TNC cost. - # - # Parameters - # ---------- - # auto_time, auto_dist : float - # The auto travel time and distance for a set of trips. - # o_zone, d_zone : int - # Zone numbers for origin and destination - # peak : bool - # Whether this trip is peak or offpeak. - # - # Returns - # ------- - # float - # """ - # if peak: - # cost = ( - # tncpool_cost_peak_per_minute * auto_time - # + tncpool_cost_peak_per_mile * auto_dist - # + tncpool_cost_peak_base_fare - # ) - # cost = max(cost, tncpool_cost_peak_min_fare) + tncpool_cost_peak_booking_fee - # else: - # cost = ( - # tncpool_cost_offpeak_per_minute * auto_time - # + tncpool_cost_offpeak_per_mile * auto_dist - # + tncpool_cost_offpeak_base_fare - # ) - # cost = max(cost, tncpool_cost_offpeak_min_fare) + tncpool_cost_offpeak_booking_fee - # - # for bucket_name, bucket_price, bucket_zones in tncpool_surcharges: - # if bucket_price: - # bucket_applies = False - # for i in range(bucket_zones.size): - # if bucket_zones[i] == o_zone or bucket_zones[i] == d_zone: - # bucket_applies = True - # if bucket_applies: - # cost += bucket_price - # return cost - # - # return taxi_cost, tnc_solo_cost, tnc_pool_cost \ No newline at end of file diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/transit/__init__.py b/src/Mode-Dest-TOD/cmap_modedest/fast/transit/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/transit/access_egress_distance.py b/src/Mode-Dest-TOD/cmap_modedest/fast/transit/access_egress_distance.py deleted file mode 100644 index 211afd7..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/transit/access_egress_distance.py +++ /dev/null @@ -1,165 +0,0 @@ -import numpy as np -import numba as nb - -from ...modecodes import * -FRONT_END = 0 -BACK_END = 1 -N_TRIP_ENDS = 2 - - -@nb.njit -def trunc_normal(loc, scale): - rv = np.float32(np.random.normal(loc, scale)) - return max(rv, 0.06) - - -@nb.njit -def sloped_linear(x_min, x_max, ratio=1.0): - if ratio == 1.0: - return np.float32(np.random.uniform(x_min, x_max)) - else: - span = x_max - x_min - if span != 0: - slope = (1.0-ratio)/span - else: - slope = (1.0-ratio) - area =.5*(1+ratio)*span - y = np.float32(np.random.uniform(0.0, 1.0)) * area - zp = np.sqrt(ratio * ratio + 2 * slope * y) - if slope: - return ((zp - ratio) / slope) + x_min - else: - return (zp - ratio) + x_min - - -@nb.njit -def simulate_ae_dist(p1,p2,p3): - - # use_normal = (p3 == 101) - if p3 == 101: - return trunc_normal(p1,p2) - - # use_slopey = (p3 < 101) - if p3 < 101: - return sloped_linear(p1, p2, p3) - - #use_nan = (p3 == 999) - return 255.0 - - - -def compile_simulate_approach_distances( - dh, -): - """ - - Parameters - ---------- - zone : array-like - Zone id (1-based) - attached_mode : int - Number for first or last mode (as matches this approach) - trip_purpose : {'HW','HO','NH'} - Trip purpose, used to select DISTR table and possibly filter - approach modes - trip_end : {0,1} - Zero if approach to first mode, one if approach from last mode - out : array-like - Output array must already exist, as a float dtype, - with shape [replications, N_APPROACH_MODES, ] - - """ - # random_state = check_random_state(random_state) - - distr_array = np.stack([ - dh.distr['HW'], - dh.distr['HO'], - dh.distr['NH'], - ]).reshape((3,-1,5,3)).astype(np.float32) - - _BUS = dh.distr['HW'].loc[1].index.get_loc('bus') - _CTARAIL = dh.distr['HW'].loc[1].index.get_loc('ctarail') - _FEEDERBUS = dh.distr['HW'].loc[1].index.get_loc('feederbus') - _METRA = dh.distr['HW'].loc[1].index.get_loc('metra') - _PNR = dh.distr['HW'].loc[1].index.get_loc('pnr') - - @nb.njit(parallel=True) - def simulate_approach_distances_arr( - zone, - attached_mode, - trip_purpose, - trip_end, - out, - ): - """ - - Parameters - ---------- - zone : int - attached_mode : int - trip_purpose : int - trip_end : int - out : array[float32], shape=(5,) - - Returns - ------- - - """ - assert out.shape[-1] == 5, "last dimension must be 5" - if trip_purpose == 'HW': - distr_ = distr_array[0,zone-1] - elif trip_purpose == 'HO': - distr_ = distr_array[1,zone-1] - else: #if trip_purpose == 'NH': - distr_ = distr_array[2,zone-1] - for J in range(N_DIST_TO_TYPES): - # OBTAIN APPROACH DISTANCES TO FIVE MODES - if (J == DIST_TO_BUS): - distr_params = distr_[_BUS] - elif (J == DIST_TO_CTA_RAIL) and (attached_mode == TransitModeCode_CTA_RAIL): - # DISTANCE OBTAINED ONLY IF FIRST/LAST MODE IS CTA RAIL - distr_params = distr_[_CTARAIL] - elif (J == DIST_TO_METRA) and (attached_mode == TransitModeCode_METRA_RAIL): - # DISTANCE OBTAINED ONLY IF FIRST/LAST MODE IS METRA - distr_params = distr_[_METRA] - elif (J == DIST_TO_FEEDER_BUS) and (attached_mode == TransitModeCode_METRA_RAIL): - # DISTANCE OBTAINED ONLY IF FIRST/LAST MODE IS METRA - distr_params = distr_[_FEEDERBUS] - elif (J == DIST_TO_PARK_N_RIDE_STATION) and (trip_end == FRONT_END): - # PARK AND RIDE STATION DISTANCE OBTAINED WHEN TRIP END IS FRONT - distr_params = distr_[_PNR] - else: - distr_params = np.full(3, 999, dtype=np.float32) - if out.ndim == 2: - for k in range(out.shape[0]): - out[k,J] = simulate_ae_dist( - distr_params[0], - distr_params[1], - distr_params[2], - ) - else: - out[J] = simulate_ae_dist( - distr_params[0], - distr_params[1], - distr_params[2], - ) - - @nb.njit(parallel=True) - def simulate_approach_distances_multi( - zones, - attached_modes, - trip_purpose, - trip_end, - outs, - ): - assert zones.shape[0] == attached_modes.shape[0] == outs.shape[0] - for i in nb.prange(zones.shape[0]): - simulate_approach_distances_arr( - zones[i], - attached_modes[i], - trip_purpose, - trip_end, - outs[i], - ) - - return simulate_approach_distances_arr, simulate_approach_distances_multi \ No newline at end of file diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/transit/approach.py b/src/Mode-Dest-TOD/cmap_modedest/fast/transit/approach.py deleted file mode 100644 index a33cc51..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/fast/transit/approach.py +++ /dev/null @@ -1,836 +0,0 @@ - -import numpy as np -import numba as nb -import logging -from ...addict import Dict -from typing import Generator -from collections import namedtuple - -log = logging.getLogger('CMAP') - -from .access_egress_distance import compile_simulate_approach_distances -from ...ae_distance_sim import simulate_ae_dist -from ...purposes import purposes_to_3 - -# trip types -HW = 'HW' # HOME PRODUCTIONS TO WORK ATTRACTIONS -HO = 'HO' # HOME PRODUCTIONS TO NON-WORK/NON-HOME ATTRACTIONS -NH = 'NH' # NON-HOME PRODUCTIONS TO NON-HOME ATTRACTIONS - -ITER = 50 # NUMBER OF TRIPS USED TO COMPUTE AVERAGE IMPEDANCES - -from ...modecodes import ( - APPROACH_WALK, - APPROACH_BUS, - APPROACH_PARK_N_RIDE, - APPROACH_KISS_N_RIDE, - APPROACH_FEEDER_BUS, - N_APPROACH_MODES, - APPROACH_MODE_NAMES, - DIST_TO_BUS, - DIST_TO_CTA_RAIL, - DIST_TO_METRA, - DIST_TO_FEEDER_BUS, - DIST_TO_PARK_N_RIDE_STATION, - N_DIST_TO_TYPES, - TransitModeCode_CTA_RAIL, - TransitModeCode_METRA_RAIL, - TransitModeCode_CTA_EXPRESS_BUS, - TransitModeCode_CTA_REGULAR_BUS, - TransitModeCode_PACE_BUS, -) - - - -FRONT_END = 0 -BACK_END = 1 -N_TRIP_ENDS = 2 - -SPDWLK = np.float32(30.) -# SPDWLK = SYSTEM-WIDE SPEED OF WALKING, -# DEFAULT IS 30 TENTHS OF A MILE PER HOUR - -SPEEDS = np.array([7., 15., 20., 30., 5., 10., 12., 17.]) -# SPEEDS = SPEEDS OF APPROACH AUTO AND BUS BY ZONE AREA TYPE -# AUTO APPROACH SPEEDS: -# ZONE TYPE 1 (CHICAGO CBD) DEFAULT IS 7 MPH -# ZONE TYPE 2 (CHICAGO REMAINDER) DEFAULT IS 15 MPH -# ZONE TYPE 3 (DENSE SUBURB) DEFAULT IS 20 MPH -# ZONE TYPE 4 (SPARSE SUBURB) DEFAULT IS 30 MPH -# BUS APPROACH SPEEDS: -# ZONE TYPE 1 (CHICAGO CBD) DEFAULT IS 5 MPH -# ZONE TYPE 2 (CHICAGO REMAINDER) DEFAULT IS 10 MPH -# ZONE TYPE 3 (DENSE SUBURB) DEFAULT IS 12 MPH -# ZONE TYPE 4 (SPARSE SUBURB) DEFAULT IS 17 MPH - -DRVOT = 14 -# DRVOT = DRIVER'S VALUE OF TIME, DEFAULT IS 14 CENTS/MIN - -OVT_IVT_RATIO = 2.0 - - - -AFC1 = 35 # AUTO FIXED COSTS FOR AUTO DRIVER IN CENTS -AFC2 = 20 # AUTO FIXED COSTS FOR AUTO PASSENGER IN CENTS - -# W2PNR = WALK TIME TO STATION FROM PARK AND RIDE LOT, -# DEFAULT IS 2 MINUTES -W2PNR = 2 - -TransitApproachStruct = namedtuple('TransitApproachStruct', [ - 'fwbus_pk', - 'fwfdr_pk', - 'fwbus_op', - 'fwfdr_op', - 'ZTYPE', - 'FM_pk', - 'LM_pk', - 'FM_op', - 'LM_op', - 'FEEDER_BUS_BOARDING_FARE', - 'FEEDER_BUS_CBD_FARE', - 'CTA_CBD_LINK_UP_FARE', - 'CTA_FIRST_XFER_FARE', - 'PACE_BUS_FIRST_XFER_FARE', - 'PNRAVL', - 'PRCOST', - 'AUTO_OPERATING_COST_BY_ZONETYPE', - 'distr_array', - 'distr_BUS', - 'distr_CTARAIL', - 'distr_FEEDERBUS', - 'distr_METRA', - 'distr_PNR', -]) - -# class TransitApproachStruct(_TransitApproachStruct): -# def __new__(cls, *args, **kwargs): -# if len(args) == 1 and len(kwargs) == 0: -# if isinstance(args[0], cls): -# return args[0] -# elif isinstance(args[0], Generator): -# return super().__new__(cls, *args[0]) -# return super().__new__(cls, *args, **kwargs) - - -def compile_transit_approach( - dh, -): - """ - Replaces TRAPP fortran. - - Parameters - ---------- - dh : DataHandler - ozone, dzone : int or array-like - Zone ID numbers. If array-like, should be arrays of the same shape. - TPTYPE : {'HW', 'HO', 'NH'} - Trip type - replication : int - Number of simulation replications - - Returns - ------- - Dict - Containing: - - drivetime : array of int32, shape [replication] - simulated in vehicle (drive) approach times, in minutes - - walktime : array of int32, shape [replication] - simulated out of vehicle (walk) approach times, in minutes - - cost : array of int32, shape [replication] - simulated approach costs, in cents - - waittime : array of int32, shape [replication] - simulated approach waiting times - - approach_mode : array of int8, shape [replication, 2] - simulated best approach modes - = approach_distances : array of float32, shape [replication, N_DIST_TO_TYPES, N_TRIP_ENDS] - - Notes - ----- - When ozone, dzone are given as arrays, all returned arrays have one extra front - dimension matching these arrays. - - """ - - PACE_BUS_BOARDING_FARE = dh.m023.PACE_BUS_BOARDING_FARE - PACE_BUS_FIRST_XFER_FARE = dh.m023.PACE_BUS_FIRST_XFER_FARE - FEEDER_BUS_BOARDING_FARE = dh.m023.FEEDER_BUS_BOARDING_FARE - FEEDER_BUS_CBD_FARE = dh.m023.FEEDER_BUS_CBD_FARE - - CTA_FIRST_XFER_FARE = dh.m023.CTA_FIRST_XFER_FARE - CTA_CBD_LINK_UP_FARE = dh.m023.CTA_CBD_LINK_UP_FARE - - AUTO_OPERATING_COST_BY_ZONETYPE = dh.m023.AUTO_OPERATING_COST_BY_ZONETYPE # AVERAGE OPERATING COST PER MILE FOR AUTO, BY ZONE TYPE - - m01_df = dh.m01 - - ZTYPE = m01_df['zone_type'].to_numpy() - fwbus_pk = m01_df['first_wait_bus_peak'].to_numpy().astype(np.float32) # FIRST WAIT FOR BUS IN APPROACH SUBMODEL - fwfdr_pk = m01_df['first_wait_feeder_peak'].to_numpy().astype(np.float32) # FIRST WAIT FOR FEEDER BUS IN APPROACH SUBMODEL - fwbus_op = m01_df['first_wait_bus_offpeak'].to_numpy().astype(np.float32) # FIRST WAIT FOR BUS IN APPROACH SUBMODEL - fwfdr_op = m01_df['first_wait_feeder_offpeak'].to_numpy().astype(np.float32) # FIRST WAIT FOR FEEDER BUS IN APPROACH SUBMODEL - PNRAVL = m01_df['pnr_flag'].astype(bool).to_numpy() # park-n-ride available, by zone - PRCOST = m01_df['pnr_parking_cost'].to_numpy().astype(np.float32) # park-n-ride cost, by zone - - FM_pk = dh.skims.first_mode_peak.astype(np.int32) - LM_pk = dh.skims.last_mode_peak.astype(np.int32) - FM_op = dh.skims.first_mode_offpeak.astype(np.int32) - LM_op = dh.skims.last_mode_offpeak.astype(np.int32) - - # simulate_approach_distances, simulate_approach_distances2 = compile_simulate_approach_distances(dh) - distr_array = np.stack([ - dh.distr['HW'], - dh.distr['HO'], - dh.distr['NH'], - ]).reshape((3,-1,5,3)).astype(np.float32) - - distr_BUS = dh.distr['HW'].loc[1].index.get_loc('bus') - distr_CTARAIL = dh.distr['HW'].loc[1].index.get_loc('ctarail') - distr_FEEDERBUS = dh.distr['HW'].loc[1].index.get_loc('feederbus') - distr_METRA = dh.distr['HW'].loc[1].index.get_loc('metra') - distr_PNR = dh.distr['HW'].loc[1].index.get_loc('pnr') - - - - trapp_struct = TransitApproachStruct( - fwbus_pk= fwbus_pk, - fwfdr_pk= fwfdr_pk, - fwbus_op= fwbus_op, - fwfdr_op= fwfdr_op, - ZTYPE= ZTYPE, - FM_pk= FM_pk, - LM_pk= LM_pk, - FM_op= FM_op, - LM_op= LM_op, - FEEDER_BUS_BOARDING_FARE= FEEDER_BUS_BOARDING_FARE, - FEEDER_BUS_CBD_FARE= FEEDER_BUS_CBD_FARE, - CTA_CBD_LINK_UP_FARE= CTA_CBD_LINK_UP_FARE, - CTA_FIRST_XFER_FARE= CTA_FIRST_XFER_FARE, - PACE_BUS_FIRST_XFER_FARE= PACE_BUS_FIRST_XFER_FARE, - PNRAVL= PNRAVL, - PRCOST= PRCOST, - AUTO_OPERATING_COST_BY_ZONETYPE= AUTO_OPERATING_COST_BY_ZONETYPE, - distr_array=distr_array, - distr_BUS = distr_BUS, - distr_CTARAIL = distr_CTARAIL, - distr_FEEDERBUS = distr_FEEDERBUS, - distr_METRA = distr_METRA, - distr_PNR = distr_PNR, - ) - - - return trapp_struct - - -def transit_approach_distances( - trapp_struct, - ozone, - dzone, - TPTYPE, - n_reps=50, - random_seed=None, -): - if random_seed is not None: - try: - seed_base = np.int32(random_seed) - except TypeError: - if isinstance(random_seed, np.random.Generator): - seed_base = random_seed.integers(0, 2147483647, dtype=np.int32) - else: - raise - else: - seed_base = np.int32(0) - TPTYPE = purposes_to_3.get(TPTYPE, 'NH') - approach_distances = np.zeros((ozone.shape[0], n_reps, 5, 2), dtype=np.float32) - seeds = np.zeros(ozone.shape[0], dtype=np.int32) - _transit_approach_distances(trapp_struct, ozone, dzone, TPTYPE, seed_base, approach_distances, seeds) - return approach_distances, seeds - - -@nb.njit(parallel=True, cache=True) -def _transit_approach_distances( - trapp_struct, - ozone, - dzone, - TPTYPE, - seed_base, - approach_distances, - seeded, -): - # struct data - ZTYPE = trapp_struct.ZTYPE - FM_pk = trapp_struct.FM_pk - LM_pk = trapp_struct.LM_pk - FM_op = trapp_struct.FM_op - LM_op = trapp_struct.LM_op - distr_array = trapp_struct.distr_array - distr_BUS = trapp_struct.distr_BUS - distr_CTARAIL = trapp_struct.distr_CTARAIL - distr_FEEDERBUS = trapp_struct.distr_FEEDERBUS - distr_METRA = trapp_struct.distr_METRA - distr_PNR = trapp_struct.distr_PNR - - assert approach_distances.shape[-2:] == (5,2), \ - "last dimensions approach_distances must be (5,2)" - - for z in nb.prange(ozone.shape[0]): - - ozone_idx = ozone[z]-1 - dzone_idx = dzone[z]-1 - - seed = np.int32(seed_base) + (np.int32(ozone_idx) << 14) + np.int32(dzone_idx) - seeded[z] = seed - np.random.seed(seed) - - # - # GET ZONE TYPES - # - ozone_type = ZTYPE[ozone_idx] - dzone_type = ZTYPE[dzone_idx] - # - # GET INTERCHANGE ATTRIBUTES - # FM=FIRST MODE,LM=LAST MODE,PM=PRIORITY MODE - # - if TPTYPE == 0: - FM = FM_pk[ozone_idx, dzone_idx] - LM = LM_pk[ozone_idx, dzone_idx] - else: - FM = FM_op[ozone_idx, dzone_idx] - LM = LM_op[ozone_idx, dzone_idx] - # - # INET TRANSIT NETWORK STORES SOME SUBURBAN BUS LINES (MODE=6) - # AS MODE=5 DUE TO ARRAY SIZE LIMITS. IF MODE=5 AND - # ZONE TYPE NO. 1 IS OUTSIDE OF CHICAGO, THEN CHANGE MODE TO 6. - # - - if (FM == 5) and (ozone_type > 2): - FM = 6 - if (LM == 5) and (dzone_type > 2): - LM = 6 - - # - # GET APPROACH DISTANCES FOR FIRST AND LAST MODES - # - for trip_end in [0,1]: - if trip_end == 0: - zone = ozone[z] - attached_mode = FM - else: - zone = dzone[z] - attached_mode = LM - if TPTYPE == 'HW': - distr_ = distr_array[0, zone - 1] - elif TPTYPE == 'HO': - distr_ = distr_array[1, zone - 1] - else: # if TPTYPE == 'NH': - distr_ = distr_array[2, zone - 1] - for J in range(N_DIST_TO_TYPES): - # OBTAIN APPROACH DISTANCES TO FIVE MODES - if (J == DIST_TO_BUS): - distr_params = distr_[distr_BUS] - elif (J == DIST_TO_CTA_RAIL) and (attached_mode == TransitModeCode_CTA_RAIL): - # DISTANCE OBTAINED ONLY IF FIRST/LAST MODE IS CTA RAIL - distr_params = distr_[distr_CTARAIL] - elif (J == DIST_TO_METRA) and (attached_mode == TransitModeCode_METRA_RAIL): - # DISTANCE OBTAINED ONLY IF FIRST/LAST MODE IS METRA - distr_params = distr_[distr_METRA] - elif (J == DIST_TO_FEEDER_BUS) and (attached_mode == TransitModeCode_METRA_RAIL): - # DISTANCE OBTAINED ONLY IF FIRST/LAST MODE IS METRA - distr_params = distr_[distr_FEEDERBUS] - elif (J == DIST_TO_PARK_N_RIDE_STATION) and (trip_end == FRONT_END): - # PARK AND RIDE STATION DISTANCE OBTAINED WHEN TRIP END IS FRONT - distr_params = distr_[distr_PNR] - else: - distr_params = np.full(3, 999, dtype=np.float32) - for k in range(approach_distances.shape[1]): - if distr_params[2] == 101: # use_normal = (p3 == 101) - rv = np.random.normal(distr_params[0], distr_params[1]) - approach_distances[z, k, J, trip_end] = np.float32(min(max(rv, 0.06), 200.0)) - elif distr_params[2] < 101: # use_slopey = (p3 < 101) - x_min = distr_params[0] - x_max = distr_params[1] - ratio = distr_params[2] - if ratio == 1.0: - approach_distances[z, k, J, trip_end] = np.float32(min(np.random.uniform(x_min, x_max), 200.0)) - else: - span = x_max - x_min - if span != 0: - slope = (1.0 - ratio) / span - else: - slope = (1.0 - ratio) - area = .5 * (1 + ratio) * span - y = np.float32(np.random.uniform(0.0, 1.0)) * area - zp = np.sqrt(ratio * ratio + 2 * slope * y) - if slope: - rv = ((zp - ratio) / slope) + x_min - else: - rv = (zp - ratio) + x_min - approach_distances[z, k, J, trip_end] = min(max(rv, 0.06), 200.0) - else: # use_nan = (p3 == 999) - approach_distances[z, k, J, trip_end] = 255.0 - - -@nb.njit(cache=True) -def transit_approach( - trapp_struct, - ozone, - dzone, - TPTYPE, - approach_distances, - out, -): - # struct data - fwbus_pk = trapp_struct.fwbus_pk # FIRST WAIT FOR BUS IN APPROACH SUBMODEL - fwfdr_pk = trapp_struct.fwfdr_pk # FIRST WAIT FOR FEEDER BUS IN APPROACH SUBMODEL - fwbus_op = trapp_struct.fwbus_op # FIRST WAIT FOR BUS IN APPROACH SUBMODEL - fwfdr_op = trapp_struct.fwfdr_op # FIRST WAIT FOR FEEDER BUS IN APPROACH SUBMODEL - ZTYPE = trapp_struct.ZTYPE - FM_pk = trapp_struct.FM_pk - LM_pk = trapp_struct.LM_pk - FM_op = trapp_struct.FM_op - LM_op = trapp_struct.LM_op - FEEDER_BUS_BOARDING_FARE = trapp_struct.FEEDER_BUS_BOARDING_FARE - FEEDER_BUS_CBD_FARE = trapp_struct.FEEDER_BUS_CBD_FARE - CTA_CBD_LINK_UP_FARE = trapp_struct.CTA_CBD_LINK_UP_FARE - CTA_FIRST_XFER_FARE = trapp_struct.CTA_FIRST_XFER_FARE - PACE_BUS_FIRST_XFER_FARE = trapp_struct.PACE_BUS_FIRST_XFER_FARE - PNRAVL = trapp_struct.PNRAVL - PRCOST = trapp_struct.PRCOST - AUTO_OPERATING_COST_BY_ZONETYPE = trapp_struct.AUTO_OPERATING_COST_BY_ZONETYPE - - # random_state = check_random_state(random_state or ozone+dzone) - replication = approach_distances.shape[1] - - # if trace: - # log.log(trace, f"transit_approach({ozone},{dzone},{TPTYPE},{replication})") - - # convert inputs to length-1 vectors if not already vectors - # ozone = np.asanyarray(ozone) - # dzone = np.asanyarray(dzone) - vector_len = ozone.shape[0] - assert vector_len == dzone.shape[0] - - ozone_idx = ozone-1 - dzone_idx = dzone-1 - - # ZTYPE = m01_df['zone_type'].to_numpy() - # fwbus_pk = m01_df['first_wait_bus_peak'].to_numpy() # FIRST WAIT FOR BUS IN APPROACH SUBMODEL - # fwfdr_pk = m01_df['first_wait_feeder_peak'].to_numpy() # FIRST WAIT FOR FEEDER BUS IN APPROACH SUBMODEL - # fwbus_op = m01_df['first_wait_bus_offpeak'].to_numpy() # FIRST WAIT FOR BUS IN APPROACH SUBMODEL - # fwfdr_op = m01_df['first_wait_feeder_offpeak'].to_numpy() # FIRST WAIT FOR FEEDER BUS IN APPROACH SUBMODEL - # PNRAVL = m01_df['pnr_flag'].astype(bool).to_numpy() # park-n-ride available, by zone - # PRCOST = m01_df['pnr_parking_cost'].to_numpy() # park-n-ride cost, by zone - - if TPTYPE == HW: - fwbus = fwbus_pk # FIRST WAIT FOR BUS IN APPROACH SUBMODEL - fwfdr = fwfdr_pk # FIRST WAIT FOR FEEDER BUS IN APPROACH SUBMODEL - else: - fwbus = fwbus_op # FIRST WAIT FOR BUS IN APPROACH SUBMODEL - fwfdr = fwfdr_op # FIRST WAIT FOR FEEDER BUS IN APPROACH SUBMODEL - - # -- INITIALIZE VALUES -- - approach_cost = np.zeros((vector_len, replication, N_APPROACH_MODES), dtype=np.float32) - approach_waittime = np.zeros((vector_len, replication, N_APPROACH_MODES), dtype=np.float32) - approach_drivetime = np.zeros((vector_len, replication, N_APPROACH_MODES), dtype=np.float32) - approach_walktime = np.zeros((vector_len, replication, N_APPROACH_MODES), dtype=np.float32) - TVAR4 = np.zeros((vector_len, replication, 5), dtype=np.float32) - - best_approach_mode = np.zeros((vector_len,replication, N_TRIP_ENDS), dtype=np.int8) - best_cost = np.zeros((vector_len, replication, N_TRIP_ENDS), dtype=np.int32) - best_waittime = np.zeros((vector_len, replication, N_TRIP_ENDS), dtype=np.int32) - best_walktime = np.zeros((vector_len, replication, N_TRIP_ENDS), dtype=np.int32) - best_drivetime = np.zeros((vector_len, replication, N_TRIP_ENDS), dtype=np.int32) - # - # GET ZONE TYPES - # - ozone_type = ZTYPE[ozone_idx] - dzone_type = ZTYPE[dzone_idx] - # - # GET INTERCHANGE ATTRIBUTES - # FM=FIRST MODE,LM=LAST MODE,PM=PRIORITY MODE - # - FM = np.empty(ozone_idx.size, dtype=np.int8) - LM = np.empty(ozone_idx.size, dtype=np.int8) - if TPTYPE == 'HW': - for i in range(ozone_idx.size): - FM[i] = FM_pk[ozone_idx[i], dzone_idx[i]] - LM[i] = LM_pk[ozone_idx[i], dzone_idx[i]] - else: - for i in range(ozone_idx.size): - FM[i] = FM_op[ozone_idx[i], dzone_idx[i]] - LM[i] = LM_op[ozone_idx[i], dzone_idx[i]] - # - # INET TRANSIT NETWORK STORES SOME SUBURBAN BUS LINES (MODE=6) - # AS MODE=5 DUE TO ARRAY SIZE LIMITS. IF MODE=5 AND - # ZONE TYPE NO. 1 IS OUTSIDE OF CHICAGO, THEN CHANGE MODE TO 6. - # - - FM[(FM == 5) & (ozone_type > 2)] = 6 - LM[(LM == 5) & (ozone_type > 2)] = 6 - - # - # GET APPROACH DISTANCES FOR FIRST AND LAST MODES - # - - assert approach_distances.shape == (vector_len, replication, N_DIST_TO_TYPES, N_TRIP_ENDS) - - # CHECK FIRST/LAST MODES AND COMPUTE APPROACH TIME AND COST - # - # ARRAYS approach_walktime,APCOST,approach_drivetime CONTAIN TIME TO WALK,APPROACH COST, - # AND IN-VEHICLE APPROACH TIME RESPECTIVELY. THESE ARRAYS HAVE FIVE - # ELEMENTS FOR FIVE POSSIBLE APPROACH MODES.( 1-WALK,2-BUS, - # 3-PARK & RIDE,4-KISS & RIDE,AND 5-FEEDER BUS) - # - - for I in range(N_TRIP_ENDS): - # I=1 GET VALUES FOR ORIGIN - # I=2 GET VALUES FOR DESTINATION - if (I == FRONT_END): - Z = ozone - M = FM - else: # I == BACK_END - Z = dzone - M = LM - - ZTYPE_Z = ZTYPE[Z-1] - - # - # IN THIS CASE WE ARE MAKING THE STATION PARKING COST FOR HOME BASED OTHER AND - # NON-HOME BASED TRIPS EQUAL TO 60 PERCENT OF HOME BASED WORK - # CHANGE MADE 12/8/93 BY GWS NEXT LINE - # IF(TPTYPE.NE.1) PRCOST(Z) = PRCOST(Z) * 0.6 - # ******************* RWE CHANGE FOR I290 AUGUST-SEPT 2009 ************ - # NONWORK PARK AND RIDE PARKING COST IS NOW READ FROM M01. IN MANY - # CASES THE NONWORK PNR COSTS ARE HIGHER THAN WORK DUE TO - # DISCOUNTING OF MONTHLY PARKING FEES. - # - # ******************* RWE CHANGE FOR I290 AUGUST-SEPT 2009 ************ - # SET HIGH STARTING VALUE OF TVAR5 - TVAR5 = np.full((vector_len, replication), 1.E10) - # ******************* RWE CHANGE FOR I290 AUGUST-SEPT 2009 ************ - # IN CALCULATING TVAR4 AND TVAR5 - # IN-VEHICLE TIME = DRVOT = 20 CENTS/MIN - # OUT-OF-VEHICLE TIME = 40 CENTS/MIN - # PASSENGER TIME = 0.5 DRIVER TIME - # ******************* RWE CHANGE FOR I290 AUGUST-SEPT 2009 ************ - # - # FOLLOWING SECTION ADDED BY EASH TO SIMPLIFY LOGIC - # IF M IS BUS (MODE<7) THEN ONLY POSSIBLE APPROACH COST IS TIME TO - # WALK TO BUS. OTHER APPROACH COSTS AND TIMES ARE LINE=HAUL. - t1 = (M < TransitModeCode_CTA_RAIL) - if np.any(t1): - J = APPROACH_WALK - approach_walktime[t1,:,J] = approach_distances[t1,:, DIST_TO_BUS, I] / SPDWLK * 600. - # INCREASE WALK TIME IN CHICAGO CBD FOR WORK TRIPS - cbd_work = t1 & (ZTYPE_Z == 1) & (TPTYPE == HW) - approach_walktime[cbd_work,:,J] *= 1.20 - - # if (ZTYPE_Z == 1 and TPTYPE == HW): - # approach_walktime[:, 0] = approach_walktime[:, 0] * 1.20 - TVAR4[t1,:, J] = approach_walktime[t1,:, 0] * DRVOT * 2.0 - TVAR5[t1,:] = TVAR4[t1,:, J] - best_approach_mode.reshape((vector_len,replication,N_TRIP_ENDS))[t1,:, I] = 0 - best_drivetime[t1,:, I] = 0 - best_walktime[t1,:, I] = approach_walktime[t1,:, 0] + .5 - best_cost[t1, :, I] = 0 - best_waittime[t1,:, I] = 0 - for J in [APPROACH_BUS, APPROACH_PARK_N_RIDE, APPROACH_KISS_N_RIDE, APPROACH_FEEDER_BUS]: - TVAR4[t1,:, J] = 0.0 - approach_cost[t1, :, J] = 0.0 - approach_waittime[t1, :, J] = 0.0 - approach_drivetime[t1,:, J] = 0.0 - approach_walktime[t1,:, J] = 0.0 - - t = (M >= TransitModeCode_CTA_RAIL) - if np.any(t): - # REMAINDER OF SUBROUTINE FOR RAIL TRANSIT/COMMUTER RAIL ONLY - # GET VALUES FOR FIVE ALTERNATIVES - for J in range(5): - TVAR4[t,:, J] = 0.0 - approach_cost[t, :, J] = 0.0 - approach_waittime[t,:,J] = 0.0 - approach_drivetime[t,:, J] = 0.0 - approach_walktime[t,:, J] = 0.0 - - K = np.maximum(0, M - 6).astype(np.int8) # 0 for BUS, 1 for CTA RAIL(7-1), 2 for METRA(8-1) - - # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = - # J=0(WALK).COMPUTE WALKING TIME TO FIRST MODE.NO COST OR IN-VEHICLE TIME - # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = - if J == APPROACH_WALK: - - for _kt in range(approach_distances.shape[2]): - kt = t & (K == _kt) - approach_walktime[kt,:, J] = approach_distances[kt, :, _kt, I] / SPDWLK * 600. - # INCREASE WALK TIME IN CHICAGO CBD FOR WORK TRIPS - cbd_work = t & (ZTYPE_Z == 1) & (TPTYPE == HW) - approach_walktime[cbd_work,:, J] *= 1.20 - # if (ZTYPE_Z == 1 and TPTYPE == HW): - # approach_walktime[:, J] = approach_walktime[:, J] * 1.20 - TVAR4[t,:, J] = approach_walktime[t,:, J] * DRVOT * 2.0 - # ADD APPROACH TIMES AND COSTS - EVERYTHING SHOULD NOW BE IN CENTS - TVAR4[t,:, J] += approach_cost[t, :, J] - - # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = - # J=1(BUS) FIRST MODE. COMPUTE WALKING TIME, COST, AND IN-VEHICLE TIME - # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = - elif J == APPROACH_BUS or (J == APPROACH_FEEDER_BUS and I == FRONT_END): - - if J == APPROACH_FEEDER_BUS: - approach_walktime[t, :, J] = approach_distances[t,:, DIST_TO_FEEDER_BUS, I] * 600.0 / SPDWLK - approach_waittime[t, :, J] = np.expand_dims(fwfdr[Z-1][t], 1) # broadcast - else: - approach_walktime[t,:, J] = approach_distances[t,:, DIST_TO_BUS, I] * 600.0 / SPDWLK - # INCREASE WALK TIME IN CHICAGO CBD - approach_walktime[t & (ZTYPE_Z == 1), :, J] *= 1.20 - approach_waittime[t,:,J] = np.expand_dims(fwbus[Z-1][t],1) # broadcast - for _kt in range(approach_distances.shape[2]): - kt = t & (K == _kt) - approach_drivetime[kt,:, J] = approach_distances[kt,:, _kt, I] / np.expand_dims(SPEEDS[ZTYPE_Z[kt]-1 + 4],1) * 60. # broadcast - TVAR4[t,:, J] = ( - approach_walktime[t,:, J] * OVT_IVT_RATIO - + approach_drivetime[t,:, J] - + approach_waittime[t,:,J] * OVT_IVT_RATIO - ) * DRVOT - - # ******************* RWE CHANGE FOR I290 AUGUST-SEPT 2009 ************ - # - # COST COMPUTATIONS FOR APPROACH BUS - # REVISED BY EASH 12/4/93 TO REFLECT CURRENT FARES - # ==== ORIGIN ==== - if (I == FRONT_END): - # FIRST MODE SUBURBAN RAIL - CHECK ZONE TYPE AT ORIGIN - # --- SUBURBAN ORIGIN, PACE BUS --- - s = t & (FM == TransitModeCode_METRA_RAIL) & (ozone_type > 2) - if np.any(s): - # PACE BUS - METRA RAIL, ADDED FARE IS PACE FEEDER BUS FARE - approach_cost[s & (LM == TransitModeCode_METRA_RAIL), :, J] = FEEDER_BUS_BOARDING_FARE - # PACE BUS - METRA RAIL - CTA, NO ADDED FARE, LINKUP > FEEDER BUS - # already zero # approach_cost[s & (LM == TransitModeCode_CTA_RAIL), :, J] = 0 - # PACE BUS - METRA RAIL - PACE, ADDED FARE IS LINKUP LESS FEEDER BUS - approach_cost[s & (LM == TransitModeCode_PACE_BUS), :, J] = FEEDER_BUS_CBD_FARE - - # --- CHICAGO ORIGIN, CTA BUS --- - s = t & (FM == TransitModeCode_METRA_RAIL) & (ozone_type <= 2) - if np.any(s): - # CTA BUS - METRA RAIL, ADDED FARE IS LINKUP FARE (SINGLE RIDE) - approach_cost[s & (LM == TransitModeCode_METRA_RAIL), :, J] = CTA_CBD_LINK_UP_FARE - # CTA BUS - METRA RAIL - CTA, ADDED FARE IS CTA TRANSFER - approach_cost[s & (LM == TransitModeCode_CTA_RAIL), :, J] = CTA_FIRST_XFER_FARE - # CTA BUS - METRA RAIL - PACE, ADDED FARE IS LINKUP LESS FEEDER BUS - approach_cost[s & (LM == TransitModeCode_PACE_BUS), :, J] = FEEDER_BUS_CBD_FARE - - # FIRST MODE CTA RAIL - # WHEN THIS IS TRUE A FULL FARE AND TRANSFER HAVE - # BEEN PAID, SO NO ADDED FARE IS NEEDED FOR BUS - - - # ORIGIN OTHER THAN CHICAGO, ADDED FARE IS NOW AN RTA TRANSFER - s = t & (FM < TransitModeCode_CTA_RAIL) & (ozone_type > 2) - if np.any(s): - approach_cost[s, :, J] = PACE_BUS_FIRST_XFER_FARE - - # CHICAGO ORIGIN, ADDED FARE IS CTA TRANSFER - s = t & (FM < TransitModeCode_CTA_RAIL) & (ozone_type <= 2) - if np.any(s): - approach_cost[s, :, J] = CTA_FIRST_XFER_FARE - - TVAR4[t, :, J] += approach_cost[t, :, J] - - - # ==== DESTINATION ==== - else: - # LAST MODE SUBURBAN RAIL - s = t & (LM == TransitModeCode_METRA_RAIL) & (dzone_type > 2) - if np.any(s): - # SUBURBAN DESTINATION, PACE BUS - # METRA RAIL - PACE BUS, ADDED FARE IS PACE FEEDER BUS FARE - approach_cost[s & (FM == TransitModeCode_METRA_RAIL), :, J] = FEEDER_BUS_BOARDING_FARE - # CTA - METRA RAIL - PACE BUS, NO ADDED FARE, LINKUP > FEEDER BUS - # PACE - METRA RAIL - PACE BUS, ADDED FARE IS LINKUP LESS FEEDER BUS - approach_cost[s & (FM == TransitModeCode_PACE_BUS), :, J] = FEEDER_BUS_CBD_FARE - s = t & (LM == TransitModeCode_METRA_RAIL) & (dzone_type <= 2) - if np.any(s): - # CHICAGO DESTINATION, CTA BUS - # METRA - CTA BUS, ADDED COST IS LINKUP FARE (SINGLE RIDE) - approach_cost[s & (FM == TransitModeCode_METRA_RAIL), :, J] = CTA_CBD_LINK_UP_FARE - # CTA - METRA - CTA BUS, ADDED COST IS CTA TRANSFER - approach_cost[s & (FM == TransitModeCode_CTA_RAIL), :, J] = CTA_FIRST_XFER_FARE - # PACE - METRA - CTA BUS, ADDED COST IS LINKUP MINUS FEEDER BUS - approach_cost[s & (FM == TransitModeCode_PACE_BUS), :, J] = FEEDER_BUS_CBD_FARE - # ADD CTA TRANSFER IF NOT ALREADY PAID BUT IT WAS USED - s = t & (LM < TransitModeCode_CTA_RAIL) & (dzone_type > 2) - if np.any(s): - approach_cost[s, :, J] = CTA_FIRST_XFER_FARE * ( - (best_approach_mode[s,:, FRONT_END]==APPROACH_BUS) - |(best_approach_mode[s,:, FRONT_END]==APPROACH_FEEDER_BUS) - ) - - TVAR4[t, :, J] += approach_cost[t, :, J] - - - # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = - # J=2(PARK & RIDE) FIRST MODE. PARK & RIDE FOR APPROACH TO RAPID TRANSIT AND SUBURBAN RAIL ROAD - # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = - elif (J == APPROACH_PARK_N_RIDE and I == FRONT_END): - approach_drivetime[t,:, J] = approach_distances[t,:, DIST_TO_PARK_N_RIDE_STATION, I] / np.expand_dims(SPEEDS[ZTYPE_Z[t] - 1],1) * 60. # broadcast - approach_walktime[t,:, J] = W2PNR - # APPROACH COST=PER MILE COST + FIXED COST - approach_cost[t,:, J] = approach_distances[t,:, DIST_TO_PARK_N_RIDE_STATION, I] * np.expand_dims(AUTO_OPERATING_COST_BY_ZONETYPE[ZTYPE_Z[t] - 1],1) # broadcast - # OPERATING COST MAY NOT BE LESS THAN 5 CENTS - approach_cost[t,:, J] = np.fmax(approach_cost[t,:, J], 5.0) - - approach_cost[t,:, J] = approach_cost[t,:, J] + AFC1 - # ADD HALF OF THE PARKING COST IF PARK-&-RIDE AVAILABLE - _tz = t&PNRAVL[Z-1] - approach_cost[_tz,:, J] += np.expand_dims(PRCOST[Z-1][_tz],1) / 2 # broadcast - # IF NO PARK-&-RIDE FACILITY AVAILABLE INCREASE WALK TIME - approach_walktime[~_tz,:, J] = 3 * W2PNR - - TVAR4[t,:, J] = ( - approach_walktime[t,:, J] * DRVOT * 2.0 - + approach_drivetime[t,:, J] * DRVOT - + approach_cost[t,:, J] - ) - - # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = - # J=3(KISS & RIDE) FIRST MODE. KISS & RIDE FOR APPROACH TO RAPID TRANSIT AND SUBURBAN RAIL ROAD - # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = - elif (J == APPROACH_KISS_N_RIDE and I == FRONT_END): - approach_drivetime[t,:, J] = approach_distances[t,:, DIST_TO_PARK_N_RIDE_STATION, I] / np.expand_dims(SPEEDS[ZTYPE_Z[t] - 1],1) * 60. # broadcast - approach_walktime[t,:, J] = W2PNR - approach_cost[t,:, J] = approach_distances[t,:, DIST_TO_PARK_N_RIDE_STATION, I] * np.expand_dims(AUTO_OPERATING_COST_BY_ZONETYPE[ZTYPE_Z[t] - 1],1) # broadcast - approach_cost[t,:, J] = np.fmin(approach_cost[t,:, J], 5.0) - # ******************* RWE CHANGE FOR I290 AUGUST-SEPT 2009 ************ - # ASSUMPTION IS THAT KISS AND RIDE REQUIRES A SPECIAL - # TRIP FROM HOME. DRIVER AND PASSENGER TIME VALUES NOW EQUAL. - # APCOST[J]=APCOST[J]*2.+AFC2+(DRVOT*approach_drivetime[J]*2.)/10 - approach_cost[t,:, J] = approach_cost[t,:, J] * 2. + AFC2 - TVAR4[t,:, J] = ( - approach_walktime[t,:, J] * OVT_IVT_RATIO - + approach_drivetime[t,:, J] * 2 # KISSING DRIVER - + approach_drivetime[t,:, J] - ) * DRVOT - # ******************* RWE CHANGE FOR I290 AUGUST-SEPT 2009 ************ - TVAR4[t,:, J] += approach_cost[t,:, J] - - # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = - # EVALUATE APPROACH MODES AND SELECT THE BEST - # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = - # FOLLOWING CODE CHANGED BY EASH 12/6/93 TO REFLECT - # NEW TRIP TYPES - # TPTYPE = 1 HOME PRODUCTIONS TO WORK ATTRACTIONS - # TPTYPE = 2 HOME PRODUCTIONS TO NON-WORK/NON-HOME ATTRACTIONS - # TPTYPE = 3 NON-HOME PRODUCTIONS TO NON-HOME ATTRACTIONS - for J in range(N_APPROACH_MODES): - # NO KISS-&-RIDE FOR NON-WORK TRIPS - if (TPTYPE != HW and J == APPROACH_KISS_N_RIDE): - continue - # NO PARK-AND RIDE OR KISS-&-RIDE AT THE WORK/OTHER - # ATTRACTION END FOR HOME BASED TRIPS - if (TPTYPE != NH and I == BACK_END and (J == APPROACH_PARK_N_RIDE or J == APPROACH_KISS_N_RIDE)): - continue - # NO PARK-&-RIDE OR KISS AND RIDE FOR NON-HOME TO NON-HOME TRIPS - if (TPTYPE == NH and (J == APPROACH_PARK_N_RIDE or J == APPROACH_KISS_N_RIDE)): - continue - # -- FIND LOWEST COST APPROACH - for _i1 in range(TVAR4.shape[0]): - for _i2 in range(TVAR4.shape[1]): - if (TVAR4[_i1, _i2, J] > 0) and (TVAR4[_i1, _i2, J] < TVAR5[_i1, _i2]): - TVAR5[_i1, _i2] = TVAR4[_i1, _i2, J] - best_approach_mode[_i1, _i2, I] = J - best_drivetime[_i1, _i2, I] = approach_drivetime[_i1, _i2, J] + .5 - best_walktime[_i1, _i2, I] = approach_walktime[_i1, _i2, J] + .5 - best_cost[_i1, _i2, I] = approach_cost[_i1, _i2, J] + .5 - best_waittime[_i1, _i2, I] = approach_waittime[_i1, _i2, J] + .5 - - # if trace: - # log.log(trace, f" DIRECTION {I} APPROACH TYPE {J} {APPROACH_MODE_NAMES.get(J)}") - # log.log(trace, f" drivetime {approach_drivetime[:5,:5, J]}") - # log.log(trace, f" walktime {approach_walktime[:5,:5, J]}") - # log.log(trace, f" cost {approach_cost[:5,:5, J]}") - # log.log(trace, f" waittime {approach_waittime[:5,:5,J]}") - # log.log(trace, f" gen cost {TVAR4[:5,:5, J]}") - # if trace: - # log.log(trace, f" DIRECTION {I} BEST APPROACH TYPE {best_approach_mode[:5,I]}") - - - # ADD ORIGIN AND DESTINATION QUANTITIES AND PASS BACK TO TRIPS - - ae_drivetime = best_drivetime[:,:, 0] + best_drivetime[:,:, 1] - ae_walktime = best_walktime[:,:, 0] + best_walktime[:,:, 1] - ae_cost = best_cost[:,:, 0] + best_cost[:,:, 1] - ae_waittime = best_waittime[:,:, 0] + best_waittime[:,:, 1] - - ae_drivetime = ae_drivetime.reshape((vector_len,replication)) - ae_walktime = ae_walktime.reshape((vector_len,replication)) - ae_cost = ae_cost.reshape((vector_len,replication)) - ae_waittime = ae_waittime.reshape((vector_len,replication)) - best_approach_mode = best_approach_mode.reshape((vector_len,replication,N_TRIP_ENDS)) - - out[:,:,0] = ae_drivetime - out[:,:,1] = ae_walktime - out[:,:,2] = ae_cost - out[:,:,3] = ae_waittime - out[:,:,4] = best_approach_mode[:,:,0] - out[:,:,5] = best_approach_mode[:,:,1] - - # return ( - # ae_drivetime, - # ae_walktime, - # ae_cost, - # ae_waittime, - # best_approach_mode, - # ) - -@nb.njit(parallel=True, cache=True) -def transit_approach_parallel( - trapp_struct, - ozone, - dzone, - TPTYPE, - approach_distances, -): - out = np.zeros((ozone.size, approach_distances.shape[1], 6), dtype=np.int32) - slices = ozone.size // 100 + (1 if ozone.size % 100 else 0) - for i in nb.prange(slices): - s = slice(i*100, (i+1)*100) - transit_approach( - trapp_struct, - ozone[s], - dzone[s], - TPTYPE, - approach_distances[s], - out[s], - ) - return ( - out[:, :, 0], - out[:, :, 1], - out[:, :, 2], - out[:, :, 3], - out[:, :, 4:], - ) - -def transit_approach_wrap( - trapp_struct, - ozone, - dzone, - TPTYPE, - approach_distances, -): - out_tuple = transit_approach_parallel( - trapp_struct, - ozone, - dzone, - TPTYPE, - approach_distances, - ) - out = Dict() - out.drivetime = out_tuple[0] - out.walktime = out_tuple[1] - out.cost = out_tuple[2] - out.waittime = out_tuple[3] - out.approach_mode = out_tuple[4] - return out - -#return transit_approach_wrap, transit_approach_distances \ No newline at end of file diff --git a/src/Mode-Dest-TOD/cmap_modedest/hh_sampling.py b/src/Mode-Dest-TOD/cmap_modedest/hh_sampling.py deleted file mode 100644 index 72e5486..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/hh_sampling.py +++ /dev/null @@ -1,25 +0,0 @@ -import numpy as np -import pandas as pd -from cmap_modedest.random_states import check_random_generator - - -def sample_hh_from_zone(dh, zone, n_hh, random_state=None, attr=('N_ADULTS', 'N_VEHICLES')): - pool = dh.hh_tabulation.loc[zone] - hhv_types = dh.hhv_types - pool_sum = pool.sum() - if pool_sum: - hhv_prob = pool / pool_sum - else: - # No households in this zone to enumerate, sample from region instead to avoid NaNs - pool = dh.hh_tabulation.sum() - pool_sum = pool.sum() - hhv_prob = pool / pool_sum - prng = check_random_generator(random_state) - draws = prng.choice(624, size=n_hh, p=hhv_prob) - result = pd.DataFrame(-1, dtype=np.int8, columns=attr, index=pd.RangeIndex(n_hh)) - for i, a in enumerate(attr): - if a == 'N_ADULTS': - result.values[:, i] = hhv_types[a].cat.codes.iloc[draws] + 1 - else: - result.values[:, i] = hhv_types[a].cat.codes.iloc[draws] - return result diff --git a/src/Mode-Dest-TOD/cmap_modedest/incomes.py b/src/Mode-Dest-TOD/cmap_modedest/incomes.py deleted file mode 100644 index 08eb695..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/incomes.py +++ /dev/null @@ -1,99 +0,0 @@ -import numpy as np -import pandas as pd -from scipy.stats import lognorm - -from .random_states import check_random_generator - -income_levels_1 = { - 1 : 12_000, # Less than $15,000 - 2 : 20_000, # $15,000 to $24,999 - 3 : 27_500, # $25,000 to $29,999 - 4 : 32_500, # $30,000 to $34,999 - 5 : 42_500, # $35,000 to $49,999 - 6 : 55_000, # $50,000 to $59,999 - 7 : 65_000, # $60,000 to $74,999 - 8 : 85_000, # $75,000 to $99,999 - 9 : 120_000, # $100,000 to $149,999 - 10 : 170_000, # $150,000 or more -} - -income_levels_2 = { - 1 : 25_001, # Less than $30,000 - 2 : 40_001, # $30,000 to $59,999 - 3 : 70_001, # $60,000 to $99,999 - 4 : 125_001, # $100,000 to $149,999 - 5 : 175_001, # $150,000 or more -} - - - -def random_incomes( - median_income, - replications, - random_state=None, - sigma=0.42, - bins=None, - trunc_max=None, - trunc_min=None, -): - """ - Draw random income levels from a log-normal distribution - - Parameters - ---------- - median_income : numeric - replications : int - Size of resulting array - random_state : RandomState - sigma : float, default 0.42 - The standard deviation of the underlying normal distribution. - The default of 0.42 is retained from prior versions of the CMAP - trip-based model, although a bug in that model resulted in a - downward bias in the random draws. - bins : array-like or '5', optional, - If provided, digitize into these bins. - - Returns - ------- - ndarray - """ - random_generator = check_random_generator(random_state) - y = lognorm(sigma, scale=median_income).rvs( - replications, - random_state=random_generator, - ) - # resample from acceptable draws when truncated - if trunc_max is not None: - acceptable = y[(y <= trunc_max)] - acceptable_size = acceptable.size - if acceptable_size == 0: - acceptable = [trunc_max] - swaps = random_generator.choice(acceptable, y.size-acceptable_size) - y[(y > trunc_max)] = swaps - if trunc_min is not None: - acceptable = y[(y >= trunc_min)] - acceptable_size = acceptable.size - if acceptable.size == 0: - acceptable = [trunc_min] - swaps = random_generator.choice(acceptable, y.size-acceptable_size) - y[(y < trunc_min)] = swaps - if bins == '5': - bins = [ - -np.inf, - 30_000, - 60_000, - 100_000, - 150_000, - np.inf, - ] - if bins == '4': - bins = [ - -np.inf, - 30_000, - 60_000, - 150_000, - np.inf, - ] - if bins is not None: - return np.digitize(y, bins) - return y \ No newline at end of file diff --git a/src/Mode-Dest-TOD/cmap_modedest/modecodes.py b/src/Mode-Dest-TOD/cmap_modedest/modecodes.py deleted file mode 100644 index 8524a96..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/modecodes.py +++ /dev/null @@ -1,60 +0,0 @@ -import numpy as np -from .addict import Dict - -mode5names = ['AUTO', 'TAXI', 'TNC1', 'TNC2', 'TRANSIT'] -mode5codes = Dict(zip( - mode5names, - np.arange(len(mode5names)) + 1, -)) - -mode7names = ['AUTO', 'TAXI', 'TNC1', 'TNC2', 'TRANSIT', 'WALK', 'BIKE'] -mode7codes = Dict(zip( - mode7names, - np.arange(len(mode7names)) + 1, -)) - -mode9names = ['AUTO', 'HOV2', 'HOV3', 'TAXI', 'TNC1', 'TNC2', 'TRANSIT', 'WALK', 'BIKE'] -mode9codes = Dict(zip( - mode9names, - np.arange(len(mode9names)) + 1, -)) - - -TransitModeCode_CTA_REGULAR_BUS = 4 -TransitModeCode_CTA_EXPRESS_BUS = 5 -TransitModeCode_PACE_BUS = 6 -TransitModeCode_CTA_RAIL = 7 -TransitModeCode_METRA_RAIL = 8 - -N_TRANSIT_MODES = 8 - - -APPROACH_WALK = 0 -APPROACH_BUS = 1 -APPROACH_PARK_N_RIDE = 2 -APPROACH_KISS_N_RIDE = 3 -APPROACH_FEEDER_BUS = 4 - -N_APPROACH_MODES = 5 -APPROACH_MODE_NAMES = { - APPROACH_WALK: 'Walk', - APPROACH_BUS: 'Bus', - APPROACH_PARK_N_RIDE: 'PnR', - APPROACH_KISS_N_RIDE: 'KnR', - APPROACH_FEEDER_BUS: 'Feeder', -} - -DIST_TO_BUS = 0 -DIST_TO_CTA_RAIL = 1 -DIST_TO_METRA = 2 -DIST_TO_FEEDER_BUS = 3 -DIST_TO_PARK_N_RIDE_STATION = 4 - -N_DIST_TO_TYPES = 5 -DIST_TO_NAMES = { - DIST_TO_BUS: 'to Bus', - DIST_TO_CTA_RAIL: 'to El', - DIST_TO_METRA: 'to Metra', - DIST_TO_FEEDER_BUS: 'to Feeder', - DIST_TO_PARK_N_RIDE_STATION: 'to PnR', -} \ No newline at end of file diff --git a/src/Mode-Dest-TOD/cmap_modedest/numexpr_patch.py b/src/Mode-Dest-TOD/cmap_modedest/numexpr_patch.py deleted file mode 100644 index 59dd7a5..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/numexpr_patch.py +++ /dev/null @@ -1,31 +0,0 @@ - -# Numexpr's caching sometimes fails on dask multi-threaded - - -class CacheDictSafe(dict): - """ - A dictionary that prevents itself from growing too much. - """ - - def __init__(self, maxentries): - self.maxentries = maxentries - super(CacheDictSafe, self).__init__(self) - - def __setitem__(self, key, value): - # Protection against growing the cache too much - if len(self) > self.maxentries * 2: - # The cache is overflowing, wipe it completely - super(CacheDictSafe, self).clear() - if len(self) > self.maxentries: - # Remove a 10% of (arbitrary) elements from the cache - entries_to_remove = self.maxentries // 10 - for k in list(self.keys())[:entries_to_remove]: - try: - super(CacheDictSafe, self).__delitem__(k) - except KeyError: - pass - super(CacheDictSafe, self).__setitem__(key, value) - - -import numexpr as ne -ne.necompiler._numexpr_cache = CacheDictSafe(256) diff --git a/src/Mode-Dest-TOD/cmap_modedest/parking_costs.py b/src/Mode-Dest-TOD/cmap_modedest/parking_costs.py deleted file mode 100644 index 924b198..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/parking_costs.py +++ /dev/null @@ -1,371 +0,0 @@ -import numpy as np -import pandas as pd -from .random_states import check_random_generator - -# cbd_parking = pd.read_csv( -# filenames.HW_CBDPARK, -# header=None, -# names=['ZoneID', 'CumProb', 'ThresholdPrice', 'SavePrice', 'WalkSeconds'], -# ) -# cbd_parking.CumProb /= 10000. -# # cbd_parking['SumPrice'] = cbd_parking.ThresholdPrice + cbd_parking.SavePrice -# cbd_parking['rownum'] = cbd_parking.groupby(['ZoneID']).cumcount() -# _z = cbd_parking.ZoneID.value_counts().sort_index().index -# CBD_PARKING_ZONES = dict(zip(_z, np.arange(len(_z)))) -# -# -# def decumulate(x): -# x_ = np.array(x) -# x_[1:] -= x[:-1] -# return x_ -# cbd_parking['Prob'] = cbd_parking.groupby("ZoneID")['CumProb'].transform(decumulate) -# cbd_parking['WeightedPrice'] = cbd_parking['Prob'] * cbd_parking['ThresholdPrice'] -# cbd_parking_prices = cbd_parking.set_index(["ZoneID",'rownum']).ThresholdPrice.unstack() -# cbd_parking_price_prob = cbd_parking.set_index(["ZoneID",'rownum']).Prob.unstack() -# -# -# -# -# cbd_parking2 = pd.read_csv( -# filenames.HW_CBDPARK2, -# header=None, -# names=[ -# 'IncomeCeiling', -# 'FreeParkingPct', -# 'TransitPct', -# 'AutoOcc1Pct', -# 'AutoOcc2Pct', -# 'AutoOcc3Pct', -# 'AutoOcc4Pct', -# ], -# ) - - -# def parking_cost_cbd( -# ORIG, -# DEST, -# INCOME, -# HOURS, -# random_state=None, -# ): -# """ -# This function tries to exactly replicate the FORTRAN PRKCBD, right or wrong -# -# Parameters -# ---------- -# ORIG, DEST : int -# TAZ ID for origin, destination -# INCOME : array-like, shape[ITER] -# HOURS : numeric -# Number of hours of parking to pay for -# CBD_PARKING_ZONES : Mapping -# Maps destination zone numbers to CBD parking zone numbers -# random_state -# -# Returns -# ------- -# CAPK, WALK3, INTOCC, BLK, SI : array, shape[ITER] -# parking cost, walktime, vehicle occupancy, blocks walked, savings rate -# """ -# global CBD_PARKING_ZONES -# random_state = check_random_generator(random_state) -# -# ITER = INCOME.shape[0] -# -# J6 = np.zeros(ITER) -# J7 = np.ones(ITER) -# J3 = np.zeros(ITER, dtype=int) -# L = np.zeros(ITER, dtype=int) -# -# RAN2 = random_state.random(size=ITER) -# RAN3 = random_state.random(size=ITER) * 100. # Free Parking randomizer -# RAN4 = random_state.random(size=ITER) -# RAN5 = random_state.random(size=ITER) * 100. # Auto Occupancy randomizer -# -# # ORIG = pd.Series(ORIG) -# # DEST = pd.Series(DEST) -# -# PZONE = CBD_PARKING_ZONES[DEST] -# FREEPRK = np.empty(ITER) -# for j2 in reversed(range(5)): -# k = INCOME 1] = 0 -# J6[J7 == 0] = 1 -# -# VT = INCOME/2400. -# -# # Baseline free parking -# CAPK = np.zeros(ITER, dtype=int) -# WALK3 = np.full(ITER, 3.0) -# HC = np.zeros(ITER) -# SI = np.zeros(ITER) -# WK = np.zeros(ITER) -# BLK = np.zeros(ITER) -# -# paid_parking = (RAN3 > FREEPRK) -# HC[paid_parking] = ( -# J7 * CBDPRK.ThresholdPrice.iloc[0] + # when using first row -# J6 * (HCPT1 + (HCPT2-HCPT1)*(HCPT3-RAN2)/(HCPT3_4)) # when using other rows -# )[paid_parking] -# SI[paid_parking] = CBDPRK.SavePrice[J3].values[paid_parking] -# WK[paid_parking] = np.fmax(CBDPRK.WalkSeconds[J3].values[paid_parking], 180) -# BLK[paid_parking] = SI[paid_parking] / (VT[paid_parking] * WK[paid_parking] / 60.) # BLK IS BLOCKS WALKED -# BLK[paid_parking] = np.clip(BLK[paid_parking], 0.25, 6.0) -# WALK3[paid_parking] = (BLK[paid_parking] * WK[paid_parking]) / 60. -# CAPK[paid_parking] = np.clip(HC[paid_parking] * HOURS - BLK[paid_parking] * SI[paid_parking], 0.0, None) -# -# INTOCC = np.zeros(ITER, dtype=np.int8) -# RAN5 -= cbd_parking2.loc[L, 'AutoOcc1Pct'].values -# INTOCC[(INTOCC==0) & (RAN5 < 0)] = 1 -# RAN5 -= cbd_parking2.loc[L, 'AutoOcc2Pct'].values -# INTOCC[(INTOCC==0) & (RAN5 < 0)] = 2 -# RAN5 -= cbd_parking2.loc[L, 'AutoOcc3Pct'].values -# INTOCC[(INTOCC==0) & (RAN5 < 0)] = 3 -# INTOCC[(INTOCC==0)] = 4 -# -# return CAPK, WALK3, INTOCC, BLK, SI -# - -def parking_cost_v2( - dh, - DEST, - INCOME, - HOURS, - purpose, - random_state=None, -): - - """ - Draw a parking cost from the random distribution in the destination zone. - - Parameters - ---------- - DEST : array-like, shape[ITER] - TAZ ID for destination - INCOME : array-like, shape[ITER] - HOURS : numeric - Number of hours of parking to pay for - random_state - - Returns - ------- - CAPK, WALK3, INTOCC, BLK, SI : array, shape[ITER] - parking cost, walktime, vehicle occupancy, blocks walked, savings rate - """ - global CBD_PARKING_ZONES, cbd_parking_price_prob, cbd_parking_prices - random_state = check_random_generator(random_state) - - DEST = pd.Series(DEST) - ITER = DEST.size - - rand_free_parking = random_state.random(size=ITER) * 100. # Free Parking randomizer - rand_parking_price = random_state.random(size=ITER) # Parking Rate randomizer - RAN5 = random_state.random(size=ITER) * 100. # Auto Occupancy randomizer - - price_probs = dh.cbd_parking_price_prob.reindex(DEST.values) - prices = dh.cbd_parking_prices.reindex(DEST.values) - parking_price_row = np.full(ITER, -1, dtype=np.int8) - for i in range(5): - rand_parking_price -= price_probs.iloc[:,0] - parking_price_row[(parking_price_row < 0) & (rand_parking_price < 0)] = i - - # Assemble the randomly selected parking-price columns into one Series. - # It will have NaN values for zones outside the CBD parking model - parking_price_1 = pd.Series( - prices.values[range(len(parking_price_row)), parking_price_row], - index=DEST.index, - ) - - # Assemble default hourly pricing to use for trips based on zone type - # This Series is len(Zones) not len(Trips) - zonetype_price = dh.m01.zone_type.map(dh.cfg.parking_costs.defaults[purpose]) - - # Fill in NaNs with default values. - parking_price_2 = DEST.map(zonetype_price) - parking_price = parking_price_1.fillna(parking_price_2) - - # Find free parking rate based on income group - income_group = np.zeros(ITER, dtype=int) - FREEPRK = np.zeros(ITER) - for j2 in reversed(range(5)): - k = INCOME 1] = 0 - # J6[J7 == 0] = 1 - # - # VT = INCOME/2400. - # - # # Baseline free parking - # CAPK = np.zeros(ITER, dtype=int) - # WALK3 = np.full(ITER, 3.0) - # HC = np.zeros(ITER) - # SI = np.zeros(ITER) - # WK = np.zeros(ITER) - # BLK = np.zeros(ITER) - # - # paid_parking = (RAN3 > FREEPRK) - # HC[paid_parking] = ( - # J7 * CBDPRK.ThresholdPrice.iloc[0] + # when using first row - # J6 * (HCPT1 + (HCPT2-HCPT1)*(HCPT3-RAN2)/(HCPT3_4)) # when using other rows - # )[paid_parking] - # SI[paid_parking] = CBDPRK.SavePrice[J3].values[paid_parking] - # WK[paid_parking] = np.fmax(CBDPRK.WalkSeconds[J3].values[paid_parking], 180) - # BLK[paid_parking] = SI[paid_parking] / (VT[paid_parking] * WK[paid_parking] / 60.) # BLK IS BLOCKS WALKED - # BLK[paid_parking] = np.clip(BLK[paid_parking], 0.25, 6.0) - # WALK3[paid_parking] = (BLK[paid_parking] * WK[paid_parking]) / 60. - # CAPK[paid_parking] = np.clip(HC[paid_parking] * HOURS - BLK[paid_parking] * SI[paid_parking], 0.0, None) - # - # INTOCC = np.zeros(ITER, dtype=np.int8) - # RAN5 -= cbd_parking2.loc[L, 'AutoOcc1Pct'].values - # INTOCC[(INTOCC==0) & (RAN5 < 0)] = 1 - # RAN5 -= cbd_parking2.loc[L, 'AutoOcc2Pct'].values - # INTOCC[(INTOCC==0) & (RAN5 < 0)] = 2 - # RAN5 -= cbd_parking2.loc[L, 'AutoOcc3Pct'].values - # INTOCC[(INTOCC==0) & (RAN5 < 0)] = 3 - # INTOCC[(INTOCC==0)] = 4 - # - # return CAPK, WALK3, INTOCC, BLK, SI - - -def parking_cost_v3( - dh, - DEST, - HOURS, - purpose, - random_state=None, -): - - """ - Draw a parking cost from the random distribution in the destination zone. - - Parameters - ---------- - dh : DataHandler - DEST : array-like, shape[ITER] - TAZ ID for destination - HOURS : numeric - Number of hours of parking to pay for - purpose : str - Used to determine the default price per hour by zonetype. - - random_state - - Returns - ------- - CAPK, WALK3, INTOCC, BLK, SI : array, shape[ITER] - parking cost, walktime, vehicle occupancy, blocks walked, savings rate - """ - global CBD_PARKING_ZONES, cbd_parking_price_prob, cbd_parking_prices - random_state = check_random_generator(random_state) - - DEST = pd.Series(DEST.reshape(-1)) - ITER = DEST.size - - rand_free_parking = random_state.random(size=ITER) * 100. # Free Parking randomizer - rand_parking_price = random_state.random(size=ITER) # Parking Rate randomizer - - price_probs = dh.cbd_parking_price_prob.reindex(DEST.values) - prices = dh.cbd_parking_prices.reindex(DEST.values) - parking_price_row = np.full(ITER, -1, dtype=np.int8) - for i in range(5): - rand_parking_price -= price_probs.iloc[:,0] - parking_price_row[(parking_price_row < 0) & (rand_parking_price < 0)] = i - - # Assemble the randomly selected parking-price columns into one Series. - # It will have NaN values for zones outside the CBD parking model - parking_price_1 = pd.Series( - prices.values[range(len(parking_price_row)), parking_price_row], - index=DEST.index, - ) - - # Assemble default hourly pricing to use for trips based on zone type - # This Series is len(Zones) not len(Trips) - zonetype_price = dh.m01.zone_type.map(dh.cfg.parking_costs.defaults[purpose]) - - # Fill in NaNs with default values. - parking_price_2 = DEST.map(zonetype_price) - parking_price = parking_price_1.fillna(parking_price_2) - - # Scale up based on number of hours of parking - parking_price *= HOURS - - return parking_price - - -def parking_is_free( - dh, - INCOME, - random_state=None, -): - - """ - Draw a parking cost from the random distribution in the destination zone. - - Parameters - ---------- - dh : DataHandler - INCOME : array-like, shape[ITER] - Income groups for each draw, used to find if parking is actually free - Values are categories 1 to 5 - random_state - - Returns - ------- - paid_parking : array, shape[ITER] - 1 if parking is paid, 0 if free - """ - random_state = check_random_generator(random_state) - rand_free_parking = random_state.random(size=INCOME.size) * 100. # Free Parking randomizer - - # Find free parking rate based on income group - FREEPRK = dh.cbd_parking2.FreeParkingPct.iloc[INCOME-1] - - # random draw if the traveler gets free parking - paid_parking = (rand_free_parking > FREEPRK) - - return paid_parking diff --git a/src/Mode-Dest-TOD/cmap_modedest/purposes.py b/src/Mode-Dest-TOD/cmap_modedest/purposes.py deleted file mode 100644 index 55b0387..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/purposes.py +++ /dev/null @@ -1,60 +0,0 @@ - -purposes5 = ( - 'HBWH', # Home-based Work, High Income - 'HBWL', # Home-based Work, Low Income - 'HBS', # Home-based Shopping - 'HBO', # Home-based Other Purpose Not Enumerated - 'NHB', # Non-home-based -) - -purposes8 = ( - 'HBWH', # Home-based Work, High Income - 'HBWL', # Home-based Work, Low Income - 'HBS', # Home-based Shopping - 'HBO', # Home-based Other Purpose Not Enumerated - 'HBOR', # Home-based Other Purpose Not Enumerated, at a residence - 'NHB', # Non-home-based not shopping - 'NHBS', # Non-home-based shopping - 'NHBR', # Non-home-based, at a residence -) - -purposes3 = ( - 'HW', # Home-based Work - 'HO', # Home-based Other Purpose Not Work - 'NH', # Non-home-based -) - -purposesA = purposes5 - -purposes_to_peaky = dict( - HBWH=1, - HBWL=1, - HBS=0, - HBO=0, - NHB=0, - HBOR=0, - NHBR=0, - NHBS=0, -) - -purposes_to_3 = dict( - HBWH='HW', - HBWL='HW', - HBS='HO', - HBO='HO', - NHB='NH', - HBOR='HO', - NHBR='NH', - NHBS='NH', -) - -purposes_to_5 = dict( - HBWH='HBWH', - HBWL='HBWL', - HBS='HBS', - HBO='HBO', - NHB='NHB', - HBOR='HBO', - NHBR='NHB', - NHBS='NHB', -) \ No newline at end of file diff --git a/src/Mode-Dest-TOD/cmap_modedest/random_states.py b/src/Mode-Dest-TOD/cmap_modedest/random_states.py deleted file mode 100644 index 7b76a0e..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/random_states.py +++ /dev/null @@ -1,46 +0,0 @@ -import numbers -import numpy as np - -def check_random_state(seed): - """ - Turn a seed into a numpy RandomState instance - - Parameters - ---------- - seed : None | int | instance of RandomState - If seed is None, return the RandomState singleton used by np.random. - If seed is an int, return a new RandomState instance seeded with seed. - If seed is already a RandomState instance, return it. - Otherwise raise ValueError. - """ - if seed is None or seed is np.random: - return np.random.RandomState() - if isinstance(seed, numbers.Integral): - return np.random.RandomState(seed % 1<<32) - if isinstance(seed, np.random.RandomState): - return seed - raise ValueError('%r cannot be used to seed a numpy.random.RandomState' - ' instance' % seed) - - -def check_random_generator(seed=None): - """ - Create a random generator. - - Parameters - ---------- - seed - - Returns - ------- - np.random.Generator - """ - if seed is None: - raise ValueError("True random seeding disallowed for CMAP trip based model") - try: - return np.random.default_rng(seed) - except TypeError: - if isinstance(seed, np.random.RandomState): - return np.random.default_rng(seed.get_state()[1]) - else: - raise \ No newline at end of file diff --git a/src/Mode-Dest-TOD/cmap_modedest/runtime.py b/src/Mode-Dest-TOD/cmap_modedest/runtime.py deleted file mode 100644 index 4d67614..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/runtime.py +++ /dev/null @@ -1,40 +0,0 @@ -import os -import cmap_modedest -from pathlib import Path - -from .data_handlers import DataHandler - - -import cmap_modedest - -log = cmap_modedest.log_to_stderr(level=10) - - -def log_info(*args): - """Short logging function for estimation""" - if len(args) == 1 and isinstance(args[0], str) and args[0][0] == "#": - log.info(args[0]) - else: - s = "\n".join(str(i) for i in args) - s = "\n"+s - log.info(s.replace("\n", "\n ")) - - -def working_dir(*candidate_emme_database_dirs, backfill_uncompressed_skims=False, **kwargs): - for emme_database_dir in candidate_emme_database_dirs: - emme_database_dir = os.path.expanduser(emme_database_dir) - if os.path.exists(emme_database_dir): break - else: - raise FileNotFoundError(candidate_emme_database_dirs) - emme_database_dir = Path(emme_database_dir) - os.makedirs(emme_database_dir/"emmemat", exist_ok=True) # must exist even if empty - log_info("###### Set Directories and Prep Data ######") - dh = DataHandler( - emme_database_dir=emme_database_dir, - cache_dir=emme_database_dir/"cache", - zone_shapefile=emme_database_dir/"data/distr/zone17.shp", - backfill_uncompressed_skims=backfill_uncompressed_skims, - **kwargs, - ) - log_info("Data Handlers Ready") - return dh diff --git a/src/Mode-Dest-TOD/cmap_modedest/skims/__init__.py b/src/Mode-Dest-TOD/cmap_modedest/skims/__init__.py deleted file mode 100644 index 26edd5b..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/skims/__init__.py +++ /dev/null @@ -1,57 +0,0 @@ -import os -import zarr -from pathlib import Path -from .compression import read_compressed_skims, read_uncompressed_skims, write_compressed_skims, write_uncompressed_skims -from ..cmap_logging import getLogger - -def read_skims( - directory, - backfill_compressed_skims=False, - backfill_uncompressed_skims=False, - use_compressed_skims=False, -): - """ - - Parameters - ---------- - directory : Path-like - Where to read skims from, omitting any ".zarr" suffix. - backfill_compressed_skims : bool, default False - Write skims that only appear in the uncompressed directory into the - zarr directory. - backfill_uncompressed_skims : bool, default False - Write skims that only appear in the compressed zarr directory into the - uncompressed directory. - use_compressed_skims : bool, default False - Whether to allow the usage of compressed skims at all. - - Returns - ------- - sh.Dataset - """ - appended_names = [] - skims = None - try: - if use_compressed_skims: - skims = read_compressed_skims(directory) - except zarr.errors.GroupNotFoundError as err: - pass - except FileNotFoundError as err: - backfill_compressed_skims = False - try: - skims, appended_names = read_uncompressed_skims(directory, skims) - except (FileNotFoundError, NotADirectoryError) as err2: - if skims is None: - raise err2 - if backfill_compressed_skims and appended_names: - write_compressed_skims( - skims[appended_names], - os.fspath(Path(directory).with_suffix(".zarr")) - ) - if backfill_uncompressed_skims: - write_uncompressed_skims( - skims, - directory, - ) - - return skims diff --git a/src/Mode-Dest-TOD/cmap_modedest/skims/compression.py b/src/Mode-Dest-TOD/cmap_modedest/skims/compression.py deleted file mode 100644 index fc1a917..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/skims/compression.py +++ /dev/null @@ -1,191 +0,0 @@ -import os -import xarray as xr -import sharrow as sh -import numpy as np -import pandas as pd -import zarr -from pathlib import Path -import logging - -log = logging.getLogger('CMAP') - - -def compress_skim_dir(directory, output="zarr"): - """ - Compress the `emmemat` skims directory using zarr. - - Parameters - ---------- - directory : path to emmemat directory - output : {"zarr.zip", "zarr"} - File format to use for compression. Zarr.zip puts all the - piece in one big zip directory, while plain Zarr uses the - native file system to store a bunch of pieces. Both methods - use the same compression. - - Returns - ------- - Dataset - """ - - if output not in ("zarr", "zarr.zip"): - raise NotImplementedError(output) - - if output == "zarr": - if not os.path.exists(directory+".zarr"): - os.makedirs(directory+".zarr") - elif output == "zarr.zip": - if os.path.exists(directory+".zarr.zip"): - raise FileExistsError(directory+".zarr.zip") - - master = {} - for f in os.walk(directory): - for fi in f[2]: - if ".emx" in fi: - arr = np.fromfile(fi, dtype='f4') - side = int(np.sqrt(arr.size)) - arr = arr.reshape(side, side) - tazrange = pd.RangeIndex(1, side+1) - master[fi.replace(".emx", "")] = xr.DataArray( - arr, - dims=['otaz', 'dtaz'], - coords={'otaz': tazrange, 'dtaz': tazrange} - ) - - master = sh.Dataset(master) - - if output == "zarr": - master.to_zarr(directory+".zarr", mode='a') - elif output == "zarr.zip": - with zarr.ZipStore(directory+".zarr.zip", mode='w') as store: - master.to_zarr(store) - return master - - -def read_uncompressed_skims(directory, dataset=None, overload=True): - """ - Read emmemat skims into a Dataset. - - Parameters - ---------- - directory : Path-like - path to emmemat directory - dataset : Dataset, optional - Append to these skims. Only skims not already available - will be loaded. - overload : bool, default True - Whether to overload existing skims in `dataset`. If False, - the existing skims (generally, those loaded from the compressed - skims) have priority and are retained. If True, any uncompressed - skims have priority and existing data is overwritten in memory. - - Returns - ------- - sh.Dataset - Loaded skims - appended_names : List - Names of uncompressed skims that were added - """ - appended_names = [] - if not os.path.isdir(directory): - raise NotADirectoryError(directory) - if dataset is None: - master = {} - else: - master = dataset - log.info(f'reading uncompressed skims from {directory}') - for f in os.walk(directory): - for fi in f[2]: - if ".emx" in fi and (fi.replace(".emx", "") not in master or overload): - arr = np.memmap(os.path.join(f[0], fi), dtype='f4', mode='c') - side = int(np.sqrt(arr.size)) - arr = arr.reshape(side, side) - tazrange = pd.RangeIndex(1, side+1) - master[fi.replace(".emx", "")] = xr.DataArray( - arr, - dims=['otaz', 'dtaz'], - coords={'otaz': tazrange, 'dtaz': tazrange} - ) - appended_names.append(fi.replace(".emx", "")) - if len(master) == 0: - log.error(f'no uncompressed skims read from {directory}') - raise FileNotFoundError(directory) - log.info(f"{len(appended_names)} uncompressed skims were added to the skims dataset") - return sh.Dataset(master), appended_names - - -def read_compressed_skims(zarr_directory): - """ - Read previously compressed skims. - - Compressed skims must be stored in a directory ending with a .zarr extension. - - Parameters - ---------- - zarr_directory - - Returns - ------- - Dataset - """ - result = None - if zarr_directory is None: - log.warning("no `zarr_directory` given") - raise ValueError("no `zarr_directory` given") - zarr_directory = Path(zarr_directory) - if os.path.isdir(zarr_directory.with_suffix(".zarr")): - log.info(f'reading compressed skims from {zarr_directory.with_suffix(".zarr")}') - result = sh.Dataset.from_zarr(zarr_directory.with_suffix(".zarr")) - elif os.path.isfile(zarr_directory.with_suffix(".zarr.zip")): - log.info(f'reading compressed skims from {zarr_directory.with_suffix(".zarr.zip")}') - result = sh.Dataset.from_zarr(zarr_directory.with_suffix(".zarr.zip")) - if result is not None: - log.info(f"{len(result.data_vars)} compressed skims were added to the skims dataset") - return result - raise FileNotFoundError(zarr_directory) - - -def write_uncompressed_skims(skims, directory, overwrite=False): - """ - Writes the .emx files for EMME in the emmemat directory. - - Parameters - ---------- - skims : Dataset - directory : Path-like - uncompressed skims will go here - overwrite : bool, default False - Whether to overwrite existing uncompressed skims. - """ - os.makedirs(directory, exist_ok=True) - for k in skims: - filename = os.path.join(directory, f"{k}.emx") - if not os.path.exists(filename) or overwrite: - skims[k].values.tofile(filename) - - -def write_compressed_skims(skims, output="emmemat.zarr"): - """ - Compress the `emmemat` skims directory using zarr. - - Parameters - ---------- - directory : path to emmemat directory - output : str, ends with {"zarr.zip", "zarr"} - File format to use for compression. Zarr.zip puts all the - piece in one big zip directory, while plain Zarr uses the - native file system to store a bunch of pieces. Both methods - use the same compression. - """ - known_exts = (".zarr", ".zarr.zip") - if not any(output.endswith(k) for k in known_exts): - raise NotImplementedError(output) - if output.endswith(".zarr"): - skims.to_zarr(output, mode='a') - elif output.endswith(".zarr.zip"): - if os.path.exists(output): - raise FileExistsError(output) - with zarr.ZipStore(output, mode='w') as store: - skims.to_zarr(store) - - diff --git a/src/Mode-Dest-TOD/cmap_modedest/skims/names.py b/src/Mode-Dest-TOD/cmap_modedest/skims/names.py deleted file mode 100644 index 8fdd177..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/skims/names.py +++ /dev/null @@ -1,15 +0,0 @@ -from ..addict import Dict - -skim_names = Dict( - mf44='auto_am_time', - mf45='auto_am_dist', - mf46='auto_md_time', - mf47='auto_md_dist', - mf76='auto_am_time_hov', - mf77='auto_am_dist_hov', -) - -skim_tags = Dict({v:k for k,v in skim_names.items()}) - -skim_names.freeze() -skim_tags.freeze() diff --git a/src/Mode-Dest-TOD/cmap_modedest/time_of_day_model.py b/src/Mode-Dest-TOD/cmap_modedest/time_of_day_model.py deleted file mode 100644 index d04a6fd..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/time_of_day_model.py +++ /dev/null @@ -1,130 +0,0 @@ -import os -from larch.numba import Model, P, X -import yaml -from .addict import Dict - -from .cmap_logging import getLogger, get_worker_log -from .purposes import purposes5 - -time_period_names = ['EA', 'AM1', 'AM2', 'AM3', 'MD', 'PM1', 'PM2', 'PM3'] -time_period_codes = [ 1, 2, 3, 4, 5, 6, 7, 8 ] - -def tod_model_builder( - purpose, - data_co=None, - ch_name=None, - model_parameters=None, -): - from larch.numba import DataFrames - if model_parameters is None: - model_parameters = {} - - d = DataFrames( - co=data_co, - ch=ch_name, - alt_codes=time_period_codes, - alt_names=time_period_names, - av=1, - ) - - tod_model = Model(d) - tod_model.title = f"{purpose} Time of Day Choice" - - for tname, tcode in zip(time_period_names, time_period_codes): - tod_model.utility_co[tcode] = ( - + P(f"ASC_{tname}") - + P.time * X(f"mf46{tcode}") - + P(f"hiredcar_{tname}") * X("mode9 in ('TAXI','TNC1','TNC2')") - ) - if purpose[:2].upper() == "HB": - if purpose.upper() == "HBS": - tod_model.utility_co[tcode] += ( - + P(f"ASC_{tname}_r") * X("paFlip") - # no reverse-trip hired car parameters, insufficient survey data - ) - else: - tod_model.utility_co[tcode] += ( - + P(f"ASC_{tname}_r") * X("paFlip") - + P(f"hiredcar_{tname}_r") * X("mode9 in ('TAXI','TNC1','TNC2')") * X("paFlip") - ) - - tod_model.lock_value('ASC_AM2', 0.0) - tod_model.lock_value('hiredcar_AM2', 0.0) - if purpose.upper() == "HBS": - tod_model.lock_value('ASC_AM2_r', 0.0) - elif purpose[:2].upper() == "HB": - tod_model.lock_value('ASC_AM2_r', 0.0) - tod_model.lock_value('hiredcar_AM2_r', 0.0) - tod_model.set_cap() - - if purpose == 'NHB': - tod_model.set_value('time', -0.02, maximum=-0.02) - - for k,v in model_parameters.items(): - tod_model.set_value(k, v) - - return tod_model - - - - -time_of_day_simulator_global = Dict() - - -def time_of_day_simulator_initialize(dh, cache=True): - global time_of_day_simulator_global - - log = get_worker_log( - os.path.join(dh.filenames.cache_dir, 'logs'), - level=10, - ) - - log.debug(f"time_of_day_simulator_initialize(cache={cache}") - n_zones = dh.n_internal_zones - choice_model_params = dh.choice_model_params - - if len(choice_model_params) == 0: - raise ValueError("no choice_model_params") - - pickle_name = dh.filenames.cache_dir / f"tod_models_{n_zones}.pkl" - tod_param_file = dh.filenames.tod_model_param_file - if tod_param_file and os.path.exists(tod_param_file): - with open(tod_param_file, 'r') as f: - tod_model_params = Dict(yaml.load(f, Loader=yaml.SafeLoader)) # TODO addicty - else: - tod_model_params = Dict() - - if len(time_of_day_simulator_global) == 0: - log.debug("time_of_day_simulator_initialize: preloaded tod_simulator not available") - if os.path.exists(pickle_name): - import cloudpickle - with open(pickle_name, 'rb') as pkl_f: - log.debug("time_of_day_simulator_initialize: loading pickled tod_simulator") - time_of_day_simulator_global = cloudpickle.load(pkl_f) - cache = False - else: - log.debug("time_of_day_simulator_initialize: pickled tod_simulator not available") - - if time_of_day_simulator_global: - log.info("time_of_day_simulator_initialize: using existing tod_simulator") - tod_simulator = time_of_day_simulator_global - else: - log.info("time_of_day_simulator_initialize: creating fresh tod_simulator") - tod_simulator = Dict() - for purpose in purposes5: - tod_simulator[purpose] = tod_model_builder( - purpose=purpose, - model_parameters=tod_model_params.get(purpose, {}), - ) - time_of_day_simulator_global = tod_simulator - - if cache and not os.path.exists(pickle_name): - import cloudpickle - with open(pickle_name, 'wb') as pkl_f: - log.debug("time_of_day_simulator_initialize: pickling tod_simulator for future reload") - cloudpickle.dump( - time_of_day_simulator_global, - pkl_f, - ) - - return tod_simulator diff --git a/src/Mode-Dest-TOD/cmap_modedest/timeperiods.py b/src/Mode-Dest-TOD/cmap_modedest/timeperiods.py deleted file mode 100644 index 3e18d1f..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/timeperiods.py +++ /dev/null @@ -1,51 +0,0 @@ - - -# 1. The ten hour late evening-early morning off-peak period (8:00 p.m. to 6:00 a.m.); -# 2. The shoulder hour preceding the AM peak hour (6:00 to 7:00 a.m.); -# 3. The AM peak two hours (7:00 to 9:00 a.m.); -# 4. The shoulder hour following the AM peak period (9:00 to 10:00 a.m); -# 5. A five hour midday period (10:00 a.m. to 2:00 p.m.); -# 6. The two hour shoulder period preceding the PM peak period (2:00 to 4:00 p.m.); -# 7. The PM peak two hours (4:00 to 6:00 p.m.), and; -# 8. The two hour shoulder period following the PM peak period (6:00 to 8:00 p.m.). - -timeperiod_names = [ - 'NIGHT', - 'AM_PRE', - 'AM_PEAK', - 'AM_POST', - 'MIDDAY', - 'PM_PRE', - 'PM_PEAK', - 'PM_POST', -] - -timeperiods = {i:name for i, name in enumerate(timeperiod_names)} - -hours_by_timeperiod = { - 0: 0, - 1: 0, - 2: 0, - 3: 0, - 4: 0, - 5: 0, - 6: 1, - 7: 2, - 8: 2, - 9: 3, - 10: 4, - 11: 4, - 12: 4, - 13: 4, - 14: 4, - 15: 5, - 16: 5, - 17: 6, - 18: 6, - 19: 7, - 20: 7, - 21: 0, - 22: 0, - 23: 0, -} - diff --git a/src/Mode-Dest-TOD/cmap_modedest/tnc_costs.py b/src/Mode-Dest-TOD/cmap_modedest/tnc_costs.py deleted file mode 100644 index 55a76db..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/tnc_costs.py +++ /dev/null @@ -1,124 +0,0 @@ -import numpy as np -import pandas as pd - -peak_tnc_pricing = { - 'OFFPEAK': 0, - 'PEAK': 1, -} - - -def taxi_cost(dh, auto_time, auto_dist, o_zone, d_zone): - """ - Compute taxi fare. - - A single set of rates (Chicago medallion rates for in-city trips) - is used; fares for taxi trips outside Chicago are close to this - rate and rare enough that more precision is unneeded. - - Parameters - ---------- - auto_time, auto_dist : array-like - - Returns - ------- - fare : array-like - """ - return ( - dh.cfg.taxi.cost.flag_pull - + auto_time * dh.cfg.taxi.cost.per_minute - + auto_dist * dh.cfg.taxi.cost.per_mile - ) - - -def tnc_solo_cost(dh, auto_time, auto_dist, o_zone, d_zone, peak): - """ - Compute the solo rider TNC cost. - - Parameters - ---------- - auto_time, auto_dist : array-like of float - The auto travel time and distance for a set of trips. - Shapes must match. - o_zone, d_zone : pd.Series of int - Zone numbers for origin and destination - Shapes must match `auto_time`. - peak : pd.Series of bool - Whether each trip is peak or offpeak. - Shapes must match `auto_time`. - - Returns - ------- - ndarray - Same shape as inputs - """ - - peak_fare = ( - dh.cfg.tnc.cost.peak.per_minute * auto_time - + dh.cfg.tnc.cost.peak.per_mile * auto_dist - + dh.cfg.tnc.cost.peak.base_fare - ) - peak_fare = np.fmax(peak_fare, dh.cfg.tnc.cost.peak.min_fare) + dh.cfg.tnc.cost.peak.booking_fee - - offpeak_fare = ( - dh.cfg.tnc.cost.offpeak.per_minute * auto_time - + dh.cfg.tnc.cost.offpeak.per_mile * auto_dist - + dh.cfg.tnc.cost.offpeak.base_fare - ) - offpeak_fare = np.fmax(offpeak_fare, dh.cfg.tnc.cost.offpeak.min_fare) + dh.cfg.tnc.cost.offpeak.booking_fee - - cost = peak_fare * peak + offpeak_fare * (1-peak) - for bucket_name, bucket_price in dh.cfg.tnc.surcharge_rates.items(): - if bucket_price: - bucket_applies = ( - np.isin(o_zone, dh.cfg.tnc.surcharge_zones[bucket_name]) - | np.isin(d_zone, dh.cfg.tnc.surcharge_zones[bucket_name]) - ).astype(float) - cost += bucket_applies * bucket_price - return cost - - -def tnc_pool_cost(dh, auto_time, auto_dist, o_zone, d_zone, peak): - """ - Compute the pooled rider TNC cost. - - Parameters - ---------- - auto_time, auto_dist : array-like of float - The auto travel time and distance for a set of trips/ - Shapes must match. - o_zone, d_zone : pd.Series of int - Zone numbers for origin and destination - Shapes must match `auto_time`. - peak : pd.Series of bool - Whether each trip is peak or offpeak. - Shapes must match `auto_time`. - - Returns - ------- - ndarray - Same shape as inputs - """ - - peak_fare = ( - dh.cfg.tnc_pooled.cost.peak.per_minute * auto_time - + dh.cfg.tnc_pooled.cost.peak.per_mile * auto_dist - + dh.cfg.tnc_pooled.cost.peak.base_fare - ) - peak_fare = np.fmax(peak_fare, dh.cfg.tnc_pooled.cost.peak.min_fare) + dh.cfg.tnc_pooled.cost.peak.booking_fee - - offpeak_fare = ( - dh.cfg.tnc_pooled.cost.offpeak.per_minute * auto_time - + dh.cfg.tnc_pooled.cost.offpeak.per_mile * auto_dist - + dh.cfg.tnc_pooled.cost.offpeak.base_fare - ) - offpeak_fare = np.fmax(offpeak_fare, dh.cfg.tnc_pooled.cost.offpeak.min_fare) + dh.cfg.tnc_pooled.cost.offpeak.booking_fee - - cost = peak_fare * peak + offpeak_fare * (1-peak) - for bucket_name, bucket_price in dh.cfg.tnc_pooled.surcharge_rates.items(): - if bucket_price: - bucket_applies = ( - np.isin(o_zone, dh.cfg.tnc_pooled.surcharge_zones[bucket_name]) - | np.isin(d_zone, dh.cfg.tnc_pooled.surcharge_zones[bucket_name]) - ).astype(float) - cost += bucket_applies * bucket_price - return cost diff --git a/src/Mode-Dest-TOD/cmap_modedest/transit_approach.py b/src/Mode-Dest-TOD/cmap_modedest/transit_approach.py deleted file mode 100644 index 349aaee..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/transit_approach.py +++ /dev/null @@ -1,731 +0,0 @@ -import numpy as np -import logging -from .addict import Dict -log = logging.getLogger('CMAP') - -from .ae_distance_sim import simulate_ae_dist -from .random_states import check_random_generator - -# trip types -HW = 'HW' # HOME PRODUCTIONS TO WORK ATTRACTIONS -HO = 'HO' # HOME PRODUCTIONS TO NON-WORK/NON-HOME ATTRACTIONS -NH = 'NH' # NON-HOME PRODUCTIONS TO NON-HOME ATTRACTIONS - -ITER = 50 # NUMBER OF TRIPS USED TO COMPUTE AVERAGE IMPEDANCES - -from .modecodes import ( - APPROACH_WALK, - APPROACH_BUS, - APPROACH_PARK_N_RIDE, - APPROACH_KISS_N_RIDE, - APPROACH_FEEDER_BUS, - N_APPROACH_MODES, - APPROACH_MODE_NAMES, - DIST_TO_BUS, - DIST_TO_CTA_RAIL, - DIST_TO_METRA, - DIST_TO_FEEDER_BUS, - DIST_TO_PARK_N_RIDE_STATION, - N_DIST_TO_TYPES, - TransitModeCode_CTA_RAIL, - TransitModeCode_METRA_RAIL, - TransitModeCode_CTA_EXPRESS_BUS, - TransitModeCode_CTA_REGULAR_BUS, - TransitModeCode_PACE_BUS, -) - - - -FRONT_END = 0 -BACK_END = 1 -N_TRIP_ENDS = 2 - -SPDWLK = 30 -# SPDWLK = SYSTEM-WIDE SPEED OF WALKING, -# DEFAULT IS 30 TENTHS OF A MILE PER HOUR - -SPEEDS = np.array([7, 15, 20, 30, 5, 10, 12, 17]) -# SPEEDS = SPEEDS OF APPROACH AUTO AND BUS BY ZONE AREA TYPE -# AUTO APPROACH SPEEDS: -# ZONE TYPE 1 (CHICAGO CBD) DEFAULT IS 7 MPH -# ZONE TYPE 2 (CHICAGO REMAINDER) DEFAULT IS 15 MPH -# ZONE TYPE 3 (DENSE SUBURB) DEFAULT IS 20 MPH -# ZONE TYPE 4 (SPARSE SUBURB) DEFAULT IS 30 MPH -# BUS APPROACH SPEEDS: -# ZONE TYPE 1 (CHICAGO CBD) DEFAULT IS 5 MPH -# ZONE TYPE 2 (CHICAGO REMAINDER) DEFAULT IS 10 MPH -# ZONE TYPE 3 (DENSE SUBURB) DEFAULT IS 12 MPH -# ZONE TYPE 4 (SPARSE SUBURB) DEFAULT IS 17 MPH - -DRVOT = 14 -# DRVOT = DRIVER'S VALUE OF TIME, DEFAULT IS 14 CENTS/MIN - -OVT_IVT_RATIO = 2.0 - - - -AFC1 = 35 # AUTO FIXED COSTS FOR AUTO DRIVER IN CENTS -AFC2 = 20 # AUTO FIXED COSTS FOR AUTO PASSENGER IN CENTS - -# W2PNR = WALK TIME TO STATION FROM PARK AND RIDE LOT, -# DEFAULT IS 2 MINUTES -W2PNR = 2 - - -def _simulate_approach_distances( - dh, - zone, - attached_mode, - trip_purpose, - trip_end, - out, - random_state=None, -): - """ - - Parameters - ---------- - dh : DataHandler - zone : int - Zone id (1-based) - attached_mode : int - Number for first or last mode (as matches this approach) - trip_purpose : {'HW','HO','NH'} - Trip purpose, used to select DISTR table and possibly filter - approach modes - trip_end : {0,1} - Zero if approach to first mode, one if approach from last mode - out : array-like - Output array must already exist, as a float dtype, - with shape [replications, N_APPROACH_MODES, ] - - """ - if not isinstance(zone, int): - return _simulate_approach_distances_arr( - dh, - zone, - attached_mode, - trip_purpose, - trip_end, - out, - random_state=random_state, - ) - random_state = check_random_generator(random_state) - replication = list(out.shape[:-1]) - distr = dh.distr - if replication[0] == 1: - replication = replication[1:] - for J in range(N_DIST_TO_TYPES): - # OBTAIN APPROACH DISTANCES TO FIVE MODES - if (J == DIST_TO_BUS): - distr_params = distr[trip_purpose].loc[(zone, 'bus')] - elif (J == DIST_TO_CTA_RAIL): - # DISTANCE OBTAINED ONLY IF FIRST/LAST MODE IS CTA RAIL - if attached_mode == TransitModeCode_CTA_RAIL: - distr_params = distr[trip_purpose].loc[(zone, 'ctarail')] - else: - distr_params = (999,999,999) - elif (J == DIST_TO_METRA): - # DISTANCE OBTAINED ONLY IF FIRST/LAST MODE IS METRA - if attached_mode == TransitModeCode_METRA_RAIL: - distr_params = distr[trip_purpose].loc[(zone, 'metra')] - else: - distr_params = (999, 999, 999) - elif (J == DIST_TO_FEEDER_BUS): - # DISTANCE OBTAINED ONLY IF FIRST/LAST MODE IS METRA - if attached_mode == TransitModeCode_METRA_RAIL: - distr_params = distr[trip_purpose].loc[(zone, 'feederbus')] - else: - distr_params = (999, 999, 999) - elif (J == DIST_TO_PARK_N_RIDE_STATION): - # PARK AND RIDE STATION DISTANCE OBTAINED WHEN TRIP END IS FRONT - if trip_end == FRONT_END: - distr_params = distr[trip_purpose].loc[(zone, 'pnr')] - else: - distr_params = (999, 999, 999) - else: - raise ValueError(J) - if distr_params[2] != 999: - out[...,J] = simulate_ae_dist(*distr_params, replication=replication, random_state=random_state) - else: - out[...,J] = 255.0 - - -def _simulate_approach_distances_arr( - dh, - zone, - attached_mode, - trip_purpose, - trip_end, - out, - random_state=None, -): - """ - - Parameters - ---------- - zone : array-like - Zone id (1-based) - attached_mode : int - Number for first or last mode (as matches this approach) - trip_purpose : {'HW','HO','NH'} - Trip purpose, used to select DISTR table and possibly filter - approach modes - trip_end : {0,1} - Zero if approach to first mode, one if approach from last mode - out : array-like - Output array must already exist, as a float dtype, - with shape [replications, N_APPROACH_MODES, ] - - """ - random_state = check_random_generator(random_state) - replication = list(out.shape[1:-1]) - distr_df = dh.distr[trip_purpose].unstack().loc[zone] - for J in range(N_DIST_TO_TYPES): - # OBTAIN APPROACH DISTANCES TO FIVE MODES - if (J == DIST_TO_BUS): - distr_params = distr_df.xs('bus', level='submode', axis=1).copy() - elif (J == DIST_TO_CTA_RAIL): - # DISTANCE OBTAINED ONLY IF FIRST/LAST MODE IS CTA RAIL - distr_params = distr_df.xs('ctarail', level='submode', axis=1).copy() - distr_params.loc[attached_mode != TransitModeCode_CTA_RAIL,:] = 999 - elif (J == DIST_TO_METRA): - # DISTANCE OBTAINED ONLY IF FIRST/LAST MODE IS METRA - distr_params = distr_df.xs('metra', level='submode', axis=1).copy() - distr_params.loc[attached_mode != TransitModeCode_METRA_RAIL,:] = 999 - elif (J == DIST_TO_FEEDER_BUS): - # DISTANCE OBTAINED ONLY IF FIRST/LAST MODE IS METRA - distr_params = distr_df.xs('feederbus', level='submode', axis=1).copy() - distr_params.loc[attached_mode != TransitModeCode_METRA_RAIL,:] = 999 - elif (J == DIST_TO_PARK_N_RIDE_STATION): - # PARK AND RIDE STATION DISTANCE OBTAINED WHEN TRIP END IS FRONT - if trip_end == FRONT_END: - distr_params = distr_df.xs('pnr', level='submode', axis=1).copy() - else: - distr_params.loc[:,:] = 999 - else: - raise ValueError(J) - _temp = simulate_ae_dist( - distr_params.p1, - distr_params.p2, - distr_params.p3, - replication=replication, - random_state=random_state, - ) - out[..., J] = _temp - - -# def simulate_approach_distances_222(ozone, dzone, firstmode, lastmode, trip_purpose): -# DOND = np.full([ITER, N_APPROACH_MODES, N_TRIP_ENDS], 255.) -# for I in range(N_TRIP_ENDS): -# -# # C I=1 OBTAIN DISTANCES FOR ORIGIN -# # C I=2 OBTAIN DISTANCES FOR DESTINATION -# if I == FRONT_END: -# Z=ozone -# M=firstmode -# else: -# Z=dzone -# M=lastmode -# -# -# for J in range(N_APPROACH_MODES): -# # C -# # C OBTAIN APPROACH DISTANCES TO FIVE MODES -# DOND[:,J,I]=255. -# -# if (J == APPROACH_WALK): -# distr_params = distr[trip_purpose].loc[(ozone, 3)] -# elif (J == APPROACH_BUS): -# distr_params = distr[trip_purpose].loc[(ozone, 2)] -# elif (J == APPROACH_PARK_N_RIDE): -# distr_params = distr[trip_purpose].loc[(ozone, 1)] -# elif (J == APPROACH_KISS_N_RIDE): -# distr_params = distr[trip_purpose].loc[(ozone, 4)] -# else: # (J == FEEDER_BUS): -# distr_params = distr[trip_purpose].loc[(ozone, 5)] -# -# DOND[:,J,I] = simulate_ae_dist(*distr_params, replication=ITER) -# -# return DOND - - -def _IS_CTA(m): - return ( - m == TransitModeCode_CTA_RAIL - or m == TransitModeCode_CTA_REGULAR_BUS - or m == TransitModeCode_CTA_EXPRESS_BUS - ) - - -from numba import jit, njit, prange - -def transit_approach( - dh, - ozone, - dzone, - TPTYPE, - replication=None, - approach_distances=None, - trace=False, - random_state=None, -): - """ - Replaces TRAPP fortran. - - Parameters - ---------- - dh : DataHandler - ozone, dzone : int or array-like - Zone ID numbers. If array-like, should be arrays of the same shape. - TPTYPE : {'HW', 'HO', 'NH'} - Trip type - replication : int - Number of simulation replications - - Returns - ------- - Dict - Containing: - - drivetime : array of int32, shape [replication] - simulated in vehicle (drive) approach times, in minutes - - walktime : array of int32, shape [replication] - simulated out of vehicle (walk) approach times, in minutes - - cost : array of int32, shape [replication] - simulated approach costs, in cents - - waittime : array of int32, shape [replication] - simulated approach waiting times - - approach_mode : array of int8, shape [replication, 2] - simulated best approach modes - = approach_distances : array of float32, shape [replication, N_DIST_TO_TYPES, N_TRIP_ENDS] - - Notes - ----- - When ozone, dzone are given as arrays, all returned arrays have one extra front - dimension matching these arrays. - - """ - random_state = check_random_generator(random_state or [ozone, dzone]) - - PACE_BUS_BOARDING_FARE = dh.m023.PACE_BUS_BOARDING_FARE - PACE_BUS_FIRST_XFER_FARE = dh.m023.PACE_BUS_FIRST_XFER_FARE - FEEDER_BUS_BOARDING_FARE = dh.m023.FEEDER_BUS_BOARDING_FARE - FEEDER_BUS_CBD_FARE = dh.m023.FEEDER_BUS_CBD_FARE - - CTA_FIRST_XFER_FARE = dh.m023.CTA_FIRST_XFER_FARE - CTA_CBD_LINK_UP_FARE = dh.m023.CTA_CBD_LINK_UP_FARE - - AUTO_OPERATING_COST_BY_ZONETYPE = dh.m023.AUTO_OPERATING_COST_BY_ZONETYPE # AVERAGE OPERATING COST PER MILE FOR AUTO, BY ZONE TYPE - - if replication is None: - replication = ITER - - if trace: - log.log(trace, f"transit_approach({ozone},{dzone},{TPTYPE},{replication})") - - # convert inputs to length-1 vectors if not already vectors - if isinstance(ozone, int): - ozone_ = ozone - ozone = np.array([ozone]) - else: - ozone_ = ozone = np.asanyarray(ozone) - if isinstance(dzone, int): - dzone_ = dzone - dzone = np.array([dzone]) - else: - dzone_ = dzone = np.asanyarray(dzone) - vector_len = ozone.shape[0] - assert vector_len == dzone.shape[0] - - ozone_idx = ozone-1 - dzone_idx = dzone-1 - - m01_df = dh.m01 - ZTYPE = m01_df['zone_type'] # integers 1-4 - if TPTYPE == HW: - fwbus = m01_df['first_wait_bus_peak'] # FIRST WAIT FOR BUS IN APPROACH SUBMODEL - fwfdr = m01_df['first_wait_feeder_peak'] # FIRST WAIT FOR FEEDER BUS IN APPROACH SUBMODEL - else: - fwbus = m01_df['first_wait_bus_offpeak'] # FIRST WAIT FOR BUS IN APPROACH SUBMODEL - fwfdr = m01_df['first_wait_feeder_offpeak'] # FIRST WAIT FOR FEEDER BUS IN APPROACH SUBMODEL - PNRAVL = m01_df['pnr_flag'].astype(bool) # park-n-ride available, by zone - PRCOST = m01_df['pnr_parking_cost'] # park-n-ride cost, by zone - - # -- INITIALIZE VALUES -- - approach_cost = np.zeros([vector_len, replication, N_APPROACH_MODES], dtype=np.float32) - approach_waittime = np.zeros([vector_len, replication, N_APPROACH_MODES], dtype=np.float32) - approach_drivetime = np.zeros([vector_len, replication, N_APPROACH_MODES], dtype=np.float32) - approach_walktime = np.zeros([vector_len, replication, N_APPROACH_MODES], dtype=np.float32) - TVAR4 = np.zeros([vector_len, replication, 5], dtype=np.float32) - - best_approach_mode = np.zeros([vector_len*replication, N_TRIP_ENDS], dtype=np.int8) - best_cost = np.zeros([vector_len*replication, N_TRIP_ENDS], dtype=np.int32) - best_waittime = np.zeros([vector_len*replication, N_TRIP_ENDS], dtype=np.int32) - best_walktime = np.zeros([vector_len* replication, N_TRIP_ENDS], dtype=np.int32) - best_drivetime = np.zeros([vector_len* replication, N_TRIP_ENDS], dtype=np.int32) - # - # GET ZONE TYPES - # - ozone_type = ZTYPE.iloc[ozone_idx] - dzone_type = ZTYPE.iloc[dzone_idx] - # - # GET INTERCHANGE ATTRIBUTES - # FM=FIRST MODE,LM=LAST MODE,PM=PRIORITY MODE - # - if TPTYPE == 'HW': - FM = dh.skims.first_mode_peak[ozone_idx, dzone_idx] - LM = dh.skims.last_mode_peak[ozone_idx, dzone_idx] - else: - FM = dh.skims.first_mode_offpeak[ozone_idx, dzone_idx] - LM = dh.skims.last_mode_offpeak[ozone_idx, dzone_idx] - # - # INET TRANSIT NETWORK STORES SOME SUBURBAN BUS LINES (MODE=6) - # AS MODE=5 DUE TO ARRAY SIZE LIMITS. IF MODE=5 AND - # ZONE TYPE NO. 1 IS OUTSIDE OF CHICAGO, THEN CHANGE MODE TO 6. - # - - FM[(FM == 5) & (ozone_type > 2)] = 6 - LM[(LM == 5) & (ozone_type > 2)] = 6 - - # - # GET APPROACH DISTANCES FOR FIRST AND LAST MODES - # - - #### CALL ADIST(ozone,dzone,FM,LM) - if approach_distances is not None: - if replication == 1 and len(approach_distances.shape) == 3: - approach_distances = np.expand_dims(approach_distances, axis=1) - assert approach_distances.shape == (vector_len, replication, N_DIST_TO_TYPES, N_TRIP_ENDS) - else: - approach_distances = np.empty([vector_len, replication, N_DIST_TO_TYPES, N_TRIP_ENDS]) - _simulate_approach_distances( - dh, - ozone_, - attached_mode=FM, - trip_purpose=TPTYPE, - trip_end=0, - out=approach_distances[:,:,:,0], - random_state=random_state, - ) - _simulate_approach_distances( - dh, - dzone_, - attached_mode=LM, - trip_purpose=TPTYPE, - trip_end=1, - out=approach_distances[:,:,:,1], - random_state=random_state, - ) - if trace: - log.log(trace, f" PRODUCTION APPROACH DISTANCES") - log.log(trace, f" to Bus {approach_distances[:5,:5,DIST_TO_BUS,0]}") - log.log(trace, f" to El {approach_distances[:5,:5,DIST_TO_CTA_RAIL,0]}") - log.log(trace, f" to Metra {approach_distances[:5,:5,DIST_TO_METRA,0]}") - log.log(trace, f" to feeder {approach_distances[:5,:5,DIST_TO_FEEDER_BUS,0]}") - log.log(trace, f" to PnR {approach_distances[:5,:5,DIST_TO_PARK_N_RIDE_STATION,0]}") - log.log(trace, f" ATTRACTION APPROACH DISTANCES") - log.log(trace, f" to Bus {approach_distances[:5,:5,DIST_TO_BUS,1]}") - log.log(trace, f" to El {approach_distances[:5,:5,DIST_TO_CTA_RAIL,1]}") - log.log(trace, f" to Metra {approach_distances[:5,:5,DIST_TO_METRA,1]}") - log.log(trace, f" to feeder {approach_distances[:5,:5,DIST_TO_FEEDER_BUS,1]}") - log.log(trace, f" to PnR {approach_distances[:5,:5,DIST_TO_PARK_N_RIDE_STATION,1]}") - - - # CHECK FIRST/LAST MODES AND COMPUTE APPROACH TIME AND COST - # - # ARRAYS approach_walktime,APCOST,approach_drivetime CONTAIN TIME TO WALK,APPROACH COST, - # AND IN-VEHICLE APPROACH TIME RESPECTIVELY. THESE ARRAYS HAVE FIVE - # ELEMENTS FOR FIVE POSSIBLE APPROACH MODES.( 1-WALK,2-BUS, - # 3-PARK & RIDE,4-KISS & RIDE,AND 5-FEEDER BUS) - # - - for I in range(N_TRIP_ENDS): - # I=1 GET VALUES FOR ORIGIN - # I=2 GET VALUES FOR DESTINATION - if (I == FRONT_END): - Z = ozone - M = FM - else: # I == BACK_END - Z = dzone - M = LM - - ZTYPE_Z = ZTYPE[Z].values - - # - # IN THIS CASE WE ARE MAKING THE STATION PARKING COST FOR HOME BASED OTHER AND - # NON-HOME BASED TRIPS EQUAL TO 60 PERCENT OF HOME BASED WORK - # CHANGE MADE 12/8/93 BY GWS NEXT LINE - # IF(TPTYPE.NE.1) PRCOST(Z) = PRCOST(Z) * 0.6 - # ******************* RWE CHANGE FOR I290 AUGUST-SEPT 2009 ************ - # NONWORK PARK AND RIDE PARKING COST IS NOW READ FROM M01. IN MANY - # CASES THE NONWORK PNR COSTS ARE HIGHER THAN WORK DUE TO - # DISCOUNTING OF MONTHLY PARKING FEES. - # - # ******************* RWE CHANGE FOR I290 AUGUST-SEPT 2009 ************ - # SET HIGH STARTING VALUE OF TVAR5 - TVAR5 = np.full([vector_len*replication], 1.E10) - # ******************* RWE CHANGE FOR I290 AUGUST-SEPT 2009 ************ - # IN CALCULATING TVAR4 AND TVAR5 - # IN-VEHICLE TIME = DRVOT = 20 CENTS/MIN - # OUT-OF-VEHICLE TIME = 40 CENTS/MIN - # PASSENGER TIME = 0.5 DRIVER TIME - # ******************* RWE CHANGE FOR I290 AUGUST-SEPT 2009 ************ - # - # FOLLOWING SECTION ADDED BY EASH TO SIMPLIFY LOGIC - # IF M IS BUS (MODE<7) THEN ONLY POSSIBLE APPROACH COST IS TIME TO - # WALK TO BUS. OTHER APPROACH COSTS AND TIMES ARE LINE=HAUL. - t = (M < TransitModeCode_CTA_RAIL) - if np.any(t): - J = APPROACH_WALK - approach_walktime[t,:,J] = approach_distances[t,:, DIST_TO_BUS, I] / SPDWLK * 600. - # INCREASE WALK TIME IN CHICAGO CBD FOR WORK TRIPS - cbd_work = t & (ZTYPE_Z == 1) & (TPTYPE == HW) - approach_walktime[cbd_work,:,J] *= 1.20 - - # if (ZTYPE_Z == 1 and TPTYPE == HW): - # approach_walktime[:, 0] = approach_walktime[:, 0] * 1.20 - TVAR4[t,:, J] = approach_walktime[t,:, 0] * DRVOT * 2.0 - TVAR5.reshape([vector_len,replication])[t,:] = TVAR4[t,:, J] - best_approach_mode.reshape([vector_len,replication,N_TRIP_ENDS])[t,:, I] = 0 - best_drivetime.reshape([vector_len,replication,N_TRIP_ENDS])[t,:, I] = 0 - best_walktime.reshape([vector_len,replication,N_TRIP_ENDS])[t,:, I] = approach_walktime[t,:, 0] + .5 - best_cost.reshape([vector_len,replication,N_TRIP_ENDS])[t,:, I] = 0 - best_waittime.reshape([vector_len,replication,N_TRIP_ENDS])[t,:, I] = 0 - for J in [APPROACH_BUS, APPROACH_PARK_N_RIDE, APPROACH_KISS_N_RIDE, APPROACH_FEEDER_BUS]: - TVAR4[t,:, J] = 0. - approach_cost[t, :, J] = 0. - approach_waittime[t, :, J] = 0. - approach_drivetime[t,:, J] = 0. - approach_walktime[t,:, J] = 0. - - t = (M >= TransitModeCode_CTA_RAIL) - if np.any(t): - # REMAINDER OF SUBROUTINE FOR RAIL TRANSIT/COMMUTER RAIL ONLY - # GET VALUES FOR FIVE ALTERNATIVES - for J in range(5): - TVAR4[t,:, J] = 0. - approach_cost[t, :, J] = 0. - approach_waittime[t,:,J] = 0. - approach_drivetime[t,:, J] = 0. - approach_walktime[t,:, J] = 0. - - K = np.fmax(0, M - 6).astype(int) # 0 for BUS, 1 for CTA RAIL(7-1), 2 for METRA(8-1) - - # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = - # J=0(WALK).COMPUTE WALKING TIME TO FIRST MODE.NO COST OR IN-VEHICLE TIME - # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = - if J == APPROACH_WALK: - approach_walktime[t,:, J] = approach_distances[t,:, K[t], I] / SPDWLK * 600. - # INCREASE WALK TIME IN CHICAGO CBD FOR WORK TRIPS - cbd_work = t & (ZTYPE_Z == 1) & (TPTYPE == HW) - approach_walktime[cbd_work,:, J] *= 1.20 - # if (ZTYPE_Z == 1 and TPTYPE == HW): - # approach_walktime[:, J] = approach_walktime[:, J] * 1.20 - TVAR4[t,:, J] = approach_walktime[t,:, J] * DRVOT * 2.0 - # ADD APPROACH TIMES AND COSTS - EVERYTHING SHOULD NOW BE IN CENTS - TVAR4[t,:, J] += approach_cost[t, :, J] - - # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = - # J=1(BUS) FIRST MODE. COMPUTE WALKING TIME, COST, AND IN-VEHICLE TIME - # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = - elif J == APPROACH_BUS or (J == APPROACH_FEEDER_BUS and I == FRONT_END): - - if J == APPROACH_FEEDER_BUS: - approach_walktime[t,:, J] = approach_distances[t,:, DIST_TO_FEEDER_BUS, I] / SPDWLK * 600. - approach_waittime[t,:,J] = fwfdr[Z][t].values[:,np.newaxis] - else: - approach_walktime[t,:, J] = approach_distances[t,:, DIST_TO_BUS, I] / SPDWLK * 600. - # INCREASE WALK TIME IN CHICAGO CBD - approach_walktime[t & (ZTYPE_Z == 1), :, J] *= 1.20 - approach_waittime[t,:,J] = fwbus[Z][t].values[:,np.newaxis] - approach_drivetime[t,:, J] = approach_distances[t,:, K[t], I] / SPEEDS[ZTYPE_Z[t]-1 + 4, np.newaxis] * 60. - TVAR4[t,:, J] = ( - approach_walktime[t,:, J] * OVT_IVT_RATIO - + approach_drivetime[t,:, J] - + approach_waittime[t,:,J] * OVT_IVT_RATIO - ) * DRVOT - - # ******************* RWE CHANGE FOR I290 AUGUST-SEPT 2009 ************ - # - # COST COMPUTATIONS FOR APPROACH BUS - # REVISED BY EASH 12/4/93 TO REFLECT CURRENT FARES - # ==== ORIGIN ==== - if (I == FRONT_END): - # FIRST MODE SUBURBAN RAIL - CHECK ZONE TYPE AT ORIGIN - # --- SUBURBAN ORIGIN, PACE BUS --- - s = t & (FM == TransitModeCode_METRA_RAIL) & (ozone_type > 2) - if np.any(s): - # PACE BUS - METRA RAIL, ADDED FARE IS PACE FEEDER BUS FARE - approach_cost[s & (LM == TransitModeCode_METRA_RAIL), :, J] = FEEDER_BUS_BOARDING_FARE - # PACE BUS - METRA RAIL - CTA, NO ADDED FARE, LINKUP > FEEDER BUS - # already zero # approach_cost[s & (LM == TransitModeCode_CTA_RAIL), :, J] = 0 - # PACE BUS - METRA RAIL - PACE, ADDED FARE IS LINKUP LESS FEEDER BUS - approach_cost[s & (LM == TransitModeCode_PACE_BUS), :, J] = FEEDER_BUS_CBD_FARE - - # --- CHICAGO ORIGIN, CTA BUS --- - s = t & (FM == TransitModeCode_METRA_RAIL) & (ozone_type <= 2) - if np.any(s): - # CTA BUS - METRA RAIL, ADDED FARE IS LINKUP FARE (SINGLE RIDE) - approach_cost[s & (LM == TransitModeCode_METRA_RAIL), :, J] = CTA_CBD_LINK_UP_FARE - # CTA BUS - METRA RAIL - CTA, ADDED FARE IS CTA TRANSFER - approach_cost[s & (LM == TransitModeCode_CTA_RAIL), :, J] = CTA_FIRST_XFER_FARE - # CTA BUS - METRA RAIL - PACE, ADDED FARE IS LINKUP LESS FEEDER BUS - approach_cost[s & (LM == TransitModeCode_PACE_BUS), :, J] = FEEDER_BUS_CBD_FARE - - # FIRST MODE CTA RAIL - # WHEN THIS IS TRUE A FULL FARE AND TRANSFER HAVE - # BEEN PAID, SO NO ADDED FARE IS NEEDED FOR BUS - - - # ORIGIN OTHER THAN CHICAGO, ADDED FARE IS NOW AN RTA TRANSFER - s = t & (FM < TransitModeCode_CTA_RAIL) & (ozone_type > 2) - if np.any(s): - approach_cost[s, :, J] = PACE_BUS_FIRST_XFER_FARE - - # CHICAGO ORIGIN, ADDED FARE IS CTA TRANSFER - s = t & (FM < TransitModeCode_CTA_RAIL) & (ozone_type <= 2) - if np.any(s): - approach_cost[s, :, J] = CTA_FIRST_XFER_FARE - - TVAR4[t, :, J] += approach_cost[t, :, J] - - - # ==== DESTINATION ==== - else: - # LAST MODE SUBURBAN RAIL - s = t & (LM == TransitModeCode_METRA_RAIL) & (dzone_type > 2) - if np.any(s): - # SUBURBAN DESTINATION, PACE BUS - # METRA RAIL - PACE BUS, ADDED FARE IS PACE FEEDER BUS FARE - approach_cost[s & (FM == TransitModeCode_METRA_RAIL), :, J] = FEEDER_BUS_BOARDING_FARE - # CTA - METRA RAIL - PACE BUS, NO ADDED FARE, LINKUP > FEEDER BUS - # PACE - METRA RAIL - PACE BUS, ADDED FARE IS LINKUP LESS FEEDER BUS - approach_cost[s & (FM == TransitModeCode_PACE_BUS), :, J] = FEEDER_BUS_CBD_FARE - s = t & (LM == TransitModeCode_METRA_RAIL) & (dzone_type <= 2) - if np.any(s): - # CHICAGO DESTINATION, CTA BUS - # METRA - CTA BUS, ADDED COST IS LINKUP FARE (SINGLE RIDE) - approach_cost[s & (FM == TransitModeCode_METRA_RAIL), :, J] = CTA_CBD_LINK_UP_FARE - # CTA - METRA - CTA BUS, ADDED COST IS CTA TRANSFER - approach_cost[s & (FM == TransitModeCode_CTA_RAIL), :, J] = CTA_FIRST_XFER_FARE - # PACE - METRA - CTA BUS, ADDED COST IS LINKUP MINUS FEEDER BUS - approach_cost[s & (FM == TransitModeCode_PACE_BUS), :, J] = FEEDER_BUS_CBD_FARE - # ADD CTA TRANSFER IF NOT ALREADY PAID BUT IT WAS USED - s = t & (LM < TransitModeCode_CTA_RAIL) & (dzone_type > 2) - if np.any(s): - approach_cost[s, J] = CTA_FIRST_XFER_FARE * ( - (best_approach_mode[:, FRONT_END]==APPROACH_BUS) - |(best_approach_mode[:, FRONT_END]==APPROACH_FEEDER_BUS) - ) - - TVAR4[t, :, J] += approach_cost[t, :, J] - - - # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = - # J=2(PARK & RIDE) FIRST MODE. PARK & RIDE FOR APPROACH TO RAPID TRANSIT AND SUBURBAN RAIL ROAD - # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = - elif (J == APPROACH_PARK_N_RIDE and I == FRONT_END): - approach_drivetime[t,:, J] = approach_distances[t,:, DIST_TO_PARK_N_RIDE_STATION, I] / SPEEDS[ZTYPE_Z[t] - 1, np.newaxis] * 60. - approach_walktime[t,:, J] = W2PNR - # APPROACH COST=PER MILE COST + FIXED COST - approach_cost[t,:, J] = approach_distances[t,:, DIST_TO_PARK_N_RIDE_STATION, I] * AUTO_OPERATING_COST_BY_ZONETYPE[ZTYPE_Z[t] - 1,np.newaxis] - # OPERATING COST MAY NOT BE LESS THAN 5 CENTS - approach_cost[t,:, J] = np.fmax(approach_cost[t,:, J], 5.0) - - approach_cost[t,:, J] = approach_cost[t,:, J] + AFC1 - # ADD HALF OF THE PARKING COST IF PARK-&-RIDE AVAILABLE - _tz = t&PNRAVL[Z] - approach_cost[_tz,:, J] += PRCOST[Z].values[_tz,np.newaxis] / 2 - # IF NO PARK-&-RIDE FACILITY AVAILABLE INCREASE WALK TIME - approach_walktime[~_tz,:, J] = 3 * W2PNR - - TVAR4[t,:, J] = ( - approach_walktime[t,:, J] * DRVOT * 2.0 - + approach_drivetime[t,:, J] * DRVOT - + approach_cost[t,:, J] - ) - - # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = - # J=3(KISS & RIDE) FIRST MODE. KISS & RIDE FOR APPROACH TO RAPID TRANSIT AND SUBURBAN RAIL ROAD - # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = - elif (J == APPROACH_KISS_N_RIDE and I == FRONT_END): - approach_drivetime[t,:, J] = approach_distances[t,:, DIST_TO_PARK_N_RIDE_STATION, I] / SPEEDS[ZTYPE_Z[t] - 1, np.newaxis] * 60. - approach_walktime[t,:, J] = W2PNR - approach_cost[t,:, J] = approach_distances[t,:, DIST_TO_PARK_N_RIDE_STATION, I] * AUTO_OPERATING_COST_BY_ZONETYPE[ZTYPE_Z[t] - 1, np.newaxis] - approach_cost[t,:, J] = np.fmin(approach_cost[t,:, J], 5.0) - # ******************* RWE CHANGE FOR I290 AUGUST-SEPT 2009 ************ - # ASSUMPTION IS THAT KISS AND RIDE REQUIRES A SPECIAL - # TRIP FROM HOME. DRIVER AND PASSENGER TIME VALUES NOW EQUAL. - # APCOST[J]=APCOST[J]*2.+AFC2+(DRVOT*approach_drivetime[J]*2.)/10 - approach_cost[t,:, J] = approach_cost[t,:, J] * 2. + AFC2 - TVAR4[t,:, J] = ( - approach_walktime[t,:, J] * OVT_IVT_RATIO - + approach_drivetime[t,:, J] * 2 # KISSING DRIVER - + approach_drivetime[t,:, J] - ) * DRVOT - # ******************* RWE CHANGE FOR I290 AUGUST-SEPT 2009 ************ - TVAR4[t,:, J] += approach_cost[t,:, J] - - # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = - # EVALUATE APPROACH MODES AND SELECT THE BEST - # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = - # FOLLOWING CODE CHANGED BY EASH 12/6/93 TO REFLECT - # NEW TRIP TYPES - # TPTYPE = 1 HOME PRODUCTIONS TO WORK ATTRACTIONS - # TPTYPE = 2 HOME PRODUCTIONS TO NON-WORK/NON-HOME ATTRACTIONS - # TPTYPE = 3 NON-HOME PRODUCTIONS TO NON-HOME ATTRACTIONS - for J in range(N_APPROACH_MODES): - # NO KISS-&-RIDE FOR NON-WORK TRIPS - if (TPTYPE != HW and J == APPROACH_KISS_N_RIDE): - continue - # NO PARK-AND RIDE OR KISS-&-RIDE AT THE WORK/OTHER - # ATTRACTION END FOR HOME BASED TRIPS - if (TPTYPE != NH and I == BACK_END and (J == APPROACH_PARK_N_RIDE or J == APPROACH_KISS_N_RIDE)): - continue - # NO PARK-&-RIDE OR KISS AND RIDE FOR NON-HOME TO NON-HOME TRIPS - if (TPTYPE == NH and (J == APPROACH_PARK_N_RIDE or J == APPROACH_KISS_N_RIDE)): - continue - # -- FIND LOWEST COST APPROACH - TVAR4_J = TVAR4[:,:, J].reshape(-1) - low_cost = (TVAR4_J < TVAR5) & (TVAR4_J > 0) - TVAR5[low_cost] = TVAR4_J[low_cost] - best_approach_mode[low_cost, I] = J - best_drivetime[low_cost, I] = approach_drivetime.reshape([-1,N_APPROACH_MODES])[low_cost, J] + .5 - best_walktime[low_cost, I] = approach_walktime.reshape([-1,N_APPROACH_MODES])[low_cost, J] + .5 - best_cost[low_cost, I] = approach_cost.reshape([-1,N_APPROACH_MODES])[low_cost, J] + .5 - best_waittime[low_cost, I] = approach_waittime.reshape([-1,N_APPROACH_MODES])[low_cost,J] + .5 - if trace: - log.log(trace, f" DIRECTION {I} APPROACH TYPE {J} {APPROACH_MODE_NAMES.get(J)}") - log.log(trace, f" drivetime {approach_drivetime[:5,:5, J]}") - log.log(trace, f" walktime {approach_walktime[:5,:5, J]}") - log.log(trace, f" cost {approach_cost[:5,:5, J]}") - log.log(trace, f" waittime {approach_waittime[:5,:5,J]}") - log.log(trace, f" gen cost {TVAR4[:5,:5, J]}") - if trace: - log.log(trace, f" DIRECTION {I} BEST APPROACH TYPE {best_approach_mode[:5,I]}") - - - # ADD ORIGIN AND DESTINATION QUANTITIES AND PASS BACK TO TRIPS - - ae_drivetime = best_drivetime[:, 0] + best_drivetime[:, 1] - ae_walktime = best_walktime[:, 0] + best_walktime[:, 1] - ae_cost = best_cost[:, 0] + best_cost[:, 1] - ae_waittime = best_waittime[:, 0] + best_waittime[:, 1] - - if not isinstance(ozone_, int): - ae_drivetime = ae_drivetime.reshape([vector_len,replication]) - ae_walktime = ae_walktime.reshape([vector_len,replication]) - ae_cost = ae_cost.reshape([vector_len,replication]) - ae_waittime = ae_waittime.reshape([vector_len,replication]) - best_approach_mode = best_approach_mode.reshape([vector_len,replication,N_TRIP_ENDS]) - approach_distances = approach_distances.reshape([vector_len, replication, N_DIST_TO_TYPES, N_TRIP_ENDS]) - - out = Dict() - out.drivetime = ae_drivetime - out.walktime = ae_walktime - out.cost = ae_cost - out.waittime = ae_waittime - out.approach_mode = best_approach_mode - out.approach_distances = approach_distances - return out - diff --git a/src/Mode-Dest-TOD/cmap_modedest/transit_skim_convolution.py b/src/Mode-Dest-TOD/cmap_modedest/transit_skim_convolution.py deleted file mode 100644 index 1ce0d25..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/transit_skim_convolution.py +++ /dev/null @@ -1,265 +0,0 @@ -import os -import numpy as np -import xarray as xr -# from array import * -from .addict import Dict - -import logging -log = logging.getLogger("CMAP") - -def skim_convol( - dh, - peak=True, - cutoff=0.4, - zone_types=None, -): - """ - Perform matrix convolution of transit skims. - - This function is based on the original TRANSIT_SKIM_FINAL_MATRICES1.PY - - Parameters - ---------- - dh : DataHandler - peak : bool, default True - Whether to process the peak or offpeak skims. - cutoff : float, default 0.4 - Park-and-ride skim routing is ignored if the transit generalized - cost exceeds this fraction of the congested drive-to-destination - cost. This prevents, for example, transit paths where the traveler - drives a long distance to a park-and-ride lot, then boards transit - for a short hop to the final destination. - New for the 2020 model update: When the final destination is in the - Chicago CBD, this cutoff is ignored when there is no valid non-PnR - path, so the traveler is permitted to drive unlimited distances to - access outlying transit (generally outlying Metra stations). - zone_types : array-like, optional - The zone type codes for zones in the model, used to filter for - Chicago CBD zones to apply the new cutoff rules. If not given, the - zone types are loaded from the package-default M01 HW file (see - m01_handler for details). - - """ - report_dir = dh.filenames.emme_database_dir / "report" - os.makedirs(report_dir, exist_ok=True) - - if peak: - # -- Input Matrix Numbers -- - inputmtx = Dict( - auto =44, ##0 AM peak hwy time matrix (mf44) - fmode=803, ##1 skimmed first mode (mf803) - pmode=804, ##2 skimmed priority mode (mf804) - lmode=805, ##3 skimmed last mode (mf805) - inveh=808, ##4 skimmed in-vehicle minutes (mf808) - trnfr=809, ##5 skimmed transfer link minutes (mf809) - twait=810, ##6 skimmed total wait minutes (mf810) - fwait=811, ##7 skimmed first wait minutes (mf811) - afare=818, ##8 skimmed final average fare (mf818) - cghwy=819, ##9 congested hwy generalized cost matrix (mf819) - tcost=820, #10 indexed transit generalized cost (mf820) - kzone=821, #11 intermediate zone matrix (mf821) - ) - # -- Output Matrix Numbers -- - outputmtx = Dict( - mfinvehi=822, ###0 indexed in-vehicle minutes (mf822) - mftrnfri=823, ###1 indexed walk transfer minutes (mf823) - mftwaiti=824, ###2 indexed total wait minutes (mf824) - mffwaiti=825, ###3 indexed first wait minutes (mf825) - mfafarei=828, ###4 indexed final average fare (mf828) - mffmodei=829, ###5 indexed first mode (mf829) - mfpmodei=830, ###6 indexed priority mode (mf830) - mflmodei=831, ###7 indexed last mode (mf831) - mfacosti=832, ###8 indexed auto generalized cost (mf832) - mfautrni=833, ###9 indexed auto min. to transit (mf833) - mfratioi=834, ##10 indexed transit/auto only (mf834) - ) - else: - # -- Input Matrix Numbers -- - inputmtx = Dict( - auto =46, ### midday hwy time matrix (mf46) - fmode=903, ### skimmed first mode (mf903) - pmode=904, ### skimmed priority mode (mf904) - lmode=905, ### skimmed last mode (mf905) - inveh=908, ### skimmed in-vehicle minutes (mf908) - trnfr=909, ### skimmed transfer link minutes (mf909) - twait=910, ### skimmed total wait minutes (mf910) - fwait=911, ### skimmed first wait minutes (mf911) - afare=918, ### skimmed final average fare (mf918) - cghwy=919, ### congested hwy generalized cost matrix (mf919) - tcost=920, ### indexed transit generalized cost (mf920) - kzone=921, ### intermediate zone matrix (mf921) - ) - # -- Output Matrix Numbers -- - outputmtx = Dict( - mfinvehi=922, ### indexed in-vehicle minutes (mf922) - mftrnfri=923, ### indexed walk transfer minutes (mf923) - mftwaiti=924, ### indexed total wait minutes (mf924) - mffwaiti=925, ### indexed first wait minutes (mf925) - mfafarei=928, ### indexed final average fare (mf928) - mffmodei=929, ### indexed first mode (mf929) - mfpmodei=930, ### indexed priority mode (mf930) - mflmodei=931, ### indexed last mode (mf931) - mfacosti=932, ### indexed auto generalized cost (mf932) - mfautrni=933, ### indexed auto min. to transit (mf933) - mfratioi=934, ### indexed transit/auto only (mf934) - ) - - # -- Input Matrices -- - # mfauto = os.path.join(emmemat_in_dir, "mf" + str(inputmtx[0]) + ".emx" ) - # mffmode = os.path.join(emmemat_in_dir, "mf" + str(inputmtx[1]) + ".emx" ) - # mfpmode = os.path.join(emmemat_in_dir, "mf" + str(inputmtx[2]) + ".emx" ) - # mflmode = os.path.join(emmemat_in_dir, "mf" + str(inputmtx[3]) + ".emx" ) - # mfinveh = os.path.join(emmemat_in_dir, "mf" + str(inputmtx[4]) + ".emx" ) - # mftrnfr = os.path.join(emmemat_in_dir, "mf" + str(inputmtx[5]) + ".emx" ) - # mftwait = os.path.join(emmemat_in_dir, "mf" + str(inputmtx[6]) + ".emx" ) - # mffwait = os.path.join(emmemat_in_dir, "mf" + str(inputmtx[7]) + ".emx" ) - # mfafare = os.path.join(emmemat_in_dir, "mf" + str(inputmtx[8]) + ".emx" ) - # mfcghwy = os.path.join(emmemat_in_dir, "mf" + str(inputmtx[9]) + ".emx" ) - # mftcost = os.path.join(emmemat_in_dir, "mf" + str(inputmtx[10]) + ".emx" ) - # mfkzone = os.path.join(emmemat_in_dir, "mf" + str(inputmtx[11]) + ".emx" ) - # # -- Output Matrices -- - # if emmemat_out_dir: - # mfinvehi = os.path.join(emmemat_out_dir, "mf" + str(outputmtx[0]) + ".emx" ) - # mftrnfri = os.path.join(emmemat_out_dir, "mf" + str(outputmtx[1]) + ".emx" ) - # mftwaiti = os.path.join(emmemat_out_dir, "mf" + str(outputmtx[2]) + ".emx" ) - # mffwaiti = os.path.join(emmemat_out_dir, "mf" + str(outputmtx[3]) + ".emx" ) - # mfafarei = os.path.join(emmemat_out_dir, "mf" + str(outputmtx[4]) + ".emx" ) - # mffmodei = os.path.join(emmemat_out_dir, "mf" + str(outputmtx[5]) + ".emx" ) - # mfpmodei = os.path.join(emmemat_out_dir, "mf" + str(outputmtx[6]) + ".emx" ) - # mflmodei = os.path.join(emmemat_out_dir, "mf" + str(outputmtx[7]) + ".emx" ) - # mfacosti = os.path.join(emmemat_out_dir, "mf" + str(outputmtx[8]) + ".emx" ) - # mfautrni = os.path.join(emmemat_out_dir, "mf" + str(outputmtx[9]) + ".emx" ) - # mfratioi = os.path.join(emmemat_out_dir, "mf" + str(outputmtx[10]) + ".emx" ) - - # -- Others -- - stats = os.path.join(report_dir, f"transit_skim_stats{8 if peak else 9}.txt") - - if os.path.exists(stats): - os.remove(stats) - - # --------------------------------------------------------------- - # Store matrix values in arrays. - # --------------------------------------------------------------- - # -- Input Matrices -- - auto = dh.skims.raw[f"mf{inputmtx.auto }"].values.astype(np.float32).reshape(-1) # np.fromfile(mfauto, dtype='f4') ## -- float, 4 bytes - kzone = dh.skims.raw[f"mf{inputmtx.kzone}"].values.astype(np.float32).reshape(-1) - tcost = dh.skims.raw[f"mf{inputmtx.tcost}"].values.astype(np.float32).reshape(-1) - inveh = dh.skims.raw[f"mf{inputmtx.inveh}"].values.astype(np.float32).reshape(-1) - trnfr = dh.skims.raw[f"mf{inputmtx.trnfr}"].values.astype(np.float32).reshape(-1) - twait = dh.skims.raw[f"mf{inputmtx.twait}"].values.astype(np.float32).reshape(-1) - fwait = dh.skims.raw[f"mf{inputmtx.fwait}"].values.astype(np.float32).reshape(-1) - afare = dh.skims.raw[f"mf{inputmtx.afare}"].values.astype(np.float32).reshape(-1) - fmode = dh.skims.raw[f"mf{inputmtx.fmode}"].values.astype(np.float32).reshape(-1) - pmode = dh.skims.raw[f"mf{inputmtx.pmode}"].values.astype(np.float32).reshape(-1) - lmode = dh.skims.raw[f"mf{inputmtx.lmode}"].values.astype(np.float32).reshape(-1) - cghwy = dh.skims.raw[f"mf{inputmtx.cghwy}"].values.astype(np.float32).reshape(-1) - - mcent = int(np.sqrt(auto.shape[0])) - - if zone_types is None: - zone_types = dh.m01.zone_type.values - assert zone_types.size <= mcent - cbd_zone_indexes = np.where(zone_types == 1)[0] - dzone_inside_cbd = np.zeros([mcent,mcent], dtype=bool) - dzone_inside_cbd[:,cbd_zone_indexes] = True - dzone_inside_cbd = dzone_inside_cbd.reshape(-1) - - ## -- create leg1 (p-k) indices - indxloc = np.arange(mcent*mcent) ## -- array of consecutive numbers representing element index values - leg1pt1 = np.floor_divide(indxloc,mcent) * mcent ## -- portion of element index defining origin zone (division results in integer value) - leg1indx = np.add(leg1pt1,kzone.astype('i4')-1,dtype='i4') ## -- add portion of element index defining destination zone - log.info( - f"Kzone 1-1: {kzone[0]}, Index 1-1: {leg1indx[0]}, " - f"Kzone 121-2: {kzone[437882]}, Index 121-2: {leg1indx[437882]} \n" - ) - - ## -- create leg2 (k-q) indices - leg2pt1 = np.multiply(kzone.astype('i4')-1,mcent) - leg2pt2 = np.mod(indxloc,mcent) - leg2indx = np.add(leg2pt1,leg2pt2,dtype='i4') - log.info( - f"Kzone 1-1: {kzone[0]}, Index 1-1: {leg2indx[0]}, " - f"Kzone 121-2: {kzone[437882]}, Index 121-2: {leg2indx[437882]} \n" - ) - - # --------------------------------------------------------------- - # Create indexed matrices. - # --------------------------------------------------------------- - log.debug(f"Create indexed matrices") - autoval = np.where(kzone>0, auto [leg1indx], kzone) ## -- hwy time matrix - tcostval = np.where(kzone>0, tcost[leg1indx], kzone) ## -- indexed transit generalized cost - invehval = np.where(kzone>0, inveh[leg2indx], kzone) ## -- skimmed in-vehicle minutes - trnfrval = np.where(kzone>0, trnfr[leg2indx], kzone) ## -- skimmed transfer link minutes - twaitval = np.where(kzone>0, twait[leg2indx], kzone) ## -- skimmed total wait minutes - fwaitval = np.where(kzone>0, fwait[leg2indx], kzone) ## -- skimmed first wait minutes - afareval = np.where(kzone>0, afare[leg2indx], kzone) ## -- skimmed final average fare - fmodeval = np.where(kzone>0, fmode[leg2indx], kzone) ## -- skimmed first mode - pmodeval = np.where(kzone>0, pmode[leg2indx], kzone) ## -- skimmed priority mode - lmodeval = np.where(kzone>0, lmode[leg2indx], kzone) ## -- skimmed last mode - threshold= np.where(cghwy>0, np.divide(tcostval,cghwy), cghwy) ## -- ratio of indexed transit cost to auto only cost - - log.debug(f"Swap original matrix value back in if the threshold exceeds the cutoff value") - # -- Swap original matrix value back in if the threshold exceeds the cutoff value - swap = (threshold>cutoff) - # -- NEW 12/2020: but keep the park-and-ride indexed values if the destination zone - # is inside the CBD and the original values are invalid - prevent_swap = (dzone_inside_cbd) & (inveh > 999) - swap &= ~prevent_swap - autoval = np.where(swap, 0, autoval) - tcostval = np.where(swap, 0, tcostval) - invehval = np.where(swap, inveh, invehval) - trnfrval = np.where(swap, trnfr, trnfrval) - twaitval = np.where(swap, twait, twaitval) - fwaitval = np.where(swap, fwait, fwaitval) - afareval = np.where(swap, afare, afareval) - fmodeval = np.where(swap, fmode, fmodeval) - pmodeval = np.where(swap, pmode, pmodeval) - lmodeval = np.where(swap, lmode, lmodeval) - - - # --------------------------------------------------------------- - # Write final matrix values into files. - # --------------------------------------------------------------- - # -- Arrays to write out - mtxlist = { - outputmtx.mfinvehi: invehval, ###0 - outputmtx.mftrnfri: trnfrval, ###1 - outputmtx.mftwaiti: twaitval, ###2 - outputmtx.mffwaiti: fwaitval, ###3 - outputmtx.mfafarei: afareval, ###4 - outputmtx.mffmodei: fmodeval, ###5 - outputmtx.mfpmodei: pmodeval, ###6 - outputmtx.mflmodei: lmodeval, ###7 - outputmtx.mfacosti: tcostval, ###8 - outputmtx.mfautrni: autoval, ###9 - outputmtx.mfratioi: threshold, ##10 - } - with open(stats, 'a') as outFl: - for mf_num, vals in mtxlist.items(): - arr = dh.skims.raw[f"mf{mf_num}"] = xr.DataArray( - vals.reshape([mcent, mcent]), - dims=['otaz', 'dtaz'], - coords=dh.skims.raw.indexes, - ) - log.info(f"mf{mf_num} computed") - outFl.write(f"mf{mf_num} computed.\n") - # arr = arr.values.reshape(-1) - # arr_statistics = ( - # f"\t-- Minimum = {min(arr):.4f}\n" - # f"\t-- Maximum = {max(arr):0.4f}\n" - # f"\t-- Mean = {sum(arr) / len(arr):0.4f}\n" - # f"\t-- Sum = {sum(arr):0.4f}\n\n" - # ) - # outFl.write(arr_statistics) - # log.info(arr_statistics) - - revised_skims = dh.skims.raw[[f"mf{mf_num}" for mf_num in mtxlist.keys()]] - revised_skims.to_zarr( - dh.skims.filename - if os.path.splitext(dh.skims.filename) == ".zarr" else - dh.skims.filename.with_suffix(".zarr"), - mode='a', - ) - - - log.info("-- TRANSIT SKIM MATRICES CREATED --") diff --git a/src/Mode-Dest-TOD/cmap_modedest/util.py b/src/Mode-Dest-TOD/cmap_modedest/util.py deleted file mode 100644 index 74d322a..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/util.py +++ /dev/null @@ -1,138 +0,0 @@ -import os -import gc as _gc -import timeit -try: - import resource -except ModuleNotFoundError: - resource = None -import time -import numpy as np -import pandas as pd -try: - import psutil -except: - psutil = None - -# nano micro milli kilo mega giga tera peta exa zeta yotta -tiers = ['n', 'µ', 'm', '', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'] - - -def si_units(x, kind='B', f="{:.3g} {}{}"): - tier = 3 - shift = 1024 if kind=='B' else 1000 - if x > 0: - while x > 1024 and tier < len(tiers): - x /= shift - tier += 1 - while x < 1 and tier >= 0: - x *= shift - tier -= 1 - return f.format(x,tiers[tier],kind) - - -class MemoryUsage: - - def __init__(self): - self.memory_history = [0,] - self.max_memory_history = [0,] - self.pid = os.getpid() # the current process identifier, to track memory usage - if psutil is None: - raise ModuleNotFoundError("pstil") - self.check() - - def check(self, silent=False, gc=False, time_checkpoint=None): - if gc: - _gc.collect() - now_memory = psutil.Process(self.pid).memory_info().rss - if resource: - max_memory = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss - marginal_max = max_memory - self.max_memory_history[-1] - else: - max_memory = None - marginal_max = None - marginal_usage = now_memory - self.memory_history[-1] - if time_checkpoint: - time_note = si_units(time.time()-time_checkpoint, kind='s') + ": " - else: - time_note = "" - if not silent: - print(f"{time_note}Net {si_units(marginal_usage)}, Total {si_units(now_memory)}") - self.memory_history.append(now_memory) - self.max_memory_history.append(max_memory) - - def __enter__(self): - _gc.collect() - _gc.disable() - self._context_start_time = time.time() - self.check(silent=True, gc=False) - - def __exit__(self, exc_type, exc_val, exc_tb): - self.check(time_checkpoint=self._context_start_time) - _gc.enable() - _gc.collect() - - -resource_usage = MemoryUsage() - - -def start_memory_tracing(): - '''More intensive memory tracing''' - import tracemalloc - tracemalloc.start() - - -def stop_memory_tracing(): - import tracemalloc - tracemalloc.stop() - - -def ping_memory_tracing(): - import tracemalloc - current, peak = tracemalloc.get_traced_memory() - print(f"Current memory usage is {si_units(current)}; Peak was {si_units(peak)}") - - -def timing(stmt, setup='pass', repeat=10, globals=None, quiet=False): - t = timeit.Timer( - stmt, - setup=setup, - globals=globals, - ) - n, duration = t.autorange() - timings = np.asarray([duration]+t.repeat(repeat-1, n)) / n - _mean = si_units(np.mean(timings), 's') - _std = si_units(np.std(timings), 's') - _min = si_units(min(timings), 's') - _max = si_units(max(timings), 's') - if not quiet: - if n > 1: - print(f"{_mean} ± {_std} per loop (mean ± std of {repeat} runs, {n} loops each), {_min} to {_max}") - else: - print(f"{_mean} ± {_std} per run (mean ± std of {repeat} runs), {_min} to {_max}") - return timings - - -def search_path(*paths): - """Search and return the first path that exists.""" - from pathlib import Path - for pth in paths: - if os.path.exists(pth): - return Path(pth) - pth = os.path.expanduser(pth) - if os.path.exists(pth): - return Path(pth) - pth = os.path.expandvars(pth) - if os.path.exists(pth): - return Path(pth) - - -from contextlib import contextmanager - -@contextmanager -def profiler(): - from pyinstrument import Profiler - profiler = Profiler() - profiler.start() - yield - profiler.stop() - print(profiler.output_text(unicode=True, color=True)) diff --git a/src/Mode-Dest-TOD/cmap_modedest/validation.py b/src/Mode-Dest-TOD/cmap_modedest/validation.py deleted file mode 100644 index 6286e43..0000000 --- a/src/Mode-Dest-TOD/cmap_modedest/validation.py +++ /dev/null @@ -1,96 +0,0 @@ -import pandas as pd -import numpy as np -from pathlib import Path -import dask.dataframe as dd -from .modecodes import mode9codes, mode9names - - -def attach_superdistricts_to_trip_table(dh, trip_table): - if isinstance(trip_table, dd.DataFrame): - trip_table = trip_table.compute() - if 'o_zone' not in trip_table.columns: - trip_table = trip_table.reset_index() - if 'o_district' not in trip_table: - zone_info = pd.read_csv( - dh.filenames.zone_districts, - index_col=0, - ) - trip_table['o_district'] = trip_table['o_zone'].map(zone_info.district) - trip_table['d_district'] = trip_table['d_zone'].map(zone_info.district) - if 'o_superdistrict' not in trip_table: - super_districts = dh.cfg.super_districts - trip_table['o_superdistrict'] = trip_table['o_district'].map(super_districts) - trip_table['d_superdistrict'] = trip_table['d_district'].map(super_districts) - return trip_table - -def superdistrict_flow_summary(dh, trip_table, dimensions): - trip_table = attach_superdistricts_to_trip_table(dh, trip_table) - - summary_table = trip_table.groupby([ - *dimensions, - "o_superdistrict", - "d_superdistrict", - ])['trips'].sum().unstack(-1).fillna(0) - - z = slice(None) - summary_output = [] - - for k in dh.cfg.super_district_flow_summaries: - v1, v2 = k.split("-") - temp = ( - summary_table - .loc[(*tuple([z]*len(dimensions)), list(v1)), list(v2)] - .sum(1) - .groupby(summary_table.index.names[:-1]) - .sum() - .rename(k) - ) - if v1 != v2: - temp = temp.add( - summary_table - .loc[(*tuple([z]*len(dimensions)), list(v2)), list(v1)] - .sum(1) - .groupby(summary_table.index.names[:-1]) - .sum(), - fill_value=0, - ).rename(k) - summary_output.append(temp) - - return pd.concat(summary_output, axis=1).fillna(0) - - -def to_excel(df, *args, **kwargs): - if isinstance(df, dd.DataFrame): - df = df.compute() - return df.to_excel(*args, **kwargs) - -def validation_aggregation(dh, trips, to_dir=None): - - if to_dir is None: - to_dir = dh.filenames.cache_dir - to_dir = Path(to_dir) - - if isinstance(trips, dd.DataFrame): - trips = trips.compute() - - trips = attach_superdistricts_to_trip_table(dh, trips) - internal_trips = trips.query("o_superdistrict != 'X'").query("d_superdistrict != 'X'") - - agg1 = internal_trips.groupby(['purpose', 'mode', 'hh_autos'])[['trips']].sum().unstack(-1) - agg2 = internal_trips.groupby(['purpose', 'mode', 'hh_inc5'])[['trips']].sum().unstack(-1) - agg3 = internal_trips.groupby(['purpose', 'mode', 'timeperiod'])[['trips']].sum().unstack(-1) - agg4 = superdistrict_flow_summary(dh, trips, ['purpose', 'mode']).T - agg4.index.name = 'segments' - agg5 = agg4.unstack().reset_index().pivot(index=['purpose', 'segments'], columns='mode') - agg5.columns = pd.MultiIndex.from_arrays([ - agg5.columns.get_level_values(1), - mode9names, - ], names=['modecode', 'modename']) - agg5pct = agg5.div(agg5.sum(1), axis=0).style.format("{:.2%}") - - with pd.ExcelWriter(to_dir / 'validation_data.xlsx', engine='xlsxwriter') as writer: - to_excel(agg1, writer, sheet_name='Autos', merge_cells=False) - to_excel(agg2, writer, sheet_name='Incomes', merge_cells=False) - to_excel(agg3, writer, sheet_name='TimePeriod', merge_cells=False) - to_excel(agg4, writer, sheet_name='FlowsByPurp&Mode', merge_cells=False) - to_excel(agg5pct, writer, sheet_name='FlowsByPurp&Mode%', merge_cells=False) diff --git a/src/Mode-Dest-TOD/nesting-tree.png b/src/Mode-Dest-TOD/nesting-tree.png deleted file mode 100644 index 148f40679d2a52f2ceedee98a9f6582d6e67d6dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43030 zcmc$`by!th6E{qkNC`-HcSuP~cc+vzf^;{Ehwko>mIjq>i38F|NW-C}JKue7Z+)KE z=lkdV>+{-NEIE7cwbsn6iQmkeFjZxl$7n=oFfcHW_JX&{WB` z1OK77k&sZem5`Beuyb(MaC~KEA#UzqYN0Okf>S_%9|ndY&dkI_U6zHR{}qmjN&h!y zMl@#+_0Z5rb&~*aM<>MqMOViVMSQA(!7>5XayJYD2N9lcb8iPqKKt(5p{~TfM-A%g z5eY%3)-EZ|J{d;0OB5 zuitRFaKG<>56^}FJ%+7;-pa7Bc?A4Ib(Ga}fq{971O0)u${7b3Dh4AbDX!@WyO)LR zYw)%4-1uxUg7(6GZIKwsOhfTeD_w#33p7+zIX0T0b!rG5<$w}oF&HK&7y&MI^aZzx zS;z8Q=Ka=zWEQ z)YOzpc=y$Sv4%#13B1bCYw+-Ja(Q`qbmI25qIE@Etc|J#Og zgGO~CVq#iKO7YdTwZhz7vDMX8yF~d-I*X+?zgmw2qbyj42$zkau?!cNp2P$gR8_Tg zhd>12mC%dA6g3yQ=F=xF2UU!*h)`i(hA>Us3T)xTgY|WD9Zc4S>FH_PHbzFq?~+}r zzyn?K6d-MtZg56i-0$rN$H64xow~j%u>mG@bD)Y|$z>VWlYjwxzI>U1fi9tPaj;bN z<@VM$O~kKh!(K@d{XH-dghST5QAG^A0DyN_@5$=uoZp93^y;T-q5qp=_ zFCw zudU)qS%ITU>Hg(5aNo-(9bAMnTfmMoH#ygxytfBP#6D&)(Pi|-GOQR(q4Um8-vb0C}YO1E@cUcLI2%2J&Bm#^1-UV8k z9tCChBAOD5XV8iF#!#tnMu!yYA8~oN)o~{g{#pyTBiJ##ST$8TA64tX25wa zIx&~n{@wXcF4Gx`2eJb8l&=~rQ9*@rEv#`ti?bf0y40Ar`&G4vw{?&SKL5Atz*_7i z0h&YwcNY91$jmz!Z=5_DBlodJ=Wq0E)iU{1EO^^CrOw;$H~WW5*C5TJ*I8uY-d9~- z*vSf(AqbfY9WEUWE+?JPWAg870xb|Y=5d9?G;vrZcDQp}=IyTTzqC=P-0oVGesnn9 zj^P95?ot3a@9D+O`-hvzSRI)?yHzdyu#8cWG#G@F#=}HBnj!|DM7X$m3}VF)uyXSW zU|*Qy{~=^KHOy`ihe5YM*muq|`U1`mAp_ZdA-6~JqJTKPq7akfM2{sz{Ie_2d4pZ<~c{3MuZxjo^594t2VS)WrvZd6YkKurz2 zv-%^Z{|>Ou5K0)N?^FU|{w(U>K}P}%o|Foi5cPkA@t>UrmCyt0+6jO|_$_9C-kA-& z%lmkl@b`j$6I4~G%C1MkWf z@|6B9(!W=srULL|@&N(mx0L>Qrx27p>z&+xPaf(Gr-}RFo?Z;*&kp__EXz?Wo+SQX z#LA->9Uo_+l>yW6&`Mq7Zg@$m8EVjnp&rGjr>{DZ(kD&v#AhZJWGjfQk+ErNYAa}I zMV&IUon8ywy5foKr|4+P`$>GjJsU_#G#~MFT*y#RQ8;r?n+8@%6%6Pq6l|J0@!xwg zQGvU`NbDykyDr|F_Y;Gf45~-RF6%|MY;h6nsmv7>700FQi_~kqk+I18?Ss@$9!Du1 zZ~thg*PxGzBM*46t@NpQ^XB-X*eISa#h=0L>~ZC;>S^2U6|wnsqEn@9TbF~5jo0z4 z&iWMJQo`Jv_fJt?UTsTdVs_)UGwFemZ^>51x-2oGS8thFF5W%dowag#nuuN~2mz`o zlmZ|dwQTAT+HXDwwxX2(XwdRM?Z`>wnxS*CQi@ZfM%rC$^;k4!4Y(als9l~!ThGukIP!D#=w0{AU+|X5O0k3pfd3$;3&X(Gev~< z(TM2F8&M}Fl#4@^k_ge;*>|=6YrG51USqcc@o{l^34S?(MC?G$SUI$}s?y`x6*lB>zwu9`5JQpU0c+A|H}^90GpUk;$(V z+czjKdipfdl&ln~Qo%b#r1U-nF}54JQ;2=6xv zmBKTWsp80>6Vr$`UhKxl`M)OE#(N6>OzKl8b>`gEe4?rQq%X?3y~hlPA_#>ZP|DbB zCYCY3bzrUsO0L!Z=n5BM6)3Ukf`p1kE-cLXEA5F^pMhdWn9n`r%PF_xk4BcaBMxnh~bn7a0- zHPZY(#3bdLroFM_>2uF9+t1FjLFOEMN3weFPqjd{NSJ%OE7O@nsa!_i z%a^DMWtfL(V}!k*VwS8FBnHr#n^L2D^SSeWFjqD9?@ zQ)Z#G&+6O56Yfvt_#QZXlY8x&f_i??V7)@PeMrQ8MQG*zha9pLi3p0A^FHL2pIC@= z`M(VeC&qWne99wnfX%o>!aNiS;iMJNbDnZ0>SMAs-;EYte7np8Rasa};kVfTQG;SA zz}DF`DwIM$;Vx(3A)8r$nJmSb7uz}P0_v<{(9&9 zy(Evz@|43^yq}&eyZGP^a%7bRo8^reK<+S0IjB>4($M<^5Y8>?j=bVAdY6sV-{hb` zM^M+$SpWXAGI{CYD(5%@`GHO$v6kPrU#zs^V+y9uo7kpnq{id;6B;8utj9fuZnJPu zui#3SHNa_8STtqewLs+LI?ZgpH!`3793^0j-xhK=IqQ^hB)5E#ci)?1H@>NQz-Rdw z7nfZ$Z8cwSQA`nCXQk|pcy#^pfcd>g#x4nR3bO^b==2vgQp^z{N?066lAw-7#ppq@ zC;#R1w8|`ZUAZ7=tC0JxF2Nz9N6dG>%DZv!z0!cQsMTV%k2%9#TU{NNwVr2`;NMqJ z6T|jB)VTml#0XP=oVJfoF)}R6=|0=m=pE2$cTB+D*lgRh++t5!?smziDEah3KB8lx}4j z>2JdmR6;R2I!fVlzBeX66N*hu(-}gm>OlZ?fIJQ!Duj+kM;6$T{UY6PVoGV5Yq=(9 z_0C|L1kuH#A|lSpSWNG_JPRegHE6Jr+03@~A>u{A-(Fh|yrw>zUmJkHxtxokeqOa7_m z)J;4|)BKAaF}QsM>!IE(q?kWm#vjqPK1*!>tziE1 zQdkwZz5i#s3;1*NnAv~gjDN*mY!ZmF2+l-d;r{FOzo@DLs0LxL!^l7K+J$0rCvI$u zC9SLdi}KZxFw<)F=(O-uzt>nz9Q1@<83jKeq?;4aU4WYs7=SSIVT+vp`p-R%6hX%PeQ@q(*x#ed79kVSvssFGSg&O8PBADuYPc4#T zg-Z~i86_>?D;0PW^8Z#`Vh%WBRoX5tb^8lD-&`fl<~4^usO=27&|m`_lp8lU`a@J9 zl%Ad*YYAQs%Xisdhe2-~+v|3hGkb?+;Y6$s-gNX|!l2GX11{Q+uwc|btF8_gv$QN4 zO6O5v4kPBZi~asxJ1i<{3eC*kzEa1w1kzXLhG`CX=UM}ymyV+@5s$<9csZ11Wk>t4 zbG$5L5vUTOt_U7Woz!n534k7{42Xz`L632(vl{8~1GYzHBN_rv2Y zbY(@_-vkYOhnnlbEGoKGMKbxFuMwnjeI~{rTv|x};;I&jE!umuT zS0fV9z5OjJza7PVz|;M@l_==)CrtY7Q;I-6$1o7o-T!sv$BB9ChjaP5jBhDD+i3rC zY_K##vt3%+iYL5A3yZS_#3QEk6hgr8m!O8)!=({!11=&J;Ll0&g>r2A-$X-wsU?m+ zFf_RG1^B)dfnN28M3S_yx_d$n`>tO1q6+z353OBo-le27OBh*PJ0p^!}*tWkGAj)Y0mN;?f9p$*xz=PC)D zSEImqF~^bss-=7@4gsHgV(m-@W^l>AHEpj5470;L+KCNndC|QBi+vCwypEC&Kx@V2L+w1`Q{tIDjpY zWF~AWdi(e^*Vktnkx?@;s+pPzxb)k!gT8;~wb8J3+JIOpsHx>m#E+b2Q&rnuh}hWM zhY^th;g$5{&_8rRP&QdVq&!}B@F%%^=i9}L&~{!y4!(|hx!&f}#`b9ATa8jvYHSC} zQ0wyZyN>*TdqyTu3!-%2ecQurzvw#ogSR-FE{9IrJ!E87v{Nxp2QKGk+yen@TF>tv zAC51_o%26LhDM71Z}a*7=42>7H13lcAEN)8VV6*hB`0?)>VH(kdzh$M$%uk96~I^; zQI3v{Q35d-&XXr=bD1VJSldc+a^I7=;*gu00K*bG8>_5)78!%7G=;RAP_2)`8=Dtb zYB-zf+BwH)9(FpXmn@qRM?0P!8=E^}cZ|J9_UZ#m7vZcx9!t8f1jvydmtGJ&){o&+ zfC=Hy)OJ_Wb7c>SEzL4)@#Yf;9UVD+PRtP$yr@O-%4Y%Pm#1=twQ887e(a`SDmHy7 z@Rptg9QNuF;dze}>DO%4HEt+fmg$3zkDc{Cy-xCfwYk17tF9iu4uQN^OgrM%Tk!r^ zRvG7agDK~&UlysFtnzb96;@kE=VKwfenDlWvcm_N7<{`t#~+{HBvicoBCoHXUQk^8 zQEG&nhMSukS51#-W7yEAuq{sw33JEcrEQw^sHT>djh?oq=9V*;$G*WQA%!vv79t`d z^Q&Ws^X;XRle*qBnD1|9$}ww3Jzj*0fKnU0YpbfNo^oJV=}8JmdiD75@bU4{fE87A zJ$*I~|>Xu;b5sCij<(ST0;T$YP_yaMg}xMO-o#uN_OH^8a=uq#_HP^6Smgm*7S zjrPrIT1-Ry;hzJUhmhMtBI2tX;3esxDK8(s_+o0;0JiWD9yvtpq()NGHg5?v z$@eIVrf5p{;Vx8FHghFtk8!lHMQ@I5b5uC(~vr&m0aW$j$~$IQ%XZm zzq|NSr;C+ej0A<)iNBO3y*%T1rfiXMW^W^xBLCHEuxY#h-HT*N4g5UKT%pz0@FhhC z@78j#BoKO;ysNVnkeqv-B6T{sN=l3t(hyB1T;`Qq8BB7d{GR3K4$?WhJMFhh=N>@} zVi8TVce~pR2TG=XP`P7hKQ@#{iidJJ14@UR%(L#AR`7rKI`%iSaY$tC3(p3 zQI9plOX|luI&^G&?|OA6O-OOk`mv9nVK|v^%eOZU`;DOHV#Dj1S~K8c^y3RlF|e!N zzuVR`*V}6}fb+r;{-nyF2xXu^&>n>ZGbnFW;xX@1G&9w*2oUjCJnbBGOeM{aV(yYYY#u) zEf2h`l^Ki1u}lZF8;J@`)I^NPwJaJM+WNQx`&3f-8n;C^dSF%ak2b$%fKo5iBoQN4 zib60*;|aMfwcoO^@y+^N+m~F6E=?sIfbT5nAYI)m zDebR)Pv@Qeamx#5UJsvIVsWFD2$<&CVKWE$m80TQeYmX(QVx^A>_?G(!6ZV<%SV^Z)h6!*U4zZg7RESt3>vsLhcH^F2goYOU3y9A`dQTL=5cT#$htuNe|p>lNe^ zcwccK0a}%T#)R(v!`sKFkBo3vYgq=1oL+y*4;64$) z!2hl7V*?Wa<*?7u3^tHp%KwUi__bDEDk1)Y}Ua$KbBzFJD+#IBPir9Ps#H#L8 zEvk8`W90_Zj6`pt6R%YV?w3^IR; zqhaofO6E|-?;LGqp*kSkw&AkdqDbTONC$#k5TcBQTU6Q8>HhO9A3)uUw^MiF)V!na z^uYyn9^Rkwst~(KpPV?GANO!_`CLmvHtT8U2+j^skvFsC0AU1D6gbw_*0I7q=hn7P z5+N9mORy2($znu~9K3e3Fd=)4AIy7lMdFj=%?EwwSk-=(ak}KM1^4tYabK4Oy*6;M z%^(qSR$RQXZazKGp;>A?(HcD*LkL#!*_zG_%66_Y;WWT>zq|a$Oa&9~xN4(Ci z3MgX9=X_?`gA#*@(w5CR9T!cX<0ob033-zy;1nE5rp`iWW5p!gD|%6k+5pbSAvK?w z4VC_Q9jmUd#!6nfM2qu;{$lt087CuRRk&K?6b_`FB!=I@Lml;$nlUs2oTE;X0eOGewJ^ zAW5HUO}p(&9bU)zw0UJj67b4~NK1_&YZ^hbM?oeislANlUlH>eR^Q)8EQzp8mEpAR z)}_d5OTXqA2yL<&gAxCL^q9y2|9X`FZgcQpaIOLw!YA4+=;YEK0BL~s0C&xzlzE98Afk}fK*)Dem>{3sG$#EeGs`# zv|DP^Xmi=M(4X}{1i!OKO|1=;W}NY`&rFA**qvT9WFKj(k-y(8exSX(zP=}TQj)Lh z+@RRzw^X%${hoV0-i7{3@txeG3oD#JUkZgiza%LJ!uIQ3W-jkZl*Y9Pz8pf?VrF4A z+=ru~!Q*|OkL&yF25fiN!NnJ~8nvW8XtQ~25`@n(s)krzev-PsKCn1m61@az^62Oo=aTxJ&!7D$(`5zsoJJCthTuQLIvhb$6G!>+e}4@^R$KVAFX*QwXAFL3CI)n z2amzu9jmAa(+5g_BjD+?SfjHgDx{<3FnA{r=DI@7VY}+6_i)6kKy3$vd=-KhV01iQ zLr)YF<)hQ1Zu5oSie$-9N384{0}BN>O9~OxAx#J(1PRh7A95`0GmgUi&Rll^OH3Ga z9T{%Qm+P4Ub;P@*V8W@|Qfps5AzMXkB$Vf@`uvPbm+vbFOVc5C|HwdMZ;_?I;=HL| zf!5R~aG+*w0fTKLuo%@6@Gz$qsN4|+d1dT<3=H@Y_%S#}3j;y~5oFJ34buj4ZX}at zB_q&)IO3mx7(hGc5<6k^d(q*yG}Le02XYQT908C>>Ssp!Q%a3y`JIcjQq*?4~c zL2-YDh+>*h*hg#C((-RmE!PK#QJSqJ$^VXOu(W_^Q#z?3P491;wUrG-oBM=g$bZ{8 zNj$)qsnOb7CjTAQGy$o+8XxJ?KZ&Q`z=xU?0Ay%}Wu*Nj#Nwa)+bzwV4@RIXUH1@2W5Cyw7+P{MMYd6H=yr$kj;QDkqxF z))1AJ+9tl8R~#5ntV8TuRPH(2(6(`KxJZv&FOUq2sGI(BBdvv@z+8rS5Wf1>PEKC& zF#X)RdFz<~(N+ED&vHtB2?d2Tv*!yA%%e$!Kn3Sayy29oA?fW0~`PloeGpr)?15Q)DhQ~b-2Lo}( zub=jEcHa!}iMW)mTNF1}O09M31e}&kmVui1`221;8aE?!Je%>(Z6EJYf9oD$iNpMU z5DO&Hp5GVrcs4@9U7!l{y|A!*#3-Y)>*n{l?`%u{%jC|N)=B=ws|)fnaQ8swc?*;F z8i39zV3BbMxXW{Vcb-`J6p%aySsA^|tD>c!Ee^?5JTtgGB6sNjEF2;{KKKNie&8sF zojv9AIYy)XisFLpQLhiN`CuhZp=S&0QtKVK1b;IsWf=c-ysZL-5hyz`KhGM`kvG>Oodspf5VLxqJWO5{1)F<PB2;U3c2ifNQ*IGa3__ zv}|Q2sRcf6EyZ5QSQ?!vJ~%kxTLhySsNYcZq1kTUU+ke0sLaXN&V00~eA+MQ{nS{$ zRvKq@ZM|1v({rAi{vKS@TpM~gs*qE%KE8l8T|<36NWOoQDdXU8;nvEcSEJ{?&n~={ zWjap8dLst0h6wUt2@rXaXw>@bMrpeDxY8`M14r{dK3^0nNsjzM5`}&1 zOA$J9?$Twx8(TGfsawN5jXg#FoXUS1A;beyNVj zCSVnB;CAmS&Q9;mz2*DlkXD9)EQU>=ium(S9T%Yt9))KZ?VjCmwC@tSMJ|#O2QLCn z66f6);AZPJ&Pd+O(7q{K;dhp;(H`e49&O0(cZ%F`a`w2pUf-GEC3iWQzmxvK3C6+| zKfN}?$aT8!A6u#odjnuyr<1y$bPge94R{oWOZSys2OR0Ii z3Y)6%;F`?iNeO>)?`u{aN#Udq%z+xng6CNz@~LjV8Eic&FI{`^D`@NqJEQs;N zin#umgz$EGXIqOj#Ld{b{x}P*S~zKKBP(RxkG5T5Qz`zw41GLKEEmXk5HN6F|Kq_U z<9JFChIJa0*sOuTdjr&l0@gYw1KHjX_`;#D10!v2b%V?O0u$1MU;K|e76wCKmF;6Z z{-Khy6DJviO_ZI&0Vk z+A2VZ$z^%XDNJV6U&=6H9d$~7eu-(%PwKmvwoAC;R=L3Vka8j8v6$io-5X@UX zy!ddodwRGUkw|iXJuleAlD~PMS^A+h93gyIG)b)#X^J~)2?5l%c=DCGndJ38PcBMZ zXpGI`y7ighr();ed5$g^YFYaRb9V%Vw|b9gfg_q%Fjx&W(H%$#95RSeA}k?CUx|k= zWXHz9`lXd`VrLVi8xkcw2~;zSH`4KTvtJM_%erMmc%DFtH#HuU>lSo(tD`tJPm<6z zY<$-i)|AgF3D|y}O_i+35gyt&-1>mf6i+Pz*Wsq!pG%UT;uIkFUPf~B8^JD-Hvus* zb$8;~ONL9g*O#w9tFx5HuGt<`PJ`(;SYC+d3Cb-SSNT&w%H~%j!Wl(DO1aK^Wh~m7 zQ*xh}Qo4~&0b}u#Lv2f-lwTm9#pK#K^{LPPXcSc#h}h$b&#L0 zFuoQb(_=dxuT>zS*d(z(rXBS9AsqQTDK>8`OBwVB6Y`*EE$}Bw$0`lFp6|*vA{m$h zCme~{z{nl6*!%tYAOK%v1ei1%bC97XS4A}O%B3s z!iP;9++qt)^|%YXBu>kBSEY`fU~J)`n9}Tz2A^npJ?w9K2-^{jw?j{Nn=ul>9}mhW zK&JL>d#A`x6AmUIoQ?w5OcBkP$yqgu80F=bg*hxsboLj*i9U9{c~;JGT%mA-#Sebd zN*m6T`_1udHiY^&%8wCgxkEo}Mv~(x7gKt9)Gsn|O=-|tRR0#5?x z;dDJ?P8YYln+P&L-*@log>Dp0;Edu?NhIxGTuVn1`Hqu`AsktO`5h`9RrXKi=wb`& zZ-SrborQ`-W?s>td?vrYpXF|NSiTtP*Ltcr?UFXqFz|?GSvs)SZr*hs8uBRn7Yb>6lSf+oLIj+VURYrOxnSJmNmkM0(AEF!l1?_siWDKBOnwjMPl7 z-?0v5qCq!4sySU1 z(vsVlsjANV629l0uZT5kt2K#e>?58Wr}@TO;m<9SUry-3>sog)s&?l~J|&3vvrNK1HWFR!Y30jjt8qQLMgUk?u|$Z0lEp&S=;;1jk|q(`xdF$x=r`} zfBFuQNeL>1*g$L3f+$d0$~Hn@MXUQOgN)!STvY4mqDKd*aytVN(++MHCg#xS@D=+6 zK$PCZWYYp97cQszrf(Von3#)GZ&2X*2$0^>5_9;Toh!T0e5)(boG!^$;b(b(xd`X- zPsk(U`4DohfiEPSVmL~czn&xN+#*R>;|0n3bUd_6E+4f+N;X*~#`}{$cat7t+n9ly z9s@H}TV*{oJ2~g>%F9NxJ2RwAAcnkrDUa{TQ6lHNPg2@0WJ*2^M!nT4ejEy(Ign7zOF`0aq*7r-6nlVI+)Dv$F{Zbz99%&8DIq;*L?9AW0^KNj&5vQ@>(YM z=D*6>Z&yNw{G96^VT%KFZi=9YTU^Mi8k1FwzB*0ZZt*lHXow=lj>Tb%Z`wwf_+=R5 zJ64T9S#otCVlUs~5=G3NPue-??6l402ZYP4%LWntJ4cO?cjPrU#z<%05rCp@-5ED) zlU+~$Aahz(IFCxX{@n7#Vw&=epBA$74tb(h12ev2)N83RV*#j|hK#(PeKb)b1Md=D z>-Y#>nhu@Y;Ti9KJ$mPi0pGnhm5i?mN9*{OUeCsU{G{oDZWFbB79;aP`SaPq-C@|r zo($pitcmXIG67(!u6E`3sA>5ucUQ*rDWXB;edxOfE)|lx0@4Sei~%Uf+gwr&&=j%fyKx#CNl5*&d^pS|ZWc~ap%V3jTd0@;pR7}6Mk@(=cRp_dpomTj# zB0Osm3sojIwY2Pu7jM5%2vsJL2rymT9!?)0sKpV3R%M5m|y7@&mB&bVkk3l5P9K>H=OZ$q3;cH+4{ai_Fmfd-k17%O)waI%M{Um zyYPX_+a%h6-^zE>q|4nNu(0&bt|Khpw}U^wjgh^7-h--VdZ40ryNXGcjO>3)x~*fd z#f=uMqvz$^W(!m;U`(fMUW25s)}QVt7YE!tHa7CUdoKNrrt~8GMsVr}Pm4lptC>U= zY(It@AvkxoDZ(X5U&QJt{O79P504AngI}plNfua5iuYc6A}1j$iZjmzjq%7U&9;aP zJyA^vsCkWtb^Bb~G2e5s9VyOsVM4Z)nSA^H*?nkj6y;V>!?P*)w^5aw2<868=aSL; zr7ByeaU*wRF+R!^wA(`$6<=)IcEH(vB-iw<(`b1yDV%=?`arD)P+1|Bfd(4*le7OF zQ7=*fLHL(`Zlk{g`f5hN^WeopPxw=e@jEawvbQA%A!ki|DB0gZ*>rhQ<4zI7hZC<|~e}pF}$Tuu6jQ{jAn3AQx z8b}2Kxw8ti=+8LlEUtw_A8R9yCm*H zzk!!z2;%sem^k*gwqnoE&jTk&$q%3S{#sS;OE^!;4>*xpkJ9R>_V80I$U5fiv=PFq zf#wFcHQXpo0N<&Wk1k@NqoDyx+;c7sAXpJSFCm9DNaSyH@hhly0{9tXv;`PgJ*&D_ zQrS)s4$1c9^vq*Sw=B8|0Na-z3&W(P88}m3Zt?-kLQIc$zQWYLOM-R~Nl7dp1zfih z?N?p<>{Sg55^a1Sx%(#BVYdjGSSm||$a3&uEu&y(vQ&cP>9G!w$$Z@B3RL!kO;y(W z$i9w(L3w~+NiqhR7!9d~55?Psy!Bz|s;8;LCJWUHZ;Z>)T9M*+AFQ=%xF~qqtwW`l zIy3P;CUC`GE0Q5X6?a9Kts;NUjb9j|C{<%y+42vZAxstc%HGS%3x}MXy|A#*JI2<@ z$qA^w*>XdXJvp+R@}UyH$USA~#PIEJt=aNN?MM%gr>GBZavjxNKAxXz zS*ThjCp8B~My6ZC86sk-!4&??{O%7Gxh+hv>L8e>f!xR3K0;`fCVRttffOT$;niH+ z++R;wO!+x?r21=59EwWSlBB*zSaIy_ylvidjPx$$p03RHXy4T9Zd_X7{0EW}i$TrB z$rSRc)dp6omru;=cXOTuw45xAihn4oV;0meGTv$mnz*7H8KE#?65IO*0!gc@j}!X) zc*Cwl5%I`}wA(K{*K6}_G`F(aeT-J1Mx}I_D)?SLjq91@?T_X`oZC@~_aqh8sp++$ z0^L>Z_f5RYlZJXMRVCwG#UytLc z$d-2L_47dJn6WD|eYUwEOx*9s5CJ&PqZzOQrV2oV$*~*eqoWB#CxwAT8X_OH2DzA`QT^EH#6)Y&_)o zvj+3!zTjDm3A40_V$*?XM5@J$O4uo7E-*_;Ni6KDuUh$PU+4vKTZ|c82vR`e!c8ga zxBltQfTIbNKYaU$ZB#{E;2HbtIuFdswi>PW(N@N|{rfJb`T2RO3UI$zi@b|-t(&l` zcCm0~`5~fje=MawsEx_!1R|WdU7K#>@c!v*%S$nrMXya8DI}*fF6;CCtLO;P*$l#+ zXN`RWW)DDiV9N+YaFFvVaaES^dSvPnorgO(riqh}PbWMg!Y%ETcJLa>f>g^d;E`Lp z;v%)%Qlsx>hRT0{lPy?SP5=9I<({7Gy{Mh-N3F;MC)ctW=|3g{y(qzqZfb?1V`~bn z(;@lGR76bo&$KDp7n5J%hEgxHyrA2cm}^3#*qBW51lKUjw|b1^)RxFo(oNT}oM)#t zMH0GE8+aUOuEki?C}dJL5BOij=2>+7t#^SIB2C;ZM!uqSfa`FmG$oCWZ{8UA@*Ct! zjoA3!+N?d*?uodHtat;SqcWU9skfzOqMvM`+eMP2WVsdD>Qcy6N+SKZUSiQ-OJD?B zHlu1^9#4rAQ~i8WQYz5}P=o(M;+Lu1bWk&~6))y*6s@T_RU0%%OS@~ItUW0!?qBH! zTNaD<$hojSe{P(EPNp2?4 z|Kk{SW`Pa4ffU*zLb3oe<9b)P!#Qc?biw@en&DT91X@@JlwTynhsZ-3r&9(mFMb=ff9!2w5ygU%CfDc~WSCoD0!F+@!>C7^NPwk=jd0K+x6D$*lEhR0o4 zyV%=hHXi_29IqV&D6uwWn-V66tw|5$Jly9$dq$c9#IN%6j0zdaQXPTMg8XP9$8{k_ z>f}os{qIjUb(LuaAK7BjgLASkVNaqh zYbz|&!bsLG%d>8_*y-VP?)#aOIGH%gxDtYqGEnt!mvpiPSG+yK5Z zJD{9%U;{|GL`|^!-6IJ&?4Rbo`^gme&{Cs#e?J+)rlClF9J-CvA0oihd zV0BB3C0u4z1sHLt{CKTnq{jGgvb^S8a9T2y$pOvGvOI{HyQOF082JH7;vX-Wew-)v zTiLg%vl;WV7swf3FEU*LP%3!YACb#l*LXlthaB&clFfSK=TB1S`dV%6fR>lz6Wr_V z`?oEpyFX+?6r?zf=m@0K)spU)V;mJS+3W$jJ`pm&of{DvB2&}jgE+ZyB>HjM$Xpu zrH+x;2qqkXa9nmaQ#S}bah97-4)h!&fc0vy8&jyAk0`21Np>8oQ8(X3O)wMX`~ zEVoye-s|XX*_a`9wbPDHpc?=hT;Iuaw*HLvF{HRZyL6B^E?mNch1N;_y6j{E*G%l_ zap*$-PAqw+K)p@K$jtwEo9<9=Q<+8)>+dYpDI4JJwhrdh{3(U~*NFz;CLrCCC7Vj| zw}ZT82xwiO6j8H(P|W}S^aqevvlfiw5dT|Ik2WJTM4KKQTkU0`w45w5dF{+TxHf?` zfUP>>SlhfwdKVJikWca~x2mVFuXz}#NTnGSMA&b>VdlyWa5|72)&+Ky9}Q!BU-G1} zmD@n$B|X5FY7eTk=QyEUa5tD_(X}Mp%``v<*Ed$yb43CTzj3Wc!M296WW*=Nq1{pd5XO!E$>45mTCQ$zXmdgtO zjY0wTN=jL@rC@HaoUE9^#dgg#Op*}z7-dgXbyZ%nx4xh-%%Ay1m zM8*N;Xa{vPRq6k=F^S#_E5nGD?_7_o0# z?0`DedJA=xOn%BYZ{CbAF0!$Lt6|OoXD2=_&1UeFOYIi}@|S+}MUy5(M`IYW_kR5< zkZ%;chxC{sIdcy^>D>Lt_oyPH9x^xT9m&ZkSKx_Zplp7uv38dWQi8tZd!iKdHZ>)M zK6PpIOVypy{Kd}%W}qF42d9eZ@EtOyds^ROQa-0k4$!C zBc!LNn{SU7zV-9>Zv*P@1oMp$zGYMyGLT-%&d%BWXsQ9q_NukCwB+2}K2<)^W1p*I z;n4b>nQ;ykJ*9aOR$5vbmzhb@`E&v(`KVyXSFgX(w`K}6y*P+b#hsX#;89>$F~QJL zQ={N+r zmYO}P%8gp}L73!h)Y6e#=U(2wB1)i8S%aO9jt<=Q{?VseltM(}U8!AjU>zEK>E75s z<4QG(n-XPqP0eKiO6So54GNRN-6SGLqd-Ng_aX_Cl$~oHePA!>W_oh8uOAvl0oN@h z@Pd}&vF5MdW8|+pZ#d7WL`wdc z;pWHQ4SLsjC{JpFet#FhCAT(C^;>{g%nWl3k@fY@fa<$~?DCNmmrI0%`1t(I_ogcU zbgj^ski!)j1qb0Vu(_^4H$f24-KY5+P!^le(tDvaw=~n1$QmOmAKd01^D8Cp9#B#q z#F~%-s-F;~Iwm77J;5HXstoYn1m%xiq8-stNQDyu-=G{miFqU08T@yoA1DmfRv{#* zX#cH`pyTStK>zorD2BbHSOCzN4LGcx{LT}q&oF8fR`=?4S=q-z{Wl?lWm7MPWt59l z^?ZQ_(WIce2wGg#YrgWojUJ5$iwC87;rMZZ@y_P*<%2LiGfktclB;2!4F~g$J=FICyb!jaJ_nHa{AIlBu zDAw{{7MgUfRGo9-vq$hRb;?bK8!WjkCwQ?W8ft_ab|^lb})!6h{&fWvqvY`lxPvOQWhQii%N3%lpPF zQfb=rZ8^vf!X9w*<&<$K;Un8itT|c2=K!{{gfL9cNeqy}akc#;NNM0Z)M1T{Jx9k zS8Dh_XB23^%FUn2I3?u!+x?h{1;mjU?Y-Rp;&VWcdJW&UjP*RwQa$e4qUX?;kpa&; z@7z#t@OgiR_|OGAJYn|NW1%K+x`PC6g?z}nAHRKLt$evsMxGO3QF^;Rjj7-=xZPkF zwhRjZ?2}lbG3l9HA6`+8E{;)(-cNOpkB{$!vr|$U4HF4Siqsq$3=GM-7+$y?uIEn| z-s&dJ`)yj$veOTydOi0H|yE6XL7A`b3X*1FRcmy%fW?~AxU*%$Y={D z=A+PZ(lbj~j-=*B|1keC+*<2&qRc4ZtJ&t($BI*hpLGCUX{`OwM>B|7So_iO`I682 z!HB|3pJv~KjGP1Ch)pQ3phv_V&XN+vL4hvKc3;6QxXd5jr&c+GINDON{5IkAj4Eu4ppK`>Y=W*Ft+u^WCk`og%TaBb{IV~+c34X_3 zT~oseblR^Un33Ic^w1lf1@@M@{%%4F%tCS15_PXsSeW>!vhaO;u55RCUu2^xWDweV z-48W(wGi8gdGT!`PS;#*+>f@qZs|Y+TK~HkA=XEmBgs6(pXEz;#7Ts5b=#bG&yE4= z0}bkT#}E5$hGag+w0HAg+PovoEsC0tPkQ4qAq$w(U>%WwtaXUxpsfSzbZatz?xCHy ztnUmy?N{Z=v>IuXIPT%Dk~f=h@;i`ezl~T7*ytTRbtKR9t@n>;X|+qz)Si~l+&Lnd zY?rNUUG*K%c?JD45U9)slA<(B$6Qv=X&Hu}UTb{GyZ1Z)%2&89+gSEsYH_RAExlO-s+bF@>j;l)x#oeeK4}NrP7jwAVXSwOqALGC-WJ*E!X7V?Q2{>a=>#9J;xV z2DV)jNa#d$yD_9V)i?poL@F2RtG=0K^ObFOZ9{@SWk9W;_4_9hN-mQ^eWeM*>aCGs z@u{)7F;4ayOqD=wu~xi;oW6dzzyID=UhTm$HV`#E;1g`*{rhbZL8>^`I&OH8a}5pz zHWRar(=iRxT829+3rJ=>n8Np&BpMA<{y`~Okwwwgea_*~lhKA4hek3D9=v89N)iBy@wM|GS zw@>Z)Tgq}(wqhkBYES>6lDy-)X8WZ2Nn9PQPdoQbF<%stb^suIFm90jxy)z#rH`8o zt26uzSq?0Elt59m^Nm&2SonIm%^IX|I%VKEiP-$)`vRBEEyG%t&%egJIF2U*dq?Myc#h+yF*=vYks>4Z9_$OS!l91n8!Ja_m0ZH7 zy6)L!3-^$ck?p|?Nv*#dp)9NHVP$n^=d7?T@x^!_M&I-t3OhGBr@d2?w#Q*^koBZi ze~9%@Y({_zAuqPES=ef6Z9St%vs`)4b)uE{pxKB^Sw8tmHko7bBg=u7H2S^U;Xc=t zbL>0d#Qx3sbY_c#@mnK!|6u%<}YNMpuDA3`ppBc82?%EA?)FZESz32_m|78&*!IIwFPd%yQ zDg53f-`RNFavgT56hE{|K5D z^-7!f2^Gq=3go=mu|V8PIvfFC)QoSnMvB1*HI#&kM@#c!^}uFxLcUjjovd^{pIy7Q zO7r#V&zB2;xsd<1T}kk=h?5iAwCCmRJGnP_0Ne$j<1%2?Gn!g`?FX`h7m33ruj%S3 zMd@d^XUu}&$o+d~BAu*R^3ykS+spXbyKcPs<%0uk?cUG!wA|c6fc%otZU#8m%gaNc&Z7b)FnoZHE3^$R{#LKTee-u5Lp;DOU-gF$GkdDw6ggXMt(Y1e+tcA^5xZ|wfmnP7mPV+Z-Y?WZyDC{C zDmGWwb$8}%JM(6hBL+D}%^y)bo;$+U^|O88udw6E6}wy&D@`&%{1$h5xMTO1CVQ8+ zd|LDq?QO!ky;bvs7Vx63QY8;ium4y!5r~!&W|?Q>o8TJ9XR{OcQmNf`37Z}~qvZw|LC<{U9$0Ov3WIapzUAFTFey$ViL(*gVMT5OI- ze;@+xVtEe~AAW@fz%V}xTz)8~rtOB@WGbrLXi-2rzh=_G3}uIU(fwh%O?YZPCFRao6nWTqV&F8&RI@a@?^nPKOb|QDga1a8Q?X+ZhJ}o{*BxT%?LV? z;1*15csBK^OBZr9u_x&Llv3zP-_^D78gIN>;na#dEWWpw^g@eRBYa`62}$R}D7*q3>d3HSd&Vt8-hO~}rRrVc`n z?g@}9>C$5V)4%`bEQ?69)Yvav-=GH{ScXetFFL&;5ojeu7S4+%t%vWPU9ui7d6QLr z!TJ|R(>E=sHoo4le@xRbgc`eOjZ-o^O4S=B^Cn(qHs5OS1pK10P$z+{-tGC0vDa9y zlc?C%Ebbcr^tada1my1=_i0H4GaxQI4Osn+b=<%SXtO4 zEF^0#Mx*D`@6Xcyy5C(Lz!Dc#*`zUHgx|W8rU;DRZP|}D@O}mwsRI!XcC$%{_F-Vo z9d5=XxX|ShbUiJbt(MyqsY9F8k}`=^bvp$3!yMtJ+|Qy5jRC!s8WSM?1B6$g5GfKW zmpyoG{)akSUjSW2Ht ze>t8(^)a6H4JkR`i}rjE3)2-8G8r=FA0+N z8wFAOqQTmRI#T(tZrjMzC3%1`H*n#Cre40G8t?i}?^1i{* zM1J3N)Q>yO73cr#!8AcX=UhdSey11#BVdDIBs(~3Rp?z{(~*%CjMkBpkwG^M6l{K0 zSI*tVH$Zr&rKngtSj$`xnIE(F=_~o44IoR@)$*sSi{Ju)r{O%wTufr_oWHnM=2*2W zQ-dWh_jl1p3(8v|11(w{LSSIDS9W;+!33Xi`e;XxUL#F@9$KqUznfbp@|7KQ%vEPya)ZnIWa@@n5%{DC8L<f`K^*j%^v~haqGrO?DQ!izaU?G4DBQTdb%4CiWGsY5-j@pO+x6qpEq=t zj_^c+;@XsK8MaKjS*9+iB9O90qVPYf&jXjie7+3^q3QuD-64vOw+DxZq@UDZ`WOR+ zH!>Qtqpg!BiVSKMAw%o1NGCO0#<)UvbiRCk|AVn>9cTPGr9;kWGLV2;uR3Eu(0(#Ntv1SNx4(M;_+z{BX1D2-Ca5c9Zw<7oUz8Qh`vyx zI;jM&x}Q_MJBNRa(-~DvJ?+ zWL)RWkPKbLbR|QK&jO#+ON~I}SD6Q7Ml}en6y^obuaQ68uV*d0DH@%9R`s@BM0|CY z>+&M)U&RTaR{Prw{R{&xQ{kNf0{?-iBL71fx?DtEwW{n4Nqv37m7yEaxvU31X?QsYlShH9zlxxz&it6;bJ!ty z%0di`{v3R56mbcO==;mv!)O8%jlfC|Mm|FIxiH2GSMNm7%K|bzzJwZ`EyOPnL~mLS zL(%zSvJ80zO-(;HQz~QgNGQIOcfQ*qW$Tt@YyU|W>QXx>+piF#EX8LS)VZ& znE3v}WbLvbLWGZ3`aOoMKDJw9P$r9j+3$g7%~8ZSCPgyE{)lWKVYZtpA= zWN_p@A{0+ZMqt8{00(l+eODW2p8&ALs9rz24SeT(h3~#Y2A}y z-%Vp@A3}H2d1U}qDK0?=qctmLE}9Q-}$sQJm{I;+$=9=@eQ;8(uovyVOj zIVs+)$-`m+#09z2$CkE6gLIzj*4j9<1pmSkiN0SDY> z0tzt3ksj1zZK!VyHF!2=Rx!IeS~Rxwnv`?(&M^roC=GB8_4QJK7EmNT8=VTu2b3N( z*CHYdE3OL640hL+WxMPCnD}J8k|GQ`7&TG7SAUddpb+TnCIoex81#ClIND<(K=PXf zth_|W!};9P!c#ReE? z-`F+PIU*E$J^y+FfU0B0utCX@00A+tOx3qhW0Snrz*aJHa*5839y^gAZg0K=_yKrn zRe_Eqt@dfUfkd5metf6Afn-VQ_8*`KuU|Na5+oz(upj3$={*rPehfyl9^*4#Hu7hoT@;)-E| z3=s#Sut~umK60`>OLM>ogZY0fU63+1mLV}BrMk4M+6oryNbG2pth!-LXNJ)m&aM@O zcQn~ZJ}4qaVhr7|#q**$_=-M^x!UZRDPJ(2c-DB@79W~(**}ECkp_~0yVzvj+UwZ8 zg$?HGZ4k}5wdxO1(P}~XQRLkStwt;kV`vUC!Tg$(cyN3|b&LZ*@jXvf~*a}g;klY4$El*J+j zWT1pM8Gz6UCn1K|7(t3P7W){2NH(`+S5sF>h>0mzyCQPzH884ixUusUc3*Q@%*Shu z9Vhu6*#n9Hqt6AmdbI`b8*%w(a2LSppt{@{uTlt2iW7j=It!UFKV5qqPy96w1L#pb z@m(~UZtI5WR7+SS!J(W*0je%{gCQM%KlgtSr8t4b8wkWwV9x!w&HRn;&m5T1(9kdf z^z4(6k%InvBo6&FPysc@*)a;37)PRO zwTqNp?FN6BcccV9XR}{kS{l33>e{M<1W@akY*%@-LCR$@06q`|ha@*AI$JkV5bzWf#DgV9D`$j)pHFBU7l&s{bSuZI#76Vp{f zS{eomKRD;(In-T{$(M^}t^1=vMuH6X7mX zuN95N=RdL7{MoMKG|{lK#3>eu6Wtqx*cubgh3srdp|x8R>_W9zdJ<|#u>nsu_N5JO zWq^`usK%O8_ywTgQG}S4=KPRE_lD34C5jWi5}2ExryA8zuAu)U&-5lELweE;{&?^k zP|?XRKQ@v}iC@=5Mnes&sbPxmV8g}HvHJ1j$HPymfjgA11N1%R6%{U&p=PrL2uH^U z23ubRBC9+?1KYH5w^Vg>=vY|`7f6MgyGQ3(2+GB|M~JalfHM2c`8tlSB{Kh(m1$yT zDk-LUaZC{n(vm^~McBuWA6v@&NU`$uBA7ycj7Pw8kMe$=33R3MA%};DZ}Ac46k7>C zl(qW?$?37u?lw1LJ9q&dNa1@&5ZD4+Hnlg%I;+{8Ao2B``Z{jJEgJ@b^h`&!WBcCA zV~r>GyL32!w_0&at`@+#TKL=g8*_U?0gYhb_sox-AE>7nlrb>PDO)09Q&Oy!9D=W0 z>B88NiO^JE=-vT z_nTrpn5Ee)HOR2zOmObvtSF+^A>rb5y?~QCEaBcB;ON=!z4^g+yJSsyo9tg)saDJP zhS}Tii_jIws(-E2H*9Qv4w5a^K6Gq*J@1BZixzDIpW^;@OYM4zdi2uv)?E0?HyjC^P7LgkcUJGWLwm}YM4S8D}6OSliW z5r{H3&t_}QG&#~a<)Kk?-3k467baTsNRzBMKB#vW0fF=_3Fo9ybSx0d)ZAXYD>cSp zDxn16)Hp`L8Nw7Hz%6dr>bDYUA)*Z*lb#?|%i_qnIG8DnB2^dJgkI17oW^7vdUd!k z5o3orWDW*U7b-ps+1_7lKP;Ej?7dHW7YQI^xa`QUG5X4wt}Jm#q^s@6pxZWw^W`mo z)R6_lIFRmAfSmTk9@JK9t zWp@VeQSNvNXslG8+0tY<>Wak>t=Br9uS{-N7bj!%_R?Xp{KIbdcYdT^PY#XWy5nJi zxt%6IOkH7Jvyds$=cM-r+Q?Bt0que4?J^&nO!V$wNW5y(>vtO%( zS)Qop{is5G3{N9){Rin=!m4EyUS@FywUU^APXtmFwBM=UR=OP`IW>}KM$rR@2*2A8 zHa|cS63^s>2UF0*4B94kczAeSggqPW^hQGvqd4fEk1Eg+7D~J}aN7z}lg2eM#(sCX zJJ~u>gTcp{Qe&2n)0^lqfJy@j@J;-~)-mp;O?Gr4uo*H>GeDYhJ=Y{5!7s4O0@H}J z*xXtZ{gwH$k_;(wm4#By1o7TPgA#k0%;V#{g1}eZ-J2J|0cuwlQkQ34QS%d{Ug8)q@ zj)cs~%LYxjhvTqBa#Rs7XTw|;FCs8k3Usq1jr`f<_sE`XZoTAEO2I`Zfm;ju_k_Vk>hw^c6DCog6WBh8W5f!HFosvP15RoR z`{SAJ{a= zSZuz(IQ#z}JV0Urz}zQdqyNZ>BdNdDfD(9;vHwo?{8O_D#K4ar4H^;H)(CLzBn}4aVK$;If z!>2Zk0#(f|yq-Z?x))+%i&!E2kOfB@8Eq0OerMXJmY@kFIDxJwRu7$AQ zQPH8Ws`cP+^|MZhs?;Jc{Zgo9w;WCiQ`UZDF^4J~Z=$c{vTV!=li8w3i@~?yiju>e zaIW`*oOsp;f3o_WrKQudxO(hHNfG0Ejf3p=Sj3D6BENfUYl~sJIuew)`hJW!scm^Q zW~OPQ*|Sd$-R`ydzH59B9!0Omzg)$Eq*eaWs-rwmN^xot#4ViZ4eDQXxlWBzu*Mv! zy7c_G@czAn(Zg0XlkW*!eUYc&P|Y$Rzb>_=OIo^Mop5nMwQ}=b-6$HZiYg57x6&<% zBC|1ngpEKrUzd{sqROlIDCcD^v|0{D$IJX9P?XC^gxMS%+A3C*EnnaLHA!^b1tail zprzf>JgM^S~rM?};QqH?5_w^!O)V(Q;@J~^Q%iGmio?f^<|H`3oFjYkgy5$grT8fxS*eq^KMbN2q93W zxnCb!x8P%kNs=#2c7ANR-hFkyT=j1BnpnO)Y2IG;$c9`Ksf6!$*QJlU-5pEhK5bIx zs0XPPh6-7t76T=;R5#6I3W$mE)A3s6u(GNamG{Hdg|kBh(+lYH<8V{$z|d%A z8)1JxslyEGj91TkvFTcz5K#Hl#e0eE8=wM@HlXs);B6TmLM9)*_(;8--N{ET$8+^= zKfxo$+#De6Y7TOHKiq$5K<)Pe+kbu-y0bSl+Oe#KxHcY0Ur5S?HiW|ftqjDfsfilG zKJ}q$T=l|@5XLV>66N3sU~fvL#rI;;jldfiGEUSHCZ4itqT;i<@_Lzd%r_iF&+?UqYxdtpEpB;7`ims^VN_1Ot4gztrs zq+}bTvFLU~uCwg3;xT(_29_vtqsdV;wrx|2XwJTqr6@G9%}Ctv#jIoP)oLw;zu{JY+Z5>G zcJIDw5-85~&f2HvCGRuPMN@XB(yTq-)uMjRm7il1<>Uw|XQ^3gIqy520BBv%f< zIHI2m{9G`Xq)I&Es8PvMZE95ZoY$YDUex00uKHpaeJwcyVtc>6udsEb6(K5<>}6ftnFq{&WdzV3nBBm?eBYG&OTyBq87fS0o zs87w;<$vXSg z-7R-D>qTBLz)v;MK-MP1B>@?W;!7^7oh;aiiDcwO_^%w1oMZ*23J+)!QYu`k9h3KM zsT+--&hbHk3wYhmpu7(SSqtkR(sXUx^XrY%bxUTIa)`fmkuJQ+-w-R$u* z@0NID-E*q56XET_%;HO$y*-+~IFVyXJ{C0y5y~#?0F7VSh0 z(+rAL_2BKPDH3(-P4cECC1d4b@P#8tD&&4G5#10%_WW88=h0Xl4Y`# zM9XcroA$WVt;L=3Zf)rnHrRt}#(Ey)&~C;Q8Nq>K|DV77D-oG3=oe^EWEQjiKcD!| zi&*GMc@`Lw+`mL?{vXHbFHa~S#HhqF?C^gxEPpa5ei9I76e$ofQ~!QLpa>}|8-psv zi1Xi(eisQC3#ts*u-U)gAW#Cn9`2(|4bH#UtcL=M6-wrB#PaVqkf?yK4-6$!NBDnM z3$TDeQ5Zr%;6-8un6Uo+2J}bZ>xD#OY5pVHlq8%LB5@8uld`;=>p()TnljigIhsJ} zyp!A3rp3fuo2OoD5)(5m*wbsdI3yy{|Ahgl{mE_?0d(zLcXz7vo#{IBNkc~sQQeHO z(TT(YnG{JUC#7MT-ka7+j)BD&-pUEuFwzD&4S%h-hHMk%s-I@TX7N zO1PylcRN3<7iwz}rF?w+>&&8+3dgPe-Lqig5>>_Z^|NI15$t51TlXN^8he*(Lwy3q?X}^I$GY-lY-A)s-L{>ao5^Ky z!#~??^IBD+)y3Ls*X3l9_O$)B`e>zb?S^3>z-6+_DcNO8X$kx;UUe<*hi1cYIG}bQ zo6fa(!jAC5{;HXLyS?Dhzl}aR+#7^Zc)t$@ih*(a<1WnUG=a)>#a$|b`>ZR?{*`#T z(3QUVI^oc2fr^UC=*09jHlLqFeUo+T|`9J7sxQ z&|dJj93l@91KMG1VTPA<0*yAABj3H2tIL|>t@U(=w&oHo1ITH|?xz*DPuTrP7+GeG zG+K4Su1Om_T*HsohqN=wkAr(Z0RWSP5U|T}anasWnMn*{z0?Gbb^o5dlq_szB~+%R;$jf_-M6u!Gz+a!6BmU=3xnIe3B5{ z85}KFyi}z!UN@n9QgkN(aXHs>Z+hm@OvwH|G+q|Ie@&%g9`R>~w}(4i>-nmiG&(Ll zu~=~lpR2U2meA=kfBbo)6#>oyX7PbHM|`QrnM^VNTvJW;a^aG>f|tgCvt`&`zgQ z%Hzo_t18R*aqDV%qA6tQyyGqvmKLT<)$H%~kiJB72)AoeW_;iXriQ`m|O!oNFgVhxotY95{k~3>+zHOnoTo(mD#Kpb0Rtv z#d8qHTEeOy;bIP**vvSx61DKn7m3RmwXqpX(P3bZ6lNblheNW$NP{o|+gN3^Bm*Rd35yoqFdQkSQPpn$UGTwApM|src!hB*t;LHJ}i& z2x|FXq*cn)XcY^k(H@JP-!UPM0D8IkQA{YnAPy_@vo3ZBU?g8bgm4>;e%miON?ewr z&bG4+%Zq#TOJ`!p1*lTTJ;r{D58+~->e+B!L-KQ3{#pP;FX_#Swe~;|CBpZ9!mm+i zmp(VBUuf;{e|4Ac!sTtzd}a9JpA0^LdU3MSI`Zu6QwGTSMKOor3?h-Pe`dhzfcq@6oLh$NX88>+W791O346y9ZXN=TR&8c27} z;WdQKLfDvP!miVvFJCJ%o&Ko{T;lb@T3z(d{k%wrCF=z#D`{u)19j7)-7UIe`B6v$ z{@15cy%r*;5ZSAEDn!&<=qAlmq}E@+jvwGnXRJGf=+Q>B$o@Vzn(HvTD123c`Gqq7 zF5tJn=azWnl`65s0E-AQPI%Z_x@W^ni_?DP!w1U`o+bNEoXyQOhJ&)iMK65;*i24C z_J%^f>%M%%XFptFotDwH>~!FXk;(OcUdtX*?$LBTU_g7+6H=>`O=k}Hdca3uDOmkt zQs;8z;=@IO`u2=9Ghd?m@yir_Xfwp}RBr2arBILy8}St1f?9wy;DC!VLBe}o*B-@B zI&MEbyDqFC4iQJaXaf`YDr{+}sT28EFHKkOzpz>cX2qV|aGUJ89(H)YyE=cW>|mz5 zoI!*LM>does>lE2B#ku+L7-SD%coDG@~%f3$MC*uzcA{%7+!|HXOzmj^`I!2q;jza zYp=2@Q5Xy5I z`(;Ce*ZF$r7TTZZSwc|7F$NZQ-uOZuw6^P!V6>;&X&H7x_40-5-{Aw&-kAeKOli}4 z5tL~=7+^vu0|wquK7j}7-vFeVk{bfm1jRQsRJTAFIaO7ME_bzO{@m;MJKdFkb{G+# z?I$1hTTg|Zpk6yx#KU&t_QSK=@D=Rr-W+C3K90~2B`H>U*Yz_fOH74EJ_XAbLX2#U zR+|8i420Q4df=*7Ki|}QE0JMy= z&2^ynIk2Gu2N=GR*az!f1Nn6FVWjX+ek3LFCffjOJav2@CU*R%P*PYo>c>%-@B3O6oh}` z2=0*%gV~%wbxL`u+d{|8T8+T>=24YP?45>_1c52qeo`z*BR*uenwDZXJ8?waL&}Yy zbQ0eT9^hK@E(5kjS?+<}goJz~1sGSG?kfK#UHc9kqL6g5`vv~Q9-f?5Wy$Ayq@3`` zz&^W=c(}Ob1#CC-5psrc4&NA$oy?Ad?1j!RJY>Lt0b7e9a5%#lzH0au^aDy*7-8@s z�dbXD5?++_d7?3t>r*noVuoWmq&@yz-iU3AC!v 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 TwY7r){3-pRdZ*~NX~_QpDeXV6 diff --git a/src/Mode-Dest-TOD/requirements.txt b/src/Mode-Dest-TOD/requirements.txt deleted file mode 100644 index cb569c0..0000000 --- a/src/Mode-Dest-TOD/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -numpy -scipy -pandas -addict>=2.2 -larch diff --git a/src/Mode-Dest-TOD/setup.py b/src/Mode-Dest-TOD/setup.py deleted file mode 100644 index 26db817..0000000 --- a/src/Mode-Dest-TOD/setup.py +++ /dev/null @@ -1,62 +0,0 @@ -""" -CMAP Trip-based Model Code -""" - -# Always prefer setuptools over distutils -from setuptools import setup, find_packages -# To use a consistent encoding -from codecs import open -import os -import re - -here = os.path.abspath(os.path.dirname(__file__)) - -def version(path): - """Obtain the packge version from a python file e.g. pkg/__init__.py - See . - """ - with open(os.path.join(here, path), encoding='utf-8') as f: - version_file = f.read() - version_match = re.search(r"""^__version__ = ['"]([^'"]*)['"]""", - version_file, re.M) - if version_match: - return version_match.group(1) - raise RuntimeError("Unable to find version string.") - -VERSION = version('cmap_modedest/__init__.py') - -# Get the long description from the README file -with open(os.path.join(here, 'README.md'), encoding='utf-8') as f: - long_description = f.read() - -with open('requirements.txt') as f: - requirements_lines = f.readlines() -install_requires = [r.strip() for r in requirements_lines] - -setup( - name='cmap_modedest', - version=VERSION, - - description='CMAP Trip-based model', - long_description=long_description, - - url='https://github.com/CMAP-REPOS/cmap_trip-based_model', - - # You can just specify the packages manually here if your project is - # simple. Or you can use find_packages(). - packages=find_packages(exclude=['contrib', 'docs', 'tests']), - - # List run-time dependencies here. These will be installed by pip when - # your project is installed. For an analysis of "install_requires" vs pip's - # requirements files see: - # https://packaging.python.org/en/latest/requirements.html - - install_requires=install_requires, - - entry_points={ - "console_scripts": [ - "cmap_modedest = cmap_modedest.__main__:main" - ] - }, - -) diff --git a/src/Mode-Dest-TOD/sharrow/.idea/sharrow_lite.iml b/src/Mode-Dest-TOD/sharrow/.idea/sharrow_lite.iml deleted file mode 100644 index 32effd1..0000000 --- a/src/Mode-Dest-TOD/sharrow/.idea/sharrow_lite.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/src/Mode-Dest-TOD/sharrow/LICENSE b/src/Mode-Dest-TOD/sharrow/LICENSE deleted file mode 100644 index 7026335..0000000 --- a/src/Mode-Dest-TOD/sharrow/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2021, Jeffrey Newman -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/Mode-Dest-TOD/sharrow/README.md b/src/Mode-Dest-TOD/sharrow/README.md deleted file mode 100644 index 285f345..0000000 --- a/src/Mode-Dest-TOD/sharrow/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# sharrow - -This pre-release library is independently developed from the CMAP trip-based model, -and is included here to ensure that the CMAP model links against the correct version. \ No newline at end of file diff --git a/src/Mode-Dest-TOD/sharrow/requirements.txt b/src/Mode-Dest-TOD/sharrow/requirements.txt deleted file mode 100644 index 25ff221..0000000 --- a/src/Mode-Dest-TOD/sharrow/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -numpy>=1.19 -pandas>=1.2 -pyarrow>=3.0.0 -xarray>=0.17.0 -numba>=0.53 diff --git a/src/Mode-Dest-TOD/sharrow/setup.py b/src/Mode-Dest-TOD/sharrow/setup.py deleted file mode 100644 index 6fac007..0000000 --- a/src/Mode-Dest-TOD/sharrow/setup.py +++ /dev/null @@ -1,64 +0,0 @@ - -# Always prefer setuptools over distutils -from setuptools import setup, find_packages -# To use a consistent encoding -from codecs import open -from os import path -import os -import re -from setuptools import setup, find_packages - -def version(path): - """Obtain the packge version from a python file e.g. pkg/__init__.py - See . - """ - here = os.path.abspath(os.path.dirname(__file__)) - with open(os.path.join(here, path), encoding='utf-8') as f: - version_file = f.read() - version_match = re.search(r"""^__version__ = ['"]([^'"]*)['"]""", - version_file, re.M) - if version_match: - return version_match.group(1) - raise RuntimeError("Unable to find version string.") - -VERSION = version('sharrow/__init__.py') - -here = path.abspath(path.dirname(__file__)) - -# Get the long description from the README file -with open(path.join(here, 'README.md'), encoding='utf-8') as f: - long_description = f.read() - -with open('requirements.txt') as f: - requirements_lines = f.readlines() -install_requires = [r.strip() for r in requirements_lines] - -setup( - name='sharrow', - version=VERSION, - - description='shared data formats for transportation modeling', - long_description=long_description, - - # The project's main homepage. - url='https://github.com/jpn--/sharrow', - - # Author details - author='Jeffrey Newman', - author_email='jeff@newman.me', - - # Choose your license - license='GPLv3', - - # See https://pypi.python.org/pypi?%3Aaction=list_classifiers - classifiers=[ - 'Programming Language :: Python :: 3.9', - ], - - # You can just specify the packages manually here if your project is - # simple. Or you can use find_packages(). - packages=find_packages(exclude=['contrib', 'docs', 'tests']), - - install_requires=install_requires, - -) diff --git a/src/Mode-Dest-TOD/sharrow/sharrow/__init__.py b/src/Mode-Dest-TOD/sharrow/sharrow/__init__.py deleted file mode 100644 index d168061..0000000 --- a/src/Mode-Dest-TOD/sharrow/sharrow/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -__version__ = "2021.4" - -import os -from .interface import SharedData -from .dataset import Dataset -from .local_dir import local_cache -from .tables import concat_tables, Table -from xarray import DataArray - -try: - _pro = int(os.environ.get("SHARROW_PRO", "1")) -except: - _pro = True - -if _pro: - try: - from sharrow_pro import * - except ImportError: - pass diff --git a/src/Mode-Dest-TOD/sharrow/sharrow/dataset.py b/src/Mode-Dest-TOD/sharrow/sharrow/dataset.py deleted file mode 100644 index 612ad8c..0000000 --- a/src/Mode-Dest-TOD/sharrow/sharrow/dataset.py +++ /dev/null @@ -1,457 +0,0 @@ -import numpy as np -import xarray as xr -import pandas as pd - - -def one_based(n): - return pd.RangeIndex(1, n + 1) - - -def zero_based(n): - return pd.RangeIndex(0, n) - - -class Dataset(xr.Dataset): - - __slots__ = () - - def update(self, other): - super().update(other) - if isinstance(other, Dataset): - match_names = self.match_names - match_names.update(other.match_names) - self.match_names = match_names - return self # deprecated return for consistency until xarray 0.19 - - @classmethod - def from_table( - cls, tbl, index_name="index", index=None, - ): - """ - Convert a pyarrow.Table into an xarray.Dataset - - Parameters - ---------- - tbl : Table - Table from which to use data and indices. - index_name : str, default 'index' - This name will be given to the default dimension index, if - none is given. Ignored if `index` is given explicitly. - index : Index-like, optional - Use this index instead of a default RangeIndex. - - Returns - ------- - New Dataset. - """ - if len(set(tbl.column_names)) != len(tbl.column_names): - raise ValueError("cannot convert Table with non-unique columns") - if index is None: - index = pd.RangeIndex(len(tbl), name=index_name) - else: - if len(index) != len(tbl): - raise ValueError( - f"length of index ({len(index)}) does not match length of table ({len(tbl)})" - ) - if isinstance(index, pd.MultiIndex) and not index.is_unique: - raise ValueError( - "cannot attach a non-unique MultiIndex and convert into xarray" - ) - arrays = [ - (tbl.column_names[n], np.asarray(tbl.column(n))) - for n in range(len(tbl.column_names)) - ] - result = cls() - if isinstance(index, pd.MultiIndex): - dims = tuple( - name if name is not None else "level_%i" % n - for n, name in enumerate(index.names) - ) - for dim, lev in zip(dims, index.levels): - result[dim] = (dim, lev) - else: - index_name = index.name if index.name is not None else "index" - dims = (index_name,) - result[index_name] = (dims, index) - - result._set_numpy_data_from_dataframe(index, arrays, dims) - return result - - @classmethod - def from_omx( - cls, omx, index_names=("otaz", "dtaz"), indexes="one-based", renames=None, - ): - # handle both larch.OMX and openmatrix.open_file versions - if "larch" in type(omx).__module__: - omx_data = omx.data - omx_shape = omx.shape - else: - omx_data = omx.root["data"] - omx_shape = omx.shape() - - arrays = {} - if renames is None: - for k in omx_data._v_children: - arrays[k] = omx_data[k][:] - elif isinstance(renames, dict): - for new_k, old_k in renames.items(): - arrays[new_k] = omx_data[old_k][:] - else: - for k in renames: - arrays[k] = omx_data[k][:] - d = { - "dims": index_names, - "data_vars": {k: {"dims": index_names, "data": arrays[k]} for k in arrays}, - } - if indexes == "one-based": - indexes = { - index_names[0]: one_based(omx_shape[0]), - index_names[1]: one_based(omx_shape[1]), - } - elif indexes == "zero-based": - indexes = { - index_names[0]: zero_based(omx_shape[0]), - index_names[1]: zero_based(omx_shape[1]), - } - if indexes is not None: - d["coords"] = { - index_name: {"dims": index_name, "data": index} - for index_name, index in indexes.items() - } - return cls.from_dict(d) - - @classmethod - def from_amx( - cls, amx, index_names=("otaz", "dtaz"), indexes="one-based", renames=None, - ): - arrays = {} - if renames is None: - for k in amx.list_matrices(): - arrays[k] = amx[k][:] - elif isinstance(renames, dict): - for new_k, old_k in renames.items(): - arrays[new_k] = amx[old_k] - else: - for k in renames: - arrays[k] = amx[k] - d = { - "dims": index_names, - "data_vars": {k: {"dims": index_names, "data": arrays[k]} for k in arrays}, - } - if indexes == "one-based": - indexes = {index_names[i]: "1" for i in range(len(index_names))} - elif indexes == "zero-based": - indexes = {index_names[i]: "0" for i in range(len(index_names))} - if isinstance(indexes, (list, tuple)): - indexes = dict(zip(index_names, indexes)) - if isinstance(indexes, dict): - for n, i in enumerate(index_names): - if indexes.get(i) == "1": - indexes[i] = one_based(amx.shape[n]) - elif indexes.get(i) == "0": - indexes[i] = zero_based(amx.shape[n]) - if indexes is not None: - d["coords"] = { - index_name: {"dims": index_name, "data": index} - for index_name, index in indexes.items() - } - return cls.from_dict(d) - - @classmethod - def from_zarr(cls, store, *args, **kwargs): - return cls(xr.open_zarr(store, *args, **kwargs)) - - def to_zarr(self, *args, **kwargs): - """ - Write dataset contents to a zarr group. - - Parameters - ---------- - store : MutableMapping, str or Path, optional - Store or path to directory in file system. If given with a - ".zarr.zip" extension, and keyword arguments limited to 'mode' and - 'compression', then a ZipStore will be created, populated, and then - immediately closed. - chunk_store : MutableMapping, str or Path, optional - Store or path to directory in file system only for Zarr array chunks. - Requires zarr-python v2.4.0 or later. - mode : {"w", "w-", "a", None}, optional - Persistence mode: "w" means create (overwrite if exists); - "w-" means create (fail if exists); - "a" means override existing variables (create if does not exist). - If ``append_dim`` is set, ``mode`` can be omitted as it is - internally set to ``"a"``. Otherwise, ``mode`` will default to - `w-` if not set. - synchronizer : object, optional - Zarr array synchronizer. - group : str, optional - Group path. (a.k.a. `path` in zarr terminology.) - encoding : dict, optional - Nested dictionary with variable names as keys and dictionaries of - variable specific encodings as values, e.g., - ``{"my_variable": {"dtype": "int16", "scale_factor": 0.1,}, ...}`` - compute : bool, optional - If True write array data immediately, otherwise return a - ``dask.delayed.Delayed`` object that can be computed to write - array data later. Metadata is always updated eagerly. - consolidated : bool, optional - If True, apply zarr's `consolidate_metadata` function to the store - after writing metadata. - append_dim : hashable, optional - If set, the dimension along which the data will be appended. All - other dimensions on overriden variables must remain the same size. - region : dict, optional - Optional mapping from dimension names to integer slices along - dataset dimensions to indicate the region of existing zarr array(s) - in which to write this dataset's data. For example, - ``{'x': slice(0, 1000), 'y': slice(10000, 11000)}`` would indicate - that values should be written to the region ``0:1000`` along ``x`` - and ``10000:11000`` along ``y``. - - Two restrictions apply to the use of ``region``: - - - If ``region`` is set, _all_ variables in a dataset must have at - least one dimension in common with the region. Other variables - should be written in a separate call to ``to_zarr()``. - - Dimensions cannot be included in both ``region`` and - ``append_dim`` at the same time. To create empty arrays to fill - in with ``region``, use a separate call to ``to_zarr()`` with - ``compute=False``. See "Appending to existing Zarr stores" in - the reference documentation for full details. - compression : int, optional - Only used for ".zarr.zip" files. By default zarr uses blosc - compression for chunks, so adding another layer of compression here - is typically redundant. - - References - ---------- - https://zarr.readthedocs.io/ - - Notes - ----- - Zarr chunking behavior: - If chunks are found in the encoding argument or attribute - corresponding to any DataArray, those chunks are used. - If a DataArray is a dask array, it is written with those chunks. - If not other chunks are found, Zarr uses its own heuristics to - choose automatic chunk sizes. - """ - if ( - len(args) == 1 - and isinstance(args[0], str) - and args[0].endswith(".zarr.zip") - ): - if {"compression", "mode"}.issuperset(kwargs.keys()): - import zarr - - with zarr.ZipStore(args[0], **kwargs) as store: - self.to_zarr(store) - return - return super().to_zarr(*args, **kwargs) - - def iat(self, *, _names=None, _load=False, _index_name=None, **idxs): - loaders = {} - if _index_name is None: - _index_name = "index" - for k, v in idxs.items(): - loaders[k] = xr.DataArray(v, dims=[_index_name]) - if _names: - ds = self[_names] - else: - ds = self - if _load: - ds = ds.load() - return ds.isel(**loaders) - - def at(self, *, _names=None, _load=False, _index_name=None, **idxs): - loaders = {} - if _index_name is None: - _index_name = "index" - for k, v in idxs.items(): - loaders[k] = xr.DataArray(v, dims=[_index_name]) - if _names: - ds = self[_names] - else: - ds = self - if _load: - ds = ds.load() - return ds.sel(**loaders) - - def at_df(self, df): - """ - Extract values by label on the coordinates indicated by columns of a DataFrame. - - Parameters - ---------- - df : pd.DataFrame or Mapping[str, array-like] - The columns (or keys) of `df` should match the named dimensions of - this Dataset. The resulting extracted DataFrame will have one row - per row of `df`, columns matching the data variables in this dataset, - and each value is looked up by the labels. - - Returns - ------- - pd.DataFrame - """ - result = self.at(**df).reset_coords(drop=True).to_dataframe() - if isinstance(df, pd.DataFrame): - result.index = df.index - return result - - def iat_df(self, df): - """ - Extract values by position on the coordinates indicated by columns of a DataFrame. - - Parameters - ---------- - df : pd.DataFrame or Mapping[str, array-like] - The columns (or keys) of `df` should match the named dimensions of - this Dataset. The resulting extracted DataFrame will have one row - per row of `df`, columns matching the data variables in this dataset, - and each value is looked up by the positions. - - Returns - ------- - pd.DataFrame - """ - result = self.iat(**df).reset_coords(drop=True).to_dataframe() - if isinstance(df, pd.DataFrame): - result.index = df.index - return result - - def select_and_rename(self, name_dict=None, **names): - """ - Select and rename variables from this Dataset - - Parameters - ---------- - name_dict, **names: dict - The keys or keyword arguments give the current names of the - variables that will be selected out of this Dataset. The values - give the new names of the same variables in the resulting Dataset. - - Returns - ------- - Dataset - """ - if name_dict is None: - name_dict = names - else: - name_dict.update(names) - return self[list(name_dict.keys())].rename(name_dict) - - def squash_index(self, indexes_dict=None, *, set_match_names=True, **indexes): - if indexes_dict is None: - indexes_dict = indexes - else: - indexes_dict.update(indexes) - ds = self.reset_index(list(indexes_dict.keys()), drop=True) - ds = ds.rename(**indexes_dict) - if set_match_names: - ds = ds.set_match_names({v: v for v in indexes_dict.values()}) - return ds - - def _repr_html_(self): - html = super()._repr_html_() - html = html.replace("xarray.Dataset", "sharrow.Dataset") - return html - - def __repr__(self): - r = super().__repr__() - r = r.replace("xarray.Dataset", "sharrow.Dataset") - return r - - @property - def match_names(self): - """ - A mapping - - If a match_name target begins with an '@', the match is a dynamic - match, where the particular index-position values are created based - on data in the main or other source[s]. This allows for match columns - that do not exist yet, including columns where the key column exists - but is a label-based or offset-based match that needs to be processed - into index-position values. - - """ - result = {} - for k in self.attrs.keys(): - if k.startswith("match_names_"): - result[k[12:]] = self.attrs.get(k) - for k in self.indexes.keys(): - if k not in result: - result[k] = None - return result - - @match_names.setter - def match_names(self, names): - if names is None: - existing_match_name_keys = list(self.match_names.keys()) - for k in existing_match_name_keys: - del self.attrs[k] - return - if isinstance(names, str): - dims = list(self.dims.keys()) - assert len(dims) == 1 - names = {dims[0]: names} - for k in names.keys(): - if k not in self.dims: - raise ValueError(f"'{k}' not in dims") - for k, v in names.items(): - if v is not None: - self.attrs[f"match_names_{k}"] = v - elif f"match_names_{k}" in self.attrs: - del self.attrs[f"match_names_{k}"] - - def set_match_names(self, names): - """ - Create a copy of this dataset with the given match_names for flowing. - - Parameters - ---------- - names : Sequence[str] or Mapping[str,str] - - Returns - ------- - sharrow.shared.Dataset - """ - result = self.copy() - result.match_names = names - return result - - def keep_dims(self, keep_dims, *, errors="raise"): - """ - Keep only certain dimensions and associated variables from this dataset. - - Parameters - ---------- - keep_dims : hashable or iterable of hashable - Dimension or dimensions to keep. - errors : {"raise", "ignore"}, optional - If 'raise' (default), raises a ValueError error if any of the - dimensions passed are not in the dataset. If 'ignore', any given - labels that are in the dataset are dropped and no error is raised. - - Returns - ------- - obj : Dataset - The dataset without the given dimensions (or any variables - containing those dimensions) - errors : {"raise", "ignore"}, optional - If 'raise' (default), raises a ValueError error if - any of the dimensions passed are not - in the dataset. If 'ignore', any given dimensions that are in the - dataset are dropped and no error is raised. - """ - if isinstance(keep_dims, str): - keep_dims = {keep_dims} - else: - keep_dims = set(keep_dims) - all_dims = set(self.dims) - if errors == "raise": - missing_dims = keep_dims - all_dims - if missing_dims: - raise ValueError( - "Dataset does not contain the dimensions: %s" % missing_dims - ) - return self.drop_dims([i for i in all_dims if i not in keep_dims]) diff --git a/src/Mode-Dest-TOD/sharrow/sharrow/interface.py b/src/Mode-Dest-TOD/sharrow/sharrow/interface.py deleted file mode 100644 index f8fcd92..0000000 --- a/src/Mode-Dest-TOD/sharrow/sharrow/interface.py +++ /dev/null @@ -1,90 +0,0 @@ -import os -import sys -import importlib -import hashlib -import base64 -import pandas as pd -import pyarrow as pa -import xarray as xr - -from .dataset import Dataset - - -class SharedData: - def __init__( - self, main=None, extra_funcs=(), extra_vars=None, **datasets, - ): - """ - SharedData establishes a domain to evaluate data flows. - - Parameters - ---------- - main : Dataset or Table or DataFrame or Sequence[str], optional - This is the main set of data that defines this object. - Only the main data can be replaced with similarly formatted - other data when flowing results. - **datasets : Dict[str, Dataset] - Other `Dataset` inputs for flowing data can be provided. - The flow closes on any other data (i.e. it is immutable and cannot - be replaced when flowing). Although "main" can be certain non-Dataset - types (i.e. a DataFrame or a Table), datasets must be - given as `Dataset` objects with appropriate `match_names` set. - """ - self.main = main - self.datasets = datasets - try: - from sharrow_pro import Table - except ImportError: - table_types = (pa.Table,) - else: - table_types = (pa.Table, Table) - for k in self.datasets: - arr = self.datasets[k] - if not isinstance(arr, Dataset): - if isinstance(arr, pd.DataFrame): - arr = Dataset.from_dataframe(arr) - elif isinstance(arr, table_types): - arr = Dataset.from_table(arr) - elif isinstance(arr, xr.Dataset): - arr = Dataset(arr) - self.datasets[k] = arr - - def setup_flow( - self, definition_spec, cache_dir, name, dtype="float32", - ): - """ - - Parameters - ---------- - definition_spec : Dict[str,str] - Gives the names and definitions for the columns to - create in our generated table. - - Returns - ------- - module - """ - if not os.path.isdir(cache_dir): - raise NotADirectoryError(cache_dir) - if not os.path.isdir(os.path.join(cache_dir, name)): - raise ModuleNotFoundError(name) - if not os.path.isfile(os.path.join(cache_dir, name, "__init__.py")): - raise ModuleNotFoundError(name) - - sys.path.insert(0, str(cache_dir)) - importlib.invalidate_caches() - module = importlib.import_module(name) - sys.path = sys.path[1:] - module.set_shared_data(**self.datasets) - - if definition_spec and hasattr(module, 'defs_hash'): - defs_hash = hashlib.md5() - for k, v in definition_spec.items(): - defs_hash.update(k.encode("utf8")) - defs_hash.update(v.encode("utf8")) - if module.defs_hash != (base64.b32encode(defs_hash.digest())).decode(): - raise ValueError( - "definitions are not consistent with precompiled data flows" - ) - - return module diff --git a/src/Mode-Dest-TOD/sharrow/sharrow/local_dir.py b/src/Mode-Dest-TOD/sharrow/sharrow/local_dir.py deleted file mode 100644 index cc40ffd..0000000 --- a/src/Mode-Dest-TOD/sharrow/sharrow/local_dir.py +++ /dev/null @@ -1,6 +0,0 @@ -import os -import inspect - - -def local_cache(dirname="__sc"): - return os.path.join(os.path.dirname(inspect.stack()[1][1]), dirname,) diff --git a/src/Mode-Dest-TOD/sharrow/sharrow/logging.py b/src/Mode-Dest-TOD/sharrow/sharrow/logging.py deleted file mode 100644 index c3bb39f..0000000 --- a/src/Mode-Dest-TOD/sharrow/sharrow/logging.py +++ /dev/null @@ -1,142 +0,0 @@ -import logging -import sys -from contextlib import contextmanager -import time - -LOGGER_NAME = "SHARROW" -FILE_LOG_FORMAT = "%(name)s.%(levelname)s: %(message)s" -CONSOLE_LOG_FORMAT = "[%(asctime)s] %(name)s.%(levelname)s: %(message)s" -DEFAULT_LOG_LEVEL = logging.DEBUG - - -def timesize_single(t): - if t < 60: - return f"{t:.2f}s" - elif t < 3600: - return f"{t / 60:.2f}m" - elif t < 86400: - return f"{t / 3600:.2f}h" - else: - return f"{t / 86400:.2f}d" - - -def timesize_stack(t): - if t < 60: - return f"{t:.2f}s" - elif t < 3600: - return f"{t // 60:.0f}m {timesize_stack(t % 60)}" - elif t < 86400: - return f"{t // 3600:.0f}h {timesize_stack(t % 3600)}" - else: - return f"{t // 86400:.0f}d {timesize_stack(t % 86400)}" - - -def log_to_console(level=None): - if level is None: - level = DEFAULT_LOG_LEVEL - - logger = logging.getLogger(LOGGER_NAME) - - # avoid creation of multiple stream handlers for logging to console - for entry in logger.handlers: - if (isinstance(entry, logging.StreamHandler)) and ( - entry.formatter._fmt == CONSOLE_LOG_FORMAT - ): - return logger - - console_handler = logging.StreamHandler(stream=sys.stderr) - console_handler.setLevel(level) - console_handler.setFormatter(logging.Formatter(CONSOLE_LOG_FORMAT)) - logger.addHandler(console_handler) - if level < logger.getEffectiveLevel(): - logger.setLevel(level) - - return logger - - -def log_to_file(filename, level=None): - if level is None: - level = DEFAULT_LOG_LEVEL - - logger = logging.getLogger(LOGGER_NAME) - - # avoid creation of multiple file handlers for logging to the same file - for entry in logger.handlers: - if (isinstance(entry, logging.FileHandler)) and ( - entry.baseFilename == filename - ): - return logger - - file_handler = logging.FileHandler(filename) - file_handler.setLevel(level) - file_handler.setFormatter(logging.Formatter(FILE_LOG_FORMAT)) - logger.addHandler(file_handler) - - return logger - - -logger = log = log_to_console() - - -@contextmanager -def timing_log(label=""): - start_time = time.time() - log.critical(f"
GvNRh}tfSiy-@C7jK10 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

p1HTKwF76B8k@aELSsCkWb%0FMqe6m~9WJ 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≪F!Tde2a25=W1Os*tPvS@Sh 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

T|>o#Ml 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

Y{@GQM&ZSP-p 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