diff --git a/.gitignore b/.gitignore index 06b0a8e..ed0389f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,10 @@ # 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 @@ -11,6 +15,7 @@ Database/tg/fortran/HH_IN.TXT Database/tg/fortran/POPSYN_HH.CSV Database/tg/fortran/GQ_IN.TXT Database/tg/fortran/ATTR_IN.TXT +Database/tg/fortran/airport_sz.csv Database/tg/fortran/SCHOOL_IN.CSV Database/tg/fortran/wfhmodule/indusmix.csv @@ -34,10 +39,6 @@ Database/tg/fortran/wfhmodule/synthetic_*.zip Database/TG_HHENUM_OUTPUT.TXT Database/tg/fortran/HH_WFH_STATUS.CSV Database/tg/fortran/SIMULATED_HHVEH.TXT -Database/tg/fortran/households_selected_noWFH_enumeration_count.csv -Database/tg/fortran/households_selected_WFH_enumeration_count.csv -Database/tg/fortran/missing_hhtype.csv -Database/tg/fortran/trip_generation_model_log.txt # Ignore files generated by prep macros. Database/*_DISTR.TXT diff --git a/Database/Submit_Full_Regional_Model_SOLA.bat b/Database/Submit_Full_Regional_Model_SOLA.bat index 370a534..1e9ba53 100644 --- a/Database/Submit_Full_Regional_Model_SOLA.bat +++ b/Database/Submit_Full_Regional_Model_SOLA.bat @@ -33,23 +33,34 @@ for /f "eol=# skip=1 tokens=2 delims=:" %%z in (batch_file.yaml) do (set ver=%%z :break0 for /f "eol=# skip=2 tokens=2 delims=:" %%a in (batch_file.yaml) do (set val=%%a & goto break1) :break1 -for /f "eol=# skip=5 tokens=2 delims=:" %%e in (batch_file.yaml) do (set selLinkFile=%%e & goto break2) +for /f "eol=# skip=4 tokens=2 delims=:" %%b in (batch_file.yaml) do (set wfhFile=%%b & goto break2) :break2 -for /f "eol=# skip=8 tokens=2* delims=:" %%g in (batch_file.yaml) do (set transactFilePath1=%%g & set transactFilePath2=%%h & goto break3) +for /f "eol=# skip=5 tokens=2 delims=:" %%c in (batch_file.yaml) do (set wfh=%%c & goto break3) :break3 -for /f "eol=# skip=10 tokens=2 delims=:" %%f in (batch_file.yaml) do (set transitAsmt=%%f & goto break4) +for /f "eol=# skip=6 tokens=2 delims=:" %%d in (batch_file.yaml) do (set tc14=%%d & goto break4) :break4 -for /f "eol=# skip=12 tokens=2 delims=:" %%i in (batch_file.yaml) do (set selLineFile=%%i & goto break5) +for /f "eol=# skip=9 tokens=2 delims=:" %%e in (batch_file.yaml) do (set selLinkFile=%%e & goto break5) :break5 -for /f "eol=# skip=14 tokens=2 delims=:" %%j in (batch_file.yaml) do (set utilFile=%%j & goto break6) +for /f "eol=# skip=12 tokens=2* delims=:" %%g in (batch_file.yaml) do (set transactFilePath1=%%g & set transactFilePath2=%%h & goto break6) :break6 -for /f "eol=# skip=16 tokens=2 delims=:" %%k in (batch_file.yaml) do (set UrbansimFile=%%k & goto break7) +for /f "eol=# skip=14 tokens=2 delims=:" %%f in (batch_file.yaml) do (set transitAsmt=%%f & goto break7) :break7 -for /f "eol=# skip=18 tokens=2 delims=:" %%l in (batch_file.yaml) do (set RSPrun=%%l & goto break8) +for /f "eol=# skip=16 tokens=2 delims=:" %%i in (batch_file.yaml) do (set selLineFile=%%i & goto break8) :break8 +for /f "eol=# skip=18 tokens=2 delims=:" %%j in (batch_file.yaml) do (set utilFile=%%j & goto break9) +:break9 +for /f "eol=# skip=20 tokens=2 delims=:" %%k in (batch_file.yaml) do (set UrbansimFile=%%k & goto break10) +:break10 +for /f "eol=# skip=22 tokens=2 delims=:" %%l in (batch_file.yaml) do (set RSPrun=%%l & goto break11) +:break11 +for /f "eol=# skip=25 tokens=2 delims=:" %%m in (batch_file.yaml) do (set srcCode=%%m & goto break12) +:break12 set ver=%ver:~1,5% set val=%val:~1,3% +set wfhFile=%wfhFile:~1% +set wfh=%wfh:~1% +set tc14=%tc14:~1% set selLinkFile=%selLinkFile:~1% set transitAsmt=%transitAsmt:~1,1% rem Construct complete transit file path @@ -61,6 +72,7 @@ set selLineFile=%selLineFile:~1% set utilFile=%utilFile:~1,1% set UrbansimFile=%UrbansimFile:~1,1% set RSPrun=%RSPrun:~1,1% +set srcCode=%srcCode:~1,1% REM -- Count number of select link files -- set tempCnt=0 for %%a in (%selLinkFile:None=%) do set /a tempCnt+=1 @@ -84,6 +96,9 @@ cd Database @echo --- Model Run Settings --- @echo Conformity version = %ver% @echo Scenario = %val% +@echo Create WFH validation file = %wfhFile% +@echo Usual WFH share = %wfh% +@echo WFH 1-4 days share = %tc14% @echo Highway assignment select link files = %selLinkFile% @echo Location of network transaction files = %transactFilePath% @echo Run transit assignment = %transitAsmt% @@ -91,6 +106,7 @@ if "%transitAsmt%" EQU "T" (@echo Transit assignment select line file = %selLin @echo Save utility files = %utilFile% @echo Create UrbanSim travel time file = %UrbansimFile% @echo RSP evaluation run = %RSPrun% +@echo Have CMAP-TRIP2 use destination-mode choice code in this model setup = %srcCode% @echo ================================================================================== @echo. @@ -103,11 +119,14 @@ set transactFilePath=%transactFilePath:~0,-1% if "%check2%" NEQ "None" ( if not exist Select_Line\%selLineFile% (goto no_select_line_file) ) + +rem Activate Emme Python env +call %~dp0..\Scripts\manage\env\activate_env.cmd emme + @echo -- Verifying select link files -- -uv run macros\verify_select_link.py %file1% %selLinkFile% %RSPrun% %trnAsmt% +call python macros\verify_select_link.py %file1% %selLinkFile% %RSPrun% %trnAsmt% if %ERRORLEVEL% GTR 0 (goto end) - REM Clean up prior to run if exist cache\choice_simulator_trips_out (rmdir /S /Q cache\choice_simulator_trips_out) if exist cache\choice_simulator_trips_out.001 (rmdir /S /Q cache\choice_simulator_trips_out.001) @@ -120,6 +139,7 @@ echo. echo Select Destination Choice-Mode Choice model run mode: echo 1) Minimize run time (default) - resources allocated to support a single model run. echo 2) Balanced - resources allocated to support two simultaneous model runs. +echo [If this is the second of two simultaneous runs: only proceed if srcCode is False (currently set to %srcCode%)] echo. set /a jobs=38 set /a zones=10 @@ -188,6 +208,19 @@ REM PREP WORK CD %~dp0 CD prep_macros +REM Now find R executable +set infile=path.txt +if exist %infile% (del %infile% /Q) +dir "C:\Program Files\R\*R.exe" /s /b >> %infile% 2>nul +set /p path2=<%infile% +set paren=" +set rpath=%paren%%path2%%paren% +echo rpath = %rpath% +call :CheckEmpty2 %infile% +:Rpass +if exist %infile% (del %infile% /Q) +set rfile=create_distr_m01_files + REM -- Start DISTR & M01 Data Processing -- @ECHO. @ECHO Start Time: %date% %time% @@ -196,23 +229,21 @@ if exist report.txt (del report.txt /Q) if exist temp\nul (rmdir temp /S /Q) if not exist temp (mkdir temp) cd .. +if not exist tg\fortran\MCHW_HH.TXT (goto filemiss1) +copy tg\fortran\MCHW_HH.TXT MCHW_HH.TXT /y if not exist tg\data\m01auto.csv (goto filemiss2) if not exist tg\data\m01tg.txt (goto filemiss2) if not exist tg\data\m01type.csv (goto filemiss2) @ECHO. @ECHO -- OBTAINING TRANSIT NETWORK DATA FROM EMME -- -uv run prep_macros/distr_m01_data.py %file1% %val% >> prep_macros\report.txt +call python prep_macros/distr_m01_data.py %file1% %val% >> prep_macros\report.txt if %ERRORLEVEL% GTR 0 (goto issue) cd prep_macros @ECHO. @ECHO -- CREATING FILES FOR SPATIAL ANALYSIS -- @ECHO. -rem Activate R env -call %LOCALAPPDATA%\miniconda3\condabin\conda_hook.bat -call conda activate tbm-r -Rscript create_distr_m01_files.R +%rpath% CMD BATCH %rfile%.R if %ERRORLEVEL% GTR 0 (goto issue) -call conda deactivate @ECHO. @ECHO -- DISTR AND M01 FILES CREATED -- @@ -223,21 +254,32 @@ if exist temp\nul (rmdir temp /S /Q) if exist report.txt (del report.txt /Q) CD .. +rem Activate Python env to build it if necessary +call %~dp0..\Scripts\manage\env\activate_env.cmd +if "%srcCode%" EQU "T" ( + @ECHO -- Ensure CMAP-TRIP2 uses the destination choice-mode choice source code in this model setup -- +python -m pip install -e %~dp0..\src\Mode-Dest-TOD +python -m pip install -e %~dp0..\src\Mode-Dest-TOD\sharrow +) + +rem Activate Emme Python env +call %~dp0..\Scripts\manage\env\activate_env.cmd emme + @ECHO *** Cleaning up databank. *** if exist cleanup.rpt (del cleanup.rpt) -uv run useful_macros\cleanup_for_rerun.py %val%>> cleanup.rpt +call python useful_macros\cleanup_for_rerun.py %val%>> cleanup.rpt if exist reports (del reports) REM RUN FREESKIM TO CREATE TIME, DISTANCE AND TOLL MATRICES @ECHO. @ECHO *** Skimming highway network. *** -uv run prep_macros\free.skim.mac.py %file1% %val% +call python prep_macros\free.skim.mac.py %file1% %val% if %ERRORLEVEL% neq 0 (goto issue) @ECHO. REM IF PRELOAD=1, REPLACE UNCONGESTED TIME AND DISTANCE MATRICES if %preload% EQU 1 (@echo *** Preloading congested times and distances. ***) -if %preload% EQU 1 (uv run prep_macros\preload_congested_times_mac.py %file1% %val%) +if %preload% EQU 1 (call python prep_macros\preload_congested_times_mac.py %file1% %val%) @ECHO ================================================================== REM - LOOP TO RUN MODEL @@ -249,22 +291,22 @@ if %counter% GTR 2 (goto loopend) @ECHO BEGINNING TRANSIT SKIM - FULL MODEL ITERATION %counter% @ECHO - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - REM AM Peak Skim -uv run macros/skim_transit.py %val% %counter% AM +call python macros/skim_transit.py %val% %counter% AM if %ERRORLEVEL% neq 0 (goto issue) -uv run macros/transit_triple_indexing.py %val% AM +call python macros/transit_triple_indexing.py AM if %ERRORLEVEL% neq 0 (goto issue) -uv run macros/transit_skim_final_matrices.py AM +call python macros/transit_skim_final_matrices1.py if %ERRORLEVEL% neq 0 (goto issue) -uv run macros/transit_skim_wrapup.py AM +call python macros/transit_skim_wrapup.py %file1% AM if %ERRORLEVEL% neq 0 (goto issue) REM Midday Skim -uv run macros/skim_transit.py %val% %counter% MD +call python macros/skim_transit.py %val% %counter% MD if %ERRORLEVEL% neq 0 (goto issue) -uv run macros/transit_triple_indexing.py %val% MD +call python macros/transit_triple_indexing.py MD if %ERRORLEVEL% neq 0 (goto issue) -uv run macros/transit_skim_final_matrices.py MD +call python macros/transit_skim_final_matrices2.py if %ERRORLEVEL% neq 0 (goto issue) -uv run macros/transit_skim_wrapup.py MD +call python macros/transit_skim_wrapup.py %file1% MD if %ERRORLEVEL% neq 0 (goto issue) @ECHO -- End of Transit Skim Procedures: %date% %time% >> model_run_timestamp.txt @@ -272,20 +314,24 @@ if %ERRORLEVEL% neq 0 (goto issue) @ECHO PREPARING EMMEBANK - FULL MODEL ITERATION %counter% @ECHO - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - rem @ECHO on -uv run macros\init_HOVsim_databk_mac.py %val% %counter% %file1% +call python macros\init_HOVsim_databk_mac.py %val% %counter% %file1% if %ERRORLEVEL% neq 0 (goto issue) +rem Activate Python env +call %~dp0..\Scripts\manage\env\activate_env.cmd + @ECHO -- Begin Mode-Destination Choice Procedures: %date% %time% >> model_run_timestamp.txt @ECHO. @ECHO RUN CMAP MODE-DESTINATION CHOICE MODEL - FULL MODEL ITERATION %counter% @ECHO - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -call conda activate cmap-modedest -cmap_modedest . --njobs %jobs% --max_zone_chunk %zones% +call cmap_modedest . --njobs %jobs% --max_zone_chunk %zones% if %ERRORLEVEL% NEQ 0 (goto issue) -call conda deactivate @ECHO -- End Mode-Destination Choice Procedures: %date% %time% >> model_run_timestamp.txt @ECHO. +rem Activate Emme Python env +call %~dp0..\Scripts\manage\env\activate_env.cmd emme + @ECHO -- Begin Time-of-Day Procedures: %date% %time% >> model_run_timestamp.txt @ECHO. @ECHO BEGINNING TOD HIGHWAY ASSIGNMENT - FULL MODEL ITERATION %counter% @@ -298,12 +344,12 @@ REM call emme -ng 000 -m macros\ttables.mac %val% %tod_cntr% 92 93 >> blog.txt @ECHO --- End ttables.mac Period %tod_cntr%: %date% %time% >> model_run_timestamp.txt @ECHO --- Begin TOD_network_prep.py Period %tod_cntr%: %date% %time% >> model_run_timestamp.txt -uv run macros\TOD_network_prep.py %val% %tod_cntr% %counter% >> blog.txt +call python macros\TOD_network_prep.py %val% %tod_cntr% %counter% >> blog.txt @ECHO --- End TOD_network_prep.py Period %tod_cntr%: %date% %time% >> model_run_timestamp.txt @ECHO --- Begin assignment Period %tod_cntr%: %date% %time% >> model_run_timestamp.txt @ECHO --- Begin assignment Period %tod_cntr%: %date% %time% --- @ECHO -- Run TOD assignment -- -uv run macros/SOLA_assignment.py %tod_cntr% %sola_threads% %counter% %RSPrun% %tempCnt% %selLinkFile% %trnAsmt% +call python macros/SOLA_assignment.py %tod_cntr% %sola_threads% %counter% %RSPrun% %tempCnt% %selLinkFile% %trnAsmt% if %ERRORLEVEL% NEQ 0 (goto issue) @ECHO --- End assignment Period %tod_cntr%: %date% %time% >> model_run_timestamp.txt @ECHO --- End assignment Period %tod_cntr%: %date% %time% --- @@ -313,7 +359,8 @@ call emme -ng 000 -m macros\balance5I_7c.mac %val% >> blog.txt @ECHO --- End balance5I_7c.mac Period %tod_cntr%: %date% %time% >> model_run_timestamp.txt @ECHO --- Begin time-of-day skim Period %tod_cntr%: %date% %time% >> model_run_timestamp.txt @ECHO --- Complete time of day skims --- -uv run macros/TOD_skim.py %tod_cntr% %val%%counter%%tod_cntr% %sola_threads% +call emme -ng 000 -m macros\TOD_skim_setup.mac %val% %tod_cntr% >> blog.txt +call python macros/TOD_skim.py %file1% %tod_cntr% %val%%counter%%tod_cntr% %sola_threads% if %ERRORLEVEL% NEQ 0 (goto issue) @ECHO -- End Time-of-Day Procedures Period %tod_cntr%: %date% %time% >> model_run_timestamp.txt @ECHO -- End Time-of-Day Procedures for Period %tod_cntr%: %date% %time% -- @@ -323,9 +370,9 @@ if %tod_cntr% LSS 9 (goto tod_loop) REM -- End time-of-day loop -- @ECHO --- Begin Global Iteration MSA skims: %date% %time% >> model_run_timestamp.txt @ECHO --- Begin Global Iteration MSA skims: %date% %time% --- -uv run macros/MSA_iteration_skims.py %file1% 3 %val%%counter%3 %counter% %sola_threads% +call python macros/MSA_iteration_skims.py %file1% 3 %val%%counter%3 %counter% %sola_threads% if %ERRORLEVEL% NEQ 0 (goto issue) -uv run macros/MSA_iteration_skims.py %file1% 5 %val%%counter%5 %counter% %sola_threads% +call python macros/MSA_iteration_skims.py %file1% 5 %val%%counter%5 %counter% %sola_threads% if %ERRORLEVEL% NEQ 0 (goto issue) @ECHO --- End Global Iteration MSA skims: %date% %time% >> model_run_timestamp.txt @ECHO --- End Global Iteration MSA skims: %date% %time% @@ -348,17 +395,17 @@ REM Run script to complete select link analysis, if necessary set /A counter=counter-1 if %tempCnt% EQU 0 (goto skip_sel_link) if %trnAsmt% EQU 1 (goto skip_sel_link) -uv run macros/complete_select_link.py %file1% %val%%counter%9 %val%%counter%0 %tempCnt% %RSPrun% +call python macros/complete_select_link.py %file1% %val%%counter%9 %val%%counter%0 %tempCnt% %RSPrun% if %ERRORLEVEL% NEQ 0 (goto issue) :skip_sel_link @ECHO End Daily Accumulation Procedures: %date% %time% >> model_run_timestamp.txt REM Run script to write link data for MOVES emissions analysis. -uv run post_macros\punchmovesdata.py +call python post_macros\punchmovesdata.py @ECHO Link Data Written for MOVES Emissions Analysis: %date% %time% >> model_run_timestamp.txt -uv run post_macros\final_run_statistics.py +call python post_macros\final_run_statistics.py rem Run script to create input files for MOVES. -uv run post_macros\createMOVESinputfile.py +call python post_macros\createMOVESinputfile.py if %ERRORLEVEL% NEQ 0 (goto issue) @echo %DATE% %TIME% - INFO - MOVES files created >> model_run_timestamp.txt @@ -371,7 +418,7 @@ if "%utilFile%"=="F" (del cache\choice_simulator_trips_out\choice_simulator_util :USskim if "%UrbansimFile%"=="F" (goto skip_UrbanSim) @ECHO Creating skim file for UrbanSim ... -uv run tg\scripts\urbansim_skims.py +call python tg\scripts\urbansim_skims.py :skip_UrbanSim REM The following lines run transit assignment. @@ -379,30 +426,35 @@ if "%transitAsmt%" EQU "T" ( @ECHO Begin Transit Assignment setup: %date% %time% >> model_run_timestamp.txt REM -- Create matrices to hold TOD transit demand if "%RSPrun%" EQU "T" (@ECHO -- Creating HBW transit demand matrices >> model_run_timestamp.txt) - uv run transit_asmt_macros/setup_transit_asmt_2_initialize_matrices.py %file1% %RSPrun% + call python transit_asmt_macros/setup_transit_asmt_2_initialize_matrices.py %file1% %RSPrun% if %ERRORLEVEL% NEQ 0 (goto issue) REM -- Fill matrices with demand (point to conda environment) - uv run transit_asmt_macros\setup_transit_asmt_3_TOD_transit_demand.py %RSPrun% + rem Activate Python env + call %~dp0..\Scripts\manage\env\activate_env.cmd + call python transit_asmt_macros\setup_transit_asmt_3_TOD_transit_demand.py %RSPrun% if %ERRORLEVEL% NEQ 0 (goto issue) @ECHO End Transit Assignment setup >> model_run_timestamp.txt + rem Activate Emme Python env + call %~dp0..\Scripts\manage\env\activate_env.cmd emme @ECHO Submit Transit Assignment >> model_run_timestamp.txt cd transit_asmt_macros - uv run cmap_transit_assignment_runner.py %file1% 1 %val% + call python cmap_transit_assignment_runner.py %file1% 1 %val% if %ERRORLEVEL% GTR 0 (goto issue) cd .. REM -- Delete transit assignment matrices - uv run transit_asmt_macros\delete_transit_skims.py %file1% + call python transit_asmt_macros\delete_transit_skims.py %file1% if %ERRORLEVEL% GTR 0 (goto issue) if "%check2%" NEQ "None" ( REM -- Run select line analysis - uv run transit_asmt_macros\transit_select_line.py %file1% %val% %selLineFile% + call python transit_asmt_macros\transit_select_line.py %file1% %val% %selLineFile% if %ERRORLEVEL% GTR 0 (goto issue) @ECHO -- Completed Select Line Analysis >> model_run_timestamp.txt REM -- Summarize select line boardings - uv run transit_asmt_macros\select_line_boardings.py %file1% %val% %RSPrun% %selLineFile% + call python transit_asmt_macros\select_line_boardings.py %file1% %val% %RSPrun% %selLineFile% if %ERRORLEVEL% GTR 0 (goto issue) @ECHO -- Completed Select Line Boarding Analysis >> model_run_timestamp.txt ) + call python transit_asmt_macros\summarize_transit_boardings.py @ECHO End Transit Assignment: %date% %time% >> model_run_timestamp.txt ) goto last @@ -416,6 +468,13 @@ REM Open tod_factors.xls and create files @ECHO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ goto end +:filemiss1 +@ECHO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +@ECHO tg\fortran\MCHW_HH.TXT DOES NOT EXIST!!! +@ECHO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +pause +goto end + :filemiss2 @ECHO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @ECHO VERIFY m01auto.csv, m01tg.txt, m01type.csv EXIST in tg\data!!! @@ -423,6 +482,18 @@ goto end pause goto end +:CheckEmpty2 +if %~z1 == 0 (goto badR) +goto Rpass + +:badR +@ECHO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +@ECHO COULD NOT FIND R INSTALLATION. +@ECHO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +@ECHO. +pause +goto end + :mcmiss @ECHO @ECHO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/Database/Telework.yaml b/Database/Telework.yaml deleted file mode 100644 index 1adf002..0000000 --- a/Database/Telework.yaml +++ /dev/null @@ -1,37 +0,0 @@ -# ---------------- Work from home module inputs (trip generation) -validationfiles: N -usualwfhpct: 0.0510 -tc14pct: 0.1031 -# ---------------- New Work from home module inputs (trip generation) -wfhpctlow: 0.143 -wfhpctmedium: 0.232 -wfhpcthigh: 0.552 -declinerate: 0.1 -# ---------------- Education portion of WFH workers -# ---------------- Group by high/medium/low WFH rates -# ---------------- 1 for Lower edu level -# ---------------- 2 for Higher edu level -edu: - high: - 1: 0.202 - 2: 0.798 - medium: - 1: 0.268 - 2: 0.732 - low: - 1: 0.305 - 2: 0.695 -# ---------------- Income portion of WFH workers -# ---------------- Group by high/medium/low WFH rates -# ---------------- 1 for Lower income level -# ---------------- 2 for Higher income level -inc: - high: - 1: 0.231 - 2: 0.769 - medium: - 1: 0.418 - 2: 0.582 - low: - 1: 0.353 - 2: 0.647 diff --git a/Database/batch_file.yaml b/Database/batch_file.yaml index 76ebf8c..610df34 100644 --- a/Database/batch_file.yaml +++ b/Database/batch_file.yaml @@ -1,12 +1,29 @@ # Project details model_version: c26q2 -scenario_code: 100 +scenario_code: 600 +year: 2040 # make sure this matches scenario_code +#--- Scenario Code - Year Mapping ---# +# 100: 2019 +# 200: 2026 +# 300: 2030 +# 500: 2035 +# 600: 2040 +# 800: 2050 + +exportAs: "im_county" +# "im" to just output IM/nonIM Excel workbooks +# "im_county" to output IM/nonIM Excel workbooks for each county in the region + +# ---------------- Work from home module inputs (trip generation) +validationfiles: N +usualwfhpct: 0.0510 +tc14pct: 0.1031 # ---------------- Select link analysis files: provide file name (ex: RSP32_links.txt [stored in Database\Select_Link\]) or use None # ---------------- Can submit up to 5, comma-separated, any order, no spaces, (ex: None,test4.txt,test1.txt,None,None) selectLinkFile: None,None,None,None,None # ---------------- Transaction file path: include the path to the transaction files that will build the scenario networks in double quotes (spaces OK), # ---------------- point to directory above highway\ and transit\, no ending backslash (ex: "M:\catslib\modelprod\c24q2" or "M:/catslib/modelprod/24q2") -transactionFilePath: "M:/proj1/nrf/Conformity/c25q4" +transactionFilePath: "M:/proj1/nrf/Conformity/c25q2" # ---------------- Run Transit Assignment at the end of the model run? Default is False. runTransitAsmt: False # ---------------- Transit select line analysis file: provide file name (ex: rsp57_line.txt [stored in Database\Select_Line\]) or use None @@ -17,6 +34,6 @@ util_files: False UrbanSim_file: False # ---------------- Is this an RSP evaluation run? Default is False. RSP: False -# ---------------- PUMA version used in Trip Generation. 2010 is the current option. -pumaVersion: 2010 - +# ---------------- sourceCode will force CMAP-TRIP2 to use the source code in this model setup if set to True. Default is True. +# ---------------- Set to False if this is the second of two simultaneous runs being submitted. +sourceCode: True \ No newline at end of file diff --git a/Database/build_scenario_networks.bat b/Database/build_scenario_networks.bat index beae1c9..d0d05f6 100644 --- a/Database/build_scenario_networks.bat +++ b/Database/build_scenario_networks.bat @@ -11,7 +11,7 @@ for /f "eol=# skip=1 tokens=2 delims=:" %%z in (batch_file.yaml) do (set ver=%%z :break0 for /f "eol=# skip=2 tokens=2 delims=:" %%a in (batch_file.yaml) do (set val=%%a & goto break1) :break1 -for /f "eol=# skip=8 tokens=2* delims=:" %%g in (batch_file.yaml) do (set transactFilePath1=%%g & set transactFilePath2=%%h & goto break6) +for /f "eol=# skip=12 tokens=2* delims=:" %%g in (batch_file.yaml) do (set transactFilePath1=%%g & set transactFilePath2=%%h & goto break6) :break6 set ver=%ver:~1,5% @@ -39,14 +39,17 @@ set ok=%ok:y=Y% if not "%ok%"=="Y" (goto end) @echo ================================================================== +rem Activate Emme Python env +call %~dp0..\Scripts\manage\env\activate_env.cmd emme + @ECHO --- Cleaning up databank --- if exist cleanup.rpt (del cleanup.rpt) -uv run useful_macros\cleanup_for_rerun.py %val%>> cleanup.rpt +call python useful_macros\cleanup_for_rerun.py %val%>> cleanup.rpt if exist reports (del reports) @ECHO Cleanup complete. @ECHO --- Creating time-of-day highway and transit networks --- -uv run prep_macros\initialize_scenarios.py +call python prep_macros\initialize_scenarios.py if %ERRORLEVEL% GTR 0 (goto end) @ECHO -- Checking for transit network input errors -- @@ -56,7 +59,7 @@ if exist report\build_transit.error (del report\build_transit.error /Q) :while if %trnscen% GTR %maxscen% (goto loopend) -uv run prep_macros\build_transit_error_check.py %trnscen% +python prep_macros\build_transit_error_check.py %trnscen% if exist report\build_transit.error (goto badnet) set /A trnscen=%trnscen%+2 goto while diff --git a/Database/choice_model_params.yaml b/Database/choice_model_params.yaml index 3ad2d23..f0f2098 100644 --- a/Database/choice_model_params.yaml +++ b/Database/choice_model_params.yaml @@ -77,6 +77,7 @@ 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/data/land_use_proportions.csv b/Database/data/land_use_proportions.csv deleted file mode 100644 index 59f49ab..0000000 --- a/Database/data/land_use_proportions.csv +++ /dev/null @@ -1,3633 +0,0 @@ -"","zone17","propArea" -"1",1,7.09460854997193e-05 -"2",2,0.000109912703908677 -"3",3,0.000108351798769616 -"4",4,8.79199695344484e-05 -"5",5,0.000108081476392989 -"6",6,0.000119513462885129 -"7",7,0.000148779350792582 -"8",8,6.10492716110398e-05 -"9",9,7.60977062383847e-05 -"10",10,0.000111507003558509 -"11",11,0.00011021968753277 -"12",12,0.000105459815297883 -"13",13,9.10959598012768e-05 -"14",14,6.76578429801979e-05 -"15",15,6.2824797579728e-05 -"16",16,7.50765151190544e-05 -"17",17,7.8468591256738e-05 -"18",18,6.09604972124467e-05 -"19",19,8.93872898324428e-05 -"20",20,6.36749937446737e-05 -"21",21,0.000105865608647998 -"22",22,0.000100416552709868 -"23",23,0.000129955873877235 -"24",24,0.000102792161068702 -"25",25,4.66215086045978e-05 -"26",26,6.60163362277968e-05 -"27",27,0.00010963918793867 -"28",28,0.000135171770327988 -"29",29,0.000121570688172301 -"30",30,0.00010978323394288 -"31",31,4.11839440982933e-05 -"32",32,4.37871230176265e-05 -"33",33,5.81481735376668e-05 -"34",34,5.6873675407932e-05 -"35",35,0.000120185103517916 -"36",36,7.15181845377783e-05 -"37",37,6.53552125870132e-05 -"38",38,0.000114741893094857 -"39",39,7.26188298044693e-05 -"40",40,9.75615376003173e-05 -"41",41,7.13990565100378e-05 -"42",42,2.06975204145148e-06 -"43",43,5.17520895959138e-05 -"44",44,7.8562765069568e-05 -"45",45,2.65919972807977e-05 -"46",46,6.9453904782059e-05 -"47",47,6.31367079234347e-05 -"48",48,0.000239310254341515 -"49",49,0.000332429850343703 -"50",50,0.000252486790350859 -"51",51,0.000374971104782443 -"52",52,0.000115751970549862 -"53",53,0.000235565541873836 -"54",54,0.000215273281239209 -"55",55,0.000244343823177208 -"56",56,0.000319410129719748 -"57",57,0.000301075612656147 -"58",58,0.00032643002143816 -"59",59,0.000245977811704878 -"60",60,0.00029499458577802 -"61",61,0.000336550257381565 -"62",62,0.000213432496040462 -"63",63,0.000363687530478774 -"64",64,0.000236050313226866 -"65",65,0.00026078374967046 -"66",66,0.000127055484577668 -"67",67,0.000193851356354039 -"68",68,0.000242759454592311 -"69",69,0.000115056959489806 -"70",70,0.000252951121314838 -"71",71,0.000102140129052406 -"72",72,0.000330950747418252 -"73",73,0.000289097262117488 -"74",74,0.000216428377283891 -"75",75,0.000166137978348446 -"76",76,0.000318302064112812 -"77",77,0.000154580105886894 -"78",78,0.000290442555934173 -"79",79,0.000220470810266646 -"80",80,0.000306562572352121 -"81",81,0.000361346834521608 -"82",82,0.000327160954515996 -"83",83,0.000157106043383149 -"84",84,0.000341637922999603 -"85",85,0.000309258064193544 -"86",86,0.000177395804602629 -"87",87,0.000329936232513857 -"88",88,0.000336010202037464 -"89",89,0.000195989019045693 -"90",90,0.000284354833105859 -"91",91,0.000358140916769153 -"92",92,0.000341031945957806 -"93",93,0.000360055862371785 -"94",94,0.000321976818189821 -"95",95,0.000366495693659948 -"96",96,0.000302771361649045 -"97",97,0.000257621407732688 -"98",98,0.00018226741843086 -"99",99,0.000190721481161173 -"100",100,0.000260839253557052 -"101",101,0.000322944082722953 -"102",102,0.000106930220184946 -"103",103,0.000111011041749015 -"104",104,0.000272520603911642 -"105",105,0.000309330881329141 -"106",106,0.000300744030654323 -"107",107,0.000321656178057151 -"108",108,0.000154940807943219 -"109",109,0.000134602742886408 -"110",110,0.000158386819455311 -"111",111,0.000202834929803622 -"112",112,0.000318906383868916 -"113",113,0.000236807930597965 -"114",114,0.000168425162962178 -"115",115,0.000187348730833215 -"116",116,0.000178094069704533 -"117",117,0.000226022467597891 -"118",118,0.000311314519569877 -"119",119,0.000189046674619712 -"120",120,0.000138553130387356 -"121",121,1.18440332382022e-05 -"122",122,0.000262127182250228 -"123",123,0.000243522795201308 -"124",124,0.000324303176126267 -"125",125,0.000430094738503811 -"126",126,0.00015683406135976 -"127",127,0.000340852484268395 -"128",128,0.000372126868665952 -"129",129,0.000295099846200363 -"130",130,0.000369077205098422 -"131",131,0.000135583553955917 -"132",132,0.000208299623830546 -"133",133,0.00047714191327394 -"134",134,0.00022267685876798 -"135",135,0.000270898512811496 -"136",136,0.000261903320503681 -"137",137,0.000251899142851438 -"138",138,0.000518078316853656 -"139",139,0.000700448198609233 -"140",140,0.000398450290762472 -"141",141,0.000217238266471859 -"142",142,0.000195933507961972 -"143",143,0.000234505667148619 -"144",144,0.000199053300445836 -"145",145,0.000214051562543102 -"146",146,0.000196123268816593 -"147",147,0.000171722233646669 -"148",148,0.000197480025740452 -"149",149,0.000207815984645934 -"150",150,0.00021384445335141 -"151",151,0.000867244582293737 -"152",152,0.000797778796990459 -"153",153,0.000237041753336635 -"154",154,0.000104132344040459 -"155",155,0.000112370040900293 -"156",156,9.89272323980986e-05 -"157",157,0.00018856419168456 -"158",158,1.81893867184448e-05 -"159",159,0.000226701186451272 -"160",1160,0.000280235516310481 -"161",160,0.000172820358224641 -"162",161,0.000205936744488103 -"163",162,0.000215200678309358 -"164",163,0.000253863742995065 -"165",164,0.000288195207869484 -"166",165,0.000133340559662106 -"167",166,0.000318240151763928 -"168",167,0.000247492591160284 -"169",168,0.000300115017880085 -"170",169,0.000194964486186533 -"171",170,0.000249077017808332 -"172",171,0.000333204978335785 -"173",172,0.000240143786347086 -"174",173,0.000141776419970849 -"175",174,0.000296257778750015 -"176",175,0.00032359401389393 -"177",176,2.97728142866671e-05 -"178",177,0.00031449518905973 -"179",178,0.000143406245696006 -"180",179,0.000150382902925022 -"181",180,0.000188431231557805 -"182",181,0.000206757339394851 -"183",182,0.000167592720558609 -"184",183,0.000218403913701407 -"185",184,0.000188048142227697 -"186",185,5.58143518846876e-05 -"187",186,0.000244452607526415 -"188",187,0.000151951058072223 -"189",188,0.000125615618881159 -"190",189,5.65483090398712e-05 -"191",190,4.37317880464471e-05 -"192",191,0.000218064309034966 -"193",192,0.000192628637870337 -"194",193,0.000189609676296651 -"195",194,0.000267399520182976 -"196",195,0.000182693694141169 -"197",196,0.000209100907442613 -"198",197,5.89786079257647e-05 -"199",198,0.000244567521045785 -"200",199,0.000263232769354111 -"201",200,0.000309836382902875 -"202",201,0.000178650742152715 -"203",202,0.000295031623110097 -"204",203,0.000832525887952841 -"205",204,0.00022057431756398 -"206",205,0.000268615702811721 -"207",206,0.000224959592256525 -"208",207,0.000230387590727254 -"209",208,0.000248868949768281 -"210",209,0.000192976719350548 -"211",210,0.000222168634534578 -"212",211,0.000311470266476779 -"213",212,0.00024382430434247 -"214",213,6.0661850170291e-05 -"215",214,0.00024688644450509 -"216",215,0.000282378692990099 -"217",216,4.99308878448203e-05 -"218",217,0.000296638418789072 -"219",218,0.000268661677551408 -"220",219,0.000308049128894755 -"221",220,0.000168787899135561 -"222",221,0.000198651017150954 -"223",222,0.00028193028780702 -"224",223,0.000234314796594947 -"225",224,0.000240586289407502 -"226",225,0.00106731165618088 -"227",226,0.000234235064438056 -"228",227,0.000250114875825464 -"229",228,0.000276885700301369 -"230",229,0.000195485958263558 -"231",230,0.000180456292585033 -"232",231,0.000254823356840376 -"233",232,0.000284134645864979 -"234",233,0.000230846557649238 -"235",234,0.000309947562707417 -"236",235,0.00027082795167321 -"237",236,0.000302157455675431 -"238",237,0.00029446592190759 -"239",238,0.000286659215614921 -"240",239,0.000298759209259928 -"241",240,0.000186190620536598 -"242",241,0.000308617763088947 -"243",242,0.000285874673914047 -"244",243,0.000249147656136261 -"245",244,9.39637626354183e-05 -"246",245,0.000251519911950858 -"247",246,0.000263077968644414 -"248",247,0.000283770993881532 -"249",248,0.000268355658732963 -"250",249,0.000262290781295276 -"251",250,0.000269809794528787 -"252",251,0.000279139290533536 -"253",252,0.000283716322482492 -"254",253,0.000279584157293717 -"255",254,0.000221370800506523 -"256",255,0.000291426870282872 -"257",256,0.000250733612110657 -"258",257,0.000281537094441408 -"259",258,0.000173582470666191 -"260",259,0.000267455003815564 -"261",260,0.000267101989511553 -"262",261,0.000277815546391841 -"263",262,0.000258816683249703 -"264",263,0.000176549100693783 -"265",264,0.000279715545829303 -"266",265,0.000257665484969473 -"267",266,0.000281558494101966 -"268",267,0.000252899397546978 -"269",268,0.000263435468680282 -"270",269,0.000259989347432248 -"271",270,0.000989307529479749 -"272",271,0.00118454885804685 -"273",272,0.000381528028400972 -"274",273,0.000305183584276883 -"275",274,0.000324315647295881 -"276",275,0.000219960381414928 -"277",276,0.000305520525285662 -"278",277,0.00028191001520626 -"279",278,0.000291524320625374 -"280",279,0.000297270851193523 -"281",280,0.000291424439341463 -"282",281,0.000228850736508901 -"283",282,0.000239422342624708 -"284",283,0.00030217118055285 -"285",284,0.000246876080279576 -"286",285,0.000249977037817235 -"287",286,0.000229947085491157 -"288",287,0.000206144159187022 -"289",288,0.000305068116831022 -"290",289,0.000248364347070901 -"291",290,0.000233609826773676 -"292",291,0.000310443132774927 -"293",292,0.000266683165268484 -"294",293,0.000284929911192317 -"295",294,0.000230628540407056 -"296",295,0.000232671455982599 -"297",296,0.000321185089808516 -"298",297,0.000273137723267636 -"299",298,0.000292332038016617 -"300",299,0.000280470725058376 -"301",300,0.00023441479789457 -"302",301,0.000285434507815647 -"303",302,0.000295425783151372 -"304",303,0.000264445239137051 -"305",304,0.000304627496618672 -"306",305,0.000283087185955246 -"307",306,0.000320564731535979 -"308",307,0.000279199495263307 -"309",308,0.000150170726207532 -"310",309,0.000239042690553009 -"311",310,0.000237001926484363 -"312",311,0.000215284527179497 -"313",312,0.000216422153082541 -"314",313,0.000309525034942948 -"315",314,0.000309210156947167 -"316",315,0.000240964242105937 -"317",316,0.000304227788092248 -"318",317,0.000298411222477821 -"319",318,0.00017339728894354 -"320",319,0.000317348150342661 -"321",320,0.000311275544468621 -"322",321,0.0002739756812591 -"323",322,3.21120848507779e-06 -"324",323,0.000231656046852023 -"325",324,0.00030645651350063 -"326",325,0.000320975228300703 -"327",326,0.000329122776448566 -"328",327,0.000275883111254159 -"329",328,0.000327275604640248 -"330",329,0.000265260875581748 -"331",330,0.000363443497357009 -"332",331,0.000149659139505876 -"333",332,0.000153965707238083 -"334",333,0.000327524410694082 -"335",334,0.000306890198035492 -"336",335,0.000295956201905664 -"337",336,0.000325383013693555 -"338",337,0.000317274570630027 -"339",338,0.000381960924081085 -"340",339,0.000342206872705687 -"341",340,0.000320687631436386 -"342",341,0.000361624860403368 -"343",342,0.000219244560534973 -"344",343,0.000263878249151105 -"345",344,0.00026771994991678 -"346",345,0.000308409386740688 -"347",346,0.000286400539609817 -"348",347,0.000360290751715765 -"349",348,0.000373774432946572 -"350",349,0.00034261307869498 -"351",350,0.000350419734629532 -"352",351,9.11997596234333e-05 -"353",352,0.000457227953169251 -"354",353,1.18582212116723e-05 -"355",354,0.000416882251161393 -"356",355,0.000981255194650284 -"357",356,0.000230911190218665 -"358",357,0.00028464966931101 -"359",358,0.000261505221803954 -"360",359,0.000268093317165982 -"361",360,0.000281074491654331 -"362",361,0.000390354134381563 -"363",362,0.000206385443112598 -"364",363,0.000252593394693916 -"365",364,0.000270753615210373 -"366",365,0.000285913220854752 -"367",366,0.000257895063246243 -"368",367,0.000229918187829184 -"369",368,0.00031314573690432 -"370",369,0.000191043241855336 -"371",370,1.51487077360276e-05 -"372",371,0.000335168956630323 -"373",372,0.000214756032882636 -"374",373,0.000220014199731301 -"375",374,0.000196061187411619 -"376",375,0.000217424226717181 -"377",376,0.000205256678589394 -"378",377,0.000208116401510377 -"379",378,0.000208058824464792 -"380",379,0.000263236467311332 -"381",380,0.000181943224763701 -"382",381,0.000236583910581252 -"383",382,0.000162274146775841 -"384",383,0.000159304875028298 -"385",384,0.000142753972206352 -"386",385,0.000201076497030231 -"387",386,0.000227220433824669 -"388",387,0.000206486619210439 -"389",388,0.000234227165548812 -"390",389,0.000201348288663047 -"391",390,0.000204035521245286 -"392",391,9.23405334943998e-05 -"393",392,0.000203100181475407 -"394",393,0.000269957525890716 -"395",394,0.000252597491102619 -"396",395,0.000277235819625842 -"397",396,0.000206312987292342 -"398",397,0.000169603998429038 -"399",398,0.000187917695795518 -"400",399,0.000180917629381886 -"401",400,0.000190386397504419 -"402",401,0.000223395914696354 -"403",402,0.000118992099614732 -"404",403,0.00019509672245115 -"405",404,0.000135349217578874 -"406",405,0.000183718839833656 -"407",406,0.000144795800162069 -"408",407,0.000213461140726853 -"409",408,0.0002212281464628 -"410",409,0.000155299337762317 -"411",410,0.000228921393387001 -"412",411,0.000194332405210111 -"413",412,0.000178815456077136 -"414",413,0.000214431858218459 -"415",414,0.000177705375369601 -"416",415,0.000190536520010475 -"417",416,0.000138151117812361 -"418",417,0.000282418120067259 -"419",418,6.69610104140195e-05 -"420",419,0.000287308067507074 -"421",420,0.000250418039832636 -"422",421,0.00015333919532428 -"423",422,0.000276587991597241 -"424",423,0.000183379280890668 -"425",424,0.000256286314381443 -"426",425,0.000293064552973407 -"427",426,0.000297311605206822 -"428",427,0.000291679211409414 -"429",428,8.68264764524857e-05 -"430",429,0.000293863452963162 -"431",430,0.000260352762222738 -"432",431,0.000222097856290256 -"433",432,0.000449403430205254 -"434",433,0.000266988562142014 -"435",434,8.71305892824034e-05 -"436",435,8.70513791886624e-05 -"437",436,0.000196361142414723 -"438",437,0.000129584505148321 -"439",438,0.000141296796055167 -"440",439,0.000266360183433666 -"441",440,0.000260667788099189 -"442",441,0.000286309428236572 -"443",442,0.000116264044639308 -"444",443,0.000219153376586651 -"445",444,0.000185616747556642 -"446",445,0.000226589651058898 -"447",446,0.000196930102807101 -"448",447,0.000271606437190355 -"449",448,0.00031449190398201 -"450",449,0.00029655643701827 -"451",450,0.000177996748229513 -"452",451,0.000292739196622135 -"453",452,0.000105202090149617 -"454",453,0.000189273619989473 -"455",454,2.85068682540502e-05 -"456",455,0.000207897932516253 -"457",456,0.000119369745988946 -"458",457,8.04590075441591e-05 -"459",458,0.000368010003282667 -"460",459,0.00108284674299263 -"461",460,0.00022054589476491 -"462",461,0.000175845399498965 -"463",462,0.000117362832343631 -"464",463,1.91461855617979e-05 -"465",464,0.000265465820361679 -"466",465,0.00027909986762101 -"467",466,0.000277270135011688 -"468",467,0.000293698312516436 -"469",468,0.000647272960975784 -"470",469,0.000199958042935905 -"471",470,0.000228541282489309 -"472",471,0.00024374671388135 -"473",472,0.000327912121988709 -"474",473,0.000201951608650938 -"475",474,0.00019879033344929 -"476",475,0.000273296918287411 -"477",476,0.000227104344077787 -"478",477,0.000270772505909593 -"479",478,0.000276671237384064 -"480",479,0.000247681728768441 -"481",480,0.000330052681318378 -"482",481,0.000221425493295395 -"483",482,0.000247212026450594 -"484",483,0.000350849316623487 -"485",484,0.000259684765469186 -"486",485,0.000225317525853538 -"487",486,0.000276079790133478 -"488",487,0.000383670544428727 -"489",488,0.000265015245090025 -"490",489,0.000363766646729806 -"491",490,0.000345485532518887 -"492",491,0.000264852889428867 -"493",492,0.000855519565476129 -"494",493,0.000503739559262856 -"495",494,0.000142859548347372 -"496",495,0.000172219098713857 -"497",496,0.000230748405303826 -"498",497,0.000255136283196215 -"499",498,0.000200622255293125 -"500",499,0.000217096865849706 -"501",500,0.000213375869088423 -"502",501,0.00100783605841284 -"503",502,0.00117532858479072 -"504",503,0.000665006302240963 -"505",504,1.78330441824121e-05 -"506",505,0.000216460940374827 -"507",506,0.000237223843483346 -"508",507,0.000241573463403736 -"509",508,0.000299517692764008 -"510",509,0.000272089213753916 -"511",510,0.000312310517512375 -"512",511,0.000258233961904936 -"513",512,0.000206846080168492 -"514",513,0.000192617186065648 -"515",514,0.000226255250861271 -"516",515,0.000842622704096806 -"517",516,0.000577813944965751 -"518",517,0.000878006159337728 -"519",518,0.000181521240747966 -"520",519,0.000179787240880667 -"521",520,0.000186176893696601 -"522",521,0.000170079243628593 -"523",522,0.000688927386111086 -"524",523,0.000315504009084677 -"525",524,0.000144251164751064 -"526",525,0.000266177482486211 -"527",526,0.000179322222177655 -"528",527,0.00110068648174823 -"529",528,0.00021708447708245 -"530",529,8.9530848770386e-05 -"531",530,0.000237453096060458 -"532",531,0.000106778297861457 -"533",532,0.000178867116173865 -"534",533,0.000205450570423434 -"535",534,0.000189696252581319 -"536",535,0.00016576383584045 -"537",536,0.000133272172702038 -"538",537,7.85907823509271e-05 -"539",538,0.000236668042832225 -"540",539,0.000281626990939005 -"541",540,0.000189759857512032 -"542",541,0.000190222232869861 -"543",542,0.000187357388572973 -"544",543,0.000207955969180566 -"545",544,0.000147776489938831 -"546",545,0.000103296808473825 -"547",546,0.000140864612956856 -"548",547,0.000362851280729681 -"549",548,0.000192011195406168 -"550",549,0.000164498913526776 -"551",550,3.69021594095373e-05 -"552",551,0.000254989556816895 -"553",552,0.000288153815687617 -"554",553,0.000225915769297676 -"555",554,0.00029152962580267 -"556",555,0.000182700476389449 -"557",556,4.11746440476184e-05 -"558",557,0.000146910298630629 -"559",558,0.000152215968013465 -"560",559,0.000168241785762396 -"561",560,0.00017698361934237 -"562",561,7.75700243191358e-05 -"563",562,0.000623248502056633 -"564",563,0.000358499701161807 -"565",564,0.000163601029518671 -"566",565,3.20025909966149e-05 -"567",566,0.000197172905732568 -"568",567,0.000159229446173362 -"569",568,0.000269668275960452 -"570",569,0.00015253624374073 -"571",570,0.000338912910858362 -"572",571,0.00017687886972718 -"573",572,3.64339716736457e-05 -"574",573,0.000101674396869734 -"575",574,0.000663461952301357 -"576",575,0.000642217691060155 -"577",576,0.000124410288293401 -"578",577,0.000126689687428949 -"579",578,0.000139123642499851 -"580",579,0.000112191000599635 -"581",580,0.000176942246240131 -"582",581,0.000210770932801222 -"583",582,9.81976744069435e-05 -"584",583,0.000200939607387748 -"585",584,0.000145084396657289 -"586",585,0.000157621152847621 -"587",586,0.000218601260207216 -"588",587,0.000250386226324416 -"589",588,1.36390713687176e-05 -"590",589,1.06624092891657e-05 -"591",590,7.67181700689439e-06 -"592",591,0.00034589098650887 -"593",592,0.000824010736077832 -"594",593,0.000209186357688838 -"595",594,0.000183853007471752 -"596",595,0.000224532877473549 -"597",596,0.000256921244515088 -"598",597,0.000615296496649495 -"599",598,0.000963455340564442 -"600",599,0.000125135538034745 -"601",600,0.000144415156009887 -"602",601,0.000199325649482034 -"603",602,0.00013344942189462 -"604",603,0.000253610748089541 -"605",604,0.000273266219507854 -"606",605,0.000260037408349451 -"607",606,0.000263024845144498 -"608",607,0.000715641252080341 -"609",608,0.00101110597868534 -"610",609,0.000200764223481997 -"611",610,0.000117710015238888 -"612",611,0.000124343948254817 -"613",612,0.000187302287556874 -"614",613,0.000180210863901575 -"615",614,0.000311744938885192 -"616",615,0.000194897827511128 -"617",616,0.000216493744865119 -"618",617,0.000192153256326705 -"619",618,0.000239472656247676 -"620",619,0.000202632845704826 -"621",620,0.000265912445581026 -"622",621,0.000886313402643095 -"623",622,0.000218678387043693 -"624",623,0.000225978962437303 -"625",624,0.000292300563065827 -"626",625,0.000172763539880544 -"627",626,0.00021573362660689 -"628",627,0.000226364419914625 -"629",628,0.00021757938955047 -"630",629,7.46895014206011e-05 -"631",630,0.000151223961252795 -"632",631,0.00080462883925814 -"633",632,0.000570167940519752 -"634",633,0.000337227071807085 -"635",634,0.000620477974295088 -"636",635,0.000478455421389121 -"637",636,0.000155780890203418 -"638",637,0.000185834289797099 -"639",638,0.00015398189938512 -"640",639,8.6618940484214e-05 -"641",640,0.000833611865563294 -"642",641,0.000125063520172852 -"643",642,0.000170086426665959 -"644",643,7.19028218117175e-05 -"645",644,0.00020604028474776 -"646",645,0.000762257002931285 -"647",646,0.00019074760067585 -"648",647,0.000176615964112089 -"649",648,0.000154685646660407 -"650",649,0.000208409147370203 -"651",650,0.000821892107461749 -"652",651,0.000686897696767942 -"653",652,0.000656218709657863 -"654",653,0.000676780451753706 -"655",654,0.00014212357267737 -"656",655,0.000164406845075211 -"657",656,0.000178293144532324 -"658",657,7.99887004437402e-05 -"659",658,0.000173184690817074 -"660",659,2.82719084733076e-05 -"661",660,0.000334208984769455 -"662",661,0.000161689242399108 -"663",662,0.000142497976477657 -"664",663,8.74779697073316e-05 -"665",664,0.000234933790230576 -"666",665,7.30366381855837e-05 -"667",666,7.34378047592492e-05 -"668",667,0.000157586941446458 -"669",668,0.000124536844714666 -"670",669,0.000181006381547087 -"671",670,0.000159053403305076 -"672",671,0.000605096373687869 -"673",672,0.000712552280917929 -"674",673,0.000202053020448827 -"675",674,0.000176006827132615 -"676",675,0.000182016603883886 -"677",676,0.000222622907181113 -"678",677,0.000262733875457073 -"679",678,0.000273549172845694 -"680",679,1.91168514679766e-06 -"681",680,0.00062210608355358 -"682",681,0.000716345117656029 -"683",682,0.000690267710078633 -"684",683,0.00070082043007438 -"685",684,0.000232674943761328 -"686",685,5.33924637259137e-05 -"687",686,0.000142090300453845 -"688",687,7.29181192519466e-05 -"689",688,0.000774090431014063 -"690",689,0.000155020196382407 -"691",690,0.000462054952654316 -"692",691,0.000112321362837193 -"693",692,1.15124273923114e-05 -"694",693,0.000142593085899876 -"695",694,0.000110789282258393 -"696",695,6.39541123308233e-05 -"697",696,3.63229226542332e-05 -"698",697,0.000203419603163199 -"699",698,0.000508101250758362 -"700",699,0.000144690551437285 -"701",700,0.000376603514771805 -"702",701,8.7646736098476e-05 -"703",702,0.000164475632242171 -"704",703,4.58385753236982e-05 -"705",704,0.000119946780222558 -"706",705,0.000244771040065366 -"707",706,2.80914857458893e-06 -"708",707,0.000209519295638328 -"709",708,0.00056050998281817 -"710",709,0.00038801352975909 -"711",710,0.00022669773781382 -"712",711,0.000479917111624661 -"713",712,2.32261182690369e-06 -"714",713,8.81272323046363e-05 -"715",714,0.000190727239866845 -"716",715,5.94614083278234e-05 -"717",716,0.000145419863611266 -"718",717,0.000210565679107471 -"719",718,0.000127922866472129 -"720",719,0.000301817551804629 -"721",720,0.00110035907678969 -"722",721,0.000101727633893313 -"723",722,0.00034500873699785 -"724",723,0.000541187121403804 -"725",724,0.000367841331461025 -"726",725,0.000689162950986896 -"727",726,0.000945261484665261 -"728",727,0.00131241139378976 -"729",728,0.000333763075598466 -"730",729,5.14796739752116e-05 -"731",730,0.000348127504433569 -"732",731,0.000476050256743919 -"733",732,0.000283704867329105 -"734",733,0.000289544898136284 -"735",734,0.000873840551340939 -"736",735,0.00165280525971147 -"737",736,0.000915690048841452 -"738",737,0.00131182040872502 -"739",738,0.00052688206933901 -"740",739,0.000176958012502758 -"741",740,0.000157772695722913 -"742",741,0.000153652518000554 -"743",742,0.000116356355344572 -"744",743,0.000507844002494571 -"745",744,0.00013868652193127 -"746",745,0.000162980496463583 -"747",746,0.000126467881462606 -"748",747,0.000111784480936723 -"749",748,0.000635802030062321 -"750",749,0.000918356315323613 -"751",750,3.22434446327745e-05 -"752",751,0.000115101090282211 -"753",752,0.000148067935097857 -"754",753,0.000121594887438821 -"755",754,0.000194944441125662 -"756",755,0.0001657493208724 -"757",756,0.000152909370227699 -"758",757,0.000145883147638243 -"759",758,0.000579643714628094 -"760",759,0.000156352379607484 -"761",760,0.000201956730153031 -"762",761,9.22646777619987e-05 -"763",762,0.000124718755469779 -"764",763,0.00129458644914344 -"765",764,0.000345426347383075 -"766",765,9.97839161620733e-05 -"767",766,0.000182418386249991 -"768",767,0.000128903015270419 -"769",768,0.000131977620997771 -"770",769,0.000563174469469418 -"771",770,0.000559156529250562 -"772",771,0.000398493692057689 -"773",772,0.000542286391694148 -"774",773,0.000812945648512116 -"775",774,0.000113932671039103 -"776",775,0.000160801901995381 -"777",776,9.14751584963445e-05 -"778",777,8.66204459241059e-05 -"779",778,0.000497202963135738 -"780",779,0.000462766794338077 -"781",780,0.00010215456275724 -"782",781,0.000154443736507214 -"783",782,0.000112192016276673 -"784",783,0.000135660974308576 -"785",784,0.000527016556311966 -"786",785,0.00040912133442171 -"787",786,0.000200759593574926 -"788",787,8.11181511039586e-05 -"789",788,0.000101780551741954 -"790",789,0.000167695125009465 -"791",790,0.000145024100733979 -"792",791,0.000463670299537488 -"793",792,0.000559218337133853 -"794",793,0.000315843144965382 -"795",794,0.000387952941392942 -"796",795,0.000268179653324196 -"797",796,0.000143029323336694 -"798",797,0.000366252835363571 -"799",798,0.00033824712011292 -"800",799,0.000148312841042083 -"801",800,0.000103121772657589 -"802",801,0.000190255686129576 -"803",802,0.000274480288590951 -"804",803,0.000251670229158613 -"805",804,0.000463017798913338 -"806",805,0.000336412037605558 -"807",806,0.000426662735105774 -"808",807,0.000451886205934513 -"809",808,0.000135955438195713 -"810",809,0.000154700354449244 -"811",810,0.000163278732294184 -"812",811,0.000149884488253139 -"813",812,0.000480618960963258 -"814",813,0.000139679212731516 -"815",814,0.000157294435098504 -"816",815,0.000135879369767085 -"817",816,0.000129109233108462 -"818",817,0.000599483038619776 -"819",818,0.000498833246069048 -"820",819,0.000556505731262142 -"821",820,0.000525540438868126 -"822",821,0.000572558834581751 -"823",822,0.000364266365006915 -"824",823,7.71308672992826e-05 -"825",824,0.000136098997810112 -"826",825,0.00021269496552385 -"827",826,0.00014878533164978 -"828",827,0.00051701299047937 -"829",828,0.000536784230669683 -"830",829,0.000556827943436874 -"831",830,0.000151785226538508 -"832",831,0.000137504785290176 -"833",832,0.000131692540218801 -"834",833,0.000161587527427181 -"835",834,0.00190614483137266 -"836",835,0.000239268784237221 -"837",836,0.000341208693649193 -"838",837,0.000774538439742599 -"839",838,0.000380615120117632 -"840",839,0.000123813628691803 -"841",840,0.000196326773253259 -"842",841,0.000140500587938593 -"843",842,0.000143316603527219 -"844",843,0.000585489924117377 -"845",844,0.000151294326266156 -"846",845,0.000123826124986602 -"847",846,8.34005017617575e-05 -"848",847,0.000162626282607686 -"849",848,0.000223026436287129 -"850",849,0.000137041701503113 -"851",850,0.000218584945536175 -"852",851,0.000141646630741805 -"853",852,0.000153820882312834 -"854",853,5.01468877673492e-05 -"855",854,0.000142221851642817 -"856",855,8.87825689486819e-05 -"857",856,0.000140522352982308 -"858",857,0.000604054721078385 -"859",858,0.000607703069074234 -"860",859,0.000123249946352107 -"861",860,0.000116661856929839 -"862",861,0.000154108168130084 -"863",862,0.000150253985410293 -"864",863,0.000627376836303386 -"865",864,0.000673565564088246 -"866",865,0.000215411312981659 -"867",866,0.0004899247621576 -"868",867,0.000642759700342097 -"869",868,0.000467689471399124 -"870",869,0.000466560602140407 -"871",870,0.000936145059412526 -"872",871,0.000172549692886065 -"873",872,0.000585977277895133 -"874",873,0.000637885156764181 -"875",874,0.000574497504702016 -"876",875,0.000326379870970095 -"877",876,0.000603942047007195 -"878",877,0.000178675696637178 -"879",878,0.000201023624795749 -"880",879,0.000158335162431888 -"881",880,0.000125390266625419 -"882",881,0.000172542364609214 -"883",882,0.000180987543458173 -"884",883,0.000126107470997903 -"885",884,0.000147852143534677 -"886",885,0.000158777053480954 -"887",886,0.000211709634639106 -"888",887,0.00014171233878757 -"889",888,0.000169921412514312 -"890",889,0.000433663596227889 -"891",890,9.85745209567973e-05 -"892",891,7.37172563589274e-05 -"893",892,0.000195875445012119 -"894",893,0.000121343078090406 -"895",894,0.000509425516085547 -"896",895,0.000434357884414113 -"897",896,0.000135913451327863 -"898",897,0.000205828651355035 -"899",898,0.000121089115664116 -"900",899,0.000162325795386714 -"901",900,0.000639198336629352 -"902",901,0.000576562393738539 -"903",902,0.000579183724752996 -"904",903,0.000780551530957953 -"905",904,0.000294431408552234 -"906",905,0.000254180852351316 -"907",906,0.000179501156639597 -"908",907,0.000185509235898658 -"909",908,0.000134607239833591 -"910",909,0.000189105368968777 -"911",910,0.00060759923977671 -"912",911,0.000634552202553209 -"913",912,0.000481290820865144 -"914",913,0.00015351538345295 -"915",914,0.000144966460129117 -"916",915,0.000172257174547841 -"917",916,0.000177803573113016 -"918",917,1.53920176619894e-05 -"919",918,0.000424577717527471 -"920",919,0.00015346159697017 -"921",920,0.000184677841885789 -"922",921,0.00024157890563056 -"923",922,0.000181778999409713 -"924",923,0.000147463666512791 -"925",924,0.000169034572746149 -"926",925,0.000147703145901928 -"927",926,0.000156615589383672 -"928",927,0.000642663299790577 -"929",928,0.000259657435211058 -"930",929,0.000131875282403532 -"931",930,0.000216768794861057 -"932",931,0.00022389440259761 -"933",932,0.000184759644848035 -"934",933,0.000106741828282351 -"935",934,0.000211446150059686 -"936",935,0.00016183208192007 -"937",936,0.000255512655372446 -"938",937,0.000150921066894658 -"939",938,0.000192545610896051 -"940",939,0.000168216218967066 -"941",940,0.000133952000088462 -"942",941,0.000497707110259576 -"943",942,0.000224807783612358 -"944",943,0.000742293566641765 -"945",944,0.000248337363963865 -"946",945,0.000505900542063335 -"947",946,0.00123173798123178 -"948",947,0.000712747748467894 -"949",948,4.39503727141972e-05 -"950",949,0.000265559315296022 -"951",950,0.000218167997385984 -"952",951,4.690321476564e-05 -"953",952,0.000620957474554785 -"954",953,0.00147885516384315 -"955",954,0.00152716460506465 -"956",955,0.000607801018164485 -"957",956,0.000846252426895049 -"958",957,0.00036669639739685 -"959",958,0.00028624424943975 -"960",959,0.000310671611594875 -"961",960,0.000193005237373783 -"962",961,0.000487086897920424 -"963",962,0.000466171858805983 -"964",963,0.000591614710447375 -"965",964,0.00052220125488037 -"966",965,0.000248338275606637 -"967",966,0.000220041451922092 -"968",967,0.00024500735833876 -"969",968,0.000535094637764697 -"970",969,0.000597958940873767 -"971",970,0.00040489222763356 -"972",971,0.000300556842482095 -"973",972,0.000235795720637058 -"974",973,0.000177256089215758 -"975",974,0.000495550606351208 -"976",975,0.000597350758446377 -"977",976,0.000555637315353929 -"978",977,0.000495514320933166 -"979",978,0.000465943797871498 -"980",979,0.000296165805345265 -"981",980,0.000370023667258563 -"982",981,0.000537394701337617 -"983",982,0.0001294483882464 -"984",983,0.000187605142348778 -"985",984,0.000225217152250911 -"986",985,0.000131053390062019 -"987",986,0.000141976475490186 -"988",987,0.000103364866856634 -"989",988,0.000188145002605545 -"990",989,6.87949103538064e-05 -"991",990,7.74919880968197e-05 -"992",991,0.000125821020289249 -"993",992,0.000190197827175482 -"994",993,0.000150796747199557 -"995",994,0.000380014508341264 -"996",995,0.000540503245505669 -"997",996,0.000475136540640966 -"998",997,0.000166303555617774 -"999",998,0.00014311840397109 -"1000",999,0.000142822859547802 -"1001",1000,0.00014438283536161 -"1002",1001,0.000272911873979597 -"1003",1002,0.000514856456055164 -"1004",1003,0.000228672343390988 -"1005",1004,0.000157996459333026 -"1006",1005,0.000342361196019837 -"1007",1006,0.000459453642899308 -"1008",1007,0.000457270757375246 -"1009",1008,0.000470881700878334 -"1010",1009,0.000108680845546313 -"1011",1010,0.000197044309855125 -"1012",1011,0.000252012555228567 -"1013",1012,0.000158587527102169 -"1014",1013,0.000246350296501647 -"1015",1014,0.000199624977596241 -"1016",1015,0.00016223497170741 -"1017",1016,0.000179450498822607 -"1018",1017,0.000140856461269306 -"1019",1018,0.000199158946973816 -"1020",1019,0.000188854773010967 -"1021",1020,0.000194185543107441 -"1022",1021,0.000220950391385021 -"1023",1022,0.000736935363764238 -"1024",1023,0.00060286452244339 -"1025",1024,0.000154800317977731 -"1026",1025,0.00016212805132038 -"1027",1026,0.000161376891765926 -"1028",1027,0.000211064984275609 -"1029",1028,0.000323124247541834 -"1030",1029,0.000193130657084293 -"1031",1030,0.000131371485058836 -"1032",1031,0.000156362821241575 -"1033",1032,0.000170481808545945 -"1034",1033,0.000510702145233563 -"1035",1034,0.000178334051095266 -"1036",1035,0.000694371362275782 -"1037",1036,0.00018484760579461 -"1038",1037,0.000907653146465442 -"1039",1038,0.000172208694990502 -"1040",1039,0.000221733772184931 -"1041",1040,9.0965085960054e-05 -"1042",1041,0.000142711259512597 -"1043",1042,0.000206779447744417 -"1044",1043,3.67241116003264e-07 -"1045",1044,0.000157007038783318 -"1046",1045,3.86144787321775e-05 -"1047",1046,0.000197040151017681 -"1048",1047,0.000185212052720534 -"1049",1048,9.73879384122867e-05 -"1050",1049,0.000195331132451425 -"1051",1050,0.000175128316459525 -"1052",1051,0.000127604450014213 -"1053",1052,0.000180535258798077 -"1054",1053,0.000115445579217597 -"1055",1054,0.000125577570624214 -"1056",1055,9.73792200672521e-05 -"1057",1056,0.000126749466432625 -"1058",1057,8.91753098535001e-05 -"1059",1058,5.71832257556841e-05 -"1060",1059,0.000133085289771807 -"1061",1060,0.000188563097625305 -"1062",1061,0.000256715487354682 -"1063",1062,6.9449353824136e-05 -"1064",1063,0.000182372565305437 -"1065",1064,0.000215086590570427 -"1066",1065,0.000173125430407666 -"1067",1066,0.000156622448032178 -"1068",1067,0.00017968851795234 -"1069",1068,0.000201655402879163 -"1070",1069,0.000300768856130708 -"1071",1070,0.000415113161691492 -"1072",1071,0.00018759893426368 -"1073",1072,0.000322055130194418 -"1074",1073,0.000529269931405445 -"1075",1074,0.000200130890355195 -"1076",1075,0.000575281754074776 -"1077",1076,0.000417099244241675 -"1078",1077,0.000333905219800422 -"1079",1078,0.000427083047494074 -"1080",1079,0.000554897149534317 -"1081",1080,0.000474642537806849 -"1082",1081,0.000625184270049787 -"1083",1082,0.000612286798670131 -"1084",1083,0.000186672344493596 -"1085",1084,0.000162285804219864 -"1086",1085,0.000184263499215993 -"1087",1086,0.000152213180805329 -"1088",1087,0.000160564834869986 -"1089",1088,0.000201701205202898 -"1090",1089,0.00015541525705169 -"1091",1090,0.000160431054391894 -"1092",1091,0.000426859437767568 -"1093",1092,0.000354033424140713 -"1094",1093,5.73485044060697e-05 -"1095",1094,0.000464053427792989 -"1096",1095,0.000288985519687773 -"1097",1096,0.000207848969588094 -"1098",1097,0.000184164865410463 -"1099",1098,0.000173233344820739 -"1100",1099,0.000198694395057438 -"1101",1100,0.000210026499491172 -"1102",1101,7.51030362898225e-05 -"1103",1102,0.000165107077444309 -"1104",1103,0.000164489476725512 -"1105",1104,0.000400108116418484 -"1106",1105,0.000135563972532627 -"1107",1106,0.000108526913851514 -"1108",1107,0.000211857175479168 -"1109",1108,0.000190109722825307 -"1110",1109,0.000184567843002363 -"1111",1110,0.000198951031497682 -"1112",1111,0.000215039761615136 -"1113",1112,0.00017921740456813 -"1114",1113,0.000665323537229825 -"1115",1114,0.000195827888953269 -"1116",1115,0.000133812705857412 -"1117",1116,0.000156203100919615 -"1118",1117,0.00017105054448216 -"1119",1118,2.53698055439272e-05 -"1120",1119,0.000186003403723203 -"1121",1120,7.44568752708114e-05 -"1122",1121,0.000180875833923273 -"1123",1122,0.000179768773346741 -"1124",1123,0.000175923954637304 -"1125",1124,0.000208223756427315 -"1126",1125,0.000359728549078599 -"1127",1126,0.000197021158904873 -"1128",1127,0.000146545224256834 -"1129",1128,0.000252360426743306 -"1130",1129,0.000180038248389182 -"1131",1130,0.00013288611591854 -"1132",1131,5.47771160935669e-05 -"1133",1132,0.000216239875597997 -"1134",1133,0.000190406561373831 -"1135",1134,0.000234996011675845 -"1136",1135,0.000254442933035638 -"1137",1136,0.000158002179702013 -"1138",1137,0.000185918357517116 -"1139",1138,0.000184808988358788 -"1140",1139,0.000240032739551177 -"1141",1140,0.000161888201821943 -"1142",1141,0.000157302132639865 -"1143",1142,0.000175781597859051 -"1144",1143,0.000199067770316538 -"1145",1144,0.000268513092070768 -"1146",1145,0.000199766696827729 -"1147",1146,7.0522138433057e-05 -"1148",1147,0.000164763591362037 -"1149",1148,0.000335896692209394 -"1150",1149,6.73726433308691e-05 -"1151",1150,0.00111504093263311 -"1152",1151,0.000195945840688903 -"1153",1152,0.000277462425001908 -"1154",1153,0.000166468388306509 -"1155",1154,0.000165058663386055 -"1156",1155,0.000212207510976318 -"1157",1156,0.000178521718614121 -"1158",1157,0.000176939603716385 -"1159",1158,0.000114691566558946 -"1160",1159,0.000739957544019803 -"1161",1161,0.00015826651130787 -"1162",1162,0.000186423099943489 -"1163",1163,0.000194144330950618 -"1164",1164,0.000182706246215152 -"1165",1165,0.000200307426838603 -"1166",1166,3.59363753668619e-05 -"1167",1167,0.000221576019363086 -"1168",1168,0.000323223999225356 -"1169",1169,0.000192559355638636 -"1170",1170,0.000161943099290158 -"1171",1171,0.000220388186613681 -"1172",1172,0.000184181887729791 -"1173",1173,0.000150492108165712 -"1174",1174,0.00029028766190922 -"1175",1175,0.000159551513659869 -"1176",1176,0.000291787337793132 -"1177",1177,0.000203153434692462 -"1178",1178,0.00024961455619979 -"1179",1179,3.21456949612008e-05 -"1180",1180,0.000225664060805505 -"1181",1181,0.000216663946474512 -"1182",1182,0.000229726066460507 -"1183",1183,0.000444466068490434 -"1184",1184,0.000131983475620418 -"1185",1185,0.000302631135963619 -"1186",1186,0.000237772557930212 -"1187",1187,0.000194650931123674 -"1188",1188,0.000282154072733701 -"1189",1189,0.000203780270653033 -"1190",1190,4.69361683515937e-05 -"1191",1191,0.000843067255579518 -"1192",1192,0.000744830426222338 -"1193",1193,0.00024874981764191 -"1194",1194,0.000202100655357532 -"1195",1195,0.000220798193360159 -"1196",1196,0.000120654651175796 -"1197",1197,0.000513838781868961 -"1198",1198,0.000113386022110835 -"1199",1199,0.000143044058296884 -"1200",1200,0.000235183976711206 -"1201",1201,0.000113752176090314 -"1202",1202,0.000148326168691144 -"1203",1203,0.00018635573414734 -"1204",1204,0.000152650592855862 -"1205",1205,0.000175147661559168 -"1206",1206,0.000187185359750202 -"1207",1207,0.000161047599488494 -"1208",1208,0.000229094522656639 -"1209",1209,0.000248816488235966 -"1210",1210,3.7355317689824e-05 -"1211",1211,0.000148920979881583 -"1212",1212,0.000194976640459064 -"1213",1213,0.000108445481562437 -"1214",1214,0.000240171457424224 -"1215",1215,0.000269579834556578 -"1216",1216,0.00024759019311125 -"1217",1217,0.000746153756134096 -"1218",1218,0.000626489000058788 -"1219",1219,0.000391798339180535 -"1220",1220,0.000152257325315127 -"1221",1221,0.000103728680782423 -"1222",1222,0.000296840716867854 -"1223",1223,0.00118856866903728 -"1224",1224,0.000272969346848962 -"1225",1225,0.000255405257339644 -"1226",1226,0.000196046426870031 -"1227",1227,0.000102820113752346 -"1228",1228,0.000207815317780978 -"1229",1229,0.000401598168892779 -"1230",1230,0.000173256736469862 -"1231",1231,0.000176118989843202 -"1232",1232,0.000179768029701984 -"1233",1233,0.000151171166749788 -"1234",1234,0.000125403898820587 -"1235",1235,0.000187259573114263 -"1236",1236,0.000279141464770723 -"1237",1237,0.000318191910104508 -"1238",1238,0.000248841235877774 -"1239",1239,0.00018169313277167 -"1240",1240,0.000218514434051712 -"1241",1241,0.000217154353553166 -"1242",1242,0.000162417363396104 -"1243",1243,1.23266662140581e-05 -"1244",1244,0.000168373592597656 -"1245",1245,6.43093161472371e-05 -"1246",1246,0.00015677542396364 -"1247",1247,0.000180789036394978 -"1248",1248,0.000164582777597983 -"1249",1249,0.000160478735478262 -"1250",1250,0.000458153830298886 -"1251",1251,0.000776021601519527 -"1252",1252,0.000191190982655163 -"1253",1253,0.000135496039730598 -"1254",1254,0.00021374035909082 -"1255",1255,0.000195965321276824 -"1256",1256,0.000234562131647092 -"1257",1257,0.000209255401564608 -"1258",1258,0.000188285924923192 -"1259",1259,0.000169923208954252 -"1260",1260,6.59286814198292e-05 -"1261",1261,0.000172055996855351 -"1262",1262,5.90069018243626e-05 -"1263",1263,0.00016129053902294 -"1264",1264,0.00018007667082163 -"1265",1265,0.000275494421129433 -"1266",1266,0.000171018849870792 -"1267",1267,0.000166254567667653 -"1268",1268,0.000230015390254312 -"1269",1269,0.000594083862046629 -"1270",1270,0.000241618992927817 -"1271",1271,0.000128726052004938 -"1272",1272,0.000209841205780879 -"1273",1273,0.000163451643076321 -"1274",1274,0.000733992967154119 -"1275",1275,2.06066248826638e-05 -"1276",1276,0.000173270226366867 -"1277",1277,0.000151754233550433 -"1278",1278,0.000103489683278776 -"1279",1279,0.000264949298087614 -"1280",1280,0.000115246959851856 -"1281",1281,9.58478372027138e-05 -"1282",1282,0.000203604981897648 -"1283",1283,8.59621169342578e-05 -"1284",1284,0.000497557745839722 -"1285",1285,0.000149698822229796 -"1286",1286,0.000173172440922313 -"1287",1287,0.000243472442603156 -"1288",1288,0.000263517117081116 -"1289",1289,0.000180594013678541 -"1290",1290,0.000351119344147189 -"1291",1291,0.000186981192999847 -"1292",1292,0.000127660840991298 -"1293",1293,0.000455766523448413 -"1294",1294,0.000586965670550797 -"1295",1295,0.000207608039736806 -"1296",1296,0.000684187311384601 -"1297",1297,0.000416331244868246 -"1298",1298,0.000481517396024137 -"1299",1299,0.000240342575492935 -"1300",1300,0.000153644298709011 -"1301",1301,0.00014403330022058 -"1302",1302,0.000207108274088489 -"1303",1303,0.000196165127127736 -"1304",1304,3.11828820962404e-05 -"1305",1305,0.000147339535448018 -"1306",1306,0.000180083477587741 -"1307",1307,0.000165544013701885 -"1308",1308,0.000118168889366646 -"1309",1309,0.000163631917318659 -"1310",1310,0.000667962027548527 -"1311",1311,0.000386645689844399 -"1312",1312,0.000534651084376163 -"1313",1313,0.000172594054623668 -"1314",1314,0.000223391000633722 -"1315",1315,0.000200161726393839 -"1316",1316,0.000189818646657364 -"1317",1317,0.00031859633708409 -"1318",1318,0.000225993902769207 -"1319",1319,0.000328063657202783 -"1320",1320,0.000232502466951506 -"1321",1321,0.000230692505692736 -"1322",1322,0.000242015391064961 -"1323",1323,0.000223760986355321 -"1324",1324,0.000219258177527464 -"1325",1325,0.000223260245769816 -"1326",1326,0.000223886156847389 -"1327",1327,0.000261724822082681 -"1328",1328,0.000233562318564435 -"1329",1329,0.000296245034299983 -"1330",1330,0.000289467203225906 -"1331",1331,0.000276933812464914 -"1332",1332,0.000264096700151551 -"1333",1333,0.00106099666213717 -"1334",1334,0.000225087716409961 -"1335",1335,0.000252237088804875 -"1336",1336,0.00033343948087957 -"1337",1337,0.000273716813163038 -"1338",1338,0.000228247149806408 -"1339",1339,0.000245553445623284 -"1340",1340,0.000291908730363957 -"1341",1341,0.000228234197588915 -"1342",1342,0.00027342819359785 -"1343",1343,0.000286215511441072 -"1344",1344,0.000212367447531408 -"1345",1345,7.52325468542962e-05 -"1346",1346,0.00021714270226092 -"1347",1347,0.000267413516844114 -"1348",1348,0.000169136285052934 -"1349",1349,0.000100071990857503 -"1350",1350,0.000221942738309474 -"1351",1351,0.000237140390963165 -"1352",1352,0.000257294029122499 -"1353",1353,0.000251458637618704 -"1354",1354,0.000294376162070591 -"1355",1355,0.000200491875733327 -"1356",1356,0.00018184444802431 -"1357",1357,0.000220434806668937 -"1358",1358,0.000205760984806518 -"1359",1359,0.000171799458745735 -"1360",1360,0.000144434588895949 -"1361",1361,0.000169322201807277 -"1362",1362,0.00051536372744919 -"1363",1363,0.000642011188008706 -"1364",1364,0.000197881680679996 -"1365",1365,0.00016349992746871 -"1366",1366,0.000175710234391076 -"1367",1367,0.000221148365566631 -"1368",1368,0.000731284823530134 -"1369",1369,0.000118021009165231 -"1370",1370,0.000200026159561369 -"1371",1371,0.000189825653931419 -"1372",1372,0.000110297512006458 -"1373",1373,0.000391895834342892 -"1374",1374,0.000527956469829946 -"1375",1375,0.000545677182179395 -"1376",1376,0.000180846547694554 -"1377",1377,0.000176948042577632 -"1378",1378,0.000295770245985789 -"1379",1379,0.000139714557205183 -"1380",1380,0.000504780917347567 -"1381",1381,0.000563398594085014 -"1382",1382,0.00023557399355914 -"1383",1383,0.000393956762048788 -"1384",1384,0.000455011191986884 -"1385",1385,0.000683103622726881 -"1386",1386,8.52762282817453e-05 -"1387",1387,5.53738080986553e-05 -"1388",1388,9.45620785507325e-05 -"1389",1389,0.00023557098990672 -"1390",1390,0.00014653205242947 -"1391",1391,0.000263402108761569 -"1392",1392,0.00040345513805534 -"1393",1393,0.000159575154210355 -"1394",1394,0.000148166326977361 -"1395",1395,6.04728898295543e-05 -"1396",1396,3.4909863918044e-05 -"1397",1397,0.000218924862386734 -"1398",1398,0.000300645118441876 -"1399",1399,0.000270459856239955 -"1400",1400,0.000526437585828366 -"1401",1401,0.0004032184528771 -"1402",1402,0.000286960297532526 -"1403",1403,0.000264750516991348 -"1404",1404,0.000333905774233046 -"1405",1405,0.000193004723213501 -"1406",1406,0.000754907138116655 -"1407",1407,0.000333775190413312 -"1408",1408,0.000290972126378906 -"1409",1409,0.000258713002899338 -"1410",1410,0.000241896249814006 -"1411",1411,0.000540225671176403 -"1412",1412,0.000157698306695736 -"1413",1413,0.00019412858602687 -"1414",1414,0.000236701242630307 -"1415",1415,0.000147065555883815 -"1416",1416,0.000576944764809568 -"1417",1417,0.000348545966205479 -"1418",1418,0.000317785987867642 -"1419",1419,0.000169392219159546 -"1420",1420,0.000355525728218811 -"1421",1421,0.000203506268734982 -"1422",1422,0.00020710586575091 -"1423",1423,0.000107523521233702 -"1424",1424,0.000187755522805058 -"1425",1425,0.000122825549165019 -"1426",1426,0.000165364420651487 -"1427",1427,0.000301195218279159 -"1428",1428,0.000172254024929636 -"1429",1429,8.72986105700344e-05 -"1430",1430,0.000193245586906563 -"1431",1431,0.000351625894435494 -"1432",1432,0.000148939908160339 -"1433",1433,0.0002756105495737 -"1434",1434,0.00020912948740072 -"1435",1435,0.000349311635868395 -"1436",1436,0.000326463726446431 -"1437",1437,0.000168292425497221 -"1438",1438,0.000626783774380918 -"1439",1439,0.000669661802123435 -"1440",1440,0.00062911707591456 -"1441",1441,0.000260202812364948 -"1442",1442,0.000311151110383807 -"1443",1443,0.000310293769794891 -"1444",1444,0.00129917345882888 -"1445",1445,0.00118107341910087 -"1446",1446,0.000319983092786607 -"1447",1447,0.000175210406310946 -"1448",1448,0.000521119749256986 -"1449",1449,0.000588839656065486 -"1450",1450,0.000137821825869056 -"1451",1451,0.000264641372848887 -"1452",1452,0.000141890747099627 -"1453",1453,0.000124182510240189 -"1454",1454,7.87348929413182e-05 -"1455",1455,9.31366025750693e-05 -"1456",1456,0.000133953316695327 -"1457",1457,0.000139699620768492 -"1458",1458,0.000708513389608698 -"1459",1459,1.58587570100662e-05 -"1460",1460,0.000177815426033403 -"1461",1461,0.000558083891108499 -"1462",1462,0.00035176956876828 -"1463",1463,0.00044410203585704 -"1464",1464,0.000357474041217382 -"1465",1465,0.000496535489367006 -"1466",1466,0.000893972721554769 -"1467",1467,0.000284166562727627 -"1468",1468,0.000495992991416644 -"1469",1469,0.000340681865535765 -"1470",1470,0.000434170226675345 -"1471",1471,0.000593824910134499 -"1472",1472,0.00070889724635315 -"1473",1473,0.000707084971255789 -"1474",1474,0.000210618685393361 -"1475",1475,0.000180267821341828 -"1476",1476,0.000211032799154723 -"1477",1477,0.000224746755643898 -"1478",1478,2.18239265806209e-05 -"1479",1479,0.000180828223845012 -"1480",1480,0.000191701475169657 -"1481",1481,9.21563188214742e-06 -"1482",1482,0.000185430903080867 -"1483",1483,0.000181987516875579 -"1484",1484,9.29235610902705e-05 -"1485",1485,0.000159224910625552 -"1486",1486,0.000736448307859344 -"1487",1487,0.000120560580125077 -"1488",1488,0.000168179387502132 -"1489",1489,0.000185972936186738 -"1490",1490,0.000134095766679387 -"1491",1491,0.000548147452245097 -"1492",1492,0.000692357056514844 -"1493",1493,0.000188104563671842 -"1494",1494,0.000187543501600447 -"1495",1495,0.000157391040957184 -"1496",1496,0.000225026014439323 -"1497",1497,0.000184583135943715 -"1498",1498,0.000211182281820721 -"1499",1499,0.000200240079329743 -"1500",1500,0.000150222981126052 -"1501",1501,0.000104542479993059 -"1502",1502,0.000152195636307063 -"1503",1503,0.000140248810472915 -"1504",1504,0.000173972337800812 -"1505",1505,0.000159469157864903 -"1506",1506,0.000151477935074793 -"1507",1507,0.00018769656433744 -"1508",1508,0.000774506915175068 -"1509",1509,0.000755636328294812 -"1510",1510,0.000435757412849487 -"1511",1511,0.000550492975377734 -"1512",1512,0.000611280970196769 -"1513",1513,0.00050567962274463 -"1514",1514,0.000449674988711411 -"1515",1515,0.000756715904525718 -"1516",1516,0.000215673806024239 -"1517",1517,4.19209084911916e-05 -"1518",1518,0.000144037412188504 -"1519",1519,0.000115678314113339 -"1520",1520,8.18537387019429e-05 -"1521",1521,3.68857880409487e-06 -"1522",1522,0.000184977208835541 -"1523",1523,0.000184180741516834 -"1524",1524,0.000398145408803469 -"1525",1525,0.000425621280687214 -"1526",1526,0.0004144561852448 -"1527",1527,0.000139961148375469 -"1528",1528,0.000198819405450975 -"1529",1529,0.000163387435541347 -"1530",1530,8.93586059427406e-05 -"1531",1531,0.000510275963858661 -"1532",1532,0.000359621070554236 -"1533",1533,4.5980467516768e-05 -"1534",1534,0.000199432198348367 -"1535",1535,0.000111708045843829 -"1536",1536,9.48488451263824e-05 -"1537",1537,0.000124190494949015 -"1538",1538,0.000125797540168635 -"1539",1539,0.000152312469236939 -"1540",1540,0.000187585960141718 -"1541",1541,3.30247470257962e-05 -"1542",1542,8.16307238217193e-05 -"1543",1543,0.000118114226627848 -"1544",1544,0.000149184753421839 -"1545",1545,3.5620329906154e-05 -"1546",1546,0.000149739852872016 -"1547",1547,5.78881355206679e-06 -"1548",1548,0.000137611907854713 -"1549",1549,0.000419484778553066 -"1550",1550,8.94498288798892e-05 -"1551",1551,1.50399530341058e-05 -"1552",1552,0.00114967471789487 -"1553",1553,3.63856432433517e-05 -"1554",1554,0.000504387350493353 -"1555",1555,0.000482057726575112 -"1556",1556,0.000190506272853399 -"1557",1557,0.000131751354341942 -"1558",1558,0.000150813566506412 -"1559",1559,0.000108896764216185 -"1560",1560,0.00108087154265881 -"1561",1561,0.00089879512204269 -"1562",1562,0.000399002444924893 -"1563",1563,0.000557313939715855 -"1564",1564,0.000141789104271194 -"1565",1565,0.000612638509851497 -"1566",1566,0.000642157805089671 -"1567",1567,0.000674468905294412 -"1568",1568,0.000591356673343606 -"1569",1569,0.000743456436124589 -"1570",1570,0.00183099260081171 -"1571",1571,0.00118671566245094 -"1572",1572,0.00193047219980479 -"1573",1573,0.000251870413145523 -"1574",1574,0.000522776957960861 -"1575",1575,0.000482916474171601 -"1576",1576,0.000302403837198161 -"1577",1577,0.000364570272131513 -"1578",1578,0.000462158851303509 -"1579",1579,0.000558615758183361 -"1580",1580,0.000425153373898738 -"1581",1581,0.000482202677452946 -"1582",1582,0.000179009402958864 -"1583",1583,0.000149687574615928 -"1584",1584,7.79732797802039e-05 -"1585",1585,0.000148146815050707 -"1586",1586,0.000142372120863083 -"1587",1587,0.000168150267601286 -"1588",1588,0.000159263549057148 -"1589",1589,0.000181872934362785 -"1590",1590,0.000193733317528361 -"1591",1591,0.000523251031147993 -"1592",1592,0.000128916253135894 -"1593",1593,0.000428027648132174 -"1594",1594,0.000360465512800145 -"1595",1595,0.000470556331119034 -"1596",1596,0.00010488163356388 -"1597",1597,0.000212956656822548 -"1598",1598,0.000451781361356488 -"1599",1599,0.00026931460640015 -"1600",1600,0.000342043678216851 -"1601",1601,0.000508268815553456 -"1602",1602,0.000206440905044891 -"1603",1603,0.000310998772446122 -"1604",1604,0.00036660762774498 -"1605",1605,0.000401942938559127 -"1606",1606,0.000323017811822846 -"1607",1607,0.000137304988768072 -"1608",1608,8.0223705646252e-05 -"1609",1609,0.000180728000833541 -"1610",1610,0.000126668008103539 -"1611",1611,8.67481122470917e-05 -"1612",1612,0.000481784374969812 -"1613",1613,0.000376285720789621 -"1614",1614,0.000457390268105612 -"1615",1615,0.000485223642529076 -"1616",1616,0.000441232344320191 -"1617",1617,0.000154003794522053 -"1618",1618,1.53843105762623e-05 -"1619",1619,0.000586669370703688 -"1620",1620,0.000551423737650996 -"1621",1621,0.000365298034333118 -"1622",1622,0.00032484709041055 -"1623",1623,0.000477684381909645 -"1624",1624,0.000486541097112895 -"1625",1625,0.0003917347546013 -"1626",1626,0.000703624708684675 -"1627",1627,0.000737924670192941 -"1628",1628,0.000142799768488897 -"1629",1629,9.10629436543595e-05 -"1630",1630,0.000139197117578549 -"1631",1631,9.01295685617915e-05 -"1632",1632,0.000489139730731918 -"1633",1633,0.000473237746155361 -"1634",1634,0.000425928713857976 -"1635",1635,0.000523556115167711 -"1636",1636,0.000155350222477386 -"1637",1637,0.000417360048354928 -"1638",1638,0.000402653400104437 -"1639",1639,0.000667126707347684 -"1640",1640,0.000584961082026643 -"1641",1641,0.000569020651815451 -"1642",1642,0.000406761784169665 -"1643",1643,0.000283686239601264 -"1644",1644,0.000396041096238447 -"1645",1645,0.000211914101220102 -"1646",1646,0.000427183243248376 -"1647",1647,0.000235271003208175 -"1648",1648,0.000444242336576851 -"1649",1649,0.000458997875869401 -"1650",1650,0.000464953789202195 -"1651",1651,0.000199413407928968 -"1652",1652,0.00013316302164942 -"1653",1653,6.91049270655419e-05 -"1654",1654,0.000486494046060687 -"1655",1655,0.000244622898857137 -"1656",1656,5.6975513764748e-06 -"1657",1657,0.000639681399757848 -"1658",1658,0.000382964190155812 -"1659",1659,0.00016132080568577 -"1660",1660,0.000425492876575972 -"1661",1661,0.000578780959375933 -"1662",1662,0.000321538939452641 -"1663",1663,0.000424490815167459 -"1664",1664,0.000393470009599469 -"1665",1665,0.000631613259433437 -"1666",1666,0.000466902674674434 -"1667",1667,0.000651677529701024 -"1668",1668,0.000794532837248361 -"1669",1669,0.000424889424882406 -"1670",1670,0.000536767618726007 -"1671",1671,0.000304970858566484 -"1672",1672,0.000470665911650907 -"1673",1673,0.000973619563648501 -"1674",1674,0.000274817883401335 -"1675",1675,0.00027851920882497 -"1676",1676,0.000325394544417389 -"1677",1677,0.000459719086541861 -"1678",1678,0.000368945860764996 -"1679",1679,0.000223655902951561 -"1680",1680,0.00036167668353057 -"1681",1681,0.00046254368333616 -"1682",1682,0.000213578777576398 -"1683",1683,0.000181309915772883 -"1684",1684,1.65686551156244e-05 -"1685",1685,3.63123899325503e-05 -"1686",1686,0.000461634522693723 -"1687",1687,0.000208681169574167 -"1688",1688,0.000402452839057107 -"1689",1689,0.000255015172393046 -"1690",1690,0.000383576177239937 -"1691",1691,8.40774567514165e-05 -"1692",1692,5.92710717560466e-05 -"1693",1693,0.000103300734940457 -"1694",1694,0.000111440948653274 -"1695",1695,0.000465085502467569 -"1696",1696,0.000521184845173011 -"1697",1697,0.000491975666130518 -"1698",1698,0.00062768787874677 -"1699",1699,0.000224544664429832 -"1700",1700,0.000485832674451996 -"1701",1701,0.000228248545067661 -"1702",1702,0.00019361738761256 -"1703",1703,6.83309592728981e-05 -"1704",1704,0.000241342899881958 -"1705",1705,0.000444440047399411 -"1706",1706,0.000435250375896272 -"1707",1707,0.000109364037108103 -"1708",1708,0.000130365961791836 -"1709",1709,0.000141326491425561 -"1710",1710,9.47551284794042e-05 -"1711",1711,0.000132732813539619 -"1712",1712,0.000132712453627118 -"1713",1713,0.000134176789054569 -"1714",1714,0.000111390410466535 -"1715",1715,0.000135000263976171 -"1716",1716,0.000138782979429263 -"1717",1717,0.000130860054788077 -"1718",1718,6.83132867322413e-05 -"1719",1719,0.000380160987876201 -"1720",1720,0.000144923845023846 -"1721",1721,0.000536918016965412 -"1722",1722,0.000482469625317361 -"1723",1723,0.000184887930846567 -"1724",1724,0.000213620243930239 -"1725",1725,4.37729591692294e-05 -"1726",1726,0.00020040739013581 -"1727",1727,0.00103391951751546 -"1728",1728,0.000992473386093814 -"1729",1729,0.00112979935550767 -"1730",1730,0.00127877633959092 -"1731",1731,0.000453945958890315 -"1732",1732,0.000286399251320397 -"1733",1733,4.1214819106079e-05 -"1734",1734,3.0289478844047e-06 -"1735",1735,0.000595390419953816 -"1736",1736,0.00114551296121379 -"1737",1737,0.00114317451671873 -"1738",1738,0.000485951028180459 -"1739",1739,0.000730688535382549 -"1740",1740,0.00161831302414476 -"1741",1741,0.00105527983730825 -"1742",1742,0.00108071452446955 -"1743",1743,0.000989041345869176 -"1744",1744,0.000934620240611416 -"1745",1745,0.000143612541739256 -"1746",1746,0.000433325533306224 -"1747",1747,0.000373748590609902 -"1748",1748,0.00048969900151222 -"1749",1749,0.000847063154047376 -"1750",1750,0.000261061739613187 -"1751",1751,0.000624092053009362 -"1752",1752,0.000673177277715573 -"1753",1753,0.000282798296256894 -"1754",1754,0.00114269717320759 -"1755",1755,0.000640064090331342 -"1756",1756,0.000304217882392209 -"1757",1757,0.000617026261646742 -"1758",1758,0.000460143372452032 -"1759",1759,0.00059152323552488 -"1760",1760,0.000444255141029276 -"1761",1761,0.000501000336954004 -"1762",1762,0.000521606171496006 -"1763",1763,0.000156201888323278 -"1764",1764,0.000149903166511078 -"1765",1765,0.00012441706679511 -"1766",1766,0.000125075115945165 -"1767",1767,0.000254122445324727 -"1768",1768,0.000376191534809595 -"1769",1769,0.000278428276818945 -"1770",1770,0.000179192582320745 -"1771",1771,0.000105766108102906 -"1772",1772,0.000110809228548831 -"1773",1773,0.000132781405553513 -"1774",1774,0.00029934976791523 -"1775",1775,0.000557490725771206 -"1776",1776,0.000435417769693908 -"1777",1777,0.00015475277272006 -"1778",1778,8.54525281775693e-05 -"1779",1779,0.000195123472822348 -"1780",1780,6.86018964339674e-05 -"1781",1781,0.000604889592542899 -"1782",1782,0.000791546046556529 -"1783",1783,0.000187425257431444 -"1784",1784,0.000172171605159874 -"1785",1785,0.000123393342059025 -"1786",1786,0.000169153668016237 -"1787",1787,0.000231269119367234 -"1788",1788,0.000121584350512354 -"1789",1789,0.00013008972449517 -"1790",1790,0.000281876791416579 -"1791",1791,0.00013581023832613 -"1792",1792,0.000126831245317481 -"1793",1793,0.000117190411821075 -"1794",1794,8.11002709642039e-05 -"1795",1795,0.000194756301821172 -"1796",1796,0.000126558724700071 -"1797",1797,0.000119055847053795 -"1798",1798,0.000142200363174613 -"1799",1799,0.000488642829841335 -"1800",1800,0.000467457136193283 -"1801",1801,0.000430527705403637 -"1802",1802,0.000114858839709363 -"1803",1803,8.57716899875279e-05 -"1804",1804,0.000104999981156315 -"1805",1805,0.00010145062820005 -"1806",1806,0.000423628460817765 -"1807",1807,0.000517570234011221 -"1808",1808,0.000432687802154916 -"1809",1809,0.000389662669563233 -"1810",1810,0.000263524941667563 -"1811",1811,0.000370270899176881 -"1812",1812,0.000926493589996529 -"1813",1813,0.000284054291626912 -"1814",1814,0.000928904051684852 -"1815",1815,0.000179906280730582 -"1816",1816,0.00030245141204448 -"1817",1817,0.00181111786024816 -"1818",1818,0.000307168607162135 -"1819",1819,0.000487791873935846 -"1820",1820,0.000441107355732945 -"1821",1821,0.000869956034583616 -"1822",1822,0.000502521705032869 -"1823",1823,0.000480619749358621 -"1824",1824,0.000167062851397752 -"1825",1825,0.000473857160686981 -"1826",1826,0.000501949296822492 -"1827",1827,0.000535671706103379 -"1828",1828,0.000611675592091015 -"1829",1829,0.000157435899377818 -"1830",1830,0.000125475436290183 -"1831",1831,0.000125890141764824 -"1832",1832,0.000145657959148868 -"1833",1833,0.000343672103721266 -"1834",1834,0.00034891799211888 -"1835",1835,0.000161485003071344 -"1836",1836,0.000139204670673361 -"1837",1837,0.000181161544376493 -"1838",1838,7.098365169897e-05 -"1839",1839,0.000474367061803455 -"1840",1840,0.000424429735638422 -"1841",1841,0.000272186158502011 -"1842",1842,0.000872535003004911 -"1843",1843,0.000782648292101121 -"1844",1844,0.000173795361874246 -"1845",1845,0.000182939923919409 -"1846",1846,0.000344163068533889 -"1847",1847,0.000381219067315619 -"1848",1848,0.000823821206252821 -"1849",1849,0.000774165022839634 -"1850",1850,0.000396876963753486 -"1851",1851,0.000608028468387561 -"1852",1852,0.000500839365124064 -"1853",1853,0.000236002088750429 -"1854",1854,0.000717962312282729 -"1855",1855,0.000282441445974806 -"1856",1856,0.000694646599689039 -"1857",1857,0.000368895404872092 -"1858",1858,0.000455493909352521 -"1859",1859,0.000173570763020757 -"1860",1860,0.000201529218294247 -"1861",1861,0.000125044450996404 -"1862",1862,0.000200603160659634 -"1863",1863,0.000425411050254838 -"1864",1864,0.000150708609609981 -"1865",1865,0.000132063605553103 -"1866",1866,0.000112288765872124 -"1867",1867,0.000146436829880422 -"1868",1868,0.000525705709676172 -"1869",1869,0.000391396706267434 -"1870",1870,0.00021280864301254 -"1871",1871,0.000132429768005611 -"1872",1872,0.000146549812797308 -"1873",1873,0.000186689381250778 -"1874",1874,9.93397926953243e-05 -"1875",1875,0.000331289615616176 -"1876",1876,0.000426233393288078 -"1877",1877,0.000126161247485743 -"1878",1878,0.000175835839938815 -"1879",1879,7.13144984009715e-05 -"1880",1880,0.000136735635176871 -"1881",1881,0.000355352381772631 -"1882",1882,0.000430689185376246 -"1883",1883,0.000195996388217481 -"1884",1884,0.000164332710277733 -"1885",1885,0.000157233708236211 -"1886",1886,0.00014031348965051 -"1887",1887,0.000539831769501696 -"1888",1888,0.000536490682048503 -"1889",1889,5.61715207321416e-05 -"1890",1890,0.000158403530477224 -"1891",1891,0.000180008751748608 -"1892",1892,9.82507455000583e-05 -"1893",1893,0.000151150243521715 -"1894",1894,0.000150340667689051 -"1895",1895,0.000153345670190462 -"1896",1896,0.000133758255859185 -"1897",1897,0.000411127283476183 -"1898",1898,9.82199635485955e-05 -"1899",1899,0.000125423584008599 -"1900",1900,0.000101809410449921 -"1901",1901,0.000101379499352287 -"1902",1902,0.000351751653448775 -"1903",1903,0.000753882057149506 -"1904",1904,0.000601205262610632 -"1905",1905,0.000251273997137291 -"1906",1906,0.000101211902487968 -"1907",1907,0.000481539895572667 -"1908",1908,0.000368878053202238 -"1909",1909,0.000363067835357902 -"1910",1910,4.20634179018116e-05 -"1911",1911,0.000271017367122151 -"1912",1912,0.000285101308111552 -"1913",1913,0.000391986877697901 -"1914",1914,0.000475108052290181 -"1915",1915,0.000120331235625825 -"1916",1916,0.00016219002262334 -"1917",1917,0.00010413042039452 -"1918",1918,7.66915663826865e-05 -"1919",1919,0.000503535938682973 -"1920",1920,0.000223340470937476 -"1921",1921,0.000119686559709701 -"1922",1922,0.000129954074608115 -"1923",1923,0.00010427595753009 -"1924",1924,0.000133264849303968 -"1925",1925,0.000135589989563968 -"1926",1926,7.89547124732711e-05 -"1927",1927,0.000108377451274759 -"1928",1928,0.000105034872487606 -"1929",1929,0.000251297122590393 -"1930",1930,0.000254930817662153 -"1931",1931,0.000560261136627589 -"1932",1932,0.000402128031232366 -"1933",1933,0.000557150336767553 -"1934",1934,0.000538104057459571 -"1935",1935,0.000407794042237768 -"1936",1936,0.000519490735965852 -"1937",1937,0.0004205165636581 -"1938",1938,0.000491467664355921 -"1939",1939,0.000359358105733989 -"1940",1940,0.000269983270810553 -"1941",1941,0.000494033300547077 -"1942",1942,0.000554422127756601 -"1943",1943,0.000410024346075831 -"1944",1944,0.00043693259862366 -"1945",1945,0.000509481117345897 -"1946",1946,0.000445083463141034 -"1947",1947,0.00054368643530886 -"1948",1948,0.000568934763404442 -"1949",1949,0.000971153460378523 -"1950",1950,0.000485111817382617 -"1951",1951,0.000148315627982411 -"1952",1952,0.000345628537279739 -"1953",1953,0.000457566397570972 -"1954",1954,0.000375743507636539 -"1955",1955,0.000399927919231504 -"1956",1956,0.000599928165543495 -"1957",1957,0.00135389067350327 -"1958",1958,0.00110340766090116 -"1959",1959,0.000390248946594715 -"1960",1960,0.000430453501798072 -"1961",1961,0.000525519231193065 -"1962",1962,0.000597776184618432 -"1963",1963,0.00128318904459213 -"1964",1964,0.000187289618783858 -"1965",1965,0.000252702592141521 -"1966",1966,0.000345003044991617 -"1967",1967,0.000514545334330573 -"1968",1968,0.000577342031725909 -"1969",1969,0.000134409922843778 -"1970",1970,0.000364222053225125 -"1971",1971,0.000129496257514237 -"1972",1972,0.000132305244538496 -"1973",1973,0.00013981828942408 -"1974",1974,0.000143798740561899 -"1975",1975,0.000253570899229624 -"1976",1976,0.000265838167441987 -"1977",1977,0.000287433165641764 -"1978",1978,0.0004959684676934 -"1979",1979,0.000548181337419564 -"1980",1980,0.000162961698800952 -"1981",1981,0.000256249685036766 -"1982",1982,0.00011315934536944 -"1983",1983,0.000157818518972397 -"1984",1984,0.000200308009282178 -"1985",1985,8.6787105225567e-05 -"1986",1986,0.000171652214727991 -"1987",1987,0.000143058530407376 -"1988",1988,0.00038099643952766 -"1989",1989,0.000934116452548077 -"1990",1990,0.000346734840645447 -"1991",1991,0.000716569392419096 -"1992",1992,0.00068294379740426 -"1993",1993,0.000833866691748396 -"1994",1994,0.000465249829189034 -"1995",1995,0.000167948901200491 -"1996",1996,0.000159235748890586 -"1997",1997,0.000154047802655894 -"1998",1998,0.000114155531145984 -"1999",1999,3.55216613747532e-05 -"2000",2000,0.000133863648844766 -"2001",2001,0.000157511566791172 -"2002",2002,0.00022017133396519 -"2003",2003,0.000305045081793856 -"2004",2004,0.000545823094078795 -"2005",2005,0.000657838375663964 -"2006",2006,0.000480114180872595 -"2007",2007,0.000145688929065088 -"2008",2008,0.00012672495514911 -"2009",2009,0.000189875970686405 -"2010",2010,0.000246363280138971 -"2011",2011,0.000207509061597454 -"2012",2012,0.000157036980221426 -"2013",2013,0.00014907879778366 -"2014",2014,0.000136251973881424 -"2015",2015,0.000379333904036009 -"2016",2016,0.000506451745698695 -"2017",2017,0.000538397104075347 -"2018",2018,0.000518347966638727 -"2019",2019,0.000682834122965031 -"2020",2020,0.000573674277875197 -"2021",2021,0.000419944980706249 -"2022",2022,0.000470283051243785 -"2023",2023,0.000546493226312468 -"2024",2024,0.00044383591020733 -"2025",2025,0.000577341892693916 -"2026",2026,0.000518585839978937 -"2027",2027,0.000545552682151104 -"2028",2028,0.000496787483863532 -"2029",2029,0.000126182768641015 -"2030",2030,0.000105091886898179 -"2031",2031,0.000171028520015448 -"2032",2032,8.12402319109889e-05 -"2033",2033,0.000459555518892064 -"2034",2034,0.000538267675825816 -"2035",2035,0.000380683507575708 -"2036",2036,0.000695096404826798 -"2037",2037,0.000122893864662014 -"2038",2038,0.000176775546789352 -"2039",2039,0.000143862281958461 -"2040",2040,0.000197312908253194 -"2041",2041,0.000320953705106895 -"2042",2042,0.000398499453133463 -"2043",2043,0.000280553948110776 -"2044",2044,0.000215065359694685 -"2045",2045,0.000484788627053413 -"2046",2046,0.000365352773087221 -"2047",2047,0.000468626564319311 -"2048",2048,0.000377173328027167 -"2049",2049,0.000229254668661094 -"2050",2050,0.000235346428926215 -"2051",2051,0.000364080182039227 -"2052",2052,0.000154210065093896 -"2053",2053,0.000104892514186445 -"2054",2054,0.000156744473378608 -"2055",2055,0.000157133154850494 -"2056",2056,0.000526598078065729 -"2057",2057,0.000597179082010023 -"2058",2058,0.000409817273303773 -"2059",2059,0.000592926349555262 -"2060",2060,0.000386965077436518 -"2061",2061,0.000692582557763516 -"2062",2062,0.000529269041794988 -"2063",2063,0.000570444842559775 -"2064",2064,0.000592285576180379 -"2065",2065,0.000603804962304574 -"2066",2066,0.000388550395668707 -"2067",2067,0.000454804000762646 -"2068",2068,0.000167798398044863 -"2069",2069,0.000115190124705796 -"2070",2070,0.000121606655077947 -"2071",2071,0.000118568915188615 -"2072",2072,0.000497137704327306 -"2073",2073,0.000155474317592645 -"2074",2074,0.000137638526474074 -"2075",2075,0.000137235420231794 -"2076",2076,3.45406516949929e-05 -"2077",2077,0.000531643097949263 -"2078",2078,0.000538711634262154 -"2079",2079,0.000496168527256517 -"2080",2080,0.00015984593498662 -"2081",2081,0.000139583730891297 -"2082",2082,0.000112637082973212 -"2083",2083,9.05355932969471e-05 -"2084",2084,0.000487589425967097 -"2085",2085,0.000143528909292322 -"2086",2086,0.00010845575614906 -"2087",2087,0.000150914912523343 -"2088",2088,9.18991165576099e-05 -"2089",2089,0.000501072745484648 -"2090",2090,9.12687600712404e-05 -"2091",2091,0.000165402949656879 -"2092",2092,0.00011458380914826 -"2093",2093,2.67225767537381e-05 -"2094",2094,0.000146708517188531 -"2095",2095,0.000116769215661631 -"2096",2096,0.000163781278100585 -"2097",2097,0.000144245914066426 -"2098",2098,0.000573371458434949 -"2099",2099,0.000552425459157193 -"2100",2100,0.000574565717542932 -"2101",2101,0.000346236307740672 -"2102",2102,0.000475866206010171 -"2103",2103,0.000426111433929204 -"2104",2104,0.000457338617211595 -"2105",2105,0.000420101007546584 -"2106",2106,0.000512064827328763 -"2107",2107,0.000403448137613355 -"2108",2108,0.00131246797763204 -"2109",2109,0.000634900936067739 -"2110",2110,0.000853201577916302 -"2111",2111,0.000663734356231661 -"2112",2112,0.000144709334142364 -"2113",2113,0.000595019382945609 -"2114",2114,0.000544068254848127 -"2115",2115,0.000895853095692794 -"2116",2116,0.0001745252819824 -"2117",2117,0.000194672592095431 -"2118",2118,0.000118766124012757 -"2119",2119,0.000163506604839599 -"2120",2120,0.000298402958457848 -"2121",2121,0.0001567578131185 -"2122",2122,0.000194017483792695 -"2123",2123,0.000257800941299558 -"2124",2124,0.000129981989904736 -"2125",2125,0.000139043867752961 -"2126",2126,8.98744562899578e-05 -"2127",2127,0.000171294574340422 -"2128",2128,0.000143380280614881 -"2129",2129,0.000138111206423345 -"2130",2130,0.000148788447442796 -"2131",2131,0.000258255107910581 -"2132",2132,0.00224187629438096 -"2133",2133,0.000672318276497619 -"2134",2134,0.0013397779096465 -"2135",2135,0.00107291045662214 -"2136",2136,0.00015364289222317 -"2137",2137,0.000528850986976208 -"2138",2138,0.000337556430773727 -"2139",2139,0.000968391088077227 -"2140",2140,0.000528791848798725 -"2141",2141,0.000935711796146889 -"2142",2142,0.000565906266864033 -"2143",2143,0.00105617360624987 -"2144",2144,0.000869777328323115 -"2145",2145,0.000891485960986883 -"2146",2146,0.000264118912832988 -"2147",2147,0.000544270095228646 -"2148",2148,0.000728882169059165 -"2149",2149,0.0014419002918438 -"2150",2150,0.000119414978947836 -"2151",2151,0.000372694141980846 -"2152",2152,1.42297401856144e-05 -"2153",2153,3.00549324991199e-05 -"2154",2154,8.20964736674275e-05 -"2155",2155,0.000351917536110973 -"2156",2156,0.000210535927094815 -"2157",2157,0.000116941752568076 -"2158",2158,0.00121334573814644 -"2159",2159,0.000459733151008199 -"2160",2160,0.000387688125842948 -"2161",2161,0.000355785170429025 -"2162",2162,0.000263210203399035 -"2163",2163,2.51931264621201e-05 -"2164",2164,0.00114190324667198 -"2165",2165,0.00018193595450541 -"2166",2166,0.000293025247167988 -"2167",2167,0.000289689650893721 -"2168",2168,0.000543819997673481 -"2169",2169,0.000400257074906646 -"2170",2170,0.000363862784846242 -"2171",2171,0.000178720887142699 -"2172",2172,0.000423205542979329 -"2173",2173,0.00169226760819899 -"2174",2174,0.000435568125072375 -"2175",2175,0.000198741362608541 -"2176",2176,0.000564189104175367 -"2177",2177,0.000294744355928593 -"2178",2178,0.000485667203760773 -"2179",2179,0.000498367452550291 -"2180",2180,0.000207976539293299 -"2181",2181,0.000333448863668149 -"2182",2182,0.00049667082110528 -"2183",2183,0.000502841175685865 -"2184",2184,0.000178252311194776 -"2185",2185,0.000186163898990545 -"2186",2186,0.000427696325383753 -"2187",2187,0.000539412473279601 -"2188",2188,0.00107459788176539 -"2189",2189,0.000373039676157318 -"2190",2190,0.000148255554532938 -"2191",2191,0.000142887407290649 -"2192",2192,0.000140980585186356 -"2193",2193,0.000125632297183232 -"2194",2194,0.000376236520730436 -"2195",2195,0.000125669088291915 -"2196",2196,0.00015558339457289 -"2197",2197,9.11504618869254e-05 -"2198",2198,2.30221020577727e-05 -"2199",2199,0.000128949190253985 -"2200",2200,0.00013070318671786 -"2201",2201,0.00013134202980385 -"2202",2202,0.000147190325677962 -"2203",2203,0.000172023189312128 -"2204",2204,0.000108021439474785 -"2205",2205,0.000191006465769828 -"2206",2206,0.000130508294802509 -"2207",2207,0.000323431919945371 -"2208",2208,0.000451665193678926 -"2209",2209,0.000867255940924721 -"2210",2210,0.00012206023905393 -"2211",2211,0.000118710585222828 -"2212",2212,9.61372790251071e-05 -"2213",2213,0.000157404868025362 -"2214",2214,0.000527118057628486 -"2215",2215,0.000389463867380693 -"2216",2216,0.000500715325043267 -"2217",2217,0.000412920511021839 -"2218",2218,0.00023815116770477 -"2219",2219,0.000393135567658323 -"2220",2220,5.89883376455567e-05 -"2221",2221,0.000939057481013538 -"2222",2222,0.000715458480177077 -"2223",2223,0.000560724867008893 -"2224",2224,0.000280635157435583 -"2225",2225,0.000644579025834955 -"2226",2226,0.000844595042979805 -"2227",2227,0.000903505272310748 -"2228",2228,0.000429631170203359 -"2229",2229,0.00035125137037581 -"2230",2230,0.000132385460442997 -"2231",2231,0.000120578477001995 -"2232",2232,0.000159269153023478 -"2233",2233,0.000127424585267416 -"2234",2234,0.00047846382299434 -"2235",2235,0.000558860511533947 -"2236",2236,0.000566454449622516 -"2237",2237,0.000683299287978888 -"2238",2238,0.000718557035337892 -"2239",2239,0.000996008740757915 -"2240",2240,0.000497105307028886 -"2241",2241,0.00053838541850639 -"2242",2242,0.000359624143623081 -"2243",2243,0.000319228799602531 -"2244",2244,0.00122422905579409 -"2245",2245,0.00068256603849176 -"2246",2246,0.000494414091377872 -"2247",2247,0.000343533611870495 -"2248",2248,0.000299416410841423 -"2249",2249,0.000403538166872483 -"2250",2250,0.000853041953327228 -"2251",2251,0.000467686772753817 -"2252",2252,8.36834927291582e-05 -"2253",2253,0.000715295179669921 -"2254",2254,0.000589109174839803 -"2255",2255,0.00110912345679196 -"2256",2256,0.000960774883091835 -"2257",2257,0.000243577177540066 -"2258",2258,0.000545862320841433 -"2259",2259,0.000535420383796041 -"2260",2260,0.000485122623075684 -"2261",2261,0.000460605628169372 -"2262",2262,0.000497789183090377 -"2263",2263,0.000453256965801477 -"2264",2264,0.000533857709459682 -"2265",2265,0.000542370400558788 -"2266",2266,0.000262421225169771 -"2267",2267,0.000756321787102046 -"2268",2268,0.000364793992237118 -"2269",2269,0.000234520305581568 -"2270",2270,0.000371625652976673 -"2271",2271,0.000450913823298531 -"2272",2272,0.000465529483645494 -"2273",2273,0.000444813559813628 -"2274",2274,0.000448846171672069 -"2275",2275,0.000397238448054844 -"2276",2276,0.000538654981282278 -"2277",2277,0.000147603278512967 -"2278",2278,0.000159071057231715 -"2279",2279,0.000178634283443065 -"2280",2280,0.00016845071281591 -"2281",2281,0.000331521150129148 -"2282",2282,0.000193334284437076 -"2283",2283,0.000463246745683746 -"2284",2284,0.000436190273300371 -"2285",2285,0.000595062810908032 -"2286",2286,0.000309578607889115 -"2287",2287,0.000189964792355752 -"2288",2288,0.000116843549739844 -"2289",2289,9.27726940204703e-05 -"2290",2290,0.000154925772078605 -"2291",2291,0.00051918729579506 -"2292",2292,0.000301154320997274 -"2293",2293,0.00063937222315953 -"2294",2294,0.000148754294661125 -"2295",2295,0.000105138909040639 -"2296",2296,0.000112050714752012 -"2297",2297,0.000110102234378543 -"2298",2298,0.00031904047391417 -"2299",2299,0.000324110433152496 -"2300",2300,0.000154517092538009 -"2301",2301,0.000134138889774316 -"2302",2302,0.000127603920874341 -"2303",2303,8.77872081084042e-05 -"2304",2304,5.45725256126423e-05 -"2305",2305,0.000189745416636135 -"2306",2306,0.000465129515649247 -"2307",2307,0.000514699706519584 -"2308",2308,0.00169205004401566 -"2309",2309,0.00100514454797215 -"2310",2310,0.00113220467652084 -"2311",2311,0.000641648774500829 -"2312",2312,0.000810567312416917 -"2313",2313,0.0024629327865533 -"2314",2314,0.00047333554215922 -"2315",2315,0.00138998235873974 -"2316",2316,0.00175225636790341 -"2317",2317,0.000875275107617975 -"2318",2318,0.00109196713549929 -"2319",2319,0.000545363092791108 -"2320",2320,0.000540092995002717 -"2321",2321,0.00132057221484068 -"2322",2322,0.00134205022724737 -"2323",2323,0.000598423046848164 -"2324",2324,0.000365707150375693 -"2325",2325,0.00116433982369353 -"2326",2326,8.57590682918928e-05 -"2327",2327,0.000424465586634612 -"2328",2328,6.93198908715198e-06 -"2329",2329,0.000341124754565039 -"2330",2330,0.000473592848206551 -"2331",2331,0.000485522278193995 -"2332",2332,0.000756520998319805 -"2333",2333,0.000676230029621204 -"2334",2334,0.000574493323294807 -"2335",2335,0.000800947686860555 -"2336",2336,0.000470521558057019 -"2337",2337,0.000702189339348375 -"2338",2338,0.000261054014279217 -"2339",2339,0.00051520273098086 -"2340",2340,0.000456535340118165 -"2341",2341,0.000930067421115118 -"2342",2342,0.00040005571149153 -"2343",2343,0.00113215506364318 -"2344",2344,0.000351537350840229 -"2345",2345,0.000820594002148294 -"2346",2346,0.000715308222063831 -"2347",2347,0.000414025370911447 -"2348",2348,0.000326330074926242 -"2349",2349,0.00101160098414343 -"2350",2350,0.001140430206327 -"2351",2351,0.00044373474105733 -"2352",2352,0.000128210047349478 -"2353",2353,0.000685057738688517 -"2354",2354,0.000518251540755044 -"2355",2355,0.000184169717655104 -"2356",2356,0.00037350843358194 -"2357",2357,0.000610248817931433 -"2358",2358,0.000810440800294654 -"2359",2359,0.000694224623084 -"2360",2360,0.0011594818098269 -"2361",2361,0.000817782022946248 -"2362",2362,0.000326364276921402 -"2363",2363,0.000385279975104184 -"2364",2364,0.000379013534614181 -"2365",2365,0.000517060651323477 -"2366",2366,0.000424338750189747 -"2367",2367,0.000198090222270346 -"2368",2368,0.000282810459422784 -"2369",2369,0.000234287486851976 -"2370",2370,0.000594472674314057 -"2371",2371,0.000790407763321071 -"2372",2372,0.000988767981162864 -"2373",2373,0.000477939671499125 -"2374",2374,0.000223599392581714 -"2375",2375,0.000261271811878879 -"2376",2376,0.000265787498856631 -"2377",2377,0.000513168665823164 -"2378",2378,0.000646850084165939 -"2379",2379,0.000718532275554441 -"2380",2380,0.000261543226408626 -"2381",2381,0.000461119270854651 -"2382",2382,0.00114344915599408 -"2383",2383,0.000143123339947956 -"2384",2384,0.000619903556516532 -"2385",2385,0.000977198542970266 -"2386",2386,0.000706430130747283 -"2387",2387,0.000772512904603499 -"2388",2388,0.000546866903796248 -"2389",2389,0.00137232025566521 -"2390",2390,0.00187503542289278 -"2391",2391,0.000412789545683652 -"2392",2392,0.000770523523820055 -"2393",2393,0.00104439937936764 -"2394",2394,0.000497254943190426 -"2395",2395,0.000353577546507819 -"2396",2396,0.000330701717089396 -"2397",2397,0.000196074800108228 -"2398",2398,0.000844163402282416 -"2399",2399,0.000682345787399251 -"2400",2400,0.000852620211385503 -"2401",2401,0.00123785974410781 -"2402",2402,0.000421478428337833 -"2403",2403,0.000410719607009216 -"2404",2404,0.00031888867986215 -"2405",2405,0.000382060276423757 -"2406",2406,0.000457085751326853 -"2407",2407,0.000329731965542001 -"2408",2408,0.000529060507288162 -"2409",2409,0.000218432709774798 -"2410",2410,0.000310593581669412 -"2411",2411,0.000410478091887513 -"2412",2412,0.00028775300199878 -"2413",2413,0.000246694983257082 -"2414",2414,0.0010084523824905 -"2415",2415,0.000501388182533839 -"2416",2416,0.000449759674732018 -"2417",2417,0.000784574890989652 -"2418",2418,0.000193966353258273 -"2419",2419,0.000302887686528541 -"2420",2420,0.000596408396236127 -"2421",2421,0.00041108024611997 -"2422",2422,0.00115077505696114 -"2423",2423,0.000365747269681737 -"2424",2424,0.000237840290257153 -"2425",2425,0.000341841518789456 -"2426",2426,0.000308290648398608 -"2427",2427,7.48393481092806e-05 -"2428",2428,9.36935019021391e-05 -"2429",2429,0.000177909458647835 -"2430",2430,0.000135111110752352 -"2431",2431,0.000188347912919578 -"2432",2432,0.000954655108134849 -"2433",2433,0.000561858364109226 -"2434",2434,0.000391484885414608 -"2435",2435,0.000581411092904915 -"2436",2436,0.000589523367267951 -"2437",2437,0.000542328729426485 -"2438",2438,0.000412585555928208 -"2439",2439,0.000446230123363986 -"2440",2440,0.000107731665820348 -"2441",2441,0.000237021483758953 -"2442",2442,0.000533168576623295 -"2443",2443,0.000675011116897783 -"2444",2444,0.000385367142090211 -"2445",2445,0.000315929197919758 -"2446",2446,0.000631749705559086 -"2447",2447,0.000192469736714549 -"2448",2448,0.000444478156013351 -"2449",2449,0.000695066081488682 -"2450",2450,0.000299357481683621 -"2451",2451,0.000273533700943715 -"2452",2452,0.00050247014384206 -"2453",2453,0.000777816472663828 -"2454",2454,0.000637782075927348 -"2455",2455,0.000473883527431556 -"2456",2456,0.000300204535593083 -"2457",2457,0.000473504448647731 -"2458",2458,0.00110261623750958 -"2459",2459,0.00131767959504281 -"2460",2460,0.000832893774914215 -"2461",2461,0.00060705461877335 -"2462",2462,0.000485817962095275 -"2463",2463,0.000658155963047079 -"2464",2464,0.000257067904197179 -"2465",2465,0.000221869795096517 -"2466",2466,0.000218880140487701 -"2467",2467,0.000147659405745527 -"2468",2468,0.000327761522577716 -"2469",2469,0.000766240778180117 -"2470",2470,0.000294881045036709 -"2471",2471,0.000208913153939581 -"2472",2472,0.000369065950920138 -"2473",2473,0.000313890126293591 -"2474",2474,0.00100400876817509 -"2475",2475,0.000660220357567784 -"2476",2476,0.00102937210156007 -"2477",2477,0.000178588856988609 -"2478",2478,0.000346753893374863 -"2479",2479,0.000118558318741938 -"2480",2480,2.60326557864656e-05 -"2481",2481,0.000328876655673995 -"2482",2482,9.50107655012956e-05 -"2483",2483,6.70840849542839e-05 -"2484",2484,3.49017042249131e-05 -"2485",2485,0.000136024441742406 -"2486",2486,0.000388531131499462 -"2487",2487,0.000621795621688015 -"2488",2488,0.000108679069968302 -"2489",2489,0.000118897612847618 -"2490",2490,4.95447491717163e-05 -"2491",2491,9.21797338723753e-05 -"2492",2492,0.000142361074316465 -"2493",2493,0.000163090420537314 -"2494",2494,0.000138894182123025 -"2495",2495,7.69557499900884e-05 -"2496",2496,0.000105070208210118 -"2497",2497,9.40002020840597e-05 -"2498",2498,0.00014012855906336 -"2499",2499,0.000158789169949349 -"2500",2500,7.83809013592707e-05 -"2501",2501,0.000144585741585255 -"2502",2502,0.000128664504570965 -"2503",2503,0.000173386998889147 -"2504",2504,0.00014254293735855 -"2505",2505,0.00064987484205636 -"2506",2506,0.000110147439009653 -"2507",2507,0.000556953329430577 -"2508",2508,5.73202311615445e-05 -"2509",2509,9.80765027828298e-05 -"2510",2510,9.79958437615547e-05 -"2511",2511,0.000126338563847512 -"2512",2512,0.000109957853592433 -"2513",2513,0.000169459517958859 -"2514",2514,0.000103628864360704 -"2515",2515,0.000114037801970769 -"2516",2516,7.36353169658329e-05 -"2517",2517,0.000144361445162564 -"2518",2518,9.65594985094023e-05 -"2519",2519,0.000118442943393747 -"2520",2520,8.38647808563975e-05 -"2521",2521,0.000130683379034227 -"2522",2522,0.000126972201400183 -"2523",2523,3.75357092654131e-05 -"2524",2524,7.30047444997003e-05 -"2525",2525,0.000155517163958051 -"2526",2526,0.000160446026200738 -"2527",2527,6.55306944535663e-05 -"2528",2528,1.76682958632107e-05 -"2529",2529,0.000261352900353618 -"2530",2530,0.00057869358657893 -"2531",2531,0.000365972754479095 -"2532",2532,0.000300522681603946 -"2533",2533,0.000103496639331595 -"2534",2534,9.09215949761922e-05 -"2535",2535,0.000206002554665299 -"2536",2536,0.000170351313117752 -"2537",2537,9.43819552052448e-05 -"2538",2538,0.000306174438601252 -"2539",2539,0.000271466545948776 -"2540",2540,2.94876002037509e-05 -"2541",2541,0.000432418382240078 -"2542",2542,0.000256872887432219 -"2543",2543,0.000370584698782316 -"2544",2544,0.000175723249724248 -"2545",2545,0.000127642861014925 -"2546",2546,0.000433338901843463 -"2547",2547,0.000191684221495186 -"2548",2548,0.000145963523610232 -"2549",2549,0.000367679781868363 -"2550",2550,0.000126088796364812 -"2551",2551,0.000151746041077854 -"2552",2552,0.000193355624772236 -"2553",2553,0.000283284253088472 -"2554",2554,0.000184462325197561 -"2555",2555,0.000332639409971762 -"2556",2556,0.000193771743468879 -"2557",2557,0.000262388161115633 -"2558",2558,0.000320351784166376 -"2559",2559,0.000278799333379892 -"2560",2560,0.000164852451982798 -"2561",2561,0.000258705606574694 -"2562",2562,0.000160531023160947 -"2563",2563,0.000164449407502745 -"2564",2564,0.000169397883970897 -"2565",2565,0.000108169839197908 -"2566",2566,0.00019814300912858 -"2567",2567,0.000146330261360712 -"2568",2568,0.000313621569064472 -"2569",2569,0.00031560841150776 -"2570",2570,0.000311054682862559 -"2571",2571,0.000674479012515182 -"2572",2572,0.000220064825846859 -"2573",2573,0.000514800102880376 -"2574",2574,0.00055562976986589 -"2575",2575,0.000371220726464706 -"2576",2576,0.000448748427618649 -"2577",2577,0.000308515158147641 -"2578",2578,0.000420281495239845 -"2579",2579,0.000579574635288872 -"2580",2580,0.000470740871756297 -"2581",2581,0.000484645728275658 -"2582",2582,0.00028255853278449 -"2583",2583,0.000646520029786799 -"2584",2584,9.18408723825155e-05 -"2585",2585,0.000118017930450304 -"2586",2586,0.000220080599368847 -"2587",2587,0.00122385598711099 -"2588",2588,0.000118946904813544 -"2589",2589,0.000540454702800485 -"2590",2590,6.71909547519053e-05 -"2591",2591,0.000178344967203785 -"2592",2592,6.39571124165703e-05 -"2593",2593,0.000239065234287849 -"2594",2594,0.000103430379380476 -"2595",2595,0.00114292799203582 -"2596",2596,9.58965818036721e-05 -"2597",2597,0.000435373177268393 -"2598",2598,7.77735564644196e-05 -"2599",2599,0.000114040392931201 -"2600",2600,0.000122412738067192 -"2601",2601,0.000150832521042609 -"2602",2602,0.000209102986012631 -"2603",2603,0.000134059998184557 -"2604",2604,0.000211826866246222 -"2605",2605,0.000181501877367563 -"2606",2606,0.000154318828309618 -"2607",2607,0.000300909722807914 -"2608",2608,0.00021500960447412 -"2609",2609,0.000276318479564589 -"2610",2610,0.000296581905183368 -"2611",2611,0.000242714828743004 -"2612",2612,0.000513646818423603 -"2613",2613,0.000155119613638946 -"2614",2614,0.00028179097038868 -"2615",2615,0.000350926126927468 -"2616",2616,0.000370793894652872 -"2617",2617,0.000126129273765802 -"2618",2618,9.88382512789192e-05 -"2619",2619,0.000152032372708479 -"2620",2620,0.000123661114827181 -"2621",2621,0.000686358975333943 -"2622",2622,0.000951612150118201 -"2623",2623,0.000324295024874478 -"2624",2624,0.000491945743055591 -"2625",2625,0.000263201923514725 -"2626",2626,0.000332796686125953 -"2627",2627,0.000403336542080511 -"2628",2628,0.000681965016843842 -"2629",2629,0.000163164911535967 -"2630",2630,0.000252683436279039 -"2631",2631,0.000665864648194005 -"2632",2632,0.000215611073370642 -"2633",2633,0.000116101928948964 -"2634",2634,0.000128911858779816 -"2635",2635,0.00027310510737478 -"2636",2636,0.00105361470395151 -"2637",2637,0.000160307496811763 -"2638",2638,9.25427542388079e-05 -"2639",2639,0.00145232205975873 -"2640",2640,0.000225804491802998 -"2641",2641,0.000783852209934499 -"2642",2642,0.00100719678734952 -"2643",2643,0.0013489697979438 -"2644",2644,0.00107975775045714 -"2645",2645,0.000567148760034149 -"2646",2646,0.000410359325257592 -"2647",2647,0.000158634007476433 -"2648",2648,0.000240033846961687 -"2649",2649,0.000884308594756214 -"2650",2650,0.000349476683715271 -"2651",2651,0.000389619973958833 -"2652",2652,0.000492725607935188 -"2653",2653,0.00029747613946904 -"2654",2654,0.000224180026207244 -"2655",2655,0.000800603543036893 -"2656",2656,0.000394458698698803 -"2657",2657,0.000328980773733229 -"2658",2658,0.000840190927285188 -"2659",2659,0.000494041229050872 -"2660",2660,0.000372847934694264 -"2661",2661,0.00132326358771061 -"2662",2662,0.00142717409282528 -"2663",2663,0.000370875810927008 -"2664",2664,0.000191619987057817 -"2665",2665,2.40498984730148e-05 -"2666",2666,0.000485549185799644 -"2667",2667,0.000334592952817497 -"2668",2668,0.000182834875033497 -"2669",2669,0.000600169885381189 -"2670",2670,0.000229334052234296 -"2671",2671,0.000386303224806454 -"2672",2672,0.000320214492929091 -"2673",2673,0.000203915618195048 -"2674",2674,0.000754132607822585 -"2675",2675,0.00099408908068195 -"2676",2676,0.000967388305220698 -"2677",2677,0.000602893136698118 -"2678",2678,0.000435953780983594 -"2679",2679,0.000309787294817844 -"2680",2680,0.000521813920814369 -"2681",2681,0.000418781689092775 -"2682",2682,0.000190720084073095 -"2683",2683,0.000144357091129697 -"2684",2684,0.000148985314366176 -"2685",2685,0.000139676698147896 -"2686",2686,0.000364384019295496 -"2687",2687,0.00012242888606599 -"2688",2688,0.000481337379321387 -"2689",2689,0.000425852831820948 -"2690",2690,0.00127076021861605 -"2691",2691,0.000773543418203352 -"2692",2692,0.00126834503388411 -"2693",2693,0.000536979341499433 -"2694",2694,0.00100814542168755 -"2695",2695,0.00112094975872945 -"2696",2696,0.00047935482719826 -"2697",2697,0.000324957757803279 -"2698",2698,0.000433801029037595 -"2699",2699,0.000305354476640135 -"2700",2700,0.00126526559946978 -"2701",2701,0.000587900599469546 -"2702",2702,0.000259557288505139 -"2703",2703,0.00154683119935604 -"2704",2704,0.00201606920369701 -"2705",2705,0.00191913130701227 -"2706",2706,0.000532669071539098 -"2707",2707,0.00140511800581269 -"2708",2708,0.00071165733875242 -"2709",2709,0.000998887541066405 -"2710",2710,0.0011111436003925 -"2711",2711,0.000757886728446611 -"2712",2712,0.000690103553681261 -"2713",2713,0.00128911719898739 -"2714",2714,0.000963250103725099 -"2715",2715,0.000404600318464692 -"2716",2716,0.00115450000003569 -"2717",2717,0.000837015500179463 -"2718",2718,0.00147947331107549 -"2719",2719,0.00106494267063616 -"2720",2720,0.00174035883892567 -"2721",2721,0.000587197067092699 -"2722",2722,0.0015509963830453 -"2723",2723,0.00162927791100224 -"2724",2724,0.000903975732690188 -"2725",2725,0.00139286094224817 -"2726",2726,0.000136274810081445 -"2727",2727,7.76954452478023e-05 -"2728",2728,0.000463174349152968 -"2729",2729,0.000557912993296545 -"2730",2730,5.02813124260081e-05 -"2731",2731,0.00106771018408921 -"2732",2732,0.000712676401843266 -"2733",2733,0.00122160182541794 -"2734",2734,0.00151891064889692 -"2735",2735,0.000547427929315775 -"2736",2736,0.00060595424682423 -"2737",2737,0.00100248293266659 -"2738",2738,4.53702237491218e-05 -"2739",2739,0.000497350254605497 -"2740",2740,0.00105990688640855 -"2741",2741,0.00103664620775967 -"2742",2742,0.000316914497087783 -"2743",2743,0.000191351750026662 -"2744",2744,7.38542473030362e-05 -"2745",2745,0.00154181387664825 -"2746",2746,0.000215649718163236 -"2747",2747,4.69700198073819e-05 -"2748",2748,0.000469424615178222 -"2749",2749,0.000465297539828778 -"2750",2750,0.000458237639766551 -"2751",2751,0.000450719811631318 -"2752",2752,0.000522373214897968 -"2753",2753,0.000380973643857186 -"2754",2754,0.00230353894453882 -"2755",2755,0.000501041218137435 -"2756",2756,0.000975174532448806 -"2757",2757,0.000991984266326501 -"2758",2758,0.000587955626639968 -"2759",2759,0.00286261755420429 -"2760",2760,0.00089502706695725 -"2761",2761,0.00104940374496005 -"2762",2762,0.000755078021245757 -"2763",2763,0.000291203267989932 -"2764",2764,0.00256682406518508 -"2765",2765,0.000483150831743385 -"2766",2766,0.00246827521303356 -"2767",2767,0.00104947879940985 -"2768",2768,0.000279824691121964 -"2769",2769,0.00181290148998958 -"2770",2770,0.000216749318490924 -"2771",2771,0.00148245927054897 -"2772",2772,0.000466951929215677 -"2773",2773,5.99178593837919e-05 -"2774",2774,0.000354415014968729 -"2775",2775,0.000353014176187383 -"2776",2776,5.74607534451183e-05 -"2777",2777,0.000164960815607886 -"2778",2778,0.000413261164058633 -"2779",2779,0.000138672990042025 -"2780",2780,0.000804424985558818 -"2781",2781,0.000143887642315 -"2782",2782,0.000138326995500383 -"2783",2783,0.000173409094168524 -"2784",2784,0.000143233057670189 -"2785",2785,0.000637562882027756 -"2786",2786,0.00021836511208984 -"2787",2787,0.000164705552962371 -"2788",2788,0.000150191159462884 -"2789",2789,0.000179184125884589 -"2790",2790,0.000577975035642419 -"2791",2791,0.000547753781000247 -"2792",2792,0.000254495028365406 -"2793",2793,0.000193942510763191 -"2794",2794,0.00012141173911355 -"2795",2795,0.000168923609565924 -"2796",2796,0.00014276623182884 -"2797",2797,0.000163068949422394 -"2798",2798,0.000205550231147162 -"2799",2799,0.00012256965162901 -"2800",2800,0.00013642641076108 -"2801",2801,0.000237636993320864 -"2802",2802,0.000126806392587129 -"2803",2803,8.0519858969491e-05 -"2804",2804,0.00011005589255684 -"2805",2805,5.40680297502813e-05 -"2806",2806,3.08560414382781e-05 -"2807",2807,0.000202309267476058 -"2808",2808,0.000556228416382818 -"2809",2809,0.000509843742916849 -"2810",2810,0.000348395054132728 -"2811",2811,0.000222879544173843 -"2812",2812,0.00038658042732135 -"2813",2813,0.000392253831261296 -"2814",2814,0.000106950265833791 -"2815",2815,0.000318457905323785 -"2816",2816,0.000258467774474846 -"2817",2817,0.000284932001660567 -"2818",2818,0.000137601605792817 -"2819",2819,0.000233033833833322 -"2820",2820,0.000263243981180676 -"2821",2821,4.36947435794228e-05 -"2822",2822,2.98699316389482e-05 -"2823",2823,0.000155124779482726 -"2824",2824,0.00113724138225317 -"2825",2825,0.000563352362776032 -"2826",2826,0.00127446362228078 -"2827",2827,0.000334345504952677 -"2828",2828,0.00116886189204731 -"2829",2829,6.84975184525962e-05 -"2830",2830,0.000110717487347685 -"2831",2831,0.000161036216026912 -"2832",2832,0.00020350235183221 -"2833",2833,6.12272494989932e-05 -"2834",2834,0.000168207068716811 -"2835",2835,8.83142869055873e-05 -"2836",2836,0.000190840913436752 -"2837",2837,8.02865217635984e-05 -"2838",2838,0.000940055279050676 -"2839",2839,0.000779222197166866 -"2840",2840,0.00152321074168411 -"2841",2841,0.000867659472820729 -"2842",2842,0.000564042649912696 -"2843",2843,0.000825219805697239 -"2844",2844,0.000740836967638359 -"2845",2845,0.000222372649816406 -"2846",2846,0.000409627552518066 -"2847",2847,0.000564430327849837 -"2848",2848,0.000464831658439471 -"2849",2849,0.000695269361353857 -"2850",2850,0.0012727894873313 -"2851",2851,0.00130264180347784 -"2852",2852,0.00115719196354925 -"2853",2853,0.000926598082468908 -"2854",2854,0.000842853084986944 -"2855",2855,0.000562705111441388 -"2856",2856,0.000231542955471337 -"2857",2857,0.000213111950850611 -"2858",2858,0.00018448584448275 -"2859",2859,0.000652831834345913 -"2860",2860,0.00027086101107664 -"2861",2861,0.000108796256852418 -"2862",2862,4.30913123250591e-05 -"2863",2863,8.37836282292402e-05 -"2864",2864,7.96489892299218e-05 -"2865",2865,0.000104374362204561 -"2866",2866,0.000118444120253431 -"2867",2867,6.73886054511591e-05 -"2868",2868,6.42887917907287e-05 -"2869",2869,0.0015161143695467 -"2870",2870,0.000143803872235832 -"2871",2871,0.000259704748793434 -"2872",2872,0.000535414895096076 -"2873",2873,0.000573681716007983 -"2874",2874,0.000414120848767843 -"2875",2875,0.000526096655880486 -"2876",2876,0.000460332515810601 -"2877",2877,0.000443445914049204 -"2878",2878,0.000881601250816684 -"2879",2879,0.00124059251067971 -"2880",2880,0.00120365045913355 -"2881",2881,0.00112855586837161 -"2882",2882,0.00082790149434152 -"2883",2883,0.000596138482815283 -"2884",2884,9.66528145502645e-05 -"2885",2885,0.000193477884015223 -"2886",2886,0.000135708685380585 -"2887",2887,9.29598290741618e-05 -"2888",2888,0.000187781743407381 -"2889",2889,0.000235694718510181 -"2890",2890,8.43915172386177e-05 -"2891",2891,0.000110045696949853 -"2892",2892,0.000134322288598873 -"2893",2893,0.000105097198541755 -"2894",2894,0.000112447656631118 -"2895",2895,0.000141072656942281 -"2896",2896,0.000669267387221811 -"2897",2897,0.000785639248439269 -"2898",2898,0.000954841493639983 -"2899",2899,0.000493351722116804 -"2900",2900,0.00126317498448021 -"2901",2901,0.000830861207472753 -"2902",2902,0.000395110448220432 -"2903",2903,0.000154586112065321 -"2904",2904,0.000148189075909579 -"2905",2905,6.54890597320194e-05 -"2906",2906,0.000107720471556417 -"2907",2907,0.000144642513573888 -"2908",2908,0.00021045215251696 -"2909",2909,9.4446383966248e-05 -"2910",2910,0.000820770320443553 -"2911",2911,0.000663824626380831 -"2912",2912,0.000437392502110975 -"2913",2913,0.000398034901035792 -"2914",2914,0.000257733995659223 -"2915",2915,0.000325686569880628 -"2916",2916,0.000122800381273265 -"2917",2917,0.000215867524465255 -"2918",2918,0.000227488510679963 -"2919",2919,0.000198913198548793 -"2920",2920,0.000138310528743548 -"2921",2921,0.000682367510907885 -"2922",2922,0.000205178236476559 -"2923",2923,0.00014278527336589 -"2924",2924,0.000228775230253359 -"2925",2925,0.000202744466681051 -"2926",2926,8.39417199649511e-05 -"2927",3161,0.00151891064889692 -"2928",2927,0.000298411222477821 -"2929",2930,0.000304970858566484 -"2930",2931,0.000280470725058376 -"2931",2932,0.000220798193360159 -"2932",2933,0.000391798339180535 -"2933",2934,0.000265015245090025 -"2934",2935,0.000220434806668937 -"2935",2937,0.000308290648398608 -"2936",2938,0.000305183584276883 -"2937",2939,0.00032484709041055 -"2938",2940,0.000302403837198161 -"2939",2941,0.000306174438601252 -"2940",2942,0.000302403837198161 -"2941",2943,0.000252899397546978 -"2942",2944,0.000261271811878879 -"2943",2945,0.000398499453133463 -"2944",2951,8.36834927291582e-05 -"2945",2955,0.000508101250758362 -"2946",2957,0.000425852831820948 -"2947",2958,0.00023557399355914 -"2948",2960,1.91168514679766e-06 -"2949",2962,0.000263402108761569 -"2950",2963,0.000307168607162135 -"2951",2964,0.000290972126378906 -"2952",2965,0.000320953705106895 -"2953",2966,0.000295956201905664 -"2954",2967,0.00030217118055285 -"2955",2968,0.000306890198035492 -"2956",2969,0.000305045081793856 -"2957",2970,0.00030217118055285 -"2958",2971,0.000298402958457848 -"2959",2972,0.00030645651350063 -"2960",2973,0.000220434806668937 -"2961",2974,0.000291787337793132 -"2962",2975,0.000305045081793856 -"2963",2976,0.000300556842482095 -"2964",2977,0.000665006302240963 -"2965",2978,0.000309210156947167 -"2966",2979,0.000309578607889115 -"2967",2980,0.000242759454592311 -"2968",2981,0.000306890198035492 -"2969",2982,0.000328063657202783 -"2970",2983,0.000309787294817844 -"2971",2984,0.00031314573690432 -"2972",2985,0.000298402958457848 -"2973",2987,0.000300909722807914 -"2974",2988,0.000300744030654323 -"2975",2990,0.000291787337793132 -"2976",2991,0.000503739559262856 -"2977",2993,0.00026931460640015 -"2978",2994,0.000310443132774927 -"2979",2995,0.000269957525890716 -"2980",2996,0.000336412037605558 -"2981",2997,0.00028775300199878 -"2982",2998,0.000992473386093814 -"2983",2999,0.000252597491102619 -"2984",3000,0.00034891799211888 -"2985",3001,9.81976744069435e-05 -"2986",3002,0.000308617763088947 -"2987",3003,0.000312310517512375 -"2988",3004,0.000302403837198161 -"2989",3005,0.000313890126293591 -"2990",3006,0.00029934976791523 -"2991",3007,0.000302403837198161 -"2992",3008,0.000264118912832988 -"2993",3009,0.000308290648398608 -"2994",3010,0.000323017811822846 -"2995",3011,0.000308290648398608 -"2996",3012,0.000302403837198161 -"2997",3013,0.000276079790133478 -"2998",3014,0.00031314573690432 -"2999",3015,0.000309525034942948 -"3000",3016,0.000306890198035492 -"3001",3017,0.000302157455675431 -"3002",3018,0.000309578607889115 -"3003",3019,0.00030217118055285 -"3004",3020,0.000298411222477821 -"3005",3021,0.000298411222477821 -"3006",3024,0.000312310517512375 -"3007",3027,0.000298411222477821 -"3008",3028,0.00114292799203582 -"3009",3029,0.000306562572352121 -"3010",3032,0.000398499453133463 -"3011",3033,0.000295956201905664 -"3012",3036,0.000309525034942948 -"3013",3039,0.000328063657202783 -"3014",3041,0.000830861207472753 -"3015",3042,0.000302631135963619 -"3016",3044,0.00030645651350063 -"3017",3045,0.000305520525285662 -"3018",3046,0.000309210156947167 -"3019",3047,0.000294744355928593 -"3020",3048,0.000310443132774927 -"3021",3049,0.000267455003815564 -"3022",3052,0.00082790149434152 -"3023",3056,0.000324303176126267 -"3024",3057,0.000266988562142014 -"3025",3060,0.000412585555928208 -"3026",3061,0.000474367061803455 -"3027",3062,0.000258233961904936 -"3028",3063,0.000551423737650996 -"3029",3065,0.000444478156013351 -"3030",3066,0.00034891799211888 -"3031",3067,0.000304970858566484 -"3032",3072,0.000312310517512375 -"3033",3073,0.000196930102807101 -"3034",3077,0.000294376162070591 -"3035",3078,0.000324315647295881 -"3036",3079,0.00029934976791523 -"3037",3080,0.000327912121988709 -"3038",3081,0.000106741828282351 -"3039",3083,0.000460605628169372 -"3040",3085,0.00123785974410781 -"3041",3087,0.000754907138116655 -"3042",3089,0.000136274810081445 -"3043",3091,0.000551423737650996 -"3044",3099,0.00169226760819899 -"3045",3102,0.000320953705106895 -"3046",3103,0.000312310517512375 -"3047",3104,0.000261271811878879 -"3048",3105,0.000220798193360159 -"3049",3106,0.000321976818189821 -"3050",3107,0.000298411222477821 -"3051",3108,0.000336412037605558 -"3052",3109,0.000173184690817074 -"3053",3110,0.000334208984769455 -"3054",3115,0.000305183584276883 -"3055",3116,0.000324315647295881 -"3056",3117,0.000309578607889115 -"3057",3118,0.000276671237384064 -"3058",3121,0.0013489697979438 -"3059",3126,0.000306562572352121 -"3060",3128,0.000991984266326501 -"3061",3130,0.000263524941667563 -"3062",3131,0.000309210156947167 -"3063",3132,0.000328063657202783 -"3064",3133,0.000302157455675431 -"3065",3134,0.00030645651350063 -"3066",3136,0.00147885516384315 -"3067",3139,0.000504780917347567 -"3068",3142,0.000302157455675431 -"3069",3143,0.000309525034942948 -"3070",3144,0.000309787294817844 -"3071",3145,0.000298402958457848 -"3072",3146,0.000376236520730436 -"3073",3147,0.000308290648398608 -"3074",3148,0.000350849316623487 -"3075",3151,0.000305183584276883 -"3076",3152,0.000106741828282351 -"3077",3154,0.000444466068490434 -"3078",3155,0.00016183208192007 -"3079",3156,0.000460332515810601 -"3080",3157,9.81976744069435e-05 -"3081",3158,0.000482469625317361 -"3082",3159,0.000444466068490434 -"3083",3160,0.000500839365124064 -"3084",3162,0.000321976818189821 -"3085",3163,0.001140430206327 -"3086",3164,0.000309210156947167 -"3087",3165,0.000284354833105859 -"3088",3166,0.000329122776448566 -"3089",3167,0.000295956201905664 -"3090",3168,0.000903505272310748 -"3091",3169,0.000345485532518887 -"3092",3170,0.000324315647295881 -"3093",3171,0.00024374671388135 -"3094",3172,0.000294376162070591 -"3095",3173,0.000308409386740688 -"3096",3174,0.000199413407928968 -"3097",3175,0.00029934976791523 -"3098",3176,0.000264118912832988 -"3099",3177,0.000252899397546978 -"3100",3179,0.000261271811878879 -"3101",3180,0.000302403837198161 -"3102",3181,0.00029934976791523 -"3103",3182,0.000261271811878879 -"3104",3183,0.000269957525890716 -"3105",3184,0.000327912121988709 -"3106",3185,0.000282810459422784 -"3107",3186,0.000136274810081445 -"3108",3187,0.000926598082468908 -"3109",3189,0.00123785974410781 -"3110",3197,0.000467686772753817 -"3111",3200,0.00224187629438096 -"3112",3204,0.000143612541739256 -"3113",3207,0.000308409386740688 -"3114",3208,0.000300204535593083 -"3115",3209,0.000243577177540066 -"3116",3210,0.000306562572352121 -"3117",3211,0.000279824691121964 -"3118",3212,0.000187755522805058 -"3119",3216,0.000324315647295881 -"3120",3217,0.000512064827328763 -"3121",3218,0.000134409922843778 -"3122",3219,0.000272186158502011 -"3123",3220,0.000269957525890716 -"3124",3221,0.000500839365124064 -"3125",3222,0.000323017811822846 -"3126",3224,0.000310998772446122 -"3127",3225,0.000261271811878879 -"3128",3228,0.00047333554215922 -"3129",3229,0.00032484709041055 -"3130",3230,0.000260667788099189 -"3131",3231,0.000260667788099189 -"3132",3235,0.000261271811878879 -"3133",3236,0.000310998772446122 -"3134",3237,0.000267455003815564 -"3135",3238,0.000361346834521608 -"3136",3239,0.00031449190398201 -"3137",3250,0.00187503542289278 -"3138",3252,0.000305068116831022 -"3139",3254,0.000310443132774927 -"3140",3256,0.000302403837198161 -"3141",3257,0.000326364276921402 -"3142",3258,0.000294744355928593 -"3143",3259,0.000326364276921402 -"3144",3260,0.000309525034942948 -"3145",3261,0.000301075612656147 -"3146",3262,0.000300909722807914 -"3147",3263,0.000305520525285662 -"3148",3268,0.000402653400104437 -"3149",3270,0.000391798339180535 -"3150",3271,0.000326463726446431 -"3151",3273,0.000301154320997274 -"3152",3274,0.000332429850343703 -"3153",3276,0.000332429850343703 -"3154",3277,0.000350849316623487 -"3155",3279,0.000304227788092248 -"3156",3280,0.000309210156947167 -"3157",3281,0.000309787294817844 -"3158",3282,0.000261271811878879 -"3159",3283,0.00029028766190922 -"3160",3284,0.000329122776448566 -"3161",3285,0.000304227788092248 -"3162",3286,0.00030217118055285 -"3163",3287,0.000220434806668937 -"3164",3288,0.000203100181475407 -"3165",3289,0.000398499453133463 -"3166",3290,0.000143612541739256 -"3167",3291,0.000251297122590393 -"3168",3292,0.000293025247167988 -"3169",3293,0.000251297122590393 -"3170",3294,0.000251297122590393 -"3171",3295,0.000305354476640135 -"3172",3296,8.70513791886624e-05 -"3173",3297,0.000376236520730436 -"3174",3298,0.000169153668016237 -"3175",3299,0.000266988562142014 -"3176",3300,0.000299416410841423 -"3177",3301,0.000273533700943715 -"3178",3302,0.000482916474171601 -"3179",3303,0.000313890126293591 -"3180",3304,0.000265015245090025 -"3181",3305,0.000306562572352121 -"3182",3306,0.000324303176126267 -"3183",3307,0.000299357481683621 -"3184",3308,0.000300556842482095 -"3185",3310,0.000731284823530134 -"3186",3311,0.000324315647295881 -"3187",3315,0.000991984266326501 -"3188",3316,0.00224187629438096 -"3189",3318,0.000444242336576851 -"3190",3320,0.000323017811822846 -"3191",3328,0.000349311635868395 -"3192",3329,0.000716569392419096 -"3193",3336,0.000611280970196769 -"3194",3337,0.000308409386740688 -"3195",3345,0.000608028468387561 -"3196",3349,0.000327912121988709 -"3197",3350,0.000903505272310748 -"3198",3353,0.00020040739013581 -"3199",3354,0.00029934976791523 -"3200",3355,0.000252899397546978 -"3201",3356,0.000332429850343703 -"3202",3357,0.000326364276921402 -"3203",3358,0.000305068116831022 -"3204",3359,0.000320953705106895 -"3205",3360,0.000321976818189821 -"3206",3361,0.000500839365124064 -"3207",3362,0.00017698361934237 -"3208",3363,0.00020710586575091 -"3209",3364,0.000304217882392209 -"3210",3369,0.000595390419953816 -"3211",3370,0.000263243981180676 -"3212",3371,0.000449759674732018 -"3213",3376,0.000754907138116655 -"3214",3380,0.000269957525890716 -"3215",3381,0.000172254024929636 -"3216",3382,0.000168425162962178 -"3217",3385,0.000286960297532526 -"3218",3396,0.000350849316623487 -"3219",3398,0.000143612541739256 -"3220",3399,0.000267455003815564 -"3221",3401,0.000304227788092248 -"3222",3402,0.00029934976791523 -"3223",3403,0.000302403837198161 -"3224",3404,0.000277815546391841 -"3225",3405,0.000261271811878879 -"3226",3406,0.000301154320997274 -"3227",3407,0.000302403837198161 -"3228",3408,0.000302631135963619 -"3229",3409,0.000584961082026643 -"3230",3410,0.000236002088750429 -"3231",3411,0.000996008740757915 -"3232",3412,0.000236002088750429 -"3233",3413,0.00031314573690432 -"3234",3414,0.00031449190398201 -"3235",3415,0.000300556842482095 -"3236",3417,0.000302157455675431 -"3237",3418,0.000300556842482095 -"3238",3419,0.00020040739013581 -"3239",3420,0.000460605628169372 -"3240",3421,0.000273533700943715 -"3241",3422,0.000266360183433666 -"3242",3423,0.00031449190398201 -"3243",3424,0.000302887686528541 -"3244",3425,0.000169153668016237 -"3245",3426,0.000460605628169372 -"3246",3427,0.000380683507575708 -"3247",3428,0.000313890126293591 -"3248",3429,0.000324303176126267 -"3249",3430,0.000243577177540066 -"3250",3431,0.000252899397546978 -"3251",3432,0.000460605628169372 -"3252",3433,0.00028775300199878 -"3253",3434,0.000261271811878879 -"3254",3435,0.000164763591362037 -"3255",3436,0.001140430206327 -"3256",3437,0.000164763591362037 -"3257",3438,0.000265015245090025 -"3258",3439,0.000263402108761569 -"3259",3443,0.000282810459422784 -"3260",3444,0.00024374671388135 -"3261",3445,0.000220434806668937 -"3262",3446,0.000266360183433666 -"3263",3447,0.000332429850343703 -"3264",3448,0.000258713002899338 -"3265",3450,0.00147885516384315 -"3266",3451,0.000299357481683621 -"3267",3452,0.000310998772446122 -"3268",3453,0.000273716813163038 -"3269",3458,0.000300645118441876 -"3270",3459,1.91168514679766e-06 -"3271",3460,0.000504780917347567 -"3272",3465,0.000283686239601264 -"3273",3468,0.000305068116831022 -"3274",3469,0.000277815546391841 -"3275",3470,0.000313890126293591 -"3276",3471,0.000252899397546978 -"3277",3472,0.000329122776448566 -"3278",3473,0.000305520525285662 -"3279",3474,0.000305520525285662 -"3280",3475,0.000284354833105859 -"3281",3476,0.000305520525285662 -"3282",3477,0.000309525034942948 -"3283",3478,0.000329122776448566 -"3284",3479,0.000309787294817844 -"3285",3480,0.000308617763088947 -"3286",3485,0.000320953705106895 -"3287",3488,0.000328063657202783 -"3288",3491,0.000608028468387561 -"3289",3494,0.000304970858566484 -"3290",3495,0.000298402958457848 -"3291",3496,0.000391798339180535 -"3292",3497,0.000302631135963619 -"3293",3498,0.000310443132774927 -"3294",3499,0.000376236520730436 -"3295",3501,0.000536979341499433 -"3296",3502,0.000833866691748396 -"3297",3503,0.000261061739613187 -"3298",3504,0.000273716813163038 -"3299",3505,0.000433325533306224 -"3300",3506,0.000369077205098422 -"3301",3507,0.000329122776448566 -"3302",3508,0.000482916474171601 -"3303",3509,0.000168425162962178 -"3304",3510,0.000299357481683621 -"3305",3511,0.000268513092070768 -"3306",3512,0.000312310517512375 -"3307",3513,0.00029747613946904 -"3308",3514,0.000294744355928593 -"3309",3515,0.000869956034583616 -"3310",3517,0.000165364420651487 -"3311",3518,0.000449759674732018 -"3312",3519,0.000309525034942948 -"3313",3520,0.000350849316623487 -"3314",3521,0.000350849316623487 -"3315",3522,0.000361346834521608 -"3316",3523,0.000299357481683621 -"3317",3524,0.000482916474171601 -"3318",3525,0.000279824691121964 -"3319",3526,0.000284354833105859 -"3320",3527,0.000309578607889115 -"3321",3528,0.000261271811878879 -"3322",3529,0.000302403837198161 -"3323",3538,0.00082790149434152 -"3324",3540,0.000310593581669412 -"3325",3543,0.00023557098990672 -"3326",3544,0.000134409922843778 -"3327",3545,0.000336550257381565 -"3328",3546,0.000398499453133463 -"3329",3547,0.000220434806668937 -"3330",3548,0.000383670544428727 -"3331",3549,0.000359621070554236 -"3332",3551,0.000485667203760773 -"3333",3552,0.000313890126293591 -"3334",3553,0.000302631135963619 -"3335",3554,0.000261271811878879 -"3336",3555,0.000305068116831022 -"3337",3560,0.00020040739013581 -"3338",3564,0.001140430206327 -"3339",3565,0.001140430206327 -"3340",3566,0.000295956201905664 -"3341",3567,0.000313890126293591 -"3342",3568,0.000308617763088947 -"3343",3570,0.000308409386740688 -"3344",3571,0.001140430206327 -"3345",3573,0.000264118912832988 -"3346",3574,0.000282810459422784 -"3347",3575,0.000305183584276883 -"3348",3576,0.000294376162070591 -"3349",3577,0.000305183584276883 -"3350",3578,0.000242759454592311 -"3351",3579,0.000199413407928968 -"3352",3580,0.000460605628169372 -"3353",3581,0.000332429850343703 -"3354",3586,0.000412585555928208 -"3355",3587,0.000220798193360159 -"3356",3588,0.000326364276921402 -"3357",3589,0.000992473386093814 -"3358",3590,0.000361346834521608 -"3359",3591,0.000302403837198161 -"3360",3592,0.00038658042732135 -"3361",3593,0.000300909722807914 -"3362",3594,0.000305183584276883 -"3363",3595,0.000313890126293591 -"3364",3596,0.000310998772446122 -"3365",3597,0.000329122776448566 -"3366",3598,0.000306562572352121 -"3367",3599,0.000326364276921402 -"3368",3600,0.000308290648398608 -"3369",3601,0.000273716813163038 -"3370",3602,0.000306562572352121 -"3371",3603,0.000381528028400972 -"3372",3604,0.000346734840645447 -"3373",3605,0.00031449190398201 -"3374",3606,0.00031449190398201 -"3375",3607,0.000279824691121964 -"3376",3609,0.000336550257381565 -"3377",3610,0.000369077205098422 -"3378",3611,0.000473504448647731 -"3379",3612,0.000336412037605558 -"3380",3613,0.00019412858602687 -"3381",3614,0.000305354476640135 -"3382",3615,0.000281876791416579 -"3383",3616,0.000220798193360159 -"3384",3618,0.000323017811822846 -"3385",3619,0.000305183584276883 -"3386",3620,0.000267455003815564 -"3387",3621,0.000311054682862559 -"3388",3622,0.000301075612656147 -"3389",3623,0.000306562572352121 -"3390",3624,0.000361346834521608 -"3391",3625,0.000273716813163038 -"3392",3626,0.00029934976791523 -"3393",3629,0.00047714191327394 -"3394",3630,0.000263524941667563 -"3395",3631,0.000243577177540066 -"3396",3632,0.000164763591362037 -"3397",2936,0.000412585555928208 -"3398",2952,0.000604889592542899 -"3399",2953,0.000782648292101121 -"3400",2956,0.000345485532518887 -"3401",2959,0.000406761784169665 -"3402",2961,0.000595390419953816 -"3403",2992,0.00100514454797215 -"3404",3022,0.00181111786024816 -"3405",3023,0.000542328729426485 -"3406",3025,0.000396041096238447 -"3407",3026,0.000833866691748396 -"3408",3030,0.000406761784169665 -"3409",3034,0.000594083862046629 -"3410",3035,0.00114190324667198 -"3411",3037,0.000611675592091015 -"3412",3038,0.000535420383796041 -"3413",3050,0.000915690048841452 -"3414",3053,0.00147885516384315 -"3415",3055,0.000444255141029276 -"3416",3058,0.000284054291626912 -"3417",3059,0.000542328729426485 -"3418",3064,0.000412585555928208 -"3419",3071,0.000402653400104437 -"3420",3076,0.000284054291626912 -"3421",3082,0.000473857160686981 -"3422",3084,0.000444466068490434 -"3423",3086,0.000542328729426485 -"3424",3088,0.000540454702800485 -"3425",3090,0.000540454702800485 -"3426",3092,0.00114190324667198 -"3427",3094,0.00128318904459213 -"3428",3095,0.00068294379740426 -"3429",3096,0.000708513389608698 -"3430",3098,0.000755078021245757 -"3431",3100,0.000510275963858661 -"3432",3114,0.0013489697979438 -"3433",3119,0.000694646599689039 -"3434",3124,0.000833866691748396 -"3435",3135,0.000557912993296545 -"3436",3137,0.00147885516384315 -"3437",3138,0.000718532275554441 -"3438",3141,0.000402653400104437 -"3439",3149,0.00174035883892567 -"3440",3153,0.000473857160686981 -"3441",3178,0.000345485532518887 -"3442",3188,0.00147885516384315 -"3443",3190,0.000833866691748396 -"3444",3191,0.00147885516384315 -"3445",3192,0.000376603514771805 -"3446",3195,0.000718532275554441 -"3447",3196,0.000774538439742599 -"3448",3199,0.00068294379740426 -"3449",3201,0.00128911719898739 -"3450",3202,0.00118856866903728 -"3451",3203,0.000376603514771805 -"3452",3205,0.000262733875457073 -"3453",3206,0.00108284674299263 -"3454",3213,0.00021714270226092 -"3455",3214,0.00070082043007438 -"3456",3215,0.000424429735638422 -"3457",3223,0.000376603514771805 -"3458",3227,0.000345485532518887 -"3459",3232,0.000444255141029276 -"3460",3233,0.000444255141029276 -"3461",3234,0.000542328729426485 -"3462",3247,0.000264750516991348 -"3463",3249,0.000355525728218811 -"3464",3267,0.000376603514771805 -"3465",3269,0.00114190324667198 -"3466",3275,0.000510275963858661 -"3467",3278,0.000599928165543495 -"3468",3309,0.000574565717542932 -"3469",3314,0.000694646599689039 -"3470",3317,0.000594083862046629 -"3471",3319,0.000396041096238447 -"3472",3323,0.000574565717542932 -"3473",3324,0.000220080599368847 -"3474",3325,0.00105527983730825 -"3475",3327,0.000483150831743385 -"3476",3330,0.00100514454797215 -"3477",3331,0.000220080599368847 -"3478",3334,0.000427183243248376 -"3479",3341,0.00105990688640855 -"3480",3344,0.000117362832343631 -"3481",3346,0.000833866691748396 -"3482",3348,0.0013489697979438 -"3483",3351,0.000594083862046629 -"3484",3352,0.000718532275554441 -"3485",3365,0.000424429735638422 -"3486",3366,0.000284054291626912 -"3487",3367,0.000376603514771805 -"3488",3368,0.000444255141029276 -"3489",3372,0.000574565717542932 -"3490",3373,0.000604889592542899 -"3491",3375,0.00174035883892567 -"3492",3377,0.000501041218137435 -"3493",3378,0.000504780917347567 -"3494",3379,0.00116433982369353 -"3495",3383,0.000604889592542899 -"3496",3384,0.000218167997385984 -"3497",3387,0.000155124779482726 -"3498",3388,0.000504780917347567 -"3499",3389,0.000594083862046629 -"3500",3394,0.000503739559262856 -"3501",3395,0.00135389067350327 -"3502",3397,0.000529060507288162 -"3503",3400,0.000542328729426485 -"3504",3416,0.000542328729426485 -"3505",3440,0.000345485532518887 -"3506",3441,0.000284054291626912 -"3507",3442,0.000406761784169665 -"3508",3449,0.00068294379740426 -"3509",3454,0.00021714270226092 -"3510",3455,0.00114190324667198 -"3511",3456,0.000557912993296545 -"3512",3457,0.000427183243248376 -"3513",3461,0.000345485532518887 -"3514",3464,0.00100514454797215 -"3515",3466,0.00089502706695725 -"3516",3481,0.00021714270226092 -"3517",3482,0.000218167997385984 -"3518",3483,0.000424429735638422 -"3519",3484,0.00060286452244339 -"3520",3486,0.000718532275554441 -"3521",3487,0.000155124779482726 -"3522",3490,0.00118856866903728 -"3523",3492,0.00139286094224817 -"3524",3493,0.00135389067350327 -"3525",3516,0.000595390419953816 -"3526",3530,0.000755078021245757 -"3527",3531,0.000755078021245757 -"3528",3536,0.000915690048841452 -"3529",3537,0.000218167997385984 -"3530",3541,0.000412585555928208 -"3531",3542,0.000915690048841452 -"3532",3550,0.000595390419953816 -"3533",3557,0.000755078021245757 -"3534",3558,0.000264750516991348 -"3535",3561,0.000503739559262856 -"3536",3562,0.00070082043007438 -"3537",3572,0.00060286452244339 -"3538",3582,0.000604889592542899 -"3539",3583,0.000510275963858661 -"3540",3584,0.00181111786024816 -"3541",3585,0.000599928165543495 -"3542",3617,0.000218167997385984 -"3543",3628,0.000424429735638422 -"3544",2929,0.000791546046556529 -"3545",2948,0.000954841493639983 -"3546",2954,0.000782648292101121 -"3547",2986,0.000716569392419096 -"3548",2989,0.000449403430205254 -"3549",3031,0.000782648292101121 -"3550",3040,0.000928904051684852 -"3551",3043,0.000716569392419096 -"3552",3051,0.000611675592091015 -"3553",3054,0.000716569392419096 -"3554",3068,0.000915690048841452 -"3555",3069,0.000915690048841452 -"3556",3070,0.000915690048841452 -"3557",3074,0.000716569392419096 -"3558",3075,0.000716569392419096 -"3559",3093,0.000708513389608698 -"3560",3097,0.000264750516991348 -"3561",3101,0.00113724138225317 -"3562",3111,0.000716569392419096 -"3563",3112,0.000716569392419096 -"3564",3113,0.000716569392419096 -"3565",3122,0.000716569392419096 -"3566",3123,0.000716569392419096 -"3567",3125,0.000485122623075684 -"3568",3127,0.000791546046556529 -"3569",3129,0.000830861207472753 -"3570",3140,0.000791546046556529 -"3571",3150,0.000756715904525718 -"3572",3193,0.000915690048841452 -"3573",3194,0.000716569392419096 -"3574",3198,0.000716569392419096 -"3575",3226,0.000716569392419096 -"3576",3240,0.00113724138225317 -"3577",3241,0.00122422905579409 -"3578",3242,0.000954841493639983 -"3579",3243,0.000577813944965751 -"3580",3245,0.000954841493639983 -"3581",3248,0.000436190273300371 -"3582",3253,0.000756715904525718 -"3583",3255,0.000755078021245757 -"3584",3264,0.000915690048841452 -"3585",3265,0.000782648292101121 -"3586",3266,0.000915690048841452 -"3587",3272,0.000611675592091015 -"3588",3312,0.000716569392419096 -"3589",3313,0.000915690048841452 -"3590",3321,0.000954841493639983 -"3591",3322,0.00122422905579409 -"3592",3326,0.000355525728218811 -"3593",3333,0.000436190273300371 -"3594",3338,0.000355525728218811 -"3595",3339,0.000485122623075684 -"3596",3340,0.000483150831743385 -"3597",3342,0.00022054589476491 -"3598",3343,0.000353577546507819 -"3599",3347,0.000716569392419096 -"3600",3374,0.000915690048841452 -"3601",3386,0.000436190273300371 -"3602",3390,0.000830861207472753 -"3603",3392,0.000485122623075684 -"3604",3393,0.000485122623075684 -"3605",3462,0.000436190273300371 -"3606",3463,0.000915690048841452 -"3607",3467,0.00122422905579409 -"3608",3489,0.000915690048841452 -"3609",3500,0.000436190273300371 -"3610",3532,0.000755078021245757 -"3611",3533,0.000264750516991348 -"3612",3534,0.000716569392419096 -"3613",3535,0.000716569392419096 -"3614",3539,0.000915690048841452 -"3615",3556,0.000755078021245757 -"3616",3559,0.000264750516991348 -"3617",3563,0.000264750516991348 -"3618",3569,0.000755078021245757 -"3619",3608,0.000782648292101121 -"3620",3627,0.000716569392419096 -"3621",2928,0.00286261755420429 -"3622",2946,0.000755078021245757 -"3623",2947,0.000755078021245757 -"3624",2949,0.00286261755420429 -"3625",2950,0.000755078021245757 -"3626",3120,0.000755078021245757 -"3627",3244,0.000449403430205254 -"3628",3246,0.000755078021245757 -"3629",3251,0.000449403430205254 -"3630",3332,0.00126317498448021 -"3631",3335,0.00126317498448021 -"3632",3391,0.00060595424682423 diff --git a/Database/data/seasonal_VMT.xlsx b/Database/data/seasonal_VMT.xlsx new file mode 100644 index 0000000..7f5f4c4 Binary files /dev/null and b/Database/data/seasonal_VMT.xlsx differ diff --git a/Database/data/tg_rates.csv b/Database/data/tg_rates.csv deleted file mode 100644 index 3433187..0000000 --- a/Database/data/tg_rates.csv +++ /dev/null @@ -1,21 +0,0 @@ -"","NAICS","CategoryLab","total_Emp","total_trips","mean_rate","sd_rate","trips_emp" -"1",42,"Wholesale Trade",211117,138302.87764262,0.054306056320185,1.0907249095855,1.31020124047443 -"2",48,"Transportation & Warehousing",286088,172550.324671092,0.0462102302464996,1.72155588191626,1.20627446569651 -"3",23,"Construction",208859,105418.279643416,0.0501681138815619,1.06372844061995,1.00946839392524 -"4",31,"Manufacturing",369302,183702.412101598,0.0586375362089278,0.926820916371811,0.994862806600547 -"5",56,"Administrative support & waste services",235794,81310.6501648148,0.0502588693693567,2.06755495467036,0.689675311202277 -"6",81,"Other services",181951,43529.3457471916,0.0408978995111304,1.15170084892178,0.239236639244586 -"7",54,"Professional, scientific, & technical services",379351,56060.3750137273,0.0289806765158682,0.730417145331389,0.147779694830717 -"8",11,"Ag, Forestry, fishing, & hunting",11387,1632.5959057717,0.00329060407340987,0.48574431788492,0.143373663455845 -"9",51,"Information",81171,10253.5873624701,0.00698272554238067,0.437769165268995,0.126320821013294 -"10",44,"Retail Trade",401584,44766.1934825593,0.0276378378942476,0.816508235653153,0.111474046482328 -"11",21,"Mining",1446,139.167593579884,0.000203597539907065,0.0349084055347222,0.0962431490870567 -"12",22,"Utilities",12795,1093.36349985689,0.000615674559377637,0.0652212808159401,0.0854524032713473 -"13",53,"Real estate, rental & leasing",85943,7272.85009263104,0.00759360229904134,0.265957436138571,0.0846241124074217 -"14",71,"Arts, entertainment, & recreation",89455,4054.77595459591,0.00440691233087754,0.25943481154402,0.0453275496573239 -"15",72,"Accommodation & food services",285208,11765.8539069518,0.00576882253558519,0.29514091073291,0.0412535900358749 -"16",55,"Management of companies & enterprises",60127,2382.87183092978,0.0015739648829436,0.085367798371118,0.0396306456488729 -"17",52,"Finance & Insurance",230474,7471.49336876564,0.00417240934028016,0.236756942238187,0.0324179446218039 -"18",61,"Educational services",383252,10293.2579117949,0.00398090263573298,0.219553021732184,0.0268576756593439 -"19",62,"Healthcare & social assistance",561260,15058.3472232268,0.00633589284580108,0.269344682288787,0.0268295392923544 -"20",92,"Public Administration",136229,2475.94727030646,0.00125682308879804,0.164365821451684,0.0181748913249489 diff --git a/Database/data/zone17_county_crosswalk.csv b/Database/data/zone17_county_crosswalk.csv new file mode 100644 index 0000000..f4003a5 --- /dev/null +++ b/Database/data/zone17_county_crosswalk.csv @@ -0,0 +1,3633 @@ +zone17,county_fips,county_name,state +1,17031,COOK,IL +2,17031,COOK,IL +3,17031,COOK,IL +4,17031,COOK,IL +5,17031,COOK,IL +6,17031,COOK,IL +7,17031,COOK,IL +8,17031,COOK,IL +9,17031,COOK,IL +10,17031,COOK,IL +11,17031,COOK,IL +12,17031,COOK,IL +13,17031,COOK,IL +14,17031,COOK,IL +15,17031,COOK,IL +16,17031,COOK,IL +17,17031,COOK,IL +18,17031,COOK,IL +19,17031,COOK,IL +20,17031,COOK,IL +21,17031,COOK,IL +22,17031,COOK,IL +23,17031,COOK,IL +24,17031,COOK,IL +25,17031,COOK,IL +26,17031,COOK,IL +27,17031,COOK,IL +28,17031,COOK,IL +29,17031,COOK,IL +30,17031,COOK,IL +31,17031,COOK,IL +32,17031,COOK,IL +33,17031,COOK,IL +34,17031,COOK,IL +35,17031,COOK,IL +36,17031,COOK,IL +37,17031,COOK,IL +38,17031,COOK,IL +39,17031,COOK,IL +40,17031,COOK,IL +41,17031,COOK,IL +42,17031,COOK,IL +43,17031,COOK,IL +44,17031,COOK,IL +45,17031,COOK,IL +46,17031,COOK,IL +47,17031,COOK,IL +48,17031,COOK,IL +49,17031,COOK,IL +50,17031,COOK,IL +51,17031,COOK,IL +52,17031,COOK,IL +53,17031,COOK,IL +54,17031,COOK,IL +55,17031,COOK,IL +56,17031,COOK,IL +57,17031,COOK,IL +58,17031,COOK,IL +59,17031,COOK,IL +60,17031,COOK,IL +61,17031,COOK,IL +62,17031,COOK,IL +63,17031,COOK,IL +64,17031,COOK,IL +65,17031,COOK,IL +66,17031,COOK,IL +67,17031,COOK,IL +68,17031,COOK,IL +69,17031,COOK,IL +70,17031,COOK,IL +71,17031,COOK,IL +72,17031,COOK,IL +73,17031,COOK,IL +74,17031,COOK,IL +75,17031,COOK,IL +76,17031,COOK,IL +77,17031,COOK,IL +78,17031,COOK,IL +79,17031,COOK,IL +80,17031,COOK,IL +81,17031,COOK,IL +82,17031,COOK,IL +83,17031,COOK,IL +84,17031,COOK,IL +85,17031,COOK,IL +86,17031,COOK,IL +87,17031,COOK,IL +88,17031,COOK,IL +89,17031,COOK,IL +90,17031,COOK,IL +91,17031,COOK,IL +92,17031,COOK,IL +93,17031,COOK,IL +94,17031,COOK,IL +95,17031,COOK,IL +96,17031,COOK,IL +97,17031,COOK,IL +98,17031,COOK,IL +99,17031,COOK,IL +100,17031,COOK,IL +101,17031,COOK,IL +102,17031,COOK,IL +103,17031,COOK,IL +104,17031,COOK,IL +105,17031,COOK,IL +106,17031,COOK,IL +107,17031,COOK,IL +108,17031,COOK,IL +109,17031,COOK,IL +110,17031,COOK,IL +111,17031,COOK,IL +112,17031,COOK,IL +113,17031,COOK,IL +114,17031,COOK,IL +115,17031,COOK,IL +116,17031,COOK,IL +117,17031,COOK,IL +118,17031,COOK,IL +119,17031,COOK,IL +120,17031,COOK,IL +121,17031,COOK,IL +122,17031,COOK,IL +123,17031,COOK,IL +124,17031,COOK,IL +125,17031,COOK,IL +126,17031,COOK,IL +127,17031,COOK,IL +128,17031,COOK,IL +129,17031,COOK,IL +130,17031,COOK,IL +131,17031,COOK,IL +132,17031,COOK,IL +133,17031,COOK,IL +134,17031,COOK,IL +135,17031,COOK,IL +136,17031,COOK,IL +137,17031,COOK,IL +138,17031,COOK,IL +139,17031,COOK,IL +140,17031,COOK,IL +141,17031,COOK,IL +142,17031,COOK,IL +143,17031,COOK,IL +144,17031,COOK,IL +145,17031,COOK,IL +146,17031,COOK,IL +147,17031,COOK,IL +148,17031,COOK,IL +149,17031,COOK,IL +150,17031,COOK,IL +151,17031,COOK,IL +152,17031,COOK,IL +153,17031,COOK,IL +154,17031,COOK,IL +155,17031,COOK,IL +156,17031,COOK,IL +157,17031,COOK,IL +158,17031,COOK,IL +159,17031,COOK,IL +1160,17031,COOK,IL +160,17031,COOK,IL +161,17031,COOK,IL +162,17031,COOK,IL +163,17031,COOK,IL +164,17031,COOK,IL +165,17031,COOK,IL +166,17031,COOK,IL +167,17031,COOK,IL +168,17031,COOK,IL +169,17031,COOK,IL +170,17031,COOK,IL +171,17031,COOK,IL +172,17031,COOK,IL +173,17031,COOK,IL +174,17031,COOK,IL +175,17031,COOK,IL +176,17031,COOK,IL +177,17031,COOK,IL +178,17031,COOK,IL +179,17031,COOK,IL +180,17031,COOK,IL +181,17031,COOK,IL +182,17031,COOK,IL +183,17031,COOK,IL +184,17031,COOK,IL +185,17031,COOK,IL +186,17031,COOK,IL +187,17031,COOK,IL +188,17031,COOK,IL +189,17031,COOK,IL +190,17031,COOK,IL +191,17031,COOK,IL +192,17031,COOK,IL +193,17031,COOK,IL +194,17031,COOK,IL +195,17031,COOK,IL +196,17031,COOK,IL +197,17031,COOK,IL +198,17031,COOK,IL +199,17031,COOK,IL +200,17031,COOK,IL +201,17031,COOK,IL +202,17031,COOK,IL +203,17031,COOK,IL +204,17031,COOK,IL +205,17031,COOK,IL +206,17031,COOK,IL +207,17031,COOK,IL +208,17031,COOK,IL +209,17031,COOK,IL +210,17031,COOK,IL +211,17031,COOK,IL +212,17031,COOK,IL +213,17031,COOK,IL +214,17031,COOK,IL +215,17031,COOK,IL +216,17031,COOK,IL +217,17031,COOK,IL +218,17031,COOK,IL +219,17031,COOK,IL +220,17031,COOK,IL +221,17031,COOK,IL +222,17031,COOK,IL +223,17031,COOK,IL +224,17031,COOK,IL +225,17031,COOK,IL +226,17031,COOK,IL +227,17031,COOK,IL +228,17031,COOK,IL +229,17031,COOK,IL +230,17031,COOK,IL +231,17031,COOK,IL +232,17031,COOK,IL +233,17031,COOK,IL +234,17031,COOK,IL +235,17031,COOK,IL +236,17031,COOK,IL +237,17031,COOK,IL +238,17031,COOK,IL +239,17031,COOK,IL +240,17031,COOK,IL +241,17031,COOK,IL +242,17031,COOK,IL +243,17031,COOK,IL +244,17031,COOK,IL +245,17031,COOK,IL +246,17031,COOK,IL +247,17031,COOK,IL +248,17031,COOK,IL +249,17031,COOK,IL +250,17031,COOK,IL +251,17031,COOK,IL +252,17031,COOK,IL +253,17031,COOK,IL +254,17031,COOK,IL +255,17031,COOK,IL +256,17031,COOK,IL +257,17031,COOK,IL +258,17031,COOK,IL +259,17031,COOK,IL +260,17031,COOK,IL +261,17031,COOK,IL +262,17031,COOK,IL +263,17031,COOK,IL +264,17031,COOK,IL +265,17031,COOK,IL +266,17031,COOK,IL +267,17031,COOK,IL +268,17031,COOK,IL +269,17031,COOK,IL +270,17031,COOK,IL +271,17031,COOK,IL +272,17031,COOK,IL +273,17031,COOK,IL +274,17031,COOK,IL +275,17031,COOK,IL +276,17031,COOK,IL +277,17031,COOK,IL +278,17031,COOK,IL +279,17031,COOK,IL +280,17031,COOK,IL +281,17031,COOK,IL +282,17031,COOK,IL +283,17031,COOK,IL +284,17031,COOK,IL +285,17031,COOK,IL +286,17031,COOK,IL +287,17031,COOK,IL +288,17031,COOK,IL +289,17031,COOK,IL +290,17031,COOK,IL +291,17031,COOK,IL +292,17031,COOK,IL +293,17031,COOK,IL +294,17031,COOK,IL +295,17031,COOK,IL +296,17031,COOK,IL +297,17031,COOK,IL +298,17031,COOK,IL +299,17031,COOK,IL +300,17031,COOK,IL +301,17031,COOK,IL +302,17031,COOK,IL +303,17031,COOK,IL +304,17031,COOK,IL +305,17031,COOK,IL +306,17031,COOK,IL +307,17031,COOK,IL +308,17031,COOK,IL +309,17031,COOK,IL +310,17031,COOK,IL +311,17031,COOK,IL +312,17031,COOK,IL +313,17031,COOK,IL +314,17031,COOK,IL +315,17031,COOK,IL +316,17031,COOK,IL +317,17031,COOK,IL +318,17031,COOK,IL +319,17031,COOK,IL +320,17031,COOK,IL +321,17031,COOK,IL +322,17031,COOK,IL +323,17031,COOK,IL +324,17031,COOK,IL +325,17031,COOK,IL +326,17031,COOK,IL +327,17031,COOK,IL +328,17031,COOK,IL +329,17031,COOK,IL +330,17031,COOK,IL +331,17031,COOK,IL +332,17031,COOK,IL +333,17031,COOK,IL +334,17031,COOK,IL +335,17031,COOK,IL +336,17031,COOK,IL +337,17031,COOK,IL +338,17031,COOK,IL +339,17031,COOK,IL +340,17031,COOK,IL +341,17031,COOK,IL +342,17031,COOK,IL +343,17031,COOK,IL +344,17031,COOK,IL +345,17031,COOK,IL +346,17031,COOK,IL +347,17031,COOK,IL +348,17031,COOK,IL +349,17031,COOK,IL +350,17031,COOK,IL +351,17031,COOK,IL +352,17031,COOK,IL +353,17031,COOK,IL +354,17031,COOK,IL +355,17031,COOK,IL +356,17031,COOK,IL +357,17031,COOK,IL +358,17031,COOK,IL +359,17031,COOK,IL +360,17031,COOK,IL +361,17031,COOK,IL +362,17031,COOK,IL +363,17031,COOK,IL +364,17031,COOK,IL +365,17031,COOK,IL +366,17031,COOK,IL +367,17031,COOK,IL +368,17031,COOK,IL +369,17031,COOK,IL +370,17031,COOK,IL +371,17031,COOK,IL +372,17031,COOK,IL +373,17031,COOK,IL +374,17031,COOK,IL +375,17031,COOK,IL +376,17031,COOK,IL +377,17031,COOK,IL +378,17031,COOK,IL +379,17031,COOK,IL +380,17031,COOK,IL +381,17031,COOK,IL +382,17031,COOK,IL +383,17031,COOK,IL +384,17031,COOK,IL +385,17031,COOK,IL +386,17031,COOK,IL +387,17031,COOK,IL +388,17031,COOK,IL +389,17031,COOK,IL +390,17031,COOK,IL +391,17031,COOK,IL +392,17031,COOK,IL +393,17031,COOK,IL +394,17031,COOK,IL +395,17031,COOK,IL +396,17031,COOK,IL +397,17031,COOK,IL +398,17031,COOK,IL +399,17031,COOK,IL +400,17031,COOK,IL +401,17031,COOK,IL +402,17031,COOK,IL +403,17031,COOK,IL +404,17031,COOK,IL +405,17031,COOK,IL +406,17031,COOK,IL +407,17031,COOK,IL +408,17031,COOK,IL +409,17031,COOK,IL +410,17031,COOK,IL +411,17031,COOK,IL +412,17031,COOK,IL +413,17031,COOK,IL +414,17031,COOK,IL +415,17031,COOK,IL +416,17031,COOK,IL +417,17031,COOK,IL +418,17031,COOK,IL +419,17031,COOK,IL +420,17031,COOK,IL +421,17031,COOK,IL +422,17031,COOK,IL +423,17031,COOK,IL +424,17031,COOK,IL +425,17031,COOK,IL +426,17031,COOK,IL +427,17031,COOK,IL +428,17031,COOK,IL +429,17031,COOK,IL +430,17031,COOK,IL +431,17031,COOK,IL +432,17031,COOK,IL +433,17031,COOK,IL +434,17031,COOK,IL +435,17031,COOK,IL +436,17031,COOK,IL +437,17031,COOK,IL +438,17031,COOK,IL +439,17031,COOK,IL +440,17031,COOK,IL +441,17031,COOK,IL +442,17031,COOK,IL +443,17031,COOK,IL +444,17031,COOK,IL +445,17031,COOK,IL +446,17031,COOK,IL +447,17031,COOK,IL +448,17031,COOK,IL +449,17031,COOK,IL +450,17031,COOK,IL +451,17031,COOK,IL +452,17031,COOK,IL +453,17031,COOK,IL +454,17031,COOK,IL +455,17031,COOK,IL +456,17031,COOK,IL +457,17031,COOK,IL +458,17031,COOK,IL +459,17031,COOK,IL +460,17031,COOK,IL +461,17031,COOK,IL +462,17031,COOK,IL +463,17031,COOK,IL +464,17031,COOK,IL +465,17031,COOK,IL +466,17031,COOK,IL +467,17031,COOK,IL +468,17031,COOK,IL +469,17031,COOK,IL +470,17031,COOK,IL +471,17031,COOK,IL +472,17031,COOK,IL +473,17031,COOK,IL +474,17031,COOK,IL +475,17031,COOK,IL +476,17031,COOK,IL +477,17031,COOK,IL +478,17031,COOK,IL +479,17031,COOK,IL +480,17031,COOK,IL +481,17031,COOK,IL +482,17031,COOK,IL +483,17031,COOK,IL +484,17031,COOK,IL +485,17031,COOK,IL +486,17031,COOK,IL +487,17031,COOK,IL +488,17031,COOK,IL +489,17031,COOK,IL +490,17031,COOK,IL +491,17031,COOK,IL +492,17031,COOK,IL +493,17031,COOK,IL +494,17031,COOK,IL +495,17031,COOK,IL +496,17031,COOK,IL +497,17031,COOK,IL +498,17031,COOK,IL +499,17031,COOK,IL +500,17031,COOK,IL +501,17031,COOK,IL +502,17031,COOK,IL +503,17031,COOK,IL +504,17031,COOK,IL +505,17031,COOK,IL +506,17031,COOK,IL +507,17031,COOK,IL +508,17031,COOK,IL +509,17031,COOK,IL +510,17031,COOK,IL +511,17031,COOK,IL +512,17031,COOK,IL +513,17031,COOK,IL +514,17031,COOK,IL +515,17031,COOK,IL +516,17031,COOK,IL +517,17031,COOK,IL +518,17031,COOK,IL +519,17031,COOK,IL +520,17031,COOK,IL +521,17031,COOK,IL +522,17031,COOK,IL +523,17031,COOK,IL +524,17031,COOK,IL +525,17031,COOK,IL +526,17031,COOK,IL +527,17031,COOK,IL +528,17031,COOK,IL +529,17031,COOK,IL +530,17031,COOK,IL +531,17031,COOK,IL +532,17031,COOK,IL +533,17031,COOK,IL +534,17031,COOK,IL +535,17031,COOK,IL +536,17031,COOK,IL +537,17031,COOK,IL +538,17031,COOK,IL +539,17031,COOK,IL +540,17031,COOK,IL +541,17031,COOK,IL +542,17031,COOK,IL +543,17031,COOK,IL +544,17031,COOK,IL +545,17031,COOK,IL +546,17031,COOK,IL +547,17031,COOK,IL +548,17031,COOK,IL +549,17031,COOK,IL +550,17031,COOK,IL +551,17031,COOK,IL +552,17031,COOK,IL +553,17031,COOK,IL +554,17031,COOK,IL +555,17031,COOK,IL +556,17031,COOK,IL +557,17031,COOK,IL +558,17031,COOK,IL +559,17031,COOK,IL +560,17031,COOK,IL +561,17031,COOK,IL +562,17031,COOK,IL +563,17031,COOK,IL +564,17031,COOK,IL +565,17031,COOK,IL +566,17031,COOK,IL +567,17031,COOK,IL +568,17031,COOK,IL +569,17031,COOK,IL +570,17031,COOK,IL +571,17031,COOK,IL +572,17031,COOK,IL +573,17031,COOK,IL +574,17031,COOK,IL +575,17031,COOK,IL +576,17031,COOK,IL +577,17031,COOK,IL +578,17031,COOK,IL +579,17031,COOK,IL +580,17031,COOK,IL +581,17031,COOK,IL +582,17031,COOK,IL +583,17031,COOK,IL +584,17031,COOK,IL +585,17031,COOK,IL +586,17031,COOK,IL +587,17031,COOK,IL +588,17031,COOK,IL +589,17031,COOK,IL +590,17031,COOK,IL +591,17031,COOK,IL +592,17031,COOK,IL +593,17031,COOK,IL +594,17031,COOK,IL +595,17031,COOK,IL +596,17031,COOK,IL +597,17031,COOK,IL +598,17031,COOK,IL +599,17031,COOK,IL +600,17031,COOK,IL +601,17031,COOK,IL +602,17031,COOK,IL +603,17031,COOK,IL +604,17031,COOK,IL +605,17031,COOK,IL +606,17031,COOK,IL +607,17031,COOK,IL +608,17031,COOK,IL +609,17031,COOK,IL +610,17031,COOK,IL +611,17031,COOK,IL +612,17031,COOK,IL +613,17031,COOK,IL +614,17031,COOK,IL +615,17031,COOK,IL +616,17031,COOK,IL +617,17031,COOK,IL +618,17031,COOK,IL +619,17031,COOK,IL +620,17031,COOK,IL +621,17031,COOK,IL +622,17031,COOK,IL +623,17031,COOK,IL +624,17031,COOK,IL +625,17031,COOK,IL +626,17031,COOK,IL +627,17031,COOK,IL +628,17031,COOK,IL +629,17031,COOK,IL +630,17031,COOK,IL +631,17031,COOK,IL +632,17031,COOK,IL +633,17031,COOK,IL +634,17031,COOK,IL +635,17031,COOK,IL +636,17031,COOK,IL +637,17031,COOK,IL +638,17031,COOK,IL +639,17031,COOK,IL +640,17031,COOK,IL +641,17031,COOK,IL +642,17031,COOK,IL +643,17031,COOK,IL +644,17031,COOK,IL +645,17031,COOK,IL +646,17031,COOK,IL +647,17031,COOK,IL +648,17031,COOK,IL +649,17031,COOK,IL +650,17031,COOK,IL +651,17031,COOK,IL +652,17031,COOK,IL +653,17031,COOK,IL +654,17031,COOK,IL +655,17031,COOK,IL +656,17031,COOK,IL +657,17031,COOK,IL +658,17031,COOK,IL +659,17031,COOK,IL +660,17031,COOK,IL +661,17031,COOK,IL +662,17031,COOK,IL +663,17031,COOK,IL +664,17031,COOK,IL +665,17031,COOK,IL +666,17031,COOK,IL +667,17031,COOK,IL +668,17031,COOK,IL +669,17031,COOK,IL +670,17031,COOK,IL +671,17031,COOK,IL +672,17031,COOK,IL +673,17031,COOK,IL +674,17031,COOK,IL +675,17031,COOK,IL +676,17031,COOK,IL +677,17031,COOK,IL +678,17031,COOK,IL +679,17031,COOK,IL +680,17031,COOK,IL +681,17031,COOK,IL +682,17031,COOK,IL +683,17031,COOK,IL +684,17031,COOK,IL +685,17031,COOK,IL +686,17031,COOK,IL +687,17031,COOK,IL +688,17031,COOK,IL +689,17031,COOK,IL +690,17031,COOK,IL +691,17031,COOK,IL +692,17031,COOK,IL +693,17031,COOK,IL +694,17031,COOK,IL +695,17031,COOK,IL +696,17031,COOK,IL +697,17031,COOK,IL +698,17031,COOK,IL +699,17031,COOK,IL +700,17031,COOK,IL +701,17031,COOK,IL +702,17031,COOK,IL +703,17031,COOK,IL +704,17031,COOK,IL +705,17031,COOK,IL +706,17031,COOK,IL +707,17031,COOK,IL +708,17031,COOK,IL +709,17031,COOK,IL +710,17031,COOK,IL +711,17031,COOK,IL +712,17031,COOK,IL +713,17031,COOK,IL +714,17031,COOK,IL +715,17031,COOK,IL +716,17031,COOK,IL +717,17031,COOK,IL +718,17031,COOK,IL +719,17031,COOK,IL +720,17031,COOK,IL +721,17031,COOK,IL +722,17031,COOK,IL +723,17031,COOK,IL +724,17031,COOK,IL +725,17031,COOK,IL +726,17031,COOK,IL +727,17031,COOK,IL +728,17031,COOK,IL +729,17031,COOK,IL +730,17031,COOK,IL +731,17031,COOK,IL +732,17031,COOK,IL +733,17031,COOK,IL +734,17031,COOK,IL +735,17031,COOK,IL +736,17031,COOK,IL +737,17031,COOK,IL +738,17031,COOK,IL +739,17031,COOK,IL +740,17031,COOK,IL +741,17031,COOK,IL +742,17031,COOK,IL +743,17031,COOK,IL +744,17031,COOK,IL +745,17031,COOK,IL +746,17031,COOK,IL +747,17031,COOK,IL +748,17031,COOK,IL +749,17031,COOK,IL +750,17031,COOK,IL +751,17031,COOK,IL +752,17031,COOK,IL +753,17031,COOK,IL +754,17031,COOK,IL +755,17031,COOK,IL +756,17031,COOK,IL +757,17031,COOK,IL +758,17031,COOK,IL +759,17031,COOK,IL +760,17031,COOK,IL +761,17031,COOK,IL +762,17031,COOK,IL +763,17031,COOK,IL +764,17031,COOK,IL +765,17031,COOK,IL +766,17031,COOK,IL +767,17031,COOK,IL +768,17031,COOK,IL +769,17031,COOK,IL +770,17031,COOK,IL +771,17031,COOK,IL +772,17031,COOK,IL +773,17031,COOK,IL +774,17031,COOK,IL +775,17031,COOK,IL +776,17031,COOK,IL +777,17031,COOK,IL +778,17031,COOK,IL +779,17031,COOK,IL +780,17031,COOK,IL +781,17031,COOK,IL +782,17031,COOK,IL +783,17031,COOK,IL +784,17031,COOK,IL +785,17031,COOK,IL +786,17031,COOK,IL +787,17031,COOK,IL +788,17031,COOK,IL +789,17031,COOK,IL +790,17031,COOK,IL +791,17031,COOK,IL +792,17031,COOK,IL +793,17031,COOK,IL +794,17031,COOK,IL +795,17031,COOK,IL +796,17031,COOK,IL +797,17031,COOK,IL +798,17031,COOK,IL +799,17031,COOK,IL +800,17031,COOK,IL +801,17031,COOK,IL +802,17031,COOK,IL +803,17031,COOK,IL +804,17031,COOK,IL +805,17031,COOK,IL +806,17031,COOK,IL +807,17031,COOK,IL +808,17031,COOK,IL +809,17031,COOK,IL +810,17031,COOK,IL +811,17031,COOK,IL +812,17031,COOK,IL +813,17031,COOK,IL +814,17031,COOK,IL +815,17031,COOK,IL +816,17031,COOK,IL +817,17031,COOK,IL +818,17031,COOK,IL +819,17031,COOK,IL +820,17031,COOK,IL +821,17031,COOK,IL +822,17031,COOK,IL +823,17031,COOK,IL +824,17031,COOK,IL +825,17031,COOK,IL +826,17031,COOK,IL +827,17031,COOK,IL +828,17031,COOK,IL +829,17031,COOK,IL +830,17031,COOK,IL +831,17031,COOK,IL +832,17031,COOK,IL +833,17031,COOK,IL +834,17031,COOK,IL +835,17031,COOK,IL +836,17031,COOK,IL +837,17031,COOK,IL +838,17031,COOK,IL +839,17031,COOK,IL +840,17031,COOK,IL +841,17031,COOK,IL +842,17031,COOK,IL +843,17031,COOK,IL +844,17031,COOK,IL +845,17031,COOK,IL +846,17031,COOK,IL +847,17031,COOK,IL +848,17031,COOK,IL +849,17031,COOK,IL +850,17031,COOK,IL +851,17031,COOK,IL +852,17031,COOK,IL +853,17031,COOK,IL +854,17031,COOK,IL +855,17031,COOK,IL +856,17031,COOK,IL +857,17031,COOK,IL +858,17031,COOK,IL +859,17031,COOK,IL +860,17031,COOK,IL +861,17031,COOK,IL +862,17031,COOK,IL +863,17031,COOK,IL +864,17031,COOK,IL +865,17031,COOK,IL +866,17031,COOK,IL +867,17031,COOK,IL +868,17031,COOK,IL +869,17031,COOK,IL +870,17031,COOK,IL +871,17031,COOK,IL +872,17031,COOK,IL +873,17031,COOK,IL +874,17031,COOK,IL +875,17031,COOK,IL +876,17031,COOK,IL +877,17031,COOK,IL +878,17031,COOK,IL +879,17031,COOK,IL +880,17031,COOK,IL +881,17031,COOK,IL +882,17031,COOK,IL +883,17031,COOK,IL +884,17031,COOK,IL +885,17031,COOK,IL +886,17031,COOK,IL +887,17031,COOK,IL +888,17031,COOK,IL +889,17031,COOK,IL +890,17031,COOK,IL +891,17031,COOK,IL +892,17031,COOK,IL +893,17031,COOK,IL +894,17031,COOK,IL +895,17031,COOK,IL +896,17031,COOK,IL +897,17031,COOK,IL +898,17031,COOK,IL +899,17031,COOK,IL +900,17031,COOK,IL +901,17031,COOK,IL +902,17031,COOK,IL +903,17031,COOK,IL +904,17031,COOK,IL +905,17031,COOK,IL +906,17031,COOK,IL +907,17031,COOK,IL +908,17031,COOK,IL +909,17031,COOK,IL +910,17031,COOK,IL +911,17031,COOK,IL +912,17031,COOK,IL +913,17031,COOK,IL +914,17031,COOK,IL +915,17031,COOK,IL +916,17031,COOK,IL +917,17031,COOK,IL +918,17031,COOK,IL +919,17031,COOK,IL +920,17031,COOK,IL +921,17031,COOK,IL +922,17031,COOK,IL +923,17031,COOK,IL +924,17031,COOK,IL +925,17031,COOK,IL +926,17031,COOK,IL +927,17031,COOK,IL +928,17031,COOK,IL +929,17031,COOK,IL +930,17031,COOK,IL +931,17031,COOK,IL +932,17031,COOK,IL +933,17031,COOK,IL +934,17031,COOK,IL +935,17031,COOK,IL +936,17031,COOK,IL +937,17031,COOK,IL +938,17031,COOK,IL +939,17031,COOK,IL +940,17031,COOK,IL +941,17031,COOK,IL +942,17031,COOK,IL +943,17031,COOK,IL +944,17031,COOK,IL +945,17031,COOK,IL +946,17031,COOK,IL +947,17031,COOK,IL +948,17031,COOK,IL +949,17031,COOK,IL +950,17031,COOK,IL +951,17031,COOK,IL +952,17031,COOK,IL +953,17031,COOK,IL +954,17031,COOK,IL +955,17031,COOK,IL +956,17031,COOK,IL +957,17031,COOK,IL +958,17031,COOK,IL +959,17031,COOK,IL +960,17031,COOK,IL +961,17031,COOK,IL +962,17031,COOK,IL +963,17031,COOK,IL +964,17031,COOK,IL +965,17031,COOK,IL +966,17031,COOK,IL +967,17031,COOK,IL +968,17031,COOK,IL +969,17031,COOK,IL +970,17031,COOK,IL +971,17031,COOK,IL +972,17031,COOK,IL +973,17031,COOK,IL +974,17031,COOK,IL +975,17031,COOK,IL +976,17031,COOK,IL +977,17031,COOK,IL +978,17031,COOK,IL +979,17031,COOK,IL +980,17031,COOK,IL +981,17031,COOK,IL +982,17031,COOK,IL +983,17031,COOK,IL +984,17031,COOK,IL +985,17031,COOK,IL +986,17031,COOK,IL +987,17031,COOK,IL +988,17031,COOK,IL +989,17031,COOK,IL +990,17031,COOK,IL +991,17031,COOK,IL +992,17031,COOK,IL +993,17031,COOK,IL +994,17031,COOK,IL +995,17031,COOK,IL +996,17031,COOK,IL +997,17031,COOK,IL +998,17031,COOK,IL +999,17031,COOK,IL +1000,17031,COOK,IL +1001,17031,COOK,IL +1002,17031,COOK,IL +1003,17031,COOK,IL +1004,17031,COOK,IL +1005,17031,COOK,IL +1006,17031,COOK,IL +1007,17031,COOK,IL +1008,17031,COOK,IL +1009,17031,COOK,IL +1010,17031,COOK,IL +1011,17031,COOK,IL +1012,17031,COOK,IL +1013,17031,COOK,IL +1014,17031,COOK,IL +1015,17031,COOK,IL +1016,17031,COOK,IL +1017,17031,COOK,IL +1018,17031,COOK,IL +1019,17031,COOK,IL +1020,17031,COOK,IL +1021,17031,COOK,IL +1022,17031,COOK,IL +1023,17031,COOK,IL +1024,17031,COOK,IL +1025,17031,COOK,IL +1026,17031,COOK,IL +1027,17031,COOK,IL +1028,17031,COOK,IL +1029,17031,COOK,IL +1030,17031,COOK,IL +1031,17031,COOK,IL +1032,17031,COOK,IL +1033,17031,COOK,IL +1034,17031,COOK,IL +1035,17031,COOK,IL +1036,17031,COOK,IL +1037,17031,COOK,IL +1038,17031,COOK,IL +1039,17031,COOK,IL +1040,17031,COOK,IL +1041,17031,COOK,IL +1042,17031,COOK,IL +1043,17031,COOK,IL +1044,17031,COOK,IL +1045,17031,COOK,IL +1046,17031,COOK,IL +1047,17031,COOK,IL +1048,17031,COOK,IL +1049,17031,COOK,IL +1050,17031,COOK,IL +1051,17031,COOK,IL +1052,17031,COOK,IL +1053,17031,COOK,IL +1054,17031,COOK,IL +1055,17031,COOK,IL +1056,17031,COOK,IL +1057,17031,COOK,IL +1058,17031,COOK,IL +1059,17031,COOK,IL +1060,17031,COOK,IL +1061,17031,COOK,IL +1062,17031,COOK,IL +1063,17031,COOK,IL +1064,17031,COOK,IL +1065,17031,COOK,IL +1066,17031,COOK,IL +1067,17031,COOK,IL +1068,17031,COOK,IL +1069,17031,COOK,IL +1070,17031,COOK,IL +1071,17031,COOK,IL +1072,17031,COOK,IL +1073,17031,COOK,IL +1074,17031,COOK,IL +1075,17031,COOK,IL +1076,17031,COOK,IL +1077,17031,COOK,IL +1078,17031,COOK,IL +1079,17031,COOK,IL +1080,17031,COOK,IL +1081,17031,COOK,IL +1082,17031,COOK,IL +1083,17031,COOK,IL +1084,17031,COOK,IL +1085,17031,COOK,IL +1086,17031,COOK,IL +1087,17031,COOK,IL +1088,17031,COOK,IL +1089,17031,COOK,IL +1090,17031,COOK,IL +1091,17031,COOK,IL +1092,17031,COOK,IL +1093,17031,COOK,IL +1094,17031,COOK,IL +1095,17031,COOK,IL +1096,17031,COOK,IL +1097,17031,COOK,IL +1098,17031,COOK,IL +1099,17031,COOK,IL +1100,17031,COOK,IL +1101,17031,COOK,IL +1102,17031,COOK,IL +1103,17031,COOK,IL +1104,17031,COOK,IL +1105,17031,COOK,IL +1106,17031,COOK,IL +1107,17031,COOK,IL +1108,17031,COOK,IL +1109,17031,COOK,IL +1110,17031,COOK,IL +1111,17031,COOK,IL +1112,17031,COOK,IL +1113,17031,COOK,IL +1114,17031,COOK,IL +1115,17031,COOK,IL +1116,17031,COOK,IL +1117,17031,COOK,IL +1118,17031,COOK,IL +1119,17031,COOK,IL +1120,17031,COOK,IL +1121,17031,COOK,IL +1122,17031,COOK,IL +1123,17031,COOK,IL +1124,17031,COOK,IL +1125,17031,COOK,IL +1126,17031,COOK,IL +1127,17031,COOK,IL +1128,17031,COOK,IL +1129,17031,COOK,IL +1130,17031,COOK,IL +1131,17031,COOK,IL +1132,17031,COOK,IL +1133,17031,COOK,IL +1134,17031,COOK,IL +1135,17031,COOK,IL +1136,17031,COOK,IL +1137,17031,COOK,IL +1138,17031,COOK,IL +1139,17031,COOK,IL +1140,17031,COOK,IL +1141,17031,COOK,IL +1142,17031,COOK,IL +1143,17031,COOK,IL +1144,17031,COOK,IL +1145,17031,COOK,IL +1146,17031,COOK,IL +1147,17031,COOK,IL +1148,17031,COOK,IL +1149,17031,COOK,IL +1150,17031,COOK,IL +1151,17031,COOK,IL +1152,17031,COOK,IL +1153,17031,COOK,IL +1154,17031,COOK,IL +1155,17031,COOK,IL +1156,17031,COOK,IL +1157,17031,COOK,IL +1158,17031,COOK,IL +1159,17031,COOK,IL +1161,17031,COOK,IL +1162,17031,COOK,IL +1163,17031,COOK,IL +1164,17031,COOK,IL +1165,17031,COOK,IL +1166,17031,COOK,IL +1167,17031,COOK,IL +1168,17031,COOK,IL +1169,17031,COOK,IL +1170,17031,COOK,IL +1171,17031,COOK,IL +1172,17031,COOK,IL +1173,17031,COOK,IL +1174,17031,COOK,IL +1175,17031,COOK,IL +1176,17031,COOK,IL +1177,17031,COOK,IL +1178,17031,COOK,IL +1179,17031,COOK,IL +1180,17031,COOK,IL +1181,17031,COOK,IL +1182,17031,COOK,IL +1183,17031,COOK,IL +1184,17031,COOK,IL +1185,17031,COOK,IL +1186,17031,COOK,IL +1187,17031,COOK,IL +1188,17031,COOK,IL +1189,17031,COOK,IL +1190,17031,COOK,IL +1191,17031,COOK,IL +1192,17031,COOK,IL +1193,17031,COOK,IL +1194,17031,COOK,IL +1195,17031,COOK,IL +1196,17031,COOK,IL +1197,17031,COOK,IL +1198,17031,COOK,IL +1199,17031,COOK,IL +1200,17031,COOK,IL +1201,17031,COOK,IL +1202,17031,COOK,IL +1203,17031,COOK,IL +1204,17031,COOK,IL +1205,17031,COOK,IL +1206,17031,COOK,IL +1207,17031,COOK,IL +1208,17031,COOK,IL +1209,17031,COOK,IL +1210,17031,COOK,IL +1211,17031,COOK,IL +1212,17031,COOK,IL +1213,17031,COOK,IL +1214,17031,COOK,IL +1215,17031,COOK,IL +1216,17031,COOK,IL +1217,17031,COOK,IL +1218,17031,COOK,IL +1219,17031,COOK,IL +1220,17031,COOK,IL +1221,17031,COOK,IL +1222,17031,COOK,IL +1223,17031,COOK,IL +1224,17031,COOK,IL +1225,17031,COOK,IL +1226,17031,COOK,IL +1227,17031,COOK,IL +1228,17031,COOK,IL +1229,17031,COOK,IL +1230,17031,COOK,IL +1231,17031,COOK,IL +1232,17031,COOK,IL +1233,17031,COOK,IL +1234,17031,COOK,IL +1235,17031,COOK,IL +1236,17031,COOK,IL +1237,17031,COOK,IL +1238,17031,COOK,IL +1239,17031,COOK,IL +1240,17031,COOK,IL +1241,17031,COOK,IL +1242,17031,COOK,IL +1243,17031,COOK,IL +1244,17031,COOK,IL +1245,17031,COOK,IL +1246,17031,COOK,IL +1247,17031,COOK,IL +1248,17031,COOK,IL +1249,17031,COOK,IL +1250,17031,COOK,IL +1251,17031,COOK,IL +1252,17031,COOK,IL +1253,17031,COOK,IL +1254,17031,COOK,IL +1255,17031,COOK,IL +1256,17031,COOK,IL +1257,17031,COOK,IL +1258,17031,COOK,IL +1259,17031,COOK,IL +1260,17031,COOK,IL +1261,17031,COOK,IL +1262,17031,COOK,IL +1263,17031,COOK,IL +1264,17031,COOK,IL +1265,17031,COOK,IL +1266,17031,COOK,IL +1267,17031,COOK,IL +1268,17031,COOK,IL +1269,17031,COOK,IL +1270,17031,COOK,IL +1271,17031,COOK,IL +1272,17031,COOK,IL +1273,17031,COOK,IL +1274,17031,COOK,IL +1275,17031,COOK,IL +1276,17031,COOK,IL +1277,17031,COOK,IL +1278,17031,COOK,IL +1279,17031,COOK,IL +1280,17031,COOK,IL +1281,17031,COOK,IL +1282,17031,COOK,IL +1283,17031,COOK,IL +1284,17031,COOK,IL +1285,17031,COOK,IL +1286,17031,COOK,IL +1287,17031,COOK,IL +1288,17031,COOK,IL +1289,17031,COOK,IL +1290,17031,COOK,IL +1291,17031,COOK,IL +1292,17031,COOK,IL +1293,17031,COOK,IL +1294,17031,COOK,IL +1295,17031,COOK,IL +1296,17031,COOK,IL +1297,17031,COOK,IL +1298,17031,COOK,IL +1299,17031,COOK,IL +1300,17031,COOK,IL +1301,17031,COOK,IL +1302,17031,COOK,IL +1303,17031,COOK,IL +1304,17031,COOK,IL +1305,17031,COOK,IL +1306,17031,COOK,IL +1307,17031,COOK,IL +1308,17031,COOK,IL +1309,17031,COOK,IL +1310,17031,COOK,IL +1311,17031,COOK,IL +1312,17031,COOK,IL +1313,17031,COOK,IL +1314,17031,COOK,IL +1315,17031,COOK,IL +1316,17031,COOK,IL +1317,17031,COOK,IL +1318,17031,COOK,IL +1319,17031,COOK,IL +1320,17031,COOK,IL +1321,17031,COOK,IL +1322,17031,COOK,IL +1323,17031,COOK,IL +1324,17031,COOK,IL +1325,17031,COOK,IL +1326,17031,COOK,IL +1327,17031,COOK,IL +1328,17031,COOK,IL +1329,17031,COOK,IL +1330,17031,COOK,IL +1331,17031,COOK,IL +1332,17031,COOK,IL +1333,17031,COOK,IL +1334,17031,COOK,IL +1335,17031,COOK,IL +1336,17031,COOK,IL +1337,17031,COOK,IL +1338,17031,COOK,IL +1339,17031,COOK,IL +1340,17031,COOK,IL +1341,17031,COOK,IL +1342,17031,COOK,IL +1343,17031,COOK,IL +1344,17031,COOK,IL +1345,17031,COOK,IL +1346,17031,COOK,IL +1347,17031,COOK,IL +1348,17031,COOK,IL +1349,17031,COOK,IL +1350,17031,COOK,IL +1351,17031,COOK,IL +1352,17031,COOK,IL +1353,17031,COOK,IL +1354,17031,COOK,IL +1355,17031,COOK,IL +1356,17031,COOK,IL +1357,17031,COOK,IL +1358,17031,COOK,IL +1359,17031,COOK,IL +1360,17031,COOK,IL +1361,17031,COOK,IL +1362,17031,COOK,IL +1363,17031,COOK,IL +1364,17031,COOK,IL +1365,17031,COOK,IL +1366,17031,COOK,IL +1367,17031,COOK,IL +1368,17031,COOK,IL +1369,17031,COOK,IL +1370,17031,COOK,IL +1371,17031,COOK,IL +1372,17031,COOK,IL +1373,17031,COOK,IL +1374,17031,COOK,IL +1375,17031,COOK,IL +1376,17031,COOK,IL +1377,17031,COOK,IL +1378,17031,COOK,IL +1379,17031,COOK,IL +1380,17031,COOK,IL +1381,17031,COOK,IL +1382,17031,COOK,IL +1383,17031,COOK,IL +1384,17031,COOK,IL +1385,17031,COOK,IL +1386,17031,COOK,IL +1387,17031,COOK,IL +1388,17031,COOK,IL +1389,17031,COOK,IL +1390,17031,COOK,IL +1391,17031,COOK,IL +1392,17031,COOK,IL +1393,17031,COOK,IL +1394,17031,COOK,IL +1395,17031,COOK,IL +1396,17031,COOK,IL +1397,17031,COOK,IL +1398,17031,COOK,IL +1399,17031,COOK,IL +1400,17031,COOK,IL +1401,17031,COOK,IL +1402,17031,COOK,IL +1403,17031,COOK,IL +1404,17031,COOK,IL +1405,17031,COOK,IL +1406,17031,COOK,IL +1407,17031,COOK,IL +1408,17031,COOK,IL +1409,17031,COOK,IL +1410,17031,COOK,IL +1411,17031,COOK,IL +1412,17031,COOK,IL +1413,17031,COOK,IL +1414,17031,COOK,IL +1415,17031,COOK,IL +1416,17031,COOK,IL +1417,17031,COOK,IL +1418,17031,COOK,IL +1419,17031,COOK,IL +1420,17031,COOK,IL +1421,17031,COOK,IL +1422,17031,COOK,IL +1423,17031,COOK,IL +1424,17031,COOK,IL +1425,17031,COOK,IL +1426,17031,COOK,IL +1427,17031,COOK,IL +1428,17031,COOK,IL +1429,17031,COOK,IL +1430,17031,COOK,IL +1431,17031,COOK,IL +1432,17031,COOK,IL +1433,17031,COOK,IL +1434,17031,COOK,IL +1435,17031,COOK,IL +1436,17031,COOK,IL +1437,17031,COOK,IL +1438,17031,COOK,IL +1439,17031,COOK,IL +1440,17031,COOK,IL +1441,17031,COOK,IL +1442,17031,COOK,IL +1443,17031,COOK,IL +1444,17031,COOK,IL +1445,17031,COOK,IL +1446,17031,COOK,IL +1447,17031,COOK,IL +1448,17031,COOK,IL +1449,17031,COOK,IL +1450,17031,COOK,IL +1451,17031,COOK,IL +1452,17031,COOK,IL +1453,17031,COOK,IL +1454,17031,COOK,IL +1455,17031,COOK,IL +1456,17031,COOK,IL +1457,17031,COOK,IL +1458,17031,COOK,IL +1459,17031,COOK,IL +1460,17031,COOK,IL +1461,17031,COOK,IL +1462,17031,COOK,IL +1463,17031,COOK,IL +1464,17031,COOK,IL +1465,17031,COOK,IL +1466,17031,COOK,IL +1467,17031,COOK,IL +1468,17031,COOK,IL +1469,17031,COOK,IL +1470,17031,COOK,IL +1471,17031,COOK,IL +1472,17031,COOK,IL +1473,17031,COOK,IL +1474,17031,COOK,IL +1475,17031,COOK,IL +1476,17031,COOK,IL +1477,17031,COOK,IL +1478,17031,COOK,IL +1479,17031,COOK,IL +1480,17031,COOK,IL +1481,17031,COOK,IL +1482,17031,COOK,IL +1483,17031,COOK,IL +1484,17031,COOK,IL +1485,17031,COOK,IL +1486,17031,COOK,IL +1487,17031,COOK,IL +1488,17031,COOK,IL +1489,17031,COOK,IL +1490,17031,COOK,IL +1491,17031,COOK,IL +1492,17031,COOK,IL +1493,17031,COOK,IL +1494,17031,COOK,IL +1495,17031,COOK,IL +1496,17031,COOK,IL +1497,17031,COOK,IL +1498,17031,COOK,IL +1499,17031,COOK,IL +1500,17031,COOK,IL +1501,17031,COOK,IL +1502,17031,COOK,IL +1503,17031,COOK,IL +1504,17031,COOK,IL +1505,17031,COOK,IL +1506,17031,COOK,IL +1507,17031,COOK,IL +1508,17031,COOK,IL +1509,17031,COOK,IL +1510,17031,COOK,IL +1511,17031,COOK,IL +1512,17031,COOK,IL +1513,17031,COOK,IL +1514,17031,COOK,IL +1515,17031,COOK,IL +1516,17031,COOK,IL +1517,17031,COOK,IL +1518,17031,COOK,IL +1519,17031,COOK,IL +1520,17031,COOK,IL +1521,17031,COOK,IL +1522,17031,COOK,IL +1523,17031,COOK,IL +1524,17031,COOK,IL +1525,17031,COOK,IL +1526,17031,COOK,IL +1527,17031,COOK,IL +1528,17031,COOK,IL +1529,17031,COOK,IL +1530,17031,COOK,IL +1531,17031,COOK,IL +1532,17031,COOK,IL +1533,17031,COOK,IL +1534,17031,COOK,IL +1535,17031,COOK,IL +1536,17031,COOK,IL +1537,17031,COOK,IL +1538,17031,COOK,IL +1539,17031,COOK,IL +1540,17031,COOK,IL +1541,17031,COOK,IL +1542,17031,COOK,IL +1543,17031,COOK,IL +1544,17031,COOK,IL +1545,17031,COOK,IL +1546,17031,COOK,IL +1547,17031,COOK,IL +1548,17031,COOK,IL +1549,17031,COOK,IL +1550,17031,COOK,IL +1551,17031,COOK,IL +1552,17031,COOK,IL +1553,17031,COOK,IL +1554,17031,COOK,IL +1555,17031,COOK,IL +1556,17031,COOK,IL +1557,17031,COOK,IL +1558,17031,COOK,IL +1559,17031,COOK,IL +1560,17031,COOK,IL +1561,17031,COOK,IL +1562,17031,COOK,IL +1563,17031,COOK,IL +1564,17031,COOK,IL +1565,17031,COOK,IL +1566,17031,COOK,IL +1567,17031,COOK,IL +1568,17031,COOK,IL +1569,17031,COOK,IL +1570,17031,COOK,IL +1571,17031,COOK,IL +1572,17031,COOK,IL +1573,17031,COOK,IL +1574,17031,COOK,IL +1575,17031,COOK,IL +1576,17031,COOK,IL +1577,17031,COOK,IL +1578,17031,COOK,IL +1579,17031,COOK,IL +1580,17031,COOK,IL +1581,17031,COOK,IL +1582,17031,COOK,IL +1583,17031,COOK,IL +1584,17031,COOK,IL +1585,17031,COOK,IL +1586,17031,COOK,IL +1587,17031,COOK,IL +1588,17031,COOK,IL +1589,17031,COOK,IL +1590,17031,COOK,IL +1591,17031,COOK,IL +1592,17031,COOK,IL +1593,17031,COOK,IL +1594,17031,COOK,IL +1595,17031,COOK,IL +1596,17031,COOK,IL +1597,17031,COOK,IL +1598,17031,COOK,IL +1599,17031,COOK,IL +1600,17031,COOK,IL +1601,17031,COOK,IL +1602,17031,COOK,IL +1603,17031,COOK,IL +1604,17031,COOK,IL +1605,17031,COOK,IL +1606,17031,COOK,IL +1607,17031,COOK,IL +1608,17031,COOK,IL +1609,17031,COOK,IL +1610,17031,COOK,IL +1611,17031,COOK,IL +1612,17031,COOK,IL +1613,17031,COOK,IL +1614,17031,COOK,IL +1615,17031,COOK,IL +1616,17031,COOK,IL +1617,17031,COOK,IL +1618,17031,COOK,IL +1619,17031,COOK,IL +1620,17031,COOK,IL +1621,17031,COOK,IL +1622,17031,COOK,IL +1623,17031,COOK,IL +1624,17031,COOK,IL +1625,17031,COOK,IL +1626,17031,COOK,IL +1627,17031,COOK,IL +1628,17031,COOK,IL +1629,17031,COOK,IL +1630,17031,COOK,IL +1631,17031,COOK,IL +1632,17031,COOK,IL +1633,17031,COOK,IL +1634,17031,COOK,IL +1635,17031,COOK,IL +1636,17031,COOK,IL +1637,17031,COOK,IL +1638,17031,COOK,IL +1639,17031,COOK,IL +1640,17031,COOK,IL +1641,17031,COOK,IL +1642,17031,COOK,IL +1643,17031,COOK,IL +1644,17031,COOK,IL +1645,17031,COOK,IL +1646,17031,COOK,IL +1647,17031,COOK,IL +1648,17031,COOK,IL +1649,17031,COOK,IL +1650,17031,COOK,IL +1651,17031,COOK,IL +1652,17031,COOK,IL +1653,17031,COOK,IL +1654,17031,COOK,IL +1655,17031,COOK,IL +1656,17031,COOK,IL +1657,17031,COOK,IL +1658,17031,COOK,IL +1659,17031,COOK,IL +1660,17031,COOK,IL +1661,17031,COOK,IL +1662,17031,COOK,IL +1663,17031,COOK,IL +1664,17031,COOK,IL +1665,17031,COOK,IL +1666,17031,COOK,IL +1667,17031,COOK,IL +1668,17031,COOK,IL +1669,17031,COOK,IL +1670,17031,COOK,IL +1671,17031,COOK,IL +1672,17031,COOK,IL +1673,17031,COOK,IL +1674,17031,COOK,IL +1675,17031,COOK,IL +1676,17031,COOK,IL +1677,17031,COOK,IL +1678,17031,COOK,IL +1679,17031,COOK,IL +1680,17031,COOK,IL +1681,17031,COOK,IL +1682,17031,COOK,IL +1683,17031,COOK,IL +1684,17031,COOK,IL +1685,17031,COOK,IL +1686,17031,COOK,IL +1687,17031,COOK,IL +1688,17031,COOK,IL +1689,17031,COOK,IL +1690,17031,COOK,IL +1691,17031,COOK,IL +1692,17031,COOK,IL +1693,17031,COOK,IL +1694,17031,COOK,IL +1695,17031,COOK,IL +1696,17031,COOK,IL +1697,17031,COOK,IL +1698,17031,COOK,IL +1699,17031,COOK,IL +1700,17031,COOK,IL +1701,17031,COOK,IL +1702,17031,COOK,IL +1703,17031,COOK,IL +1704,17031,COOK,IL +1705,17031,COOK,IL +1706,17031,COOK,IL +1707,17031,COOK,IL +1708,17031,COOK,IL +1709,17031,COOK,IL +1710,17031,COOK,IL +1711,17031,COOK,IL +1712,17031,COOK,IL +1713,17031,COOK,IL +1714,17031,COOK,IL +1715,17031,COOK,IL +1716,17031,COOK,IL +1717,17031,COOK,IL +1718,17031,COOK,IL +1719,17031,COOK,IL +1720,17031,COOK,IL +1721,17031,COOK,IL +1722,17031,COOK,IL +1723,17031,COOK,IL +1724,17031,COOK,IL +1725,17031,COOK,IL +1726,17031,COOK,IL +1727,17031,COOK,IL +1728,17031,COOK,IL +1729,17031,COOK,IL +1730,17031,COOK,IL +1731,17031,COOK,IL +1732,17031,COOK,IL +1733,17043,DUPAGE,IL +1734,17043,DUPAGE,IL +1735,17043,DUPAGE,IL +1736,17043,DUPAGE,IL +1737,17043,DUPAGE,IL +1738,17043,DUPAGE,IL +1739,17043,DUPAGE,IL +1740,17043,DUPAGE,IL +1741,17043,DUPAGE,IL +1742,17043,DUPAGE,IL +1743,17043,DUPAGE,IL +1744,17043,DUPAGE,IL +1745,17043,DUPAGE,IL +1746,17043,DUPAGE,IL +1747,17043,DUPAGE,IL +1748,17043,DUPAGE,IL +1749,17043,DUPAGE,IL +1750,17043,DUPAGE,IL +1751,17043,DUPAGE,IL +1752,17043,DUPAGE,IL +1753,17043,DUPAGE,IL +1754,17043,DUPAGE,IL +1755,17043,DUPAGE,IL +1756,17043,DUPAGE,IL +1757,17043,DUPAGE,IL +1758,17043,DUPAGE,IL +1759,17043,DUPAGE,IL +1760,17043,DUPAGE,IL +1761,17043,DUPAGE,IL +1762,17043,DUPAGE,IL +1763,17043,DUPAGE,IL +1764,17043,DUPAGE,IL +1765,17043,DUPAGE,IL +1766,17043,DUPAGE,IL +1767,17043,DUPAGE,IL +1768,17043,DUPAGE,IL +1769,17043,DUPAGE,IL +1770,17043,DUPAGE,IL +1771,17043,DUPAGE,IL +1772,17043,DUPAGE,IL +1773,17043,DUPAGE,IL +1774,17043,DUPAGE,IL +1775,17043,DUPAGE,IL +1776,17043,DUPAGE,IL +1777,17043,DUPAGE,IL +1778,17043,DUPAGE,IL +1779,17043,DUPAGE,IL +1780,17043,DUPAGE,IL +1781,17043,DUPAGE,IL +1782,17043,DUPAGE,IL +1783,17043,DUPAGE,IL +1784,17043,DUPAGE,IL +1785,17043,DUPAGE,IL +1786,17043,DUPAGE,IL +1787,17043,DUPAGE,IL +1788,17043,DUPAGE,IL +1789,17043,DUPAGE,IL +1790,17043,DUPAGE,IL +1791,17043,DUPAGE,IL +1792,17043,DUPAGE,IL +1793,17043,DUPAGE,IL +1794,17043,DUPAGE,IL +1795,17043,DUPAGE,IL +1796,17043,DUPAGE,IL +1797,17043,DUPAGE,IL +1798,17043,DUPAGE,IL +1799,17043,DUPAGE,IL +1800,17043,DUPAGE,IL +1801,17043,DUPAGE,IL +1802,17043,DUPAGE,IL +1803,17043,DUPAGE,IL +1804,17043,DUPAGE,IL +1805,17043,DUPAGE,IL +1806,17043,DUPAGE,IL +1807,17043,DUPAGE,IL +1808,17043,DUPAGE,IL +1809,17043,DUPAGE,IL +1810,17043,DUPAGE,IL +1811,17043,DUPAGE,IL +1812,17043,DUPAGE,IL +1813,17043,DUPAGE,IL +1814,17043,DUPAGE,IL +1815,17043,DUPAGE,IL +1816,17043,DUPAGE,IL +1817,17043,DUPAGE,IL +1818,17043,DUPAGE,IL +1819,17043,DUPAGE,IL +1820,17043,DUPAGE,IL +1821,17043,DUPAGE,IL +1822,17043,DUPAGE,IL +1823,17043,DUPAGE,IL +1824,17043,DUPAGE,IL +1825,17043,DUPAGE,IL +1826,17043,DUPAGE,IL +1827,17043,DUPAGE,IL +1828,17043,DUPAGE,IL +1829,17043,DUPAGE,IL +1830,17043,DUPAGE,IL +1831,17043,DUPAGE,IL +1832,17043,DUPAGE,IL +1833,17043,DUPAGE,IL +1834,17043,DUPAGE,IL +1835,17043,DUPAGE,IL +1836,17043,DUPAGE,IL +1837,17043,DUPAGE,IL +1838,17043,DUPAGE,IL +1839,17043,DUPAGE,IL +1840,17043,DUPAGE,IL +1841,17043,DUPAGE,IL +1842,17043,DUPAGE,IL +1843,17043,DUPAGE,IL +1844,17043,DUPAGE,IL +1845,17043,DUPAGE,IL +1846,17043,DUPAGE,IL +1847,17043,DUPAGE,IL +1848,17043,DUPAGE,IL +1849,17043,DUPAGE,IL +1850,17043,DUPAGE,IL +1851,17043,DUPAGE,IL +1852,17043,DUPAGE,IL +1853,17043,DUPAGE,IL +1854,17043,DUPAGE,IL +1855,17043,DUPAGE,IL +1856,17043,DUPAGE,IL +1857,17043,DUPAGE,IL +1858,17043,DUPAGE,IL +1859,17043,DUPAGE,IL +1860,17043,DUPAGE,IL +1861,17043,DUPAGE,IL +1862,17043,DUPAGE,IL +1863,17043,DUPAGE,IL +1864,17043,DUPAGE,IL +1865,17043,DUPAGE,IL +1866,17043,DUPAGE,IL +1867,17043,DUPAGE,IL +1868,17043,DUPAGE,IL +1869,17043,DUPAGE,IL +1870,17043,DUPAGE,IL +1871,17043,DUPAGE,IL +1872,17043,DUPAGE,IL +1873,17043,DUPAGE,IL +1874,17043,DUPAGE,IL +1875,17043,DUPAGE,IL +1876,17043,DUPAGE,IL +1877,17043,DUPAGE,IL +1878,17043,DUPAGE,IL +1879,17043,DUPAGE,IL +1880,17043,DUPAGE,IL +1881,17043,DUPAGE,IL +1882,17043,DUPAGE,IL +1883,17043,DUPAGE,IL +1884,17043,DUPAGE,IL +1885,17043,DUPAGE,IL +1886,17043,DUPAGE,IL +1887,17043,DUPAGE,IL +1888,17043,DUPAGE,IL +1889,17043,DUPAGE,IL +1890,17043,DUPAGE,IL +1891,17043,DUPAGE,IL +1892,17043,DUPAGE,IL +1893,17043,DUPAGE,IL +1894,17043,DUPAGE,IL +1895,17043,DUPAGE,IL +1896,17043,DUPAGE,IL +1897,17043,DUPAGE,IL +1898,17043,DUPAGE,IL +1899,17043,DUPAGE,IL +1900,17043,DUPAGE,IL +1901,17043,DUPAGE,IL +1902,17043,DUPAGE,IL +1903,17043,DUPAGE,IL +1904,17043,DUPAGE,IL +1905,17043,DUPAGE,IL +1906,17043,DUPAGE,IL +1907,17043,DUPAGE,IL +1908,17043,DUPAGE,IL +1909,17043,DUPAGE,IL +1910,17043,DUPAGE,IL +1911,17043,DUPAGE,IL +1912,17043,DUPAGE,IL +1913,17043,DUPAGE,IL +1914,17043,DUPAGE,IL +1915,17043,DUPAGE,IL +1916,17043,DUPAGE,IL +1917,17043,DUPAGE,IL +1918,17043,DUPAGE,IL +1919,17043,DUPAGE,IL +1920,17043,DUPAGE,IL +1921,17043,DUPAGE,IL +1922,17043,DUPAGE,IL +1923,17043,DUPAGE,IL +1924,17043,DUPAGE,IL +1925,17043,DUPAGE,IL +1926,17043,DUPAGE,IL +1927,17043,DUPAGE,IL +1928,17043,DUPAGE,IL +1929,17043,DUPAGE,IL +1930,17043,DUPAGE,IL +1931,17043,DUPAGE,IL +1932,17043,DUPAGE,IL +1933,17043,DUPAGE,IL +1934,17043,DUPAGE,IL +1935,17043,DUPAGE,IL +1936,17043,DUPAGE,IL +1937,17043,DUPAGE,IL +1938,17043,DUPAGE,IL +1939,17043,DUPAGE,IL +1940,17043,DUPAGE,IL +1941,17043,DUPAGE,IL +1942,17043,DUPAGE,IL +1943,17043,DUPAGE,IL +1944,17043,DUPAGE,IL +1945,17043,DUPAGE,IL +1946,17043,DUPAGE,IL +1947,17043,DUPAGE,IL +1948,17043,DUPAGE,IL +1949,17043,DUPAGE,IL +1950,17043,DUPAGE,IL +1951,17043,DUPAGE,IL +1952,17043,DUPAGE,IL +1953,17043,DUPAGE,IL +1954,17043,DUPAGE,IL +1955,17043,DUPAGE,IL +1956,17043,DUPAGE,IL +1957,17043,DUPAGE,IL +1958,17043,DUPAGE,IL +1959,17043,DUPAGE,IL +1960,17043,DUPAGE,IL +1961,17043,DUPAGE,IL +1962,17043,DUPAGE,IL +1963,17043,DUPAGE,IL +1964,17043,DUPAGE,IL +1965,17043,DUPAGE,IL +1966,17043,DUPAGE,IL +1967,17043,DUPAGE,IL +1968,17043,DUPAGE,IL +1969,17043,DUPAGE,IL +1970,17043,DUPAGE,IL +1971,17043,DUPAGE,IL +1972,17043,DUPAGE,IL +1973,17043,DUPAGE,IL +1974,17043,DUPAGE,IL +1975,17043,DUPAGE,IL +1976,17043,DUPAGE,IL +1977,17043,DUPAGE,IL +1978,17043,DUPAGE,IL +1979,17043,DUPAGE,IL +1980,17043,DUPAGE,IL +1981,17043,DUPAGE,IL +1982,17043,DUPAGE,IL +1983,17043,DUPAGE,IL +1984,17043,DUPAGE,IL +1985,17043,DUPAGE,IL +1986,17043,DUPAGE,IL +1987,17043,DUPAGE,IL +1988,17043,DUPAGE,IL +1989,17043,DUPAGE,IL +1990,17043,DUPAGE,IL +1991,17043,DUPAGE,IL +1992,17043,DUPAGE,IL +1993,17043,DUPAGE,IL +1994,17043,DUPAGE,IL +1995,17043,DUPAGE,IL +1996,17043,DUPAGE,IL +1997,17043,DUPAGE,IL +1998,17043,DUPAGE,IL +1999,17043,DUPAGE,IL +2000,17043,DUPAGE,IL +2001,17043,DUPAGE,IL +2002,17043,DUPAGE,IL +2003,17043,DUPAGE,IL +2004,17043,DUPAGE,IL +2005,17043,DUPAGE,IL +2006,17043,DUPAGE,IL +2007,17043,DUPAGE,IL +2008,17043,DUPAGE,IL +2009,17043,DUPAGE,IL +2010,17043,DUPAGE,IL +2011,17043,DUPAGE,IL +2012,17043,DUPAGE,IL +2013,17043,DUPAGE,IL +2014,17043,DUPAGE,IL +2015,17043,DUPAGE,IL +2016,17043,DUPAGE,IL +2017,17043,DUPAGE,IL +2018,17043,DUPAGE,IL +2019,17043,DUPAGE,IL +2020,17043,DUPAGE,IL +2021,17043,DUPAGE,IL +2022,17043,DUPAGE,IL +2023,17043,DUPAGE,IL +2024,17043,DUPAGE,IL +2025,17043,DUPAGE,IL +2026,17043,DUPAGE,IL +2027,17043,DUPAGE,IL +2028,17043,DUPAGE,IL +2029,17043,DUPAGE,IL +2030,17043,DUPAGE,IL +2031,17043,DUPAGE,IL +2032,17043,DUPAGE,IL +2033,17043,DUPAGE,IL +2034,17043,DUPAGE,IL +2035,17043,DUPAGE,IL +2036,17043,DUPAGE,IL +2037,17043,DUPAGE,IL +2038,17043,DUPAGE,IL +2039,17043,DUPAGE,IL +2040,17043,DUPAGE,IL +2041,17043,DUPAGE,IL +2042,17043,DUPAGE,IL +2043,17043,DUPAGE,IL +2044,17043,DUPAGE,IL +2045,17043,DUPAGE,IL +2046,17043,DUPAGE,IL +2047,17043,DUPAGE,IL +2048,17043,DUPAGE,IL +2049,17043,DUPAGE,IL +2050,17043,DUPAGE,IL +2051,17043,DUPAGE,IL +2052,17043,DUPAGE,IL +2053,17043,DUPAGE,IL +2054,17043,DUPAGE,IL +2055,17043,DUPAGE,IL +2056,17043,DUPAGE,IL +2057,17043,DUPAGE,IL +2058,17043,DUPAGE,IL +2059,17043,DUPAGE,IL +2060,17043,DUPAGE,IL +2061,17043,DUPAGE,IL +2062,17043,DUPAGE,IL +2063,17043,DUPAGE,IL +2064,17043,DUPAGE,IL +2065,17043,DUPAGE,IL +2066,17043,DUPAGE,IL +2067,17043,DUPAGE,IL +2068,17043,DUPAGE,IL +2069,17043,DUPAGE,IL +2070,17043,DUPAGE,IL +2071,17043,DUPAGE,IL +2072,17043,DUPAGE,IL +2073,17043,DUPAGE,IL +2074,17043,DUPAGE,IL +2075,17043,DUPAGE,IL +2076,17043,DUPAGE,IL +2077,17043,DUPAGE,IL +2078,17043,DUPAGE,IL +2079,17043,DUPAGE,IL +2080,17043,DUPAGE,IL +2081,17043,DUPAGE,IL +2082,17043,DUPAGE,IL +2083,17043,DUPAGE,IL +2084,17043,DUPAGE,IL +2085,17043,DUPAGE,IL +2086,17043,DUPAGE,IL +2087,17043,DUPAGE,IL +2088,17043,DUPAGE,IL +2089,17043,DUPAGE,IL +2090,17043,DUPAGE,IL +2091,17043,DUPAGE,IL +2092,17043,DUPAGE,IL +2093,17043,DUPAGE,IL +2094,17043,DUPAGE,IL +2095,17043,DUPAGE,IL +2096,17043,DUPAGE,IL +2097,17043,DUPAGE,IL +2098,17043,DUPAGE,IL +2099,17043,DUPAGE,IL +2100,17043,DUPAGE,IL +2101,17043,DUPAGE,IL +2102,17043,DUPAGE,IL +2103,17043,DUPAGE,IL +2104,17043,DUPAGE,IL +2105,17043,DUPAGE,IL +2106,17043,DUPAGE,IL +2107,17043,DUPAGE,IL +2108,17043,DUPAGE,IL +2109,17043,DUPAGE,IL +2110,17043,DUPAGE,IL +2111,17043,DUPAGE,IL +2112,17089,KANE,IL +2113,17089,KANE,IL +2114,17089,KANE,IL +2115,17089,KANE,IL +2116,17089,KANE,IL +2117,17089,KANE,IL +2118,17089,KANE,IL +2119,17089,KANE,IL +2120,17089,KANE,IL +2121,17089,KANE,IL +2122,17089,KANE,IL +2123,17089,KANE,IL +2124,17089,KANE,IL +2125,17089,KANE,IL +2126,17089,KANE,IL +2127,17089,KANE,IL +2128,17089,KANE,IL +2129,17089,KANE,IL +2130,17089,KANE,IL +2131,17089,KANE,IL +2132,17089,KANE,IL +2133,17089,KANE,IL +2134,17089,KANE,IL +2135,17089,KANE,IL +2136,17089,KANE,IL +2137,17089,KANE,IL +2138,17089,KANE,IL +2139,17089,KANE,IL +2140,17089,KANE,IL +2141,17089,KANE,IL +2142,17089,KANE,IL +2143,17089,KANE,IL +2144,17089,KANE,IL +2145,17089,KANE,IL +2146,17089,KANE,IL +2147,17089,KANE,IL +2148,17089,KANE,IL +2149,17089,KANE,IL +2150,17089,KANE,IL +2151,17089,KANE,IL +2152,17089,KANE,IL +2153,17089,KANE,IL +2154,17089,KANE,IL +2155,17089,KANE,IL +2156,17089,KANE,IL +2157,17089,KANE,IL +2158,17089,KANE,IL +2159,17089,KANE,IL +2160,17089,KANE,IL +2161,17089,KANE,IL +2162,17089,KANE,IL +2163,17089,KANE,IL +2164,17089,KANE,IL +2165,17089,KANE,IL +2166,17089,KANE,IL +2167,17089,KANE,IL +2168,17089,KANE,IL +2169,17089,KANE,IL +2170,17089,KANE,IL +2171,17089,KANE,IL +2172,17089,KANE,IL +2173,17089,KANE,IL +2174,17089,KANE,IL +2175,17089,KANE,IL +2176,17089,KANE,IL +2177,17089,KANE,IL +2178,17089,KANE,IL +2179,17089,KANE,IL +2180,17089,KANE,IL +2181,17089,KANE,IL +2182,17089,KANE,IL +2183,17089,KANE,IL +2184,17089,KANE,IL +2185,17089,KANE,IL +2186,17089,KANE,IL +2187,17089,KANE,IL +2188,17089,KANE,IL +2189,17089,KANE,IL +2190,17089,KANE,IL +2191,17089,KANE,IL +2192,17089,KANE,IL +2193,17089,KANE,IL +2194,17089,KANE,IL +2195,17089,KANE,IL +2196,17089,KANE,IL +2197,17089,KANE,IL +2198,17089,KANE,IL +2199,17089,KANE,IL +2200,17089,KANE,IL +2201,17089,KANE,IL +2202,17089,KANE,IL +2203,17089,KANE,IL +2204,17089,KANE,IL +2205,17089,KANE,IL +2206,17089,KANE,IL +2207,17089,KANE,IL +2208,17089,KANE,IL +2209,17089,KANE,IL +2210,17089,KANE,IL +2211,17089,KANE,IL +2212,17089,KANE,IL +2213,17089,KANE,IL +2214,17089,KANE,IL +2215,17089,KANE,IL +2216,17089,KANE,IL +2217,17089,KANE,IL +2218,17089,KANE,IL +2219,17089,KANE,IL +2220,17089,KANE,IL +2221,17089,KANE,IL +2222,17089,KANE,IL +2223,17089,KANE,IL +2224,17089,KANE,IL +2225,17089,KANE,IL +2226,17089,KANE,IL +2227,17089,KANE,IL +2228,17089,KANE,IL +2229,17089,KANE,IL +2230,17089,KANE,IL +2231,17089,KANE,IL +2232,17089,KANE,IL +2233,17089,KANE,IL +2234,17089,KANE,IL +2235,17089,KANE,IL +2236,17089,KANE,IL +2237,17089,KANE,IL +2238,17089,KANE,IL +2239,17089,KANE,IL +2240,17089,KANE,IL +2241,17089,KANE,IL +2242,17089,KANE,IL +2243,17089,KANE,IL +2244,17089,KANE,IL +2245,17089,KANE,IL +2246,17089,KANE,IL +2247,17089,KANE,IL +2248,17089,KANE,IL +2249,17089,KANE,IL +2250,17089,KANE,IL +2251,17089,KANE,IL +2252,17089,KANE,IL +2253,17089,KANE,IL +2254,17089,KANE,IL +2255,17089,KANE,IL +2256,17089,KANE,IL +2257,17089,KANE,IL +2258,17089,KANE,IL +2259,17089,KANE,IL +2260,17089,KANE,IL +2261,17089,KANE,IL +2262,17089,KANE,IL +2263,17089,KANE,IL +2264,17089,KANE,IL +2265,17089,KANE,IL +2266,17089,KANE,IL +2267,17089,KANE,IL +2268,17089,KANE,IL +2269,17089,KANE,IL +2270,17089,KANE,IL +2271,17089,KANE,IL +2272,17089,KANE,IL +2273,17089,KANE,IL +2274,17089,KANE,IL +2275,17089,KANE,IL +2276,17089,KANE,IL +2277,17089,KANE,IL +2278,17089,KANE,IL +2279,17089,KANE,IL +2280,17089,KANE,IL +2281,17089,KANE,IL +2282,17089,KANE,IL +2283,17089,KANE,IL +2284,17089,KANE,IL +2285,17089,KANE,IL +2286,17089,KANE,IL +2287,17089,KANE,IL +2288,17089,KANE,IL +2289,17089,KANE,IL +2290,17089,KANE,IL +2291,17089,KANE,IL +2292,17089,KANE,IL +2293,17089,KANE,IL +2294,17089,KANE,IL +2295,17089,KANE,IL +2296,17089,KANE,IL +2297,17089,KANE,IL +2298,17089,KANE,IL +2299,17089,KANE,IL +2300,17089,KANE,IL +2301,17089,KANE,IL +2302,17089,KANE,IL +2303,17089,KANE,IL +2304,17089,KANE,IL +2305,17093,KENDALL,IL +2306,17093,KENDALL,IL +2307,17093,KENDALL,IL +2308,17093,KENDALL,IL +2309,17093,KENDALL,IL +2310,17093,KENDALL,IL +2311,17093,KENDALL,IL +2312,17093,KENDALL,IL +2313,17093,KENDALL,IL +2314,17093,KENDALL,IL +2315,17093,KENDALL,IL +2316,17093,KENDALL,IL +2317,17093,KENDALL,IL +2318,17093,KENDALL,IL +2319,17093,KENDALL,IL +2320,17093,KENDALL,IL +2321,17093,KENDALL,IL +2322,17093,KENDALL,IL +2323,17093,KENDALL,IL +2324,17093,KENDALL,IL +2325,17093,KENDALL,IL +2326,17097,LAKE,IL +2327,17097,LAKE,IL +2328,17097,LAKE,IL +2329,17097,LAKE,IL +2330,17097,LAKE,IL +2331,17097,LAKE,IL +2332,17097,LAKE,IL +2333,17097,LAKE,IL +2334,17097,LAKE,IL +2335,17097,LAKE,IL +2336,17097,LAKE,IL +2337,17097,LAKE,IL +2338,17097,LAKE,IL +2339,17097,LAKE,IL +2340,17097,LAKE,IL +2341,17097,LAKE,IL +2342,17097,LAKE,IL +2343,17097,LAKE,IL +2344,17097,LAKE,IL +2345,17097,LAKE,IL +2346,17097,LAKE,IL +2347,17097,LAKE,IL +2348,17097,LAKE,IL +2349,17097,LAKE,IL +2350,17097,LAKE,IL +2351,17097,LAKE,IL +2352,17097,LAKE,IL +2353,17097,LAKE,IL +2354,17097,LAKE,IL +2355,17097,LAKE,IL +2356,17097,LAKE,IL +2357,17097,LAKE,IL +2358,17097,LAKE,IL +2359,17097,LAKE,IL +2360,17097,LAKE,IL +2361,17097,LAKE,IL +2362,17097,LAKE,IL +2363,17097,LAKE,IL +2364,17097,LAKE,IL +2365,17097,LAKE,IL +2366,17097,LAKE,IL +2367,17097,LAKE,IL +2368,17097,LAKE,IL +2369,17097,LAKE,IL +2370,17097,LAKE,IL +2371,17097,LAKE,IL +2372,17097,LAKE,IL +2373,17097,LAKE,IL +2374,17097,LAKE,IL +2375,17097,LAKE,IL +2376,17097,LAKE,IL +2377,17097,LAKE,IL +2378,17097,LAKE,IL +2379,17097,LAKE,IL +2380,17097,LAKE,IL +2381,17097,LAKE,IL +2382,17097,LAKE,IL +2383,17097,LAKE,IL +2384,17097,LAKE,IL +2385,17097,LAKE,IL +2386,17097,LAKE,IL +2387,17097,LAKE,IL +2388,17097,LAKE,IL +2389,17097,LAKE,IL +2390,17097,LAKE,IL +2391,17097,LAKE,IL +2392,17097,LAKE,IL +2393,17097,LAKE,IL +2394,17097,LAKE,IL +2395,17097,LAKE,IL +2396,17097,LAKE,IL +2397,17097,LAKE,IL +2398,17097,LAKE,IL +2399,17097,LAKE,IL +2400,17097,LAKE,IL +2401,17097,LAKE,IL +2402,17097,LAKE,IL +2403,17097,LAKE,IL +2404,17097,LAKE,IL +2405,17097,LAKE,IL +2406,17097,LAKE,IL +2407,17097,LAKE,IL +2408,17097,LAKE,IL +2409,17097,LAKE,IL +2410,17097,LAKE,IL +2411,17097,LAKE,IL +2412,17097,LAKE,IL +2413,17097,LAKE,IL +2414,17097,LAKE,IL +2415,17097,LAKE,IL +2416,17097,LAKE,IL +2417,17097,LAKE,IL +2418,17097,LAKE,IL +2419,17097,LAKE,IL +2420,17097,LAKE,IL +2421,17097,LAKE,IL +2422,17097,LAKE,IL +2423,17097,LAKE,IL +2424,17097,LAKE,IL +2425,17097,LAKE,IL +2426,17097,LAKE,IL +2427,17097,LAKE,IL +2428,17097,LAKE,IL +2429,17097,LAKE,IL +2430,17097,LAKE,IL +2431,17097,LAKE,IL +2432,17097,LAKE,IL +2433,17097,LAKE,IL +2434,17097,LAKE,IL +2435,17097,LAKE,IL +2436,17097,LAKE,IL +2437,17097,LAKE,IL +2438,17097,LAKE,IL +2439,17097,LAKE,IL +2440,17097,LAKE,IL +2441,17097,LAKE,IL +2442,17097,LAKE,IL +2443,17097,LAKE,IL +2444,17097,LAKE,IL +2445,17097,LAKE,IL +2446,17097,LAKE,IL +2447,17097,LAKE,IL +2448,17097,LAKE,IL +2449,17097,LAKE,IL +2450,17097,LAKE,IL +2451,17097,LAKE,IL +2452,17097,LAKE,IL +2453,17097,LAKE,IL +2454,17097,LAKE,IL +2455,17097,LAKE,IL +2456,17097,LAKE,IL +2457,17097,LAKE,IL +2458,17097,LAKE,IL +2459,17097,LAKE,IL +2460,17097,LAKE,IL +2461,17097,LAKE,IL +2462,17097,LAKE,IL +2463,17097,LAKE,IL +2464,17097,LAKE,IL +2465,17097,LAKE,IL +2466,17097,LAKE,IL +2467,17097,LAKE,IL +2468,17097,LAKE,IL +2469,17097,LAKE,IL +2470,17097,LAKE,IL +2471,17097,LAKE,IL +2472,17097,LAKE,IL +2473,17097,LAKE,IL +2474,17097,LAKE,IL +2475,17097,LAKE,IL +2476,17097,LAKE,IL +2477,17097,LAKE,IL +2478,17097,LAKE,IL +2479,17097,LAKE,IL +2480,17097,LAKE,IL +2481,17097,LAKE,IL +2482,17097,LAKE,IL +2483,17097,LAKE,IL +2484,17097,LAKE,IL +2485,17097,LAKE,IL +2486,17097,LAKE,IL +2487,17097,LAKE,IL +2488,17097,LAKE,IL +2489,17097,LAKE,IL +2490,17097,LAKE,IL +2491,17097,LAKE,IL +2492,17097,LAKE,IL +2493,17097,LAKE,IL +2494,17097,LAKE,IL +2495,17097,LAKE,IL +2496,17097,LAKE,IL +2497,17097,LAKE,IL +2498,17097,LAKE,IL +2499,17097,LAKE,IL +2500,17097,LAKE,IL +2501,17097,LAKE,IL +2502,17097,LAKE,IL +2503,17097,LAKE,IL +2504,17097,LAKE,IL +2505,17097,LAKE,IL +2506,17097,LAKE,IL +2507,17097,LAKE,IL +2508,17097,LAKE,IL +2509,17097,LAKE,IL +2510,17097,LAKE,IL +2511,17097,LAKE,IL +2512,17097,LAKE,IL +2513,17097,LAKE,IL +2514,17097,LAKE,IL +2515,17097,LAKE,IL +2516,17097,LAKE,IL +2517,17097,LAKE,IL +2518,17097,LAKE,IL +2519,17097,LAKE,IL +2520,17097,LAKE,IL +2521,17097,LAKE,IL +2522,17097,LAKE,IL +2523,17097,LAKE,IL +2524,17097,LAKE,IL +2525,17097,LAKE,IL +2526,17097,LAKE,IL +2527,17097,LAKE,IL +2528,17097,LAKE,IL +2529,17097,LAKE,IL +2530,17097,LAKE,IL +2531,17097,LAKE,IL +2532,17097,LAKE,IL +2533,17097,LAKE,IL +2534,17097,LAKE,IL +2535,17097,LAKE,IL +2536,17097,LAKE,IL +2537,17097,LAKE,IL +2538,17097,LAKE,IL +2539,17097,LAKE,IL +2540,17097,LAKE,IL +2541,17097,LAKE,IL +2542,17097,LAKE,IL +2543,17097,LAKE,IL +2544,17097,LAKE,IL +2545,17097,LAKE,IL +2546,17097,LAKE,IL +2547,17097,LAKE,IL +2548,17097,LAKE,IL +2549,17097,LAKE,IL +2550,17097,LAKE,IL +2551,17097,LAKE,IL +2552,17097,LAKE,IL +2553,17097,LAKE,IL +2554,17097,LAKE,IL +2555,17097,LAKE,IL +2556,17097,LAKE,IL +2557,17097,LAKE,IL +2558,17097,LAKE,IL +2559,17097,LAKE,IL +2560,17097,LAKE,IL +2561,17097,LAKE,IL +2562,17097,LAKE,IL +2563,17097,LAKE,IL +2564,17097,LAKE,IL +2565,17097,LAKE,IL +2566,17097,LAKE,IL +2567,17097,LAKE,IL +2568,17097,LAKE,IL +2569,17097,LAKE,IL +2570,17097,LAKE,IL +2571,17097,LAKE,IL +2572,17097,LAKE,IL +2573,17097,LAKE,IL +2574,17097,LAKE,IL +2575,17097,LAKE,IL +2576,17097,LAKE,IL +2577,17097,LAKE,IL +2578,17097,LAKE,IL +2579,17097,LAKE,IL +2580,17097,LAKE,IL +2581,17097,LAKE,IL +2582,17097,LAKE,IL +2583,17097,LAKE,IL +2584,17111,MCHENRY,IL +2585,17111,MCHENRY,IL +2586,17111,MCHENRY,IL +2587,17111,MCHENRY,IL +2588,17111,MCHENRY,IL +2589,17111,MCHENRY,IL +2590,17111,MCHENRY,IL +2591,17111,MCHENRY,IL +2592,17111,MCHENRY,IL +2593,17111,MCHENRY,IL +2594,17111,MCHENRY,IL +2595,17111,MCHENRY,IL +2596,17111,MCHENRY,IL +2597,17111,MCHENRY,IL +2598,17111,MCHENRY,IL +2599,17111,MCHENRY,IL +2600,17111,MCHENRY,IL +2601,17111,MCHENRY,IL +2602,17111,MCHENRY,IL +2603,17111,MCHENRY,IL +2604,17111,MCHENRY,IL +2605,17111,MCHENRY,IL +2606,17111,MCHENRY,IL +2607,17111,MCHENRY,IL +2608,17111,MCHENRY,IL +2609,17111,MCHENRY,IL +2610,17111,MCHENRY,IL +2611,17111,MCHENRY,IL +2612,17111,MCHENRY,IL +2613,17111,MCHENRY,IL +2614,17111,MCHENRY,IL +2615,17111,MCHENRY,IL +2616,17111,MCHENRY,IL +2617,17111,MCHENRY,IL +2618,17111,MCHENRY,IL +2619,17111,MCHENRY,IL +2620,17111,MCHENRY,IL +2621,17111,MCHENRY,IL +2622,17111,MCHENRY,IL +2623,17111,MCHENRY,IL +2624,17111,MCHENRY,IL +2625,17111,MCHENRY,IL +2626,17111,MCHENRY,IL +2627,17111,MCHENRY,IL +2628,17111,MCHENRY,IL +2629,17111,MCHENRY,IL +2630,17111,MCHENRY,IL +2631,17111,MCHENRY,IL +2632,17111,MCHENRY,IL +2633,17111,MCHENRY,IL +2634,17111,MCHENRY,IL +2635,17111,MCHENRY,IL +2636,17111,MCHENRY,IL +2637,17111,MCHENRY,IL +2638,17111,MCHENRY,IL +2639,17111,MCHENRY,IL +2640,17111,MCHENRY,IL +2641,17111,MCHENRY,IL +2642,17111,MCHENRY,IL +2643,17111,MCHENRY,IL +2644,17111,MCHENRY,IL +2645,17111,MCHENRY,IL +2646,17111,MCHENRY,IL +2647,17111,MCHENRY,IL +2648,17111,MCHENRY,IL +2649,17111,MCHENRY,IL +2650,17111,MCHENRY,IL +2651,17111,MCHENRY,IL +2652,17111,MCHENRY,IL +2653,17111,MCHENRY,IL +2654,17111,MCHENRY,IL +2655,17111,MCHENRY,IL +2656,17111,MCHENRY,IL +2657,17111,MCHENRY,IL +2658,17111,MCHENRY,IL +2659,17111,MCHENRY,IL +2660,17111,MCHENRY,IL +2661,17111,MCHENRY,IL +2662,17111,MCHENRY,IL +2663,17111,MCHENRY,IL +2664,17111,MCHENRY,IL +2665,17111,MCHENRY,IL +2666,17111,MCHENRY,IL +2667,17111,MCHENRY,IL +2668,17111,MCHENRY,IL +2669,17111,MCHENRY,IL +2670,17111,MCHENRY,IL +2671,17111,MCHENRY,IL +2672,17111,MCHENRY,IL +2673,17111,MCHENRY,IL +2674,17111,MCHENRY,IL +2675,17111,MCHENRY,IL +2676,17111,MCHENRY,IL +2677,17111,MCHENRY,IL +2678,17111,MCHENRY,IL +2679,17111,MCHENRY,IL +2680,17111,MCHENRY,IL +2681,17111,MCHENRY,IL +2682,17111,MCHENRY,IL +2683,17111,MCHENRY,IL +2684,17111,MCHENRY,IL +2685,17111,MCHENRY,IL +2686,17111,MCHENRY,IL +2687,17111,MCHENRY,IL +2688,17111,MCHENRY,IL +2689,17111,MCHENRY,IL +2690,17111,MCHENRY,IL +2691,17111,MCHENRY,IL +2692,17111,MCHENRY,IL +2693,17111,MCHENRY,IL +2694,17111,MCHENRY,IL +2695,17111,MCHENRY,IL +2696,17111,MCHENRY,IL +2697,17111,MCHENRY,IL +2698,17111,MCHENRY,IL +2699,17111,MCHENRY,IL +2700,17111,MCHENRY,IL +2701,17111,MCHENRY,IL +2702,17111,MCHENRY,IL +2703,17197,WILL,IL +2704,17197,WILL,IL +2705,17197,WILL,IL +2706,17197,WILL,IL +2707,17197,WILL,IL +2708,17197,WILL,IL +2709,17197,WILL,IL +2710,17197,WILL,IL +2711,17197,WILL,IL +2712,17197,WILL,IL +2713,17197,WILL,IL +2714,17197,WILL,IL +2715,17197,WILL,IL +2716,17197,WILL,IL +2717,17197,WILL,IL +2718,17197,WILL,IL +2719,17197,WILL,IL +2720,17197,WILL,IL +2721,17197,WILL,IL +2722,17197,WILL,IL +2723,17197,WILL,IL +2724,17197,WILL,IL +2725,17197,WILL,IL +2726,17197,WILL,IL +2727,17197,WILL,IL +2728,17197,WILL,IL +2729,17197,WILL,IL +2730,17197,WILL,IL +2731,17197,WILL,IL +2732,17197,WILL,IL +2733,17197,WILL,IL +2734,17197,WILL,IL +2735,17197,WILL,IL +2736,17197,WILL,IL +2737,17197,WILL,IL +2738,17197,WILL,IL +2739,17197,WILL,IL +2740,17197,WILL,IL +2741,17197,WILL,IL +2742,17197,WILL,IL +2743,17197,WILL,IL +2744,17197,WILL,IL +2745,17197,WILL,IL +2746,17197,WILL,IL +2747,17197,WILL,IL +2748,17197,WILL,IL +2749,17197,WILL,IL +2750,17197,WILL,IL +2751,17197,WILL,IL +2752,17197,WILL,IL +2753,17197,WILL,IL +2754,17197,WILL,IL +2755,17197,WILL,IL +2756,17197,WILL,IL +2757,17197,WILL,IL +2758,17197,WILL,IL +2759,17197,WILL,IL +2760,17197,WILL,IL +2761,17197,WILL,IL +2762,17197,WILL,IL +2763,17197,WILL,IL +2764,17197,WILL,IL +2765,17197,WILL,IL +2766,17197,WILL,IL +2767,17197,WILL,IL +2768,17197,WILL,IL +2769,17197,WILL,IL +2770,17197,WILL,IL +2771,17197,WILL,IL +2772,17197,WILL,IL +2773,17197,WILL,IL +2774,17197,WILL,IL +2775,17197,WILL,IL +2776,17197,WILL,IL +2777,17197,WILL,IL +2778,17197,WILL,IL +2779,17197,WILL,IL +2780,17197,WILL,IL +2781,17197,WILL,IL +2782,17197,WILL,IL +2783,17197,WILL,IL +2784,17197,WILL,IL +2785,17197,WILL,IL +2786,17197,WILL,IL +2787,17197,WILL,IL +2788,17197,WILL,IL +2789,17197,WILL,IL +2790,17197,WILL,IL +2791,17197,WILL,IL +2792,17197,WILL,IL +2793,17197,WILL,IL +2794,17197,WILL,IL +2795,17197,WILL,IL +2796,17197,WILL,IL +2797,17197,WILL,IL +2798,17197,WILL,IL +2799,17197,WILL,IL +2800,17197,WILL,IL +2801,17197,WILL,IL +2802,17197,WILL,IL +2803,17197,WILL,IL +2804,17197,WILL,IL +2805,17197,WILL,IL +2806,17197,WILL,IL +2807,17197,WILL,IL +2808,17197,WILL,IL +2809,17197,WILL,IL +2810,17197,WILL,IL +2811,17197,WILL,IL +2812,17197,WILL,IL +2813,17197,WILL,IL +2814,17197,WILL,IL +2815,17197,WILL,IL +2816,17197,WILL,IL +2817,17197,WILL,IL +2818,17197,WILL,IL +2819,17197,WILL,IL +2820,17197,WILL,IL +2821,17197,WILL,IL +2822,17197,WILL,IL +2823,17197,WILL,IL +2824,17197,WILL,IL +2825,17197,WILL,IL +2826,17197,WILL,IL +2827,17197,WILL,IL +2828,17197,WILL,IL +2829,17197,WILL,IL +2830,17197,WILL,IL +2831,17197,WILL,IL +2832,17197,WILL,IL +2833,17197,WILL,IL +2834,17197,WILL,IL +2835,17197,WILL,IL +2836,17197,WILL,IL +2837,17197,WILL,IL +2838,17197,WILL,IL +2839,17197,WILL,IL +2840,17197,WILL,IL +2841,17197,WILL,IL +2842,17197,WILL,IL +2843,17197,WILL,IL +2844,17197,WILL,IL +2845,17197,WILL,IL +2846,17197,WILL,IL +2847,17197,WILL,IL +2848,17197,WILL,IL +2849,17197,WILL,IL +2850,17197,WILL,IL +2851,17197,WILL,IL +2852,17197,WILL,IL +2853,17197,WILL,IL +2854,17197,WILL,IL +2855,17197,WILL,IL +2856,17197,WILL,IL +2857,17197,WILL,IL +2858,17197,WILL,IL +2859,17197,WILL,IL +2860,17197,WILL,IL +2861,17197,WILL,IL +2862,17197,WILL,IL +2863,17197,WILL,IL +2864,17197,WILL,IL +2865,17197,WILL,IL +2866,17197,WILL,IL +2867,17197,WILL,IL +2868,17197,WILL,IL +2869,17197,WILL,IL +2870,17197,WILL,IL +2871,17197,WILL,IL +2872,17197,WILL,IL +2873,17197,WILL,IL +2874,17197,WILL,IL +2875,17197,WILL,IL +2876,17197,WILL,IL +2877,17197,WILL,IL +2878,17197,WILL,IL +2879,17197,WILL,IL +2880,17197,WILL,IL +2881,17197,WILL,IL +2882,17197,WILL,IL +2883,17197,WILL,IL +2884,17197,WILL,IL +2885,17197,WILL,IL +2886,17197,WILL,IL +2887,17197,WILL,IL +2888,17197,WILL,IL +2889,17197,WILL,IL +2890,17197,WILL,IL +2891,17197,WILL,IL +2892,17197,WILL,IL +2893,17197,WILL,IL +2894,17197,WILL,IL +2895,17197,WILL,IL +2896,17197,WILL,IL +2897,17197,WILL,IL +2898,17197,WILL,IL +2899,17197,WILL,IL +2900,17197,WILL,IL +2901,17197,WILL,IL +2902,17197,WILL,IL +2903,17197,WILL,IL +2904,17197,WILL,IL +2905,17197,WILL,IL +2906,17197,WILL,IL +2907,17197,WILL,IL +2908,17197,WILL,IL +2909,17197,WILL,IL +2910,17197,WILL,IL +2911,17197,WILL,IL +2912,17197,WILL,IL +2913,17197,WILL,IL +2914,17197,WILL,IL +2915,17197,WILL,IL +2916,17197,WILL,IL +2917,17197,WILL,IL +2918,17197,WILL,IL +2919,17197,WILL,IL +2920,17197,WILL,IL +2921,17197,WILL,IL +2922,17197,WILL,IL +2923,17197,WILL,IL +2924,17197,WILL,IL +2925,17197,WILL,IL +2926,17197,WILL,IL +2927,17063,GRUNDY,IL +2928,17063,GRUNDY,IL +2929,17063,GRUNDY,IL +2930,17063,GRUNDY,IL +2931,17063,GRUNDY,IL +2932,17063,GRUNDY,IL +2933,17063,GRUNDY,IL +2934,17063,GRUNDY,IL +2935,17063,GRUNDY,IL +2936,17063,GRUNDY,IL +2937,17063,GRUNDY,IL +2938,17063,GRUNDY,IL +2939,17063,GRUNDY,IL +2940,17063,GRUNDY,IL +2941,17063,GRUNDY,IL +2942,17063,GRUNDY,IL +2943,17063,GRUNDY,IL +2944,17063,GRUNDY,IL +2945,17063,GRUNDY,IL +2946,17063,GRUNDY,IL +2947,17063,GRUNDY,IL +2948,17063,GRUNDY,IL +2949,17063,GRUNDY,IL +2950,17063,GRUNDY,IL +2951,17007,BOONE,IL +2952,17007,BOONE,IL +2953,17007,BOONE,IL +2954,17007,BOONE,IL +2955,17007,BOONE,IL +2956,17007,BOONE,IL +2957,17007,BOONE,IL +2958,17007,BOONE,IL +2959,17007,BOONE,IL +2960,17007,BOONE,IL +2961,17007,BOONE,IL +2962,17007,BOONE,IL +2963,17007,BOONE,IL +2964,17007,BOONE,IL +2965,17007,BOONE,IL +2966,17007,BOONE,IL +2967,17007,BOONE,IL +2968,17007,BOONE,IL +2969,17007,BOONE,IL +2970,17007,BOONE,IL +2971,17007,BOONE,IL +2972,17007,BOONE,IL +2973,17007,BOONE,IL +2974,17007,BOONE,IL +2975,17007,BOONE,IL +2976,17037,DEKALB,IL +2977,17037,DEKALB,IL +2978,17037,DEKALB,IL +2979,17037,DEKALB,IL +2980,17037,DEKALB,IL +2981,17037,DEKALB,IL +2982,17037,DEKALB,IL +2983,17037,DEKALB,IL +2984,17037,DEKALB,IL +2985,17037,DEKALB,IL +2986,17037,DEKALB,IL +2987,17037,DEKALB,IL +2988,17037,DEKALB,IL +2989,17037,DEKALB,IL +2990,17037,DEKALB,IL +2991,17037,DEKALB,IL +2992,17037,DEKALB,IL +2993,17037,DEKALB,IL +2994,17037,DEKALB,IL +2995,17037,DEKALB,IL +2996,17037,DEKALB,IL +2997,17037,DEKALB,IL +2998,17037,DEKALB,IL +2999,17037,DEKALB,IL +3000,17037,DEKALB,IL +3001,17037,DEKALB,IL +3002,17037,DEKALB,IL +3003,17037,DEKALB,IL +3004,17037,DEKALB,IL +3005,17037,DEKALB,IL +3006,17037,DEKALB,IL +3007,17037,DEKALB,IL +3008,17037,DEKALB,IL +3009,17037,DEKALB,IL +3010,17037,DEKALB,IL +3011,17037,DEKALB,IL +3012,17037,DEKALB,IL +3013,17037,DEKALB,IL +3014,17037,DEKALB,IL +3015,17037,DEKALB,IL +3016,17037,DEKALB,IL +3017,17037,DEKALB,IL +3018,17037,DEKALB,IL +3019,17037,DEKALB,IL +3020,17037,DEKALB,IL +3021,17037,DEKALB,IL +3022,17091,KANKAKEE,IL +3023,17091,KANKAKEE,IL +3024,17091,KANKAKEE,IL +3025,17091,KANKAKEE,IL +3026,17091,KANKAKEE,IL +3027,17091,KANKAKEE,IL +3028,17091,KANKAKEE,IL +3029,17091,KANKAKEE,IL +3030,17091,KANKAKEE,IL +3031,17091,KANKAKEE,IL +3032,17091,KANKAKEE,IL +3033,17091,KANKAKEE,IL +3034,17091,KANKAKEE,IL +3035,17091,KANKAKEE,IL +3036,17091,KANKAKEE,IL +3037,17091,KANKAKEE,IL +3038,17091,KANKAKEE,IL +3039,17091,KANKAKEE,IL +3040,17091,KANKAKEE,IL +3041,17091,KANKAKEE,IL +3042,17091,KANKAKEE,IL +3043,17091,KANKAKEE,IL +3044,17091,KANKAKEE,IL +3045,17091,KANKAKEE,IL +3046,17091,KANKAKEE,IL +3047,17091,KANKAKEE,IL +3048,17091,KANKAKEE,IL +3049,17091,KANKAKEE,IL +3050,17091,KANKAKEE,IL +3051,17091,KANKAKEE,IL +3052,17091,KANKAKEE,IL +3053,17091,KANKAKEE,IL +3054,17091,KANKAKEE,IL +3055,17091,KANKAKEE,IL +3056,17091,KANKAKEE,IL +3057,17091,KANKAKEE,IL +3058,17091,KANKAKEE,IL +3059,17091,KANKAKEE,IL +3060,17091,KANKAKEE,IL +3061,17091,KANKAKEE,IL +3062,17091,KANKAKEE,IL +3063,17091,KANKAKEE,IL +3064,17091,KANKAKEE,IL +3065,17091,KANKAKEE,IL +3066,17091,KANKAKEE,IL +3067,17091,KANKAKEE,IL +3068,17091,KANKAKEE,IL +3069,17091,KANKAKEE,IL +3070,17091,KANKAKEE,IL +3071,17091,KANKAKEE,IL +3072,17091,KANKAKEE,IL +3073,17091,KANKAKEE,IL +3074,17099,LASALLE,IL +3075,17099,LASALLE,IL +3076,17099,LASALLE,IL +3077,17099,LASALLE,IL +3078,17099,LASALLE,IL +3079,17099,LASALLE,IL +3080,17099,LASALLE,IL +3081,17099,LASALLE,IL +3082,17099,LASALLE,IL +3083,17099,LASALLE,IL +3084,17099,LASALLE,IL +3085,17099,LASALLE,IL +3086,17099,LASALLE,IL +3087,17099,LASALLE,IL +3088,17099,LASALLE,IL +3089,17099,LASALLE,IL +3090,17099,LASALLE,IL +3091,17099,LASALLE,IL +3092,17099,LASALLE,IL +3093,17099,LASALLE,IL +3094,17099,LASALLE,IL +3095,17099,LASALLE,IL +3096,17099,LASALLE,IL +3097,17099,LASALLE,IL +3098,17099,LASALLE,IL +3099,17099,LASALLE,IL +3100,17099,LASALLE,IL +3101,17099,LASALLE,IL +3102,17099,LASALLE,IL +3103,17099,LASALLE,IL +3104,17099,LASALLE,IL +3105,17099,LASALLE,IL +3106,17099,LASALLE,IL +3107,17099,LASALLE,IL +3108,17099,LASALLE,IL +3109,17099,LASALLE,IL +3110,17099,LASALLE,IL +3111,17099,LASALLE,IL +3112,17099,LASALLE,IL +3113,17099,LASALLE,IL +3114,17099,LASALLE,IL +3115,17099,LASALLE,IL +3116,17099,LASALLE,IL +3117,17099,LASALLE,IL +3118,17099,LASALLE,IL +3119,17099,LASALLE,IL +3120,17099,LASALLE,IL +3121,17099,LASALLE,IL +3122,17099,LASALLE,IL +3123,17099,LASALLE,IL +3124,17099,LASALLE,IL +3125,17099,LASALLE,IL +3126,17099,LASALLE,IL +3127,17099,LASALLE,IL +3128,17099,LASALLE,IL +3129,17099,LASALLE,IL +3130,17099,LASALLE,IL +3131,17099,LASALLE,IL +3132,17099,LASALLE,IL +3133,17099,LASALLE,IL +3134,17099,LASALLE,IL +3135,17099,LASALLE,IL +3136,17099,LASALLE,IL +3137,17099,LASALLE,IL +3138,17099,LASALLE,IL +3139,17099,LASALLE,IL +3140,17099,LASALLE,IL +3141,17099,LASALLE,IL +3142,17099,LASALLE,IL +3143,17099,LASALLE,IL +3144,17099,LASALLE,IL +3145,17099,LASALLE,IL +3146,17103,LEE,IL +3147,17103,LEE,IL +3148,17103,LEE,IL +3149,17103,LEE,IL +3150,17103,LEE,IL +3151,17103,LEE,IL +3152,17141,OGLE,IL +3153,17141,OGLE,IL +3154,17141,OGLE,IL +3155,17141,OGLE,IL +3156,17141,OGLE,IL +3157,17141,OGLE,IL +3158,17141,OGLE,IL +3159,17141,OGLE,IL +3160,17141,OGLE,IL +3161,17141,OGLE,IL +3162,17141,OGLE,IL +3163,17141,OGLE,IL +3164,17141,OGLE,IL +3165,17141,OGLE,IL +3166,17141,OGLE,IL +3167,17141,OGLE,IL +3168,17141,OGLE,IL +3169,17201,WINNEBAGO,IL +3170,17201,WINNEBAGO,IL +3171,17201,WINNEBAGO,IL +3172,17201,WINNEBAGO,IL +3173,17201,WINNEBAGO,IL +3174,17201,WINNEBAGO,IL +3175,17201,WINNEBAGO,IL +3176,17201,WINNEBAGO,IL +3177,17201,WINNEBAGO,IL +3178,17201,WINNEBAGO,IL +3179,17201,WINNEBAGO,IL +3180,17201,WINNEBAGO,IL +3181,17201,WINNEBAGO,IL +3182,17201,WINNEBAGO,IL +3183,17201,WINNEBAGO,IL +3184,17201,WINNEBAGO,IL +3185,17201,WINNEBAGO,IL +3186,17201,WINNEBAGO,IL +3187,17201,WINNEBAGO,IL +3188,17201,WINNEBAGO,IL +3189,17201,WINNEBAGO,IL +3190,17201,WINNEBAGO,IL +3191,17201,WINNEBAGO,IL +3192,17201,WINNEBAGO,IL +3193,17201,WINNEBAGO,IL +3194,17201,WINNEBAGO,IL +3195,17201,WINNEBAGO,IL +3196,17201,WINNEBAGO,IL +3197,17201,WINNEBAGO,IL +3198,17201,WINNEBAGO,IL +3199,17201,WINNEBAGO,IL +3200,17201,WINNEBAGO,IL +3201,17201,WINNEBAGO,IL +3202,17201,WINNEBAGO,IL +3203,17201,WINNEBAGO,IL +3204,17201,WINNEBAGO,IL +3205,17201,WINNEBAGO,IL +3206,17201,WINNEBAGO,IL +3207,17201,WINNEBAGO,IL +3208,17201,WINNEBAGO,IL +3209,17201,WINNEBAGO,IL +3210,17201,WINNEBAGO,IL +3211,17201,WINNEBAGO,IL +3212,17201,WINNEBAGO,IL +3213,17201,WINNEBAGO,IL +3214,17201,WINNEBAGO,IL +3215,17201,WINNEBAGO,IL +3216,17201,WINNEBAGO,IL +3217,17201,WINNEBAGO,IL +3218,17201,WINNEBAGO,IL +3219,17201,WINNEBAGO,IL +3220,17201,WINNEBAGO,IL +3221,17201,WINNEBAGO,IL +3222,17201,WINNEBAGO,IL +3223,17201,WINNEBAGO,IL +3224,17201,WINNEBAGO,IL +3225,17201,WINNEBAGO,IL +3226,17201,WINNEBAGO,IL +3227,17201,WINNEBAGO,IL +3228,17201,WINNEBAGO,IL +3229,17201,WINNEBAGO,IL +3230,17201,WINNEBAGO,IL +3231,17201,WINNEBAGO,IL +3232,17201,WINNEBAGO,IL +3233,17201,WINNEBAGO,IL +3234,17201,WINNEBAGO,IL +3235,17201,WINNEBAGO,IL +3236,17201,WINNEBAGO,IL +3237,17201,WINNEBAGO,IL +3238,17201,WINNEBAGO,IL +3239,17201,WINNEBAGO,IL +3240,17201,WINNEBAGO,IL +3241,17201,WINNEBAGO,IL +3242,17201,WINNEBAGO,IL +3243,17201,WINNEBAGO,IL +3244,17201,WINNEBAGO,IL +3245,17201,WINNEBAGO,IL +3246,17201,WINNEBAGO,IL +3247,17201,WINNEBAGO,IL +3248,18089,LAKE,IN +3249,18089,LAKE,IN +3250,18089,LAKE,IN +3251,18089,LAKE,IN +3252,18089,LAKE,IN +3253,18089,LAKE,IN +3254,18089,LAKE,IN +3255,18089,LAKE,IN +3256,18089,LAKE,IN +3257,18089,LAKE,IN +3258,18089,LAKE,IN +3259,18089,LAKE,IN +3260,18089,LAKE,IN +3261,18089,LAKE,IN +3262,18089,LAKE,IN +3263,18089,LAKE,IN +3264,18089,LAKE,IN +3265,18089,LAKE,IN +3266,18089,LAKE,IN +3267,18089,LAKE,IN +3268,18089,LAKE,IN +3269,18089,LAKE,IN +3270,18089,LAKE,IN +3271,18089,LAKE,IN +3272,18089,LAKE,IN +3273,18089,LAKE,IN +3274,18089,LAKE,IN +3275,18089,LAKE,IN +3276,18089,LAKE,IN +3277,18089,LAKE,IN +3278,18089,LAKE,IN +3279,18089,LAKE,IN +3280,18089,LAKE,IN +3281,18089,LAKE,IN +3282,18089,LAKE,IN +3283,18089,LAKE,IN +3284,18089,LAKE,IN +3285,18089,LAKE,IN +3286,18089,LAKE,IN +3287,18089,LAKE,IN +3288,18089,LAKE,IN +3289,18089,LAKE,IN +3290,18089,LAKE,IN +3291,18089,LAKE,IN +3292,18089,LAKE,IN +3293,18089,LAKE,IN +3294,18089,LAKE,IN +3295,18089,LAKE,IN +3296,18089,LAKE,IN +3297,18089,LAKE,IN +3298,18089,LAKE,IN +3299,18089,LAKE,IN +3300,18089,LAKE,IN +3301,18089,LAKE,IN +3302,18089,LAKE,IN +3303,18089,LAKE,IN +3304,18089,LAKE,IN +3305,18089,LAKE,IN +3306,18089,LAKE,IN +3307,18089,LAKE,IN +3308,18089,LAKE,IN +3309,18089,LAKE,IN +3310,18089,LAKE,IN +3311,18089,LAKE,IN +3312,18089,LAKE,IN +3313,18089,LAKE,IN +3314,18089,LAKE,IN +3315,18089,LAKE,IN +3316,18089,LAKE,IN +3317,18089,LAKE,IN +3318,18089,LAKE,IN +3319,18089,LAKE,IN +3320,18089,LAKE,IN +3321,18089,LAKE,IN +3322,18089,LAKE,IN +3323,18089,LAKE,IN +3324,18089,LAKE,IN +3325,18089,LAKE,IN +3326,18089,LAKE,IN +3327,18089,LAKE,IN +3328,18089,LAKE,IN +3329,18089,LAKE,IN +3330,18089,LAKE,IN +3331,18089,LAKE,IN +3332,18089,LAKE,IN +3333,18089,LAKE,IN +3334,18089,LAKE,IN +3335,18089,LAKE,IN +3336,18089,LAKE,IN +3337,18089,LAKE,IN +3338,18089,LAKE,IN +3339,18089,LAKE,IN +3340,18089,LAKE,IN +3341,18089,LAKE,IN +3342,18089,LAKE,IN +3343,18089,LAKE,IN +3344,18089,LAKE,IN +3345,18091,LAPORTE,IN +3346,18091,LAPORTE,IN +3347,18091,LAPORTE,IN +3348,18091,LAPORTE,IN +3349,18091,LAPORTE,IN +3350,18091,LAPORTE,IN +3351,18091,LAPORTE,IN +3352,18091,LAPORTE,IN +3353,18091,LAPORTE,IN +3354,18091,LAPORTE,IN +3355,18091,LAPORTE,IN +3356,18091,LAPORTE,IN +3357,18091,LAPORTE,IN +3358,18091,LAPORTE,IN +3359,18091,LAPORTE,IN +3360,18091,LAPORTE,IN +3361,18091,LAPORTE,IN +3362,18091,LAPORTE,IN +3363,18091,LAPORTE,IN +3364,18091,LAPORTE,IN +3365,18091,LAPORTE,IN +3366,18091,LAPORTE,IN +3367,18091,LAPORTE,IN +3368,18091,LAPORTE,IN +3369,18091,LAPORTE,IN +3370,18091,LAPORTE,IN +3371,18091,LAPORTE,IN +3372,18091,LAPORTE,IN +3373,18091,LAPORTE,IN +3374,18091,LAPORTE,IN +3375,18091,LAPORTE,IN +3376,18091,LAPORTE,IN +3377,18091,LAPORTE,IN +3378,18091,LAPORTE,IN +3379,18091,LAPORTE,IN +3380,18091,LAPORTE,IN +3381,18091,LAPORTE,IN +3382,18091,LAPORTE,IN +3383,18091,LAPORTE,IN +3384,18091,LAPORTE,IN +3385,18091,LAPORTE,IN +3386,18091,LAPORTE,IN +3387,18091,LAPORTE,IN +3388,18091,LAPORTE,IN +3389,18091,LAPORTE,IN +3390,18091,LAPORTE,IN +3391,18091,LAPORTE,IN +3392,18091,LAPORTE,IN +3393,18091,LAPORTE,IN +3394,18091,LAPORTE,IN +3395,18091,LAPORTE,IN +3396,18091,LAPORTE,IN +3397,18091,LAPORTE,IN +3398,18091,LAPORTE,IN +3399,18091,LAPORTE,IN +3400,18091,LAPORTE,IN +3401,18127,PORTER,IN +3402,18127,PORTER,IN +3403,18127,PORTER,IN +3404,18127,PORTER,IN +3405,18127,PORTER,IN +3406,18127,PORTER,IN +3407,18127,PORTER,IN +3408,18127,PORTER,IN +3409,18127,PORTER,IN +3410,18127,PORTER,IN +3411,18127,PORTER,IN +3412,18127,PORTER,IN +3413,18127,PORTER,IN +3414,18127,PORTER,IN +3415,18127,PORTER,IN +3416,18127,PORTER,IN +3417,18127,PORTER,IN +3418,18127,PORTER,IN +3419,18127,PORTER,IN +3420,18127,PORTER,IN +3421,18127,PORTER,IN +3422,18127,PORTER,IN +3423,18127,PORTER,IN +3424,18127,PORTER,IN +3425,18127,PORTER,IN +3426,18127,PORTER,IN +3427,18127,PORTER,IN +3428,18127,PORTER,IN +3429,18127,PORTER,IN +3430,18127,PORTER,IN +3431,18127,PORTER,IN +3432,18127,PORTER,IN +3433,18127,PORTER,IN +3434,18127,PORTER,IN +3435,18127,PORTER,IN +3436,18127,PORTER,IN +3437,18127,PORTER,IN +3438,18127,PORTER,IN +3439,18127,PORTER,IN +3440,18127,PORTER,IN +3441,18127,PORTER,IN +3442,18127,PORTER,IN +3443,18127,PORTER,IN +3444,18127,PORTER,IN +3445,18127,PORTER,IN +3446,18127,PORTER,IN +3447,18127,PORTER,IN +3448,18127,PORTER,IN +3449,18127,PORTER,IN +3450,18127,PORTER,IN +3451,18127,PORTER,IN +3452,18127,PORTER,IN +3453,18127,PORTER,IN +3454,18127,PORTER,IN +3455,18127,PORTER,IN +3456,18127,PORTER,IN +3457,18127,PORTER,IN +3458,18127,PORTER,IN +3459,18127,PORTER,IN +3460,18127,PORTER,IN +3461,18127,PORTER,IN +3462,18127,PORTER,IN +3463,18127,PORTER,IN +3464,18127,PORTER,IN +3465,18127,PORTER,IN +3466,18127,PORTER,IN +3467,18127,PORTER,IN +3468,55059,KENOSHA,WI +3469,55059,KENOSHA,WI +3470,55059,KENOSHA,WI +3471,55059,KENOSHA,WI +3472,55059,KENOSHA,WI +3473,55059,KENOSHA,WI +3474,55059,KENOSHA,WI +3475,55059,KENOSHA,WI +3476,55059,KENOSHA,WI +3477,55059,KENOSHA,WI +3478,55059,KENOSHA,WI +3479,55059,KENOSHA,WI +3480,55059,KENOSHA,WI +3481,55059,KENOSHA,WI +3482,55059,KENOSHA,WI +3483,55059,KENOSHA,WI +3484,55059,KENOSHA,WI +3485,55059,KENOSHA,WI +3486,55059,KENOSHA,WI +3487,55059,KENOSHA,WI +3488,55059,KENOSHA,WI +3489,55059,KENOSHA,WI +3490,55059,KENOSHA,WI +3491,55059,KENOSHA,WI +3492,55059,KENOSHA,WI +3493,55059,KENOSHA,WI +3494,55059,KENOSHA,WI +3495,55059,KENOSHA,WI +3496,55059,KENOSHA,WI +3497,55059,KENOSHA,WI +3498,55059,KENOSHA,WI +3499,55059,KENOSHA,WI +3500,55059,KENOSHA,WI +3501,55059,KENOSHA,WI +3502,55059,KENOSHA,WI +3503,55059,KENOSHA,WI +3504,55059,KENOSHA,WI +3505,55059,KENOSHA,WI +3506,55059,KENOSHA,WI +3507,55059,KENOSHA,WI +3508,55059,KENOSHA,WI +3509,55059,KENOSHA,WI +3510,55059,KENOSHA,WI +3511,55059,KENOSHA,WI +3512,55059,KENOSHA,WI +3513,55101,RACINE,WI +3514,55101,RACINE,WI +3515,55101,RACINE,WI +3516,55101,RACINE,WI +3517,55101,RACINE,WI +3518,55101,RACINE,WI +3519,55101,RACINE,WI +3520,55101,RACINE,WI +3521,55101,RACINE,WI +3522,55101,RACINE,WI +3523,55101,RACINE,WI +3524,55101,RACINE,WI +3525,55101,RACINE,WI +3526,55101,RACINE,WI +3527,55101,RACINE,WI +3528,55101,RACINE,WI +3529,55101,RACINE,WI +3530,55101,RACINE,WI +3531,55101,RACINE,WI +3532,55101,RACINE,WI +3533,55101,RACINE,WI +3534,55101,RACINE,WI +3535,55101,RACINE,WI +3536,55101,RACINE,WI +3537,55101,RACINE,WI +3538,55101,RACINE,WI +3539,55101,RACINE,WI +3540,55101,RACINE,WI +3541,55101,RACINE,WI +3542,55101,RACINE,WI +3543,55101,RACINE,WI +3544,55101,RACINE,WI +3545,55101,RACINE,WI +3546,55101,RACINE,WI +3547,55101,RACINE,WI +3548,55101,RACINE,WI +3549,55101,RACINE,WI +3550,55101,RACINE,WI +3551,55101,RACINE,WI +3552,55101,RACINE,WI +3553,55101,RACINE,WI +3554,55101,RACINE,WI +3555,55101,RACINE,WI +3556,55101,RACINE,WI +3557,55101,RACINE,WI +3558,55101,RACINE,WI +3559,55101,RACINE,WI +3560,55101,RACINE,WI +3561,55101,RACINE,WI +3562,55101,RACINE,WI +3563,55101,RACINE,WI +3564,55101,RACINE,WI +3565,55101,RACINE,WI +3566,55101,RACINE,WI +3567,55101,RACINE,WI +3568,55101,RACINE,WI +3569,55127,WALWORTH,WI +3570,55127,WALWORTH,WI +3571,55127,WALWORTH,WI +3572,55127,WALWORTH,WI +3573,55127,WALWORTH,WI +3574,55127,WALWORTH,WI +3575,55127,WALWORTH,WI +3576,55127,WALWORTH,WI +3577,55127,WALWORTH,WI +3578,55127,WALWORTH,WI +3579,55127,WALWORTH,WI +3580,55127,WALWORTH,WI +3581,55127,WALWORTH,WI +3582,55127,WALWORTH,WI +3583,55127,WALWORTH,WI +3584,55127,WALWORTH,WI +3585,55127,WALWORTH,WI +3586,55127,WALWORTH,WI +3587,55127,WALWORTH,WI +3588,55127,WALWORTH,WI +3589,55127,WALWORTH,WI +3590,55127,WALWORTH,WI +3591,55127,WALWORTH,WI +3592,55127,WALWORTH,WI +3593,55127,WALWORTH,WI +3594,55127,WALWORTH,WI +3595,55127,WALWORTH,WI +3596,55127,WALWORTH,WI +3597,55127,WALWORTH,WI +3598,55127,WALWORTH,WI +3599,55127,WALWORTH,WI +3600,55127,WALWORTH,WI +3601,55127,WALWORTH,WI +3602,55127,WALWORTH,WI +3603,55127,WALWORTH,WI +3604,55127,WALWORTH,WI +3605,55127,WALWORTH,WI +3606,55127,WALWORTH,WI +3607,55127,WALWORTH,WI +3608,55127,WALWORTH,WI +3609,55127,WALWORTH,WI +3610,55127,WALWORTH,WI +3611,55127,WALWORTH,WI +3612,55127,WALWORTH,WI +3613,55127,WALWORTH,WI +3614,55127,WALWORTH,WI +3615,55127,WALWORTH,WI +3616,55127,WALWORTH,WI +3617,55127,WALWORTH,WI +3618,55127,WALWORTH,WI +3619,55127,WALWORTH,WI +3620,55127,WALWORTH,WI +3621,55127,WALWORTH,WI +3622,55127,WALWORTH,WI +3623,55127,WALWORTH,WI +3624,55127,WALWORTH,WI +3625,55127,WALWORTH,WI +3626,55127,WALWORTH,WI +3627,55127,WALWORTH,WI +3628,55127,WALWORTH,WI +3629,55127,WALWORTH,WI +3630,55127,WALWORTH,WI +3631,55127,WALWORTH,WI +3632,55127,WALWORTH,WI diff --git a/Database/macros/TOD_skim.py b/Database/macros/TOD_skim.py index 3a262b3..fa41ef3 100644 --- a/Database/macros/TOD_skim.py +++ b/Database/macros/TOD_skim.py @@ -1,164 +1,83 @@ -## TOD_skim.py -## -## Create travel time (and distance) skims for each time period, which are used in the utility calculations in -## the time-of-day model. Travel time skims are stored in the following matrices: -## - mf461 = overnight 8p-6a SOV hwy time skim -## - mf462 = am pre-pk shoulder 6a-7a SOV hwy time skim -## - mf463 = am peak 7a-9a SOV time skim -## - mf464 = am post-pk shoulder 9a-10a SOV hwy time skim -## - mf465 = midday 10a-2p SOV hwy time skim -## - mf466 = pm pre-pk shoulder 2p-4p SOV hwy time skim -## - mf467 = pm peak 4p-6p SOV hwy time -## - mf468 = pm post-pk shoulder 6p-8p SOV hwy time skim -## -## Travel distance skims are stored in the following matrices: -## - mf471 = overnight 8p-6a SOV hwy time skim -## - mf472 = am pre-pk shoulder 6a-7a SOV hwy time skim -## - mf473 = am peak 7a-9a SOV time skim -## - mf474 = am post-pk shoulder 9a-10a SOV hwy time skim -## - mf475 = midday 10a-2p SOV hwy time skim -## - mf476 = pm pre-pk shoulder 2p-4p SOV hwy time skim -## - mf477 = pm peak 4p-6p SOV hwy time -## - mf478 = pm post-pk shoulder 6p-8p SOV hwy time skim -## -## ms97 = dummy operand for demand matrix in assignment setup -## extra function parameter (el1) used in averaging vdfs -## -## Heither, rev. 01-12-2025 -## ========================================================================================== -import os -import sys -from pathlib import Path -import inro.modeller as _m -sys.path.append(str(Path(__file__).resolve().parents[2].joinpath('Scripts'))) -from tbmtools import project as tbm - -tod = int(sys.argv[1]) -currentScen = int(sys.argv[2]) -sThreads = int(sys.argv[3]) - -proj_dir = Path(__file__).resolve().parents[2] -my_modeller = tbm.connect(proj_dir) - -assign_SOLA = my_modeller.tool("inro.emme.traffic_assignment.sola_traffic_assignment") -matrix_init = my_modeller.tool("inro.emme.data.matrix.create_matrix") -my_emmebank = my_modeller.emmebank -delete_function = my_modeller.tool("inro.emme.data.function.delete_function") -readin_functions = my_modeller.tool("inro.emme.data.function.function_transaction") -change_scenario = my_modeller.tool("inro.emme.data.scenario.change_primary_scenario") -delete_scenario = my_modeller.tool("inro.emme.data.scenario.delete_scenario") -copy_scenario = my_modeller.tool("inro.emme.data.scenario.copy_scenario") -create_extra = my_modeller.tool("inro.emme.data.extra_attribute.create_extra_attribute") -netcalc = my_modeller.tool("inro.emme.network_calculation.network_calculator") -set_extra_function_parameters = my_modeller.tool("inro.emme.traffic_assignment.set_extra_function_parameters") -skimScen = my_emmebank.scenario(currentScen) -## ======================================================================================================================= - -default_path = os.getcwd().replace("\\","/") -vdf_file = os.path.join(default_path,"data/vdf_iter.in") - -mtxIndex = tod-1 - -## -- Initialize storage matrices -- ## -mtx = ["mf461","mf462","mf463","mf464","mf465","mf466","mf467","mf468"] ##-- TOD time storage matrices -mtx2 = ["mf471","mf472","mf473","mf474","mf475","mf476","mf477","mf478"] ##-- TOD distance storage matrices -# -new_mf1 = matrix_init(matrix_id="%s" %(mtx[mtxIndex]), matrix_name="todtime_%s" %(tod), - matrix_description="SOV hwy time skim period %s" %(tod), overwrite=True, default_value=0) -new_mf2 = matrix_init(matrix_id="%s" %(mtx2[mtxIndex]), matrix_name="toddist_%s" %(tod), - matrix_description="SOV hwy distance skim period %s" %(tod), overwrite=True, default_value=0) - -## -- Delete current volume-delay functions (fd1 - fd10) -- ## -for i in range(1,11): - f_id = "fd%s" % i - f = my_modeller.emmebank.function(f_id) - if f is not None: - delete_function(f) -## -- Import global iteration vdf functions -- ## -readin_functions(transaction_file=vdf_file, throw_on_error=True) - -## -- Copy scenario for skimming and set as primary scenario -- ## -s90 = copy_scenario(from_scenario=skimScen, - scenario_id=90, - scenario_title="temp scenario for skimming", - copy_linkshapes=True, - overwrite=True, - set_as_primary=True) - -## -- Create @avtot to hold the sum of class average volumes -- ## -new_att = create_extra(extra_attribute_type="LINK", - extra_attribute_name="@avtot", - extra_attribute_description="total average volume (veq)", - overwrite=True) - -calcSpec = {"type": "NETWORK_CALCULATION", "result": "@avtot", - "expression": "@avs1v+@avs2v+@avs3v+@avh2v+@avh3v+@avbqv+@avlqv+@avmqv+@avhqv", - "aggregation": None, "selections": {"link": "all"}} -report = netcalc(calcSpec, full_report=False) - -## -- Set extra function parameters -- ## -set_extra_function_parameters(el1="@avtot", el2="@busveq") - - -skimSpec = { - "type": "SOLA_TRAFFIC_ASSIGNMENT", - "classes": [ - { - "mode": "S", - "demand": "ms97", - "generalized_cost": None, - "results": { - "link_volumes": None, - "turn_volumes": None, - "od_travel_times": { - "shortest_paths": mtx[mtxIndex] - } - }, - "path_analyses": [ - { - "link_component": "length", - "turn_component": None, - "operator": "+", - "selection_threshold": { - "lower": None, - "upper": None - }, - "path_to_od_composition": { - "considered_paths": "ALL", - "multiply_path_proportions_by": { - "analyzed_demand": False, - "path_value": True - } - }, - "analyzed_demand": None, - "results": { - "selected_link_volumes": None, - "selected_turn_volumes": None, - "od_values": mtx2[mtxIndex] - } - } - ] - } - ], - "performance_settings": { - "number_of_processors": sThreads - }, - "background_traffic": None, - "stopping_criteria": { - "max_iterations": 0, - "relative_gap": 0.0001, - "best_relative_gap": 0.01, - "normalized_gap": 0.005 - } -} - -with _m.logbook_trace("Travel Time (and Distance) Skims for Time-of-Day Model: Scenario %s" % currentScen): - report = assign_SOLA(skimSpec) - - ## -- Reset primary scenario -- ## - change_scenario(scenario=currentScen) - - ## -- Delete temporary skim scenario (cannot be current scenario) -- ## - s90 = my_emmebank.scenario(90) - delete_scenario(scenario=s90) -print(" Travel Time and Distance Skims Completed for Time Period {0}".format(tod)) +## TOD_skim.py +## +## Create travel time skims for each time period, which are used in the utility calculations in +## the time-of-day model. Travel time skims are stored in the following matrices: +## - mf461 = overnight 8p-6a SOV hwy time skim +## - mf462 = am pre-pk shoulder 6a-7a SOV hwy time skim +## - mf463 = am peak 7a-9a SOV time skim +## - mf464 = am post-pk shoulder 9a-10a SOV hwy time skim +## - mf465 = midday 10a-2p SOV hwy time skim +## - mf466 = pm pre-pk shoulder 2p-4p SOV hwy time skim +## - mf467 = pm peak 4p-6p SOV hwy time +## - mf468 = pm post-pk shoulder 6p-8p SOV hwy time skim +## +## ms97 = dummy operand for demand matrix in assignment setup +## extra function parameter (el1) used in averaging vdfs +## +## This is the SOLA Python implementation of the Emme macro skimTOD5I_7c.mac. +## +## Heither 11-11-2022 +## ========================================================================================== +import os +import sys +import inro.modeller as _m +import inro.emme.desktop.app as _app + +empFl = sys.argv[1] +tod = int(sys.argv[2]) +currentScen = int(sys.argv[3]) +sThreads = int(sys.argv[4]) + +directory = os.getcwd().replace('\\Database','') +empFile = os.path.join(directory,empFl) +my_app = _app.start_dedicated(project=empFile, visible=False, user_initials="CMAP") +my_modeller = _m.Modeller(my_app) + +assign_SOLA = my_modeller.tool("inro.emme.traffic_assignment.sola_traffic_assignment") +my_emmebank = my_modeller.emmebank + +change_scenario = my_modeller.tool("inro.emme.data.scenario.change_primary_scenario") +delete_scenario = my_modeller.tool("inro.emme.data.scenario.delete_scenario") +s90 = my_emmebank.scenario(90) + +mtx = ["mf461","mf462","mf463","mf464","mf465","mf466","mf467","mf468"] ##-- storage matrices +mtxIndex = tod-1 + +skimSpec = { + "type": "SOLA_TRAFFIC_ASSIGNMENT", + "classes": [ + { + "mode": "S", + "demand": "ms97", + "generalized_cost": None, + "results": { + "link_volumes": None, + "turn_volumes": None, + "od_travel_times": { + "shortest_paths": mtx[mtxIndex] + } + }, + "path_analyses": [] + } + ], + "performance_settings": { + "number_of_processors": sThreads + }, + "background_traffic": None, + "stopping_criteria": { + "max_iterations": 0, + "relative_gap": 0.0001, + "best_relative_gap": 0.01, + "normalized_gap": 0.005 + } +} + +with _m.logbook_trace("Travel Time Skims for Time-of-Day Model: Scenario %s" % currentScen): + report = assign_SOLA(skimSpec) + + ## -- Reset primary scenario -- ## + change_scenario(scenario=currentScen) + + ## -- Delete temporary skim scenario (cannot be current scenario) -- ## + delete_scenario(scenario=s90) +print(" Travel time skim Completed for Time Period {0}".format(tod)) diff --git a/Database/macros/skim_transit.py b/Database/macros/skim_transit.py index 560b280..3e380a3 100644 --- a/Database/macros/skim_transit.py +++ b/Database/macros/skim_transit.py @@ -15,12 +15,12 @@ also performs calculations to identify first, priority and last modes. - Arguments: 1= 3-digit scenario number - 2= model Global Iteration number 0-2 - 3= time period indicator: AM, MD, PM, NT + Arguments: 1= name of Emme project file + 2= 3-digit scenario number + 3= model Global Iteration number 0-2 + 4= time period indicator: AM or MD - - Craig Heither, rev. 06-09-2025 + Craig Heither, 03-25-2024 ========================================================================================== ''' @@ -33,6 +33,7 @@ currentScen = int(sys.argv[1]) globalIter = int(sys.argv[2]) timePeriod = sys.argv[3] +donorScen = currentScen*100 + (globalIter-1)*10 + 3 ## -- used for Global Iterations 1 & 2 ## -- Trasit base fares in cents (updated Oct. 2020) -- ## ctaBusFare= 225 @@ -64,47 +65,19 @@ init_partition = my_modeller.tool("inro.emme.data.zone_partition.init_partition") change_partition = my_modeller.tool("inro.emme.data.zone_partition.change_partition_description") compute_matrix = my_modeller.tool("inro.emme.matrix_calculation.matrix_calculator") -copy_scenario = my_modeller.tool("inro.emme.data.scenario.copy_scenario") ########################################################################################################################### -## -- Set time period parameters -- ## -if timePeriod == 'AM': - donorScen = currentScen*100 + (globalIter-1)*10 + 3 ## -- used for Global Iterations 1 & 2 - currentScen = currentScen + 3 - mtx = ("mf803","mf804","mf805","mf806","mf807","mf808","mf809","mf810","mf811","mf812","mf813","mf815","mf816","mf817","mf818") -elif timePeriod == 'MD': - donorScen = currentScen*100 + (globalIter-1)*10 + 5 ## -- used for Global Iterations 1 & 2 +## -- Set primary scenario -- ## +if timePeriod == 'MD': currentScen = currentScen + 5 - mtx = ("mf903","mf904","mf905","mf906","mf907","mf908","mf909","mf910","mf911","mf912","mf913","mf915","mf916","mf917","mf918") -elif timePeriod == 'PM': - donorScen = currentScen*100 + (globalIter-1)*10 + 7 ## -- used for Global Iterations 1 & 2 - currentScen = currentScen + 7 - mtx = ("mf853","mf854","mf855","mf856","mf857","mf858","mf859","mf860","mf861","mf862","mf863","mf865","mf866","mf867","mf868") - ## -- Copy PM peak transit scenario for skimming -- ## - skimScen = currentScen + 20 - pmTran = copy_scenario(from_scenario=skimScen, - scenario_id=currentScen, - scenario_title="pm (4pm-6pm) transit skim network", - copy_linkshapes=True, - overwrite=True, - set_as_primary=True) -elif timePeriod == 'NT': - donorScen = currentScen*100 + (globalIter-1)*10 + 1 ## -- used for Global Iterations 1 & 2 - currentScen = currentScen + 1 - mtx = ("mf953","mf954","mf955","mf956","mf957","mf958","mf959","mf960","mf961","mf962","mf963","mf965","mf966","mf967","mf968") - ## -- Copy EA transit scenario for skimming -- ## - skimScen = currentScen + 20 - eaTran = copy_scenario(from_scenario=skimScen, - scenario_id=currentScen, - scenario_title="night/early am (6pm-6am) transit skim network", - copy_linkshapes=True, - overwrite=True, - set_as_primary=True) - change_scenario(scenario=currentScen) ## -- Initialize matrices -- ## +mtx = ("mf803","mf804","mf805","mf806","mf807","mf808","mf809","mf810","mf811","mf812","mf813","mf815","mf816","mf817","mf818") +if timePeriod == 'MD': + mtx = ("mf903","mf904","mf905","mf906","mf907","mf908","mf909","mf910","mf911","mf912","mf913","mf915","mf916","mf917","mf918") + new_mf1 = matrix_init(matrix_id="%s" %(mtx[0]), matrix_name="fmode_%s" %(timePeriod), matrix_description="skimmed first mode - %s" %(timePeriod), overwrite=True, default_value=3) ##-- 3=value for bus new_mf2 = matrix_init(matrix_id="%s" %(mtx[1]), matrix_name="pmode_%s" %(timePeriod), @@ -141,6 +114,8 @@ ## -- Use ul2 temporarily to store congested highway time from auto scenario -- ## ## -- Global Iteration 0: @hwytm has already been filled with pre-loaded congested times. -- ## if globalIter > 0: + if timePeriod == 'MD': + donorScen = donorScen + 2 print("currentScen={0}, timePeriod={1}, donorScen={2}".format(currentScen,timePeriod,donorScen)) ## -- Initialize ul2 [link variable] and @hwytm [segment variable] -- ## diff --git a/Database/macros/tod_skim_setup.mac b/Database/macros/tod_skim_setup.mac new file mode 100644 index 0000000..f85cf17 --- /dev/null +++ b/Database/macros/tod_skim_setup.mac @@ -0,0 +1,147 @@ +~# +~/********************************************************************** +~/********************************************************************** +~# +~/ Macro TOD_skim_setup.mac %1% %2% +~/ Where %1% = three digit alternative ID number. +~/ %2% = time period number +~# +~/********************************************************************** +~/ Macro written to create time skims for each time period. +~/********************************************************************** +~/ Time and distance skims are prepared for the following time periods +~/ and stored in these full matricies. +~# +~/ mf461 = overnight 8p-6a SOV hwy time skim +~/ mf462 = am pre-pk shoulder 6a-7a SOV hwy time skim +~/ mf463 = am peak 7a-9a SOV time skim +~/ mf464 = am post-pk shoulder 9a-10a SOV hwy time skim +~/ mf465 = midday 10a-2p SOV hwy time skim +~/ mf466 = pm pre-pk shoulder 2p-4p SOV hwy time skim +~/ mf467 = pm peak 4p-6p SOV hwy time +~/ mf468 = pm post-pk shoulder 6p-8p SOV hwy time skim +~/ +~/ ms97 = dummy operand for demand matrix in assignment setup (5.11) +~/ +~/ extra function parameter (el1) used in averaging vdfs +~# +~/********************************************************************** +~/ Set reports and batchin +~/********************************************************************** +reports=report\iter_%ms98%\skimtod_iter_%s%.rxt +~o|39 +~x=%ms98% +batchin=data\vdf_iter.in +~# +~/********************************************************************** +~# +~/ Use averaging volume delay functions for skimming. +~/ Delete existing functions and batch in new functions. +~# +~/********************************************************************** +~+;4.12;4;fd1,fd10; ;~?e;~$>err;y +~:err +q +~# +4.11 +2 +~# +~/********************************************************************** +~/ Make temp copy of scenarios for skimming. +~/********************************************************************** +~# +~z=%s% +~# ## -- Delete temp scenario if it exists -- ## +1.22 +2 +90 +~?e +~+; ;q;~$>next +yes +q +~:next +~# ## -- Copy scenario -- ## +1.22 +3 +%z% +90 +temp scenario %2% for skimming +no +q +~# +~/********************************************************************** +~/ Set scenario. +~/********************************************************************** +~x=90 +~# +s=%x% +~/********************************************************************** +~/ Set period text registers. +~/********************************************************************** +~# -- SOV -- +~r1=46%2% +~t1=todtime%2% +~t2=SOV hwy time skim period %2% +~# +~# +~/********************************************************************** +~/ Initialize time matrix +~/********************************************************************** +~# +3.12 +2 +mf%r1% +~?e +~$>err +yes +~$>end +~:err + +r +~:end +~+; 1; mf%r1%; %t1%; %t2%; 0.0 +~# +q +~# +~/********************************************************************** +~/ Sum class average volumes into new extra attrib @avtot +~/********************************************************************** +2.42 +3 +@avtot +~?e +~$>err +yes +q +~$>end +~:err + +q +~:end +~/ +2.42 +2 +2 +@avtot +total average volume (veq) +0 +q +2.41 +1 +yes +@avtot +no +@avs1v+@avs2v+@avs3v+@avh2v+@avh3v+@avbqv+@avlqv+@avmqv+@avhqv + +all +2 +2 +q +~# +~# +el1=@avtot +~/********************************************************************** +reports= +batchin= +~/********************************************************************** +q diff --git a/Database/macros/transit_skim_final_matrices.py b/Database/macros/transit_skim_final_matrices1.py similarity index 78% rename from Database/macros/transit_skim_final_matrices.py rename to Database/macros/transit_skim_final_matrices1.py index b3412ca..6ccf024 100644 --- a/Database/macros/transit_skim_final_matrices.py +++ b/Database/macros/transit_skim_final_matrices1.py @@ -1,22 +1,19 @@ ############################################################################# # TRANSIT_SKIM_FINAL_MATRICES1.PY # -# Craig Heither, last revised 06-09-2025 # +# Craig Heither, last revised 04-04-2019 # # # # This program performs the matrix convolution portion of the transit # -# skim procedures (much more efficiently than Emme). # +# skim procedures (much more efficiently than Emme) for the AM peak. # # # # Written to work with Emme 4 structure. # # Rev Bozic to work with series 800 ampk matrices 11/2/2017 # # for integration with global iterations # # 04-04-2019: Heither - implement vectorized calculations using NumPy. # -# 07/23/2020 Ferguson: Explicity cast kzone values as integers for # +# 07/23/2020 Ferguson: Explicity cast kzone values as integers for # # compatibility with np.add() in NumPy 1.16. # -# 01/14/2025 Heither: Flexibility to work for any transit time period. # -# # -# Arguments: 1= time period indicator: AM, MD, PM, NT # ############################################################################# -import os, sys, string, array, numpy as np +import os, string, array, numpy as np from array import * # ---------------------------------------------------------------------------------------- @@ -26,51 +23,40 @@ embank = os.getcwd() + "\\emmebank" mtxpath = os.getcwd() + "\\emmemat" ### path to Emme matrix storage -timePeriod = sys.argv[1] - -if timePeriod == 'AM': - inputmtx = (44, 803, 804, 805, 808, 809, 810, 811, 818, 819, 820, 821) ## -- Input Matrix Numbers - outputmtx = (822, 823, 824, 825, 828, 829, 830, 831, 832, 833, 834) ## -- Output Matrix Numbers -elif timePeriod == 'MD': - inputmtx = (46, 903, 904, 905, 908, 909, 910, 911, 918, 919, 920, 921) ## -- Input Matrix Numbers - outputmtx = (922, 923, 924, 925, 928, 929, 930, 931, 932, 933, 934) ## -- Output Matrix Numbers -elif timePeriod == 'PM': - inputmtx = (467, 853, 854, 855, 858, 859, 860, 861, 868, 869, 870, 871) ## -- Input Matrix Numbers - outputmtx = (872, 873, 874, 875, 878, 879, 880, 881, 882, 883, 884) ## -- Output Matrix Numbers -elif timePeriod == 'NT': - inputmtx = (461, 953, 954, 955, 958, 959, 960, 961, 968, 969, 970, 971) ## -- Input Matrix Numbers - outputmtx = (972, 973, 974, 975, 978, 979, 980, 981, 982, 983, 984) ## -- Output Matrix Numbers - + # -- Input Matrix Numbers -- +inputmtx = (44, 803, 804, 805, 808, 809, 810, 811, 818, 819, 820, 821) + # -- Output Matrix Numbers -- +outputmtx = (822, 823, 824, 825, 828, 829, 830, 831, 832, 833, 834) # -- Input Matrices -- -mfauto = mtxpath + "\\mf" + str(inputmtx[0]) + ".emx" ### time period hwy time matrix -mffmode = mtxpath + "\\mf" + str(inputmtx[1]) + ".emx" ### time period skimmed first mode -mfpmode = mtxpath + "\\mf" + str(inputmtx[2]) + ".emx" ### time period skimmed priority mode -mflmode = mtxpath + "\\mf" + str(inputmtx[3]) + ".emx" ### time period skimmed last mode -mfinveh = mtxpath + "\\mf" + str(inputmtx[4]) + ".emx" ### time period skimmed in-vehicle minutes -mftrnfr = mtxpath + "\\mf" + str(inputmtx[5]) + ".emx" ### time period skimmed transfer link minutes -mftwait = mtxpath + "\\mf" + str(inputmtx[6]) + ".emx" ### time period skimmed total wait minutes -mffwait = mtxpath + "\\mf" + str(inputmtx[7]) + ".emx" ### time period skimmed first wait minutes -mfafare = mtxpath + "\\mf" + str(inputmtx[8]) + ".emx" ### time period skimmed final average fare -mfcghwy = mtxpath + "\\mf" + str(inputmtx[9]) + ".emx" ### time period congested hwy generalized cost matrix -mftcost = mtxpath + "\\mf" + str(inputmtx[10]) + ".emx" ### time period indexed transit generalized cost -mfkzone = mtxpath + "\\mf" + str(inputmtx[11]) + ".emx" ### time period intermediate zone matrix +mfauto = mtxpath + "\\mf" + str(inputmtx[0]) + ".emx" ### AM peak hwy time matrix (mf44) +mffmode = mtxpath + "\\mf" + str(inputmtx[1]) + ".emx" ### skimmed first mode (mf803) +mfpmode = mtxpath + "\\mf" + str(inputmtx[2]) + ".emx" ### skimmed priority mode (mf804) +mflmode = mtxpath + "\\mf" + str(inputmtx[3]) + ".emx" ### skimmed last mode (mf805) +mfinveh = mtxpath + "\\mf" + str(inputmtx[4]) + ".emx" ### skimmed in-vehicle minutes (mf808) +mftrnfr = mtxpath + "\\mf" + str(inputmtx[5]) + ".emx" ### skimmed transfer link minutes (mf809) +mftwait = mtxpath + "\\mf" + str(inputmtx[6]) + ".emx" ### skimmed total wait minutes (mf810) +mffwait = mtxpath + "\\mf" + str(inputmtx[7]) + ".emx" ### skimmed first wait minutes (mf811) +mfafare = mtxpath + "\\mf" + str(inputmtx[8]) + ".emx" ### skimmed final average fare (mf818) +mfcghwy = mtxpath + "\\mf" + str(inputmtx[9]) + ".emx" ### congested hwy generalized cost matrix (mf819) +mftcost = mtxpath + "\\mf" + str(inputmtx[10]) + ".emx" ### indexed transit generalized cost (mf820) +mfkzone = mtxpath + "\\mf" + str(inputmtx[11]) + ".emx" ### intermediate zone matrix (mf821) # -- Output Matrices -- -mfinvehi = mtxpath + "\\mf" + str(outputmtx[0]) + ".emx" ### indexed in-vehicle minutes -mftrnfri = mtxpath + "\\mf" + str(outputmtx[1]) + ".emx" ### indexed walk transfer minutes -mftwaiti = mtxpath + "\\mf" + str(outputmtx[2]) + ".emx" ### indexed total wait minutes -mffwaiti = mtxpath + "\\mf" + str(outputmtx[3]) + ".emx" ### indexed first wait minutes -mfafarei = mtxpath + "\\mf" + str(outputmtx[4]) + ".emx" ### indexed final average fare -mffmodei = mtxpath + "\\mf" + str(outputmtx[5]) + ".emx" ### indexed first mode -mfpmodei = mtxpath + "\\mf" + str(outputmtx[6]) + ".emx" ### indexed priority mode -mflmodei = mtxpath + "\\mf" + str(outputmtx[7]) + ".emx" ### indexed last mode -mfacosti = mtxpath + "\\mf" + str(outputmtx[8]) + ".emx" ### indexed auto generalized cost -mfautrni = mtxpath + "\\mf" + str(outputmtx[9]) + ".emx" ### indexed auto min. to transit -mfratioi = mtxpath + "\\mf" + str(outputmtx[10]) + ".emx" ### indexed transit/auto only +mfinvehi = mtxpath + "\\mf" + str(outputmtx[0]) + ".emx" ### indexed in-vehicle minutes (mf822) +mftrnfri = mtxpath + "\\mf" + str(outputmtx[1]) + ".emx" ### indexed walk transfer minutes (mf823) +mftwaiti = mtxpath + "\\mf" + str(outputmtx[2]) + ".emx" ### indexed total wait minutes (mf824) +mffwaiti = mtxpath + "\\mf" + str(outputmtx[3]) + ".emx" ### indexed first wait minutes (mf825) +mfafarei = mtxpath + "\\mf" + str(outputmtx[4]) + ".emx" ### indexed final average fare (mf828) +mffmodei = mtxpath + "\\mf" + str(outputmtx[5]) + ".emx" ### indexed first mode (mf829) +mfpmodei = mtxpath + "\\mf" + str(outputmtx[6]) + ".emx" ### indexed priority mode (mf830) +mflmodei = mtxpath + "\\mf" + str(outputmtx[7]) + ".emx" ### indexed last mode (mf831) +mfacosti = mtxpath + "\\mf" + str(outputmtx[8]) + ".emx" ### indexed auto generalized cost (mf832) +mfautrni = mtxpath + "\\mf" + str(outputmtx[9]) + ".emx" ### indexed auto min. to transit (mf833) +mfratioi = mtxpath + "\\mf" + str(outputmtx[10]) + ".emx" ### indexed transit/auto only (mf834) # -- Others -- cutoff = 0.4 ### cutoff value for indexed transit cost/auto only trip cost -stats = os.getcwd() + "\\report\\transit_skim_stats_%s.txt" %(timePeriod) +stats = os.getcwd() + "\\report\\transit_skim_stats8.txt" if os.path.exists(stats): os.remove(stats) diff --git a/Database/macros/transit_skim_final_matrices2.py b/Database/macros/transit_skim_final_matrices2.py new file mode 100644 index 0000000..7d316b4 --- /dev/null +++ b/Database/macros/transit_skim_final_matrices2.py @@ -0,0 +1,182 @@ +############################################################################# +# TRANSIT_SKIM_FINAL_MATRICES2.PY # +# Craig Heither, last revised 04-04-2019 # +# # +# This program performs the matrix convolution portion of the transit # +# skim procedures (much more efficiently than Emme) for the midday. # +# # +# Written to work with Emme 4 structure. # +# Rev Bozic to work with series 900 midday matrices 11/2/2017 # +# for integration with global iterations # +# 04-04-2019: Heither - implement vectorized calculations using NumPy. # +# 07/23/2020 Ferguson: Explicity cast kzone values as integers for # +# compatibility with np.add() in NumPy 1.16. # +############################################################################# + +import os, string, array, numpy as np +from array import * + +# ---------------------------------------------------------------------------------------- +# Set Variables. +# Note: these should only be changed if the transit skim procedures are altered. +# ---------------------------------------------------------------------------------------- +embank = os.getcwd() + "\\emmebank" +mtxpath = os.getcwd() + "\\emmemat" ### path to Emme matrix storage + + # -- Input Matrix Numbers -- +inputmtx = (46, 903, 904, 905, 908, 909, 910, 911, 918, 919, 920, 921) + # -- Output Matrix Numbers -- +outputmtx = (922, 923, 924, 925, 928, 929, 930, 931, 932, 933, 934) + +# -- Input Matrices -- +mfauto = mtxpath + "\\mf" + str(inputmtx[0]) + ".emx" ### midday hwy time matrix (mf46) +mffmode = mtxpath + "\\mf" + str(inputmtx[1]) + ".emx" ### skimmed first mode (mf903) +mfpmode = mtxpath + "\\mf" + str(inputmtx[2]) + ".emx" ### skimmed priority mode (mf904) +mflmode = mtxpath + "\\mf" + str(inputmtx[3]) + ".emx" ### skimmed last mode (mf905) +mfinveh = mtxpath + "\\mf" + str(inputmtx[4]) + ".emx" ### skimmed in-vehicle minutes (mf908) +mftrnfr = mtxpath + "\\mf" + str(inputmtx[5]) + ".emx" ### skimmed transfer link minutes (mf909) +mftwait = mtxpath + "\\mf" + str(inputmtx[6]) + ".emx" ### skimmed total wait minutes (mf910) +mffwait = mtxpath + "\\mf" + str(inputmtx[7]) + ".emx" ### skimmed first wait minutes (mf911) +mfafare = mtxpath + "\\mf" + str(inputmtx[8]) + ".emx" ### skimmed final average fare (mf918) +mfcghwy = mtxpath + "\\mf" + str(inputmtx[9]) + ".emx" ### congested hwy generalized cost matrix (mf919) +mftcost = mtxpath + "\\mf" + str(inputmtx[10]) + ".emx" ### indexed transit generalized cost (mf920) +mfkzone = mtxpath + "\\mf" + str(inputmtx[11]) + ".emx" ### intermediate zone matrix (mf921) +# -- Output Matrices -- +mfinvehi = mtxpath + "\\mf" + str(outputmtx[0]) + ".emx" ### indexed in-vehicle minutes (mf922) +mftrnfri = mtxpath + "\\mf" + str(outputmtx[1]) + ".emx" ### indexed walk transfer minutes (mf923) +mftwaiti = mtxpath + "\\mf" + str(outputmtx[2]) + ".emx" ### indexed total wait minutes (mf924) +mffwaiti = mtxpath + "\\mf" + str(outputmtx[3]) + ".emx" ### indexed first wait minutes (mf925) +mfafarei = mtxpath + "\\mf" + str(outputmtx[4]) + ".emx" ### indexed final average fare (mf928) +mffmodei = mtxpath + "\\mf" + str(outputmtx[5]) + ".emx" ### indexed first mode (mf929) +mfpmodei = mtxpath + "\\mf" + str(outputmtx[6]) + ".emx" ### indexed priority mode (mf930) +mflmodei = mtxpath + "\\mf" + str(outputmtx[7]) + ".emx" ### indexed last mode (mf931) +mfacosti = mtxpath + "\\mf" + str(outputmtx[8]) + ".emx" ### indexed auto generalized cost (mf932) +mfautrni = mtxpath + "\\mf" + str(outputmtx[9]) + ".emx" ### indexed auto min. to transit (mf933) +mfratioi = mtxpath + "\\mf" + str(outputmtx[10]) + ".emx" ### indexed transit/auto only (mf934) + +# -- Others -- +cutoff = 0.4 ### cutoff value for indexed transit cost/auto only trip cost +stats = os.getcwd() + "\\report\\transit_skim_stats9.txt" + +if os.path.exists(stats): + os.remove(stats) + +# --------------------------------------------------------------- +# Open emmebank and read metadata. +# --------------------------------------------------------------- +a0 = array('i') +a1 = array('i') +with open(embank,'r+b') as f: + # ## Read first 512 items: this is File 0 - metadata about files ## + a0.fromfile(f,512) ## grabs file offset, # of records, words/record & file type: 1-integer, 2-real, 3-text + + # ## Read Global parameters from File 1: array index starts with zero not 1, so is -1 from EMME documentation ## + offst = a0[102] * 4 ## File 1 offset: elements * 4 bytes + f.seek(offst, 0) + a1.fromfile(f,80) + mcent = a1[51] ## maximum number of centroids defined in emmebank + print("\tREADING EMMEBANK: {0} Centroids".format(str(mcent),)) + + # ## Read Project title from File 2 ## + offst = a0[104] * 4 + f.seek(offst, 0) + + # ## Write Emmebank parameters to File to review ## + outFile = open(stats, 'w') + outFile.write("Max. scenarios: {0} \n".format((a1[50]),)) + outFile.write("Max. centroids: {0} \n".format((a1[51]),)) + outFile.write("Max. nodes: {0} \n".format((a1[52]),)) + outFile.write("Max. links: {0} \n".format((a1[53]),)) + outFile.write("Max. length turn penalty table: {0} \n".format((a1[54]),)) + outFile.write("Max. transit lines: {0} \n".format((a1[55]),)) + outFile.write("Max. line segments: {0} \n".format((a1[56]),)) + outFile.write("Max. number of matrices: {0} \n".format((a1[57]),)) + outFile.write("Max. number of functions/class: {0} \n".format((a1[58]),)) + outFile.write("Max. number of operators/function class: {0} \n".format((a1[59]),)) + outFile.write("\n") + for z in range(1, 100): + outFile.write("File {0:>3} - Type {1} Offset {2:>10} Word/Rec {3:>8} Records {4:>4} \n".format(z, (a0[z+400]), (a0[2*z+100]), (a0[z+300]), (a0[z]))) + + outFile.close() + + +# --------------------------------------------------------------- +# Store matrix values in arrays. +# --------------------------------------------------------------- + # -- Input Matrices -- +dt = np.dtype('float32') +auto = np.fromfile(mfauto, dtype=dt) +kzone = np.fromfile(mfkzone, dtype=dt) +tcost = np.fromfile(mftcost, dtype=dt) +inveh = np.fromfile(mfinveh, dtype=dt) +trnfr = np.fromfile(mftrnfr, dtype=dt) +twait = np.fromfile(mftwait, dtype=dt) +fwait = np.fromfile(mffwait, dtype=dt) +afare = np.fromfile(mfafare, dtype=dt) +fmode = np.fromfile(mffmode, dtype=dt) +pmode = np.fromfile(mfpmode, dtype=dt) +lmode = np.fromfile(mflmode, dtype=dt) +cghwy = np.fromfile(mfcghwy, dtype=dt) + +## -- create leg1 (p-k) indices +indxloc = np.arange(mcent*mcent) ## -- array of consecutive numbers representing element index values +leg1pt1 = np.divide(indxloc,mcent) +leg1pt1 = np.multiply(leg1pt1.astype('i4'),mcent,dtype='i4') ## -- portion of element index defining origin zone +leg1indx = np.add(leg1pt1,kzone.astype('i4')-1,dtype='i4') ## -- add portion of element index defining destination zone +#print("Kzone 1-1: {0}, Index 1-1: {1}, Kzone 121-2: {2}, Index 121-2: {3} \n".format(kzone[0], leg1indx[0], kzone[437882], leg1indx[437882])) + +## -- 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') +#print("Kzone 1-1: {0}, Index 1-1: {1}, Kzone 121-2: {2}, Index 121-2: {3} \n".format(kzone[0], leg2indx[0], kzone[437882], leg2indx[437882])) + +# --------------------------------------------------------------- +# 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 + +## -- Swap original matrix value back in if the threshold exceeds the cutoff value +autoval = np.where(threshold>cutoff, 0, autoval).astype(dt) +tcostval = np.where(threshold>cutoff, 0, tcostval).astype(dt) +invehval = np.where(threshold>cutoff, inveh, invehval).astype(dt) +trnfrval = np.where(threshold>cutoff, trnfr, trnfrval).astype(dt) +twaitval = np.where(threshold>cutoff, twait, twaitval).astype(dt) +fwaitval = np.where(threshold>cutoff, fwait, fwaitval).astype(dt) +afareval = np.where(threshold>cutoff, afare, afareval).astype(dt) +fmodeval = np.where(threshold>cutoff, fmode, fmodeval).astype(dt) +pmodeval = np.where(threshold>cutoff, pmode, pmodeval).astype(dt) +lmodeval = np.where(threshold>cutoff, lmode, lmodeval).astype(dt) + + +# --------------------------------------------------------------- +# Write final matrix values into files. +# --------------------------------------------------------------- + # -- Arrays to write out +mtxlist = (invehval, trnfrval, twaitval, fwaitval, afareval, fmodeval, pmodeval, lmodeval, tcostval, autoval, threshold) + # -- Files to write to +outmtx = (mfinvehi, mftrnfri, mftwaiti, mffwaiti, mfafarei, mffmodei, mfpmodei, mflmodei, mfacosti, mfautrni, mfratioi) +x = 0 +outFl = open(stats, 'a') +outFl.write("\n\n {0:=^100}\n\n".format('=',)) + +for m in outmtx: + mtxlist[x].tofile(outmtx[x]) + (fpath, fname) = os.path.split(outmtx[x]) + outFl.write("{0} Written Successfully.\n".format(fname, )) + outFl.write("\t-- Minimum = {0:.4f}\n\t-- Maximum = {1:0.4f}\n\t-- Mean = {2:0.4f}\n\t-- Sum = {3:0.4f}\n\n".format(min(mtxlist[x]), max(mtxlist[x]), sum(mtxlist[x])/len(mtxlist[x]), sum(mtxlist[x]))) + x += 1 + +outFl.close() + +print("-- TRANSIT SKIM MATRICES CREATED --") diff --git a/Database/macros/transit_skim_wrapup.py b/Database/macros/transit_skim_wrapup.py index c9a82ef..7a6b533 100644 --- a/Database/macros/transit_skim_wrapup.py +++ b/Database/macros/transit_skim_wrapup.py @@ -1,80 +1,76 @@ -''' - transit_skim_wrapup.py - - Finalizes the transit skimming process: transit skim matrices moved to final locations in preparation for the destination choice- - mode choice model and temporary matrices deleted. - - - Arguments: 1= time period indicator: AM, MD, PM, NT - - - Craig Heither, 06-09-2025 - ========================================================================================== -''' - -import os -import sys -from pathlib import Path -sys.path.append(str(Path(__file__).resolve().parents[2].joinpath('Scripts'))) -from tbmtools import project as tbm - -timePeriod = sys.argv[1] - -maxInternal=3632 ## -- highest non-POE zone number - -proj_dir = Path(__file__).resolve().parents[2] -my_modeller = tbm.connect(proj_dir) -my_emmebank = my_modeller.emmebank - -matrix_init = my_modeller.tool("inro.emme.data.matrix.create_matrix") -compute_matrix = my_modeller.tool("inro.emme.matrix_calculation.matrix_calculator") -netcalc = my_modeller.tool("inro.emme.network_calculation.network_calculator") -delete_matrix = my_modeller.tool("inro.emme.data.matrix.delete_matrix") -########################################################################################################################### - -if timePeriod == 'AM': - mtx = ("mf837","mf838","mf821","mf824") - a = list(range(803,820)) ## -- matrices to delete -elif timePeriod == 'MD': - mtx = ("mf937","mf938","mf921","mf924") - a = list(range(903,920)) ## -- matrices to delete -elif timePeriod == 'PM': - mtx = ("mf887","mf888","mf871","mf874") - a = list(range(853,870)) ## -- matrices to delete -elif timePeriod == 'NT': - mtx = ("mf987","mf988","mf971","mf974") - a = list(range(953,970)) ## -- matrices to delete - - -## -- Initialize matrices -- ## -new_mf1 = matrix_init(matrix_id="%s" %(mtx[0]), matrix_name="kasmtp_%s" %(timePeriod), - matrix_description="indexed station zone for transit assignment - %s" %(timePeriod), overwrite=True, default_value=0) -new_mf2 = matrix_init(matrix_id="%s" %(mtx[1]), matrix_name="phdway_%s" %(timePeriod), - matrix_description="indexed headway (indexed wait time x 2) - %s" %(timePeriod), overwrite=True, default_value=0) -## -- Create indexed station zone matrix for transit assignment: equal to mfx21 [05-06-2022] -- ## -m1Spec = { - "type": "MATRIX_CALCULATION", "result": "%s" %(mtx[0]), "expression": "%s" %(mtx[2]), - "constraint": { - "by_value": None, - "by_zone": {"origins": "1,%s" %(maxInternal), "destinations": "1,%s" %(maxInternal)} - }, - "aggregation": {"origins": None, "destinations": None}, - } -## -- Recalculate headway matrix -- ## -m2Spec = { - "type": "MATRIX_CALCULATION", "result": "%s" %(mtx[1]), "expression": "%s*2" %(mtx[3]), - "constraint": {"by_value": None, "by_zone": None}, - "aggregation": {"origins": None, "destinations": None}, - } -report = compute_matrix([m1Spec,m2Spec]) -## -- Initialize ui3 -- ## -calcUi3 = {"type": "NETWORK_CALCULATION", "result": "ui3", "expression": "0", "aggregation": None, "selections": {"node": "all"}} -report=netcalc(calcUi3, full_report=False) - -## -- Delete unneeded matrices -- ## -for item in a: - matrix = my_emmebank.matrix("mf" + str(item)) - if matrix: - delete_matrix(matrix) - +''' + transit_skim_wrapup.py + + Finalizes the transit skimming process: transit skim matrices moved to final locations in preparation for the destination choice- + mode choice model and temporary matrices deleted. + + + Arguments: 1= name of Emme project file + 2= time period indicator: AM or MD + + Craig Heither, 03-25-2024 + ========================================================================================== +''' + +import os +import sys +import inro.modeller as _m +import inro.emme.desktop.app as _app + +empFl = sys.argv[1] +timePeriod = sys.argv[2] + +maxInternal=3632 ## -- highest non-POE zone number + +directory = os.getcwd().replace('\\Database','') +empFile = os.path.join(directory,empFl) +my_app = _app.start_dedicated(project=empFile, visible=False, user_initials="CMAP") +my_modeller = _m.Modeller(my_app) +my_emmebank = my_modeller.emmebank + +matrix_init = my_modeller.tool("inro.emme.data.matrix.create_matrix") +compute_matrix = my_modeller.tool("inro.emme.matrix_calculation.matrix_calculator") +netcalc = my_modeller.tool("inro.emme.network_calculation.network_calculator") +delete_matrix = my_modeller.tool("inro.emme.data.matrix.delete_matrix") +########################################################################################################################### + +## -- Initialize matrices -- ## +mtx = ("mf837","mf838","mf821","mf824") +if timePeriod == 'MD': + mtx = ("mf937","mf938","mf921","mf924") + +new_mf1 = matrix_init(matrix_id="%s" %(mtx[0]), matrix_name="kasmtp_%s" %(timePeriod), + matrix_description="indexed station zone for transit assignment - %s" %(timePeriod), overwrite=True, default_value=0) +new_mf2 = matrix_init(matrix_id="%s" %(mtx[1]), matrix_name="phdway_%s" %(timePeriod), + matrix_description="indexed headway (indexed wait time x 2) - %s" %(timePeriod), overwrite=True, default_value=0) +## -- Create indexed station zone matrix for transit assignment: equal to mfx21 [05-06-2022] -- ## +m1Spec = { + "type": "MATRIX_CALCULATION", "result": "%s" %(mtx[0]), "expression": "%s" %(mtx[2]), + "constraint": { + "by_value": None, + "by_zone": {"origins": "1,%s" %(maxInternal), "destinations": "1,%s" %(maxInternal)} + }, + "aggregation": {"origins": None, "destinations": None}, + } +## -- Recalculate headway matrix -- ## +m2Spec = { + "type": "MATRIX_CALCULATION", "result": "%s" %(mtx[1]), "expression": "%s*2" %(mtx[3]), + "constraint": {"by_value": None, "by_zone": None}, + "aggregation": {"origins": None, "destinations": None}, + } +report = compute_matrix([m1Spec,m2Spec]) +## -- Initialize ui3 -- ## +calcUi3 = {"type": "NETWORK_CALCULATION", "result": "ui3", "expression": "0", "aggregation": None, "selections": {"node": "all"}} +report=netcalc(calcUi3, full_report=False) + +## -- Delete unneeded matrices -- ## +a = list(range(803,820)) +if timePeriod == 'MD': + a = list(range(903,920)) + +for item in a: + matrix = my_emmebank.matrix("mf" + str(item)) + if matrix: + delete_matrix(matrix) + print(' -- {0} transit skim matrix clean up done'.format(timePeriod)) \ No newline at end of file diff --git a/Database/macros/transit_triple_indexing.py b/Database/macros/transit_triple_indexing.py index 00b9b77..09b7247 100644 --- a/Database/macros/transit_triple_indexing.py +++ b/Database/macros/transit_triple_indexing.py @@ -4,10 +4,10 @@ Performs the matrix triple-indexing necessary to identify the least cost transit station used to support drive to transit trips. - Arguments: 1= 3-digit scenario number - 2= time period indicator: AM, MD, PM, NT + Arguments: 1= name of Emme project file + 2= time period indicator: AM or MD - Craig Heither, 06-09-2025 + Craig Heither, 03-25-2024 ========================================================================================== ''' @@ -17,8 +17,7 @@ sys.path.append(str(Path(__file__).resolve().parents[2].joinpath('Scripts'))) from tbmtools import project as tbm -currentScen = int(sys.argv[1]) -timePeriod = sys.argv[2] +timePeriod = sys.argv[1] maxInternal=3632 ## -- highest non-POE zone number @@ -35,7 +34,6 @@ my_modeller = tbm.connect(proj_dir) my_emmebank = my_modeller.emmebank -change_scenario = my_modeller.tool("inro.emme.data.scenario.change_primary_scenario") matrix_init = my_modeller.tool("inro.emme.data.matrix.create_matrix") compute_matrix = my_modeller.tool("inro.emme.matrix_calculation.matrix_calculator") init_partition = my_modeller.tool("inro.emme.data.zone_partition.init_partition") @@ -44,24 +42,13 @@ triple_index = my_modeller.tool("inro.emme.matrix_calculation.matrix_triple_index_operation") ########################################################################################################################### -if timePeriod == 'AM': - mtx = ("mf819","mf820","mf821","mf834","mo801","mo802","mo803","mo804","mo805","mo602","mf822","mf823","mf824","mf825","mf828","mf829", - "mf830","mf831","mf832","mf833","mf44","mf45","mf807","mf808") - currentScen = currentScen + 3 -elif timePeriod == 'MD': +## -- Initialize matrices -- ## +mtx = ("mf819","mf820","mf821","mf834","mo801","mo802","mo803","mo804","mo805","mo602","mf822","mf823","mf824","mf825","mf828","mf829", + "mf830","mf831","mf832","mf833","mf44","mf45","mf807","mf808") +if timePeriod == 'MD': mtx = ("mf919","mf920","mf921","mf934","mo901","mo902","mo903","mo904","mo905","mo602","mf922","mf923","mf924","mf925","mf928","mf929", "mf930","mf931","mf932","mf933","mf46","mf47","mf907","mf908") - currentScen = currentScen + 5 -elif timePeriod == 'PM': - mtx = ("mf869","mf870","mf871","mf884","mo851","mo852","mo853","mo854","mo855","mo652","mf872","mf873","mf874","mf875","mf878","mf879", - "mf880","mf881","mf882","mf883","mf467","mf477","mf857","mf858") ## need TOD time/dist skim not mf44-45 - currentScen = currentScen + 7 -elif timePeriod == 'NT': - mtx = ("mf969","mf970","mf971","mf984","mo951","mo952","mo953","mo954","mo955","mo652","mf972","mf973","mf974","mf975","mf978","mf979", - "mf980","mf981","mf982","mf983","mf461","mf471","mf957","mf958") ## need TOD time/dist skim not mf46-47 - currentScen = currentScen + 1 - -## -- Initialize matrices -- ## + new_mf1 = matrix_init(matrix_id="%s" %(mtx[0]), matrix_name="hwygc_%s" %(timePeriod), matrix_description="congested hwy generalized cost - %s" %(timePeriod), overwrite=True, default_value=0) new_mf2 = matrix_init(matrix_id="%s" %(mtx[1]), matrix_name="trngc_%s" %(timePeriod), @@ -103,7 +90,6 @@ new_mf14 = matrix_init(matrix_id="%s" %(mtx[19]), matrix_name="minut_%s" %(timePeriod), matrix_description="indexed auto minutes to transit - %s" %(timePeriod), overwrite=True, default_value=0) -change_scenario(scenario=currentScen) #============================================================================== ## -- INDEX AUTO ACCESS AND PARKING @@ -195,8 +181,8 @@ } report = triple_index(tripleSpec) -## -- Adjust kzone matrix - Keep the original zone if: the trip is intrazonal or if there is skimmed transit service available (mtx[23]) and service -- ## -## -- originates within the City of Chicago. Otherwise, apply the indexed station zone. (mtx[23] is unindexed transit in-vehicle time) [07-16-2022] -- ## +## -- Adjust kzone matrix - Keep the original zone if: the trip is intrazonal or if there is skimmed transit service available (mf8) and service -- ## +## -- originates within the City of Chicago. Otherwise, apply the indexed station zone. (mf8 is unindexed transit in-vehicle time) [07-16-2022] -- ## finIndexSpec = { "type": "MATRIX_CALCULATION", "result": "%s" %(mtx[2]), "expression": "((%s.lt.1000 .and. ga(p).eq.1).or.(p.eq.q))*p + ((%s.ge.1000 .or. ga(p).ne.1).and.(p.ne.q))*%s" %(mtx[23], mtx[23], mtx[2]), diff --git a/Database/post_macros/MOVES_constants.py b/Database/post_macros/MOVES_constants.py new file mode 100644 index 0000000..31b78d1 --- /dev/null +++ b/Database/post_macros/MOVES_constants.py @@ -0,0 +1,45 @@ +### Defines constants for the createMOVESinputfile.py file + +SOURCE_TYPES = [ + 11, # Motorcycle + 21, # Passenger Car + 31, # Passenger Truck + 32, # Light Commercial Truck + 41, # Other Buses + 42, # Transit Bus + 43, # School Bus + 51, # Refuse Truck + 52, # Single Unit Short-haul Truck + 53, # Single Unit Long-haul Truck + 54, # Motor Homes + 61, # Combination Short-haul Truck + 62 # Combination Long-haul Truck + ] + +ROAD_TYPES = [ + 2, # Rural Restricted Access + 3, # Rural Unrestricted Access + 4, # Urban Restricted Access + 5 # Urban Unrestricted Access + ] # note: ROAD_TYPE 1 is off-network, and not included in all tabs except hourly VMT fraction + +SPEED_BINS = [ + 1, # <2.5 mph + 2, # 2.5 - 7.5 mph + 3, # 7.5 - 12.5 mph + 4, # 12.5 - 17.5 mph + 5, # 17.5 - 22.5 mph + 6, # 22.5 - 27.5 mph + 7, # 27.5 - 32.5 mph + 8, # 32.5 - 37.5 mph + 9, # 37.5 - 42.5 mph + 10, # 42.5 - 47.5 mph + 11, # 47.5 - 52.5 mph + 12, # 52.5 - 57.5 mph + 13, # 57.5 - 62.5 mph + 14, # 62.5 - 67.5 mph + 15, # 67.5 - 72.5 mph + 16 # >=72.5 +] + +HOURS = list(range(1,25)) # range end is exclusive diff --git a/Database/post_macros/createMOVESinputfile.py b/Database/post_macros/createMOVESinputfile.py index cf54513..795132f 100644 --- a/Database/post_macros/createMOVESinputfile.py +++ b/Database/post_macros/createMOVESinputfile.py @@ -1,5 +1,13 @@ + # %% ## ------ CREATE MOVES INPUT FILE ------ ## +# Sarah Zebar 2026/7/23 +# - Refactored code, organized into functions/loops and implemented minor readablity edits +# - Incorporated county data to output Excel Workbooks by IM region/county and just IM region (depending on 'exportAs') +# - Added tab for Annual VMT calculation +# - Incorporated globals from MOVES_constants.py, mainly for the template logic +# +# # Tim O'Leary 2023/10/3 # Script borrows from original SAS script 'create.moves.input.file.imversion.sas', # originally written by Craig Heither. @@ -38,7 +46,6 @@ # 62: Combination Long-haul Truck - 60: Combination Trucks - heavy duty trucks 200+ miles -## ------ IMPORT MODULES ------ ## import os import re @@ -48,678 +55,684 @@ from itertools import product import yaml from pathlib import Path +from MOVES_constants import SOURCE_TYPES, ROAD_TYPES, SPEED_BINS, HOURS + +# Define globals +DB_DIR = Path(__file__).resolve().parents[1] + + +def clean_linkdata(linkdata): + #column data types + for x in ['i_node', 'j_node', 'timeperiod', 'lan', 'vdf', 'zone', 'imarea', 'atype']: + linkdata[x] = linkdata[x].astype(int) + for x in ['len', 'emcap', 'timau', 'ftime', 'avauv', 'avh2v', 'avh3v', 'avbqv', 'avlqv', + 'avmqv', 'avhqv', 'atype', 'busveq']: + linkdata[x] = linkdata[x].astype(float) + + #flag ramp links + linkdata.rename(columns={"tmpl2":"isramp"}, inplace=True) + linkdata.loc[linkdata['vdf'].isin([3,5,8]),'isramp']=1 + + #include only non-attainment zones + na_zones = [ + list(range(1,2305)), + list(range(2309,2314)), + list(range(2317,2320)), + list(range(2326,2927)), + [2941,2943,2944,2949] + ] + + na_zones = [item for sublist in na_zones for item in sublist] + links = linkdata.loc[linkdata['zone'].isin(na_zones)].copy() + + + ## ------ LINK CALCULATIONS ------ ## + + # reset total mtruck/htruck veh equivalents to short-haul veh equivalents + links['m200'] = np.minimum(links['m200'], links['avmqv']) # m200 cannot exceed final MSA balanced volau + links['avmqv'] = np.maximum(links['avmqv']-links['m200'], 0) # now only short haul + links['h200'] = np.minimum(links['h200'], links['avhqv']) # h200 cannot exceed final MSA balanced volau + links['avhqv'] = np.maximum(links['avhqv']-links['h200'], 0) # now only short haul + + #total volume in vehicle equivalents + links.eval('volau = avauv + avh2v + avh3v + avbqv + avlqv + avmqv + m200 + avhqv + h200 + busveq', inplace=True) + + # volume in # vehicles (for VMT/VHT) + links['sov'] = np.maximum(links['avauv'],0) + links['hov2'] = np.maximum(links['avh2v'],0) + links['hov3'] = np.maximum(links['avh3v'],0) + links.eval('auto = sov + hov2 + hov3', inplace=True) + links['bplate'] = np.maximum(links['avbqv'],0) + links['ltruck'] = np.maximum(links['avlqv'],0) + links['mtruck'] = np.maximum(links['avmqv']/2,0) + links.eval('sush = ltruck + mtruck', inplace=True) + links['htruck'] = np.maximum(links['avhqv']/3,0) + links['bus'] = np.maximum(links['busveq']/3,0) + links['mtrucklh'] = np.maximum(links['m200']/2,0) + links['htrucklh'] = np.maximum(links['h200']/3,0) + links.eval('vehicles = auto + bplate + sush + mtrucklh + htruck + htrucklh + bus', inplace=True) + + ##link capacity calculations + + # lines 230-234 + # number of hrs per time period (for capacity calcs) + hours = {1:5, 2:1, 3:2, 4:1, 5:4, 6:2, 7:2, 8:2} ## dict format => {'timeperiod': 'number of hours'} + links['hours'] = links['timeperiod'].map(hours) + links.eval('capacity = lan * emcap * hours', inplace=True) + + # lines 238-243 + # arterial speed adjustment due to LOS C used in VDF (for VHT calculations) + links['fmph'] = np.where((links['ftime'] > 0), (links['len']/(links['ftime']/60)), 20) + links['mph'] = np.where((links['timau'] > 0), (links['len']/(links['timau']/60)), 20) + ## - NOTE: old SAS script used minimum of 0 mph. this has no difference computationally (already adjusted in model) + + # congested speed calc + #links.loc[(links['vdf'] == 1), 'mph'] = links['fmph'] * (1/((np.log(links['fmph']) * 0.249) + 0.153 * (links['volau'] / (links['capacity']*0.75))**3.98)) + links['mph'] = np.where(links['vdf']==1, links['fmph'] * (1/((np.log(links['fmph'])*0.249)+0.153*(links['volau']/(links['capacity']*0.75))**3.98)), links['mph']) + + ## -- Vehicle Miles Traveled and Vehicle Hours Traveled + + #vehicle types to be calculated + vehicle_cols = [ + 'sov', 'hov2', 'hov3', 'auto', 'bplate', 'ltruck', + 'mtruck', 'sush', 'htruck', 'bus', 'mtrucklh', 'htrucklh' + ] + + #vmt + for c in vehicle_cols: + links.eval(f'{c}_vmt = {c} * len', inplace=True) + links.eval('all_vmt = vehicles * len', inplace=True) + + #vht + for c in vehicle_cols: + links[f'{c}_vht'] = np.where((links['mph'] > 0), links[f'{c}_vmt']/links['mph'], 0) + links['all_vht'] = np.where((links['mph'] > 0), links['all_vmt']/links['mph'], 0) + + ## -- Setup MOVES variables + #create avgSpeedBinID by reclassifying mph + def speed_class(mph): + if mph < 2.5: + return 1 + elif mph < 7.5: + return 2 + elif mph < 12.5: + return 3 + elif mph < 17.5: + return 4 + elif mph < 22.5: + return 5 + elif mph < 27.5: + return 6 + elif mph < 32.5: + return 7 + elif mph < 37.5: + return 8 + elif mph < 42.5: + return 9 + elif mph < 47.5: + return 10 + elif mph < 52.5: + return 11 + elif mph < 57.5: + return 12 + elif mph < 62.5: + return 13 + elif mph < 67.5: + return 14 + elif mph < 72.5: + return 15 + else: + return 16 + links['avgSpeedBinID'] = links['mph'].map(speed_class) + + #create facility types + #for vdf = 1 or 6 + links.loc[(links['vdf'].isin([1,6]))&(links['atype']<9), 'roadTypeID']=5 #urban arterial + links.loc[(links['vdf'].isin([1,6]))&~(links['atype']<9), 'roadTypeID']=3 #rural arterial + # for vdf != 1 or 6 + links.loc[~(links['vdf'].isin([1,6]))&(links['atype']<9), 'roadTypeID']=4 #urban freeway + links.loc[~(links['vdf'].isin([1,6]))&~(links['atype']<9), 'roadTypeID']=2 #rural freeway + + return links + +def agg_links(groupcols, links): + """ This aggregates the link data to VMT/VHT by the group cols. Outputs the b dataset that is used by the tabs. + Expands dataset to include all combinations of group cols. + """ + + # Define TBM vehicle types + vtypes = ['auto','bplate','sush','mtrucklh','htrucklh','htruck','bus'] + aggsums = {f"{vtype}_{stat}": "sum" for vtype in vtypes for stat in ["vmt", "vht"]} + + # Aggregating to group cols + b1 = links.groupby(groupcols).agg(aggsums).reset_index() # non-destructive (does not alter links) + + # timeperiod = 1 is 10 hours, others are still fine + b1.loc[b1['timeperiod']==1, 'hours']=10 + + #changing values to be normalized by # hours in timeperiod + for c in list(aggsums.keys()): + b1.eval(f'{c} = {c} / hours', inplace=True) + + + # Define mapping for {time period: hour of day} + times = {1:[21,22,23,24,1,2,3,4,5,6], + 2:[7], + 3:[8,9], + 4:[10], + 5:[11,12,13,14], + 6:[15,16], + 7:[17,18], + 8:[19,20] + } + + # Create duplicates for each hour in time period + b1["hr"] = b1.apply(lambda x: times[x["timeperiod"]], axis=1) + b1 = b1.explode("hr") + + b1['hourDayID'] = b1['hr']*10+5 #'5' indicates a weekday + b1.sort_values(['imarea','roadTypeID','avgSpeedBinID','timeperiod','hourDayID'], inplace=True) + + #### Restructure the data from wide to long (VMT/VHT columns) and add sourceTypeID column for HPMS vehicle codes + mapping = { + "auto": [21, 31, 11], + "bplate": [32], + "sush": [52, 51], + "mtrucklh": [53, 54], + "htruck": [61], + "htrucklh": [62], + "bus": [42, 41, 43] + } + + ids = ['roadTypeID', 'timeperiod', 'avgSpeedBinID', 'hourDayID', 'imarea'] + + # Create subsets for each sourceTypeID and append together + dfs = [] + for vtype, source_type_lst in mapping.items(): + for stype in source_type_lst: + + # Filter for just ids and vehicle type columns, rename, and add source type code + b1_source_type = b1[ids+[col for col in b1.columns if col.startswith(f"{vtype}_")]].copy() + b1_source_type = b1_source_type.rename(columns={f'{vtype}_vmt':'vmt', f'{vtype}_vht':'vht'}) + b1_source_type['sourceTypeID'] = stype + + dfs.append(b1_source_type) + + b_temp = pd.concat(dfs) + + + #### Apply data to template (all ID combinations) + hrday = [(hr*10)+5 for hr in HOURS] + template_values = list(product(SOURCE_TYPES, ROAD_TYPES, hrday, SPEED_BINS, [0,1])) # [0,1] is for IM region + template = pd.DataFrame(template_values, columns=['sourceTypeID', 'roadTypeID', 'hourDayID', 'avgSpeedBinID', 'imarea']) + template.sort_values(['imarea', 'sourceTypeID', 'roadTypeID', 'hourDayID', 'avgSpeedBinID'], inplace=True) + template.reset_index(drop=True, inplace=True) + + # Merge data with template + b = pd.merge(template, b_temp, how='left', on=['imarea', 'sourceTypeID', 'roadTypeID', 'hourDayID', 'avgSpeedBinID']) + # b.fillna(0, inplace=True) #remove null values + b.drop(columns='timeperiod', inplace=True) + + #remove negative vmt/vht values, if they exist, or fill with zeroes + def replace_neg_w_zero(x): + return max(0,x) + b['vmt'] = b['vmt'].apply(replace_neg_w_zero) + b['vht'] = b['vht'].apply(replace_neg_w_zero) + + return b + +def get_initial_model_output(b, imarea): + """ Just filters to given imarea and excludes non-modeled source types""" + stypes_to_exclude = [11,41,43,51,54] + initial_model_output = b.loc[~(b["sourceTypeID"].isin(stypes_to_exclude)) & (b['imarea']==imarea)].copy(deep=True) + return initial_model_output + +def get_avg_speed_distribution(b,imarea): + + casecols = ['imarea', 'sourceTypeID', 'roadTypeID', 'hourDayID'] + + sumvht = b.groupby(casecols).agg({'vht':'sum'}) + sumvht.rename(columns={'vht':'allvht'}, inplace=True) + sumvht.reset_index(inplace=True) + share = pd.merge(b, sumvht, on=casecols, how='inner') + + #bus, pt 1: use roadTypeID 4 to replace missing values for roadTypeID 2 for sourceTypeID 41,42,43 for IM area + fb1_a = share.loc[(share['sourceTypeID']==42)&(share['roadTypeID']==4)&(share['imarea']==1)].copy(deep=True) + fb1_a['roadTypeID'] = 2 + fb1_b = fb1_a.copy() + fb1_b['sourceTypeID'] = 41 + fb1_c = fb1_a.copy() + fb1_c['sourceTypeID'] = 43 + fb1 = pd.concat([fb1_a, fb1_b, fb1_c]) + + #bus, pt2: use sourceTypeID 41,42,43 for IM area to replace missing values for non-IM area + fb2 = pd.concat([fb1, share.loc[(share['sourceTypeID'].isin([41,42,43]))&(share['imarea']==1)].copy(deep=True)]) + fb2['imarea']=0 + + #SU long-haul truck, pt1: use sourceTypeID 52 to replace missing values for sourceTypeID 53,54 for IM area + fb3 = share.loc[(share['sourceTypeID']==52)&(share['imarea']==1)].copy(deep=True) + fb3_a = fb3.copy() + fb3_a['sourceTypeID'] = 53 + fb3_b = fb3.copy() + fb3_b['sourceTypeID'] = 54 + fb3 = pd.concat([fb3_a, fb3_b]) + + #SU long-haul truck, pt2: use sourceTypeID 52,53,54 for IM area to replace missing values for non-IM area + fb4 = pd.concat([fb3, share.loc[(share['sourceTypeID']==52)&(share['imarea']==1)]], ignore_index=True) + fb4['imarea'] = 0 + + #MU long-haul truck pt1: use sourceTypeID 61 to replace missing values for sourceTypeID 62 for IM area + fb5 = share.loc[(share['sourceTypeID']==61)&(share['imarea']==1)].copy(deep=True) + fb5['sourceTypeID'] = 62 + + #MU long-haul truck pt2: use sourceTypeID 61, 62 for IM area to replace missing values for non-IM area + fb6 = pd.concat([fb5, share.loc[(share['sourceTypeID']==61)&(share['imarea']==1)].copy(deep=True)]) + fb6['imarea'] = 0 + + #combining this whole mess together + fallback = pd.concat([fb1, fb2, fb3, fb4, fb5, fb6], ignore_index=True) + fallback.rename(columns={'vht':'vht2', 'allvht':'allvht2'}, inplace=True) + fallback.drop(columns='vmt', inplace=True) + fallback.drop_duplicates(['imarea', 'sourceTypeID', 'roadTypeID', 'hourDayID', 'avgSpeedBinID'], inplace=True) + fallback.sort_values(['imarea', 'sourceTypeID', 'roadTypeID', 'hourDayID', 'avgSpeedBinID'], inplace=True) + + share = pd.merge(share, fallback, how='left', on=['imarea', 'sourceTypeID', 'roadTypeID', 'hourDayID', 'avgSpeedBinID']) + share.loc[(share['allvht']==0)&~(share['allvht2'].isnull()), 'vht'] = share['vht2'] + share.loc[(share['allvht']==0)&~(share['allvht2'].isnull()), 'allvht'] = share['allvht2'] + share.eval('avgSpeedFraction = vht / allvht', inplace=True) + + avg_speed_dist = share[['imarea', 'sourceTypeID', 'roadTypeID', 'hourDayID', 'avgSpeedBinID','avgSpeedFraction']] + + return avg_speed_dist.loc[(avg_speed_dist['imarea']==imarea)].drop(columns='imarea') + +def get_road_type_distribution(b, imarea): + roadtype = b.groupby(['imarea','sourceTypeID','roadTypeID']).agg({'vmt':'sum'}).reset_index() + roadtype2 = b.groupby(['imarea','sourceTypeID']).agg({'vmt':'sum'}).rename(columns={'vmt':'sourceVMT'}).reset_index() + + roadtype = pd.merge(roadtype, roadtype2, how='left', on=['imarea','sourceTypeID']) + + #ensure correct datatypes + for f in ['sourceTypeID', 'roadTypeID', 'imarea']: + roadtype[f] = roadtype[f].astype('int') + for f in ['vmt','sourceVMT']: + roadtype[f] = roadtype[f].astype('float') + + #bus part1: use roadTypeID 4 to replace missing values for roadTypeID 2 for sourceTypeID 41,42,43 for IM area + fb1 = roadtype.loc[(roadtype['sourceTypeID']==42)&(roadtype['roadTypeID']==4)&(roadtype['imarea']==1)].copy(deep=True) + fb1_a = fb1.copy() + fb1_a['roadTypeID'] = 2 + fb1_b = fb1_a.copy() + fb1_b['sourceTypeID'] = 41 + fb1_c = fb1_b.copy() + fb1_c['sourceTypeID'] = 43 + fb1 = pd.concat([fb1_a, fb1_b, fb1_c], ignore_index=True) + + #bus part2: use sourcetypeID 41, 42, 43 for IM area to replace missing values for non-IM area + fb2 = pd.concat([fb1, roadtype.loc[(roadtype['sourceTypeID'].isin([41,42,43]))&(roadtype['imarea']==1)].copy(deep=True)], ignore_index=True) + fb2['imarea'] = 0 + + #SU long-haul truck part1: use sourcetypeID 52 to replace missing values for sourceTypeID 53,54 for IM area + fb3 = roadtype.loc[(roadtype['sourceTypeID']==52)&(roadtype['imarea']==1)].copy(deep=True) + fb3_a = fb3.copy() + fb3_a['sourceTypeID'] = 53 + fb3_b = fb3_a.copy() + fb3_b['sourceTypeID'] = 54 + fb3 = pd.concat([fb3_a, fb3_b], ignore_index=True) + + #SU long-hault truck part2: use sourcetypeID 52. 53. 54 for IM area to replace missing values for non-IM area + fb4 = pd.concat([fb3, roadtype.loc[(roadtype['sourceTypeID']==52)&roadtype['imarea']==1].copy(deep=True)]) + fb4['imarea']=0 + + #MU long-haul truck part1: use sourceTypeID 61 to replace missing values for sourcetypeID 62 for IM area + fb5 = roadtype.loc[(roadtype['sourceTypeID']==61)&(roadtype['imarea']==1)].copy(deep=True) + fb5['sourceTypeID'] = 62 + + #MU long-haul truck part2: use sourceTypeID 61,62 for IM area to replace missing values for non-IM area + fb6 = pd.concat([fb5, roadtype.loc[(roadtype['sourceTypeID']==61)&(roadtype['imarea']==1)].copy(deep=True)]) + fb6['imarea'] = 0 + + fallback = pd.concat([fb1,fb2,fb3,fb4,fb5,fb6]).rename(columns={'vmt':'vmt2', 'sourceVMT':'sourceVMT2'}).sort_values(['imarea','sourceTypeID','roadTypeID']).drop_duplicates(['imarea','sourceTypeID','roadTypeID']) + + roadtype = pd.merge(roadtype, fallback, how='left', on=['imarea', 'sourceTypeID', 'roadTypeID']) + # roadtype.loc[(roadtype['sourceVMT']==0)&~(roadtype['sourceVMT2'].isnull()), ['vmt', 'sourceVMT']] = roadtype[['vmt2', 'sourceVMT2']] + roadtype.loc[(roadtype['sourceVMT']==0)&~(roadtype['sourceVMT2'].isnull()), 'vmt'] = roadtype['vmt2'] + roadtype.loc[(roadtype['sourceVMT']==0)&~(roadtype['sourceVMT2'].isnull()), 'sourceVMT'] = roadtype['sourceVMT2'] + + #prevent division by zero + def abovezero(x): + return np.maximum(x,0.000001) + roadtype['sourceVMT'] = roadtype['sourceVMT'].apply(abovezero) + + roadtype.eval('roadTypeVMTFraction = vmt / sourceVMT', inplace=True) + roadtype['roadTypeVMTFraction'] = roadtype['roadTypeVMTFraction'].round(6) + + road_type_distribution = roadtype.loc[roadtype['imarea']==imarea,['sourceTypeID','roadTypeID','roadTypeVMTFraction']].copy() + + return road_type_distribution + +def get_ramp_fraction(links, imarea): + + rmp = links.loc[links['roadTypeID'].isin([2,4])].copy(deep=True) + rmp.eval('fwyvht = auto_vht + bplate_vht + sush_vht + mtrucklh_vht + htruck_vht + htrucklh_vht + bus_vht', inplace=True) + rmp.eval('fwyvmt = auto_vmt + bplate_vmt + sush_vmt + mtrucklh_vmt + htruck_vmt + htrucklh_vmt + bus_vmt', inplace=True) + rmp['rampvht'] = np.where(rmp['isramp']==1, rmp['fwyvht'], 0) + rmp['rampvmt'] = np.where(rmp['isramp']==1, rmp['fwyvmt'], 0) + + ramp = rmp.groupby(['imarea','roadTypeID']).agg({'fwyvht':'sum','rampvht':'sum','fwyvmt':'sum','rampvmt':'sum'}).reset_index() + ramp.eval('rampFraction = rampvht/fwyvht', inplace=True) + ramp['rampFraction'] = ramp['rampFraction'].round(6) + ramp.eval('vmtFraction = rampvmt/fwyvmt', inplace=True) + ramp['vmtFraction'] = ramp['vmtFraction'].round(6) + + # Output ramp fraction for im area + ramp_fraction = ramp.loc[ramp['imarea']==imarea,['roadTypeID','rampFraction']] + return ramp_fraction + +def get_hourly_vmt_fraction(b, imarea): + + # Apply data to template (all ID combinations) + roads = [1] + ROAD_TYPES # add off-network roads just for this function + dayID = [5] + template_values = list(product(SOURCE_TYPES, roads, HOURS, dayID, [0,1])) + template = pd.DataFrame(template_values, columns=['sourceTypeID', 'roadTypeID', 'hourID', 'dayID', 'imarea']) + template.sort_values(['imarea', 'sourceTypeID', 'roadTypeID', 'hourID'], inplace=True) + vmt = b.copy() + vmt['hourID'] = (vmt['hourDayID'] - 5)/10 + + hourvmt = vmt.groupby(['imarea','sourceTypeID','roadTypeID','hourID']).agg({'vmt':'sum'}).reset_index() + sumvmt = hourvmt.groupby(['imarea', 'sourceTypeID','roadTypeID']).agg({'vmt':'sum'}).reset_index() + sumvmt.rename(columns={'vmt':'allvmt'},inplace=True) -db_dir = Path(__file__).resolve().parents[1] -## ------ PARAMETERS ------ ## -#get model version and scenario year - for output filenames -with open(db_dir.joinpath('batch_file.yaml')) as f: - config = yaml.safe_load(f) -model = config['model_version'] # e.g., 'c23q4' -scenyear = config['scenario_code'] # e.g., '400' - -#bring in punch moves link data -linkdata = pd.read_csv(db_dir.joinpath('data', 'punchlink.csv')) - -#output excel worksheets -excel_file_IM = db_dir.joinpath('data', f'MOVES_{model}_scen{scenyear}_IM.xlsx') -excel_file_noIM = db_dir.joinpath('data', f'MOVES_{model}_scen{scenyear}_nonIM.xlsx') - -##create excel workbook to write worksheets to -xlsx_IM = pd.ExcelWriter(excel_file_IM) -xlsx_noIM = pd.ExcelWriter(excel_file_noIM) - - -## ------ CLEAN-UP DATASET ------ ## - -#clean up column names -collist = linkdata.columns.tolist() -cols_to_rename = [a for a in collist if a.startswith('@')] -coldict = dict([[a, a[1:]] for a in cols_to_rename]) -coldict['tmpl2'] = 'isramp' -linkdata.rename(columns=coldict, inplace=True) - -#column data types -for x in ['i_node', 'j_node', 'timeperiod', 'lan', 'vdf', 'zone', 'imarea', 'atype']: - linkdata[x] = linkdata[x].astype(int) -for x in ['len', 'emcap', 'timau', 'ftime', 'avauv', 'avh2v', 'avh3v', 'avbqv', 'avlqv', - 'avmqv', 'avhqv', 'atype', 'busveq']: - linkdata[x] = linkdata[x].astype(float) - -#flag ramp links -linkdata.loc[linkdata['vdf'].isin([3,5,8]),'isramp']=1 - -#include only non-attainment zones -na_zones = [ - list(range(1,2305)), - list(range(2309,2314)), - list(range(2317,2320)), - list(range(2326,2927)), - [2941,2943,2944,2949] -] - -na_zones = [item for sublist in na_zones for item in sublist] -links = linkdata.loc[linkdata['zone'].isin(na_zones)].copy() - - -## ------ LINK CALCULATIONS ------ ## - -# reset total mtruck/htruck veh equivalents to short-haul veh equivalents -links['m200'] = np.minimum(links['m200'], links['avmqv']) # m200 cannot exceed final MSA balanced volau -links['avmqv'] = np.maximum(links['avmqv']-links['m200'], 0) # now only short haul -links['h200'] = np.minimum(links['h200'], links['avhqv']) # h200 cannot exceed final MSA balanced volau -links['avhqv'] = np.maximum(links['avhqv']-links['h200'], 0) # now only short haul - -#total volume in vehicle equivalents -links.eval('volau = avauv + avh2v + avh3v + avbqv + avlqv + avmqv + m200 + avhqv + h200 + busveq', inplace=True) - -# volume in # vehicles (for VMT/VHT) -links['sov'] = np.maximum(links['avauv'],0) -links['hov2'] = np.maximum(links['avh2v'],0) -links['hov3'] = np.maximum(links['avh3v'],0) -links.eval('auto = sov + hov2 + hov3', inplace=True) -links['bplate'] = np.maximum(links['avbqv'],0) -links['ltruck'] = np.maximum(links['avlqv'],0) -links['mtruck'] = np.maximum(links['avmqv']/2,0) -links.eval('sush = ltruck + mtruck', inplace=True) -links['htruck'] = np.maximum(links['avhqv']/3,0) -links['bus'] = np.maximum(links['busveq']/3,0) -links['mtrucklh'] = np.maximum(links['m200']/2,0) -links['htrucklh'] = np.maximum(links['h200']/3,0) -links.eval('vehicles = auto + bplate + sush + mtrucklh + htruck + htrucklh + bus', inplace=True) - -##link capacity calculations - -# lines 230-234 -# number of hrs per time period (for capacity calcs) -hours = {1:5, 2:1, 3:2, 4:1, 5:4, 6:2, 7:2, 8:2} ## dict format => {'timeperiod': 'number of hours'} -links['hours'] = links['timeperiod'].map(hours) -links.eval('capacity = lan * emcap * hours', inplace=True) - -# lines 238-243 -# arterial speed adjustment due to LOS C used in VDF (for VHT calculations) -links['fmph'] = np.where((links['ftime'] > 0), (links['len']/(links['ftime']/60)), 20) -links['mph'] = np.where((links['timau'] > 0), (links['len']/(links['timau']/60)), 20) -## - NOTE: old SAS script used minimum of 0 mph. this has no difference computationally (already adjusted in model) - -# congested speed calc -#links.loc[(links['vdf'] == 1), 'mph'] = links['fmph'] * (1/((np.log(links['fmph']) * 0.249) + 0.153 * (links['volau'] / (links['capacity']*0.75))**3.98)) -links['mph'] = np.where(links['vdf']==1, links['fmph'] * (1/((np.log(links['fmph'])*0.249)+0.153*(links['volau']/(links['capacity']*0.75))**3.98)), links['mph']) - -## -- Vehicle Miles Traveled and Vehicle Hours Traveled - -#vehicle types to be calculated -vehicle_cols = [ - 'sov', 'hov2', 'hov3', 'auto', 'bplate', 'ltruck', - 'mtruck', 'sush', 'htruck', 'bus', 'mtrucklh', 'htrucklh' -] - -#vmt -for c in vehicle_cols: - links.eval(f'{c}_vmt = {c} * len', inplace=True) -links.eval('all_vmt = vehicles * len', inplace=True) - -#vht -for c in vehicle_cols: - links[f'{c}_vht'] = np.where((links['mph'] > 0), links[f'{c}_vmt']/links['mph'], 0) -links['all_vht'] = np.where((links['mph'] > 0), links['all_vmt']/links['mph'], 0) - - -## -- Setup MOVES variables -#create avgSpeedBinID by reclassifying mph -def speed_class(mph): - if mph < 2.5: - return 1 - elif mph < 7.5: - return 2 - elif mph < 12.5: - return 3 - elif mph < 17.5: - return 4 - elif mph < 22.5: - return 5 - elif mph < 27.5: - return 6 - elif mph < 32.5: - return 7 - elif mph < 37.5: - return 8 - elif mph < 42.5: - return 9 - elif mph < 47.5: - return 10 - elif mph < 52.5: - return 11 - elif mph < 57.5: - return 12 - elif mph < 62.5: - return 13 - elif mph < 67.5: - return 14 - elif mph < 72.5: - return 15 - else: - return 16 -links['avgSpeedBinID'] = links['mph'].map(speed_class) - -#create facility types -#for vdf = 1 or 6 -links.loc[(links['vdf'].isin([1,6]))&(links['atype']<9), 'roadTypeID']=5 #urban arterial -links.loc[(links['vdf'].isin([1,6]))&~(links['atype']<9), 'roadTypeID']=3 #rural arterial -# for vdf != 1 or 6 -links.loc[~(links['vdf'].isin([1,6]))&(links['atype']<9), 'roadTypeID']=4 #urban freeway -links.loc[~(links['vdf'].isin([1,6]))&~(links['atype']<9), 'roadTypeID']=2 #rural freeway - - -## ------ Create MOVES 'initial_model_output' Table ------ ## - -#line 305 -#grab columns we want to aggregate -b1_columns = [[f'{c}_vmt', f'{c}_vht'] for c in ['auto','bplate','sush','mtrucklh','htrucklh','htruck','bus']] -b1_columns = [a for sublist in b1_columns for a in sublist] -aggsums = {} -for a in b1_columns: - aggsums[a] = 'sum' - -groupcols = ['imarea', 'roadTypeID', 'timeperiod', 'avgSpeedBinID', 'hours'] - -b1 = links.groupby(groupcols).agg(aggsums).reset_index() - -# #vmt verification -# #line 308-313 - -# print('Totals Before') -# links.groupby(['imarea']).agg(aggsums) -#disaggregate to hourly data -#lines 316-324 - -#timeperiod = 1 is 10 hours, others are still fine -b1.loc[b1['timeperiod']==1, 'hours']=10 - -#changing values to be normalized by # hours in timeperiod -for c in b1_columns: - b1.eval(f'{c} = {c} / hours', inplace=True) - - -#we need to duplicate each row to include each hour-of-day value -#will do this by appending rows to a new dataframe using some dictionaries - -#this sets up hour of day, will call this below -times = {1:[21,22,23,24,1,2,3,4,5,6], - 2:[7], - 3:[8,9], - 4:[10], - 5:[11,12,13,14], - 6:[15,16], - 7:[17,18], - 8:[19,20] - } - -#create new df of each timeperiod -b1_dfs = [] -for tp in times: - b_tp = b1.loc[b1['timeperiod']==tp].copy(deep=True) - #create new df for each hour-of-day within each timeperiod, then append to b1_dfs as an item in list - for hour in times[tp]: - bb = b_tp.copy(deep=True) - bb['hr'] = hour - b1_dfs.append(bb) - -#concatenate all timeperiod dataframes in b1_dfs into one df -b1 = pd.concat(b1_dfs, ignore_index=True) -b1['hourDayID'] = b1['hr']*10+5 #'5' indicates a weekday' -b1.sort_values(['imarea','roadTypeID','avgSpeedBinID','timeperiod','hourDayID'], inplace=True) - -#need to make separate rows for vmt/vht of each vehicle class -#will do this by creating a separate df for each vehicle class, then recombine - -common_columns = ['roadTypeID', 'timeperiod', 'avgSpeedBinID', 'hourDayID', 'imarea'] -#passenger car - 21 -b2 = b1[common_columns + ['auto_vmt', 'auto_vht']].copy().rename(columns={'auto_vmt':'vmt', 'auto_vht':'vht'}) -b2['sourceTypeID'] = 21 -#passenger truck - 31 -b3 = b1[common_columns + ['auto_vmt', 'auto_vht']].copy().rename(columns={'auto_vmt':'vmt', 'auto_vht':'vht'}) -b3['sourceTypeID'] = 31 -#light commercial truck - 32 -b4 = b1[common_columns + ['bplate_vmt', 'bplate_vht']].copy().rename(columns={'bplate_vmt':'vmt', 'bplate_vht':'vht'}) -b4['sourceTypeID'] = 32 -#SU short haul truck - 52 -b5 = b1[common_columns + ['sush_vmt', 'sush_vht']].copy().rename(columns={'sush_vmt':'vmt', 'sush_vht':'vht'}) -b5['sourceTypeID'] = 52 -#SU long-haul truck - 53 -b6 = b1[common_columns + ['mtrucklh_vmt', 'mtrucklh_vht']].copy().rename(columns={'mtrucklh_vmt':'vmt', 'mtrucklh_vht':'vht'}) -b6['sourceTypeID'] = 53 -#MU short haul - 61 -b7 = b1[common_columns + ['htruck_vmt', 'htruck_vht']].copy().rename(columns={'htruck_vmt':'vmt', 'htruck_vht':'vht'}) -b7['sourceTypeID'] = 61 -#MU long haul - 62 -b8 = b1[common_columns + ['htrucklh_vmt', 'htrucklh_vht']].copy().rename(columns={'htrucklh_vmt':'vmt', 'htrucklh_vht':'vht'}) -b8['sourceTypeID'] = 62 -#transit bus - 42 -b9 = b1[common_columns + ['bus_vmt', 'bus_vht']].copy().rename(columns={'bus_vmt':'vmt', 'bus_vht':'vht'}) -b9['sourceTypeID'] = 42 -#intercity bus - 41 -- apply transit bus distribution to intercity bus -b10 = b9.copy() -b10['sourceTypeID'] = 41 -#school bus - 43 -- apply transit bus distribution to school bus -b11 = b9.copy() -b11['sourceTypeID'] = 43 -#motorcycle - 11 -- apply auto distribution to motorcycles -b12 = b2.copy() -b12['sourceTypeID'] = 11 -#refuse trucks - 51 -- apply single unit short-haul distribution to refuse trucks -b13 = b5.copy() -b13['sourceTypeID'] = 51 -#motor homes - 54 -- apply single unit long-haul distribution to motor homes -b14 = b6.copy() -b14['sourceTypeID'] = 54 - -b = pd.concat([b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14], ignore_index=True) -b.sort_values(['imarea', 'sourceTypeID', 'roadTypeID', 'hourDayID', 'avgSpeedBinID'], inplace=True) - - -#need to apply values onto a template that contains all possible combinations -#create template with all combinations -#line 369-374 - -#get unique values for each of the categories: sourceTypeID, roadTypeID, hourDayID, avgSpeedBinID, and imarea -veh = b['sourceTypeID'].unique().tolist() -road = b['roadTypeID'].unique().tolist() -hrday = b['hourDayID'].unique().tolist() -speed = b['avgSpeedBinID'].unique().tolist() -imcat = b['imarea'].unique().tolist() - -#create cartesian product of the lists listed above -template_values = list(product(veh, road, hrday, speed, imcat)) -template = pd.DataFrame(template_values, columns=['sourceTypeID', 'roadTypeID', 'hourDayID', 'avgSpeedBinID', 'imarea']) -template.sort_values(['imarea', 'sourceTypeID', 'roadTypeID', 'hourDayID', 'avgSpeedBinID'], inplace=True) -template.reset_index(drop=True, inplace=True) - -#merge data with template -b = pd.merge(template, b, how='left', on=['imarea', 'sourceTypeID', 'roadTypeID', 'hourDayID', 'avgSpeedBinID']) -# b.fillna(0, inplace=True) #remove null values -b.drop(columns='timeperiod', inplace=True) - -#remove negative vmt/vht values, if they exist, or fill with zeroes -def replace_neg_w_zero(x): - return max(0,x) -b['vmt'] = b['vmt'].apply(replace_neg_w_zero) -b['vht'] = b['vht'].apply(replace_neg_w_zero) - - -##################################### -## -- INIITIAL MODEL OUTPUT TAB -- ## -##################################### -#line 462-473 -#only include source types from actual modeled vehicle trips -- for QC - -#initial_model_output tab in excel file -#imarea -outIM_initialmodeloutput = b.loc[~(b['sourceTypeID'].astype('int').isin([11,41,43,51,54]))&(b['imarea']==1)].copy(deep=True) -outIM_initialmodeloutput.to_excel(xlsx_IM, sheet_name='initial_model_output', index=False) - -#non-imarea -outnoIM_initialmodeloutput = b.loc[~(b['sourceTypeID'].astype('int').isin([11,41,43,51,54]))&(b['imarea']==0)].copy(deep=True) -outnoIM_initialmodeloutput.to_excel(xlsx_noIM, sheet_name='initial_model_output', index=False) - - -################################## -## -- SPEED DISTRIBUTION TAB -- ## -################################## - -#lines 479-482 -#CALCULATE VHT SHARE BY SOURCETYPEID-ROADTYPEID-HOURDAYID -#then join back to table - -casecols = ['imarea', 'sourceTypeID', 'roadTypeID', 'hourDayID'] - -sumvht = b.groupby(casecols).agg({'vht':'sum'}) -sumvht.rename(columns={'vht':'allvht'}, inplace=True) -sumvht.reset_index(inplace=True) -share = pd.merge(b, sumvht, on=casecols, how='inner') - - -#lines 485-512 -# -- USE SURROGATES TO REPLACE MISSING VALUES -- - -#bus, pt 1: use roadTypeID 4 to replace missing values for roadTypeID 2 for sourceTypeID 41,42,43 for IM area -fb1_a = share.loc[(share['sourceTypeID']==42)&(share['roadTypeID']==4)&(share['imarea']==1)].copy(deep=True) -fb1_a['roadTypeID'] = 2 -fb1_b = fb1_a.copy() -fb1_b['sourceTypeID'] = 41 -fb1_c = fb1_a.copy() -fb1_c['sourceTypeID'] = 43 -fb1 = pd.concat([fb1_a, fb1_b, fb1_c]) - -#bus, pt2: use sourceTypeID 41,42,43 for IM area to replace missing values for non-IM area -fb2 = pd.concat([fb1, share.loc[(share['sourceTypeID'].isin([41,42,43]))&(share['imarea']==1)].copy(deep=True)]) -fb2['imarea']=0 - -#SU long-haul truck, pt1: use sourceTypeID 52 to replace missing values for sourceTypeID 53,54 for IM area -fb3 = share.loc[(share['sourceTypeID']==52)&(share['imarea']==1)].copy(deep=True) -fb3_a = fb3.copy() -fb3_a['sourceTypeID'] = 53 -fb3_b = fb3.copy() -fb3_b['sourceTypeID'] = 54 -fb3 = pd.concat([fb3_a, fb3_b]) - -#SU long-haul truck, pt2: use sourceTypeID 52,53,54 for IM area to replace missing values for non-IM area -fb4 = pd.concat([fb3, share.loc[(share['sourceTypeID']==52)&(share['imarea']==1)]], ignore_index=True) -fb4['imarea'] = 0 - -#MU long-haul truck pt1: use sourceTypeID 61 to replace missing values for sourceTypeID 62 for IM area -fb5 = share.loc[(share['sourceTypeID']==61)&(share['imarea']==1)].copy(deep=True) -fb5['sourceTypeID'] = 62 - -#MU long-haul truck pt2: use sourceTypeID 61, 62 for IM area to replace missing values for non-IM area -fb6 = pd.concat([fb5, share.loc[(share['sourceTypeID']==61)&(share['imarea']==1)].copy(deep=True)]) -fb6['imarea'] = 0 - -#combining this whole mess together -fallback = pd.concat([fb1, fb2, fb3, fb4, fb5, fb6], ignore_index=True) -fallback.rename(columns={'vht':'vht2', 'allvht':'allvht2'}, inplace=True) -fallback.drop(columns='vmt', inplace=True) -fallback.drop_duplicates(['imarea', 'sourceTypeID', 'roadTypeID', 'hourDayID', 'avgSpeedBinID'], inplace=True) -fallback.sort_values(['imarea', 'sourceTypeID', 'roadTypeID', 'hourDayID', 'avgSpeedBinID'], inplace=True) - -share = pd.merge(share, fallback, how='left', on=['imarea', 'sourceTypeID', 'roadTypeID', 'hourDayID', 'avgSpeedBinID']) -share.loc[(share['allvht']==0)&~(share['allvht2'].isnull()), 'vht'] = share['vht2'] -share.loc[(share['allvht']==0)&~(share['allvht2'].isnull()), 'allvht'] = share['allvht2'] -share.eval('avgSpeedFraction = vht / allvht', inplace=True) - - -## -- AvgSpeedDistribution excel sheet -- ## - -avg_speed_dist = share[['imarea', 'sourceTypeID', 'roadTypeID', 'hourDayID', 'avgSpeedBinID','avgSpeedFraction']] - -outIM_avgspeeddistribution = avg_speed_dist.loc[(avg_speed_dist['imarea']==1)].drop(columns='imarea') -outIM_avgspeeddistribution.to_excel(xlsx_IM, sheet_name='AvgSpeedDistribution', index=False) - -outnoIM_avgspeeddistribution = avg_speed_dist.loc[(avg_speed_dist['imarea']==0)].drop(columns='imarea') -outnoIM_avgspeeddistribution.to_excel(xlsx_noIM, sheet_name='AvgSpeedDistribution', index=False) - - -###################################### -## -- road type distribution tab -- ## -###################################### - -roadtype = b.groupby(['imarea','sourceTypeID','roadTypeID']).agg({'vmt':'sum'}).reset_index() -roadtype2 = b.groupby(['imarea','sourceTypeID']).agg({'vmt':'sum'}).rename(columns={'vmt':'sourceVMT'}).reset_index() - -roadtype = pd.merge(roadtype, roadtype2, how='left', on=['imarea','sourceTypeID']) - -#ensure correct datatypes -for f in ['sourceTypeID', 'roadTypeID', 'imarea']: - roadtype[f] = roadtype[f].astype('int') -for f in ['vmt','sourceVMT']: - roadtype[f] = roadtype[f].astype('float') - - -# -- use surrogates to replace missing values if necessary - -#bus part1: use roadTypeID 4 to replace missing values for roadTypeID 2 for sourceTypeID 41,42,43 for IM area -fb1 = roadtype.loc[(roadtype['sourceTypeID']==42)&(roadtype['roadTypeID']==4)&(roadtype['imarea']==1)].copy(deep=True) -fb1_a = fb1.copy() -fb1_a['roadTypeID'] = 2 -fb1_b = fb1_a.copy() -fb1_b['sourceTypeID'] = 41 -fb1_c = fb1_b.copy() -fb1_c['sourceTypeID'] = 43 -fb1 = pd.concat([fb1_a, fb1_b, fb1_c], ignore_index=True) - -#bus part2: use sourcetypeID 41, 42, 43 for IM area to replace missing values for non-IM area -fb2 = pd.concat([fb1, roadtype.loc[(roadtype['sourceTypeID'].isin([41,42,43]))&(roadtype['imarea']==1)].copy(deep=True)], ignore_index=True) -fb2['imarea'] = 0 - -#SU long-haul truck part1: use sourcetypeID 52 to replace missing values for sourceTypeID 53,54 for IM area -fb3 = roadtype.loc[(roadtype['sourceTypeID']==52)&(roadtype['imarea']==1)].copy(deep=True) -fb3_a = fb3.copy() -fb3_a['sourceTypeID'] = 53 -fb3_b = fb3_a.copy() -fb3_b['sourceTypeID'] = 54 -fb3 = pd.concat([fb3_a, fb3_b], ignore_index=True) - -#SU long-hault truck part2: use sourcetypeID 52. 53. 54 for IM area to replace missing values for non-IM area -fb4 = pd.concat([fb3, roadtype.loc[(roadtype['sourceTypeID']==52)&roadtype['imarea']==1].copy(deep=True)]) -fb4['imarea']=0 - -#MU long-haul truck part1: use sourceTypeID 61 to replace missing values for sourcetypeID 62 for IM area -fb5 = roadtype.loc[(roadtype['sourceTypeID']==61)&(roadtype['imarea']==1)].copy(deep=True) -fb5['sourceTypeID'] = 62 - -#MU long-haul truck part2: use sourceTypeID 61,62 for IM area to replace missing values for non-IM area -fb6 = pd.concat([fb5, roadtype.loc[(roadtype['sourceTypeID']==61)&(roadtype['imarea']==1)].copy(deep=True)]) -fb6['imarea'] = 0 - -fallback = pd.concat([fb1,fb2,fb3,fb4,fb5,fb6]).rename(columns={'vmt':'vmt2', 'sourceVMT':'sourceVMT2'}).sort_values(['imarea','sourceTypeID','roadTypeID']).drop_duplicates(['imarea','sourceTypeID','roadTypeID']) - -roadtype = pd.merge(roadtype, fallback, how='left', on=['imarea', 'sourceTypeID', 'roadTypeID']) -# roadtype.loc[(roadtype['sourceVMT']==0)&~(roadtype['sourceVMT2'].isnull()), ['vmt', 'sourceVMT']] = roadtype[['vmt2', 'sourceVMT2']] -roadtype.loc[(roadtype['sourceVMT']==0)&~(roadtype['sourceVMT2'].isnull()), 'vmt'] = roadtype['vmt2'] -roadtype.loc[(roadtype['sourceVMT']==0)&~(roadtype['sourceVMT2'].isnull()), 'sourceVMT'] = roadtype['sourceVMT2'] - -#prevent division by zero -def abovezero(x): - return np.maximum(x,0.000001) -roadtype['sourceVMT'] = roadtype['sourceVMT'].apply(abovezero) - -roadtype.eval('roadTypeVMTFraction = vmt / sourceVMT', inplace=True) -roadtype['roadTypeVMTFraction'] = roadtype['roadTypeVMTFraction'].round(6) - - -## -- RoadTypeDistribution excel sheet -- ## -outIM_roadtypedistribution = roadtype.loc[roadtype['imarea']==1,['sourceTypeID','roadTypeID','roadTypeVMTFraction']].copy() -outIM_roadtypedistribution.to_excel(xlsx_IM, sheet_name='RoadTypeDistribution', index=False) - -outnoIM_roadtypedistribution = roadtype.loc[(roadtype['imarea']==0),['sourceTypeID', 'roadTypeID', 'roadTypeVMTFraction']].copy() -outnoIM_roadtypedistribution.to_excel(xlsx_noIM, sheet_name='RoadTypeDistribution', index=False) - - -############################# -## -- Ramp Fraction Tab -- ## -############################# - -rmp = links.loc[links['roadTypeID'].isin([2,4])].copy(deep=True) -rmp.eval('fwyvht = auto_vht + bplate_vht + sush_vht + mtrucklh_vht + htruck_vht + htrucklh_vht + bus_vht', inplace=True) -rmp.eval('fwyvmt = auto_vmt + bplate_vmt + sush_vmt + mtrucklh_vmt + htruck_vmt + htrucklh_vmt + bus_vmt', inplace=True) -rmp['rampvht'] = np.where(rmp['isramp']==1, rmp['fwyvht'], 0) -rmp['rampvmt'] = np.where(rmp['isramp']==1, rmp['fwyvmt'], 0) - -ramp = rmp.groupby(['imarea','roadTypeID']).agg({'fwyvht':'sum','rampvht':'sum','fwyvmt':'sum','rampvmt':'sum'}).reset_index() -ramp.eval('rampFraction = rampvht/fwyvht', inplace=True) -ramp['rampFraction'] = ramp['rampFraction'].round(6) -ramp.eval('vmtFraction = rampvmt/fwyvmt', inplace=True) -ramp['vmtFraction'] = ramp['vmtFraction'].round(6) - -#ramp fraction to excel -outIM_rampfraction = ramp.loc[ramp['imarea']==1,['roadTypeID','rampFraction']] -outIM_rampfraction.to_excel(xlsx_IM, sheet_name='RampFraction', index=False) - -outnoIM_rampfraction = ramp.loc[(ramp['imarea']==0),['roadTypeID','rampFraction']] -outnoIM_rampfraction.to_excel(xlsx_noIM, sheet_name='RampFraction', index=False) - - -################################### -## -- Hourly VMT Fraction Tab -- ## -################################### - -#create template of all combos -- sourceTypeID, roadTypeID, dayID, hourID, imarea - #the following exist further up the script: - # veh = b['sourceTypeID'].unique().tolist() -road = b['roadTypeID'].unique().tolist() - # hrday = b['hourDayID'].unique().tolist() - # imcat = b['imarea'].unique().tolist() - -#add roadtype 1: -road.append(1) - -#create separate hrID and dayID -hourID = [] -for item in hrday: - hourID.append((item - 5)/10) -dayID = [5] - -#cartesian product of the lists listed above -template_values = list(product(veh, road, hourID, dayID, imcat)) -template2 = pd.DataFrame(template_values, columns=['sourceTypeID', 'roadTypeID', 'hourID', 'dayID', 'imarea']) -template2.sort_values(['imarea', 'sourceTypeID', 'roadTypeID', 'hourID'], inplace=True) -vmt = b.copy() -vmt['hourID'] = (vmt['hourDayID'] - 5)/10 - -hourvmt = vmt.groupby(['imarea','sourceTypeID','roadTypeID','hourID']).agg({'vmt':'sum'}).reset_index() -sumvmt = hourvmt.groupby(['imarea', 'sourceTypeID','roadTypeID']).agg({'vmt':'sum'}).reset_index() -sumvmt.rename(columns={'vmt':'allvmt'},inplace=True) - -vmtshare = pd.merge(hourvmt, sumvmt, how='left', on=['imarea','sourceTypeID','roadTypeID']) -vmtshare.sort_values(['imarea','sourceTypeID','roadTypeID','hourID'],inplace=True) + vmtshare = pd.merge(hourvmt, sumvmt, how='left', on=['imarea','sourceTypeID','roadTypeID']) + vmtshare.sort_values(['imarea','sourceTypeID','roadTypeID','hourID'],inplace=True) + ## -- use surrogates to replace missing values, if necessary + #bus part 1: use sourcetypeid 42 to replace missing values for sourceTypeID 41,43 for IM area + fb1 = vmtshare.loc[(vmtshare['sourceTypeID']==42)&(vmtshare['imarea']==1)].copy() + fb1_a = fb1.copy() + fb1_a['sourceTypeID'] = 41 + fb1_b = fb1.copy() + fb1_b['sourceTypeID'] = 43 + fb1 = pd.concat([fb1_a, fb1_b], ignore_index=True) -## -- use surrogates to replace missing values, if necessary + #bus part2: use sourcetypeID 41,42,43 for IM area to replace missing values for non-IM area + fb2 = pd.concat([fb1, vmtshare.loc[(vmtshare['sourceTypeID'].isin([41,42,43]))&(vmtshare['imarea']==1)&(vmtshare['allvmt']>0)].copy()], ignore_index=True) + fb2['imarea'] = 0 -#bus part 1: use sourcetypeid 42 to replace missing values for sourceTypeID 41,43 for IM area -fb1 = vmtshare.loc[(vmtshare['sourceTypeID']==42)&(vmtshare['imarea']==1)].copy() -fb1_a = fb1.copy() -fb1_a['sourceTypeID'] = 41 -fb1_b = fb1.copy() -fb1_b['sourceTypeID'] = 43 -fb1 = pd.concat([fb1_a, fb1_b], ignore_index=True) + #su long-haul truck part1: use sourceTypeID 52 to replace missing values for sourcetypeID 53,54 for im area + fb3 = vmtshare.loc[(vmtshare['sourceTypeID']==52)&(vmtshare['imarea']==1)].copy() + fb3_a = fb3.copy() + fb3_a['sourceTypeID'] = 53 + fb3_b = fb3.copy() + fb3_b['sourceTypeID'] = 54 + fb3 = pd.concat([fb3_a, fb3_b], ignore_index=True) -#bus part2: use sourcetypeID 41,42,43 for IM area to replace missing values for non-IM area -fb2 = pd.concat([fb1, vmtshare.loc[(vmtshare['sourceTypeID'].isin([41,42,43]))&(vmtshare['imarea']==1)&(vmtshare['allvmt']>0)].copy()], ignore_index=True) -fb2['imarea'] = 0 + #su long haul truck part2: use sourceTypeID 52,53,54 for IM area to replace missing values for non-IM area + fb4 = pd.concat([fb3, vmtshare.loc[(vmtshare['sourceTypeID'].isin([52,53,54]))&(vmtshare['imarea']==1)&(vmtshare['allvmt']>0)].copy()], ignore_index=True) + fb4['imarea'] = 0 -#su long-haul truck part1: use sourceTypeID 52 to replace missing values for sourcetypeID 53,54 for im area -fb3 = vmtshare.loc[(vmtshare['sourceTypeID']==52)&(vmtshare['imarea']==1)].copy() -fb3_a = fb3.copy() -fb3_a['sourceTypeID'] = 53 -fb3_b = fb3.copy() -fb3_b['sourceTypeID'] = 54 -fb3 = pd.concat([fb3_a, fb3_b], ignore_index=True) + #mu long-haul truck part 1: use sourcetypeID 61 to replace missing values for sourcetypeid 62 for im area + fb5 = vmtshare.loc[(vmtshare['sourceTypeID']==61)&(vmtshare['imarea']==1)].copy() + fb5['sourceTypeID'] = 62 -#su long haul truck part2: use sourceTypeID 52,53,54 for IM area to replace missing values for non-IM area -fb4 = pd.concat([fb3, vmtshare.loc[(vmtshare['sourceTypeID'].isin([52,53,54]))&(vmtshare['imarea']==1)&(vmtshare['allvmt']>0)].copy()], ignore_index=True) -fb4['imarea'] = 0 + #mu long-haul truck part2: use sourcetypeid 61,62 for IM area to replace missing values for non-IM area + fb6 = pd.concat([fb5, vmtshare.loc[(vmtshare['sourceTypeID'].isin([61,62]))&(vmtshare['imarea']==1)&(vmtshare['allvmt']>0)].copy()],ignore_index=True) + fb6['imarea'] = 0 -#mu long-haul truck part 1: use sourcetypeID 61 to replace missing values for sourcetypeid 62 for im area -fb5 = vmtshare.loc[(vmtshare['sourceTypeID']==61)&(vmtshare['imarea']==1)].copy() -fb5['sourceTypeID'] = 62 + fallback = pd.concat([fb1, fb2, fb3, fb4, fb5, fb6], ignore_index=True).sort_values(['imarea','sourceTypeID','roadTypeID','hourID']) + fallback.rename(columns={'vmt':'vmt2', 'allvmt':'allvmt2'},inplace=True) + fallback.drop_duplicates(subset=['imarea','sourceTypeID','roadTypeID','hourID'], inplace=True) -#mu long-haul truck part2: use sourcetypeid 61,62 for IM area to replace missing values for non-IM area -fb6 = pd.concat([fb5, vmtshare.loc[(vmtshare['sourceTypeID'].isin([61,62]))&(vmtshare['imarea']==1)&(vmtshare['allvmt']>0)].copy()],ignore_index=True) -fb6['imarea'] = 0 + vmtshare = pd.merge(vmtshare, fallback, how='left', on=['imarea', 'sourceTypeID', 'roadTypeID', 'hourID']) -fallback = pd.concat([fb1, fb2, fb3, fb4, fb5, fb6], ignore_index=True).sort_values(['imarea','sourceTypeID','roadTypeID','hourID']) -fallback.rename(columns={'vmt':'vmt2', 'allvmt':'allvmt2'},inplace=True) -fallback.drop_duplicates(subset=['imarea','sourceTypeID','roadTypeID','hourID'], inplace=True) + #calculates hourvmtfraction based on original data + vmtshare['hourVMTFraction1'] = np.where(vmtshare['allvmt']>0.000001, vmtshare['vmt']/vmtshare['allvmt'], vmtshare['vmt']/0.000001) + #calculates hourvmtfraction based on fallback data + vmtshare.loc[~(vmtshare['vmt2'].isnull())&~(vmtshare['allvmt2'].isnull()), 'hourVMTFraction2'] = vmtshare['vmt2'] / vmtshare['allvmt2'] -vmtshare = pd.merge(vmtshare, fallback, how='left', on=['imarea', 'sourceTypeID', 'roadTypeID', 'hourID']) + #for sourcetypes 53,54 if there is any data + #then use both the non-zero vmt and the fallback data to arrive at the hourVMTFraction + truckpart = vmtshare.loc[(vmtshare['sourceTypeID'].isin([53,54]))&(vmtshare['vmt']>0)].copy() + vmtcount = truckpart.groupby(['imarea','sourceTypeID','roadTypeID']).agg({'vmt':'count'}).reset_index() + vmtcount.rename(columns={'vmt':'vmtcount1'},inplace=True) -#calculates hourvmtfraction based on original data -vmtshare['hourVMTFraction1'] = np.where(vmtshare['allvmt']>0.000001, vmtshare['vmt']/vmtshare['allvmt'], vmtshare['vmt']/0.000001) -#calculates hourvmtfraction based on fallback data -vmtshare.loc[~(vmtshare['vmt2'].isnull())&~(vmtshare['allvmt2'].isnull()), 'hourVMTFraction2'] = vmtshare['vmt2'] / vmtshare['allvmt2'] + vmtweight = pd.merge(vmtshare, vmtcount, how='left', on=['imarea', 'sourceTypeID', 'roadTypeID']) + vmtweight2 = vmtweight.copy() + #use fallback vmtfraction for 0 vmt hours + vmtweight2.loc[(vmtweight2['sourceTypeID'].isin([53,54]))&(vmtweight2['allvmt']>0)&(vmtweight2['vmt']==0), 'hourVMTFractionpre'] = vmtweight2['hourVMTFraction2'] -#for sourcetypes 53,54 if there is any data -#then use both the non-zero vmt and the fallback data to arrive at the hourVMTFraction + #use average of the original and fallback vmtfraction otherwise + #original data is weighted by number of hours with data + vmtweight2.loc[(vmtweight2['sourceTypeID'].isin([53,54]))&(vmtweight2['allvmt']>0)&(vmtweight2['vmt']>0), 'hourVMTFractionpre'] = (((vmtweight2['vmtcount1']/24)*vmtweight2['hourVMTFraction1'])+vmtweight2['hourVMTFraction2'])/((vmtweight2['vmtcount1']+24)/24) -truckpart = vmtshare.loc[(vmtshare['sourceTypeID'].isin([53,54]))&(vmtshare['vmt']>0)].copy() -vmtcount = truckpart.groupby(['imarea','sourceTypeID','roadTypeID']).agg({'vmt':'count'}).reset_index() -vmtcount.rename(columns={'vmt':'vmtcount1'},inplace=True) + vmtpre = vmtweight2.groupby(['imarea','sourceTypeID','roadTypeID']).agg({'hourVMTFractionpre':'sum'}).reset_index() + vmtpre.rename(columns={'hourVMTFractionpre':'vmtpresum'},inplace=True) -vmtweight = pd.merge(vmtshare, vmtcount, how='left', on=['imarea', 'sourceTypeID', 'roadTypeID']) -vmtweight2 = vmtweight.copy() -#use fallback vmtfraction for 0 vmt hours -vmtweight2.loc[(vmtweight2['sourceTypeID'].isin([53,54]))&(vmtweight2['allvmt']>0)&(vmtweight2['vmt']==0), 'hourVMTFractionpre'] = vmtweight2['hourVMTFraction2'] -#use average of the original and fallback vmtfraction otherwise -#original data is weighted by number of hours with data -vmtweight2.loc[(vmtweight2['sourceTypeID'].isin([53,54]))&(vmtweight2['allvmt']>0)&(vmtweight2['vmt']>0), 'hourVMTFractionpre'] = (((vmtweight2['vmtcount1']/24)*vmtweight2['hourVMTFraction1'])+vmtweight2['hourVMTFraction2'])/((vmtweight2['vmtcount1']+24)/24) + vmtshare = pd.merge(vmtweight2, vmtpre, how='left', on=['imarea','sourceTypeID','roadTypeID']).sort_values(['imarea','sourceTypeID','roadTypeID','hourID']) + vmtshare.loc[vmtshare['allvmt']==0, 'vmt3'] = vmtshare['vmt'] + vmtshare.loc[vmtshare['allvmt']==0, 'allvmt3'] = vmtshare['allvmt'] -vmtpre = vmtweight2.groupby(['imarea','sourceTypeID','roadTypeID']).agg({'hourVMTFractionpre':'sum'}).reset_index() -vmtpre.rename(columns={'hourVMTFractionpre':'vmtpresum'},inplace=True) + #substitution if no VMT for entire category + vmtshare.loc[(vmtshare['allvmt']==0)&(vmtshare['allvmt2']!=0), 'allvmt'] = vmtshare['allvmt2'] + vmtshare.loc[(vmtshare['vmt']==0)&(vmtshare['vmt2']!=0), 'vmt'] = vmtshare['vmt2'] + vmtshare.loc[((vmtshare['allvmt']==0)|(vmtshare['allvmt'].isnull()))&~(vmtshare['allvmt2'].isnull()), 'vmt'] = vmtshare['vmt2'] + vmtshare.loc[((vmtshare['allvmt']==0)|(vmtshare['allvmt'].isnull()))&~(vmtshare['allvmt2'].isnull()), 'allvmt'] = vmtshare['allvmt2'] + #prevent division by zero + vmtshare['allvmt'] = np.maximum(vmtshare['allvmt'], 0.000001) + vmtshare.eval('hourVMTFraction = vmt / allvmt', inplace=True) + vmtshare['hourVMTFraction'] = vmtshare['hourVMTFraction'].round(6) -vmtshare = pd.merge(vmtweight2, vmtpre, how='left', on=['imarea','sourceTypeID','roadTypeID']).sort_values(['imarea','sourceTypeID','roadTypeID','hourID']) -vmtshare.loc[vmtshare['allvmt']==0, 'vmt3'] = vmtshare['vmt'] -vmtshare.loc[vmtshare['allvmt']==0, 'allvmt3'] = vmtshare['allvmt'] + vmtshare.loc[(vmtshare['sourceTypeID'].isin([53,54]))&(vmtshare['vmtpresum']>0), 'hourVMTFraction'] = vmtshare['hourVMTFractionpre'] / vmtshare['vmtpresum'] + vmtshare['hourVMTFractionpre'] = vmtshare['hourVMTFractionpre'].round(6) + vmtshare.drop(columns=['vmtpresum','hourVMTFraction1','hourVMTFraction2','hourVMTFractionpre','vmtcount1'], inplace=True) -#substitution if no VMT for entire category -vmtshare.loc[(vmtshare['allvmt']==0)&(vmtshare['allvmt2']!=0), 'allvmt'] = vmtshare['allvmt2'] -vmtshare.loc[(vmtshare['vmt']==0)&(vmtshare['vmt2']!=0), 'vmt'] = vmtshare['vmt2'] -vmtshare.loc[((vmtshare['allvmt']==0)|(vmtshare['allvmt'].isnull()))&~(vmtshare['allvmt2'].isnull()), 'vmt'] = vmtshare['vmt2'] -vmtshare.loc[((vmtshare['allvmt']==0)|(vmtshare['allvmt'].isnull()))&~(vmtshare['allvmt2'].isnull()), 'allvmt'] = vmtshare['allvmt2'] + #apply urban arterial distribution to Off-Network type + vmtshare_b = vmtshare.copy() + vmtshare_b.loc[vmtshare_b['roadTypeID']==5, 'roadTypeID'] = 1 -#prevent division by zero -vmtshare['allvmt'] = np.maximum(vmtshare['allvmt'], 0.000001) -vmtshare.eval('hourVMTFraction = vmt / allvmt', inplace=True) -vmtshare['hourVMTFraction'] = vmtshare['hourVMTFraction'].round(6) + vmtshare = pd.concat([vmtshare, vmtshare_b], ignore_index=True).sort_values(['imarea','sourceTypeID','roadTypeID','hourID']) -vmtshare.loc[(vmtshare['sourceTypeID'].isin([53,54]))&(vmtshare['vmtpresum']>0), 'hourVMTFraction'] = vmtshare['hourVMTFractionpre'] / vmtshare['vmtpresum'] -vmtshare['hourVMTFractionpre'] = vmtshare['hourVMTFractionpre'].round(6) + vmtshare = pd.merge(template, vmtshare, how='left', on=['imarea','sourceTypeID','roadTypeID','hourID']) -vmtshare.drop(columns=['vmtpresum','hourVMTFraction1','hourVMTFraction2','hourVMTFractionpre','vmtcount1'], inplace=True) + vmtshare.drop_duplicates(['sourceTypeID','roadTypeID','dayID','hourID','imarea'], inplace=True) -#apply urban arterial distribution to Off-Network type -vmtshare_b = vmtshare.copy() -vmtshare_b.loc[vmtshare_b['roadTypeID']==5, 'roadTypeID'] = 1 + hour_vmt_fraction = vmtshare.loc[vmtshare['imarea']==imarea, ['sourceTypeID','roadTypeID','dayID','hourID','hourVMTFraction']] -vmtshare = pd.concat([vmtshare, vmtshare_b], ignore_index=True).sort_values(['imarea','sourceTypeID','roadTypeID','hourID']) + return hour_vmt_fraction -vmtshare = pd.merge(template2, vmtshare, how='left', on=['imarea','sourceTypeID','roadTypeID','hourID']) +def get_hpms_daily_vmt(b, imarea): + #modeled vehicle types only + hpms = b.loc[b['sourceTypeID'].isin([21,31,32,42,52,53,61,62])].copy() -vmtshare.drop_duplicates(['sourceTypeID','roadTypeID','dayID','hourID','imarea'], inplace=True) + # key = { 'sourceTypeID' : 'HPMSVtypeID' } + key = { + 21:25, + 32:25, + 42:40, #transit bus vmt only + 52:50, + 53:50, + 61:60, + 62:60 + } -#final vmt fraction to excel -outIM_hourvmtfraction = vmtshare.loc[vmtshare['imarea']==1, ['sourceTypeID','roadTypeID','dayID','hourID','hourVMTFraction']] -outIM_hourvmtfraction.to_excel(xlsx_IM, sheet_name='hourVMTFraction', index=False) + hpms['HPMSVtypeID'] = hpms['sourceTypeID'].map(key) + hpms1 = hpms.groupby(['imarea', 'roadTypeID', 'HPMSVtypeID']).agg({'vmt':'sum'}).reset_index() + hpms1.rename(columns={'vmt':'HPMSDailyVMT'}, inplace=True) -outnoIM_hourvmtfraction = vmtshare.loc[vmtshare['imarea']==0, ['sourceTypeID','roadTypeID','dayID','hourID','hourVMTFraction']] -outnoIM_hourvmtfraction.to_excel(xlsx_noIM, sheet_name='hourVMTFraction', index=False) + hpmsdailyvmt = hpms1.loc[hpms1['imarea']==imarea, ['roadTypeID','HPMSVtypeID','HPMSDailyVMT']] + hpmsdailyvmt['year'] = scenyear + return hpmsdailyvmt -###################################################### -## -- VMT by road type and HPMS vehicle type tab -- ## -###################################################### +def get_month_days(year): + """ Accounts for leap year """ + # Create dataframe of days per month + days_mo = {'month': ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', + 'September', 'October', 'November', 'December'], + 'days': [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]} + + # Check if year is a leap year, and if so increase days in February by 1 + check_leap = (year-2016)/4 + if check_leap.is_integer(): + # print(f" ---> {year} is a leap year.") + feb_ind = days_mo["month"].index("February") + days_mo['days'][feb_ind] +=1 + # else: + # print(f" ---> {year} is not a leap year.") -#modeled vehicle types only -hpms = b.loc[b['sourceTypeID'].isin([21,31,32,42,52,53,61,62])].copy() + days_mo_df =pd.DataFrame(days_mo) -# key = { 'sourceTypeID' : 'HPMSVtypeID' } -key = { - 21:25, - 32:25, - 42:40, #transit bus vmt only - 52:50, - 53:50, - 61:60, - 62:60 -} + return days_mo_df -hpms['HPMSVtypeID'] = hpms['sourceTypeID'].map(key) -hpms1 = hpms.groupby(['imarea', 'roadTypeID', 'HPMSVtypeID']).agg({'vmt':'sum'}).reset_index() -hpms1.rename(columns={'vmt':'HPMSDailyVMT'}, inplace=True) +def get_hpms_annual_vmt(hpms_daily_vmt, year): -#final vmt fraction to excel -outIM_hpmsdailyvmt = hpms1.loc[hpms1['imarea']==1, ['roadTypeID','HPMSVtypeID','HPMSDailyVMT']] -outIM_hpmsdailyvmt['year'] = scenyear -outIM_hpmsdailyvmt.to_excel(xlsx_IM, sheet_name='HPMSDailyVMT', index=False) + # Define weekdays + weekdays = ["Monday", "Tuesday", "Wednesday", "Thursday"] -outnoIM_hpmsdailyvmt = hpms1.loc[hpms1['imarea']==0, ['roadTypeID','HPMSVtypeID','HPMSDailyVMT']] -outnoIM_hpmsdailyvmt['year'] = scenyear -outnoIM_hpmsdailyvmt.to_excel(xlsx_noIM, sheet_name='HPMSDailyVMT', index=False) + # Get days in each month, account for leap years + in_days_mo = get_month_days(year) + # Load in annual VMT adjustments - TO DO: move this outside the function + pth_seasonal = DB_DIR.joinpath('data', 'seasonal_VMT.xlsx') + in_weekFractions = pd.read_excel(pth_seasonal, sheet_name = 'weekday_to_weekly') + in_moFractions = pd.read_excel(pth_seasonal, sheet_name = 'monthly_fractions') + in_source25split = pd.read_excel(pth_seasonal, sheet_name = 'split25') + # STEP 1: Find average weekday rate + weekFractions = in_weekFractions.copy() + weekFractions['flag_weekday'] = np.where(weekFractions['day'].isin(weekdays), 1, 0) + weekFractions['mean_weekday'] = weekFractions.groupby(['roadType','roadTypeID', 'flag_weekday'])['IDOT_VMT_pct'].transform('mean') -xlsx_IM.close() -xlsx_noIM.close() + roadTypeweekday = weekFractions.loc[weekFractions['flag_weekday'] == 1].copy() + roadTypeweekday = roadTypeweekday[['roadType', 'roadTypeID','mean_weekday']].drop_duplicates() -print('Done!') + roadTypePct = in_weekFractions.copy() + roadTypePct = roadTypePct.merge(roadTypeweekday, on=['roadType','roadTypeID']) + roadTypePct['AvWeekday'] = roadTypePct['IDOT_VMT_pct']/roadTypePct['mean_weekday'] + roadTypePct = roadTypePct.groupby(['roadType', 'roadTypeID'])['AvWeekday'].mean().reset_index() + + # STEP 2: Find adjustment factor for month + adjust_fractions = in_moFractions.merge(roadTypePct, on=['roadType', 'roadTypeID']) + adjust_fractions['adj_fraction'] = adjust_fractions['fraction']*adjust_fractions['AvWeekday'] + adjust_fractions = adjust_fractions[['roadType','roadTypeID', 'month', 'adj_fraction']].copy() -## ---------------- END CREATE MOVES INPUT FILE (SAS) ------------------ + #STEP 3: Apply adjustment factor for each month to source type EMME VMT + emme_adj = hpms_daily_vmt.merge(adjust_fractions, on='roadTypeID') + emme_adj['adjTotal'] = emme_adj['HPMSDailyVMT']*emme_adj['adj_fraction'] + emme_adj = emme_adj.merge(in_days_mo, on='month') + emme_adj['final_adj'] = emme_adj['days']*emme_adj['adjTotal'] + emme_adj=emme_adj.groupby(['HPMSVtypeID', 'roadType', 'roadTypeID'])['final_adj'].sum().reset_index() + + # STEP 4: Adjustment to separate motorcycles and passenger and light cars + emme_adj = emme_adj.merge(in_source25split, on='roadTypeID') + emme_adj['final_VMT'] = np.where(emme_adj['HPMSVtypeID'] == 25, emme_adj['final_adj']*emme_adj['share'], emme_adj['final_adj']) + emme_adj['sourceTypeID'] = np.where(emme_adj['HPMSVtypeID'] == 25, emme_adj['source'], emme_adj['HPMSVtypeID']) + emme_adj = emme_adj[['sourceTypeID', 'roadTypeID', 'roadType', 'final_VMT']].drop_duplicates().copy() + emme_adj = emme_adj.groupby('sourceTypeID')['final_VMT'].sum().round().reset_index() + + # Format for export + emme_adj.rename(columns={'sourceTypeID':'HPMSVtypeID', 'final_VMT':'HPMSBaseYearVMT'}, inplace=True) + emme_adj['yearID'] = scenyear + emme_adj=emme_adj[['HPMSVtypeID', 'yearID', 'HPMSBaseYearVMT']].copy() + + return emme_adj + +if __name__ == "__main__": + + # Get parameters from batch file + with open(DB_DIR.joinpath('batch_file.yaml')) as f: + config = yaml.safe_load(f) + model = config['model_version'] # e.g., 'c23q4' + scenyear = config['scenario_code'] # e.g., '400' + year = config['year'] + exportAs = config['exportAs'] # im or im_county + + # Load in punchlink for specific scenario year + linkdata = pd.read_csv(DB_DIR.joinpath('data', 'punchlink.csv')) + + # Merge in zone-county crosswalk + zone_county_cw = pd.read_csv(DB_DIR.joinpath('data', 'zone17_county_crosswalk.csv')) + linkdata = pd.merge(linkdata, zone_county_cw, left_on="zone", right_on="zone17", how = "left").drop("zone17", axis=1) + + # Get clean link data + links = clean_linkdata(linkdata) + + # If just IM/nonIM run, set counties to empty string. Otherwise, use all CMAP region counties. + if exportAs == "im": + counties = [""] + if exportAs == "im_county": + counties = ['COOK', 'DUPAGE', 'KANE', 'KENDALL', 'LAKE', 'MCHENRY', 'WILL','GRUNDY'] + + # Define IDs + groupcols = ['imarea', 'roadTypeID', 'timeperiod', 'avgSpeedBinID', 'hours'] + + # Loop over counties + for county in counties: + + # If im_county run, filter for just links in a given county + if county != "": + links_to_use = links.loc[links["county_name"] == county] + county_ext = f"_{county}" + + # Otherwise, use entire links dataset + else: + links_to_use = links.copy() + county_ext = "" + + # Aggregate to VMT/VHT by group cols + b = agg_links(groupcols, links_to_use) + + # Loop over IM regions + for imarea_text, imarea in {"IM": 1, "nonIM": 0}.items(): + + + # Tab 1: Initial Model Output + initial_model_output = get_initial_model_output(b, imarea) + + # If no data, don't output file + if (np.all(initial_model_output["vmt"]==0)) & (np.all(initial_model_output["vht"]==0)): + continue + + # Tab 2: Average Speed Distribution + avg_speed_dist = get_avg_speed_distribution(b,imarea) + + # Tab 3: Road Type Distribution + road_type_distribution = get_road_type_distribution(b, imarea) + + # Tab 4: Hourly VMT Fraction + hourly_vmt_fraction = get_hourly_vmt_fraction(b, imarea) + + # Tab 5: HPMS Daily VMT + hpms_daily_vmt = get_hpms_daily_vmt(b, imarea) + + # Tab 6: HPMS Annual VMT + hpms_annual_vmt = get_hpms_annual_vmt(hpms_daily_vmt, year) + + # Create folder for outputs if it doesn't already exist + out_folder = DB_DIR.joinpath('data', f'MOVES_{model}_scen{scenyear}') + out_folder.mkdir(exist_ok=True) + + # Output to Excel Workbook + out_path = out_folder.joinpath(f'MOVES_{model}_scen{scenyear}_{imarea_text}{county_ext}.xlsx') + out_xlsx = pd.ExcelWriter(out_path) + + initial_model_output.to_excel(out_xlsx, sheet_name='initial_model_output', index=False) + avg_speed_dist.to_excel(out_xlsx, sheet_name='AvgSpeedDistribution', index=False) + road_type_distribution.to_excel(out_xlsx, sheet_name='RoadTypeDistribution', index=False) + hourly_vmt_fraction.to_excel(out_xlsx, sheet_name='hourVMTFraction', index=False) + hpms_daily_vmt.to_excel(out_xlsx, sheet_name='HPMSDailyVMT', index=False) + hpms_annual_vmt.to_excel(out_xlsx, sheet_name='HPMSVtypeYear', index=False) + + out_xlsx.close() + + print("Done!") diff --git a/Database/post_macros/createMOVESinputfile_QC.py b/Database/post_macros/createMOVESinputfile_QC.py new file mode 100644 index 0000000..cd8d1d9 --- /dev/null +++ b/Database/post_macros/createMOVESinputfile_QC.py @@ -0,0 +1,90 @@ +import pandas as pd, numpy as np +from pathlib import Path +from functools import reduce + +## This file runs two quality checks for createMOVESinputfile.py +## (1) check_im(): Checks if all tabs in two comparison workbooks match for a given imregion and scenario +## (2) check_im_county(): Checks if the VHT/VMT in initial_model_output for each county in a given imregion +## sum up to the correct aggregated values + +### TO RUN: specify the scenario year and model ################################################################### +### This set-up assumes the files are in data/MOVES_cXXqX_scenXXX. The files you want to compare to must have +### the suffix "_old", for example MOVES_c26q2_scen100_IM_old.xlsx and MOVES_c26q2_scen100_nonIM_old.xlsx +SCEN = "600" +MODEL = "c26q2" +################################################################################################################## + +DB_DIR = Path(__file__).resolve().parents[1] +FOLDER_PATH = DB_DIR.joinpath("data",f"MOVES_{MODEL}_scen{SCEN}") + +def check_im(scen, imregion): + """" + Compares the new and old Excel workbooks for a specific IM region and scenario, + ex. MOVES_c26q2_scen100_IM.xlsx and MOVES_c26q2_scen100_IM_old.xlsx + Prints True if all cells match, False otherwise. + """ + # Get paths of new and old files + new_file_path = FOLDER_PATH.joinpath(f"MOVES_{MODEL}_scen{scen}_{imregion}.xlsx") + old_file_path = FOLDER_PATH.joinpath(f"MOVES_{MODEL}_scen{scen}_{imregion}_old.xlsx") + + tab_names = ["initial_model_output","AvgSpeedDistribution", "RoadTypeDistribution","hourVMTFraction", "HPMSDailyVMT"] + + print("check_im()") + print(f"... Comparing MOVES_{MODEL}_scen{scen}_{imregion}.xlsx and MOVES_{MODEL}_scen{scen}_{imregion}_old.xlsx") + + # Check equality of each tab + for tab in tab_names: + old_data = pd.read_excel(old_file_path,sheet_name=tab) + new_data = pd.read_excel(new_file_path,sheet_name=tab) + + print(f"--> {tab} equality: {old_data.equals(new_data)}") + + +def check_im_county(scen, imregion): + """ + Checks to see if the VMT/VHT in the initial_model_output tab from each county sum up to the aggregated VMT/VHT. + For VMT and VHT, prints True if they match, False otherwise. + """ + # Specify counties for given IM region + if imregion == "IM": + counties = ['COOK', 'DUPAGE', 'KANE', 'KENDALL', 'LAKE', 'MCHENRY', 'WILL'] + if imregion == "nonIM": + counties = ['KANE', 'KENDALL', 'LAKE', 'MCHENRY', 'WILL','GRUNDY'] + + # Merge all county initial_model_output datasets together for given imregion + dfs = [] + for county in counties: + county_file_path = FOLDER_PATH.joinpath(f"MOVES_{MODEL}_scen{scen}_{imregion}_{county}.xlsx") + + # get initial_model_output tab from county file + initial_model_output = pd.read_excel(county_file_path,sheet_name="initial_model_output") + initial_model_output = initial_model_output.rename(columns={"vmt": f"vmt_{county}", "vht": f"vht_{county}"}) + + dfs.append(initial_model_output) + + ids = ["sourceTypeID","roadTypeID","hourDayID","avgSpeedBinID","imarea"] + merged_df = reduce(lambda left, right: pd.merge(left, right, on=ids, how='outer'), dfs) + + # Create totals for VMT/VHT + merged_df["vmt_TOTAL"] = sum([merged_df[f"vmt_{county}"] for county in counties]) + merged_df["vht_TOTAL"] = sum([merged_df[f"vht_{county}"] for county in counties]) + + # Use OLD aggregated file for given im region + aggregated_file_path = FOLDER_PATH.joinpath(f"MOVES_{MODEL}_scen{scen}_{imregion}_old.xlsx") + agg_initial_model_output = pd.read_excel(aggregated_file_path,sheet_name="initial_model_output") + + # Check for approximate equality (necessary because floats, tolerance = 1e-8) + print() + print("check_im_county()") + print(f"... Aggregating {counties}") + print(f"... Comparing to MOVES_{MODEL}_scen{scen}_{imregion}_old.xlsx") + print("--> VMT Equality:", np.all(np.isclose(merged_df["vmt_TOTAL"], agg_initial_model_output["vmt"]))) + print("--> VHT Equality:", np.all(np.isclose(merged_df["vht_TOTAL"], agg_initial_model_output["vht"]))) + print() + + +if __name__ == "__main__": + for imregion in ["nonIM", "IM"]: + print(f"** SCENARIO YEAR: {SCEN}, REGION: {imregion} **") + check_im(SCEN, imregion) + check_im_county(SCEN, imregion) \ No newline at end of file diff --git a/Database/prep_macros/create_distr_m01_files.R b/Database/prep_macros/create_distr_m01_files.R index 2b8827c..2adfdcc 100644 --- a/Database/prep_macros/create_distr_m01_files.R +++ b/Database/prep_macros/create_distr_m01_files.R @@ -370,7 +370,7 @@ cta_s <- bus %>% #pace flag cutoffs reflect the distribution of sidewalk density in the whole region sidewalk_zn <- in8 %>% - rename(subzone17 = V1, sidewalkD = V14) %>% + rename(subzone17 = V1, sidewalkD = V36) %>% select(subzone17, sidewalkD) %>% left_join(szC, by = "subzone17") %>% group_by(zone17) %>% diff --git a/Database/prep_macros/distr_m01_data.py b/Database/prep_macros/distr_m01_data.py index a1f799d..5d7c4af 100644 --- a/Database/prep_macros/distr_m01_data.py +++ b/Database/prep_macros/distr_m01_data.py @@ -1,115 +1,115 @@ -#filename: distr_m01_data.py -#description: Python script uses the EMME Modeler API to punch transit network and itinerary data for DISTR and M01 files creation -#author: Karly Cazzato, 9/20/2023 - -import os -import sys -import inro.emme.desktop.app as _app -import inro.modeller as _m -import pandas as pd - -def main(): - # Define the path to the Emme project (.emp file) - empFl = sys.argv[1] - directory = os.getcwd().replace('\\Database','') - empFile = os.path.join(directory,empFl) - - # start a dedicated instance of Emme Desktop connected to the specified project - desktop = _app.start_dedicated( - visible=True, - user_initials='KCC', - project= empFile - ) - - # Connect to the Modeller - modeller = _m.Modeller(desktop=desktop) - emmebank = modeller.emmebank - netcalc = modeller.tool('inro.emme.network_calculation.network_calculator') - - # define variables - currentScen = int(sys.argv[2]) - scenAM = currentScen + 3 - scenMD = currentScen + 5 - t1= r'prep_macros\temp' - t2= 'transit.itin' - t3= 'node.txt' - itinOut = (t1 + '\\' + t2) - nodeOut = (t1 + '\\' + t3) - - #load specs - itinAM = '''{ - "result": null, - "expression": "dwt + veh + hdw", - "aggregation": null, - "selections": { - "link": "all", - "transit_line": "all" - }, - "type": "NETWORK_CALCULATION" - }''' - - nodeAM = '''{ - "result": null, - "expression": "@pspac+@pcost+xi+yi+@zone", - "aggregation": null, - "selections": { - "node": "5000,99999" - }, - "type": "NETWORK_CALCULATION" - }''' - #run and save AM - itineraryAM = netcalc(itinAM, scenario = emmebank.scenario(scenAM), full_report = True) - nodeAM = netcalc(nodeAM, scenario = emmebank.scenario(scenAM), full_report = True) - - itineraryAMDF = pd.DataFrame(columns = itineraryAM['table'][0], data = itineraryAM['table'][1:]) - with open(itinOut, 'a') as f: - dfAsString = itineraryAMDF.to_string(header=True, index=False) - f.write(dfAsString) - - nodeAMDF = pd.DataFrame(columns = nodeAM['table'][0], data = nodeAM['table'][1:]) - with open(nodeOut, 'a') as f: - dfAsString = nodeAMDF.to_string(header=True, index=False) - f.write(dfAsString) - #load spec Midday - itinMD = '''{ - "result": null, - "expression": "dwt + veh + hdw", - "aggregation": null, - "selections": { - "link": "mod=BEPLQ", - "transit_line": "mod=BEPLQ" - }, - "type": "NETWORK_CALCULATION" - }''' - - nodeMD = '''{ - "result": null, - "expression": "@pspac+@pcost+xi+yi+@zone", - "aggregation": null, - "selections": { - "node": "5000,29999" - }, - "type": "NETWORK_CALCULATION" - }''' - #run and save midday - itineraryMD = netcalc(itinMD, scenario = emmebank.scenario(scenMD), full_report = True) - nodeMD = netcalc(nodeMD, scenario = emmebank.scenario(scenMD), full_report = True) - - t1= r'prep_macros\temp' - t2= 'transit_midday.itin' - t3= 'node_midday.txt' - itinOut = (t1 + '\\' + t2) - nodeOut = (t1 + '\\' + t3) - - itineraryMDDF = pd.DataFrame(columns = itineraryMD['table'][0], data = itineraryMD['table'][1:]) - with open(itinOut, 'a') as f: - dfAsString = itineraryMDDF.to_string(header=True, index=False) - f.write(dfAsString) - - nodeMDDF = pd.DataFrame(columns = nodeMD['table'][0], data = nodeMD['table'][1:]) - with open(nodeOut, 'a') as f: - dfAsString = nodeMDDF.to_string(header=True, index=False) - f.write(dfAsString) - desktop.close() -if __name__ == '__main__': +#filename: distr_m01_data.py +#description: Python script uses the EMME Modeler API to punch transit network and itinerary data for DISTR and M01 files creation +#author: Karly Cazzato, 9/20/2023 + +import os +import sys +import inro.emme.desktop.app as _app +import inro.modeller as _m +import pandas as pd + +def main(): + # Define the path to the Emme project (.emp file) + empFl = sys.argv[1] + directory = os.getcwd().replace('\\Database','') + empFile = os.path.join(directory,empFl) + + # start a dedicated instance of Emme Desktop connected to the specified project + desktop = _app.start_dedicated( + visible=True, + user_initials='KCC', + project= empFile + ) + + # Connect to the Modeller + modeller = _m.Modeller(desktop=desktop) + emmebank = modeller.emmebank + netcalc = modeller.tool('inro.emme.network_calculation.network_calculator') + + # define variables + currentScen = int(sys.argv[2]) + scenAM = currentScen + scenMD = scenAM + 5 + t1= r'prep_macros\temp' + t2= 'transit.itin' + t3= 'node.txt' + itinOut = (t1 + '\\' + t2) + nodeOut = (t1 + '\\' + t3) + + #load specs + itinAM = '''{ + "result": null, + "expression": "dwt + veh + hdw", + "aggregation": null, + "selections": { + "link": "all", + "transit_line": "all" + }, + "type": "NETWORK_CALCULATION" + }''' + + nodeAM = '''{ + "result": null, + "expression": "@pspac+@pcost+xi+yi+@zone", + "aggregation": null, + "selections": { + "node": "5000,99999" + }, + "type": "NETWORK_CALCULATION" + }''' + #run and save AM + itineraryAM = netcalc(itinAM, scenario = emmebank.scenario(scenAM), full_report = True) + nodeAM = netcalc(nodeAM, scenario = emmebank.scenario(scenAM), full_report = True) + + itineraryAMDF = pd.DataFrame(columns = itineraryAM['table'][0], data = itineraryAM['table'][1:]) + with open(itinOut, 'a') as f: + dfAsString = itineraryAMDF.to_string(header=True, index=False) + f.write(dfAsString) + + nodeAMDF = pd.DataFrame(columns = nodeAM['table'][0], data = nodeAM['table'][1:]) + with open(nodeOut, 'a') as f: + dfAsString = nodeAMDF.to_string(header=True, index=False) + f.write(dfAsString) + #load spec Midday + itinMD = '''{ + "result": null, + "expression": "dwt + veh + hdw", + "aggregation": null, + "selections": { + "link": "mod=BEPLQ", + "transit_line": "mod=BEPLQ" + }, + "type": "NETWORK_CALCULATION" + }''' + + nodeMD = '''{ + "result": null, + "expression": "@pspac+@pcost+xi+yi+@zone", + "aggregation": null, + "selections": { + "node": "5000,29999" + }, + "type": "NETWORK_CALCULATION" + }''' + #run and save midday + itineraryMD = netcalc(itinMD, scenario = emmebank.scenario(scenMD), full_report = True) + nodeMD = netcalc(nodeMD, scenario = emmebank.scenario(scenMD), full_report = True) + + t1= r'prep_macros\temp' + t2= 'transit_midday.itin' + t3= 'node_midday.txt' + itinOut = (t1 + '\\' + t2) + nodeOut = (t1 + '\\' + t3) + + itineraryMDDF = pd.DataFrame(columns = itineraryMD['table'][0], data = itineraryMD['table'][1:]) + with open(itinOut, 'a') as f: + dfAsString = itineraryMDDF.to_string(header=True, index=False) + f.write(dfAsString) + + nodeMDDF = pd.DataFrame(columns = nodeMD['table'][0], data = nodeMD['table'][1:]) + with open(nodeOut, 'a') as f: + dfAsString = nodeMDDF.to_string(header=True, index=False) + f.write(dfAsString) + desktop.close() +if __name__ == '__main__': main() \ No newline at end of file diff --git a/Database/prep_macros/free.skim.mac.py b/Database/prep_macros/free.skim.mac.py index 196ed35..7a527a7 100644 --- a/Database/prep_macros/free.skim.mac.py +++ b/Database/prep_macros/free.skim.mac.py @@ -1,305 +1,304 @@ -#filename: free.skim.mac.py -#description: creates time and distance skims from am-peak and midday scenarios to start distribution and mode choice -#author: Karly Cazzato, 12/05/2023 - -import os -import os.path -import sys -import inro.emme.desktop.app as _app -import inro.modeller as _m - - -def main(): - - #set variables - currentScen = int(sys.argv[2]) - scenario = str(currentScen) - directory = os.getcwd().replace('\\Database','') - batchin = directory + "\\Database\\data\\vdf_free.in" - - # Define the path to the Emme project (.emp file) - empFl = sys.argv[1] - empFile = os.path.join(directory,empFl) - desktop = _app.start_dedicated( - visible=True, - user_initials='KCC', - project= empFile - ) - - # Connect to the Modeller - modeller = _m.Modeller(desktop=desktop) - emmebank = modeller.emmebank - - #define tools - delete_function = modeller.tool("inro.emme.data.function.delete_function") - batchin_function = modeller.tool("inro.emme.data.function.function_transaction") - - create_matrix = modeller.tool("inro.emme.data.matrix.create_matrix") - matrix_calculation = modeller.tool("inro.emme.matrix_calculation.matrix_calculator") - delete_matrix = modeller.tool("inro.emme.data.matrix.delete_matrix") - - copy_scenario = modeller.tool("inro.emme.data.scenario.copy_scenario") - change_scenario = modeller.tool("inro.emme.data.scenario.change_primary_scenario") - delete_scenario = modeller.tool("inro.emme.data.scenario.delete_scenario") - - net_calc = modeller.tool("inro.emme.network_calculation.network_calculator") - - sola_assign_traffic = modeller.tool("inro.emme.traffic_assignment.sola_traffic_assignment") - - #delete existing functions for skimming and batch in new functions - for i in range(1,10): - f_id = "fd%s" % i - f = _m.Modeller().emmebank.function(f_id) - if f: delete_function(f) - - #input functions using process function transaction tool - batchin_function(transaction_file = batchin, throw_on_error = True) - - #initialize base toll matrices - mf111 = create_matrix(matrix_id="mf111", matrix_name="tshwl", matrix_description="low inc h-w sov toll", default_value=0, overwrite = "True") - mf112 = create_matrix(matrix_id="mf112", matrix_name="th2hwl", matrix_description="low inc h-w hov 2 per toll", default_value=0, overwrite = "True") - mf117 = create_matrix(matrix_id="mf117", matrix_name="tsho", matrix_description="h-o sov toll", default_value=0, overwrite = "True") - mf118 = create_matrix(matrix_id="mf118", matrix_name="th2ho", matrix_description="h-o hov 2 per toll", default_value=0, overwrite = "True") - - spec_mf112 = {"expression": "mf111", "result": "mf112", "type": "MATRIX_CALCULATION"} - spec_mf118 = {"expression": "mf117", "result": "mf118", "type": "MATRIX_CALCULATION"} - - matrix_calculation([spec_mf112, spec_mf118]) - - #set scenario and define temporary copy of AM and MD scenarios for skimming - scen = currentScen*100 - scen = scen + 3 - currentScen = currentScen+3 ## -- set to AM transit skim scenario - scenarioWorking = emmebank.scenario(scen) - s93 = copy_scenario(from_scenario=scenarioWorking, scenario_id=93, scenario_title="temp am peak scenario for skimming", overwrite=True) - - #then repeate with midday period scenario - scen = scen + 2 - scenarioWorking = emmebank.scenario(scen) - s95 = copy_scenario(from_scenario=scenarioWorking, scenario_id=95, scenario_title="temp midday scenario for skimming", overwrite=True) - - #spec to @ftime to ul1 - ftime_to_ul1 = { - "result": "ul1", - "expression": "@ftime", - "selections": { - "link": "!vdf = 6,7", - }, - "type": "NETWORK_CALCULATION" - } - - periodMat = { - 93 : ["S", #mode class [0] - "mf44", "amtime", "am peak 7-9am SOV hwy time skim initsim", #[1, 2, 3] - "mf45", "amdist", "am peak 7-9am SOV hwy distance skim init", #[4, 5, 6] - "mf111", #matrix to hold additional attribute, toll SOVAM, [7] - "H", #mode class [8] - "mf76", "amhovt", "am peak 7-9am HOV hwy time skim initsim", #[9, 10, 11] - "mf77", "amhovd", "am peak 7-9am HOV hwy distance skim init", #[12, 13, 14] - "mf112"], #matrix to hold additional attribute, toll HOVAM [15] - 95 : ["S", #mode class, [0] - "mf46", "mdtime", "midday 10a-2p SOV hwy time skim initsim", #[1, 2, 3] - "mf47", "mddist", "midday 10a-2p SOvhwy distance skim init", #[4, 5, 6] - "mf117", #matrix to hold additional attribute, toll SOVMD, [7] - "H", #mode class, [8] - "mf78", "mdhovt", "midday 10a-2p HOV hwy time skim initsim", #[9, 10, 11] - "mf79", "mdhovd", "midday 10a-2p HOV hwy distance skim init", #[12, 13, 14] - "mf118"] #matrix to hold additional attribute, toll HOVMD - } - #the loop will say for scenario in periodMat - #then call periodMat[scenario][#] - for scenario in periodMat: - change_scenario(scenario = str(scenario)) #set scenario - net_calc(ftime_to_ul1) #put @ftime in ul1 - - delete_matrix(periodMat[scenario][1]) #delete first matrix in the list - new_mat = create_matrix(matrix_id=periodMat[scenario][1], matrix_name=periodMat[scenario][2], matrix_description=periodMat[scenario][3], default_value=0.0, overwrite ="True") - delete_matrix(periodMat[scenario][4]) #delete second matrix in the list - new_mat = create_matrix(matrix_id=periodMat[scenario][4], matrix_name=periodMat[scenario][5], matrix_description=periodMat[scenario][6], default_value=0.0, overwrite ="True") - - traffic_assignment = { - "type": "SOLA_TRAFFIC_ASSIGNMENT", - "background_traffic": None, - "classes": [ - {#start mode SOV - "mode": periodMat[scenario][0], #mode class - "demand": "ms97", #dummy matrix to hold assignment demand - "results": { - "od_travel_times": { - "shortest_paths": periodMat[scenario][1] #store skimmed time - } - }, - "path_analyses": [ - { - "link_component": "length", - "operator": "+", - "selection_threshold": { - "lower": .0000000001, - "upper": 999999 - }, - "path_to_od_composition": { - "considered_paths": "ALL", - "multiply_path_proportions_by": { - "analyzed_demand": False, - "path_value": True - } - }, - "analyzed_demand": None, - "results": { - "od_values": periodMat[scenario][4] - } - }, - - { - "link_component": "@toll", - "operator": "+", - "selection_threshold": { - "lower": .0000000001, - "upper": 999999 - }, - "path_to_od_composition": { - "considered_paths": "ALL", - "multiply_path_proportions_by": { - "analyzed_demand": False, - "path_value": True - } - }, - "analyzed_demand": None, - "results": { - "od_values": periodMat[scenario][7] - } - } - ] - }, - - { #start mode HOV - "mode": periodMat[scenario][8], #mode class - "demand": "ms97", #dummy matrix to hold assignment demand - "results": { - "od_travel_times": { - "shortest_paths": periodMat[scenario][9] #store skimmed time - } - }, - "path_analyses": [ - { - "link_component": "length", - "operator": "+", - "selection_threshold": { - "lower": .0000000001, - "upper": 999999 - }, - "path_to_od_composition": { - "considered_paths": "ALL", - "multiply_path_proportions_by": { - "analyzed_demand": False, - "path_value": True - } - }, - "analyzed_demand": None, - "results": { - "od_values": periodMat[scenario][12]} - }, - { - "link_component": "@toll", - "operator": "+", - "selection_threshold": { - "lower": .0000000001, - "upper": 999999 - }, - "path_to_od_composition": { - "considered_paths": "ALL", - "multiply_path_proportions_by": { - "analyzed_demand": False, - "path_value": True - } - }, - "analyzed_demand": None, - "results": { - "od_values": periodMat[scenario][15] - } - } - ] - } - - ], - - "performance_settings": { - "number_of_processors": "max" - }, - "stopping_criteria": { - "max_iterations": 0, - "relative_gap": 0.0001, - "best_relative_gap": 0.01, - "normalized_gap": 0.001 - } - } - #setup highway asmt - see spec above - #run assignment - sola_assign_traffic(traffic_assignment) - print("ran spec for " + str(scenario)) - - #change scenario (can't delete current primary scenario) - change_scenario(scenario = str(currentScen)) #set scenario - - #delete temporary scenarios - sdel = emmebank.scenario(scenario) - delete_scenario(scenario = sdel) - - print("completed loop") - - #initialize time of day skim travel time matrices and toll skims - mf461 = create_matrix(matrix_id="mf461", matrix_name="todtime1", matrix_description="SOV hwy time skim period 1", default_value=0, overwrite = "True") - mf462 = create_matrix(matrix_id="mf462", matrix_name="todtime2", matrix_description="SOV hwy time skim period 2", default_value=0, overwrite = "True") - mf463 = create_matrix(matrix_id="mf463", matrix_name="todtime3", matrix_description="SOV hwy time skim period 3", default_value=0, overwrite = "True") - mf464 = create_matrix(matrix_id="mf464", matrix_name="todtime4", matrix_description="SOV hwy time skim period 4", default_value=0, overwrite = "True") - mf465 = create_matrix(matrix_id="mf465", matrix_name="todtime5", matrix_description="SOV hwy time skim period 5", default_value=0, overwrite = "True") - mf466 = create_matrix(matrix_id="mf466", matrix_name="todtime6", matrix_description="SOV hwy time skim period 6", default_value=0, overwrite = "True") - mf467 = create_matrix(matrix_id="mf467", matrix_name="todtime7", matrix_description="SOV hwy time skim period 7", default_value=0, overwrite = "True") - mf468 = create_matrix(matrix_id="mf468", matrix_name="todtime8", matrix_description="SOV hwy time skim period 8", default_value=0, overwrite = "True") - - mf113 = create_matrix(matrix_id="mf113", matrix_name="th3hwl", matrix_description="low inc h-w hov 3+ per toll", default_value=0, overwrite = "True") - mf114 = create_matrix(matrix_id="mf114", matrix_name="tshwh", matrix_description="high inc h-w sov toll", default_value=0, overwrite = "True") - mf115 = create_matrix(matrix_id="mf115", matrix_name="th2hwh", matrix_description="high inc h-w hov 2 per toll", default_value=0, overwrite = "True") - mf116 = create_matrix(matrix_id="mf116", matrix_name="th3hwh", matrix_description="high inc h-w hov 3+ per toll", default_value=0, overwrite = "True") - mf119 = create_matrix(matrix_id="mf119", matrix_name="th3ho", matrix_description="h-o hov 3+ per toll", default_value=0, overwrite = "True") - mf120 = create_matrix(matrix_id="mf120", matrix_name="tsnh", matrix_description="nh sov toll", default_value=0, overwrite = "True") - mf121 = create_matrix(matrix_id="mf121", matrix_name="th2nh", matrix_description="nh hov 2 per toll", default_value=0, overwrite = "True") - mf122 = create_matrix(matrix_id="mf122", matrix_name="th3nh", matrix_description="nh hov 3+ per toll", default_value=0, overwrite = "True") - - spec_mf461 = {"expression": "mf46", "result": "mf461", "type": "MATRIX_CALCULATION"} - spec_mf462 = {"expression": "mf44", "result": "mf462", "type": "MATRIX_CALCULATION"} - spec_mf463 = {"expression": "mf44", "result": "mf463", "type": "MATRIX_CALCULATION"} - spec_mf464 = {"expression": "mf44", "result": "mf464", "type": "MATRIX_CALCULATION"} - spec_mf465 = {"expression": "mf46", "result": "mf465", "type": "MATRIX_CALCULATION"} - spec_mf466 = {"expression": "mf44", "result": "mf466", "type": "MATRIX_CALCULATION"} - spec_mf467 = {"expression": "mf44", "result": "mf467", "type": "MATRIX_CALCULATION"} - spec_mf468 = {"expression": "mf44", "result": "mf468", "type": "MATRIX_CALCULATION"} - matrix_calculation([spec_mf461, spec_mf462, spec_mf463, spec_mf464, spec_mf465, spec_mf466, spec_mf467, spec_mf468]) - - spec_mf113 = {"expression": "mf112", "result": "mf113", "type": "MATRIX_CALCULATION"} - spec_mf114 = {"expression": "mf111", "result": "mf114", "type": "MATRIX_CALCULATION"} - spec_mf115 = {"expression": "mf112", "result": "mf115", "type": "MATRIX_CALCULATION"} - spec_mf116 = {"expression": "mf112", "result": "mf116", "type": "MATRIX_CALCULATION"} - spec_mf119 = {"expression": "mf118", "result": "mf119", "type": "MATRIX_CALCULATION"} - spec_mf120 = {"expression": "mf117", "result": "mf120", "type": "MATRIX_CALCULATION"} - spec_mf121 = {"expression": "mf118", "result": "mf121", "type": "MATRIX_CALCULATION"} - spec_mf122 = {"expression": "mf118", "result": "mf122", "type": "MATRIX_CALCULATION"} - matrix_calculation([spec_mf113, spec_mf114, spec_mf115, spec_mf116, spec_mf119, spec_mf120, spec_mf121, spec_mf122]) - - #convert tolls to cents - toll111 = {"expression": "mf111*100", "result": "mf111", "type": "MATRIX_CALCULATION"} - toll112 = {"expression": "mf112*100", "result": "mf112", "type": "MATRIX_CALCULATION"} - toll113 = {"expression": "mf113*100", "result": "mf113", "type": "MATRIX_CALCULATION"} - toll114 = {"expression": "mf114*100", "result": "mf114", "type": "MATRIX_CALCULATION"} - toll115 = {"expression": "mf115*100", "result": "mf115", "type": "MATRIX_CALCULATION"} - toll116 = {"expression": "mf116*100", "result": "mf116", "type": "MATRIX_CALCULATION"} - toll117 = {"expression": "mf117*100", "result": "mf117", "type": "MATRIX_CALCULATION"} - toll118 = {"expression": "mf118*100", "result": "mf118", "type": "MATRIX_CALCULATION"} - toll119 = {"expression": "mf119*100", "result": "mf119", "type": "MATRIX_CALCULATION"} - toll120 = {"expression": "mf120*100", "result": "mf120", "type": "MATRIX_CALCULATION"} - toll121 = {"expression": "mf121*100", "result": "mf121", "type": "MATRIX_CALCULATION"} - toll122 = {"expression": "mf122*100", "result": "mf122", "type": "MATRIX_CALCULATION"} - matrix_calculation([toll111, toll112, toll113, toll114, toll115, toll116, toll117, toll118, toll119, toll120, toll121, toll122]) - -if __name__ == '__main__': +#filename: free.skim.mac.py +#description: creates time and distance skims from am-peak and midday scenarios to start distribution and mode choice +#author: Karly Cazzato, 12/05/2023 + +import os +import os.path +import sys +import inro.emme.desktop.app as _app +import inro.modeller as _m + + +def main(): + + #set variables + currentScen = int(sys.argv[2]) + scenario = str(currentScen) + directory = os.getcwd().replace('\\Database','') + batchin = directory + "\\Database\\data\\vdf_free.in" + + # Define the path to the Emme project (.emp file) + empFl = sys.argv[1] + empFile = os.path.join(directory,empFl) + desktop = _app.start_dedicated( + visible=True, + user_initials='KCC', + project= empFile + ) + + # Connect to the Modeller + modeller = _m.Modeller(desktop=desktop) + emmebank = modeller.emmebank + + #define tools + delete_function = modeller.tool("inro.emme.data.function.delete_function") + batchin_function = modeller.tool("inro.emme.data.function.function_transaction") + + create_matrix = modeller.tool("inro.emme.data.matrix.create_matrix") + matrix_calculation = modeller.tool("inro.emme.matrix_calculation.matrix_calculator") + delete_matrix = modeller.tool("inro.emme.data.matrix.delete_matrix") + + copy_scenario = modeller.tool("inro.emme.data.scenario.copy_scenario") + change_scenario = modeller.tool("inro.emme.data.scenario.change_primary_scenario") + delete_scenario = modeller.tool("inro.emme.data.scenario.delete_scenario") + + net_calc = modeller.tool("inro.emme.network_calculation.network_calculator") + + sola_assign_traffic = modeller.tool("inro.emme.traffic_assignment.sola_traffic_assignment") + + #delete existing functions for skimming and batch in new functions + for i in range(1,10): + f_id = "fd%s" % i + f = _m.Modeller().emmebank.function(f_id) + if f: delete_function(f) + + #input functions using process function transaction tool + batchin_function(transaction_file = batchin, throw_on_error = True) + + #initialize base toll matrices + mf111 = create_matrix(matrix_id="mf111", matrix_name="tshwl", matrix_description="low inc h-w sov toll", default_value=0, overwrite = "True") + mf112 = create_matrix(matrix_id="mf112", matrix_name="th2hwl", matrix_description="low inc h-w hov 2 per toll", default_value=0, overwrite = "True") + mf117 = create_matrix(matrix_id="mf117", matrix_name="tsho", matrix_description="h-o sov toll", default_value=0, overwrite = "True") + mf118 = create_matrix(matrix_id="mf118", matrix_name="th2ho", matrix_description="h-o hov 2 per toll", default_value=0, overwrite = "True") + + spec_mf112 = {"expression": "mf111", "result": "mf112", "type": "MATRIX_CALCULATION"} + spec_mf118 = {"expression": "mf117", "result": "mf118", "type": "MATRIX_CALCULATION"} + + matrix_calculation([spec_mf112, spec_mf118]) + + #set scenario and define temporary copy of AM and MD scenarios for skimming + scen = currentScen*100 + scen = scen + 3 + scenarioWorking = emmebank.scenario(scen) + s93 = copy_scenario(from_scenario=scenarioWorking, scenario_id=93, scenario_title="temp am peak scenario for skimming", overwrite=True) + + #then repeate with midday period scenario + scen = scen + 2 + scenarioWorking = emmebank.scenario(scen) + s95 = copy_scenario(from_scenario=scenarioWorking, scenario_id=95, scenario_title="temp midday scenario for skimming", overwrite=True) + + #spec to @ftime to ul1 + ftime_to_ul1 = { + "result": "ul1", + "expression": "@ftime", + "selections": { + "link": "!vdf = 6,7", + }, + "type": "NETWORK_CALCULATION" + } + + periodMat = { + 93 : ["S", #mode class [0] + "mf44", "amtime", "am peak 7-9am SOV hwy time skim initsim", #[1, 2, 3] + "mf45", "amdist", "am peak 7-9am SOV hwy distance skim init", #[4, 5, 6] + "mf111", #matrix to hold additional attribute, toll SOVAM, [7] + "H", #mode class [8] + "mf76", "amhovt", "am peak 7-9am HOV hwy time skim initsim", #[9, 10, 11] + "mf77", "amhovd", "am peak 7-9am HOV hwy distance skim init", #[12, 13, 14] + "mf112"], #matrix to hold additional attribute, toll HOVAM [15] + 95 : ["S", #mode class, [0] + "mf46", "mdtime", "midday 10a-2p SOV hwy time skim initsim", #[1, 2, 3] + "mf47", "mddist", "midday 10a-2p SOvhwy distance skim init", #[4, 5, 6] + "mf117", #matrix to hold additional attribute, toll SOVMD, [7] + "H", #mode class, [8] + "mf78", "mdhovt", "midday 10a-2p HOV hwy time skim initsim", #[9, 10, 11] + "mf79", "mdhovd", "midday 10a-2p HOV hwy distance skim init", #[12, 13, 14] + "mf118"] #matrix to hold additional attribute, toll HOVMD + } + #the loop will say for scenario in periodMat + #then call periodMat[scenario][#] + for scenario in periodMat: + change_scenario(scenario = str(scenario)) #set scenario + net_calc(ftime_to_ul1) #put @ftime in ul1 + + delete_matrix(periodMat[scenario][1]) #delete first matrix in the list + new_mat = create_matrix(matrix_id=periodMat[scenario][1], matrix_name=periodMat[scenario][2], matrix_description=periodMat[scenario][3], default_value=0.0, overwrite ="True") + delete_matrix(periodMat[scenario][4]) #delete second matrix in the list + new_mat = create_matrix(matrix_id=periodMat[scenario][4], matrix_name=periodMat[scenario][5], matrix_description=periodMat[scenario][6], default_value=0.0, overwrite ="True") + + traffic_assignment = { + "type": "SOLA_TRAFFIC_ASSIGNMENT", + "background_traffic": None, + "classes": [ + {#start mode SOV + "mode": periodMat[scenario][0], #mode class + "demand": "ms97", #dummy matrix to hold assignment demand + "results": { + "od_travel_times": { + "shortest_paths": periodMat[scenario][1] #store skimmed time + } + }, + "path_analyses": [ + { + "link_component": "length", + "operator": "+", + "selection_threshold": { + "lower": .0000000001, + "upper": 999999 + }, + "path_to_od_composition": { + "considered_paths": "ALL", + "multiply_path_proportions_by": { + "analyzed_demand": False, + "path_value": True + } + }, + "analyzed_demand": None, + "results": { + "od_values": periodMat[scenario][4] + } + }, + + { + "link_component": "@toll", + "operator": "+", + "selection_threshold": { + "lower": .0000000001, + "upper": 999999 + }, + "path_to_od_composition": { + "considered_paths": "ALL", + "multiply_path_proportions_by": { + "analyzed_demand": False, + "path_value": True + } + }, + "analyzed_demand": None, + "results": { + "od_values": periodMat[scenario][7] + } + } + ] + }, + + { #start mode HOV + "mode": periodMat[scenario][8], #mode class + "demand": "ms97", #dummy matrix to hold assignment demand + "results": { + "od_travel_times": { + "shortest_paths": periodMat[scenario][9] #store skimmed time + } + }, + "path_analyses": [ + { + "link_component": "length", + "operator": "+", + "selection_threshold": { + "lower": .0000000001, + "upper": 999999 + }, + "path_to_od_composition": { + "considered_paths": "ALL", + "multiply_path_proportions_by": { + "analyzed_demand": False, + "path_value": True + } + }, + "analyzed_demand": None, + "results": { + "od_values": periodMat[scenario][12]} + }, + { + "link_component": "@toll", + "operator": "+", + "selection_threshold": { + "lower": .0000000001, + "upper": 999999 + }, + "path_to_od_composition": { + "considered_paths": "ALL", + "multiply_path_proportions_by": { + "analyzed_demand": False, + "path_value": True + } + }, + "analyzed_demand": None, + "results": { + "od_values": periodMat[scenario][15] + } + } + ] + } + + ], + + "performance_settings": { + "number_of_processors": "max" + }, + "stopping_criteria": { + "max_iterations": 0, + "relative_gap": 0.0001, + "best_relative_gap": 0.01, + "normalized_gap": 0.001 + } + } + #setup highway asmt - see spec above + #run assignment + sola_assign_traffic(traffic_assignment) + print("ran spec for " + str(scenario)) + + #change scenario (can't delete current primary scenario) + change_scenario(scenario = str(currentScen)) #set scenario + + #delete temporary scenarios + sdel = emmebank.scenario(scenario) + delete_scenario(scenario = sdel) + + print("completed loop") + + #initialize time of day skim travel time matrices and toll skims + mf461 = create_matrix(matrix_id="mf461", matrix_name="todtime1", matrix_description="SOV hwy time skim period 1", default_value=0, overwrite = "True") + mf462 = create_matrix(matrix_id="mf462", matrix_name="todtime2", matrix_description="SOV hwy time skim period 2", default_value=0, overwrite = "True") + mf463 = create_matrix(matrix_id="mf463", matrix_name="todtime3", matrix_description="SOV hwy time skim period 3", default_value=0, overwrite = "True") + mf464 = create_matrix(matrix_id="mf464", matrix_name="todtime4", matrix_description="SOV hwy time skim period 4", default_value=0, overwrite = "True") + mf465 = create_matrix(matrix_id="mf465", matrix_name="todtime5", matrix_description="SOV hwy time skim period 5", default_value=0, overwrite = "True") + mf466 = create_matrix(matrix_id="mf466", matrix_name="todtime6", matrix_description="SOV hwy time skim period 6", default_value=0, overwrite = "True") + mf467 = create_matrix(matrix_id="mf467", matrix_name="todtime7", matrix_description="SOV hwy time skim period 7", default_value=0, overwrite = "True") + mf468 = create_matrix(matrix_id="mf468", matrix_name="todtime8", matrix_description="SOV hwy time skim period 8", default_value=0, overwrite = "True") + + mf113 = create_matrix(matrix_id="mf113", matrix_name="th3hwl", matrix_description="low inc h-w hov 3+ per toll", default_value=0, overwrite = "True") + mf114 = create_matrix(matrix_id="mf114", matrix_name="tshwh", matrix_description="high inc h-w sov toll", default_value=0, overwrite = "True") + mf115 = create_matrix(matrix_id="mf115", matrix_name="th2hwh", matrix_description="high inc h-w hov 2 per toll", default_value=0, overwrite = "True") + mf116 = create_matrix(matrix_id="mf116", matrix_name="th3hwh", matrix_description="high inc h-w hov 3+ per toll", default_value=0, overwrite = "True") + mf119 = create_matrix(matrix_id="mf119", matrix_name="th3ho", matrix_description="h-o hov 3+ per toll", default_value=0, overwrite = "True") + mf120 = create_matrix(matrix_id="mf120", matrix_name="tsnh", matrix_description="nh sov toll", default_value=0, overwrite = "True") + mf121 = create_matrix(matrix_id="mf121", matrix_name="th2nh", matrix_description="nh hov 2 per toll", default_value=0, overwrite = "True") + mf122 = create_matrix(matrix_id="mf122", matrix_name="th3nh", matrix_description="nh hov 3+ per toll", default_value=0, overwrite = "True") + + spec_mf461 = {"expression": "mf46", "result": "mf461", "type": "MATRIX_CALCULATION"} + spec_mf462 = {"expression": "mf44", "result": "mf462", "type": "MATRIX_CALCULATION"} + spec_mf463 = {"expression": "mf44", "result": "mf463", "type": "MATRIX_CALCULATION"} + spec_mf464 = {"expression": "mf44", "result": "mf464", "type": "MATRIX_CALCULATION"} + spec_mf465 = {"expression": "mf46", "result": "mf465", "type": "MATRIX_CALCULATION"} + spec_mf466 = {"expression": "mf44", "result": "mf466", "type": "MATRIX_CALCULATION"} + spec_mf467 = {"expression": "mf44", "result": "mf467", "type": "MATRIX_CALCULATION"} + spec_mf468 = {"expression": "mf44", "result": "mf468", "type": "MATRIX_CALCULATION"} + matrix_calculation([spec_mf461, spec_mf462, spec_mf463, spec_mf464, spec_mf465, spec_mf466, spec_mf467, spec_mf468]) + + spec_mf113 = {"expression": "mf112", "result": "mf113", "type": "MATRIX_CALCULATION"} + spec_mf114 = {"expression": "mf111", "result": "mf114", "type": "MATRIX_CALCULATION"} + spec_mf115 = {"expression": "mf112", "result": "mf115", "type": "MATRIX_CALCULATION"} + spec_mf116 = {"expression": "mf112", "result": "mf116", "type": "MATRIX_CALCULATION"} + spec_mf119 = {"expression": "mf118", "result": "mf119", "type": "MATRIX_CALCULATION"} + spec_mf120 = {"expression": "mf117", "result": "mf120", "type": "MATRIX_CALCULATION"} + spec_mf121 = {"expression": "mf118", "result": "mf121", "type": "MATRIX_CALCULATION"} + spec_mf122 = {"expression": "mf118", "result": "mf122", "type": "MATRIX_CALCULATION"} + matrix_calculation([spec_mf113, spec_mf114, spec_mf115, spec_mf116, spec_mf119, spec_mf120, spec_mf121, spec_mf122]) + + #convert tolls to cents + toll111 = {"expression": "mf111*100", "result": "mf111", "type": "MATRIX_CALCULATION"} + toll112 = {"expression": "mf112*100", "result": "mf112", "type": "MATRIX_CALCULATION"} + toll113 = {"expression": "mf113*100", "result": "mf113", "type": "MATRIX_CALCULATION"} + toll114 = {"expression": "mf114*100", "result": "mf114", "type": "MATRIX_CALCULATION"} + toll115 = {"expression": "mf115*100", "result": "mf115", "type": "MATRIX_CALCULATION"} + toll116 = {"expression": "mf116*100", "result": "mf116", "type": "MATRIX_CALCULATION"} + toll117 = {"expression": "mf117*100", "result": "mf117", "type": "MATRIX_CALCULATION"} + toll118 = {"expression": "mf118*100", "result": "mf118", "type": "MATRIX_CALCULATION"} + toll119 = {"expression": "mf119*100", "result": "mf119", "type": "MATRIX_CALCULATION"} + toll120 = {"expression": "mf120*100", "result": "mf120", "type": "MATRIX_CALCULATION"} + toll121 = {"expression": "mf121*100", "result": "mf121", "type": "MATRIX_CALCULATION"} + toll122 = {"expression": "mf122*100", "result": "mf122", "type": "MATRIX_CALCULATION"} + matrix_calculation([toll111, toll112, toll113, toll114, toll115, toll116, toll117, toll118, toll119, toll120, toll121, toll122]) + +if __name__ == '__main__': main() \ No newline at end of file diff --git a/Database/prep_macros/initialize_scenarios.py b/Database/prep_macros/initialize_scenarios.py index 86424e0..d01be1b 100644 --- a/Database/prep_macros/initialize_scenarios.py +++ b/Database/prep_macros/initialize_scenarios.py @@ -51,26 +51,14 @@ #set path to batchin files with open(os.path.join(db, 'batch_file.yaml')) as f: lines_without_backslashes = ''.join([line.replace('\\','/') for line in f]) - batch_config = yaml.safe_load(lines_without_backslashes) - -# find and read config file -config_file = Path(__file__).resolve().parents[2].joinpath('Scripts','prepare', - 'conformity_scenario', - 'hand','config.yaml') -with open(config_file) as f: - config = yaml.safe_load(f) - -scen_code = batch_config['scenario_code'] -batchin_path = batch_config['transactionFilePath'] # e.g., M:/catslib/modelprod/c24q2 -real_year = config['scenario_years'][scen_code] + config = yaml.safe_load(lines_without_backslashes) +scen_yr = config['scenario_code'] # e.g., '200' +batchin_path = config['transactionFilePath'] # e.g., M:/catslib/modelprod/c24q2 hwy_batchin_dir = os.path.join(batchin_path, 'highway') trn_batchin_dir = os.path.join(batchin_path, 'transit') -link_shape_dir = os.path.join(batchin_path, 'linkshape') -link_shape_file = os.path.join(link_shape_dir, "linkshape_%s.in" %(str(scen_code))) print('highway transaction file location: ', hwy_batchin_dir) print('transit transaction file location: ', trn_batchin_dir) -print('link shape transaction file: ', link_shape_file) ## ## EMME SETUP ##### @@ -97,7 +85,6 @@ process_vehicle_transaction = modeller.tool("inro.emme.data.network.transit.vehicle_transaction") process_network_transaction = modeller.tool("inro.emme.data.network.base.base_network_transaction") process_transit_line_transaction = modeller.tool("inro.emme.data.network.transit.transit_line_transaction") -process_link_shape_transaction = modeller.tool("inro.emme.data.network.base.link_shape_transaction") create_extra = modeller.tool("inro.emme.data.extra_attribute.create_extra_attribute") import_attribute_values = modeller.tool("inro.emme.data.network.import_attribute_values") net_calc = modeller.tool("inro.emme.network_calculation.network_calculator") @@ -115,7 +102,7 @@ ## print('create base daily network - all links... ') -base_scen = int(f'{scen_code}00') +base_scen = int(f'{scen_yr}00') create_scenario( scenario_id = base_scen, @@ -188,7 +175,7 @@ print('creating tod highway scenarios...') for bscen in batchin_scens: - scen = int(f'{scen_code}{bscen[0]}') + scen = int(f'{scen_yr}{bscen[0]}') tod = int(bscen[0][-1]) print(' building scenario ', scen) # print(' building scenario ', scen, '\n - tod: ', tod, '\n - title: ', bscen[1]) @@ -198,17 +185,15 @@ from_scenario = emmebank.scenario(base_scen), scenario_id = scen, scenario_title = bscen[1], - overwrite=True, - set_as_primary=True + overwrite=True ) - print(" from: {0}, to: {1}".format(base_scen, scen)) - else: - change_primary_scenario(emmebank.scenario(base_scen)) + + change_primary_scenario(emmebank.scenario(scen)) print(' -- l1, n1...') #n1, l1 batchin - l1_batchin = os.path.join(hwy_batchin_dir, str(scen_code), f'{scen}.l1') - n1_batchin = os.path.join(hwy_batchin_dir, str(scen_code), f'{scen}.n1') + l1_batchin = os.path.join(hwy_batchin_dir, str(scen_yr), f'{scen}.l1') + n1_batchin = os.path.join(hwy_batchin_dir, str(scen_yr), f'{scen}.n1') process_network_transaction( transaction_file = n1_batchin @@ -223,7 +208,7 @@ print(' -- l2, n2...') #n2 batchin (extra attributes) - n2_batchin = os.path.join(hwy_batchin_dir, str(scen_code), f'{scen}.n2') + n2_batchin = os.path.join(hwy_batchin_dir, str(scen_yr), f'{scen}.n2') n2_columns = {0: 'i_node', 1:'@zone', 2:'@atype', 3:'@imarea'} import_attribute_values( @@ -233,7 +218,7 @@ ) #l2 batchin (extra attributes) - l2_batchin = os.path.join(hwy_batchin_dir, str(scen_code), f'{scen}.l2') + l2_batchin = os.path.join(hwy_batchin_dir, str(scen_yr), f'{scen}.l2') l2_columns = {0: 'i_node', 1:'j_node', 2: '@speed', 3:'@width', 4:'@parkl', 6:'@toll', 7:'@sigic', 9: '@tipid'} import_attribute_values( @@ -241,8 +226,6 @@ column_labels=l2_columns, # scenario = emmebank.scenario(scen) ) - - process_link_shape_transaction(transaction_file = link_shape_file, revert_on_error = False) print(' -- other link calculations...') @@ -401,12 +384,23 @@ ## BUILD TRANSIT ASSIGNMENT SCENARIO NETWORKS ####################### +scen_yr = str(scen_yr) #just to ensure it works here - convert to string +scen3_yr4 = { + '100': 2019, + '200': 2025, + '300': 2030, + '400': 2035, + '500': 2040, + '600': 2045, + '700': 2050 +} + network_batchin_list = [ #[{transit asmt scenario number}, {transaction file time-of-day suffix}, {name of scenario}] - [int(scen_code)+21, 1, f'{real_year} Night (6pm-6am)'], - [int(scen_code)+23, 2, f'{real_year} AM (6am-9am)'], - [int(scen_code)+25, 3, f'{real_year} Midday (9am-4pm)'], - [int(scen_code)+27, 4, f'{real_year} PM (4pm-6pm)'] + [int(scen_yr)+21, 1, f'{scen3_yr4[scen_yr]} Night (6pm-6am)'], + [int(scen_yr)+23, 2, f'{scen3_yr4[scen_yr]} AM (6am-9am)'], + [int(scen_yr)+25, 3, f'{scen3_yr4[scen_yr]} Midday (9am-4pm)'], + [int(scen_yr)+27, 4, f'{scen3_yr4[scen_yr]} PM (4pm-6pm)'] ] for asmt_scen in network_batchin_list: @@ -430,7 +424,7 @@ #build transit network transit_modes = os.path.join(trn_batchin_dir, 'tranmodes.txt') transit_vehicles = os.path.join(trn_batchin_dir, 'transveh.txt') - transit_transaction = os.path.join(trn_batchin_dir, str(scen_code)) + transit_transaction = os.path.join(trn_batchin_dir, str(scen_yr)) print(' - import modes and vehicles') #import modes and vehicles @@ -445,8 +439,6 @@ #import lines process_transit_line_transaction(os.path.join(transit_transaction, f'rail.itinerary_{asmt_scen[1]}')) process_transit_line_transaction(os.path.join(transit_transaction, f'bus.itinerary_{asmt_scen[1]}')) - - process_link_shape_transaction(transaction_file = link_shape_file, revert_on_error = False) print(' - create and calculate extra attributes') #create extra attributes @@ -456,7 +448,7 @@ ['@pspac', 'NODE', 'off-street parking spaces at station'], ['@zone', 'NODE', 'CMAP zone'], ['@ltime', 'TRANSIT_SEGMENT', 'line service time in minutes'], - ['@hwytm', 'TRANSIT_SEGMENT', f'AM peak congested hwy time from scen {scen_code}'], + ['@hwytm', 'TRANSIT_SEGMENT', f'AM peak congested hwy time from scen {scen_yr}'], ['@zfare_link', 'TRANSIT_SEGMENT', 'incremental zone fare'], ['@timbo', 'NODE', 'Base boarding time by station type, min'], ['@easeb', 'TRANSIT_LINE', 'Ease of boarding 1=worst, 4=best'] @@ -795,16 +787,16 @@ ## Create transit skim scenarios ## today = str(date.today().strftime('%Y%m%d')) copy_scenario( - from_scenario = emmebank.scenario(int(scen_code)+23), - scenario_id = int(scen_code)+3, - scenario_title = f'{real_year} am (6am-9am) transit skim network - {today}', + from_scenario = emmebank.scenario(int(scen_yr)+23), + scenario_id = int(scen_yr)+0, + scenario_title = f'{scen3_yr4[scen_yr]} am (6am-9am) transit skim network - {today}', copy_linkshapes=True, overwrite=True ) copy_scenario( - from_scenario = emmebank.scenario(int(scen_code)+25), - scenario_id = int(scen_code)+5, - scenario_title = f'{real_year} midday (9am-4pm) transit skim network - {today}', + from_scenario = emmebank.scenario(int(scen_yr)+25), + scenario_id = int(scen_yr)+5, + scenario_title = f'{scen3_yr4[scen_yr]} midday (9am-4pm) transit skim network - {today}', copy_linkshapes=True, overwrite=True ) diff --git a/Database/prep_macros/preload_congested_times_mac.py b/Database/prep_macros/preload_congested_times_mac.py index 784bc67..078f703 100644 --- a/Database/prep_macros/preload_congested_times_mac.py +++ b/Database/prep_macros/preload_congested_times_mac.py @@ -1,110 +1,110 @@ -#filename: free.skim.mac.py -#description: creates time and distance skims from am-peak and midday scenarios to start distribution and mode choice -#author: Karly Cazzato, 12/29/2023 - -from asyncio.windows_events import NULL -import os -import os.path -import sys -import inro.emme.desktop.app as _app -import inro.modeller as _m - - -def main(): - - #set variables - currentScen = int(sys.argv[2]) - cScenAM = currentScen + 3 - cScenMD = currentScen + 5 - directory1 = os.getcwd() - directory = os.getcwd().replace('\\Database','') - - # Define the path to the Emme project (.emp file) - empFl = sys.argv[1] - empFile = os.path.join(directory,empFl) - desktop = _app.start_dedicated( - visible=True, - user_initials='KCC', - project= empFile - ) - - # Connect to the Modeller - modeller = _m.Modeller(desktop=desktop) - eb = _m.Modeller().emmebank - - #define tools - batchin_data = modeller.tool("inro.emme.data.network_field.import_network_fields") - change_scenario = modeller.tool("inro.emme.data.scenario.change_primary_scenario") - process_mat = modeller.tool("inro.emme.data.matrix.matrix_transaction") - net_calc = modeller.tool("inro.emme.network_calculation.network_calculator") - delete_mat = modeller.tool("inro.emme.data.matrix.delete_matrix") - - #delete report\iter_0\preload_times.rpt if it exists - if os.path.isfile("report\\iter_0\\preload_times.rpt"): os.remove("report\\iter_0\\preload_times.rpt") - - hwytm_spec = { - "result": "@hwytm", - "expression": "ul2", - "selections": { - "link": "all", - "transit_line": "all" - }, - "type": "NETWORK_CALCULATION" - } - ul2_spec = { - "result": "ul2", - "expression": "0", - "selections": { - "link": "all", - }, - "type": "NETWORK_CALCULATION" - } - #set scenario to transit AM _00, batchin and store per3_timau.txt - change_scenario(scenario = str(cScenAM)) - batchin = directory1 + "\\defaults_base_year\\per3_timau.txt" - batchin_data(batchin, - column_labels = { - 0 : 'i_node', - 1: 'j_node', - 2: 'ul2' - }, - revert_on_error=False) - - #add net calc to store ul2 in @hwytm - net_calc(hwytm_spec) - #add net calc to make all ul2 back to 0 - net_calc(ul2_spec) - - #set scenario to transit MD _00, batchin and store per5_timau.txt - change_scenario(scenario = str(cScenMD)) - batchin = directory1 + "\\defaults_base_year\\per5_timau.txt" - batchin_data(batchin, - column_labels = { - 0: 'i_node', - 1: 'j_node', - 2: 'ul2' - }, - revert_on_error = False) - #add net calc to store ul2 in @hwytm - net_calc(hwytm_spec) - #add net calc to make all ul2 back to 0 - net_calc(ul2_spec) - - #change to scenario 10000 - scen_00 = str(currentScen) + str(0) + str(0) - - change_scenario(scenario = str(scen_00)) - - matpairs = (44, 45, 46, 47, 76, 77) - for mat in matpairs: - name = "mf" + str(mat) - mfName = eb.matrix(name) - if mfName: delete_mat(matrix = mfName) - batchin = directory1 + "\\defaults_base_year\\preload_mf" + str(mat) + ".txt" - process_mat(batchin) - print("processed mf_" + str(mat)) - - - -if __name__ == '__main__': +#filename: free.skim.mac.py +#description: creates time and distance skims from am-peak and midday scenarios to start distribution and mode choice +#author: Karly Cazzato, 12/29/2023 + +from asyncio.windows_events import NULL +import os +import os.path +import sys +import inro.emme.desktop.app as _app +import inro.modeller as _m + + +def main(): + + #set variables + currentScen = int(sys.argv[2]) + scenario = str(currentScen) + cScenMD = currentScen + 5 + directory1 = os.getcwd() + directory = os.getcwd().replace('\\Database','') + + # Define the path to the Emme project (.emp file) + empFl = sys.argv[1] + empFile = os.path.join(directory,empFl) + desktop = _app.start_dedicated( + visible=True, + user_initials='KCC', + project= empFile + ) + + # Connect to the Modeller + modeller = _m.Modeller(desktop=desktop) + eb = _m.Modeller().emmebank + + #define tools + batchin_data = modeller.tool("inro.emme.data.network_field.import_network_fields") + change_scenario = modeller.tool("inro.emme.data.scenario.change_primary_scenario") + process_mat = modeller.tool("inro.emme.data.matrix.matrix_transaction") + net_calc = modeller.tool("inro.emme.network_calculation.network_calculator") + delete_mat = modeller.tool("inro.emme.data.matrix.delete_matrix") + + #delete report\iter_0\preload_times.rpt if it exists + if os.path.isfile("report\\iter_0\\preload_times.rpt"): os.remove("report\\iter_0\\preload_times.rpt") + + hwytm_spec = { + "result": "@hwytm", + "expression": "ul2", + "selections": { + "link": "all", + "transit_line": "all" + }, + "type": "NETWORK_CALCULATION" + } + ul2_spec = { + "result": "ul2", + "expression": "0", + "selections": { + "link": "all", + }, + "type": "NETWORK_CALCULATION" + } + #set scenario to transit AM _00, batchin and store per3_timau.txt + change_scenario(scenario = str(scenario)) + batchin = directory1 + "\\defaults_base_year\\per3_timau.txt" + batchin_data(batchin, + column_labels = { + 0 : 'i_node', + 1: 'j_node', + 2: 'ul2' + }, + revert_on_error=False) + + #add net calc to store ul2 in @hwytm + net_calc(hwytm_spec) + #add net calc to make all ul2 back to 0 + net_calc(ul2_spec) + + #set scenario to transit MD _00, batchin and store per5_timau.txt + change_scenario(scenario = str(cScenMD)) + batchin = directory1 + "\\defaults_base_year\\per5_timau.txt" + batchin_data(batchin, + column_labels = { + 0: 'i_node', + 1: 'j_node', + 2: 'ul2' + }, + revert_on_error = False) + #add net calc to store ul2 in @hwytm + net_calc(hwytm_spec) + #add net calc to make all ul2 back to 0 + net_calc(ul2_spec) + + #change to scenario 100000 + scen_00 = scenario + str(0) + str(0) + + change_scenario(scenario = str(scen_00)) + + matpairs = (44, 45, 46, 47, 76, 77) + for mat in matpairs: + name = "mf" + str(mat) + mfName = eb.matrix(name) + if mfName: delete_mat(matrix = mfName) + batchin = directory1 + "\\defaults_base_year\\preload_mf" + str(mat) + ".txt" + process_mat(batchin) + print("processed mf_" + str(mat)) + + + +if __name__ == '__main__': main() \ No newline at end of file diff --git a/Database/tg/data/m01auto.csv b/Database/tg/data/m01auto.csv index ad60e2f..b0ecdaf 100644 --- a/Database/tg/data/m01auto.csv +++ b/Database/tg/data/m01auto.csv @@ -1,3633 +1,3633 @@ zone17,zwkrauto,zveh,z_veh_occ -1,660.9874477002464,624.8866602687357,1.0577717364233465 -2,1600.9965988820513,1499.8219729541754,1.0674577568220274 -3,2177.5238452020517,2011.1872413128538,1.0827056777570931 -4,2593.6289164646673,2335.4890466821785,1.1105292573087444 -5,4576.805634798305,4235.894968359385,1.0804813785481935 -6,10247.779746744407,9336.35625940083,1.0976208985626335 -7,9245.63173524657,8489.381552436722,1.0890818934381363 -8,398.1361967008224,379.5768040229973,1.0488949600742743 -9,1299.0328658752067,1220.9175347222201,1.0639808414011838 -10,2179.504054017697,2013.3087588226108,1.082548339625899 -11,2619.509241828243,2359.0403985471335,1.1104130490692423 -12,3066.6570366075894,2870.4932217301675,1.0683380171018784 -13,2505.6133083909717,2342.576748672161,1.0695971049022084 -14,2471.5147480430096,2257.1650846985,1.09496410554886 -15,2378.451338771252,2179.8802345655195,1.0910926669534715 -16,4610.33782663054,4228.246108404901,1.0903664801975737 -17,5147.85466010726,4690.281625718401,1.0975576886214744 -18,4485.87087577747,4121.052758021174,1.0885254664712114 -19,5160.377806572046,4713.452981692858,1.0948189844292608 -20,2442.058878840008,2230.7802474714026,1.0947106428829512 -21,2935.7722017162528,2682.51733491149,1.0944094054896831 -22,7411.855430751148,6777.554503488468,1.0935884657122563 -23,7403.3367080188245,6769.815241611219,1.0935803184869233 -24,4812.761156399375,4405.634737443494,1.0924103887904537 -25,4670.681439637949,4231.885263632466,1.1036881079400622 -26,3416.4773320733184,3192.6992247424473,1.070090569633575 -27,3940.5735779855395,3662.8654860504967,1.0758171690968874 -28,7541.836094999198,6896.411521757579,1.0935884657122563 -29,7553.7498308703125,6907.328665883998,1.0935848279782971 -30,1849.2822426985708,1703.236267062959,1.0857461636179528 -31,4825.2276270709435,4431.723237461409,1.0887926363007594 -32,1750.9777369098015,1644.079717686261,1.065019973224887 -33,1764.3058668724373,1654.7665568276745,1.0661962314821969 -34,6792.603154038064,6213.82629954773,1.0931433913002138 -35,7319.295998538335,6692.9162367959525,1.0935884657122565 -36,1663.1305706000774,1533.0374834240106,1.084859691026932 -37,833.1024159169755,791.8872525063748,1.052046757010107 -38,803.2605171714522,763.5216893347025,1.052046757010107 -39,940.9393360062497,859.092617221908,1.0952711234430272 -40,962.9070641440055,863.7085647537162,1.1148518185860243 -41,813.1182854829831,754.6931262732942,1.0774157828867406 -42,2131.3162020594173,1978.9375375988113,1.0770002395555638 -43,759.1127507747493,721.5579970344003,1.052046757010107 -44,722.7821028394055,687.0246954551105,1.052046757010107 -45,726.7434866567228,668.0219875169994,1.0879035424537267 -46,676.9226785205699,604.208469951204,1.1203462251617198 -47,554.4798436477629,516.1121895460261,1.074339755733119 -48,1339.3046455952883,1260.3662700552795,1.0626312980722235 -49,3270.5704849018966,3071.3960919482593,1.0648481625264088 -50,2563.1149850685133,2447.466555243368,1.047252302417528 -51,2216.6997964209127,1974.1460002615026,1.1228651761963302 -52,761.4355475823072,728.228993589083,1.0455990550850844 -53,1333.4536345894157,1292.108951198331,1.0319978306417124 -54,2336.5014000262695,2205.876480972124,1.0592167876038912 -55,2319.9504464758966,2171.1565826318433,1.068532074118619 -56,3970.761575007212,3610.656007555382,1.0997341111139638 -57,8214.072976520627,7588.69703766549,1.0824088688415372 -58,1338.799302676619,1226.9540679469428,1.091156822941894 -59,2225.206901220152,2059.228676575924,1.0806021334746638 -60,5298.408550378703,4922.427466289286,1.0763812339875565 -61,5330.1709338606715,4950.779183980878,1.0766327351273075 -62,3922.1170208250282,3666.632050235669,1.0696783770743885 -63,3802.7152692506293,3551.3536044513494,1.070779114894168 -64,1214.003134308817,1117.9313208143253,1.0859371337986226 -65,2030.3417143913819,1905.744401270567,1.0653798657562605 -66,1514.5439900490567,1454.8407309099061,1.041037659910587 -67,1935.441475448105,1858.5378520391935,1.041378561821882 -68,3057.8446076761584,2906.496632627767,1.0520723035937452 -69,1730.8963924497941,1644.7385912208879,1.0523838874388856 -70,1356.9532443794494,1229.8199864368771,1.1033755015731301 -71,965.0371477458056,905.8178938911315,1.0653765555461543 -72,1185.4021972900846,1079.3714533200584,1.0982337856387476 -73,1002.9983861990063,947.4650373875503,1.0586125573188203 -74,1116.6620158708936,1046.5273550487218,1.0670165576502362 -75,1386.9155240923674,1274.929090597955,1.0878373819534461 -76,1695.5462852845412,1606.8997509310673,1.0551661883711854 -77,935.9742925481413,878.5384732521393,1.0653765555461543 -78,650.3056730286855,624.4686633585904,1.0413743894387517 -79,1592.5346151222193,1476.1730839330146,1.078826482108168 -80,2022.054846474856,1792.5821604222494,1.128012367365384 -81,1533.1584394153697,1455.9931597028979,1.0529983806573773 -82,1211.6283759252801,1154.7323926717643,1.0492720076223658 -83,1147.742205473262,1002.020429841788,1.145427948664163 -84,1110.780605534009,1022.7747487507539,1.0860461767273273 -85,1422.0362109661753,1245.0899874708805,1.1421152087607107 -86,1631.297036813201,1545.3380024728344,1.0556247463032784 -87,1991.2368458070723,1919.6938687471393,1.0372679093394326 -88,807.8863567910877,744.6875007365123,1.0848662774547313 -89,1297.6363423190294,1241.2047925663326,1.0454651400725081 -90,1792.7605912957633,1676.2103507697755,1.0695319895098272 -91,1994.9820070803669,1892.5037773911095,1.0541495509353898 -92,2020.6713678798521,1808.3882548640324,1.1173880180015772 -93,886.5350245917059,834.9445584211072,1.0617890920424191 -94,1439.0297008463708,1362.219736369453,1.05638588432262 -95,1812.3625332584338,1759.7094209236222,1.0299214811881698 -96,2226.972512116245,2079.0442683086576,1.0711520413790563 -97,3799.6721269440377,3567.1136198815016,1.0651951498730958 -98,855.569237567565,796.8315661052761,1.0737140368941265 -99,8515.01507350408,8067.704370039371,1.0554446076539277 -100,9155.43093170757,8758.534587133148,1.0453153824565 -101,11149.103485782258,10660.150844550235,1.0458673285549227 -102,1564.4769281195752,1503.4700728457854,1.0405773659054718 -103,1508.7617839384477,1449.9252395226235,1.0405790193949556 -104,629.2100417372325,589.3772133469112,1.0675846087841123 -105,723.1675074746031,692.6748641824577,1.0440215819410958 -106,898.3629419497506,819.8559954884977,1.0957569950006596 -107,1069.995485512972,1007.8859298281153,1.0616235963284544 -108,986.6545776813324,928.3210343114641,1.0628376835316828 -109,731.2989402215853,685.9504588919435,1.066110432235727 -110,944.66811817823,845.8637343748833,1.1168088662370257 -111,1300.1953807598745,1169.7611583121227,1.111505003838526 -112,1539.9699737946414,1479.3861782237,1.0409519816142154 -113,882.1358483842946,840.3248638163585,1.0497557389627272 -114,885.1124030527577,807.5195338195784,1.0960879161228012 -115,1065.8943678526934,1004.1492041500733,1.0614900290190263 -116,371.4263450492747,355.18721427329683,1.045719919308477 -117,381.75579018746896,353.0320714604787,1.081362915862464 -118,711.7511568900239,668.1970094166039,1.0651815959359752 -119,447.9949139056055,412.99199266397227,1.0847544791748858 -120,1768.2632715798984,1609.6270940773447,1.098554614349037 -121,517.7020322842686,482.749440701732,1.0724031736457924 -122,4520.2062976761745,4315.170536323313,1.0475151004176904 -123,3605.2388941223976,3415.43553784555,1.0555722261988805 -124,4010.5738537490297,3778.446556953763,1.0614345851651825 -125,11780.673018403126,11220.112001901043,1.0499603761893914 -126,7439.762376491827,7097.894401261345,1.0481647029251 -127,5662.021608012371,5428.86982175703,1.04294665260179 -128,4955.66664209299,4759.8548575557425,1.0411381839146665 -129,3177.3554824801977,3024.487735307124,1.0505433516520941 -130,4137.581707488197,3939.308431919155,1.0503320009071864 -131,391.13048746891786,377.9495820927709,1.0348747716644162 -132,3747.1383540280012,3605.70259749564,1.039225574685665 -133,2141.901667658892,2055.6161597122673,1.0419754960277714 -134,343.1374044200349,315.117768399022,1.0889179818814045 -135,2260.34661197004,2177.6216754869506,1.0379886632348987 -136,195.39776050593687,189.59701060631738,1.030595154855391 -137,1233.9722236941177,1170.8065745904048,1.0539505418525779 -138,587.4983527631875,570.1489377259772,1.030429619156019 -139,1788.18871860277,1697.481550929971,1.053436320190405 -140,365.5161674751306,355.43069725391763,1.0283753493976013 -141,211.6032532994384,198.96721748107575,1.0635081295217113 -142,440.1868045765366,413.6309641562433,1.0642017709541256 -143,481.3660955140739,442.18313521900836,1.0886125163404494 -144,654.2628612989893,605.8971999519092,1.0798248636087424 -145,484.06897958875624,452.89553350671486,1.0688314275052995 -146,371.0540875736111,343.8745256016064,1.0790391842037563 -147,927.116887974283,866.5046727183415,1.0699502462759871 -148,871.8209749438853,806.2523745307868,1.0813251563460602 -149,465.1864499911505,420.74556965572293,1.105624119516675 -150,1292.193288590304,1213.1741408926043,1.0651342169554987 -151,1435.680347064488,1357.1694170377832,1.0578490268356224 -152,1010.3363727802443,963.4901286465522,1.0486214053894862 -153,214.04511280990823,206.4011120085236,1.0370346880741077 -154,792.050922435694,740.6815681440853,1.0693541685130954 -155,776.5792745303107,725.5669138924621,1.0703069002473964 -156,122.84809019607775,120.66956147307866,1.018053672329663 -157,287.88854603011805,272.2380452553359,1.0574882939675214 -158,324.6169187335406,308.9472185165232,1.0507196675608825 -159,505.34658167796925,472.33474623484744,1.069890762232233 -160,383.91467872690754,364.4215427350932,1.0534906247460358 -161,498.80649709037385,437.15060120959913,1.1410404005168295 -162,504.88634875069505,442.5285001601288,1.140912615951294 -163,935.2292686703029,900.9604070042526,1.0380359241090253 -164,512.5055767798042,493.9477407133874,1.0375704442733447 -165,612.080549570175,588.7943381277097,1.0395489731041103 -166,929.402859874816,859.4005941578985,1.0814547560157446 -167,452.75837915970635,406.1273942134474,1.1148186150716817 -168,430.1961006047303,385.3108725110058,1.1164909461319248 -169,653.8952885319858,591.0171835788218,1.1063896392528123 -170,381.04647875238487,333.46962929143587,1.1426722114455863 -171,2007.093452354803,1916.8391096286034,1.0470849860443878 -172,375.35903667831326,343.66477420756064,1.092224355969665 -173,349.9959239266513,332.2250993150805,1.053490313188881 -174,541.7682244343282,401.5110261959478,1.349323403561852 -175,1133.6882628027113,1051.827956304563,1.0778267073122414 -176,303.02575885871255,289.8779429531899,1.04535638611057 -177,985.5221028191506,899.8307196827791,1.0952305597730434 -178,747.7187961878197,714.733193814328,1.0461509310872452 -179,299.29383796505977,267.80061356679914,1.1175995229391253 -180,385.517605983923,359.9197743757929,1.0711209370269368 -181,460.843040371853,439.87586386322556,1.0476661218110093 -182,351.766527975549,323.2455754568987,1.088233079380396 -183,451.3881236532409,409.25324931759747,1.1029555034832357 -184,356.65864488119655,325.77526746552365,1.0947996379711091 -185,305.0519558857232,280.0029970898018,1.0894596095622782 -186,342.4969408190382,313.6938508389157,1.0918191093102207 -187,445.7201918152273,418.4739086939967,1.0651086783552712 -188,452.0525349354793,410.1607743327575,1.1021349754151175 -189,289.71935711765,274.399344031944,1.0558310849457517 -190,420.90827436348553,390.6817023021066,1.0773687937860097 -191,314.1858856814529,287.330692891244,1.0934644068824688 -192,311.08235908162686,284.89120914138107,1.0919338649275347 -193,298.4750087040794,275.1433964282403,1.084798009251602 -194,486.7790447449508,428.7992554199312,1.135214295715693 -195,651.4353358754664,585.4104640845777,1.1127838941077584 -196,651.6228412624503,584.6935081455408,1.1144690888208897 -197,669.5338381484053,601.5913702338138,1.11293790316205 -198,454.7060969220172,365.5143764929601,1.2440169967726973 -199,612.1734600274835,557.9405071490711,1.09720203531292 -200,1048.3778807634567,894.3159298976883,1.172267926484764 -201,1101.1995968730714,1005.1386823189418,1.0955698116527648 -202,572.1374243348503,564.9529869200697,1.01271687659171 -203,938.488239272157,886.0022327824759,1.0592391356902675 -204,239.08408684279604,224.58416978271399,1.0645633976522513 -205,528.4097363407409,476.1041261432023,1.109861703197687 -206,1029.9232058648063,970.5013414690943,1.0612280085113146 -207,108.50388643969518,100.600544215358,1.0785616249492478 -208,500.85385645068817,460.9100110592474,1.0866630023931205 -209,334.8559887012539,288.8872415976576,1.1591234934757642 -210,745.6040048074641,714.2482334575412,1.043900383481714 -211,407.0352536320223,391.53494546708134,1.0395885688988753 -212,421.1410549893627,374.5659745551853,1.124344130535315 -213,1060.8815172956515,929.2503860089303,1.141653028364151 -214,448.1647713421873,397.14710329170987,1.1284603806187257 -215,1018.8143060303275,969.0962403590216,1.0513035378745117 -216,1018.4817179166938,968.8437311756817,1.0512342549616096 -217,628.0324267919692,579.4166690034637,1.083904658580361 -218,691.5037129330145,649.7668361334439,1.0642336211677614 -219,2057.949011771204,1948.7178156748778,1.0560528544552241 -220,1139.1309285818188,1096.8955584879157,1.038504459031747 -221,872.8461628271302,829.2077710056626,1.0526266074044905 -222,945.3937775749339,825.1625585309648,1.1457061009384824 -223,1153.3820246443277,1037.6035492496896,1.1115825745568813 -224,1284.1857405928295,1173.641271318745,1.094189316595754 -225,1265.6431728028542,1191.2390011449095,1.0624594825945375 -226,351.35786362028904,330.2453823917906,1.063929678821221 -227,364.0470846931991,342.21000328773613,1.063811931842045 -228,746.065707360836,690.5415627810871,1.0804066656844389 -229,735.8428914011022,681.0146480682711,1.080509638799039 -230,573.6636711908103,445.65235128631895,1.2872447986305984 -231,855.0480651482706,806.4688397499353,1.060236952754924 -232,825.9074766119481,777.7569811833349,1.0619094352008949 -233,884.1129358956242,840.0602990242071,1.052439850951875 -234,637.4957884813215,565.8542197075482,1.126607819255638 -235,509.14770285702315,473.83513168656,1.0745250168445135 -236,635.1978193297534,588.331581859306,1.0796595642925304 -237,803.4935859041539,620.9029445265621,1.2940727580488718 -238,619.7210073049968,564.0851349546269,1.098630275649517 -239,455.1421265203198,420.80656661375576,1.081594639035373 -240,468.82726197809234,447.39778667442783,1.0478980360250614 -241,472.3567697567566,420.29801664923724,1.1238615245500085 -242,576.698532428225,565.5971671428929,1.0196276889812064 -243,450.6210251092992,427.4311666069826,1.0542540186912468 -244,505.3813245151343,495.5935433574656,1.0197496139504967 -245,395.10712268302603,374.69356585524724,1.0544806708414765 -246,325.9169158230024,319.10734217010753,1.0213394452367845 -247,1210.3152953067784,1104.148250921188,1.0961528891586936 -248,433.64463760941135,421.9816590795173,1.027638591106862 -249,262.67999206763795,256.51825429908973,1.0240206599931243 -250,542.7376736256194,494.6379596777542,1.0972422617528204 -251,245.85009647507448,231.20814846334687,1.0633279930185886 -252,395.204308192566,360.62058478116626,1.0959005804740347 -253,469.81104309459874,410.5479941202725,1.1443510864090711 -254,727.8855300832219,603.2791271420585,1.2065485068768529 -255,746.3928909902921,706.1399693550582,1.057004168269923 -256,658.527721110181,620.6048879942123,1.0611062430373934 -257,1015.9256968873975,957.9893662206573,1.0604770081063672 -258,292.2255047547188,278.8117889348048,1.0481102892785161 -259,896.3582506204853,862.0962634497312,1.039742646643256 -260,893.9640006962309,860.6219344577755,1.0387418271641684 -261,696.9526984324328,580.6849861610725,1.200225104905863 -262,1844.1799395114865,1725.5571558613133,1.06874462734963 -263,1881.5272370555617,1783.1018785983933,1.0551989539344413 -264,426.7581851542223,351.30317413064813,1.2147860212487371 -265,1108.1807927809937,1083.8528562675808,1.0224457926855404 -266,657.8392317495063,621.9389094724856,1.0577232292918777 -267,479.581656888716,454.05746543281896,1.0562135707460878 -268,444.7243831908688,430.8160139989018,1.032283779479011 -269,862.2380699461003,824.8168274411947,1.0453691550171162 -270,1671.5820696539436,1561.6785925934062,1.0703752216248452 -271,1593.3094851620397,1488.8671423250328,1.0701488667913703 -272,828.1668710844359,745.820213075127,1.1104108692224652 -273,965.1724880499529,848.1693685161727,1.1379478249001977 -274,544.7394096684159,484.4260036816415,1.1245048893502663 -275,453.83845267667346,425.93058545156634,1.0655221019066277 -276,814.4074464140309,734.8702798530089,1.108232934085906 -277,1008.1043539684329,866.8726455993188,1.1629209424084115 -278,601.6630487097033,586.3777903236828,1.0260672532934492 -279,405.36056563272086,354.96057602360645,1.14198756992597 -280,808.047211421263,770.9094835395248,1.048173914933859 -281,459.6150020577587,425.3695024637366,1.0805076513376546 -282,1007.1622702419287,942.7238192503822,1.068353477100839 -283,1042.7950435138318,1012.7364113271212,1.0296806077578675 -284,580.8455367046848,547.9288430622923,1.0600747598144789 -285,303.6860379464303,286.84600426758624,1.0587075762893832 -286,349.1168231303067,329.7640411682159,1.058686756425995 -287,494.55120523279317,470.08091573707475,1.052055483803995 -288,303.20276654176496,284.94512410895294,1.064074240574936 -289,161.0646221201953,151.65521762262262,1.0620447132982063 -290,159.43003752048105,150.00875255488273,1.0628049017483256 -291,664.8602934635467,559.3973012754981,1.1885296763991877 -292,437.73757371767783,428.6988790997756,1.0210840173804108 -293,420.1394425034233,400.277410160027,1.0496206676650968 -294,173.78879065665885,163.66473388788964,1.061858511166518 -295,1488.187610151785,1325.6028591923107,1.1226496682864258 -296,600.9306697576484,578.6294490645433,1.0385414546894545 -297,679.8469282889496,646.8948515378275,1.0509388452741382 -298,555.7100272613819,526.2555595578483,1.0559698936544837 -299,950.7203177772922,911.7213280041775,1.0427751206155134 -300,613.5255813615199,554.575136529999,1.106298391234011 -301,584.5961837097396,564.3879820276402,1.0358055138054123 -302,483.607331703794,423.6474591941855,1.1415324728340337 -303,497.2909761245954,440.5934936180714,1.1286843390285564 -304,1241.1993817650389,1081.1521182492502,1.1480339915302198 -305,471.427651248313,423.8805966990294,1.112170868210426 -306,906.8142391769213,804.438157349709,1.1272640797702824 -307,694.6700045460116,663.394743182968,1.047144270714273 -308,581.2023553167763,536.3385508191012,1.0836482934690388 -309,999.8731404386514,929.8741195687003,1.075277953646477 -310,576.5842199940929,531.5783450763531,1.084664613099082 -311,738.5179043536491,655.8461702395703,1.126053544055735 -312,765.6852975625422,722.1297606971634,1.0603153882251428 -313,867.8977701164027,820.8651223773626,1.0572964381807644 -314,571.0893533979245,526.9886423896791,1.0836843671018537 -315,397.2140761344623,350.6543789818407,1.1327794544811112 -316,1067.0727513934148,959.3932074239148,1.112237133988714 -317,795.0374549744429,725.010888083695,1.0965869175783522 -318,269.1097565827872,245.04382476709145,1.0982107255245868 -319,1428.3910331153156,1309.4039850709387,1.0908711516086693 -320,806.4867814201144,712.803474030664,1.131429364197263 -321,1109.7455831838924,989.7418997310183,1.1212474519725673 -322,285.0771135862483,279.3518071175256,1.020494968433528 -323,788.1700587012592,773.7313568603697,1.0186611305240085 -324,1346.219739350336,1219.566415075051,1.1038511086478968 -325,1998.0132478292014,1850.5400365547923,1.0796919863182017 -326,1556.8414347336136,1438.3387118759626,1.0823886069944493 -327,1077.1240989609648,986.9806695678996,1.0913325176191446 -328,926.4687274563241,866.9406884550734,1.068664488579181 -329,1305.6160498672843,1120.915971292816,1.1647760254155743 -330,1216.4172511254728,1108.1731062632018,1.097678010998908 -331,982.2015238365921,742.4290491085067,1.3229567525893542 -332,1044.668386602361,999.485743292742,1.0452058907421407 -333,1013.3146432251377,987.6230314687921,1.0260135810301396 -334,1171.3602589751686,1082.54869949579,1.0820393202825365 -335,785.7918120159267,742.5514880366129,1.0582320885163747 -336,1033.7605117973283,988.6131556508989,1.0456673633042082 -337,2122.378946050979,1957.5762449012996,1.084187117400369 -338,1517.9951019524376,1301.016998372939,1.1667757637685388 -339,1120.2102393889259,1106.9321793232427,1.0119953691054506 -340,792.2252713317145,761.1574082528862,1.0408166073692162 -341,1184.491117755064,1044.7577247439344,1.1337471738200142 -342,615.902772378719,598.8608133550644,1.0284572953240647 -343,1737.452110123338,1619.7402171586668,1.0726733162007671 -344,1058.1412071604805,996.163774775746,1.0622161073852405 -345,807.3401971846574,759.2188626229765,1.0633826909877206 -346,1193.9324826471354,1110.0405176625716,1.075575588142689 -347,1444.4765098039368,1405.3344246345523,1.027852505768912 -348,3201.506009131552,2994.7206782501653,1.0690499559385327 -349,569.4961091862584,526.8660484755011,1.0809125219476723 -350,1655.2262717266651,1518.1281991043975,1.090307309160812 -351,1317.5834731290724,1222.0248660138875,1.0781969416276174 -352,1914.5680058897053,1792.8726513621943,1.0678772998378043 -353,471.3446860980949,447.119211927869,1.0541812418790317 -354,1775.7756490720838,1607.8298674605549,1.1044549457690984 -355,1099.7611228323692,1064.7373067476701,1.0328943260114387 -356,257.25555674464397,202.03493751188626,1.273322128899161 -357,317.27996230951317,246.70876515513862,1.28605062779183 -358,612.9113091441358,588.7365523558037,1.041062095926604 -359,206.30023998266344,190.11008236287694,1.085162014652559 -360,310.9362990507455,257.86993390407594,1.2057873298498207 -361,872.637742090539,829.0338423491535,1.0525960431456325 -362,394.79519228351364,353.41119209798075,1.1170987255379832 -363,724.4803560387836,658.2033421486292,1.1006938276457252 -364,486.669672210764,438.17435730977115,1.1106758396331913 -365,726.0806449279311,674.7673623284946,1.076045887018548 -366,711.4200914440393,672.9798219608294,1.0571194978345833 -367,252.5128337639312,208.73708310900068,1.2097171714911394 -368,1308.9715322877603,1254.1580606041268,1.0437053936066318 -369,692.4847151184633,665.7406114599006,1.0401719576636848 -370,669.4710549736442,649.8584584285512,1.030179797293889 -371,701.8969627483336,693.5383458585949,1.0120521337279351 -372,208.85997289573461,208.85997289573461,1.0 -373,355.4770872448971,342.3463335182284,1.0383551755665863 -374,934.5311719132742,934.4517394231801,1.0000850043792986 -375,303.5721124315758,280.7200049554519,1.0814053400994716 -376,170.97489426143713,158.34032524816286,1.0797937543293057 -377,315.67181725373024,285.23285675185866,1.1067161786636392 -378,827.5422880788946,806.892608483694,1.0255916083232008 -379,733.4602440780619,666.543327411908,1.1003939487714665 -380,578.8775575749454,538.0675255676318,1.075845558537028 -381,361.96226385523846,346.43457708581604,1.044821411592458 -382,373.97622125745306,325.5020911425457,1.148921101995868 -383,331.04552327756494,259.0498024947924,1.2779223148962635 -384,443.5575334261658,371.34821161574735,1.1944517828596333 -385,576.7486769720102,525.4754230820554,1.0975749799852168 -386,985.9331056244325,938.9973876035085,1.0499849292879424 -387,632.9841274861946,599.1827747429442,1.0564124240015937 -388,1637.874975831905,1539.8606461079073,1.0636514284404468 -389,775.5096495110796,721.2497293158826,1.0752304201856178 -390,1016.4787783830459,943.8251917560532,1.076977799768001 -391,534.1949765230688,534.1570255951885,1.0000710482612074 -392,1181.306588642486,1082.7897628274566,1.0909842604697106 -393,1183.3737881808604,1084.699132771002,1.0909696084644056 -394,253.3618411692522,227.21393671793228,1.1150805484426793 -395,275.847045899951,267.196116579019,1.032376703043787 -396,834.1205133597847,758.7865718326598,1.099282122699107 -397,455.5179354563597,406.31421655243696,1.1210977044352883 -398,243.779809471478,193.06206834661532,1.2627017391826871 -399,145.9578848792575,144.20173199955337,1.0121784451223483 -400,756.1852173457752,744.3830810809112,1.0158549227740725 -401,800.4731470453307,756.0718109934762,1.058726347691116 -402,150.77599942680467,118.98084279389253,1.2672292100669522 -403,564.7846040749281,537.0076435700606,1.0517254471839628 -404,353.9778231532897,325.61876703305234,1.0870928183244388 -405,849.7447827559178,788.9219943714679,1.0770960739064033 -406,654.4588213285937,613.595297981251,1.0665968652005402 -407,1331.4927852924873,1264.3352268683898,1.0531168925747951 -408,562.0889664721561,517.5362550167664,1.086086165024219 -409,194.85801575102982,164.50015577258952,1.1845460865119666 -410,727.6351071541995,650.0497452336084,1.1193529610456339 -411,296.5580165180137,281.8655607953417,1.052125756978661 -412,269.59522588044024,268.9661900359872,1.0023387171613238 -413,813.8559319663902,759.6933090766554,1.0712953796520401 -414,357.6223334857362,319.25405704060216,1.1201810144585083 -415,797.7804420095451,729.2337163262343,1.0939982945778186 -416,665.8527040517467,594.3013039706436,1.1203958322202126 -417,2938.592490719571,2804.95259269009,1.047644262643781 -418,462.58285851607485,402.7319199783011,1.1486123536992014 -419,1125.5725077113234,987.1793254826583,1.1401905192463395 -420,636.4667886644748,544.1695695141939,1.1696111365298856 -421,597.6139774111778,554.6810696557219,1.0774010690180997 -422,761.6817115249329,623.1119779461554,1.2223833572185827 -423,853.4277447040772,768.9003953165214,1.1099327687986942 -424,423.9218636566557,400.82098603645727,1.0576339024775945 -425,392.50216409227386,386.15457579200057,1.0164379466105107 -426,406.19308313212093,378.0835600406031,1.074347382595792 -427,545.9329325183191,426.305763856444,1.2806135379913814 -428,1978.283931451097,1868.088000141303,1.0589886190058813 -429,971.0237680093393,867.6708683885894,1.1191153274659245 -430,679.9946420302075,633.4476336046042,1.07348201486006 -431,2341.674365318192,2223.0306123917844,1.0533702740146962 -432,2039.614342223146,1931.5111596794059,1.05596818946761 -433,437.86709779701795,416.5007088112754,1.0512997662038173 -434,450.25283167626327,428.25515562101646,1.0513658172389024 -435,621.3579608282894,582.7608805787384,1.066231419327976 -436,629.7623404390164,592.2830179922886,1.063279414246545 -437,2107.709340294671,2000.0731125927146,1.0538161465319769 -438,1318.2046879909908,1234.9710810458282,1.067397211337675 -439,602.8399346043452,550.4239026530955,1.0952284806284747 -440,369.4995599647615,343.3512226827644,1.0761562375624816 -441,477.08423719082344,474.3262980043614,1.0058144344896447 -442,462.97004760978484,422.3434905625491,1.0961931649357786 -443,568.1623479156337,550.8766702743807,1.0313784891864153 -444,436.12759871853405,372.705815578139,1.1701657996455344 -445,496.31792871916304,481.6059413049863,1.0305477697686045 -446,764.3425495833176,744.3135085762001,1.026909414885444 -447,902.9327187485856,798.2287710004958,1.131170350596176 -448,465.61084090312096,451.2087541546034,1.031918899214404 -449,704.8901180003335,623.5521811916482,1.1304428711214565 -450,846.4764823832335,767.7546520497723,1.1025351394788523 -451,517.7526504833812,482.37328264855574,1.0733443768704785 -452,1102.8351404514149,1039.3934576042316,1.0610372158714703 -453,5009.136028231875,4851.299674801677,1.0325348595243502 -454,214.78036616273113,214.63852444338207,1.0006608399853516 -455,1055.497848006371,946.1905105637738,1.1155236035684484 -456,237.47930944098744,231.4103637142357,1.0262259028910483 -457,555.9351791868214,531.4992883914405,1.0459753970119792 -458,162.75930426630234,155.65889248954906,1.0456152016964273 -459,3418.837676657973,3093.235588314585,1.1052626219526975 -460,262.3103670808626,252.0853288781299,1.0405618139232369 -461,1004.8233010078904,930.0132396526526,1.0804397810327715 -462,999.7541592013986,925.3080728464689,1.0804554596891343 -463,264.5567188985617,253.55180455941223,1.0434030211627652 -464,307.65740560296274,266.92493537693395,1.1525989700756472 -465,892.4176382697038,747.1015843442614,1.1945064191678672 -466,658.8791616767875,588.3517538763566,1.119872860641208 -467,458.00811523517535,417.6195376820188,1.096711417711278 -468,1583.596549171574,1530.0269831328242,1.035012170784768 -469,573.5608671202012,543.2212327388701,1.0558513411347372 -470,566.4884549159962,536.5308655127691,1.0558357241471956 -471,1135.8938167186247,1072.0593950171724,1.0595437361009554 -472,553.1327515102718,543.6014754514694,1.0175335728272012 -473,193.09143743382728,190.57722841221596,1.013192599360156 -474,726.5036013983344,700.8192324950429,1.0366490639987866 -475,509.5668059807296,469.005411213006,1.086483852420419 -476,887.6761591645925,845.6622256740443,1.0496816958532829 -477,417.9390747755091,390.16959256004293,1.0711728508448355 -478,600.645485766306,530.6251903102226,1.131958106653676 -479,876.41369499685,821.8925931118418,1.0663360423757817 -480,621.6089666901921,546.5587896868366,1.13731400614078 -481,490.5927973521472,468.3294279192416,1.0475378400452442 -482,306.4454921481086,251.41976911217358,1.2188599696445697 -483,759.0277543268764,669.4528756129246,1.1338031129255224 -484,251.65317227093396,215.9140332769121,1.1655248547378392 -485,757.9167117518456,668.4513662062523,1.1338397227809518 -486,334.40474348586565,317.26247882011864,1.0540318058709561 -487,440.4053873737114,415.9018419199226,1.0589166552873952 -488,350.33715949283726,332.2996450693776,1.0542808717706988 -489,445.6375565737255,400.12301185017867,1.1137513798896155 -490,421.1418984754702,397.7786241020321,1.0587343636832665 -491,426.3745466198633,382.505550456771,1.1146885218023788 -492,1248.2400899267109,1084.3521803154156,1.151139005008155 -493,2637.639660991428,2475.341651452485,1.0655659025669082 -494,4761.601232517938,4471.422315005137,1.0648963343361737 -495,535.827861332873,503.66360579994847,1.063860591002678 -496,534.4665739537145,502.37828277558475,1.063872767351418 -497,346.78746341064743,311.5450630225306,1.1131213572964505 -498,311.9571635780916,291.5570894499475,1.0699693983316643 -499,730.9974014506064,685.3115066872526,1.0666644209495273 -500,289.2289800335143,269.22321974684513,1.074309193335853 -501,2008.0915629456563,1867.1243758775445,1.075499623318804 -502,1294.5814856983882,1106.2318631985625,1.1702623371878216 -503,2650.159989055442,2386.035111713998,1.1106961402389888 -504,565.5107725062097,534.4595523429742,1.0580983537989217 -505,158.61748269589174,134.47806647223533,1.1795044861731434 -506,420.7915428597136,388.5784051484072,1.0828999689239123 -507,394.43161815169856,388.18679595214047,1.0160871576897428 -508,271.7502382735223,230.82293544410513,1.1773103818763622 -509,1125.1221043048233,1063.2684944046248,1.0581730863142271 -510,264.0632437319486,223.14003490146837,1.1833969814002703 -511,709.9058933259751,630.415144913985,1.126092701061038 -512,504.1920517848882,467.02408796513777,1.0795846826267448 -513,714.8713474048309,634.684868157618,1.1263406192115162 -514,502.4109992488525,465.8749891533648,1.0784244935790277 -515,1004.5904164398681,925.9829634155233,1.0848908199502918 -516,1018.9139748995592,889.3655085199329,1.1456639201077392 -517,871.5360487076322,782.9291187417809,1.1131736294445767 -518,329.6813291444663,318.15643616006037,1.0362239818986654 -519,208.0012684461536,182.29455061694884,1.1410174782636353 -520,330.2279545808784,318.6797009940959,1.0362378072740706 -521,208.36475871936577,182.64233412418844,1.1408349532901132 -522,494.0585494531947,480.52555176411397,1.0281629096296714 -523,636.2735771064024,557.7617363312818,1.1407623285375184 -524,646.5043944989013,564.3394176876864,1.1455949633075007 -525,744.7179294816476,618.0376255754433,1.2049718312671573 -526,629.0693623605687,549.8934317625185,1.1439841358793383 -527,3427.1534473808933,3225.407154321153,1.0625490933104231 -528,497.2629667673311,463.8763824888391,1.0719730202675175 -529,266.2760660017803,262.19974365959513,1.0155466297765618 -530,849.5304281285022,799.6006992171303,1.0624433282265222 -531,242.9286042737912,240.8325988681974,1.0087031631741055 -532,385.48672707997684,380.8134688334385,1.0122717777311137 -533,400.38076159529385,394.6965793983891,1.014401397158214 -534,344.97531566841747,344.1048514239323,1.0025296482769224 -535,507.38220556694586,485.42715191817723,1.045228318115319 -536,161.35417790074968,158.0685510253811,1.0207860884031321 -537,226.4081805188226,194.5336969969074,1.163850705630819 -538,562.8615482908018,512.5573694999593,1.0981435089693827 -539,503.24212709279067,393.3535549793587,1.2793633633721662 -540,322.87878513214434,255.64527232843696,1.2629953301750483 -541,467.222835024663,418.37441437585153,1.116757667224191 -542,780.5964652621042,689.4332428440227,1.1322292235895364 -543,496.55820764506404,444.5600245540562,1.116965494464258 -544,489.16518287513406,426.43038918610404,1.147116142000966 -545,177.28474135074444,149.94886023357236,1.1823013597742025 -546,41.11486559881637,40.73841167326815,1.009240760994009 -547,1982.2422061670547,1675.7980002447973,1.1828646447110527 -548,650.8669339201496,640.9791843712788,1.0154260072557104 -549,196.93334929097594,185.57893079668793,1.0611837693295443 -550,195.65310868390213,184.29754014812823,1.0616154102037765 -551,629.8260685909356,603.3346210126751,1.04390838293648 -552,1479.3120313647003,1422.220399314842,1.0401426052371083 -553,122.54736485175181,116.31474082397446,1.0535841285775593 -554,542.0901408048409,520.375042002747,1.0417297084781771 -555,541.7948203883107,521.3717030193156,1.0391718945441855 -556,265.4406392466856,253.3190490847606,1.047851080310463 -557,576.3829078824733,537.9924235122147,1.0713587825635744 -558,176.5829588871897,163.91882819101824,1.0772585482456822 -559,458.68534988673366,348.98608367994876,1.314337079146654 -560,458.82103379787986,334.96859922227503,1.3697434173327396 -561,253.43754969922136,229.15335833014007,1.1059735346932824 -562,1570.0598462896683,1436.2811764943533,1.0931423957820288 -563,1021.7882261285928,954.7363926587168,1.0702307296395734 -564,191.04131485068984,171.32416992209164,1.1150867676029856 -565,141.52836519152183,132.32084844532113,1.0695847771109592 -566,232.86629440134132,214.48672885995782,1.085690921946895 -567,306.9907187824588,306.980091372692,1.000034619214944 -568,1024.622764389989,925.3964596131319,1.1072257233600604 -569,891.9105937337315,834.2136391916113,1.0691632836380272 -570,10889.59625452566,10140.422034862853,1.0738799841946558 -571,3811.6122369821724,3527.7277278843826,1.0804723411202821 -572,375.71658064555544,347.9875448201671,1.0796839893787524 -573,571.0178061468097,492.9906059353302,1.1582731988643917 -574,1318.8446976365153,1232.2034868576918,1.0703140444763486 -575,598.4878096934729,584.1490511820004,1.0245464038372716 -576,130.68224581641033,104.21076699742989,1.2540186545180432 -577,692.4454132481414,638.164202190007,1.0850583766244737 -578,1186.3952832650245,1122.7756143239405,1.0566628524252297 -579,750.3600809696972,712.8909916909645,1.052559352994287 -580,651.9561852175249,604.9817643333909,1.0776460112577007 -581,138.54705577893563,126.43708007432998,1.0957786726606342 -582,301.85443676524636,291.39917111792323,1.0358795311847064 -583,194.7667958464967,188.63891759943635,1.0324846978822924 -584,468.84695863659186,414.82357267231987,1.1302321987544004 -585,273.3312130868827,258.302287953626,1.0581834766247016 -586,376.59810954228857,343.3631288078778,1.0967925148218427 -587,261.20279608125674,240.66906577990437,1.08531935849259 -588,74.56129291096681,65.2810114016841,1.142158972571361 -589,141.3132261397901,139.94191989751613,1.0097991098255492 -590,210.17026167342402,207.97250364125438,1.010567541351335 -591,242.1442363895885,221.337580707027,1.0940041705348817 -592,1104.6881525566907,1062.0127175120263,1.0401835442654963 -593,122.02277543770548,121.95366105574824,1.0005667265858107 -594,79.71970040860565,79.71970040860565,1.0 -595,332.31602147497637,326.47132044743057,1.01790264767985 -596,408.8257880174553,397.27934842011337,1.0290637800410705 -597,1157.3760645664017,1077.44590130029,1.0741848506450764 -598,1192.660924388985,1147.9824028104213,1.0389191693785413 -599,376.5127540418257,367.69268340317734,1.023987615301491 -600,319.1969691740032,304.1842201864616,1.0493541347356512 -601,368.82851552985164,325.00645248186436,1.1348344400960242 -602,146.1074004773684,120.91223231340433,1.208375676157051 -603,157.4903262054921,137.95949032203782,1.1415693537129166 -604,286.3130055192401,277.76506713649303,1.0307739863434542 -605,668.2564722683135,656.2260687105264,1.01833271205063 -606,680.1318545393187,658.4052309312701,1.032998862383456 -607,863.7622989051698,811.6656878347034,1.0641848138356638 -608,1271.9010388918869,1139.0758578429684,1.1166078449774586 -609,423.23313577717823,392.5008363937386,1.0782986850825724 -610,331.34414880780594,310.3710025240345,1.0675744386982393 -611,244.37428243349882,232.65144919428735,1.050387965687769 -612,421.80076304236195,391.1963221034547,1.0782329465020217 -613,138.40636864196375,107.73757569552565,1.2846619923313514 -614,422.5460840488552,394.64438265422814,1.0707008705076981 -615,428.1601814245591,406.3254530014457,1.0537370432047133 -616,140.22458339174307,109.15103731082016,1.2846839283115323 -617,409.04246454096983,359.80275729297534,1.1368519452670571 -618,93.32879171726736,88.12631906112581,1.059034267078976 -619,97.42400311008338,91.77123515133515,1.0615962937561705 -620,289.43570656915045,268.107216166698,1.079552093775765 -621,1154.4710177505606,1094.3969612405815,1.054892382414769 -622,413.47112731544684,411.1696948678976,1.0055972813081193 -623,467.9895231735361,445.8942030699031,1.0495528310337086 -624,453.10311489507717,430.22022701516624,1.053188777381925 -625,75.21726322767675,57.40467481474374,1.3102985683730073 -626,19.832192795841408,14.326581170407922,1.3842934723886204 -627,94.12715551782763,75.31097110123552,1.2498465249013821 -628,40.98032561865422,36.46079292763605,1.1239559627786515 -629,65.72513841981277,54.26080456362277,1.2112820469285088 -630,478.1146021780306,459.2802804417651,1.0410083396529664 -631,1634.09465629211,1511.6523378041868,1.0809989938994715 -632,1244.24107174307,1126.1716143810127,1.104841443217296 -633,938.6777759721608,909.2398345675426,1.0323764317020048 -634,659.9519940732137,623.6163130865453,1.0582660848091472 -635,736.3077757752237,701.0289553756134,1.0503243412830328 -636,305.80025391895725,293.0001753943718,1.0436862486766665 -637,278.1851960074465,264.30624366467526,1.0525108758322768 -638,334.1083940509987,324.046690708478,1.0310501653959876 -639,281.32844066048756,267.2200720290411,1.0527968147164977 -640,701.3719256850159,672.1135711167527,1.04353186102112 -641,142.18678151694405,142.17315291232856,1.000095859199408 -642,66.67152602637472,48.9341507005673,1.3624743675300324 -643,289.47229931801667,273.547646261283,1.0582152808638061 -644,121.98534514546954,121.95196629886489,1.000273704866085 -645,331.33286459036316,321.9699504995522,1.0290800867481078 -646,406.38062751173317,374.758531417623,1.0843799231854476 -647,313.27358023101766,265.8826345388082,1.1782400936955222 -648,503.2134264697961,473.13482869949434,1.063572994304771 -649,476.9587758743969,437.7580164147487,1.089548924268032 -650,1577.0313568635188,1514.6917602262927,1.0411566222740347 -651,1436.99243542599,1341.2010872868425,1.0714220626922744 -652,582.2953102711087,512.7440526936207,1.1356451765985611 -653,456.74994164182556,448.4971540544648,1.0184009809488301 -654,216.18958976759228,205.15968273160533,1.0537625467593286 -655,146.41247214932497,141.41661172532667,1.0353272530224509 -656,370.6876816033252,339.836025941822,1.090783946687232 -657,396.9845410020808,363.2552483629853,1.0928528707874063 -658,352.24139252672717,335.71413639724017,1.049230146537323 -659,347.6302289000389,330.89653271471934,1.0505707812893477 -660,348.15367701491925,331.5165493710697,1.0501849083414159 -661,352.80263440180147,335.53252461019935,1.0514707473192515 -662,251.18954980762226,229.69106220832367,1.093597405979167 -663,290.9675165773856,267.6977249990335,1.0869256232134066 -664,1116.3799240819385,1054.839151676231,1.0583413805867121 -665,258.51069757765674,236.44792581595408,1.0933092209862558 -666,260.03624676731505,237.7805994652009,1.093597405979167 -667,131.59562823184527,131.59562823184527,1.0 -668,201.58543273235648,172.82717057735195,1.1663989641150392 -669,294.310954174587,294.27536555118996,1.0001209364682306 -670,188.74090112242288,160.47091334194587,1.1761689217798417 -671,478.02641718278574,457.56115287379714,1.044726839637615 -672,476.25160926755245,461.81256081711064,1.0312660366467599 -673,111.51717086810592,97.17917389511595,1.1475418692945956 -674,194.30996345214612,171.75089189264818,1.1313476239389681 -675,283.22122605287876,265.84799860799967,1.0653502284607996 -676,411.42916408534626,388.8624413219446,1.0580326623643201 -677,1904.5445068808742,1801.4924291382274,1.0572037251313586 -678,2029.5098841350346,1939.313857167451,1.046509246883495 -679,255.85337402496847,241.69788438946412,1.0585668743905705 -680,1834.685477423359,1664.7000833502204,1.1021117231706037 -681,1289.7434381198304,1248.4672713889195,1.0330614727969532 -682,904.7466033439702,781.6333033599229,1.1575077462217045 -683,1232.0236054780387,1137.0266009271943,1.0835486210026912 -684,402.03793451629303,394.1413769785714,1.020034835211303 -685,875.9986757636102,827.5326736139681,1.0585668743905703 -686,109.35702244730476,109.17948143165724,1.001626139026486 -687,107.76013108212308,107.68022698547227,1.00074204985342 -688,401.3689889578308,368.17947761451086,1.090144924856648 -689,111.5013887844769,99.50206490272248,1.1205937172608977 -690,889.3971375483512,840.1956706202016,1.0585595339854952 -691,33.107621938236704,31.14716842437672,1.0629416288231734 -692,33.702262831430154,31.73250830943923,1.062073710114022 -693,36.695568567187706,35.28743441446081,1.0399046906099199 -694,44.93805398878813,44.273009798415835,1.015021436161679 -695,179.4495147183747,171.28770949831394,1.0476496839380125 -696,309.43367922366645,294.4351407729649,1.0509400420456834 -697,305.4055499260967,292.79411371017653,1.043072710909768 -698,826.4064737192446,780.9652757906165,1.0581859390388713 -699,209.55616328296207,202.1242206825116,1.0367691836997817 -700,857.2660958870093,768.1205621871279,1.1160566948579669 -701,535.0787441854276,503.74148685298184,1.0622090063064265 -702,322.0489223151719,292.2687392072884,1.1018931521333941 -703,80.16543816026484,73.86936689786958,1.0852325060684505 -704,131.963536355012,120.0910349341933,1.0988625123209614 -705,226.76155833615417,206.71724579976248,1.0969648780818593 -706,31.641554858902836,28.656093563734977,1.1041824241858993 -707,916.0472239778628,860.0729003426956,1.0650809060637352 -708,425.0230316709216,397.00467974363187,1.0705743618573533 -709,777.332988105624,735.3512046647984,1.057090793044886 -710,286.16284433194187,268.93322954348434,1.0640665150145443 -711,560.6536691998617,528.6651196681923,1.0605081522150477 -712,272.39652529390463,253.91390429700462,1.0727908975606186 -713,78.73785351927714,74.89778150548732,1.0512708378886828 -714,86.2608190213831,80.38870138123013,1.0730465542950547 -715,80.01719480869554,76.13437092837333,1.0509996186081991 -716,82.77287867056536,77.72028383919161,1.0650099894363214 -717,265.4303774877686,247.43244228522903,1.0727387849237344 -718,1461.9847728850093,1385.7572106689427,1.055007877014235 -719,1469.5631601658613,1392.9402345365004,1.0550080496848144 -720,1800.4870418043547,1698.0544170713265,1.0603235230291947 -721,1434.2941955470974,1359.510191391995,1.0550080496848144 -722,1209.4422980831084,1141.1533377237415,1.0598420546143106 -723,1651.782321826873,1549.7802425010316,1.0658171246016344 -724,1436.8689427828501,1361.9110550049224,1.0550387541847634 -725,1024.2135564244027,961.0853981111167,1.0656842341350268 -726,1471.887723952808,1374.318451049651,1.0709946612654713 -727,673.6495597713234,654.536038929014,1.0292016324625668 -728,94.15095359617804,83.34808155614064,1.129611526004482 -729,4797.566271980058,4554.015969180602,1.0534803356966 -730,501.16821402947585,486.3516997631499,1.0304646087873066 -731,395.9555719516341,359.33077136440335,1.1019250326048167 -732,293.32062291593866,262.0219759525725,1.1194504653649027 -733,305.98158569311926,301.08319269749865,1.0162692342662318 -734,1154.211103786878,1097.6115767060471,1.051566080644564 -735,4437.0842271057845,4121.103229483426,1.0766738856143545 -736,2086.258715366478,1969.504158813093,1.0592811932033424 -737,2078.0375005619157,1927.826903490524,1.0779170561420324 -738,1135.5465233127513,1039.1273219268837,1.0927886307590053 -739,533.6653817237453,497.97803295870057,1.0716645040605726 -740,326.44635021007235,309.21074401118483,1.055740644633823 -741,217.2883594378391,212.14665758920265,1.0242365442240091 -742,530.9053084007803,497.63655721200024,1.0668535112757143 -743,1527.7568960648941,1440.646951019666,1.0604658518060746 -744,196.83601005197528,189.67950081350395,1.037729481613871 -745,384.5849121329855,347.26564994064034,1.107466034140504 -746,189.62875574227522,185.03585008456884,1.0248217070130314 -747,364.5232708099188,311.6399603120222,1.1696936119647443 -748,1734.1544797948982,1641.1099206411318,1.0566961164413757 -749,2481.642066784463,2365.6434262179064,1.0490347105066509 -750,136.45355790952217,129.30096018676295,1.0553174370277527 -751,135.56326526064146,128.4692193497651,1.0552198102143238 -752,135.97808841854888,128.86070681431647,1.0552331411194904 -753,139.73983186888816,132.30927694996802,1.0561604982674795 -754,78.21382143989882,72.87408297787889,1.0732734909836303 -755,141.7430065125841,131.74766923432355,1.0758672797503768 -756,333.94790489738807,313.32079573873625,1.065833833691179 -757,269.73989938613477,253.18248742793932,1.0653971454597861 -758,1627.5431462021907,1496.8044348613773,1.087345219118703 -759,461.125768471042,430.93253605697765,1.0700648706879543 -760,453.00054798150524,412.2899567058883,1.0987426218210266 -761,329.97675764905034,313.7886348771662,1.0515892577760857 -762,443.1104027116273,399.81663984312587,1.1082840446197746 -763,1578.4972443320987,1501.890528336415,1.0510068573909566 -764,140.751123678607,134.46914289442034,1.0467168946642205 -765,308.96276616385603,300.31089736591065,1.0288097064536543 -766,664.6838138968245,641.0769357055157,1.036823783350323 -767,699.9450198116341,672.5971763913404,1.0406600627838225 -768,842.198733810284,811.2120682947292,1.0381979838893334 -769,1952.4980672873858,1824.5739361123806,1.070111782615712 -770,238.67217990438516,215.56046334009008,1.1072168625274834 -771,1090.0552031144657,1058.094598947701,1.0302058097627096 -772,973.8788202503,949.9258768020428,1.025215592114298 -773,2624.709092422478,2508.0712518335417,1.0465049948256724 -774,924.2762881901068,896.6226852797218,1.0308419621367908 -775,926.1554795816432,898.5134773602518,1.0307641486943535 -776,926.1868069861544,898.545446817674,1.0307623395860233 -777,926.2101262634872,898.5643051111148,1.030766658540875 -778,2986.7569523376424,2849.895502810733,1.0480233220452921 -779,1096.8896632821397,1064.6795529660399,1.0302533379422638 -780,262.5028547022448,250.9277734475129,1.0461291354707418 -781,262.9430808501646,251.3423489758086,1.0461551024792586 -782,263.2591410302535,251.87975759758962,1.045177840177391 -783,266.54445903294845,254.43894883103954,1.0475772685649145 -784,1998.0952425684422,1927.6985007003486,1.036518543663606 -785,2525.1627520739635,2418.950235296329,1.043908516689523 -786,862.3846472706673,826.6271025317973,1.0432571647231885 -787,382.33326445235036,357.4688739218777,1.069556798771539 -788,337.9330664480846,316.37420938566754,1.0681435351645125 -789,252.80273785937766,239.31040260400167,1.0563800616628538 -790,329.7142687302062,310.9881659614576,1.0602148403649205 -791,580.4744635658817,556.147551249469,1.0437418312132432 -792,1029.319404835687,958.7830128171994,1.0735686709876409 -793,1081.6187037437367,1028.4159939200792,1.0517326744607123 -794,1314.0663933227743,1247.60497737194,1.0532712013467869 -795,695.3708658941681,665.3338313076629,1.0451458097771307 -796,755.2151871391948,717.0528123714449,1.0532211492784456 -797,1569.032116479277,1477.4177321158895,1.0620098042495953 -798,3457.234732483933,3299.6680280398728,1.0477522899591996 -799,5137.911005075546,4932.046971473148,1.0417400796855973 -800,2386.7861595484583,2291.153203612947,1.0417400965525598 -801,2330.9225995345128,2237.5308253707694,1.0417387653858434 -802,904.4544774395426,857.1101605722744,1.0552371434211647 -803,2292.3301821940636,2192.488500200548,1.0455380641606025 -804,4009.269594999486,3848.6275734053593,1.0417400796855973 -805,3937.3603706432036,3779.587389192948,1.041743440540991 -806,441.68844635851497,438.0765948385723,1.0082447945461994 -807,270.1295985178061,264.87854394598514,1.0198243862775527 -808,565.5019085602497,536.1512047089542,1.0547433328387807 -809,531.3009780377267,499.14472542733705,1.0644227034210558 -810,233.5528726890993,226.15305907275186,1.0327203781663947 -811,287.56393389944884,270.95078587795217,1.0613142640190751 -812,3215.80103096718,3010.419979771108,1.0682233882900576 -813,606.5468069718296,540.0845934615121,1.1230588954303393 -814,1953.1016999566161,1874.8454994129368,1.0417400796855973 -815,1969.6040136713855,1890.4962318850185,1.0418449825247673 -816,1238.5225158163896,1199.5355145128908,1.0325017482448868 -817,6974.192097741601,6705.543665533137,1.040063631766255 -818,646.8288375060883,601.5579091326227,1.0752561435668613 -819,765.765593357104,709.3727824927232,1.0794967219720744 -820,720.935418573055,701.4365185123604,1.0277985242371594 -821,1580.0602718127009,1462.6085651099809,1.0803028981946978 -822,1534.3780646810922,1438.5173734991818,1.066638535583849 -823,830.3705353669291,813.1469880304442,1.0211813455500864 -824,838.3939341743095,821.2281628188507,1.0209025604973623 -825,462.62910919951963,453.8923323494196,1.0192485667358095 -826,828.9051269649611,811.774445654405,1.0211027600120455 -827,681.5711420719587,607.8287127575209,1.1213210691872262 -828,523.6088550800145,492.4036136677511,1.06337329894845 -829,274.17455280056964,270.9755768302881,1.0118054033049815 -830,562.7553988563513,536.0863986436107,1.0497475785250618 -831,397.37743063114937,388.8407644199639,1.0219541441955544 -832,398.04717557846226,389.5187589436113,1.0218947520216493 -833,397.85765187077027,389.3388908946145,1.0218800668912924 -834,2590.1550943326097,2340.200466946996,1.1068090665376638 -835,358.2061668455981,355.80140902772575,1.0067587079670193 -836,457.4091491728153,453.72254252410136,1.0081252446224185 -837,2315.372429203523,2200.9455400875004,1.0519898775466627 -838,1797.969544415505,1702.3825160183549,1.0561489721010031 -839,546.4285925776696,503.45590186099037,1.085355421513252 -840,537.2438619355332,495.177220838923,1.0849526984002646 -841,278.3369243292272,269.4900435143453,1.0328282288262385 -842,315.8949463611428,302.3970462675411,1.044636348999453 -843,1049.6799013351774,1011.3552164206525,1.037894385960812 -844,229.0893658080519,222.68749515708038,1.0287482269556973 -845,421.8237254576232,401.0543138733811,1.0517870295014438 -846,320.8222047582353,308.74799684349654,1.0391070000070612 -847,267.36371492092957,255.83541209719363,1.045061403850364 -848,350.9241553515416,319.1255838030215,1.0996428151249307 -849,388.4655172227859,362.54201013791896,1.0715048362947097 -850,427.431750951356,405.9819482554631,1.0528343754890195 -851,427.7001641616263,404.5681208592709,1.0571771281761517 -852,271.199472784603,238.96664168822494,1.1348842284791851 -853,305.04285983729176,267.9697118712373,1.1383482771510707 -854,345.43438670144985,307.3879155786433,1.1237734770776069 -855,300.8269722080143,263.7870131688841,1.140416158453624 -856,1180.5018435260417,1039.7565939303313,1.135363651855947 -857,4525.156511487591,4327.211587067328,1.0457442212929589 -858,1604.9997099207735,1522.179420458729,1.0544090192975315 -859,72.67280776980667,70.65511131902389,1.0285569778762702 -860,106.6449513727977,100.60297180220152,1.060057664921425 -861,72.32196588802988,70.33728536293788,1.028216621026119 -862,107.09214446272593,100.94072327016805,1.0609409264494132 -863,1729.8997976933706,1630.7630391387465,1.0607916393585797 -864,2330.5382858760827,2175.070691562473,1.0714770305704082 -865,1017.4609245829391,952.9140622547408,1.0677362890158957 -866,1009.5846296148684,981.4916346430676,1.028622755386007 -867,867.0264287765291,760.0976743153255,1.1406776498264146 -868,344.4615419472781,303.94676691933404,1.1332956275159078 -869,528.0035101461852,512.1123441104863,1.0310306248588892 -870,3002.230293912561,2798.024958766373,1.0729819562568237 -871,2240.2652392079967,2089.7046660955066,1.0720487327971584 -872,746.2777056797352,708.4618698926857,1.0533773762486012 -873,1187.5922184963722,1090.8124251893453,1.0887226722689995 -874,780.0348236982693,718.3465109549134,1.0858754261384973 -875,710.6201377397621,672.3281254236949,1.0569543514068163 -876,1064.0308300758063,1019.058407282158,1.044131349559826 -877,129.6234663225341,124.13833885392368,1.0441856038936117 -878,92.50459834369619,91.86792584792403,1.0069303022779255 -879,380.3019734749943,357.3738832820318,1.0641571509993868 -880,53.77361476604286,51.46652471166714,1.0448270029363906 -881,205.97273495124531,197.76275107784846,1.0415143085775795 -882,815.6026680676213,754.8801431934143,1.0804399551660333 -883,154.9360681711892,143.64765662100064,1.0785840285579587 -884,821.589555834443,762.0373193667963,1.0781487139201145 -885,393.4171347238553,364.3758838677905,1.0797013527563808 -886,790.793033536332,730.2522951072807,1.0829038660127146 -887,310.0221392983548,281.2735554924065,1.1022086266006061 -888,306.8876334013616,287.65386813945895,1.0668642677614815 -889,1189.3074277288574,1098.7151140725746,1.0824529602769248 -890,179.2770284564643,173.2853299939261,1.0345770669839636 -891,177.89028708510375,164.54907725515943,1.0810773907243287 -892,384.8168679983151,355.89928133904925,1.0812521636752543 -893,337.720735937091,314.718341523113,1.0730888269894137 -894,1309.3010851540114,1228.614578852758,1.065672756688754 -895,1356.6115450573002,1283.5683041904458,1.0569063918362516 -896,1110.4888857637593,1057.486887002712,1.0501207148877973 -897,1103.087187192728,1050.511604092518,1.050047598613275 -898,1109.267047230303,1056.375243188045,1.0500691438798162 -899,1117.6014950426859,1064.1383792842896,1.0502407551491133 -900,2162.7116584476585,1934.41191031247,1.1180202349448474 -901,1603.064751253635,1493.2309483882566,1.073554464554816 -902,1762.3490907344424,1713.6408526286175,1.0284238310676999 -903,2634.470620495443,2564.703321823413,1.027202872971065 -904,2705.086284290663,2633.2933933770546,1.0272635366397733 -905,1977.8695642130895,1886.5970329592,1.0483794523469194 -906,1188.0021357287005,1136.0739360358568,1.0457084684770066 -907,765.0731733268558,729.330758982769,1.0490071396329677 -908,569.9019105990537,546.4221175538337,1.0429700634197092 -909,915.4266253169321,875.5742348135693,1.0455157186207613 -910,1339.2025397129185,1274.105076080972,1.0510926962414908 -911,1073.4575319340822,1019.560684077011,1.0528628150327932 -912,290.3003033209318,285.7480930083513,1.0159308510676481 -913,400.8401756509472,390.235195528434,1.0271758678971856 -914,384.8751888992039,374.6750290296822,1.0272240183604915 -915,386.5825110503057,376.39025453409454,1.0270789596527343 -916,400.3653599149384,389.6832601608896,1.0274122623323323 -917,5372.466911599063,5066.5032083825445,1.0603895212600083 -918,4652.7166233474645,4483.951768885668,1.0376375267086644 -919,333.99221851129255,315.4109525504805,1.0589112895749497 -920,967.0388841576321,934.6067245066978,1.034701397711484 -921,1241.6383569407972,1200.6256148575753,1.0341594761728343 -922,508.88751006220747,487.4752343319572,1.0439248483250516 -923,289.361043234239,279.3006611198102,1.0360199008269202 -924,147.2068390211058,142.84857590192294,1.0305096714592041 -925,134.95033888798235,130.75557976470222,1.0320809186944733 -926,290.9513040142932,281.0832404596849,1.0351072640918402 -927,675.3207866476325,565.2901404229998,1.1946445521627145 -928,3462.3129514978677,3250.2944158608625,1.0652305632998635 -929,1526.198244634608,1475.0155114474574,1.0346997931817843 -930,1585.7346442785022,1487.042842787409,1.0663678265692056 -931,1574.4223195952736,1486.2345855057797,1.059336349018875 -932,1581.6577287370349,1493.1690048270236,1.059262363218062 -933,866.5156135743359,819.9239398343873,1.0568243851366987 -934,845.8732832874671,798.9038424617281,1.0587923581403842 -935,851.0415069686827,804.0198534536868,1.058483199529232 -936,853.6391644351154,806.451009271418,1.0585133562004332 -937,347.57065893756777,309.37627185459445,1.123456097179051 -938,853.7150065072105,806.2512764819637,1.058869649462575 -939,352.6594887444566,314.2979154457979,1.1220548130083743 -940,840.5852265371245,793.3483344616103,1.0595411750723225 -941,946.5201321255753,891.2018093886519,1.0620716005669588 -942,1534.5517298964348,1445.4890716862767,1.0616142037699805 -943,1851.5260409445566,1775.7390993892232,1.0426790971609516 -944,1290.9885101237278,1243.7287963703761,1.0379984076040303 -945,2692.1947664383783,2528.9065930487814,1.0645686850745804 -946,4752.475607358436,4459.375180822753,1.0657267923533642 -947,3915.160436618252,3756.2165363950307,1.042314892840487 -948,998.7757310889679,958.4984515036257,1.0420212255138837 -949,349.6427571198203,311.72108375562794,1.1216525777060395 -950,1115.3858700424387,1074.5315041100582,1.03802063110864 -951,508.66216194961754,470.0756370667252,1.0820857790539251 -952,1693.6898344731237,1593.7744361750513,1.062691053407697 -953,1807.1422299152032,1701.0749533469077,1.062353088180862 -954,4364.67521461628,4204.666175992597,1.038055111137547 -955,5455.430030959194,5201.985580491248,1.0487207137633034 -956,5435.027248818627,5182.523946139762,1.0487220715819257 -957,3751.2401127122257,3571.5277965762584,1.0503180505295922 -958,2240.171127195193,2125.571452237297,1.0539147601165197 -959,2228.276690742236,2114.378149944001,1.053868576347732 -960,789.7143951278535,769.6385335007258,1.0260847927348598 -961,685.061809638414,672.4226020369232,1.0187965240359318 -962,570.0539068320276,561.8865534257118,1.0145355914935517 -963,1153.3156531740347,1101.6409401418734,1.0469070376283458 -964,2173.272157874146,2072.596130560671,1.0485748409103903 -965,1948.7676601897876,1843.143566286418,1.0573064930130114 -966,1170.5217830439692,1114.3943534451662,1.0503658596485923 -967,1440.4950039010757,1398.088666865799,1.0303316506601417 -968,1440.0118666503718,1397.444787293297,1.030460652001517 -969,1710.056895309291,1612.120165580435,1.0607502665247006 -970,2252.283271937038,2148.7471460012557,1.048184415801766 -971,1730.1569907811454,1627.6595763350247,1.0629722676266942 -972,1546.304094054608,1453.6618334867505,1.0637302696086104 -973,1936.2059932316524,1801.9055046647268,1.0745324814310473 -974,1598.896415008401,1515.6097129185275,1.0549526051330806 -975,2648.7806996504964,2493.1013358192413,1.0624440577663476 -976,2728.476429329482,2570.292570226524,1.061543133624285 -977,1974.2328035909898,1861.06374388509,1.0608088036090866 -978,1547.3113848461521,1454.6166352435328,1.0637245218820837 -979,3880.5818772221637,3607.9825825238,1.0755544929786438 -980,1628.0473899483518,1531.5595766837664,1.0629997126677286 -981,1626.807386800545,1548.5947227164577,1.0505055731733937 -982,178.09745049703622,168.5618793551627,1.0565701520317172 -983,689.7900275165799,650.2829431986609,1.0607536838096792 -984,567.3564274015697,534.1718625594198,1.06212338606371 -985,577.3120241169956,546.1681886677574,1.057022426599407 -986,778.9386613236262,733.1538728834331,1.0624490848832666 -987,708.2361019641745,667.241080186441,1.0614395950655178 -988,770.5728447597465,725.3490333400844,1.0623476551852777 -989,778.0235448184392,732.2925454860007,1.0624490848832664 -990,548.4243771610059,518.2895016942255,1.0581429401295475 -991,557.2328204721616,526.525537606912,1.0583205954355337 -992,240.8672280266206,227.89408220684862,1.056926207535292 -993,498.78347953073234,471.4090761326099,1.058069317677757 -994,628.2197750863105,594.8678186242731,1.0560661636381157 -995,1052.1371535054259,1014.2502547768225,1.0373545863559483 -996,1078.7954034957697,1032.8337475993142,1.044500536512568 -997,177.6381081556009,172.19738636950655,1.0315958441693156 -998,395.4295543328034,385.2459892284555,1.0264339289417206 -999,393.88985877159985,383.74756072402454,1.0264296091640026 -1000,290.639329569865,282.7373007750419,1.0279483066902104 -1001,1583.886469862182,1543.0457331675282,1.0264676126033003 -1002,1057.617583505029,994.7316889710191,1.0632189516341446 -1003,1382.267396770656,1299.6270263488536,1.0635877592157887 -1004,1320.511623526912,1238.2130311536373,1.0664656164186848 -1005,803.0510384389929,750.7870198842986,1.0696123097103472 -1006,671.7958431793846,624.3336901302893,1.0760204900030155 -1007,477.45235028784634,434.51189086062885,1.0988245899143663 -1008,1370.6815115708596,1315.729982060755,1.0417650507773921 -1009,488.6344166239234,470.3657868197493,1.038839197739471 -1010,591.0493054528018,574.7191780309284,1.0284140986521848 -1011,793.224958746583,728.4703691301804,1.08889117850287 -1012,288.49225318509764,265.3158071243766,1.087354184855847 -1013,1555.1664210318197,1488.9708362583451,1.0444572742202383 -1014,312.8677728397632,303.19731695531965,1.0318949256594794 -1015,292.71852831004134,280.3310952442729,1.0441885801322697 -1016,671.3178438456439,599.295897202235,1.120177606720883 -1017,156.44897654694375,150.1417713537833,1.0420083307682484 -1018,822.6511911251345,749.1965005001083,1.0980446259105499 -1019,814.4536186125176,741.4920739834511,1.0983982798859897 -1020,815.870479498712,742.8156670173238,1.0983485078804678 -1021,823.280068412352,749.5667537555238,1.0983412274990925 -1022,490.51054198624536,450.00218831361474,1.0900181259660888 -1023,3407.288024093223,3201.790570877312,1.064182040850849 -1024,401.1694396336901,376.85390628631103,1.0645224394434314 -1025,190.03833502801,183.59856844032706,1.0350752549019793 -1026,1142.192075899366,1072.3210645968313,1.0651586671281186 -1027,682.7093769166705,586.9428838822454,1.1631615199097263 -1028,2137.819100853374,2021.4595086050374,1.057562168202238 -1029,1547.235738886203,1483.8433931008415,1.042721722575378 -1030,863.0872758216248,826.919946947185,1.0437374004677984 -1031,1609.3032178921287,1543.3821612811025,1.0427120762859587 -1032,1139.947532587803,1092.7411431171302,1.0431999744569083 -1033,3428.0385335235383,3268.1554560950435,1.0489215031464663 -1034,527.2426382864779,494.4612019975799,1.0662972871409604 -1035,1265.9809140173088,1171.804701000793,1.0803685229595712 -1036,611.1146210705332,574.1118887372761,1.064452126944527 -1037,3060.228447810476,2850.5719343369137,1.0735489292335054 -1038,914.0868504104604,851.5144256926523,1.0734836930882405 -1039,1096.0039538380734,1028.9832611635181,1.065132928011649 -1040,907.7747186394627,845.5840545047508,1.0735475838308424 -1041,955.0777143224441,896.354066366655,1.0655138969735738 -1042,649.1404436923259,608.274815248773,1.0671828381170763 -1043,109.53862878286766,102.0078520877748,1.0738254608930777 -1044,651.1725771274071,610.2834062336851,1.0670002993298904 -1045,590.6299889709612,553.3550993944451,1.067361608517401 -1046,177.8679967614671,172.95042676510033,1.0284334077015362 -1047,42.093833290545945,38.766922834657954,1.0858182752878622 -1048,88.95264422514772,82.66034986815963,1.0761222807189188 -1049,376.6616647133569,370.2983870469842,1.0171841895319014 -1050,401.63686472149925,395.0746202291043,1.0166101393417515 -1051,720.7901878338309,711.8737766537606,1.012525269889815 -1052,667.638544471394,648.7807097572934,1.0290665773974002 -1053,680.5753402084617,661.5980227204499,1.0286840601638716 -1054,1297.3173141147759,1212.4055386102657,1.070035786542052 -1055,1012.0100825253018,927.4078326495085,1.0912244288837776 -1056,1014.503780646932,929.6930620263664,1.0912244288837776 -1057,1013.7539471368718,929.2648642868895,1.0909203458529755 -1058,453.36356105578227,418.5915563199621,1.0830690543342953 -1059,178.21835748085215,168.0035651985771,1.0608010447290293 -1060,178.3424321705692,168.09969333547124,1.0609325254071513 -1061,7796.741629311352,7506.17654816758,1.0387101314869425 -1062,534.8961630285337,492.8741515919921,1.0852591098575768 -1063,247.1104362129474,236.05420428283952,1.0468376827419703 -1064,462.5942563305032,452.17322538944114,1.0230465457836138 -1065,317.11959770740594,299.96775904198415,1.0571789405641463 -1066,574.3832393992597,544.4066003754665,1.0550629603004793 -1067,586.3214316358137,556.0926895223633,1.0543591791134934 -1068,443.91775234586737,428.94982888493894,1.0348943453359982 -1069,390.8811094960442,377.64331002330084,1.0350537110585292 -1070,702.7800958390644,684.162005921899,1.027212984287366 -1071,187.7885717197514,177.6678768385621,1.0569641235167426 -1072,534.8683283668978,525.5782944208228,1.0176758325918167 -1073,886.8802696588319,812.4245489823857,1.0916463205964257 -1074,960.0207082350403,909.6902764192643,1.0553269976830877 -1075,988.7313693570029,911.0814565117629,1.0852282880858277 -1076,953.5231662180772,854.4446080238087,1.1159566778979637 -1077,957.1350099610722,911.8605327473292,1.0496506599285926 -1078,914.124104079998,873.6681058836888,1.046305911734513 -1079,1256.4729141505675,1228.1338730944317,1.023074879438617 -1080,1235.5897316930534,1193.7394043740242,1.0350581769904588 -1081,861.7832662191353,794.3869724516417,1.0848406332237484 -1082,961.882279115143,887.4439711748402,1.083879445191067 -1083,338.18009483580397,327.23902027037593,1.0334345047127576 -1084,330.79923342557356,321.00871295272304,1.0304992359328653 -1085,243.93289373604094,226.12725657610872,1.0787416671016803 -1086,307.026956365228,293.2884786077017,1.0468428825528557 -1087,332.83734181151027,321.8124776767301,1.0342586596218153 -1088,418.4581459703609,394.69195556026716,1.0602145295217824 -1089,947.3413502780219,899.2139285552253,1.053521659523361 -1090,451.5744735515773,420.26424218874484,1.074501297564047 -1091,2612.9345981744696,2477.577990017094,1.054632632636699 -1092,778.2492551446779,760.709725096269,1.0230567974481846 -1093,802.0974655138878,779.049227495413,1.0295850855183737 -1094,3626.5084332044107,3390.4014750562305,1.0696398228602895 -1095,2220.6498857541887,2134.9523201477605,1.04014027142325 -1096,505.2204408842573,457.53499000126646,1.1042225227033649 -1097,462.3936214615769,423.9881716345536,1.0905814180592894 -1098,1116.828350111589,1070.1256535559,1.0436422549076378 -1099,357.44876773582183,342.01894923867843,1.0451139287208782 -1100,397.09813665995847,387.368638549773,1.025116896779798 -1101,348.85895323329635,339.89411939823503,1.0263753719862323 -1102,362.6969906009746,353.81037200763683,1.025116896779798 -1103,396.9922970289312,386.98508468449063,1.025859426475311 -1104,672.5010799647566,637.4560771117636,1.0549763412904896 -1105,417.5393412968697,389.96034631150724,1.0707225625534034 -1106,1142.6846683762587,1067.0754989134607,1.0708564384992312 -1107,513.0261041450707,479.3514555235031,1.070250435736742 -1108,1471.874953032884,1375.0348151783319,1.0704274079358438 -1109,588.6802963312361,560.5578813610532,1.0501686193438238 -1110,313.50055834851935,294.5449313063186,1.064355638231939 -1111,257.4913534354425,232.68560628558507,1.1066062810924895 -1112,1076.208453987698,1038.0613539009103,1.0367484060007008 -1113,746.7884000943706,646.4679066139631,1.1551824807605084 -1114,676.2576102828375,630.1531572018889,1.0731638849286564 -1115,424.0980307374465,415.45417932212666,1.0208057876067669 -1116,757.7090648007149,704.9218659926394,1.0748837585478257 -1117,824.2471057812992,781.492490326129,1.0547089268091725 -1118,998.8238909538538,934.3368946293783,1.0690189980671323 -1119,784.7938637080404,731.220664679691,1.0732654335635015 -1120,997.5305925979886,933.1141800053026,1.0690337945484014 -1121,919.8441146566068,858.9013839188154,1.0709542816891675 -1122,658.6999830898412,619.6255174990652,1.063061420950655 -1123,655.2184111741246,616.4299229933386,1.062924408329226 -1124,995.8772753164255,931.5805463470427,1.0690189691288705 -1125,991.099088143752,927.1446113819012,1.0689800447273563 -1126,927.0849753658134,875.5789016417762,1.0588251654162286 -1127,696.6203333617494,659.453186334454,1.0563605541644094 -1128,927.0302710201177,875.4876369395581,1.0588730576033456 -1129,632.9982243804005,599.7672008322023,1.0554065369064676 -1130,205.26429158281232,188.1126978827148,1.0911772245741287 -1131,205.04249958365185,187.86667486077357,1.091425606673494 -1132,307.8347303184395,271.5203837409775,1.133744458066562 -1133,304.2748102533792,280.6609486395213,1.0841366129784853 -1134,655.9758668213062,617.407221228421,1.0624687309554743 -1135,999.1000658468971,933.7335459703468,1.0700055386878284 -1136,263.30612935377883,241.59027220786302,1.0898871338959857 -1137,207.54332688785968,190.26345756791451,1.0908207468781919 -1138,221.46528924580636,221.16030872355145,1.0013790020642273 -1139,599.3289688721226,550.9042382634034,1.087900450287634 -1140,508.5142045169269,494.3564297394256,1.0286387997117057 -1141,596.8297479045497,578.6393109610243,1.031436573006618 -1142,594.0364896050878,547.0211020543858,1.0859480326702784 -1143,593.7599202731416,576.0393321690019,1.0307628092641088 -1144,770.5041572822036,718.4982434661665,1.0723814070374773 -1145,780.2669561410123,726.9575359152608,1.0733322341292375 -1146,1112.1479073294954,1029.704317483756,1.0800653046179345 -1147,1209.7052952446052,1119.8084804079697,1.0802787408824446 -1148,1130.9188318625543,1046.9091214908156,1.0802454660554561 -1149,1189.603126313294,1101.186374116013,1.0802922686618406 -1150,3863.9531371357753,3626.321790275186,1.065529580827011 -1151,391.408843069889,368.05258395560656,1.0634590276836626 -1152,871.5437976603051,840.0870528901637,1.0374446251277416 -1153,434.0418977871499,411.89217165493744,1.053775545291908 -1154,506.8130923271383,483.91222214678083,1.0473244302009201 -1155,767.7185948119463,717.9034167416127,1.069389804963504 -1156,629.2518990363384,586.0168159021257,1.0737778882123985 -1157,652.9625761562293,613.6487015562238,1.0640657667820443 -1158,638.9051312749463,590.5959131738277,1.0817974134658461 -1159,3800.9185604086792,3557.59300487167,1.0683961192873401 -1160,774.5072235572038,743.9283300699669,1.0411046229202763 -1161,764.9039317953949,740.159939308449,1.0334306021885822 -1162,394.03473607685174,377.82256919490516,1.0429094718097247 -1163,537.917499768294,503.69963509036893,1.0679330741857416 -1164,305.41137484605883,300.3927092672121,1.0167070152637505 -1165,330.2505966360929,322.0579390699152,1.025438458650756 -1166,540.0661019989199,505.75842421234785,1.0678341202917216 -1167,787.5723231952763,749.2939019276406,1.051085990649544 -1168,789.7367840990474,751.353163418162,1.0510859906495438 -1169,788.2746714558754,749.3900900918326,1.0518883047402958 -1170,786.6904597674995,748.0841529539458,1.0516069036633242 -1171,2072.163826992017,1987.2338681515107,1.0427377774713082 -1172,1438.916366619473,1377.8643408789626,1.0443091703074079 -1173,2269.1020049277945,2153.2874126170736,1.0537850133856315 -1174,2645.245021453263,2456.5159170172415,1.076827959114216 -1175,2937.8174451216455,2808.631361296627,1.0459960981726626 -1176,3194.1518295682386,2981.200775026513,1.0714313025562097 -1177,540.2452628005789,532.7187329731707,1.0141285247946916 -1178,375.67984117533155,357.6220600369494,1.0504940359006836 -1179,59.65115821351867,57.06029330050038,1.0454057412459106 -1180,369.08128778780093,341.2191141562812,1.0816547856658423 -1181,454.7878533693068,418.01429558501826,1.0879720099831114 -1182,1044.0143143240105,996.0355859618221,1.0481696929692101 -1183,2440.315214762457,2318.7803100372794,1.0524132899520884 -1184,448.6845265575367,430.0082606969068,1.0434323420446892 -1185,1317.3953948661838,1224.821664179164,1.0755813955569278 -1186,1375.9904430351878,1278.4187448788225,1.0763221742071796 -1187,204.1552212657298,193.4730502020101,1.0552127081914828 -1188,693.3628999576034,647.7454915678089,1.0704248952460969 -1189,312.1436297185025,305.067483932651,1.023195345812121 -1190,489.15859104220834,459.5392990188587,1.0644543178060908 -1191,2087.851604653095,1982.4951410375188,1.0531433653655458 -1192,2566.359406211248,2436.881323470448,1.0531326993619885 -1193,638.6625832581725,606.3406282646635,1.0533065961388963 -1194,694.2410559723787,659.3092786793551,1.0529823838714882 -1195,697.7524098403604,662.6132134299713,1.0530312340565826 -1196,642.2033333160222,609.7099833857428,1.053293124297953 -1197,1258.8816844399764,1198.604545566443,1.050289429567487 -1198,247.57086516598676,236.43630876951377,1.0470932592985425 -1199,336.99255411947763,321.93180975628997,1.0467824051763912 -1200,567.0408040851783,538.7254314426834,1.0525599331122488 -1201,541.1475681862896,514.2095967577536,1.0523871425161802 -1202,477.36207078731013,444.6675977221694,1.0735256475457617 -1203,254.1898965777284,244.10123051954508,1.0413298451495332 -1204,474.6838641632096,442.13112792074,1.0736268816800096 -1205,257.61743567650666,247.25041357958403,1.0419292406707572 -1206,459.34388849492274,430.04845845298416,1.0681212302151324 -1207,398.7121682457978,373.4901142704791,1.0675307136966228 -1208,270.073492899828,259.1387880418455,1.0421963263030187 -1209,1058.1673913659245,1011.2596901398535,1.0463854158169636 -1210,177.30250396283145,167.17477420871052,1.0605816864539437 -1211,240.35675728837575,225.91670606717963,1.0639175892415063 -1212,179.2134367760287,168.91348985955202,1.0609776455689883 -1213,177.23576188460333,167.11184451731518,1.0605816864539437 -1214,412.87623590168425,379.0332301781381,1.0892877009956108 -1215,204.90558894555232,199.41313501577415,1.0275430900243543 -1216,397.3959002746149,370.2212469839362,1.0734011176075418 -1217,2087.4572440331344,1902.42644228748,1.097260423653055 -1218,2097.326124373133,1945.361242929898,1.0781165359367197 -1219,424.56702102951647,405.6652038385892,1.0465946228862364 -1220,423.6912380920814,404.871283414397,1.0464837973169405 -1221,1011.1783047163008,966.7952840427711,1.0459073615749725 -1222,1000.1164392174103,956.2303015311314,1.0458949456171882 -1223,4089.30418502754,3903.545058467319,1.0475872889329878 -1224,1578.7944381367597,1486.2462104272424,1.062269782126417 -1225,304.82725223134304,285.25960588427375,1.0685959243560326 -1226,314.19801354265917,310.3956002124769,1.0122502165867666 -1227,314.49429675482736,310.7150987972996,1.0121629041271443 -1228,305.7448432248403,288.41360658805206,1.0600916053920537 -1229,1692.2092736634636,1634.1527586229456,1.0355269816326356 -1230,633.8505146608135,614.6597453870619,1.0312217766297138 -1231,720.8305569255673,691.1420766800527,1.0429556834220326 -1232,609.9428650948565,594.194318591659,1.0265040341357088 -1233,730.3874478942678,700.8645534200793,1.0421235377508002 -1234,701.4509986850434,672.4309025464611,1.0431569935716587 -1235,583.3421749464387,556.2938555750746,1.0486223586694168 -1236,738.5090954437225,708.5928171519447,1.0422192796308896 -1237,754.9902974263465,724.0921569129405,1.0426715580584875 -1238,604.6955961760233,575.2118627161672,1.0512571721324262 -1239,830.2386505849078,791.7588024200394,1.0486004677778804 -1240,642.3477476942755,618.86694582385,1.0379415996101835 -1241,425.44961432185374,396.29123144751384,1.0735781681765566 -1242,193.13900842156207,183.93541754661635,1.050037078218572 -1243,505.6241266493386,472.88272077680176,1.0692378986035962 -1244,327.21952128251667,298.02548781637927,1.097958176933258 -1245,429.57311826365867,397.5434890902145,1.0805688686959622 -1246,516.4968399794366,483.03015070694374,1.0692848867167242 -1247,516.5037848087416,482.89589288396655,1.069596557808891 -1248,531.8630240071277,497.2929496144745,1.0695165182202033 -1249,529.2375098505808,494.9004365026788,1.069381780284035 -1250,1903.9665615254755,1813.8956351611296,1.0496560687497023 -1251,1548.8318651908673,1389.8252908967524,1.114407598807991 -1252,258.2237944268267,251.86658572666448,1.0252403814575917 -1253,273.11511174540004,268.31496203896364,1.0178899814977123 -1254,556.7138385658676,540.4883491255745,1.0300200540243716 -1255,273.61695085200967,268.7914858193645,1.0179524474814952 -1256,329.9476460313539,319.93803146860085,1.0312861041146195 -1257,600.4191272152922,574.8439754834365,1.044490597140463 -1258,377.7743567948937,366.21803136592007,1.03155586136999 -1259,81.79886171047572,75.69353224768439,1.0806585355643528 -1260,259.9151479116874,250.85065351997147,1.0361350240253382 -1261,318.45009784556186,305.01471395232966,1.0440483139948848 -1262,471.65441453123174,447.1284422062531,1.0548521856582436 -1263,755.2843106071577,710.0080377469334,1.0637686764841416 -1264,337.64913697053737,321.3653951943714,1.0506704891679985 -1265,1181.3817568762115,1018.9742185278211,1.1593833635781592 -1266,294.66436288677386,282.80067565995415,1.0419507032617026 -1267,291.66435977375374,280.27185800136215,1.0406480402764384 -1268,1450.7991745687104,1375.172790471282,1.054994095739424 -1269,1691.0315283102323,1587.7541153964949,1.0650462259314926 -1270,821.8548365824863,794.2615876428916,1.0347407571622371 -1271,291.64570369216926,241.9985332629442,1.20515484023732 -1272,741.7633273334635,682.8106410501724,1.086338265309722 -1273,244.74123118060237,236.07260976416583,1.0367201490469242 -1274,2208.670680813155,2114.8903609295676,1.044342875458739 -1275,525.8168519313731,482.74398728365964,1.0892250670797148 -1276,5153.015701882737,4864.226254528666,1.0593700687925862 -1277,3307.6616220221463,3121.074956667983,1.059782820965428 -1278,647.8482272296172,609.2022994945853,1.0634369367402157 -1279,512.1351527848213,469.93427779987417,1.089801653079069 -1280,511.8775274096739,469.5611924579012,1.090118893195303 -1281,369.3429120325745,347.47240261430113,1.0629417163887687 -1282,396.7337879580644,371.3004907003919,1.0684978821592643 -1283,1269.2252826395384,1212.1001291225862,1.0471290713897572 -1284,1319.5449371801724,1200.3412817066483,1.0993081361861021 -1285,146.97242487434144,145.2858540780305,1.011608637379143 -1286,290.9258522947192,241.41326917931949,1.2050947045442737 -1287,745.1281410924577,685.9435175538687,1.0862820655403906 -1288,668.6764897912146,633.4993001632214,1.0555283796192512 -1289,1199.5999338143602,1128.1154950895418,1.0633662413431741 -1290,1181.9964190435392,1113.6847711543728,1.0613384053176547 -1291,1248.9893737435411,1168.2516262857234,1.0691098951982725 -1292,1250.5741885579816,1169.6745758418929,1.0691642054866928 -1293,3524.132878452886,3277.161557139707,1.0753613506710162 -1294,2055.081185719063,1885.05756336552,1.0901954537929273 -1295,2084.967721729846,1968.9087707876276,1.0589458245420842 -1296,2244.3120781330476,2119.267616942447,1.0590036200199233 -1297,1166.6961843073468,1117.5168947927853,1.044007647440248 -1298,2337.9552004733905,2204.879171007041,1.0603552481316105 -1299,1791.936462421403,1620.9592170946034,1.105479054330101 -1300,125.71939377925835,117.88592972780557,1.0664495251429917 -1301,131.29810685353343,123.17103956218605,1.0659819655678413 -1302,481.63614752679723,429.31812041976445,1.1218630768621622 -1303,476.4924632480145,424.41036393465765,1.1227163701435325 -1304,206.42345895961842,191.63824393129207,1.0771516933416865 -1305,226.50858834712673,210.42249289410057,1.0764466537383046 -1306,84.55810832086055,78.41469274043963,1.0783452101349964 -1307,479.97302383420276,441.0992402667657,1.0881293369354414 -1308,151.3579195258174,139.46303225428682,1.0852906112771328 -1309,477.2940807946,438.8608425889092,1.0875749998085205 -1310,1108.8120529150092,1087.224980732505,1.0198552025248355 -1311,1093.3186376991937,1049.4039247148103,1.041847292496374 -1312,757.6616208679997,721.2842482374976,1.0504341703279843 -1313,358.72618346124915,341.59728884050617,1.0501435321073072 -1314,564.8590500032432,515.1309314795068,1.096534910805904 -1315,332.3872864807063,312.7122409844764,1.0629174138955646 -1316,382.7024438857436,359.71338015146745,1.0639093928743935 -1317,1187.4228861061927,1143.318126377943,1.0385761046822328 -1318,1364.4490326485397,1281.0340965248488,1.0651153129725246 -1319,3584.659159387492,3365.687626662009,1.0650599690211455 -1320,1261.1076346390173,1188.3334535449371,1.061240538905125 -1321,514.902144385691,478.91735252185157,1.0751377908408477 -1322,682.9075621572274,661.6217785714288,1.0321721325917639 -1323,459.314216093525,418.20128783578684,1.0983089470395935 -1324,582.2871096291918,512.7864021447231,1.1355353948423415 -1325,652.5761874804479,611.5972302730319,1.0670031765662542 -1326,916.1851024273113,854.0819357173342,1.0727133593544715 -1327,837.5358966005227,780.5041355735472,1.0730704149121084 -1328,365.4903516707114,352.74036777835664,1.0361455196428386 -1329,727.1122812487044,685.4775841930561,1.0607382327529509 -1330,574.6812232153601,529.0260861621591,1.0863003512443177 -1331,772.107005066734,626.9436123266702,1.2315413856779613 -1332,912.139579092282,819.4562685806251,1.1131034248748783 -1333,2086.3195515376115,1930.7515138022757,1.08057382662825 -1334,513.3169479636442,457.0960917967654,1.1229957052266284 -1335,664.84412543911,615.0912301003241,1.0808870178992327 -1336,477.3735790965437,441.4804640099597,1.0813017064460055 -1337,762.1243160629477,637.908038960963,1.1947244265871153 -1338,718.5663457558016,695.503799125301,1.0331594833263387 -1339,754.2887508696031,715.9721463842895,1.053516892631669 -1340,546.2529858425678,510.951768725719,1.0690891377181995 -1341,338.33354093896486,290.8791406992758,1.163141296847922 -1342,598.4518370383796,566.5550516018949,1.0562995340811079 -1343,694.8722777624291,661.9847473745409,1.0496801935668783 -1344,496.45750090430374,458.0286276700809,1.0839005924797855 -1345,495.420445968472,445.04500792182586,1.1131917831903753 -1346,1026.720571943594,954.5788239228157,1.0755744273943915 -1347,632.0911148836009,597.7171833956218,1.057508688796098 -1348,749.4137050824082,704.8960269757956,1.0631549567637741 -1349,437.8545274115063,395.08796819767525,1.108245663387131 -1350,846.5191806032105,778.829898082663,1.0869115100578268 -1351,1191.9655506976035,1126.192734709744,1.0584028061633797 -1352,320.8642510427492,290.49424990095565,1.104545963137474 -1353,742.457642117216,691.0265414060516,1.0744270988586286 -1354,591.8261703637875,528.9665043639797,1.118834870414695 -1355,345.9156374917375,315.1838177642803,1.097504433906061 -1356,592.1468094567987,529.2010138898562,1.118944964039777 -1357,340.18015368925774,320.12901590731985,1.0626345529008308 -1358,744.4024279567838,700.1824364556717,1.0631549567637744 -1359,656.2268678523561,577.044425618217,1.1372207038466873 -1360,359.02974923805925,349.6648437379072,1.026782519512232 -1361,424.11674919728324,403.81416773540303,1.0502770409858015 -1362,819.2772403321566,779.0062027206421,1.051695400461344 -1363,1656.3027573156978,1600.077466884976,1.0351391051960634 -1364,2143.906613266991,2047.4715532029386,1.0470995848089784 -1365,1075.4311744947395,1025.6933566587168,1.0484918982004992 -1366,331.4157296535978,319.2924919125707,1.0379690661324623 -1367,1641.3079324043827,1569.9522780744737,1.0454508428864002 -1368,1313.489680212454,1260.5051754536921,1.0420343413026378 -1369,208.92404475804872,191.21489074576877,1.0926138855776943 -1370,275.9983752722659,249.5878250278941,1.1058166608944973 -1371,275.9260918394003,249.50869179089364,1.1058776744765524 -1372,288.0283300085285,260.506531915875,1.1056472476534334 -1373,710.8806027318276,656.0195772757384,1.083627116257584 -1374,450.19234861701665,400.85010345539513,1.1230940063038106 -1375,2097.326659952877,1923.7723125856319,1.0902156384265562 -1376,743.1738280314609,700.7519364333469,1.060537673023111 -1377,336.4983061795237,324.0864852570349,1.0382978664248985 -1378,868.6535628759773,813.7767307904012,1.0674347520753948 -1379,444.27156496717294,417.4066285552028,1.0643615471679486 -1380,1777.6957015467178,1699.2674740031973,1.0461541392060876 -1381,1715.3822206813584,1639.703133979032,1.0461541392060876 -1382,1637.8032197112016,1545.0509740299046,1.0600318353506322 -1383,802.6557040166232,778.6046762096606,1.030889909272117 -1384,1349.9599226709595,1264.7850782281837,1.0673433343806489 -1385,2176.0554090336254,2028.7347532617164,1.072617011925809 -1386,1740.9932289896356,1664.1842380042124,1.0461541392060876 -1387,1739.4564570244365,1667.7979612317113,1.0429659331996086 -1388,541.9683448420683,528.7360302820993,1.0250263152161374 -1389,388.23118502835865,355.8771265299373,1.0909135656283873 -1390,549.963908244571,537.5001838490265,1.0231883165253863 -1391,551.2355867526816,538.7879776511612,1.023102982282169 -1392,874.2970968746489,846.1542168417698,1.0332597527409615 -1393,215.23962908542242,208.41405615427246,1.032750060418658 -1394,428.10112675495463,402.24061945588227,1.0642911383093392 -1395,386.5867075128841,370.08560810447847,1.0445872496715605 -1396,372.69311804215795,356.9409621917828,1.044130983884981 -1397,1678.4661676193778,1605.017223323838,1.0457620910406396 -1398,1674.5564253696436,1601.0729948175958,1.0458963649939144 -1399,1616.402091999227,1549.5204488622708,1.0431628012305767 -1400,1881.9221282394392,1803.6875201497137,1.0433748125524713 -1401,1477.7891156694225,1415.2236479406874,1.044208890813671 -1402,1620.2473677450996,1549.8663404313677,1.045411030279 -1403,1707.336670750729,1631.980827691749,1.0461744658885253 -1404,639.588949028411,610.0421061704158,1.0484341040710743 -1405,376.9379298716734,362.58256799519734,1.0395919802649372 -1406,1848.166477341775,1763.846187511017,1.0478047861700137 -1407,387.61707006711816,376.6108531403109,1.0292243753334076 -1408,865.8740373784634,831.1219981690209,1.0418134031899071 -1409,1135.480896008992,1083.9961277988507,1.047495343285668 -1410,356.23448226446993,337.80127438029876,1.054568201135378 -1411,481.98036357865317,476.43805323075367,1.0116328036988582 -1412,514.1121480564009,488.85932508849805,1.0516566252742163 -1413,401.332205249738,384.8371228874848,1.0428625030726983 -1414,403.67535994594857,387.0508326948595,1.042951793012148 -1415,512.894099085148,487.6902356923779,1.0516800656404122 -1416,1430.8203994529126,1388.1714804467672,1.0307230912080252 -1417,1382.8859309000632,1335.7017889415658,1.0353253565647216 -1418,342.7160081587714,328.07360912447234,1.044631444368156 -1419,342.2152455367241,327.57948987915984,1.0446784860156026 -1420,1179.3369217305299,1115.234083213286,1.057479267789724 -1421,342.8116641119158,328.18052447332917,1.0445825956981054 -1422,744.8965787187218,696.6622395453519,1.0692363335277768 -1423,722.5299843485676,675.7415681447853,1.0692401036275414 -1424,719.4264540395781,672.7958094678687,1.0693087619088928 -1425,719.7734891805623,673.163573587105,1.0692401036275414 -1426,745.6408864865784,697.3615801751567,1.0692313825193744 -1427,728.7258696955629,681.5362304717734,1.0692401036275414 -1428,727.1548238156117,680.0835054745352,1.069214027339528 -1429,739.7329351541914,691.8641189615485,1.0691881756557797 -1430,703.6997749355619,663.8994235009602,1.0599493688738595 -1431,736.8520702385698,689.1362077972008,1.0692401036275414 -1432,733.1958105699883,685.7167272570168,1.069240083296343 -1433,736.5759618981822,688.9116582218794,1.0691878314257697 -1434,662.1571341420429,632.2874680284189,1.0472406423090477 -1435,693.4999137765298,654.9874155065727,1.0587988369824957 -1436,693.3655796379613,654.9852520945623,1.0585972392823555 -1437,662.7919984477471,632.8973126011653,1.0472346544239803 -1438,796.4682047192483,760.613266527518,1.0471395119827733 -1439,479.34191111875083,450.21481666884137,1.0646959926050903 -1440,1111.8608831736037,1101.5184274025357,1.0093892716760593 -1441,984.4599670946486,912.2783104462957,1.0791224079557926 -1442,507.03265820092037,481.1348217484353,1.053826568524749 -1443,1036.4423028771425,983.573838543858,1.0537513933997618 -1444,2239.613410052841,2086.4963469996383,1.0733847740847395 -1445,1175.4106954222816,1128.7079237526193,1.0413771983759885 -1446,460.07984625635106,430.6096527622412,1.0684383020795443 -1447,565.413603179445,544.9312274833067,1.037587083769696 -1448,838.7960891693677,790.3093914211574,1.0613515393775343 -1449,350.88558617263703,314.93276491806716,1.114160307403783 -1450,745.998277913402,710.7578482190049,1.0495814851467367 -1451,732.5284572073256,698.0073275417146,1.0494566866327744 -1452,751.7967503244171,716.2835843146574,1.0495797569390604 -1453,739.8527622943014,704.9392354362815,1.049527001907352 -1454,181.67601779623106,174.62287624786737,1.0403907076776824 -1455,175.55055714785212,168.80504488349783,1.0399603712614736 -1456,175.9971120397586,169.2254812114212,1.0400154325451574 -1457,181.2259192624169,174.1930294165049,1.040374117549193 -1458,3007.951695450548,2865.8431572619133,1.0495869907704258 -1459,334.92067145686997,319.8906114347421,1.0469849988867024 -1460,1235.305801798828,1184.5308024121452,1.042865073059549 -1461,1063.0464402733148,1015.3568685732318,1.0469682859063099 -1462,400.99970540098536,394.69893816594396,1.0159634765280072 -1463,1161.2466598429542,1108.3223360618715,1.0477517433864367 -1464,1245.6836382518757,1196.0201602487025,1.0415239472157778 -1465,340.9711904134811,325.6240277053992,1.047131542522307 -1466,1085.4044788805606,1054.2927530965487,1.0295095699867367 -1467,850.7189484599429,823.6847927734586,1.032820996482716 -1468,1426.8547385260847,1381.7372957522236,1.0326526923117458 -1469,1673.0505500891927,1615.5348918641519,1.035601619324157 -1470,1176.0953417159308,1142.8472613851382,1.0290923218300367 -1471,966.3862574843461,924.0042245133076,1.0458677913440948 -1472,1063.4388661655819,975.7114281016329,1.089911254021728 -1473,1547.9509661249906,1428.8377387003081,1.083363718775394 -1474,3112.389303220831,2967.8412380061995,1.0487047835859775 -1475,191.06928302924803,187.9819856501421,1.016423368273446 -1476,340.2048075702032,329.9490006449496,1.0310830064804155 -1477,3146.95216381003,3000.882792837822,1.0486754668728917 -1478,178.93395087513247,173.18211490552352,1.0332126442314598 -1479,887.8267962297599,859.0243532437337,1.0335292508032703 -1480,536.3655760224459,505.236977208639,1.0616118776297567 -1481,182.83823626785716,176.7694362007531,1.0343317272348589 -1482,781.4132886540291,760.4027459846661,1.0276308085160264 -1483,180.50984281993246,174.80158006855467,1.0326556702127012 -1484,182.8802213849376,177.08509570879377,1.0327250898950502 -1485,481.04879686119443,467.68218346143624,1.0285805486555601 -1486,2499.297270152121,2421.1937646454376,1.032258263112668 -1487,573.3694842301145,547.119055260199,1.0479793725287656 -1488,613.3643654684274,585.2817072258243,1.0479814385037114 -1489,482.75809334546085,459.3609518153545,1.0509341106109322 -1490,353.5108201370418,335.2663759974212,1.054417756881653 -1491,1776.1045236685738,1667.4433138647705,1.0651663591201492 -1492,1378.224518131272,1303.2729936709386,1.0575102260419107 -1493,376.1531780259984,363.5298204558475,1.0347244073521171 -1494,540.8408333412424,509.48658474374145,1.0615408718038597 -1495,1358.7879606264278,1323.0549161039096,1.0270079828793077 -1496,1982.532171615005,1887.285033651617,1.0504678075993106 -1497,287.93279316518726,268.7138483748426,1.07152197367787 -1498,2326.433006056708,2216.1821755214924,1.0497480900951983 -1499,280.51532194559945,261.54011233354146,1.0725518141089538 -1500,141.88295471352228,129.4953806547127,1.0956603548032333 -1501,427.4673557170246,404.61521826872973,1.05647868991699 -1502,605.5135877474409,577.7926813778624,1.0479772542349832 -1503,263.6459221908298,244.4437609055852,1.078554515828536 -1504,346.19599908447356,335.45431663559555,1.0320212974351042 -1505,347.0424091124282,336.3032462215555,1.031932974217554 -1506,479.8828545618755,460.5925763992808,1.041881435244567 -1507,315.32979648235226,305.89264330997156,1.0308511936418743 -1508,1589.1976706339165,1540.6906613694673,1.0314839380030596 -1509,1621.254242604141,1549.1395702680409,1.0465514365007296 -1510,718.5366625440289,662.8785137985353,1.0839643276813304 -1511,1442.1432966919845,1354.9701114570853,1.0643358731663508 -1512,2330.454392163275,2205.7100294114907,1.0565551958727175 -1513,739.9122832247234,723.5609614558173,1.0225984024013774 -1514,1294.939292952034,1243.2774269121796,1.0415529671186603 -1515,2246.0827738181783,2127.7482607637917,1.0556149029640887 -1516,488.2022841552479,452.65671689588964,1.0785265432558107 -1517,489.7375596544143,454.12278431080233,1.0784254315661845 -1518,324.904792972198,314.16659972289665,1.0341799327451509 -1519,446.0679472009931,417.05963623539157,1.0695543477365645 -1520,238.31983280864566,222.1457517812643,1.0728084192368763 -1521,236.4366089338024,220.41213329076874,1.0727023299660827 -1522,177.0601251374307,163.42351675329758,1.083443366383547 -1523,487.34395620613077,451.8610460361654,1.0785261541821984 -1524,1107.211320864657,1020.5944852081414,1.0848690022451482 -1525,813.3869717345156,790.9380379956146,1.028382670525988 -1526,1752.1103833609313,1636.5221276904197,1.070630426386986 -1527,443.3732438345996,414.1845840739153,1.0704725885101394 -1528,437.4715904985955,408.7634850257226,1.0702315801791011 -1529,438.24810818280815,409.33917004912627,1.0706234346696224 -1530,514.3074627720664,483.9755988360979,1.062672300026929 -1531,1787.0766739575047,1691.6517336286247,1.0564093296698793 -1532,1644.8060577964127,1549.5695771193837,1.0614599577090766 -1533,323.47612217028006,313.9545284081613,1.0303279389228623 -1534,347.60377086223275,315.9744530599069,1.1001008704850233 -1535,236.93492978816144,220.87743258279696,1.0726986773505947 -1536,321.08274769057545,311.3867522563738,1.0311381115732843 -1537,268.7757149397843,253.91453358765253,1.0585282817101984 -1538,289.8745552192905,280.7436808643798,1.032523882022198 -1539,290.5954756209545,281.4451346612645,1.03251198842255 -1540,222.64431805892238,195.5215382907312,1.138720163544647 -1541,297.1339862382941,286.9201045986657,1.0355983476791046 -1542,110.07473497128484,96.18410492181417,1.1444171057240908 -1543,136.47880230992456,112.5164274956325,1.2129677892165764 -1544,245.85235721253187,232.88617934820002,1.0556760298125956 -1545,146.42886379993286,127.30063530440914,1.1502602752121631 -1546,125.59410153425814,104.51325410124582,1.2017050144911816 -1547,166.4671801929255,165.55820593614183,1.0054903606356684 -1548,109.2624431637597,95.49859164209124,1.1441262251620683 -1549,995.9675449518721,983.9834252837404,1.012179188551551 -1550,306.28434072038294,304.54602023155593,1.0057079074207087 -1551,178.61051529014483,169.939850928366,1.0510219605019762 -1552,1923.8556155647439,1824.966659738321,1.0541867191374348 -1553,1252.9039958466126,1189.7156219192675,1.0531121662716412 -1554,351.9885158481799,334.30107362135544,1.0529087209778394 -1555,778.4603105029074,745.009907819925,1.0448992722537962 -1556,915.5315684470106,872.4650039481602,1.049361939222733 -1557,945.1723786527031,900.3528138668472,1.0497800019009929 -1558,1015.8173912334921,966.9256943586153,1.0505640683251343 -1559,1021.2517228585472,972.0113474856602,1.0506582309972605 -1560,2978.599522851719,2886.6279520502203,1.0318612486019114 -1561,1511.6068582221255,1441.7292085174006,1.0484679434195436 -1562,1243.705837806913,1181.185620564127,1.0529300527828358 -1563,1229.6665548342296,1170.2013085411709,1.0508162534591514 -1564,780.0403057630077,748.1126822206643,1.04267755954567 -1565,1143.432042227453,1117.1808973694963,1.0234976671367793 -1566,1294.3678615511385,1205.4342502653094,1.0737772394191183 -1567,655.8787706894561,642.4921969344904,1.0208353872916074 -1568,614.8702156292086,579.4652810990015,1.0610993198126708 -1569,1338.99933432982,1221.6228739275052,1.09608240227604 -1570,1137.1522705773666,1061.4306769136297,1.0713391795721563 -1571,1733.9853513923276,1619.4102768476448,1.0707511099458473 -1572,2749.622785757705,2542.4077886166624,1.081503446484401 -1573,1343.2113224422021,1260.0362867873748,1.0660100320339922 -1574,367.28971235752505,340.5370401328726,1.078560241829241 -1575,2580.2211443945607,2463.104179946406,1.047548522470821 -1576,799.3211916037303,766.3916921004849,1.0429669317173755 -1577,422.0190277929895,408.21003110652816,1.0338281659787476 -1578,844.4760322224514,767.5566530876346,1.1002132921724994 -1579,1068.0573670335275,960.8783830381948,1.111542715381362 -1580,897.4302103874955,841.3622671936749,1.0666394790686688 -1581,529.9068508841468,508.50275694938205,1.042092385227511 -1582,478.45362983993016,452.9548458077685,1.0562943177850077 -1583,286.5071488692783,259.10169192289146,1.1057710458893595 -1584,241.0594491312998,231.0111869610406,1.0434968639503757 -1585,206.73769849389663,191.60387913208368,1.0789849319876261 -1586,289.8807337216556,261.9160994548581,1.10676943618587 -1587,242.60760284466338,232.49979820230425,1.0434744663028226 -1588,217.12581745257032,208.72486125727914,1.0402489485185762 -1589,144.13435321439582,140.6118494168968,1.025051258568225 -1590,242.73867629488913,232.6139401543874,1.0435259216785626 -1591,584.3552599102999,531.0322270192827,1.100413930036455 -1592,487.5268658249923,452.6995563781723,1.0769325018240712 -1593,1029.44141920649,998.9343442863737,1.030539619640278 -1594,394.3592153643787,374.2251524788902,1.0538020032916529 -1595,856.7714712256004,797.7478741491827,1.0739877835956226 -1596,895.3428863342821,833.7354087072847,1.0738933203311112 -1597,377.6129030253942,363.6833061539574,1.038301446988991 -1598,718.3293848366836,659.8292386478157,1.0886595239531245 -1599,70.94987449008805,67.79087028107547,1.0465992573323615 -1600,976.5498505598675,951.6583860648075,1.0261558820471162 -1601,1343.1547335429564,1237.74322986047,1.0851642740912988 -1602,435.2751588831172,407.17985953230374,1.0689997274990084 -1603,516.0043362897105,471.8867110780592,1.0934919847835118 -1604,424.6524851079203,397.13209637167535,1.0692978205178578 -1605,411.7360683712254,361.01621252493163,1.140491906143387 -1606,656.1651092280483,609.2953593889309,1.0769245147150366 -1607,95.67172272798472,89.3593329783824,1.0706405200129392 -1608,89.52021871552503,83.61370323854652,1.0706405200129392 -1609,95.67747526889487,89.36470596847816,1.0706405200129392 -1610,104.0427379168798,96.92628628486023,1.073421276155209 -1611,332.45952941924133,310.5232131789038,1.0706430801606424 -1612,283.84345242921063,262.95893444250936,1.0794212146888176 -1613,2240.6565989736737,2193.668550164137,1.0214198488673327 -1614,644.9174540415853,596.87629299465,1.0804876347256196 -1615,645.7880253876333,628.2763495844214,1.0278725688382113 -1616,494.68582583288537,472.09707592318784,1.0478476801948522 -1617,419.61931280342964,402.24948026058456,1.0431817401767494 -1618,99.33631272779125,94.91791095488672,1.0465497157328352 -1619,491.10037550049975,475.1227191151831,1.033628483216024 -1620,678.7437740010138,637.1045526785915,1.06535696715297 -1621,810.607253980028,774.7328770155924,1.0463054789963606 -1622,420.35140014169104,402.13356289271337,1.0453029513824443 -1623,506.6160554850257,493.1280789473569,1.0273518728977278 -1624,906.0443086537246,844.9799040353691,1.072267286271224 -1625,509.6624156419754,474.54787409187236,1.0739957830752074 -1626,504.3428979865124,482.5999350825351,1.0450538040380357 -1627,705.8821699828287,621.1496883396311,1.1364123386581622 -1628,658.6583549896076,635.4266803840834,1.0365607477978134 -1629,661.1878310672081,637.9560097464736,1.0364160239355171 -1630,328.7060377983884,317.12999927628834,1.0365025022814536 -1631,609.9665426828791,588.5344577814338,1.0364160239355171 -1632,1232.9271389603875,1143.2398063620728,1.078450148515831 -1633,1274.7963506505746,1195.5360549324096,1.0662968677449431 -1634,995.3969046140014,966.7670295665871,1.0296140374793805 -1635,419.7834259082184,383.4733816412844,1.0946872612422935 -1636,246.12640612300902,220.09379081578507,1.1182796443767595 -1637,1305.3413168515738,1244.3401019284854,1.0490229438306684 -1638,1667.386215692161,1542.1263600254952,1.0812254163560209 -1639,1762.5450642172088,1628.415604705537,1.0823680755232792 -1640,1270.7241216249233,1224.5401143877552,1.0377153893894764 -1641,990.9847334405314,925.8238609498742,1.0703815004549608 -1642,774.0906001693556,741.6473703278429,1.043744818817562 -1643,1014.5084488910118,981.9802081543248,1.0331251490270106 -1644,2087.2183603997037,1983.5391188361978,1.0522698244662487 -1645,622.0525074409911,578.5778527323454,1.0751405441866395 -1646,727.3044775249917,677.2928026585266,1.073840552668149 -1647,827.0660259194618,771.1719721443859,1.0724793636102363 -1648,1027.5170472785148,958.2426415452808,1.072293177875617 -1649,1781.7903702781543,1734.1305341085722,1.0274834190576556 -1650,2421.9766710745625,2346.1600701126176,1.032315186814302 -1651,615.8889424128188,572.7622730207885,1.075295932402421 -1652,607.1405205448489,564.5414153438307,1.0754578920929536 -1653,580.445073727848,534.1844282101997,1.0866005129963183 -1654,547.1662557394866,489.1561001259135,1.1185923176643218 -1655,349.0887655308634,346.0429827898428,1.0088017468710535 -1656,251.9767846563558,250.48264421006436,1.0059650458058818 -1657,701.9377369338525,626.7518043849618,1.1199612542363104 -1658,552.4803088236407,514.6602008003165,1.073485589063449 -1659,529.7386987660947,481.3262121300377,1.1005814464618802 -1660,595.0078243541342,544.6321934918275,1.0924947725534382 -1661,1085.9337137386935,982.2164281410352,1.1055951444367063 -1662,762.682860041763,699.7561811844415,1.0899265780701053 -1663,1172.682836245262,1069.0799411919318,1.096908464055384 -1664,832.0753212416228,760.1414421487115,1.0946322290882786 -1665,867.7532639686129,812.9512788903354,1.0674111555037853 -1666,1057.9113506136932,1009.6788396508935,1.0477701513279971 -1667,1035.2279409117727,966.3915740159788,1.0712303053406547 -1668,1051.3518214896167,1015.0010052975445,1.0358135765406618 -1669,279.0184778121485,273.66909357518324,1.0195469066933407 -1670,489.4307507725727,475.35405428416954,1.0296130775819323 -1671,283.34172504991733,277.8398418081828,1.019802355219929 -1672,487.660212451722,473.6322943494665,1.0296177398999424 -1673,1013.5987693921146,882.7284094036219,1.148256653569029 -1674,511.6598434188773,491.4175867605652,1.0411915592841303 -1675,547.281442564535,527.9386693113753,1.0366382960323588 -1676,755.0258132046789,724.2829685035748,1.042445903104171 -1677,768.0110634434703,736.8571013764829,1.0422795166237666 -1678,1170.2937259218086,1131.9368487813001,1.0338860574967634 -1679,1165.3681329591825,1127.1686109159202,1.0338898028860313 -1680,740.7403054418465,709.4224625919085,1.0441455472603967 -1681,762.6258356307053,730.2217938756062,1.0443756157743755 -1682,332.51160983282705,315.0032521342398,1.055581514095372 -1683,332.90458120632087,315.30746894497213,1.0558093733720586 -1684,189.28663443971993,165.00151419875766,1.1471811962386531 -1685,189.96507400584332,165.61991674938693,1.146994140163076 -1686,563.1528360263338,530.6846059371661,1.0611817824107226 -1687,577.0117070490381,548.3776778577164,1.052215891250685 -1688,191.01220540754184,166.6652875092146,1.1460827162163636 -1689,275.6937439255967,256.97251583875357,1.0728530365425946 -1690,701.8841054173976,648.8684510894678,1.0817047804357185 -1691,281.97900593647506,261.19471848421915,1.0795739193076819 -1692,277.45791014829086,257.53730122222436,1.0773503831543119 -1693,244.3056368125451,229.9764323416159,1.0623072735107224 -1694,194.0414871770692,188.62319348003928,1.0287254902065015 -1695,246.82430091147108,231.3425509512319,1.0669213246615525 -1696,469.8497564271628,458.8336028191126,1.024009038440877 -1697,407.46775611279105,377.49992500394893,1.0793849988408042 -1698,400.13029411945934,376.448667199012,1.0629079844979976 -1699,399.9226760166895,363.69965210268117,1.0995959817519476 -1700,466.97836444269603,447.55499052585975,1.0433988545050399 -1701,391.87618401587895,367.0556516360058,1.0676206244727344 -1702,572.6107147909465,553.4231954275475,1.034670609258753 -1703,347.7974730827219,322.85796828802415,1.0772460562981956 -1704,590.1175269324528,570.6750075644211,1.034069337381727 -1705,1020.8787247675907,954.7240353281828,1.069291949287385 -1706,551.7923632441327,530.4717489856006,1.0401917996562544 -1707,265.35634336568,255.66696476590266,1.0378984379489515 -1708,237.0378963194763,230.57166819108681,1.0280443307676057 -1709,98.61597304789616,89.42459246347322,1.1027835892925908 -1710,362.59952976127863,348.30459748120785,1.0410414688277034 -1711,161.37660607212734,161.243330093866,1.0008265518839368 -1712,135.47775547864657,130.26523006138245,1.0400147101019046 -1713,164.71088597765248,164.65272210040078,1.0003532518412677 -1714,163.78210324228075,163.78166356765448,1.0000026845167933 -1715,235.45954670494197,229.0426394215529,1.0280162126126164 -1716,323.6947346939156,311.73431064286206,1.0383673649088823 -1717,233.9814672198241,227.61302324250275,1.027979260090651 -1718,342.7602172064903,329.78604236806143,1.0393411884422596 -1719,1187.332949528651,1130.5101879079798,1.0502629363524996 -1720,526.3223291059322,491.17654060258855,1.0715542897472787 -1721,1147.5801661748599,1082.6077716244833,1.0600147128566089 -1722,741.4982607609243,696.2834584227995,1.0649373495681542 -1723,706.1225193052477,685.2776715282145,1.030418104431373 -1724,455.5524512629893,439.7141500596804,1.03601953951484 -1725,519.1277953771614,486.04456891956016,1.0680662403679209 -1726,747.5451933473212,702.5625540531697,1.0640265255166832 -1727,1620.7436822689897,1569.820618395798,1.0324387788492866 -1728,3193.4371776412195,3038.774252157666,1.050896484124721 -1729,2084.3063669489147,1976.4716970284264,1.054559177387976 -1730,558.7766681051422,519.4164404639279,1.0757777855588455 -1731,1025.0894779741811,961.1364096191465,1.0665390133127681 -1732,658.4772511157015,638.2019019329152,1.031769490378168 -1733,968.0024443166972,897.5770110989442,1.0784617167629191 -1734,2888.4115644668136,2676.060982367686,1.0793519219099585 -1735,1683.7927431849764,1497.07104982177,1.124724670472678 -1736,1674.3461210512648,1523.744138537581,1.0988367920208866 -1737,560.1610103638474,531.031459136746,1.0548546620466797 -1738,732.5034506269905,662.2687437188807,1.1060516709783346 -1739,776.8417983791434,719.6670610869481,1.0794460944285007 -1740,1937.1364346199894,1837.6652002421445,1.0541291386291354 -1741,3414.1436615470802,3297.1460399671146,1.0354845130187598 -1742,1756.5545672300855,1696.8890045228845,1.0351617357105671 -1743,799.5457444304172,744.7369197485792,1.0735948805926545 -1744,2659.1685470962134,2557.6732571223865,1.0396826645824253 -1745,925.6914902101976,879.126813219295,1.0529669625481974 -1746,908.3097737122513,866.5727962556401,1.0481632675719244 -1747,646.0500768628915,596.6806086031997,1.0827401922366193 -1748,1068.258003570958,938.7478042576088,1.1379605882708508 -1749,1477.7142997535968,1414.1937451295169,1.044916444329389 -1750,636.2938307756968,610.1071677925538,1.042921415065307 -1751,1487.315526017514,1384.6716965788155,1.0741286398012657 -1752,4384.091820653534,4175.521055281819,1.049950835503005 -1753,1149.0424985403913,1110.7973650340584,1.0344303423020456 -1754,1131.8294472435982,1087.3890047743673,1.040868945955962 -1755,1014.8853877075012,967.3092648563726,1.0491839834266374 -1756,971.5170623355064,912.5253306310303,1.0646466785351394 -1757,1102.0501532996764,1028.032004946388,1.0719998482509778 -1758,941.494331190685,884.2587345076532,1.0647272053409798 -1759,1032.9771326825726,943.9417994047357,1.0943229056431063 -1760,1689.536424196861,1579.7508205036568,1.0694955193365256 -1761,3893.116511778345,3742.8786396131,1.0401396589713565 -1762,1649.510718792898,1567.343048200276,1.0524248157970089 -1763,562.2869157601052,533.2196627883025,1.0545127177415117 -1764,975.8979138452258,937.7748407808659,1.0406526933827907 -1765,603.8749627949753,573.8655018946481,1.0522935440469052 -1766,985.6642544109773,948.1065154866152,1.0396134171750582 -1767,3799.202877399403,3660.0905956918637,1.038007879332627 -1768,3666.1092461358458,3535.4219707352568,1.036965113777751 -1769,3404.7412880657034,3284.0287499611068,1.0367574547287464 -1770,534.7640433531137,518.689158020231,1.0309913656075604 -1771,834.7506632459668,805.9348860360215,1.035754473108461 -1772,738.536016684704,713.846843936544,1.0345860921819172 -1773,562.6624288606104,545.3858216573508,1.0316777710699527 -1774,1015.7850112266352,935.2656042415368,1.0860925566170012 -1775,1437.1843876546486,1348.5388068938098,1.0657345419410085 -1776,1203.8431544533157,1141.4034897755373,1.0547042875171666 -1777,332.11777921928734,317.5639809781378,1.045829499291204 -1778,806.0693811769552,759.8189180244558,1.0608703758952875 -1779,757.5835533767676,714.2776645502361,1.0606289276227057 -1780,316.0591288365113,298.15078952935227,1.0600647052970358 -1781,1835.661524862744,1747.0961324415646,1.0506929131011293 -1782,3077.661363728373,2869.779503471317,1.0724382692139238 -1783,935.91394922401,881.9139467498646,1.061230466615425 -1784,923.4244087360397,870.3823664337317,1.060941081009764 -1785,909.0440243964391,856.8541064670961,1.0609087562695214 -1786,868.9255041235701,818.987203020123,1.060975679374834 -1787,898.2806069512019,835.6235260821792,1.074982427987386 -1788,929.6306737112722,863.6998003120942,1.0763354042404016 -1789,694.4640866315028,651.6636785630875,1.0656786767106459 -1790,934.9985471870167,868.6372460774519,1.0763970246604504 -1791,1375.4784304264053,1322.8676921225078,1.0397702193629696 -1792,1364.4780877193527,1311.5730066343224,1.0403371225371527 -1793,856.2713861706002,821.7711937388539,1.041982723043356 -1794,900.8905032610102,871.1958581637358,1.0340849245540071 -1795,1457.6681529224163,1407.9561223248872,1.0353079402186498 -1796,877.2689460602481,848.7049440882814,1.0336559863011656 -1797,1467.0840182222203,1417.0508707895958,1.0353079402186496 -1798,889.8807176306699,860.8348690949693,1.0337414869895287 -1799,1725.5772430306545,1646.4696691245983,1.0480467848205892 -1800,3236.5352845319885,3129.842347627704,1.0340889172852918 -1801,1848.8215831708192,1814.4627130849292,1.018936112513149 -1802,126.2136477138279,123.03870014957977,1.0258044628266416 -1803,285.20344898468676,272.3512030502888,1.0471899730585175 -1804,346.27015806582494,330.09350298579636,1.0490062813527252 -1805,352.03888017188933,346.1468276596709,1.0170218301639657 -1806,805.5852709212169,779.8668664311691,1.0329779422579402 -1807,742.0866901280383,715.013287556254,1.0378641950337941 -1808,943.7156802962506,909.5493611213822,1.0375640076672088 -1809,1164.7103564500217,1114.796435454227,1.0447740227797346 -1810,397.84585101888086,384.25226657499405,1.0353767189587515 -1811,1339.7298228869363,1274.4019315442865,1.0512616072885947 -1812,2017.7822930228892,1951.7468299057182,1.0338340311895682 -1813,862.1560083475279,830.3448989341008,1.0383107181777866 -1814,1657.6564030083173,1593.1721055229568,1.0404754120799733 -1815,379.5577505433757,368.64469651295354,1.0296031765373266 -1816,709.2635653835517,678.8050890746946,1.0448707247471822 -1817,5058.634941134445,4821.801442827577,1.0491172233272188 -1818,2074.617711500103,1978.8207485451362,1.0484111373025566 -1819,1494.968561438746,1430.6708394038983,1.044942358692121 -1820,897.7931121266372,871.9274852259343,1.0296648830768313 -1821,2010.6362974394472,1917.5453476691418,1.048546935217705 -1822,1494.3646454905436,1414.9045880325925,1.0561593044011817 -1823,1384.4982279895917,1322.233961676871,1.0470902034869505 -1824,1054.5740159049426,1010.4409407772166,1.0436770456804525 -1825,1965.0723628255073,1862.7562770911059,1.054927253228307 -1826,1753.283778372399,1696.104312236331,1.0337122343971146 -1827,1330.0488393778826,1278.8064746060622,1.0400704608471782 -1828,2080.3235327103116,1974.9108604811192,1.0533759139911318 -1829,500.7837472683377,473.74448641370554,1.0570756212052665 -1830,258.3928139097221,221.8952521521078,1.1644810396060006 -1831,328.13898889354886,314.7913828043356,1.042401434150787 -1832,437.1649272878046,406.1760910582032,1.0762940924190458 -1833,1190.4766890155383,1120.982387808052,1.0619941062083715 -1834,1865.4693290083796,1771.9660072639638,1.0527681238585336 -1835,407.91010813477067,373.42009832753575,1.0923624892224812 -1836,393.14536659471224,362.21880946186803,1.0853808701397656 -1837,391.6662271568988,359.2761489984379,1.0901537111460236 -1838,442.60305864787915,413.2607806156302,1.071001845344574 -1839,1492.9890777123856,1411.727690842093,1.0575616582414844 -1840,530.5021525590524,502.9165721102159,1.0548512059029764 -1841,1009.7590454466825,945.8033141380192,1.0676205404999568 -1842,2906.544549349679,2707.071469220619,1.0736859304961348 -1843,2981.3578862679146,2806.6308400917032,1.062255086661309 -1844,549.3359930565265,518.4810412150256,1.0595102798150429 -1845,269.3630604045545,257.5569858933944,1.0458386887476885 -1846,863.952413832826,804.0564788696392,1.074492198666678 -1847,734.9133374683195,685.2168818351204,1.072526607196402 -1848,1849.2771329957209,1752.2394464544527,1.055379238686595 -1849,4290.316225058476,4049.7199070868637,1.059410607027557 -1850,2645.1178653173315,2480.090316778394,1.0665409430545683 -1851,2107.8942378644156,2014.352509178302,1.0464376161867872 -1852,1189.01105078709,1130.5202089112315,1.0517379887726104 -1853,1290.6287363447327,1259.6703676070395,1.0245765634675554 -1854,2256.155068395385,2161.6905800544555,1.0436993569813076 -1855,1359.6457217846432,1301.9733346786948,1.0442961353891176 -1856,1863.0294914845763,1784.7768628255424,1.0438444885122218 -1857,481.74999999468565,446.4803605654487,1.078994828315784 -1858,866.510980171034,813.5822273029037,1.0650564271095175 -1859,482.1134383399081,456.86605122656454,1.0552621212400461 -1860,464.0036273390115,443.7353239973461,1.0456765604303944 -1861,391.5777639120517,335.735811312413,1.1663270664554637 -1862,454.90416268504345,420.94471425911405,1.080674367145101 -1863,1186.7232933697453,1059.282254567815,1.1203088584297356 -1864,259.3681267219557,248.0295733158401,1.0457145220811115 -1865,259.0615477237488,247.6184349859256,1.046212685006565 -1866,260.73766334130625,249.22088771606323,1.0462111170969106 -1867,258.76716313652423,247.40620339648177,1.0459202703249761 -1868,1038.3400661599242,1014.0404199066245,1.0239631929618123 -1869,757.0161275185098,692.4557926242679,1.0932338722296933 -1870,1052.2773597158268,1001.282569969532,1.0509294691386135 -1871,400.28922288098624,384.8980547486513,1.039987648527831 -1872,201.05792072355675,194.2701123471308,1.0349400548258147 -1873,607.4629701652773,585.4080209801579,1.037674490944269 -1874,200.321193998453,193.55825785694222,1.034940054825815 -1875,1246.6679702634508,1189.4069839060144,1.0481424669034574 -1876,2505.5512949337817,2371.698129869909,1.0564376905214388 -1877,1218.8199981104303,1161.4372558809837,1.0494066656970809 -1878,615.074447435115,581.2708953430688,1.058154558163617 -1879,1050.4917927510494,988.5852726464051,1.062621325461306 -1880,464.9087179900554,438.2127240428638,1.0609201706899325 -1881,1544.3500917126553,1491.700953980946,1.0352947000477561 -1882,657.2836821661434,625.0974907782147,1.0514898745599803 -1883,1215.696272004938,1167.9125065065966,1.0409138229380468 -1884,1189.7081781274585,1140.9498230061038,1.0427348811824952 -1885,466.30571873076326,441.43982947772736,1.0563290568557329 -1886,259.11731381007183,255.91102204414858,1.0125289318932504 -1887,1231.5259501762564,1204.8341741398735,1.0221539001874993 -1888,1281.7674050905919,1240.7184608293721,1.0330848178351277 -1889,223.03485959023374,213.83452408487636,1.0430254915324408 -1890,181.35467473906104,179.70009132982975,1.0092074711647998 -1891,25.800521049478,25.724236262496312,1.0029654830644246 -1892,267.3173473398645,256.06988631867324,1.0439234038132623 -1893,429.9487325640014,419.35793554136,1.025254791015149 -1894,337.9701087236291,328.5529390811902,1.028662563995849 -1895,574.8489202066128,552.245090832535,1.0409307927753626 -1896,391.2858356536227,371.64330568291285,1.0528531784922528 -1897,1322.2829797739246,1259.616206695153,1.0497506881426921 -1898,524.4741518458527,501.3558244593388,1.0461116162586614 -1899,382.5700468143861,366.1017576552462,1.0449828191610264 -1900,374.1424546297658,358.0458650729683,1.0449567810356282 -1901,526.4816709947726,503.2748540520887,1.0461116162586617 -1902,725.3903824393493,684.1715095752292,1.0602464035512251 -1903,1804.9960543869663,1674.1858735796864,1.078133606830397 -1904,1303.005435506759,1231.814457911913,1.0577935882612746 -1905,117.65105987474071,100.49764366917015,1.170684760152568 -1906,221.7227949688625,199.16161015245694,1.1132807914092235 -1907,1621.3170446547708,1538.331141735024,1.0539454091959357 -1908,1673.4248754359508,1599.962696706177,1.0459149321924877 -1909,848.5343648823168,804.463724702206,1.0547826319905533 -1910,1509.67459988983,1445.6034313308753,1.0443214004410382 -1911,1304.2878316929969,1247.1447778600257,1.0458191020380352 -1912,3759.023373164279,3642.4999653446885,1.0319899544071962 -1913,4834.714319094085,4658.934122834605,1.0377297020359093 -1914,2553.4103504860595,2456.564512967069,1.0394232828031937 -1915,478.0605980045608,457.76363971597146,1.044339385061651 -1916,870.9200740881635,840.9880912074824,1.0355914467679381 -1917,854.6701202130218,819.3671312732038,1.0430856786810099 -1918,431.0968190863744,415.3511528037107,1.037909287542305 -1919,5222.051588733133,4984.7237273178025,1.0476110361171476 -1920,2070.5715319023734,1951.0926577563637,1.0612369041885499 -1921,804.9396881597501,772.2131063654709,1.0423802464947938 -1922,412.3016044610551,395.08891150189186,1.0435666313532588 -1923,458.47142737768974,442.19384640549094,1.036810962216042 -1924,594.4810088826235,569.812607170995,1.0432921304323226 -1925,455.6183628384898,422.0501259781497,1.0795361375204944 -1926,527.0852100140049,503.63399400987976,1.0465640053750327 -1927,456.1063363016764,422.4957722482817,1.0795524269379986 -1928,610.8143138306706,591.8167502052087,1.0321004155743727 -1929,2746.612368718363,2681.467273768751,1.024294570210455 -1930,2627.800356608649,2546.669129338595,1.0318577809482163 -1931,2659.7295459812008,2577.712775811124,1.0318176528198602 -1932,2764.0105751875494,2713.252216954697,1.0187075709053774 -1933,353.96662059694916,349.31056078062153,1.013329284422213 -1934,1332.789983814086,1273.1375542878363,1.0468546617962409 -1935,1010.4089265028969,966.1789785873074,1.0457782138670209 -1936,419.8545819563705,402.07678265256095,1.044214936228167 -1937,836.7697871627187,797.688110366512,1.0489936809741967 -1938,1080.491792068006,1029.1079963501961,1.0499304211997633 -1939,716.1694992358407,690.35091694302,1.0373992148908113 -1940,532.6925582894403,522.0718628088888,1.0203433592904418 -1941,397.18000630767636,377.83153725034776,1.0512092484341995 -1942,871.094958823329,828.9510936969517,1.0508399897736116 -1943,1049.2041935496977,1014.0187078205792,1.0346990498870996 -1944,370.36274632885454,351.66237121223503,1.0531770716672255 -1945,520.9063227646444,501.7271992262987,1.0382261985555525 -1946,951.2498230811898,890.6834636585255,1.0679998696437958 -1947,798.7137090131154,786.9984413872294,1.0148860112165352 -1948,559.6318299512881,555.7370142091686,1.007008379219912 -1949,678.949960993233,633.1293381370751,1.0723716626226496 -1950,1160.7079902024664,1119.4343064118257,1.0368701258789692 -1951,270.72432777192154,256.7562518919392,1.0544020867147612 -1952,251.08145196278113,246.87204630714976,1.01705096108935 -1953,816.3169404829862,790.2107838574844,1.0330369531254209 -1954,2188.8172142724957,2135.838827833459,1.0248044869999748 -1955,3204.971670327929,3127.202961095324,1.0248684559972936 -1956,3170.6268200494123,3023.4079613720996,1.0486930181299454 -1957,3187.5136530166446,3024.712064496662,1.053823830185659 -1958,1862.902087839933,1725.9439714633427,1.0793525853915584 -1959,2168.503969841598,2115.543571075296,1.0250339437534643 -1960,2864.069396805012,2791.782709067249,1.0258926625997746 -1961,3143.8040479075084,2974.4829189928323,1.0569245591674161 -1962,3347.17204917528,3176.2470752707827,1.0538135006043021 -1963,1946.3577593509724,1803.264091543255,1.0793525853915584 -1964,459.6588993623951,437.87207576363693,1.049756138389877 -1965,503.3334882846133,452.0418001313375,1.1134666929880674 -1966,753.2180452898548,664.0663001444417,1.1342512714860273 -1967,772.8166005745827,718.6309631789854,1.0754012005771334 -1968,1531.9667372678696,1427.358167711998,1.073288241117193 -1969,1899.7075848763182,1774.8069044018305,1.0703742362984459 -1970,505.15642776497293,449.4626642104771,1.1239118796492855 -1971,119.87608334322813,111.0577049411386,1.0794035713844738 -1972,125.42286849644162,120.21151373251239,1.0433515443081869 -1973,427.8791884679381,404.2965315313145,1.0583300995615814 -1974,383.56392333854836,367.0157664810972,1.0450884086428027 -1975,607.7365519344514,585.692425371302,1.037637718379531 -1976,419.1839330628931,384.7709832274283,1.0894374870651933 -1977,1177.9385025940157,1120.8216990133944,1.0509597589258832 -1978,1072.1683753527368,1025.5319449529663,1.045475356110832 -1979,2205.3438457043508,2104.3755625225663,1.0479801633225352 -1980,946.4442534527485,906.6587055743363,1.0438815042902052 -1981,959.6680226782568,919.9684081589781,1.0431532367494278 -1982,663.1530871395584,627.9562601270478,1.0560498067260122 -1983,563.8881564555405,534.8085134437416,1.0543739343724152 -1984,665.7259921706664,621.0231087968274,1.0719826408077575 -1985,145.1920809535233,136.67752295571816,1.062296695269812 -1986,521.0194360598915,484.6396576137622,1.075065624272792 -1987,151.78303809427962,139.40491543865502,1.0887925839392054 -1988,1806.383448329206,1690.5357997423996,1.0685271785456771 -1989,4258.643856506577,4005.1827399557314,1.0632832839366644 -1990,2205.7942173660517,2100.1559844105764,1.0503001842432782 -1991,2211.7696758829934,2077.024410824363,1.0648741846058278 -1992,2945.0624116080376,2765.6835983764945,1.0648587616229281 -1993,2725.385194493634,2558.1257489309114,1.065383590166599 -1994,2965.926470555442,2789.553956173923,1.0632260630740504 -1995,367.7288131878078,351.0124308648107,1.0476233342557468 -1996,375.1954018779702,358.1998588382251,1.0474470958611428 -1997,1389.8124874630532,1305.1078803122743,1.0649023796642094 -1998,1421.1540467225452,1334.3357743033223,1.0650647866085672 -1999,395.79365061119273,382.5188978922502,1.03470352129552 -2000,373.4803423354667,358.21534691506895,1.0426140184999304 -2001,404.4847193683968,391.81242547007037,1.0323427565706296 -2002,402.97282380144884,390.04655947314865,1.0331403111099358 -2003,71.91706371902858,56.01692345230402,1.2838452968639529 -2004,729.92641241155,643.621595602396,1.134092481356809 -2005,1227.99361998139,1185.421373335324,1.0359131761951315 -2006,1244.645740257406,1196.471574370765,1.0402635272902128 -2007,749.5914173633158,735.0572965319027,1.019772772680425 -2008,513.1137053057785,498.49253170546837,1.0293307776352985 -2009,374.619376457337,362.2624886392183,1.0341103156016385 -2010,1017.3629227641159,999.9892988389839,1.0173738098450686 -2011,593.704662933787,584.1855001132762,1.016294760514708 -2012,762.9198229886244,745.1147033336612,1.0238958103702729 -2013,240.53417985879372,237.26657680357923,1.013771864116873 -2014,336.0549401243085,331.1467031931149,1.0148219411030381 -2015,929.9049559800326,855.6216679004033,1.0868179136485778 -2016,437.7213410261114,406.8714256510157,1.0758222706982536 -2017,452.4524001757941,441.19903355125695,1.0255063265527977 -2018,747.8134049160615,703.5587560862207,1.062901141442716 -2019,820.0576680927272,777.181870717265,1.0551682932797852 -2020,915.6101774339188,848.7404711557107,1.0787869891336195 -2021,1320.8488162048816,1257.6429521729317,1.0502573993061735 -2022,1116.940185171962,1038.813834867066,1.0752072678305191 -2023,1629.0775087551988,1578.0879184570358,1.032310994654859 -2024,2291.2326221190315,2202.4811283406975,1.0402961426712416 -2025,2632.7878525318993,2527.3035292597365,1.0417378926001262 -2026,3409.0847226632964,3288.3556945726227,1.036714102519364 -2027,2594.7605257306204,2411.2992741052444,1.0760839824386597 -2028,2835.7678468997424,2716.8404920539847,1.0437741395542313 -2029,1214.4282971053124,1171.45019170457,1.0366879494365913 -2030,1767.3911055425017,1705.4679133971565,1.0363086233748011 -2031,1371.0574123830033,1326.4467476141683,1.0336317042874692 -2032,710.3890127960086,688.2497650000485,1.0321674614679435 -2033,3324.3803406366005,3197.612783259282,1.0396444366375426 -2034,4315.30102462731,4134.367658888341,1.0437632500704155 -2035,4603.068441016602,4426.552445867346,1.0398766302461981 -2036,5479.507890028579,5245.149594922998,1.0446809553978071 -2037,1695.770163290725,1633.0540277757825,1.0384042012378254 -2038,1910.4755596188313,1840.212293435184,1.03818215237139 -2039,1773.7397643028667,1708.5305058185245,1.0381668681140122 -2040,1875.8735441546135,1804.7015371850423,1.0394369958151555 -2041,4191.084417510977,4042.150532244368,1.0368452100134713 -2042,1884.3033614630524,1829.6285555395518,1.0298830086347102 -2043,4239.691859543293,4062.2012616573816,1.043693206331558 -2044,4725.514540076735,4542.6582883523815,1.0402531381665239 -2045,6333.258615442008,6099.439665113252,1.038334496800767 -2046,3790.5869091786476,3656.940453880975,1.0365459752443709 -2047,2759.769026406769,2666.0958163033547,1.0351349750937668 -2048,1611.1040792373158,1570.327640441595,1.0259668350384854 -2049,3829.52988203126,3674.00346861899,1.0423315913391693 -2050,4381.772039472903,4197.633681242832,1.043867181420069 -2051,973.6418045717995,940.1254997065005,1.0356508837126135 -2052,324.3124083017474,309.79900454284785,1.0468478063069186 -2053,371.6503916419757,353.40124383558737,1.051638606611352 -2054,371.7403625349667,353.510615648211,1.0515677495379565 -2055,327.9253695224198,313.22011130509276,1.046948639907108 -2056,1705.8729971314663,1636.927740535037,1.0421186927737534 -2057,2146.0878718324084,2066.223960345987,1.0386521079123718 -2058,2005.7284013452443,1930.1007782478496,1.0391832509212549 -2059,2957.0485646013476,2859.5639907213854,1.0340907124989254 -2060,931.241939710887,894.142433311587,1.0414917187879078 -2061,1651.7922796422756,1588.1944467535475,1.0400441098498545 -2062,1068.3263153966193,1043.2901874442457,1.0239972811531035 -2063,823.0200178663495,809.8639618718564,1.016244772719711 -2064,695.6738806390098,670.3082876999666,1.037841681811932 -2065,3082.3712504079754,3018.9124026302184,1.0210204336245294 -2066,749.2857382209114,707.0767135869262,1.0596951134479642 -2067,465.6494870494198,434.45242584642864,1.0718077730656264 -2068,420.7988699836177,413.2494231381196,1.0182684994165736 -2069,101.4983068196211,95.90523753169064,1.0583187053374672 -2070,147.98547580463983,144.92207012753465,1.0211382964265505 -2071,420.367337012713,412.9293804744504,1.0180126600091195 -2072,768.7419652425102,739.4374027481651,1.0396308901678937 -2073,216.20065188419238,212.0271302752269,1.0196839036756662 -2074,218.173560165359,214.39968362631353,1.0176020620703112 -2075,146.70907315683186,135.35240764907127,1.0839044218349263 -2076,146.60449210056308,135.22833368061208,1.0841255535013814 -2077,864.3505780478672,809.9996371737202,1.0670999570614503 -2078,614.8513265248888,578.1136366485364,1.0635475234407714 -2079,622.5014057302518,575.0875355687598,1.082446353344452 -2080,348.7932516353076,325.45372852193356,1.0717137985156042 -2081,348.05412867525797,324.7671552470305,1.071703597645256 -2082,116.97581882974357,114.80055346403854,1.0189482132277912 -2083,115.98167109215716,113.84885244345199,1.0187337737968376 -2084,844.6167319344738,773.2688457775679,1.0922678917513629 -2085,429.0955308431512,409.440262612151,1.0480052159638706 -2086,231.9597165192344,213.05392866413885,1.0887371003840953 -2087,226.94534113388679,208.09729235412317,1.0905732533400267 -2088,147.0329147876788,135.60703967982224,1.0842572416213336 -2089,2238.745700271761,2144.9653340496648,1.043721157043149 -2090,204.67117448317174,200.30508420213678,1.0217972014960386 -2091,117.33167178027,105.38138068318428,1.113400403559076 -2092,104.91027029555676,94.09806555001667,1.114903581517231 -2093,182.60910566302496,178.88145114262835,1.0208386867200916 -2094,440.4506964691184,408.37408241158306,1.0785471346959934 -2095,437.6968463615393,405.82078639049143,1.0785471346959934 -2096,167.2180880384433,160.23319216733674,1.0435920658923903 -2097,171.58495212241692,167.0576813443199,1.0271000455750727 -2098,883.2906682785319,830.1955690571857,1.0639549296578923 -2099,1006.6449782186427,923.6028981316774,1.0899110215601835 -2100,2200.8705568564637,2126.758557018983,1.0348473970366252 -2101,3441.4409931385953,3312.984277676706,1.0387737171973457 -2102,776.6981253098454,760.8636173603833,1.0208112302759276 -2103,782.1283028214277,726.5852641559277,1.0764439376981094 -2104,405.53433902612386,378.16465050399574,1.0723750580220848 -2105,605.038718429464,591.9212020299068,1.0221609166128407 -2106,2086.869389775564,2013.9564802941545,1.0362038158196745 -2107,1860.348413294323,1784.0706820036505,1.0427548818889882 -2108,3965.3428744881917,3723.8648878617514,1.0648460655523668 -2109,5426.766091083658,5135.003345125944,1.056818414000577 -2110,2328.69669880598,2201.825792771889,1.0576207738371401 -2111,1945.0792142311589,1838.574480249041,1.0579278865916226 -2112,421.2096508225763,366.214815860197,1.1501709722835836 -2113,489.09254976104154,436.06942074537034,1.121593320909866 -2114,665.5858900543686,626.3578020461795,1.0626288806174988 -2115,652.4874667669694,612.6361781776711,1.0650488658829107 -2116,172.8710157462687,141.328694326114,1.223184128110398 -2117,187.83115330335235,153.55918130945508,1.2231841281103981 -2118,183.34261137955048,149.9101501216603,1.2230166618521687 -2119,201.08325004429017,164.40552233307355,1.2230930396420032 -2120,182.73727634336274,170.53454045981786,1.071555802423616 -2121,195.36975570768695,182.32345589258395,1.0715557948988705 -2122,184.99352667560518,172.64012277064742,1.0715558104726863 -2123,196.3825073410496,183.26875750992264,1.0715547483886716 -2124,184.3046498222277,171.99724988620096,1.0715557948988703 -2125,199.1112162275163,185.85638106809088,1.0713176221513177 -2126,184.24822391230705,171.94459195631129,1.0715557948988703 -2127,196.17270135140797,183.0727481292992,1.0715559981262563 -2128,184.14611791690515,171.8493043419024,1.0715557948988705 -2129,194.7276175623024,181.74490479469918,1.0714337096947428 -2130,186.36907885426962,173.92392064462413,1.0715551843790048 -2131,198.6622004799351,185.44671141758525,1.0712630003591246 -2132,1573.5479871590742,1529.4657894643149,1.028821957312428 -2133,1079.831141660636,1031.898749733099,1.0464506735180508 -2134,1294.6315344126815,1227.883291192556,1.0543604133217723 -2135,1108.548060054803,1066.7689784094266,1.0391641325263037 -2136,225.06654523864694,200.75172005801403,1.1211188884140386 -2137,396.58978881398565,370.26352964514047,1.0711014103767558 -2138,184.0929386266095,165.93653738735014,1.1094177420183018 -2139,242.96030189389975,230.84187093417216,1.0524966762341972 -2140,197.15390501498445,176.43374795078293,1.1174387400645227 -2141,302.1175899675996,278.4621376204398,1.0849503366931827 -2142,271.4373478119364,263.36160518527026,1.0306640849222686 -2143,1409.0270314467605,1373.6608314187554,1.025745947776263 -2144,1139.7252364540454,1079.727064475474,1.0555679059575285 -2145,1319.7561246582563,1273.86170963427,1.036027784395186 -2146,264.4010369682493,244.91398123679195,1.0795669386984343 -2147,338.917435558194,321.0232117529906,1.055741214809638 -2148,1341.0991197183469,1310.118042359755,1.0236475465239678 -2149,1204.1965828162797,1172.1837317527616,1.0273104379427358 -2150,170.82750716841903,164.68101587840437,1.037323617766319 -2151,185.81149966760296,178.95466037191454,1.0383160700114662 -2152,166.84339819737173,160.68550986532946,1.0383226112746768 -2153,187.14284653002855,180.23687770522702,1.0383160700114662 -2154,187.42108665023662,180.50485017357667,1.038316070011466 -2155,356.85677041632636,336.6309561050188,1.0600830492398259 -2156,282.14375420536544,267.26189347980534,1.0556826883615738 -2157,418.8959442424393,392.65918290991203,1.0668181529286858 -2158,1410.3946375860658,1338.33410137444,1.0538434581750709 -2159,545.1458288755011,506.1287489301206,1.0770892387121986 -2160,290.36030921545233,284.1157403065938,1.0219789614687307 -2161,119.50034573030378,98.61711595137463,1.211760702769143 -2162,169.8053397651085,159.61982440253715,1.0638110923921644 -2163,170.2138649084052,160.05913185485167,1.0634436344610583 -2164,3502.1064217703647,3329.373882462279,1.0518813883348959 -2165,163.85842935282608,152.59703472503818,1.0737982533414203 -2166,926.4617160549205,892.0234813588344,1.0386068701281561 -2167,889.6243140291068,845.9972791501382,1.0515687649998058 -2168,1067.7947905254252,1020.014771820584,1.0468424772119336 -2169,616.2651965252718,567.7642626304672,1.0854244218720257 -2170,1351.5276206028118,1276.401286225134,1.058857927509505 -2171,1121.4629349113836,1046.0575668717152,1.0720852947559778 -2172,1523.4529824430986,1466.5666235216427,1.0387887996420209 -2173,5822.723675746971,5555.253320471066,1.0481472832733438 -2174,1455.1328054605558,1388.2890443461517,1.0481483026799263 -2175,1421.9861369837472,1356.6951004009713,1.0481250625608356 -2176,859.7998309885086,823.8608721849251,1.0436226067009 -2177,934.4009013962113,894.6779625736085,1.0443991474969796 -2178,2597.5947740910183,2482.6695756051035,1.0462909763003414 -2179,4997.348275632482,4680.706049536446,1.067648389526062 -2180,1402.0094133401853,1297.3623485187966,1.0806614011427607 -2181,854.4146750779803,796.3227437085917,1.0729502351004643 -2182,1408.3772268816872,1328.8442194527393,1.0598512649298366 -2183,1120.7807325048698,1052.0598152577907,1.0653203517998073 -2184,600.4209993367289,563.3226830899808,1.0658562443167627 -2185,417.03238182180905,395.17399166695634,1.0553133318886898 -2186,2314.971817815019,2183.9192987017864,1.060007949557081 -2187,619.188941514328,588.7239713953807,1.0517474599288694 -2188,1223.4100576091314,1124.861307534534,1.087609689669739 -2189,1005.6917453104046,969.4830254393763,1.0373484825632902 -2190,239.7309350974117,232.02196518854115,1.033225172895188 -2191,380.9840246996484,355.0253145750641,1.0731179131709374 -2192,265.40026543021014,242.27250073691468,1.0954617821789443 -2193,211.82746618297352,206.47537574881315,1.025921204476564 -2194,2072.552767832066,1953.3439846453284,1.0610280545176902 -2195,473.2710219125561,428.13210575389536,1.1054322148514788 -2196,398.4894363081732,378.7318613024371,1.0521677128979614 -2197,588.6654848310886,551.0745074526604,1.0682139653895302 -2198,475.59784386376856,430.2202112698451,1.1054753621639162 -2199,1110.8312547010958,1048.9618549192626,1.0589815535156855 -2200,317.40500313773134,301.2064930599057,1.0537787546120527 -2201,292.6658531405483,267.51139265359546,1.0940313615709283 -2202,344.2014268135048,321.3421783564809,1.071136781900025 -2203,701.7844297782242,666.2536460476683,1.053329214693729 -2204,253.43639991733224,251.04786806839914,1.0095142486861604 -2205,752.6413146232635,715.1762318959751,1.0523858051433927 -2206,236.66916433461517,232.14615578775886,1.0194834522738834 -2207,1218.8110734642348,1115.7200708934406,1.0923986269138652 -2208,1299.7090729640834,1248.659414635597,1.0408835729984742 -2209,1669.4464991459392,1527.307004384992,1.0930654376316327 -2210,614.9447434317078,579.4862908195089,1.061189458963824 -2211,144.03098427711686,132.80582992818012,1.0845230541084467 -2212,152.0149268641806,141.75134580105424,1.0724055281812361 -2213,331.75177227932875,312.8323572548589,1.0604778073166408 -2214,1810.1326301445583,1656.286102029312,1.0928864451176346 -2215,571.1582665314965,531.5916464126468,1.0744304775777762 -2216,767.913829605514,709.4944779781799,1.082339402829194 -2217,1630.0597181463777,1478.2732031394385,1.1026782564174114 -2218,757.497435528419,704.4855665631,1.075249049067027 -2219,765.624397661923,708.0941729228226,1.081246572756885 -2220,661.7892733981292,615.2079152773451,1.0757164479910577 -2221,1111.499610044447,1069.903442185195,1.0388784316594917 -2222,843.931143336503,829.7262309269291,1.0171199991998625 -2223,669.4678164948963,629.4064619319048,1.0636494173256927 -2224,1143.6863665227343,1100.2951122152335,1.0394360147798356 -2225,1024.9157986641185,1001.5499821315266,1.023329655982684 -2226,2190.653471540826,2007.0138001340083,1.0914989580014627 -2227,2986.9508276959828,2841.6964916356224,1.0511153589019477 -2228,770.9398133698959,747.2829581651321,1.0316571587057872 -2229,1697.6866689254316,1628.3451422483547,1.0425840473729868 -2230,327.60680131163656,311.9313825372078,1.0502527788224674 -2231,156.50236350333057,142.7950332465729,1.095993046432423 -2232,430.23393252483976,413.29629191830213,1.0409818353993017 -2233,192.72039048983515,178.5457811864238,1.079389214403287 -2234,2618.6975617587423,2483.958608416793,1.0542436387166 -2235,1573.7011930470696,1472.6780830326566,1.0685982301076813 -2236,3043.387128640438,2841.5551207716526,1.071028714661701 -2237,2192.405835595776,2028.586850460841,1.0807552238139173 -2238,3047.7682646036214,2845.844447593503,1.0709539192069577 -2239,3787.2833614026454,3649.632160986114,1.037716458630543 -2240,1642.482325528904,1575.1168464435698,1.042768559829347 -2241,2791.5019560143537,2631.8709380429113,1.0606530569808814 -2242,1432.7168225783569,1370.993357892432,1.045020980102201 -2243,1636.7741844038062,1558.332366491818,1.0503370266822987 -2244,5449.148735774608,5192.68880648477,1.049388657562064 -2245,2804.2622935799664,2686.041837370123,1.0440128871282182 -2246,922.1978442179126,880.9344671765704,1.0468404615539597 -2247,891.2727045668427,852.5479201731955,1.0454224137756154 -2248,1351.453504639286,1292.3955217361342,1.0456965239432403 -2249,1277.1021294326595,1225.0102921188027,1.0425235915559188 -2250,1272.506246874689,1202.9812378527658,1.0577939263176042 -2251,1155.910453500445,1083.4729726342039,1.0668567492644758 -2252,1202.0514431415324,1126.0198722768475,1.067522405897639 -2253,1271.3801895669733,1201.789531025302,1.0579058618378048 -2254,613.8404076909477,547.8580302661387,1.1204369996963557 -2255,813.0501989848052,792.0187080953255,1.0265542854916356 -2256,3297.7223209756303,3114.6397742640206,1.0587812909295014 -2257,1177.397422184554,1121.9970644952257,1.0493765620628004 -2258,1319.6688487497458,1251.7571844639622,1.0542530653138336 -2259,1219.0029277171043,1151.4421796655195,1.058674894184622 -2260,1158.1477500675453,1103.6302655003938,1.049398323216909 -2261,1341.45441471742,1282.3144485089156,1.0461197066579673 -2262,2343.9694860358363,2189.6143405556286,1.0704942156348132 -2263,1035.4732584273556,968.0548877739781,1.0696431281994812 -2264,816.2609022180754,775.2232994902075,1.05293649294965 -2265,2143.9805897014503,2003.7876261640665,1.0699639830622973 -2266,1017.4546522515276,968.2141130447997,1.050857076490941 -2267,1027.2196134347241,977.2930272700789,1.0510866083881798 -2268,1446.4868934018348,1283.7196143005763,1.1267934814487826 -2269,1373.2595497035566,1294.2850661793834,1.06101784343174 -2270,1090.7713330260688,1048.0480864105039,1.0407645862528019 -2271,1432.3565788622968,1269.0887655656124,1.1286496403771398 -2272,2145.4887543794966,2018.955245160995,1.0626727657890265 -2273,1226.7201227588657,1175.0770835923925,1.043948639529751 -2274,1348.7144000780158,1195.832296320273,1.1278457725453481 -2275,1055.9008953294217,1006.4123181089434,1.0491732626181163 -2276,1245.5139592025434,1142.0101185305757,1.090633032923689 -2277,1018.7681643874619,959.5395165535376,1.0617261163424108 -2278,466.8354265737036,453.34646545074054,1.0297541993838017 -2279,370.0805086653339,337.4965014845459,1.096546207256848 -2280,668.67391828112,625.0826589087158,1.069736792008447 -2281,947.2437526487699,904.4773315684669,1.0472830214618438 -2282,1101.343223927256,1051.6269829755317,1.0472755470870996 -2283,1948.6710261296193,1847.2401743572198,1.054909401159865 -2284,832.9147133953832,794.3570246897053,1.0485394948458338 -2285,1004.8486994766341,958.33184327815,1.0485394036781295 -2286,979.7461367495915,934.602700131732,1.0483022749789794 -2287,944.4454514650736,891.1953095775447,1.059751371349532 -2288,510.5478761462964,495.89280613164766,1.0295528990004308 -2289,258.04934098710294,237.98781648455866,1.0842964349977382 -2290,303.73898603054636,287.1879863595244,1.0576312396657919 -2291,507.71080805044426,473.2792019570206,1.0727511497463826 -2292,726.8475160825728,648.5221594260626,1.1207751431744872 -2293,1127.5459392949388,1058.3416575390452,1.0653893582123695 -2294,210.52875319679586,191.82639226331156,1.0974962866830775 -2295,170.93140774589563,162.04522996473128,1.054837638745049 -2296,218.2831770195717,213.54137548674086,1.0222055398960623 -2297,176.7873522103319,162.80055898365876,1.0859136683190203 -2298,359.6911868677615,323.1757021579109,1.1129895733683848 -2299,406.6514050515002,393.9078547642312,1.0323516023687735 -2300,446.7273673716195,432.07478579762426,1.0339121421930375 -2301,148.5498435062265,137.66457352700056,1.079070959945196 -2302,151.77144336863515,140.87602978436863,1.0773404361334113 -2303,128.99909752611066,118.78139949866889,1.0860210274551974 -2304,141.11238522398568,131.12247571968737,1.0761876211493646 -2305,811.101316429877,746.4058479651401,1.0866759935511094 -2306,1626.829260822661,1545.1473084252311,1.0528635373158548 -2307,2471.370607803723,2266.897409973479,1.0901995815649355 -2308,3082.051988075531,2839.4383441930345,1.0854442373713338 -2309,1008.8096398193485,960.4084071687043,1.0503965107857933 -2310,501.59066847182027,445.8858883836269,1.124930574255507 -2311,1015.9512284522157,978.0640265312707,1.038736934283651 -2312,997.673612389302,928.4869591853638,1.074515481902558 -2313,5643.374226622121,5351.050887879198,1.054629145726323 -2314,1212.7850008247235,1141.7472369213756,1.0622184679814906 -2315,1462.4926038782653,1389.6293943346468,1.0524335551915303 -2316,2410.628106964676,2237.078124164843,1.0775788654518375 -2317,1115.400357817583,1025.0340701529435,1.0881593015256128 -2318,1622.0631684059697,1533.7192496601986,1.0576011018739864 -2319,1389.7220982624856,1226.7023286669955,1.132892687806859 -2320,487.6673111571152,446.7026328995276,1.0917045820654507 -2321,986.195245294007,919.1912969374323,1.072894454701452 -2322,908.0811558008506,814.7011552761504,1.1146187162249062 -2323,243.97052046040216,237.00982224203977,1.0293688175136217 -2324,249.61139610723438,242.49087570730782,1.0293640755725637 -2325,252.3289987326382,244.7409904985001,1.03100423929266 -2326,74.650020966633,74.650020966633,1.0 -2327,330.4984316854444,321.55500108688454,1.0278130664064633 -2328,110.11723501748521,110.11723501748521,1.0 -2329,113.66185824304031,108.13273771911946,1.0511327155914894 -2330,106.10647286946453,105.99654211682841,1.0010371164043725 -2331,218.1992260011354,190.51549657418173,1.145309593837551 -2332,1129.5796944851074,1055.6569069860702,1.0700253908346877 -2333,794.6800983758836,759.4311953566399,1.0464148737038519 -2334,788.4980723880873,734.4551968221767,1.0735822631519825 -2335,1071.0522610039013,1023.8725912126922,1.046079629629824 -2336,984.7017782764209,954.8906181552273,1.0312194502222531 -2337,2077.894612864239,2029.1818425119004,1.0240061138591885 -2338,625.7355859745471,594.3298238554063,1.0528423122289443 -2339,1442.10783684483,1408.7915567661805,1.0236488357121656 -2340,597.3126532751041,560.9173981598348,1.0648852312919317 -2341,1255.882004126128,1221.7836954898912,1.0279086296225002 -2342,1349.606604614708,1262.2928777971506,1.0691707355347913 -2343,2165.0762137835973,1964.964587904197,1.1018398128450937 -2344,139.8129978439558,128.95300843833334,1.0842166424586814 -2345,298.94857106730024,251.33651600010344,1.1894354860364866 -2346,1236.0100044438989,1180.888193879009,1.046678263743009 -2347,2073.3108788719146,1982.3975787831127,1.0458602759919675 -2348,1540.3271049448556,1458.2218261474795,1.0563050678059678 -2349,3523.4272979526627,3334.612879124158,1.0566225902894302 -2350,1250.0399367947384,1202.119623040566,1.039863182361973 -2351,861.9132427423845,812.1719622844964,1.0612447643698197 -2352,507.5682552006303,469.8313331121388,1.0803201477400923 -2353,595.6062873847743,554.3069958825072,1.0745061704236925 -2354,956.7583043507019,889.2452161517584,1.075921789594898 -2355,950.3526587635205,883.3593988457485,1.0758391884495817 -2356,759.538333929338,637.3249515001369,1.19175992112271 -2357,615.9026495911926,538.5587196875277,1.1436128078077352 -2358,581.2837640753581,552.2044316040452,1.0526604474847172 -2359,642.0128166104366,585.7030665809075,1.0961404391447738 -2360,1204.948066116563,1132.84813237836,1.0636448361236492 -2361,698.3761649054194,659.6791050716648,1.0586604298002598 -2362,509.4070485220213,474.5360844997336,1.0734843253470374 -2363,761.4423259804896,720.9971111718427,1.0560962231081772 -2364,399.9980536526625,379.7107041875485,1.0534284370742775 -2365,592.596508473301,538.9988052334983,1.099439372999322 -2366,900.3973805195562,798.6885824805709,1.127344750219288 -2367,371.52724098365485,345.7506818998697,1.0745524461214226 -2368,144.67307696333958,138.50173481029282,1.04455786897904 -2369,1019.5480948570023,902.9304209916291,1.1291546625899476 -2370,3340.253114980357,3164.1968069262307,1.0556401256927983 -2371,1344.6401671036954,1277.9206532992866,1.0522094338425119 -2372,2328.2837326577464,2240.4680548485844,1.0391952376286377 -2373,1001.3566266816647,960.1378624785084,1.042930047667065 -2374,840.215163300122,803.3972824834525,1.0458277388029724 -2375,825.5545185907213,794.8358792874125,1.0386477763571125 -2376,849.7556309778574,812.5443104913212,1.0457960507581865 -2377,618.1654138261656,597.0541703366849,1.035359008509355 -2378,1068.4973959151007,1030.4491739984314,1.0369239190799013 -2379,1566.0802669784214,1491.4122077768352,1.0500653399591584 -2380,144.15821804417698,140.86606657250326,1.0233707915027161 -2381,920.5245287795748,884.3318979472517,1.040926524211481 -2382,3022.3042527295715,2833.1410977159376,1.0667679965414134 -2383,145.43800712372436,141.93480637381103,1.0246817594599524 -2384,317.325676040142,303.9768214379969,1.0439140541670147 -2385,645.2587970931144,597.6747830526404,1.0796152278626134 -2386,1135.6819198609678,1095.986760850014,1.036218648280174 -2387,1605.9649303092094,1535.0368103609537,1.0462061362108817 -2388,1697.621683699541,1623.0401985448832,1.0459517177834061 -2389,6688.274461881955,6277.629517270931,1.0654140139173973 -2390,4031.1152360022734,3820.598644599578,1.0551004203752887 -2391,1628.338468401982,1580.55299361974,1.0302333898168166 -2392,1103.354212011251,980.5320762027144,1.1252607016021214 -2393,1272.4107442479758,1217.628420967676,1.0449910024576816 -2394,1545.4829701359888,1524.7040778221449,1.0136281476622822 -2395,466.70135132454925,429.609933292556,1.086337431138341 -2396,460.77187792124005,424.906617317527,1.0844073948062602 -2397,571.473364977791,526.1705847796951,1.0860990361463554 -2398,543.7538426293374,500.5615484782235,1.0862876788727072 -2399,2876.935564893306,2680.8498237979306,1.073143127733124 -2400,1223.9459899719247,1145.4078567148924,1.0685678317959901 -2401,3291.1302001208405,3080.9633758806754,1.0682146454207981 -2402,1055.2809381826983,964.028819838487,1.094657043924786 -2403,563.9957070327563,516.9194277157161,1.0910708261151487 -2404,546.3753078716339,504.690417682329,1.082594970557858 -2405,1338.8117409141466,1228.9521647836063,1.0893928822281576 -2406,647.9868098694238,612.3696652752101,1.05816281670028 -2407,1318.6669895129648,1232.997483043119,1.0694806823598761 -2408,1576.774384513409,1482.1368019683748,1.063852123784626 -2409,1275.0134941475167,1193.5998408786656,1.0682084987619624 -2410,1279.8088808141094,1194.4162333910203,1.0714932073391654 -2411,1190.8319032940697,1107.1159295900632,1.0756162669748637 -2412,543.2423929083509,516.8364678544206,1.0510914509642695 -2413,1188.7431400277735,1112.0658585834326,1.0689503061824177 -2414,1348.6890095516897,1278.1772689599593,1.0551658539891773 -2415,2307.5736617433517,2191.2177117557762,1.05310104484978 -2416,1747.6303098990604,1612.1960281481574,1.0840060882090554 -2417,1785.7946441971076,1646.6103362824917,1.0845277749372377 -2418,1117.4858930889623,1038.966774978198,1.0755742339425745 -2419,1351.6776848149568,1256.447431508324,1.0757932651366975 -2420,3322.8418279041157,3172.0704175762703,1.0475309152950796 -2421,2196.314966255032,2063.258988412023,1.0644882579406159 -2422,3811.4508658372674,3660.9040655649715,1.0411228476835441 -2423,2387.122226687485,2325.642230461548,1.0264357068428946 -2424,873.093545461814,826.8897718466086,1.0558765813634665 -2425,1507.6819999861987,1447.9941697844836,1.041221043183205 -2426,1528.9105821038086,1491.3613115084454,1.0251778494625046 -2427,218.18552119450393,204.48940926957033,1.066977121083462 -2428,384.0206095391821,371.54690561776994,1.0335723531344505 -2429,221.6215169131476,207.96762068785893,1.06565395218798 -2430,327.7633769854844,321.20289995852113,1.020424712939424 -2431,897.1375440456117,841.1935989489818,1.066505433667741 -2432,6548.304665781314,6286.795480339556,1.0415965790933657 -2433,2033.983721606127,1964.908639599525,1.0351543479500809 -2434,983.8161891049815,917.8955815974538,1.0718171095156632 -2435,2820.3387371752556,2594.984017596281,1.0868424306473068 -2436,1774.4226639104113,1644.5745325164607,1.078955455545856 -2437,1911.4465022012198,1768.0896414339848,1.081080086330333 -2438,651.5929179266589,617.1997978848832,1.0557244512387065 -2439,2069.1262153800244,1914.2007540120214,1.080934803229646 -2440,978.2588718948923,911.7965185583237,1.0728916506959851 -2441,998.3301587376848,930.4700650145068,1.072930980022576 -2442,620.9329434479146,585.2816476964168,1.0609130593652065 -2443,4895.384224544075,4577.261786516065,1.0695005994555853 -2444,553.0299509198171,543.7271407873171,1.017109335610927 -2445,520.1458493262512,500.6322132975957,1.0389779872536005 -2446,2306.5710988136916,2212.3092857738957,1.0426078820199056 -2447,168.98347146753505,167.4334475764683,1.0092575522603322 -2448,3270.685581082847,3108.3404117698037,1.0522288899562993 -2449,3477.4623204856466,3306.5086095285224,1.0517021823153518 -2450,2144.496909164364,2027.2069664979992,1.0578579023280406 -2451,1415.7886453062702,1328.8420949693857,1.0654303100918003 -2452,4887.325530268643,4569.825629843506,1.0694774650375467 -2453,829.0823992527862,790.4317670415069,1.048898126091192 -2454,5755.884466398039,5372.525997332642,1.0713553492818326 -2455,1717.8979142455169,1613.3957402177575,1.0647715693197843 -2456,1005.4359128721643,946.9630636338844,1.0617477613265038 -2457,2364.0587308034796,2178.786538369511,1.0850345773536019 -2458,5079.4024225480825,4745.444030751538,1.0703745296820317 -2459,2639.753323557394,2533.4855159538483,1.0419452990492177 -2460,2710.902912767601,2598.3512699722173,1.0433165615812163 -2461,1637.1225277569652,1550.3990517331752,1.0559362287579077 -2462,1260.8500642848142,1156.1111798832037,1.0905958581009412 -2463,1922.3057181010643,1789.9124627633726,1.073966329690389 -2464,2622.977687028921,2531.0937024234668,1.0363020873219657 -2465,2381.1569787920757,2282.504551506321,1.0432211305868588 -2466,1538.2721978511142,1479.5944181283683,1.0396580164157223 -2467,2674.187924377598,2578.014743385084,1.0373051322686515 -2468,628.2776553585273,601.7803364876796,1.0440315465033314 -2469,499.79083683205306,465.76036965957525,1.0730643253253829 -2470,284.39532082867834,269.5625836031863,1.0550252079766635 -2471,383.21702425218575,354.7689317943532,1.0801876655713554 -2472,279.9533834973556,264.4987701098317,1.0584298119084126 -2473,275.96212775165833,257.09235928342093,1.0733968466462094 -2474,3135.558001731709,2923.019599296651,1.0727119320329566 -2475,916.8565703173186,895.3853672566065,1.0239798458249305 -2476,606.8137566500685,554.5505590038988,1.0942442430137416 -2477,161.1096907291657,145.75571942999426,1.1053404378175764 -2478,496.2739272541063,426.5783711992465,1.163382770342818 -2479,15.252822956117864,15.097877967141713,1.0102626997855835 -2480,12.461605875185747,12.461605875185747,1.0 -2481,562.313135093433,546.8528829484338,1.0282713187167323 -2482,340.75002883264534,322.6682969995095,1.0560381419596463 -2483,305.37598286666383,286.505505992688,1.0658642730393373 -2484,127.11004753274476,109.52576609268567,1.1605492667832926 -2485,125.09084201074165,107.52787432522777,1.1633340917015909 -2486,747.0616048637801,718.3525638420973,1.0399651124903528 -2487,30.91684644534162,29.81397365226026,1.0369918081348324 -2488,234.60477565253794,230.70856562341436,1.0168880163534255 -2489,235.25155815551298,231.44647221499537,1.0164404577183748 -2490,240.11183509745882,236.26390473948425,1.0162865773433207 -2491,238.4338829742511,234.62090232670414,1.0162516664531343 -2492,276.77919127113597,249.06609049707276,1.111268060291768 -2493,338.2374167083275,320.2667545146029,1.0561115443311029 -2494,287.3406469563991,256.8291609322988,1.1188007074949844 -2495,316.01601785005,297.1901200692495,1.0633463110294978 -2496,270.79536159054805,260.4492275478852,1.039724187858306 -2497,603.3092525128169,567.3658077647922,1.063351446731745 -2498,207.03220478372978,198.88183517485922,1.0409809654144868 -2499,209.398053935429,200.45233682356275,1.0446276519077962 -2500,1873.7929850810492,1762.7453751579994,1.0629969656922778 -2501,430.598125681436,396.9482090721907,1.084771554173017 -2502,463.9474519906994,426.8167533423862,1.0869944732898698 -2503,429.1242687281631,395.62188760677026,1.0846828301741804 -2504,463.3163776165783,426.2095255761907,1.0870624653220105 -2505,1423.4583647894924,1299.1996759825925,1.095642487528272 -2506,783.911875541348,737.1580796645522,1.0634243823225424 -2507,1480.6393622007736,1374.7558887480336,1.0770198362628336 -2508,271.6142610362014,238.3150171491398,1.1397278454602071 -2509,275.79638406833743,242.06239246975153,1.1393607294978767 -2510,390.5283554740046,360.71037218005023,1.0826646129240516 -2511,376.2937090226481,346.09008371602323,1.0872709930961437 -2512,359.08594281074943,345.80905069144205,1.0383937091662592 -2513,280.00043635810044,275.5563252750364,1.0161277774285469 -2514,361.18920802937913,330.79119121925663,1.0918948799636383 -2515,273.7700629669533,240.48933381001328,1.1383875477123313 -2516,277.4753891723738,259.8018972962555,1.0680268006509783 -2517,143.57387928481484,142.053795071247,1.0107007645434987 -2518,291.2399520828572,272.413458012194,1.0691099999538953 -2519,214.1318713423285,202.62080289731838,1.056810891480099 -2520,207.51167705712095,206.85305866811487,1.003183991540888 -2521,126.05148549850504,125.87865350909945,1.0013730047517 -2522,375.0333426200579,360.0177388817084,1.0417079552385144 -2523,270.46474038801017,237.68405822308551,1.1379170416812614 -2524,52.97852670144763,52.72096311230939,1.0048854113038406 -2525,475.69608670999753,461.94219708782805,1.0297740490236151 -2526,341.9752822527585,333.48148712986915,1.0254700649082256 -2527,415.81063730206586,403.78603357123103,1.0297796425113688 -2528,255.41411972986023,247.95292567749638,1.0300911716688852 -2529,1342.2350335344363,1216.5361621447453,1.1033252239440912 -2530,1886.3761751434895,1748.8810986422063,1.0786188818714042 -2531,3413.3456478897174,3235.1039093905533,1.0550961401832506 -2532,2693.198870478994,2532.2402709229677,1.0635637152620432 -2533,536.2010146234646,504.4418088887871,1.0629591068286717 -2534,796.7471330701757,737.0561629863969,1.0809856467951147 -2535,278.7968664886253,266.49222979699414,1.0461725908519153 -2536,797.7814840945927,738.013022152366,1.0809856467951147 -2537,1953.6665664711336,1854.2622809329227,1.0536085356210763 -2538,2802.0272587766212,2682.2558690257465,1.0446532305638605 -2539,2698.0203132882334,2582.939635763193,1.0445541490523593 -2540,249.23613808347844,233.02632483400347,1.0695621546665255 -2541,2066.434411998078,1978.0997345137057,1.0446563314999324 -2542,2706.339357798838,2610.8094921643137,1.036590132647071 -2543,368.5668505906128,346.7096329061813,1.0630418529223444 -2544,1149.8026729222408,1071.1320645933579,1.0734462265946163 -2545,1158.773910333984,1079.4894812850198,1.0734462265946163 -2546,739.6073834150147,706.9070265653577,1.0462583559376089 -2547,1150.3937269613198,1071.684115473577,1.0734447869024921 -2548,1144.5713173288218,1066.260848378042,1.0734440067549162 -2549,798.7075495456343,753.9817176684886,1.0593195177403636 -2550,253.292467933093,245.5972622731441,1.0313326198701294 -2551,232.4292998243266,220.7422602489098,1.0529442779204963 -2552,202.39870232436445,198.32900783985497,1.0205199155122868 -2553,158.83891795562295,158.6949591534528,1.0009071416189783 -2554,73.29959662643431,72.99889102900455,1.0041193173374412 -2555,238.4967389517162,226.48692589080218,1.0530265180370915 -2556,223.16146784634054,214.0375084976427,1.042627852532671 -2557,231.9259079925142,231.62854575282284,1.0012837892614872 -2558,901.9254842728429,880.8644870012558,1.0239094634672872 -2559,1067.2847099328828,1021.7326259282366,1.0445831745494694 -2560,841.4858551079088,804.8965909623666,1.0454583415514216 -2561,254.45174832355954,245.2077003032268,1.0376988488081795 -2562,78.23910810857431,78.23910810857431,1.0 -2563,373.49760828952503,360.6237183082206,1.035698955248144 -2564,367.79353245467183,355.1754756871596,1.0355262613306846 -2565,416.0090681922164,398.57047538608106,1.043752846442635 -2566,553.0438265060264,539.0083869807454,1.0260393713053344 -2567,2919.6388138816037,2796.142014712362,1.0441668550879901 -2568,1426.6527326372175,1371.298383574774,1.0403663781168784 -2569,255.43899722714434,240.81009072219263,1.0607487271861384 -2570,2982.9421210160694,2845.022942494934,1.048477351961242 -2571,1977.1193707159046,1865.9135428482589,1.0595985962446541 -2572,3906.5220782121814,3740.019915483051,1.0445190577835801 -2573,1614.587016317255,1551.9907773119305,1.0403328679012784 -2574,702.7624534079401,685.3149126757877,1.0254591581321777 -2575,988.1626025271082,916.6119367907023,1.0780599323056206 -2576,552.3174027357028,511.23385974722595,1.0803615453185949 -2577,598.3532983709572,575.7006699941642,1.039347927764306 -2578,3872.9568251318224,3707.90208066255,1.0445143212734949 -2579,746.6574245625485,725.7038734830969,1.0288734177191072 -2580,4310.897269150378,4163.909758191931,1.0353003593964225 -2581,847.5779641983407,799.0820286046746,1.060689558590559 -2582,789.9263270440528,725.9787356973145,1.0880846617157671 -2583,798.7820856915273,770.6363855935026,1.0365226722020766 -2584,265.87075624573174,262.97234900324315,1.0110217186463692 -2585,563.8547726341224,552.6703211673938,1.0202371125033525 -2586,320.3226275917697,316.83729558779424,1.0110003842745516 -2587,1141.6418660181873,1115.193863001178,1.0237160586105032 -2588,210.48040903236665,202.9056454423334,1.037331458045538 -2589,210.29193748091143,202.7414330194073,1.0372420395232254 -2590,209.0674417923382,201.52890241301716,1.0374067406166456 -2591,209.77805891466497,202.194588049721,1.0375058053634905 -2592,472.3202679321322,442.6941541955081,1.066922306192325 -2593,475.79952977635065,445.95837084626595,1.0669146738370603 -2594,439.0040552743126,412.28368516690597,1.0648106414800027 -2595,448.883549653499,421.38105742602875,1.0652675096395339 -2596,357.20746050788586,338.24604818647424,1.0560580453875938 -2597,356.46817092959895,337.54600183815484,1.0560580453875938 -2598,356.26412238403464,337.36146046366935,1.0560308871510857 -2599,350.6133132149995,331.8336013670383,1.0565937619656218 -2600,178.59105942643356,172.16068610829242,1.0373509972776032 -2601,178.46458934947546,172.02353906578801,1.037442842524151 -2602,208.12410875437425,200.63430290786977,1.037330634582182 -2603,208.96911052872846,201.43978290967604,1.037377560233117 -2604,208.9707557974766,201.45032156954315,1.0373314580455377 -2605,209.95513352685356,202.40340453397204,1.0373102864068378 -2606,207.79694883496512,200.31256534762142,1.0373635247212543 -2607,209.1291105225051,201.61315412956975,1.0372790973157688 -2608,373.0497382508325,352.30315273233407,1.0588884469457498 -2609,379.10753641764427,358.12116065217634,1.0586013284645048 -2610,386.80258059311893,364.82498836495387,1.0602414662621182 -2611,375.19243827386055,354.3637674420056,1.058777653771456 -2612,361.98891450415766,342.08787872097645,1.058175214677552 -2613,376.5007336232215,355.55641574376284,1.0589057515265101 -2614,318.4914085924621,299.873870937912,1.0620845610733616 -2615,329.4028708345084,310.29258081506794,1.0615879695519697 -2616,113.41880359977361,100.46374993528221,1.128952519419561 -2617,112.17899549717788,99.35604418940875,1.1290606063514759 -2618,132.3191899932812,117.17516645284459,1.1292426031801808 -2619,132.3219084763673,117.19639768163238,1.1290612262317468 -2620,126.91704907426278,126.9057752508987,1.0000888361726785 -2621,174.16432897487778,172.85621102745205,1.0075676652846335 -2622,1785.1430508101944,1724.494447293802,1.0351689178307106 -2623,501.9839950233502,491.08481345120504,1.0221940920867596 -2624,887.3361797210297,845.5424990043089,1.0494282437203761 -2625,541.5318675000929,521.4344734763893,1.0385425111801965 -2626,546.9315952384791,526.60707949757,1.0385952193432348 -2627,1218.144871155509,1162.0132550456817,1.0483054869349322 -2628,1650.9947020056259,1576.5338778219716,1.0472307162130408 -2629,849.8011218577227,814.9989228988412,1.0427021410471253 -2630,906.7393369940085,867.0954930779224,1.0457202744479304 -2631,779.6719745315395,746.8765587340777,1.0439100885065244 -2632,766.6549804697792,734.2502055378196,1.0441331506447777 -2633,726.7887725752515,695.5458450065472,1.0449185740853792 -2634,731.0277090834345,699.6054014690177,1.0449143296327286 -2635,750.7873289635957,718.8451525077071,1.04443540635206 -2636,254.90497346309706,254.6682316516811,1.000929608730074 -2637,184.49978692802102,180.7497924654461,1.0207468811522526 -2638,169.72493705772607,160.2875154735333,1.058878082652364 -2639,1010.282270551641,976.5036898751072,1.0345913497580885 -2640,170.0252342538545,160.56954323779033,1.05888844687103 -2641,552.8868155938329,524.6243369766316,1.0538718405251188 -2642,160.52468653698742,151.50870406638234,1.0595080165602553 -2643,3736.563352323259,3655.692290821059,1.0221219553147993 -2644,1019.7205576133074,978.149074452817,1.0425001507911724 -2645,533.5179393056501,512.428562369372,1.0411557404972995 -2646,723.1553150093844,698.3744175896416,1.035483684389917 -2647,372.6277288064253,358.40871136305924,1.0396726334839628 -2648,674.8087648252747,649.0029535083346,1.0397622401831006 -2649,1176.8838618656916,1134.322941636856,1.0375209904221976 -2650,451.71047531534975,434.33283048512055,1.0400099730218864 -2651,691.4739619575053,665.5687106736473,1.0389219788557043 -2652,317.67305959861346,310.0421001591423,1.0246126556217825 -2653,551.5270894926731,527.4643343275881,1.0456196819369035 -2654,465.46837596900343,447.58964164950305,1.0399444773869473 -2655,348.1160074639107,333.9897303848145,1.0422955432276924 -2656,249.8150055349058,242.52239644188452,1.0300698376727808 -2657,1560.9859858610525,1443.6107581968533,1.0813067005754426 -2658,1945.921271062619,1882.6807312622275,1.0335906873376202 -2659,526.2010061446722,473.03408456388917,1.112395540439332 -2660,238.5314734332977,228.80789197843401,1.042496704859202 -2661,1447.5772876553037,1382.6233721362544,1.0469787483909596 -2662,2068.5428626500693,2014.8115689454276,1.0266681482937707 -2663,537.52422455815,480.94682707520485,1.1176375314231946 -2664,176.9821702845557,175.90661376435716,1.0061143608940102 -2665,828.0873044239014,802.328119781182,1.0321055488491975 -2666,733.7472889660163,709.4864479648041,1.0341949322228854 -2667,884.828425465755,857.2489150477567,1.0321721146960703 -2668,299.0137147304503,290.4653025856108,1.029430062967056 -2669,836.284486943913,778.8540056562637,1.0737371585310886 -2670,262.8094804820694,210.382928940238,1.249195844006544 -2671,535.2414787220464,522.53989386315,1.0243073974027002 -2672,2965.0935077891318,2866.723025581494,1.034314609862836 -2673,851.6978731480101,787.3332581889242,1.0817501538130647 -2674,458.9785323939216,399.47273862882787,1.1489608376515121 -2675,3425.3335230915814,3319.333229354012,1.0319342128112272 -2676,3690.796663970903,3549.064666469676,1.0399350281893316 -2677,918.945322260851,856.9626402490995,1.0723283362664846 -2678,718.2549549508068,649.3927547002021,1.106040912455815 -2679,592.361870067468,579.6824980394262,1.021872959889121 -2680,2230.214077396445,2143.172643158351,1.0406133563322377 -2681,546.0672247653716,526.7431424172629,1.0366859685337888 -2682,364.31337978579074,349.6390081537721,1.0419700642371255 -2683,264.375099425789,244.9952576796848,1.0791029260306828 -2684,291.47255196424817,268.7377417443119,1.0845985013953383 -2685,274.53876257510865,252.9373241406155,1.0854023363609409 -2686,1431.9183710981365,1384.3428378248343,1.034366872116777 -2687,1502.0692540441742,1457.5543124671235,1.030540845851365 -2688,2366.6643864585367,2279.030653439298,1.0384521958434345 -2689,1515.7624270927902,1470.8227710144454,1.0305540932354136 -2690,2221.3167743142026,2148.9973891608965,1.0336526165727655 -2691,882.9969024961538,865.2368198975558,1.0205262677109612 -2692,1832.5963311315888,1733.2877454553611,1.0572949217096888 -2693,2921.1089899295393,2806.1286412172194,1.0409747247590349 -2694,1944.5501346224312,1824.4265695532079,1.0658418196017836 -2695,739.593493499077,711.9943820350796,1.0387631028563897 -2696,1155.6182974601315,1072.4485477842852,1.0775512725973455 -2697,1861.0717090023484,1718.8509696048798,1.0827417512701298 -2698,1427.5322219002394,1327.7193995202585,1.0751761421999604 -2699,1807.418593205153,1669.119487456764,1.0828575226565207 -2700,2420.924294299497,2314.8252409088454,1.0458345846224637 -2701,1339.2596512803598,1265.004678056266,1.0586993665020985 -2702,431.3232705129539,410.9064612280465,1.049687243232655 -2703,1016.2980349557579,951.8633863582229,1.0676931684955953 -2704,3525.793670389413,3339.7482931006484,1.0557064068789563 -2705,1144.9092501593373,1107.4117957292262,1.0338604434002974 -2706,1065.8206348338206,1047.1572011620033,1.017822953087757 -2707,2349.941688931126,2252.448593818609,1.0432831609920277 -2708,909.1342444178483,863.3389794502749,1.0530443615516274 -2709,1333.2787202218653,1301.123914650009,1.024713100120449 -2710,2670.1415198480872,2544.625116582905,1.049326088329166 -2711,931.9781307077069,868.7282779231239,1.0728074064030642 -2712,1302.0451071968605,1238.4289252375092,1.0513684561648549 -2713,3188.1236196023006,3012.692551749939,1.0582306574065985 -2714,1113.3772353593063,1058.9626727058326,1.051384778761309 -2715,1467.1069109951418,1428.8887618081744,1.0267467630850455 -2716,1771.7475908934782,1718.3657267463536,1.0310654846731613 -2717,2072.5340877280396,1963.5658707910254,1.0554950656649558 -2718,628.2928662001901,606.4016621884923,1.0361001715145253 -2719,1187.3213596528187,1080.1549627944335,1.0992139096237994 -2720,4131.850341379386,3907.913836439778,1.05730333735905 -2721,2030.3161705125133,1941.877833661917,1.0455426882770595 -2722,2935.383964528094,2802.286833065546,1.0474958986682128 -2723,5341.316009073344,5103.187316655035,1.0466627379404905 -2724,1271.2256619945542,1177.013071544531,1.0800437928241469 -2725,2332.07363791071,2205.114358917732,1.057574918271037 -2726,908.0042659632031,865.0163147775332,1.0496961160746727 -2727,840.0537580379289,804.367453393123,1.044365674536268 -2728,836.9080252580452,801.3319606775864,1.0443961632958911 -2729,969.8822727968411,920.1803970600566,1.0540131868659453 -2730,360.89049717852845,350.90765996288786,1.0284486158458221 -2731,1906.07647258786,1827.7894600686643,1.0428315264036234 -2732,3329.5400815177027,3187.944506251098,1.0444159473256063 -2733,1835.5411086997551,1717.7514992231968,1.0685719730297574 -2734,1937.2328191548847,1855.3659087063877,1.044124401588028 -2735,1883.610723207381,1804.0356829931645,1.0441094602309582 -2736,1593.017501447234,1525.8398478743843,1.0440266740093553 -2737,466.18013875598473,445.2761513538199,1.0469461194780099 -2738,111.60609726265925,107.22076011398367,1.0409000751721367 -2739,472.06615438854004,450.91008047779275,1.0469186093341047 -2740,2028.0452437150457,1950.8926371792295,1.0395473359555911 -2741,1376.1989121591866,1336.4098241687332,1.0297731184483045 -2742,19.01342755254413,18.8405781021726,1.0091743177642516 -2743,1380.0255408398525,1347.0807418897384,1.024456439711177 -2744,18.914518402484358,18.914234567037045,1.0000150064464046 -2745,1773.0802574574213,1683.4082810729185,1.053268109342643 -2746,56.961840667233425,47.1944658175767,1.206960173835023 -2747,151.81479931488633,139.51651093550737,1.0881493401527504 -2748,1265.7777456189892,1224.302908938772,1.0338762869690212 -2749,678.1699475296793,612.7347764809244,1.1067919980396153 -2750,934.5085294628645,822.8810284733004,1.1356544836094566 -2751,1533.7493145190078,1434.1228614386923,1.0694685621149442 -2752,889.8255503230426,726.1719255031131,1.2253648469080451 -2753,1310.57841432554,1255.9045259373781,1.043533475084306 -2754,6955.693982276586,6569.799509217439,1.058737633091807 -2755,1883.2021412072222,1752.2606079537654,1.0747272024829493 -2756,1929.203010206194,1843.268083250799,1.0466209596619498 -2757,2931.574934142544,2763.926038236801,1.060656071684426 -2758,2795.1331752118094,2667.457198401914,1.047864301960079 -2759,5253.060461866992,4999.218538753743,1.050776320568 -2760,787.1247323158121,744.0574219791441,1.0578817024929499 -2761,2365.4389105911378,2235.245384411842,1.0582457420949125 -2762,964.7068498873414,909.4055779414629,1.0608103505050617 -2763,947.7834361102716,893.3194776487225,1.060968063301275 -2764,5325.396055976353,4997.873861093924,1.0655323051331955 -2765,5359.69697581554,5106.929319253029,1.0494950371859626 -2766,2188.859029519461,2063.2485628443214,1.0608799487067022 -2767,2304.2282301628534,2166.289839271616,1.063674947087236 -2768,1210.794218727556,1116.3934886877228,1.084558653374804 -2769,2342.8602093790623,2239.6166822969262,1.0460987489056612 -2770,1919.8292985157404,1826.681974860166,1.0509926330568324 -2771,2779.5560217173297,2632.2491909466885,1.055962342500583 -2772,881.1563650896767,852.0342168685753,1.0341795524693036 -2773,468.60289308728494,455.6700263650292,1.0283820878573555 -2774,862.0615889008977,836.3751048138092,1.0307116794118432 -2775,917.5854630068765,862.0380826019473,1.0644372696821778 -2776,237.12743513620129,229.28951368804059,1.034183514640903 -2777,332.91439208485116,331.8516207113613,1.003202549896281 -2778,293.812049537955,286.9375514416708,1.0239581681161787 -2779,190.91575327341624,183.73955693212486,1.0390563494389091 -2780,474.68775461986814,458.63831259189135,1.0349936793053267 -2781,327.5329664717575,303.64559913534873,1.078668577461454 -2782,295.7142165248577,268.87310881005794,1.0998281599583888 -2783,254.50549186607574,243.25356226092947,1.0462559705213144 -2784,336.36736495241405,330.0743896278393,1.0190653244308658 -2785,1082.6524975018287,960.5630040300695,1.1271020151302198 -2786,1956.5017729122562,1865.2646604942497,1.0489137624007903 -2787,1087.5980285184278,1034.3621740928354,1.051467325235749 -2788,221.0341127790648,214.2155980079647,1.031830150719681 -2789,389.985765907709,378.3792991173737,1.0306741590182367 -2790,837.3110829366342,799.096185482028,1.0478226503253227 -2791,743.7433221634444,709.868944503789,1.047719199328172 -2792,461.55896281416597,443.7681677192781,1.0400902912579844 -2793,1219.105107027842,1177.7975628782106,1.0350718539854058 -2794,337.9296396950561,324.6049367669131,1.0410489842232775 -2795,415.7282256113903,392.54027612213144,1.0590715167328317 -2796,420.40075773011034,410.54556678714204,1.0240051086657525 -2797,162.6174962929763,147.14239592057623,1.105170914715519 -2798,2158.5363885871398,2086.7615435232156,1.0343953267141113 -2799,590.7613870732557,572.2455086197128,1.0323565291026997 -2800,248.8402628908143,222.35906610567807,1.1190920489500114 -2801,232.49424849045593,222.8829477810568,1.0431226381609082 -2802,151.83405109304388,148.93750714111653,1.0194480491014457 -2803,167.14170624590278,160.65923838906988,1.0403491758197823 -2804,177.22198518527225,171.45716636788654,1.0336225014066571 -2805,148.0455062500798,142.55516114906283,1.0385138290102032 -2806,244.3835134897812,220.6487375942773,1.1075681472474441 -2807,255.7209190490819,250.51797428776862,1.020768748334747 -2808,4936.834406215937,4704.136577209011,1.0494666396665264 -2809,784.5695016958142,691.2571925551401,1.1349892777184099 -2810,854.2976296223037,821.0852153556309,1.0404494121262282 -2811,744.2124325329546,711.6350110648232,1.0457782725155493 -2812,1532.5066466921428,1489.9423784907729,1.0285677277295013 -2813,1888.268043245527,1814.3814644033307,1.0407227368068899 -2814,554.5475468051685,516.9003574183074,1.0728325853262948 -2815,499.8565736339191,475.7044718513607,1.0507712313246973 -2816,316.278215587313,290.3484118556324,1.0893058224977428 -2817,115.24397982430615,112.10527560251157,1.0279978279784387 -2818,476.18465658212375,459.98007992454967,1.0352288661287943 -2819,474.42399364429815,458.3651620478621,1.0350350177676881 -2820,714.6989273006097,678.115071091727,1.0539493336285606 -2821,551.2953221647357,512.2475878952171,1.076228244294839 -2822,574.5865309277104,533.8806630776488,1.076245256037942 -2823,540.283622712814,502.00753090129297,1.0762460510160097 -2824,2191.2122387469176,2035.9765986020452,1.0762462791819225 -2825,2174.2459545516335,2020.3241340014445,1.076186695966123 -2826,1097.4094982219742,1031.041743240122,1.0643696100734843 -2827,1085.3927765100475,1019.759652411709,1.0643613658798106 -2828,814.6973578136327,765.8006463729058,1.0638504442015275 -2829,722.4222221513662,679.1243541804693,1.0637554340443975 -2830,34.801946841046195,33.564064292450574,1.0368811875048771 -2831,29.68132750345774,28.84030954178963,1.0291611974708341 -2832,85.17911629452557,80.3649253179701,1.0599041305334105 -2833,85.58113317231098,80.74431672778559,1.059902871688565 -2834,18.607096229191058,17.83667886492608,1.0431928707187705 -2835,18.012021901316334,17.267595990083066,1.0431111494420415 -2836,19.32363179921504,19.157767367212916,1.0086578163740514 -2837,18.79950626952022,18.280010309119906,1.0284188001874996 -2838,632.8474994381477,594.290144471005,1.0648796809535916 -2839,433.87161325812696,399.3307371158813,1.0864969132897533 -2840,2038.2672377441356,1843.626929979306,1.1055746716430392 -2841,999.8869825602359,938.1690387743313,1.0657855260993647 -2842,359.5602934482665,333.33886842942184,1.0786629688352607 -2843,1663.2062594445972,1604.075498338442,1.0368628291918958 -2844,1366.700397706279,1281.8839641109873,1.0661654533248754 -2845,432.87981896356695,403.4386700224618,1.0729755254732176 -2846,239.94634631493278,226.8903976554269,1.0575429757910408 -2847,2510.054421221148,2449.6864162804522,1.0246431561768454 -2848,1207.1631367522293,1149.9843798775112,1.0497213335026416 -2849,380.18645591990804,320.8640148146373,1.184883434621178 -2850,2425.2105306105723,2303.6413228372376,1.052772628519967 -2851,2755.3174200802055,2589.552593119695,1.0640129215374652 -2852,2569.3121585757663,2434.1825718567843,1.0555133325993316 -2853,1085.018103500167,1004.0310765850445,1.08066187272866 -2854,1463.390865177504,1362.9228615807924,1.0737151062828187 -2855,1339.7488593960693,1268.0300212559553,1.0565592588013635 -2856,120.12521326449135,112.81673025952239,1.064781907684761 -2857,119.39694298828056,112.14248046543021,1.064689692012713 -2858,121.05557571289042,113.70404882876429,1.0646549261864664 -2859,191.14644377319593,183.60199569899976,1.041091318454755 -2860,179.3442499422903,171.62698830644615,1.044965315257206 -2861,179.584479397503,171.6603582656017,1.046161625269596 -2862,194.15368544181223,187.5515201419659,1.0352018757024675 -2863,230.43301845418347,222.54790084438517,1.0354311030563794 -2864,222.96193170026731,215.33059020719008,1.0354401178473267 -2865,84.61999365182531,79.8540930570766,1.0596826087717537 -2866,85.06943932435722,80.2641886652139,1.0598679278898124 -2867,84.80825388349216,80.01511844069813,1.059902872559595 -2868,84.97540420481467,80.17376948441924,1.0598903450751254 -2869,2353.7640858618647,2240.39626081532,1.050601684634703 -2870,1036.5138541817455,987.5977767509555,1.049530364063512 -2871,1908.3987240137199,1851.4691911884336,1.0307483014549887 -2872,1216.45363249325,1172.5368081589743,1.0374545379118891 -2873,948.9090812004177,903.1967094643813,1.0506117562841266 -2874,1897.2233944164607,1840.5605798434467,1.0307856286794068 -2875,1914.9884043056359,1857.8152279737803,1.0307744147377946 -2876,1349.98802752943,1304.889701225592,1.0345610255498838 -2877,1917.3139258803367,1860.1318002843295,1.0307408999659415 -2878,2986.2196451852597,2851.3275767146515,1.0473085132596491 -2879,3325.748192523468,3181.9262254260166,1.0451996548342963 -2880,1770.4933482731544,1699.9705638585865,1.04148470915549 -2881,1880.0738702572517,1756.8780960163201,1.0701219820090393 -2882,2936.9146993410895,2815.4431478175575,1.0431447360667514 -2883,830.610444318352,805.3310322477478,1.0313900881231999 -2884,80.40174368648408,76.85889502714487,1.046095493021178 -2885,76.44154865238009,73.07969685940772,1.0460025415737557 -2886,76.57215243591739,73.16156608950739,1.0466171861635305 -2887,75.54994188917013,72.22730240741288,1.046002541573756 -2888,75.40310643794484,72.08692468805823,1.046002541573756 -2889,77.72135943963957,74.24419086234501,1.046834217423711 -2890,75.66103653107656,72.33364468431482,1.04600061093677 -2891,75.19413263285554,71.88723312766194,1.046001207186831 -2892,76.19878669026095,72.81988801264913,1.0464007672879816 -2893,258.66249615315024,248.33302408276535,1.041595241343907 -2894,257.655834477767,247.36810541596842,1.0415887450182753 -2895,258.70449050498206,248.37381119849854,1.041593271273787 -2896,259.1825926379491,248.81567156013497,1.0416650647960033 -2897,1391.3753012690609,1293.9211777737635,1.0753168934625297 -2898,1245.8080210149928,1169.4654565638066,1.0652798798140652 -2899,607.6769027077635,514.0689324695036,1.182092253248183 -2900,1410.2704955541908,1311.4845514272913,1.0753237573552739 -2901,1317.6006788726165,1230.6435994506276,1.07065983966504 -2902,1262.3868092282164,1186.4517838660247,1.064001779418932 -2903,1409.7368719005867,1310.9892805176228,1.0753229586621602 -2904,1409.3021618702753,1310.5844218179584,1.0753234499120492 -2905,1411.8862173002387,1312.990860009225,1.0753206745782824 -2906,29.09430641528018,28.886243045413234,1.0072028532592432 -2907,26.308706828995643,26.29793228608134,1.0004097106493808 -2908,26.20363132207452,26.193996850286375,1.000367812206866 -2909,26.35464405421052,26.341709231723584,1.0004910396046494 -2910,1083.0270312430252,1019.9555991067214,1.0618374291896058 -2911,777.9421055526296,725.689505378124,1.0720040730743092 -2912,363.260266559763,338.09431138955773,1.0744347193147792 -2913,215.10684267964513,212.22331704378087,1.0135872234777548 -2914,383.08720266384336,356.02765635364005,1.0760040570649523 -2915,319.4954268093887,261.6133748208715,1.2212503547578537 -2916,163.80561944873403,140.5670192051805,1.1653204313142118 -2917,171.44076622551367,167.9561817307106,1.0207469856655234 -2918,386.6555011254162,359.35556587482773,1.0759691454454825 -2919,130.86999721041067,115.67054729163368,1.1314029394229066 -2920,51.160635026955326,46.85880493790787,1.091804093056743 -2921,258.005747612486,246.53809954500812,1.0465147094450784 -2922,256.5240226523913,245.12162670503986,1.0465172987819316 -2923,124.67001532117627,119.11814795514375,1.046608073256169 -2924,257.56171547282963,246.1134321834587,1.0465162879888534 -2925,257.20571875259714,245.77004009825913,1.0465299946639794 -2926,120.72304365937157,115.35541870950466,1.0465311903845973 -2927,100.45793348965923,94.84877667817021,1.0591378930539226 -2928,99.58125095639889,94.0210444829482,1.0591378930539226 -2929,276.7805910825886,272.7747894031489,1.0146853808895049 -2930,172.75129122285122,166.67689041652972,1.036444169261506 -2931,113.46263143763339,107.8345461029095,1.0521918581578935 -2932,218.60730559890536,213.26444562436723,1.0250527459412937 -2933,305.14250297687954,298.1106010128282,1.023588231817857 -2934,526.5575823487751,512.9148165406615,1.0265985020673156 -2935,777.3207463947948,757.5484533241055,1.026100367552635 -2936,989.2122949517433,965.9433035271177,1.0240893966961202 -2937,176.06869448959716,173.64228747805842,1.0139735950659217 -2938,196.1519910441689,193.53210160979668,1.0135372344566096 -2939,4243.663258404672,4094.5166554314915,1.0364259363251906 -2940,819.4040338025582,795.9645315597189,1.0294479230084645 -2941,305.49088224979965,297.80866520260287,1.025795814376222 -2942,352.2039263733932,342.4089623102479,1.0286060388053462 -2943,358.3625215990702,348.3938264792736,1.028613294387378 -2944,351.0036199882291,341.2297352358631,1.028643121460708 -2945,1202.7417715820764,1167.0703586655036,1.0305649206594207 -2946,339.95463363694705,329.6523085751043,1.031252094385062 -2947,1239.6149077796908,1202.1651020216716,1.0311519654788184 -2948,302.72881023068203,293.7503776004704,1.0305648377494963 -2949,6240.502877832574,5860.451386865792,1.064850207924007 -2950,307.13940465067145,297.92459638982024,1.0309300016598633 -2951,681.5232024455839,627.660283969809,1.0858154002274991 -2952,677.8406718505632,624.2656689776882,1.085820838042577 -2953,689.2857607304704,634.8058861716265,1.0858213128542331 -2954,1739.5545007775438,1617.425365379053,1.075508359156881 -2955,2784.5630534973516,2564.6256500208033,1.0857580924041543 -2956,200.6416657164745,186.3392708483868,1.076754592861559 -2957,489.2099191330638,453.33362646926923,1.0791388297029993 -2958,4302.237985648219,4034.9821815498867,1.0662346925149684 -2959,115.22824626094989,91.13405574229935,1.2643818528913264 -2960,264.67495580512576,234.3717670038708,1.129295389067722 -2961,847.9138041842768,825.6995869485276,1.026903510171108 -2962,152.67330785329156,107.46299549150177,1.4207058639582129 -2963,106.60025630966919,85.40355948389161,1.2481945360810822 -2964,72.54483903455409,69.9988853769469,1.036371345684965 -2965,376.03786023022747,350.50153112799,1.072856540797571 -2966,359.248270220318,335.474728846076,1.070865371755468 -2967,163.85251827123074,158.0886701190428,1.0364595903542466 -2968,161.9784303256946,156.290847919024,1.036391013820703 -2969,107.81117535721036,96.49629902900598,1.1172571014853452 -2970,170.718088230111,163.52600151732156,1.0439813035606305 -2971,102.30348715389582,90.7773812847531,1.1269711210658004 -2972,92.8102025779818,82.29489452712015,1.1277759466280906 -2973,313.67822052639286,277.8436609501918,1.1289738245373357 -2974,284.450312281633,251.792212643724,1.1297025801354663 -2975,265.9393777177608,235.46242764208586,1.129434451096382 -2976,284.2747911171415,267.4104385585561,1.0630654235096082 -2977,2640.33802923255,2455.8322426679815,1.0751296376678092 -2978,444.07521180724854,408.38003413973786,1.0874067649822876 -2979,265.2217537906566,249.48582093266458,1.0630734556343346 -2980,262.30183347310117,248.3907398346698,1.0560048802450956 -2981,62.050288224189444,59.607783855894795,1.0409762653515109 -2982,65.14843132848706,62.578647453501844,1.0410648676434668 -2983,61.9487874865658,59.51027852267822,1.0409762653515109 -2984,65.2643448347664,62.69072282259277,1.0410526772750202 -2985,264.72166701192026,249.2750159111146,1.0619663027373492 -2986,2810.8905637526977,2614.443158163139,1.0751392911244548 -2987,558.0996246953275,525.6086175402943,1.0618159711822883 -2988,262.23150691859433,247.19076804322722,1.0608466853128466 -2989,925.5451450891758,861.4625683519225,1.074388115156124 -2990,231.92416064197872,214.5872885129813,1.0807917013590889 -2991,427.3114462902086,395.0579314064727,1.0816424942258671 -2992,3375.4395757740426,3180.182110845015,1.0613982024058193 -2993,5491.115301822613,5236.739587701777,1.0485752078866448 -2994,210.91104126445484,179.40808569508027,1.1755938448778533 -2995,2120.1784764095064,1991.0167269684766,1.0648722573203548 -2996,410.8952173429026,350.09875371788087,1.173655184371245 -2997,140.93738957333974,112.78509934047163,1.2496100140665123 -2998,1124.8289272192026,1052.8828891252356,1.0683324221877533 -2999,194.53324693508108,181.10514345290682,1.0741453457707346 -3000,6387.052154205229,6055.268461298758,1.0547925653547836 -3001,128.81384041706355,119.42476469840568,1.0786191686654687 -3002,258.1641552534863,243.35668432907943,1.0608467811978546 -3003,1350.299504163861,1283.3183330910138,1.0521937303829485 -3004,1616.566757886967,1540.0203998206457,1.0497047688947732 -3005,491.95801668268126,467.9206217256771,1.0513706681025405 -3006,38.187064187601365,35.16380647934671,1.0859764061672432 -3007,79.99825990285626,77.32829913681219,1.0345276023893952 -3008,66.78781663115814,63.8124746303214,1.0466263378449667 -3009,44.950072633504085,41.93152518977773,1.0719875423101048 -3010,76.30771198506214,73.76092571832145,1.0345275800423976 -3011,83.39555221800401,80.61220780378181,1.034527579507525 -3012,82.1246136032394,79.35181012202153,1.0349431660973334 -3013,378.56437207602835,356.3134085942625,1.0624477298498278 -3014,185.92838485904906,178.47239213678847,1.0417767287869713 -3015,94.04772771109076,88.52216475316418,1.062420106572564 -3016,95.08037932828815,89.49936760280092,1.0623581135260733 -3017,93.98347588255606,88.45982380568256,1.0624424946742734 -3018,292.1440015836722,282.4065230952971,1.0344803596660876 -3019,289.326336701113,279.6975622696591,1.0344256644688619 -3020,291.448800349443,281.6690200075316,1.0347208235454857 -3021,259.55694687226094,250.54047888508578,1.0359880687835306 -3022,77.91255294259899,76.12815403739886,1.0234394085573588 -3023,38.370777211881304,37.035436321324795,1.0360557623507092 -3024,15.85628584689902,14.78654345303011,1.0723456700524352 -3025,150.4513697040262,147.00564434596342,1.0234394085573586 -3026,121.02661368439401,118.25479131685309,1.0234394085573588 -3027,145.96344743486563,143.83450795929875,1.014801312326033 -3028,972.4562204692116,950.1912451310951,1.0234320990139671 -3029,68.8124331260031,62.257352940223534,1.1052900561331838 -3030,832.0979447803068,797.631583242855,1.0432108786331218 -3031,80.6764329806615,78.72448529020201,1.0247946707211109 -3032,27.572614734773573,26.359621408970447,1.0460170996761862 -3033,15.924920829000364,14.850547984421548,1.072345670052435 -3034,917.2143921482259,869.4182631779604,1.0549748389176432 -3035,280.4277596966462,266.2826892376287,1.0531205032498172 -3036,59.86147973329261,55.28036875781278,1.082870485100235 -3037,3282.9733637561103,3155.0903961278,1.0405322674067468 -3038,778.2026857735373,706.2949725688322,1.1018097480478628 -3039,155.2023025919926,143.50408645774232,1.081518348522396 -3040,225.49944178149929,220.3351151556561,1.0234385092099134 -3041,906.8429580538827,862.9641599402054,1.0508466053986734 -3042,110.65671534254477,109.98604438619599,1.006097782314944 -3043,1380.346905786203,1292.2692790236747,1.0681573323704423 -3044,106.22064404556941,104.67421729874981,1.0147737120632674 -3045,108.31865898361913,106.74776332360784,1.0147159585465888 -3046,88.29699717204257,87.76714573087352,1.0060370134719177 -3047,1359.63091342205,1289.936423305712,1.0540293993232104 -3048,254.76239928327286,243.21048145331036,1.047497615073716 -3049,745.3060378405559,711.6693181085557,1.0472645354747039 -3050,6077.8362866257385,5797.596334943349,1.048337265220299 -3051,1953.2549295435244,1802.445310793495,1.0836694560700086 -3052,1365.2244459493104,1270.8574055305007,1.0742546252696363 -3053,4849.324717576143,4607.028378343877,1.052592760307538 -3054,1750.6984958867067,1633.3857058864005,1.071821854187614 -3055,1599.4774774664518,1492.5095150061215,1.0716698696958669 -3056,1611.7552868321854,1511.0573585079844,1.0666407054353184 -3057,1040.928717536522,980.789246308789,1.0613174251798423 -3058,727.6509453070107,686.098579243685,1.0605632591589544 -3059,819.5412219928018,767.5308941064237,1.067763171861544 -3060,293.9023827737034,279.8272234347686,1.0502994639555356 -3061,377.2132550764392,358.234317481204,1.0529791163746645 -3062,292.1846233114091,278.1914383732699,1.0503005592837964 -3063,142.4740830841439,133.26323184434298,1.0691177237136165 -3064,175.09013265685994,163.10080765177227,1.073508679556544 -3065,125.86992233283222,117.44898493200601,1.0716986818208882 -3066,177.11856044528946,164.99157503193416,1.0735006342657685 -3067,289.4756365337324,284.4496823819606,1.0176690446960068 -3068,299.6084831337562,298.78901811171437,1.0027426209544803 -3069,1393.4417571256186,1330.210821449575,1.047534522089618 -3070,178.98084709706757,171.8202161329728,1.041675136519169 -3071,1755.360386758179,1661.888015128665,1.0562446872344027 -3072,254.41962042505526,246.59160376305283,1.0317448629334691 -3073,543.3638930401266,509.0863916748702,1.0673314037181099 -3074,236.0939600189601,226.65037594400854,1.0416658654794577 -3075,233.8332726645497,224.59604109300278,1.0411282030021263 -3076,2001.8601896006332,1887.7949957446021,1.0604224474125383 -3077,735.6406889575953,721.5103640227111,1.0195843686237602 -3078,26.003741671559368,24.963611205201943,1.0416658654794577 -3079,25.984413863550756,24.945056495242515,1.0416658654794575 -3080,555.8123392727164,544.9930186580135,1.019852218733635 -3081,443.75747529602256,429.6628704373301,1.0328038697976074 -3082,25.905696939823105,24.869488190341382,1.0416658654794575 -3083,25.509187231969033,24.489342653664984,1.0416444243819432 -3084,26.260995102205325,25.210574688571487,1.0416658654794575 -3085,975.2426765906994,938.3420156104714,1.0393253849516915 -3086,538.3145537104272,521.8283209099438,1.0315932120582019 -3087,1274.8241637639596,1212.6032813468705,1.0513118209180323 -3088,195.92384196529457,189.75366621090842,1.03251676701481 -3089,179.60471092167612,174.63259580463566,1.0284718617056052 -3090,430.72042963170054,417.86316517954987,1.0307690783097048 -3091,541.1878396889161,524.6169796774614,1.03158658726914 -3092,362.0578121791318,335.620927485373,1.0787700722116353 -3093,460.16603576677113,439.20763521015834,1.0477186616908067 -3094,454.95628277470274,434.5829748312141,1.046880133653191 -3095,232.85963600121173,219.4158947405436,1.0612705897016494 -3096,2306.859002690667,2163.5382935452208,1.0662436664851436 -3097,699.0870946849951,636.3909864422042,1.0985182216255116 -3098,1453.6736742622843,1301.7224870937453,1.1167308613587745 -3099,2984.16205219764,2790.9214364307513,1.0692390023038485 -3100,226.8358688533369,217.81008168307352,1.041438794295098 -3101,946.1887713090315,904.9597695352988,1.045558933293691 -3102,207.2197595215028,196.68961500960629,1.053536860659279 -3103,190.16328051103474,180.54054575352282,1.0532995772077096 -3104,192.03890276284042,182.31397077346026,1.0533416717771134 -3105,167.01227041070374,159.51692675299202,1.0469877636830232 -3106,339.13775125666706,320.9320614733247,1.0567275506839804 -3107,516.679704697669,486.27640521088773,1.0625226705655109 -3108,163.48887395619343,156.47163591848826,1.0448467097344127 -3109,3612.6640470496745,3476.7962975458004,1.0390784325212785 -3110,842.1260877149375,806.6000958944143,1.0440441205020308 -3111,69.90613629284813,67.99638441347979,1.0280860798091163 -3112,136.05476733274756,129.9615902234799,1.046884445618047 -3113,479.62519620082725,465.68117104721966,1.0299432874261383 -3114,617.9958167643551,606.9144606989923,1.018258513815275 -3115,131.70870801738354,127.55431793234753,1.0325695762587936 -3116,134.91882457613195,129.9934732050774,1.0378892205094352 -3117,130.27308041663713,123.89041166647104,1.0515186660881317 -3118,137.16117650995946,130.35983638020892,1.0521735859648802 -3119,2100.965788248361,2017.6439602149487,1.0412965962659417 -3120,1595.528645377444,1528.7351876663004,1.0436919737636887 -3121,367.746913810125,351.9645321711328,1.044840829675754 -3122,719.6658916152109,695.6033709819742,1.0345923002058888 -3123,373.8547623616845,357.8082401177167,1.0448467096193441 -3124,363.8035358475231,348.18857235103616,1.0448462836992372 -3125,1384.9644965196483,1336.974814018144,1.0358942307651078 -3126,893.6138713760423,861.3019326223517,1.037515228434833 -3127,2694.5527285901494,2536.2236211646095,1.0624271085973234 -3128,930.3820076518355,893.5504921551445,1.0412192884678038 -3129,113.86394687478193,112.0616934430496,1.0160826896003339 -3130,751.0326083244187,725.6625554024355,1.034961226444864 -3131,257.03028619838983,248.59126233823295,1.0339473872926184 -3132,279.5768281909166,270.3978976092308,1.0339460131267397 -3133,197.95893726917555,191.47397631457446,1.0338686284132257 -3134,275.9166226531777,266.85755205128436,1.0339472146553768 -3135,807.2579292435591,755.0609257141381,1.069129525514849 -3136,808.2833718003643,737.8729768670497,1.0954234633070201 -3137,28.064472302013602,27.58981295616564,1.0172041523660234 -3138,531.2156777616816,484.19333212226434,1.0971148145169904 -3139,106.88260643028626,105.22261807234584,1.0157759651712819 -3140,113.67965107454265,111.90790552910329,1.015832175010894 -3141,178.35151439636306,173.359570080353,1.0287953201181583 -3142,44.3534048007097,42.966540152253394,1.0322777827477359 -3143,99.85297250404851,96.63484203916299,1.0333019684927027 -3144,59.41310875374106,59.34898384538735,1.0010804718834068 -3145,68.00180223620572,67.82770205705269,1.00256680049409 -3146,156.07313075489594,151.18369385329976,1.0323410334605305 -3147,154.54418369283465,149.71748285004642,1.0322387255710312 -3148,338.8879111867537,313.52158763516735,1.0809077414506594 -3149,336.41295081275103,311.2805204796438,1.0807388470514676 -3150,527.9136296571484,481.7256992866836,1.095880145981121 -3151,520.6643582569665,475.17876129857683,1.0957231270902887 -3152,439.3604663956873,390.3746095606006,1.1254842288288789 -3153,541.2853941114358,479.06528123845413,1.1298781508694047 -3154,544.1636661051396,481.58522598645203,1.12994260775028 -3155,182.4816823513786,171.92130071797007,1.0614256731964378 -3156,174.07421941477403,160.73929512751252,1.0829599524912876 -3157,253.2961826790544,236.79773590024953,1.0696731610041863 -3158,177.35472986969523,165.51653722755407,1.0715227181551406 -3159,175.01535042156434,161.62389122100362,1.082855691070136 -3160,231.30653265459605,215.66573775804855,1.0725233180714808 -3161,3473.4441243405454,3272.2097788497113,1.0614979964889582 -3162,1338.0881406453555,1259.197139848463,1.0626518265490872 -3163,497.37689413052584,460.7603679900977,1.0794697823082195 -3164,108.07014088032669,101.97656716580357,1.0597546464239729 -3165,134.3516850896269,131.47391957800383,1.021888489525983 -3166,108.08189828351999,101.95175869231734,1.0601278454617242 -3167,131.56629644834948,128.789912694551,1.0215574628145232 -3168,385.53994455990306,354.47178937863237,1.087646340589561 -3169,433.59377163016995,391.63226440491076,1.1071451742849128 -3170,204.086720839401,199.24359924308627,1.0243075391867718 -3171,676.4558355550257,650.4687446924298,1.0399513290602207 -3172,237.77880426046335,232.38148311795698,1.0232261240013116 -3173,207.55055212060407,202.89284119001587,1.0229565070076874 -3174,108.52007234681666,97.99511483744297,1.1074028794887663 -3175,107.90004931794792,97.39775569055934,1.1078289078934758 -3176,106.29396706631027,95.99550730099081,1.1072806431766538 -3177,105.95351754629894,95.64145734420325,1.1078199819246135 -3178,881.8353178100881,861.7129236118753,1.023351621690748 -3179,87.44117322061403,80.69627589947083,1.0835837496335743 -3180,87.20155979791936,80.47849355788419,1.0835386690631776 -3181,86.59657977713046,79.92035088441811,1.083536030796056 -3182,85.9157837739573,79.29204136463869,1.083536030796056 -3183,328.62608325199,303.4145360606738,1.083092746704379 -3184,150.94755011595717,139.31013443554667,1.0835360307960558 -3185,130.26098848351054,120.21841893694108,1.083536030796056 -3186,742.1636551134694,696.8837885524911,1.0649747738500703 -3187,774.5183376687077,727.2330062801861,1.0650208818634168 -3188,486.84988662501445,458.6575177081577,1.0614671466800103 -3189,751.1358082326342,705.2784294785583,1.065020248510904 -3190,1591.1859518500225,1507.3838707187629,1.0555943862470152 -3191,1800.8653287427587,1710.8824008636532,1.0525944552551842 -3192,740.3314554958735,695.1651970105726,1.0649719788613266 -3193,3074.5280617741564,2902.218321113145,1.059371736236205 -3194,1362.7967267807285,1306.7605519983192,1.042881746542408 -3195,128.92072227450987,124.48384009804558,1.0356422341483822 -3196,130.09459090968926,125.61763922514695,1.0356395145789852 -3197,129.85024541833235,125.34507467025739,1.035942144196145 -3198,608.3890443986397,565.9565612111918,1.0749748056575916 -3199,150.04646609138524,143.86625505106323,1.042958030972089 -3200,129.80605826556814,125.29860969031681,1.0359736519534555 -3201,5408.771665099265,5151.845088041369,1.0498707885557899 -3202,2977.8296748249863,2822.4504115933337,1.0550511933153637 -3203,276.76489945337505,263.0761061635989,1.0520335863617485 -3204,864.2563084694324,822.6832482148889,1.0505334955400532 -3205,1877.496464844914,1804.3777847490642,1.040522933009851 -3206,9151.895971719054,8668.707193859735,1.055739427697082 -3207,858.2984710817353,847.2453816554577,1.0130459128672744 -3208,4807.126874402824,4599.846361142621,1.0450624862193687 -3209,6529.789937719424,6087.938611646079,1.0725781507106682 -3210,502.6375785315653,486.6541736945721,1.0328434557863764 -3211,2800.624636773593,2657.292906437745,1.0539390031067342 -3212,4743.543676565577,4460.398584605249,1.0634797735201476 -3213,3745.9434248081466,3539.908394690856,1.0582034920525913 -3214,5378.273642350935,5086.529393475768,1.0573562494791384 -3215,3284.489015802604,3166.8406780076234,1.03715006524073 -3216,4417.777405782918,4242.735928725965,1.0412567456465565 -3217,7189.447892771567,6805.9381313518525,1.0563492870517086 -3218,3084.216356854389,2950.4145195428346,1.045350182635451 -3219,4609.323090723947,4312.2749206761355,1.0688843303156645 -3220,3754.5511808460747,3542.4292078676235,1.0598803703705173 -3221,3372.4991345699177,3171.7795223683443,1.0632829649053595 -3222,319.65268177981744,306.82625238332304,1.0418035591702568 -3223,643.6263712071666,602.9115274745424,1.0675303786331127 -3224,319.8921963288238,307.0700505172639,1.0417564193901712 -3225,319.45122371003976,306.64238093419243,1.0417712735494191 -3226,4312.924393655993,4072.481013801604,1.0590410069536307 -3227,2124.6824950285622,1959.319524148087,1.0843981641801763 -3228,1018.0795580392416,937.646117799904,1.0857822996463389 -3229,2953.605680508211,2778.024091941461,1.06320376741011 -3230,1305.6566292001953,1247.0887362057338,1.0469636933556583 -3231,209.60053817735687,203.8760396193185,1.028078329207921 -3232,719.1344522565132,689.7085143900415,1.0426643099983985 -3233,1178.8194268547518,1129.894054519235,1.043300849437901 -3234,211.578183775542,202.71066470864864,1.0437447091382115 -3235,385.43966732134663,353.4358566093973,1.0905505486029918 -3236,108.35260551630599,105.3404504789977,1.0285944765150672 -3237,692.4849727879279,625.7886374390866,1.1065796522317544 -3238,99.70820621066468,96.13443360691238,1.0371747403054896 -3239,835.3526977339302,782.8099470494832,1.0671206988139175 -3240,1152.465997324426,1101.5749719138496,1.0461984219940652 -3241,169.1667137950342,161.5659709849475,1.0470442059287028 -3242,1442.5321078466668,1306.5784351706745,1.104053204167749 -3243,756.0424611224856,700.0685446236278,1.0799549085996296 -3244,168.89002213898405,161.29937629238873,1.0470593626650837 -3245,138.86728561673038,132.62800360676496,1.0470434737784682 -3246,824.9039560271841,799.318751179216,1.0320087634754256 -3247,1085.0520758888877,1052.2914406964544,1.031132663371994 -3248,51.27644996206919,48.56550303851233,1.055820423015223 -3249,152.54105290438872,142.15096594519383,1.0730919194963529 -3250,640.894851875979,626.5940545262939,1.022823065821294 -3251,185.68418807836198,177.84087462188114,1.0441029851723178 -3252,93.3240760284707,86.38223920071425,1.0803618532234003 -3253,71.26765605599715,67.49737903762244,1.0558581247469356 -3254,28.634129021729358,25.915619742132098,1.1048984861889166 -3255,71.43870709397919,67.6587197917508,1.0558684425874885 -3256,75.70024478972621,74.41127067762153,1.017322296748419 -3257,1049.4492414223973,980.591317963852,1.070220816967384 -3258,227.67771825874067,223.7951020111371,1.017348977760069 -3259,75.62674909802121,74.33768382886024,1.017340670340613 -3260,985.4398226672614,920.7571536101133,1.0702494341787514 -3261,112.26241610391192,110.30472426608935,1.0177480325602375 -3262,75.19451990812261,73.9070725869661,1.0174198121518288 -3263,13.084328219040039,11.8464518818679,1.1044934255012528 -3264,124.45175108809111,121.95349076183722,1.0204853531510036 -3265,61.9997817731062,60.7572596743997,1.0204505947991271 -3266,124.62810792676915,122.11544802468315,1.0205761018997213 -3267,262.3812421171766,249.36912007335914,1.0521801658520893 -3268,125.80081475082497,123.21407921626994,1.020993830826871 -3269,595.062578423785,562.5033667676091,1.057882696495268 -3270,174.91917601985486,168.96571668878056,1.0352347177151922 -3271,132.67352487457063,129.50750621076932,1.0244466035709832 -3272,87.98925021848764,85.61817341593787,1.0276936158288608 -3273,2657.0412814507786,2474.5786979237078,1.07373480733515 -3274,564.6183159181123,549.5197414625817,1.0274759454780364 -3275,145.43000644743256,142.3589059887351,1.0215729422572304 -3276,3992.03244151316,3758.82231200122,1.0620434035328947 -3277,3433.8389334492385,3329.7585709725604,1.0312576303231134 -3278,895.0592332967276,870.4711465782603,1.0282468716109898 -3279,335.5538615667111,313.15762257679063,1.0715174639711302 -3280,518.0496093929337,493.5946757022043,1.0495445653986015 -3281,205.80365414807986,185.50394341605664,1.109430076569823 -3282,333.76802307691116,311.4836689862581,1.0715426081989428 -3283,522.4626444202393,497.79578580236284,1.0495521644043604 -3284,90.86632045281289,82.76565931983926,1.0978746644386588 -3285,578.7695438389585,543.5584460681517,1.0647788623753478 -3286,313.40854997529647,293.48232292162606,1.067895833913621 -3287,1866.6425474979012,1813.183195105027,1.02948370166743 -3288,527.1500641155372,495.69767847279144,1.0634507422742998 -3289,262.44757231558856,246.7837701477113,1.0634717678496515 -3290,526.3382254267249,494.9244929096567,1.0634717678496515 -3291,260.98577408054615,245.40921721717308,1.0634717678496513 -3292,1631.7324536178655,1574.5412363473129,1.0363224639344646 -3293,811.166841261741,782.7366921620331,1.0363214723219114 -3294,2683.06284394937,2570.2096501085744,1.0439081667271883 -3295,7176.3854101072375,6941.642932103219,1.0338165590336543 -3296,1269.0599430737743,1189.3070051161446,1.0670583269202565 -3297,2187.672075074287,2072.968940192293,1.0553327802737624 -3298,6331.110750618061,6078.902172179278,1.041489165526144 -3299,4143.434770511739,3876.3634354984492,1.0688973929966263 -3300,287.3543137444997,278.1499462722221,1.0330913868423666 -3301,2005.7529610462157,1935.7731492167688,1.0361508329928852 -3302,2679.707427003957,2526.504978576889,1.060638094809282 -3303,1003.9140385185877,977.5505793511011,1.0269688952411922 -3304,1336.0008043644505,1250.721192876886,1.0681843499360604 -3305,1200.4486415229,1123.7707448031551,1.0682326863146594 -3306,4438.663497419972,4306.559734102006,1.0306750100949227 -3307,2945.646731777671,2857.3043968183924,1.0309180691625464 -3308,917.3230037692194,892.7737028597958,1.0274977867636397 -3309,6102.231590392752,5799.591523391837,1.052182996988712 -3310,4600.011154315595,4434.311441634605,1.037367630772436 -3311,1401.430294217235,1367.1329674224653,1.025087045380401 -3312,2272.1848249499376,2181.7348552291633,1.0414578194522512 -3313,1862.4435021702022,1794.1977101468988,1.0380369407659737 -3314,903.498396927955,846.0923553688416,1.0678484342694339 -3315,580.9486042321047,540.45228949192,1.0749304157417028 -3316,752.8560777992094,719.6493916688764,1.0461428669498716 -3317,555.4571741317097,521.0613708047192,1.0660110406455006 -3318,792.1117628160017,758.1385444659344,1.0448113588183272 -3319,1068.1879529474825,1028.3655491129687,1.0387239769640895 -3320,1019.3318803144731,977.0070645948646,1.0433208901484856 -3321,710.2125353297888,690.6674970729435,1.0282987665405963 -3322,1576.9052110411053,1556.6438527161733,1.0130160526375882 -3323,1169.7945892300695,1112.3043442790847,1.0516857146577503 -3324,2270.292773673654,2184.40723919528,1.0393175470843128 -3325,3233.992647552472,3158.3057799241797,1.0239643887901537 -3326,1985.1449731025943,1930.9250201995726,1.0280797816258125 -3327,7236.857548743346,6865.75862996078,1.054050679434486 -3328,1476.9450554419163,1416.8125877886341,1.042442076087944 -3329,6654.769381990642,6257.738715700913,1.063446347686835 -3330,11471.078984644631,10859.833642963351,1.0562849636354548 -3331,4268.969183379104,3999.350777786108,1.0674155433153194 -3332,1414.318483732333,1332.8312634341244,1.0611384370503523 -3333,7421.386635110782,7077.87923285882,1.0485325322671855 -3334,3110.8435298616178,2925.966877959033,1.0631848068053125 -3335,1698.0838111562618,1638.1870578132946,1.036562829047691 -3336,195.10303800394524,183.93331278275642,1.060727037708397 -3337,162.68191026541692,149.66567002258623,1.0869687767466407 -3338,5715.108917908968,5533.1510960615,1.0328850267575354 -3339,6265.865535021409,6027.485661078272,1.0395488081344508 -3340,1711.8859826566402,1617.1722673497575,1.058567486729228 -3341,2804.993275292815,2666.19166800426,1.0520598758724848 -3342,5209.284260480768,5037.449369019494,1.034111487555203 -3343,9477.418189126414,9214.677685891256,1.0285132602779417 -3344,4898.346547077135,4737.305317537316,1.0339942686285495 -3345,72.01884895293391,69.49967793299805,1.036247233006813 -3346,180.9093739587483,174.5822559985784,1.0362414721013882 -3347,223.42614391597624,211.82829050143204,1.0547512014900853 -3348,183.29792403457918,176.88451408773432,1.0362576112438189 -3349,71.0700356214137,66.21583675131411,1.073308729576739 -3350,421.3328180051258,401.5117270640441,1.0493661569638788 -3351,411.55580105332933,379.28252441406477,1.0850903338853326 -3352,455.4302893696791,414.50698500646763,1.0987276592276796 -3353,110.84092205389243,103.27061768221864,1.073305501037758 -3354,80.66387462330697,76.5964631533773,1.053101818314836 -3355,76.02683719486137,72.19086248499724,1.0531365685049314 -3356,1298.4007953497887,1186.454519598711,1.0943536173547899 -3357,37.093346204155615,34.56157519901984,1.0732539240632635 -3358,165.3023199366145,161.4008133842373,1.0241727812305947 -3359,99.50424697765291,94.82296702317426,1.0493686297891793 -3360,892.8498503420569,852.9522556958772,1.0467758826824716 -3361,2008.7948746436202,1867.6219755919522,1.0755896540609737 -3362,780.2422257320479,736.340456465568,1.0596215634778623 -3363,319.68978189756916,317.07890794869235,1.0082341457707407 -3364,270.50079223708286,269.0787505698674,1.0052848530930212 -3365,309.59574110996687,307.2092043908516,1.0077684414561974 -3366,210.61589409813826,203.10284574714368,1.036991349497624 -3367,2244.513938423191,2121.2228771280465,1.0581226341769754 -3368,190.94177931525394,187.02157169590853,1.0209612590879065 -3369,425.932589569074,399.3884558547863,1.0664619453195685 -3370,235.70471419268412,231.40017977067706,1.0186021222035047 -3371,351.0550426691959,335.0961071997879,1.0476249503545951 -3372,575.6864339070929,543.638903426739,1.0589500314976494 -3373,4202.096718621688,3921.7338317648096,1.0714895245021543 -3374,102.04972258089241,96.21107705554789,1.0606857931958662 -3375,475.67127989011254,443.5742486849311,1.0723599967769541 -3376,669.5325463689662,618.1481176165845,1.0831264017279654 -3377,61.12314374542408,54.65999326296841,1.1182427969092779 -3378,61.42176059048772,54.92641547680594,1.1182553978317518 -3379,156.83268180880546,143.21854911880936,1.0950584458071997 -3380,111.26311474859473,111.25652992825295,1.0000591859223547 -3381,116.3540278678947,116.3540278678947,1.0 -3382,117.76491229780011,117.55387636761688,1.0017952273179258 -3383,670.5403833451543,650.3654341946672,1.0310209431340234 -3384,486.40422175791895,472.90886156889263,1.0285369154307131 -3385,108.0589714530207,107.5009215894459,1.0051911170185688 -3386,2077.2840847372377,1946.4288596894403,1.0672283625452799 -3387,2182.01723039181,2120.6241078004236,1.028950497339703 -3388,1311.6146591061986,1260.7941928776183,1.0403082965607482 -3389,241.10907010716898,235.7654142451462,1.0226651389014443 -3390,37.62278832467875,32.793595495050305,1.1472602426396745 -3391,301.25563906221504,273.7786966739531,1.1003618715483352 -3392,136.6761119119244,122.22400384754084,1.1182427969092779 -3393,100.2359033667688,88.37863065498156,1.1341644764567178 -3394,134.1532111943856,110.31022189050996,1.2161448766510627 -3395,55.22188653842099,48.84193878380866,1.1306243755566745 -3396,3962.227951935659,3730.278621259759,1.062180162455953 -3397,2518.137306503915,2415.827489642419,1.042349802417655 -3398,1353.2657481874537,1301.8988036524731,1.0394554049753104 -3399,1235.3223911327364,1151.1053257993442,1.0731619109440838 -3400,1110.2281030227723,996.939000073819,1.1136369456311417 -3401,164.46931766469612,160.30988366101477,1.0259462106059334 -3402,146.22766182518416,142.529766494012,1.0259447231419376 -3403,144.36198622292397,140.7108129308584,1.025948064800533 -3404,146.83894867796522,143.12567540986262,1.0259441449444278 -3405,144.3529720396064,140.70358488230744,1.0259367034631814 -3406,580.8505465435173,565.8126432798474,1.0265775313476555 -3407,190.62244503365756,185.64031175547592,1.0268375614707224 -3408,204.70643869876406,199.35646541436577,1.0268362165896063 -3409,137.38627885671087,135.27476452334412,1.0156090778705615 -3410,137.69568301524657,135.58046111793035,1.0156012295567896 -3411,138.536039687868,136.3969364290708,1.0156829274527701 -3412,138.31920074436002,136.1948704706421,1.015597726011097 -3413,132.28460008529214,131.55294228160372,1.0055616985146727 -3414,134.69807023242507,133.49947685948663,1.0089782626953663 -3415,97.70010283945187,97.30352746303373,1.0040756526177204 -3416,135.9782841910299,134.28824864023412,1.0125851336055733 -3417,103.97842279417439,103.5165367005874,1.0044619546625961 -3418,104.90225707838933,104.84707163001607,1.0005263422956436 -3419,2016.7793477475122,1915.9086618315973,1.0526490056261257 -3420,858.4672097271393,815.3578551159997,1.0528716984090458 -3421,866.1442912265293,822.6489094120985,1.0528723509103226 -3422,4977.937107763867,4767.816577435648,1.0440705985466479 -3423,860.5323494709698,817.3169217854152,1.0528747497251756 -3424,866.7734642265032,823.2446114343144,1.0528747497251756 -3425,1317.336235904857,1249.5599773761512,1.054240100319973 -3426,791.250792498794,751.5146437934129,1.0528747497251754 -3427,808.3936363746238,767.796584147956,1.0528747497251756 -3428,64.23234852954182,62.461041819552825,1.0283585841412353 -3429,648.4562317765823,624.0584096593733,1.0390954143707893 -3430,2419.463463152526,2319.384910760058,1.0431487468630949 -3431,72.76120165642905,63.57692522782165,1.144459273481636 -3432,787.8116521007464,765.9048031781733,1.0286025741471645 -3433,5453.073295275411,5132.987562631431,1.0623585638457864 -3434,75.11754183487656,63.98492487536201,1.1739881226898379 -3435,195.43299782748605,184.63787080994186,1.0584664834477875 -3436,1594.5438649170892,1515.3934125367048,1.0522309597795398 -3437,151.9895465718319,144.18591444401204,1.054122014330672 -3438,175.6251080348946,150.16828670172333,1.1695219536181811 -3439,65.04555019293392,64.76426464689074,1.004343221490691 -3440,707.2653741388663,686.2935463548347,1.0305581014063456 -3441,1533.06504453689,1472.210425122984,1.0413355444136476 -3442,114.03375142858866,111.02957042222991,1.0270574856313888 -3443,452.47347723146436,425.0532818288829,1.064510019272408 -3444,272.48571824376006,267.6926805463998,1.0179050009420392 -3445,568.5220228267939,552.5624021516279,1.028882929082798 -3446,648.3605698513815,637.1162998292994,1.0176486930645077 -3447,422.67181989063795,412.3096379437898,1.0251320391114913 -3448,719.988044658233,698.3469179631514,1.0309890774032504 -3449,952.8769366613919,907.198951055845,1.0503505714511514 -3450,785.7971119691405,732.5325759761135,1.0727128563832822 -3451,1098.3036245850863,1014.8442760508426,1.0822385764040732 -3452,466.76857300770007,441.62254331623257,1.0569400952737622 -3453,936.802470290771,886.2903183812767,1.0569927831342554 -3454,809.0813332773638,779.0812536608406,1.038506997152807 -3455,3402.500582462423,3227.959585283548,1.0540716178649254 -3456,969.4937199279975,936.7589788615765,1.0349446781990848 -3457,1744.6270590534407,1685.621352317399,1.0350053151942578 -3458,3500.6596777835043,3347.611274607842,1.0457186903200375 -3459,139.9090297287215,135.4752388752493,1.0327276843376154 -3460,1801.569005474002,1722.942916707632,1.0456347613167687 -3461,157.55487611134618,152.4403565586056,1.0335509550633615 -3462,635.8407909965159,624.3682896570873,1.0183745739965901 -3463,1520.4466535450674,1448.5483171736857,1.0496347519229907 -3464,1781.39868300459,1742.0327267229984,1.0225977133940787 -3465,265.80661555341646,262.6363968699065,1.0120707515077596 -3466,1352.452359769041,1302.0705289811,1.038693626548299 -3467,2811.862958455327,2735.189755341923,1.0280321330407363 -3468,516.2041212818518,490.3449831250555,1.0527366222694714 -3469,947.8415576820411,901.9177768418709,1.0509179240273714 -3470,339.8791080857997,315.9987337050046,1.0755711078357935 -3471,512.1843013299725,480.17515633050095,1.0666613934050346 -3472,286.3792848654168,273.6587734974136,1.0464831118163418 -3473,286.67909203243755,276.1241371364864,1.0382253974803148 -3474,253.01167834879624,252.0696909557246,1.0037370117347313 -3475,342.3372712297296,322.6366653534774,1.06106127415701 -3476,290.03512621408646,276.76720163486755,1.047938933879611 -3477,246.0822709506301,244.70743842687608,1.0056182702601615 -3478,417.27717699723297,387.95561270207776,1.0755796883332427 -3479,429.487568340138,399.1243445632179,1.0760745972790713 -3480,556.343257926514,514.0022646023574,1.0823751104616484 -3481,1313.7281107541983,1257.8376513570215,1.0444337624469098 -3482,1325.2073674698604,1268.8462933450573,1.0444191502315212 -3483,1331.0216467386674,1274.366070924781,1.0444578501472286 -3484,1320.1439927811587,1263.9902639867205,1.0444257605413234 -3485,392.86340387852806,381.79449244714885,1.0289918048854816 -3486,1732.273521770177,1656.104991093762,1.0459925735904643 -3487,2538.7386109879867,2424.927056664578,1.0469340114831964 -3488,2090.195931267377,1999.7285171962349,1.0452398479559537 -3489,2164.8808243660105,2061.6207504841964,1.0500868425279297 -3490,2521.1960002006304,2408.170635361228,1.0469341180312368 -3491,4753.469072526308,4489.213391189186,1.0588645845741633 -3492,3696.87444975071,3408.3267996994696,1.0846596195167328 -3493,4220.390643412513,3998.5922898314293,1.055469109502643 -3494,157.11288944583276,156.28185826249756,1.0053175153698222 -3495,618.9649317779802,597.175017748085,1.03648832148415 -3496,2911.144751174508,2725.6791970598297,1.0680437941173484 -3497,196.00033751978614,179.45990048834966,1.09216787140986 -3498,193.88560922548294,177.48999413707048,1.092374869739139 -3499,754.5192677233644,697.7691255343982,1.0813308300872486 -3500,753.4858692823382,696.9562636974356,1.0811092582553263 -3501,4218.980501858702,4016.6432717296493,1.0503747075457668 -3502,2249.34439298126,2105.122594881759,1.0685099283291868 -3503,1727.73248013887,1603.6118855425348,1.0774006452030895 -3504,1415.6510066900662,1334.2299658712075,1.0610247430364776 -3505,1823.765723855935,1694.3354749461178,1.076389977559747 -3506,1718.3646247543102,1594.8396473400005,1.0774529136019 -3507,1342.998641922402,1248.0286186086644,1.0760960300891278 -3508,1805.6236579514573,1675.827159915961,1.0774521986157601 -3509,1708.4595165726294,1585.6470938938896,1.077452557477432 -3510,4692.752500593484,4513.3254135624875,1.039754963489187 -3511,1204.67951986083,1181.08299041458,1.019978722611158 -3512,319.8811613271241,315.50366158145613,1.0138746400714522 -3513,294.02441266980713,279.13812826985946,1.053329455535921 -3514,292.711154157702,277.8849088959089,1.0533539058335364 -3515,1065.6929985413917,1014.2965530366765,1.050672010420267 -3516,877.2852762031711,832.8821204469883,1.0533126533348471 -3517,1967.903062194417,1891.5234248176516,1.0403799584898763 -3518,2445.4637599711773,2363.1625785369147,1.0348267115355292 -3519,388.70236764442546,369.0382541822986,1.0532847563613639 -3520,958.2586522088417,912.6277106353473,1.0499995135384694 -3521,985.3396362180505,940.7606161125024,1.0473861462119467 -3522,341.15577691721984,316.75152153013323,1.0770454243414422 -3523,343.78727768258017,319.1808133774416,1.0770925546706989 -3524,343.8164393105304,319.20462918358174,1.0771035501267554 -3525,347.2306313211173,322.38044349394914,1.0770834221761179 -3526,164.53610702067346,162.06211200775297,1.0152657211625264 -3527,1433.3888962067804,1399.5052369490104,1.0242111700358034 -3528,167.91712628526452,165.39438299559924,1.0152528957995652 -3529,168.0561345890881,165.5309299560112,1.0152551830268093 -3530,2714.827088075962,2624.629387519512,1.0343658807545755 -3531,830.7762030588444,803.3704405785616,1.0341134812734036 -3532,830.5338613026532,803.1348238996032,1.0341151156539503 -3533,836.3442216356981,808.7626703874105,1.0341033930696575 -3534,2899.7511975450157,2766.5908450596976,1.0481315669511098 -3535,4204.093412625356,4038.8303742988187,1.0409185390350117 -3536,607.5925831838642,589.4430499394502,1.030790986926181 -3537,6391.10352197768,6016.711702252217,1.062225321446816 -3538,3247.8458160109585,3122.5764760566544,1.0401173008619153 -3539,586.7427503781836,569.4303844950945,1.0304029541704904 -3540,3150.9875480809546,2962.475851394903,1.0636331589326844 -3541,687.446275933486,659.9603110367008,1.0416479058469574 -3542,582.7082412533249,565.5434615854325,1.030350947069166 -3543,1555.384865713468,1478.1365556269266,1.0522606046054912 -3544,6067.006618988446,5766.430760104257,1.0521251136775556 -3545,4619.225447669572,4446.8417950939665,1.03876541161545 -3546,3431.0150573173673,3307.514330557967,1.0373394381449488 -3547,3793.6971822605205,3656.74101330052,1.037453067762211 -3548,106.680376751088,103.54211038765443,1.0303090824755659 -3549,1395.2814903700291,1355.7290544276298,1.0291742924688576 -3550,104.46079806087113,101.41284966124232,1.0300548540920615 -3551,103.76597377272407,100.73651810381253,1.030073063134757 -3552,251.44249274725237,241.99579135904446,1.0390366350387972 -3553,232.7058160251902,223.74221878251095,1.0400621630171296 -3554,417.77876077898384,403.7053466632727,1.0348606086890637 -3555,228.02250141584645,219.24486761694962,1.0400357549725294 -3556,282.8526168378107,264.5070753457851,1.0693574698069712 -3557,284.07301622079444,265.63138143955814,1.0694256630421226 -3558,274.23031624189446,256.42765618865934,1.0694256630421226 -3559,280.6310721952331,262.4128887018743,1.0694256428618352 -3560,532.6393905164314,506.27813602559706,1.052068719968388 -3561,549.0018483074015,533.473957279384,1.0291071210058815 -3562,525.1177782706861,510.5546822617491,1.0285240670880202 -3563,535.9638455515372,520.7984595630807,1.0291194908701908 -3564,2208.106189818837,2172.6843613423994,1.0163032555978595 -3565,790.5783287733462,732.7936320145361,1.0788553478555118 -3566,414.35967290841654,373.2900876196613,1.1100205621602264 -3567,1312.031892631412,1272.4500504012503,1.0311067945006407 -3568,30.519177058956206,30.519177058956206,1.0 -3569,1207.954038751797,1071.1960304049792,1.127668516746757 -3570,991.243698405684,924.0377473132806,1.072730742102052 -3571,1039.487747860942,963.3571635418001,1.0790263333271393 -3572,428.67690154398645,398.94807018745814,1.074518047781405 -3573,1649.5672357020069,1552.6119099162013,1.062446594133777 -3574,225.6805108956392,211.3922547188518,1.0675912000455765 -3575,253.94213794435944,238.66972370432168,1.0639897428253537 -3576,1448.0405996879392,1366.3588714841692,1.0597805817406123 -3577,628.2733698869439,588.6150806305808,1.0673755915561616 -3578,215.97719447965645,200.29732976798434,1.0782829443100164 -3579,224.2213756555042,209.92066191590317,1.0681243742711237 -3580,206.315493146554,188.6808824691668,1.0934626256068574 -3581,1067.3951114512074,1009.8243385534302,1.0570106806697164 -3582,297.2122261693954,263.5576858452583,1.12769326083663 -3583,356.83757388751576,318.4088443692224,1.1206898935060108 -3584,298.34052799427076,264.5582606103382,1.1276931111733066 -3585,565.1343294816977,510.3892845858777,1.1072613523621275 -3586,455.88265504537304,408.8902724462644,1.1149266337836008 -3587,459.3960703866519,412.13880370349045,1.1146634732243272 -3588,834.9724626517907,788.4038776678697,1.0590669151979222 -3589,1554.0677549603613,1473.3633151312822,1.0547756544500961 -3590,621.932684601885,574.4617629004803,1.0826354768361293 -3591,811.4863610109776,763.219057554618,1.0632417429551744 -3592,1469.8107825441164,1392.0809994882081,1.0558371122689594 -3593,844.5576642763109,799.100346680967,1.056885618663725 -3594,927.7043812092459,889.1770578155922,1.0433291919252867 -3595,2464.7053389194934,2277.742813113008,1.0820823688829742 -3596,369.49325337085935,341.7861365763409,1.081065654306695 -3597,246.63821830595734,230.48833261949125,1.0700681266722842 -3598,698.1743295351664,649.2294695779648,1.0753891532203836 -3599,294.57510805024833,277.5967592121983,1.0611619130073184 -3600,316.93006341535914,298.9484746456677,1.0601494581666768 -3601,378.84584031093385,358.07155520896663,1.058017133167262 -3602,379.17473642195125,358.3822237998569,1.05801770077108 -3603,838.3432040192776,794.2242098957179,1.0555497976186756 -3604,843.3652098325357,797.1026938491252,1.0580383385232506 -3605,2187.4243655001014,2053.1699237088956,1.065388860532637 -3606,848.8041570459382,802.2963578629445,1.0579683538722215 -3607,841.7198226413695,795.5620217057283,1.058019110611485 -3608,305.7877947493682,301.4304951018522,1.0144554042086673 -3609,92.545762607005,91.11003216180843,1.0157582036920672 -3610,1421.2606002190582,1370.256997534501,1.0372219246289769 -3611,88.98881315630499,87.68626006758912,1.01485470001471 -3612,189.56041154224255,188.76248042240508,1.004227170134933 -3613,99.53104391146304,96.10074642820607,1.035694805823591 -3614,707.2571988717929,674.1944081094582,1.0490404405089144 -3615,100.76381623972712,98.87595501294365,1.0190932287484489 -3616,103.57606623366362,103.57606623366362,1.0 -3617,409.7812878530549,395.43143945329166,1.0362890932992146 -3618,21.318865472134977,21.18391831614373,1.0063702641776338 -3619,21.624455482758766,21.487573960096505,1.0063702641776338 -3620,21.315696350815674,21.18076925517471,1.0063702641776338 -3621,115.04710520815425,112.82819729418749,1.0196662533584684 -3622,21.574242019480188,21.43767834506697,1.006370264177634 -3623,21.269097262563182,21.134465136391377,1.0063702641776338 -3624,21.096954772370093,20.963412297967384,1.0063702641776338 -3625,3230.039098775614,3126.604902239179,1.0330819530354982 -3626,2587.5200961041587,2458.976142534519,1.052275396798745 -3627,444.53264067403444,443.3609377085841,1.002642774466118 -3628,413.8963659919811,413.6303112890658,1.0006432185834886 -3629,157.86895974090035,157.85950480754497,1.0000598946092407 -3630,2130.5980732282446,2046.0879858018614,1.041303251870307 -3631,155.46668812330356,155.06907888622356,1.0025640781510783 -3632,143.57165721334405,141.29532245527966,1.0161104749860694 +1,581.4814321959664,525.3426109414437,1.1068613512121523 +2,1205.0578737456863,1081.4902511220064,1.1142568067492824 +3,1733.3993448053388,1569.1786794526006,1.1046538979296008 +4,2305.5733209051646,2102.740900466383,1.0964609669188408 +5,3446.3637995904246,3152.44442021895,1.0932353882232952 +6,5647.083385598999,5194.660896190982,1.087093748456181 +7,8298.067776017118,7597.446316431478,1.0922180204248844 +8,393.44787948374426,357.6135461413648,1.1002040714873091 +9,1018.3669940341003,914.9844909775601,1.1129882572611558 +10,1734.0023732874333,1569.5779702103255,1.1047570787802754 +11,2326.4707879993175,2121.6886990683092,1.0965184426070298 +12,2439.1543992590764,2226.2684941243197,1.0956245420067776 +13,534.7773999402599,490.2049633776051,1.0909261225254479 +14,1825.4416977149417,1650.3587197798588,1.1060878315948408 +15,1903.754333527428,1719.0885026653855,1.1074207817548223 +16,3777.7805784322204,3393.0178850783454,1.1133983687636797 +17,4293.3128839103,3865.888600803522,1.1105630107960014 +18,2807.495083215058,2544.8523514257045,1.1032054891680505 +19,5578.733645379582,5060.894025910268,1.1023217670273533 +20,1995.7439418939941,1804.0611536930057,1.1062507153976482 +21,2377.786658076691,2145.205937390829,1.108418831326164 +22,6190.219597988151,5547.266461349129,1.1159044983901227 +23,6192.393473569563,5549.312307931532,1.1158848394095402 +24,2848.7927228969274,2576.5832552078723,1.105647456622586 +25,6273.414949967922,5679.30646556161,1.1046093370746746 +26,2685.356943537536,2427.5338578359792,1.106207822753662 +27,3133.1297669953374,2826.089337963004,1.108644983337166 +28,6298.776606784356,5644.548091589736,1.1159044983901205 +29,6317.602529935916,5661.418642052377,1.1159044983901172 +30,1036.9756188415374,934.8052715617229,1.1092958612750703 +31,5929.550501342218,5346.416198273302,1.109070128744793 +32,1413.6076755553152,1289.281167279612,1.0964308728235228 +33,1411.5099250588398,1286.8710025032856,1.0968542474833145 +34,5736.2439905701085,5142.278642802451,1.1155062549165864 +35,6112.915983984235,5477.992061868315,1.1159044983901225 +36,835.1077845068967,751.8221613552448,1.1107783561494384 +37,640.3527879640073,599.0851516192528,1.0688844252494212 +38,617.4152202718674,577.625799092165,1.0688844252494227 +39,648.1508400819165,590.8754002013873,1.0969331941404366 +40,612.5360792183907,551.1529005422625,1.1113723226635206 +41,434.2287631266125,395.3871566851076,1.0982368946102086 +42,2233.815955241247,2038.2747272987922,1.0959346771676821 +43,583.4816428927521,545.879076455435,1.0688844252494205 +44,555.5565868016347,519.7536550053077,1.068884425249422 +45,422.68617189460394,390.36803332761446,1.0827888961386 +46,281.7336844671054,254.680285579461,1.1062249432699165 +47,300.3383125843052,275.3094564245239,1.0909117197964573 +48,1141.543112432139,1030.3814436856715,1.107883997162102 +49,2946.744493225811,2758.075205275649,1.0684061433819045 +50,2274.751354403984,2087.8562873500314,1.0895152928802228 +51,1588.2470874943224,1426.8868278470206,1.113085534534489 +52,883.9242697961704,835.039720202103,1.058541586000527 +53,1381.402730193132,1254.416087589909,1.1012316757250782 +54,2205.728818233965,2042.6973327259516,1.0798118658579976 +55,2105.090673655456,1967.3677025932586,1.0700036759171454 +56,3024.2454597111914,2697.2709541492904,1.12122419701992 +57,7216.704330821451,6607.269280111671,1.092237053595533 +58,1203.4825892383933,1120.678826879723,1.0738871480147607 +59,1523.487485106905,1431.340451819072,1.064378138108739 +60,4322.474950924633,3981.5387522168285,1.0856292554023188 +61,4313.5930469257355,3973.160833789625,1.0856829681398537 +62,3122.522076987296,2957.73634858432,1.0557134608978411 +63,3293.3265009775155,3107.069985577077,1.0599460315554639 +64,712.8333554353464,674.6282049983685,1.0566314158730887 +65,1777.8086073927307,1658.6515131612643,1.0718397404674607 +66,877.0929265936486,811.0101546234158,1.0814820524669233 +67,1342.7293255136549,1253.3279749184233,1.0713311698009857 +68,2364.5907250125524,2212.2205588718725,1.0688765708869379 +69,1269.5968850176878,1184.7617233213732,1.0716052519476125 +70,822.5634389753253,756.093544581959,1.0879122628009175 +71,1454.9831253351915,1335.3155563374871,1.0896174454268543 +72,1169.3030243988878,1104.9320710228542,1.0582578378021414 +73,1063.1215106105353,895.8479518822407,1.1867209255508604 +74,863.2851874632447,812.0618704070366,1.0630780965378082 +75,933.908653439933,862.0475993461682,1.0833608888282604 +76,823.9763193338605,757.4455642042233,1.087835691795931 +77,1198.1340850628962,1101.0557948098067,1.0881683659544779 +78,839.9801726008759,811.1966586914551,1.0354827816424337 +79,1262.985791806962,1178.2495113669254,1.0719170936398108 +80,1151.125717654061,1111.7469786644522,1.0354205945645247 +81,1630.84753282974,1531.6951549071457,1.0647337543668114 +82,1232.8437346748342,1117.302541625501,1.1034108388236894 +83,714.8972973937698,639.0825455566912,1.1186306094012284 +84,769.2842148266324,726.5724330370136,1.0587853045994147 +85,904.9392544581638,816.3181333372706,1.1085619901135755 +86,1493.6019548107615,1374.5205564958449,1.0866348616993395 +87,1773.426301874137,1669.6690029377464,1.0621424358683258 +88,463.81366083667757,438.2114033186351,1.0584244438281456 +89,1131.7019295966268,1045.8753564676683,1.0820619518360473 +90,1360.409730474772,1284.1434889427685,1.0593907473648394 +91,1526.1809467393518,1435.2228609018177,1.0633755832041172 +92,1771.1158737218418,1683.9901737511377,1.0517376534190988 +93,1050.5037384639213,984.7616383008851,1.0667594041096768 +94,1080.059977027821,1015.8176171839906,1.0632420217537875 +95,1716.566935299429,1601.0626191732001,1.0721422852192228 +96,1310.0428371943922,1226.1966279979172,1.0683790896843157 +97,2424.3406585620846,2267.8107333782086,1.0690224818500191 +98,1081.036654399707,986.971312802162,1.09530706756864 +99,5337.070041060727,5008.44062864558,1.06561511591763 +100,7320.444047102662,6763.254385656826,1.0823848445842132 +101,8795.31780067365,8161.620029595609,1.0776436257483357 +102,902.9273097602611,834.7797402670343,1.081635389799263 +103,874.8725062256113,808.929243183643,1.0815191978750085 +104,792.2713869011283,732.751513111601,1.0812279097681812 +105,1015.1272488878267,959.4738388740232,1.0580040932425159 +106,816.0173584132425,769.5906049459587,1.0603265595615528 +107,912.9635671110552,862.2261510180688,1.0588446732137253 +108,857.1732028042591,809.8416063273042,1.0584454986100398 +109,629.7668725591133,594.4310777190525,1.0594447298678444 +110,641.6185058608341,589.5909786493108,1.0882434248412565 +111,860.1328878543211,788.6502844475115,1.0906391651869962 +112,1288.2178663853572,1208.5978994338104,1.065877962380082 +113,1452.945349171461,1355.3887794895425,1.0719768166582135 +114,805.6459388309152,759.8856997618128,1.0602198976549315 +115,913.378717712633,862.613716462491,1.0588502133473199 +116,327.053519271234,311.64597031888667,1.0494392689774932 +117,347.9220926573663,329.06484960435677,1.0573055526157902 +118,472.4298940512998,421.5274302419951,1.1207571800963987 +119,537.4599893761834,497.3978300532998,1.0805434943666536 +120,895.1009081085588,835.5445391039715,1.0712785090648247 +121,685.6473508228004,646.1267647596095,1.0611653753081942 +122,2719.8696268794242,2583.4421143143663,1.0528084263274717 +123,2248.2853341605287,2137.963522788129,1.0516013534358755 +124,2922.4914297394607,2778.2685739329095,1.0519110561015308 +125,6024.418686285043,5731.049592412553,1.0511894181234946 +126,4341.258109674228,4134.47916861138,1.050013298563141 +127,4455.9799304943435,4253.207949541225,1.0476750686443606 +128,4559.432743497806,4352.467630349971,1.0475512124902795 +129,1847.8736114559015,1742.3812086386938,1.060544961282972 +130,2315.153283716055,2192.417946104273,1.0559817245748564 +131,324.4040531165652,299.31328754238507,1.0838277704949102 +132,3404.1114813200033,3267.0150965235243,1.0419638051083282 +133,2079.7564650512854,1978.3419308504303,1.051262389286396 +134,288.77252075264454,266.8230872608489,1.0822621225064293 +135,2184.622968602783,2092.4927965062416,1.0440289076504197 +136,199.22237352826198,183.46818156465764,1.0858687965904992 +137,1251.2837852256416,1184.5290983810323,1.0563554639019395 +138,479.0306860768821,464.3279326631711,1.031664589570097 +139,1415.959165209374,1334.0295318572175,1.0614151571577994 +140,279.60094974874266,267.4436243362621,1.0454575256473302 +141,246.1038769585684,231.12753590267377,1.0647968706861526 +142,370.7219082737158,350.40775448395226,1.0579729002278513 +143,478.4336778189567,449.0470008513882,1.065442318759176 +144,518.9227714781915,497.9699198324152,1.0420765407935237 +145,394.9143318938435,367.8894573739814,1.0734592252595858 +146,361.71090152184985,330.37292845094925,1.0948563588967108 +147,693.3990773141198,640.5086861965826,1.0825756032000233 +148,718.1725477928251,667.1469673167696,1.0764832682688759 +149,513.7026173297638,485.6287400161407,1.0578093407583127 +150,943.0085227031931,871.1949632518508,1.0824311003627576 +151,800.0864232635814,743.2867946918632,1.0764168406829628 +152,868.6630361202511,804.6796512387629,1.0795141082329958 +153,237.37028331560046,233.3729209802939,1.0171286467963612 +154,643.3514390028237,592.5072815694153,1.085811869347384 +155,625.7285189011814,577.9169578737551,1.0827308497804464 +156,94.07438064156322,90.51958643635962,1.0392709947664511 +157,226.25700293978528,214.6018160523261,1.0543107560870655 +158,259.12397518646975,236.36670081408568,1.0962795279284445 +159,425.4855959295943,401.5852656646262,1.0595149581133483 +160,360.7248717195995,338.40966667172296,1.0659413936586024 +161,326.32064595023763,291.3541137738463,1.1200138612202089 +162,331.62089217480275,296.63308891619687,1.1179497654372956 +163,523.7748280164371,452.05192441720357,1.1586607637865949 +164,343.3316058378806,267.3310506726903,1.2842937809653934 +165,501.44445146513397,471.0355177104376,1.064557623812542 +166,694.598288967065,622.0909959051105,1.1165541593420107 +167,481.3701760124787,463.97172956661683,1.037498936545365 +168,358.556109827813,339.0594290422965,1.0575022521585276 +169,509.4740511048828,463.27240611762267,1.0997288946571313 +170,379.0688976982093,347.6033438790513,1.0905214359218203 +171,1536.9316048396595,1441.6353496068261,1.0661028846572216 +172,90.29319560308289,75.58888256906911,1.1945301019707197 +173,266.38334750018896,234.10834415281653,1.1378635326483904 +174,423.5565352832689,411.3912127706359,1.0295711773489327 +175,918.7935496249058,849.7368961426954,1.0812682770345585 +176,437.0411805421561,394.91769732982766,1.1066639542799412 +177,440.29888387750896,417.71226835635747,1.054072186124738 +178,575.0951908598507,520.2862748604226,1.1053437667832613 +179,366.7990242476041,346.7790775043188,1.0577311263625353 +180,357.7668112468468,323.6456609284468,1.1054274919691993 +181,355.42794747509527,310.83393586638545,1.1434657109894169 +182,367.0884348047264,338.30529884062184,1.0850803580752204 +183,559.0798353709861,534.03491690352,1.0468975298706746 +184,549.5948960701321,512.5313058929344,1.0723147830211568 +185,354.4190019951909,338.88114969427886,1.045850447317384 +186,558.5399902199447,518.3178916027398,1.077601215911784 +187,388.44302963578787,365.72067953344396,1.0621303398301982 +188,537.1753830778475,512.2908095879718,1.0485750925531732 +189,245.4582489876234,232.06232497241052,1.057725544276976 +190,379.81736336173003,357.5263624894915,1.0623478523849936 +191,298.95484751355804,279.0545954643027,1.0713131135365983 +192,279.9717872769178,260.1283227254651,1.076283367929893 +193,282.8323841043703,262.6251402083064,1.0769432959846728 +194,463.83893137145526,441.231897912915,1.0512361721024126 +195,556.3366332970653,528.8732496551423,1.051928101222421 +196,575.3719885119156,545.2833615563867,1.055179800222856 +197,566.3746488981868,539.0564721248652,1.0506777641786549 +198,463.9184564240239,448.03059251239955,1.03546156038705 +199,708.487919083055,646.7253676449919,1.0955004311381311 +200,548.6901556974088,520.775780356107,1.053601523715665 +201,658.3380053964077,556.3551116004262,1.1833053955460473 +202,781.1743138259397,749.8124975117929,1.0418262117772366 +203,1036.708741639872,955.8331368791801,1.0846126814819925 +204,179.47484326919917,173.2010578537424,1.036222558298429 +205,439.7992999036912,423.1950365540088,1.0392354869870108 +206,679.6014426472703,666.3750526918201,1.0198482669812177 +207,94.86094617398018,89.78930969577799,1.0564837450625892 +208,424.34298434869896,402.5006953952177,1.0542664626505407 +209,378.08380448944143,355.21827817448275,1.064370354004495 +210,523.5518333886769,500.6776336375784,1.0456864821080787 +211,381.3798988840642,355.1409805665788,1.0738831048887256 +212,843.6780063199068,780.9536202318434,1.0803176839995214 +213,1013.0193024900319,966.3534055510014,1.0482907150437601 +214,771.11103718515,716.9378702997626,1.0755618710206183 +215,931.2781703838491,895.81236581466,1.0395906619763349 +216,926.9468811067434,890.8649672866452,1.0405021132776102 +217,820.6366121192424,788.8443104590201,1.0403023780975522 +218,686.5084448673352,615.1104591410887,1.116073437973959 +219,1916.9807128748523,1777.2364634304497,1.0786300823328068 +220,612.8327013714588,577.2618557655483,1.0616199481234345 +221,455.3973082849794,420.3730756913347,1.0833170215196222 +222,624.0505510924145,583.4829572530595,1.0695266131342387 +223,814.0351947743345,763.4028497889783,1.0663245428011594 +224,1088.7962580600474,1017.7205905614442,1.0698380952078341 +225,1153.6134916077904,1084.8034479020898,1.0634308858796244 +226,363.58509439767283,329.3517226801809,1.1039416810663973 +227,367.2207767507774,333.1331599623087,1.10232429816451 +228,460.2096788050414,426.6297984895319,1.0787096457734502 +229,459.34104133968674,425.80851425666515,1.0787502503127713 +230,303.5241557880576,275.3498702461484,1.102321767999102 +231,865.4133568823771,781.6981913470312,1.107093973687066 +232,744.1038383595837,716.5667605960384,1.0384291866128985 +233,548.9742432172819,501.01810409037216,1.0957173777462133 +234,775.1567113315065,723.7475827627154,1.0710318483863535 +235,421.96901861581574,359.6668881431616,1.1732217574831505 +236,390.5889518267507,347.920955871517,1.1226370393480711 +237,290.99200656160866,267.96225081211725,1.085944030100116 +238,623.6848074118708,605.3528364331523,1.0302831173415057 +239,505.1138355083008,485.68768625933956,1.0399972035498308 +240,363.4730323480116,340.8476703434472,1.0663796879754714 +241,221.33802872258883,206.14857308249938,1.0736820799337317 +242,366.45835240724784,335.5344112050359,1.092163248148385 +243,377.520597423101,352.8169129940285,1.0700184246254958 +244,321.907776291689,294.7392691542255,1.0921781044494865 +245,332.3113888091836,310.66527405018235,1.0696766473986556 +246,201.10337530224513,186.5245433627443,1.0781603947484197 +247,865.1503375615185,794.2612954872664,1.089251537846576 +248,535.0923348933715,515.911520723786,1.0371784955348085 +249,331.4078308511703,312.66750708280057,1.05993690851735 +250,561.6066326232836,521.8211165715958,1.0762435915071467 +251,411.74682108231616,404.15731334597365,1.0187785980501252 +252,368.027162865535,294.0820328128476,1.2514438891264932 +253,451.4226512556684,433.862921178778,1.0404729909372799 +254,539.1063843646749,466.8775662227372,1.1547061229056332 +255,599.9677852758888,538.4138588435833,1.1143245579980283 +256,1029.4837683871276,943.3802535971259,1.0912712710083632 +257,864.4002619770652,803.8273868778897,1.075355575199352 +258,344.6168616317853,310.32212957457324,1.110513330468012 +259,913.3141700903676,850.0695879748764,1.0743992997869256 +260,916.5842613851416,853.1846128608527,1.0743094138930855 +261,751.5217510082699,717.0861997909874,1.0480214948039994 +262,1302.8644915332172,1241.4090134161863,1.0495046172960465 +263,1496.5107441419707,1442.082137944599,1.037743069389202 +264,521.4167965150589,453.59313811186126,1.1495253184065397 +265,1478.6247428821625,1437.2327873286547,1.028799757365988 +266,672.3088598979775,630.4402654025104,1.0664116757655633 +267,641.5210889189003,608.7188351622386,1.0538873645135673 +268,468.0418774307284,466.38398093727267,1.0035547886746108 +269,529.9576525740812,508.773243657198,1.0416382134496776 +270,1554.8819874593835,1456.5879338076393,1.0674824027923913 +271,1846.7160220014814,1645.564166804525,1.1222388401830403 +272,793.2804767181954,746.4874558024055,1.0626842695775667 +273,488.75231233330754,443.0288225332287,1.1032065804175741 +274,299.21545579683004,278.2234759736928,1.0754500667122788 +275,541.0070317026896,507.16496997674057,1.0667279164164296 +276,734.3193994892224,706.9718112764912,1.0386827137610382 +277,740.0591712056196,710.7111883738972,1.0412938241465852 +278,729.62802379189,673.6742340314574,1.0830576366645184 +279,446.78403134862634,424.89617172507616,1.051513430998179 +280,620.4056235562841,539.1183618140999,1.150778136119604 +281,430.3791543544267,393.0618851417007,1.0949399334389112 +282,806.5859507180755,754.4785801588828,1.0690640820422226 +283,929.3456271254737,831.8206379270522,1.1172428102306522 +284,641.953653269009,599.091197797337,1.0715457940782025 +285,381.6770563836496,349.8377332248938,1.091011689520318 +286,437.7133698187122,401.14512413061203,1.0911596414573235 +287,465.6591111369383,433.381574365024,1.0744783319854017 +288,577.4965366342756,540.4986671225113,1.068451361237822 +289,288.9572565862203,274.423623110974,1.0529605771926167 +290,289.53144179209414,274.85807781277254,1.0533852382876547 +291,816.5646230110399,684.9715854437113,1.1921145933113197 +292,439.79531990030506,402.0128873431568,1.0939831377218943 +293,458.24578892273985,402.72378018674215,1.1378662285853898 +294,401.63898454136483,360.92568232264443,1.1128024527285518 +295,1000.2359341324386,943.8864347319155,1.0596994482885302 +296,586.5364198730537,543.0181226405573,1.0801415190728407 +297,698.5730658959748,647.9752060962677,1.0780861047207875 +298,669.7090565067144,622.6739098682432,1.075537365373834 +299,593.5659404893115,551.1158343930937,1.0770257420438032 +300,485.9325140837668,430.2130561928477,1.1295159621235258 +301,233.41904921907067,204.36503132589135,1.142167266604668 +302,315.31499234122487,276.1426188279883,1.141855587809998 +303,285.8636852028997,248.27824556373847,1.1513843452285564 +304,785.180118126691,754.1120158409163,1.0411982591884978 +305,564.3236593706544,536.9353229121008,1.05100863230605 +306,685.798895750358,649.1808034099957,1.0564066160736978 +307,711.1635780466881,633.4850198857183,1.1226209866414572 +308,663.4975084072835,604.4117045339995,1.0977575441210874 +309,746.2274141227695,722.1351275561882,1.0333625739106655 +310,375.60599437373304,349.0816909973853,1.075983083789251 +311,739.9820323781148,679.4118310086461,1.089150937038507 +312,794.4406869550767,746.912808558319,1.0636324318610832 +313,519.645909807253,416.1358536480741,1.2487410187124066 +314,366.7176415195325,352.09946876488965,1.0415171678785007 +315,502.03026376071875,479.8984132065517,1.0461177823162364 +316,866.210249696327,778.7441057969942,1.1123169257375205 +317,723.706386060446,661.1780283792697,1.0945711366641306 +318,254.32413108730407,226.7958931108518,1.1213789085810173 +319,656.9303977431572,616.503013814365,1.0655753224605733 +320,853.1804443951899,739.6739276541458,1.1534548028494482 +321,958.5722090461142,885.5282864347992,1.0824862669326973 +322,493.5888250699082,457.07295363154424,1.0798906851701406 +323,887.6060054477853,852.760441588112,1.0408620782112965 +324,892.6916733467955,840.8916804231945,1.0616012669997301 +325,1162.7123112033241,1104.7586917339693,1.0524581701895406 +326,1293.0361034624411,1213.5452105905472,1.0655030337379943 +327,739.8456219809391,677.7526467377236,1.0916159834153245 +328,607.0526032042573,542.0002719691932,1.120022691130239 +329,1307.5190391222702,1236.908380097085,1.0570864100861237 +330,932.9236153276106,899.2851115241488,1.0374058275538998 +331,724.1802076684087,666.6354274845274,1.0863212151820671 +332,1296.3622369083914,1239.3687732879916,1.045985879948547 +333,588.7458275853583,571.3521141884178,1.0304430717328272 +334,753.7823005405658,680.1905657106903,1.1081928191006059 +335,534.4031090962077,484.41607689142546,1.1031902832902594 +336,1297.6258278253963,1203.0313489515636,1.0786301029946321 +337,1550.647829918182,1448.2526746958945,1.0707025486721704 +338,1053.7921053701477,996.458323146391,1.0575375616741511 +339,689.7587499020274,651.2384813834923,1.059149251187833 +340,586.2995541941191,561.7353905678972,1.0437290653903581 +341,749.2711029953405,727.2943962769257,1.03021707142378 +342,846.0717309513932,793.5343889194974,1.066206761503345 +343,1361.9042496054417,1261.9090702135086,1.0792411923745142 +344,896.6932185883402,853.6999819097534,1.0503610607820437 +345,572.6877293458657,504.571132095046,1.1349989979965571 +346,980.0266124693915,897.7978148414634,1.0915894383664193 +347,1433.1984189797322,1277.082783676934,1.122243943226073 +348,3169.518197961122,3005.3699132260754,1.0546183296813683 +349,675.4781985004199,629.385752826949,1.0732340150161361 +350,1373.593017546874,1292.291232066174,1.0629128972350228 +351,1300.3630272005437,1216.790523778658,1.068682736912149 +352,1023.6979455123318,930.1637077808252,1.1005567481821663 +353,295.48693304030047,277.9156974261274,1.0632250562919128 +354,1729.127932321823,1631.5521642310762,1.059805484758578 +355,1053.5196870850555,974.3683489032636,1.0812334865668447 +356,206.02890230899618,196.08421813600984,1.0507163925150182 +357,91.51382155745591,91.41346121630214,1.001097872674532 +358,551.1757034751289,507.1089900712569,1.0868979139921773 +359,539.5120033650522,507.9411545471064,1.0621545400196903 +360,504.3350514472461,443.4189882745844,1.1373781114103751 +361,736.645364510372,651.7257259911261,1.1302996569455694 +362,589.2683890269819,534.3747457149638,1.1027249954310125 +363,584.7658737213608,532.6928514480069,1.0977543102592893 +364,198.94516597553763,168.74750259807308,1.1789517646930163 +365,599.532288422089,533.1962364680137,1.12441207836255 +366,483.0163998113642,401.289077701671,1.203661965029737 +367,195.2752753580507,168.65087702252322,1.157866942678109 +368,1058.8757054935618,949.0731918663132,1.1156944633651769 +369,688.847594404672,651.2404447787793,1.0577469503428454 +370,800.5319168129535,781.8740655935185,1.0238629877118022 +371,589.1651307906311,539.838742974739,1.0913724486391674 +372,179.68488937793438,162.87723477832736,1.1031921656975692 +373,217.9817551615065,199.97663899741138,1.090036097488008 +374,454.5915613000705,430.4518430074748,1.0560799510670849 +375,299.5174316158907,291.51737693040275,1.0274428055360758 +376,248.9600332929434,235.49206414676033,1.0571907558540474 +377,331.3998739754187,282.1276834977883,1.1746450042291459 +378,689.7736045713663,577.9164386320413,1.1935524903982604 +379,591.6348111708057,539.0145857512995,1.0976230083758534 +380,408.58603627866296,376.5016611466864,1.0852170878456666 +381,246.09127468868675,211.3741468452072,1.1642449105609092 +382,337.479609008466,311.0029632060885,1.0851330981847673 +383,272.2066334090452,264.7766731316434,1.0280612343584652 +384,499.8509263511553,473.3943793407177,1.055886905643626 +385,375.39475673270425,355.3101833997056,1.0565268722129604 +386,651.954379612702,591.7740286502863,1.101694816008865 +387,629.0305676019027,611.8252929008437,1.0281212216962847 +388,961.1947994155202,889.4766419753339,1.0806296130283037 +389,414.3575581012328,400.6853298059604,1.0341221084931995 +390,546.1535982226443,520.0713573564276,1.0501512734690779 +391,284.87865836889966,259.89905038341806,1.0961127328038722 +392,639.6865810856071,613.591480419493,1.0425284598936637 +393,643.9517892620469,617.3305762954072,1.0431231077624459 +394,421.954295171257,382.8077130589247,1.1022617381439923 +395,272.7774846668158,261.9542888118897,1.041317116448123 +396,651.3459211766318,610.2487217513981,1.0673449987855539 +397,601.1319332184277,546.795687406641,1.0993721184406084 +398,225.7200170489887,211.12399841682497,1.0691348152820912 +399,110.26698236205884,99.16219566011321,1.1119860913528803 +400,679.8264273014985,609.0648573966125,1.1161806809989814 +401,860.959794253114,802.2549366219912,1.0731748163224872 +402,177.98100803473963,145.9172068611543,1.2197396856978988 +403,541.8587629094667,505.9244062459067,1.0710271262266282 +404,543.3171154178755,521.8574746974468,1.0411216505672745 +405,548.518134860175,533.1997801658296,1.0287291091710151 +406,496.3606610846389,450.68971888584446,1.1013356646157764 +407,988.7035362854049,921.9725819432912,1.0723784585887155 +408,588.5468009794973,539.3306480926178,1.0912541370695992 +409,321.35189728352185,304.8976495208313,1.0539664631345949 +410,674.5394906434294,641.1012184237513,1.0521575552482825 +411,514.1441636885036,480.95911119647104,1.0689976584693006 +412,324.7512679720171,310.13153883354204,1.0471404140109786 +413,532.4232316196279,513.0482662266378,1.0377644106186907 +414,248.05782176266086,244.6698170747993,1.013847252302583 +415,438.25329983890566,406.73448280433786,1.0774923650860704 +416,572.2055926819311,518.3079688230299,1.10398764267756 +417,2729.2721963132735,2584.1637314786,1.0561529685859516 +418,280.3943348438249,263.7329544124354,1.0631751935153837 +419,1078.1886664962374,959.1611969212769,1.1240953762068522 +420,490.51972014641683,478.36852463976345,1.0254013273883433 +421,629.345614224198,585.945453760258,1.0740686017536665 +422,552.2916228879483,496.3684419654398,1.1126646583353947 +423,626.5658819442376,598.9398387690696,1.0461249050187487 +424,540.7804948679129,533.3489134285943,1.013933808154863 +425,465.158629436036,424.9153254774995,1.0947089962295735 +426,576.1954251755241,541.6622753421774,1.0637540242423777 +427,470.3469714428288,447.00998051229345,1.0522068677388146 +428,1779.642221322064,1671.0982423563585,1.0649536790922904 +429,1120.9796761431646,991.848384561656,1.130192571356133 +430,714.7914640064361,660.9282373646007,1.0814963313666408 +431,2087.4897427806377,1959.2671949992252,1.0654441354954973 +432,1445.3279838297015,1349.3823535162085,1.071103368191735 +433,306.1524793908451,286.03066644217597,1.0703484461961947 +434,306.29157409992956,286.0973354825301,1.0705852034005838 +435,506.4761154400971,475.6082805040017,1.0649018030203024 +436,717.8726706619995,686.2450535260277,1.0460879345846856 +437,1905.734410299244,1787.8606390170473,1.0659300667567708 +438,1173.502978996329,1105.6812635894537,1.0613393006106486 +439,442.67324211199264,420.9482939881541,1.051609540730078 +440,389.32614875840585,358.05130463205285,1.0873473821258444 +441,450.4862423622394,435.72433010579124,1.0338790176184656 +442,298.0267132639301,291.66733991429453,1.0218035154416132 +443,1059.8676977629293,994.8680527055375,1.0653349405286718 +444,589.2349667197734,571.343463469912,1.0313147946791967 +445,851.6996060899377,793.0139445903728,1.0740033159566678 +446,701.4040798914979,678.1800249534683,1.0342446755780266 +447,934.6091637854745,877.674144327278,1.064870339209817 +448,625.3187167729142,571.4662429272938,1.0942356167352336 +449,672.6032847029999,633.8895584207169,1.0610732986022597 +450,809.324580090076,730.545280460371,1.1078362994557438 +451,271.17455742906515,242.41657583907048,1.1186304257060615 +452,767.7293471262476,698.0331345683572,1.099846567600245 +453,2643.815426220109,2542.967975686453,1.0396573812560237 +454,203.25253320436838,179.79695752958276,1.130455909805517 +455,1317.6196320659562,1234.315321398643,1.0674902994584223 +456,270.5968628435161,261.24345581479855,1.0358034118004793 +457,143.80203658548078,126.2666750202037,1.1388756103894497 +458,184.40958214082283,162.0304544905149,1.1381167986023146 +459,3079.8530502577537,2895.575363436691,1.063641129548204 +460,284.6853777875873,273.4991365655649,1.040900462657734 +461,953.242332611096,898.5783222016686,1.0608338851036283 +462,949.1763209518565,894.7602863725598,1.0608163274656548 +463,290.2520268712928,278.6562048918624,1.0416133636210627 +464,327.7559085529118,293.1990595402777,1.1178613910522688 +465,956.4342640115079,868.7068792995661,1.1009861747413303 +466,869.1192576171763,761.6828094569632,1.141051428266852 +467,434.98783405519424,400.0660972850041,1.0872899178590285 +468,1058.2954198250277,993.8257388689153,1.0648702065509856 +469,357.5505460161984,336.4767354864333,1.0626308101191584 +470,355.7146919858309,334.766545885136,1.0625753868126433 +471,570.5565250393025,531.4630731486151,1.0735581715190128 +472,492.98898210061225,465.21414758606056,1.0597033315918527 +473,216.02043197074414,208.97734281964932,1.0337026447750994 +474,390.5250224845427,363.4059631881139,1.074624695364151 +475,802.8965934147674,739.2759302551399,1.0860580746050674 +476,367.53109352998,331.4194466581833,1.1089605550788373 +477,550.0431262593434,514.6760879007282,1.0687170808787152 +478,607.9682930433573,522.3356477065535,1.1639417981767004 +479,1045.3837753269324,1003.7209480292992,1.0415083767848363 +480,623.8484363952361,550.5581101325063,1.1331200556560517 +481,416.6795474438982,351.74318114770404,1.1846130068088685 +482,265.81202093751335,242.9078047186569,1.094291808554216 +483,847.4894664622412,782.7995150172226,1.0826392329121401 +484,272.27183212612704,251.61531099508576,1.0820956445351002 +485,846.5873630475255,782.253559279836,1.0822416248599966 +486,246.78797674691347,234.10100962540977,1.0541944143761037 +487,409.7130476424878,388.9758834225148,1.0533122106119053 +488,259.086872880366,245.5105328755787,1.0552984014403473 +489,665.3196813490714,614.6855852247646,1.082373976780002 +490,391.83022923809494,372.05443709697784,1.0531529533565607 +491,637.7533188602271,589.1075625470867,1.0825753383691321 +492,761.7895935375916,755.3692251075578,1.0084996425809107 +493,1977.415504111046,1871.949985099451,1.0563399235295232 +494,3955.070632067969,3849.3016009249027,1.0274774600976064 +495,384.19022382701013,368.0627390622978,1.0438172166131237 +496,381.84899706415763,365.72102335542917,1.0440991156613229 +497,242.01961765291725,224.21065100738758,1.0794296192688138 +498,410.99261242809683,381.2194738887641,1.0780997314634042 +499,620.9314956224008,600.1525042112789,1.0346228521339416 +500,260.2444669274577,245.0265863713698,1.0621070585908716 +501,1343.6879751526571,1279.7116155235433,1.0499927943554224 +502,1329.5094748353847,1250.92004523509,1.0628253019844487 +503,1637.8779457362398,1534.0160715104469,1.067705857946799 +504,437.28123596079064,400.79365110436447,1.0910383304622882 +505,174.93850996388352,163.43741458933292,1.0703700275940442 +506,310.9385757992902,303.96618597905496,1.0229380442359983 +507,324.7294583411948,324.5087404414903,1.0006801601072568 +508,253.53575261629717,242.0722161187541,1.0473558538908048 +509,869.5017405716437,796.6206891940435,1.0914877712394533 +510,254.1335231620356,242.81441043088554,1.0466163137149223 +511,671.7088908730659,624.8477863784332,1.0749960318595924 +512,466.77423744619443,439.50781620418286,1.0620385354633701 +513,674.2115247795866,627.1625953865359,1.0750187108401343 +514,466.3736112083081,439.18949527441146,1.061896097758239 +515,1174.2434225758357,1097.939565509258,1.069497319764759 +516,1321.350502823959,1195.1358741310637,1.105606928404405 +517,625.2225601046255,581.9709123152364,1.0743192604202887 +518,280.05298283796753,252.54552195728567,1.1089208023468116 +519,207.12891532017454,197.09732510069892,1.050896632992611 +520,279.92381672954593,252.64949521588198,1.1079532001057781 +521,207.25285737962702,197.18985751231568,1.0510320357966831 +522,545.5921220748646,494.16382995656426,1.1040713403140427 +523,475.03738164594364,433.43137754427266,1.095992136834674 +524,481.0782781994994,438.3547872111266,1.0974632700151068 +525,733.2823991212052,675.6840304773162,1.0852445315352508 +526,471.80039189372656,429.21707071686524,1.099211620604325 +527,4165.193104707423,3735.538618930361,1.1150180816227486 +528,521.7233097256867,464.47653594010063,1.1232500876921987 +529,453.69323559455216,432.70396780763264,1.0485072228324255 +530,1042.5368912966994,934.9258315540095,1.115101172853275 +531,413.4793234645548,363.39685200599337,1.1378175710166456 +532,363.59694447171523,340.87568734015133,1.0666555520836865 +533,292.29823733407574,285.4821248040427,1.0238757944467158 +534,259.5874036847489,252.33027252524892,1.0287604459301403 +535,178.65859191043265,151.12966962515583,1.1821543205484157 +536,148.14398037777195,133.85361821201852,1.106761119771287 +537,198.4873445646488,173.04071218410624,1.147055753870619 +538,449.13775897806033,433.6511245497718,1.0357121970901544 +539,923.1678968056643,798.1642214332,1.1566139799501476 +540,134.43109396670525,128.49617828888614,1.0461874878836954 +541,344.0095333954205,292.8780595725783,1.1745828072524882 +542,410.7967937423567,403.601421995782,1.0178279147555875 +543,248.21436042480855,238.60536648725508,1.040271491287128 +544,386.9273621098437,373.0229295088266,1.0372750077839066 +545,104.97938172704143,100.9478893361243,1.0399363713043424 +546,195.50632460624954,195.5011662251199,1.0000263854238276 +547,1578.2065684167546,1514.748713163182,1.0418933217781428 +548,435.8204313157761,402.99631272027256,1.0814501710299453 +549,114.62232441698775,105.5369800312582,1.086086833099058 +550,118.31650515473675,109.11043291527056,1.0843738952682476 +551,824.2424095589498,783.3513184555127,1.0522001943956125 +552,1085.4062185303433,989.4087586920891,1.0970250758292803 +553,241.10072391135492,226.60277931253694,1.0639795533082232 +554,629.1375099126936,596.0417984364996,1.055525823126849 +555,230.3944766860219,189.78195135899594,1.2139957200155582 +556,187.4928863867619,176.5617851918493,1.0619109122794326 +557,405.3443108132535,391.0057819180697,1.0366708871281813 +558,243.41181656459736,234.40511764722896,1.0384236445337476 +559,263.2949150708932,253.32201291748297,1.039368478240613 +560,246.39341873753798,206.01562108415825,1.195993864158899 +561,299.37890412026195,275.93866678144514,1.0849472732916494 +562,675.2494408045701,644.549280089276,1.0476304320920844 +563,594.4042521416065,583.7260295749859,1.018293209529127 +564,241.25705697576262,216.9256511058707,1.1121647243922157 +565,68.0599609103607,64.94119762169224,1.0480244190573211 +566,160.58693369954722,157.76338977828536,1.0178973329948726 +567,143.64433624471084,143.6228835823433,1.0001493679964673 +568,853.3990164632435,785.6128811329447,1.0862843990446585 +569,810.0640417737034,743.8048745959852,1.089081383358382 +570,7806.312352607709,7222.701290325217,1.0808023257260047 +571,3023.71815132052,2791.9178629646794,1.0830254684175045 +572,260.5165820457793,240.26406179177283,1.0842927573228096 +573,607.536287905399,564.2425886541766,1.0767288753486084 +574,890.2034762380505,824.2308066378216,1.0800414993821241 +575,929.1504801004271,854.522683866428,1.087332726963237 +576,209.89335597788718,185.53717846037353,1.1312738380502836 +577,169.23655244123728,157.01099844411968,1.0778643159922883 +578,636.4159391698406,603.5240106915098,1.0544997844255504 +579,507.1713707560005,486.04304854222624,1.043470063561538 +580,463.9650003386223,414.45852726292856,1.1194485571394392 +581,149.30239687552157,142.59426365044402,1.0470434998810463 +582,374.1373752410401,364.96433382698086,1.0251340763023926 +583,322.9783435945955,293.9150393663225,1.0988833517704066 +584,317.92822010106636,272.99729143752614,1.1645837891905326 +585,143.57104332399973,130.90809468905312,1.0967315937568642 +586,207.56452557691395,199.83520519056805,1.038678471988832 +587,177.47578277045352,161.3602025782002,1.0998733264755491 +588,182.61581936125856,160.69343928550393,1.1364236161303707 +589,170.98860735451086,160.6321753578385,1.0644729611212789 +590,165.56687982264052,155.46197335225614,1.064999216544666 +591,179.41443636043743,156.23984839396252,1.1483269998319483 +592,1070.7538695912938,949.3480496530206,1.1278833616213213 +593,84.50532375610976,84.23868232608962,1.003165308652241 +594,152.7749593593033,140.68205800120654,1.085959087675509 +595,152.20475274924877,148.10823831151208,1.0276589235307803 +596,329.8614842489202,318.5151488255327,1.0356225927251028 +597,1176.109217395178,1159.1093115553492,1.0146663525780992 +598,895.0099218249118,837.1073638209158,1.0691698108349017 +599,496.3700922554636,474.7587734541184,1.0455206307070675 +600,191.6809897392677,191.55852798108342,1.0006392916017623 +601,148.18184957973202,123.02895295533696,1.2044469697594378 +602,114.97088972743632,105.34207109971953,1.0914052526896105 +603,122.81297364680934,117.661439215679,1.0437826909603523 +604,285.3665129306292,253.59847465250778,1.1252690432056085 +605,852.07687980034,813.3503519401551,1.0476135871433598 +606,343.4837779321524,336.21551129820614,1.0216178801682343 +607,481.3948028653687,429.08649516118874,1.1219062084080043 +608,1192.9179709784516,1118.3058591268648,1.0667188777047465 +609,419.49408793418655,391.3944267809568,1.0717937181281216 +610,397.32762608667986,369.61770071253943,1.074969151425167 +611,376.0155648871773,348.54949200604995,1.078801069894116 +612,414.28575030925685,386.3554465381901,1.0722917303776276 +613,109.03971178210158,107.87495052409122,1.0107973283172003 +614,153.68145406682942,144.88708698424352,1.0606980736905993 +615,430.66992290177717,385.373996305818,1.1175375791572975 +616,109.32359689201823,108.09060138011631,1.011407055712142 +617,269.2083013407881,230.54511353157793,1.1677033497563785 +618,170.7100863525387,164.22077881548398,1.0395157518059637 +619,171.28154100082716,164.7953418598935,1.0393591169976644 +620,385.9635633821089,324.7760761634988,1.1883989976768088 +621,1315.486625013579,1287.3367581197028,1.0218667467671723 +622,559.5214848703991,516.9482523433965,1.082354921085452 +623,205.42984316784197,180.90993880907072,1.135536524528092 +624,166.6404478048215,146.07138632856706,1.14081513151376 +625,210.33235050419592,198.0724420883716,1.0618960835064297 +626,39.95449326161085,34.609618741285274,1.154433210035618 +627,92.51558986906207,84.04689253916808,1.1007615757590008 +628,59.39630915136592,54.21396459522961,1.09559058436011 +629,187.22349964570756,167.56003424236172,1.1173517628607323 +630,327.3129208671196,306.0064673133007,1.0696274616052628 +631,993.3262787343637,911.8579957576856,1.0893431689536088 +632,1068.5593524665273,1026.6724645695972,1.040798686379974 +633,1098.7520412860822,1056.110377175898,1.0403761434711118 +634,883.8220566214032,865.0959098527826,1.0216463244772565 +635,798.8730896826652,771.7382247581911,1.0351607113059305 +636,322.9895836895231,265.6655430088973,1.2157752188386206 +637,268.7061444388782,240.3854977831331,1.117813457620871 +638,299.03718883620155,267.4521089529813,1.1180962079785768 +639,272.33828604058704,243.5958854176247,1.1179921433142679 +640,873.2056794099237,840.3972119253727,1.0390392388491936 +641,239.94520190632014,228.27859528126407,1.0511068793404899 +642,91.55400529842316,86.02943365758283,1.0642172266625562 +643,334.29723970631767,313.97453737524415,1.0647272307524256 +644,192.54955484515204,165.301483344382,1.1648386387677028 +645,455.3021517876138,414.5887423277566,1.0982019174743314 +646,339.0876385720931,301.2477955864414,1.125610356457509 +647,288.0021933053879,263.04869761896566,1.0948626467733673 +648,369.1084340848648,342.9805946294793,1.0761787688997722 +649,345.5688791816119,324.90923916993097,1.063585880366042 +650,1638.273126009631,1552.6972983442708,1.0551143019032843 +651,1223.7987359398912,1095.5910414240068,1.1170214885558438 +652,752.7047055369725,710.4371840177889,1.059495086223028 +653,286.09557408157974,262.22243414405983,1.0910415617772982 +654,166.86117906781055,154.77026258830358,1.0781217029505816 +655,113.26964640189166,103.75564156065325,1.0916962653609226 +656,296.54477151456837,280.8194706138401,1.0559979009516487 +657,316.7237850349228,300.18973356382094,1.0550786706620887 +658,264.52953327305556,245.19036386000843,1.0788741005502518 +659,263.8005621186031,243.8633919560568,1.081755486145862 +660,264.3760860406761,244.5027670498336,1.0812805483988326 +661,267.58008949525475,248.33639993318832,1.0774904104563152 +662,234.088347913325,194.10541788862574,1.2059856466636123 +663,255.93252369562316,217.33677104028953,1.1775850099851664 +664,729.5276142564128,713.5553009803263,1.0223841281175303 +665,241.20715208029915,200.02842052845165,1.2058644038834987 +666,242.33275408978633,200.94165694277166,1.205985646663613 +667,162.47326515139832,162.3546631020732,1.0007305121211736 +668,155.72075463042955,143.82613842157383,1.0827013527540523 +669,181.91763280661584,167.4266487497801,1.0865512399910278 +670,150.50715957410893,138.71905007772207,1.0849783031947102 +671,535.4059952195818,507.46331795169624,1.0550634425768393 +672,514.9087163926531,510.8689113212821,1.0079077136655716 +673,212.97771409325867,203.36654611340285,1.0472603196717338 +674,288.96337053969705,241.86452992121545,1.1947323182685097 +675,278.6033481525209,259.0207559661464,1.0756024053490674 +676,346.8479289002994,306.02896220628844,1.1333826916241203 +677,1237.8294077795485,1215.6247641466261,1.0182660342959615 +678,1469.118843009576,1374.8509670169826,1.0685658869609167 +679,162.83477224532274,160.0612946933273,1.0173275966392084 +680,1429.016884662874,1335.7991217918077,1.069784267222774 +681,732.2760837536252,713.7277129191195,1.0259880210600814 +682,775.8128380797843,740.9671852363301,1.0470272551035311 +683,1293.075129473537,1236.978369409254,1.0453498310492473 +684,400.20241463798936,386.3479285952358,1.0358601276655697 +685,557.2993114892525,547.8906187288745,1.0171725750336928 +686,115.88275181025381,112.2276010008295,1.03256908975001 +687,114.35567246779169,110.7676920979691,1.0323919393991632 +688,254.77759691108307,222.00508868839333,1.147620527152372 +689,89.40678073287819,82.70569983297862,1.0810232053344833 +690,566.8278709386377,557.2583107835583,1.0171725750336926 +691,82.95157834324417,82.94519276771376,1.0000769854806206 +692,82.92770088827453,82.927576731162,1.000001497175215 +693,77.98050617866768,77.27101282470682,1.009181882416507 +694,70.54975185059858,68.69488008180161,1.0270016013797272 +695,294.6679162056675,291.8632257814644,1.009609605378319 +696,198.28881058708393,192.25381754931433,1.031390757877781 +697,284.79428084712043,266.8347815216185,1.067305690896398 +698,778.2231295355616,712.2965792491527,1.09255491631857 +699,204.17316792432112,183.44010891352931,1.1130235864642068 +700,922.6138486308605,902.2665958527173,1.022551264639154 +701,474.6044286302828,445.4675732062152,1.0654073543767901 +702,269.7131509081001,249.73076049378304,1.0800157352454565 +703,75.88245580285422,67.94745404345304,1.116781443412533 +704,89.85037569863428,84.5595942264278,1.0625686714867528 +705,199.9694096637273,179.390382198956,1.1147164480755039 +706,46.85485520248383,43.51355301431189,1.0767876203322897 +707,646.0657184927227,625.5010766878759,1.0328770685955326 +708,456.14478758465447,424.1871891354317,1.0753384337569412 +709,546.6716969052172,535.7935042650128,1.0203029573027895 +710,264.6691159632415,258.56347551577727,1.0236137004087094 +711,383.1931363650983,375.62869987330214,1.0201380685084702 +712,225.72802259546907,220.9028667433674,1.0218428847177763 +713,50.29343363009293,48.76249507043372,1.0313958208546934 +714,71.88182599473696,70.34529179148615,1.0218427440432734 +715,51.00802421827482,49.45041226618136,1.0314984624134003 +716,63.29127545816372,61.76743207874472,1.024670661028555 +717,219.75855542083335,215.06100608895824,1.0218428687622338 +718,1364.9996544566875,1273.7950277181278,1.0716007087120942 +719,1374.175596959433,1282.3541542461699,1.0716038096100218 +720,1577.9306641223918,1494.5691226667047,1.0557763038132009 +721,1340.9513566938774,1251.3144031496581,1.071634237821123 +722,1347.3196034182793,1257.2569593872709,1.0716342378211219 +723,1610.0409287441153,1530.7443479593892,1.0518026284992887 +724,1346.57762303959,1256.4348190654741,1.0717449107635868 +725,1354.611608636214,1264.4390860381145,1.071314248028063 +726,1624.0011368135488,1544.8646506865482,1.0512255142169458 +727,839.7043923058782,785.112487578949,1.069533863733685 +728,222.55318872475655,206.2350591134019,1.0791239359665898 +729,4120.059502069351,3942.4928993196263,1.0450391686895284 +730,458.5107102559005,437.1898435004105,1.0487679827710132 +731,475.75612031489146,437.0176243166336,1.0886428689434058 +732,417.4951352544647,381.688926155604,1.0938099238547556 +733,335.17803857655997,318.0913451509384,1.0537163103809495 +734,1047.6650740556922,987.1716302631922,1.061279560653877 +735,3944.5342991930684,3605.6207211909277,1.0939959036762463 +736,1360.7775583962136,1293.476942788737,1.052030781053102 +737,1857.6609399576319,1765.1432957907975,1.052413673375671 +738,1587.3136384861355,1479.649272182857,1.0727634368004293 +739,471.0546202996289,423.9838779970549,1.11102012304086 +740,270.2692821043431,247.79247523713846,1.0907081897692585 +741,257.47740719358126,239.41094001257014,1.0754621621721319 +742,479.0837403057549,433.0605429795854,1.1062742798259018 +743,1353.6073548102613,1232.146896066006,1.0985762810684778 +744,129.55270319557835,122.58045746059764,1.0568789338808093 +745,312.2446400890602,285.9532817575687,1.0919428452434456 +746,181.19720406764685,170.31376689475786,1.0639022750263882 +747,282.43675698442456,261.6500120728062,1.0794448459869908 +748,1398.2859481518785,1288.7067619662728,1.0850303493545832 +749,2192.0181079221566,2060.407595199233,1.063875959800176 +750,101.9057291018664,92.93681359924075,1.0965055197749853 +751,101.86587841610975,92.92223230447416,1.0962487220747166 +752,102.2614787338451,93.2850695219902,1.0962255724077998 +753,104.00735641893114,94.98409418130697,1.094997613183534 +754,54.02016290478402,53.43760661819126,1.0109016163608355 +755,459.3784054464599,451.3797163329236,1.0177205328997034 +756,371.7022395511468,350.12874514020245,1.061615890469963 +757,254.2882915534273,237.47205982598484,1.0708135169239072 +758,1194.6925489370385,1142.0158446407565,1.0461260713180844 +759,407.0756074033151,380.287544339457,1.0704415999487646 +760,340.37849388594157,318.81233665989856,1.0676453033530169 +761,193.26621664922618,185.99673564757623,1.0390839171254276 +762,296.84214107395746,279.15017480688556,1.0633779515965236 +763,1589.472072368564,1455.006649796816,1.0924156756194383 +764,192.67205644536045,188.34689200713,1.0229638216598058 +765,342.174375345135,315.92154075475577,1.083099223078172 +766,567.1530256712443,527.6475751636702,1.0748709031692603 +767,556.2083772468326,521.6299959380575,1.066289096827325 +768,667.7337813202631,622.7570145887377,1.072222015453696 +769,1703.6778208098913,1563.5423031451146,1.0896269435005945 +770,331.50375571834246,309.7507130374184,1.0702275790348101 +771,937.2392190804568,885.3640090146359,1.0585919571358624 +772,1197.9845870900585,1102.9370587240662,1.086176747452795 +773,2426.64070397115,2225.69425181949,1.0902848412298263 +774,814.9845377523288,763.732073968432,1.067107910654562 +775,824.2071902346338,772.5722538100144,1.0668350904009 +776,819.3712637008836,768.0377640158836,1.0668372078692974 +777,823.9972832955465,772.364262976706,1.0668506076651525 +778,4770.809910874593,4503.655402895774,1.059319482526803 +779,946.6459594555585,894.2303795311731,1.0586152977176484 +780,143.15265332064848,135.99812901246895,1.0526075201190714 +781,143.10730942714562,135.9720567817855,1.0524758749278251 +782,146.75043072202877,139.49421675036288,1.0520180272752921 +783,146.30938541869787,139.2026174377732,1.0510534076997622 +784,1642.8532541999846,1543.2899648827286,1.0645136633962509 +785,2195.517925946823,2076.910182312266,1.0571077866749676 +786,1170.5744382093765,1105.5161239334295,1.0588488153790732 +787,330.36657855307806,314.7529546677428,1.0496059644676479 +788,372.8548718781408,354.2197159295465,1.0526090308092866 +789,341.53482856788094,323.3466115074988,1.0562499077246719 +790,251.03163453911984,238.93849306211192,1.0506119433584287 +791,525.5283996748681,482.58045368080354,1.0889964474658806 +792,794.5062413753841,755.865632741468,1.051121002146598 +793,735.4133741674848,707.0231844495383,1.0401545385531452 +794,1124.5521602260314,1076.3068338121411,1.0448248816213603 +795,382.4538583642559,364.6062694050825,1.048950307377585 +796,645.4851058374137,617.7499477811602,1.044897062566938 +797,1040.903422845019,1003.1697521105334,1.0376144422766924 +798,2988.6972995629994,2876.7053124187355,1.038930642864528 +799,4620.83896933922,4439.086380408021,1.0409436927682614 +800,2140.189993277252,2055.98633096933,1.040955360957202 +801,2078.2863093287638,1996.4588985064574,1.04098627368864 +802,557.7419906582969,527.807068959911,1.056715651340887 +803,2040.5859659246557,1956.620948710164,1.0429132772343273 +804,3605.7824210739377,3463.9552995271106,1.040943692768261 +805,3543.7065431389706,3404.3210672759096,1.0409436927682603 +806,606.3176178837075,569.8222468431509,1.06404693962502 +807,527.968383053604,506.8943492984545,1.0415748050541818 +808,417.66064963938044,398.2475398296636,1.0487463395706602 +809,294.52773661778895,262.1592965413245,1.123468595252971 +810,232.65243114873343,223.07783969244292,1.0429204060317734 +811,210.80880351747717,191.01539536810077,1.1036220568045474 +812,2619.0944563357134,2518.6736252926116,1.0398705215454167 +813,497.7243165934755,484.1721440183903,1.0279904012292174 +814,1756.544330433587,1687.4537428266415,1.0409436927682607 +815,1773.2146686806257,1703.4852467445144,1.0409333876353608 +816,1244.1830577300507,1196.922105709132,1.0394854032651677 +817,6401.939117372134,6151.832118054676,1.0406556932175428 +818,451.4178861771213,423.80856509739937,1.0651457364326198 +819,389.16644523860845,365.99350588348216,1.0633151653857587 +820,607.8382245387302,582.4259209809633,1.0436318210476718 +821,1289.8609831905214,1236.1136074212884,1.0434809352850325 +822,1665.1848386154734,1606.8017465942028,1.0363349692300374 +823,936.1785429971329,901.9592192922263,1.0379388812409487 +824,942.9879591107092,908.5265550863662,1.0379310916465914 +825,553.992888504749,535.1114811502036,1.0352849976493876 +826,934.0594901708074,899.9197314964913,1.0379364486403078 +827,285.83455102122707,276.67087327970125,1.0331212231808071 +828,505.12808196719004,473.705909021857,1.0663326598779734 +829,342.43516234327905,333.34707558497786,1.0272631363042644 +830,436.20493339955306,418.5460926338186,1.0421909105747738 +831,332.7369223974978,318.18362068988944,1.0457386891130778 +832,333.09009726960016,318.49711518007626,1.0458182551552253 +833,333.4075460132846,318.8249124607387,1.0457386891130778 +834,2639.394115497748,2531.5749554055647,1.042589756176076 +835,364.33832976220543,348.3483785832996,1.0459021834519093 +836,457.18202147756824,437.10303299108426,1.045936511465235 +837,1773.1049716110408,1701.9182063130233,1.0418273716292359 +838,1418.7655661216766,1363.0833057088137,1.0408502254995395 +839,427.73543844644536,413.49539834709157,1.0344382069456564 +840,421.5544304570062,407.53981960588186,1.0343883227525532 +841,254.42791781894553,248.1465845669233,1.0253129949903792 +842,279.8752953190084,272.46355149478944,1.0272026984290437 +843,913.0400372489668,886.9756767837575,1.0293856541362223 +844,299.41470297540116,257.5880658582004,1.1623780083826782 +845,333.6773175003982,300.19199450060984,1.1115463557097633 +846,275.49724818405446,259.1512731563728,1.0630750326965148 +847,235.4522762541101,219.76280038159356,1.0713927736872368 +848,309.60579410257446,282.12011255947675,1.0974254592972459 +849,325.54133414145025,294.54606327867634,1.10523064038866 +850,338.2401728847697,304.56629543915375,1.1105633747065204 +851,388.2458819544914,355.9120465618418,1.0908478252000706 +852,257.66953049922466,234.20491768257176,1.1001883865156732 +853,286.4275317102524,262.45407547524644,1.0913434329095304 +854,323.652832909735,296.3830175231717,1.0920086974431027 +855,280.60237864538436,256.62555124798615,1.0934311773741834 +856,1093.8729148897448,998.4970039542955,1.0955194763306622 +857,4188.497846555089,3954.9626995691697,1.0590486345197034 +858,1420.1935793752439,1320.3401438652943,1.0756270541147288 +859,166.01339154070672,154.94645265510667,1.0714242804269538 +860,137.17949858277382,125.25020980944336,1.0952436629964912 +861,166.06106835119078,154.87088800116624,1.0722548988673732 +862,136.55930281480826,124.66228047291132,1.095434018187098 +863,1684.0217006375183,1558.0477161227907,1.0808537397225642 +864,2405.629148309622,2213.4451794449124,1.0868257188609955 +865,1105.452671610548,988.5698895647492,1.1182342121478737 +866,549.1352992667004,534.9838094197952,1.0264521834076676 +867,543.3513501336909,521.3843378552573,1.0421320908272698 +868,238.42744289582288,232.96932978716887,1.0234284620797094 +869,680.8340293921214,627.5779062288792,1.0848597801717696 +870,3092.5797755438753,2856.0813002848795,1.0828052322023909 +871,2332.3885504177842,2140.8397728140812,1.089473663576381 +872,991.4575589422785,917.5576354216058,1.08053981642986 +873,1185.5786584868263,1142.0266724345176,1.0381356995449735 +874,573.8780273845686,540.8186235452187,1.061128449354492 +875,391.20232953941263,372.0562123053951,1.0514602810026508 +876,1008.8192717294979,959.7630320671849,1.0511128664298033 +877,121.34627092243589,114.42940039005651,1.0604466204384693 +878,192.3334436900439,181.66493847912844,1.0587262754179787 +879,459.1986860822245,426.7600920897095,1.076011310789801 +880,52.841791699681586,48.68943077784838,1.0852825932753019 +881,246.11613231163247,229.3568389487481,1.07307082465777 +882,823.3553872164524,801.1204082980952,1.0277548526888654 +883,252.51622022123445,231.29576135429937,1.0917459911183998 +884,818.6782934638248,796.4008245737529,1.0279726843602845 +885,389.45644241365693,376.2372449168887,1.035135270830745 +886,798.721121987891,777.3389275921946,1.0275069131838381 +887,315.1830939124204,304.4119223605975,1.0353835403958447 +888,390.9835745657283,384.1017790922214,1.0179165935908217 +889,1341.399041462366,1307.2070627725902,1.026156513121383 +890,79.9127407628711,78.26687662083683,1.0210288721499345 +891,117.14768062195414,109.24076549956895,1.072380627197421 +892,301.3424696831536,278.2033025545442,1.083173588940673 +893,351.27690621321494,337.51411453530403,1.0407769366826622 +894,1114.214060646121,1043.081429682291,1.0681947055518917 +895,1162.5783736199098,1089.2275054496836,1.0673421005283406 +896,967.3334640875935,941.4104784020051,1.0275363258433148 +897,966.69403050753,940.7886545193045,1.027535808243204 +898,966.0495438420343,940.137020555545,1.0275624964445897 +899,970.7244866564621,944.7017288636293,1.0275460042019138 +900,1602.1572946796784,1563.7594054571432,1.0245548574087138 +901,1361.3584731657386,1322.2009389456828,1.02961541855452 +902,1422.4649435418296,1359.4559470410022,1.0463486857650468 +903,2297.2959200018017,2160.743089299336,1.0631971618369243 +904,2366.453158389186,2224.4619182190654,1.0638317244305986 +905,1907.5222348976545,1783.8366867681243,1.0693368115181094 +906,1175.3633096569727,1093.4166514947901,1.0749455004642143 +907,726.2877938985406,679.7312963234652,1.0684925025916718 +908,663.2156280620937,622.2810883690433,1.0657814297399542 +909,927.5098836999772,864.0633017865991,1.0734281640965324 +910,1394.3597435371992,1327.783105388931,1.0501411999279555 +911,848.5574108908821,821.4995551832873,1.032937151988546 +912,355.21973668428956,318.4295745240505,1.1155362601455234 +913,304.40654881465343,297.7691127878678,1.0222905457340505 +914,292.4883020562785,286.0793279308516,1.0224027865689618 +915,293.4842569763246,287.04061223428937,1.0224485472347578 +916,304.737951595381,298.10368611746327,1.0222548924648438 +917,4283.086982007105,4076.5579950065885,1.0506625901688373 +918,3443.6727435674534,3253.37966823338,1.0584908909317075 +919,246.3211594008834,235.79055692179674,1.044660832123906 +920,697.7901636385722,660.1125527182476,1.0570775555852918 +921,899.5115072596775,850.8216410302739,1.057226877974618 +922,355.21752598386036,337.20859037531903,1.0534059218019833 +923,137.89333569706972,134.35391070766107,1.026344041425858 +924,95.36421711035314,88.34097696501401,1.0795014996055632 +925,92.5102147761995,85.22985265843778,1.08542032973984 +926,137.84035535581947,134.31043861496934,1.026281775096941 +927,672.2395789718767,649.6160659414435,1.0348259752437718 +928,2797.5973804077203,2661.677056965938,1.0510656704524173 +929,1116.8047657150319,1056.6441884956946,1.056935511380596 +930,1299.4897831869905,1242.8909226705102,1.045538075372592 +931,1261.2681413905088,1203.7956587751642,1.0477427229417173 +932,1269.0900723677148,1211.129043313101,1.0478570218216043 +933,653.705174936396,619.0323573084237,1.056011317047676 +934,624.972540376637,591.8352206685287,1.0559907868792886 +935,619.369413167786,586.5929365495581,1.0558760165286423 +936,621.6168940871338,588.7070247289423,1.0559019477869218 +937,544.226929887476,511.94462059624607,1.0630582058927227 +938,624.6221562999884,591.5688157703044,1.055874041444602 +939,544.2098856532816,511.9567024131449,1.0629998261339464 +940,619.0301250441684,586.2829150044859,1.0558556444364953 +941,763.5946075806792,733.8879015148178,1.0404785335805968 +942,1233.9564700116698,1183.3040414174563,1.0428059288410254 +943,1274.0181338822294,1212.3389510370903,1.0508761867235032 +944,849.2348771581403,805.6446385740361,1.0541060369510526 +945,2153.432613713273,2042.2994452119588,1.0544157071392537 +946,3897.7503896555127,3720.056916842705,1.0477663317483916 +947,3832.1150753526063,3626.3267891424116,1.0567484118713033 +948,971.0346839947579,918.904332134553,1.0567309893284642 +949,538.9359984575661,506.9753077404318,1.0630419080163527 +950,1055.786060750818,999.6551878258668,1.056150234209287 +951,646.5065280755691,609.4758122818366,1.060758302540493 +952,1340.757249773852,1264.7805951434227,1.060071015417353 +953,1419.8211167390214,1335.6513765347554,1.0630177467586175 +954,4134.582782460631,3914.767429868574,1.05615029667278 +955,4595.730681758689,4353.3219743801255,1.0556836155940614 +956,4565.415960055091,4324.263962722528,1.055767177816022 +957,3300.4809295148566,3139.187089968616,1.0513807667155808 +958,2120.5853298489405,2032.6462361845947,1.04326335399583 +959,2111.7808125088754,2023.6482852127078,1.0435513067859536 +960,760.5488388613198,714.6623480396846,1.0642072314954072 +961,710.0971347890602,664.4511433060873,1.0686972878936647 +962,674.7508167396029,623.9394220516239,1.0814364229798177 +963,1117.112155187363,1048.319089583016,1.0656222578487151 +964,2036.4253474814873,1948.2248854661507,1.045272218147564 +965,1695.0753906885375,1628.4450289254607,1.040916555720056 +966,940.1482621329985,897.8114753016598,1.0471555421110137 +967,956.5804220105008,940.4518885861506,1.0171497698288399 +968,957.2200230453549,941.1449458822905,1.0170803415917986 +969,1366.4862032305336,1295.7933974891353,1.0545556150219473 +970,1786.6374529902478,1703.7833005918542,1.0486295131368009 +971,1255.979644247234,1210.3727206799515,1.037680065642641 +972,1108.4420892691442,1070.834926676597,1.0351194770133838 +973,2204.6849487931563,2074.266980457473,1.0628742440411023 +974,1279.9840792725804,1227.2562446976447,1.0429639977818375 +975,1948.4193626817264,1863.5887017137306,1.0455200554124344 +976,2170.3476851277846,2071.3971840183185,1.047769931268088 +977,1672.1018132192753,1608.1519562715964,1.039766053635841 +978,1112.6934870972489,1075.050589437796,1.0350150011816082 +979,4479.633566571583,4211.320363440493,1.0637123704623337 +980,1407.2606571600616,1339.6289352679225,1.0504854143648463 +981,1656.2263897791918,1578.537356648996,1.0492158343943905 +982,180.31249314189162,171.83117259584233,1.0493584511932412 +983,523.8022576585697,495.4198389972051,1.0572896287698417 +984,427.06851715512096,408.69336106113144,1.0449607403611358 +985,456.64691919192194,427.06777907643254,1.0692609968831097 +986,587.7302397846115,558.3167714973389,1.052682401441012 +987,571.557571334655,544.667176220391,1.0493703242792498 +988,585.4336262290419,556.3269619180921,1.052319348698464 +989,587.0397596871256,557.6608470736554,1.0526824014410139 +990,536.337603369259,515.2410090566198,1.0409450993647924 +991,537.2290911610752,515.8065949033183,1.0415320324893718 +992,203.2646500345067,196.88844463750286,1.0323848634628774 +993,486.3922595180221,467.5056270811768,1.0403987275078634 +994,448.8461546272614,439.41211708146614,1.021469680008952 +995,1033.8393310263007,939.9155028873528,1.0999279486830684 +996,1095.9737589040783,981.3270302424297,1.116828259212758 +997,222.7919852664284,199.15075209033196,1.118710237987819 +998,300.38775450061877,288.3429444532026,1.0417725152604558 +999,300.0187169390011,287.9786835603871,1.0418087659466966 +1000,264.46983035437574,246.73425739173229,1.0718812748182156 +1001,1205.360127387088,1157.0095203412245,1.0417892905769728 +1002,1124.1531069167127,1102.9133488706216,1.0192578665113088 +1003,1246.6362724969872,1207.7530875928574,1.0321946474851305 +1004,1120.0310294836895,1084.974214288367,1.0323111966474856 +1005,739.9297531310528,717.1809943096831,1.0317196900111196 +1006,817.5850455008083,755.8689843977265,1.0816491513436775 +1007,612.5852840534818,558.5858825963196,1.096671618706459 +1008,1515.829823095026,1443.5903744088437,1.050041514522958 +1009,535.3799143381681,508.67661501574804,1.0524956299034767 +1010,597.5486691174684,567.6367405740284,1.052695547002809 +1011,673.9165972384338,628.5380095339718,1.0721970461867658 +1012,240.46216990500108,222.6055690779653,1.0802163256786343 +1013,1363.465140395154,1314.922101079142,1.0369170457140946 +1014,499.12493782411445,482.40149170842176,1.034667069656992 +1015,238.98131000164884,230.60789041195906,1.0363102041943641 +1016,519.0474913651859,500.4870739669631,1.0370847088039838 +1017,141.0942815891771,133.85619522199895,1.0540736000688937 +1018,748.656439213971,711.2055171260898,1.0526583683422712 +1019,744.9770093599518,707.7052001044152,1.0526657275515814 +1020,745.4811433349546,708.108478135517,1.0527781637325422 +1021,748.0755998060164,710.6250793440898,1.0527008144667418 +1022,573.5513040225466,511.7123997536691,1.1208469919795687 +1023,3096.9902632549088,2964.1706407403003,1.0448083591035895 +1024,473.5734505304724,431.57228636506625,1.0973212726868136 +1025,154.43881075360036,143.81462112471576,1.0738741968361571 +1026,1042.5900269410681,998.5627808684444,1.0440906139465096 +1027,569.6165889979917,519.8169425256672,1.095802276529041 +1028,1846.9313646889302,1758.7452013903664,1.0501415231887192 +1029,963.9750587868976,905.089487556215,1.0650604962716743 +1030,621.7938764863073,598.8002064165321,1.0383995693778711 +1031,988.6507952921685,927.0977925061006,1.066393214700339 +1032,750.7328090934762,714.0524319187704,1.0513693050188766 +1033,2159.3055767817405,2029.4351978502712,1.0639933608469183 +1034,311.22106915595634,300.4710510964175,1.0357772172071555 +1035,782.6306133742457,755.8152461555097,1.035478732871735 +1036,463.19235745004414,438.9725501164982,1.0551738538710866 +1037,2965.4771614288884,2818.242222282833,1.052243536053048 +1038,883.201726710766,839.3463452735036,1.0522494458744227 +1039,484.0947999964967,446.73750130985115,1.0836224820551499 +1040,879.0492267653397,835.4034861918238,1.0522451022708492 +1041,473.25797168176706,435.6837679997765,1.0862419177434444 +1042,442.530780941454,405.39714901863465,1.0915981575418343 +1043,95.28788155834745,89.25264327957181,1.067619714744706 +1044,444.4102787025855,407.10150525536784,1.0916448919141541 +1045,396.4003947190924,363.38635861280153,1.0908510606515867 +1046,206.47119835764562,200.2463951457771,1.0310857192077638 +1047,47.60243088250422,45.8980317037534,1.0371344721218503 +1048,74.23792123048572,70.06521827758286,1.0595545558192874 +1049,327.78949692540004,317.3624507945743,1.0328553239512732 +1050,336.74357788566624,326.1056267375211,1.032621182451131 +1051,518.6669227838016,501.7619643744056,1.0336911914606224 +1052,491.11188632915844,471.95808568525933,1.0405836900030832 +1053,496.3579833335192,477.0163329249523,1.0405471449792263 +1054,909.7813833687886,865.5384700830767,1.0511160564376363 +1055,579.6644500623559,549.0703547315887,1.055719809068408 +1056,581.2742760074848,550.5964157815534,1.0557175080451353 +1057,581.6505009778512,551.0453725401792,1.0555401242126217 +1058,287.96434740448825,273.35716075468457,1.0534362685414063 +1059,137.13214756303583,130.84789625404838,1.0480271482300811 +1060,136.46347891361,130.1742924941132,1.048313582497721 +1061,6978.799929533525,6672.605088720765,1.0458883504630516 +1062,328.57899266097377,311.79065117705255,1.0538449161979133 +1063,198.74255410130678,190.66365448596687,1.0423725205368626 +1064,301.1929299867166,282.53249876494647,1.0660470257522294 +1065,192.05721042026437,181.97131920105411,1.0554257190830534 +1066,297.7289897071626,280.4643670321313,1.0615572768039137 +1067,337.39034935780455,318.9534577668999,1.0578043320802588 +1068,358.5075004523971,330.5924847964448,1.0844393534025445 +1069,280.9121558773332,264.2360208689575,1.0631107558823174 +1070,644.6992178704478,605.7767741666655,1.0642521228340684 +1071,227.83846927603398,214.01529794722532,1.0645896413078721 +1072,440.87228148670056,420.9543996099587,1.0473160083258353 +1073,763.8991445306533,717.2635140403748,1.0650188244311747 +1074,989.6070084953803,976.6863924239248,1.0132290325448166 +1075,863.8873321011063,839.1048336415297,1.0295344484574425 +1076,730.5985525500852,689.2778422629509,1.0599478290952677 +1077,1058.3029103015992,1032.969188684871,1.0245251474044275 +1078,1030.33107957822,994.5002290913206,1.0360290017425517 +1079,1008.5011152716621,972.1387431283831,1.0374045087702846 +1080,750.8575409019237,721.5751974099394,1.0405811391482023 +1081,759.4098738614854,710.391759524252,1.0690015244124744 +1082,724.2749251062154,671.8546380332459,1.0780232569747856 +1083,286.17950488802336,280.0476576813311,1.021895727525312 +1084,355.3937859976267,348.2510677496351,1.020510255127564 +1085,152.62451497764718,143.46459867817603,1.063847920559266 +1086,213.5712691508638,206.69536209074826,1.0332658991017742 +1087,282.0393002954088,275.7553055289318,1.0227883004986016 +1088,402.31383331841727,388.4650568588356,1.0356499927472604 +1089,597.0703412788545,571.7547594785043,1.04427699355479 +1090,332.7577594597165,317.44968848677854,1.0482220380996705 +1091,2473.4429905323145,2366.517145420846,1.045182789111994 +1092,513.5588455449874,493.04398607276795,1.0416085786495968 +1093,571.5023081648238,546.7567608846233,1.0452587860827978 +1094,3652.693047464574,3444.9473737144417,1.0603044549635994 +1095,1883.8715170701373,1763.6883355024263,1.068143094870259 +1096,334.25176901123353,327.8726280900444,1.0194561557588675 +1097,346.0925633080839,326.49710829834237,1.060017239086344 +1098,748.8633998932124,707.5998484884253,1.0583148109668683 +1099,372.9311838661672,321.78112772742867,1.15895915493859 +1100,258.5826127164605,250.11542821854226,1.0338531075760744 +1101,230.200827945516,222.5336921684416,1.034453820014234 +1102,236.21849449096777,228.48430851351262,1.0338499655743218 +1103,256.4825206327394,248.08584688481128,1.0338458394679273 +1104,587.36611325561,560.4158172914367,1.0480898203309599 +1105,412.8010873628097,388.1740255398696,1.0634433532452074 +1106,1153.8310125433018,1088.1527040554909,1.060357620987414 +1107,513.9298611082479,482.9698832325191,1.0641033301466203 +1108,1504.1261466580224,1418.2745855020373,1.0605323976284857 +1109,512.090979682217,479.59705326999784,1.0677525564234986 +1110,172.78158587523643,170.43086813536254,1.0137927933219637 +1111,182.38611301853385,174.86373541836886,1.0430185114264394 +1112,912.2222767180606,852.8668334432389,1.069595206364385 +1113,683.7364174124939,641.4690746889677,1.0658914737924359 +1114,461.82594942639827,440.256886097166,1.0489919953789704 +1115,297.5364031371154,279.3949343994002,1.0649312729191491 +1116,506.9077545900649,480.5077027364771,1.054941995109007 +1117,536.502372725499,500.00838682425416,1.0729867475484405 +1118,697.2895039268659,661.337356047812,1.0543627961588407 +1119,666.3581230764954,626.1566802511965,1.0642034878701148 +1120,701.1769029783725,664.9936052055123,1.0544114973281253 +1121,706.3873000468428,666.8062533485127,1.0593591414291113 +1122,449.55037085594796,428.70806707213467,1.048616542082252 +1123,447.5254455835957,426.78675210464274,1.0485926364318545 +1124,694.8662021129512,659.0108972195347,1.0544077572081059 +1125,695.8541269079512,659.9483383795088,1.05440696860698 +1126,643.352226175337,600.7709759593656,1.0708776753869873 +1127,476.72532377367213,448.10759392626414,1.0638635234825256 +1128,643.6476360726114,601.0343419642384,1.0708999322220234 +1129,423.5848656141095,399.41467446037916,1.0605140289008785 +1130,201.65422786918984,172.035542111298,1.1721660849519693 +1131,201.37126363865306,171.83544100409333,1.1718843473847527 +1132,145.48389569418046,133.83382018821115,1.0870488153860194 +1133,263.9529504050013,243.82273361138002,1.082560869101345 +1134,506.9854598303209,469.2131915225315,1.080501292355451 +1135,626.0548909165259,579.4977832536912,1.0803404413411761 +1136,248.2472647644607,215.4016724210675,1.15248531719469 +1137,202.1217191836353,172.42894572039353,1.172202951999665 +1138,155.3185632324905,149.13410279370945,1.041469122909706 +1139,553.6063309730686,500.49400460100316,1.1061198053998806 +1140,353.3512895407008,330.20463241071025,1.0700979176488372 +1141,417.937460463649,389.1261279986856,1.0740411151858216 +1142,553.8482523484433,500.92021980367593,1.1056616012935379 +1143,417.5685435864643,388.7456380327498,1.0741433542497685 +1144,631.9311119780145,594.8457226613368,1.0623445507025886 +1145,663.4769147976048,623.4285183674266,1.064238954828459 +1146,916.7459244852333,862.6971791489466,1.0626508891446775 +1147,993.7705541585242,935.0988642720724,1.062743836109912 +1148,935.9745925253737,880.7213958627161,1.0627362942721903 +1149,979.5557979492755,921.694892685057,1.0627766365241103 +1150,3843.1319808828052,3612.4061823421403,1.0638703918923844 +1151,400.1570373130172,363.2559743644263,1.1015841873300367 +1152,1223.7545496498433,1146.4140867297606,1.0674629384053564 +1153,442.4314845578824,408.8774547447541,1.082063780782618 +1154,616.9937737029418,570.3874305885256,1.0817099757375925 +1155,575.3368206398645,544.8453056548973,1.055963618789588 +1156,429.97852668123534,397.814551870267,1.0808516799090282 +1157,509.6678567229329,478.323961695976,1.0655285905306144 +1158,392.707902004019,362.26362380456493,1.0840390152334982 +1159,2502.615880076405,2316.637208683878,1.0802795840002004 +1160,1036.2007635510174,972.1389680738531,1.065897775504353 +1161,1080.664723398333,1012.1366388343735,1.067706356962712 +1162,406.5018251272123,386.3675318711238,1.0521117630111956 +1163,521.6788128777663,507.77323284875746,1.0273854136638798 +1164,334.0752083959615,308.96928613852293,1.0812570160976538 +1165,356.00666553023615,333.10230712610974,1.068760731805604 +1166,523.1234655936013,509.13225807687553,1.0274804970511477 +1167,765.5415950925577,708.1356509061031,1.0810663099831228 +1168,766.5699371518195,709.137959013477,1.0809884415413884 +1169,763.2573731364066,705.8829500999315,1.0812803638738586 +1170,764.0066938996182,706.6331670681373,1.0811928020156867 +1171,2157.7233219969626,2001.3428234254884,1.0781377866605653 +1172,1080.650789599873,1027.1549282561002,1.0520815895169755 +1173,2295.4289774585404,2199.1990889326325,1.0437567881008047 +1174,1275.797201803619,1181.9060332484135,1.079440468120084 +1175,2451.830186974562,2277.4360679555652,1.0765747594291633 +1176,1140.946633926358,1071.0470420747392,1.0652628587780937 +1177,580.1778971310509,541.0143182003286,1.072389172732062 +1178,146.155538309115,126.88596985138042,1.1518652415259523 +1179,136.20005764600083,119.17262595388387,1.1428803935117287 +1180,1698.5933694811279,1635.7843455101377,1.0383968853494576 +1181,383.67631928143214,326.9308836554279,1.1735701289261238 +1182,1025.2469457132481,972.192197393181,1.0545722836105116 +1183,2046.1687386111141,1938.1978472796325,1.055706847205008 +1184,368.9180016438625,353.0882551930281,1.044832265639027 +1185,1347.6991479337123,1255.6372378709534,1.0733188752978196 +1186,1423.6081296309521,1325.6573093531676,1.0738884925890673 +1187,151.74231221256883,138.68348390918655,1.0941628226756515 +1188,573.9220685859535,540.0603089821873,1.062699959690767 +1189,220.16197488149353,215.83578805442775,1.0200438808877 +1190,288.52189157830793,276.74953605768565,1.0425379413036069 +1191,1960.0380109460937,1800.5768162248544,1.0885611728887916 +1192,2406.2619150584196,2210.784487589654,1.088419938065464 +1193,546.3406805770529,515.28423730645,1.0602705090164306 +1194,514.2813002559836,484.5765251297207,1.061300483176132 +1195,515.7778676896314,485.8793826661968,1.0615347884476405 +1196,545.2362668174839,514.213107391343,1.0603313275764685 +1197,1127.0653664053355,1051.4704852660223,1.0718944394527514 +1198,202.50520398485347,193.29320254867974,1.047658175842235 +1199,441.43185880423175,412.7481388905873,1.0694944863730762 +1200,532.7597995673909,490.7476639237734,1.0856084271654183 +1201,505.2604336603138,465.8971815986017,1.0844891396995526 +1202,386.0810368291177,348.2222227953223,1.1087202698606862 +1203,368.9821473312951,354.19118208744555,1.0417598347781505 +1204,388.5538821993826,350.51058494507276,1.1085367999949887 +1205,371.25129091272885,356.11370954915975,1.042507718623732 +1206,544.9877952775557,508.45021082251253,1.0718606929003665 +1207,460.7985394374458,429.6519691564917,1.0724925579698894 +1208,421.546174158814,405.0838988062494,1.0406391747513974 +1209,801.4895503752064,745.8742401589344,1.0745639240797766 +1210,120.6994890677325,111.04482470651479,1.0869438480067346 +1211,214.87374300029964,199.24861615108597,1.078420252802988 +1212,121.91046652009074,112.1732815292325,1.0868048510136588 +1213,120.73227269580012,111.0984507254987,1.0867142782585206 +1214,512.6405160482648,487.0484658882809,1.0525451817475886 +1215,285.1676234608099,275.46373444281767,1.035227464833512 +1216,495.13461395773663,470.5578048706042,1.0522290966864118 +1217,1747.6658282799947,1645.5613075366125,1.06204844527867 +1218,2364.5241327166846,2210.73364777817,1.0695653612967246 +1219,695.9976562952054,646.5308315562297,1.0765111613005474 +1220,698.6502425255226,648.8962849535678,1.076674745603629 +1221,805.482753280193,748.515906713678,1.0761063940733406 +1222,805.433114831492,748.6200748696084,1.0758903506184752 +1223,3162.5685745460837,2941.1055448160664,1.0752992459316408 +1224,1591.7251309807589,1481.7636823961645,1.0742098418870514 +1225,411.9082568056363,354.34007188844805,1.162465917586966 +1226,93.01744448299029,85.89448619269342,1.0829268397312186 +1227,99.19295793691826,91.70700525671059,1.0816290168810185 +1228,361.6339378304062,311.14518419022414,1.1622675079210445 +1229,1451.1018982958503,1392.610076676691,1.0420015786175723 +1230,625.9504463220627,599.3673386558739,1.0443519457129635 +1231,544.3652071277056,513.9637142803158,1.0591510489995581 +1232,650.1944080008225,622.988484457912,1.0436700263674752 +1233,557.151539462987,525.396436794771,1.0604402703260434 +1234,530.9095399744365,501.6507391697294,1.0583250427441464 +1235,437.5591650279039,419.11831864327036,1.0439991419232841 +1236,559.677849209958,527.4530470560563,1.0610951104250175 +1237,569.7462149091409,537.5555957227369,1.0598833301011854 +1238,350.5868031402706,350.3671384371022,1.0006269557817216 +1239,681.1005693467356,643.3342341760555,1.0587040657319426 +1240,442.0826881517437,392.3228437621869,1.126833920534384 +1241,365.53525218019496,357.2822325468181,1.0230994403907152 +1242,210.59158303644705,200.24732768347496,1.0516573952453585 +1243,319.072613408933,291.82428437813377,1.093372383620727 +1244,378.7164625014584,365.6665029868361,1.0356881459144538 +1245,358.5838061409677,337.9378320853291,1.0610940004208391 +1246,318.0475152464701,290.2207175746238,1.0958814997922788 +1247,318.40525657389713,290.53290056834487,1.0959352828923263 +1248,326.108264760411,297.75741102432994,1.0952146031850218 +1249,325.4193618507805,296.9443242722256,1.0958935236372804 +1250,1393.4951814245696,1329.0398573589,1.0484976607050422 +1251,1483.135255391621,1388.1686903219013,1.068411401101186 +1252,254.27427056778214,239.72167861466272,1.0607061991106435 +1253,249.70414539805145,231.94075628025305,1.0765858894429703 +1254,473.3791860103253,453.5225428290742,1.0437831448407953 +1255,252.54455433948738,234.6576758102146,1.076225414180524 +1256,294.51211187233696,267.3029198076286,1.1017916006465256 +1257,556.118483064601,520.4888808557323,1.0684541082804504 +1258,388.7888844128516,372.30118754111305,1.0442859099661557 +1259,245.82447247999224,225.77271354831962,1.0888139165115769 +1260,338.22018846953836,316.7440786074982,1.0678027193324515 +1261,305.2852404172953,292.3032549960197,1.0444127295861019 +1262,535.4917771695413,510.8630693128742,1.0482099986005906 +1263,735.9890670403146,713.6758270186202,1.031265231603693 +1264,411.80984487130297,385.6334703904795,1.067878896648463 +1265,410.1930777921354,398.54905772501087,1.029216027089841 +1266,404.8042529462774,378.8124150430067,1.0686140075433375 +1267,404.2708783661374,378.27472791674893,1.0687229374073062 +1268,1058.7814457528204,1021.3345625546159,1.0366646587427144 +1269,1099.2001278832313,1051.8347516842623,1.0450311953689728 +1270,699.1013260881502,677.0215278731841,1.0326131405072572 +1271,440.9004395070926,426.98704672327585,1.032585046526795 +1272,704.2142640244869,664.44987247054,1.059845585350323 +1273,262.48928796124835,251.05957540198492,1.045525897751411 +1274,1408.059075851627,1339.5675356960357,1.0511295909541458 +1275,392.67701118044164,377.3014385346322,1.0407514286336286 +1276,4371.679484695965,4247.953146684903,1.0291261070305395 +1277,2735.0096894614985,2656.95188074624,1.029378706208761 +1278,696.4663128099439,674.9543492606394,1.0318717311368824 +1279,361.66964554012895,347.11770049779705,1.0419222212565453 +1280,360.3473700913345,345.84975672842745,1.04191881902722 +1281,519.008403871337,501.3499208611094,1.0352218725394386 +1282,492.5775007942048,475.40187211778715,1.0361286517444805 +1283,1031.3809325275827,1007.4353009681746,1.0237689026147838 +1284,980.4022828572744,948.8509059283491,1.033252196664191 +1285,152.8540279058892,126.56395530296778,1.2077216419160453 +1286,439.6644116607989,425.79672566629415,1.0325687943532313 +1287,706.1199603547659,666.2229159267243,1.0598854279465069 +1288,558.8152987799874,512.8786377259123,1.089566337287427 +1289,871.549404932817,816.8331914308244,1.0669857861752015 +1290,964.7077542917882,899.3796574705583,1.0726368406029558 +1291,594.4245442201664,571.1709386113262,1.0407121651976483 +1292,594.1156537338128,570.8798184915628,1.040701798328843 +1293,1942.4947582161128,1865.8771840550091,1.041062495868348 +1294,1445.5859233483577,1387.4172054007463,1.0419259021159464 +1295,1226.314363093765,1163.2211760139878,1.0542400606013542 +1296,1310.3891991197127,1242.6238616303142,1.0545340706724324 +1297,756.8513771682954,693.4429148106691,1.0914400608951909 +1298,1761.7996965220264,1640.1082200179783,1.0741972237068076 +1299,1636.0767113979996,1551.3634351151275,1.0546056935244097 +1300,108.48171822675637,105.82315774654231,1.0251226719824558 +1301,111.16360323878304,108.35327373999519,1.0259367290141277 +1302,436.02259559182073,411.58405968526824,1.0593767793758588 +1303,434.2364858594725,409.91822926932224,1.0593246527081692 +1304,244.1891228863866,233.52062846420407,1.045685447544168 +1305,261.7578909031361,250.30246431624752,1.04576633561392 +1306,86.17567300832644,82.73835692993161,1.0415444082519765 +1307,461.9456050462635,447.8439397276555,1.0314879002877286 +1308,153.60966612674352,148.20189201809777,1.0364892379915458 +1309,454.40642363317966,440.57178774287394,1.0314015474326736 +1310,456.608409038502,422.01650961939293,1.081968118854655 +1311,990.6660375511266,939.5647437724684,1.0543882623495218 +1312,643.7621806495955,595.5503394280811,1.080953427493322 +1313,277.5784711681402,257.53753556846885,1.077817532715899 +1314,386.3799148463812,348.13059048418813,1.1098706215647267 +1315,322.0477572408135,312.2223211460541,1.0314693583043448 +1316,368.2824293149463,356.9459617645381,1.0317596184429911 +1317,1103.3459138251217,1024.8191221978914,1.0766250257497312 +1318,1226.8660484059646,1192.3064192216323,1.028985526394208 +1319,2220.03648020727,2103.244373170338,1.05552949934243 +1320,877.6713070442569,833.8961351980209,1.0524947532414703 +1321,658.0805126347022,573.3732399810079,1.1477349599651705 +1322,413.4612395502542,388.2233643080685,1.065008645956091 +1323,280.11925216190156,271.5478835271758,1.0315648515591098 +1324,175.6544978790388,174.25719080362958,1.0080186480050848 +1325,410.23702285081424,390.90352479938326,1.0494584899467283 +1326,777.2097702299782,746.1362105690475,1.0416459611807771 +1327,662.3426330194966,635.279335727014,1.042600625851479 +1328,418.3027201933916,401.1643689866821,1.0427215189873418 +1329,509.62481466942177,482.03145598843565,1.0572438963021702 +1330,359.5974103669035,355.41070710348157,1.0117799018986868 +1331,507.8425438187582,501.0581758744242,1.0135400803160117 +1332,709.0664073534956,678.779474228361,1.0446196950188644 +1333,1431.903566943852,1327.8654207789186,1.0783499174968387 +1334,589.361779433958,552.5697770143736,1.0665834505433462 +1335,642.2440128850316,575.3861327976354,1.1161965439839863 +1336,400.9022851678308,360.71313459870225,1.1114158224757729 +1337,620.2947410520377,602.6856376847848,1.0292177252388133 +1338,555.1409974024647,531.92995798966,1.043635518293662 +1339,544.8523962825275,509.7885009295617,1.068781259853899 +1340,434.4099307096457,398.68339707685215,1.0896112902988704 +1341,331.69298454800486,316.0649421665497,1.0494456685842113 +1342,384.2927396578069,345.74738246814644,1.111484161975432 +1343,573.8394336063335,539.0333133059773,1.0645713714554759 +1344,487.1595379869091,462.1537032457057,1.054107182449448 +1345,389.23822371570725,371.68644326414716,1.0472220086840416 +1346,758.2004839760136,719.3527670107806,1.0540037082593872 +1347,508.4950069281342,484.540940052853,1.0494366211298232 +1348,543.8826228784742,507.69794296069296,1.071272063279923 +1349,358.95663774022063,351.013742139278,1.0226284462612036 +1350,797.9193175624945,760.9856575870247,1.0485339764386377 +1351,1061.9974651683476,1016.5835942311545,1.044673031509563 +1352,280.52927937643386,244.89853416622583,1.1454918680159332 +1353,678.5368617489196,634.4146865610126,1.069547846420582 +1354,543.8120930835653,497.2153208824863,1.093715479479547 +1355,394.7172497048737,371.4860037981896,1.0625359923904552 +1356,544.3968876574155,497.6739878311593,1.093882543529897 +1357,360.5112333822936,331.488077274032,1.087554147789964 +1358,540.5358861717077,504.5472377661593,1.071328600598202 +1359,563.8702735462972,509.58009736899817,1.1065390435333002 +1360,198.32770568809727,186.96492645651054,1.060774924190018 +1361,339.2476072316823,335.3840331494364,1.011519850977892 +1362,548.7237255410203,520.7698976904566,1.0536778872483512 +1363,1223.1283058881972,1181.7376195400582,1.0350252760542977 +1364,1418.6214453183243,1335.0876624705809,1.0625680134689912 +1365,763.0592589344883,715.8401113718043,1.0659632602484308 +1366,283.4647400945277,270.50728567371647,1.0479005746131378 +1367,1098.769439406274,1037.3741831276202,1.0591833277492513 +1368,856.2629613041277,806.0942119703602,1.0622368311157309 +1369,215.88526983112595,210.63345242712305,1.0249334440635445 +1370,278.55672299386015,266.80231037066284,1.0440566373164728 +1371,278.58481471183313,266.8292010404859,1.0440566985378918 +1372,290.31311196201665,278.27101599957746,1.0432747044070787 +1373,724.5560118035385,711.6417340179048,1.0181471619331823 +1374,393.2616473068411,363.0004809240849,1.0833639842727503 +1375,1968.9002449601778,1837.5467758401965,1.071483061463794 +1376,622.222733446266,587.3458526862322,1.0593804835779874 +1377,285.45280544317995,272.3836287301821,1.0479807717296545 +1378,732.4561718252268,687.2862051989104,1.0657222075528834 +1379,394.69911807279163,368.0083524261093,1.0725276083293285 +1380,1198.6202643179333,1144.4364747642278,1.0473453885370687 +1381,1157.5163671219905,1105.3203115807223,1.0472225607313979 +1382,1253.1459423567255,1154.6310961754575,1.0853214905674926 +1383,826.9523906172774,777.5440196517217,1.0635441463335886 +1384,1841.5626901068485,1770.5597781295849,1.0401019569371845 +1385,2564.4519835298292,2462.2232042846417,1.041518891978312 +1386,1175.0867969710991,1122.0861121242745,1.0472340618729221 +1387,1214.941153249753,1161.897328190302,1.045652764467639 +1388,421.7931891156584,405.18094222445995,1.0409995761399746 +1389,380.9790391930553,331.61800961768097,1.1488490617028977 +1390,430.24285311340486,415.1110164131776,1.036452505719978 +1391,430.6848065492442,415.1178166248147,1.0375001729653512 +1392,812.3956547065092,763.8754561857747,1.063518467739503 +1393,206.33423867052343,193.99734480798725,1.0635931067754916 +1394,428.56033223426255,412.26679798410936,1.0395218201655454 +1395,164.70893849991097,154.71297040555098,1.0646097613416474 +1396,166.4581849380975,156.36873825729754,1.064523425802658 +1397,958.0631189148195,910.1459922704867,1.0526477367930795 +1398,1142.065050872648,1090.6656129404523,1.0471266695514696 +1399,1202.5915626004187,1149.615225010098,1.0460817988817568 +1400,1578.616941689499,1493.8619995390272,1.0567354562714797 +1401,655.2715586425008,615.5522530874771,1.064526293837445 +1402,903.1960732149005,857.3655693402001,1.0534550319182634 +1403,1152.7036047901845,1100.5782598680005,1.0473617795507206 +1404,488.1940736027453,460.8882911603119,1.0592459885966934 +1405,280.63809359414233,263.8117273211821,1.0637817220781647 +1406,1583.494532005555,1491.4745972671003,1.0616972859658937 +1407,651.9776998751958,612.4156380954644,1.0646000188740516 +1408,818.2819317173888,775.6494226123842,1.05496363158683 +1409,811.0089996304891,777.2090550589381,1.0434888713037291 +1410,325.38194306082136,316.0848908683414,1.0294131496350214 +1411,561.7997676045356,535.6987531788154,1.048723306281446 +1412,483.9652295043181,451.505515107674,1.0718921769735263 +1413,301.7551777146909,288.48230651611067,1.0460093076725279 +1414,302.7583417604144,289.40740316659844,1.0461319871148231 +1415,483.7828645264,451.3386476294693,1.0718844199745245 +1416,887.2794744562884,837.235845157777,1.0597724399736859 +1417,967.6759914332519,913.920141688245,1.0588189791349887 +1418,290.03527770723133,274.3072495562531,1.057337267521808 +1419,289.13897516785914,273.4590744364042,1.0573391128591034 +1420,854.4151879252274,808.5505635338188,1.0567244974648888 +1421,290.0241241827925,274.29677236232135,1.0573369919194555 +1422,605.0001008021796,571.39602759829,1.0588104774636524 +1423,587.2088517892172,554.6161299136709,1.0587662711515793 +1424,584.7065664912278,552.2527326595559,1.0587662711515788 +1425,584.9686148456514,552.5002361563745,1.0587662711515788 +1426,605.5302201298663,571.8889482761971,1.0588248329593912 +1427,592.2443227015408,559.3721096322596,1.0587662711515808 +1428,592.2625374717616,559.3893134011344,1.05876627115158 +1429,603.5340767243711,570.0214906168737,1.0587917940975 +1430,602.1586265358554,561.5375560198337,1.0723390093512943 +1431,598.8485841079406,565.6098049445753,1.0587662711515802 +1432,596.355713550327,563.2552998705679,1.0587662711515813 +1433,598.7697764449484,565.5307978649524,1.0587748336703908 +1434,607.3072180038437,556.820415848525,1.0906698115197213 +1435,597.5729704994758,556.2529199877021,1.0742828469335266 +1436,597.76880699199,556.368413156994,1.0744118336986068 +1437,607.4071197181069,556.91066465801,1.090672451193058 +1438,850.7389167726623,798.2823232659483,1.0657118314885172 +1439,716.8709177515568,693.6306366666357,1.0335052690241688 +1440,999.0249258940933,955.5185680170193,1.0455316718411474 +1441,832.7208107974144,789.2249194482781,1.055112161663044 +1442,493.6096951886948,458.0246526113865,1.0776924175902396 +1443,1023.7089197235703,949.6852795170647,1.0779454434043119 +1444,1847.791773541921,1758.0904107888243,1.0510220419852294 +1445,1073.679975166658,1024.7192572455795,1.0477796406917186 +1446,593.9578219630623,571.1167632007769,1.0399936759591413 +1447,721.5119471906293,678.5984636222819,1.063238403664046 +1448,675.8021167193034,644.8073282693651,1.0480682943432527 +1449,574.9221233647486,556.0195158112344,1.0339963023167185 +1450,583.8945089889439,542.953950727589,1.0754033711449973 +1451,576.1198370235322,535.7020179890802,1.0754483232789984 +1452,586.7204292703838,545.6326517485106,1.0753030035688023 +1453,581.8686165299742,541.0602807023544,1.0754229007064542 +1454,156.11490899239823,151.8784504812769,1.0278937433039166 +1455,153.39470116894955,149.39933592833748,1.0267428580976325 +1456,153.37314512606616,149.3781797794309,1.0267439685805126 +1457,155.33988736804227,151.1681979099742,1.0275963431180972 +1458,2356.3166622826266,2191.1854576735814,1.0753615829416683 +1459,268.92971115103563,253.65828123863628,1.0602047362216112 +1460,894.4344017566921,833.3940660614564,1.0732430649329034 +1461,804.2832069817786,743.4080007769473,1.0818866707665369 +1462,544.4529940000382,518.1964245383151,1.0506691443985092 +1463,864.0012465887942,795.6903237672111,1.0858511418087424 +1464,1108.6230614612457,1045.0195414044952,1.0608634743530903 +1465,271.89862577126365,256.51970933386514,1.0599521825333997 +1466,922.1884601772365,881.9305534993791,1.045647479292014 +1467,800.0243011261549,773.1401051221075,1.0347727350139229 +1468,1207.9185785441227,1167.501529795071,1.0346184118115425 +1469,1599.7189150192596,1550.883312061847,1.0314888957651414 +1470,841.655625420224,809.4214934296888,1.0398236669673206 +1471,906.3532790793533,846.6536917744377,1.070512404168221 +1472,1214.150507174305,1127.0534333119008,1.0772785666483133 +1473,1469.8309856138,1414.2632467621484,1.0392909445811238 +1474,2215.961608248435,2112.505319132907,1.0489732679858965 +1475,177.8027505562946,174.4145188873808,1.0194263166307935 +1476,282.92029747561475,274.5051141314779,1.030655834485132 +1477,2231.120933303633,2127.053558688325,1.0489256014218478 +1478,243.04209367579156,229.01637866007474,1.0612432835493175 +1479,585.5702637648394,546.2528984919975,1.0719764881456604 +1480,401.90594755816386,373.9224703356964,1.074837645347563 +1481,243.68278790240075,229.60922493167365,1.0612935433012984 +1482,539.7045361231475,504.5182364011847,1.0697423743747156 +1483,246.9039339649755,232.61586027646786,1.0614234716047566 +1484,249.83883781163792,235.3805985344126,1.0614249405739 +1485,394.6152685900777,369.7874486958574,1.0671407858265105 +1486,1753.4292647258408,1657.5236433514742,1.0578607863357217 +1487,524.2229937446563,492.68581329220257,1.0640107338218598 +1488,560.7973293252314,527.0619424213345,1.0640064937128941 +1489,423.9137746535398,400.0640511136919,1.059614762869734 +1490,296.7411744531541,281.59749476810197,1.0537777500383059 +1491,1824.8932165240344,1736.0033968839539,1.0512037129648673 +1492,1217.8764691059255,1145.9804771284148,1.0627375364697895 +1493,278.1420685000802,270.24875868271727,1.0292075710387627 +1494,407.60666262140745,379.2986967072717,1.074632383817503 +1495,834.9789963883585,778.7122326501124,1.0722561703528903 +1496,1441.6069075515152,1374.6914360607875,1.0486767209974592 +1497,231.66811544617056,226.9838520536091,1.020636989592789 +1498,1676.6650233934008,1598.7133444554654,1.0487590093673025 +1499,227.17085991597327,222.5375654299163,1.0208202802843915 +1500,74.39789607425679,70.78359499049836,1.0510612817029652 +1501,371.43844757897267,351.9377830260977,1.0554094089733723 +1502,556.6541755276368,523.1782442175428,1.0639857098036636 +1503,191.62080710088867,186.37531273118623,1.0281447917797362 +1504,186.4695831054165,179.86888989814508,1.0366972477064222 +1505,186.93593573447615,180.31379134726367,1.0367256677247665 +1506,368.46151925649076,348.71222873492945,1.0566349238545734 +1507,223.43584247970247,213.96109377080901,1.0442825774626232 +1508,1250.2134591524896,1195.6131505557976,1.045667203117756 +1509,1224.7558204974446,1172.9065183725163,1.0442058265622673 +1510,456.8259672311092,437.60044586648377,1.0439339620108417 +1511,1163.8181949264633,1094.2418270672013,1.0635840872997346 +1512,2065.5962278875704,1938.8186899668724,1.0653890632356469 +1513,703.7605977149535,644.233270714508,1.0924002682047527 +1514,1187.791775564841,1091.5880290782889,1.0881319178333095 +1515,1998.9270398809444,1873.5205092817107,1.0669362998579148 +1516,428.1676501909557,396.8645312304936,1.0788760811237166 +1517,430.0064707258853,398.60197357116726,1.0787866072848509 +1518,310.08642667962516,294.70202988257483,1.0522032264358012 +1519,397.88136071969615,370.7887806771641,1.073067421277023 +1520,143.8175819806557,136.38006960929596,1.0545351853292555 +1521,143.0266105752594,135.68498180150632,1.0541078951869056 +1522,182.66230391641113,181.15207826813452,1.0083367834513124 +1523,426.22762893119904,395.1231671817396,1.0787209263666202 +1524,839.131711915463,781.818184662823,1.0733079997075763 +1525,772.5419685644542,731.9001674987493,1.0555291593996996 +1526,1423.389376142532,1335.836094506218,1.0655419343708312 +1527,358.94100624958526,336.8553396529452,1.0655642467160962 +1528,357.312018847549,335.3536238190643,1.0654783293480439 +1529,357.9239880279381,335.92528014713236,1.0654869078956204 +1530,440.2114982723038,413.1541530380347,1.0654897089507853 +1531,1303.6681270511206,1211.936782394944,1.0756898758983975 +1532,1218.5114442164984,1134.0950881439196,1.074434989583401 +1533,154.81052092569695,146.09231311564758,1.0596760200733353 +1534,328.3242621056622,301.5847244375998,1.0886634351853424 +1535,143.2245781809377,135.85522340205492,1.0542441769579491 +1536,156.19955894022775,147.36197045301117,1.0599719755378447 +1537,356.2775601084585,342.08258741526464,1.0414957475633277 +1538,394.2944410878263,379.02044962556465,1.0402985946466765 +1539,395.0683710581856,379.65619670861514,1.040595081769202 +1540,267.66715537743636,256.0339116296585,1.0454363395603814 +1541,395.747713699072,380.0202270202986,1.041385919907714 +1542,130.0112008093732,123.67471552926732,1.0512350908024233 +1543,117.61258784021263,111.07604021835846,1.0588475031069196 +1544,318.5880724425834,305.68612933813597,1.0422065048629534 +1545,109.8472150229051,104.02916607704245,1.0559270939608791 +1546,116.62985848712219,110.31762499733914,1.057218721758516 +1547,117.66174922534317,113.29407203911317,1.0385516833106865 +1548,129.2152958399479,122.90663349595366,1.0513289003575381 +1549,695.6647559117977,669.0138572792083,1.0398360935915065 +1550,216.61083981115837,208.51409174244196,1.038830699647473 +1551,130.06223296523353,124.47043745617106,1.0449246875269598 +1552,1577.2442887746122,1519.6144785734748,1.0379239675679037 +1553,1103.1271759699591,1060.6533912019981,1.040044924308239 +1554,445.1525114554199,428.65271348510504,1.0384922279767355 +1555,642.2883662493829,614.8668248401684,1.044597529581048 +1556,855.2301160463898,833.7531909614235,1.0257593317996188 +1557,879.8781946001448,858.2751947061827,1.0251702484555172 +1558,949.8546048428775,927.532451060124,1.024066170145573 +1559,944.9398323836732,922.7579572268634,1.0240386712280134 +1560,2837.461951874497,2688.0333576854423,1.0555903049944744 +1561,1022.9408695541076,979.5310874343714,1.0443169008892172 +1562,1093.6571977486558,1051.4702675248677,1.0401218479749266 +1563,865.0828912909371,825.8025955896484,1.0475662051815682 +1564,465.6034443795842,441.3386354279225,1.0549800244162502 +1565,1059.1271152330878,994.5066184408782,1.0649774426775733 +1566,997.0998707745598,961.2122427833241,1.037335799934589 +1567,547.3127402289418,542.5248656056315,1.0088251708388805 +1568,936.5327457025043,906.7567619027227,1.0328378955093758 +1569,885.2577170966719,855.5375774920332,1.034738555484333 +1570,1215.718108794289,1162.4634512100656,1.0458118984547755 +1571,2039.4440444986537,1945.3548128924108,1.0483661031821483 +1572,2323.5787147802503,2244.4512779457505,1.035254691252163 +1573,1167.8648878984602,1100.214735865869,1.0614881348406504 +1574,241.76215477338607,236.44806234236063,1.0224746710900552 +1575,2019.225787233882,1961.618438771546,1.0293672547747932 +1576,747.1310312801322,701.4086343793201,1.0651865327282035 +1577,418.75596766670026,383.39038672804827,1.092244308054959 +1578,512.1770053162893,501.1420291884957,1.0220196580711114 +1579,688.114345918301,662.4654536966888,1.0387173279428932 +1580,751.4720864055827,725.0269480570729,1.0364746971397096 +1581,347.99996056158693,331.98657351919417,1.0482350441846013 +1582,360.7672974877322,345.4811430268578,1.0442459878618788 +1583,147.9680266264216,138.279830575897,1.0700622499331678 +1584,220.10559234588553,212.3223440603195,1.0366576976154467 +1585,159.49028226709328,148.96684846734738,1.0706427900436692 +1586,148.23888470842647,138.45369831910526,1.0706747924260465 +1587,221.83672309618814,214.01868880204933,1.036529680365297 +1588,208.9491697307606,200.59759180175462,1.0416334904820772 +1589,176.41490091462447,166.57847646355913,1.0590497923854956 +1590,221.95006435608735,214.12533387006943,1.0365427590682286 +1591,651.2415204879494,626.04188816882,1.0402523102612808 +1592,680.0611150556517,658.11642770117,1.0333446886155624 +1593,1238.7492411862806,1186.6462931880876,1.0439077324871688 +1594,415.6951801954124,400.964890584969,1.0367371058073271 +1595,930.1909860410265,891.6512593351142,1.0432228702672954 +1596,977.8132149828646,937.3381607244048,1.043180845456222 +1597,710.0310014202673,691.9034182354102,1.0261995861085478 +1598,695.856914379242,661.390496495075,1.052112054930961 +1599,99.40772609761765,91.95864988636404,1.0810046278458705 +1600,1186.8791065018681,1136.5873620062293,1.0442480236687368 +1601,1025.2628795248402,994.9161622583221,1.0305017833840746 +1602,261.1010570556513,261.0749956075751,1.0000998236082148 +1603,506.4490810632138,484.6494394111292,1.0449802266945198 +1604,288.5237807952873,285.87751887380466,1.0092566282648157 +1605,320.06332213626246,301.5396389389849,1.0614303421681344 +1606,500.53052521663795,482.9527458651736,1.0363964787486095 +1607,134.53353162851403,128.60234894640234,1.046120329299612 +1608,126.24613224468753,120.66574587384612,1.0462466487935658 +1609,134.92942006759776,128.96521123693515,1.0462466487935662 +1610,136.16588834870268,130.35846946673152,1.0445496092868232 +1611,468.74449457937305,448.03072226786793,1.0462329284176204 +1612,246.23637300755962,237.35708630268036,1.0374089808869507 +1613,1759.1105256418243,1730.8968203232032,1.0163000503480923 +1614,468.4256868369749,452.4063148333043,1.0354092581788412 +1615,517.2844227178207,489.57924451666497,1.0565897727721434 +1616,417.0011329960813,388.70953185566515,1.0727833994843259 +1617,384.84575825745446,360.1729278165235,1.068502734479532 +1618,84.16315671936333,78.5620141435204,1.071295811810661 +1619,404.7500695924648,392.7991086213576,1.0304251224323104 +1620,646.5969451142615,617.0633232894362,1.0478615738614763 +1621,735.7380990326961,689.8694460618412,1.0664888889234023 +1622,331.98400134042754,311.651526362043,1.0652410569450075 +1623,522.4926643772279,500.4893367685438,1.0439636291768986 +1624,989.3279081441983,914.5056934596017,1.081817111932395 +1625,630.759734639024,614.9048878152894,1.0257842263704648 +1626,570.249023144399,525.458642966822,1.0852405432417733 +1627,618.6542968985328,571.8727224280013,1.08180417186522 +1628,686.7025320646852,669.5909322061832,1.0255553040452958 +1629,687.7883887263773,670.6710313181134,1.0255227326199285 +1630,343.40106671518447,335.0661555161539,1.0248754195606269 +1631,629.4351375752876,613.8072629987201,1.0254605566252482 +1632,1067.0524320090058,996.8128339270569,1.0704641791230076 +1633,1438.292999812982,1306.359363867364,1.1009933710392215 +1634,868.2278719466811,830.0959053118321,1.045936820541868 +1635,412.122937420097,383.2427595207399,1.0753573999296762 +1636,523.4113964207227,482.66770353430434,1.0844135470181144 +1637,1352.7641321346914,1318.8546940783324,1.0257112767681025 +1638,1683.3820743284814,1589.2333735643394,1.0592415829734212 +1639,1780.2431677248214,1676.7511217917697,1.061721769312109 +1640,905.5627674130899,846.6143700155217,1.0696283921999663 +1641,715.5725987835849,698.7283164491544,1.0241070555434635 +1642,967.1257220785759,931.1882760399862,1.0385931040620688 +1643,862.2638706590529,835.6131606588268,1.0318935977255477 +1644,1885.6306571966788,1799.5631573771393,1.047826884800744 +1645,529.968181710619,511.72514924468885,1.0356500603749044 +1646,701.0760741597243,653.7057061289217,1.0724643636833426 +1647,864.2854452561675,812.2498965107856,1.0640634722994895 +1648,1179.239330323498,1141.8528074898588,1.032741980917686 +1649,973.0625187941398,952.9207103394444,1.0211369196158204 +1650,2016.8854718954178,1946.1480482724783,1.0363474010549867 +1651,515.767789453259,498.35438535747346,1.034941809698925 +1652,507.04523558559083,489.931636115372,1.0349305866547243 +1653,554.2418872868795,525.1097373691433,1.055478213113494 +1654,684.3053263158839,625.6873736814191,1.0936856888921516 +1655,500.56095858308464,445.3692046339924,1.1239235972645418 +1656,363.9487287370061,323.7313200073186,1.124230824279771 +1657,752.9136254978055,699.0507905401541,1.0770513898082166 +1658,641.1316938866742,580.6172991175657,1.1042242366203685 +1659,551.7347698434913,511.2784753903125,1.0791277090675375 +1660,446.09696257954414,413.5820844304879,1.078617714289607 +1661,1056.3302264258416,1004.5730052227669,1.0515216125995714 +1662,673.9958497762563,638.9106003206108,1.0549141764716994 +1663,983.2763597389918,939.7007878261663,1.0463717520271851 +1664,703.2473259894526,671.7544025903333,1.0468816032729824 +1665,804.9322050735145,747.2154024743156,1.0772425225819442 +1666,865.1990251640955,812.1687513010911,1.065294649391583 +1667,1097.8829398209855,998.2226176151091,1.0998377721033596 +1668,1025.128196377406,954.9537280358161,1.0734846791853752 +1669,266.21692975695487,259.22552759623983,1.0269703459591548 +1670,815.3666666776833,788.7505200064921,1.0337446961949033 +1671,262.2073058134987,255.3080893698947,1.0270231016206004 +1672,813.6291798413865,787.0896586835304,1.0337185489163274 +1673,278.1377942661367,228.8506637374871,1.2153680908052182 +1674,443.5055806589142,418.5742779329851,1.0595624338147234 +1675,489.3222407984855,462.76033244684004,1.0573988444757132 +1676,738.2792104685002,704.2612267191851,1.0483030762715542 +1677,752.6995068362311,718.1156456480336,1.0481591807639683 +1678,925.1907663032567,890.8716485550128,1.0385230777114856 +1679,922.1441680191075,887.9548609484575,1.038503429142931 +1680,713.4059612486622,681.5350269248881,1.0467634575842373 +1681,681.4719566770577,653.4200807289003,1.0429308446059158 +1682,240.52361256638437,216.21037029127532,1.1124517859266168 +1683,241.2126071520422,216.89134407363957,1.1121357017832165 +1684,115.2477435357605,102.58263825528948,1.123462463979064 +1685,115.46513324058297,102.77059182311925,1.1235230934479057 +1686,540.5247094749748,513.3781711685872,1.0528782481043064 +1687,633.219086801164,608.0092015908899,1.0414629994814406 +1688,116.07220635304637,103.35282394250734,1.1230675846613973 +1689,347.91060960884795,337.05551931561735,1.032205644682133 +1690,657.4650134703401,643.0032765549263,1.0224909225858019 +1691,225.18423197688534,218.01124391119654,1.0329019179791048 +1692,226.62371648542222,219.23809837368978,1.033687658151202 +1693,233.76309175886004,224.6136254066342,1.040734244575154 +1694,248.33446676219972,236.17454757864806,1.0514870010685733 +1695,277.43560316439635,275.99268719567743,1.0052280949302685 +1696,562.9864340110597,536.5086258775729,1.0493520641726437 +1697,575.8903743668407,541.606280227606,1.0633007691949714 +1698,322.36315111733154,300.65151669931714,1.0722152831835812 +1699,503.5243340221586,478.5089222825848,1.0522778376215958 +1700,446.8946561910919,436.3721202042927,1.024113676148405 +1701,290.1058670380254,265.18179190983443,1.0939886368090668 +1702,559.8982031801498,519.2169528309662,1.0783511596209912 +1703,234.19222419908556,212.68336687143307,1.10113088599286 +1704,579.6741521119579,537.7242680094402,1.0780137453304997 +1705,630.0398017992,577.3287562820059,1.0913016109861786 +1706,458.7546295361633,446.92143063976545,1.0264771346486086 +1707,301.8604510011718,289.0161769600068,1.0444413671797421 +1708,280.863936756843,274.60685687082434,1.0227855923093792 +1709,121.32826322041517,115.5859425961551,1.0496800951333944 +1710,440.53276491579436,419.16041914104665,1.0509884636019413 +1711,166.2101904076256,161.25753439538695,1.0307127107629912 +1712,112.41440784087182,109.53427817392628,1.0262943227906451 +1713,168.31385417217913,163.2698624501779,1.030893587134248 +1714,169.49067164529043,164.448808868602,1.0306591626377604 +1715,281.0330177309089,274.8096703064971,1.0226460277670393 +1716,393.6461452304461,376.90308893033983,1.0444227091574747 +1717,281.1446659217521,274.9190855398456,1.0226451370943623 +1718,415.5316887463385,396.8095093556325,1.0471817810543613 +1719,1264.2468692764696,1201.011684595028,1.052651598225511 +1720,349.71962768257043,333.3234710513177,1.0491899252685042 +1721,1065.2514088001074,1026.573219559826,1.0376769903045648 +1722,517.3323766424114,503.37584409252776,1.0277258686797817 +1723,545.7448934156088,520.9411334813059,1.047613364236658 +1724,334.0043936846144,317.23144931917955,1.0528728926511914 +1725,347.8770424074694,332.0081809400643,1.0477965977298307 +1726,522.8945127866995,508.5374964242138,1.0282319720048907 +1727,1199.8265031627755,1121.92312108177,1.0694373621660371 +1728,2335.186247850204,2221.1513858909357,1.0513404276194922 +1729,1458.9491775812835,1410.0904012954604,1.0346493928622846 +1730,494.4941124846914,468.41477279606045,1.0556757412516224 +1731,775.5716024192492,743.8136051736859,1.0426961768710155 +1732,412.26181565938856,390.53744499156306,1.0556268571590999 +1733,855.0256846138493,803.5231581387374,1.064095883178291 +1734,2568.0053909724,2412.0801894801857,1.0646434567856622 +1735,807.4718212604766,735.9394005200248,1.0971987920335642 +1736,1095.1391392301452,1001.0626801853084,1.093976591982654 +1737,658.4675603124896,627.9850972058476,1.0485401058755541 +1738,566.1965049649586,526.2333307151374,1.075941929021319 +1739,581.1062972160222,524.2754837152621,1.108398762227122 +1740,1975.5792717995216,1832.6072293242821,1.0780156490640693 +1741,3239.217303921733,3033.994788334724,1.0676410244262977 +1742,1619.267074313892,1496.6019907139219,1.0819623950529795 +1743,602.3479203308261,547.5639326035446,1.1000503949681197 +1744,2423.274804418977,2296.860552002698,1.055037843854323 +1745,913.3500425372237,854.9970521913217,1.0682493468209577 +1746,871.808946129992,819.8397195732089,1.0633894959173693 +1747,704.8090657407753,647.1193287556292,1.0891485301421608 +1748,1245.4308297726661,1121.9674725848,1.1100418329449695 +1749,1110.1107069841498,1016.159639499752,1.0924569957636276 +1750,465.8093944040363,442.936472273025,1.0516392836508448 +1751,1197.7021408582173,1137.5244273908586,1.0529023483085882 +1752,3521.965845647765,3390.722325463933,1.0387066552746618 +1753,442.0864100937076,421.01051562215235,1.0500602566670103 +1754,730.2074440561796,714.3087427298792,1.0222574642801379 +1755,1870.5519853068606,1806.186391391185,1.035636185845747 +1756,759.559226646561,708.4800695699377,1.0720968158040487 +1757,808.1762021712823,750.3491394238305,1.0770668742178546 +1758,731.3784474661687,682.1680675114951,1.072138205082202 +1759,734.6572592725236,684.9885507574905,1.0725102754784839 +1760,1067.0700110971402,973.7225899744608,1.0958665456504688 +1761,3182.2077951562837,3032.7787935987044,1.0492713157560254 +1762,1293.6125421133222,1219.6194549192853,1.0606689954768995 +1763,468.10427993245213,446.489465087633,1.0484105819620555 +1764,801.8003395611719,763.8727192628384,1.0496517539400214 +1765,514.9421745085543,491.0322272796893,1.0486932341718704 +1766,833.8790916083493,797.2649078150557,1.045924740239272 +1767,3387.4706982253024,3259.024525110927,1.0394124598095817 +1768,3456.3330750185573,3342.593833326904,1.0340272397315016 +1769,3338.8081090067767,3241.103462729514,1.0301454882267105 +1770,478.0002170093043,467.19730522096114,1.023122804150666 +1771,821.236198899038,797.8487844317455,1.0293130915577566 +1772,710.9412215146239,691.6121911159884,1.0279477872815488 +1773,509.93597264268186,497.94336446911433,1.024084281525377 +1774,918.5495617795763,884.6969981519302,1.038264585161204 +1775,1344.5102503225535,1297.614446903309,1.0361400133384449 +1776,969.1510651963104,939.9553504882483,1.031060746335341 +1777,260.0361387814345,251.87289990194054,1.032410151638672 +1778,801.0220558304098,770.1270071505121,1.0401168228007094 +1779,748.0270694327841,719.7497989940937,1.0392876392299242 +1780,247.65855210755328,240.44766209654327,1.0299894369865603 +1781,1742.4924390042427,1681.2564514774062,1.0364227524438792 +1782,2609.37144654024,2478.6191558659575,1.0527520697824193 +1783,951.1370110986264,914.0249917571283,1.0406028496771775 +1784,934.1213134458653,897.8397924222314,1.0404097939630768 +1785,922.3840757771723,886.3052825351169,1.0407069595014242 +1786,875.644744366778,841.0502306183778,1.0411325179983184 +1787,766.6456572658711,727.5998058865426,1.0536639112097523 +1788,794.6738446315929,753.838283234163,1.0541701878315795 +1789,579.0994545959085,551.738632568702,1.049590187114185 +1790,797.9317916465861,756.9193341493758,1.054183392664028 +1791,1227.6884498190282,1179.3870627588954,1.0409546522811122 +1792,1213.0087366083255,1164.973609404981,1.041232802885448 +1793,758.3946762789025,729.7795526941334,1.0392106403627375 +1794,809.9640043754074,784.1061435757757,1.0329775005737254 +1795,1287.6724343341207,1238.5950610052184,1.0396234208209034 +1796,774.0497276446804,749.3122115901481,1.0330136299287527 +1797,1308.502081960732,1258.7556918384435,1.0395202901125578 +1798,784.9038904349659,759.5726539178802,1.0333493266067795 +1799,1465.1745845944447,1412.4189026131178,1.0373512998755 +1800,2859.989689088638,2753.070514833239,1.0388363369842255 +1801,1982.375171285536,1909.100476380864,1.0383817906973556 +1802,133.5449481324279,123.76733277032535,1.078999968273105 +1803,266.19966775488854,259.08109745468215,1.0274762241249635 +1804,268.8664323903578,255.1202806688865,1.0538810622402537 +1805,391.8905225893318,374.9105653418761,1.0452906874789507 +1806,748.2647041101816,695.297680485945,1.0761789160395556 +1807,626.1401824175939,594.2232360567933,1.0537120469616743 +1808,801.667534107944,785.9348510948698,1.0200177953569018 +1809,815.2073599717921,787.0808906223343,1.0357351698974913 +1810,200.87510722245204,198.6352586360386,1.0112761883353123 +1811,1116.301955133574,1078.4838658955164,1.035065975888898 +1812,1263.9251273944008,1236.2594604863084,1.0223785279646795 +1813,784.7196600835209,740.1792532633649,1.0601751624674463 +1814,1602.2300849823098,1516.5083236560286,1.0565257440325955 +1815,239.82396261046637,221.0634642519035,1.0848647623525212 +1816,816.551761284929,777.9233970238638,1.049655742980411 +1817,4207.48469171843,4004.751247690017,1.0506232301307983 +1818,1726.023008004711,1637.481772163829,1.0540715856176404 +1819,1144.358045483595,1054.3403247783883,1.0853782394447709 +1820,815.4526470521214,769.0449947673553,1.060344521582648 +1821,1657.8714851109867,1571.3517110342273,1.055060731133079 +1822,1225.3812530147559,1142.2763480574245,1.0727537649699752 +1823,1212.7549466852731,1147.626181474011,1.0567508534247718 +1824,801.8842160343528,753.4951125088295,1.0642195320476697 +1825,1611.5548788093804,1504.5364646167604,1.0711304888312427 +1826,1493.12754613103,1406.2936945727283,1.061746598092146 +1827,1052.7152469907878,992.565999442963,1.0605997460940444 +1828,1634.6237982585246,1535.5837628531751,1.0644966675222778 +1829,359.95429152023183,340.2328640744945,1.0579644988128463 +1830,404.8951580349478,378.8063426481016,1.0688711155269168 +1831,221.4512142053868,208.35101732786583,1.0628756079309476 +1832,471.9216399216774,444.58024474006487,1.0614993479919432 +1833,1063.7661883232902,1009.6559782922293,1.0535927198911703 +1834,1593.0095540271604,1506.845983471041,1.0571814050681148 +1835,391.802721763472,367.35798769085795,1.0665419968850247 +1836,370.1806450624109,348.1796509921481,1.063188626927422 +1837,457.22448892400166,430.11169627829645,1.0630366318337978 +1838,406.7544538209558,383.3179104313369,1.061141268779344 +1839,1328.6570054426695,1243.5732017843488,1.068418814056332 +1840,396.7188433536442,366.64768007847056,1.0820165104242245 +1841,735.5057860977242,675.4054969444439,1.0889840094952972 +1842,2085.5242455289576,1921.4591453639487,1.085385682313809 +1843,2230.519252483809,2042.561876402397,1.0920204074367945 +1844,403.5525766666266,381.7254728899081,1.0571801080275656 +1845,228.76197030517798,214.0653368820719,1.0686548959171396 +1846,623.1064557144939,573.8827116594788,1.0857731781336928 +1847,539.9684964108901,497.85342392118736,1.0845933169606357 +1848,1785.573450379329,1699.0230067544853,1.0509413017250275 +1849,3244.103252706746,2964.7295035799543,1.0942324582358842 +1850,2155.3179370536104,1996.6422192629423,1.0794712824660408 +1851,1985.4869984168824,1882.6860410421823,1.0546033460352175 +1852,962.6745781384329,905.9498444401231,1.0626135475892329 +1853,873.0527128311838,801.9031930960167,1.088725821704825 +1854,1969.6318564653661,1860.3643264646953,1.0587344792878903 +1855,1242.3881194927947,1186.9543925727112,1.0467024910703868 +1856,1711.0584808632566,1634.5934544523539,1.0467792319873943 +1857,345.64633432771706,338.38050786553066,1.0214723552134208 +1858,606.8072697976279,586.4502553958653,1.0347122611243835 +1859,428.369656282869,409.3691533261245,1.0464141052210834 +1860,423.83004263149843,404.61950063656116,1.0474780428642578 +1861,353.81638797450506,337.67966986370726,1.0477870584193323 +1862,368.8919605278371,352.8374347587918,1.0455011973999317 +1863,1111.352534189252,1062.0896976119836,1.0463829342173563 +1864,175.90289248924142,168.61056373122432,1.0432495366639158 +1865,173.0566903485451,165.94299978862728,1.042868277474669 +1866,175.17117583640868,167.9655970060828,1.0428991350536203 +1867,173.20454349988273,166.05736867240552,1.0430403955248564 +1868,916.3129709309213,862.4237804851824,1.0624857426999774 +1869,799.1407061069732,762.9708437871486,1.0474066114247416 +1870,867.6001218210945,828.2753202414241,1.047477934714037 +1871,340.1525189508618,321.66335664501855,1.0574798525349207 +1872,117.00520788893965,107.18658904511256,1.0916030534351144 +1873,563.8346078238981,537.9357776650402,1.0481448366778543 +1874,116.57647141687112,106.79383045881201,1.0916030534351144 +1875,994.085406372844,932.9604737706727,1.0655171728284774 +1876,1936.9744152704548,1834.099691013984,1.0560900395766362 +1877,1082.6891661763775,1034.8804512757597,1.0461973311426274 +1878,486.95128097662047,459.55555553315065,1.0596135224862788 +1879,710.3789388182402,668.6624813147448,1.0623879141857506 +1880,341.3847594307659,319.2497101366902,1.0693345948054214 +1881,1721.9474762804036,1651.1873460981635,1.042854089422045 +1882,690.6567767187903,650.5303676692371,1.061682607060022 +1883,1280.7691092138612,1232.641495386069,1.0390442914731817 +1884,1248.7010526584966,1201.015515142336,1.0397043476249423 +1885,564.0298132846651,540.8409786041611,1.042875513501864 +1886,349.90075214136726,340.70101774516843,1.0270023684023153 +1887,1442.0284316647083,1371.714911944403,1.051259572312031 +1888,1566.563330187955,1511.6663177634916,1.0363155623561708 +1889,220.57147550924708,206.4224688838627,1.0685439269372603 +1890,270.04057024253905,261.1062318920086,1.0342172543557888 +1891,49.72332199272184,44.53962360419581,1.1163839738429606 +1892,265.06329717579285,248.54587110757058,1.0664562480745197 +1893,409.8419103526135,384.4148365676317,1.0661448814307362 +1894,311.28126121535,288.2304899637312,1.0799733964804326 +1895,539.5591805423064,513.4955808238385,1.050757203551104 +1896,341.68868016618666,320.3598469671386,1.066577735633754 +1897,1109.1737575858217,1046.7670678143002,1.0596185070111441 +1898,499.99169274011007,471.1413680683391,1.0612349639133922 +1899,260.76237340583316,244.5992895346338,1.0660798479911804 +1900,250.77130963992346,235.18374646521676,1.0662782331219138 +1901,501.4243446233241,472.48493684628585,1.061249376477907 +1902,739.0310224940034,722.3717923685746,1.0230618502846092 +1903,1855.9862002763225,1793.489769195591,1.0348462713053346 +1904,1311.5377207110248,1262.4725853817606,1.0388643174492596 +1905,45.91890806076547,45.5721798234393,1.0076083311939323 +1906,169.32146934039835,164.5248629674299,1.029154294897775 +1907,1573.714161400757,1498.623690547009,1.0501062884080923 +1908,1336.3082806198604,1256.805678257907,1.0632576727948542 +1909,814.6076438602876,793.7691200176504,1.0262526260056246 +1910,1004.3908536441735,943.1947372669853,1.0648817407044817 +1911,838.8797591519361,786.4639116758788,1.0666474922725497 +1912,3317.135249226867,3181.177537953211,1.042738171526614 +1913,4870.760268993229,4672.179179725656,1.0425028839067843 +1914,2524.1505017486224,2434.1430117671,1.0369770755236687 +1915,470.03812653062715,456.1020013663853,1.0305548432642089 +1916,818.9465798728331,787.3114787411935,1.0401811760476551 +1917,918.3928311905576,883.3244504888008,1.0397004528543856 +1918,342.64010751399087,330.09899002311374,1.0379919898876364 +1919,6126.415287768368,5875.8554747340295,1.042642269557469 +1920,1831.3843602740556,1743.4334495590635,1.0504469561125123 +1921,842.3244726185113,810.6826804819973,1.039031044943135 +1922,408.653685159134,387.9837376816968,1.0532752934464353 +1923,325.9369701405026,316.55305336103123,1.0296440570698553 +1924,545.0942412200346,525.3423051964869,1.0375982208707906 +1925,421.91562770463486,399.54784939039223,1.0559827273463496 +1926,482.9397248078401,461.22773148165743,1.0470743449367943 +1927,422.8794443332698,400.4215626857611,1.0560855951334793 +1928,554.5517476223364,532.350503492524,1.0417041854645754 +1929,2345.561607170538,2261.3520764522427,1.0372385758039098 +1930,2176.460586832919,2094.9266176197707,1.0389197256492861 +1931,2208.9495446270616,2126.6340945550896,1.0387069173219445 +1932,2427.079423093013,2341.6645004583247,1.0364761572881043 +1933,480.0522423790589,459.7554143549366,1.0441470124992436 +1934,1533.6184009094834,1457.3564938651389,1.0523289307491854 +1935,1164.8233211895756,1106.9481683572649,1.0522835255404945 +1936,454.65790322760483,437.6727969294147,1.0388077724212077 +1937,756.2610922158327,704.1313443029791,1.0740341249322696 +1938,949.968877618251,879.0878158498998,1.0806302402221597 +1939,692.7358320650354,666.7702089931738,1.038942386329872 +1940,402.6658090341081,382.1295384586891,1.0537416465061864 +1941,438.03647763431115,411.07148508163624,1.0655968451504727 +1942,1209.6628580180538,1174.6713887678877,1.0297883046992986 +1943,840.7046440797124,815.366282212107,1.0310760481766081 +1944,369.15194073324767,328.9415208570353,1.1222418494674884 +1945,423.3437638293442,403.78805672349876,1.0484306228978848 +1946,686.0314698287879,654.365739726088,1.0483914853426692 +1947,860.119657073753,814.8474965227113,1.0555590595101987 +1948,524.3622807301792,484.78073096893723,1.0816483561178882 +1949,547.2087702209009,504.6389282120082,1.0843570315903341 +1950,1241.8443394229603,1165.899650337791,1.065138272460384 +1951,310.4915278601796,301.5157988103613,1.0297686857048032 +1952,180.42984027787827,172.04267751954796,1.048750477958455 +1953,688.4319839164167,643.6768691779611,1.0695304070746123 +1954,2277.2913601078017,2189.0990287244927,1.0402870451387005 +1955,3333.415432064004,3204.2784680151685,1.040301417413583 +1956,3121.8293227077534,2963.049453638037,1.0535866415846573 +1957,3105.0007913436034,2938.38108965216,1.0567045922934277 +1958,1664.6262402670986,1563.6338646847325,1.0645882503975626 +1959,2272.286358962395,2184.0148146820497,1.0404170995942605 +1960,3035.263344205639,2915.7971002152703,1.0409720703753866 +1961,3042.333462491256,2878.409691875835,1.0569494228281984 +1962,3268.0508610905813,3092.720232936015,1.0566913962302111 +1963,1730.914433143678,1625.7970884948463,1.0646558819625818 +1964,510.4492017169913,482.75588054052906,1.057365062328096 +1965,457.54840645522927,425.25702954599285,1.075933787487795 +1966,518.6808085079155,482.4254503347757,1.0751522502554138 +1967,722.8922500813503,676.5178803983621,1.0685486238082593 +1968,1380.9054606261889,1244.3155895528002,1.1097710839759536 +1969,1372.0702031232302,1315.4545289335579,1.0430388682728324 +1970,379.735743340297,364.67948433122217,1.0412862792012723 +1971,108.77131327941599,101.6444793965006,1.0701153070509086 +1972,112.39771322468395,104.89911706413052,1.0714838825189457 +1973,194.10447984198336,183.6674462855987,1.0568257128166052 +1974,178.92791193012016,168.0297482284848,1.0648585373514705 +1975,453.2907629576567,423.58277424718096,1.0701350255880322 +1976,346.17290491486625,318.93589388699365,1.0853996415891756 +1977,1015.2790502723382,936.4997564918655,1.0841209976130486 +1978,811.944014108172,759.5836094507538,1.0689330364767606 +1979,1995.4587685441327,1865.140456861477,1.069870508252202 +1980,878.1589883538561,819.8393115323892,1.0711354969212927 +1981,887.1126852363923,827.7950146669631,1.0716574387601183 +1982,522.42363666261,491.9883063919739,1.0618618976817467 +1983,435.01724160168015,407.9823769480537,1.0662647853955434 +1984,734.4373710345579,694.435676087063,1.0576031680470284 +1985,172.06924166718537,161.5006614911127,1.0654398568928105 +1986,499.2285723401918,474.0408211093098,1.053134139739147 +1987,255.4415958479544,240.55708630306347,1.0618751655735421 +1988,1744.9488498593453,1673.0046871625295,1.0430029654123896 +1989,3834.2651355999787,3702.7770012783044,1.0355106813821844 +1990,1914.0624961034762,1838.1348585206995,1.0413068917282173 +1991,2228.389429924768,2115.3150298145842,1.0534551111850678 +1992,2950.7649377764424,2801.0988283355505,1.0534312134676895 +1993,2765.240423139063,2624.385555754908,1.0536715602154112 +1994,2774.0400491954056,2653.763268299905,1.0453231010965625 +1995,245.13479795512706,236.79223930886138,1.0352315543390085 +1996,255.4630758188688,246.79211986759316,1.035134654850113 +1997,1294.1107030151693,1252.4665953127642,1.0332496753671947 +1998,1292.9797282901666,1251.3720875997672,1.033249615444281 +1999,308.0973330146478,297.14051980216635,1.0368741806730917 +2000,258.4059016152079,249.42296430024558,1.03601487673825 +2001,325.3960898533892,313.8174265541244,1.0368961769472282 +2002,319.9509974417451,308.4976393952838,1.0371262420967373 +2003,188.39384952383955,160.61266575110804,1.1729700683492943 +2004,441.09757315122516,431.9689725618993,1.0211325376801634 +2005,1172.1493918048677,1108.875432685296,1.0570613770081867 +2006,1301.6593535799004,1232.5981026357128,1.0560290096151463 +2007,857.8176778867917,808.4211475150959,1.061102471803873 +2008,528.7252613919202,503.4535001967904,1.050196812983228 +2009,384.99141097790425,368.2432556308439,1.0454812276693806 +2010,1178.1544354948132,1107.9101106785115,1.0634025487620853 +2011,620.4710672263524,581.2295377316832,1.0675146855884405 +2012,886.477927716298,833.2095137451093,1.063931595946088 +2013,177.89006773969822,163.88087874384686,1.0854839753315477 +2014,278.61839368526097,258.538322065879,1.077667679819881 +2015,945.9572116383475,919.2822626689999,1.029017147455778 +2016,491.9838735567481,476.2524338913475,1.0330317255008288 +2017,587.8027741925456,559.955016985027,1.0497321326942648 +2018,906.1287564108123,856.1028952293285,1.0584344025236396 +2019,662.088208253209,635.0631471261468,1.0425549195373072 +2020,759.8767991819583,710.9691214629933,1.0687901573254341 +2021,1043.586540175075,985.0970809422789,1.059374309765337 +2022,906.2081220818358,826.5522079220467,1.0963713040704883 +2023,1373.648969306262,1275.561985044208,1.0768970739267165 +2024,2664.773866935898,2586.423964551888,1.0302927530280537 +2025,2512.8976528012713,2421.2231012945,1.0378629096417253 +2026,2943.659944201912,2845.987748854036,1.0343192606458704 +2027,1697.3284515111795,1605.1616938810237,1.0574189864993049 +2028,3529.7561792756087,3403.9866223626427,1.0369477236152214 +2029,1381.0431156786087,1315.2882223251424,1.0499927637436197 +2030,1625.121385240347,1535.347543551442,1.0584713487613675 +2031,1214.6967248471328,1145.6468266610452,1.060271539691976 +2032,897.9844266196139,858.6990036686406,1.0457499342413736 +2033,3660.5260426508426,3530.974954827717,1.036689891455049 +2034,4402.936396565676,4233.415658509561,1.0400434901107247 +2035,4302.120368764673,4148.919274552885,1.036925542309641 +2036,3698.7817557269686,3564.9682132319585,1.0375356902197161 +2037,1750.6036197841283,1687.6594354041338,1.037296733606044 +2038,994.18735532437,961.6461760055166,1.033839035739759 +2039,1475.2720708499432,1423.3925366406572,1.0364478054182626 +2040,1049.6133067576945,1014.8572190551954,1.0342472685318789 +2041,3836.03223741874,3689.559644101397,1.0396992073434868 +2042,1942.4054071258527,1874.994494067275,1.0359525925392712 +2043,4347.358653906917,4178.882974940037,1.040315960025011 +2044,4466.353609190482,4306.328010660348,1.0371605688498389 +2045,6764.664218956403,6520.551843564242,1.037437379726242 +2046,3772.0604601505465,3632.9501131211823,1.0382912901905637 +2047,2564.5096859163477,2468.0482323518754,1.039084103908517 +2048,1632.1754326953628,1572.6751342011069,1.0378338139901226 +2049,3904.319195183272,3753.6758276632886,1.0401322262326953 +2050,4503.482371956956,4328.854121519246,1.0403405255838056 +2051,1073.8734345174662,1025.3825500567332,1.0472905302104567 +2052,323.67103911593904,314.917473404426,1.027796379847972 +2053,347.9396929280354,341.7215687411787,1.0181964638924104 +2054,345.53227096918397,339.4184008778342,1.0180127832655435 +2055,311.332009230639,303.0865870399302,1.0272048402776153 +2056,1330.915647516842,1310.0816513054374,1.0159028226909708 +2057,2087.8111781897205,1991.5506148634097,1.0483344799815257 +2058,2027.4015036175513,1925.9790894849912,1.0526601844673613 +2059,2988.3767790968645,2849.343385705826,1.0487948887061211 +2060,1122.9595521975718,1078.4442897115312,1.0412772944423008 +2061,1516.068861835419,1451.7175979181416,1.0443276736533065 +2062,948.4559312878648,902.6853992137479,1.0507048547744138 +2063,859.2501396089435,818.2470518731683,1.0501108896657911 +2064,633.9234797999893,608.7728104768619,1.041313719815158 +2065,3152.617430506149,3048.714557327859,1.034080879408192 +2066,580.4744500052456,540.9741219658781,1.0730170380346935 +2067,581.1920437729817,552.5986054081732,1.051743594871522 +2068,462.7281562577168,430.9582453435419,1.0737192321006628 +2069,165.5316986900603,160.25269069768459,1.0329417744525395 +2070,117.44301422078132,112.9219830904809,1.0400367670365642 +2071,460.62468078281614,429.0010116294849,1.0737146726839042 +2072,732.7692400653641,712.5776353437135,1.028336006801436 +2073,161.7915957359013,156.4096698000605,1.0344091637219142 +2074,161.7390602326158,156.3697442267519,1.034337307593711 +2075,58.45213105750841,55.35968412002281,1.055860993187407 +2076,57.3452947824548,54.31096574595294,1.0558695466896197 +2077,599.7520772132152,591.4594436092741,1.0140206292984972 +2078,633.1014061006241,602.5994374052437,1.0506173202330225 +2079,592.1094295695297,555.5014094210463,1.0659008591654824 +2080,354.32199133606184,334.75401401315116,1.0584547951742915 +2081,356.68657411659416,336.9521210715384,1.058567528770255 +2082,90.76110725165708,82.75952242393663,1.0966847631953727 +2083,88.49031175628932,80.6107583873167,1.097748160749377 +2084,671.639077922477,638.1879946757658,1.0524157200163349 +2085,276.9217352059233,265.0388791685705,1.0448343883532465 +2086,188.5236506964379,178.84052627092728,1.0541439047816352 +2087,183.6321359136567,174.16444375253238,1.054360648804855 +2088,58.52457946036846,55.4245254216094,1.0559328927974976 +2089,1567.8068817414344,1505.1277123917575,1.0416437547682085 +2090,95.5109109736468,88.05046290794529,1.0847292316168882 +2091,143.53721578114713,133.80784099750852,1.072711544488785 +2092,130.13522348673746,121.35815252643317,1.072323702838114 +2093,86.51929380349296,79.81047762442473,1.0840593413140418 +2094,410.69149599479215,395.98102778228525,1.0371494268169708 +2095,406.75305412898194,392.1630362859399,1.0372039598153355 +2096,208.15287732379466,204.25612388666792,1.0190777802054487 +2097,236.5505309961547,235.21672475772968,1.0056705416666218 +2098,745.849131158833,712.2169728173224,1.0472217872153082 +2099,711.5972885549944,694.4480838068816,1.0246947254200816 +2100,1677.912656838802,1607.8959451443905,1.043545549017554 +2101,2519.41447680543,2415.35158525792,1.0430839519110415 +2102,366.35589766159825,337.81070985590986,1.084500541199135 +2103,787.1785775485291,759.7231679831851,1.0361387025200628 +2104,448.92270073289006,433.8354551452682,1.0347764236617543 +2105,515.8536188149169,496.6184793083737,1.0387322266648866 +2106,1559.1489180873416,1495.6546569397035,1.0424524878473986 +2107,1371.3150679494365,1310.9362854284157,1.046057755203022 +2108,2864.699000576037,2738.5163069929868,1.0460770283751222 +2109,5254.73883849958,4997.134726352279,1.0515503636091361 +2110,1910.4341927192463,1810.9117592718746,1.0549570860854023 +2111,1898.7149367641991,1804.207737731975,1.0523815506694516 +2112,494.02245533670623,461.5005499631301,1.0704699168314629 +2113,492.1548921056606,459.7607886668513,1.070458604207508 +2114,493.07192322886686,460.6185782854743,1.0704560051923897 +2115,491.61150470874725,459.2535371704164,1.070457742661487 +2116,123.58697651016138,115.15228844365454,1.0732481150006328 +2117,134.1814251798062,125.0221491467217,1.0732612268753714 +2118,130.84624049218604,121.91388374516782,1.0732677564902222 +2119,143.50752252611846,133.71115635676722,1.0732651368537465 +2120,157.09156978996194,150.49866125515996,1.0438070909057733 +2121,167.96556405373278,160.91815407542447,1.043794996399257 +2122,159.06620846257255,152.39585580792868,1.0437699084353764 +2123,168.85577926979613,161.77509527768896,1.0437686899825531 +2124,158.47259523282645,151.82731029462744,1.043768706205119 +2125,169.94134890708332,162.8407165527197,1.0436047722257769 +2126,158.33488375931043,151.69562591032437,1.0437669696086747 +2127,168.67098651070464,161.59804427313944,1.043768736616702 +2128,158.22979321446837,151.59498852882206,1.0437666492146926 +2129,167.09068852649466,160.08401350293988,1.043768736616702 +2130,160.18169065633688,153.46490558473786,1.0437675639652366 +2131,169.98531111036743,162.86311798144615,1.0437311603584347 +2132,486.37673566539627,452.4394531398521,1.0750095560633035 +2133,474.3847899349564,437.8018358341433,1.0835605315156152 +2134,470.7993195986682,435.7161263435343,1.0805184640503138 +2135,481.0409481911438,443.943726444246,1.0835628921801124 +2136,269.201297691135,248.80241620113628,1.0819882772903133 +2137,424.3664469279532,391.4025482004218,1.0842199389837694 +2138,303.44584019570885,280.39058120701634,1.0822255116040096 +2139,469.2407999959037,432.7387557529842,1.0843512252083924 +2140,221.70089995041405,213.66674453851428,1.0376013376777573 +2141,253.50548615355206,244.50452624602457,1.0368130604603638 +2142,491.9732118204364,472.197230206293,1.0418807658094558 +2143,1178.5006776202817,1133.1732258205243,1.0400004613301166 +2144,424.2723386682712,414.6977490786561,1.0230881156478113 +2145,459.75199490749236,449.2922821148541,1.0232804194708254 +2146,433.7162242274991,423.8773171449295,1.0232116857510578 +2147,465.16947021183887,454.4637353812379,1.023556851729039 +2148,976.7739661629628,943.0569205635506,1.0357529273834962 +2149,933.8230593359801,902.2320036201069,1.0350143373202432 +2150,153.7287115682934,148.94636089663308,1.0321078718732792 +2151,169.90353224845765,164.65233175917103,1.0318926579003285 +2152,152.19416297095486,147.49379175335008,1.0318682648383268 +2153,170.75212673104983,165.47868898129482,1.03186777573728 +2154,171.16943849052942,165.88134035929926,1.0318788003507575 +2155,182.28525391193867,176.64955046355695,1.0319032991229964 +2156,170.52392289731912,165.25753289996683,1.0318677757372798 +2157,170.2160002987999,164.94514069908078,1.0319552281284543 +2158,799.8534352680547,771.6585996630196,1.0365379659053209 +2159,335.17736669614834,320.59314705236415,1.0454913642973225 +2160,311.46741617522804,309.94523010726067,1.0049111453253874 +2161,152.99642104736682,139.9427596493613,1.0932785764030422 +2162,60.53015352002237,52.47467553624364,1.1535117254458278 +2163,58.89715313039946,50.91942447308113,1.1566735826233818 +2164,2474.3117860743837,2354.7895836553707,1.0507570626473883 +2165,98.28563963342904,93.88444923480708,1.0468788008503356 +2166,594.3685622081514,552.2721596728198,1.0762240170865585 +2167,647.62932967384,615.0321172274912,1.0530008296043043 +2168,740.9602963300638,691.1982386144458,1.0719939012219843 +2169,294.1014806426806,263.21428261828675,1.1173462082571957 +2170,1022.6955867957469,956.2668820031597,1.0694667001887947 +2171,755.5265111867932,705.8780896256818,1.0703356886844857 +2172,1007.542659275699,935.0218951724493,1.0775604982917266 +2173,4786.268832165345,4511.955030299119,1.0607971045863993 +2174,1197.1830182482197,1128.569525512503,1.0607968682341995 +2175,1169.4026994586845,1102.3813648745686,1.0607968682341993 +2176,700.8518119455503,649.4442931789509,1.079156163671815 +2177,762.2487584195887,708.5736250632123,1.0757509614496137 +2178,2101.7564708487193,1923.2623592986752,1.092807988825369 +2179,3435.3532662570174,3228.3061657963835,1.064134902276085 +2180,948.9407228886071,886.8552677442315,1.0700062991138268 +2181,788.3919764942957,748.9044767254262,1.0527270179256079 +2182,1116.5895134254613,1048.152177387705,1.065293320487414 +2183,1052.077517157576,994.4707784296351,1.0579270301123453 +2184,682.7833461285267,654.1412477373048,1.0437858008347523 +2185,523.3331931147222,497.9298776373397,1.051017857369637 +2186,2401.0713963364947,2284.9152582361476,1.0508360814177478 +2187,980.4230639137512,931.382501984222,1.0526535143456668 +2188,1490.4660959308667,1418.5614061485924,1.0506884576660633 +2189,752.9521077614485,718.777466779465,1.0475455096486335 +2190,172.32123712775112,164.28987908537138,1.0488852879257786 +2191,243.95371224663123,229.5962248453258,1.0625336388304196 +2192,127.85964478560201,113.54613075314815,1.1260590205717513 +2193,182.0000571877806,172.68572014955998,1.0539380849218665 +2194,1696.950443770196,1638.387677905467,1.0357441444747657 +2195,361.84296360626297,340.1797079301192,1.0636817986821068 +2196,305.0858960561415,293.3814638550257,1.0398949274003881 +2197,470.90322400672864,453.08177516471886,1.0393338461595167 +2198,364.796437513294,342.943314666921,1.0637222593698832 +2199,1085.2624646077059,1030.5801845085616,1.0530597045442125 +2200,323.3839830470826,298.9304408487857,1.0818034527660125 +2201,167.80135024986197,150.3637562480876,1.1159693960624646 +2202,246.9794444451864,230.64949585026972,1.0707998451707763 +2203,749.4383902414255,715.0106506944207,1.048149967435546 +2204,242.72038891305937,227.5496768939334,1.0666698904002285 +2205,702.7821667737461,670.7393089031576,1.04777244667975 +2206,256.30814666603203,241.95354416847317,1.0593279282057704 +2207,1235.382267072337,1138.90201471144,1.0847133915952742 +2208,857.0695490839408,797.4211259764813,1.074801658953313 +2209,1270.4357127925157,1208.3033699768007,1.0514211450199862 +2210,495.1885823989764,478.4240119236706,1.0350412396900774 +2211,118.87362421918266,110.01616202665602,1.0805105543527374 +2212,153.5712538709248,140.3061571846809,1.094543938430182 +2213,295.9455271399512,285.2697834044007,1.0374233247144038 +2214,1426.4150313752011,1347.8960604032366,1.0582529864717276 +2215,559.0541147182458,509.2741355951257,1.0977469218320863 +2216,583.2790188026016,551.967330338404,1.0567274306705812 +2217,1241.095218392615,1169.4709271170134,1.061245037918275 +2218,476.8548333502213,460.57304977259076,1.035351142637785 +2219,524.4698602174676,504.6695926290341,1.0392341204574773 +2220,437.10615818416073,423.29553453649527,1.0326264335927569 +2221,582.6542085022811,566.9423572649423,1.0277133134189096 +2222,580.4354286372153,561.170647041999,1.0343296316312398 +2223,447.5656702664612,433.73850157992774,1.0318790437929002 +2224,634.9192644269817,617.1890678648506,1.0287273341108718 +2225,750.8996702168342,718.9680500801442,1.0444131281398814 +2226,1922.8582934441304,1805.1061443445706,1.0652328116374095 +2227,2927.3920070624504,2819.7293831243037,1.0381818995051415 +2228,395.2912158386148,380.996622298275,1.0375189508350782 +2229,1472.7883205599805,1419.153970185513,1.037793186293561 +2230,216.7624877115552,210.41074243628975,1.0301873621171633 +2231,200.38488531486237,196.97539770703025,1.0173092053501178 +2232,227.45312217992543,219.4138820419128,1.036639614883059 +2233,205.09708340151658,200.99815980073973,1.020392841431187 +2234,2182.6006710655765,2109.6894900587677,1.034560147998262 +2235,1512.8368011203274,1413.298045118727,1.070430123600177 +2236,2491.317115946004,2326.5400159459787,1.0708249584665004 +2237,1736.7173417099666,1622.258444812721,1.070555278823319 +2238,2502.877425511017,2337.3353922207184,1.0708251087290541 +2239,2949.1636990472084,2868.737172554548,1.0280355158576768 +2240,1708.4178629178941,1609.843094076572,1.061232532042426 +2241,1673.9637617548035,1576.2289521035202,1.0620054653360183 +2242,988.2824335381775,919.3990815332106,1.0749221457673153 +2243,1094.1309662215947,1018.5892313166297,1.0741630998860254 +2244,4229.980907983025,3907.088923020135,1.0826425994710398 +2245,2169.771193100682,2108.3533871332393,1.0291306980804358 +2246,821.5724540613371,765.8903435549306,1.0727024579627866 +2247,748.2956990511393,693.8160887663643,1.078521687759709 +2248,1098.2961783180547,1019.7878749835969,1.076984935063795 +2249,1028.9840939882909,955.8568270467422,1.076504414544473 +2250,1029.5671831228194,935.2866109491486,1.1008039365366227 +2251,974.4150458053456,874.6619142671589,1.1140476450512489 +2252,1020.5091718371538,911.0365697116373,1.1201626869491823 +2253,1030.411485256028,936.1145553871288,1.1007322547504914 +2254,426.68180231694384,403.645360310801,1.0570709941727192 +2255,906.8359140841764,857.0015790815775,1.0581496419831629 +2256,2307.209106660056,2237.7707065735663,1.031030167604979 +2257,798.2286305881457,753.3145145352447,1.0596219974343792 +2258,1145.4690042997374,1096.1071689103044,1.0450337674905512 +2259,1294.134308895479,1246.7793625600862,1.0379818175993516 +2260,786.6578803882518,742.4045083075687,1.059608167226201 +2261,863.8855159203285,816.3356802595309,1.0582478958235422 +2262,1724.5363525115947,1654.51319475538,1.0423225139443917 +2263,784.2463223070797,746.1194205523839,1.0511002672018226 +2264,723.8967362447067,636.8157808021787,1.1367443428189463 +2265,1674.288949180085,1578.3098235080695,1.0608113338981096 +2266,934.8689057960206,875.2117646735219,1.0681630932426422 +2267,942.8203006893297,882.7164328459261,1.0680896668589543 +2268,1264.723128631035,1224.0433686482193,1.0332339204841579 +2269,1206.8544218002316,1140.6398164927948,1.0580504067541947 +2270,1142.9105645029094,1075.2774738722676,1.0628982679113355 +2271,1254.459483938456,1215.104439791712,1.0323881987901304 +2272,1921.1955502579633,1836.28488162654,1.0462404659979618 +2273,1397.7996940456476,1328.0536595371202,1.0525174822626042 +2274,1244.386910406875,1199.544481436263,1.0373828813058439 +2275,1022.1590574996834,988.6454983032721,1.033898459310165 +2276,1157.4214137119689,1120.1042932574987,1.0333157552194931 +2277,1016.02986884377,966.8779460080196,1.0508357058289368 +2278,391.8442318180849,370.5124354050773,1.0575737664234826 +2279,264.091710989738,255.21878683149743,1.0347659522576553 +2280,655.6057370056685,628.2737255161703,1.0435033495424992 +2281,1039.058158441731,992.8029367835342,1.0465905366960875 +2282,1207.8625229990557,1154.2176653253696,1.0464772453976987 +2283,1922.8491456090044,1816.7844898605415,1.058380427805504 +2284,1011.9362411804514,952.7661488619381,1.0621034787908774 +2285,1223.5515914862629,1152.0028559311827,1.0621081234188834 +2286,1162.3488538084737,1093.3723530059538,1.063086011469822 +2287,902.978382389129,856.1742837813271,1.0546665550395766 +2288,426.50740756991894,402.31791046155274,1.0601253299427191 +2289,195.1712109793487,184.0892264010445,1.0601989849974258 +2290,282.8808887491905,259.10916021931735,1.0917440684449444 +2291,591.5156969811553,544.4583365343491,1.0864296811879883 +2292,886.2479015456402,833.3284913873882,1.063503661167456 +2293,693.5470112078941,620.2189785850384,1.1182292628164099 +2294,220.80792223486876,203.83216690593275,1.0832830047711273 +2295,91.904629711905,88.19149893268971,1.0421030464857985 +2296,120.17618404118306,117.33989867600941,1.024171534125873 +2297,157.82063466400052,146.4626379705884,1.0775487650010303 +2298,323.4239379891427,306.589477784474,1.0549087996310915 +2299,391.6383796947883,369.8802546562954,1.0588247811679248 +2300,374.92778788974744,359.99340822149657,1.0414851475809859 +2301,81.0642045442013,76.83219177760242,1.0550812448361335 +2302,80.09681744350391,75.9121349327058,1.0551253434580352 +2303,82.47514943757255,78.19977965037633,1.0546724019723712 +2304,80.35759606910769,76.16247228580785,1.0550812448361337 +2305,1014.0619891776727,933.4609120917703,1.0863464940436396 +2306,1062.440846476047,978.0272412912618,1.086310075651202 +2307,1575.6210423400332,1477.0202426416868,1.0667565662620822 +2308,1496.6285051193197,1403.0101444246113,1.0667267881609668 +2309,1519.7806254857805,1444.5336280344459,1.0520908589395195 +2310,620.5509263348323,590.5962773366687,1.0507193325586914 +2311,1166.0977538996851,1110.7267595007872,1.0498511392881038 +2312,466.86508827638494,450.45932201143495,1.0364200838195408 +2313,2224.903899816578,2157.413976371393,1.0312827877191646 +2314,999.816646924631,920.345437354392,1.0863493274858682 +2315,953.221647852883,877.9152588086222,1.08577865379223 +2316,1222.9790095893163,1146.841147176847,1.0663891966205574 +2317,1521.3040086049057,1472.248474945886,1.0333201456777346 +2318,1415.1317780536763,1387.5756991516828,1.0198591535718307 +2319,2094.191716831727,2033.0106024948475,1.0300938491229705 +2320,895.7969748741908,847.2623001159245,1.057284119394461 +2321,918.7196027168217,868.9664472211351,1.0572555541756439 +2322,393.44575882878456,358.9628370923313,1.0960626509857445 +2323,406.07132155629296,370.11333656372824,1.0971539834970883 +2324,415.13590352684616,378.3499851990071,1.0972272228542315 +2325,400.2157292805893,364.82282495714725,1.0970139528073644 +2326,71.5407071992151,70.19593023662873,1.0191574776208987 +2327,410.0695316910435,403.9640517814379,1.0151139188813487 +2328,133.34851002081555,126.11080265427744,1.0573916525325726 +2329,162.70805587356213,148.42868242267116,1.096203599047174 +2330,146.00762283588844,138.31460763280546,1.0556196871375019 +2331,213.1764280493494,201.7891710040235,1.056431457588469 +2332,728.4451309796839,699.1404796045513,1.0419152548450747 +2333,617.803582996178,594.1804685183994,1.0397574739147575 +2334,500.42051326466105,490.7393231231506,1.01972776520108 +2335,940.929365372884,921.3419681279822,1.0212596385733956 +2336,621.0084614854869,606.7018058746838,1.0235810335032334 +2337,1591.0387523533568,1540.8190745673458,1.0325928453346234 +2338,647.607776448821,613.2127616752422,1.0560898548158306 +2339,1448.5217143079576,1375.4915158379345,1.053093892349844 +2340,613.8616379512689,576.0650078498212,1.0656117444844024 +2341,1391.577165752522,1319.568780400163,1.0545696339758222 +2342,1262.1805159881628,1145.6781062553257,1.1016886061597422 +2343,1942.8282980928689,1833.9571627588618,1.0593640557941004 +2344,261.0227724349342,251.18710722357034,1.039156727907255 +2345,226.09080588408406,207.76527715515155,1.0882030384473131 +2346,1167.582337313273,1103.8361906266769,1.0577496436771163 +2347,1825.7643153182325,1736.623177666798,1.0513301554406282 +2348,1503.4684160077438,1423.157757344601,1.0564313114612047 +2349,3179.6499326086814,3065.0250843069803,1.0373976868537174 +2350,1278.5237873221233,1250.2740986782953,1.0225947963520092 +2351,510.9432572155424,473.0259238123768,1.080159102269848 +2352,501.2248122498809,464.0596751180854,1.0800869783015266 +2353,509.2108942262469,480.2479826989603,1.0603082419305898 +2354,780.0892482106451,752.0146230238238,1.0373325522234318 +2355,774.9580200639647,747.0425590484259,1.037367966091647 +2356,541.3179189807483,523.4006119943417,1.0342324914717531 +2357,477.15223680197647,466.7295595941625,1.0223312987008513 +2358,489.7918916966633,486.9582465135894,1.0058190721758211 +2359,675.8588177369686,623.8194437055571,1.0834205707380518 +2360,1334.3312127871502,1241.3580064621744,1.0748963682040011 +2361,531.2440876444892,515.212024883762,1.0311174079532486 +2362,390.72900702466734,383.3350956195264,1.019288375861311 +2363,602.2572418785583,588.5008962197012,1.0233752331512533 +2364,367.7325048156225,355.4264930701601,1.0346232258579364 +2365,462.4612808317623,449.5468124239772,1.0287277499269758 +2366,460.48603131311694,444.07353515105865,1.0369589603138032 +2367,276.40446327227534,262.2631117066314,1.053920475028385 +2368,131.59874321585005,120.8686026714828,1.0887752510346416 +2369,474.20031763855275,459.27145263729204,1.0325055365743594 +2370,2515.945553557102,2361.6569326083277,1.0653306662870676 +2371,1248.653235521218,1166.676765939653,1.0702649371058146 +2372,1956.6111389257069,1868.500884224074,1.0471555863021291 +2373,795.5769772473569,762.3290230264564,1.0436136539691296 +2374,670.3555035300252,627.148022412325,1.0688951883344902 +2375,661.5377393605694,626.5939862913114,1.0557677759981121 +2376,676.5356112183142,632.9316567432368,1.0688920423090267 +2377,341.9894550019057,320.48431159128165,1.0671020160202096 +2378,354.05008761761314,331.8304057807231,1.0669609579164758 +2379,805.7641826780047,770.2819485691352,1.0460639564185306 +2380,339.4782698012211,318.1404729944283,1.067070362365264 +2381,459.04485474407545,438.1517137098198,1.0476847182848013 +2382,2283.7066817952978,2214.3161324345056,1.0313372369664766 +2383,338.39191627253393,317.1452245605461,1.066993572870058 +2384,335.68812322754457,323.1198745506929,1.0388965509915729 +2385,565.1968337109212,542.5577762864392,1.041726537548565 +2386,642.1864961779231,590.5870226962702,1.0873698058011507 +2387,764.4243891300725,710.3400887811484,1.0761386006549705 +2388,537.9301925796201,498.27514370745587,1.079584641885019 +2389,4937.802563067375,4717.966103244788,1.0465955996740615 +2390,2935.5541355692344,2806.2417362614915,1.0460802779877454 +2391,925.8392865492012,867.5744745314721,1.067158282923428 +2392,1295.706651049219,1221.4370221407562,1.060805123442463 +2393,1367.068931915014,1310.2739354699427,1.0433458950129395 +2394,1306.3056495315304,1229.9385551080725,1.0620901703636307 +2395,280.16423037527386,255.94518349530986,1.0946259138352092 +2396,291.531284907421,266.8993334166064,1.0922892956512795 +2397,339.78123307130755,310.6609541303412,1.0937365270845998 +2398,323.67071976847524,295.6052335967319,1.094942453590083 +2399,2482.940243109331,2379.809287438404,1.0433358068712872 +2400,1018.4147355090834,971.1711971933257,1.0486459426023866 +2401,2766.201047667978,2655.6695480509056,1.041620953818669 +2402,788.5574639692296,755.4689567950819,1.0437986324607151 +2403,647.6167703426456,622.5614172013934,1.0402455925615883 +2404,720.4720472646042,691.3107969586789,1.0421825471759099 +2405,1034.3771029003008,988.2048084244218,1.046723406000721 +2406,473.46764646491994,452.379159734891,1.0466168396050506 +2407,1169.448116319056,1123.875696272083,1.0405493420652636 +2408,1317.1282013658642,1262.1824065161497,1.0435323726317616 +2409,1203.9259679696802,1149.278309164107,1.0475495433698037 +2410,997.288532288403,966.3009118637981,1.0320682926448201 +2411,1032.1201702090366,965.4946095688699,1.0690066624710806 +2412,346.1986054050067,329.67895965426095,1.0501082803951762 +2413,935.3553313577014,907.8070967783989,1.030345912338717 +2414,1249.3409560950356,1190.4252280551764,1.049491330199807 +2415,1510.6662394409177,1442.325504587688,1.0473823243337612 +2416,2125.4084408655744,1936.814299625399,1.0973733730056887 +2417,2218.699897520594,2019.0130471387702,1.0989031995928944 +2418,1185.2106920557555,1086.6636606894524,1.090687703041232 +2419,1247.3714226657194,1172.6680118606369,1.0637038019708176 +2420,3412.7586307125403,3221.335570039819,1.0594235082035726 +2421,1766.7661341604519,1669.4925787043694,1.0582653416354644 +2422,3337.08349464688,3193.8773709202133,1.044837702608916 +2423,1186.5937286679618,1175.8674169996411,1.0091220417482867 +2424,652.0178794175218,626.9413546105241,1.039998198591599 +2425,1713.4293448004967,1630.1225674881603,1.051104609539087 +2426,1335.1979327968693,1292.433323034307,1.0330884456477505 +2427,169.58747837357265,164.18553108374488,1.0329014819647686 +2428,394.0198059416661,377.7074576050923,1.043187784641597 +2429,171.61212924080286,166.23192997766688,1.0323656187103092 +2430,215.2062740076424,212.6146766712062,1.0121891742235833 +2431,697.7064967622256,675.4603404713181,1.03293480750533 +2432,5953.765718811917,5741.349328115977,1.0369976426370218 +2433,1071.5923461535117,1054.8015310116364,1.0159184592060382 +2434,753.2197522769802,726.258940004321,1.037122864570175 +2435,2601.855126584694,2404.0771957215456,1.0822677122078805 +2436,1556.064042721991,1450.5088841154575,1.0727711217507658 +2437,1932.022102089892,1835.6199164138877,1.0525175091063177 +2438,410.98866645478626,396.112058893142,1.037556563168549 +2439,2327.774669232547,2240.028186167157,1.0391720441766092 +2440,747.4657592475783,720.0982894351978,1.0380051865334188 +2441,762.5471797577286,734.6440107449524,1.037981891371416 +2442,365.20316880297224,352.27110304615576,1.036710549474511 +2443,4236.2970751015555,4070.8744738697246,1.0406356428560133 +2444,699.2029664501557,665.265186470162,1.0510139124520623 +2445,586.4147987876539,565.0722296852741,1.0377696301130688 +2446,2490.4075938761553,2387.0914626571866,1.0432811783022182 +2447,225.82600577981196,218.65978581119964,1.0327733787080535 +2448,3168.8299439279654,3047.2834032356955,1.0398868515357673 +2449,3587.4006953588027,3452.055235314159,1.0392072115938569 +2450,2090.4812589504245,2010.6462019859252,1.0397061685370832 +2451,1280.8958824836893,1231.325844755546,1.040257449268422 +2452,4233.737242513008,4068.469882828854,1.0406215025412062 +2453,1040.2586927851728,997.1451399663322,1.0432369883689112 +2454,5330.940793726476,5057.669366059029,1.0540310977030873 +2455,1531.4214487312997,1463.7679414761649,1.0462187381880412 +2456,919.8373087299151,878.3389356631211,1.0472464231993357 +2457,2117.2169050406446,2017.2028353915418,1.0495805716184659 +2458,5141.130398985293,4917.564885383697,1.0454626464138972 +2459,2031.6274197066577,1910.4414777466686,1.0634334751268726 +2460,2183.943872628788,2102.836187309599,1.0385706151571223 +2461,1324.0691133611992,1275.4587362172533,1.0381120735337266 +2462,1038.7605891231158,1001.2478945804057,1.037465940997989 +2463,1762.306303819247,1699.8872548909478,1.0367195228675936 +2464,2056.5598790906492,1984.7832192826706,1.036163475744177 +2465,2049.7378507014755,1978.1835584054938,1.036171715204052 +2466,1336.647273563479,1290.4132240514439,1.0358288714423405 +2467,2113.5264913523747,2038.3178121556077,1.0368974252926881 +2468,761.0899455240992,715.1877551214769,1.0641820138472948 +2469,564.2192121286138,543.5234504587881,1.0380770354109954 +2470,211.02217623629892,193.02479340768906,1.0932387104831525 +2471,289.33842385271464,270.8439645806165,1.0682845538047545 +2472,293.66526068315625,274.9009496440267,1.0682584438628813 +2473,216.66744207446837,200.6783069199179,1.0796754537147408 +2474,3281.3651239065675,3159.2213810528947,1.038662609586722 +2475,719.9364486494812,687.812517066745,1.0467044881935739 +2476,815.7169135114433,744.0990375312904,1.0962477739761103 +2477,157.68805405447432,129.5895036890077,1.2168273630625075 +2478,527.1952327825037,447.8534176412343,1.1771602314863396 +2479,41.43609909826653,41.39554476631483,1.0009796786630214 +2480,58.087330226661365,58.087330226661365,1.0 +2481,525.9550205292248,492.20701394611086,1.068564660045273 +2482,177.7567136225389,162.7258443951097,1.092369280880382 +2483,252.85907894376587,242.00189031000704,1.0448640653998638 +2484,133.03367673658107,112.96913669032187,1.1776108115375032 +2485,132.88310653863024,112.84148664409668,1.1776086126704894 +2486,899.4145879106654,870.8635665259842,1.0327847236721315 +2487,62.510949746475674,62.230414675987234,1.0045080058030964 +2488,219.53474842864114,209.89817405547998,1.0459107108316914 +2489,219.33016933079864,209.69420304755053,1.0459524686100314 +2490,225.58428438432497,215.72502787729738,1.0457028866981324 +2491,223.7419233300037,213.96105482353227,1.0457133122405773 +2492,185.50521991430745,168.14748315798795,1.103229239179337 +2493,176.89770682019736,161.98786473847534,1.0920429570807266 +2494,199.15659047458414,180.25530729760214,1.1048584003453275 +2495,259.3310064312481,249.11034893934735,1.0410286346409048 +2496,319.85210734169095,309.9198809835194,1.0320477225489761 +2497,317.76185668040785,303.238265560975,1.0478949815009824 +2498,108.61768092252781,105.03821548192639,1.0340777442207911 +2499,111.90524683078121,107.92670088805436,1.0368634073865888 +2500,1510.1445422121606,1441.5560838264014,1.0475794588606646 +2501,399.4016184856045,375.06760157579805,1.0648790159629098 +2502,440.07786209015643,413.51517885534065,1.064236295529331 +2503,397.3161794093664,373.1008009731294,1.0649030459679472 +2504,438.5855009908618,412.10744652473466,1.0642503664746032 +2505,1320.9636620183305,1229.4903312465383,1.0743993900944715 +2506,1028.2254424869536,980.0128455307248,1.0491958826622516 +2507,965.2690487236382,914.0841777139278,1.0559957958551704 +2508,193.46440531904986,181.25920456949112,1.0673356190575112 +2509,193.40010528280564,181.20910453933587,1.0672758732209475 +2510,348.0107218738492,326.57881464889095,1.0656255282449965 +2511,330.1263202423597,309.7632771196642,1.0657374344436221 +2512,423.3334074878323,396.5333451991741,1.067585898167522 +2513,441.12460781618506,428.1359634579038,1.0303376624878147 +2514,312.2264951686599,293.0454813202147,1.0654540508935055 +2515,194.55532667203096,182.31504466713054,1.0671380797303296 +2516,265.8974382547266,243.54438281092396,1.091782266483873 +2517,157.79189164877465,131.41305021433644,1.2007322818503487 +2518,286.4326740281197,262.43115865363006,1.0914583294820113 +2519,181.4359197504533,162.697832087952,1.115171096148176 +2520,241.3628102721945,226.9304925373291,1.0635979659388055 +2521,95.14421261361093,92.1385319302408,1.0326213216165172 +2522,420.5171850719012,390.7565762106686,1.0761615048167168 +2523,193.74942064742783,181.50627003238006,1.0674530450813828 +2524,58.051571655240444,54.63222314971649,1.062588492804941 +2525,524.8528016228915,499.8270868656935,1.0500687446015158 +2526,359.8344131707332,343.36373893378106,1.0479685894850084 +2527,581.3754166069841,549.7633775520615,1.0575011729513195 +2528,509.5813204779952,477.7648705480624,1.0665943686764474 +2529,1355.3981379507022,1251.667131390117,1.0828742754037013 +2530,1725.9518328261613,1613.0825093313545,1.069971202862768 +2531,1864.297491562841,1723.9454130341376,1.081413296191139 +2532,2001.7761626219037,1898.7985318168796,1.0542330474136659 +2533,484.1157441928308,466.35211501501846,1.038090594222437 +2534,584.2541087378329,550.3866233756913,1.0615339906962524 +2535,296.2182886541353,289.3811987657814,1.0236265863764276 +2536,585.0125976119285,551.1011448895975,1.061533990696253 +2537,876.5281437200307,809.7479896760543,1.0824702930978467 +2538,2009.8613457940037,1927.2464622476487,1.0428667973529475 +2539,1982.1585654918397,1903.2223941454313,1.04147501184792 +2540,118.79839761337549,112.10900178664342,1.059668677092164 +2541,1529.295376627289,1469.5479132004252,1.0406570366914707 +2542,1929.3950978211924,1857.8589669426617,1.0385046078046776 +2543,181.76459704254032,172.3856126446134,1.0544070021508258 +2544,946.7502324864729,904.0024486864802,1.0472872433720788 +2545,953.6124449821929,910.5464453242425,1.047296873080005 +2546,790.1186144905026,768.1705501207725,1.0285718638475263 +2547,945.2562608427485,902.559969274567,1.0473057669536336 +2548,938.407961782168,895.9999734394681,1.0473303455355123 +2549,642.9470077785418,618.8194168674238,1.0389897121089966 +2550,372.8806268887395,365.0163526499206,1.0215449915646968 +2551,135.9225850182541,134.36438295633272,1.0115968385939582 +2552,147.19471911030988,143.86874165895577,1.023118138193204 +2553,145.79623430724084,140.8706003341171,1.034965663250111 +2554,156.0352473371785,147.59586403407323,1.057178995890813 +2555,133.14702224305645,131.8340061824454,1.009959615873267 +2556,134.87223140533945,132.97675077740575,1.0142542257714404 +2557,219.06476384196066,209.96422699206101,1.0433432731864545 +2558,535.7022281181135,502.8376674546303,1.065358191700005 +2559,811.175809567744,787.125446552482,1.0305546760311202 +2560,649.4101578632542,630.2305068577965,1.0304327556294974 +2561,323.9122994586152,310.40343340598423,1.043520349966498 +2562,82.11394067020508,77.7564791959607,1.0560398505603987 +2563,179.1713303675093,163.29853446712804,1.0972010921725477 +2564,178.57401388190704,163.03566508316098,1.095306439795368 +2565,400.56225221011806,379.47170172577194,1.0555787174338163 +2566,400.932506496668,378.431235767001,1.0594593379271708 +2567,2587.2790283433437,2502.185883632411,1.0340075232889587 +2568,1171.9100436101637,1137.3650291775443,1.030372847367744 +2569,348.09295364304427,335.5461204023703,1.0373922762856813 +2570,2901.626699070897,2748.9853076194277,1.0555264486239302 +2571,2170.8249195555304,2069.0182163222753,1.0492053199097584 +2572,3671.7308235541623,3548.7399530193948,1.0346576171156532 +2573,1307.622843621802,1268.8110103409551,1.0305891365731588 +2574,690.8291730876125,675.0754720355028,1.0233362071423049 +2575,885.8767689842292,821.3879723402489,1.078511980715085 +2576,393.7130120658356,380.078739721168,1.0358722309873736 +2577,428.5846117662641,402.92245069236816,1.06369007492583 +2578,3647.054232797955,3524.876228398734,1.0346616438372713 +2579,1449.231010327405,1381.5621539231497,1.0489799580946102 +2580,3609.454722722636,3508.5417194592574,1.0287620930096653 +2581,730.8645291793383,687.117779596423,1.0636670318858723 +2582,660.7554465145327,613.0813478350749,1.0777614566938065 +2583,571.9401622440861,535.8560429277497,1.0673392038637541 +2584,193.56028949167938,178.7582122281629,1.0828050195793155 +2585,411.79747264313824,384.4865289299053,1.0710322512189026 +2586,233.4697526215918,215.61942617812792,1.0827862626288474 +2587,826.1837493899001,774.4934803499607,1.0667407413379164 +2588,140.47576283908754,133.8208359696125,1.049730124769107 +2589,142.24857655572345,135.47334017524398,1.0500115843583337 +2590,139.29694823787256,132.70086762389647,1.0497063864922935 +2591,139.5262113803358,132.91969505147068,1.0497030656465687 +2592,302.27656153170955,293.5006421752349,1.0299008523164832 +2593,304.2639709935201,295.4246269487893,1.0299208097037322 +2594,283.70241490816187,272.71342544864353,1.0402950072642747 +2595,288.91523834793514,278.2079250921445,1.0384867298523013 +2596,239.15154589522248,220.508371436306,1.0845463341708166 +2597,238.5514637589618,219.95414337315935,1.0845508982035927 +2598,238.59611636113905,219.99611150350106,1.0845469709919942 +2599,233.65444639816428,215.3308596046145,1.0850950338803975 +2600,119.16622434725087,113.52593950494546,1.0496827849820147 +2601,119.13218185760792,113.49710148785101,1.0496495531241394 +2602,138.90003837668232,132.32297497522606,1.0497046216100239 +2603,139.5023795779549,132.89699167643,1.0497030656465673 +2604,139.45988501946402,132.85650922012243,1.0497030656465678 +2605,140.16634999034406,133.52952332668303,1.0497030656465678 +2606,138.75637038964226,132.1668693808172,1.049857434315392 +2607,139.98354395224467,133.26774747300766,1.050393261734969 +2608,204.13373341186013,187.17389320450144,1.0906100734295718 +2609,208.76313620542692,191.37141590994227,1.0908794043916623 +2610,219.04029665801642,203.23762472624784,1.0777546576479333 +2611,204.0879079580885,187.12405490584393,1.090655651197706 +2612,218.64690239505876,201.02353708795158,1.0876681684264495 +2613,206.21494904348512,189.07362671480675,1.0906595098772494 +2614,202.93208435273712,186.0642071292434,1.0906562174624859 +2615,206.852109430309,189.71672799071084,1.0903208779799174 +2616,299.455648074907,288.7519970597863,1.037068664889284 +2617,298.14019847427124,287.5031646378912,1.0369979713085153 +2618,351.70388080201246,339.1399102412189,1.0370465704017473 +2619,353.0965888137239,340.49089501105834,1.0370221171472327 +2620,164.95407851121993,156.61180905050782,1.0532671802419555 +2621,165.4600814447687,157.08325036185545,1.0533273347961445 +2622,1350.4346708374694,1288.3302818780767,1.048205331996745 +2623,178.3768618432078,169.42838205032902,1.0528157070532647 +2624,670.4112780835925,648.4374803921175,1.033887303488668 +2625,589.4805868617948,534.2453182711631,1.1033893357631566 +2626,585.7930266756363,530.9571624859972,1.1032773791634938 +2627,1217.9280222025723,1181.9276201523771,1.0304590580982902 +2628,1287.1000000565737,1241.902019987128,1.036394159395855 +2629,718.2941552153908,686.7089045989361,1.0459951085604484 +2630,895.5598716068139,859.3757903322603,1.042105074033519 +2631,715.0973555885449,683.6573326735033,1.0459879846415054 +2632,714.4178563735625,683.0001273646121,1.0459995946562661 +2633,702.935939283337,671.9789836936883,1.0460683389523384 +2634,714.8051781063338,683.3701694890399,1.0459999719343882 +2635,725.2892468967077,693.7224169442125,1.0455035460603168 +2636,178.68755222816142,158.5791687452452,1.1268034360504184 +2637,172.57996072424206,158.49128685438095,1.0888924189429134 +2638,92.82545261305543,85.10946979548427,1.0906595098772494 +2639,640.1892772647508,592.9360353155353,1.079693658564822 +2640,93.04234297755626,85.30833145903428,1.0906595098772494 +2641,577.1215863051513,535.7117674203133,1.0772986919519134 +2642,94.16312773120478,86.37882032254186,1.0901182417124478 +2643,1194.7289749242616,1149.6563006807817,1.039205347038754 +2644,1228.7451543830616,1161.6726641152097,1.0577378570915568 +2645,300.19068088634987,289.48078554768915,1.0369969126565617 +2646,361.36362461186417,348.0950058508092,1.0381178084661802 +2647,369.8259237651282,355.18845605053673,1.0412104263673165 +2648,359.62367097257504,346.92079446820304,1.036616071180871 +2649,746.2668824854825,717.4607458974705,1.040150122153343 +2650,504.0243115665785,484.0669751184011,1.0412284610890794 +2651,507.5655019357732,487.47029538747915,1.0412234483586755 +2652,272.21593217292633,255.55990267366218,1.0651746589547466 +2653,454.64756010603463,441.04165933853284,1.0308494684785734 +2654,377.76159072780337,373.11016816789873,1.0124666196655663 +2655,251.46798428542724,240.72790207218324,1.044615028506432 +2656,237.237366764949,216.1716289566912,1.097449132940929 +2657,1435.0492249089186,1354.975783933851,1.0590958465269344 +2658,1409.2552623282468,1316.0798864261747,1.0707976596732973 +2659,410.8333619226353,382.1356323071156,1.0750982823618391 +2660,237.49453010109335,216.47043237817093,1.0971222604951127 +2661,1628.3570874210948,1548.3794722168598,1.0516524641661187 +2662,2011.924878019477,1939.737461149753,1.037215044981879 +2663,417.7119935012011,387.05989893162047,1.0791921215661655 +2664,1713.6669256140585,1604.2576948997494,1.0681992868490784 +2665,426.2744357613504,399.06192301228486,1.068191203369277 +2666,385.0324058348587,361.5117680061674,1.0650618870816124 +2667,428.9393322774424,401.92118031411337,1.067222513484394 +2668,429.7459220544671,402.3516154758179,1.0680854892212945 +2669,692.1708328447871,662.7938367009733,1.0443229772473994 +2670,210.71826098970325,206.48541152733966,1.0204995085660236 +2671,1726.1775367097937,1615.9959834428128,1.068181823714836 +2672,1589.7435653143216,1494.5463187713206,1.0636964176669101 +2673,607.1030522319738,585.8528776891152,1.0362722030600575 +2674,295.91223027033465,292.78034793527337,1.010697037410973 +2675,2498.4944212782516,2425.194836026344,1.0302242047373018 +2676,3068.2753897007465,2938.5673257389535,1.0441398986593495 +2677,721.6013949885607,692.8881532813688,1.0414399374144474 +2678,400.85880077150665,398.74061528225246,1.0053121889470797 +2679,549.484051306304,498.79326632096337,1.10162684303906 +2680,1888.8599813750075,1812.9248192106247,1.0418854446470902 +2681,476.74645809932224,434.9831964555715,1.0960112068329435 +2682,212.90622831210652,204.29248532207134,1.042163777960092 +2683,184.12394760655175,181.44273398341042,1.0147771892777282 +2684,202.44300554756296,200.4493508826212,1.0099459272687255 +2685,194.21114166334198,192.31570094081675,1.009855881310016 +2686,1234.0595788393919,1181.0195608724484,1.0449103636588046 +2687,833.1876532072602,790.1776685374874,1.054430777257194 +2688,2022.535678393758,1939.0787631487851,1.0430394663852904 +2689,836.9107523292288,793.9989960927963,1.0540451013761953 +2690,1963.618285022351,1862.9217367057192,1.054053021301205 +2691,727.6372400213368,691.2129293796336,1.0526962229632975 +2692,1676.0115723809363,1582.7913525086906,1.058896088688186 +2693,2381.5210421470906,2251.3549539307273,1.0578167773984735 +2694,1878.4459631257057,1799.792883602223,1.0437011837529113 +2695,743.152092255103,730.7748808267336,1.01693710573955 +2696,794.8514569037604,765.959981562754,1.0377193013165784 +2697,1139.9608373010944,1100.8374523467658,1.0355396565323294 +2698,1241.3449676434648,1184.7420884715425,1.0477765411752584 +2699,1093.5490573342515,1055.8585246471362,1.035696574689977 +2700,1770.8016639074078,1684.6750642090867,1.051123567700431 +2701,1172.2135742074438,1127.7919942529481,1.039388096546935 +2702,622.3663185267226,609.9204940489552,1.0204056505711847 +2703,888.0445296861676,828.7076709018614,1.0716016767646561 +2704,2675.412588504647,2526.6739771046146,1.0588673539791138 +2705,985.9924856113327,918.7790488946004,1.0731551691319017 +2706,1078.358721101172,1038.7691203743545,1.0381120308163858 +2707,2018.3014283018583,1941.6584244554804,1.0394729592399197 +2708,536.7466809235596,513.8839990432589,1.0444899664571499 +2709,945.4695623772325,917.1855784708987,1.0308377983368293 +2710,1630.6317071353526,1584.4746613291836,1.0291308197806388 +2711,735.1633417475315,705.0481979941233,1.042713595806764 +2712,1695.7536504775546,1642.5838884684774,1.0323695869552525 +2713,1322.145327446136,1268.5096485767665,1.0422824366606491 +2714,640.4098636638894,609.783366803005,1.05022520870232 +2715,1019.6773687072649,984.3230691689947,1.0359173737217373 +2716,871.0170024061432,833.822629109026,1.0446070567032475 +2717,2011.7349155944503,1921.2188119818736,1.0471138961621986 +2718,446.79394261135445,437.5760506738165,1.0210658054144952 +2719,677.7761516299997,648.3777552699137,1.0453414635544487 +2720,3224.9142797263085,3097.7790909036225,1.0410407537438702 +2721,1331.1763262326665,1257.6608773751893,1.0584541112632113 +2722,2282.279444107512,2215.1793308127076,1.030291052449549 +2723,4501.34866406489,4344.44585325357,1.036115724792338 +2724,706.6149287222929,650.2478191880327,1.0866855802832927 +2725,1308.01904868787,1248.0985380634143,1.048009438996243 +2726,732.060998391494,706.3504154640387,1.0363991899269496 +2727,473.85030384038924,461.10198401605805,1.0276475059016168 +2728,468.5381944095977,456.0982021885486,1.0272748109099243 +2729,971.5280686342599,933.6530344737075,1.04056649821944 +2730,65.76335035064113,63.98618897635856,1.0277741400560547 +2731,994.4650078930396,968.0513997267583,1.0272853364746302 +2732,1869.0206266471737,1819.2033415779508,1.0273841213517187 +2733,1451.9241548027128,1403.3992507766443,1.0345766922700113 +2734,999.8702776114972,970.159703245414,1.0306244160283036 +2735,963.1638162730686,934.4819135069795,1.030692838835639 +2736,816.5388082033808,792.2368676083826,1.0306750942661396 +2737,228.38773129458826,224.23940450895577,1.0184995442469917 +2738,49.05102739724872,48.18781595338143,1.0179134793056899 +2739,230.14599488603005,225.98036845586347,1.0184335765917656 +2740,1664.2855777712257,1604.9706881340765,1.0369569924707522 +2741,771.4459915598871,733.2230522955554,1.0521300293882803 +2742,35.26221502281803,34.79867892545876,1.013320508469652 +2743,795.3417298585042,750.4831379342737,1.0597729511254643 +2744,18.894468315092478,18.891259201429808,1.0001698729358617 +2745,1878.4803836684544,1775.858143536926,1.0577874085861039 +2746,33.16124129625454,33.0299865133547,1.0039738067360933 +2747,169.65390438671272,161.67416374705638,1.0493569315882831 +2748,1847.0916627684283,1742.3768890214308,1.0600988077876816 +2749,804.0302507930134,761.2938856334301,1.0561364881106652 +2750,790.940371372459,765.0328317789485,1.0338646114484618 +2751,1288.1313393409218,1274.0236776632987,1.011073311999584 +2752,508.2682824790116,485.53727041570363,1.0468162043334928 +2753,1115.1514859796425,1082.2107744939135,1.0304383510699506 +2754,5593.762794948765,5250.314276076662,1.0654148496285345 +2755,1151.5699812648008,1080.838248070282,1.0654415527215129 +2756,1446.0206773595432,1356.8981956462744,1.0656810378252592 +2757,1486.5486778875702,1391.8309353673108,1.0680526205542795 +2758,2234.838615913996,2128.1089273030666,1.0501523616773634 +2759,3726.066603078549,3516.5063669237234,1.0595933049136355 +2760,1681.794053252545,1573.4269294292183,1.0688733120022538 +2761,1276.508806815966,1198.2280535686962,1.0653304293904031 +2762,914.5107565641165,848.2114658773856,1.0781636341335603 +2763,686.617542697342,633.9858212167471,1.0830171901629975 +2764,3698.4969988529524,3533.170784918629,1.0467925905648319 +2765,3491.7776543924037,3302.0127518907307,1.057469463857465 +2766,1053.3055563328846,997.1428408162425,1.0563236411251455 +2767,1377.367816780722,1306.1263986761217,1.0545440457958817 +2768,497.5848054615402,465.9738119043519,1.067838562489166 +2769,1389.1109359243758,1338.8753148297885,1.0375207612973085 +2770,1127.4026837955867,1080.3628168417713,1.0435408052003559 +2771,2290.0910711858996,2184.0469703947365,1.0485539469748661 +2772,633.1184001142102,610.1640118960765,1.037620029648755 +2773,210.88607826964997,195.28344411341936,1.0798973729036072 +2774,619.2371880507737,601.3229750168263,1.0297913330742872 +2775,637.9322919960811,576.3534212371818,1.1068422056499916 +2776,163.05716752644258,157.70600742999494,1.033931238154152 +2777,181.72595859410046,163.29198905204527,1.1128896135632216 +2778,201.79489707349924,194.14462032985642,1.039405041101035 +2779,122.59936369117392,119.06543899256648,1.029680524663652 +2780,579.1656624243741,558.4421042953264,1.0371095910742578 +2781,271.17581730028076,259.8225503033628,1.0436962341554348 +2782,291.04456392018625,282.7291799061351,1.0294111276975793 +2783,319.9367165555409,313.4767975511789,1.0206073274156993 +2784,281.54999618818636,268.29334186900627,1.0494110447424096 +2785,742.9954642660638,713.021557323278,1.0420378691708978 +2786,1798.2608809235378,1721.6002586052148,1.044528700512877 +2787,1086.582531399281,1035.1428554894424,1.0496933110604494 +2788,150.5176781600955,139.3679720238224,1.0800019256530995 +2789,263.43293590007175,246.04044899130025,1.0706895430408945 +2790,766.89270790939,729.7478508484039,1.0509009475229032 +2791,1064.3674714442818,1004.65860165211,1.0594319997798094 +2792,536.8850947180632,489.3174404595821,1.0972122600285903 +2793,1070.7804491710096,1019.8250707661206,1.049964822267617 +2794,448.3926236171512,417.2339491047111,1.074679144828218 +2795,557.2712812334146,532.2765587063572,1.0469581500786067 +2796,432.303153942216,403.99024455546044,1.0700831511857676 +2797,200.65367195662404,185.88016052074988,1.079478688820182 +2798,1662.344439588141,1595.2345995187284,1.0420689471565243 +2799,456.26988524163926,432.16249361871616,1.0557831648486191 +2800,227.8268778215136,218.72835524262277,1.0415973620283403 +2801,245.67484490998746,232.72299177994094,1.055653517647683 +2802,108.41176485816906,105.24306932010279,1.0301083535337467 +2803,146.89528608929675,143.8949906148819,1.0208505901532374 +2804,147.70901914703444,144.7378217154402,1.0205281342249004 +2805,139.9264253792785,136.9252608217043,1.021918267962857 +2806,235.2504193168673,225.5082069201955,1.043201143451597 +2807,253.2587781887849,245.02173693967666,1.03361759389999 +2808,4767.318042758431,4553.690054669384,1.0469131595528756 +2809,892.9469707370314,835.7915915772146,1.0683847262114223 +2810,1040.919910010833,986.7147641703436,1.0549349698705142 +2811,814.8478477851044,772.8609668373733,1.0543265642196238 +2812,1116.5908913736394,1048.8673686879495,1.064568242570466 +2813,1407.1922412077806,1353.3658421672098,1.039772245880224 +2814,256.247805462737,244.96743259479825,1.0460484593745882 +2815,384.3482899821688,365.42348738523583,1.0517886869624833 +2816,226.68387346051574,211.38755497432854,1.072361490192953 +2817,222.3137223500933,206.70395378959887,1.075517513208206 +2818,485.7535578980502,460.9147088947928,1.0538903370274673 +2819,485.5738320711522,460.7352544977013,1.053910737958462 +2820,645.7137167775145,613.200452172778,1.0530222449926951 +2821,201.5212140711063,193.31724946088522,1.042437830214841 +2822,214.20902540609023,205.6071166577093,1.0418366294329258 +2823,197.0900910728475,189.07293097465066,1.0424024743090894 +2824,799.2783009189569,766.7655446124334,1.0424024743090894 +2825,798.6937391120359,766.1147057135315,1.0425250072287302 +2826,309.90487000783844,295.10916146975524,1.0501363917826034 +2827,299.33730523776745,284.85438645400404,1.0508432359566349 +2828,226.32075190305076,215.49889007329043,1.0502177149315242 +2829,196.80067685849156,187.29201311046785,1.0507691897273557 +2830,14.033633367572932,11.692157740902706,1.2002603521571589 +2831,9.152064904010976,7.814239896423178,1.1712034728035623 +2832,40.762044469177994,33.01916250495539,1.2344966188364281 +2833,40.67674584376099,32.914648898205144,1.2358249960241598 +2834,41.28568243656466,41.267829103010946,1.0004326210983658 +2835,39.921071950232644,39.906428791421504,1.0003669373395367 +2836,24.27177779853686,24.27126846110429,1.0000209852003978 +2837,33.43537378100923,33.43165425719189,1.0001112575461786 +2838,351.1805077795214,343.43914365759673,1.0225407157713002 +2839,372.3429227363838,363.2907662388844,1.0249171114124798 +2840,1894.8689548108255,1841.1563246253947,1.029173313241807 +2841,453.7342782289698,444.74441216993483,1.020213555950423 +2842,308.79972276241,296.18574574482886,1.042588062385853 +2843,1315.0876779580226,1280.6834456548877,1.026863962691063 +2844,557.0659076625891,546.7649348328641,1.0188398563504695 +2845,199.79210023198496,183.70788887893218,1.0875531881140534 +2846,268.39293334177944,252.12557528129395,1.0645208564911994 +2847,1158.4103515186262,1132.763390341381,1.0226410576082583 +2848,716.7722540076516,701.3894099937519,1.0219319593291787 +2849,230.63897141922322,229.53475252433734,1.0048106828388386 +2850,1497.00193849071,1450.426920714686,1.0321112474615919 +2851,1906.257949187485,1840.9214455541148,1.0354911958851694 +2852,1475.6382352255573,1422.0073502391344,1.0377149140455595 +2853,927.5247447036395,912.9458945784615,1.0159690187685322 +2854,1047.0278262815427,993.4820652992466,1.0538970584900973 +2855,852.7029930606185,799.9502926844685,1.0659449729046573 +2856,83.66282067054166,81.37330386138134,1.0281359696671588 +2857,83.14149380273345,80.74822834314092,1.0296386126197383 +2858,82.89035609439931,80.51745349017125,1.0294706613457134 +2859,104.4936994400388,101.74168626631648,1.0270490226249909 +2860,101.97323721031748,99.25326240880823,1.0274043868735128 +2861,103.34592614528341,100.57730778644164,1.0275272665353148 +2862,99.61652799291089,97.05514212983987,1.0263910371657012 +2863,118.67715778962146,115.62269233489799,1.026417525773196 +2864,114.9517400502958,111.99243504744106,1.0264241508955596 +2865,40.35217354572218,32.699939246285034,1.2340137161051912 +2866,40.81026923701335,33.09777016741679,1.233021712054462 +2867,40.34741373393045,32.64752561676814,1.2358490566037739 +2868,40.40511147850427,32.69465455797852,1.2358323409367284 +2869,1797.5053401383218,1741.3183475956662,1.0322669273084017 +2870,830.492597730984,801.5901463051781,1.0360563956019517 +2871,1719.693876439968,1628.4244254474693,1.0560477044965837 +2872,813.114284172682,757.971665828927,1.0727502370203381 +2873,731.4368429273213,708.0494062331112,1.033030797693389 +2874,1712.428402613802,1621.4695706497537,1.0560965395900703 +2875,1647.354498401027,1558.7299784844647,1.056856877804282 +2876,1199.3440455456598,1141.8474997961869,1.0503539621181774 +2877,1725.0401483546314,1633.5309981860241,1.056019230899337 +2878,2039.027671237546,1983.5098451907704,1.0279896901854984 +2879,2144.2626964598467,2061.096399969288,1.0403505127134267 +2880,1220.658154350825,1159.4314412494418,1.0528075321429986 +2881,948.6274526751964,909.8227138269444,1.0426508794059772 +2882,1849.1245502272184,1783.5208321464718,1.0367832642592643 +2883,611.0472984193922,567.6202931875889,1.076507139989534 +2884,45.9296776804884,43.95975358946712,1.044811991200362 +2885,43.885862760427905,42.00233792802699,1.0448433331408462 +2886,41.83711249340922,40.00136027614291,1.0458922447785148 +2887,41.28516170564084,39.50055355704585,1.0451793199813693 +2888,41.204921731977734,39.423782067092766,1.0451793199813697 +2889,41.48818431186682,39.694569396908044,1.0451853979576986 +2890,41.33966824685871,39.552703977720874,1.0451793199813695 +2891,41.08646502927484,39.31044581900761,1.0451793199813695 +2892,41.132567780779176,39.35445567846001,1.045181976771499 +2893,244.57503515937884,234.48794874056026,1.043017504622291 +2894,243.7724309921334,233.718971238804,1.0430151634676554 +2895,244.7132192275619,234.61902935316735,1.0430237474863984 +2896,244.2613000425117,234.18782549393757,1.043014509944433 +2897,595.6137151300213,569.1232064553167,1.046546175545531 +2898,531.6243584488548,501.5537901489125,1.0599548221757316 +2899,367.0088170037165,363.4079804119794,1.0099085237139125 +2900,604.0125707413861,577.2115073239028,1.0464319631147683 +2901,563.3444286631484,535.2032129888872,1.0525804311171905 +2902,544.6128238912405,515.4519479645338,1.0565734129861377 +2903,604.189112791656,577.3802416228372,1.0464319165017968 +2904,603.9159061346946,577.1191283393018,1.0464319695528068 +2905,606.4242352276103,579.5166330899277,1.0464311127606707 +2906,64.67512294264046,62.367655880228654,1.0369978160930575 +2907,62.404641931434234,60.19032381937561,1.036788606067373 +2908,61.40114798985884,59.237589557816065,1.0365234042808433 +2909,61.576144053614584,59.400671418187414,1.0366237044714797 +2910,747.1077731167031,733.2260257457208,1.0189324258599033 +2911,767.0364450377313,724.6643800417231,1.0584712953513302 +2912,370.6879893560238,352.16554949282585,1.0525958313920065 +2913,61.65801904777842,60.06928231811511,1.0264484053804683 +2914,292.3334006979143,271.1065701509054,1.0782969978750183 +2915,398.26143025137407,360.860454549752,1.1036438746060095 +2916,172.3281555553511,153.21848551590827,1.1247217003555274 +2917,57.997008304934035,53.27329497933786,1.0886694417424017 +2918,268.6474622773832,248.41939075000064,1.0814271038436742 +2919,101.98638966314775,86.53942299312264,1.1784962984009344 +2920,41.509067459177835,30.63241284790061,1.3550701234435294 +2921,213.38244196048748,189.2173824728182,1.1277105685104838 +2922,211.34235988337247,187.3531761521986,1.1280425783210952 +2923,102.8788300972546,91.2466762527933,1.1274803019918789 +2924,213.07963239751757,188.97652033145704,1.127545538587464 +2925,212.71948103079234,188.657106275408,1.1275455519828512 +2926,99.84728343279305,88.55277133345619,1.127545551982851 +2927,102.34617286219225,100.91470410451191,1.0141849373724352 +2928,101.2827732479599,99.86623096477166,1.0141843971631204 +2929,202.92070186787163,199.17324834174573,1.0188150444767359 +2930,164.60884785591034,159.20197217516144,1.0339623662123985 +2931,113.2872111714894,111.07897189215778,1.0198799038352238 +2932,191.4814660894022,183.61121748583255,1.0428636589383593 +2933,264.19460529514174,253.04962044023495,1.0440426855235652 +2934,473.53207696153254,451.9955741183465,1.0476475967385184 +2935,697.7262317800852,665.5894441744122,1.0482831990305 +2936,725.4445886540901,694.3865717278334,1.0447272717975744 +2937,155.4969897544091,146.93252582396102,1.058288414239262 +2938,172.90888698008598,163.30746682512142,1.0587935159464954 +2939,3192.488912336507,3131.7160600361576,1.0194056073843578 +2940,638.9128476124188,616.1646500375402,1.0369190241171617 +2941,254.5489882326123,245.28059320722542,1.0377869072485342 +2942,289.61342656184195,280.4193027954938,1.0327870573626428 +2943,291.7239588454594,282.54307353900424,1.0324937546387516 +2944,288.93369244791853,279.7601032212319,1.0327909130753796 +2945,777.5927513015589,752.49583235474,1.0333515720190565 +2946,209.5987321434356,203.04073867725666,1.0322989046873159 +2947,875.4989754720738,847.6600951030755,1.0328420324724772 +2948,195.77686228895197,189.46202313052558,1.0333303690844466 +2949,3344.6635184055,3235.9725756146568,1.033588338668228 +2950,197.71403736324447,191.3336382817663,1.033346980378234 +2951,480.656015300986,445.29899733982404,1.0794006233393327 +2952,477.7179565553523,442.5765214272948,1.0794019416455432 +2953,485.70380703985563,449.9743918191164,1.07940321909497 +2954,1574.150146444033,1495.6448330670783,1.0524892752886834 +2955,1991.0753244167565,1847.205208017495,1.077885291669175 +2956,150.3295927133522,140.06000299481263,1.0733227866553732 +2957,454.04905524581255,434.61906975030416,1.044705782253575 +2958,4052.719956962972,3892.169945521943,1.041249486453115 +2959,63.28611503734042,60.3076884255443,1.049387179140074 +2960,261.66715677293456,253.968025417362,1.0303153569939367 +2961,446.5553931290881,434.3768091741121,1.0280369110361378 +2962,57.702246301668545,54.99238274128572,1.0492770712105985 +2963,51.56211920909296,49.05175019811451,1.0511779702220483 +2964,51.55146004391705,49.042841304091546,1.0511515783571905 +2965,264.7602933009549,246.97500526756002,1.0720125018891171 +2966,256.03464675875125,239.24005967740237,1.0701997278549218 +2967,116.22449724653536,110.56998776262239,1.0511396410394147 +2968,115.03046814243683,109.4311687310389,1.0511673180166792 +2969,59.71544103253567,50.57657784109307,1.1806935854805374 +2970,58.50324533172592,50.947089347543084,1.1483137914442454 +2971,59.538045097423485,50.380917199533556,1.181757864026634 +2972,58.74973648223329,51.40534186831309,1.1428722064087153 +2973,229.4567579330624,211.00778032877315,1.0874326888588834 +2974,214.84825946491569,199.28292987591732,1.0781066878065775 +2975,201.07578056896804,186.57913117779682,1.077697057005571 +2976,214.3671574688139,205.88413137103893,1.0412029137033736 +2977,2668.043289089789,2520.500048670279,1.058537289256292 +2978,220.65268120004623,198.71604362401484,1.1103918796689465 +2979,200.05356299264616,192.1376035744125,1.041199428279368 +2980,184.17080970540613,177.20836575353476,1.03928958953075 +2981,36.5046890241946,35.30453486449505,1.0339943342776206 +2982,38.294914451227804,37.03539056874873,1.0340086566696527 +2983,36.44497531506053,35.24678434579827,1.0339943342776203 +2984,38.32976120088161,37.06960466824989,1.0339943342776203 +2985,237.3312232053753,226.17327923016282,1.0493336083430869 +2986,2643.5156574436664,2382.741526152542,1.1094428952653548 +2987,411.11162669968655,383.23445163869883,1.0727418292947979 +2988,272.6784489849003,258.3741788194129,1.0553626149131765 +2989,758.4960560099449,680.718142672562,1.1142586166897503 +2990,310.85808857412763,280.8312845682706,1.1069211503697605 +2991,580.3524681989188,523.5984454597005,1.1083922674548627 +2992,2677.3738892258434,2554.1271428691207,1.0482539589702164 +2993,4759.742830505775,4507.845293302118,1.055879809712621 +2994,240.7433881331884,220.55837372167363,1.0915177876537419 +2995,1618.3896738251876,1536.1749428642406,1.0535191199041793 +2996,374.0816244421845,346.8506132789537,1.0785093354911566 +2997,148.02071149124328,136.7157347631662,1.0826896534452364 +2998,820.3400048038474,778.6367140820595,1.0535593685316422 +2999,158.69374275606614,151.71415684781323,1.0460048426150121 +3000,5339.707517183519,5066.292798399529,1.053967413583037 +3001,145.87936750823235,136.66891966231765,1.0673924098373788 +3002,268.42812630213655,254.3471001329633,1.0553614574800034 +3003,1146.1893322500912,1071.6531487038894,1.069552526054115 +3004,1581.0656667873386,1493.46631841684,1.0586550545467666 +3005,540.6015389197884,510.6288559896127,1.0586975894107822 +3006,61.293865457832574,56.54112316035751,1.0840581515155918 +3007,55.141473036139,50.865614394999184,1.0840618695359785 +3008,61.18604527527177,56.44146980417439,1.0840618695359787 +3009,61.16990842220746,56.426881223481836,1.0840561642941173 +3010,52.69268363445875,48.61424815012662,1.0838938302971886 +3011,57.5690509448574,53.111786939652866,1.083922312956049 +3012,57.05289141977005,52.64967054415992,1.0836324487902906 +3013,262.52345080834084,249.0880657506598,1.0539382929374466 +3014,150.51060880638408,143.85193804415366,1.0462883632487914 +3015,64.9092191058168,61.597085327720116,1.0537709497206704 +3016,65.97616270741916,62.60372392563006,1.0538696194142603 +3017,65.55771364711784,62.19294673250993,1.054102066092473 +3018,250.07961968454336,239.5137592131471,1.044113793320715 +3019,248.02155290445458,237.55055120508862,1.0440790461072256 +3020,250.16940981889596,239.57433375334384,1.044224587415363 +3021,219.89798998740378,210.51492880937872,1.0445719514102556 +3022,34.85205986677205,33.77481437998092,1.0318949343339587 +3023,22.312834968966506,21.922471990270008,1.0178065219501593 +3024,14.945375156842948,14.945375156842948,1.0 +3025,67.73440550341704,65.64079660603869,1.0318949343339587 +3026,54.29964562826592,52.62129294521043,1.0318949343339587 +3027,104.05332025411332,94.10847401428566,1.1056742906947787 +3028,435.9405582988626,422.4561433764823,1.0319190882504536 +3029,78.7012735831062,64.74938737004945,1.2154751848588201 +3030,655.4932136020641,624.8053517629015,1.0491158754523726 +3031,36.91946068136794,35.76603057809662,1.0322493182673083 +3032,18.87296029018184,18.66850159022995,1.010952068057722 +3033,15.020359875856467,15.020359875856467,1.0 +3034,568.2007123724782,547.4363413063392,1.0379302021064025 +3035,165.6219670889078,159.5677395042488,1.0379414260267679 +3036,35.63094055298104,34.48023761646747,1.033372825016844 +3037,2685.840870198098,2590.5399836273227,1.0367880392401174 +3038,684.3561550360344,665.2308428026053,1.028749888013091 +3039,94.39729657655707,91.41841512533816,1.0325851355783706 +3040,100.88472304396667,97.76641458351116,1.031895497791748 +3041,540.4281005790143,520.9706384496232,1.0373484812643097 +3042,82.1622089558824,79.45123804973977,1.0341211914714967 +3043,975.2225268853578,945.5451518842754,1.0313865233637352 +3044,78.16251691223597,70.78250159099255,1.1042632734837188 +3045,76.98712473822846,69.67155938014703,1.1050007409503455 +3046,65.68092426355224,63.51378876676682,1.0341207088864357 +3047,1040.5630255862613,1010.1896574492305,1.0300669957498128 +3048,183.59758162142361,179.50365528214726,1.0228069246436315 +3049,532.5914235920595,524.4996950305239,1.0154275181438661 +3050,4851.331572789168,4655.675736254846,1.0420252284777274 +3051,1537.246298763454,1469.04685091156,1.0464242837521318 +3052,994.8860247641477,941.1554542071897,1.057090006031171 +3053,3394.751885370797,3186.1083275503133,1.0654853935807331 +3054,1266.3582320365483,1190.1389442126176,1.0640423441267661 +3055,1129.842113699136,1059.9316254076916,1.0659575453884151 +3056,1359.8559002495183,1296.0970384655188,1.0491929692698667 +3057,864.8517584063865,820.9120425745755,1.0535254857438874 +3058,533.1609904718107,501.57278125479894,1.0629783162036557 +3059,600.428336126524,563.7700986739379,1.0650233801665094 +3060,238.04192800733327,223.98742936775906,1.062746818780167 +3061,297.11432183333136,279.55597916900075,1.0628079668212569 +3062,236.57811034524946,222.60893145615162,1.062752104319091 +3063,92.96004418805678,88.08583583199669,1.0553347573990957 +3064,107.70947881799633,102.35276749200628,1.0523357741783426 +3065,80.16375119665481,75.94296949212399,1.0555783074161798 +3066,108.59030719962699,103.19156189062954,1.0523177012740583 +3067,326.65036227119504,322.14893052345894,1.01397313888462 +3068,456.03355693065225,440.7535101613517,1.0346680092546667 +3069,1012.2766574484017,976.4240275897004,1.0367182994740547 +3070,141.00864534323208,137.4302183097066,1.0260381383187598 +3071,1008.8434431214381,973.1761870946315,1.0366503583829865 +3072,298.7305317141787,272.36612634890975,1.0967976661367036 +3073,377.19519353752383,354.8720820607878,1.0629046707396728 +3074,107.65631227980384,106.95036924846086,1.0066006600660067 +3075,107.79171766711265,107.04401348080728,1.0069850163684253 +3076,1610.9835562398775,1508.2777069750052,1.0680947870474455 +3077,491.3769817510922,446.1733098825937,1.1013141549869792 +3078,11.89317676067819,11.815188716345872,1.0066006600660067 +3079,11.824750706252651,11.747211357359191,1.0066006600660067 +3080,366.81182795557856,333.33923118037,1.1004160136107608 +3081,270.7397163711414,253.00189801167735,1.070109428027474 +3082,11.78892892461553,11.711624472650836,1.0066006600660067 +3083,11.613545910494322,11.537100008108903,1.006626093414436 +3084,11.950614780549119,11.87225009346355,1.0066006600660067 +3085,743.8851805737625,701.2790939484522,1.0607548221428116 +3086,494.7062087033889,462.6760085959628,1.0692281413177764 +3087,808.1949522827263,765.4778259582055,1.0558045248025945 +3088,125.18446448842593,120.58407488376648,1.0381508885737514 +3089,105.47525509692831,104.00124302517516,1.0141730235993078 +3090,381.93651974219836,358.5920705822155,1.0651002938299234 +3091,496.9404340561131,464.7582934280824,1.0692448980106486 +3092,316.9813709535229,270.05393133350015,1.1737706219950201 +3093,281.3710318634543,272.61730577573235,1.0321099427742242 +3094,275.83903256690104,268.4864047666151,1.0273854752782632 +3095,182.47835359262768,166.80221612287565,1.093980390873249 +3096,1667.5201635950825,1634.7954735633223,1.0200176049915475 +3097,467.6662246917788,448.9530514905198,1.0416818042312697 +3098,931.0653151405638,889.9617384866845,1.046185779541234 +3099,1496.604038570276,1451.5453203821407,1.0310418955270877 +3100,105.75093509400763,103.13479961630604,1.0253661759894277 +3101,659.1004006200483,622.2154923289511,1.0592799580624987 +3102,160.69233079999893,156.81928961997158,1.02469747943262 +3103,147.7640425481683,144.20995985187835,1.0246451957960494 +3104,149.38875087545009,145.7941207547671,1.0246555217869815 +3105,118.40559642142699,113.41101687235064,1.0440396328929664 +3106,257.0441257053044,247.05430086840258,1.0404357455093367 +3107,401.25825950569447,379.57717981887123,1.0571190283282286 +3108,112.29334883967135,106.7308916203172,1.052116656526603 +3109,3047.29295835836,2888.8408119404376,1.0548497327242792 +3110,723.6732623398342,698.9544073371743,1.0353654755491593 +3111,54.98691175137459,52.44704764080337,1.048427208485902 +3112,101.95575738955631,99.65307318032842,1.0231070064950334 +3113,445.3732870141932,426.8339126196642,1.0434346331123148 +3114,339.32795229225127,331.3150019827372,1.0241852927321762 +3115,119.94009822963982,112.43744519988792,1.0667273524083893 +3116,117.76359230861203,111.85713067445357,1.052803621892899 +3117,101.73454210829446,100.30091866038933,1.0142932235023616 +3118,106.49448436051357,105.18665735959497,1.0124333925399644 +3119,960.0332439328159,937.6637141752007,1.0238566656888202 +3120,976.8714902243138,934.7132170893368,1.0451028961227875 +3121,252.56918476754916,240.0583447408761,1.05211583059184 +3122,607.0865563117623,578.3262660912793,1.049730216154394 +3123,256.5329024819756,243.82528507517344,1.0521177178276826 +3124,249.83236210651856,237.45681255891182,1.0521170541044655 +3125,1126.8278191215209,1080.3689054200959,1.0430028238209612 +3126,729.8695609560716,707.4792691655575,1.031647982868703 +3127,1641.2682102336357,1602.469540253392,1.0242117987304198 +3128,514.9349320546822,495.2414210921002,1.039765476238143 +3129,68.64274874117625,64.31037917321393,1.0673665685642046 +3130,605.2618109248074,581.1295689061128,1.0415264397303339 +3131,212.24441468150573,204.82961183258666,1.0361998579335268 +3132,231.08434651095396,223.01005828412013,1.0362059374763581 +3133,162.61084105218353,156.51244258272664,1.0389643044912134 +3134,227.75465929256723,219.79249732115255,1.0362258132941666 +3135,579.0741557894811,567.6135647991237,1.0201908335196557 +3136,598.3342793044616,580.209608579551,1.0312381430036686 +3137,16.790970255408705,15.739623500813526,1.066796181912537 +3138,393.84757279663387,381.24396599602744,1.0330591640124156 +3139,64.98002092451594,60.878095622207915,1.0673793301249666 +3140,69.21266506780776,64.8462931191876,1.0673341796206417 +3141,135.39338219052777,125.06592801119336,1.08257608082043 +3142,34.556268750935494,31.822506215541924,1.0859065755813544 +3143,80.4001792692849,76.29672229184456,1.0537828736828838 +3144,35.046314050828535,34.12867221315502,1.0268877098980664 +3145,47.98167516565434,46.63366868196438,1.0289062928521278 +3146,49.63771978211743,46.79629623563001,1.060718983660164 +3147,49.22409527413379,46.40624008700756,1.0607214715487185 +3148,64.69908403822204,60.50984662359247,1.069232325784746 +3149,64.42019284111181,60.255828266139716,1.0691113987609433 +3150,83.54178749351867,77.62210337282846,1.0762628666767409 +3151,83.67670872889794,77.94965900894975,1.073471132430363 +3152,326.2815362886475,284.9176082989663,1.14517855964268 +3153,408.0347386965657,356.73031119582686,1.143818525901981 +3154,410.56985741196166,358.980921820911,1.1437094075344412 +3155,84.13275377063916,72.44142397391211,1.1613901157014441 +3156,104.5671671403641,89.93940897058776,1.1626401411483587 +3157,165.4670133316142,152.57524201105625,1.0844945166111797 +3158,93.2937639809725,80.28387832046211,1.1620485448968967 +3159,105.2977044376764,90.56775240331211,1.1626401411483587 +3160,173.07586162162136,160.3096708590223,1.0796345641170066 +3161,2430.682901843321,2337.36560696232,1.0399241327942177 +3162,292.8533103316772,269.61754491250053,1.0861804650981353 +3163,312.48288109471673,297.67564173241146,1.0497428653420553 +3164,57.69269643866974,54.64351398206396,1.0558013611204917 +3165,57.5402199057238,54.49907950310641,1.055801683814569 +3166,57.88403240054969,54.825830789316335,1.0557803058741664 +3167,57.22434020407832,54.20949668934041,1.0556146745286188 +3168,232.88501253426992,220.56615980467166,1.055851055032683 +3169,232.40926368834096,215.58801041321988,1.078024994260486 +3170,98.13556242061904,96.05599148670518,1.0216495702321877 +3171,117.23157979640828,114.75775982415112,1.021556886227545 +3172,115.53580028707135,113.0946574879795,1.0215849524045937 +3173,101.25849176748642,98.91572479345396,1.0236844746265004 +3174,57.7711020150771,53.57469162327944,1.0783282229845672 +3175,57.60453294665568,53.419855824987394,1.0783356124243018 +3176,56.535907710893206,52.430166005465125,1.0783087679905516 +3177,56.49923882631724,52.39910185810139,1.078248229889878 +3178,428.69999189148473,419.3929444595698,1.022191711984826 +3179,42.6753240964978,41.59443807076464,1.0259863115326682 +3180,42.56202329952249,41.48989503835439,1.0258407079646017 +3181,42.24782908833772,41.18361531213045,1.025840707964602 +3182,41.96993346578535,40.91271982085701,1.0258407079646017 +3183,161.72064438762126,157.57844542820422,1.0262865834737804 +3184,73.65490905742337,71.79955765604589,1.025840707964602 +3185,63.432664293285,61.8348090505625,1.025840707964602 +3186,394.10931047027674,383.1232297925835,1.0286750575882357 +3187,557.6671023342413,539.0001631851306,1.0346325296801426 +3188,268.7963856143114,258.4115018696055,1.0401873897623417 +3189,398.0676165759412,386.97239872137357,1.0286718584871382 +3190,1074.2382331404747,1025.6299776216322,1.0473935596457133 +3191,1645.6833817881286,1573.4361692193402,1.0459168372903451 +3192,392.74795747138006,381.7894571046063,1.0287029936601189 +3193,2348.320843916628,2241.0894169029734,1.0478479020983646 +3194,1043.3188760856256,1007.957734211095,1.035081968890498 +3195,77.80308510114918,69.34398967333328,1.121987434926446 +3196,79.203523569445,70.6816018189103,1.1205677507474756 +3197,78.04846265495263,69.56323601234861,1.1219786072214604 +3198,440.1735267355409,418.7205308222134,1.0512346406114879 +3199,208.8250928661199,200.27584182572983,1.0426873803772558 +3200,77.90282548271138,69.43318764407714,1.1219825579959057 +3201,4923.761014178907,4683.929660700902,1.0512030220031352 +3202,2456.924803810356,2351.7168482789393,1.0447366593509806 +3203,168.95075035616014,158.59886932100613,1.0652708375505608 +3204,523.8485270535492,506.957869158128,1.033317675734022 +3205,2223.1514658123447,2119.8166105129926,1.0487470731132469 +3206,8324.307254892286,8025.883234289881,1.0371827015034825 +3207,702.739287347706,654.6600752646794,1.073441491087704 +3208,4225.279375721608,4016.314740150862,1.0520289491960724 +3209,6550.802086791783,6332.478531437385,1.0344767936078327 +3210,258.5814815928225,232.50104881876763,1.1121733983849007 +3211,2206.569463218067,2066.007124442757,1.0680357473661775 +3212,4273.368663928568,4050.5436488886053,1.0550111378508664 +3213,3715.9466380296763,3550.099703050427,1.0467161344332796 +3214,5390.029042952019,5142.382303742693,1.0481579790419482 +3215,3331.472655834009,3144.8896351778126,1.0593289565933042 +3216,3701.987544304869,3540.4869375858884,1.0456153657861258 +3217,6178.944262944281,5932.623606605597,1.041519683814834 +3218,2306.753039438238,2233.429174255298,1.032830172556239 +3219,4252.031720233519,4036.433587222942,1.0534130262152803 +3220,3170.185761906024,2977.52163265303,1.064706206376518 +3221,1802.636228540164,1751.690861640732,1.029083537520835 +3222,358.5414978435381,335.5314204399304,1.0685780108862477 +3223,555.8386845821201,518.4234601322344,1.0721711637824844 +3224,358.34398259171763,335.4123556325477,1.068368462205048 +3225,357.91828259242897,334.9962274871046,1.0684248156382798 +3226,3860.5412491897077,3576.8634874129048,1.0793090826012997 +3227,1313.1273347961394,1235.3674717805868,1.0629447227580584 +3228,663.7611835924356,637.9849065863203,1.0404026439183913 +3229,2310.4585987479218,2169.5025931972177,1.0649715773526576 +3230,1301.575878727823,1233.107788616812,1.0555248217090676 +3231,363.02933080718714,346.9195933885596,1.0464365164886613 +3232,616.8231955372621,589.1436972489776,1.0469825925619416 +3233,945.5476749689668,901.1712370102169,1.0492430696145785 +3234,63.74210014484601,57.259528067278595,1.1132138579617796 +3235,389.2029185887922,378.2021209320045,1.0290870861053831 +3236,105.31636360581332,105.18702558374578,1.0012296005267738 +3237,710.7576811722392,686.4880825185951,1.0353532701756505 +3238,88.91348214876535,88.61357196535423,1.0033844723416452 +3239,813.238265931829,765.361798317774,1.0625540335554833 +3240,1143.8899551394288,1064.7704612452624,1.074306619852729 +3241,99.54487428671459,99.5365065653853,1.000084066857659 +3242,1275.3460264237688,1227.1042341289563,1.0393135244367047 +3243,555.0030460770997,537.0294532251372,1.0334685420772025 +3244,99.46277527161917,99.45956218668638,1.000032305440142 +3245,81.54219273582063,81.54096841175249,1.0000150148335492 +3246,463.15670235279924,448.17223917499604,1.0334346080993033 +3247,601.6981887265451,581.152876760834,1.0353526804861128 +3248,33.2479162644851,32.08528805255996,1.036235554750844 +3249,142.373476410333,136.26799724826557,1.0448049379557838 +3250,408.4207466855593,393.7746456393897,1.0371941190433633 +3251,175.86397571430757,172.71313830918535,1.0182431830952066 +3252,99.59969532728222,94.26079371457196,1.056639684457536 +3253,46.13134900279076,44.518364771923956,1.036231884057971 +3254,41.035421467783785,39.01611966171758,1.051755577529857 +3255,46.25617866492351,44.638740002534554,1.0362339676768906 +3256,43.83834562351459,42.37272485601225,1.0345887778631822 +3257,941.5194744989901,888.2302075626258,1.0599948825007814 +3258,131.8812730613697,127.46363416323567,1.0346580334629139 +3259,43.78053757071229,42.31684946470779,1.0345887778631822 +3260,876.3023621930289,826.7151620475604,1.0599809975937224 +3261,65.56058834250605,63.29760130597421,1.035751544921786 +3262,43.44009557262829,41.987997861527376,1.0345836378264521 +3263,18.87638913305142,17.93960718816794,1.0522186430871983 +3264,196.29819098062055,195.65283266117146,1.0032984869713935 +3265,97.73891452431789,97.41845906686112,1.0032894736842104 +3266,195.8563002874684,195.21414848324721,1.0032894736842104 +3267,97.63088458669924,97.3108894156039,1.003288379882427 +3268,201.55877804777055,200.6109772727522,1.0047245708480335 +3269,100.6706199215365,100.18950216109353,1.0048020775636692 +3270,301.79593519931734,284.8327322655149,1.0595549633600037 +3271,229.13339922870375,216.7914924009829,1.0569298485426402 +3272,133.10245100804875,128.55867586590165,1.0353439790161394 +3273,1607.5278256453191,1524.9093771607804,1.0541792513850006 +3274,302.0379506415851,285.6382106248434,1.0574143773722244 +3275,247.1379428497277,238.7371776790073,1.0351883408038591 +3276,3657.96430585738,3519.349237544918,1.0393865623887781 +3277,2278.5408694791613,2197.557954928064,1.0368513214268098 +3278,249.19530796687917,240.66958913916693,1.0354249943177585 +3279,238.59854056643468,217.4505594919366,1.0972542040080715 +3280,361.99466801455213,354.9311596882746,1.0199010656953342 +3281,314.90550182710246,292.42863117068254,1.0768627564491138 +3282,237.28133405489334,216.24373555751316,1.0972865107196823 +3283,364.77484185385833,357.6523755638964,1.0199144945667766 +3284,209.1888455990299,196.44168074258891,1.0648903267791954 +3285,237.721139994392,216.67647079288616,1.0971248475872664 +3286,169.60117033114025,155.00372807795674,1.094174781691973 +3287,2094.3939488926317,2006.7664847051944,1.0436659994350614 +3288,1256.3868642119737,1199.9901314538556,1.0469976637972767 +3289,624.5506301375798,596.5157819669284,1.0469976637972767 +3290,1252.535382421035,1196.3115350977093,1.0469976637972762 +3291,621.0719658058406,593.1932680282415,1.0469976637972767 +3292,1556.467892417626,1502.9725845814808,1.0355930030826488 +3293,774.6773632831919,748.104307787909,1.0355205219628498 +3294,3807.4522440625196,3666.259763476231,1.0385113138989406 +3295,3490.775759334937,3359.6609258089543,1.0390262102103094 +3296,1266.321266496344,1209.4785979785468,1.0469976637972767 +3297,2672.6963652607365,2587.1497833485046,1.0330659563906308 +3298,3580.7843913265197,3456.8057876272906,1.0358650764075255 +3299,1254.6451623908408,1198.3266111984083,1.0469976637972767 +3300,817.3762639751205,770.4072935503087,1.0609664145420563 +3301,1941.729625567139,1873.9062941567322,1.036193555473876 +3302,936.9918113118282,891.2886306900609,1.0512776434569602 +3303,1027.8790139596379,942.1181392306553,1.0910298519451243 +3304,857.6638292350124,836.2661107218017,1.0255872122986567 +3305,727.6412069744121,699.2567529581415,1.0405923201973992 +3306,2854.8092976693597,2761.1946229028636,1.033903685741673 +3307,1911.2725726355752,1858.519782842314,1.0283843036163889 +3308,460.32712848943265,443.0937159508219,1.0388933806060194 +3309,3964.778451049716,3747.0542372199247,1.0581054343081322 +3310,3224.021690444689,3100.7247249807615,1.0397639185673577 +3311,789.9485100373569,777.001699140757,1.016662525848936 +3312,1514.8729655053676,1415.5463298100997,1.0701684103187163 +3313,1153.335932765149,1110.5902249244007,1.0384891806909773 +3314,718.6280622445646,650.4658226602663,1.104789886278005 +3315,536.5185616423325,479.67806234542013,1.118497183337897 +3316,627.9306768366839,584.7223906748129,1.0738953849740651 +3317,499.0535018637477,453.1390140928719,1.10132539097917 +3318,672.6098700351358,644.6025770721443,1.0434489311076038 +3319,1161.99890594181,1099.7094120804143,1.0566417757065092 +3320,561.7562038807255,497.9700111217504,1.1280924379668713 +3321,1056.3023813086609,976.3344060000935,1.0819063374363556 +3322,1527.0860139427791,1440.2647303080912,1.060281475903472 +3323,1051.719021559097,999.4652504943065,1.0522817286933661 +3324,1770.2550806107204,1720.7768072351303,1.0287534520267563 +3325,3328.6161265275587,3126.0904817688734,1.0647855991180677 +3326,1599.3984010047286,1499.566377638714,1.066573927539783 +3327,5961.254496028445,5690.06000049891,1.0476610959297012 +3328,1288.470150008244,1224.0220527834194,1.052652725560189 +3329,4792.301786991529,4582.806452777151,1.0457133279297504 +3330,9507.848343238129,9080.381939371002,1.0470758175945998 +3331,2924.0063677827297,2784.569598375749,1.0500748013223713 +3332,1723.3450992931382,1594.6917025608732,1.0806760306871002 +3333,6892.059318257811,6573.8186292328655,1.0484103238884281 +3334,2946.4902423585445,2814.3240212077744,1.0469619774250623 +3335,1733.0210877273576,1663.5836668049249,1.0417396625778337 +3336,406.6838042280194,376.6201109053325,1.0798249813330965 +3337,79.42485031220663,75.34898989636791,1.0540930996081632 +3338,6554.550323631639,6366.034983375607,1.029612677396264 +3339,5422.701545548887,5171.4055924338245,1.0485933560273688 +3340,1331.638093201846,1276.5957217477376,1.0431165250802752 +3341,2811.739441138827,2697.442121037185,1.042372482883041 +3342,3137.011884687005,2967.5182509068445,1.0571162902632072 +3343,8984.165550151969,8643.400361312326,1.0394248992983017 +3344,6839.553366591685,6537.689857644052,1.0461728095888008 +3345,54.20330821178826,52.05238328274904,1.0413223140495869 +3346,135.93208318276953,130.5415505343879,1.0412936159124417 +3347,154.80741920662064,147.70053909228017,1.0481168190584615 +3348,138.6487011601174,133.13435852923038,1.0414193803298066 +3349,22.61729215610673,20.88263258071211,1.0830670926517574 +3350,226.61867017509738,199.20019804083205,1.1376427955590942 +3351,265.4623755659037,254.44288388099704,1.043308311542564 +3352,302.8896706136195,298.10480839619976,1.016050939410076 +3353,35.28045409111691,32.574505750181835,1.0830695133699755 +3354,40.71210824242207,35.978960099705716,1.1315532224833553 +3355,37.999492887869835,33.57601877739376,1.1317450451705826 +3356,1105.8862596724503,1054.909586988295,1.0483232623088494 +3357,11.986600255312762,11.068731711730686,1.0829244548957053 +3358,143.6518593513018,134.94730372187223,1.0645033682730687 +3359,54.41969864834576,47.882068545025604,1.1365360833810372 +3360,1099.9574108771753,1021.7965072883976,1.0764936100595979 +3361,1463.7705949213405,1376.3217934550635,1.0635380489374866 +3362,304.4301165314383,291.9973734183338,1.0425782703712632 +3363,349.5781191739872,335.30148597021264,1.0425784966698384 +3364,227.2505039577289,217.48159646102448,1.0449183179435375 +3365,326.10197406179674,312.6956445298503,1.0428734130662527 +3366,109.74531062910854,101.9016638778755,1.0769727053783271 +3367,1939.5612320236298,1828.3767775645797,1.0608104717929907 +3368,116.54895650303074,108.3647853941622,1.075524268138397 +3369,322.9240635726388,307.3898334975651,1.050535926638565 +3370,147.58410712120312,137.24433886648035,1.0753383953037359 +3371,277.2190401955121,255.37858125673952,1.0855218900163586 +3372,456.42432588270094,416.9098114702493,1.0947795262315898 +3373,3827.263907871095,3658.06503027988,1.0462536549215664 +3374,75.24150094167189,70.47860581600636,1.0675793039677839 +3375,382.7441012642638,358.79149035593736,1.066759138809464 +3376,540.0915500173563,519.1677274387655,1.0403026256693868 +3377,60.7227022621936,57.40945957923662,1.0577124868835255 +3378,61.006915862051905,57.6779547663905,1.0577163512323642 +3379,127.28066567888351,121.79674266634913,1.0450252025832667 +3380,43.39766292489227,41.067298263319344,1.0567450200066941 +3381,45.30554939125315,42.87056058032261,1.0567986230636832 +3382,63.77021284530677,60.702349787622694,1.0505394448224412 +3383,404.3702043068976,382.97343244737544,1.0558701206054608 +3384,287.4189653100889,272.1975675100132,1.055920403475008 +3385,45.28456539779825,42.8463550578068,1.0569058986861752 +3386,1570.4184742529542,1502.3309552547717,1.0453212514592938 +3387,2115.4385102217802,2054.3050255125886,1.029758718374326 +3388,839.3580335275467,795.4283727309195,1.0552276764352835 +3389,154.53823391165952,143.78296387108952,1.0748021166833976 +3390,31.528858613066944,29.532192996389856,1.0676097984637025 +3391,231.20118817056664,216.1373510715718,1.0696956681680003 +3392,135.78069355440962,128.37202475927816,1.0577124868835255 +3393,93.90217154216799,88.48829841797541,1.0611817971526596 +3394,79.86316381228531,75.22491960485438,1.0616583471513823 +3395,52.251780746161515,49.27631472316632,1.0603832904248485 +3396,3525.204160250043,3371.874345460311,1.0454731698398447 +3397,2160.333782154971,2077.24854252684,1.0399977363936734 +3398,1090.169139951758,1027.6627976263612,1.0608237862358845 +3399,1373.131762103105,1330.481259983202,1.0320564470937692 +3400,907.1571063150963,860.3802881824,1.0543676078766457 +3401,82.40230815124407,82.04115681317374,1.0044020751547025 +3402,72.98071222456414,72.66132179907372,1.0043956043956044 +3403,72.06962890590569,71.753261605678,1.0044090999230988 +3404,73.46322591764228,73.1320013373323,1.0045291332693351 +3405,72.78293892356419,72.42375956955826,1.0049594132663184 +3406,456.3245906685372,436.8209839418076,1.0446489693574974 +3407,172.4124844224429,163.54451442603005,1.0542235857163145 +3408,184.58956696240122,175.103142261883,1.0541762105349908 +3409,586.8997324401296,556.2753431228069,1.055052573686628 +3410,588.6004270755941,557.886558126258,1.0550539684133868 +3411,591.1936432141252,560.3708250116504,1.0550043236134465 +3412,591.2063348721067,560.3562252731388,1.055054460372829 +3413,49.05258844659352,49.050129871487286,1.0000501237226624 +3414,230.37799352451364,220.06727779750207,1.0468525617720374 +3415,86.20492189296343,86.18985348121073,1.0001748281397878 +3416,408.1820878371599,387.83550113462155,1.0524618985188667 +3417,83.39205834481294,83.37518499574587,1.0002023785502596 +3418,131.25223933632407,131.251108910435,1.0000086126959113 +3419,1137.5921461612236,1102.7250623681132,1.0316190181786864 +3420,261.68906156519984,248.03369900572343,1.0550544648336728 +3421,264.1075167640078,250.32597888345632,1.0550543652801123 +3422,3619.958164255343,3498.409737072298,1.0347439083235472 +3423,262.0489418949568,248.37480019220462,1.0550544648336726 +3424,263.94948348291433,250.1761684165997,1.0550544648336726 +3425,969.4171604384196,934.6945817015352,1.0371485824531848 +3426,240.9409207993596,228.36825476539397,1.0550543509074048 +3427,246.14511484999787,233.30092356307784,1.0550541810583416 +3428,72.08816379843948,72.08816379843948,1.0 +3429,859.9968083021893,839.1474973171021,1.024845823948407 +3430,2169.1659255659915,2100.4576972336276,1.0327110745543007 +3431,48.40892306830406,47.51378863028655,1.018839466685823 +3432,1098.9777010971668,1068.3148586133802,1.0287020649732284 +3433,4298.464620299019,4156.792205652644,1.034082149801407 +3434,42.52088972127572,41.34609883141394,1.028413584910439 +3435,256.4564276105243,250.36775182167045,1.0243189298324276 +3436,1094.6949497698365,1057.2537190365692,1.0354136666148461 +3437,158.90244771650725,158.16234822330046,1.004679365863751 +3438,106.95673830372394,103.8979014467435,1.0294407953807263 +3439,103.3159270590029,99.07091462013494,1.042848220945012 +3440,363.6511528040501,353.7770179121642,1.0279106171174113 +3441,941.7402383120133,919.4433187784101,1.0242504557684178 +3442,103.92217953282176,99.65650644320978,1.0428037590505224 +3443,472.74168170572864,445.73791455688803,1.0605821633452144 +3444,385.522555468921,376.2615724093529,1.0246131514315064 +3445,382.5247586208696,373.3798682024309,1.0244921893150403 +3446,522.6263920382972,497.77122512696616,1.0499329122630408 +3447,386.09520652474305,376.81387313562004,1.0246310819500601 +3448,383.95974825151416,374.7797264695763,1.024494446026773 +3449,586.688567283378,563.19046908766,1.0417231815619745 +3450,531.3297099824001,517.8726783706235,1.0259852125316136 +3451,691.8386465402677,670.8932802139941,1.0312201164387766 +3452,411.31409319312263,391.69650536893784,1.0500836427062505 +3453,828.6011031081118,788.8628881498743,1.0503740454205368 +3454,885.867531301081,859.4371036141118,1.0307531843526696 +3455,3632.9502421083375,3470.7128066919818,1.0467447018674496 +3456,614.8282188418216,584.1978245055438,1.0524315446778714 +3457,1065.6749369726654,1020.2176723959739,1.0445564371277116 +3458,2365.090043381584,2311.9764368350457,1.022973247348164 +3459,104.32494409215487,100.04273880556705,1.0428037590505221 +3460,1684.7360714484207,1646.7453406100735,1.023070191790719 +3461,137.41721630777,131.79076048331387,1.0426923390063334 +3462,583.0210643086026,568.6256197105313,1.0253162082380312 +3463,1132.8750342613507,1105.062765000573,1.025168044876404 +3464,1493.6719024866259,1453.607326635281,1.0275621724775452 +3465,433.45265243103523,422.750219833068,1.0253162082380307 +3466,1322.8900930434847,1292.6085822284554,1.0234266669983145 +3467,2215.0900563332184,2142.7577960625717,1.0337566198118895 +3468,333.48896164278204,321.35568991507716,1.037756517492848 +3469,601.4806735652443,572.7832624616398,1.0501016928816533 +3470,165.23817057879808,156.53770463393715,1.055580640876311 +3471,271.51602266663923,256.2996757353127,1.0593693569360614 +3472,214.49229945590955,204.6337616372745,1.0481764970733907 +3473,190.81478164273238,181.65397708032907,1.0504299697129797 +3474,114.18879297188288,107.06371736049631,1.0665498619611309 +3475,236.54761376317637,226.19395765544618,1.0457733540499856 +3476,212.67847999456032,202.93658482402054,1.0480046275489834 +3477,117.55902937215257,110.36081626295106,1.0652243554637244 +3478,267.8617554024145,256.79142286614615,1.0431102114420652 +3479,305.48855504688356,294.6660694220753,1.0367279668338953 +3480,492.63366776590095,481.9165136955923,1.0222386113896031 +3481,635.6365962928143,609.6630387124555,1.0426031363738437 +3482,638.9729496653632,612.8694808459612,1.0425922152027713 +3483,639.550897640225,613.4179048257661,1.042602266104185 +3484,635.4819847999057,609.5142781194181,1.0426039349900182 +3485,738.7299497350228,706.0502955601274,1.0462851646410967 +3486,1404.1885819076406,1344.9974587767622,1.044008353134519 +3487,1408.1787930789244,1348.8198393704904,1.044008066886188 +3488,1926.7671871865848,1831.9188922914882,1.0517753789724031 +3489,1423.2196121102852,1359.1243545064276,1.0471592296844199 +3490,1399.3219893946298,1340.3360231017316,1.0440083421442306 +3491,3390.2399314299614,3189.64446192629,1.0628896016148859 +3492,2482.327409614778,2377.7836611618454,1.043966888224747 +3493,2510.4427919660734,2404.650644542125,1.0439948096677023 +3494,50.7871589826298,46.21996842663791,1.0988142292490117 +3495,696.4942621773755,663.6786538092674,1.0494450261128014 +3496,3169.3598290516493,2987.224438620419,1.0609714449562235 +3497,72.51271993186182,66.79622187098634,1.0855811586457182 +3498,71.49448757696118,65.84872420713577,1.0857383865489316 +3499,425.52776034417116,391.8110267657918,1.0860535596884409 +3500,429.8511858105297,395.84744395623244,1.0859011277537944 +3501,3962.9197436956274,3768.6590003616,1.051546383823898 +3502,1226.1952540566926,1152.0880471766843,1.0643242563462194 +3503,737.8569275222765,687.3749333036467,1.073441715391052 +3504,1486.1795886528218,1443.6177836521144,1.0294827380783804 +3505,800.1704488155585,747.454061085551,1.0705279300422101 +3506,735.4303043900771,685.1138736371502,1.0734424344464166 +3507,619.0355314456565,576.4885106197816,1.073803761986744 +3508,776.0873298531706,723.0054808166343,1.0734183217761784 +3509,728.9438586563399,679.072262090014,1.0734407799441457 +3510,4056.4361435505593,3785.8674291744824,1.071468090058049 +3511,1013.4358934623785,953.3071708162518,1.063073817639117 +3512,174.65018713576953,162.26536235855596,1.0763245131135686 +3513,216.01566887625285,206.6310042854498,1.045417504615322 +3514,215.38321350763337,206.02591858173884,1.0454180473520478 +3515,770.1738099084506,735.4910864960015,1.0471558718375273 +3516,644.0607971433278,616.0802148337661,1.0454171090644608 +3517,1312.9370335260598,1248.0907575806898,1.0519563786138988 +3518,1754.6136207528739,1687.0387140540058,1.040055338467298 +3519,285.36701977830006,272.9664163655205,1.0454290442681209 +3520,609.9311400997574,573.2667336234115,1.0639569755680807 +3521,660.2777574495819,625.0543828629682,1.0563524959624766 +3522,223.07474527181424,206.22190534426235,1.08172187091094 +3523,223.16609436537718,206.3140261210296,1.0816816411428163 +3524,224.65004652393046,207.67622284299702,1.0817321475158261 +3525,227.19549585694847,210.02878763207804,1.0817350250811453 +3526,137.08358925866122,135.89754111108428,1.0087275173478485 +3527,875.5906025666798,859.5584928947699,1.0186515633367985 +3528,141.18467451346066,139.83088752259363,1.0096816019325365 +3529,139.87043470139278,138.65688597433646,1.008752170644312 +3530,1837.2280562967678,1755.4362914360595,1.0465934111421369 +3531,439.1130327637216,405.84515324243756,1.081971853687288 +3532,438.3169942413113,405.1065060006872,1.081979646706952 +3533,441.7828302667813,408.3219508983139,1.0819472950079048 +3534,2103.9955076839983,1966.6524389052258,1.069835963926207 +3535,2506.14786333735,2342.7424836778064,1.0697496121737708 +3536,335.44428116473523,313.4098703339697,1.070305414463449 +3537,5175.483132536222,4797.7509495237055,1.0787310944204005 +3538,1866.9287281861052,1741.3712757771605,1.072102632078222 +3539,326.8117852676253,305.38747731698606,1.0701545071162208 +3540,2015.9400531029341,1894.5706847146346,1.064061673374082 +3541,394.22597437629236,367.7717439267481,1.0719311118551111 +3542,325.0916462004725,303.79964033172024,1.0700856849122777 +3543,1543.6031948119703,1512.6570936648582,1.0204581073111132 +3544,5284.00914569579,4993.716150408401,1.0581316571755182 +3545,2763.381017345602,2660.866964813488,1.0385265606615173 +3546,3278.586115799993,3118.47987972334,1.0513411156242114 +3547,2759.6829405573885,2646.820774681249,1.0426406528752334 +3548,52.973907246964195,52.96101122466343,1.0002435003033847 +3549,734.4454654474036,709.9434754940813,1.0345125926205185 +3550,51.91351882694043,51.91304282761613,1.0000091691663284 +3551,51.671696828963555,51.601460549273156,1.001361129683981 +3552,123.07835568002805,112.56839124521453,1.0933651473433519 +3553,110.81846251688307,103.12046804102604,1.0746504997707576 +3554,227.22162318093598,194.09388327028103,1.1706789485195865 +3555,108.43457290762278,100.89271853013771,1.0747512257312428 +3556,216.8796957418918,197.88272771555086,1.096001142927686 +3557,218.86221884693205,199.7491361564365,1.0956854335306205 +3558,210.13599417436265,191.7257026005352,1.096024118436461 +3559,215.9570326549648,197.0885625427356,1.0957359974054195 +3560,434.7193185844026,394.4804001329244,1.10200486117414 +3561,438.1137060238966,414.1552527331809,1.0578489663781976 +3562,417.31017668924585,394.54114333332484,1.0577101621482472 +3563,427.0935073390819,403.73760412780587,1.0578492143721212 +3564,1542.0048069361799,1464.1052383447297,1.0532062631505374 +3565,1063.0693249190485,1008.6563472364415,1.053946002354211 +3566,322.63409252234146,301.97894747637065,1.0683992881576192 +3567,555.9453581083925,525.8128945470526,1.057306437087848 +3568,37.028889857161246,35.29645790822013,1.0490823173658357 +3569,734.4488599761485,678.5028782128924,1.0824550397053763 +3570,562.0501265122637,528.8427961927898,1.0627924414562093 +3571,402.2347800170092,379.72716726535805,1.0592731168373912 +3572,196.34549052900957,187.59458981648302,1.0466479375609246 +3573,1182.081552382842,1121.2683924861753,1.0542360422394732 +3574,128.90296239076267,124.67629554409764,1.0339011263385673 +3575,177.7094180643739,170.1658106263213,1.044330922940908 +3576,992.7490010990123,927.1080256705252,1.070801863009451 +3577,1104.7791932785412,1035.6045203617814,1.0667964184750702 +3578,177.216969585259,167.88495635387545,1.0555857620245206 +3579,130.89787573769016,126.42172045915962,1.0354065366479217 +3580,240.47468088357064,224.60976586283692,1.0706332378727557 +3581,337.7979945802796,316.4618950063413,1.0674207540010805 +3582,181.22947697470195,167.42439588182782,1.082455612398435 +3583,220.28275429255353,204.2855574624616,1.0783080166253627 +3584,181.17623309427623,167.38135818773836,1.082415838035352 +3585,358.46374951162596,334.80264858935703,1.070671785369565 +3586,388.4423591230155,359.0480911406576,1.0818672169763537 +3587,390.4183282952064,360.875401701622,1.0818646171345614 +3588,504.4986097247462,478.322261529209,1.0547253395897793 +3589,1162.9443141168456,1097.4902621152144,1.0596397565072517 +3590,387.69893004560765,358.3601981927329,1.0818693928645944 +3591,390.2467628882134,360.7174219226032,1.0818628077574421 +3592,1034.6398736939227,976.2106689330918,1.0598530692403605 +3593,447.9257841739161,421.37671812135665,1.0630055361647042 +3594,596.2641810379303,577.0089173728458,1.0333708251039773 +3595,1357.5774765011831,1315.0441835414179,1.032343622740662 +3596,1091.7870367703167,1058.1016380994379,1.0318356927708614 +3597,271.290382676033,258.2718675385398,1.0504062454094059 +3598,297.51380914825455,283.33310011310897,1.0500496024978534 +3599,163.51372121195539,152.6570571614999,1.071117996457707 +3600,176.2367715336812,164.93671034705181,1.0685114985187492 +3601,208.96522503232364,196.50866404655613,1.0633893729124144 +3602,209.00094154602687,196.54239103800052,1.0633886178051917 +3603,533.8693463121834,504.97725395399334,1.0572146411189094 +3604,465.90942751191966,438.1334331645503,1.0633961990682814 +3605,716.962245608935,680.6609161700302,1.0533324722729291 +3606,467.1467047999673,439.32068516745625,1.0633387422263183 +3607,463.7208654827342,436.07847726773076,1.06338856342601 +3608,325.99904286523514,314.05707750629404,1.0380248248304538 +3609,105.36490178141565,102.53792169723943,1.027570093457944 +3610,990.0941768664734,966.4447218208845,1.0244705718926488 +3611,103.92992189692671,101.11350995098063,1.0278539628118089 +3612,103.9256291736448,101.13667773514096,1.0275760634120057 +3613,36.780368255266474,35.15200831353818,1.046323382926066 +3614,450.3824082428985,427.22469895318494,1.0542049870863182 +3615,36.51286243355573,34.89661130189201,1.0463154177831615 +3616,36.60170079853948,34.98170383134391,1.0463098359932956 +3617,152.9310169450208,146.06637060822558,1.0469967611861004 +3618,15.987540807195826,14.537690292817773,1.0997304582210243 +3619,16.18341619532117,14.715802471725869,1.099730458221024 +3620,15.95234551979272,14.50568673490956,1.099730458221024 +3621,74.65450573138172,64.77694822899655,1.152485687770694 +3622,16.145837197062864,14.681631372819417,1.0997304582210243 +3623,15.91747146526872,14.473975278467389,1.0997304582210243 +3624,16.22349112397784,14.771931665950147,1.0982647016553422 +3625,1557.4956550401532,1437.387239793629,1.0835602347936306 +3626,1279.2179884682923,1215.7758867031712,1.0521823984658534 +3627,212.4022626329599,199.8235596701017,1.0629490485687723 +3628,145.5181551264822,139.05464712833395,1.0464817834687903 +3629,95.11261112023261,87.25889212076963,1.090004798463326 +3630,464.813218076366,431.9304816967341,1.0761296962660751 +3631,253.3551437341684,234.7923356106202,1.0790605369433046 +3632,1013.9474842627728,943.9019914654623,1.0742084384084845 diff --git a/Database/tg/fortran/EXT_IN.TXT b/Database/tg/fortran/EXT_IN.TXT index aa42986..6947bdc 100644 --- a/Database/tg/fortran/EXT_IN.TXT +++ b/Database/tg/fortran/EXT_IN.TXT @@ -1,74 +1,74 @@ -1700104,0.245,0.449 -1702300,0.023,0.081 -1702400,0.098,0.154 -1702601,0.014,0.021 -1702700,0.153,0.192 -1702801,0.065,0.064 -1702901,0.093,0.098 -1703005,0.004,0.008 -1703007,0.012,0.009 -1703008,0.005,0.009 -1703009,0.009,0.007 -1703102,0.007,0.016 -1703105,0.01,0.011 -1703106,0.011,0.012 -1703107,0.005,0.01 -1703108,0.016,0.016 -1703202,0.009,0.01 -1703203,0.014,0.012 -1703204,0.013,0.014 -1703205,0.012,0.009 -1703207,0.007,0.012 -1703208,0.009,0.007 -1703209,0.011,0.006 -1703306,0.014,0.004 -1703307,0.009,0.01 -1703308,0.009,0.008 -1703309,0.009,0.016 -1703310,0.018,0.018 -1703401,0.013,0.01 -1703407,0.006,0.01 -1703408,0.006,0.005 -1703409,0.006,0.011 -1703410,0.006,0.011 -1703411,0.006,0.008 -1703412,0.008,0.006 -1703413,0.008,0.021 -1703414,0.01,0.017 -1703415,0.006,0.014 -1703416,0.016,0.013 -1703417,0.008,0.008 -1703418,0.007,0.011 -1703419,0.007,0.022 -1703420,0.007,0.013 -1703421,0.009,0.007 -1703422,0.008,0.053 -1703501,0.007,0.012 -1703502,0.009,0.01 -1703503,0.004,0.007 -1703504,0.008,0.012 -1703520,0.002,0.006 -1703521,0.003,0.009 -1703522,0.007,0.005 -1703523,0.002,0.008 -1703524,0.01,0.011 -1703525,0.015,0.015 -1703526,0.007,0.011 -1703527,0.002,0.044 -1703528,0.002,0.003 -1703529,0.012,0.008 -1703530,0.001,0.006 -1703531,0.003,0.002 -1703532,0.003,0.018 -1703601,0.015,0.011 -1703602,0.013,0.006 -1703700,0.018,0.019 -1800101,0.006,0.029 -1800102,0.011,0.038 -1800103,0.008,0.024 -1800104,0.016,0.048 -1800200,0.029,0.056 -1800300,0.139,0.074 -5510000,0.066,0.067 -5530000,0.255,0.115 -5550000,0.222,0.197 +1700104,0.162,0.190 +1702300,0.024,0.067 +1702400,0.102,0.148 +1702601,0.031,0.060 +1702700,0.082,0.049 +1702801,0.057,0.119 +1702901,0.079,0.060 +1703005,0.009,0.009 +1703007,0.008,0.012 +1703008,0.009,0.010 +1703009,0.015,0.007 +1703102,0.006,0.012 +1703105,0.007,0.006 +1703106,0.012,0.010 +1703107,0.008,0.009 +1703108,0.010,0.008 +1703202,0.013,0.010 +1703203,0.012,0.011 +1703204,0.011,0.010 +1703205,0.011,0.021 +1703207,0.008,0.018 +1703208,0.009,0.008 +1703209,0.016,0.014 +1703306,0.013,0.007 +1703307,0.010,0.009 +1703308,0.017,0.015 +1703309,0.016,0.024 +1703310,0.017,0.030 +1703401,0.012,0.014 +1703407,0.008,0.013 +1703408,0.007,0.007 +1703409,0.008,0.016 +1703410,0.012,0.010 +1703411,0.007,0.012 +1703412,0.012,0.009 +1703413,0.006,0.011 +1703414,0.011,0.009 +1703415,0.009,0.011 +1703416,0.010,0.024 +1703417,0.007,0.008 +1703418,0.012,0.016 +1703419,0.008,0.020 +1703420,0.009,0.012 +1703421,0.007,0.019 +1703422,0.006,0.025 +1703501,0.008,0.007 +1703502,0.014,0.009 +1703503,0.006,0.007 +1703504,0.005,0.007 +1703520,0.006,0.005 +1703521,0.005,0.006 +1703522,0.007,0.007 +1703523,0.004,0.011 +1703524,0.009,0.029 +1703525,0.023,0.080 +1703526,0.004,0.010 +1703527,0.007,0.007 +1703528,0.007,0.007 +1703529,0.013,0.014 +1703530,0.005,0.006 +1703531,0.005,0.007 +1703532,0.005,0.008 +1703601,0.016,0.007 +1703602,0.014,0.008 +1703700,0.018,0.014 +1800101,0.012,0.045 +1800102,0.011,0.035 +1800103,0.013,0.040 +1800104,0.023,0.028 +1800200,0.028,0.049 +1800300,0.128,0.095 +5510000,0.068,0.040 +5530000,0.246,0.111 +5550000,0.218,0.184 diff --git a/Database/tg/fortran/TG_INPUT.TXT b/Database/tg/fortran/TG_INPUT.TXT new file mode 100644 index 0000000..aeed33c --- /dev/null +++ b/Database/tg/fortran/TG_INPUT.TXT @@ -0,0 +1,25 @@ + &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 new file mode 100644 index 0000000..09fbe94 Binary files /dev/null and b/Database/tg/fortran/TG_PopSyn.exe differ diff --git a/Database/tg/fortran/airport_sz.csv b/Database/tg/fortran/airport_sz.csv deleted file mode 100644 index 34d49fd..0000000 --- a/Database/tg/fortran/airport_sz.csv +++ /dev/null @@ -1,68 +0,0 @@ -subzone,zone,airport,year_open -377,494,MDW,1927 -378,494,MDW,1927 -379,494,MDW,1927 -380,494,MDW,1927 -698,126,ORD,1955 -699,127,ORD,1955 -700,125,ORD,1955 -701,126,ORD,1955 -702,125,ORD,1955 -703,125,ORD,1955 -704,125,ORD,1955 -705,125,ORD,1955 -706,125,ORD,1955 -707,125,ORD,1955 -708,125,ORD,1955 -709,125,ORD,1955 -710,125,ORD,1955 -711,126,ORD,1955 -712,125,ORD,1955 -713,126,ORD,1955 -714,125,ORD,1955 -716,126,ORD,1955 -717,126,ORD,1955 -732,130,ORD,1955 -733,130,ORD,1955 -734,130,ORD,1955 -735,129,ORD,1955 -736,129,ORD,1955 -737,129,ORD,1955 -943,122,ORD,1955 -944,122,ORD,1955 -949,123,ORD,1955 -950,123,ORD,1955 -953,124,ORD,1955 -2586,129,ORD,1955 -3896,1733,ORD,1955 -3897,1733,ORD,1955 -3898,1734,ORD,1955 -3899,1734,ORD,1955 -3900,1734,ORD,1955 -3901,1734,ORD,1955 -3902,1734,ORD,1955 -3903,1734,ORD,1955 -3904,1969,ORD,1955 -5158,1969,ORD,1955 -13907,2907,SSA,2035 -13909,2907,SSA,2035 -13910,2907,SSA,2035 -13913,2907,SSA,2035 -13914,2907,SSA,2035 -13917,2907,SSA,2035 -13918,2907,SSA,2035 -13919,2906,SSA,2035 -13922,2906,SSA,2035 -13925,2906,SSA,2035 -13927,2906,SSA,2035 -13939,2906,SSA,2035 -13940,2906,SSA,2035 -13943,2907,SSA,2035 -13944,2907,SSA,2035 -13947,2907,SSA,2035 -13948,2907,SSA,2035 -13951,2907,SSA,2035 -13952,2907,SSA,2035 -14075,2921,SSA,2035 -14076,2921,SSA,2035 -14077,2921,SSA,2035 diff --git a/Database/tg/fortran/coefficients_attractions.csv b/Database/tg/fortran/coefficients_attractions.csv deleted file mode 100644 index ca53e2f..0000000 --- a/Database/tg/fortran/coefficients_attractions.csv +++ /dev/null @@ -1,197 +0,0 @@ -trip_type,wfh_flag,cbd,weight_formula -1,0,1,1 * total_employment * low_earner_share -1,0,0,0.755 * total_employment * low_earner_share -1,1,1,1 * total_employment * low_earner_share -1,1,0,0.755 * total_employment * low_earner_share -2,0,1,1 * total_employment * high_earner_share -2,0,0,0.755 * total_employment * high_earner_share -2,1,1,1 * total_employment * high_earner_share -2,1,0,0.755 * total_employment * high_earner_share -3,0,1,1 * retail_employment + 0.241 * nonretail_employment -3,0,0,3.103 * retail_employment + 0.634 * nonretail_employment -3,1,1,1 * retail_employment + 0.241 * nonretail_employment -3,1,0,3.103 * retail_employment + 0.634 * nonretail_employment -4,0,1,1 * enrollment -4,0,0,1 * enrollment * notairport_flag -4,1,1,1 * enrollment -4,1,0,1 * enrollment * notairport_flag -5,0,1,1 * households -5,0,0,1.132 * households * notairport_flag -5,1,1,1 * households -5,1,0,0.057 * households * notairport_flag -6,0,1,1 * retail_employment + 0.042 * nonretail_employment -6,0,0,0.623 * retail_employment + 0.18 * nonretail_employment -6,1,1,1 * retail_employment + 0.024 * nonretail_employment -6,1,0,0.941 * retail_employment + 0.208 * nonretail_employment -7,0,1,1 * retail_employment -7,0,0,1.43 * retail_employment * notairport_flag -7,1,1,1 * retail_employment -7,1,0,0.938 * retail_employment * notairport_flag -8,0,1,1 * households -8,0,0,2.309 * households * notairport_flag -8,1,1,1 * households -8,1,0,0.738 * households * notairport_flag -9,0,1,1 * retail_employment + 0.095 * nonretail_employment -9,0,0,0.383 * retail_employment + 0.106 * nonretail_employment -9,1,1,1 * retail_employment + 0.027 * nonretail_employment -9,1,0,0.641 * retail_employment + 0.158 * nonretail_employment -10,0,1,1 * retail_employment -10,0,0,0.882 * retail_employment * notairport_flag -10,1,1,1 * retail_employment -10,1,0,0.556 * retail_employment * notairport_flag -11,0,1,1 * total_employment -11,0,0,1.55 * total_employment -11,1,1,1 * total_employment -11,1,0,2.722 * total_employment -12,0,1,1 * households -12,0,0,1.414 * households * notairport_flag -12,1,1,1 * households -12,1,0,0.99 * households * notairport_flag -13,0,1,1 * retail_employment + 0.051 * nonretail_employment -13,0,0,0.401 * retail_employment + 0.099 * nonretail_employment -13,1,1,1 * retail_employment + 0.036 * nonretail_employment -13,1,0,0.938 * retail_employment + 0.189 * nonretail_employment -14,0,1,1 * retail_employment -14,0,0,1.106 * retail_employment * notairport_flag -14,1,1,1 * retail_employment -14,1,0,1.217 * retail_employment * notairport_flag -15,0,1,1 * households -15,0,0,1.414 * households * notairport_flag -15,1,1,1 * households -15,1,0,0.99 * households * notairport_flag -16,0,1,1 * retail_employment + 0.051 * nonretail_employment -16,0,0,0.401 * retail_employment + 0.099 * nonretail_employment -16,1,1,1 * retail_employment + 0.036 * nonretail_employment -16,1,0,0.938 * retail_employment + 0.189 * nonretail_employment -17,0,1,1 * retail_employment -17,0,0,1.106 * retail_employment * notairport_flag -17,1,1,1 * retail_employment -17,1,0,1.217 * retail_employment * notairport_flag -18,0,1,1 * households -18,0,0,1.414 * households * notairport_flag -18,1,1,1 * households -18,1,0,0.99 * households * notairport_flag -19,0,1,1 * retail_employment + 0.051 * nonretail_employment -19,0,0,0.401 * retail_employment + 0.099 * nonretail_employment -19,1,1,1 * retail_employment + 0.036 * nonretail_employment -19,1,0,0.938 * retail_employment + 0.189 * nonretail_employment -20,0,1,1 * retail_employment -20,0,0,1.106 * retail_employment * notairport_flag -20,1,1,1 * retail_employment -20,1,0,1.217 * retail_employment * notairport_flag -21,0,1,1 * enrollment -21,0,0,1 * enrollment * notairport_flag -21,1,1,1 * enrollment -21,1,0,1 * enrollment * notairport_flag -22,0,1,1 * households -22,0,0,1.173 * households * notairport_flag -22,1,1,1 * households -22,1,0,1.173 * households * notairport_flag -23,0,1,0.088 * total_employment -23,0,0,1 * retail_employment + 0.263 * nonretail_employment -23,1,1,0.088 * total_employment -23,1,0,1 * retail_employment + 0.263 * nonretail_employment -24,0,1,1 * retail_employment -24,0,0,1.634 * retail_employment * notairport_flag -24,1,1,1 * retail_employment -24,1,0,1.634 * retail_employment * notairport_flag -25,0,1,1 * households -25,0,0,0.985 * households * notairport_flag -25,1,1,1 * households -25,1,0,0.985 * households * notairport_flag -26,0,1,1 * retail_employment + 0.047 * nonretail_employment -26,0,0,0.754 * retail_employment + 0.18 * nonretail_employment -26,1,1,1 * retail_employment + 0.047 * nonretail_employment -26,1,0,0.754 * retail_employment + 0.18 * nonretail_employment -27,0,1,1 * retail_employment -27,0,0,1.53 * retail_employment * notairport_flag -27,1,1,1 * retail_employment -27,1,0,1.53 * retail_employment * notairport_flag -28,0,1,1 * households -28,0,0,0.985 * households * notairport_flag -28,1,1,1 * households -28,1,0,0.985 * households * notairport_flag -29,0,1,1 * retail_employment + 0.047 * nonretail_employment -29,0,0,0.754 * retail_employment + 0.18 * nonretail_employment -29,1,1,1 * retail_employment + 0.047 * nonretail_employment -29,1,0,0.754 * retail_employment + 0.18 * nonretail_employment -30,0,1,1 * retail_employment -30,0,0,1.53 * retail_employment * notairport_flag -30,1,1,1 * retail_employment -30,1,0,1.53 * retail_employment * notairport_flag -31,0,1,1 * households -31,0,0,0.985 * households * notairport_flag -31,1,1,1 * households -31,1,0,0.985 * households * notairport_flag -32,0,1,1 * retail_employment + 0.047 * nonretail_employment -32,0,0,0.754 * retail_employment + 0.18 * nonretail_employment -32,1,1,1 * retail_employment + 0.047 * nonretail_employment -32,1,0,0.754 * retail_employment + 0.18 * nonretail_employment -33,0,1,1 * retail_employment -33,0,0,1.53 * retail_employment * notairport_flag -33,1,1,1 * retail_employment -33,1,0,1.53 * retail_employment * notairport_flag -34,0,1,1 * households -34,0,0,1.511 * households * notairport_flag -34,1,1,1 * households -34,1,0,1.511 * households * notairport_flag -35,0,1,1 * households -35,0,0,36.326 * households * notairport_flag -35,1,1,1 * households -35,1,0,36.326 * households * notairport_flag -36,0,1,1 * retail_employment + 0.031 * nonretail_employment -36,0,0,2.51 * retail_employment + 0.324 * nonretail_employment -36,1,1,1 * retail_employment + 0.031 * nonretail_employment -36,1,0,2.51 * retail_employment + 0.324 * nonretail_employment -37,0,1,1 * retail_employment -37,0,0,1 * retail_employment * notairport_flag -37,1,1,1 * retail_employment -37,1,0,1 * retail_employment * notairport_flag -38,0,1,1 * households -38,0,0,16.44 * households * notairport_flag -38,1,1,1 * households -38,1,0,16.44 * households * notairport_flag -39,0,1,0.058 * total_employment -39,0,0,1 * retail_employment + 0.922 * nonretail_employment -39,1,1,0.058 * total_employment -39,1,0,1 * retail_employment + 0.922 * nonretail_employment -40,0,1,1 * retail_employment -40,0,0,1 * retail_employment * notairport_flag -40,1,1,1 * retail_employment -40,1,0,1 * retail_employment * notairport_flag -41,0,1,1 * households -41,0,0,16.44 * households * notairport_flag -41,1,1,1 * households -41,1,0,16.44 * households * notairport_flag -42,0,1,0.058 * total_employment -42,0,0,1 * retail_employment + 0.922 * nonretail_employment -42,1,1,0.058 * total_employment -42,1,0,1 * retail_employment + 0.922 * nonretail_employment -43,0,1,1 * retail_employment -43,0,0,1 * retail_employment * notairport_flag -43,1,1,1 * retail_employment -43,1,0,1 * retail_employment * notairport_flag -44,0,1,1 * households -44,0,0,16.44 * households * notairport_flag -44,1,1,1 * households -44,1,0,16.44 * households * notairport_flag -45,0,1,0.058 * total_employment -45,0,0,1 * retail_employment + 0.922 * nonretail_employment -45,1,1,0.058 * total_employment -45,1,0,1 * retail_employment + 0.922 * nonretail_employment -46,0,1,1 * retail_employment -46,0,0,1 * retail_employment * notairport_flag -46,1,1,1 * retail_employment -46,1,0,1 * retail_employment * notairport_flag -47,0,1,1 * households -47,0,0,16.44 * households * notairport_flag -47,1,1,1 * households -47,1,0,16.44 * households * notairport_flag -48,0,1,0.058 * total_employment -48,0,0,1 * retail_employment + 0.922 * nonretail_employment -48,1,1,0.058 * total_employment -48,1,0,1 * retail_employment + 0.922 * nonretail_employment -49,0,1,1 * retail_employment -49,0,0,1 * retail_employment * notairport_flag -49,1,1,1 * retail_employment -49,1,0,1 * retail_employment * notairport_flag diff --git a/Database/tg/fortran/coefficients_nonhome_productions.csv b/Database/tg/fortran/coefficients_nonhome_productions.csv deleted file mode 100644 index 22482ab..0000000 --- a/Database/tg/fortran/coefficients_nonhome_productions.csv +++ /dev/null @@ -1,197 +0,0 @@ -trip_type,wfh_flag,cbd,weight_formula -1,0,1,0 -1,0,0,0 -1,1,1,0 -1,1,0,0 -2,0,1,0 -2,0,0,0 -2,1,1,0 -2,1,0,0 -3,0,1,0 -3,0,0,0 -3,1,1,0 -3,1,0,0 -4,0,1,0 -4,0,0,0 -4,1,1,0 -4,1,0,0 -5,0,1,0 -5,0,0,0 -5,1,1,0 -5,1,0,0 -6,0,1,0 -6,0,0,0 -6,1,1,0 -6,1,0,0 -7,0,1,0 -7,0,0,0 -7,1,1,0 -7,1,0,0 -8,0,1,1 * total_employment -8,0,0,3.048 * total_employment -8,1,1,1 * total_employment -8,1,0,6.545 * total_employment -9,0,1,1 * total_employment -9,0,0,0.765 * total_employment -9,1,1,1 * total_employment -9,1,0,2.525 * total_employment -10,0,1,1 * total_employment -10,0,0,1.901 * total_employment -10,1,1,1 * total_employment -10,1,0,4.9 * total_employment -11,0,1,1 * total_employment -11,0,0,1.837 * total_employment -11,1,1,1 * total_employment -11,1,0,2.059 * total_employment -12,0,1,1 * households -12,0,0,1.401 * households * notairport_flag -12,1,1,1 * households -12,1,0,1.01 * households * notairport_flag -13,0,1,1 * households -13,0,0,1.401 * households * notairport_flag -13,1,1,1 * households -13,1,0,1.01 * households * notairport_flag -14,0,1,1 * households -14,0,0,1.401 * households * notairport_flag -14,1,1,1 * households -14,1,0,1.01 * households * notairport_flag -15,0,1,1 * retail_employment + 0.05 * nonretail_employment -15,0,0,0.401 * retail_employment + 0.097 * nonretail_employment -15,1,1,1 * retail_employment + 0.038 * nonretail_employment -15,1,0,0.963 * retail_employment + 0.195 * nonretail_employment -16,0,1,1 * retail_employment + 0.05 * nonretail_employment -16,0,0,0.401 * retail_employment + 0.097 * nonretail_employment -16,1,1,1 * retail_employment + 0.038 * nonretail_employment -16,1,0,0.963 * retail_employment + 0.195 * nonretail_employment -17,0,1,1 * retail_employment + 0.05 * nonretail_employment -17,0,0,0.401 * retail_employment + 0.097 * nonretail_employment -17,1,1,1 * retail_employment + 0.038 * nonretail_employment -17,1,0,0.963 * retail_employment + 0.195 * nonretail_employment -18,0,1,1 * retail_employment -18,0,0,1.129 * retail_employment * notairport_flag -18,1,1,1 * retail_employment -18,1,0,1.227 * retail_employment * notairport_flag -19,0,1,1 * retail_employment -19,0,0,1.129 * retail_employment * notairport_flag -19,1,1,1 * retail_employment -19,1,0,1.227 * retail_employment * notairport_flag -20,0,1,1 * retail_employment -20,0,0,1.129 * retail_employment * notairport_flag -20,1,1,1 * retail_employment -20,1,0,1.227 * retail_employment * notairport_flag -21,0,1,0 -21,0,0,0 -21,1,1,0 -21,1,0,0 -22,0,1,0 -22,0,0,0 -22,1,1,0 -22,1,0,0 -23,0,1,0 -23,0,0,0 -23,1,1,0 -23,1,0,0 -24,0,1,0 -24,0,0,0 -24,1,1,0 -24,1,0,0 -25,0,1,1 * households -25,0,0,1.281 * households * notairport_flag -25,1,1,1 * households -25,1,0,1.281 * households * notairport_flag -26,0,1,1 * households -26,0,0,1.281 * households * notairport_flag -26,1,1,1 * households -26,1,0,1.281 * households * notairport_flag -27,0,1,1 * households -27,0,0,1.281 * households * notairport_flag -27,1,1,1 * households -27,1,0,1.281 * households * notairport_flag -28,0,1,1 * retail_employment + 0.046 * nonretail_employment -28,0,0,0.734 * retail_employment + 0.176 * nonretail_employment -28,1,1,1 * retail_employment + 0.046 * nonretail_employment -28,1,0,0.734 * retail_employment + 0.176 * nonretail_employment -29,0,1,1 * retail_employment + 0.046 * nonretail_employment -29,0,0,0.734 * retail_employment + 0.176 * nonretail_employment -29,1,1,1 * retail_employment + 0.046 * nonretail_employment -29,1,0,0.734 * retail_employment + 0.176 * nonretail_employment -30,0,1,1 * retail_employment + 0.046 * nonretail_employment -30,0,0,0.734 * retail_employment + 0.176 * nonretail_employment -30,1,1,1 * retail_employment + 0.046 * nonretail_employment -30,1,0,0.734 * retail_employment + 0.176 * nonretail_employment -31,0,1,1 * retail_employment -31,0,0,1.441 * retail_employment * notairport_flag -31,1,1,1 * retail_employment -31,1,0,1.441 * retail_employment * notairport_flag -32,0,1,1 * retail_employment -32,0,0,1.441 * retail_employment * notairport_flag -32,1,1,1 * retail_employment -32,1,0,1.441 * retail_employment * notairport_flag -33,0,1,1 * retail_employment -33,0,0,1.441 * retail_employment * notairport_flag -33,1,1,1 * retail_employment -33,1,0,1.441 * retail_employment * notairport_flag -34,0,1,0 -34,0,0,0 -34,1,1,0 -34,1,0,0 -35,0,1,0 -35,0,0,0 -35,1,1,0 -35,1,0,0 -36,0,1,0 -36,0,0,0 -36,1,1,0 -36,1,0,0 -37,0,1,0 -37,0,0,0 -37,1,1,0 -37,1,0,0 -38,0,1,1 * households -38,0,0,2.599 * households * notairport_flag -38,1,1,1 * households -38,1,0,2.599 * households * notairport_flag -39,0,1,1 * households -39,0,0,2.599 * households * notairport_flag -39,1,1,1 * households -39,1,0,2.599 * households * notairport_flag -40,0,1,1 * households -40,0,0,2.599 * households * notairport_flag -40,1,1,1 * households -40,1,0,2.599 * households * notairport_flag -41,0,1,1 * households -41,0,0,22 * households * notairport_flag -41,1,1,1 * households -41,1,0,22 * households * notairport_flag -42,0,1,1 * households -42,0,0,22 * households * notairport_flag -42,1,1,1 * households -42,1,0,22 * households * notairport_flag -43,0,1,1 * households -43,0,0,22 * households * notairport_flag -43,1,1,1 * households -43,1,0,22 * households * notairport_flag -44,0,1,0.065 * total_employment -44,0,0,1 * retail_employment + 0.137 * nonretail_employment -44,1,1,0.065 * total_employment -44,1,0,1 * retail_employment + 0.137 * nonretail_employment -45,0,1,0.065 * total_employment -45,0,0,1 * retail_employment + 0.137 * nonretail_employment -45,1,1,0.065 * total_employment -45,1,0,1 * retail_employment + 0.137 * nonretail_employment -46,0,1,0.065 * total_employment -46,0,0,1 * retail_employment + 0.137 * nonretail_employment -46,1,1,0.065 * total_employment -46,1,0,1 * retail_employment + 0.137 * nonretail_employment -47,0,1,1 * retail_employment -47,0,0,1 * retail_employment * notairport_flag -47,1,1,1 * retail_employment -47,1,0,1 * retail_employment * notairport_flag -48,0,1,1 * retail_employment -48,0,0,1 * retail_employment * notairport_flag -48,1,1,1 * retail_employment -48,1,0,1 * retail_employment * notairport_flag -49,0,1,1 * retail_employment -49,0,0,1 * retail_employment * notairport_flag -49,1,1,1 * retail_employment -49,1,0,1 * retail_employment * notairport_flag diff --git a/Database/tg/fortran/create_HHvtype_file.py b/Database/tg/fortran/create_HHvtype_file.py new file mode 100644 index 0000000..18e1126 --- /dev/null +++ b/Database/tg/fortran/create_HHvtype_file.py @@ -0,0 +1,45 @@ +''' +##################################################################################### +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 new file mode 100644 index 0000000..dc147d4 --- /dev/null +++ b/Database/tg/fortran/highinc_workers.csv @@ -0,0 +1,4 @@ +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/tg/fortran/subzone_tg_data.txt b/Database/tg/fortran/subzone_tg_data.txt deleted file mode 100644 index 8e4784b..0000000 --- a/Database/tg/fortran/subzone_tg_data.txt +++ /dev/null @@ -1,17419 +0,0 @@ -"subzone","share_high_earners","share_commute_auto","sidewalk_density" -1,0.752,0.176,55.96 -2,0.792,0.244,55.37 -3,0.752,0.176,55.7 -4,0.793,0.244,54.66 -5,0.804,0.273,54.03 -6,0.752,0.302,12.38 -7,0.795,0.269,27.93 -8,0.621,0.391,44.17 -9,0.824,0.159,52.95 -10,0.833,0.212,49.11 -11,0.843,0.117,51.14 -12,0.843,0.117,47.74 -13,0.832,0.204,40.3 -14,0.836,0.19,57.49 -15,0.838,0.187,37.49 -16,0.836,0.19,43.47 -17,0.728,0.317,24.19 -18,0.745,0.253,45.3 -19,0.717,0.262,63.49 -20,0.72,0.209,51.92 -21,0.706,0.249,62.41 -22,0.792,0.216,9.12 -23,0.815,0.223,13.9 -24,0.792,0.216,27.82 -25,0.763,0.161,48.61 -26,0.815,0.223,24.36 -27,0.773,0.107,48.17 -28,0.728,0.317,2.96 -29,0.712,0.184,9.24 -30,0.712,0.184,17.76 -31,0.698,0.141,37.18 -32,0.691,0.149,51.2 -33,0.637,0.273,2.32 -34,0.637,0.273,11.89 -35,0.632,0.253,41.16 -36,0.595,0.271,35.72 -37,0.843,0.117,50.24 -38,0.843,0.117,43.87 -39,0.843,0.117,62.64 -40,0.842,0.123,44.37 -41,0.846,0.212,35.87 -42,0.846,0.217,37.14 -43,0.824,0.238,36.43 -44,0.823,0.238,41.92 -45,0.767,0.299,49.04 -46,0.754,0.302,22.95 -47,0.72,0.302,23.8 -48,0.709,0.307,6.69 -49,0.694,0.387,36.33 -50,0.694,0.387,30.38 -51,0.694,0.387,28.55 -52,0.694,0.387,27.7 -53,0.665,0.296,26.47 -54,0.65,0.271,39.1 -55,0.647,0.26,47.89 -56,0.675,0.294,36.56 -57,0.639,0.145,47.12 -58,0.722,0.336,39.55 -59,0.678,0.284,24.47 -60,0.7,0.355,31.97 -61,0.662,0.333,23.5 -62,0.653,0.416,33.65 -63,0.724,0.316,41.19 -64,0.686,0.419,48.14 -65,0.723,0.298,49.91 -66,0.72,0.301,38.44 -67,0.739,0.341,39.07 -68,0.733,0.337,33.6 -69,0.645,0.324,27.72 -70,0.639,0.384,41.86 -71,0.656,0.659,29.17 -72,0.642,0.661,39.05 -73,0.549,0.634,53.84 -74,0.495,0.471,46.84 -75,0.67,0.502,15.32 -76,0.693,0.391,31.77 -77,0.559,0.58,30.66 -78,0.603,0.549,41 -79,0.589,0.708,7.83 -80,0.709,0.424,32.64 -81,0.589,0.708,1.09 -82,0.765,0.419,33.53 -83,0.589,0.708,0.6 -84,0.589,0.708,2.21 -85,0.612,0.354,49.73 -86,0.639,0.372,47.25 -87,0.765,0.386,51.8 -88,0.7,0.402,50.47 -89,0.71,0.385,49.78 -90,0.539,0.542,49.17 -91,0.694,0.474,44.24 -92,0.584,0.399,47.66 -93,0.716,0.412,39.26 -94,0.666,0.525,43.28 -95,0.785,0.353,31.35 -96,0.786,0.383,38.74 -97,0.644,0.665,27.87 -98,0.646,0.679,24.3 -99,0.497,0.527,42.93 -100,0.537,0.518,43.78 -101,0.636,0.665,0.44 -102,0.672,0.565,36.41 -103,0.676,0.475,12.19 -104,0.524,0.462,33.64 -105,0.471,0.646,32.31 -106,0.453,0.649,26.99 -107,0.377,0.55,34.4 -108,0.559,0.601,45.08 -109,0.61,0.593,8.46 -110,0.667,0.568,11.89 -111,0.589,0.637,39.73 -112,0.746,0.643,37.11 -113,0.662,0.484,12.9 -114,0.528,0.596,42.34 -115,0.661,0.488,2.84 -116,0.527,0.596,5.26 -117,0.622,0.426,28.12 -118,0.688,0.369,52.24 -119,0.658,0.394,44.62 -120,0.73,0.313,58.15 -121,0.555,0.204,46.95 -122,0.571,0.402,34.77 -123,0.507,0.33,38.73 -124,0.593,0.381,23.41 -125,0.64,0.318,20.94 -126,0.662,0.308,46.82 -127,0.609,0.296,37.69 -128,0.665,0.413,45.71 -129,0.609,0.296,0.9 -130,0.543,0.785,14.7 -131,0.555,0.798,39.97 -132,0.478,0.761,34.76 -133,0.478,0.761,25.25 -134,0.478,0.761,40.22 -135,0.478,0.761,22.57 -136,0.588,0.849,46.56 -137,0.588,0.849,40.06 -138,0.588,0.849,38.66 -139,0.588,0.849,43.04 -140,0.568,0.867,0.02 -141,0.568,0.867,4.37 -142,0.694,0.858,41.29 -143,0.694,0.858,16.45 -144,0.639,0.791,33.05 -145,0.639,0.791,26.18 -146,0.639,0.791,21.42 -147,0.776,0.638,47.8 -148,0.776,0.638,49.79 -149,0.776,0.638,37.83 -150,0.776,0.638,31.53 -151,0.381,0.548,34.01 -152,0.523,0.543,32.02 -153,0.474,0.537,25.87 -154,0.507,0.529,28.98 -155,0.598,0.652,41.24 -156,0.598,0.652,35.56 -157,0.598,0.652,35.32 -158,0.598,0.652,45.7 -159,0.482,0.614,15.31 -160,0.502,0.69,44.94 -161,0.578,0.632,32.29 -162,0.587,0.664,38.31 -163,0.54,0.653,42.05 -164,0.54,0.653,50.03 -165,0.54,0.653,37.66 -166,0.54,0.653,42.83 -167,0.319,0.765,36.37 -168,0.527,0.635,19 -169,0.309,0.645,33.21 -170,0.523,0.635,38.47 -171,0.426,0.635,42.7 -172,0.426,0.635,50.52 -173,0.426,0.635,36.29 -174,0.426,0.635,41.59 -175,0.383,0.621,49.32 -176,0.383,0.621,38.96 -177,0.383,0.621,49.32 -178,0.383,0.621,32.16 -179,0.495,0.538,34.67 -180,0.495,0.538,44.8 -181,0.495,0.538,46.5 -182,0.495,0.538,44.72 -183,0.641,0.697,4.96 -184,0.637,0.68,39.65 -185,0.646,0.666,34.51 -186,0.635,0.647,41.62 -187,0.667,0.809,11.36 -188,0.668,0.806,29.71 -189,0.667,0.808,0.09 -190,0.67,0.811,12.04 -191,0.588,0.712,41.45 -192,0.588,0.712,11.64 -193,0.614,0.711,24.83 -194,0.73,0.715,34.22 -195,0.59,0.712,2.38 -196,0.73,0.715,15.2 -197,0.73,0.715,0 -198,0.741,0.672,0 -199,0.73,0.715,0 -200,0.73,0.715,0 -201,0.718,0.639,0.28 -202,0.718,0.639,9.74 -203,0.74,0.66,0 -204,0.718,0.639,0 -205,0.718,0.639,6.28 -206,0.631,0.667,38.5 -207,0.529,0.664,42.3 -208,0.702,0.659,29.58 -209,0.697,0.65,42.91 -210,0.479,0.765,38.46 -211,0.479,0.765,39.94 -212,0.479,0.765,40.63 -213,0.479,0.765,42.66 -214,0.568,0.713,43.95 -215,0.568,0.713,23.89 -216,0.568,0.713,43.28 -217,0.568,0.713,36.43 -218,0.624,0.75,29.79 -219,0.79,0.658,46.08 -220,0.703,0.706,34.89 -221,0.723,0.702,39.97 -222,0.529,0.796,37.77 -223,0.529,0.796,35.45 -224,0.529,0.796,15.64 -225,0.529,0.796,27.59 -226,0.578,0.783,39.09 -227,0.578,0.783,39.59 -228,0.578,0.783,37.03 -229,0.578,0.783,41.69 -230,0.578,0.685,45.5 -231,0.578,0.685,40.99 -232,0.578,0.685,44.17 -233,0.578,0.685,43.96 -234,0.586,0.636,39.33 -235,0.586,0.636,38.45 -236,0.703,0.62,0 -237,0.586,0.636,5.09 -238,0.586,0.636,32.77 -239,0.74,0.66,0 -240,0.74,0.66,2.09 -241,0.718,0.639,1.88 -242,0.74,0.66,2.43 -243,0.74,0.66,0 -244,0.741,0.672,0 -245,0.741,0.672,0 -246,0.741,0.672,0 -247,0.741,0.672,0 -248,0.741,0.672,0 -249,0.741,0.672,0 -250,0.741,0.672,0 -251,0.741,0.672,0 -252,0.74,0.66,0 -253,0.74,0.66,0 -254,0.74,0.66,0 -255,0.74,0.66,1.26 -256,0.703,0.62,0 -257,0.586,0.636,41.62 -258,0.703,0.62,0.45 -259,0.703,0.62,0 -260,0.703,0.62,0.04 -261,0.53,0.784,45.13 -262,0.53,0.784,38.26 -263,0.819,0.669,17.91 -264,0.53,0.784,41.3 -265,0.53,0.784,43.1 -266,0.589,0.747,27.41 -267,0.59,0.745,30.87 -268,0.487,0.8,23.57 -269,0.53,0.784,31.86 -270,0.601,0.645,21.53 -271,0.65,0.634,30.44 -272,0.575,0.656,0.62 -273,0.572,0.654,13.97 -274,0.647,0.659,0.54 -275,0.647,0.659,12.29 -276,0.647,0.659,0 -277,0.647,0.659,0 -278,0.749,0.69,1.12 -279,0.749,0.69,0 -280,0.749,0.69,0 -281,0.749,0.69,0 -282,0.599,0.731,0 -283,0.599,0.731,1.53 -284,0.574,0.589,18.42 -285,0.599,0.731,3.83 -286,0.599,0.731,28.57 -287,0.603,0.578,43.5 -288,0.524,0.557,41.09 -289,0.681,0.734,8.33 -290,0.546,0.658,34.51 -291,0.546,0.658,36.03 -292,0.681,0.734,4.13 -293,0.681,0.734,27.92 -294,0.546,0.658,36.92 -295,0.681,0.734,5.39 -296,0.681,0.734,11.51 -297,0.574,0.718,5.54 -298,0.641,0.783,32.06 -299,0.534,0.789,23.72 -300,0.57,0.816,47.17 -301,0.634,0.828,45.88 -302,0.634,0.828,47.52 -303,0.634,0.828,23.7 -304,0.634,0.828,47.98 -305,0.712,0.816,21 -306,0.712,0.816,7.45 -307,0.712,0.816,5.64 -308,0.712,0.816,0.85 -309,0.718,0.791,0 -310,0.718,0.791,0 -311,0.718,0.791,0.02 -312,0.718,0.791,0 -313,0.585,0.829,0 -314,0.585,0.829,27.09 -315,0.585,0.829,0 -316,0.585,0.829,3.39 -317,0.531,0.826,0 -318,0.531,0.826,0 -319,0.531,0.826,0 -320,0.531,0.826,0.62 -321,0.698,0.766,1.39 -322,0.698,0.766,0.96 -323,0.698,0.766,6.37 -324,0.698,0.766,36.79 -325,0.531,0.826,37.41 -326,0.747,0.692,23.71 -327,0.62,0.781,24.49 -328,0.75,0.69,1.86 -329,0.53,0.826,0 -330,0.53,0.826,12.57 -331,0.53,0.826,0 -332,0.53,0.826,11.12 -333,0.31,0.694,44 -334,0.536,0.733,45.36 -335,0.27,0.699,45.21 -336,0.491,0.72,44.42 -337,0.457,0.769,6.17 -338,0.553,0.713,4.78 -339,0.455,0.77,37.68 -340,0.554,0.715,15.34 -341,0.598,0.806,16.52 -342,0.598,0.806,1.75 -343,0.598,0.806,37.97 -344,0.598,0.806,21.31 -345,0.655,0.795,37.13 -346,0.588,0.853,43.97 -347,0.588,0.853,46.23 -348,0.377,0.786,40.6 -349,0.375,0.786,48.9 -350,0.518,0.875,47.5 -351,0.539,0.797,26.95 -352,0.599,0.783,43.61 -353,0.479,0.734,48 -354,0.432,0.782,24.41 -355,0.441,0.741,32.88 -356,0.502,0.771,26.64 -357,0.497,0.812,14.84 -358,0.603,0.809,29.45 -359,0.574,0.84,36.53 -360,0.354,0.779,43.3 -361,0.6,0.728,25.51 -362,0.599,0.728,11.28 -363,0.215,0.816,46.72 -364,0.332,0.735,47.82 -365,0.375,0.66,47.64 -366,0.375,0.66,52 -367,0.375,0.66,47.22 -368,0.375,0.66,51.07 -369,0.383,0.777,40.84 -370,0.383,0.777,47.28 -371,0.383,0.777,47.04 -372,0.383,0.777,45.05 -373,0.662,0.701,44.38 -374,0.699,0.701,25.45 -375,0.274,0.823,47.66 -376,0.385,0.834,41.33 -377,0.71,0.826,1.31 -378,0.71,0.826,6.96 -379,0.71,0.826,5.76 -380,0.71,0.826,1.4 -381,0.727,0.805,38.4 -382,0.727,0.805,39.66 -383,0.727,0.805,45.74 -384,0.727,0.805,40 -385,0.626,0.881,43.63 -386,0.625,0.881,50.33 -387,0.642,0.87,39.41 -388,0.642,0.87,12.13 -389,0.693,0.828,24.97 -390,0.692,0.828,26.95 -391,0.648,0.833,29.68 -392,0.648,0.833,29.31 -393,0.55,0.83,25.96 -394,0.549,0.831,31.56 -395,0.472,0.826,42.65 -396,0.472,0.826,39.68 -397,0.472,0.826,34.37 -398,0.472,0.826,10.08 -399,0.542,0.871,47.42 -400,0.477,0.932,43.73 -401,0.635,0.821,15.04 -402,0.147,0.837,47.34 -403,0.583,0.687,47.1 -404,0.577,0.686,47.35 -405,0.635,0.82,44.22 -406,0.635,0.82,16 -407,0.52,0.793,39.39 -408,0.52,0.793,33.47 -409,0.52,0.793,9.01 -410,0.52,0.793,6.74 -411,0.521,0.838,31.15 -412,0.521,0.838,17.47 -413,0.521,0.838,36.83 -414,0.521,0.838,43.51 -415,0.53,0.856,4.42 -416,0.53,0.856,3.67 -417,0.552,0.869,19.07 -418,0.552,0.869,20.49 -419,0.525,0.822,46.35 -420,0.525,0.822,39.35 -421,0.525,0.822,45.37 -422,0.525,0.822,45.4 -423,0.399,0.755,40.8 -424,0.399,0.755,43.52 -425,0.512,0.675,30.61 -426,0.512,0.675,49.86 -427,0.573,0.799,47.56 -428,0.573,0.799,46.97 -429,0.573,0.799,28.68 -430,0.573,0.799,32.3 -431,0.727,0.544,0.22 -432,0.727,0.544,40.1 -433,0.388,0.555,13.52 -434,0.491,0.528,33.54 -435,0.452,0.525,42.03 -436,0.693,0.545,38.12 -437,0.693,0.491,40.72 -438,0.573,0.53,40.34 -439,0.649,0.584,28.85 -440,0.691,0.78,37.23 -441,0.609,0.588,33.49 -442,0.658,0.787,44.24 -443,0.691,0.779,19.19 -444,0.691,0.779,6.44 -445,0.691,0.779,13.91 -446,0.691,0.779,17.66 -447,0.586,0.623,10.97 -448,0.577,0.632,9.28 -449,0.397,0.691,37.59 -450,0.564,0.635,7.66 -451,0.596,0.611,44.75 -452,0.593,0.71,34.18 -453,0.309,0.583,47.93 -454,0.723,0.626,29.02 -455,0.545,0.727,27.96 -456,0.381,0.641,40.87 -457,0.25,0.639,45.06 -458,0.652,0.454,36.32 -459,0.671,0.669,17.76 -460,0.671,0.669,19.77 -461,0.671,0.669,23.44 -462,0.671,0.669,26.12 -463,0.632,0.559,44.83 -464,0.629,0.683,42.97 -465,0.528,0.486,12.48 -466,0.526,0.488,32.04 -467,0.612,0.358,29.81 -468,0.719,0.489,36.45 -469,0.596,0.191,39.46 -470,0.56,0.388,45.48 -471,0.683,0.336,12.44 -472,0.559,0.223,14.98 -473,0.509,0.274,17.13 -474,0.645,0.531,0 -475,0.645,0.531,9.05 -476,0.666,0.277,40.64 -477,0.735,0.236,35.11 -478,0.692,0.377,35.39 -479,0.681,0.239,39.8 -480,0.734,0.468,14.65 -481,0.584,0.581,44.84 -482,0.547,0.482,42.67 -483,0.428,0.333,34.31 -484,0.598,0.598,38.64 -485,0.598,0.598,41.1 -486,0.598,0.598,32.59 -487,0.598,0.598,41.26 -488,0.737,0.629,51.87 -489,0.737,0.629,48.2 -490,0.737,0.629,49.26 -491,0.737,0.629,48.05 -492,0.713,0.657,44.75 -493,0.455,0.668,27.87 -494,0.32,0.716,47.61 -495,0.353,0.597,15.92 -496,0.658,0.63,45.95 -497,0.658,0.63,37.07 -498,0.658,0.63,43.53 -499,0.658,0.63,40.73 -500,0.473,0.451,49.75 -501,0.473,0.451,38.33 -502,0.473,0.451,47.83 -503,0.473,0.451,47.78 -504,0.575,0.433,29.4 -505,0.55,0.506,36.52 -506,0.653,0.403,32.04 -507,0.597,0.533,41.77 -508,0.556,0.595,48.76 -509,0.686,0.353,19.17 -510,0.963,0.697,42.83 -511,0.794,0.319,39.12 -512,0.526,0.5,41.18 -513,0.389,0.511,46.63 -514,0.655,0.606,33.95 -515,0.655,0.606,8.09 -516,0.527,0.616,8.82 -517,0.544,0.618,20.19 -518,0.481,0.639,44.75 -519,0.666,0.491,43.37 -520,0.576,0.53,48.3 -521,0.656,0.479,43.44 -522,0.461,0.516,54.12 -523,0.601,0.701,44.85 -524,0.414,0.626,48.88 -525,0.552,0.597,43.63 -526,0.524,0.694,38.82 -527,0.273,0.747,38.53 -528,0.415,0.601,43.07 -529,0.415,0.601,40.75 -530,0.415,0.601,44.2 -531,0.415,0.601,37.9 -532,0.629,0.591,40.55 -533,0.629,0.591,33.64 -534,0.629,0.591,30.42 -535,0.629,0.591,40.68 -536,0.315,0.709,42.97 -537,0.713,0.695,42.77 -538,0.517,0.62,45.69 -539,0.345,0.664,34.89 -540,0.645,0.699,32.88 -541,0.645,0.699,30.15 -542,0.645,0.699,41.13 -543,0.645,0.699,23.3 -544,0.477,0.7,43.66 -545,0.477,0.7,27.94 -546,0.477,0.7,42.99 -547,0.477,0.7,24.38 -548,0.517,0.63,46.6 -549,0.517,0.63,44.54 -550,0.517,0.63,49.09 -551,0.517,0.63,42.48 -552,0.437,0.576,41.06 -553,0.439,0.598,35.64 -554,0.437,0.577,9.36 -555,0.444,0.614,28.43 -556,0.585,0.545,46.27 -557,0.424,0.591,44.94 -558,0.429,0.601,31.27 -559,0.423,0.593,41.55 -560,0.309,0.679,50.88 -561,0.441,0.605,39.11 -562,0.309,0.679,41.28 -563,0.413,0.557,28.39 -564,0.337,0.591,47.57 -565,0.337,0.591,35.32 -566,0.337,0.591,38.26 -567,0.337,0.591,41.67 -568,0.459,0.683,5.13 -569,0.549,0.45,3.95 -570,0.549,0.45,4.23 -571,0.547,0.467,36.58 -572,0.549,0.45,27.83 -573,0.423,0.435,48.54 -574,0.345,0.578,44.49 -575,0.214,0.622,41.85 -576,0.289,0.595,33.77 -577,0.291,0.64,51.58 -578,0.468,0.565,0 -579,0.468,0.565,11.37 -580,0.468,0.565,0.34 -581,0.468,0.565,24.5 -582,0.579,0.452,47.3 -583,0.658,0.427,13.08 -584,0.641,0.589,47.44 -585,0.682,0.479,37.48 -586,0.627,0.621,45.15 -587,0.262,0.696,51.96 -588,0.498,0.718,41.65 -589,0.341,0.597,48.71 -590,0.348,0.611,45.85 -591,0.389,0.598,11.73 -592,0.611,0.717,47.31 -593,0.593,0.732,29.12 -594,0.57,0.67,42.29 -595,0.398,0.84,44.58 -596,0.527,0.713,47.75 -597,0.435,0.827,49.51 -598,0.612,0.632,47.47 -599,0.612,0.632,45.63 -600,0.548,0.67,44.37 -601,0.52,0.666,40.76 -602,0.503,0.674,46.2 -603,0.746,0.537,43.23 -604,0.454,0.611,43.9 -605,0.411,0.541,43.4 -606,0.612,0.718,7.18 -607,0.546,0.744,16.56 -608,0.629,0.591,42.46 -609,0.425,0.478,40.44 -610,0.606,0.661,38.83 -611,0.455,0.679,43.61 -612,0.55,0.586,39.95 -613,0.568,0.441,25.06 -614,0.736,0.513,21.91 -615,0.692,0.618,18.01 -616,0.627,0.405,32.13 -617,0.682,0.473,41.63 -618,0.764,0.532,38.32 -619,0.662,0.656,42.96 -620,0.688,0.518,29.52 -621,0.656,0.62,48.15 -622,0.696,0.567,37.13 -623,0.338,0.69,35.39 -624,0.72,0.692,39.01 -625,0.564,0.661,38.36 -626,0.549,0.622,43.13 -627,0.584,0.634,46.93 -628,0.577,0.595,42.31 -629,0.654,0.608,26.71 -630,0.543,0.803,41.03 -631,0.182,0.439,43.65 -632,0.692,0.733,19.75 -633,0.691,0.716,17.15 -634,0.755,0.601,20.25 -635,0.702,0.692,22.83 -636,0.68,0.667,49.9 -637,0.651,0.693,19.3 -638,0.572,0.741,41.29 -639,0.413,0.724,17.56 -640,0.546,0.605,44.97 -641,0.678,0.703,40.62 -642,0.71,0.583,41.35 -643,0.606,0.513,41.81 -644,0.651,0.52,26.37 -645,0.492,0.621,23.29 -646,0.678,0.501,24.23 -647,0.544,0.516,32.72 -648,0.556,0.568,37.46 -649,0.507,0.581,48.11 -650,0.773,0.678,10.49 -651,0.822,0.965,19.6 -652,0.435,0.558,48.39 -653,0.685,0.666,40.83 -654,0.614,0.698,42.67 -655,0.518,0.74,42.67 -656,0.529,0.691,49.59 -657,0.428,0.687,9.2 -658,0.46,0.75,45.31 -659,0.363,0.769,13.58 -660,0.612,0.9,14.25 -661,0.612,0.9,4.32 -662,0.612,0.9,0.23 -663,0.612,0.9,0 -664,0.725,0.868,1.51 -665,0.722,0.868,22.92 -666,0.65,0.895,15 -667,0.634,0.814,0 -668,0.735,0.661,10.05 -669,0.816,0.9,5.75 -670,0.57,0.664,35.6 -671,0.607,0.865,31.63 -672,0.568,0.614,39.47 -673,0.551,0.6,41.12 -674,0.735,0.604,51.07 -675,0.536,0.49,29.15 -676,0.7,0.588,44.53 -677,0.634,0.6,15.9 -678,0.656,0.673,28.18 -679,0.695,0.725,12.02 -680,0.527,0.569,26.49 -681,0.522,0.595,42.43 -682,0.457,0.41,19.3 -683,0.645,0.639,43.36 -684,0.508,0.514,16.79 -685,0.543,0.422,39.09 -686,0.34,0.474,33.84 -687,0.844,0.461,41.97 -688,0.508,0.516,0.44 -689,0.449,0.72,11.31 -690,0.653,0.804,27.38 -691,0.627,0.813,45.35 -692,0.632,0.817,30.62 -693,0.623,0.805,39.08 -694,0.623,0.77,22.69 -695,0.827,0.508,6.66 -696,0.775,0.661,0.09 -697,0.738,0.838,8.39 -698,0.694,0.855,0 -699,0.738,0.838,0 -700,0.68,0.766,0 -701,0.694,0.855,0 -702,0.68,0.766,5.54 -703,0.68,0.766,0 -704,0.68,0.766,0 -705,0.68,0.766,0 -706,0.68,0.766,0 -707,0.68,0.766,0.31 -708,0.68,0.766,0 -709,0.68,0.766,0 -710,0.68,0.766,0 -711,0.694,0.855,0 -712,0.68,0.766,10.77 -713,0.694,0.855,0 -714,0.68,0.766,0 -715,0.77,0.87,9.28 -716,0.694,0.855,0 -717,0.694,0.855,0 -718,0.759,0.812,0 -719,0.759,0.812,10.45 -720,0.759,0.812,0.03 -721,0.603,0.777,34.6 -722,0.819,0.689,29.7 -723,0.685,0.805,36.04 -724,0.62,0.766,38.66 -725,0.62,0.766,43.74 -726,0.523,0.877,48.52 -727,0.523,0.877,11.52 -728,0.523,0.877,0.2 -729,0.718,0.876,0.05 -730,0.718,0.876,0 -731,0.672,0.888,0.34 -732,0.676,0.864,0 -733,0.676,0.864,0 -734,0.676,0.864,0 -735,0.685,0.809,0 -736,0.685,0.809,0 -737,0.685,0.809,0 -738,0.682,0.839,0.13 -739,0.682,0.839,1.61 -740,0.577,0.829,47.96 -741,0.577,0.829,0.47 -742,0.577,0.829,44.17 -743,0.577,0.829,0.04 -744,0.534,0.811,47.39 -745,0.534,0.811,18.87 -746,0.534,0.811,50.5 -747,0.534,0.811,43.63 -748,0.477,0.892,55.18 -749,0.518,0.658,47.82 -750,0.462,0.7,45.65 -751,0.538,0.701,48.4 -752,0.471,0.673,31.5 -753,0.573,0.762,40.56 -754,0.59,0.784,37.14 -755,0.462,0.702,46.79 -756,0.589,0.789,9.57 -757,0.607,0.684,45.63 -758,0.61,0.683,45.5 -759,0.583,0.707,19.56 -760,0.607,0.683,38.3 -761,0.665,0.68,35.3 -762,0.684,0.678,16.79 -763,0.649,0.687,8.11 -764,0.651,0.758,15.64 -765,0.671,0.742,12.1 -766,0.545,0.787,40.32 -767,0.654,0.767,43.46 -768,0.522,0.788,47.34 -769,0.604,0.787,43.89 -770,0.627,0.793,41.62 -771,0.64,0.797,34.12 -772,0.665,0.803,39.44 -773,0.708,0.789,43.8 -774,0.708,0.789,49.35 -775,0.708,0.789,52.79 -776,0.708,0.789,51.86 -777,0.669,0.635,43.76 -778,0.748,0.673,39.46 -779,0.634,0.64,45.06 -780,0.793,0.679,48.58 -781,0.543,0.694,36.9 -782,0.58,0.637,43.86 -783,0.627,0.644,40.02 -784,0.673,0.591,40.14 -785,0.578,0.732,10.38 -786,0.578,0.732,3.82 -787,0.566,0.64,37.43 -788,0.563,0.636,27.67 -789,0.651,0.559,36.67 -790,0.651,0.558,7.9 -791,0.476,0.453,40.58 -792,0.648,0.535,39.88 -793,0.533,0.597,47.77 -794,0.582,0.723,30.82 -795,0.668,0.456,42.73 -796,0.598,0.481,32.23 -797,0.641,0.377,45.15 -798,0.698,0.385,47.33 -799,0.754,0.56,21.64 -800,0.658,0.536,46.76 -801,0.537,0.487,44.54 -802,0.631,0.608,48.22 -803,0.598,0.625,43.64 -804,0.527,0.531,46.25 -805,0.559,0.6,55.3 -806,0.449,0.536,39.58 -807,0.558,0.433,32.34 -808,0.652,0.534,28.82 -809,0.647,0.565,34.59 -810,0.511,0.646,47.6 -811,0.65,0.564,49.5 -812,0.504,0.648,39.47 -813,0.448,0.749,45.08 -814,0.448,0.749,33.27 -815,0.448,0.749,48.15 -816,0.448,0.749,39.3 -817,0.636,0.846,16.65 -818,0.561,0.828,19.41 -819,0.546,0.876,20.47 -820,0.546,0.877,44.24 -821,0.512,0.792,46.81 -822,0.511,0.792,40.5 -823,0.752,0.786,47.66 -824,0.652,0.799,45.71 -825,0.584,0.723,45.77 -826,0.778,0.858,42.99 -827,0.475,0.726,48.6 -828,0.493,0.733,47.47 -829,0.574,0.742,42.59 -830,0.471,0.743,46.59 -831,0.645,0.57,41.69 -832,0.674,0.522,43.97 -833,0.511,0.616,48.27 -834,0.488,0.69,37.88 -835,0.584,0.652,54.08 -836,0.528,0.374,41.74 -837,0.505,0.468,16.04 -838,0.504,0.468,47.87 -839,0.682,0.51,23.62 -840,0.721,0.578,53.75 -841,0.667,0.489,19.19 -842,0.622,0.531,39.65 -843,0.716,0.507,42.54 -844,0.681,0.546,40.14 -845,0.61,0.456,40.17 -846,0.638,0.381,41.92 -847,0.688,0.462,50.35 -848,0.568,0.446,48.57 -849,0.747,0.235,47.21 -850,0.696,0.48,45.85 -851,0.443,0.659,35.26 -852,0.338,0.662,38.57 -853,0.684,0.638,30.79 -854,0.553,0.677,43.89 -855,0.574,0.778,47.53 -856,0.574,0.778,47.41 -857,0.574,0.778,47.5 -858,0.574,0.778,47.44 -859,0.467,0.749,47.74 -860,0.467,0.749,44.29 -861,0.467,0.749,47.65 -862,0.467,0.749,33.14 -863,0.517,0.764,44.01 -864,0.588,0.842,46.32 -865,0.502,0.69,16.38 -866,0.533,0.725,44.23 -867,0.526,0.699,22.84 -868,0.646,0.741,42.07 -869,0.727,0.745,41.37 -870,0.728,0.745,41.35 -871,0.487,0.665,40.82 -872,0.559,0.814,37.46 -873,0.438,0.703,34.69 -874,0.447,0.696,29.29 -875,0.552,0.779,46.47 -876,0.724,0.76,27.1 -877,0.561,0.696,36.39 -878,0.531,0.678,32.44 -879,0.727,0.726,47.15 -880,0.645,0.738,39.01 -881,0.5,0.583,42.12 -882,0.487,0.614,22.66 -883,0.698,0.423,51.38 -884,0.72,0.565,40.41 -885,0.452,0.543,41.83 -886,0.717,0.623,40.82 -887,0.583,0.322,51.15 -888,0.694,0.395,38.79 -889,0.638,0.383,49.22 -890,0.68,0.496,45.51 -891,0.436,0.32,28.13 -892,0.716,0.435,45.26 -893,0.49,0.316,22.16 -894,0.681,0.382,45.45 -895,0.517,0.496,42.76 -896,0.546,0.582,35.33 -897,0.724,0.533,19.21 -898,0.724,0.533,3.66 -899,0.538,0.409,44.21 -900,0.704,0.571,34.24 -901,0.654,0.452,41.06 -902,0.748,0.431,39.47 -903,0.553,0.304,19.64 -904,0.577,0.367,44.81 -905,0.57,0.335,40.92 -906,0.539,0.33,26.12 -907,0.713,0.359,6.86 -908,0.663,0.285,2.3 -909,0.663,0.285,11.54 -910,0.663,0.285,12.07 -911,0.597,0.322,39.32 -912,0.68,0.423,41.75 -913,0.619,0.293,28.82 -914,0.74,0.461,21.25 -915,0.687,0.246,42.37 -916,0.589,0.349,50.82 -917,0.677,0.319,39.72 -918,0.659,0.495,44.65 -919,0.66,0.297,55.75 -920,0.578,0.421,51.89 -921,0.643,0.319,55.14 -922,0.668,0.477,46.55 -923,0.583,0.251,48.58 -924,0.681,0.322,44.19 -925,0.553,0.267,46.54 -926,0.716,0.291,42.86 -927,0.769,0.282,19.57 -928,0.639,0.213,3.47 -929,0.639,0.213,36.86 -930,0.684,0.293,15.61 -931,0.665,0.231,44.06 -932,0.71,0.274,5.85 -933,0.584,0.274,43.82 -934,0.714,0.257,46.7 -935,0.703,0.382,47.17 -936,0.585,0.332,46.87 -937,0.699,0.433,39.95 -938,0.677,0.512,50.03 -939,0.657,0.463,39.34 -940,0.572,0.462,27.65 -941,0.565,0.422,25.98 -942,0.691,0.99,0 -943,0.691,0.99,0 -944,0.691,0.99,0.65 -945,0.453,0.83,48.91 -946,0.657,0.742,45.45 -947,0.684,0.826,1.87 -948,0.684,0.826,0 -949,0.684,0.826,0 -950,0.684,0.826,0 -951,0.689,0.824,1.15 -952,0.689,0.824,0 -953,0.689,0.824,0 -954,0.607,0.714,43.32 -955,0.658,0.672,34.89 -956,0.612,0.731,40.52 -957,0.618,0.658,49.89 -958,0.433,0.694,38.35 -959,0.434,0.696,47.64 -960,0.637,0.783,22.81 -961,0.634,0.788,25.15 -962,0.671,0.694,31.81 -963,0.695,0.681,35.04 -964,0.746,0.673,25.93 -965,0.654,0.74,4.65 -966,0.653,0.708,41 -967,0.519,0.666,43.13 -968,0.485,0.805,29.92 -969,0.503,0.691,44.53 -970,0.539,0.649,46.88 -971,0.626,0.518,16.38 -972,0.626,0.518,33.22 -973,0.649,0.419,24.44 -974,0.607,0.485,40.57 -975,0.517,0.612,39.65 -976,0.571,0.471,37.7 -977,0.585,0.633,44.22 -978,0.751,0.392,31.56 -979,0.686,0.664,26.65 -980,0.469,0.366,6.23 -981,0.534,0.349,42.57 -982,0.468,0.364,15.65 -983,0.557,0.342,46.9 -984,0.69,0.555,37.51 -985,0.69,0.555,25.59 -986,0.69,0.555,31.79 -987,0.69,0.555,9.71 -988,0.609,0.695,16.91 -989,0.609,0.695,26.17 -990,0.609,0.695,3.04 -991,0.609,0.695,36.33 -992,0.554,0.821,20.32 -993,0.554,0.821,1.25 -994,0.554,0.821,40.43 -995,0.554,0.821,1.55 -996,0.554,0.821,15.26 -997,0.554,0.821,0 -998,0.554,0.821,22.14 -999,0.554,0.821,0 -1000,0.559,0.758,0 -1001,0.559,0.758,0 -1002,0.559,0.758,0 -1003,0.559,0.758,0 -1004,0.559,0.758,9.58 -1005,0.559,0.758,13.93 -1006,0.559,0.758,0 -1007,0.559,0.758,0 -1008,0.559,0.758,0 -1009,0.559,0.758,0.01 -1010,0.559,0.758,0.25 -1011,0.559,0.758,0 -1012,0.559,0.758,0 -1013,0.559,0.758,0 -1014,0.559,0.758,0.03 -1015,0.559,0.758,0.02 -1016,0.554,0.821,0 -1017,0.554,0.821,0 -1018,0.554,0.821,0 -1019,0.554,0.821,0.02 -1020,0.554,0.821,12.94 -1021,0.554,0.821,0 -1022,0.554,0.821,0.04 -1023,0.554,0.821,0 -1024,0.61,0.693,2.48 -1025,0.61,0.693,16.52 -1026,0.61,0.693,1.04 -1027,0.61,0.693,9.75 -1028,0.69,0.555,22.15 -1029,0.69,0.555,28.65 -1030,0.69,0.555,6.36 -1031,0.69,0.555,28.51 -1032,0.648,0.753,0 -1033,0.648,0.753,1.16 -1034,0.648,0.753,0 -1035,0.648,0.753,2.9 -1036,0.648,0.753,4.29 -1037,0.648,0.753,5.96 -1038,0.648,0.753,5.27 -1039,0.648,0.753,1.03 -1040,0.606,0.824,14.41 -1041,0.606,0.824,4.86 -1042,0.606,0.824,2.96 -1043,0.606,0.824,30.96 -1044,0.602,0.813,6.72 -1045,0.602,0.813,15.68 -1046,0.602,0.813,7.47 -1047,0.602,0.813,17.94 -1048,0.551,0.718,32.42 -1049,0.551,0.718,33.15 -1050,0.551,0.718,4.87 -1051,0.551,0.718,36.87 -1052,0.551,0.718,0 -1053,0.551,0.718,0 -1054,0.551,0.718,0 -1055,0.551,0.718,0 -1056,0.551,0.718,0.03 -1057,0.551,0.718,0 -1058,0.551,0.718,17.43 -1059,0.551,0.718,0 -1060,0.551,0.718,13.85 -1061,0.551,0.718,23.03 -1062,0.551,0.718,0.82 -1063,0.551,0.718,24.57 -1064,0.556,0.82,3.11 -1065,0.556,0.82,24.13 -1066,0.556,0.82,4.25 -1067,0.556,0.82,4.15 -1068,0.556,0.821,24.42 -1069,0.556,0.821,17.19 -1070,0.556,0.821,7.16 -1071,0.556,0.821,4.78 -1072,0.567,0.823,1.22 -1073,0.567,0.823,1.14 -1074,0.567,0.823,28.62 -1075,0.567,0.823,36.29 -1076,0.594,0.819,0 -1077,0.594,0.819,0 -1078,0.594,0.819,33.65 -1079,0.594,0.819,37.4 -1080,0.774,0.842,14.97 -1081,0.828,0.905,9.24 -1082,0.691,0.792,21.59 -1083,0.82,0.894,17.39 -1084,0.739,0.856,15.59 -1085,0.739,0.856,18.59 -1086,0.739,0.856,33.7 -1087,0.739,0.856,15.32 -1088,0.545,0.784,10.01 -1089,0.545,0.784,0 -1090,0.545,0.784,25.91 -1091,0.545,0.784,28.87 -1092,0.52,0.827,5.03 -1093,0.52,0.827,1.54 -1094,0.52,0.827,19.24 -1095,0.52,0.827,3.33 -1096,0.685,0.861,0 -1097,0.685,0.861,32.51 -1098,0.685,0.861,0 -1099,0.685,0.861,0 -1100,0.687,0.861,0.04 -1101,0.687,0.861,2.76 -1102,0.687,0.861,0 -1103,0.687,0.861,0 -1104,0.466,0.833,0 -1105,0.466,0.833,0 -1106,0.466,0.833,0 -1107,0.466,0.833,0.01 -1108,0.467,0.833,0 -1109,0.467,0.833,0 -1110,0.467,0.833,0 -1111,0.467,0.833,0 -1112,0.469,0.832,26.31 -1113,0.469,0.832,15.79 -1114,0.469,0.832,15.77 -1115,0.469,0.832,16.48 -1116,0.571,0.782,1.5 -1117,0.571,0.782,24.88 -1118,0.571,0.782,0.04 -1119,0.571,0.782,12.32 -1120,0.49,0.773,31.02 -1121,0.49,0.773,22.62 -1122,0.49,0.773,33.43 -1123,0.49,0.773,25.75 -1124,0.623,0.755,24.96 -1125,0.623,0.755,25.24 -1126,0.623,0.755,34.82 -1127,0.623,0.755,39.23 -1128,0.614,0.805,1.26 -1129,0.614,0.805,0.14 -1130,0.614,0.805,0 -1131,0.614,0.805,0.29 -1132,0.614,0.805,1.78 -1133,0.614,0.805,0 -1134,0.614,0.805,0 -1135,0.614,0.805,0.32 -1136,0.631,0.844,0 -1137,0.631,0.844,1.11 -1138,0.631,0.844,37.25 -1139,0.631,0.844,15.71 -1140,0.581,0.811,0 -1141,0.581,0.811,34.67 -1142,0.581,0.811,2.71 -1143,0.581,0.811,2.19 -1144,0.57,0.856,42.52 -1145,0.57,0.856,32.13 -1146,0.57,0.856,30.48 -1147,0.57,0.856,27.89 -1148,0.501,0.749,35.95 -1149,0.501,0.749,32.1 -1150,0.501,0.749,1.65 -1151,0.501,0.749,37.68 -1152,0.535,0.725,2.7 -1153,0.535,0.725,8.62 -1154,0.535,0.725,7.19 -1155,0.535,0.725,0.17 -1156,0.485,0.879,15.12 -1157,0.485,0.879,17.83 -1158,0.485,0.879,21.15 -1159,0.485,0.879,44.28 -1160,0.582,0.812,0 -1161,0.582,0.812,0 -1162,0.582,0.812,0 -1163,0.582,0.812,1.02 -1164,0.644,0.852,9.38 -1165,0.644,0.852,0 -1166,0.644,0.852,0 -1167,0.644,0.852,0 -1168,0.614,0.805,18.83 -1169,0.614,0.805,28.02 -1170,0.614,0.805,0 -1171,0.614,0.805,0 -1172,0.614,0.805,4.3 -1173,0.614,0.805,0 -1174,0.614,0.805,6.52 -1175,0.614,0.805,0 -1176,0.711,0.798,11.18 -1177,0.711,0.798,3.47 -1178,0.711,0.798,4.8 -1179,0.711,0.798,0.06 -1180,0.699,0.807,0 -1181,0.699,0.807,0.52 -1182,0.699,0.807,0 -1183,0.699,0.807,1.33 -1184,0.701,0.818,0 -1185,0.701,0.818,0 -1186,0.701,0.818,0 -1187,0.701,0.818,0 -1188,0.683,0.793,0 -1189,0.683,0.793,5.1 -1190,0.683,0.793,0 -1191,0.683,0.793,10.06 -1192,0.59,0.875,21.01 -1193,0.542,0.72,18.07 -1194,0.631,0.81,7.92 -1195,0.532,0.889,32.25 -1196,0.593,0.823,19.24 -1197,0.593,0.823,0 -1198,0.593,0.823,13.54 -1199,0.593,0.823,13.22 -1200,0.592,0.824,19.09 -1201,0.58,0.802,4.39 -1202,0.58,0.805,36.18 -1203,0.582,0.806,28.35 -1204,0.619,0.827,18.71 -1205,0.532,0.889,33.95 -1206,0.611,0.839,40.28 -1207,0.532,0.889,37.75 -1208,0.75,0.847,15.33 -1209,0.75,0.847,21.1 -1210,0.75,0.847,14.78 -1211,0.75,0.847,24.47 -1212,0.723,0.702,0.08 -1213,0.723,0.702,0 -1214,0.723,0.702,0.03 -1215,0.723,0.702,0 -1216,0.724,0.712,15.99 -1217,0.724,0.712,21.95 -1218,0.724,0.712,3.92 -1219,0.724,0.712,9.96 -1220,0.764,0.813,0 -1221,0.764,0.813,0 -1222,0.764,0.813,4.15 -1223,0.764,0.813,0 -1224,0.718,0.812,12.36 -1225,0.718,0.812,32.71 -1226,0.718,0.812,32.27 -1227,0.718,0.812,26.92 -1228,0.718,0.812,1.47 -1229,0.718,0.812,1.62 -1230,0.718,0.812,0.72 -1231,0.718,0.812,0.73 -1232,0.618,0.847,0 -1233,0.618,0.847,0 -1234,0.618,0.847,0 -1235,0.618,0.847,0 -1236,0.618,0.847,7.82 -1237,0.618,0.847,22.45 -1238,0.618,0.847,0 -1239,0.618,0.847,0 -1240,0.513,0.88,29.45 -1241,0.513,0.88,7.85 -1242,0.513,0.88,32.99 -1243,0.513,0.88,0.56 -1244,0.513,0.88,28.8 -1245,0.513,0.88,24.59 -1246,0.513,0.88,0.06 -1247,0.513,0.88,6.21 -1248,0.513,0.88,0 -1249,0.513,0.88,8.73 -1250,0.513,0.88,0 -1251,0.513,0.88,0 -1252,0.513,0.88,28.47 -1253,0.513,0.88,13.63 -1254,0.513,0.88,19.46 -1255,0.513,0.88,0.12 -1256,0.618,0.847,1.36 -1257,0.618,0.847,1.55 -1258,0.618,0.847,6.85 -1259,0.618,0.847,24.82 -1260,0.618,0.847,0 -1261,0.618,0.847,0 -1262,0.618,0.847,0 -1263,0.618,0.847,0 -1264,0.718,0.812,0 -1265,0.718,0.812,7.24 -1266,0.718,0.812,0 -1267,0.718,0.812,0 -1268,0.718,0.812,11.87 -1269,0.718,0.812,23.28 -1270,0.718,0.812,0 -1271,0.718,0.812,4.03 -1272,0.604,0.827,0.21 -1273,0.604,0.827,29.37 -1274,0.604,0.827,11.54 -1275,0.604,0.827,24.72 -1276,0.604,0.827,24.61 -1277,0.604,0.827,2.23 -1278,0.604,0.827,29.04 -1279,0.604,0.827,0.75 -1280,0.604,0.827,17.42 -1281,0.604,0.827,21 -1282,0.604,0.827,28.64 -1283,0.604,0.827,37.67 -1284,0.604,0.827,0 -1285,0.604,0.827,0 -1286,0.604,0.827,0 -1287,0.604,0.827,0 -1288,0.726,0.792,0 -1289,0.726,0.792,0 -1290,0.726,0.792,0 -1291,0.726,0.792,0 -1292,0.726,0.792,0.09 -1293,0.726,0.792,0.08 -1294,0.726,0.792,0 -1295,0.726,0.792,0 -1296,0.726,0.792,0 -1297,0.726,0.792,0 -1298,0.726,0.792,0.12 -1299,0.726,0.792,0 -1300,0.726,0.792,0 -1301,0.726,0.792,4.81 -1302,0.726,0.792,23.76 -1303,0.726,0.792,5.27 -1304,0.65,0.851,5.02 -1305,0.65,0.851,0 -1306,0.65,0.851,8.78 -1307,0.65,0.851,0 -1308,0.65,0.851,0 -1309,0.65,0.851,1.82 -1310,0.65,0.851,0 -1311,0.65,0.851,10.26 -1312,0.65,0.851,7.47 -1313,0.65,0.851,23.36 -1314,0.65,0.851,0 -1315,0.65,0.851,0 -1316,0.65,0.851,0 -1317,0.65,0.851,3.38 -1318,0.65,0.851,0 -1319,0.65,0.851,0 -1320,0.446,0.816,0.65 -1321,0.446,0.816,9.61 -1322,0.446,0.816,0 -1323,0.446,0.816,13.59 -1324,0.446,0.816,23.09 -1325,0.446,0.816,38.44 -1326,0.446,0.816,32.27 -1327,0.446,0.816,33.85 -1328,0.424,0.825,27.7 -1329,0.424,0.825,10.29 -1330,0.424,0.825,35.38 -1331,0.424,0.825,20.67 -1332,0.517,0.78,1.81 -1333,0.517,0.78,0 -1334,0.517,0.78,10.34 -1335,0.517,0.78,0 -1336,0.576,0.804,0 -1337,0.576,0.804,6.51 -1338,0.576,0.804,0.32 -1339,0.576,0.804,20.95 -1340,0.576,0.804,0 -1341,0.576,0.804,29.99 -1342,0.576,0.804,26.16 -1343,0.576,0.804,25.05 -1344,0.576,0.804,13.28 -1345,0.576,0.804,17.89 -1346,0.576,0.804,0 -1347,0.576,0.804,5.39 -1348,0.576,0.804,8.83 -1349,0.576,0.804,0.91 -1350,0.576,0.804,1.82 -1351,0.576,0.804,0 -1352,0.532,0.784,23.63 -1353,0.532,0.784,2 -1354,0.532,0.784,21.66 -1355,0.532,0.784,22.76 -1356,0.408,0.846,28.75 -1357,0.407,0.848,18.91 -1358,0.409,0.845,28.61 -1359,0.407,0.848,7.76 -1360,0.446,0.816,10.88 -1361,0.446,0.816,29.4 -1362,0.446,0.816,1.39 -1363,0.446,0.816,2.08 -1364,0.446,0.816,0 -1365,0.446,0.816,0.84 -1366,0.446,0.816,0.76 -1367,0.446,0.816,2.53 -1368,0.472,0.801,23.35 -1369,0.472,0.801,30.73 -1370,0.472,0.801,25.99 -1371,0.472,0.801,32.11 -1372,0.446,0.795,36.39 -1373,0.446,0.795,31.89 -1374,0.446,0.795,25.36 -1375,0.446,0.795,22.31 -1376,0.445,0.816,31.81 -1377,0.445,0.816,17.52 -1378,0.445,0.816,28.52 -1379,0.445,0.816,19.99 -1380,0.517,0.78,19.47 -1381,0.517,0.78,16.03 -1382,0.517,0.78,11.45 -1383,0.517,0.78,1.65 -1384,0.573,0.792,2.22 -1385,0.573,0.792,5.25 -1386,0.573,0.792,13.73 -1387,0.573,0.792,13.52 -1388,0.573,0.792,6.48 -1389,0.573,0.792,0.01 -1390,0.573,0.792,0.01 -1391,0.573,0.792,0.02 -1392,0.573,0.792,0.01 -1393,0.573,0.792,0 -1394,0.573,0.792,0 -1395,0.573,0.792,2.72 -1396,0.573,0.792,0.72 -1397,0.573,0.792,4.66 -1398,0.573,0.792,5.37 -1399,0.573,0.792,25.3 -1400,0.535,0.863,6.71 -1401,0.535,0.863,0 -1402,0.535,0.863,7.69 -1403,0.535,0.863,0.37 -1404,0.55,0.844,22.38 -1405,0.55,0.844,18.44 -1406,0.55,0.844,18.91 -1407,0.55,0.844,25.31 -1408,0.664,0.868,30.07 -1409,0.664,0.868,21.45 -1410,0.664,0.868,43.29 -1411,0.664,0.868,25.61 -1412,0.545,0.917,28.9 -1413,0.545,0.917,34.81 -1414,0.545,0.917,12.88 -1415,0.545,0.917,34.55 -1416,0.598,0.868,34.08 -1417,0.598,0.868,22.75 -1418,0.598,0.868,20.72 -1419,0.598,0.868,18.59 -1420,0.598,0.868,31.64 -1421,0.598,0.868,17.52 -1422,0.598,0.868,21.01 -1423,0.598,0.868,36.17 -1424,0.643,0.837,37.19 -1425,0.643,0.837,21.51 -1426,0.643,0.837,22.21 -1427,0.643,0.837,28.75 -1428,0.643,0.837,0 -1429,0.643,0.837,1.06 -1430,0.643,0.837,0 -1431,0.643,0.837,2 -1432,0.577,0.779,23.19 -1433,0.577,0.779,10.64 -1434,0.577,0.779,30.96 -1435,0.577,0.779,16.46 -1436,0.577,0.779,0.01 -1437,0.577,0.779,0 -1438,0.577,0.779,18.54 -1439,0.577,0.779,23.18 -1440,0.577,0.779,10.61 -1441,0.577,0.779,25.31 -1442,0.577,0.779,30.16 -1443,0.577,0.779,13.39 -1444,0.577,0.779,28.01 -1445,0.577,0.779,23.01 -1446,0.577,0.779,36.76 -1447,0.577,0.779,18.42 -1448,0.643,0.837,0.32 -1449,0.643,0.837,1.64 -1450,0.643,0.837,0.09 -1451,0.643,0.837,0 -1452,0.643,0.837,35.14 -1453,0.643,0.837,29.97 -1454,0.643,0.837,23.36 -1455,0.643,0.837,11.45 -1456,0.598,0.868,34.6 -1457,0.598,0.868,30.8 -1458,0.598,0.868,15.29 -1459,0.598,0.868,31.43 -1460,0.598,0.868,3.1 -1461,0.598,0.868,29.69 -1462,0.598,0.868,0.9 -1463,0.598,0.868,2.6 -1464,0.459,0.736,4.31 -1465,0.459,0.736,7.31 -1466,0.459,0.736,4.89 -1467,0.459,0.736,22.47 -1468,0.47,0.674,16.8 -1469,0.47,0.674,8.41 -1470,0.47,0.674,29.25 -1471,0.47,0.674,3.3 -1472,0.5,0.928,1.53 -1473,0.5,0.928,2.13 -1474,0.5,0.928,9.59 -1475,0.5,0.928,9.9 -1476,0.57,0.857,12.98 -1477,0.57,0.857,25.46 -1478,0.57,0.857,5.87 -1479,0.57,0.857,2.78 -1480,0.584,0.778,1.06 -1481,0.584,0.778,0 -1482,0.584,0.778,0 -1483,0.584,0.778,0 -1484,0.584,0.778,0 -1485,0.584,0.778,0 -1486,0.584,0.778,0 -1487,0.584,0.778,0 -1488,0.584,0.778,2.06 -1489,0.584,0.778,0 -1490,0.584,0.778,0.43 -1491,0.584,0.778,0 -1492,0.584,0.778,0.5 -1493,0.584,0.778,0 -1494,0.584,0.778,21.76 -1495,0.584,0.778,13.88 -1496,0.561,0.875,5.26 -1497,0.561,0.875,6.32 -1498,0.561,0.875,14.94 -1499,0.561,0.875,31.36 -1500,0.543,0.838,38.75 -1501,0.543,0.838,12.07 -1502,0.543,0.838,28.99 -1503,0.543,0.838,16.99 -1504,0.594,0.856,27.99 -1505,0.594,0.856,20.84 -1506,0.594,0.856,17.12 -1507,0.594,0.856,37.79 -1508,0.508,0.853,31.37 -1509,0.508,0.853,14.49 -1510,0.501,0.833,22.16 -1511,0.508,0.853,14.38 -1512,0.501,0.833,0.03 -1513,0.501,0.833,0.01 -1514,0.501,0.833,0 -1515,0.501,0.833,1.99 -1516,0.584,0.832,11.02 -1517,0.584,0.832,32.8 -1518,0.74,0.788,0 -1519,0.584,0.832,0.03 -1520,0.467,0.83,3.67 -1521,0.467,0.83,7.49 -1522,0.467,0.83,0 -1523,0.467,0.83,1.97 -1524,0.481,0.816,6.76 -1525,0.481,0.816,21.52 -1526,0.481,0.816,5.56 -1527,0.481,0.816,16.9 -1528,0.555,0.889,39.98 -1529,0.611,0.805,43.8 -1530,0.537,0.911,24.55 -1531,0.537,0.911,31.91 -1532,0.592,0.78,37.39 -1533,0.554,0.855,7.08 -1534,0.537,0.911,12.72 -1535,0.553,0.858,9.11 -1536,0.382,0.888,0 -1537,0.382,0.888,13.24 -1538,0.382,0.888,28.93 -1539,0.382,0.888,25.77 -1540,0.382,0.888,0.96 -1541,0.382,0.888,12.47 -1542,0.382,0.888,0.34 -1543,0.382,0.888,2.75 -1544,0.44,0.853,6 -1545,0.44,0.853,4.19 -1546,0.44,0.853,5.4 -1547,0.44,0.853,0 -1548,0.679,0.757,10.79 -1549,0.679,0.757,1.74 -1550,0.487,0.775,0.01 -1551,0.74,0.788,4.18 -1552,0.74,0.788,0.02 -1553,0.74,0.788,1.38 -1554,0.74,0.788,0.01 -1555,0.764,0.795,9.23 -1556,0.764,0.795,26.95 -1557,0.764,0.795,14.02 -1558,0.764,0.795,4.42 -1559,0.586,0.709,4.55 -1560,0.586,0.709,0.21 -1561,0.586,0.709,12.85 -1562,0.586,0.709,3.8 -1563,0.302,0.769,14.99 -1564,0.302,0.769,24.24 -1565,0.302,0.769,27.39 -1566,0.302,0.769,26.48 -1567,0.487,0.775,0.85 -1568,0.487,0.775,0 -1569,0.679,0.757,17.73 -1570,0.487,0.775,10.5 -1571,0.487,0.775,0.02 -1572,0.634,0.823,22.17 -1573,0.634,0.823,7.5 -1574,0.514,0.711,0.05 -1575,0.634,0.823,10.73 -1576,0.632,0.826,2.33 -1577,0.632,0.826,19.76 -1578,0.632,0.826,0.63 -1579,0.632,0.826,1.04 -1580,0.567,0.872,4.44 -1581,0.567,0.872,9.88 -1582,0.567,0.872,19.56 -1583,0.567,0.872,24.17 -1584,0.667,0.81,11.06 -1585,0.65,0.818,26.17 -1586,0.667,0.81,32.59 -1587,0.667,0.81,10.27 -1588,0.667,0.81,0 -1589,0.667,0.81,0 -1590,0.514,0.711,0 -1591,0.667,0.81,1.74 -1592,0.514,0.711,7.91 -1593,0.514,0.711,0.03 -1594,0.514,0.711,8.21 -1595,0.514,0.711,0 -1596,0.549,0.659,35.48 -1597,0.549,0.659,17.59 -1598,0.549,0.659,30.86 -1599,0.549,0.659,3.97 -1600,0.719,0.632,7.23 -1601,0.719,0.632,41.21 -1602,0.719,0.632,28.09 -1603,0.719,0.632,4.03 -1604,0.575,0.706,17.63 -1605,0.575,0.706,30.93 -1606,0.575,0.706,9.27 -1607,0.575,0.706,17.53 -1608,0.471,0.647,6.66 -1609,0.471,0.647,0.21 -1610,0.471,0.647,27.51 -1611,0.471,0.647,17.18 -1612,0.683,0.875,0.31 -1613,0.683,0.875,0.86 -1614,0.683,0.875,37.31 -1615,0.683,0.875,44.24 -1616,0.705,0.792,3.16 -1617,0.705,0.792,19.74 -1618,0.705,0.792,32.61 -1619,0.705,0.792,23.84 -1620,0.503,0.708,36.95 -1621,0.503,0.708,17.66 -1622,0.503,0.708,44.87 -1623,0.503,0.708,36.43 -1624,0.603,0.761,0 -1625,0.603,0.761,0 -1626,0.596,0.865,0 -1627,0.603,0.761,25.39 -1628,0.603,0.761,0 -1629,0.589,0.865,0 -1630,0.589,0.865,4.99 -1631,0.589,0.865,0 -1632,0.352,0.766,7.81 -1633,0.589,0.865,0.93 -1634,0.352,0.766,3.99 -1635,0.352,0.766,19.81 -1636,0.589,0.865,14.58 -1637,0.352,0.766,26.23 -1638,0.352,0.766,18.51 -1639,0.429,0.759,31.9 -1640,0.429,0.759,18.32 -1641,0.429,0.759,25.24 -1642,0.429,0.759,22.2 -1643,0.656,0.724,43.35 -1644,0.656,0.724,17.47 -1645,0.656,0.724,17.25 -1646,0.656,0.724,9.79 -1647,0.586,0.679,31.68 -1648,0.586,0.679,7.08 -1649,0.586,0.679,28.92 -1650,0.586,0.679,12.11 -1651,0.414,0.781,31.91 -1652,0.414,0.781,19.37 -1653,0.414,0.781,29.54 -1654,0.414,0.781,36.18 -1655,0.427,0.803,39.88 -1656,0.427,0.803,34.41 -1657,0.427,0.803,37.89 -1658,0.427,0.803,21.49 -1659,0.341,0.804,2.29 -1660,0.341,0.804,6.54 -1661,0.341,0.804,0 -1662,0.341,0.804,3.76 -1663,0.444,0.797,26.83 -1664,0.444,0.797,44.31 -1665,0.444,0.797,4.07 -1666,0.444,0.797,32.77 -1667,0.492,0.693,41.61 -1668,0.492,0.693,10.28 -1669,0.492,0.693,25.12 -1670,0.492,0.693,20.06 -1671,0.664,0.727,17.13 -1672,0.664,0.727,43.34 -1673,0.664,0.727,5.19 -1674,0.664,0.727,22.36 -1675,0.706,0.817,11.78 -1676,0.706,0.817,40.5 -1677,0.706,0.817,22.6 -1678,0.706,0.817,33.76 -1679,0.61,0.795,36.93 -1680,0.618,0.794,5.21 -1681,0.619,0.794,27.86 -1682,0.619,0.793,7.43 -1683,0.658,0.783,22.33 -1684,0.658,0.783,0.54 -1685,0.658,0.783,37.8 -1686,0.658,0.783,2.17 -1687,0.65,0.862,14.95 -1688,0.65,0.862,11.91 -1689,0.65,0.862,4.15 -1690,0.65,0.862,9.03 -1691,0.647,0.879,2.67 -1692,0.647,0.879,12.37 -1693,0.647,0.879,0 -1694,0.647,0.879,8.75 -1695,0.533,0.767,34.5 -1696,0.533,0.767,31.1 -1697,0.533,0.767,35.36 -1698,0.533,0.767,16.69 -1699,0.549,0.808,9.65 -1700,0.549,0.808,33.96 -1701,0.549,0.808,17.61 -1702,0.549,0.808,36.52 -1703,0.518,0.781,2.38 -1704,0.518,0.781,0.04 -1705,0.518,0.781,5.66 -1706,0.518,0.781,11.44 -1707,0.544,0.776,16.19 -1708,0.544,0.776,20.17 -1709,0.544,0.776,6.46 -1710,0.544,0.776,0.04 -1711,0.592,0.811,21.03 -1712,0.592,0.811,27.37 -1713,0.592,0.811,0 -1714,0.592,0.811,0 -1715,0.614,0.831,18.92 -1716,0.614,0.831,19 -1717,0.614,0.831,17.94 -1718,0.614,0.831,18.99 -1719,0.633,0.87,0 -1720,0.633,0.87,0.98 -1721,0.633,0.87,0 -1722,0.633,0.87,0 -1723,0.652,0.789,0.49 -1724,0.652,0.789,0 -1725,0.652,0.789,2.03 -1726,0.652,0.789,0.06 -1727,0.6,0.827,26.44 -1728,0.6,0.827,29.9 -1729,0.6,0.827,7.67 -1730,0.6,0.827,2.89 -1731,0.554,0.748,14.55 -1732,0.554,0.748,29.98 -1733,0.554,0.748,27.9 -1734,0.554,0.748,19.55 -1735,0.656,0.741,4.52 -1736,0.656,0.741,2.95 -1737,0.656,0.741,13.59 -1738,0.656,0.741,20.88 -1739,0.633,0.871,0 -1740,0.633,0.871,0 -1741,0.633,0.871,0 -1742,0.633,0.871,9.4 -1743,0.632,0.871,5.18 -1744,0.632,0.871,28.86 -1745,0.632,0.871,1.08 -1746,0.632,0.871,0.17 -1747,0.579,0.813,4.68 -1748,0.579,0.813,0 -1749,0.579,0.813,0.58 -1750,0.579,0.813,0 -1751,0.462,0.792,15.05 -1752,0.462,0.792,8.16 -1753,0.462,0.792,35.9 -1754,0.462,0.792,19.46 -1755,0.434,0.724,0.42 -1756,0.434,0.724,1.22 -1757,0.434,0.724,0 -1758,0.434,0.724,0.53 -1759,0.445,0.728,12.33 -1760,0.445,0.728,10.57 -1761,0.445,0.728,2.55 -1762,0.445,0.728,14.54 -1763,0.48,0.796,9.32 -1764,0.48,0.796,38.48 -1765,0.48,0.796,28.34 -1766,0.48,0.796,35.75 -1767,0.667,0.829,2.85 -1768,0.667,0.829,14.66 -1769,0.667,0.829,44.78 -1770,0.667,0.829,45.95 -1771,0.456,0.79,49.97 -1772,0.456,0.79,51 -1773,0.456,0.79,37.91 -1774,0.456,0.79,15.87 -1775,0.404,0.79,24.11 -1776,0.404,0.79,8.57 -1777,0.404,0.79,4.54 -1778,0.404,0.79,0 -1779,0.493,0.818,38.32 -1780,0.493,0.818,0.25 -1781,0.493,0.818,6.69 -1782,0.493,0.818,0 -1783,0.385,0.755,7.55 -1784,0.385,0.755,21.26 -1785,0.385,0.755,37.73 -1786,0.385,0.755,30.86 -1787,0.508,0.863,9.6 -1788,0.508,0.863,34.53 -1789,0.508,0.863,27.46 -1790,0.508,0.863,35.39 -1791,0.524,0.88,36.38 -1792,0.524,0.88,2.99 -1793,0.524,0.88,13.89 -1794,0.524,0.88,5.55 -1795,0.523,0.812,39.7 -1796,0.523,0.812,35.22 -1797,0.523,0.812,31.27 -1798,0.523,0.812,27.85 -1799,0.603,0.826,42.19 -1800,0.603,0.826,42.8 -1801,0.603,0.826,27.31 -1802,0.603,0.826,39.89 -1803,0.553,0.847,0 -1804,0.553,0.847,0 -1805,0.553,0.847,0 -1806,0.553,0.847,0 -1807,0.553,0.847,0 -1808,0.553,0.847,0.27 -1809,0.553,0.847,2.31 -1810,0.553,0.847,1.85 -1811,0.553,0.847,1.43 -1812,0.553,0.847,0 -1813,0.557,0.847,0 -1814,0.546,0.899,0.13 -1815,0.546,0.899,0 -1816,0.546,0.899,3.02 -1817,0.546,0.899,2.13 -1818,0.546,0.899,0 -1819,0.546,0.899,3.05 -1820,0.546,0.899,21.17 -1821,0.546,0.899,10.39 -1822,0.557,0.847,0.28 -1823,0.557,0.847,0 -1824,0.557,0.847,6.69 -1825,0.557,0.847,24.63 -1826,0.557,0.847,0 -1827,0.557,0.847,0 -1828,0.557,0.847,0 -1829,0.557,0.847,0 -1830,0.553,0.847,0 -1831,0.553,0.847,0 -1832,0.553,0.847,0 -1833,0.553,0.847,0 -1834,0.553,0.847,0 -1835,0.553,0.847,0 -1836,0.553,0.847,0 -1837,0.553,0.847,0 -1838,0.464,0.773,0 -1839,0.464,0.773,0 -1840,0.464,0.773,0 -1841,0.464,0.773,0 -1842,0.464,0.773,0 -1843,0.464,0.773,2.91 -1844,0.464,0.773,0 -1845,0.464,0.773,0 -1846,0.588,0.806,8.9 -1847,0.588,0.806,0.54 -1848,0.588,0.806,0 -1849,0.588,0.806,7.81 -1850,0.588,0.806,22.97 -1851,0.588,0.806,13.22 -1852,0.588,0.806,25.89 -1853,0.588,0.806,27.18 -1854,0.562,0.877,24.56 -1855,0.562,0.877,18.28 -1856,0.562,0.877,30.88 -1857,0.562,0.877,20.79 -1858,0.562,0.877,9.5 -1859,0.562,0.877,0 -1860,0.562,0.877,15.64 -1861,0.562,0.877,13.74 -1862,0.562,0.877,8.29 -1863,0.562,0.877,21.62 -1864,0.562,0.877,0.04 -1865,0.562,0.877,0.05 -1866,0.562,0.877,12.84 -1867,0.562,0.877,17.04 -1868,0.562,0.877,1.46 -1869,0.562,0.877,3.31 -1870,0.588,0.806,2.81 -1871,0.588,0.806,12.33 -1872,0.588,0.806,0 -1873,0.588,0.806,0 -1874,0.588,0.806,0 -1875,0.588,0.806,0.64 -1876,0.588,0.806,2 -1877,0.588,0.806,0 -1878,0.464,0.773,11.22 -1879,0.464,0.773,0 -1880,0.464,0.773,0.63 -1881,0.464,0.773,0 -1882,0.464,0.773,0 -1883,0.464,0.773,0 -1884,0.464,0.773,0 -1885,0.464,0.773,0 -1886,0.617,0.822,5.26 -1887,0.618,0.822,7.17 -1888,0.617,0.823,17.92 -1889,0.618,0.822,8.47 -1890,0.538,0.923,28.35 -1891,0.538,0.923,34.49 -1892,0.538,0.923,23.38 -1893,0.538,0.923,5.65 -1894,0.595,0.873,35.6 -1895,0.595,0.873,0.19 -1896,0.595,0.873,26.43 -1897,0.595,0.873,0.21 -1898,0.595,0.873,0 -1899,0.595,0.873,0 -1900,0.595,0.873,0.34 -1901,0.595,0.873,0 -1902,0.598,0.808,0.29 -1903,0.598,0.808,0 -1904,0.598,0.808,0 -1905,0.598,0.808,0 -1906,0.598,0.808,0 -1907,0.598,0.808,4.05 -1908,0.598,0.808,0 -1909,0.598,0.808,1.45 -1910,0.598,0.808,0 -1911,0.598,0.808,0 -1912,0.598,0.808,0 -1913,0.598,0.808,0.59 -1914,0.598,0.808,0 -1915,0.598,0.808,0 -1916,0.598,0.808,0 -1917,0.598,0.808,0 -1918,0.595,0.873,0 -1919,0.595,0.873,0 -1920,0.595,0.873,0 -1921,0.595,0.873,0 -1922,0.595,0.873,11.82 -1923,0.595,0.873,0 -1924,0.595,0.873,5.03 -1925,0.595,0.873,0 -1926,0.628,0.871,7.85 -1927,0.628,0.872,10.83 -1928,0.628,0.871,4.66 -1929,0.628,0.872,8.52 -1930,0.617,0.823,0.95 -1931,0.617,0.823,12.59 -1932,0.617,0.823,4.03 -1933,0.617,0.823,0 -1934,0.468,0.832,3.27 -1935,0.468,0.832,27.69 -1936,0.468,0.832,0.4 -1937,0.468,0.832,8.35 -1938,0.503,0.863,12.44 -1939,0.503,0.863,40.11 -1940,0.503,0.863,20.89 -1941,0.503,0.863,6.88 -1942,0.518,0.832,0 -1943,0.518,0.832,0 -1944,0.518,0.832,4.77 -1945,0.518,0.832,0 -1946,0.518,0.832,0 -1947,0.518,0.832,0 -1948,0.518,0.832,0 -1949,0.518,0.832,0 -1950,0.5,0.832,0 -1951,0.5,0.832,0 -1952,0.5,0.832,0 -1953,0.5,0.832,0 -1954,0.5,0.832,0 -1955,0.5,0.832,0 -1956,0.5,0.832,0 -1957,0.5,0.832,1.4 -1958,0.5,0.832,0 -1959,0.5,0.832,0 -1960,0.5,0.832,0 -1961,0.5,0.832,0 -1962,0.5,0.832,0 -1963,0.5,0.832,0 -1964,0.5,0.832,0 -1965,0.5,0.832,1.47 -1966,0.518,0.832,0 -1967,0.518,0.832,0 -1968,0.518,0.832,0 -1969,0.518,0.832,0 -1970,0.518,0.832,4.08 -1971,0.518,0.832,0 -1972,0.518,0.832,0 -1973,0.518,0.832,1.9 -1974,0.561,0.85,2.26 -1975,0.561,0.85,4.16 -1976,0.561,0.85,2.46 -1977,0.561,0.85,0 -1978,0.533,0.793,21.52 -1979,0.533,0.793,12.61 -1980,0.533,0.793,4.84 -1981,0.533,0.793,4.15 -1982,0.661,0.782,6.48 -1983,0.661,0.782,1.99 -1984,0.661,0.782,4.81 -1985,0.661,0.782,0.79 -1986,0.682,0.758,2.96 -1987,0.682,0.758,0.99 -1988,0.682,0.758,0 -1989,0.682,0.758,0 -1990,0.599,0.774,0.02 -1991,0.599,0.774,0 -1992,0.599,0.774,0.57 -1993,0.599,0.774,0 -1994,0.599,0.774,0 -1995,0.599,0.774,0 -1996,0.599,0.774,0 -1997,0.599,0.774,9.56 -1998,0.501,0.831,0 -1999,0.501,0.831,0 -2000,0.501,0.831,19.19 -2001,0.501,0.831,0 -2002,0.501,0.831,0 -2003,0.501,0.831,0 -2004,0.501,0.831,0 -2005,0.501,0.831,0 -2006,0.501,0.831,0 -2007,0.501,0.831,0 -2008,0.501,0.831,0 -2009,0.501,0.831,0 -2010,0.501,0.831,8.3 -2011,0.501,0.831,1.05 -2012,0.501,0.831,0 -2013,0.501,0.831,0 -2014,0.599,0.774,22.31 -2015,0.599,0.774,16.82 -2016,0.599,0.774,1.27 -2017,0.599,0.774,0 -2018,0.599,0.774,0.75 -2019,0.599,0.774,2.35 -2020,0.599,0.774,9.94 -2021,0.599,0.774,13.32 -2022,0.705,0.769,0 -2023,0.705,0.769,0 -2024,0.705,0.769,0 -2025,0.705,0.769,9.83 -2026,0.612,0.79,2.91 -2027,0.612,0.79,0 -2028,0.612,0.79,7.27 -2029,0.612,0.79,0 -2030,0.464,0.747,23.38 -2031,0.464,0.747,45.33 -2032,0.555,0.754,11.06 -2033,0.586,0.758,39.37 -2034,0.464,0.748,6.15 -2035,0.465,0.75,3.58 -2036,0.577,0.781,44.47 -2037,0.48,0.814,45.06 -2038,0.59,0.809,38.55 -2039,0.614,0.807,44.09 -2040,0.647,0.723,29.36 -2041,0.647,0.721,20.44 -2042,0.598,0.799,40.24 -2043,0.598,0.799,43.13 -2044,0.598,0.799,42.16 -2045,0.598,0.799,42.16 -2046,0.45,0.848,48.15 -2047,0.45,0.848,35.08 -2048,0.45,0.848,42.31 -2049,0.45,0.848,41.64 -2050,0.493,0.885,34.32 -2051,0.493,0.885,44.44 -2052,0.493,0.885,18.94 -2053,0.493,0.885,39.94 -2054,0.416,0.893,23.58 -2055,0.488,0.909,27.93 -2056,0.359,0.862,15.11 -2057,0.359,0.862,9.11 -2058,0.519,0.87,38.19 -2059,0.519,0.87,45.05 -2060,0.519,0.87,29.87 -2061,0.519,0.87,21.69 -2062,0.649,0.818,42.4 -2063,0.649,0.818,41.42 -2064,0.649,0.818,33.91 -2065,0.649,0.818,43.42 -2066,0.648,0.754,35.8 -2067,0.648,0.746,41.46 -2068,0.599,0.814,45.43 -2069,0.601,0.813,39.52 -2070,0.611,0.763,34.47 -2071,0.48,0.814,47.38 -2072,0.482,0.809,44.56 -2073,0.555,0.798,34.02 -2074,0.555,0.798,40.34 -2075,0.555,0.798,37.16 -2076,0.403,0.846,39.61 -2077,0.403,0.846,41.33 -2078,0.403,0.846,38.47 -2079,0.403,0.846,38.69 -2080,0.516,0.833,41.57 -2081,0.516,0.833,24.25 -2082,0.516,0.833,23.72 -2083,0.516,0.833,24.87 -2084,0.607,0.842,30.63 -2085,0.432,0.85,33.5 -2086,0.552,0.845,35.36 -2087,0.551,0.846,46.88 -2088,0.36,0.862,30.07 -2089,0.405,0.849,11.09 -2090,0.461,0.907,18.86 -2091,0.53,0.841,22.35 -2092,0.504,0.874,3.76 -2093,0.504,0.874,15.92 -2094,0.504,0.874,4.22 -2095,0.504,0.874,12.08 -2096,0.621,0.91,1.64 -2097,0.621,0.91,15.58 -2098,0.621,0.91,0 -2099,0.621,0.91,0 -2100,0.666,0.912,6.6 -2101,0.666,0.912,4.64 -2102,0.666,0.912,5.22 -2103,0.666,0.912,0.02 -2104,0.568,0.867,24.07 -2105,0.568,0.867,25.95 -2106,0.694,0.858,13.02 -2107,0.694,0.858,13.14 -2108,0.639,0.791,17.59 -2109,0.551,0.869,33.26 -2110,0.551,0.869,0 -2111,0.551,0.869,41.07 -2112,0.551,0.869,1.96 -2113,0.448,0.913,0.76 -2114,0.553,0.801,32.87 -2115,0.452,0.913,9.81 -2116,0.659,0.902,16.73 -2117,0.457,0.848,16.83 -2118,0.616,0.879,8.91 -2119,0.659,0.902,9.5 -2120,0.659,0.902,12.84 -2121,0.666,0.899,10.78 -2122,0.666,0.899,5.57 -2123,0.666,0.899,2.27 -2124,0.666,0.899,3.18 -2125,0.663,0.839,0 -2126,0.663,0.839,0.71 -2127,0.663,0.839,11.89 -2128,0.663,0.839,0.53 -2129,0.521,0.82,2.01 -2130,0.521,0.82,0.73 -2131,0.521,0.82,5.47 -2132,0.521,0.82,3.24 -2133,0.346,0.811,2.8 -2134,0.346,0.811,0 -2135,0.346,0.811,1.35 -2136,0.346,0.811,0 -2137,0.427,0.864,4.59 -2138,0.427,0.864,0 -2139,0.427,0.864,0 -2140,0.427,0.864,3.31 -2141,0.556,0.878,3.57 -2142,0.43,0.865,24.94 -2143,0.426,0.864,12.69 -2144,0.427,0.864,25.66 -2145,0.496,0.879,1.18 -2146,0.496,0.879,12.23 -2147,0.496,0.879,5.38 -2148,0.496,0.879,0.92 -2149,0.515,0.888,0 -2150,0.515,0.888,0.96 -2151,0.515,0.888,4 -2152,0.515,0.888,5.34 -2153,0.665,0.841,40.12 -2154,0.448,0.913,9.99 -2155,0.266,0.856,21.95 -2156,0.262,0.856,4.92 -2157,0.367,0.828,24.69 -2158,0.693,0.619,47.56 -2159,0.511,0.711,6.16 -2160,0.51,0.709,42.17 -2161,0.569,0.668,23.03 -2162,0.51,0.709,22.55 -2163,0.455,0.854,31.84 -2164,0.506,0.768,33 -2165,0.593,0.86,9.15 -2166,0.485,0.857,40.33 -2167,0.367,0.828,17.78 -2168,0.852,0.752,0 -2169,0.85,0.755,4.71 -2170,0.749,0.846,0 -2171,0.819,0.669,3.71 -2172,0.819,0.669,1.85 -2173,0.819,0.669,18.73 -2174,0.819,0.669,20.16 -2175,0.585,0.748,7.86 -2176,0.585,0.748,37.68 -2177,0.585,0.748,2.4 -2178,0.585,0.748,38.76 -2179,0.577,0.768,21.79 -2180,0.569,0.799,26.35 -2181,0.569,0.8,35.6 -2182,0.569,0.8,25.4 -2183,0.711,0.762,48.5 -2184,0.711,0.762,44.74 -2185,0.711,0.762,28.71 -2186,0.711,0.762,43.21 -2187,0.56,0.728,39.11 -2188,0.577,0.696,51.39 -2189,0.594,0.676,32.93 -2190,0.731,0.619,44 -2191,0.694,0.614,42.94 -2192,0.694,0.614,45.53 -2193,0.694,0.614,43.75 -2194,0.694,0.614,41.34 -2195,0.663,0.649,37.81 -2196,0.663,0.649,12.05 -2197,0.663,0.649,35.01 -2198,0.663,0.649,15.25 -2199,0.652,0.658,28.81 -2200,0.652,0.658,16.66 -2201,0.652,0.658,8.87 -2202,0.652,0.658,3.19 -2203,0.625,0.706,12.92 -2204,0.625,0.706,20.98 -2205,0.625,0.706,4.83 -2206,0.625,0.706,34.63 -2207,0.678,0.662,27.11 -2208,0.73,0.619,47.61 -2209,0.623,0.791,21.78 -2210,0.644,0.717,36.67 -2211,0.678,0.877,0.54 -2212,0.678,0.877,0 -2213,0.678,0.877,0 -2214,0.678,0.877,1.39 -2215,0.678,0.877,3.88 -2216,0.678,0.877,6.16 -2217,0.678,0.877,0 -2218,0.678,0.877,0 -2219,0.62,0.934,0.48 -2220,0.62,0.934,1.37 -2221,0.62,0.934,26.12 -2222,0.62,0.934,0.42 -2223,0.484,0.937,42.73 -2224,0.681,0.847,2.36 -2225,0.685,0.842,39.42 -2226,0.685,0.842,13.23 -2227,0.681,0.889,0 -2228,0.681,0.889,0 -2229,0.681,0.889,0 -2230,0.681,0.889,0 -2231,0.678,0.877,0 -2232,0.678,0.877,0.01 -2233,0.678,0.877,0 -2234,0.678,0.877,2.49 -2235,0.551,0.764,12.2 -2236,0.551,0.764,2.71 -2237,0.551,0.764,7.64 -2238,0.551,0.764,4.38 -2239,0.551,0.712,4.03 -2240,0.551,0.712,2.64 -2241,0.551,0.712,1.36 -2242,0.551,0.712,3.48 -2243,0.688,0.651,0.98 -2244,0.688,0.651,1.74 -2245,0.688,0.651,4.08 -2246,0.688,0.651,0 -2247,0.68,0.654,0 -2248,0.68,0.654,5.38 -2249,0.68,0.654,0 -2250,0.68,0.654,1.06 -2251,0.554,0.73,3.65 -2252,0.682,0.653,0.72 -2253,0.635,0.687,1.89 -2254,0.637,0.684,0.57 -2255,0.657,0.719,0.98 -2256,0.657,0.719,1.07 -2257,0.657,0.719,0 -2258,0.657,0.719,0 -2259,0.679,0.901,0 -2260,0.679,0.901,16.11 -2261,0.679,0.901,0 -2262,0.679,0.901,0 -2263,0.688,0.942,2.16 -2264,0.688,0.942,0 -2265,0.688,0.942,0.56 -2266,0.688,0.942,0 -2267,0.627,0.9,15.59 -2268,0.627,0.9,19.36 -2269,0.627,0.9,1.92 -2270,0.627,0.9,13.53 -2271,0.611,0.911,8.63 -2272,0.611,0.911,12.32 -2273,0.611,0.911,22.81 -2274,0.611,0.911,8.5 -2275,0.482,0.957,6.6 -2276,0.482,0.957,12.27 -2277,0.482,0.957,2 -2278,0.482,0.957,8.71 -2279,0.703,0.92,5.77 -2280,0.703,0.92,0 -2281,0.703,0.92,8.66 -2282,0.703,0.92,0 -2283,0.678,0.885,0 -2284,0.678,0.885,0 -2285,0.678,0.885,0 -2286,0.678,0.885,0 -2287,0.658,0.716,2.94 -2288,0.658,0.716,2.8 -2289,0.658,0.716,0 -2290,0.658,0.716,1.87 -2291,0.636,0.684,2.05 -2292,0.636,0.684,1.37 -2293,0.636,0.684,1.54 -2294,0.636,0.684,6.16 -2295,0.683,0.789,1.01 -2296,0.683,0.789,5.07 -2297,0.683,0.789,0.14 -2298,0.683,0.789,6.4 -2299,0.679,0.801,0 -2300,0.679,0.801,1.81 -2301,0.679,0.801,7.3 -2302,0.679,0.801,0.83 -2303,0.676,0.817,1.4 -2304,0.676,0.817,0 -2305,0.676,0.817,0.92 -2306,0.676,0.817,6.75 -2307,0.664,0.818,6.26 -2308,0.664,0.818,0.33 -2309,0.664,0.818,14.78 -2310,0.664,0.818,1.22 -2311,0.567,0.891,16.16 -2312,0.567,0.891,2.23 -2313,0.567,0.891,11.88 -2314,0.567,0.891,4.74 -2315,0.552,0.893,19.16 -2316,0.689,0.943,22.84 -2317,0.553,0.892,18.73 -2318,0.687,0.942,17.76 -2319,0.655,0.795,3.66 -2320,0.655,0.795,2.01 -2321,0.655,0.795,2.15 -2322,0.738,0.85,2.29 -2323,0.738,0.85,4.42 -2324,0.738,0.85,0 -2325,0.738,0.85,0 -2326,0.709,0.839,35.21 -2327,0.709,0.839,45.89 -2328,0.709,0.839,0.11 -2329,0.709,0.839,38.95 -2330,0.588,0.853,3.06 -2331,0.588,0.853,1.26 -2332,0.79,0.884,7.14 -2333,0.787,0.882,2.9 -2334,0.795,0.887,37.88 -2335,0.649,0.901,0 -2336,0.649,0.901,1.28 -2337,0.648,0.833,16.38 -2338,0.648,0.833,13.09 -2339,0.648,0.901,5.47 -2340,0.649,0.901,1.98 -2341,0.494,0.849,1.98 -2342,0.493,0.849,3.97 -2343,0.337,0.84,25.09 -2344,0.337,0.84,38.65 -2345,0.648,0.9,4.43 -2346,0.649,0.901,5.85 -2347,0.512,0.851,28.58 -2348,0.648,0.902,25.08 -2349,0.649,0.901,2.04 -2350,0.648,0.901,27.85 -2351,0.648,0.9,21.71 -2352,0.648,0.9,18.22 -2353,0.274,0.875,38.59 -2354,0.274,0.875,32.05 -2355,0.274,0.875,31.86 -2356,0.274,0.875,39.51 -2357,0.426,0.924,45.55 -2358,0.426,0.924,49.2 -2359,0.426,0.924,40.34 -2360,0.426,0.924,37.86 -2361,0.459,0.861,31.65 -2362,0.459,0.861,33.73 -2363,0.459,0.861,38.49 -2364,0.459,0.861,43.98 -2365,0.593,0.441,40.04 -2366,0.592,0.445,30.73 -2367,0.593,0.445,37.93 -2368,0.593,0.441,32.51 -2369,0.577,0.731,3.46 -2370,0.55,0.944,26.5 -2371,0.591,0.479,2.74 -2372,0.415,0.921,43.06 -2373,0.555,0.913,38.2 -2374,0.558,0.889,46.36 -2375,0.601,0.903,48.39 -2376,0.524,0.851,59.12 -2377,0.656,0.835,11.37 -2378,0.545,0.87,31.13 -2379,0.664,0.825,9.87 -2380,0.645,0.844,12.77 -2381,0.716,0.893,34.34 -2382,0.766,0.907,29.67 -2383,0.651,0.84,9.38 -2384,0.668,0.828,0.33 -2385,0.754,0.882,8.04 -2386,0.754,0.882,0.07 -2387,0.754,0.882,2.77 -2388,0.754,0.882,9.68 -2389,0.709,0.836,29.97 -2390,0.709,0.836,33.16 -2391,0.709,0.836,33.79 -2392,0.709,0.836,19.52 -2393,0.601,0.767,43.01 -2394,0.601,0.767,18.39 -2395,0.601,0.767,27.25 -2396,0.601,0.767,16.2 -2397,0.696,0.824,19.73 -2398,0.696,0.824,35.35 -2399,0.658,0.834,8.44 -2400,0.597,0.828,41.16 -2401,0.623,0.859,33.6 -2402,0.572,0.831,38.91 -2403,0.79,0.824,45.89 -2404,0.627,0.811,53.42 -2405,0.604,0.736,16.26 -2406,0.582,0.903,49.11 -2407,0.699,0.669,9.76 -2408,0.75,0.824,61.76 -2409,0.633,0.592,41.16 -2410,0.645,0.6,30.57 -2411,0.556,0.54,51.32 -2412,0.645,0.599,39.01 -2413,0.693,0.593,40.4 -2414,0.722,0.594,13.2 -2415,0.549,0.594,49.92 -2416,0.549,0.598,18.56 -2417,0.745,0.716,6.89 -2418,0.767,0.796,56.47 -2419,0.554,0.6,3.25 -2420,0.769,0.786,45.11 -2421,0.685,0.859,42.16 -2422,0.685,0.859,34.22 -2423,0.685,0.859,48.54 -2424,0.685,0.859,42.17 -2425,0.645,0.845,28.08 -2426,0.518,0.831,42.74 -2427,0.7,0.865,25.75 -2428,0.591,0.882,29.79 -2429,0.61,0.749,1.28 -2430,0.61,0.749,7.47 -2431,0.61,0.749,8.85 -2432,0.61,0.749,3.87 -2433,0.63,0.756,24.81 -2434,0.63,0.756,6.18 -2435,0.63,0.756,0 -2436,0.63,0.756,0 -2437,0.606,0.693,0 -2438,0.606,0.693,0 -2439,0.606,0.693,17.86 -2440,0.606,0.693,5.86 -2441,0.601,0.798,9.58 -2442,0.601,0.798,30.44 -2443,0.601,0.798,38.2 -2444,0.601,0.798,29.05 -2445,0.7,0.865,24.48 -2446,0.591,0.882,37.5 -2447,0.72,0.769,28.76 -2448,0.655,0.742,38.87 -2449,0.762,0.816,37.51 -2450,0.739,0.816,36.1 -2451,0.761,0.816,21.91 -2452,0.731,0.817,11.82 -2453,0.693,0.736,1.59 -2454,0.693,0.736,1.58 -2455,0.693,0.736,0 -2456,0.693,0.736,1.88 -2457,0.548,0.601,20.46 -2458,0.548,0.601,4.99 -2459,0.548,0.601,1.23 -2460,0.548,0.601,4.13 -2461,0.412,0.902,11.86 -2462,0.41,0.902,34.4 -2463,0.65,0.723,31.98 -2464,0.651,0.724,18.4 -2465,0.459,0.864,7.35 -2466,0.459,0.864,47.05 -2467,0.459,0.864,9.03 -2468,0.459,0.864,1.42 -2469,0.697,0.764,26.93 -2470,0.697,0.764,18.23 -2471,0.697,0.764,28.51 -2472,0.697,0.764,46.88 -2473,0.678,0.704,12.59 -2474,0.678,0.704,5.06 -2475,0.678,0.704,29.04 -2476,0.678,0.704,15.14 -2477,0.695,0.776,41.1 -2478,0.695,0.776,36.46 -2479,0.695,0.776,27.06 -2480,0.695,0.776,20.41 -2481,0.695,0.776,12.37 -2482,0.695,0.776,0.38 -2483,0.695,0.776,2.01 -2484,0.695,0.776,0 -2485,0.788,0.675,0 -2486,0.788,0.675,0 -2487,0.788,0.675,6.63 -2488,0.788,0.675,0.05 -2489,0.787,0.675,1.66 -2490,0.787,0.675,0.05 -2491,0.787,0.675,20.95 -2492,0.787,0.675,6.89 -2493,0.557,0.691,41.7 -2494,0.633,0.683,31.27 -2495,0.557,0.69,34.07 -2496,0.715,0.677,46.15 -2497,0.662,0.801,36.28 -2498,0.662,0.801,50.81 -2499,0.662,0.801,50.74 -2500,0.662,0.801,48.55 -2501,0.625,0.696,12.28 -2502,0.625,0.696,8.25 -2503,0.625,0.696,20.18 -2504,0.625,0.696,32.32 -2505,0.606,0.713,31.61 -2506,0.606,0.713,24.52 -2507,0.606,0.713,24.49 -2508,0.606,0.713,15.72 -2509,0.612,0.632,48.74 -2510,0.612,0.632,40.54 -2511,0.674,0.517,42.67 -2512,0.672,0.519,39.08 -2513,0.71,0.428,39.45 -2514,0.628,0.558,40.65 -2515,0.604,0.478,34 -2516,0.571,0.542,31.91 -2517,0.634,0.623,33.83 -2518,0.558,0.487,42.6 -2519,0.581,0.451,40.85 -2520,0.685,0.591,38.55 -2521,0.685,0.554,49.05 -2522,0.499,0.707,38.75 -2523,0.591,0.538,49.68 -2524,0.566,0.526,46.84 -2525,0.554,0.612,36.19 -2526,0.633,0.492,44.16 -2527,0.565,0.756,47.29 -2528,0.53,0.821,49.4 -2529,0.492,0.765,41.48 -2530,0.607,0.777,45.49 -2531,0.531,0.861,54.33 -2532,0.531,0.861,50.64 -2533,0.531,0.861,44.42 -2534,0.531,0.861,43.38 -2535,0.692,0.817,45.7 -2536,0.676,0.902,10.18 -2537,0.576,0.789,45.19 -2538,0.643,0.863,15.44 -2539,0.454,0.707,44.1 -2540,0.589,0.742,53.92 -2541,0.42,0.923,42.68 -2542,0.551,0.854,14.15 -2543,0.506,0.802,46.7 -2544,0.586,0.834,48.57 -2545,0.563,0.821,21.67 -2546,0.615,0.835,31.25 -2547,0.468,0.814,49.18 -2548,0.651,0.789,31.29 -2549,0.439,0.799,32.64 -2550,0.606,0.766,43.75 -2551,0.576,0.713,46.81 -2552,0.615,0.667,47.62 -2553,0.479,0.803,39.95 -2554,0.57,0.744,49.61 -2555,0.689,0.91,30.42 -2556,0.642,0.843,40.64 -2557,0.689,0.91,45 -2558,0.657,0.847,42.62 -2559,0.42,0.923,22.57 -2560,0.536,0.885,31.98 -2561,0.675,0.832,1.97 -2562,0.654,0.913,35.75 -2563,0.623,0.769,46.42 -2564,0.577,0.769,44.11 -2565,0.775,0.661,1.95 -2566,0.775,0.661,11.33 -2567,0.775,0.661,1.55 -2568,0.738,0.838,22.97 -2569,0.77,0.87,1.31 -2570,0.77,0.87,15.66 -2571,0.759,0.812,1.95 -2572,0.686,0.827,37.72 -2573,0.62,0.766,45.15 -2574,0.62,0.766,48 -2575,0.479,0.829,27.52 -2576,0.489,0.911,35.18 -2577,0.479,0.827,41.32 -2578,0.485,0.893,22.82 -2579,0.523,0.877,37.34 -2580,0.718,0.876,20.78 -2581,0.718,0.876,25.01 -2582,0.672,0.888,21.67 -2583,0.672,0.888,23.4 -2584,0.672,0.888,12.51 -2585,0.676,0.864,2.15 -2586,0.685,0.809,0 -2587,0.72,0.809,0.48 -2588,0.72,0.809,0.03 -2589,0.72,0.809,4.26 -2590,0.72,0.809,0.01 -2591,0.72,0.81,1.22 -2592,0.72,0.81,0 -2593,0.72,0.81,0 -2594,0.72,0.81,0 -2595,0.597,0.868,37.63 -2596,0.604,0.866,18.16 -2597,0.742,0.829,46.71 -2598,0.742,0.828,39.28 -2599,0.682,0.839,5.97 -2600,0.682,0.839,17.83 -2601,0.861,0.861,47.36 -2602,0.436,0.797,46.79 -2603,0.591,0.796,41.48 -2604,0.729,0.85,10.53 -2605,0.729,0.85,6.5 -2606,0.725,0.848,37.53 -2607,0.655,0.851,32.19 -2608,0.568,0.854,23.12 -2609,0.613,0.885,28.43 -2610,0.549,0.856,43.19 -2611,0.63,0.898,6.88 -2612,0.562,0.897,50.42 -2613,0.56,0.897,47.48 -2614,0.426,0.933,36.95 -2615,0.426,0.933,29.88 -2616,0.712,0.865,14.75 -2617,0.71,0.874,5.74 -2618,0.656,0.909,5.34 -2619,0.639,0.928,17.47 -2620,0.684,0.913,7.55 -2621,0.684,0.913,0 -2622,0.684,0.913,4.29 -2623,0.684,0.913,0 -2624,0.578,0.862,4.4 -2625,0.578,0.862,0 -2626,0.578,0.862,21.19 -2627,0.578,0.862,3.04 -2628,0.614,0.872,24.22 -2629,0.614,0.872,36.16 -2630,0.614,0.872,22.83 -2631,0.614,0.872,37.62 -2632,0.636,0.902,0.55 -2633,0.668,0.885,3.15 -2634,0.635,0.9,4.1 -2635,0.665,0.884,4.37 -2636,0.625,0.893,10.39 -2637,0.625,0.893,2.63 -2638,0.625,0.893,2.97 -2639,0.625,0.893,7.96 -2640,0.598,0.855,2.92 -2641,0.598,0.855,12.62 -2642,0.598,0.855,0.43 -2643,0.598,0.855,1.97 -2644,0.521,0.826,48.69 -2645,0.393,0.784,25.29 -2646,0.506,0.821,48.59 -2647,0.393,0.783,38.96 -2648,0.498,0.76,11.07 -2649,0.488,0.778,34.1 -2650,0.679,0.791,3.37 -2651,0.679,0.791,0 -2652,0.679,0.791,0 -2653,0.679,0.791,0 -2654,0.804,0.688,0 -2655,0.804,0.688,0 -2656,0.804,0.688,0.19 -2657,0.804,0.688,11.57 -2658,0.65,0.797,2.94 -2659,0.65,0.797,5.17 -2660,0.65,0.797,26.72 -2661,0.65,0.797,28.73 -2662,0.65,0.797,36.3 -2663,0.65,0.797,38.46 -2664,0.65,0.797,15.19 -2665,0.65,0.797,27.69 -2666,0.65,0.797,2.63 -2667,0.65,0.797,21.91 -2668,0.65,0.797,0 -2669,0.65,0.797,0.39 -2670,0.804,0.688,10.36 -2671,0.804,0.688,5.83 -2672,0.804,0.688,0 -2673,0.804,0.688,0 -2674,0.804,0.688,0 -2675,0.804,0.688,0 -2676,0.804,0.688,0 -2677,0.804,0.688,1.6 -2678,0.679,0.791,0 -2679,0.679,0.791,0 -2680,0.679,0.791,0 -2681,0.679,0.791,0 -2682,0.679,0.791,2.94 -2683,0.679,0.791,0 -2684,0.679,0.791,4.01 -2685,0.679,0.791,0 -2686,0.577,0.861,2.42 -2687,0.577,0.861,0.74 -2688,0.577,0.861,34.57 -2689,0.577,0.861,26.39 -2690,0.577,0.861,1.12 -2691,0.577,0.861,0.19 -2692,0.577,0.861,33.08 -2693,0.577,0.861,15.27 -2694,0.522,0.853,0 -2695,0.522,0.853,0.66 -2696,0.522,0.853,14.71 -2697,0.522,0.853,10.88 -2698,0.522,0.853,0 -2699,0.522,0.853,0 -2700,0.522,0.853,0.91 -2701,0.522,0.853,0 -2702,0.601,0.858,1.63 -2703,0.601,0.858,26.34 -2704,0.601,0.858,0 -2705,0.601,0.858,12.23 -2706,0.616,0.851,35.19 -2707,0.616,0.851,12.34 -2708,0.616,0.851,22.94 -2709,0.616,0.851,15.6 -2710,0.65,0.838,21.5 -2711,0.65,0.838,19.43 -2712,0.65,0.838,6.79 -2713,0.65,0.838,6.56 -2714,0.649,0.797,4.16 -2715,0.649,0.797,15.92 -2716,0.649,0.797,7.51 -2717,0.649,0.797,6.39 -2718,0.522,0.853,25.85 -2719,0.522,0.853,18.01 -2720,0.522,0.853,12.25 -2721,0.522,0.853,5.88 -2722,0.522,0.853,29.98 -2723,0.522,0.853,14.5 -2724,0.522,0.853,29.62 -2725,0.522,0.853,16.49 -2726,0.577,0.861,35.03 -2727,0.577,0.861,31.14 -2728,0.577,0.861,31.42 -2729,0.577,0.861,23.18 -2730,0.577,0.861,39.98 -2731,0.577,0.861,29.25 -2732,0.577,0.861,26.05 -2733,0.577,0.861,30.29 -2734,0.469,0.898,15.18 -2735,0.473,0.908,28.37 -2736,0.521,0.925,33.2 -2737,0.681,0.901,34.81 -2738,0.588,0.879,31.08 -2739,0.588,0.879,28.38 -2740,0.588,0.879,34.2 -2741,0.588,0.879,14.35 -2742,0.611,0.796,27.05 -2743,0.611,0.796,15.1 -2744,0.611,0.796,11.87 -2745,0.611,0.796,11.27 -2746,0.611,0.796,12.93 -2747,0.611,0.796,8.32 -2748,0.611,0.796,5.29 -2749,0.611,0.796,18.78 -2750,0.722,0.821,14.58 -2751,0.722,0.821,11.87 -2752,0.722,0.821,20.53 -2753,0.722,0.821,0.44 -2754,0.722,0.821,0 -2755,0.722,0.821,0.05 -2756,0.722,0.821,7.53 -2757,0.722,0.821,0 -2758,0.722,0.821,18.38 -2759,0.722,0.821,0 -2760,0.722,0.821,28.58 -2761,0.722,0.821,28.3 -2762,0.722,0.821,0 -2763,0.722,0.821,0.08 -2764,0.722,0.821,0.99 -2765,0.722,0.821,13.63 -2766,0.611,0.796,0.45 -2767,0.611,0.796,1.75 -2768,0.611,0.796,7.75 -2769,0.611,0.796,1.43 -2770,0.611,0.796,22.29 -2771,0.611,0.796,5.88 -2772,0.611,0.796,36.32 -2773,0.611,0.796,14.69 -2774,0.605,0.83,9.44 -2775,0.605,0.83,24.92 -2776,0.605,0.83,3.46 -2777,0.605,0.83,22.94 -2778,0.599,0.93,44.28 -2779,0.67,0.916,34.93 -2780,0.532,0.812,22.95 -2781,0.569,0.819,13.67 -2782,0.687,0.775,5.21 -2783,0.687,0.775,8.47 -2784,0.687,0.775,1.73 -2785,0.687,0.775,2.86 -2786,0.713,0.792,5.55 -2787,0.713,0.792,4.89 -2788,0.752,0.8,12.83 -2789,0.752,0.8,20.03 -2790,0.701,0.783,22.65 -2791,0.701,0.783,7.86 -2792,0.678,0.801,7.96 -2793,0.678,0.801,9.78 -2794,0.678,0.801,14.99 -2795,0.678,0.801,2.41 -2796,0.677,0.801,10.34 -2797,0.677,0.801,3.86 -2798,0.701,0.783,13.32 -2799,0.701,0.783,21.95 -2800,0.67,0.793,37.33 -2801,0.67,0.793,22.42 -2802,0.752,0.8,38.59 -2803,0.752,0.8,32.78 -2804,0.653,0.744,31.24 -2805,0.653,0.744,18.92 -2806,0.713,0.792,3.97 -2807,0.713,0.792,26.88 -2808,0.675,0.713,11.67 -2809,0.675,0.713,8.79 -2810,0.687,0.775,2.4 -2811,0.687,0.775,4.72 -2812,0.687,0.775,9.22 -2813,0.687,0.775,10.58 -2814,0.687,0.775,3.37 -2815,0.687,0.775,8.16 -2816,0.687,0.775,7.77 -2817,0.687,0.775,9.78 -2818,0.695,0.757,4.98 -2819,0.695,0.757,18.35 -2820,0.695,0.757,10.98 -2821,0.695,0.757,16.27 -2822,0.687,0.775,14.49 -2823,0.687,0.775,14.26 -2824,0.73,0.735,17.8 -2825,0.666,0.725,29.14 -2826,0.58,0.831,11.27 -2827,0.58,0.831,26.72 -2828,0.58,0.831,18.78 -2829,0.58,0.831,40.78 -2830,0.569,0.846,31.09 -2831,0.575,0.827,36.68 -2832,0.436,0.872,40.6 -2833,0.561,0.839,30.25 -2834,0.548,0.809,26.85 -2835,0.548,0.809,26.99 -2836,0.548,0.809,32.23 -2837,0.548,0.809,33.46 -2838,0.448,0.817,33.45 -2839,0.448,0.817,10.43 -2840,0.448,0.817,26.16 -2841,0.448,0.817,17.11 -2842,0.404,0.837,31.66 -2843,0.404,0.837,23.87 -2844,0.404,0.837,40.42 -2845,0.404,0.837,26.39 -2846,0.543,0.85,34.59 -2847,0.543,0.85,33.18 -2848,0.543,0.85,36.42 -2849,0.543,0.85,41.9 -2850,0.656,0.856,34.18 -2851,0.656,0.856,20.74 -2852,0.656,0.856,34.22 -2853,0.656,0.856,32.79 -2854,0.534,0.833,11.7 -2855,0.534,0.833,22.41 -2856,0.534,0.833,27.49 -2857,0.534,0.833,30.64 -2858,0.735,0.796,24.23 -2859,0.735,0.796,19.53 -2860,0.735,0.796,6.26 -2861,0.735,0.796,25.07 -2862,0.779,0.728,14.95 -2863,0.779,0.728,36.21 -2864,0.779,0.728,9.57 -2865,0.785,0.8,21.77 -2866,0.58,0.823,0 -2867,0.58,0.823,12.51 -2868,0.58,0.823,11.49 -2869,0.58,0.823,34.81 -2870,0.58,0.823,16.72 -2871,0.58,0.823,28.62 -2872,0.58,0.823,35.95 -2873,0.58,0.823,18.52 -2874,0.508,0.849,27.47 -2875,0.508,0.849,27.15 -2876,0.65,0.835,31.21 -2877,0.508,0.849,17.85 -2878,0.757,0.794,35.58 -2879,0.757,0.794,28.37 -2880,0.757,0.794,26.42 -2881,0.757,0.794,35.12 -2882,0.547,0.784,37.07 -2883,0.547,0.784,30.76 -2884,0.547,0.784,33.25 -2885,0.547,0.784,20.74 -2886,0.354,0.874,34.62 -2887,0.354,0.874,35.8 -2888,0.354,0.874,35 -2889,0.354,0.874,13.48 -2890,0.536,0.765,28.9 -2891,0.536,0.765,18.43 -2892,0.536,0.765,2.24 -2893,0.536,0.765,20.64 -2894,0.539,0.766,1.7 -2895,0.539,0.766,28.92 -2896,0.539,0.766,5.13 -2897,0.539,0.766,14.23 -2898,0.663,0.831,4.34 -2899,0.663,0.831,13.1 -2900,0.663,0.831,2.79 -2901,0.663,0.831,6.52 -2902,0.656,0.83,1.25 -2903,0.656,0.83,16.86 -2904,0.656,0.83,10.03 -2905,0.656,0.83,15.29 -2906,0.58,0.823,27.76 -2907,0.58,0.823,9.27 -2908,0.58,0.823,25.28 -2909,0.58,0.823,15.26 -2910,0.58,0.823,41.59 -2911,0.58,0.823,23.38 -2912,0.58,0.823,39.32 -2913,0.58,0.823,36.95 -2914,0.658,0.9,13.1 -2915,0.658,0.9,0.75 -2916,0.693,0.793,17.15 -2917,0.639,0.909,24.23 -2918,0.647,0.887,14.62 -2919,0.662,0.898,0.65 -2920,0.706,0.785,18.84 -2921,0.706,0.785,18.49 -2922,0.706,0.785,28.78 -2923,0.706,0.785,28.13 -2924,0.694,0.815,26.33 -2925,0.694,0.815,7.19 -2926,0.694,0.815,30.7 -2927,0.694,0.815,16.99 -2928,0.73,0.733,38.63 -2929,0.73,0.733,30.75 -2930,0.73,0.733,35.33 -2931,0.73,0.733,0.64 -2932,0.611,0.692,40.02 -2933,0.611,0.692,38.68 -2934,0.611,0.693,40.68 -2935,0.611,0.692,36.37 -2936,0.52,0.768,31.23 -2937,0.52,0.768,30.88 -2938,0.52,0.768,38.59 -2939,0.52,0.768,36.34 -2940,0.553,0.744,35.15 -2941,0.539,0.744,35.57 -2942,0.444,0.747,9.29 -2943,0.443,0.747,33.73 -2944,0.696,0.801,28.54 -2945,0.667,0.8,10.74 -2946,0.681,0.802,30.5 -2947,0.665,0.798,15.16 -2948,0.669,0.798,15.79 -2949,0.669,0.798,7.6 -2950,0.669,0.798,2.24 -2951,0.669,0.798,0 -2952,0.731,0.811,3.14 -2953,0.731,0.811,1.95 -2954,0.731,0.811,0 -2955,0.731,0.811,0 -2956,0.731,0.811,1.94 -2957,0.731,0.811,0.21 -2958,0.731,0.811,0 -2959,0.731,0.811,0 -2960,0.731,0.811,0 -2961,0.731,0.811,0 -2962,0.731,0.811,0 -2963,0.731,0.811,0 -2964,0.72,0.841,7.49 -2965,0.72,0.841,0 -2966,0.72,0.841,33.52 -2967,0.72,0.841,0 -2968,0.664,0.794,12.41 -2969,0.709,0.829,13.48 -2970,0.709,0.829,17.58 -2971,0.722,0.853,13.11 -2972,0.664,0.822,12.47 -2973,0.663,0.822,2.67 -2974,0.664,0.822,8.29 -2975,0.67,0.824,0.52 -2976,0.663,0.822,36.35 -2977,0.663,0.822,30.29 -2978,0.635,0.866,29.13 -2979,0.633,0.866,21.59 -2980,0.636,0.866,3.57 -2981,0.685,0.877,4.68 -2982,0.744,0.949,0 -2983,0.75,0.99,1.76 -2984,0.743,0.947,1.93 -2985,0.743,0.947,3.24 -2986,0.743,0.947,6.98 -2987,0.743,0.947,10.07 -2988,0.721,0.847,18.01 -2989,0.721,0.847,24.05 -2990,0.721,0.847,15.74 -2991,0.721,0.847,6.75 -2992,0.719,0.837,34.29 -2993,0.719,0.837,7.98 -2994,0.719,0.837,23.07 -2995,0.719,0.837,25.43 -2996,0.747,0.795,1.15 -2997,0.747,0.795,1.04 -2998,0.747,0.795,29.96 -2999,0.747,0.795,18.9 -3000,0.748,0.79,0 -3001,0.748,0.79,0.18 -3002,0.624,0.828,9.97 -3003,0.624,0.828,21.68 -3004,0.648,0.825,24.78 -3005,0.648,0.825,22.53 -3006,0.648,0.825,40.18 -3007,0.648,0.825,40.07 -3008,0.72,0.827,42.96 -3009,0.72,0.827,32.24 -3010,0.72,0.827,33.56 -3011,0.72,0.827,28.22 -3012,0.716,0.832,16.68 -3013,0.716,0.832,13.6 -3014,0.716,0.832,15.76 -3015,0.716,0.832,15.33 -3016,0.75,0.99,16.22 -3017,0.75,0.99,11.92 -3018,0.75,0.99,10.55 -3019,0.75,0.99,7.93 -3020,0.691,0.99,5.82 -3021,0.578,0.784,40.16 -3022,0.578,0.784,35.59 -3023,0.578,0.784,32.05 -3024,0.578,0.784,35.33 -3025,0.713,0.833,0 -3026,0.713,0.833,6.3 -3027,0.713,0.833,2.28 -3028,0.713,0.833,6.06 -3029,0.74,0.866,0 -3030,0.74,0.866,0 -3031,0.74,0.866,0 -3032,0.74,0.866,0 -3033,0.741,0.736,4.19 -3034,0.741,0.736,3.99 -3035,0.741,0.736,4.13 -3036,0.741,0.736,3.14 -3037,0.433,0.836,27.64 -3038,0.433,0.836,21.79 -3039,0.433,0.836,18.6 -3040,0.433,0.836,10.56 -3041,0.585,0.832,18.97 -3042,0.585,0.832,6.81 -3043,0.585,0.832,34.35 -3044,0.585,0.832,24.43 -3045,0.592,0.842,42.3 -3046,0.592,0.842,40.71 -3047,0.592,0.842,39.95 -3048,0.592,0.842,45.84 -3049,0.479,0.844,19.75 -3050,0.479,0.844,4.33 -3051,0.479,0.844,33.28 -3052,0.48,0.844,13.62 -3053,0.675,0.913,34.68 -3054,0.669,0.854,14.36 -3055,0.825,0.869,13.56 -3056,0.702,0.841,8.6 -3057,0.708,0.824,2.71 -3058,0.708,0.824,8.09 -3059,0.708,0.824,2.41 -3060,0.708,0.824,14.27 -3061,0.726,0.739,21.34 -3062,0.708,0.761,1.91 -3063,0.617,0.763,41.96 -3064,0.614,0.791,43.35 -3065,0.695,0.782,18.84 -3066,0.695,0.782,28.87 -3067,0.695,0.782,21.66 -3068,0.695,0.782,32.65 -3069,0.717,0.837,28.19 -3070,0.717,0.837,8.79 -3071,0.717,0.837,19.95 -3072,0.717,0.837,3.18 -3073,0.486,0.821,39.56 -3074,0.695,0.786,41.16 -3075,0.699,0.859,26.55 -3076,0.718,0.852,36.4 -3077,0.695,0.801,8.06 -3078,0.695,0.801,16.33 -3079,0.695,0.801,5.81 -3080,0.695,0.801,27.48 -3081,0.706,0.726,9.56 -3082,0.714,0.734,19.24 -3083,0.707,0.726,41.76 -3084,0.721,0.742,34.04 -3085,0.709,0.762,3.11 -3086,0.709,0.762,28.17 -3087,0.709,0.762,13.81 -3088,0.709,0.762,41.17 -3089,0.565,0.849,38.37 -3090,0.565,0.849,27.22 -3091,0.565,0.849,45.16 -3092,0.565,0.849,41.74 -3093,0.517,0.882,39.04 -3094,0.716,0.622,37.69 -3095,0.621,0.695,19.18 -3096,0.572,0.749,21.92 -3097,0.622,0.691,37.49 -3098,0.589,0.66,38.81 -3099,0.591,0.655,39.37 -3100,0.499,0.736,43.82 -3101,0.62,0.621,41.49 -3102,0.538,0.747,8.39 -3103,0.546,0.753,1.22 -3104,0.599,0.84,43.71 -3105,0.599,0.833,14.48 -3106,0.6,0.84,20.04 -3107,0.656,0.852,38.14 -3108,0.702,0.826,17.89 -3109,0.674,0.856,17.26 -3110,0.702,0.826,11.28 -3111,0.702,0.826,5.99 -3112,0.702,0.826,1.09 -3113,0.702,0.826,4.33 -3114,0.702,0.826,2.48 -3115,0.689,0.824,8.18 -3116,0.674,0.789,22.85 -3117,0.674,0.789,28.9 -3118,0.674,0.789,18.86 -3119,0.712,0.794,17.4 -3120,0.749,0.708,26.83 -3121,0.7,0.73,0.33 -3122,0.75,0.709,23.12 -3123,0.694,0.737,2.05 -3124,0.633,0.519,38.87 -3125,0.649,0.619,45.68 -3126,0.618,0.485,37.34 -3127,0.67,0.616,45.84 -3128,0.571,0.686,0 -3129,0.571,0.686,7.55 -3130,0.571,0.686,4.87 -3131,0.571,0.686,17.4 -3132,0.567,0.69,2.2 -3133,0.567,0.69,0 -3134,0.567,0.69,0.01 -3135,0.567,0.69,0 -3136,0.549,0.749,24.85 -3137,0.549,0.749,9.35 -3138,0.549,0.749,16.9 -3139,0.549,0.749,4.13 -3140,0.568,0.75,9.44 -3141,0.568,0.75,6.77 -3142,0.568,0.75,26.31 -3143,0.568,0.75,11.5 -3144,0.552,0.531,28.61 -3145,0.518,0.548,30.8 -3146,0.552,0.531,37.31 -3147,0.518,0.548,24.39 -3148,0.696,0.459,35.98 -3149,0.651,0.499,39.06 -3150,0.696,0.459,32.39 -3151,0.651,0.499,36.23 -3152,0.598,0.589,36.56 -3153,0.565,0.668,29.19 -3154,0.517,0.692,44.83 -3155,0.49,0.733,21.5 -3156,0.636,0.672,27.68 -3157,0.636,0.672,8.1 -3158,0.636,0.672,31.39 -3159,0.636,0.672,31.57 -3160,0.556,0.744,32.68 -3161,0.567,0.821,27.42 -3162,0.743,0.761,40.56 -3163,0.731,0.836,41.95 -3164,0.549,0.751,26.53 -3165,0.549,0.755,28.94 -3166,0.436,0.697,35.72 -3167,0.447,0.706,36.55 -3168,0.617,0.776,25.7 -3169,0.617,0.776,0.06 -3170,0.617,0.776,41.55 -3171,0.617,0.776,15.32 -3172,0.716,0.806,25.74 -3173,0.716,0.806,38.15 -3174,0.711,0.803,22.45 -3175,0.715,0.807,28.71 -3176,0.641,0.709,3.94 -3177,0.652,0.807,23.79 -3178,0.641,0.71,1.57 -3179,0.666,0.871,40.14 -3180,0.624,0.8,44.76 -3181,0.641,0.709,38.53 -3182,0.624,0.8,33.11 -3183,0.641,0.709,6.29 -3184,0.75,0.836,42.18 -3185,0.717,0.838,29.69 -3186,0.75,0.835,27.17 -3187,0.704,0.838,42.53 -3188,0.52,0.759,22.6 -3189,0.519,0.759,7.1 -3190,0.589,0.72,48.99 -3191,0.508,0.688,50.34 -3192,0.552,0.741,35.68 -3193,0.52,0.76,44.79 -3194,0.592,0.815,15 -3195,0.621,0.777,43.12 -3196,0.645,0.631,41.06 -3197,0.645,0.638,20.63 -3198,0.837,0.64,42.55 -3199,0.596,0.76,21.97 -3200,0.633,0.714,28.57 -3201,0.594,0.76,18.84 -3202,0.6,0.812,6.86 -3203,0.6,0.812,22.08 -3204,0.6,0.812,6.86 -3205,0.6,0.812,25.66 -3206,0.591,0.742,46.4 -3207,0.574,0.728,30.88 -3208,0.594,0.741,52.19 -3209,0.599,0.768,32.41 -3210,0.683,0.779,41.69 -3211,0.652,0.795,36.41 -3212,0.652,0.778,39.38 -3213,0.627,0.745,13.31 -3214,0.644,0.784,11.58 -3215,0.644,0.784,3.44 -3216,0.644,0.784,8.2 -3217,0.644,0.784,13.01 -3218,0.661,0.85,5.76 -3219,0.667,0.872,30.6 -3220,0.65,0.801,16.43 -3221,0.65,0.801,32.15 -3222,0.651,0.788,8.05 -3223,0.65,0.8,9.64 -3224,0.619,0.765,35.82 -3225,0.633,0.708,28.27 -3226,0.593,0.804,29.53 -3227,0.597,0.673,42.7 -3228,0.59,0.76,27.15 -3229,0.598,0.674,10.33 -3230,0.586,0.795,39.72 -3231,0.697,0.895,8.64 -3232,0.701,0.901,20.57 -3233,0.698,0.895,32 -3234,0.701,0.901,33.46 -3235,0.647,0.29,17.68 -3236,0.673,0.292,37.08 -3237,0.647,0.29,16.68 -3238,0.673,0.292,31.21 -3239,0.634,0.227,14.76 -3240,0.664,0.347,40.51 -3241,0.734,0.269,26.82 -3242,0.669,0.421,45.17 -3243,0.472,0.442,31.19 -3244,0.597,0.448,36.21 -3245,0.711,0.506,35.92 -3246,0.718,0.553,39.02 -3247,0.711,0.5,16.7 -3248,0.6,0.456,37.29 -3249,0.652,0.733,14.3 -3250,0.652,0.733,33.26 -3251,0.652,0.733,1.28 -3252,0.652,0.733,5.16 -3253,0.652,0.733,3.73 -3254,0.652,0.733,0 -3255,0.652,0.733,0 -3256,0.652,0.733,0 -3257,0.636,0.687,0 -3258,0.636,0.687,0 -3259,0.636,0.687,0 -3260,0.636,0.687,0 -3261,0.636,0.687,0 -3262,0.636,0.687,0 -3263,0.636,0.687,0 -3264,0.636,0.687,0 -3265,0.636,0.687,0 -3266,0.636,0.687,0 -3267,0.636,0.687,0 -3268,0.636,0.687,0 -3269,0.636,0.687,0 -3270,0.636,0.687,0 -3271,0.636,0.687,0 -3272,0.636,0.687,0 -3273,0.636,0.687,0 -3274,0.636,0.687,0 -3275,0.636,0.687,0 -3276,0.636,0.687,0 -3277,0.636,0.687,0 -3278,0.636,0.687,0 -3279,0.636,0.687,0 -3280,0.636,0.687,0 -3281,0.636,0.687,0 -3282,0.636,0.687,0 -3283,0.636,0.687,0 -3284,0.636,0.687,0 -3285,0.636,0.687,0 -3286,0.636,0.687,0 -3287,0.636,0.687,0 -3288,0.636,0.687,0 -3289,0.652,0.733,0 -3290,0.652,0.733,0 -3291,0.652,0.733,0 -3292,0.652,0.733,0 -3293,0.652,0.733,3.13 -3294,0.652,0.733,0 -3295,0.652,0.733,0 -3296,0.652,0.733,2.99 -3297,0.647,0.742,0 -3298,0.647,0.742,0 -3299,0.647,0.742,0 -3300,0.647,0.742,0 -3301,0.647,0.742,0 -3302,0.647,0.742,2.03 -3303,0.647,0.742,0 -3304,0.647,0.742,0 -3305,0.618,0.726,0 -3306,0.618,0.726,0 -3307,0.618,0.726,0 -3308,0.618,0.726,0 -3309,0.618,0.726,0 -3310,0.618,0.726,0 -3311,0.618,0.726,0 -3312,0.618,0.726,0 -3313,0.636,0.687,0 -3314,0.636,0.687,0 -3315,0.636,0.687,0 -3316,0.636,0.687,3.33 -3317,0.636,0.687,0 -3318,0.636,0.687,0 -3319,0.636,0.687,3.54 -3320,0.636,0.687,0 -3321,0.636,0.687,0 -3322,0.636,0.687,0 -3323,0.636,0.687,0 -3324,0.636,0.687,0 -3325,0.636,0.687,0 -3326,0.636,0.687,0 -3327,0.636,0.687,0 -3328,0.636,0.687,0 -3329,0.618,0.726,0 -3330,0.618,0.726,0 -3331,0.618,0.726,0 -3332,0.618,0.726,0 -3333,0.618,0.726,0 -3334,0.618,0.726,0 -3335,0.618,0.726,0 -3336,0.618,0.726,0 -3337,0.647,0.742,0 -3338,0.647,0.742,0 -3339,0.647,0.742,0 -3340,0.647,0.742,0 -3341,0.647,0.742,11.27 -3342,0.647,0.742,0 -3343,0.647,0.742,18.51 -3344,0.647,0.742,0.93 -3345,0.638,0.747,28.76 -3346,0.638,0.747,1.13 -3347,0.638,0.747,0 -3348,0.638,0.747,0 -3349,0.638,0.747,0 -3350,0.638,0.747,0 -3351,0.638,0.747,0 -3352,0.638,0.747,0 -3353,0.601,0.744,0 -3354,0.601,0.744,0 -3355,0.601,0.744,0 -3356,0.601,0.744,0 -3357,0.601,0.744,0 -3358,0.601,0.744,0 -3359,0.601,0.744,0.84 -3360,0.601,0.744,0 -3361,0.636,0.687,0.77 -3362,0.636,0.687,2.75 -3363,0.636,0.687,0 -3364,0.636,0.687,0 -3365,0.636,0.687,0 -3366,0.636,0.687,0 -3367,0.636,0.687,0 -3368,0.636,0.687,0 -3369,0.636,0.687,0.62 -3370,0.636,0.687,0 -3371,0.636,0.687,4.12 -3372,0.636,0.687,4.67 -3373,0.636,0.687,2.64 -3374,0.636,0.687,4.41 -3375,0.636,0.687,3.45 -3376,0.636,0.687,11.87 -3377,0.601,0.744,1.64 -3378,0.601,0.744,2.88 -3379,0.601,0.744,0 -3380,0.601,0.744,7.6 -3381,0.601,0.744,0 -3382,0.601,0.744,0 -3383,0.601,0.744,0 -3384,0.601,0.744,0 -3385,0.638,0.747,0 -3386,0.638,0.747,0 -3387,0.638,0.747,1.33 -3388,0.638,0.747,0 -3389,0.638,0.747,0 -3390,0.638,0.747,0 -3391,0.638,0.747,0 -3392,0.638,0.747,2.01 -3393,0.662,0.81,18.28 -3394,0.467,0.804,18.8 -3395,0.694,0.809,1.99 -3396,0.647,0.807,27.02 -3397,0.499,0.851,4.64 -3398,0.499,0.852,0 -3399,0.512,0.839,7.8 -3400,0.502,0.851,3.6 -3401,0.534,0.807,1.43 -3402,0.534,0.807,10.14 -3403,0.534,0.807,0.09 -3404,0.534,0.807,0 -3405,0.534,0.807,0 -3406,0.534,0.807,0 -3407,0.534,0.807,0 -3408,0.534,0.807,0 -3409,0.509,0.829,0 -3410,0.509,0.829,0 -3411,0.509,0.829,0 -3412,0.509,0.829,0.45 -3413,0.509,0.829,1.78 -3414,0.509,0.829,3.77 -3415,0.509,0.829,1.37 -3416,0.509,0.829,0 -3417,0.509,0.829,0 -3418,0.509,0.829,0 -3419,0.509,0.829,0 -3420,0.509,0.829,0 -3421,0.509,0.829,4.4 -3422,0.509,0.829,0 -3423,0.509,0.829,4.24 -3424,0.509,0.829,0 -3425,0.534,0.807,12.61 -3426,0.534,0.807,6.69 -3427,0.534,0.807,8.48 -3428,0.534,0.807,16.08 -3429,0.534,0.807,24.16 -3430,0.534,0.807,7.93 -3431,0.534,0.807,6.06 -3432,0.534,0.807,1.59 -3433,0.623,0.759,23.24 -3434,0.623,0.759,26.85 -3435,0.623,0.759,41.87 -3436,0.623,0.759,25.37 -3437,0.57,0.871,9.61 -3438,0.586,0.808,11.31 -3439,0.593,0.791,13 -3440,0.597,0.747,27.12 -3441,0.657,0.835,28.97 -3442,0.657,0.835,43.17 -3443,0.657,0.835,40.2 -3444,0.657,0.835,40.51 -3445,0.606,0.786,35.32 -3446,0.606,0.786,20.95 -3447,0.606,0.786,36.65 -3448,0.606,0.786,37.05 -3449,0.612,0.776,19.14 -3450,0.611,0.776,14.59 -3451,0.629,0.754,36.45 -3452,0.698,0.709,9.06 -3453,0.574,0.745,12.93 -3454,0.574,0.745,0.33 -3455,0.574,0.745,24.66 -3456,0.574,0.745,0 -3457,0.677,0.804,0 -3458,0.677,0.804,0 -3459,0.677,0.804,0 -3460,0.677,0.804,0.28 -3461,0.677,0.804,0 -3462,0.677,0.804,0 -3463,0.677,0.804,16.72 -3464,0.677,0.804,33.09 -3465,0.677,0.804,22.06 -3466,0.677,0.804,39.18 -3467,0.677,0.804,33.97 -3468,0.677,0.804,36.7 -3469,0.677,0.804,0 -3470,0.677,0.804,0 -3471,0.677,0.804,0 -3472,0.677,0.804,17.15 -3473,0.724,0.719,12.34 -3474,0.724,0.719,1.05 -3475,0.724,0.719,23.25 -3476,0.724,0.719,4.06 -3477,0.723,0.7,40.39 -3478,0.723,0.7,27.29 -3479,0.723,0.7,24.42 -3480,0.723,0.7,35.4 -3481,0.65,0.822,32.1 -3482,0.65,0.822,27.83 -3483,0.65,0.822,3.81 -3484,0.65,0.822,11.81 -3485,0.726,0.848,21.32 -3486,0.726,0.847,12.18 -3487,0.726,0.848,1.57 -3488,0.726,0.848,4.21 -3489,0.727,0.876,0.99 -3490,0.727,0.876,0 -3491,0.727,0.876,17.27 -3492,0.727,0.876,13.78 -3493,0.709,0.748,1.61 -3494,0.709,0.748,26.99 -3495,0.709,0.748,12.32 -3496,0.709,0.748,24.44 -3497,0.668,0.673,13.91 -3498,0.668,0.673,29.83 -3499,0.667,0.679,11.76 -3500,0.67,0.674,24.92 -3501,0.724,0.719,27.46 -3502,0.724,0.719,2.18 -3503,0.724,0.719,14.66 -3504,0.724,0.719,0 -3505,0.776,0.825,0 -3506,0.776,0.825,14.55 -3507,0.776,0.825,12.55 -3508,0.776,0.825,6.37 -3509,0.776,0.825,16.34 -3510,0.776,0.825,28.68 -3511,0.776,0.825,3.79 -3512,0.776,0.825,0 -3513,0.776,0.825,0 -3514,0.776,0.825,0 -3515,0.776,0.825,0.81 -3516,0.776,0.825,0 -3517,0.776,0.825,0.02 -3518,0.776,0.825,0 -3519,0.776,0.825,0 -3520,0.776,0.825,0 -3521,0.758,0.787,6.05 -3522,0.758,0.787,2.34 -3523,0.758,0.787,1.12 -3524,0.758,0.787,0 -3525,0.664,0.769,4.2 -3526,0.668,0.742,20 -3527,0.686,0.791,7.16 -3528,0.731,0.807,11.96 -3529,0.659,0.807,17.14 -3530,0.659,0.807,1.75 -3531,0.659,0.807,4.16 -3532,0.659,0.807,1.13 -3533,0.566,0.855,20.3 -3534,0.566,0.855,19.71 -3535,0.566,0.855,34.01 -3536,0.566,0.855,20.22 -3537,0.513,0.863,7.71 -3538,0.513,0.863,0.01 -3539,0.513,0.863,1.98 -3540,0.513,0.863,4.08 -3541,0.503,0.862,7.26 -3542,0.505,0.853,9.66 -3543,0.509,0.866,14.67 -3544,0.551,0.86,20.79 -3545,0.434,0.867,13.92 -3546,0.351,0.881,10.52 -3547,0.402,0.88,11.79 -3548,0.51,0.882,32.54 -3549,0.346,0.882,11.45 -3550,0.541,0.827,24.35 -3551,0.596,0.82,20.53 -3552,0.69,0.72,23.91 -3553,0.737,0.726,33.94 -3554,0.737,0.726,39.76 -3555,0.737,0.726,37.73 -3556,0.737,0.726,23.36 -3557,0.703,0.815,41.35 -3558,0.682,0.818,29.17 -3559,0.612,0.831,22.17 -3560,0.609,0.838,5.85 -3561,0.687,0.644,7.59 -3562,0.687,0.644,3.89 -3563,0.687,0.644,35.26 -3564,0.687,0.644,9.71 -3565,0.682,0.806,32.19 -3566,0.682,0.806,17.18 -3567,0.682,0.806,29.4 -3568,0.682,0.806,24.17 -3569,0.782,0.716,27.69 -3570,0.734,0.758,20.04 -3571,0.781,0.716,13.14 -3572,0.733,0.758,24.47 -3573,0.624,0.881,31.82 -3574,0.624,0.881,30.9 -3575,0.624,0.881,23.91 -3576,0.624,0.881,20.34 -3577,0.702,0.854,35.03 -3578,0.702,0.854,7.97 -3579,0.702,0.854,16.92 -3580,0.702,0.854,10.46 -3581,0.668,0.878,0 -3582,0.668,0.878,18.67 -3583,0.668,0.878,0 -3584,0.668,0.878,13.28 -3585,0.707,0.851,0.24 -3586,0.707,0.851,0.88 -3587,0.707,0.851,0 -3588,0.707,0.851,0 -3589,0.716,0.835,3 -3590,0.716,0.835,2.95 -3591,0.716,0.835,2.47 -3592,0.716,0.835,1.55 -3593,0.653,0.87,19.66 -3594,0.653,0.87,12.11 -3595,0.653,0.87,18.88 -3596,0.653,0.87,1.21 -3597,0.632,0.799,12.45 -3598,0.632,0.799,34.55 -3599,0.632,0.799,20.15 -3600,0.632,0.799,5.35 -3601,0.584,0.765,37.02 -3602,0.584,0.765,25.22 -3603,0.584,0.765,31.15 -3604,0.584,0.765,19.27 -3605,0.568,0.777,20.27 -3606,0.568,0.777,29.89 -3607,0.568,0.777,21.49 -3608,0.568,0.777,31.7 -3609,0.667,0.729,35.4 -3610,0.667,0.729,7.69 -3611,0.667,0.729,28.67 -3612,0.667,0.729,21.79 -3613,0.651,0.73,25.74 -3614,0.651,0.73,23.51 -3615,0.651,0.73,34.85 -3616,0.651,0.73,26.06 -3617,0.619,0.739,17.45 -3618,0.619,0.739,21.8 -3619,0.619,0.739,4.35 -3620,0.619,0.739,2.15 -3621,0.665,0.726,4.5 -3622,0.665,0.726,2.62 -3623,0.665,0.726,2.99 -3624,0.665,0.726,2.81 -3625,0.727,0.762,2.24 -3626,0.727,0.762,19.68 -3627,0.727,0.762,0 -3628,0.727,0.762,0 -3629,0.733,0.821,4.72 -3630,0.752,0.82,10.76 -3631,0.67,0.791,26.09 -3632,0.703,0.78,22.21 -3633,0.604,0.801,16.75 -3634,0.604,0.801,32.89 -3635,0.604,0.801,14.47 -3636,0.604,0.801,30.57 -3637,0.573,0.804,4.42 -3638,0.573,0.804,6.44 -3639,0.573,0.804,15.19 -3640,0.573,0.804,28.13 -3641,0.727,0.701,4.12 -3642,0.615,0.736,5.52 -3643,0.446,0.836,13.21 -3644,0.569,0.727,13.55 -3645,0.647,0.69,1.53 -3646,0.647,0.69,24.06 -3647,0.647,0.69,15.24 -3648,0.647,0.69,39.19 -3649,0.635,0.764,27.76 -3650,0.653,0.696,39.73 -3651,0.659,0.633,24.07 -3652,0.645,0.676,47.46 -3653,0.682,0.699,34.66 -3654,0.636,0.776,31.37 -3655,0.642,0.671,35.8 -3656,0.645,0.672,36.91 -3657,0.685,0.685,37.79 -3658,0.685,0.685,37.93 -3659,0.685,0.686,32.79 -3660,0.685,0.685,26.29 -3661,0.711,0.781,13.9 -3662,0.711,0.781,34.96 -3663,0.711,0.781,23.06 -3664,0.711,0.781,19.86 -3665,0.72,0.755,23.45 -3666,0.72,0.755,23.78 -3667,0.72,0.755,18.94 -3668,0.72,0.755,6.56 -3669,0.744,0.784,31.56 -3670,0.744,0.784,41.28 -3671,0.744,0.784,47.23 -3672,0.744,0.784,41.02 -3673,0.713,0.777,7.95 -3674,0.713,0.777,7.07 -3675,0.713,0.777,35.72 -3676,0.713,0.777,23.83 -3677,0.712,0.776,1.09 -3678,0.712,0.776,13.79 -3679,0.712,0.776,0 -3680,0.712,0.776,27.39 -3681,0.57,0.57,7.03 -3682,0.57,0.57,2.1 -3683,0.57,0.57,10.51 -3684,0.57,0.57,0 -3685,0.642,0.575,2.86 -3686,0.642,0.575,10.27 -3687,0.642,0.575,4.42 -3688,0.642,0.575,0 -3689,0.643,0.575,9.78 -3690,0.643,0.575,5.23 -3691,0.643,0.575,0 -3692,0.643,0.575,0 -3693,0.727,0.657,5.42 -3694,0.727,0.657,2.7 -3695,0.727,0.657,0.38 -3696,0.727,0.657,13.2 -3697,0.768,0.748,3.36 -3698,0.768,0.748,2.48 -3699,0.768,0.748,7.12 -3700,0.768,0.748,22.83 -3701,0.768,0.748,0.72 -3702,0.768,0.748,19.98 -3703,0.768,0.748,24.8 -3704,0.768,0.748,16.63 -3705,0.636,0.615,22.95 -3706,0.636,0.615,20.96 -3707,0.636,0.615,22.15 -3708,0.636,0.615,17.47 -3709,0.611,0.601,23.84 -3710,0.611,0.601,5.17 -3711,0.611,0.601,27.16 -3712,0.611,0.601,16.12 -3713,0.73,0.648,27.03 -3714,0.73,0.648,36.53 -3715,0.73,0.648,31.98 -3716,0.73,0.648,34.14 -3717,0.659,0.586,6.34 -3718,0.659,0.586,32.31 -3719,0.659,0.586,11.8 -3720,0.659,0.586,27.68 -3721,0.651,0.55,5.53 -3722,0.651,0.55,2.67 -3723,0.651,0.55,2.85 -3724,0.651,0.55,0 -3725,0.63,0.544,22.83 -3726,0.63,0.544,3.76 -3727,0.63,0.544,0 -3728,0.63,0.544,1.72 -3729,0.664,0.508,0.04 -3730,0.664,0.508,3.09 -3731,0.664,0.508,2.44 -3732,0.664,0.508,1.86 -3733,0.649,0.551,1.48 -3734,0.649,0.551,2.05 -3735,0.649,0.551,0.72 -3736,0.649,0.551,22.29 -3737,0.649,0.627,13.23 -3738,0.649,0.627,4.94 -3739,0.649,0.627,2.13 -3740,0.649,0.627,1.99 -3741,0.643,0.662,25.76 -3742,0.643,0.662,34.89 -3743,0.643,0.662,16.32 -3744,0.643,0.662,5.71 -3745,0.726,0.715,26.79 -3746,0.726,0.715,9.62 -3747,0.726,0.715,35.86 -3748,0.726,0.715,13.71 -3749,0.726,0.715,0.74 -3750,0.726,0.715,0 -3751,0.726,0.715,1.94 -3752,0.726,0.715,0 -3753,0.744,0.762,4.69 -3754,0.744,0.762,0.39 -3755,0.744,0.762,0.25 -3756,0.744,0.762,0.59 -3757,0.734,0.757,29.5 -3758,0.734,0.757,26.77 -3759,0.734,0.757,31.08 -3760,0.734,0.757,25.39 -3761,0.599,0.662,17.39 -3762,0.599,0.662,21.85 -3763,0.599,0.662,17.59 -3764,0.599,0.662,32.19 -3765,0.622,0.661,4.56 -3766,0.622,0.661,10.06 -3767,0.622,0.661,10.17 -3768,0.622,0.661,13.42 -3769,0.62,0.636,10.05 -3770,0.62,0.636,7.82 -3771,0.62,0.636,6.42 -3772,0.62,0.636,1.84 -3773,0.664,0.511,9.52 -3774,0.664,0.511,7.63 -3775,0.664,0.511,23.45 -3776,0.664,0.511,13.81 -3777,0.598,0.639,0.07 -3778,0.598,0.639,2.18 -3779,0.598,0.639,6.34 -3780,0.598,0.639,2.83 -3781,0.596,0.683,13.28 -3782,0.596,0.691,9.8 -3783,0.598,0.648,16.4 -3784,0.599,0.688,22.03 -3785,0.633,0.657,6.93 -3786,0.645,0.642,19.35 -3787,0.644,0.643,35.4 -3788,0.645,0.642,7.89 -3789,0.642,0.668,12.75 -3790,0.597,0.683,16.84 -3791,0.64,0.697,16.69 -3792,0.679,0.76,21.21 -3793,0.738,0.771,10.47 -3794,0.738,0.771,13.83 -3795,0.738,0.771,15 -3796,0.738,0.771,7.12 -3797,0.744,0.767,7.74 -3798,0.744,0.767,0 -3799,0.744,0.767,16.76 -3800,0.744,0.767,0 -3801,0.744,0.767,0 -3802,0.744,0.767,1.04 -3803,0.744,0.767,0 -3804,0.744,0.767,0 -3805,0.732,0.811,10.96 -3806,0.732,0.811,4 -3807,0.732,0.811,11.98 -3808,0.732,0.811,4.81 -3809,0.647,0.77,18.15 -3810,0.647,0.77,17.84 -3811,0.647,0.77,7.39 -3812,0.647,0.77,4.24 -3813,0.657,0.653,12.99 -3814,0.657,0.653,26.52 -3815,0.657,0.653,19.2 -3816,0.657,0.653,4.8 -3817,0.7,0.599,13.9 -3818,0.704,0.582,20.3 -3819,0.7,0.599,9.97 -3820,0.71,0.57,24.45 -3821,0.7,0.599,2.11 -3822,0.7,0.599,1.77 -3823,0.7,0.599,3.26 -3824,0.7,0.599,10.7 -3825,0.622,0.541,1.07 -3826,0.599,0.55,4.04 -3827,0.599,0.55,2.84 -3828,0.599,0.55,15.04 -3829,0.599,0.55,20.88 -3830,0.574,0.565,28.88 -3831,0.574,0.565,24.6 -3832,0.574,0.565,33.12 -3833,0.574,0.565,8.1 -3834,0.622,0.541,11.93 -3835,0.622,0.541,0 -3836,0.622,0.541,23.78 -3837,0.667,0.53,9.95 -3838,0.667,0.53,5.47 -3839,0.667,0.53,27.12 -3840,0.667,0.53,31.05 -3841,0.667,0.53,19.9 -3842,0.64,0.546,35.4 -3843,0.64,0.546,7.49 -3844,0.64,0.546,3.13 -3845,0.64,0.546,0 -3846,0.644,0.607,4.72 -3847,0.644,0.607,2.25 -3848,0.644,0.607,4.22 -3849,0.644,0.607,11.8 -3850,0.66,0.503,40.65 -3851,0.66,0.503,30.71 -3852,0.66,0.503,11.64 -3853,0.66,0.503,2.12 -3854,0.67,0.515,11.04 -3855,0.67,0.515,35.86 -3856,0.67,0.515,22.03 -3857,0.67,0.515,29.84 -3858,0.67,0.515,4.58 -3859,0.622,0.469,7.32 -3860,0.622,0.469,14.33 -3861,0.622,0.469,28.36 -3862,0.622,0.469,36.42 -3863,0.622,0.469,35.87 -3864,0.626,0.449,35.05 -3865,0.626,0.449,18.62 -3866,0.626,0.449,40.59 -3867,0.626,0.449,36.57 -3868,0.651,0.553,0.87 -3869,0.651,0.553,1.73 -3870,0.651,0.553,27.44 -3871,0.651,0.553,13.48 -3872,0.646,0.587,0.26 -3873,0.646,0.587,2.02 -3874,0.646,0.587,9.15 -3875,0.646,0.587,7.01 -3876,0.66,0.712,33.84 -3877,0.66,0.712,11.71 -3878,0.66,0.712,23.8 -3879,0.66,0.712,22.03 -3880,0.605,0.629,14.83 -3881,0.605,0.629,23.71 -3882,0.605,0.629,13.89 -3883,0.605,0.629,23.77 -3884,0.544,0.4,31.18 -3885,0.578,0.625,27.97 -3886,0.626,0.431,38.79 -3887,0.656,0.488,26.44 -3888,0.6,0.45,46.57 -3889,0.567,0.412,36.54 -3890,0.714,0.447,41.81 -3891,0.628,0.431,44.07 -3892,0.708,0.455,7.09 -3893,0.708,0.455,26.48 -3894,0.708,0.455,20.86 -3895,0.708,0.455,22.61 -3896,0.703,0.766,0 -3897,0.703,0.766,0.04 -3898,0.704,0.766,0 -3899,0.704,0.766,0 -3900,0.704,0.766,0 -3901,0.704,0.766,0.01 -3902,0.704,0.766,0 -3903,0.704,0.766,2.01 -3904,0.703,0.893,3.64 -3905,0.696,0.721,2.28 -3906,0.696,0.721,4.49 -3907,0.696,0.721,2.12 -3908,0.696,0.721,2.85 -3909,0.696,0.721,1.7 -3910,0.696,0.721,5.3 -3911,0.696,0.721,0 -3912,0.696,0.721,1.15 -3913,0.719,0.828,1.37 -3914,0.719,0.828,0 -3915,0.719,0.828,0 -3916,0.719,0.828,0 -3917,0.719,0.828,0 -3918,0.719,0.828,2.69 -3919,0.719,0.828,0 -3920,0.719,0.828,0.02 -3921,0.699,0.79,13.53 -3922,0.699,0.79,0.19 -3923,0.699,0.79,5.93 -3924,0.699,0.79,0 -3925,0.699,0.79,8.78 -3926,0.699,0.79,27.84 -3927,0.699,0.79,24.92 -3928,0.699,0.79,28.39 -3929,0.699,0.79,10.23 -3930,0.699,0.79,19.17 -3931,0.699,0.79,2.68 -3932,0.699,0.79,3.23 -3933,0.699,0.79,0 -3934,0.699,0.79,0 -3935,0.699,0.79,0 -3936,0.699,0.79,0.99 -3937,0.719,0.828,7.82 -3938,0.719,0.828,0 -3939,0.719,0.828,6.73 -3940,0.719,0.828,0 -3941,0.719,0.828,0 -3942,0.719,0.828,6.24 -3943,0.719,0.828,0 -3944,0.719,0.828,6.77 -3945,0.696,0.721,0 -3946,0.696,0.721,0.47 -3947,0.696,0.721,1.04 -3948,0.696,0.721,0.99 -3949,0.696,0.721,0 -3950,0.696,0.721,3.49 -3951,0.719,0.828,0 -3952,0.719,0.828,1.41 -3953,0.719,0.828,0 -3954,0.719,0.828,0.85 -3955,0.719,0.828,0 -3956,0.719,0.828,0 -3957,0.719,0.828,1.54 -3958,0.727,0.855,0 -3959,0.727,0.855,6.28 -3960,0.727,0.855,0 -3961,0.727,0.855,2.23 -3962,0.727,0.855,5.43 -3963,0.727,0.855,3.44 -3964,0.727,0.855,3.46 -3965,0.727,0.855,0.66 -3966,0.788,0.573,0 -3967,0.788,0.573,6.56 -3968,0.788,0.573,10.35 -3969,0.788,0.573,11.44 -3970,0.787,0.603,10.64 -3971,0.787,0.603,6.97 -3972,0.787,0.603,6.83 -3973,0.787,0.603,0 -3974,0.784,0.641,7.2 -3975,0.784,0.641,11.67 -3976,0.784,0.641,2.28 -3977,0.784,0.641,6.04 -3978,0.695,0.618,3.98 -3979,0.695,0.618,4.33 -3980,0.695,0.618,5.1 -3981,0.695,0.618,4.44 -3982,0.673,0.68,4.03 -3983,0.673,0.68,6.85 -3984,0.673,0.68,0.83 -3985,0.673,0.68,3.47 -3986,0.666,0.729,10.22 -3987,0.666,0.729,18.12 -3988,0.666,0.729,0.52 -3989,0.666,0.729,0.38 -3990,0.667,0.729,11.82 -3991,0.667,0.729,10.62 -3992,0.667,0.729,18.55 -3993,0.667,0.729,19.37 -3994,0.665,0.631,4.3 -3995,0.665,0.631,5.41 -3996,0.665,0.631,7.93 -3997,0.665,0.631,32.2 -3998,0.704,0.773,24.96 -3999,0.704,0.773,17.26 -4000,0.704,0.773,28.31 -4001,0.704,0.773,16.66 -4002,0.779,0.654,22.32 -4003,0.771,0.684,19.01 -4004,0.616,0.76,28.16 -4005,0.589,0.764,26.91 -4006,0.778,0.589,31.46 -4007,0.778,0.589,0.04 -4008,0.778,0.589,19.62 -4009,0.778,0.589,9.83 -4010,0.743,0.641,12.85 -4011,0.775,0.595,25.05 -4012,0.662,0.668,24.03 -4013,0.675,0.665,24.98 -4014,0.632,0.676,33.92 -4015,0.633,0.675,9.78 -4016,0.61,0.699,41.53 -4017,0.61,0.699,18.16 -4018,0.649,0.671,12.53 -4019,0.619,0.728,14.63 -4020,0.602,0.708,34.54 -4021,0.603,0.707,29.66 -4022,0.542,0.768,19.75 -4023,0.542,0.768,18.79 -4024,0.542,0.768,11.55 -4025,0.542,0.768,10.58 -4026,0.732,0.728,10.87 -4027,0.732,0.728,6.17 -4028,0.732,0.728,12.53 -4029,0.732,0.728,5.27 -4030,0.724,0.658,4.13 -4031,0.724,0.658,22.38 -4032,0.724,0.658,1.66 -4033,0.724,0.658,5.75 -4034,0.698,0.615,23.71 -4035,0.698,0.615,27.84 -4036,0.698,0.615,11 -4037,0.698,0.615,15.28 -4038,0.628,0.745,24.12 -4039,0.628,0.745,15.41 -4040,0.628,0.745,30.75 -4041,0.628,0.745,28.78 -4042,0.598,0.728,9.72 -4043,0.621,0.746,6.16 -4044,0.583,0.738,20.83 -4045,0.613,0.757,29.8 -4046,0.585,0.731,18.68 -4047,0.588,0.729,12.5 -4048,0.58,0.738,4.14 -4049,0.584,0.733,17.62 -4050,0.545,0.764,10.44 -4051,0.545,0.765,2 -4052,0.557,0.709,33.52 -4053,0.545,0.752,14.31 -4054,0.723,0.632,20.12 -4055,0.723,0.632,17.86 -4056,0.723,0.632,27.42 -4057,0.723,0.632,29.66 -4058,0.632,0.713,14.81 -4059,0.632,0.713,15.07 -4060,0.632,0.713,26.12 -4061,0.632,0.713,15.2 -4062,0.631,0.689,33.44 -4063,0.631,0.689,28.12 -4064,0.631,0.689,29.24 -4065,0.631,0.689,32.41 -4066,0.631,0.689,30.98 -4067,0.631,0.689,35.24 -4068,0.631,0.689,1.7 -4069,0.631,0.689,0 -4070,0.558,0.687,38.64 -4071,0.558,0.687,15.02 -4072,0.558,0.687,0.08 -4073,0.558,0.687,4.06 -4074,0.565,0.746,15.7 -4075,0.565,0.746,18.67 -4076,0.565,0.746,3.13 -4077,0.565,0.746,24.58 -4078,0.521,0.8,27.97 -4079,0.733,0.813,28.5 -4080,0.635,0.74,16.1 -4081,0.681,0.871,33.93 -4082,0.73,0.731,30.95 -4083,0.73,0.731,34.3 -4084,0.73,0.731,10.84 -4085,0.73,0.731,31.95 -4086,0.687,0.799,23.96 -4087,0.687,0.799,26.96 -4088,0.687,0.799,34.36 -4089,0.687,0.799,41.44 -4090,0.667,0.782,15.75 -4091,0.667,0.782,31.7 -4092,0.667,0.782,32.27 -4093,0.667,0.782,33.77 -4094,0.668,0.667,8.24 -4095,0.668,0.667,36.03 -4096,0.668,0.667,21.61 -4097,0.668,0.667,24.75 -4098,0.56,0.672,0 -4099,0.56,0.672,0 -4100,0.56,0.672,0 -4101,0.56,0.672,32.36 -4102,0.631,0.689,0 -4103,0.631,0.689,0 -4104,0.631,0.689,0 -4105,0.631,0.689,0 -4106,0.631,0.689,0 -4107,0.631,0.689,0 -4108,0.631,0.689,7.82 -4109,0.631,0.689,0 -4110,0.766,0.589,1.2 -4111,0.766,0.589,0.51 -4112,0.766,0.589,14.33 -4113,0.766,0.589,8.41 -4114,0.778,0.682,0.06 -4115,0.778,0.682,0 -4116,0.778,0.682,7.38 -4117,0.778,0.682,13.6 -4118,0.618,0.749,1.07 -4119,0.618,0.749,6.31 -4120,0.618,0.749,9.66 -4121,0.618,0.749,12.15 -4122,0.786,0.799,12.85 -4123,0.786,0.799,3.88 -4124,0.786,0.799,7.84 -4125,0.786,0.799,21.3 -4126,0.796,0.789,2.41 -4127,0.796,0.789,1.11 -4128,0.796,0.789,4.99 -4129,0.796,0.789,10.51 -4130,0.796,0.776,0.99 -4131,0.796,0.776,2.67 -4132,0.796,0.776,16.08 -4133,0.796,0.776,26.74 -4134,0.671,0.63,29.68 -4135,0.671,0.63,35.49 -4136,0.671,0.63,10.91 -4137,0.671,0.63,32.36 -4138,0.788,0.735,8.82 -4139,0.748,0.69,17.62 -4140,0.728,0.691,11.92 -4141,0.616,0.614,25.25 -4142,0.759,0.701,3.57 -4143,0.787,0.725,15.55 -4144,0.764,0.675,19.94 -4145,0.642,0.717,25.12 -4146,0.718,0.758,15.48 -4147,0.553,0.755,8.82 -4148,0.666,0.754,10.68 -4149,0.553,0.755,10.95 -4150,0.785,0.723,1.65 -4151,0.785,0.723,8.71 -4152,0.785,0.723,11.77 -4153,0.785,0.723,15.7 -4154,0.767,0.585,15.92 -4155,0.767,0.585,3.71 -4156,0.767,0.585,13.79 -4157,0.767,0.585,6.49 -4158,0.661,0.72,8.08 -4159,0.661,0.72,0.51 -4160,0.661,0.72,12.06 -4161,0.661,0.72,21.64 -4162,0.674,0.715,17.97 -4163,0.674,0.715,18.93 -4164,0.674,0.715,22.57 -4165,0.674,0.715,19.5 -4166,0.698,0.717,1.65 -4167,0.698,0.717,2.97 -4168,0.698,0.717,6.18 -4169,0.698,0.717,5.23 -4170,0.7,0.659,12.49 -4171,0.7,0.659,22.46 -4172,0.7,0.659,4.23 -4173,0.7,0.659,15.54 -4174,0.611,0.669,30.74 -4175,0.611,0.669,12.17 -4176,0.611,0.669,30.44 -4177,0.611,0.669,24.75 -4178,0.564,0.676,23.01 -4179,0.564,0.676,37.99 -4180,0.564,0.676,33.14 -4181,0.564,0.676,35.79 -4182,0.617,0.642,21.89 -4183,0.617,0.642,18.82 -4184,0.617,0.642,26.73 -4185,0.617,0.642,18.11 -4186,0.693,0.606,28.72 -4187,0.693,0.606,30.39 -4188,0.693,0.606,34.57 -4189,0.693,0.606,29.12 -4190,0.704,0.66,3.33 -4191,0.704,0.66,7.26 -4192,0.704,0.66,4.27 -4193,0.704,0.66,10.77 -4194,0.68,0.705,13.09 -4195,0.68,0.705,10.29 -4196,0.68,0.705,21.24 -4197,0.68,0.705,9.82 -4198,0.675,0.76,22.52 -4199,0.675,0.76,32.38 -4200,0.675,0.76,27.03 -4201,0.675,0.76,8.17 -4202,0.562,0.828,14.11 -4203,0.562,0.828,11.98 -4204,0.562,0.828,35.99 -4205,0.562,0.828,35.28 -4206,0.487,0.81,0 -4207,0.487,0.81,25.28 -4208,0.487,0.81,24.09 -4209,0.487,0.81,18.72 -4210,0.703,0.818,4.51 -4211,0.703,0.818,0 -4212,0.703,0.818,4.13 -4213,0.703,0.818,2.61 -4214,0.653,0.703,0 -4215,0.653,0.703,0 -4216,0.653,0.703,3.67 -4217,0.653,0.703,5.45 -4218,0.653,0.703,0.02 -4219,0.653,0.703,16.39 -4220,0.653,0.703,36.15 -4221,0.653,0.703,24.8 -4222,0.499,0.634,22.92 -4223,0.499,0.634,16.77 -4224,0.499,0.634,31.86 -4225,0.499,0.634,15.23 -4226,0.541,0.709,23.66 -4227,0.541,0.709,40.46 -4228,0.541,0.709,38.71 -4229,0.541,0.709,35.24 -4230,0.644,0.681,29.63 -4231,0.644,0.681,31.62 -4232,0.644,0.681,18.95 -4233,0.644,0.681,40.53 -4234,0.656,0.736,35.25 -4235,0.656,0.736,25.75 -4236,0.656,0.736,34.12 -4237,0.656,0.736,26.65 -4238,0.653,0.703,28.33 -4239,0.653,0.703,39.31 -4240,0.653,0.703,0 -4241,0.653,0.703,37.7 -4242,0.653,0.703,0 -4243,0.653,0.703,0.01 -4244,0.653,0.703,0 -4245,0.653,0.703,0 -4246,0.663,0.829,27.51 -4247,0.663,0.829,0.81 -4248,0.663,0.829,27.48 -4249,0.663,0.829,4.59 -4250,0.511,0.798,20.38 -4251,0.511,0.798,19.5 -4252,0.511,0.798,5.48 -4253,0.511,0.798,39.21 -4254,0.675,0.593,24.76 -4255,0.675,0.593,9.91 -4256,0.675,0.593,33.14 -4257,0.675,0.593,36.53 -4258,0.704,0.571,1.82 -4259,0.704,0.571,11.93 -4260,0.704,0.571,11.51 -4261,0.704,0.571,17.5 -4262,0.666,0.629,23.88 -4263,0.666,0.629,20.4 -4264,0.666,0.629,6.77 -4265,0.666,0.629,21.62 -4266,0.533,0.715,7.02 -4267,0.533,0.715,23.59 -4268,0.533,0.715,9.9 -4269,0.533,0.715,14.81 -4270,0.575,0.705,13.1 -4271,0.588,0.721,17.36 -4272,0.575,0.705,37.87 -4273,0.587,0.72,30.86 -4274,0.617,0.755,10.7 -4275,0.617,0.755,8.74 -4276,0.617,0.755,20.36 -4277,0.617,0.755,7.74 -4278,0.624,0.491,31.8 -4279,0.624,0.491,17.27 -4280,0.624,0.491,8.37 -4281,0.624,0.491,6.71 -4282,0.603,0.658,36.75 -4283,0.603,0.658,40.19 -4284,0.603,0.658,30.03 -4285,0.603,0.658,36.96 -4286,0.612,0.666,35.47 -4287,0.612,0.666,25.48 -4288,0.612,0.666,44.76 -4289,0.612,0.666,32.07 -4290,0.656,0.604,29.73 -4291,0.656,0.604,36.52 -4292,0.656,0.604,31.71 -4293,0.656,0.604,24.44 -4294,0.784,0.49,27.34 -4295,0.784,0.49,31.42 -4296,0.784,0.49,16.27 -4297,0.784,0.49,29.81 -4298,0.652,0.482,33.62 -4299,0.652,0.482,44.99 -4300,0.652,0.482,19.44 -4301,0.652,0.482,23.47 -4302,0.639,0.61,15.5 -4303,0.639,0.61,18.63 -4304,0.639,0.61,4.03 -4305,0.639,0.61,12.49 -4306,0.494,0.671,3.38 -4307,0.741,0.832,12.96 -4308,0.491,0.673,1.44 -4309,0.733,0.832,19.32 -4310,0.673,0.75,6.86 -4311,0.673,0.75,22.16 -4312,0.673,0.75,8.93 -4313,0.673,0.75,34.46 -4314,0.53,0.734,9 -4315,0.703,0.708,22.38 -4316,0.53,0.735,23.18 -4317,0.564,0.749,21.37 -4318,0.615,0.725,12.85 -4319,0.615,0.725,20.26 -4320,0.615,0.725,25.03 -4321,0.615,0.725,22.99 -4322,0.651,0.649,21.63 -4323,0.651,0.649,3.76 -4324,0.651,0.649,20.78 -4325,0.651,0.649,6.72 -4326,0.614,0.746,25.37 -4327,0.614,0.746,30.28 -4328,0.614,0.746,32.86 -4329,0.614,0.746,33.63 -4330,0.7,0.684,21.24 -4331,0.7,0.684,26.21 -4332,0.7,0.684,30.13 -4333,0.7,0.684,18.77 -4334,0.415,0.833,7.44 -4335,0.415,0.833,24.12 -4336,0.518,0.823,16.98 -4337,0.517,0.824,23.77 -4338,0.466,0.815,2.72 -4339,0.466,0.815,12.05 -4340,0.466,0.815,15.94 -4341,0.466,0.815,31.01 -4342,0.489,0.674,1.03 -4343,0.372,0.842,11.14 -4344,0.622,0.669,5.79 -4345,0.374,0.847,5.41 -4346,0.65,0.646,11.63 -4347,0.65,0.646,37.15 -4348,0.65,0.646,9.8 -4349,0.65,0.646,15.55 -4350,0.67,0.651,3.71 -4351,0.67,0.651,8.66 -4352,0.67,0.651,0.96 -4353,0.67,0.651,2.67 -4354,0.655,0.836,9.85 -4355,0.655,0.836,10.74 -4356,0.655,0.836,4.76 -4357,0.655,0.836,9.67 -4358,0.566,0.81,4.51 -4359,0.566,0.81,34.1 -4360,0.566,0.81,32.46 -4361,0.566,0.81,26.69 -4362,0.518,0.809,28.12 -4363,0.518,0.809,33.86 -4364,0.518,0.809,18.81 -4365,0.518,0.809,29.86 -4366,0.707,0.753,21.78 -4367,0.712,0.79,24.98 -4368,0.479,0.794,23.06 -4369,0.479,0.794,13.26 -4370,0.503,0.808,17.64 -4371,0.5,0.808,23.72 -4372,0.476,0.819,11.46 -4373,0.477,0.819,8.58 -4374,0.477,0.819,16.97 -4375,0.477,0.819,20.92 -4376,0.477,0.819,33.64 -4377,0.477,0.819,28.65 -4378,0.556,0.747,9.37 -4379,0.556,0.747,10.26 -4380,0.556,0.747,0.13 -4381,0.556,0.747,4.9 -4382,0.644,0.729,22.93 -4383,0.644,0.729,25.15 -4384,0.644,0.729,1.29 -4385,0.644,0.729,0.22 -4386,0.602,0.831,12.55 -4387,0.602,0.831,22.36 -4388,0.602,0.831,3.67 -4389,0.602,0.831,7.3 -4390,0.658,0.792,2.68 -4391,0.658,0.792,0.66 -4392,0.658,0.792,2.87 -4393,0.658,0.792,6.13 -4394,0.675,0.668,2.29 -4395,0.675,0.668,1.98 -4396,0.675,0.668,1.98 -4397,0.675,0.668,4.31 -4398,0.615,0.826,1.56 -4399,0.615,0.826,0 -4400,0.615,0.826,19.87 -4401,0.615,0.826,1.85 -4402,0.615,0.826,0 -4403,0.615,0.826,0 -4404,0.615,0.826,0 -4405,0.615,0.826,0 -4406,0.568,0.839,20.78 -4407,0.568,0.839,2.91 -4408,0.568,0.839,8.56 -4409,0.568,0.839,34.45 -4410,0.584,0.829,4.68 -4411,0.584,0.829,2.04 -4412,0.584,0.829,12.51 -4413,0.584,0.829,0 -4414,0.577,0.833,2.03 -4415,0.577,0.833,0.9 -4416,0.577,0.833,0 -4417,0.577,0.833,0 -4418,0.577,0.833,0 -4419,0.577,0.833,0.98 -4420,0.577,0.833,0 -4421,0.577,0.833,1.86 -4422,0.577,0.833,0.3 -4423,0.577,0.833,1.36 -4424,0.577,0.833,1.72 -4425,0.577,0.833,3.54 -4426,0.577,0.833,0.6 -4427,0.577,0.833,0 -4428,0.577,0.833,0 -4429,0.577,0.833,0 -4430,0.583,0.835,22.42 -4431,0.583,0.835,4.87 -4432,0.583,0.835,21.41 -4433,0.583,0.835,16.21 -4434,0.579,0.829,14.64 -4435,0.579,0.829,32.74 -4436,0.579,0.829,4.36 -4437,0.579,0.829,30.27 -4438,0.615,0.826,0 -4439,0.615,0.826,1.49 -4440,0.615,0.826,3.05 -4441,0.615,0.826,0 -4442,0.615,0.826,37.24 -4443,0.615,0.826,3.7 -4444,0.615,0.826,2.2 -4445,0.615,0.826,6.08 -4446,0.669,0.77,3.49 -4447,0.669,0.77,11.12 -4448,0.669,0.77,2.08 -4449,0.669,0.77,3.68 -4450,0.669,0.77,0 -4451,0.669,0.77,0 -4452,0.669,0.77,0.98 -4453,0.669,0.77,0 -4454,0.574,0.821,0.07 -4455,0.574,0.821,32.84 -4456,0.574,0.821,3.17 -4457,0.574,0.821,3.77 -4458,0.574,0.821,3.67 -4459,0.574,0.821,2.55 -4460,0.574,0.821,0.09 -4461,0.574,0.821,0 -4462,0.518,0.763,0.19 -4463,0.518,0.763,0 -4464,0.518,0.763,0 -4465,0.518,0.763,0 -4466,0.518,0.763,0 -4467,0.518,0.763,3.79 -4468,0.518,0.763,0 -4469,0.518,0.763,0 -4470,0.518,0.763,0 -4471,0.518,0.763,0 -4472,0.518,0.763,4.79 -4473,0.518,0.763,6.12 -4474,0.518,0.763,0 -4475,0.518,0.763,2.68 -4476,0.518,0.763,1.21 -4477,0.518,0.763,4.82 -4478,0.574,0.821,2.6 -4479,0.574,0.821,0 -4480,0.574,0.821,13.59 -4481,0.574,0.821,4.22 -4482,0.574,0.821,0 -4483,0.574,0.821,2.6 -4484,0.574,0.821,0 -4485,0.574,0.821,1.86 -4486,0.669,0.77,0 -4487,0.669,0.77,0 -4488,0.669,0.77,1.12 -4489,0.669,0.77,0 -4490,0.669,0.77,0 -4491,0.669,0.77,0.01 -4492,0.669,0.77,0 -4493,0.669,0.77,0 -4494,0.619,0.807,1.63 -4495,0.619,0.807,0 -4496,0.619,0.807,4.42 -4497,0.619,0.807,1.97 -4498,0.619,0.807,0 -4499,0.619,0.807,0 -4500,0.619,0.807,1.82 -4501,0.619,0.807,0 -4502,0.634,0.816,0 -4503,0.634,0.816,6.42 -4504,0.634,0.816,4.39 -4505,0.634,0.816,12.84 -4506,0.634,0.816,25.02 -4507,0.634,0.816,4.04 -4508,0.634,0.816,21.53 -4509,0.634,0.816,0 -4510,0.647,0.689,0 -4511,0.647,0.689,2.5 -4512,0.647,0.689,0 -4513,0.647,0.689,4.62 -4514,0.647,0.689,3.87 -4515,0.647,0.689,7 -4516,0.647,0.689,0 -4517,0.647,0.689,0 -4518,0.647,0.689,0 -4519,0.647,0.689,0.67 -4520,0.647,0.689,13.76 -4521,0.647,0.689,17.06 -4522,0.647,0.689,0.02 -4523,0.647,0.689,0.69 -4524,0.647,0.689,1.92 -4525,0.647,0.689,0.28 -4526,0.634,0.816,5.77 -4527,0.634,0.816,0 -4528,0.634,0.816,0 -4529,0.634,0.816,0 -4530,0.634,0.816,6.23 -4531,0.634,0.816,18.64 -4532,0.634,0.816,2.67 -4533,0.634,0.816,0.42 -4534,0.619,0.807,5.87 -4535,0.619,0.807,11.73 -4536,0.619,0.807,19.1 -4537,0.619,0.807,13.75 -4538,0.619,0.807,1.85 -4539,0.619,0.807,0 -4540,0.619,0.807,3.14 -4541,0.619,0.807,5.83 -4542,0.647,0.767,2.27 -4543,0.647,0.767,2.34 -4544,0.647,0.767,7.3 -4545,0.647,0.767,0 -4546,0.525,0.819,0 -4547,0.525,0.819,10.06 -4548,0.525,0.819,6.15 -4549,0.525,0.819,14.69 -4550,0.484,0.871,9.65 -4551,0.484,0.871,18.52 -4552,0.484,0.871,14.73 -4553,0.484,0.871,13.98 -4554,0.437,0.916,5.9 -4555,0.632,0.723,2.63 -4556,0.516,0.852,7.8 -4557,0.595,0.787,10.27 -4558,0.634,0.71,1.3 -4559,0.634,0.71,6.04 -4560,0.634,0.71,3.91 -4561,0.634,0.71,11.97 -4562,0.633,0.712,19.16 -4563,0.633,0.712,16.08 -4564,0.633,0.712,23.07 -4565,0.633,0.712,5.73 -4566,0.606,0.736,11.52 -4567,0.606,0.736,8.94 -4568,0.606,0.736,5.1 -4569,0.606,0.736,10.39 -4570,0.618,0.723,7.11 -4571,0.618,0.723,6.57 -4572,0.618,0.723,4.24 -4573,0.618,0.723,15.4 -4574,0.591,0.699,12.25 -4575,0.588,0.699,7.8 -4576,0.589,0.698,16.09 -4577,0.588,0.699,23.84 -4578,0.677,0.649,21.97 -4579,0.677,0.649,10.94 -4580,0.677,0.649,25.1 -4581,0.677,0.649,13.06 -4582,0.725,0.541,18.56 -4583,0.725,0.541,34.51 -4584,0.621,0.608,25.27 -4585,0.563,0.627,39.67 -4586,0.677,0.646,0.57 -4587,0.677,0.646,5.98 -4588,0.677,0.646,0 -4589,0.677,0.646,20.3 -4590,0.661,0.697,5.47 -4591,0.661,0.697,33.33 -4592,0.661,0.697,11.71 -4593,0.661,0.697,16.49 -4594,0.577,0.639,36.28 -4595,0.593,0.577,41.25 -4596,0.658,0.668,18.62 -4597,0.638,0.578,29.22 -4598,0.579,0.583,30.16 -4599,0.579,0.583,24.06 -4600,0.579,0.583,28.4 -4601,0.579,0.583,37.61 -4602,0.446,0.437,27.76 -4603,0.591,0.542,50.86 -4604,0.66,0.706,32.07 -4605,0.611,0.587,40.81 -4606,0.663,0.62,26.93 -4607,0.756,0.711,7.87 -4608,0.74,0.694,19.76 -4609,0.767,0.706,32.97 -4610,0.72,0.729,2.44 -4611,0.72,0.729,8.23 -4612,0.72,0.729,17.61 -4613,0.72,0.729,13.31 -4614,0.595,0.772,12.1 -4615,0.595,0.772,2.79 -4616,0.595,0.772,24.44 -4617,0.595,0.772,13.28 -4618,0.681,0.705,14.13 -4619,0.681,0.705,10.09 -4620,0.681,0.705,1.08 -4621,0.681,0.705,11.69 -4622,0.642,0.707,12.1 -4623,0.642,0.707,15.78 -4624,0.642,0.707,31.47 -4625,0.642,0.707,20.47 -4626,0.489,0.841,6.94 -4627,0.684,0.781,33.69 -4628,0.486,0.832,10.51 -4629,0.541,0.87,24.11 -4630,0.672,0.689,22.51 -4631,0.477,0.737,15.23 -4632,0.684,0.686,16.61 -4633,0.477,0.737,12.46 -4634,0.649,0.751,2.18 -4635,0.649,0.751,7.98 -4636,0.649,0.751,12.74 -4637,0.649,0.751,12.69 -4638,0.659,0.76,29.02 -4639,0.659,0.76,20.54 -4640,0.659,0.76,18.25 -4641,0.659,0.76,5.96 -4642,0.592,0.708,12.95 -4643,0.592,0.708,7.15 -4644,0.592,0.708,7.61 -4645,0.592,0.708,5.05 -4646,0.518,0.789,7.06 -4647,0.518,0.789,19.92 -4648,0.518,0.789,27.97 -4649,0.518,0.789,31.72 -4650,0.561,0.736,26.21 -4651,0.561,0.736,25.03 -4652,0.561,0.736,12.03 -4653,0.561,0.736,19.33 -4654,0.597,0.71,7.03 -4655,0.597,0.71,29.22 -4656,0.597,0.71,37.95 -4657,0.597,0.71,25.68 -4658,0.597,0.71,6.47 -4659,0.597,0.71,14.02 -4660,0.597,0.71,16.03 -4661,0.597,0.71,13.8 -4662,0.597,0.71,13.59 -4663,0.597,0.71,0 -4664,0.597,0.71,3.46 -4665,0.597,0.71,1.05 -4666,0.597,0.71,2.35 -4667,0.597,0.71,1.36 -4668,0.597,0.71,0 -4669,0.597,0.71,0 -4670,0.666,0.71,1.79 -4671,0.666,0.71,1.71 -4672,0.666,0.71,7.42 -4673,0.666,0.71,0 -4674,0.717,0.706,14.05 -4675,0.717,0.706,31.65 -4676,0.717,0.706,0 -4677,0.717,0.706,2.9 -4678,0.699,0.685,0 -4679,0.699,0.685,2.34 -4680,0.699,0.685,0 -4681,0.699,0.685,0 -4682,0.701,0.684,2.87 -4683,0.701,0.684,3.25 -4684,0.701,0.684,0 -4685,0.701,0.684,6.03 -4686,0.711,0.579,23.91 -4687,0.641,0.539,37.78 -4688,0.744,0.59,33.72 -4689,0.6,0.521,33.47 -4690,0.602,0.495,38.7 -4691,0.502,0.664,25 -4692,0.582,0.537,24.69 -4693,0.46,0.711,29.56 -4694,0.564,0.709,4.41 -4695,0.564,0.709,19.59 -4696,0.564,0.709,21.92 -4697,0.564,0.709,29.1 -4698,0.572,0.878,29.67 -4699,0.572,0.878,43.62 -4700,0.572,0.878,30.41 -4701,0.572,0.878,31.29 -4702,0.48,0.863,33.38 -4703,0.48,0.863,36.05 -4704,0.48,0.863,16.41 -4705,0.48,0.863,36.23 -4706,0.82,0.718,28.67 -4707,0.82,0.718,7.12 -4708,0.82,0.718,19.57 -4709,0.82,0.718,21.68 -4710,0.626,0.758,37.44 -4711,0.626,0.758,18.96 -4712,0.626,0.758,34.86 -4713,0.626,0.758,8.56 -4714,0.696,0.738,27.94 -4715,0.696,0.738,38.67 -4716,0.696,0.738,35.56 -4717,0.696,0.738,25.81 -4718,0.63,0.811,35.57 -4719,0.63,0.811,26.67 -4720,0.63,0.811,32.34 -4721,0.63,0.811,29.8 -4722,0.521,0.755,19.26 -4723,0.521,0.755,32.5 -4724,0.521,0.755,17.75 -4725,0.521,0.755,33.76 -4726,0.599,0.748,33.66 -4727,0.599,0.748,39.29 -4728,0.599,0.748,37.15 -4729,0.599,0.748,31.2 -4730,0.602,0.664,36.07 -4731,0.602,0.664,31.36 -4732,0.602,0.664,31.08 -4733,0.602,0.664,36.38 -4734,0.679,0.733,37.25 -4735,0.679,0.733,45.46 -4736,0.679,0.733,1.54 -4737,0.679,0.733,8.77 -4738,0.725,0.714,48.58 -4739,0.725,0.714,19.09 -4740,0.725,0.714,7.44 -4741,0.725,0.714,12.53 -4742,0.628,0.789,6.92 -4743,0.628,0.789,32 -4744,0.628,0.789,3.86 -4745,0.628,0.789,5.31 -4746,0.637,0.764,32.71 -4747,0.637,0.764,34.39 -4748,0.637,0.764,2.18 -4749,0.637,0.764,17.46 -4750,0.587,0.724,24.81 -4751,0.587,0.724,35.54 -4752,0.587,0.724,22.36 -4753,0.587,0.724,23.77 -4754,0.598,0.703,38.18 -4755,0.598,0.703,17.09 -4756,0.598,0.703,28.64 -4757,0.598,0.703,5.39 -4758,0.616,0.832,24.74 -4759,0.616,0.832,18.19 -4760,0.616,0.832,14.95 -4761,0.616,0.832,7.89 -4762,0.603,0.807,1.92 -4763,0.603,0.807,4.83 -4764,0.603,0.807,11.67 -4765,0.603,0.807,11.57 -4766,0.763,0.706,11.48 -4767,0.674,0.777,5.89 -4768,0.786,0.683,2 -4769,0.75,0.718,7.14 -4770,0.686,0.762,0.09 -4771,0.686,0.762,4.1 -4772,0.686,0.762,0 -4773,0.686,0.762,4.23 -4774,0.727,0.744,1.89 -4775,0.727,0.744,0 -4776,0.727,0.744,5.86 -4777,0.727,0.744,0.36 -4778,0.719,0.676,0 -4779,0.719,0.676,0.88 -4780,0.719,0.676,0.53 -4781,0.719,0.676,4.52 -4782,0.72,0.68,1.31 -4783,0.72,0.68,6.58 -4784,0.72,0.68,2.34 -4785,0.72,0.68,1.8 -4786,0.728,0.747,5.38 -4787,0.728,0.747,1.09 -4788,0.728,0.747,1.91 -4789,0.728,0.747,3.14 -4790,0.729,0.791,0.91 -4791,0.729,0.791,5.06 -4792,0.729,0.791,0 -4793,0.729,0.791,2.03 -4794,0.712,0.779,2.28 -4795,0.712,0.779,6.43 -4796,0.712,0.779,0 -4797,0.712,0.779,2.38 -4798,0.533,0.782,5.39 -4799,0.582,0.745,15.1 -4800,0.749,0.744,0.44 -4801,0.693,0.738,3 -4802,0.676,0.805,14 -4803,0.676,0.805,25.02 -4804,0.676,0.805,5.97 -4805,0.676,0.805,6.1 -4806,0.766,0.737,14.04 -4807,0.766,0.737,7.3 -4808,0.766,0.737,28.18 -4809,0.766,0.737,3.85 -4810,0.743,0.803,0.52 -4811,0.743,0.803,7.77 -4812,0.743,0.803,1.64 -4813,0.743,0.803,19.04 -4814,0.723,0.827,2.03 -4815,0.723,0.827,2.22 -4816,0.723,0.827,17.27 -4817,0.723,0.827,2.59 -4818,0.754,0.772,2.02 -4819,0.754,0.772,4.21 -4820,0.754,0.772,10.76 -4821,0.754,0.772,4.76 -4822,0.73,0.751,1.94 -4823,0.73,0.751,2.01 -4824,0.73,0.751,0 -4825,0.73,0.751,3.43 -4826,0.728,0.744,1.89 -4827,0.728,0.744,2.25 -4828,0.728,0.744,5.69 -4829,0.728,0.744,0 -4830,0.615,0.804,6.47 -4831,0.615,0.804,8.61 -4832,0.615,0.804,29.79 -4833,0.615,0.804,29.98 -4834,0.615,0.804,29.58 -4835,0.615,0.804,28.39 -4836,0.615,0.804,33.26 -4837,0.615,0.804,33.46 -4838,0.521,0.817,19.32 -4839,0.521,0.817,2.62 -4840,0.521,0.817,7.64 -4841,0.521,0.817,8.07 -4842,0.521,0.817,10.93 -4843,0.521,0.817,4.18 -4844,0.521,0.817,14.6 -4845,0.521,0.817,3.64 -4846,0.65,0.651,0.53 -4847,0.65,0.651,0 -4848,0.65,0.651,0.01 -4849,0.65,0.651,1.27 -4850,0.65,0.651,0 -4851,0.65,0.651,4.36 -4852,0.65,0.651,0 -4853,0.65,0.651,0 -4854,0.65,0.651,0 -4855,0.65,0.651,2.85 -4856,0.65,0.651,0 -4857,0.65,0.651,0 -4858,0.65,0.651,0 -4859,0.65,0.651,0 -4860,0.65,0.651,0 -4861,0.65,0.651,0 -4862,0.521,0.817,5.81 -4863,0.521,0.817,0 -4864,0.521,0.817,19.72 -4865,0.521,0.817,16.48 -4866,0.521,0.817,33.72 -4867,0.521,0.817,25.52 -4868,0.521,0.817,30.46 -4869,0.521,0.817,25.8 -4870,0.615,0.804,14.44 -4871,0.615,0.804,10.24 -4872,0.615,0.804,4.53 -4873,0.615,0.804,4.01 -4874,0.615,0.804,25.02 -4875,0.615,0.804,14.68 -4876,0.615,0.804,1.99 -4877,0.615,0.804,1.58 -4878,0.594,0.852,35.23 -4879,0.594,0.852,33.6 -4880,0.594,0.852,30.69 -4881,0.594,0.852,28.27 -4882,0.594,0.852,28.81 -4883,0.594,0.852,16.17 -4884,0.594,0.852,26.87 -4885,0.594,0.852,8.24 -4886,0.693,0.814,2.02 -4887,0.693,0.814,9.13 -4888,0.693,0.814,3.39 -4889,0.693,0.814,1.99 -4890,0.693,0.814,25.97 -4891,0.693,0.814,20.33 -4892,0.693,0.814,4.76 -4893,0.693,0.814,4.12 -4894,0.726,0.791,0 -4895,0.726,0.791,0 -4896,0.726,0.791,0 -4897,0.726,0.791,0 -4898,0.726,0.791,1.16 -4899,0.726,0.791,0 -4900,0.726,0.791,0 -4901,0.726,0.791,0 -4902,0.726,0.791,2.04 -4903,0.726,0.791,6.78 -4904,0.726,0.791,10.84 -4905,0.726,0.791,34.84 -4906,0.726,0.791,0 -4907,0.726,0.791,0 -4908,0.726,0.791,0 -4909,0.726,0.791,0.4 -4910,0.693,0.814,0 -4911,0.693,0.814,0 -4912,0.693,0.814,0.73 -4913,0.693,0.814,0 -4914,0.693,0.814,0.08 -4915,0.693,0.814,0 -4916,0.693,0.814,0 -4917,0.693,0.814,0 -4918,0.594,0.852,26.73 -4919,0.594,0.852,1.13 -4920,0.594,0.852,21.85 -4921,0.594,0.852,1.98 -4922,0.594,0.852,30.08 -4923,0.594,0.852,34.36 -4924,0.594,0.852,37.44 -4925,0.594,0.852,29.71 -4926,0.694,0.846,37.09 -4927,0.694,0.846,43.4 -4928,0.694,0.846,24 -4929,0.694,0.846,14.35 -4930,0.694,0.846,37.44 -4931,0.694,0.846,1.83 -4932,0.694,0.846,16.99 -4933,0.694,0.846,2.02 -4934,0.72,0.879,7.89 -4935,0.72,0.879,1.06 -4936,0.72,0.879,0 -4937,0.72,0.879,0 -4938,0.72,0.879,0.55 -4939,0.72,0.879,0 -4940,0.72,0.879,4.88 -4941,0.72,0.879,0 -4942,0.737,0.923,0 -4943,0.737,0.923,0 -4944,0.737,0.923,0 -4945,0.737,0.923,0 -4946,0.737,0.923,0 -4947,0.737,0.923,8.62 -4948,0.737,0.923,0 -4949,0.737,0.923,1.95 -4950,0.737,0.923,0 -4951,0.737,0.923,1.62 -4952,0.737,0.923,0 -4953,0.737,0.923,0 -4954,0.737,0.923,0 -4955,0.737,0.923,0 -4956,0.737,0.923,0 -4957,0.737,0.923,0.1 -4958,0.72,0.879,17.17 -4959,0.72,0.879,3.92 -4960,0.72,0.879,16.93 -4961,0.72,0.879,4.12 -4962,0.72,0.879,4.93 -4963,0.72,0.879,5.37 -4964,0.72,0.879,9.48 -4965,0.72,0.879,8.4 -4966,0.694,0.846,0.19 -4967,0.694,0.846,1.23 -4968,0.694,0.846,0 -4969,0.694,0.846,1.82 -4970,0.694,0.846,9.33 -4971,0.694,0.846,0 -4972,0.694,0.846,0 -4973,0.694,0.846,0 -4974,0.74,0.78,8.39 -4975,0.74,0.78,7.22 -4976,0.74,0.78,14.72 -4977,0.74,0.78,0.23 -4978,0.683,0.793,1.09 -4979,0.683,0.793,28.78 -4980,0.683,0.793,2.75 -4981,0.683,0.793,23.59 -4982,0.647,0.841,28.3 -4983,0.647,0.841,18.2 -4984,0.647,0.841,34.3 -4985,0.647,0.841,16.67 -4986,0.647,0.841,1.47 -4987,0.647,0.841,15.17 -4988,0.647,0.841,24.12 -4989,0.647,0.841,29.37 -4990,0.83,0.896,39.27 -4991,0.83,0.896,4.24 -4992,0.83,0.896,11.68 -4993,0.83,0.896,8.44 -4994,0.783,0.881,0.11 -4995,0.783,0.881,23.75 -4996,0.783,0.881,10.27 -4997,0.783,0.881,35.92 -4998,0.615,0.849,20.94 -4999,0.615,0.849,18.16 -5000,0.615,0.849,2.04 -5001,0.615,0.849,2.68 -5002,0.69,0.819,12.91 -5003,0.69,0.819,7.87 -5004,0.69,0.819,0.14 -5005,0.69,0.819,13.35 -5006,0.647,0.841,22.68 -5007,0.647,0.841,30.32 -5008,0.647,0.841,24.03 -5009,0.647,0.841,3.23 -5010,0.647,0.841,27.13 -5011,0.647,0.841,12.66 -5012,0.647,0.841,8.43 -5013,0.647,0.841,6.58 -5014,0.573,0.827,4.36 -5015,0.573,0.827,30.2 -5016,0.573,0.827,0 -5017,0.573,0.827,7.15 -5018,0.741,0.779,9.23 -5019,0.741,0.779,1.51 -5020,0.741,0.779,5.89 -5021,0.741,0.779,1.94 -5022,0.674,0.806,0.41 -5023,0.674,0.806,1.99 -5024,0.674,0.806,0.92 -5025,0.674,0.806,4.19 -5026,0.606,0.844,1.53 -5027,0.606,0.844,19.48 -5028,0.606,0.844,11.31 -5029,0.606,0.844,35.85 -5030,0.58,0.856,12.69 -5031,0.58,0.856,7.95 -5032,0.58,0.856,28 -5033,0.58,0.856,35.36 -5034,0.577,0.822,15.14 -5035,0.577,0.822,27 -5036,0.577,0.822,4.29 -5037,0.577,0.822,29.94 -5038,0.607,0.795,17.95 -5039,0.607,0.795,2.93 -5040,0.607,0.795,8.69 -5041,0.607,0.795,7.65 -5042,0.606,0.826,5.16 -5043,0.606,0.826,3.08 -5044,0.606,0.826,0 -5045,0.606,0.826,3.32 -5046,0.544,0.822,6.26 -5047,0.544,0.822,38.01 -5048,0.544,0.822,32.56 -5049,0.544,0.822,44.23 -5050,0.552,0.82,11.98 -5051,0.552,0.82,4.03 -5052,0.552,0.82,0.48 -5053,0.552,0.82,18.27 -5054,0.608,0.85,0 -5055,0.608,0.85,17.55 -5056,0.608,0.85,8.47 -5057,0.608,0.85,5.48 -5058,0.475,0.916,35.55 -5059,0.595,0.832,2.75 -5060,0.593,0.915,14.91 -5061,0.691,0.885,31.02 -5062,0.617,0.815,21.33 -5063,0.566,0.9,19.44 -5064,0.624,0.83,11.45 -5065,0.572,0.91,12.08 -5066,0.466,0.837,13.32 -5067,0.466,0.837,6.75 -5068,0.466,0.837,21.38 -5069,0.466,0.837,9.72 -5070,0.632,0.885,1.25 -5071,0.632,0.885,3.8 -5072,0.632,0.885,0 -5073,0.632,0.885,2.67 -5074,0.652,0.882,0 -5075,0.652,0.882,7.68 -5076,0.652,0.882,3.22 -5077,0.652,0.882,25.28 -5078,0.68,0.906,30.25 -5079,0.68,0.906,4.3 -5080,0.68,0.906,27.7 -5081,0.68,0.906,41.1 -5082,0.711,0.902,38.86 -5083,0.647,0.86,4.09 -5084,0.697,0.925,47.03 -5085,0.68,0.872,5.44 -5086,0.676,0.858,0 -5087,0.676,0.858,21.57 -5088,0.676,0.858,0 -5089,0.676,0.858,23.22 -5090,0.577,0.833,29.04 -5091,0.577,0.833,25.92 -5092,0.577,0.833,10.33 -5093,0.577,0.833,35.58 -5094,0.553,0.835,11.12 -5095,0.553,0.835,27.32 -5096,0.553,0.835,1.47 -5097,0.553,0.835,0.02 -5098,0.675,0.85,0 -5099,0.675,0.85,14.24 -5100,0.675,0.85,0 -5101,0.675,0.85,7.49 -5102,0.712,0.864,16.14 -5103,0.712,0.864,4.03 -5104,0.712,0.864,4.94 -5105,0.712,0.864,3.02 -5106,0.709,0.868,12.98 -5107,0.709,0.868,23.07 -5108,0.709,0.868,0.31 -5109,0.709,0.868,20.7 -5110,0.718,0.846,27.47 -5111,0.718,0.846,17.67 -5112,0.718,0.846,16.75 -5113,0.718,0.846,12.48 -5114,0.725,0.813,1.4 -5115,0.725,0.813,1.96 -5116,0.725,0.813,2.49 -5117,0.725,0.813,1.95 -5118,0.704,0.766,12.72 -5119,0.704,0.766,3.46 -5120,0.704,0.766,1.94 -5121,0.704,0.766,2.06 -5122,0.694,0.933,9.7 -5123,0.694,0.933,8.96 -5124,0.694,0.933,5.9 -5125,0.694,0.933,5.71 -5126,0.71,0.896,5.05 -5127,0.71,0.896,1.13 -5128,0.71,0.896,2.87 -5129,0.71,0.896,0.33 -5130,0.781,0.789,4.9 -5131,0.781,0.789,5.27 -5132,0.781,0.789,13.1 -5133,0.781,0.789,21.74 -5134,0.781,0.789,2.1 -5135,0.781,0.789,2.03 -5136,0.781,0.789,10.35 -5137,0.781,0.789,12.19 -5138,0.78,0.791,15.53 -5139,0.78,0.791,8.48 -5140,0.78,0.791,2.17 -5141,0.78,0.791,4.93 -5142,0.775,0.799,7.66 -5143,0.775,0.799,31.1 -5144,0.775,0.799,36.04 -5145,0.775,0.799,29.88 -5146,0.688,0.911,1.6 -5147,0.688,0.911,0 -5148,0.688,0.911,5.43 -5149,0.688,0.911,9.87 -5150,0.694,0.933,1.09 -5151,0.694,0.933,0 -5152,0.694,0.933,19.74 -5153,0.694,0.933,21.39 -5154,0.704,0.766,1.43 -5155,0.704,0.766,0 -5156,0.704,0.766,0.2 -5157,0.704,0.766,10.88 -5158,0.703,0.893,2.05 -5159,0.703,0.893,1.66 -5160,0.703,0.893,16.6 -5161,0.633,0.859,21.39 -5162,0.633,0.859,23.29 -5163,0.633,0.859,36.28 -5164,0.633,0.859,16.46 -5165,0.605,0.835,12.64 -5166,0.605,0.835,26.02 -5167,0.605,0.835,2.55 -5168,0.605,0.835,16.03 -5169,0.531,0.835,3.87 -5170,0.531,0.835,22.15 -5171,0.531,0.835,0.06 -5172,0.531,0.835,13.61 -5173,0.544,0.846,26.65 -5174,0.544,0.846,3.7 -5175,0.544,0.846,11.7 -5176,0.544,0.846,12.58 -5177,0.66,0.84,0 -5178,0.66,0.84,0 -5179,0.66,0.84,27.76 -5180,0.66,0.84,5.89 -5181,0.559,0.794,18.74 -5182,0.559,0.794,12.57 -5183,0.559,0.794,27.49 -5184,0.559,0.794,21.78 -5185,0.544,0.791,31.21 -5186,0.553,0.845,25.36 -5187,0.546,0.861,25.94 -5188,0.549,0.87,17.18 -5189,0.535,0.769,13.87 -5190,0.535,0.769,10.6 -5191,0.535,0.769,0.26 -5192,0.535,0.769,28.9 -5193,0.581,0.817,0 -5194,0.581,0.817,0 -5195,0.581,0.817,1.6 -5196,0.581,0.817,2.64 -5197,0.723,0.822,1.4 -5198,0.723,0.822,5 -5199,0.723,0.822,0.68 -5200,0.723,0.822,9.21 -5201,0.626,0.903,3.37 -5202,0.626,0.903,24.22 -5203,0.626,0.903,10.99 -5204,0.626,0.903,19.97 -5205,0.73,0.854,0.56 -5206,0.73,0.854,24.81 -5207,0.73,0.854,0 -5208,0.73,0.854,12.46 -5209,0.684,0.786,6.22 -5210,0.684,0.786,3.82 -5211,0.684,0.786,3.37 -5212,0.684,0.786,0 -5213,0.674,0.876,1.08 -5214,0.674,0.876,8.46 -5215,0.674,0.876,0.41 -5216,0.674,0.876,5.42 -5217,0.606,0.868,14.08 -5218,0.644,0.909,24.34 -5219,0.733,0.95,21.7 -5220,0.705,0.919,22.6 -5221,0.644,0.901,22.61 -5222,0.658,0.844,30.37 -5223,0.722,0.852,31.66 -5224,0.723,0.846,0 -5225,0.71,0.83,8.31 -5226,0.71,0.83,0 -5227,0.71,0.83,0.37 -5228,0.71,0.83,0 -5229,0.685,0.799,0.08 -5230,0.685,0.799,3.05 -5231,0.685,0.799,0.28 -5232,0.685,0.799,2.5 -5233,0.685,0.801,4.55 -5234,0.685,0.801,0 -5235,0.685,0.801,0 -5236,0.685,0.801,0.98 -5237,0.686,0.852,26.57 -5238,0.686,0.852,8.84 -5239,0.686,0.852,19.13 -5240,0.686,0.852,0.62 -5241,0.678,0.752,7.21 -5242,0.678,0.752,16.18 -5243,0.678,0.752,0.9 -5244,0.678,0.752,2.48 -5245,0.675,0.782,2.66 -5246,0.675,0.79,5.76 -5247,0.655,0.655,32.48 -5248,0.655,0.657,39.38 -5249,0.841,0.838,0.89 -5250,0.844,0.835,1.9 -5251,0.815,0.793,2.42 -5252,0.708,0.686,19 -5253,0.544,0.877,0 -5254,0.544,0.877,0 -5255,0.544,0.877,0 -5256,0.544,0.877,0 -5257,0.544,0.877,0 -5258,0.544,0.877,0 -5259,0.544,0.877,0 -5260,0.544,0.877,0 -5261,0.544,0.877,0 -5262,0.544,0.877,0 -5263,0.544,0.877,0 -5264,0.544,0.877,0 -5265,0.544,0.877,0 -5266,0.544,0.877,0 -5267,0.544,0.877,0 -5268,0.544,0.877,0 -5269,0.544,0.877,0 -5270,0.544,0.877,0 -5271,0.544,0.877,0 -5272,0.544,0.877,0 -5273,0.544,0.877,0 -5274,0.544,0.877,0 -5275,0.544,0.877,0 -5276,0.544,0.877,0 -5277,0.544,0.877,0 -5278,0.544,0.877,0 -5279,0.544,0.877,0 -5280,0.544,0.877,0 -5281,0.544,0.877,0 -5282,0.544,0.877,0 -5283,0.544,0.877,0 -5284,0.544,0.877,0 -5285,0.544,0.877,0 -5286,0.544,0.877,0 -5287,0.544,0.877,0 -5288,0.544,0.877,0 -5289,0.544,0.877,0 -5290,0.544,0.877,0 -5291,0.544,0.877,0 -5292,0.544,0.877,0 -5293,0.544,0.877,0 -5294,0.544,0.877,0 -5295,0.544,0.877,0 -5296,0.544,0.877,0 -5297,0.544,0.877,0 -5298,0.544,0.877,0 -5299,0.544,0.877,0 -5300,0.544,0.877,0 -5301,0.544,0.877,0 -5302,0.544,0.877,0 -5303,0.544,0.877,0 -5304,0.544,0.877,0 -5305,0.544,0.877,0 -5306,0.544,0.877,0 -5307,0.544,0.877,0 -5308,0.544,0.877,0 -5309,0.544,0.877,0 -5310,0.544,0.877,0 -5311,0.544,0.877,0 -5312,0.544,0.877,0 -5313,0.544,0.877,0 -5314,0.544,0.877,0 -5315,0.544,0.877,0 -5316,0.544,0.877,0 -5317,0.544,0.877,0 -5318,0.544,0.877,0 -5319,0.544,0.877,0 -5320,0.544,0.877,0 -5321,0.544,0.877,0 -5322,0.544,0.877,0 -5323,0.544,0.877,0 -5324,0.544,0.877,0 -5325,0.544,0.877,0 -5326,0.544,0.877,0 -5327,0.544,0.877,0 -5328,0.544,0.877,0 -5329,0.544,0.877,0 -5330,0.544,0.877,0 -5331,0.544,0.877,0 -5332,0.544,0.877,0 -5333,0.544,0.877,3.36 -5334,0.544,0.877,0 -5335,0.544,0.877,0 -5336,0.544,0.877,0 -5337,0.544,0.876,0 -5338,0.544,0.876,2.26 -5339,0.544,0.876,0 -5340,0.544,0.876,0 -5341,0.544,0.876,0 -5342,0.544,0.876,0 -5343,0.544,0.876,0 -5344,0.544,0.876,0 -5345,0.544,0.876,0 -5346,0.544,0.876,0 -5347,0.544,0.876,0 -5348,0.544,0.876,0 -5349,0.544,0.876,0 -5350,0.544,0.876,0 -5351,0.544,0.876,0 -5352,0.544,0.876,0 -5353,0.544,0.876,0 -5354,0.544,0.876,0 -5355,0.544,0.876,3.24 -5356,0.544,0.876,2.56 -5357,0.544,0.876,0 -5358,0.544,0.876,0 -5359,0.544,0.876,0 -5360,0.544,0.876,0 -5361,0.544,0.877,0 -5362,0.544,0.877,0 -5363,0.544,0.877,0 -5364,0.544,0.877,0 -5365,0.544,0.877,0 -5366,0.544,0.877,0 -5367,0.544,0.877,0 -5368,0.544,0.877,0 -5369,0.544,0.877,0 -5370,0.544,0.877,0 -5371,0.544,0.877,0 -5372,0.544,0.877,0 -5373,0.544,0.877,0 -5374,0.544,0.877,0 -5375,0.544,0.877,0 -5376,0.544,0.877,0 -5377,0.544,0.877,0 -5378,0.544,0.877,0 -5379,0.544,0.877,0 -5380,0.544,0.877,0 -5381,0.544,0.877,0 -5382,0.544,0.877,0 -5383,0.544,0.877,0 -5384,0.544,0.877,0 -5385,0.544,0.876,0 -5386,0.544,0.876,0 -5387,0.544,0.876,0 -5388,0.544,0.876,0 -5389,0.544,0.876,0 -5390,0.544,0.876,0 -5391,0.544,0.876,0 -5392,0.544,0.876,0 -5393,0.544,0.876,0 -5394,0.544,0.876,0 -5395,0.544,0.876,0 -5396,0.544,0.876,0 -5397,0.647,0.803,0 -5398,0.647,0.803,3.1 -5399,0.647,0.803,3.16 -5400,0.647,0.803,0.83 -5401,0.647,0.803,0.35 -5402,0.647,0.803,0 -5403,0.647,0.803,7.43 -5404,0.647,0.803,1.51 -5405,0.647,0.803,0 -5406,0.647,0.803,0 -5407,0.647,0.803,14.56 -5408,0.647,0.803,14.45 -5409,0.668,0.802,0 -5410,0.668,0.802,0 -5411,0.668,0.802,13.26 -5412,0.668,0.802,0.83 -5413,0.668,0.802,0 -5414,0.668,0.802,0 -5415,0.668,0.802,1.39 -5416,0.668,0.802,0 -5417,0.668,0.802,0 -5418,0.668,0.802,0 -5419,0.668,0.802,0 -5420,0.668,0.802,0 -5421,0.668,0.802,0 -5422,0.668,0.802,0 -5423,0.668,0.802,0 -5424,0.668,0.802,0 -5425,0.668,0.802,0 -5426,0.668,0.802,0 -5427,0.668,0.802,0 -5428,0.668,0.802,0 -5429,0.668,0.802,0.05 -5430,0.668,0.802,0 -5431,0.668,0.802,0 -5432,0.668,0.802,0 -5433,0.647,0.803,8.53 -5434,0.647,0.803,16.36 -5435,0.647,0.803,9.76 -5436,0.647,0.803,4.39 -5437,0.647,0.803,1.38 -5438,0.647,0.803,17.4 -5439,0.647,0.803,0 -5440,0.647,0.803,6.23 -5441,0.647,0.803,2.89 -5442,0.647,0.803,0 -5443,0.647,0.803,4.69 -5444,0.647,0.803,4.13 -5445,0.647,0.803,13.79 -5446,0.647,0.803,4.23 -5447,0.647,0.803,25.03 -5448,0.647,0.803,1.43 -5449,0.647,0.803,0 -5450,0.647,0.803,0 -5451,0.647,0.803,0 -5452,0.647,0.803,3.17 -5453,0.647,0.803,0.62 -5454,0.647,0.803,17.15 -5455,0.647,0.803,0 -5456,0.647,0.803,4.43 -5457,0.668,0.802,13.14 -5458,0.668,0.802,19.85 -5459,0.668,0.802,1.88 -5460,0.668,0.802,0.31 -5461,0.668,0.802,0 -5462,0.668,0.802,0 -5463,0.668,0.802,0 -5464,0.668,0.802,0.62 -5465,0.668,0.802,0 -5466,0.668,0.802,0 -5467,0.668,0.802,0 -5468,0.668,0.802,0 -5469,0.597,0.801,0 -5470,0.597,0.801,0 -5471,0.597,0.801,0 -5472,0.597,0.801,0 -5473,0.592,0.801,7.91 -5474,0.597,0.801,2.26 -5475,0.592,0.801,0 -5476,0.597,0.801,0 -5477,0.592,0.801,25.6 -5478,0.592,0.801,21.99 -5479,0.592,0.801,12.74 -5480,0.592,0.801,0 -5481,0.592,0.801,3.64 -5482,0.592,0.801,0.02 -5483,0.592,0.801,0 -5484,0.592,0.801,0.71 -5485,0.502,0.872,3.28 -5486,0.592,0.801,13.78 -5487,0.502,0.872,0 -5488,0.592,0.801,0 -5489,0.502,0.872,19.74 -5490,0.502,0.872,2.4 -5491,0.502,0.872,11.97 -5492,0.502,0.872,0 -5493,0.502,0.872,19.84 -5494,0.502,0.872,3.83 -5495,0.474,0.88,4.82 -5496,0.474,0.88,0 -5497,0.502,0.872,0.74 -5498,0.592,0.801,0 -5499,0.474,0.88,0 -5500,0.519,0.861,0 -5501,0.592,0.801,0 -5502,0.592,0.801,0.01 -5503,0.519,0.861,0 -5504,0.519,0.861,0 -5505,0.592,0.801,8.25 -5506,0.592,0.801,0 -5507,0.592,0.801,0 -5508,0.592,0.801,0 -5509,0.592,0.801,0 -5510,0.597,0.801,0 -5511,0.592,0.801,0 -5512,0.592,0.801,0 -5513,0.597,0.801,0 -5514,0.597,0.801,0 -5515,0.592,0.801,0 -5516,0.592,0.801,0 -5517,0.592,0.801,0 -5518,0.592,0.801,0 -5519,0.592,0.801,0 -5520,0.592,0.801,0 -5521,0.592,0.801,0 -5522,0.592,0.801,0 -5523,0.592,0.801,0 -5524,0.592,0.801,0 -5525,0.592,0.801,0 -5526,0.592,0.801,0 -5527,0.592,0.801,0 -5528,0.592,0.801,0 -5529,0.519,0.861,0 -5530,0.519,0.861,0 -5531,0.519,0.861,19.97 -5532,0.519,0.861,0 -5533,0.474,0.88,0 -5534,0.519,0.861,0 -5535,0.474,0.88,16.09 -5536,0.519,0.861,38 -5537,0.474,0.88,1.99 -5538,0.474,0.88,1.93 -5539,0.474,0.88,1.74 -5540,0.474,0.88,0.51 -5541,0.464,0.722,7.02 -5542,0.464,0.722,5.48 -5543,0.464,0.722,0.59 -5544,0.464,0.722,0 -5545,0.634,0.863,5.73 -5546,0.634,0.863,4.73 -5547,0.634,0.863,3.15 -5548,0.634,0.863,2.63 -5549,0.635,0.864,27.62 -5550,0.635,0.864,9.52 -5551,0.635,0.864,1.7 -5552,0.635,0.864,0 -5553,0.647,0.939,11.36 -5554,0.647,0.939,32.28 -5555,0.647,0.939,1.72 -5556,0.647,0.939,2.36 -5557,0.583,0.905,22.44 -5558,0.583,0.905,25.05 -5559,0.583,0.905,1.21 -5560,0.583,0.905,2 -5561,0.523,0.849,17.57 -5562,0.523,0.849,0 -5563,0.523,0.849,2.23 -5564,0.523,0.849,4.21 -5565,0.523,0.849,7.68 -5566,0.523,0.849,4.76 -5567,0.523,0.849,20.3 -5568,0.523,0.849,10.34 -5569,0.562,0.908,0.18 -5570,0.562,0.908,4.6 -5571,0.562,0.908,25.31 -5572,0.562,0.908,2.22 -5573,0.577,0.905,3.51 -5574,0.577,0.905,10.03 -5575,0.577,0.905,10.34 -5576,0.577,0.905,34.61 -5577,0.611,0.864,1.84 -5578,0.611,0.864,0.62 -5579,0.611,0.864,2.67 -5580,0.611,0.864,3.97 -5581,0.635,0.884,11.89 -5582,0.635,0.884,5.17 -5583,0.635,0.884,12.39 -5584,0.635,0.884,7.03 -5585,0.46,0.718,8.09 -5586,0.46,0.718,6.12 -5587,0.46,0.718,14.62 -5588,0.46,0.718,5.98 -5589,0.477,0.77,29.15 -5590,0.477,0.77,12.02 -5591,0.477,0.77,1.29 -5592,0.477,0.77,0.69 -5593,0.594,0.915,10.52 -5594,0.594,0.915,14.68 -5595,0.594,0.915,4.7 -5596,0.594,0.915,27.12 -5597,0.568,0.895,4.74 -5598,0.568,0.895,3.28 -5599,0.568,0.895,24.12 -5600,0.568,0.895,30.86 -5601,0.596,0.895,4.12 -5602,0.596,0.895,15.46 -5603,0.596,0.895,34.98 -5604,0.596,0.895,22.03 -5605,0.7,0.902,17.6 -5606,0.7,0.902,24.18 -5607,0.7,0.902,23.76 -5608,0.7,0.902,29.32 -5609,0.485,0.968,35.44 -5610,0.485,0.968,16.81 -5611,0.485,0.968,26.81 -5612,0.485,0.968,24.78 -5613,0.575,0.907,15.85 -5614,0.575,0.907,16.52 -5615,0.575,0.907,2.56 -5616,0.575,0.907,26.35 -5617,0.601,0.806,29.46 -5618,0.601,0.806,10.53 -5619,0.601,0.806,40.86 -5620,0.601,0.806,5.47 -5621,0.524,0.864,43.71 -5622,0.641,0.839,34.57 -5623,0.589,0.738,28.22 -5624,0.588,0.763,29.29 -5625,0.505,0.939,22.03 -5626,0.522,0.874,34.59 -5627,0.492,0.949,45.26 -5628,0.586,0.81,37.41 -5629,0.517,0.971,42.64 -5630,0.517,0.971,34.04 -5631,0.517,0.971,41.29 -5632,0.517,0.971,39.91 -5633,0.625,0.9,1.52 -5634,0.625,0.9,9.3 -5635,0.625,0.9,0 -5636,0.625,0.9,0.57 -5637,0.676,0.789,0 -5638,0.676,0.789,0 -5639,0.676,0.789,36.02 -5640,0.676,0.789,23.44 -5641,0.554,0.913,19.14 -5642,0.462,0.939,45.37 -5643,0.587,0.898,1.65 -5644,0.434,0.956,8.33 -5645,0.586,0.941,46.93 -5646,0.586,0.941,41.79 -5647,0.586,0.941,42.61 -5648,0.586,0.941,39.47 -5649,0.574,0.882,18.67 -5650,0.574,0.882,10.32 -5651,0.574,0.882,14.38 -5652,0.574,0.882,15.08 -5653,0.545,0.9,0.6 -5654,0.545,0.9,0 -5655,0.545,0.9,0 -5656,0.545,0.9,0 -5657,0.544,0.9,0 -5658,0.544,0.9,0 -5659,0.544,0.9,0 -5660,0.544,0.9,0 -5661,0.488,0.919,0 -5662,0.488,0.919,0 -5663,0.488,0.919,0.54 -5664,0.488,0.919,1.59 -5665,0.488,0.919,1.77 -5666,0.488,0.919,0 -5667,0.488,0.919,13.92 -5668,0.488,0.919,0 -5669,0.49,0.923,1.73 -5670,0.49,0.923,9.44 -5671,0.49,0.923,14.67 -5672,0.49,0.923,1.85 -5673,0.467,0.962,7.16 -5674,0.467,0.962,22.18 -5675,0.467,0.962,0.01 -5676,0.467,0.962,4.24 -5677,0.484,0.944,0 -5678,0.484,0.944,2.97 -5679,0.484,0.944,0 -5680,0.484,0.944,20.67 -5681,0.668,0.863,17.26 -5682,0.663,0.878,19.28 -5683,0.662,0.88,18.21 -5684,0.657,0.883,1.1 -5685,0.544,0.877,0 -5686,0.544,0.877,0 -5687,0.544,0.877,0 -5688,0.544,0.877,0 -5689,0.544,0.877,0 -5690,0.544,0.877,0 -5691,0.544,0.877,0 -5692,0.544,0.877,0 -5693,0.544,0.877,0 -5694,0.544,0.877,0 -5695,0.544,0.877,0 -5696,0.544,0.877,0 -5697,0.544,0.877,0 -5698,0.544,0.877,0 -5699,0.544,0.877,0 -5700,0.544,0.877,0 -5701,0.544,0.877,0 -5702,0.544,0.877,0 -5703,0.544,0.877,0 -5704,0.544,0.877,0 -5705,0.544,0.877,0 -5706,0.544,0.877,0 -5707,0.544,0.877,0 -5708,0.544,0.877,0 -5709,0.544,0.877,0 -5710,0.544,0.877,0 -5711,0.544,0.877,0 -5712,0.544,0.877,0 -5713,0.544,0.877,0 -5714,0.544,0.877,0 -5715,0.544,0.877,0 -5716,0.544,0.877,0 -5717,0.544,0.877,0 -5718,0.544,0.877,0 -5719,0.544,0.877,0 -5720,0.544,0.877,0 -5721,0.544,0.877,0 -5722,0.544,0.877,0 -5723,0.544,0.877,0 -5724,0.544,0.877,0 -5725,0.544,0.877,0 -5726,0.544,0.877,0 -5727,0.544,0.877,0 -5728,0.544,0.877,0 -5729,0.544,0.877,0 -5730,0.544,0.877,0 -5731,0.544,0.877,0 -5732,0.544,0.877,0 -5733,0.544,0.877,0 -5734,0.544,0.877,0 -5735,0.544,0.877,0 -5736,0.544,0.877,0 -5737,0.544,0.877,0 -5738,0.544,0.877,0 -5739,0.544,0.877,0 -5740,0.544,0.877,0 -5741,0.544,0.877,0 -5742,0.544,0.877,0 -5743,0.544,0.877,0 -5744,0.544,0.877,0 -5745,0.544,0.877,0 -5746,0.544,0.877,0 -5747,0.544,0.877,0 -5748,0.544,0.877,0 -5749,0.544,0.877,0 -5750,0.544,0.877,0 -5751,0.544,0.877,0 -5752,0.544,0.877,0 -5753,0.544,0.877,0 -5754,0.544,0.877,0 -5755,0.544,0.877,0 -5756,0.544,0.877,0 -5757,0.544,0.877,0 -5758,0.544,0.877,0 -5759,0.544,0.877,0 -5760,0.544,0.877,0 -5761,0.544,0.877,0 -5762,0.544,0.877,0 -5763,0.544,0.877,0 -5764,0.544,0.877,0 -5765,0.544,0.877,0 -5766,0.544,0.877,0 -5767,0.544,0.877,0 -5768,0.544,0.877,0 -5769,0.544,0.877,0 -5770,0.544,0.877,0 -5771,0.544,0.877,0 -5772,0.544,0.877,0 -5773,0.544,0.877,0 -5774,0.544,0.877,0 -5775,0.544,0.877,0 -5776,0.544,0.877,0 -5777,0.544,0.877,0 -5778,0.544,0.877,0 -5779,0.544,0.877,0 -5780,0.544,0.877,0 -5781,0.544,0.877,0 -5782,0.544,0.877,0 -5783,0.544,0.877,0 -5784,0.544,0.877,0 -5785,0.544,0.877,0.13 -5786,0.544,0.877,3.56 -5787,0.544,0.877,0 -5788,0.544,0.877,0 -5789,0.544,0.877,0.02 -5790,0.544,0.877,0 -5791,0.544,0.877,0 -5792,0.544,0.877,0 -5793,0.544,0.877,0 -5794,0.544,0.877,0 -5795,0.544,0.877,0 -5796,0.544,0.877,0 -5797,0.544,0.877,0 -5798,0.544,0.877,0 -5799,0.544,0.877,0 -5800,0.544,0.877,0 -5801,0.544,0.877,0 -5802,0.544,0.877,0 -5803,0.544,0.877,0 -5804,0.544,0.877,0 -5805,0.544,0.877,0 -5806,0.544,0.877,0 -5807,0.544,0.877,0 -5808,0.544,0.877,0 -5809,0.544,0.877,0 -5810,0.544,0.877,0 -5811,0.544,0.877,0 -5812,0.544,0.877,0 -5813,0.544,0.877,0 -5814,0.544,0.877,0 -5815,0.544,0.877,0 -5816,0.544,0.877,0 -5817,0.544,0.877,0 -5818,0.544,0.877,0 -5819,0.544,0.877,0 -5820,0.544,0.877,0 -5821,0.544,0.877,0 -5822,0.544,0.877,0 -5823,0.544,0.877,0 -5824,0.544,0.877,0 -5825,0.544,0.877,0 -5826,0.544,0.877,0 -5827,0.544,0.877,0 -5828,0.544,0.877,0 -5829,0.685,0.663,0 -5830,0.685,0.663,0 -5831,0.685,0.663,0 -5832,0.685,0.663,0 -5833,0.685,0.663,0 -5834,0.685,0.663,0 -5835,0.685,0.663,0 -5836,0.685,0.663,0 -5837,0.685,0.663,0 -5838,0.685,0.663,0 -5839,0.685,0.663,0 -5840,0.685,0.663,0 -5841,0.553,0.862,0 -5842,0.553,0.862,0 -5843,0.553,0.862,0 -5844,0.553,0.862,0 -5845,0.553,0.862,0.14 -5846,0.553,0.862,12.66 -5847,0.553,0.862,0.08 -5848,0.553,0.862,1.31 -5849,0.553,0.862,11.41 -5850,0.553,0.862,0 -5851,0.553,0.862,10.82 -5852,0.553,0.862,0 -5853,0.553,0.862,0 -5854,0.553,0.862,0 -5855,0.553,0.862,0 -5856,0.553,0.862,0 -5857,0.553,0.862,26.16 -5858,0.553,0.862,16.73 -5859,0.553,0.862,13.58 -5860,0.553,0.862,0 -5861,0.553,0.862,0 -5862,0.553,0.862,8.16 -5863,0.553,0.862,0 -5864,0.553,0.862,14.07 -5865,0.685,0.663,0 -5866,0.685,0.663,0 -5867,0.685,0.663,0 -5868,0.685,0.663,0 -5869,0.685,0.663,6.23 -5870,0.685,0.663,0 -5871,0.685,0.663,6.42 -5872,0.685,0.663,0 -5873,0.685,0.663,17.82 -5874,0.685,0.663,16.38 -5875,0.685,0.663,32.77 -5876,0.685,0.663,18.13 -5877,0.685,0.663,18.69 -5878,0.685,0.663,15.27 -5879,0.685,0.663,21.68 -5880,0.685,0.663,1.61 -5881,0.685,0.663,1.98 -5882,0.685,0.663,1.98 -5883,0.685,0.663,0 -5884,0.685,0.663,0 -5885,0.685,0.663,0 -5886,0.685,0.663,0 -5887,0.685,0.663,0 -5888,0.685,0.663,0 -5889,0.553,0.862,0 -5890,0.553,0.862,0 -5891,0.553,0.862,0 -5892,0.553,0.862,0 -5893,0.553,0.862,0 -5894,0.553,0.862,0 -5895,0.553,0.862,0 -5896,0.553,0.862,0 -5897,0.553,0.862,0 -5898,0.553,0.862,0 -5899,0.553,0.862,0 -5900,0.553,0.862,0 -5901,0.643,0.804,0 -5902,0.643,0.804,0 -5903,0.643,0.804,0 -5904,0.643,0.804,0 -5905,0.643,0.804,0 -5906,0.643,0.804,0 -5907,0.643,0.804,0 -5908,0.643,0.804,0 -5909,0.643,0.804,0 -5910,0.643,0.804,0 -5911,0.643,0.804,0 -5912,0.643,0.804,0 -5913,0.71,0.714,0 -5914,0.71,0.714,0 -5915,0.71,0.714,0 -5916,0.71,0.714,0 -5917,0.71,0.714,0 -5918,0.71,0.714,0 -5919,0.71,0.714,0 -5920,0.71,0.714,0 -5921,0.71,0.714,24.56 -5922,0.71,0.714,2.66 -5923,0.71,0.714,0.6 -5924,0.71,0.714,0.2 -5925,0.71,0.714,0 -5926,0.71,0.714,0.68 -5927,0.71,0.714,0 -5928,0.71,0.714,0 -5929,0.71,0.714,0 -5930,0.71,0.714,0 -5931,0.71,0.714,0 -5932,0.71,0.714,0 -5933,0.71,0.714,0 -5934,0.71,0.714,0 -5935,0.71,0.714,0 -5936,0.71,0.714,0 -5937,0.643,0.804,3.78 -5938,0.643,0.804,0 -5939,0.643,0.804,2.87 -5940,0.643,0.804,0 -5941,0.643,0.804,0 -5942,0.643,0.804,0 -5943,0.643,0.804,0 -5944,0.643,0.804,0 -5945,0.643,0.804,0 -5946,0.643,0.804,0 -5947,0.643,0.804,0 -5948,0.643,0.804,0 -5949,0.643,0.804,0 -5950,0.643,0.804,0 -5951,0.643,0.804,0 -5952,0.643,0.804,0 -5953,0.643,0.804,0 -5954,0.643,0.804,0 -5955,0.643,0.804,0 -5956,0.643,0.804,0 -5957,0.643,0.804,0 -5958,0.643,0.804,0 -5959,0.643,0.804,0 -5960,0.643,0.804,0 -5961,0.71,0.714,0 -5962,0.71,0.714,0 -5963,0.71,0.714,0 -5964,0.71,0.714,0 -5965,0.71,0.714,2.11 -5966,0.71,0.714,0 -5967,0.71,0.714,0 -5968,0.71,0.714,0 -5969,0.71,0.714,6.86 -5970,0.71,0.714,7.68 -5971,0.71,0.714,23.54 -5972,0.71,0.714,26.27 -5973,0.687,0.843,0 -5974,0.687,0.843,20.59 -5975,0.687,0.843,2.02 -5976,0.687,0.843,8.32 -5977,0.687,0.843,24.57 -5978,0.687,0.843,1.48 -5979,0.687,0.843,11.47 -5980,0.687,0.843,22.11 -5981,0.617,0.643,12.39 -5982,0.617,0.643,20.1 -5983,0.617,0.643,44.07 -5984,0.617,0.643,28.31 -5985,0.613,0.621,17.46 -5986,0.613,0.621,29.25 -5987,0.613,0.621,11.04 -5988,0.613,0.621,14 -5989,0.575,0.738,23.39 -5990,0.575,0.738,27.7 -5991,0.575,0.738,17.62 -5992,0.575,0.738,20.57 -5993,0.575,0.738,0.83 -5994,0.575,0.738,0 -5995,0.575,0.738,0 -5996,0.575,0.738,0 -5997,0.575,0.738,7.21 -5998,0.575,0.738,9.43 -5999,0.575,0.738,3.46 -6000,0.575,0.738,10.24 -6001,0.575,0.738,15.81 -6002,0.575,0.738,22.72 -6003,0.575,0.738,31.22 -6004,0.575,0.738,8.21 -6005,0.6,0.696,8.1 -6006,0.6,0.696,8.83 -6007,0.6,0.696,21.62 -6008,0.6,0.696,14.06 -6009,0.621,0.711,11.67 -6010,0.621,0.711,9.83 -6011,0.621,0.711,0 -6012,0.621,0.711,2.82 -6013,0.687,0.843,0.27 -6014,0.687,0.843,11.35 -6015,0.687,0.843,0 -6016,0.687,0.843,10.7 -6017,0.687,0.843,0 -6018,0.687,0.843,0 -6019,0.687,0.843,0 -6020,0.687,0.843,0 -6021,0.676,0.833,0 -6022,0.676,0.833,0 -6023,0.676,0.833,0 -6024,0.676,0.833,0 -6025,0.677,0.833,1.01 -6026,0.677,0.833,2.05 -6027,0.677,0.833,0 -6028,0.677,0.833,13.62 -6029,0.571,0.788,1.21 -6030,0.571,0.788,4.5 -6031,0.571,0.788,19.11 -6032,0.571,0.788,6.68 -6033,0.555,0.767,17.23 -6034,0.555,0.767,11.14 -6035,0.555,0.767,27.99 -6036,0.555,0.767,22.11 -6037,0.572,0.75,7.66 -6038,0.572,0.75,10.45 -6039,0.572,0.75,6.75 -6040,0.572,0.75,6.73 -6041,0.572,0.75,1.31 -6042,0.572,0.75,11.41 -6043,0.572,0.75,0 -6044,0.572,0.75,7.9 -6045,0.572,0.75,0 -6046,0.572,0.75,3.87 -6047,0.572,0.75,2.43 -6048,0.572,0.75,0 -6049,0.572,0.75,15.4 -6050,0.572,0.75,5.26 -6051,0.572,0.75,12.22 -6052,0.572,0.75,13.09 -6053,0.509,0.795,15.35 -6054,0.509,0.795,20.03 -6055,0.509,0.795,11.01 -6056,0.509,0.795,2.11 -6057,0.52,0.798,30.27 -6058,0.52,0.798,35.96 -6059,0.52,0.798,6.82 -6060,0.52,0.798,27.25 -6061,0.668,0.811,16.3 -6062,0.668,0.811,26.5 -6063,0.668,0.811,21.39 -6064,0.668,0.811,21.57 -6065,0.665,0.824,0 -6066,0.665,0.824,3.81 -6067,0.665,0.824,1.96 -6068,0.665,0.824,3.63 -6069,0.701,0.74,7.13 -6070,0.701,0.74,4.66 -6071,0.701,0.74,2.47 -6072,0.701,0.74,8.83 -6073,0.701,0.74,15.98 -6074,0.701,0.74,16.53 -6075,0.701,0.74,16.93 -6076,0.701,0.74,25.28 -6077,0.57,0.78,0.3 -6078,0.57,0.78,5.72 -6079,0.57,0.78,11.12 -6080,0.57,0.78,2.36 -6081,0.57,0.78,30.54 -6082,0.57,0.78,12.5 -6083,0.57,0.78,9.77 -6084,0.57,0.78,9.21 -6085,0.539,0.78,11.33 -6086,0.539,0.78,6.07 -6087,0.539,0.78,0 -6088,0.539,0.78,0 -6089,0.539,0.78,0 -6090,0.539,0.78,0 -6091,0.539,0.78,0 -6092,0.539,0.78,0 -6093,0.539,0.78,2.33 -6094,0.539,0.78,13.02 -6095,0.539,0.78,10.22 -6096,0.539,0.78,1.89 -6097,0.539,0.78,1.32 -6098,0.539,0.78,2.65 -6099,0.539,0.78,22.15 -6100,0.539,0.78,25.86 -6101,0.57,0.78,0.14 -6102,0.57,0.78,3.52 -6103,0.57,0.78,2.19 -6104,0.57,0.78,27.31 -6105,0.57,0.78,30.24 -6106,0.57,0.78,4.23 -6107,0.57,0.78,26.2 -6108,0.57,0.78,23.2 -6109,0.701,0.74,22.53 -6110,0.701,0.74,24.59 -6111,0.701,0.74,10.77 -6112,0.701,0.74,2.4 -6113,0.701,0.74,1.15 -6114,0.701,0.74,9.47 -6115,0.701,0.74,15.31 -6116,0.701,0.74,19.04 -6117,0.544,0.877,0 -6118,0.544,0.877,0 -6119,0.544,0.877,0 -6120,0.544,0.877,0 -6121,0.544,0.877,0 -6122,0.544,0.877,0 -6123,0.544,0.877,0 -6124,0.544,0.877,0 -6125,0.544,0.877,0 -6126,0.544,0.877,0 -6127,0.544,0.877,0 -6128,0.544,0.877,0 -6129,0.544,0.877,0 -6130,0.544,0.877,0 -6131,0.544,0.877,0 -6132,0.544,0.877,0 -6133,0.544,0.877,0 -6134,0.544,0.877,0 -6135,0.544,0.877,0 -6136,0.544,0.877,0 -6137,0.544,0.877,0 -6138,0.544,0.877,0 -6139,0.544,0.877,1.03 -6140,0.544,0.877,2.09 -6141,0.544,0.877,0 -6142,0.544,0.877,0 -6143,0.544,0.877,0 -6144,0.544,0.877,0 -6145,0.544,0.877,0 -6146,0.544,0.877,0 -6147,0.544,0.877,0 -6148,0.544,0.877,0 -6149,0.544,0.877,0 -6150,0.544,0.877,0 -6151,0.544,0.877,0 -6152,0.544,0.877,0 -6153,0.544,0.877,0 -6154,0.544,0.877,0 -6155,0.544,0.877,0 -6156,0.544,0.877,0 -6157,0.544,0.877,0 -6158,0.544,0.877,0 -6159,0.544,0.877,0 -6160,0.544,0.877,0 -6161,0.544,0.877,0 -6162,0.544,0.877,0 -6163,0.544,0.877,0 -6164,0.544,0.877,0 -6165,0.544,0.877,0 -6166,0.544,0.877,0 -6167,0.544,0.877,0 -6168,0.544,0.877,0 -6169,0.544,0.877,0 -6170,0.544,0.877,0 -6171,0.544,0.877,0 -6172,0.544,0.877,0 -6173,0.544,0.877,0 -6174,0.544,0.877,0 -6175,0.544,0.877,0 -6176,0.544,0.877,0 -6177,0.544,0.877,0 -6178,0.544,0.877,0 -6179,0.544,0.877,0 -6180,0.544,0.877,0 -6181,0.544,0.877,0 -6182,0.544,0.877,0 -6183,0.544,0.877,0 -6184,0.544,0.877,0 -6185,0.544,0.877,0 -6186,0.544,0.877,0 -6187,0.544,0.877,0 -6188,0.544,0.877,0 -6189,0.544,0.877,0 -6190,0.544,0.877,0 -6191,0.544,0.877,0 -6192,0.544,0.877,0 -6193,0.544,0.877,0 -6194,0.544,0.877,0 -6195,0.544,0.877,0 -6196,0.544,0.877,0 -6197,0.544,0.877,0 -6198,0.544,0.877,0 -6199,0.544,0.877,0 -6200,0.544,0.877,0 -6201,0.544,0.877,0 -6202,0.544,0.877,0 -6203,0.544,0.877,0 -6204,0.544,0.877,0 -6205,0.544,0.877,0 -6206,0.544,0.877,0 -6207,0.544,0.877,0 -6208,0.544,0.877,0 -6209,0.544,0.877,0 -6210,0.544,0.877,0 -6211,0.544,0.877,0 -6212,0.544,0.877,0 -6213,0.544,0.877,0 -6214,0.544,0.877,0 -6215,0.544,0.877,0 -6216,0.544,0.877,0 -6217,0.544,0.877,0 -6218,0.544,0.877,0 -6219,0.544,0.877,0 -6220,0.544,0.877,0 -6221,0.544,0.877,0 -6222,0.544,0.877,0 -6223,0.544,0.877,0 -6224,0.544,0.877,0 -6225,0.544,0.877,0 -6226,0.544,0.877,0 -6227,0.544,0.877,0 -6228,0.544,0.877,0 -6229,0.544,0.877,0 -6230,0.544,0.877,0 -6231,0.544,0.877,0 -6232,0.544,0.877,0 -6233,0.544,0.877,0 -6234,0.544,0.877,0 -6235,0.544,0.877,0 -6236,0.544,0.877,10.57 -6237,0.544,0.877,4.22 -6238,0.544,0.877,21.95 -6239,0.544,0.877,0 -6240,0.544,0.877,0 -6241,0.544,0.877,0 -6242,0.544,0.877,0 -6243,0.544,0.877,0 -6244,0.544,0.877,0 -6245,0.544,0.877,0 -6246,0.544,0.877,0 -6247,0.544,0.877,0 -6248,0.544,0.877,0 -6249,0.544,0.877,0 -6250,0.544,0.877,0 -6251,0.544,0.877,0 -6252,0.544,0.877,0 -6253,0.544,0.877,0 -6254,0.544,0.877,0 -6255,0.544,0.877,0 -6256,0.544,0.877,0 -6257,0.544,0.877,0 -6258,0.544,0.877,0 -6259,0.544,0.877,0 -6260,0.544,0.877,0 -6261,0.645,0.788,0 -6262,0.645,0.788,0 -6263,0.645,0.788,0 -6264,0.645,0.788,0 -6265,0.645,0.788,0 -6266,0.645,0.788,0 -6267,0.645,0.788,0 -6268,0.645,0.788,0 -6269,0.645,0.788,0 -6270,0.645,0.788,0 -6271,0.645,0.788,0 -6272,0.645,0.788,0 -6273,0.572,0.809,0 -6274,0.572,0.809,0 -6275,0.572,0.809,0 -6276,0.572,0.809,0 -6277,0.572,0.809,0 -6278,0.572,0.809,0 -6279,0.572,0.809,0 -6280,0.572,0.809,0 -6281,0.572,0.809,0 -6282,0.572,0.809,0 -6283,0.572,0.809,0 -6284,0.572,0.809,0 -6285,0.572,0.809,0 -6286,0.572,0.809,0 -6287,0.572,0.809,0 -6288,0.572,0.809,0 -6289,0.572,0.809,0 -6290,0.572,0.809,0 -6291,0.572,0.809,0 -6292,0.572,0.809,3.07 -6293,0.572,0.809,0 -6294,0.572,0.809,0 -6295,0.572,0.809,0 -6296,0.572,0.809,0 -6297,0.645,0.788,0 -6298,0.645,0.788,0 -6299,0.645,0.788,0 -6300,0.645,0.788,0 -6301,0.645,0.788,0 -6302,0.645,0.788,0 -6303,0.645,0.788,0 -6304,0.645,0.788,0 -6305,0.645,0.788,0 -6306,0.645,0.788,0 -6307,0.645,0.788,0 -6308,0.645,0.788,0 -6309,0.645,0.788,0 -6310,0.645,0.788,0 -6311,0.645,0.788,6.77 -6312,0.645,0.788,7.84 -6313,0.645,0.788,0 -6314,0.645,0.788,0 -6315,0.645,0.788,0 -6316,0.645,0.788,0 -6317,0.645,0.788,0 -6318,0.645,0.788,0 -6319,0.645,0.788,0 -6320,0.645,0.788,0 -6321,0.572,0.809,0 -6322,0.572,0.809,0 -6323,0.572,0.809,0 -6324,0.572,0.809,0 -6325,0.572,0.809,0 -6326,0.572,0.809,0 -6327,0.572,0.809,0 -6328,0.572,0.809,0 -6329,0.572,0.809,0 -6330,0.572,0.809,0 -6331,0.572,0.809,0 -6332,0.572,0.809,0 -6333,0.664,0.79,0 -6334,0.664,0.79,0 -6335,0.664,0.79,0 -6336,0.664,0.79,0 -6337,0.664,0.79,0 -6338,0.664,0.79,0 -6339,0.664,0.79,0 -6340,0.664,0.79,0 -6341,0.664,0.79,0 -6342,0.664,0.79,0 -6343,0.664,0.79,0 -6344,0.664,0.79,0 -6345,0.656,0.759,0 -6346,0.656,0.759,0 -6347,0.656,0.759,0 -6348,0.656,0.759,0 -6349,0.656,0.759,9.59 -6350,0.656,0.759,8.1 -6351,0.656,0.759,22.54 -6352,0.656,0.759,0 -6353,0.656,0.759,0 -6354,0.656,0.759,7.36 -6355,0.656,0.759,0 -6356,0.656,0.759,13.12 -6357,0.656,0.759,0 -6358,0.656,0.759,6.63 -6359,0.656,0.759,0 -6360,0.656,0.759,0 -6361,0.656,0.759,15.77 -6362,0.656,0.759,0 -6363,0.656,0.759,3.3 -6364,0.656,0.759,0 -6365,0.656,0.759,0 -6366,0.656,0.759,0 -6367,0.656,0.759,0 -6368,0.656,0.759,0 -6369,0.664,0.79,0 -6370,0.664,0.79,0 -6371,0.664,0.79,0 -6372,0.664,0.79,0 -6373,0.664,0.79,0 -6374,0.664,0.79,0 -6375,0.664,0.79,0 -6376,0.664,0.79,0 -6377,0.664,0.79,0 -6378,0.664,0.79,0 -6379,0.664,0.79,0 -6380,0.664,0.79,0 -6381,0.664,0.79,0 -6382,0.664,0.79,0 -6383,0.664,0.79,2.04 -6384,0.664,0.79,0 -6385,0.664,0.79,0 -6386,0.664,0.79,9.34 -6387,0.664,0.79,10.88 -6388,0.664,0.79,30.66 -6389,0.664,0.79,0 -6390,0.664,0.79,0 -6391,0.664,0.79,0 -6392,0.664,0.79,0 -6393,0.656,0.759,0 -6394,0.656,0.759,0 -6395,0.656,0.759,0 -6396,0.656,0.759,0 -6397,0.656,0.759,0 -6398,0.656,0.759,0 -6399,0.656,0.759,0 -6400,0.656,0.759,0 -6401,0.656,0.759,0 -6402,0.656,0.759,0 -6403,0.656,0.759,0 -6404,0.656,0.759,0 -6405,0.594,0.871,0 -6406,0.594,0.871,0.31 -6407,0.594,0.871,1.96 -6408,0.594,0.871,2.26 -6409,0.594,0.871,5.77 -6410,0.594,0.871,13.04 -6411,0.594,0.871,2.09 -6412,0.594,0.871,1.15 -6413,0.682,0.8,28.23 -6414,0.682,0.8,12.97 -6415,0.682,0.8,0.99 -6416,0.682,0.8,0.6 -6417,0.682,0.8,1.95 -6418,0.682,0.8,0.21 -6419,0.682,0.8,0 -6420,0.682,0.8,0 -6421,0.551,0.785,24.23 -6422,0.551,0.785,24.23 -6423,0.551,0.785,28.01 -6424,0.551,0.785,18.37 -6425,0.551,0.785,0 -6426,0.551,0.785,0 -6427,0.551,0.785,0 -6428,0.551,0.785,0 -6429,0.551,0.785,0 -6430,0.551,0.785,0 -6431,0.551,0.785,0 -6432,0.551,0.785,0 -6433,0.551,0.785,9.27 -6434,0.551,0.785,0.74 -6435,0.551,0.785,4.88 -6436,0.551,0.785,0 -6437,0.682,0.8,1.65 -6438,0.682,0.8,12.4 -6439,0.682,0.8,11.67 -6440,0.682,0.8,1.77 -6441,0.682,0.8,0 -6442,0.682,0.8,0 -6443,0.682,0.8,0.94 -6444,0.682,0.8,1.38 -6445,0.594,0.871,1.97 -6446,0.594,0.871,0 -6447,0.594,0.871,1.97 -6448,0.594,0.871,3.9 -6449,0.594,0.871,0 -6450,0.594,0.871,0 -6451,0.594,0.871,0 -6452,0.594,0.871,0 -6453,0.595,0.841,0 -6454,0.595,0.841,0 -6455,0.595,0.841,6.26 -6456,0.595,0.841,0.4 -6457,0.595,0.841,0 -6458,0.595,0.841,0.7 -6459,0.595,0.841,0 -6460,0.595,0.841,3.04 -6461,0.673,0.764,0.27 -6462,0.673,0.764,5.32 -6463,0.673,0.764,1.98 -6464,0.673,0.764,0 -6465,0.673,0.764,13.57 -6466,0.673,0.764,2.46 -6467,0.673,0.764,8.38 -6468,0.673,0.764,0.93 -6469,0.555,0.784,2 -6470,0.555,0.784,0 -6471,0.555,0.784,2.01 -6472,0.555,0.784,0 -6473,0.555,0.784,0 -6474,0.555,0.784,0 -6475,0.555,0.784,0 -6476,0.555,0.784,0 -6477,0.555,0.784,0 -6478,0.555,0.784,0 -6479,0.555,0.784,0 -6480,0.555,0.784,0 -6481,0.555,0.784,2.1 -6482,0.555,0.784,0 -6483,0.555,0.784,0 -6484,0.555,0.784,0 -6485,0.673,0.764,9.81 -6486,0.673,0.764,0 -6487,0.673,0.764,1.07 -6488,0.673,0.764,0 -6489,0.673,0.764,1.35 -6490,0.673,0.764,0.93 -6491,0.673,0.764,1.72 -6492,0.673,0.764,0 -6493,0.595,0.841,0.56 -6494,0.595,0.841,2.86 -6495,0.595,0.841,18.6 -6496,0.595,0.841,15.61 -6497,0.595,0.841,8.79 -6498,0.595,0.841,9.64 -6499,0.595,0.841,35.71 -6500,0.595,0.841,19.64 -6501,0.647,0.839,13.22 -6502,0.647,0.839,12.62 -6503,0.647,0.839,11.07 -6504,0.647,0.839,10.19 -6505,0.672,0.816,25.46 -6506,0.672,0.816,31.07 -6507,0.672,0.816,5.04 -6508,0.672,0.816,11.38 -6509,0.631,0.773,12.38 -6510,0.631,0.773,3.02 -6511,0.631,0.773,29.2 -6512,0.631,0.773,28.57 -6513,0.621,0.786,7.25 -6514,0.621,0.786,8.47 -6515,0.621,0.786,19.21 -6516,0.621,0.786,8.86 -6517,0.608,0.799,0.01 -6518,0.608,0.799,6.05 -6519,0.608,0.799,5.17 -6520,0.608,0.799,17.22 -6521,0.608,0.799,14.31 -6522,0.608,0.799,0 -6523,0.608,0.799,10.67 -6524,0.608,0.799,0 -6525,0.608,0.799,3.03 -6526,0.608,0.799,4.51 -6527,0.608,0.799,0.37 -6528,0.608,0.799,0 -6529,0.608,0.799,3.52 -6530,0.608,0.799,28.05 -6531,0.608,0.799,3.77 -6532,0.608,0.799,3.32 -6533,0.561,0.777,19.58 -6534,0.588,0.811,28.93 -6535,0.471,0.733,30.58 -6536,0.497,0.741,12.11 -6537,0.607,0.754,27.86 -6538,0.607,0.754,43.4 -6539,0.607,0.754,10.76 -6540,0.607,0.754,22.75 -6541,0.675,0.837,23.8 -6542,0.675,0.837,31.96 -6543,0.675,0.837,35.48 -6544,0.675,0.837,22.34 -6545,0.675,0.837,8.73 -6546,0.675,0.837,12.14 -6547,0.675,0.837,2.36 -6548,0.675,0.837,17.59 -6549,0.579,0.778,0 -6550,0.579,0.778,0 -6551,0.579,0.778,0 -6552,0.579,0.778,0 -6553,0.579,0.778,0 -6554,0.579,0.778,0 -6555,0.579,0.778,0 -6556,0.579,0.778,0 -6557,0.579,0.778,0 -6558,0.579,0.778,0 -6559,0.579,0.778,0 -6560,0.579,0.778,0 -6561,0.579,0.778,0 -6562,0.579,0.778,0 -6563,0.579,0.778,0.19 -6564,0.579,0.778,0 -6565,0.579,0.778,0 -6566,0.579,0.778,0 -6567,0.579,0.778,0 -6568,0.579,0.778,0 -6569,0.579,0.778,0 -6570,0.579,0.778,0 -6571,0.579,0.778,0 -6572,0.579,0.778,0 -6573,0.579,0.778,0 -6574,0.579,0.778,0 -6575,0.579,0.778,0 -6576,0.579,0.778,0 -6577,0.579,0.778,0 -6578,0.579,0.778,0 -6579,0.579,0.778,0 -6580,0.579,0.778,0 -6581,0.579,0.778,3.39 -6582,0.579,0.778,0 -6583,0.579,0.778,1.5 -6584,0.579,0.778,0 -6585,0.579,0.778,0 -6586,0.579,0.778,3.38 -6587,0.579,0.778,0 -6588,0.579,0.778,0.3 -6589,0.579,0.778,0 -6590,0.579,0.778,0 -6591,0.579,0.778,0 -6592,0.579,0.778,0 -6593,0.579,0.778,0 -6594,0.579,0.778,0 -6595,0.579,0.778,0 -6596,0.579,0.778,0 -6597,0.579,0.778,0 -6598,0.579,0.778,0 -6599,0.579,0.778,0 -6600,0.579,0.778,0 -6601,0.579,0.778,0 -6602,0.579,0.778,0 -6603,0.579,0.778,0 -6604,0.579,0.778,0 -6605,0.579,0.778,0 -6606,0.579,0.778,0 -6607,0.579,0.778,0 -6608,0.579,0.778,0 -6609,0.579,0.778,0 -6610,0.579,0.778,0 -6611,0.579,0.778,0 -6612,0.579,0.778,0 -6613,0.579,0.778,0 -6614,0.579,0.778,0 -6615,0.579,0.778,0 -6616,0.579,0.778,0 -6617,0.579,0.778,0 -6618,0.579,0.778,0 -6619,0.579,0.778,0 -6620,0.579,0.778,0 -6621,0.579,0.778,0 -6622,0.579,0.778,0 -6623,0.579,0.778,0 -6624,0.579,0.778,0 -6625,0.579,0.778,0 -6626,0.579,0.778,0 -6627,0.579,0.778,0 -6628,0.579,0.778,0 -6629,0.579,0.778,0 -6630,0.579,0.778,0 -6631,0.579,0.778,0 -6632,0.579,0.778,0 -6633,0.579,0.778,0 -6634,0.579,0.778,0 -6635,0.579,0.778,0 -6636,0.579,0.778,0 -6637,0.579,0.778,0 -6638,0.579,0.778,0 -6639,0.579,0.778,0 -6640,0.579,0.778,0 -6641,0.579,0.778,0 -6642,0.579,0.778,0 -6643,0.579,0.778,0 -6644,0.579,0.778,0 -6645,0.579,0.778,0 -6646,0.579,0.778,0 -6647,0.579,0.778,0 -6648,0.579,0.778,0 -6649,0.579,0.778,0 -6650,0.579,0.778,0 -6651,0.579,0.778,0 -6652,0.579,0.778,0 -6653,0.579,0.778,0 -6654,0.579,0.778,0 -6655,0.579,0.778,0 -6656,0.579,0.778,0 -6657,0.579,0.778,0 -6658,0.579,0.778,0 -6659,0.579,0.778,0 -6660,0.579,0.778,0 -6661,0.579,0.778,0 -6662,0.579,0.778,0 -6663,0.579,0.778,0 -6664,0.579,0.778,0 -6665,0.579,0.778,0 -6666,0.579,0.778,0 -6667,0.579,0.778,0 -6668,0.579,0.778,0 -6669,0.579,0.778,0 -6670,0.579,0.778,0 -6671,0.579,0.778,0 -6672,0.579,0.778,0 -6673,0.579,0.778,0 -6674,0.579,0.778,0 -6675,0.579,0.778,0 -6676,0.579,0.778,0 -6677,0.579,0.778,0 -6678,0.579,0.778,0 -6679,0.579,0.778,0 -6680,0.579,0.778,0 -6681,0.579,0.778,0 -6682,0.579,0.778,0 -6683,0.579,0.778,0 -6684,0.579,0.778,0 -6685,0.579,0.778,0 -6686,0.579,0.778,0 -6687,0.579,0.778,0 -6688,0.579,0.778,0 -6689,0.579,0.778,0 -6690,0.579,0.778,0 -6691,0.579,0.778,0 -6692,0.579,0.778,0 -6693,0.589,0.825,0 -6694,0.589,0.825,0 -6695,0.589,0.825,3.59 -6696,0.589,0.825,11.27 -6697,0.589,0.825,0 -6698,0.589,0.825,2.49 -6699,0.589,0.825,2.99 -6700,0.589,0.825,0 -6701,0.589,0.825,0.48 -6702,0.589,0.825,0 -6703,0.589,0.825,0 -6704,0.589,0.825,0 -6705,0.58,0.82,0 -6706,0.58,0.82,0 -6707,0.58,0.82,0 -6708,0.58,0.82,0 -6709,0.58,0.82,0 -6710,0.58,0.82,0 -6711,0.58,0.82,0 -6712,0.58,0.82,0 -6713,0.58,0.82,0 -6714,0.58,0.82,0 -6715,0.58,0.82,0 -6716,0.58,0.82,0 -6717,0.58,0.82,0 -6718,0.58,0.82,0 -6719,0.58,0.82,0 -6720,0.58,0.82,0 -6721,0.58,0.82,0 -6722,0.58,0.82,0 -6723,0.58,0.82,0 -6724,0.58,0.82,0 -6725,0.58,0.82,0 -6726,0.58,0.82,0 -6727,0.58,0.82,0 -6728,0.58,0.82,0 -6729,0.589,0.825,0 -6730,0.589,0.825,0 -6731,0.589,0.825,0 -6732,0.589,0.825,0 -6733,0.589,0.825,4.72 -6734,0.589,0.825,0 -6735,0.589,0.825,0 -6736,0.589,0.825,0 -6737,0.589,0.825,17.75 -6738,0.589,0.825,7.17 -6739,0.589,0.825,0 -6740,0.589,0.825,0 -6741,0.589,0.825,6.83 -6742,0.589,0.825,0 -6743,0.589,0.825,1.21 -6744,0.589,0.825,0 -6745,0.589,0.825,0 -6746,0.589,0.825,0 -6747,0.589,0.825,0 -6748,0.589,0.825,0 -6749,0.589,0.825,0 -6750,0.589,0.825,0 -6751,0.589,0.825,0 -6752,0.589,0.825,0 -6753,0.58,0.82,0 -6754,0.58,0.82,0 -6755,0.58,0.82,0 -6756,0.58,0.82,0 -6757,0.58,0.82,0 -6758,0.58,0.82,0 -6759,0.58,0.82,0 -6760,0.58,0.82,0 -6761,0.58,0.82,0 -6762,0.58,0.82,0 -6763,0.58,0.82,0 -6764,0.58,0.82,0 -6765,0.616,0.815,0 -6766,0.616,0.815,0 -6767,0.616,0.815,0 -6768,0.616,0.815,0 -6769,0.616,0.815,0 -6770,0.616,0.815,0 -6771,0.616,0.815,0 -6772,0.616,0.815,0 -6773,0.616,0.815,0 -6774,0.616,0.815,0 -6775,0.616,0.815,0 -6776,0.616,0.815,0 -6777,0.61,0.822,0 -6778,0.61,0.822,0 -6779,0.61,0.822,0 -6780,0.61,0.822,0 -6781,0.61,0.822,0 -6782,0.61,0.822,0 -6783,0.61,0.822,0 -6784,0.61,0.822,0 -6785,0.61,0.822,12.22 -6786,0.61,0.822,0 -6787,0.61,0.822,22.34 -6788,0.61,0.822,0 -6789,0.61,0.822,0 -6790,0.61,0.822,4.13 -6791,0.61,0.822,17.57 -6792,0.61,0.822,5.7 -6793,0.61,0.822,3.24 -6794,0.61,0.822,0 -6795,0.61,0.822,0 -6796,0.61,0.822,0 -6797,0.61,0.822,0 -6798,0.61,0.822,0 -6799,0.61,0.822,0 -6800,0.61,0.822,0 -6801,0.616,0.815,0 -6802,0.616,0.815,0 -6803,0.616,0.815,0 -6804,0.616,0.815,0 -6805,0.616,0.815,0 -6806,0.616,0.815,0 -6807,0.616,0.815,0 -6808,0.616,0.815,0 -6809,0.616,0.815,0 -6810,0.616,0.815,0 -6811,0.616,0.815,0 -6812,0.616,0.815,0 -6813,0.616,0.815,0 -6814,0.616,0.815,0 -6815,0.616,0.815,0 -6816,0.616,0.815,0 -6817,0.616,0.815,0 -6818,0.616,0.815,0 -6819,0.616,0.815,0 -6820,0.616,0.815,0 -6821,0.616,0.815,0 -6822,0.616,0.815,0 -6823,0.616,0.815,0 -6824,0.616,0.815,0 -6825,0.61,0.822,0 -6826,0.61,0.822,0 -6827,0.61,0.822,0 -6828,0.61,0.822,0 -6829,0.61,0.822,7.33 -6830,0.61,0.822,0 -6831,0.61,0.822,0 -6832,0.61,0.822,0 -6833,0.61,0.822,7.08 -6834,0.61,0.822,3.45 -6835,0.61,0.822,0 -6836,0.61,0.822,0 -6837,0.553,0.852,15.8 -6838,0.553,0.852,3.26 -6839,0.571,0.761,2.29 -6840,0.571,0.761,0.01 -6841,0.633,0.772,11.54 -6842,0.633,0.772,18.46 -6843,0.717,0.843,26.78 -6844,0.717,0.843,0 -6845,0.717,0.843,16.83 -6846,0.717,0.843,0 -6847,0.7,0.809,1.2 -6848,0.7,0.809,1.56 -6849,0.7,0.809,0.03 -6850,0.7,0.809,0.41 -6851,0.7,0.809,0 -6852,0.7,0.809,0 -6853,0.7,0.809,0.02 -6854,0.7,0.809,0.15 -6855,0.7,0.809,0 -6856,0.7,0.809,1 -6857,0.7,0.809,9.43 -6858,0.7,0.809,0 -6859,0.7,0.809,6.86 -6860,0.7,0.809,0 -6861,0.7,0.809,0 -6862,0.7,0.809,0 -6863,0.663,0.817,26.22 -6864,0.663,0.817,13.3 -6865,0.663,0.817,31.09 -6866,0.663,0.817,19.83 -6867,0.588,0.812,9.22 -6868,0.588,0.812,31.88 -6869,0.588,0.812,27.11 -6870,0.588,0.812,13.74 -6871,0.578,0.826,10.78 -6872,0.578,0.826,0.36 -6873,0.578,0.826,27.28 -6874,0.578,0.826,31.55 -6875,0.488,0.898,50.62 -6876,0.488,0.898,36.45 -6877,0.488,0.898,45.41 -6878,0.488,0.898,49.73 -6879,0.601,0.848,43.19 -6880,0.578,0.787,51.04 -6881,0.643,0.847,32.14 -6882,0.58,0.774,37.89 -6883,0.589,0.825,33.39 -6884,0.514,0.903,49.24 -6885,0.57,0.854,35.27 -6886,0.766,0.887,46.28 -6887,0.594,0.905,38.61 -6888,0.619,0.804,25.51 -6889,0.79,0.895,56.93 -6890,0.66,0.788,23.69 -6891,0.646,0.8,29.32 -6892,0.646,0.8,15.18 -6893,0.646,0.8,5.12 -6894,0.646,0.8,2.3 -6895,0.601,0.762,6.37 -6896,0.601,0.762,12.59 -6897,0.601,0.762,5.66 -6898,0.601,0.762,20.97 -6899,0.601,0.762,14.95 -6900,0.601,0.762,18.22 -6901,0.601,0.762,30.28 -6902,0.601,0.762,15.94 -6903,0.601,0.762,32.96 -6904,0.601,0.762,24.05 -6905,0.601,0.762,27.27 -6906,0.601,0.762,17.71 -6907,0.601,0.762,0.27 -6908,0.601,0.762,0.2 -6909,0.601,0.762,10.93 -6910,0.601,0.762,27.2 -6911,0.58,0.912,11.18 -6912,0.58,0.912,11.36 -6913,0.58,0.912,7.77 -6914,0.58,0.912,19.51 -6915,0.672,0.891,36.35 -6916,0.613,0.865,14.31 -6917,0.672,0.892,0 -6918,0.596,0.931,7.37 -6919,0.619,0.857,45.78 -6920,0.619,0.857,45.67 -6921,0.619,0.857,3.36 -6922,0.619,0.857,0 -6923,0.592,0.894,46.49 -6924,0.592,0.894,27.07 -6925,0.592,0.894,39.28 -6926,0.592,0.894,4.26 -6927,0.626,0.879,2.39 -6928,0.626,0.879,3.8 -6929,0.626,0.879,0 -6930,0.626,0.879,6.08 -6931,0.669,0.888,2.2 -6932,0.669,0.888,0.21 -6933,0.669,0.888,0 -6934,0.669,0.888,2.57 -6935,0.641,0.913,2.65 -6936,0.641,0.913,14.69 -6937,0.641,0.913,22.98 -6938,0.641,0.913,35.26 -6939,0.581,0.937,30.91 -6940,0.566,0.864,21.65 -6941,0.501,0.925,35.04 -6942,0.436,0.911,18.48 -6943,0.38,0.811,28.77 -6944,0.38,0.811,33.03 -6945,0.38,0.811,13.75 -6946,0.38,0.811,0 -6947,0.38,0.811,0.19 -6948,0.38,0.811,0 -6949,0.38,0.811,0 -6950,0.38,0.811,0 -6951,0.38,0.811,0 -6952,0.38,0.811,0 -6953,0.38,0.811,0 -6954,0.38,0.811,0 -6955,0.38,0.811,3.94 -6956,0.38,0.811,0 -6957,0.38,0.811,10.21 -6958,0.38,0.811,12.03 -6959,0.489,0.923,35.64 -6960,0.489,0.923,22.95 -6961,0.489,0.923,5.04 -6962,0.489,0.923,16.64 -6963,0.615,0.901,36.24 -6964,0.615,0.901,22.45 -6965,0.615,0.901,33.85 -6966,0.615,0.901,21.37 -6967,0.643,0.879,13.56 -6968,0.643,0.879,22.59 -6969,0.643,0.879,17.5 -6970,0.643,0.879,14.26 -6971,0.637,0.878,0 -6972,0.637,0.878,0 -6973,0.637,0.878,0.29 -6974,0.637,0.878,0 -6975,0.579,0.559,19.94 -6976,0.579,0.559,0 -6977,0.579,0.559,12.18 -6978,0.579,0.559,0 -6979,0.579,0.559,0 -6980,0.579,0.559,0 -6981,0.579,0.559,0 -6982,0.579,0.559,0 -6983,0.579,0.559,0 -6984,0.579,0.559,0 -6985,0.579,0.559,0 -6986,0.579,0.559,0 -6987,0.573,0.474,0 -6988,0.573,0.474,0 -6989,0.573,0.474,0 -6990,0.573,0.474,0 -6991,0.573,0.474,0 -6992,0.573,0.474,0 -6993,0.573,0.474,0 -6994,0.573,0.474,0 -6995,0.573,0.474,0 -6996,0.573,0.474,0 -6997,0.573,0.474,0 -6998,0.573,0.474,0 -6999,0.573,0.474,0 -7000,0.573,0.474,0 -7001,0.573,0.474,0 -7002,0.573,0.474,0 -7003,0.573,0.474,0 -7004,0.573,0.474,0 -7005,0.573,0.474,0 -7006,0.573,0.474,0 -7007,0.573,0.474,0 -7008,0.573,0.474,0 -7009,0.573,0.474,0 -7010,0.573,0.474,0 -7011,0.579,0.559,0 -7012,0.579,0.559,0 -7013,0.579,0.559,0 -7014,0.579,0.559,0 -7015,0.579,0.559,0 -7016,0.579,0.559,1.47 -7017,0.579,0.559,0.1 -7018,0.579,0.559,0 -7019,0.579,0.559,0 -7020,0.579,0.559,0 -7021,0.579,0.559,5.01 -7022,0.579,0.559,0 -7023,0.579,0.559,5.4 -7024,0.579,0.559,1.67 -7025,0.579,0.559,0 -7026,0.579,0.559,0.99 -7027,0.579,0.559,1.97 -7028,0.579,0.559,0 -7029,0.579,0.559,0 -7030,0.579,0.559,0 -7031,0.579,0.559,0 -7032,0.579,0.559,0 -7033,0.579,0.559,0 -7034,0.579,0.559,0 -7035,0.573,0.474,0 -7036,0.573,0.474,0 -7037,0.573,0.474,1.02 -7038,0.573,0.474,1.06 -7039,0.573,0.474,0 -7040,0.573,0.474,0 -7041,0.573,0.474,0 -7042,0.573,0.474,0 -7043,0.573,0.474,0 -7044,0.573,0.474,0 -7045,0.573,0.474,0 -7046,0.573,0.474,0 -7047,0.669,0.65,0 -7048,0.669,0.65,0 -7049,0.669,0.65,0 -7050,0.669,0.65,0 -7051,0.669,0.65,0 -7052,0.669,0.65,0 -7053,0.669,0.65,0 -7054,0.669,0.65,0 -7055,0.669,0.65,2.88 -7056,0.669,0.65,1.35 -7057,0.669,0.65,10.25 -7058,0.669,0.65,0.03 -7059,0.667,0.649,0 -7060,0.667,0.649,0 -7061,0.667,0.649,6.86 -7062,0.667,0.649,16.81 -7063,0.667,0.649,0 -7064,0.667,0.649,0 -7065,0.667,0.649,0 -7066,0.667,0.649,0 -7067,0.667,0.649,0 -7068,0.667,0.649,0 -7069,0.667,0.649,0 -7070,0.667,0.649,0 -7071,0.667,0.649,0 -7072,0.667,0.649,0 -7073,0.667,0.649,0 -7074,0.667,0.649,0 -7075,0.667,0.649,10.04 -7076,0.667,0.649,25.49 -7077,0.667,0.649,0 -7078,0.667,0.649,0 -7079,0.667,0.649,31.14 -7080,0.667,0.649,18.44 -7081,0.667,0.649,0 -7082,0.667,0.649,0.74 -7083,0.669,0.65,15.15 -7084,0.669,0.65,8.56 -7085,0.669,0.65,17.98 -7086,0.669,0.65,2.02 -7087,0.669,0.65,0 -7088,0.669,0.65,0 -7089,0.669,0.65,0 -7090,0.669,0.65,0 -7091,0.669,0.65,0 -7092,0.669,0.65,0 -7093,0.669,0.65,0 -7094,0.669,0.65,0 -7095,0.669,0.65,0 -7096,0.669,0.65,0 -7097,0.669,0.65,0 -7098,0.669,0.65,0 -7099,0.669,0.65,0 -7100,0.669,0.65,0 -7101,0.669,0.65,0 -7102,0.669,0.65,0 -7103,0.669,0.65,3.69 -7104,0.669,0.65,0 -7105,0.669,0.65,0 -7106,0.669,0.65,0 -7107,0.667,0.649,0 -7108,0.667,0.649,0.02 -7109,0.667,0.649,0 -7110,0.667,0.649,0 -7111,0.667,0.649,0 -7112,0.667,0.649,0 -7113,0.667,0.649,0 -7114,0.667,0.649,0 -7115,0.667,0.649,0 -7116,0.667,0.649,0 -7117,0.667,0.649,0 -7118,0.667,0.649,0 -7119,0.669,0.585,0 -7120,0.669,0.585,0 -7121,0.669,0.585,0 -7122,0.669,0.585,0 -7123,0.669,0.585,0 -7124,0.669,0.585,0 -7125,0.669,0.585,0 -7126,0.669,0.585,0 -7127,0.669,0.585,0 -7128,0.669,0.585,0.04 -7129,0.669,0.585,0 -7130,0.669,0.585,0 -7131,0.551,0.631,0 -7132,0.551,0.631,0.73 -7133,0.551,0.631,0 -7134,0.551,0.631,0.35 -7135,0.551,0.631,6.06 -7136,0.551,0.631,19.05 -7137,0.551,0.631,26.64 -7138,0.551,0.631,17.12 -7139,0.551,0.631,9.03 -7140,0.551,0.631,30.91 -7141,0.551,0.631,24.08 -7142,0.551,0.631,18.07 -7143,0.551,0.631,17.46 -7144,0.551,0.631,11 -7145,0.551,0.631,0 -7146,0.551,0.631,13.7 -7147,0.551,0.631,15.01 -7148,0.551,0.631,14.1 -7149,0.551,0.631,0.04 -7150,0.551,0.631,0 -7151,0.551,0.631,0 -7152,0.551,0.631,1.66 -7153,0.551,0.631,0 -7154,0.551,0.631,2.04 -7155,0.669,0.585,0 -7156,0.669,0.585,0 -7157,0.669,0.585,0 -7158,0.669,0.585,0 -7159,0.669,0.585,0 -7160,0.669,0.585,0 -7161,0.669,0.585,0 -7162,0.669,0.585,0 -7163,0.669,0.585,0 -7164,0.669,0.585,0 -7165,0.669,0.585,5.96 -7166,0.669,0.585,0 -7167,0.669,0.585,0 -7168,0.669,0.585,0 -7169,0.669,0.585,10.61 -7170,0.669,0.585,1.99 -7171,0.669,0.585,0 -7172,0.669,0.585,0 -7173,0.669,0.585,0 -7174,0.669,0.585,0 -7175,0.669,0.585,0 -7176,0.669,0.585,0 -7177,0.669,0.585,0 -7178,0.669,0.585,0 -7179,0.551,0.631,0 -7180,0.551,0.631,0.56 -7181,0.551,0.631,0 -7182,0.551,0.631,0 -7183,0.551,0.631,0 -7184,0.551,0.631,0 -7185,0.551,0.631,0 -7186,0.551,0.631,0 -7187,0.551,0.631,0 -7188,0.551,0.631,4.46 -7189,0.551,0.631,0 -7190,0.551,0.631,0 -7191,0.64,0.82,0 -7192,0.64,0.82,0 -7193,0.64,0.82,0 -7194,0.64,0.82,0 -7195,0.64,0.82,0 -7196,0.64,0.82,0 -7197,0.64,0.82,0 -7198,0.64,0.82,0 -7199,0.64,0.82,0 -7200,0.64,0.82,0 -7201,0.64,0.82,0 -7202,0.64,0.82,1.52 -7203,0.688,0.697,0 -7204,0.688,0.697,0 -7205,0.688,0.697,0 -7206,0.688,0.697,0 -7207,0.688,0.697,3.43 -7208,0.688,0.697,0 -7209,0.688,0.697,0 -7210,0.688,0.697,0 -7211,0.688,0.697,11.44 -7212,0.688,0.697,19.83 -7213,0.688,0.697,2.44 -7214,0.688,0.697,0.63 -7215,0.688,0.697,0 -7216,0.688,0.697,0 -7217,0.688,0.697,1.03 -7218,0.688,0.697,22.28 -7219,0.688,0.697,0 -7220,0.688,0.697,0 -7221,0.688,0.697,5.91 -7222,0.688,0.697,0 -7223,0.688,0.697,0 -7224,0.688,0.697,0 -7225,0.688,0.697,0 -7226,0.688,0.697,1.86 -7227,0.64,0.82,0 -7228,0.64,0.82,0 -7229,0.64,0.82,9.97 -7230,0.64,0.82,25.21 -7231,0.64,0.82,0.01 -7232,0.64,0.82,0 -7233,0.64,0.82,19.1 -7234,0.64,0.82,28.5 -7235,0.64,0.82,0 -7236,0.64,0.82,0 -7237,0.64,0.82,4.77 -7238,0.64,0.82,0 -7239,0.64,0.82,0 -7240,0.64,0.82,0 -7241,0.64,0.82,0 -7242,0.64,0.82,0 -7243,0.64,0.82,0 -7244,0.64,0.82,0 -7245,0.64,0.82,0 -7246,0.64,0.82,0 -7247,0.64,0.82,14.28 -7248,0.64,0.82,25.87 -7249,0.64,0.82,6.03 -7250,0.64,0.82,0 -7251,0.688,0.697,0 -7252,0.688,0.697,5.22 -7253,0.688,0.697,0 -7254,0.688,0.697,0.12 -7255,0.688,0.697,7.96 -7256,0.688,0.697,0 -7257,0.688,0.697,0 -7258,0.688,0.697,0 -7259,0.688,0.697,20.93 -7260,0.688,0.697,24.17 -7261,0.688,0.697,2.1 -7262,0.688,0.697,0 -7263,0.662,0.871,0 -7264,0.662,0.871,0 -7265,0.662,0.871,0 -7266,0.662,0.871,0.06 -7267,0.659,0.872,7 -7268,0.659,0.872,30.45 -7269,0.659,0.872,17.54 -7270,0.659,0.872,0 -7271,0.479,0.859,19.96 -7272,0.479,0.859,0.24 -7273,0.479,0.859,3.37 -7274,0.479,0.859,0 -7275,0.479,0.859,0.19 -7276,0.479,0.859,0.37 -7277,0.479,0.859,0 -7278,0.479,0.859,16.75 -7279,0.548,0.803,34.46 -7280,0.548,0.803,23.42 -7281,0.548,0.803,17.89 -7282,0.548,0.803,0 -7283,0.548,0.803,19.04 -7284,0.548,0.803,2.1 -7285,0.548,0.803,1.91 -7286,0.548,0.803,0 -7287,0.548,0.803,1.98 -7288,0.548,0.803,16.83 -7289,0.548,0.803,1.95 -7290,0.548,0.803,28.67 -7291,0.548,0.803,30.01 -7292,0.548,0.803,23.75 -7293,0.548,0.803,34.32 -7294,0.548,0.803,23.38 -7295,0.479,0.859,0 -7296,0.479,0.859,6.78 -7297,0.479,0.859,0 -7298,0.479,0.859,8.66 -7299,0.479,0.859,0 -7300,0.479,0.859,0 -7301,0.479,0.859,0 -7302,0.479,0.859,0 -7303,0.492,0.912,42.43 -7304,0.492,0.912,3.52 -7305,0.492,0.912,31.98 -7306,0.492,0.912,2.34 -7307,0.688,0.879,11.6 -7308,0.688,0.879,38.7 -7309,0.688,0.879,4.02 -7310,0.688,0.879,41.69 -7311,0.704,0.919,5.91 -7312,0.704,0.919,41.73 -7313,0.704,0.919,26.73 -7314,0.704,0.919,23.23 -7315,0.587,0.884,27.1 -7316,0.587,0.884,6.73 -7317,0.587,0.884,6.15 -7318,0.587,0.884,3.35 -7319,0.579,0.877,2.94 -7320,0.579,0.877,6.5 -7321,0.579,0.877,17.97 -7322,0.579,0.877,15.89 -7323,0.464,0.857,7.97 -7324,0.464,0.857,9.19 -7325,0.464,0.857,2.45 -7326,0.464,0.857,2.73 -7327,0.518,0.838,21.23 -7328,0.518,0.838,20.91 -7329,0.518,0.838,21.91 -7330,0.518,0.838,0.01 -7331,0.518,0.838,20.84 -7332,0.518,0.838,1.71 -7333,0.518,0.838,2.11 -7334,0.518,0.838,0 -7335,0.518,0.838,0 -7336,0.518,0.838,0.53 -7337,0.518,0.838,2.02 -7338,0.518,0.838,0.87 -7339,0.518,0.838,0.01 -7340,0.518,0.838,0 -7341,0.518,0.838,22.17 -7342,0.518,0.838,7.01 -7343,0.542,0.84,19.08 -7344,0.542,0.84,32.86 -7345,0.542,0.84,4.42 -7346,0.542,0.84,0 -7347,0.546,0.859,18.27 -7348,0.546,0.859,16.9 -7349,0.546,0.859,44.63 -7350,0.546,0.859,11.6 -7351,0.56,0.906,4.8 -7352,0.56,0.906,2.33 -7353,0.56,0.906,3.74 -7354,0.56,0.906,23 -7355,0.589,0.94,15.11 -7356,0.589,0.94,7.93 -7357,0.589,0.94,0 -7358,0.589,0.94,0 -7359,0.532,0.844,0 -7360,0.532,0.844,0 -7361,0.532,0.844,0 -7362,0.532,0.844,0 -7363,0.532,0.844,6.55 -7364,0.532,0.844,11.31 -7365,0.532,0.844,0 -7366,0.532,0.844,2.09 -7367,0.626,0.795,41.88 -7368,0.626,0.795,9.54 -7369,0.626,0.795,0.07 -7370,0.626,0.795,12.9 -7371,0.683,0.756,0 -7372,0.683,0.756,0 -7373,0.683,0.756,0 -7374,0.683,0.756,0 -7375,0.683,0.757,0 -7376,0.683,0.757,0 -7377,0.683,0.757,0 -7378,0.683,0.757,0.87 -7379,0.683,0.757,8.66 -7380,0.683,0.757,0.64 -7381,0.683,0.757,6.89 -7382,0.683,0.757,1.14 -7383,0.683,0.757,0.84 -7384,0.683,0.757,1.57 -7385,0.683,0.757,4.72 -7386,0.683,0.757,2.14 -7387,0.683,0.757,0 -7388,0.683,0.757,0.99 -7389,0.683,0.757,9.64 -7390,0.683,0.757,0 -7391,0.683,0.757,0 -7392,0.683,0.757,0 -7393,0.683,0.757,0.46 -7394,0.683,0.757,0.04 -7395,0.613,0.8,0 -7396,0.613,0.8,0 -7397,0.613,0.8,0 -7398,0.613,0.8,0 -7399,0.532,0.844,0 -7400,0.532,0.844,2.05 -7401,0.532,0.844,0 -7402,0.532,0.844,2.07 -7403,0.532,0.844,0 -7404,0.532,0.844,0 -7405,0.532,0.844,0 -7406,0.532,0.844,0 -7407,0.572,0.894,0 -7408,0.572,0.894,0 -7409,0.572,0.894,0 -7410,0.572,0.894,0 -7411,0.572,0.894,0 -7412,0.572,0.894,0 -7413,0.572,0.894,0 -7414,0.572,0.894,0 -7415,0.572,0.894,0 -7416,0.572,0.894,0 -7417,0.572,0.894,0 -7418,0.572,0.894,0 -7419,0.572,0.894,0 -7420,0.572,0.894,0 -7421,0.572,0.894,0 -7422,0.572,0.894,0 -7423,0.572,0.894,0 -7424,0.572,0.894,2.31 -7425,0.572,0.894,0 -7426,0.572,0.894,7.45 -7427,0.572,0.894,5.5 -7428,0.572,0.894,0 -7429,0.572,0.894,5.83 -7430,0.572,0.894,0 -7431,0.572,0.894,0 -7432,0.572,0.894,0 -7433,0.572,0.894,0 -7434,0.572,0.894,0 -7435,0.572,0.894,0 -7436,0.572,0.894,0.04 -7437,0.572,0.894,0 -7438,0.572,0.894,0 -7439,0.572,0.894,0 -7440,0.572,0.894,0 -7441,0.572,0.894,0 -7442,0.572,0.894,0 -7443,0.572,0.894,0 -7444,0.572,0.894,0 -7445,0.572,0.894,0 -7446,0.572,0.894,0 -7447,0.572,0.894,0 -7448,0.572,0.894,0 -7449,0.572,0.894,0 -7450,0.572,0.894,0 -7451,0.572,0.894,0 -7452,0.572,0.894,0 -7453,0.572,0.894,0 -7454,0.572,0.894,0 -7455,0.572,0.894,0 -7456,0.572,0.894,0 -7457,0.572,0.894,0 -7458,0.572,0.894,0 -7459,0.572,0.894,0 -7460,0.572,0.894,0 -7461,0.572,0.894,0 -7462,0.572,0.894,0 -7463,0.572,0.894,0 -7464,0.572,0.894,0 -7465,0.572,0.894,0 -7466,0.572,0.894,0 -7467,0.572,0.894,0 -7468,0.572,0.894,0 -7469,0.572,0.894,0 -7470,0.572,0.894,0 -7471,0.572,0.894,0 -7472,0.572,0.894,0 -7473,0.572,0.894,0 -7474,0.572,0.894,0 -7475,0.572,0.894,0 -7476,0.572,0.894,0 -7477,0.572,0.894,0 -7478,0.572,0.894,0 -7479,0.572,0.894,0 -7480,0.572,0.894,0 -7481,0.572,0.894,0 -7482,0.572,0.894,0 -7483,0.572,0.894,0 -7484,0.572,0.894,0 -7485,0.572,0.894,0 -7486,0.572,0.894,0 -7487,0.572,0.894,0 -7488,0.572,0.894,0 -7489,0.572,0.894,0 -7490,0.572,0.894,0 -7491,0.572,0.894,0 -7492,0.572,0.894,0 -7493,0.572,0.894,0 -7494,0.572,0.894,0 -7495,0.572,0.894,0 -7496,0.572,0.894,0 -7497,0.572,0.894,0 -7498,0.572,0.894,0 -7499,0.572,0.894,0 -7500,0.572,0.894,0 -7501,0.572,0.894,0 -7502,0.572,0.894,0 -7503,0.572,0.894,2.29 -7504,0.572,0.894,0 -7505,0.572,0.894,2.23 -7506,0.572,0.894,0 -7507,0.572,0.894,0 -7508,0.572,0.894,0 -7509,0.572,0.894,0 -7510,0.572,0.894,0 -7511,0.572,0.894,0 -7512,0.572,0.894,0 -7513,0.572,0.894,0 -7514,0.572,0.894,0 -7515,0.572,0.894,0 -7516,0.572,0.894,0 -7517,0.572,0.894,0 -7518,0.572,0.894,0 -7519,0.572,0.894,0 -7520,0.572,0.894,0 -7521,0.572,0.894,0 -7522,0.572,0.894,0 -7523,0.572,0.894,0 -7524,0.572,0.894,0 -7525,0.572,0.894,0 -7526,0.572,0.894,0 -7527,0.572,0.894,0 -7528,0.572,0.894,0 -7529,0.572,0.894,0 -7530,0.572,0.894,0 -7531,0.572,0.894,0 -7532,0.572,0.894,0 -7533,0.572,0.894,0 -7534,0.572,0.894,0 -7535,0.572,0.894,0 -7536,0.572,0.894,0 -7537,0.572,0.894,0 -7538,0.572,0.894,0 -7539,0.572,0.894,0 -7540,0.572,0.894,0 -7541,0.572,0.894,0 -7542,0.572,0.894,0 -7543,0.572,0.894,0 -7544,0.572,0.894,0 -7545,0.572,0.894,0 -7546,0.572,0.894,0 -7547,0.572,0.894,0 -7548,0.572,0.894,0 -7549,0.572,0.894,0 -7550,0.572,0.894,0 -7551,0.572,0.894,0 -7552,0.572,0.894,0 -7553,0.572,0.894,0 -7554,0.572,0.894,0 -7555,0.572,0.894,0 -7556,0.572,0.894,0 -7557,0.572,0.894,0.58 -7558,0.572,0.894,0 -7559,0.572,0.894,0 -7560,0.572,0.894,0 -7561,0.572,0.894,0 -7562,0.572,0.894,0 -7563,0.572,0.894,0 -7564,0.572,0.894,0 -7565,0.572,0.894,0 -7566,0.572,0.894,0 -7567,0.572,0.894,0 -7568,0.572,0.894,0 -7569,0.572,0.894,0 -7570,0.572,0.894,0 -7571,0.572,0.894,0 -7572,0.572,0.894,0 -7573,0.572,0.894,0 -7574,0.572,0.894,0 -7575,0.572,0.894,0 -7576,0.572,0.894,0 -7577,0.572,0.894,0 -7578,0.572,0.894,0 -7579,0.572,0.894,0 -7580,0.572,0.894,0 -7581,0.572,0.894,0 -7582,0.572,0.894,0 -7583,0.572,0.894,0 -7584,0.572,0.894,0 -7585,0.572,0.894,0 -7586,0.572,0.894,0 -7587,0.572,0.894,0 -7588,0.572,0.894,0 -7589,0.572,0.894,0 -7590,0.572,0.894,0 -7591,0.572,0.894,0 -7592,0.572,0.894,0 -7593,0.572,0.894,0 -7594,0.572,0.894,0 -7595,0.572,0.894,0 -7596,0.572,0.894,0 -7597,0.572,0.894,0 -7598,0.572,0.894,0 -7599,0.572,0.894,0 -7600,0.572,0.894,0 -7601,0.572,0.894,0 -7602,0.572,0.894,0 -7603,0.572,0.894,0 -7604,0.572,0.894,0 -7605,0.572,0.894,0 -7606,0.572,0.894,0 -7607,0.572,0.894,0 -7608,0.572,0.894,0 -7609,0.572,0.894,0 -7610,0.572,0.894,0 -7611,0.572,0.894,0 -7612,0.572,0.894,0 -7613,0.572,0.894,0 -7614,0.572,0.894,0 -7615,0.572,0.894,0 -7616,0.572,0.894,0 -7617,0.572,0.894,0 -7618,0.572,0.894,0 -7619,0.572,0.894,0 -7620,0.572,0.894,0 -7621,0.572,0.894,0 -7622,0.572,0.894,0 -7623,0.572,0.894,0 -7624,0.572,0.894,0 -7625,0.572,0.894,0 -7626,0.572,0.894,0 -7627,0.572,0.894,0 -7628,0.572,0.894,0 -7629,0.572,0.894,0 -7630,0.572,0.894,0 -7631,0.572,0.894,0 -7632,0.572,0.894,0 -7633,0.572,0.894,0 -7634,0.572,0.894,0 -7635,0.572,0.894,0 -7636,0.572,0.894,0 -7637,0.572,0.894,0 -7638,0.572,0.894,0 -7639,0.572,0.894,0 -7640,0.572,0.894,0 -7641,0.572,0.894,0 -7642,0.572,0.894,0 -7643,0.572,0.894,0 -7644,0.572,0.894,0 -7645,0.572,0.894,0 -7646,0.572,0.894,0 -7647,0.572,0.894,0 -7648,0.572,0.894,0 -7649,0.572,0.894,0 -7650,0.572,0.894,0 -7651,0.572,0.894,0 -7652,0.572,0.894,0 -7653,0.572,0.894,0 -7654,0.572,0.894,0 -7655,0.572,0.894,0 -7656,0.572,0.894,0 -7657,0.572,0.894,0 -7658,0.572,0.894,0 -7659,0.572,0.894,0 -7660,0.572,0.894,0 -7661,0.572,0.894,0 -7662,0.572,0.894,0 -7663,0.572,0.894,0 -7664,0.572,0.894,0 -7665,0.572,0.894,0 -7666,0.572,0.894,0 -7667,0.572,0.894,0 -7668,0.572,0.894,0.43 -7669,0.572,0.894,0 -7670,0.572,0.894,0.5 -7671,0.572,0.894,0 -7672,0.572,0.894,0 -7673,0.572,0.894,0 -7674,0.572,0.894,0 -7675,0.572,0.894,0 -7676,0.572,0.894,0 -7677,0.572,0.894,0 -7678,0.572,0.894,0 -7679,0.572,0.894,0 -7680,0.572,0.894,0 -7681,0.572,0.894,0 -7682,0.572,0.894,0 -7683,0.572,0.894,0 -7684,0.572,0.894,0 -7685,0.572,0.894,0 -7686,0.572,0.894,0 -7687,0.572,0.894,0 -7688,0.572,0.894,0 -7689,0.572,0.894,0 -7690,0.572,0.894,0 -7691,0.572,0.894,0 -7692,0.572,0.894,0 -7693,0.572,0.894,0 -7694,0.572,0.894,0 -7695,0.569,0.894,14.35 -7696,0.569,0.894,7.59 -7697,0.569,0.894,18.44 -7698,0.569,0.894,16.65 -7699,0.569,0.894,5.41 -7700,0.569,0.894,0.01 -7701,0.569,0.894,29.69 -7702,0.569,0.894,6.2 -7703,0.569,0.894,0 -7704,0.569,0.894,0 -7705,0.569,0.894,0 -7706,0.569,0.894,0 -7707,0.569,0.894,0 -7708,0.569,0.894,0 -7709,0.569,0.894,0 -7710,0.569,0.894,0 -7711,0.569,0.894,0 -7712,0.569,0.894,0 -7713,0.569,0.894,0 -7714,0.569,0.894,0 -7715,0.569,0.894,0 -7716,0.569,0.894,0 -7717,0.569,0.894,0 -7718,0.569,0.894,0 -7719,0.569,0.894,0 -7720,0.569,0.894,0 -7721,0.569,0.894,0 -7722,0.569,0.894,0 -7723,0.569,0.894,0 -7724,0.569,0.894,0 -7725,0.569,0.894,0 -7726,0.569,0.894,0 -7727,0.569,0.894,0 -7728,0.569,0.894,0 -7729,0.569,0.894,0 -7730,0.569,0.894,0 -7731,0.569,0.894,0 -7732,0.569,0.894,0 -7733,0.569,0.894,0 -7734,0.569,0.894,0 -7735,0.569,0.894,10.12 -7736,0.569,0.894,0 -7737,0.569,0.894,0 -7738,0.569,0.894,0 -7739,0.569,0.894,0.04 -7740,0.569,0.894,0 -7741,0.569,0.894,0 -7742,0.569,0.894,0 -7743,0.569,0.894,0 -7744,0.569,0.894,0 -7745,0.569,0.894,0 -7746,0.569,0.894,0 -7747,0.569,0.894,0 -7748,0.569,0.894,0 -7749,0.569,0.894,0 -7750,0.569,0.894,0 -7751,0.569,0.894,0 -7752,0.569,0.894,0 -7753,0.569,0.894,0 -7754,0.569,0.894,0 -7755,0.569,0.894,0 -7756,0.569,0.894,0 -7757,0.569,0.894,0 -7758,0.569,0.894,0 -7759,0.569,0.894,0 -7760,0.569,0.894,0 -7761,0.569,0.894,0 -7762,0.569,0.894,0 -7763,0.569,0.894,0 -7764,0.569,0.894,0 -7765,0.569,0.894,0 -7766,0.569,0.894,0 -7767,0.569,0.894,0 -7768,0.569,0.894,0 -7769,0.569,0.894,0 -7770,0.569,0.894,0 -7771,0.569,0.894,0 -7772,0.569,0.894,0 -7773,0.569,0.894,0 -7774,0.569,0.894,0 -7775,0.569,0.894,0 -7776,0.569,0.894,0 -7777,0.569,0.894,0 -7778,0.569,0.894,0 -7779,0.569,0.894,0 -7780,0.569,0.894,0 -7781,0.569,0.894,0 -7782,0.569,0.894,0 -7783,0.569,0.894,0 -7784,0.569,0.894,0 -7785,0.569,0.894,0 -7786,0.569,0.894,0 -7787,0.569,0.894,0 -7788,0.569,0.894,0 -7789,0.569,0.894,0 -7790,0.569,0.894,0 -7791,0.569,0.894,0 -7792,0.569,0.894,0 -7793,0.569,0.894,0 -7794,0.569,0.894,0 -7795,0.569,0.894,0 -7796,0.569,0.894,0 -7797,0.569,0.894,24.52 -7798,0.569,0.894,0 -7799,0.569,0.894,0 -7800,0.569,0.894,0 -7801,0.569,0.894,0 -7802,0.569,0.894,0 -7803,0.569,0.894,0 -7804,0.569,0.894,0 -7805,0.569,0.894,0 -7806,0.569,0.894,0 -7807,0.569,0.894,0 -7808,0.569,0.894,0 -7809,0.569,0.894,0 -7810,0.569,0.894,0 -7811,0.569,0.894,0 -7812,0.569,0.894,0 -7813,0.569,0.894,0 -7814,0.569,0.894,0 -7815,0.569,0.894,0 -7816,0.569,0.894,0 -7817,0.569,0.894,0 -7818,0.569,0.894,0 -7819,0.569,0.894,0 -7820,0.569,0.894,0 -7821,0.569,0.894,0 -7822,0.569,0.894,0 -7823,0.569,0.894,0 -7824,0.569,0.894,0 -7825,0.569,0.894,0 -7826,0.569,0.894,0 -7827,0.569,0.894,0 -7828,0.569,0.894,0 -7829,0.569,0.894,0 -7830,0.569,0.894,0 -7831,0.569,0.894,0.56 -7832,0.569,0.894,0 -7833,0.569,0.894,0 -7834,0.569,0.894,0 -7835,0.569,0.894,0 -7836,0.569,0.894,0 -7837,0.569,0.894,0 -7838,0.569,0.894,0 -7839,0.463,0.914,0 -7840,0.463,0.914,0 -7841,0.463,0.914,0 -7842,0.463,0.914,0 -7843,0.463,0.914,0 -7844,0.463,0.914,0 -7845,0.463,0.914,0 -7846,0.463,0.914,0 -7847,0.463,0.914,0 -7848,0.463,0.914,0 -7849,0.463,0.914,0 -7850,0.463,0.914,0 -7851,0.463,0.914,0 -7852,0.463,0.914,0 -7853,0.463,0.914,0 -7854,0.463,0.914,0 -7855,0.463,0.914,0 -7856,0.463,0.914,0 -7857,0.463,0.914,0 -7858,0.463,0.914,0 -7859,0.463,0.914,0 -7860,0.463,0.914,0 -7861,0.463,0.914,0 -7862,0.463,0.914,0 -7863,0.463,0.914,0 -7864,0.463,0.914,0 -7865,0.463,0.914,0 -7866,0.463,0.914,0 -7867,0.463,0.914,0 -7868,0.463,0.914,0 -7869,0.463,0.914,0 -7870,0.463,0.914,0 -7871,0.463,0.914,0 -7872,0.463,0.914,0 -7873,0.463,0.914,0 -7874,0.463,0.914,0 -7875,0.463,0.914,0 -7876,0.463,0.914,0 -7877,0.463,0.914,0 -7878,0.463,0.914,0 -7879,0.463,0.914,0 -7880,0.463,0.914,0 -7881,0.463,0.914,0 -7882,0.463,0.914,0 -7883,0.463,0.914,0 -7884,0.463,0.914,0 -7885,0.463,0.914,0 -7886,0.463,0.914,0 -7887,0.463,0.914,0 -7888,0.463,0.914,0 -7889,0.463,0.914,0 -7890,0.463,0.914,0 -7891,0.463,0.914,0 -7892,0.463,0.914,0 -7893,0.463,0.914,0 -7894,0.463,0.914,0 -7895,0.463,0.914,0 -7896,0.463,0.914,0 -7897,0.463,0.914,0 -7898,0.463,0.914,0 -7899,0.463,0.914,0 -7900,0.463,0.914,0 -7901,0.463,0.914,0 -7902,0.463,0.914,0.81 -7903,0.463,0.914,0 -7904,0.463,0.914,0 -7905,0.463,0.914,0.84 -7906,0.463,0.914,0 -7907,0.463,0.914,0 -7908,0.463,0.914,0 -7909,0.463,0.914,0 -7910,0.463,0.914,0 -7911,0.463,0.914,0 -7912,0.463,0.914,0 -7913,0.463,0.914,0 -7914,0.463,0.914,0 -7915,0.463,0.914,0.21 -7916,0.463,0.914,0 -7917,0.463,0.914,0 -7918,0.463,0.914,0 -7919,0.463,0.914,0 -7920,0.463,0.914,0 -7921,0.463,0.914,0 -7922,0.463,0.914,0 -7923,0.463,0.914,0 -7924,0.463,0.914,0 -7925,0.463,0.914,0 -7926,0.463,0.914,0 -7927,0.463,0.914,0 -7928,0.463,0.914,0 -7929,0.463,0.914,0 -7930,0.463,0.914,0 -7931,0.463,0.914,0 -7932,0.463,0.914,0 -7933,0.463,0.914,0 -7934,0.463,0.914,0 -7935,0.463,0.914,0 -7936,0.463,0.914,0 -7937,0.463,0.914,0 -7938,0.463,0.914,0 -7939,0.463,0.914,0 -7940,0.463,0.914,0 -7941,0.463,0.914,0 -7942,0.463,0.914,0 -7943,0.463,0.914,0 -7944,0.463,0.914,0 -7945,0.463,0.914,0 -7946,0.463,0.914,0 -7947,0.463,0.914,0 -7948,0.463,0.914,0 -7949,0.463,0.914,0 -7950,0.463,0.914,0 -7951,0.463,0.914,0 -7952,0.463,0.914,0 -7953,0.463,0.914,0 -7954,0.463,0.914,0 -7955,0.463,0.914,0 -7956,0.463,0.914,0.13 -7957,0.463,0.914,0 -7958,0.463,0.914,4.63 -7959,0.463,0.914,0 -7960,0.463,0.914,0.23 -7961,0.463,0.914,0 -7962,0.463,0.914,0 -7963,0.463,0.914,0 -7964,0.463,0.914,0 -7965,0.463,0.914,0 -7966,0.463,0.914,0 -7967,0.463,0.914,0 -7968,0.463,0.914,0 -7969,0.463,0.914,0 -7970,0.463,0.914,0 -7971,0.463,0.914,0 -7972,0.463,0.914,0 -7973,0.463,0.914,0 -7974,0.463,0.914,0 -7975,0.463,0.914,0 -7976,0.463,0.914,0 -7977,0.463,0.914,0 -7978,0.463,0.914,0 -7979,0.463,0.914,0 -7980,0.463,0.914,0 -7981,0.463,0.914,0 -7982,0.463,0.914,0 -7983,0.535,0.92,0 -7984,0.535,0.92,0 -7985,0.535,0.92,0 -7986,0.535,0.92,0 -7987,0.535,0.92,0 -7988,0.535,0.92,1.45 -7989,0.535,0.92,0 -7990,0.535,0.92,0 -7991,0.535,0.92,0.61 -7992,0.535,0.92,0 -7993,0.535,0.92,0 -7994,0.535,0.92,9.46 -7995,0.535,0.92,0 -7996,0.535,0.92,1.49 -7997,0.535,0.92,11.2 -7998,0.535,0.92,6.24 -7999,0.535,0.92,17.35 -8000,0.535,0.92,5.43 -8001,0.535,0.92,16.84 -8002,0.535,0.92,0.18 -8003,0.535,0.92,0 -8004,0.535,0.92,0 -8005,0.535,0.92,0 -8006,0.535,0.92,0 -8007,0.535,0.92,0 -8008,0.535,0.92,0 -8009,0.535,0.92,0 -8010,0.535,0.92,0 -8011,0.535,0.92,0 -8012,0.535,0.92,0 -8013,0.535,0.92,0.36 -8014,0.535,0.92,2.38 -8015,0.535,0.92,14.02 -8016,0.535,0.92,13.16 -8017,0.535,0.92,9.28 -8018,0.535,0.92,1.93 -8019,0.535,0.92,3.95 -8020,0.535,0.92,6.04 -8021,0.535,0.92,0 -8022,0.535,0.92,0 -8023,0.535,0.92,0 -8024,0.535,0.92,0 -8025,0.535,0.92,0 -8026,0.535,0.92,0 -8027,0.535,0.92,0 -8028,0.535,0.92,0 -8029,0.535,0.92,0.93 -8030,0.535,0.92,0 -8031,0.535,0.92,0 -8032,0.535,0.92,0 -8033,0.535,0.92,0 -8034,0.535,0.92,0 -8035,0.535,0.92,0 -8036,0.535,0.92,0 -8037,0.535,0.92,0 -8038,0.535,0.92,0 -8039,0.535,0.92,0 -8040,0.535,0.92,0 -8041,0.535,0.92,0 -8042,0.535,0.92,0 -8043,0.535,0.92,0 -8044,0.535,0.92,0 -8045,0.535,0.92,0 -8046,0.535,0.92,0 -8047,0.535,0.92,0.62 -8048,0.535,0.92,2.2 -8049,0.535,0.92,0 -8050,0.535,0.92,0 -8051,0.535,0.92,0 -8052,0.535,0.92,0 -8053,0.535,0.92,0 -8054,0.535,0.92,0 -8055,0.535,0.92,0 -8056,0.535,0.92,0 -8057,0.535,0.92,0 -8058,0.535,0.92,0 -8059,0.535,0.92,0 -8060,0.535,0.92,0 -8061,0.535,0.92,0 -8062,0.535,0.92,0 -8063,0.535,0.92,0 -8064,0.535,0.92,0 -8065,0.535,0.92,0 -8066,0.535,0.92,0 -8067,0.535,0.92,0 -8068,0.535,0.92,0 -8069,0.535,0.92,0 -8070,0.535,0.92,0 -8071,0.535,0.92,0 -8072,0.535,0.92,0 -8073,0.535,0.92,0 -8074,0.535,0.92,0 -8075,0.535,0.92,0 -8076,0.535,0.92,0 -8077,0.535,0.92,0 -8078,0.535,0.92,0 -8079,0.535,0.92,0 -8080,0.535,0.92,0 -8081,0.535,0.92,0 -8082,0.535,0.92,0 -8083,0.535,0.92,0 -8084,0.535,0.92,0 -8085,0.535,0.92,0 -8086,0.535,0.92,0 -8087,0.535,0.92,0 -8088,0.535,0.92,0 -8089,0.535,0.92,0 -8090,0.535,0.92,0 -8091,0.535,0.92,0 -8092,0.535,0.92,0 -8093,0.535,0.92,0 -8094,0.535,0.92,0 -8095,0.535,0.92,0 -8096,0.535,0.92,0 -8097,0.535,0.92,0 -8098,0.535,0.92,0 -8099,0.535,0.92,0 -8100,0.535,0.92,0 -8101,0.535,0.92,0 -8102,0.535,0.92,0 -8103,0.535,0.92,0 -8104,0.535,0.92,0 -8105,0.535,0.92,0 -8106,0.535,0.92,0 -8107,0.535,0.92,0 -8108,0.535,0.92,0 -8109,0.535,0.92,0 -8110,0.535,0.92,0 -8111,0.535,0.92,0 -8112,0.535,0.92,0 -8113,0.535,0.92,0 -8114,0.535,0.92,0 -8115,0.535,0.92,0 -8116,0.535,0.92,0 -8117,0.535,0.92,0 -8118,0.535,0.92,0 -8119,0.535,0.92,0 -8120,0.535,0.92,0 -8121,0.535,0.92,0 -8122,0.535,0.92,0 -8123,0.535,0.92,0 -8124,0.535,0.92,0 -8125,0.535,0.92,0 -8126,0.535,0.92,0 -8127,0.583,0.875,2.19 -8128,0.583,0.875,6.22 -8129,0.583,0.875,0 -8130,0.583,0.875,0 -8131,0.583,0.875,0 -8132,0.583,0.875,0 -8133,0.583,0.875,0 -8134,0.583,0.875,0 -8135,0.583,0.875,0 -8136,0.583,0.875,0 -8137,0.583,0.875,0 -8138,0.583,0.875,0 -8139,0.583,0.875,0 -8140,0.583,0.875,0 -8141,0.583,0.875,0 -8142,0.583,0.875,0 -8143,0.583,0.875,0 -8144,0.583,0.875,0 -8145,0.583,0.875,0 -8146,0.583,0.875,0 -8147,0.583,0.875,0 -8148,0.583,0.875,0 -8149,0.583,0.875,0 -8150,0.583,0.875,0 -8151,0.583,0.875,0 -8152,0.583,0.875,0 -8153,0.583,0.875,0 -8154,0.583,0.875,0 -8155,0.583,0.875,0 -8156,0.583,0.875,0 -8157,0.583,0.875,0 -8158,0.583,0.875,0 -8159,0.583,0.875,0 -8160,0.583,0.875,0 -8161,0.583,0.875,0 -8162,0.583,0.875,0 -8163,0.583,0.875,0 -8164,0.583,0.875,0 -8165,0.583,0.875,0 -8166,0.583,0.875,0 -8167,0.583,0.875,0 -8168,0.583,0.875,0 -8169,0.583,0.875,0 -8170,0.583,0.875,0 -8171,0.583,0.875,0 -8172,0.583,0.875,0 -8173,0.583,0.875,0 -8174,0.583,0.875,0 -8175,0.583,0.875,0 -8176,0.583,0.875,0 -8177,0.583,0.875,0 -8178,0.583,0.875,0 -8179,0.583,0.875,0 -8180,0.583,0.875,0 -8181,0.583,0.875,0 -8182,0.583,0.875,0 -8183,0.583,0.875,0 -8184,0.583,0.875,0 -8185,0.583,0.875,0 -8186,0.583,0.875,0 -8187,0.583,0.875,0 -8188,0.583,0.875,0 -8189,0.583,0.875,0 -8190,0.583,0.875,0 -8191,0.583,0.875,0 -8192,0.583,0.875,0 -8193,0.583,0.875,0 -8194,0.583,0.875,0 -8195,0.583,0.875,0 -8196,0.583,0.875,0 -8197,0.583,0.875,0 -8198,0.583,0.875,0 -8199,0.583,0.875,0 -8200,0.583,0.875,0 -8201,0.583,0.875,0 -8202,0.583,0.875,0 -8203,0.583,0.875,0 -8204,0.583,0.875,0 -8205,0.583,0.875,0 -8206,0.583,0.875,0 -8207,0.583,0.875,0 -8208,0.583,0.875,0 -8209,0.583,0.875,0 -8210,0.583,0.875,0 -8211,0.583,0.875,0 -8212,0.583,0.875,0 -8213,0.583,0.875,0 -8214,0.583,0.875,0 -8215,0.583,0.875,0 -8216,0.583,0.875,0 -8217,0.583,0.875,0 -8218,0.583,0.875,0 -8219,0.583,0.875,0 -8220,0.583,0.875,0 -8221,0.583,0.875,0 -8222,0.583,0.875,0 -8223,0.583,0.875,0.51 -8224,0.583,0.875,0 -8225,0.583,0.875,3 -8226,0.583,0.875,12.96 -8227,0.583,0.875,0 -8228,0.583,0.875,0 -8229,0.583,0.875,0.74 -8230,0.583,0.875,0 -8231,0.583,0.875,0 -8232,0.583,0.875,0 -8233,0.583,0.875,0 -8234,0.583,0.875,0 -8235,0.583,0.875,0 -8236,0.583,0.875,0 -8237,0.583,0.875,0 -8238,0.583,0.875,0 -8239,0.583,0.875,0 -8240,0.583,0.875,0 -8241,0.583,0.875,0 -8242,0.583,0.875,0 -8243,0.583,0.875,0 -8244,0.583,0.875,0 -8245,0.583,0.875,0 -8246,0.583,0.875,0 -8247,0.583,0.875,0 -8248,0.583,0.875,0 -8249,0.583,0.875,0 -8250,0.583,0.875,0 -8251,0.583,0.875,0 -8252,0.583,0.875,0 -8253,0.583,0.875,0 -8254,0.583,0.875,0 -8255,0.583,0.875,0 -8256,0.583,0.875,0 -8257,0.583,0.875,0 -8258,0.583,0.875,0 -8259,0.583,0.875,0 -8260,0.583,0.875,0 -8261,0.583,0.875,0 -8262,0.583,0.875,0 -8263,0.583,0.875,14.26 -8264,0.583,0.875,21.96 -8265,0.583,0.875,20.03 -8266,0.583,0.875,7.96 -8267,0.583,0.875,33.6 -8268,0.583,0.875,12.66 -8269,0.583,0.875,41.13 -8270,0.583,0.875,37.2 -8271,0.485,0.948,0 -8272,0.485,0.948,0 -8273,0.485,0.948,0 -8274,0.485,0.948,0 -8275,0.485,0.948,0 -8276,0.485,0.948,0 -8277,0.485,0.948,0 -8278,0.485,0.948,0 -8279,0.485,0.948,0 -8280,0.485,0.948,0 -8281,0.485,0.948,0 -8282,0.485,0.948,0 -8283,0.672,0.833,0 -8284,0.672,0.833,0 -8285,0.672,0.833,0 -8286,0.672,0.833,0 -8287,0.672,0.833,0 -8288,0.672,0.833,0 -8289,0.672,0.833,0 -8290,0.672,0.833,0 -8291,0.672,0.833,0 -8292,0.672,0.833,0 -8293,0.672,0.833,0 -8294,0.672,0.833,0 -8295,0.672,0.833,0 -8296,0.672,0.833,0 -8297,0.672,0.833,0 -8298,0.672,0.833,0 -8299,0.672,0.833,0 -8300,0.672,0.833,0 -8301,0.672,0.833,0 -8302,0.672,0.833,0 -8303,0.672,0.833,0 -8304,0.672,0.833,0 -8305,0.672,0.833,0 -8306,0.672,0.833,0 -8307,0.485,0.948,0 -8308,0.485,0.948,0 -8309,0.485,0.948,0 -8310,0.485,0.948,0 -8311,0.485,0.948,0 -8312,0.485,0.948,0 -8313,0.485,0.948,0 -8314,0.485,0.948,0 -8315,0.485,0.948,0 -8316,0.485,0.948,0 -8317,0.485,0.948,0 -8318,0.485,0.948,0 -8319,0.485,0.948,0 -8320,0.485,0.948,0 -8321,0.485,0.948,0 -8322,0.485,0.948,0 -8323,0.485,0.948,0 -8324,0.485,0.948,0 -8325,0.485,0.948,0.12 -8326,0.485,0.948,0 -8327,0.485,0.948,0 -8328,0.485,0.948,0 -8329,0.485,0.948,0 -8330,0.485,0.948,0 -8331,0.672,0.833,0 -8332,0.672,0.833,0 -8333,0.672,0.833,6.73 -8334,0.672,0.833,0 -8335,0.672,0.833,0 -8336,0.672,0.833,0 -8337,0.672,0.833,0 -8338,0.672,0.833,0 -8339,0.672,0.833,0 -8340,0.672,0.833,0 -8341,0.672,0.833,0 -8342,0.672,0.833,0 -8343,0.546,0.908,0 -8344,0.546,0.908,0 -8345,0.546,0.908,0 -8346,0.546,0.908,0 -8347,0.546,0.908,0 -8348,0.546,0.908,0 -8349,0.546,0.908,0 -8350,0.546,0.908,0 -8351,0.546,0.908,16.86 -8352,0.546,0.908,0 -8353,0.546,0.908,0 -8354,0.546,0.908,0 -8355,0.48,0.951,11.33 -8356,0.48,0.951,13.84 -8357,0.48,0.951,18.49 -8358,0.48,0.951,29.58 -8359,0.48,0.951,1.72 -8360,0.48,0.951,2.61 -8361,0.48,0.951,4.99 -8362,0.48,0.951,2.03 -8363,0.48,0.951,18.39 -8364,0.48,0.951,9.57 -8365,0.48,0.951,12.49 -8366,0.48,0.951,12.47 -8367,0.48,0.951,19.28 -8368,0.48,0.951,22.03 -8369,0.48,0.951,0 -8370,0.48,0.951,12.17 -8371,0.48,0.951,8.74 -8372,0.48,0.951,0 -8373,0.48,0.951,0.85 -8374,0.48,0.951,0 -8375,0.48,0.951,6.51 -8376,0.48,0.951,18.52 -8377,0.48,0.951,0 -8378,0.48,0.951,0 -8379,0.546,0.908,3.73 -8380,0.546,0.908,4.06 -8381,0.546,0.908,0 -8382,0.546,0.908,0 -8383,0.546,0.908,0.49 -8384,0.546,0.908,0 -8385,0.546,0.908,0.4 -8386,0.546,0.908,0 -8387,0.546,0.908,0 -8388,0.546,0.908,0 -8389,0.546,0.908,0 -8390,0.546,0.908,0.01 -8391,0.546,0.908,0 -8392,0.546,0.908,0 -8393,0.546,0.908,0 -8394,0.546,0.908,0 -8395,0.546,0.908,0 -8396,0.546,0.908,5.78 -8397,0.546,0.908,0 -8398,0.546,0.908,0 -8399,0.546,0.908,0 -8400,0.546,0.908,0 -8401,0.546,0.908,0 -8402,0.546,0.908,0 -8403,0.48,0.951,0 -8404,0.48,0.951,0 -8405,0.48,0.951,0 -8406,0.48,0.951,0 -8407,0.48,0.951,0 -8408,0.48,0.951,0 -8409,0.48,0.951,0 -8410,0.48,0.951,0 -8411,0.48,0.951,0 -8412,0.48,0.951,0 -8413,0.48,0.951,0 -8414,0.48,0.951,0 -8415,0.475,0.886,7.81 -8416,0.475,0.886,22.8 -8417,0.475,0.886,0 -8418,0.475,0.886,10.17 -8419,0.475,0.886,33.18 -8420,0.475,0.886,30.45 -8421,0.475,0.886,24.46 -8422,0.475,0.886,34.42 -8423,0.475,0.886,14.16 -8424,0.475,0.886,0 -8425,0.475,0.886,28.96 -8426,0.475,0.886,0.05 -8427,0.484,0.849,0 -8428,0.484,0.849,0 -8429,0.484,0.849,20.51 -8430,0.484,0.849,10.5 -8431,0.484,0.849,0 -8432,0.484,0.849,0 -8433,0.484,0.849,0 -8434,0.484,0.849,0 -8435,0.484,0.849,0 -8436,0.484,0.849,0 -8437,0.484,0.849,0 -8438,0.484,0.849,0 -8439,0.484,0.849,0 -8440,0.484,0.849,0 -8441,0.484,0.849,0 -8442,0.484,0.849,0 -8443,0.484,0.849,0 -8444,0.484,0.849,0 -8445,0.484,0.849,0 -8446,0.484,0.849,0 -8447,0.484,0.849,0.8 -8448,0.484,0.849,0 -8449,0.484,0.849,0 -8450,0.484,0.849,0 -8451,0.475,0.886,6.08 -8452,0.475,0.886,5.54 -8453,0.475,0.886,0 -8454,0.475,0.886,0 -8455,0.475,0.886,5.15 -8456,0.475,0.886,0 -8457,0.475,0.886,5.88 -8458,0.475,0.886,2.2 -8459,0.475,0.886,0 -8460,0.475,0.886,12.45 -8461,0.475,0.886,15.02 -8462,0.475,0.886,4.28 -8463,0.475,0.886,18.61 -8464,0.475,0.886,9.87 -8465,0.475,0.886,4.22 -8466,0.475,0.886,1.35 -8467,0.475,0.886,0.4 -8468,0.475,0.886,3.18 -8469,0.475,0.886,11.03 -8470,0.475,0.886,5.83 -8471,0.475,0.886,6.78 -8472,0.475,0.886,0.74 -8473,0.475,0.886,1.94 -8474,0.475,0.886,0 -8475,0.484,0.849,0.25 -8476,0.484,0.849,0.31 -8477,0.484,0.849,0 -8478,0.484,0.849,0 -8479,0.484,0.849,2.22 -8480,0.484,0.849,2.33 -8481,0.484,0.849,7.14 -8482,0.484,0.849,0 -8483,0.484,0.849,0 -8484,0.484,0.849,0 -8485,0.484,0.849,0 -8486,0.484,0.849,0 -8487,0.502,0.866,0 -8488,0.502,0.866,0.06 -8489,0.502,0.866,0.3 -8490,0.502,0.866,0.04 -8491,0.502,0.866,16.98 -8492,0.502,0.866,15.04 -8493,0.502,0.866,14.24 -8494,0.502,0.866,8.84 -8495,0.502,0.866,6.19 -8496,0.502,0.866,2.03 -8497,0.502,0.866,12.35 -8498,0.502,0.866,10.46 -8499,0.589,0.795,11.2 -8500,0.589,0.795,5.2 -8501,0.589,0.795,13.24 -8502,0.589,0.795,2.77 -8503,0.589,0.795,1.9 -8504,0.589,0.795,9.89 -8505,0.589,0.795,0 -8506,0.589,0.795,0 -8507,0.589,0.795,0 -8508,0.589,0.795,0 -8509,0.589,0.795,0 -8510,0.589,0.795,0 -8511,0.589,0.795,0 -8512,0.589,0.795,0 -8513,0.589,0.795,13.22 -8514,0.589,0.795,0 -8515,0.589,0.795,0 -8516,0.589,0.795,0 -8517,0.589,0.795,0 -8518,0.589,0.795,0 -8519,0.589,0.795,0 -8520,0.589,0.795,1.41 -8521,0.589,0.795,0 -8522,0.589,0.795,8.12 -8523,0.502,0.866,9.11 -8524,0.502,0.866,13.66 -8525,0.502,0.866,17.87 -8526,0.502,0.866,22.02 -8527,0.502,0.866,7.52 -8528,0.502,0.866,6.98 -8529,0.502,0.866,3.76 -8530,0.502,0.866,0.48 -8531,0.502,0.866,0.5 -8532,0.502,0.866,0.07 -8533,0.502,0.866,0 -8534,0.502,0.866,0 -8535,0.502,0.866,3.14 -8536,0.502,0.866,0 -8537,0.502,0.866,8.94 -8538,0.502,0.866,0 -8539,0.502,0.866,11.77 -8540,0.502,0.866,1.74 -8541,0.502,0.866,17.32 -8542,0.502,0.866,5.57 -8543,0.502,0.866,12.25 -8544,0.502,0.866,16.47 -8545,0.502,0.866,0 -8546,0.502,0.866,7.94 -8547,0.589,0.795,0 -8548,0.589,0.795,2.27 -8549,0.589,0.795,0 -8550,0.589,0.795,0 -8551,0.589,0.795,0 -8552,0.589,0.795,0 -8553,0.589,0.795,0.25 -8554,0.589,0.795,0.21 -8555,0.589,0.795,2.97 -8556,0.589,0.795,0 -8557,0.589,0.795,0 -8558,0.589,0.795,0 -8559,0.443,0.802,26.74 -8560,0.443,0.802,24.67 -8561,0.443,0.802,29.38 -8562,0.443,0.802,10.1 -8563,0.443,0.802,3.25 -8564,0.443,0.802,3.11 -8565,0.443,0.802,10.3 -8566,0.443,0.802,0 -8567,0.443,0.802,1.72 -8568,0.443,0.802,6.27 -8569,0.443,0.802,10.24 -8570,0.443,0.802,15.72 -8571,0.644,0.877,28.31 -8572,0.644,0.877,29.76 -8573,0.644,0.877,39.96 -8574,0.644,0.877,38.72 -8575,0.644,0.877,17.59 -8576,0.707,0.898,0 -8577,0.644,0.877,34.08 -8578,0.707,0.898,0 -8579,0.707,0.898,0 -8580,0.707,0.898,0 -8581,0.707,0.898,12.11 -8582,0.707,0.898,15.9 -8583,0.707,0.898,0 -8584,0.707,0.898,0 -8585,0.67,0.907,23.02 -8586,0.67,0.907,12.74 -8587,0.644,0.877,25.83 -8588,0.707,0.898,0 -8589,0.63,0.838,16.97 -8590,0.67,0.907,6.69 -8591,0.644,0.877,25.06 -8592,0.644,0.877,32.84 -8593,0.63,0.838,18.89 -8594,0.63,0.838,28.59 -8595,0.443,0.802,8.88 -8596,0.443,0.802,25.9 -8597,0.443,0.802,18.93 -8598,0.443,0.802,9.89 -8599,0.443,0.802,24.86 -8600,0.443,0.802,27.95 -8601,0.443,0.802,0.08 -8602,0.443,0.802,29.88 -8603,0.443,0.802,15.93 -8604,0.443,0.802,7.99 -8605,0.443,0.802,14.54 -8606,0.443,0.802,18.06 -8607,0.443,0.802,0 -8608,0.443,0.802,1.06 -8609,0.443,0.802,0 -8610,0.443,0.802,0 -8611,0.443,0.802,0.03 -8612,0.443,0.802,3.06 -8613,0.443,0.802,0 -8614,0.443,0.802,0 -8615,0.443,0.802,10.37 -8616,0.443,0.802,10.8 -8617,0.443,0.802,0 -8618,0.443,0.802,0 -8619,0.63,0.838,5.34 -8620,0.63,0.838,7.04 -8621,0.63,0.838,11.65 -8622,0.63,0.838,15.95 -8623,0.63,0.838,3.36 -8624,0.67,0.907,6.55 -8625,0.63,0.838,15.29 -8626,0.67,0.907,29.89 -8627,0.67,0.907,34.95 -8628,0.67,0.907,40.58 -8629,0.67,0.907,0.98 -8630,0.67,0.907,0 -8631,0.668,0.825,14.5 -8632,0.668,0.825,0 -8633,0.668,0.825,15.68 -8634,0.668,0.825,0 -8635,0.668,0.825,1.01 -8636,0.668,0.825,33.13 -8637,0.668,0.825,16.86 -8638,0.668,0.825,24.87 -8639,0.668,0.825,0 -8640,0.668,0.825,9.8 -8641,0.668,0.825,0 -8642,0.668,0.825,13.98 -8643,0.614,0.743,0 -8644,0.614,0.743,0 -8645,0.614,0.743,0 -8646,0.614,0.743,0 -8647,0.614,0.743,0 -8648,0.614,0.743,0 -8649,0.614,0.743,0 -8650,0.614,0.743,0 -8651,0.614,0.743,0 -8652,0.614,0.743,0 -8653,0.614,0.743,0 -8654,0.614,0.743,0 -8655,0.614,0.743,0 -8656,0.614,0.743,0 -8657,0.614,0.743,1.34 -8658,0.614,0.743,0 -8659,0.614,0.743,0 -8660,0.614,0.743,0 -8661,0.614,0.743,0 -8662,0.614,0.743,0 -8663,0.614,0.743,0 -8664,0.614,0.743,0 -8665,0.614,0.743,0 -8666,0.614,0.743,0 -8667,0.668,0.825,0 -8668,0.668,0.825,4.18 -8669,0.668,0.825,0 -8670,0.668,0.825,0 -8671,0.668,0.825,17.49 -8672,0.668,0.825,24.78 -8673,0.668,0.825,0.05 -8674,0.668,0.825,0 -8675,0.668,0.825,0 -8676,0.668,0.825,0 -8677,0.668,0.825,0.79 -8678,0.668,0.825,17.8 -8679,0.668,0.825,0 -8680,0.668,0.825,0 -8681,0.668,0.825,0 -8682,0.668,0.825,0 -8683,0.668,0.825,0 -8684,0.668,0.825,0 -8685,0.668,0.825,0 -8686,0.668,0.825,0 -8687,0.668,0.825,0 -8688,0.668,0.825,0 -8689,0.668,0.825,0 -8690,0.668,0.825,0 -8691,0.614,0.743,0 -8692,0.614,0.743,0 -8693,0.614,0.743,0 -8694,0.614,0.743,0 -8695,0.614,0.743,0 -8696,0.614,0.743,0 -8697,0.614,0.743,0 -8698,0.614,0.743,0 -8699,0.614,0.743,21.7 -8700,0.614,0.743,11.64 -8701,0.614,0.743,11.25 -8702,0.614,0.743,11.41 -8703,0.637,0.707,0 -8704,0.637,0.707,0 -8705,0.637,0.707,0 -8706,0.637,0.707,0 -8707,0.637,0.707,0 -8708,0.637,0.707,0 -8709,0.637,0.707,0 -8710,0.637,0.707,0 -8711,0.563,0.726,0 -8712,0.563,0.726,0 -8713,0.563,0.726,0 -8714,0.563,0.726,0 -8715,0.563,0.726,0 -8716,0.563,0.726,0 -8717,0.563,0.726,0 -8718,0.563,0.726,0 -8719,0.563,0.726,0 -8720,0.563,0.726,0 -8721,0.563,0.726,0 -8722,0.563,0.726,0 -8723,0.563,0.726,0 -8724,0.563,0.726,0 -8725,0.563,0.726,0 -8726,0.563,0.726,0 -8727,0.637,0.707,0 -8728,0.637,0.707,0 -8729,0.637,0.707,0.26 -8730,0.637,0.707,0 -8731,0.637,0.707,0 -8732,0.637,0.707,0 -8733,0.637,0.707,0 -8734,0.637,0.707,0 -8735,0.704,0.605,0 -8736,0.704,0.605,0 -8737,0.704,0.605,0 -8738,0.704,0.605,0 -8739,0.704,0.605,0.01 -8740,0.704,0.605,0 -8741,0.704,0.605,0 -8742,0.704,0.605,0 -8743,0.68,0.678,0 -8744,0.68,0.678,0 -8745,0.68,0.678,0 -8746,0.68,0.678,0 -8747,0.68,0.678,0 -8748,0.68,0.678,0 -8749,0.68,0.678,0 -8750,0.68,0.678,0 -8751,0.68,0.678,0 -8752,0.68,0.678,12.38 -8753,0.68,0.678,0.42 -8754,0.68,0.678,0 -8755,0.68,0.678,0 -8756,0.68,0.678,0 -8757,0.68,0.678,0 -8758,0.68,0.678,0 -8759,0.704,0.605,0 -8760,0.704,0.605,0 -8761,0.704,0.605,0 -8762,0.704,0.605,0 -8763,0.704,0.605,0 -8764,0.704,0.605,0 -8765,0.704,0.605,0 -8766,0.704,0.605,0 -8767,0.643,0.652,0 -8768,0.643,0.652,0 -8769,0.643,0.652,0 -8770,0.643,0.652,0 -8771,0.643,0.652,0 -8772,0.643,0.652,0 -8773,0.643,0.652,0 -8774,0.643,0.652,0 -8775,0.611,0.754,0 -8776,0.611,0.754,0 -8777,0.611,0.754,0 -8778,0.611,0.754,0 -8779,0.611,0.754,0.24 -8780,0.611,0.754,0 -8781,0.611,0.754,0 -8782,0.611,0.754,0 -8783,0.611,0.754,0 -8784,0.611,0.754,0 -8785,0.611,0.754,0 -8786,0.611,0.754,0 -8787,0.611,0.754,0 -8788,0.611,0.754,0 -8789,0.611,0.754,0 -8790,0.611,0.754,0 -8791,0.643,0.652,2.68 -8792,0.643,0.652,0.76 -8793,0.643,0.652,6.02 -8794,0.643,0.652,0.98 -8795,0.643,0.652,2.53 -8796,0.643,0.652,11.84 -8797,0.643,0.652,18.49 -8798,0.643,0.652,25.3 -8799,0.783,0.748,0 -8800,0.783,0.748,0 -8801,0.783,0.748,0 -8802,0.783,0.748,0 -8803,0.783,0.748,0 -8804,0.783,0.748,0.91 -8805,0.783,0.748,0 -8806,0.783,0.748,0 -8807,0.688,0.731,0 -8808,0.688,0.731,0 -8809,0.688,0.731,0 -8810,0.688,0.731,0 -8811,0.688,0.731,0 -8812,0.688,0.731,0 -8813,0.688,0.731,0 -8814,0.688,0.731,0 -8815,0.64,0.708,0 -8816,0.64,0.708,0 -8817,0.64,0.708,0 -8818,0.64,0.708,0 -8819,0.64,0.708,0 -8820,0.64,0.708,0 -8821,0.64,0.708,0 -8822,0.64,0.708,0 -8823,0.64,0.708,0 -8824,0.64,0.708,0 -8825,0.64,0.708,11.58 -8826,0.64,0.708,0 -8827,0.64,0.708,0 -8828,0.64,0.708,0 -8829,0.64,0.708,0 -8830,0.64,0.708,3.8 -8831,0.688,0.731,0 -8832,0.688,0.731,0.01 -8833,0.688,0.731,7.74 -8834,0.688,0.731,7.8 -8835,0.688,0.731,0 -8836,0.688,0.731,0 -8837,0.688,0.731,0 -8838,0.688,0.731,0 -8839,0.783,0.748,0 -8840,0.783,0.748,0 -8841,0.783,0.748,0 -8842,0.783,0.748,0 -8843,0.783,0.748,0 -8844,0.783,0.748,0 -8845,0.783,0.748,0 -8846,0.783,0.748,0 -8847,0.722,0.72,0 -8848,0.722,0.72,0 -8849,0.722,0.72,0 -8850,0.722,0.72,0 -8851,0.722,0.72,0 -8852,0.722,0.72,0 -8853,0.722,0.72,0 -8854,0.722,0.72,0 -8855,0.604,0.77,0 -8856,0.604,0.77,0 -8857,0.604,0.77,0 -8858,0.604,0.77,5.87 -8859,0.604,0.77,0 -8860,0.604,0.77,0.83 -8861,0.604,0.77,0.03 -8862,0.604,0.77,0 -8863,0.578,0.835,3.67 -8864,0.578,0.835,11.34 -8865,0.578,0.835,3.45 -8866,0.578,0.835,3 -8867,0.578,0.835,7.07 -8868,0.578,0.835,5.26 -8869,0.578,0.835,2.97 -8870,0.578,0.835,6.54 -8871,0.578,0.835,2.23 -8872,0.578,0.835,3.83 -8873,0.578,0.835,13.29 -8874,0.578,0.835,10.95 -8875,0.578,0.835,16.14 -8876,0.578,0.835,10.95 -8877,0.578,0.835,11.46 -8878,0.578,0.835,5.01 -8879,0.604,0.77,15.28 -8880,0.604,0.77,3.25 -8881,0.604,0.77,28.78 -8882,0.604,0.77,25.49 -8883,0.604,0.77,0 -8884,0.604,0.77,9.65 -8885,0.604,0.77,0.38 -8886,0.604,0.77,12.63 -8887,0.722,0.72,0 -8888,0.722,0.72,0 -8889,0.722,0.72,0 -8890,0.722,0.72,0.75 -8891,0.722,0.72,0 -8892,0.722,0.72,0 -8893,0.722,0.72,0 -8894,0.722,0.72,0 -8895,0.662,0.677,0 -8896,0.662,0.677,0 -8897,0.662,0.677,0 -8898,0.662,0.677,0 -8899,0.662,0.677,0 -8900,0.662,0.677,0 -8901,0.662,0.677,0 -8902,0.662,0.677,0 -8903,0.618,0.718,0 -8904,0.618,0.718,13.56 -8905,0.618,0.718,0 -8906,0.618,0.718,0 -8907,0.618,0.718,2.74 -8908,0.618,0.718,6.38 -8909,0.618,0.718,0 -8910,0.618,0.718,31.57 -8911,0.595,0.74,29.62 -8912,0.595,0.74,0.9 -8913,0.595,0.74,0 -8914,0.595,0.74,0 -8915,0.595,0.74,15.54 -8916,0.595,0.74,0 -8917,0.595,0.74,0 -8918,0.595,0.74,0 -8919,0.595,0.74,0 -8920,0.595,0.74,0 -8921,0.595,0.74,2.14 -8922,0.595,0.74,4.01 -8923,0.595,0.74,0 -8924,0.595,0.74,0 -8925,0.595,0.74,0 -8926,0.595,0.74,0 -8927,0.618,0.718,0 -8928,0.618,0.718,0 -8929,0.618,0.718,0 -8930,0.618,0.718,0 -8931,0.618,0.718,0 -8932,0.618,0.718,0 -8933,0.618,0.718,0.21 -8934,0.618,0.718,0 -8935,0.662,0.677,0 -8936,0.662,0.677,0 -8937,0.662,0.677,0 -8938,0.662,0.677,0 -8939,0.662,0.677,0 -8940,0.662,0.677,0 -8941,0.662,0.677,0 -8942,0.662,0.677,0 -8943,0.742,0.65,2.66 -8944,0.742,0.65,0 -8945,0.742,0.65,0.55 -8946,0.742,0.65,2.11 -8947,0.742,0.65,0 -8948,0.742,0.65,0 -8949,0.742,0.65,0 -8950,0.742,0.65,0 -8951,0.736,0.679,0 -8952,0.736,0.679,3.9 -8953,0.736,0.679,0 -8954,0.736,0.679,3.1 -8955,0.715,0.733,7.78 -8956,0.715,0.733,11.65 -8957,0.715,0.733,5.62 -8958,0.715,0.733,16.88 -8959,0.711,0.76,12.93 -8960,0.711,0.76,10.09 -8961,0.711,0.76,33.28 -8962,0.711,0.76,10.4 -8963,0.71,0.744,4.86 -8964,0.71,0.744,0.24 -8965,0.71,0.744,33.7 -8966,0.71,0.744,0.06 -8967,0.693,0.681,22.09 -8968,0.693,0.681,0 -8969,0.693,0.681,0 -8970,0.693,0.681,0 -8971,0.677,0.659,21.37 -8972,0.677,0.659,24.02 -8973,0.677,0.659,23.85 -8974,0.677,0.659,0 -8975,0.712,0.725,1.46 -8976,0.712,0.725,21.71 -8977,0.712,0.725,0.11 -8978,0.712,0.725,22.01 -8979,0.724,0.714,0 -8980,0.724,0.714,2.12 -8981,0.724,0.714,1.05 -8982,0.724,0.714,1.03 -8983,0.742,0.65,0.33 -8984,0.742,0.65,0 -8985,0.742,0.65,0.24 -8986,0.742,0.65,0 -8987,0.742,0.65,3.39 -8988,0.742,0.65,3.73 -8989,0.742,0.65,0 -8990,0.742,0.65,1.77 -8991,0.787,0.706,3.3 -8992,0.787,0.706,2.01 -8993,0.787,0.706,0.74 -8994,0.787,0.706,4.14 -8995,0.787,0.706,0 -8996,0.787,0.706,0 -8997,0.787,0.706,2 -8998,0.787,0.706,2.23 -8999,0.71,0.668,3.7 -9000,0.71,0.668,3.49 -9001,0.71,0.668,6.24 -9002,0.71,0.668,2.64 -9003,0.656,0.639,3.88 -9004,0.656,0.639,12.28 -9005,0.656,0.639,1.28 -9006,0.656,0.639,21.57 -9007,0.664,0.675,0 -9008,0.664,0.675,0 -9009,0.664,0.675,26.21 -9010,0.664,0.675,0 -9011,0.664,0.675,0 -9012,0.664,0.675,0 -9013,0.664,0.675,0 -9014,0.664,0.675,5.25 -9015,0.664,0.675,0 -9016,0.664,0.675,0 -9017,0.664,0.675,0 -9018,0.664,0.675,0 -9019,0.664,0.675,17.49 -9020,0.664,0.675,0.12 -9021,0.664,0.675,25.63 -9022,0.664,0.675,6.98 -9023,0.762,0.683,30.32 -9024,0.762,0.683,24.02 -9025,0.762,0.683,9.8 -9026,0.762,0.683,9.45 -9027,0.793,0.585,0.89 -9028,0.793,0.585,3.99 -9029,0.793,0.585,0 -9030,0.793,0.585,0 -9031,0.787,0.706,0 -9032,0.787,0.706,0 -9033,0.787,0.706,0 -9034,0.787,0.706,0 -9035,0.787,0.706,0 -9036,0.787,0.706,2.17 -9037,0.787,0.706,0 -9038,0.787,0.706,1.98 -9039,0.773,0.729,0 -9040,0.773,0.729,2.65 -9041,0.773,0.729,2.5 -9042,0.773,0.729,0.37 -9043,0.759,0.716,0 -9044,0.759,0.716,0.03 -9045,0.759,0.716,0 -9046,0.759,0.716,0 -9047,0.76,0.705,4.08 -9048,0.76,0.705,1.54 -9049,0.76,0.705,4.75 -9050,0.76,0.705,6.24 -9051,0.67,0.717,26.52 -9052,0.67,0.717,14.93 -9053,0.67,0.717,20.26 -9054,0.67,0.717,26.62 -9055,0.646,0.731,33.5 -9056,0.646,0.731,19.5 -9057,0.646,0.731,26.7 -9058,0.646,0.731,39.29 -9059,0.646,0.731,0 -9060,0.646,0.731,0 -9061,0.646,0.731,17.89 -9062,0.646,0.731,0 -9063,0.646,0.731,2.12 -9064,0.646,0.731,0 -9065,0.646,0.731,2.04 -9066,0.646,0.731,0 -9067,0.646,0.731,27.57 -9068,0.646,0.731,34.84 -9069,0.646,0.731,9.09 -9070,0.646,0.731,8.35 -9071,0.608,0.718,30.31 -9072,0.608,0.718,36.71 -9073,0.608,0.718,20.27 -9074,0.608,0.718,22.97 -9075,0.664,0.654,1.4 -9076,0.664,0.654,3.95 -9077,0.664,0.654,5.32 -9078,0.664,0.654,12.08 -9079,0.7,0.65,0 -9080,0.7,0.65,3.28 -9081,0.7,0.65,0.39 -9082,0.7,0.65,11.16 -9083,0.759,0.719,4.34 -9084,0.759,0.719,0 -9085,0.759,0.719,0.52 -9086,0.759,0.719,0 -9087,0.789,0.585,0 -9088,0.789,0.585,8.07 -9089,0.789,0.585,2.91 -9090,0.789,0.585,8.61 -9091,0.757,0.542,12.78 -9092,0.757,0.542,1.53 -9093,0.757,0.542,10.58 -9094,0.757,0.542,12.65 -9095,0.702,0.553,5.03 -9096,0.702,0.553,1.29 -9097,0.702,0.553,10.87 -9098,0.702,0.553,2.25 -9099,0.572,0.624,7 -9100,0.572,0.624,0 -9101,0.572,0.624,7.86 -9102,0.572,0.624,0 -9103,0.573,0.624,11.33 -9104,0.573,0.624,4.12 -9105,0.573,0.624,5.66 -9106,0.573,0.624,6.32 -9107,0.623,0.592,0.73 -9108,0.623,0.592,2.92 -9109,0.623,0.592,7.72 -9110,0.623,0.592,2.8 -9111,0.743,0.577,11.33 -9112,0.743,0.577,0 -9113,0.743,0.577,1.73 -9114,0.743,0.577,1.99 -9115,0.71,0.714,10.64 -9116,0.71,0.714,7.18 -9117,0.71,0.714,1.37 -9118,0.71,0.714,2.1 -9119,0.71,0.714,1.98 -9120,0.71,0.714,3.75 -9121,0.721,0.732,1.21 -9122,0.721,0.732,3.47 -9123,0.721,0.732,19.3 -9124,0.612,0.764,14.88 -9125,0.732,0.616,8.1 -9126,0.614,0.764,21.3 -9127,0.639,0.614,12.58 -9128,0.688,0.663,14.05 -9129,0.688,0.663,1.3 -9130,0.688,0.663,4.11 -9131,0.688,0.663,4.65 -9132,0.646,0.681,6.99 -9133,0.646,0.681,0.21 -9134,0.646,0.681,2.43 -9135,0.646,0.681,3.77 -9136,0.65,0.681,5.64 -9137,0.65,0.681,3.07 -9138,0.65,0.681,2.99 -9139,0.65,0.681,2 -9140,0.785,0.702,0 -9141,0.785,0.702,0 -9142,0.785,0.702,0 -9143,0.785,0.702,0 -9144,0.644,0.716,2.74 -9145,0.644,0.716,2.12 -9146,0.644,0.716,14.51 -9147,0.644,0.716,0.46 -9148,0.638,0.724,1.44 -9149,0.638,0.724,7.15 -9150,0.638,0.724,11.48 -9151,0.638,0.724,0.03 -9152,0.623,0.612,0.01 -9153,0.623,0.612,0 -9154,0.623,0.612,21.59 -9155,0.623,0.612,8.44 -9156,0.573,0.594,12.49 -9157,0.573,0.594,19.04 -9158,0.573,0.594,25.26 -9159,0.573,0.594,27.53 -9160,0.573,0.594,2.2 -9161,0.573,0.594,7.05 -9162,0.528,0.64,0.2 -9163,0.528,0.64,8.01 -9164,0.528,0.64,4.49 -9165,0.528,0.64,13.11 -9166,0.571,0.675,21.16 -9167,0.571,0.675,14.37 -9168,0.571,0.675,17.28 -9169,0.571,0.675,1.08 -9170,0.537,0.703,4.52 -9171,0.537,0.703,11.9 -9172,0.537,0.703,4.58 -9173,0.537,0.703,18.4 -9174,0.57,0.731,9.88 -9175,0.57,0.731,30.8 -9176,0.57,0.731,12.61 -9177,0.57,0.731,35.79 -9178,0.646,0.715,11.23 -9179,0.646,0.715,2.18 -9180,0.646,0.715,32.76 -9181,0.646,0.715,29.83 -9182,0.845,0.701,8.8 -9183,0.845,0.701,0 -9184,0.845,0.701,15.77 -9185,0.845,0.701,2.62 -9186,0.845,0.702,18.01 -9187,0.845,0.702,7.58 -9188,0.845,0.702,5.54 -9189,0.845,0.702,0.72 -9190,0.714,0.737,28.7 -9191,0.714,0.737,41.38 -9192,0.714,0.737,27.67 -9193,0.714,0.737,38.2 -9194,0.714,0.674,10.3 -9195,0.714,0.674,16.29 -9196,0.714,0.674,21.39 -9197,0.714,0.674,5.24 -9198,0.609,0.644,16.8 -9199,0.609,0.644,19.17 -9200,0.609,0.644,14.41 -9201,0.609,0.644,18.35 -9202,0.52,0.714,2.41 -9203,0.52,0.714,0.94 -9204,0.52,0.714,3 -9205,0.52,0.714,8.03 -9206,0.564,0.668,12.39 -9207,0.564,0.668,29.43 -9208,0.564,0.668,24.18 -9209,0.564,0.668,17.1 -9210,0.564,0.668,3.18 -9211,0.564,0.668,9.39 -9212,0.732,0.83,0 -9213,0.732,0.83,9.96 -9214,0.732,0.83,0 -9215,0.732,0.83,0 -9216,0.732,0.83,10.62 -9217,0.732,0.83,2.22 -9218,0.732,0.83,13.13 -9219,0.732,0.83,28.32 -9220,0.631,0.856,0.8 -9221,0.631,0.856,0 -9222,0.631,0.856,0 -9223,0.631,0.856,0 -9224,0.631,0.856,0.77 -9225,0.631,0.856,12.62 -9226,0.631,0.856,0 -9227,0.631,0.856,0 -9228,0.631,0.856,0 -9229,0.631,0.856,0 -9230,0.631,0.856,0 -9231,0.631,0.856,0.82 -9232,0.631,0.856,0 -9233,0.631,0.856,0 -9234,0.631,0.856,0 -9235,0.631,0.856,0 -9236,0.732,0.83,0 -9237,0.732,0.83,14.13 -9238,0.732,0.83,0 -9239,0.732,0.83,0 -9240,0.732,0.83,0 -9241,0.732,0.83,3.03 -9242,0.732,0.83,21.88 -9243,0.732,0.83,0 -9244,0.736,0.842,18.76 -9245,0.736,0.842,6.37 -9246,0.736,0.842,6.09 -9247,0.736,0.842,0 -9248,0.736,0.842,0 -9249,0.736,0.842,0 -9250,0.736,0.842,0 -9251,0.736,0.842,0 -9252,0.602,0.856,0 -9253,0.602,0.856,0 -9254,0.602,0.856,0 -9255,0.602,0.856,0 -9256,0.602,0.856,0 -9257,0.602,0.856,0 -9258,0.602,0.856,0 -9259,0.602,0.856,0 -9260,0.602,0.856,0 -9261,0.602,0.856,0 -9262,0.602,0.856,5.12 -9263,0.602,0.856,5.14 -9264,0.602,0.856,0 -9265,0.602,0.856,0 -9266,0.602,0.856,0 -9267,0.602,0.856,0 -9268,0.736,0.842,0 -9269,0.736,0.842,0.03 -9270,0.736,0.842,4.03 -9271,0.736,0.842,12.74 -9272,0.736,0.842,3.47 -9273,0.736,0.842,0 -9274,0.736,0.842,0 -9275,0.736,0.842,0 -9276,0.625,0.857,4.82 -9277,0.625,0.857,0 -9278,0.625,0.857,5.66 -9279,0.625,0.857,7.75 -9280,0.625,0.857,8.31 -9281,0.625,0.857,36.28 -9282,0.625,0.857,16.37 -9283,0.625,0.857,10.38 -9284,0.614,0.832,0 -9285,0.614,0.832,0 -9286,0.614,0.832,0 -9287,0.614,0.832,0 -9288,0.614,0.832,0.84 -9289,0.614,0.832,0 -9290,0.614,0.832,0 -9291,0.614,0.832,0 -9292,0.614,0.832,2.72 -9293,0.614,0.832,1.98 -9294,0.614,0.832,0.42 -9295,0.614,0.832,1.76 -9296,0.614,0.832,8.04 -9297,0.614,0.832,0 -9298,0.614,0.832,0 -9299,0.614,0.832,0 -9300,0.625,0.857,2.57 -9301,0.625,0.857,12.56 -9302,0.625,0.857,0.01 -9303,0.625,0.857,0.28 -9304,0.625,0.857,0 -9305,0.625,0.857,0.16 -9306,0.625,0.857,0 -9307,0.625,0.857,0 -9308,0.621,0.835,13.14 -9309,0.621,0.835,0.67 -9310,0.621,0.835,2.18 -9311,0.621,0.835,0 -9312,0.621,0.835,0 -9313,0.621,0.835,0 -9314,0.621,0.835,0 -9315,0.621,0.835,0 -9316,0.574,0.829,0 -9317,0.574,0.829,0 -9318,0.574,0.829,0 -9319,0.574,0.829,1.22 -9320,0.574,0.829,0 -9321,0.574,0.829,0 -9322,0.574,0.829,3.8 -9323,0.574,0.829,0 -9324,0.585,0.815,18.78 -9325,0.585,0.815,14.06 -9326,0.585,0.815,7.91 -9327,0.585,0.815,19.84 -9328,0.585,0.815,0 -9329,0.585,0.815,0 -9330,0.585,0.815,0 -9331,0.585,0.815,0 -9332,0.585,0.815,0 -9333,0.585,0.815,0 -9334,0.585,0.815,8.33 -9335,0.585,0.815,14.33 -9336,0.585,0.815,7.6 -9337,0.585,0.815,7.07 -9338,0.585,0.815,6.33 -9339,0.585,0.815,0 -9340,0.574,0.829,5.4 -9341,0.574,0.829,1.68 -9342,0.574,0.829,0 -9343,0.574,0.829,0 -9344,0.574,0.829,0 -9345,0.574,0.829,0.24 -9346,0.574,0.829,0 -9347,0.574,0.829,0 -9348,0.621,0.835,0 -9349,0.621,0.835,0 -9350,0.621,0.835,0 -9351,0.621,0.835,0 -9352,0.621,0.835,0.15 -9353,0.621,0.835,2.17 -9354,0.621,0.835,0 -9355,0.621,0.835,3.3 -9356,0.682,0.83,2.31 -9357,0.682,0.83,25.57 -9358,0.682,0.83,8.11 -9359,0.682,0.83,24.7 -9360,0.682,0.83,0 -9361,0.682,0.83,0 -9362,0.682,0.83,11.83 -9363,0.682,0.83,12.34 -9364,0.605,0.81,0 -9365,0.605,0.81,0 -9366,0.605,0.81,0 -9367,0.605,0.81,0 -9368,0.605,0.81,0 -9369,0.605,0.81,0 -9370,0.605,0.81,0 -9371,0.605,0.81,0 -9372,0.629,0.804,0 -9373,0.629,0.804,0 -9374,0.629,0.804,2.53 -9375,0.629,0.804,0 -9376,0.629,0.804,3.8 -9377,0.629,0.804,12.73 -9378,0.629,0.804,0 -9379,0.629,0.804,8.46 -9380,0.629,0.804,0 -9381,0.629,0.804,9.86 -9382,0.629,0.804,0 -9383,0.629,0.804,5.51 -9384,0.629,0.804,0 -9385,0.629,0.804,0 -9386,0.629,0.804,0 -9387,0.629,0.804,0.09 -9388,0.605,0.81,0 -9389,0.605,0.81,3.34 -9390,0.605,0.81,0 -9391,0.605,0.81,0 -9392,0.605,0.81,0 -9393,0.605,0.81,1.82 -9394,0.605,0.81,14.63 -9395,0.605,0.81,8.71 -9396,0.682,0.83,8.96 -9397,0.682,0.83,6.33 -9398,0.682,0.83,23.95 -9399,0.682,0.83,7.56 -9400,0.682,0.83,1.94 -9401,0.682,0.83,12.12 -9402,0.682,0.83,27.08 -9403,0.682,0.83,20.1 -9404,0.73,0.832,38.02 -9405,0.73,0.832,39.36 -9406,0.73,0.832,37.34 -9407,0.73,0.832,12.03 -9408,0.73,0.832,26.01 -9409,0.73,0.832,0 -9410,0.73,0.832,12.88 -9411,0.73,0.832,0 -9412,0.708,0.808,13.81 -9413,0.708,0.808,5.96 -9414,0.708,0.808,0 -9415,0.708,0.808,0 -9416,0.708,0.808,0 -9417,0.708,0.808,0 -9418,0.708,0.808,0 -9419,0.708,0.808,0 -9420,0.629,0.804,0 -9421,0.629,0.804,0 -9422,0.629,0.804,0 -9423,0.629,0.804,0 -9424,0.629,0.804,0 -9425,0.629,0.804,0 -9426,0.629,0.804,0 -9427,0.629,0.804,0 -9428,0.629,0.804,0 -9429,0.629,0.804,0 -9430,0.629,0.804,0 -9431,0.629,0.804,0 -9432,0.629,0.804,0 -9433,0.629,0.804,0 -9434,0.629,0.804,0 -9435,0.629,0.804,0 -9436,0.708,0.808,0 -9437,0.708,0.808,0 -9438,0.708,0.808,0 -9439,0.708,0.808,0 -9440,0.708,0.808,0 -9441,0.708,0.808,0 -9442,0.708,0.808,0 -9443,0.708,0.808,0 -9444,0.73,0.832,5.85 -9445,0.73,0.832,0 -9446,0.73,0.832,0 -9447,0.73,0.832,0.02 -9448,0.73,0.832,0 -9449,0.73,0.832,0 -9450,0.73,0.832,0 -9451,0.73,0.832,0 -9452,0.799,0.821,0 -9453,0.799,0.821,0 -9454,0.799,0.821,0 -9455,0.799,0.821,0 -9456,0.799,0.821,3.6 -9457,0.799,0.821,0 -9458,0.799,0.821,3.93 -9459,0.799,0.821,4.7 -9460,0.606,0.762,0 -9461,0.606,0.762,0 -9462,0.606,0.762,0 -9463,0.606,0.762,0 -9464,0.606,0.762,0 -9465,0.606,0.762,0.02 -9466,0.606,0.762,11.92 -9467,0.606,0.762,2.07 -9468,0.682,0.727,0 -9469,0.682,0.727,0 -9470,0.682,0.727,0 -9471,0.682,0.727,0.65 -9472,0.682,0.727,0 -9473,0.682,0.727,0 -9474,0.682,0.727,0 -9475,0.682,0.727,0 -9476,0.682,0.727,0.47 -9477,0.682,0.727,0 -9478,0.682,0.727,17.46 -9479,0.682,0.727,0 -9480,0.682,0.727,0.47 -9481,0.682,0.727,6.07 -9482,0.682,0.727,10.51 -9483,0.682,0.727,22.49 -9484,0.606,0.762,0 -9485,0.606,0.762,1.76 -9486,0.606,0.762,1.15 -9487,0.606,0.762,3.68 -9488,0.606,0.762,0 -9489,0.606,0.762,0 -9490,0.606,0.762,0 -9491,0.606,0.762,0 -9492,0.799,0.821,1.24 -9493,0.799,0.821,0 -9494,0.799,0.821,0 -9495,0.799,0.821,0 -9496,0.799,0.821,0 -9497,0.799,0.821,0 -9498,0.799,0.821,0 -9499,0.799,0.821,8.3 -9500,0.828,0.819,0.41 -9501,0.828,0.819,0 -9502,0.828,0.819,0.55 -9503,0.828,0.819,0 -9504,0.828,0.819,0 -9505,0.828,0.819,0 -9506,0.828,0.819,0 -9507,0.828,0.819,0 -9508,0.535,0.767,0 -9509,0.535,0.767,0 -9510,0.535,0.767,1.38 -9511,0.535,0.767,0.27 -9512,0.531,0.767,15.39 -9513,0.645,0.713,10.02 -9514,0.532,0.766,27.9 -9515,0.567,0.714,18.74 -9516,0.617,0.708,10.36 -9517,0.617,0.708,28.15 -9518,0.617,0.708,8.57 -9519,0.617,0.708,6.54 -9520,0.684,0.838,18.54 -9521,0.684,0.838,0 -9522,0.684,0.838,11.96 -9523,0.684,0.838,0 -9524,0.606,0.92,3.07 -9525,0.606,0.92,0 -9526,0.606,0.92,2.21 -9527,0.606,0.92,18.42 -9528,0.657,0.806,29.15 -9529,0.657,0.806,9.37 -9530,0.657,0.806,34.58 -9531,0.657,0.806,13.19 -9532,0.664,0.799,30.7 -9533,0.664,0.799,31.23 -9534,0.664,0.799,19.11 -9535,0.664,0.799,23.03 -9536,0.626,0.698,7.32 -9537,0.626,0.698,4.01 -9538,0.626,0.698,0 -9539,0.626,0.698,10.16 -9540,0.828,0.819,0 -9541,0.828,0.819,0 -9542,0.828,0.819,0 -9543,0.828,0.819,0 -9544,0.828,0.819,0 -9545,0.828,0.819,0 -9546,0.828,0.819,0 -9547,0.828,0.819,0 -9548,0.742,0.649,0.15 -9549,0.742,0.649,0 -9550,0.742,0.649,4.53 -9551,0.742,0.649,0.92 -9552,0.742,0.649,2.01 -9553,0.742,0.649,1.59 -9554,0.742,0.649,0.69 -9555,0.742,0.649,0.41 -9556,0.644,0.676,0 -9557,0.644,0.676,13.38 -9558,0.644,0.676,0.01 -9559,0.644,0.676,2.84 -9560,0.631,0.696,20.52 -9561,0.631,0.696,30.26 -9562,0.631,0.696,8.62 -9563,0.631,0.696,20.06 -9564,0.618,0.77,19.74 -9565,0.618,0.77,15.67 -9566,0.618,0.77,13.29 -9567,0.618,0.77,21.51 -9568,0.582,0.93,20.48 -9569,0.582,0.93,17.85 -9570,0.582,0.93,1.69 -9571,0.582,0.93,29.93 -9572,0.573,0.942,7.95 -9573,0.573,0.942,16.79 -9574,0.573,0.942,0.82 -9575,0.573,0.942,6.97 -9576,0.527,0.777,14.95 -9577,0.527,0.777,13.02 -9578,0.527,0.777,17.68 -9579,0.527,0.777,15.81 -9580,0.488,0.765,3.64 -9581,0.488,0.765,17.5 -9582,0.488,0.765,3.64 -9583,0.488,0.765,7.08 -9584,0.645,0.676,0.41 -9585,0.645,0.676,0 -9586,0.645,0.676,0 -9587,0.645,0.676,0 -9588,0.742,0.649,0 -9589,0.742,0.649,0 -9590,0.742,0.649,0 -9591,0.742,0.649,0 -9592,0.742,0.649,4.87 -9593,0.742,0.649,0 -9594,0.742,0.649,7.56 -9595,0.742,0.649,0 -9596,0.313,0.193,0 -9597,0.313,0.193,12.6 -9598,0.313,0.193,20.13 -9599,0.313,0.193,3.92 -9600,0.625,0.83,31.4 -9601,0.625,0.83,13.42 -9602,0.625,0.83,9.34 -9603,0.625,0.83,2.21 -9604,0.662,0.921,3.03 -9605,0.662,0.921,0 -9606,0.662,0.921,0 -9607,0.662,0.921,0 -9608,0.695,0.837,0 -9609,0.695,0.837,0 -9610,0.695,0.837,0 -9611,0.695,0.837,0 -9612,0.567,0.433,2.06 -9613,0.643,0.897,1.31 -9614,0.52,0.219,25.94 -9615,0.643,0.897,0 -9616,0.29,0.184,7.92 -9617,0.29,0.184,3.58 -9618,0.29,0.184,0 -9619,0.29,0.184,1.99 -9620,0.467,0.669,0 -9621,0.467,0.669,2 -9622,0.467,0.669,0.2 -9623,0.467,0.669,3.9 -9624,0.726,0.669,0 -9625,0.726,0.669,0 -9626,0.726,0.669,0.71 -9627,0.726,0.669,0 -9628,0.743,0.74,0 -9629,0.743,0.74,9.83 -9630,0.743,0.74,0 -9631,0.743,0.74,3.35 -9632,0.72,0.645,0.89 -9633,0.72,0.645,2.78 -9634,0.72,0.645,2.15 -9635,0.72,0.645,0 -9636,0.766,0.682,21.71 -9637,0.766,0.682,3.1 -9638,0.766,0.682,7.44 -9639,0.766,0.682,4.03 -9640,0.52,0.678,19.31 -9641,0.52,0.678,28.8 -9642,0.52,0.678,1.92 -9643,0.52,0.678,6.42 -9644,0.588,0.423,1.8 -9645,0.588,0.423,4.74 -9646,0.588,0.423,6.91 -9647,0.588,0.423,15.42 -9648,0.588,0.423,10.38 -9649,0.588,0.423,19.3 -9650,0.565,0.543,3.41 -9651,0.565,0.543,0.28 -9652,0.565,0.543,1.2 -9653,0.565,0.543,0 -9654,0.565,0.543,4.38 -9655,0.565,0.543,0 -9656,0.565,0.543,5.43 -9657,0.565,0.543,4.26 -9658,0.565,0.544,3.04 -9659,0.565,0.544,1.82 -9660,0.565,0.544,6.08 -9661,0.565,0.544,0.54 -9662,0.565,0.543,4.23 -9663,0.565,0.543,3.25 -9664,0.565,0.543,0 -9665,0.565,0.543,0.95 -9666,0.579,0.441,11.44 -9667,0.579,0.441,25.74 -9668,0.579,0.441,12.57 -9669,0.579,0.441,3.83 -9670,0.597,0.414,4.59 -9671,0.597,0.414,0 -9672,0.597,0.414,8.7 -9673,0.61,0.834,2.51 -9674,0.61,0.834,0 -9675,0.61,0.834,1.56 -9676,0.61,0.834,0 -9677,0.61,0.834,0 -9678,0.61,0.834,0 -9679,0.61,0.834,0 -9680,0.61,0.834,0 -9681,0.6,0.797,0 -9682,0.6,0.797,0.89 -9683,0.6,0.797,0 -9684,0.6,0.797,1.33 -9685,0.6,0.797,0 -9686,0.6,0.797,0 -9687,0.6,0.797,0.98 -9688,0.6,0.797,0 -9689,0.6,0.797,5.76 -9690,0.6,0.797,0 -9691,0.6,0.797,0 -9692,0.6,0.797,0 -9693,0.6,0.797,3.98 -9694,0.6,0.797,4.39 -9695,0.6,0.797,2.34 -9696,0.6,0.797,2.41 -9697,0.61,0.834,0 -9698,0.61,0.834,0 -9699,0.61,0.834,0.96 -9700,0.61,0.834,0.76 -9701,0.61,0.834,4.44 -9702,0.61,0.834,0 -9703,0.61,0.834,0 -9704,0.61,0.834,0 -9705,0.69,0.89,1.99 -9706,0.69,0.89,2.17 -9707,0.69,0.89,0 -9708,0.69,0.89,0 -9709,0.69,0.89,2.09 -9710,0.69,0.89,2.24 -9711,0.69,0.89,0 -9712,0.69,0.89,0 -9713,0.634,0.918,1.21 -9714,0.634,0.918,2.08 -9715,0.634,0.918,0.35 -9716,0.634,0.918,0 -9717,0.634,0.918,0 -9718,0.634,0.918,0 -9719,0.634,0.918,0 -9720,0.634,0.918,0 -9721,0.634,0.918,0 -9722,0.634,0.918,0 -9723,0.634,0.918,0 -9724,0.634,0.918,0 -9725,0.634,0.918,0 -9726,0.634,0.918,0 -9727,0.634,0.918,4.49 -9728,0.634,0.918,0 -9729,0.69,0.89,2.24 -9730,0.69,0.89,5.52 -9731,0.69,0.89,14 -9732,0.69,0.89,0.2 -9733,0.69,0.89,0 -9734,0.69,0.89,0 -9735,0.69,0.89,5.89 -9736,0.69,0.89,31.21 -9737,0.774,0.869,11.55 -9738,0.774,0.869,26.68 -9739,0.774,0.869,14.56 -9740,0.774,0.869,23.01 -9741,0.774,0.869,0 -9742,0.774,0.869,0 -9743,0.774,0.869,0 -9744,0.774,0.869,0.04 -9745,0.699,0.935,0.24 -9746,0.699,0.935,0 -9747,0.699,0.935,22.17 -9748,0.699,0.935,0.12 -9749,0.699,0.935,0 -9750,0.699,0.935,0 -9751,0.699,0.935,0 -9752,0.699,0.935,0 -9753,0.699,0.935,0.95 -9754,0.699,0.935,9.88 -9755,0.699,0.935,10.07 -9756,0.699,0.935,18.25 -9757,0.699,0.935,0 -9758,0.699,0.935,0 -9759,0.699,0.935,0 -9760,0.699,0.935,0 -9761,0.774,0.869,0 -9762,0.774,0.869,0 -9763,0.774,0.869,0 -9764,0.774,0.869,5.04 -9765,0.774,0.869,0 -9766,0.774,0.869,3.77 -9767,0.774,0.869,0 -9768,0.774,0.869,0 -9769,0.63,0.856,7.18 -9770,0.63,0.856,6.68 -9771,0.63,0.856,1.59 -9772,0.63,0.856,9.74 -9773,0.63,0.856,3.99 -9774,0.63,0.856,0 -9775,0.63,0.856,0 -9776,0.63,0.856,0 -9777,0.611,0.839,0.2 -9778,0.611,0.839,5.93 -9779,0.611,0.839,0 -9780,0.611,0.839,9.62 -9781,0.611,0.839,12.67 -9782,0.611,0.839,12.09 -9783,0.611,0.839,6.36 -9784,0.611,0.839,15.1 -9785,0.713,0.847,5.91 -9786,0.713,0.847,0 -9787,0.713,0.847,9.2 -9788,0.713,0.847,14.71 -9789,0.713,0.847,0 -9790,0.713,0.847,4.22 -9791,0.713,0.847,0 -9792,0.713,0.847,0 -9793,0.713,0.847,0 -9794,0.713,0.847,0 -9795,0.713,0.847,8.89 -9796,0.713,0.847,0 -9797,0.713,0.847,13.56 -9798,0.713,0.847,2.99 -9799,0.713,0.847,23.3 -9800,0.713,0.847,24.91 -9801,0.611,0.839,6.76 -9802,0.611,0.839,20.39 -9803,0.611,0.839,15.71 -9804,0.611,0.839,27.02 -9805,0.611,0.839,0 -9806,0.611,0.839,0.02 -9807,0.611,0.839,9.36 -9808,0.611,0.839,30.74 -9809,0.63,0.856,0 -9810,0.63,0.856,0 -9811,0.63,0.856,0 -9812,0.63,0.856,0 -9813,0.63,0.856,0 -9814,0.63,0.856,0 -9815,0.63,0.856,0 -9816,0.63,0.856,0 -9817,0.582,0.824,0 -9818,0.582,0.824,0 -9819,0.582,0.824,0 -9820,0.582,0.824,0 -9821,0.582,0.824,0 -9822,0.582,0.824,0 -9823,0.582,0.824,0 -9824,0.582,0.824,1.92 -9825,0.258,0.902,0 -9826,0.258,0.902,14.93 -9827,0.258,0.902,0 -9828,0.258,0.902,3.58 -9829,0.332,0.918,6.14 -9830,0.332,0.918,3.37 -9831,0.332,0.918,2.84 -9832,0.332,0.918,6.7 -9833,0.502,0.922,10.23 -9834,0.502,0.922,1.98 -9835,0.502,0.922,6.73 -9836,0.502,0.922,7.79 -9837,0.457,0.923,4 -9838,0.457,0.923,0.01 -9839,0.457,0.923,3.57 -9840,0.457,0.923,0.54 -9841,0.63,0.918,5.07 -9842,0.63,0.918,12.91 -9843,0.63,0.918,0.35 -9844,0.63,0.918,0 -9845,0.661,0.919,7.47 -9846,0.661,0.919,2.12 -9847,0.661,0.919,8.88 -9848,0.661,0.919,5.75 -9849,0.574,0.915,0 -9850,0.574,0.915,0 -9851,0.574,0.915,0 -9852,0.574,0.915,4 -9853,0.667,0.789,24.36 -9854,0.667,0.789,23.6 -9855,0.667,0.789,1.54 -9856,0.667,0.789,4.34 -9857,0.582,0.824,0 -9858,0.582,0.824,15.36 -9859,0.582,0.824,5.76 -9860,0.582,0.824,22.24 -9861,0.582,0.824,2.95 -9862,0.582,0.824,0 -9863,0.582,0.824,6.12 -9864,0.582,0.824,4.27 -9865,0.626,0.818,0 -9866,0.626,0.818,10.2 -9867,0.626,0.818,0 -9868,0.626,0.818,21.1 -9869,0.63,0.786,10.33 -9870,0.63,0.786,7.65 -9871,0.63,0.786,8.78 -9872,0.63,0.786,17.79 -9873,0.609,0.852,22.42 -9874,0.609,0.852,15.74 -9875,0.609,0.852,8.69 -9876,0.609,0.852,19.25 -9877,0.609,0.852,10.06 -9878,0.609,0.852,3.19 -9879,0.609,0.852,8.17 -9880,0.609,0.852,1.74 -9881,0.693,0.908,7.52 -9882,0.693,0.908,9.65 -9883,0.693,0.908,5.07 -9884,0.693,0.908,7.59 -9885,0.693,0.908,12.27 -9886,0.693,0.908,0 -9887,0.693,0.908,0 -9888,0.693,0.908,0 -9889,0.693,0.908,0 -9890,0.693,0.908,0 -9891,0.693,0.908,0 -9892,0.693,0.908,0 -9893,0.693,0.908,19.42 -9894,0.693,0.908,11.54 -9895,0.693,0.908,28 -9896,0.693,0.908,11.28 -9897,0.609,0.852,0 -9898,0.609,0.852,0 -9899,0.609,0.852,0.75 -9900,0.609,0.852,0 -9901,0.609,0.852,8.64 -9902,0.609,0.852,0.57 -9903,0.609,0.852,0 -9904,0.609,0.852,0 -9905,0.561,0.774,1.32 -9906,0.561,0.774,19.78 -9907,0.561,0.774,1.91 -9908,0.561,0.774,9.6 -9909,0.625,0.818,1.97 -9910,0.625,0.818,15.42 -9911,0.625,0.818,3.7 -9912,0.625,0.818,0 -9913,0.65,0.943,0 -9914,0.65,0.943,0 -9915,0.65,0.943,0 -9916,0.65,0.943,0 -9917,0.65,0.943,6.42 -9918,0.65,0.943,5.71 -9919,0.65,0.943,0 -9920,0.65,0.943,9.57 -9921,0.506,0.895,7.93 -9922,0.506,0.895,0 -9923,0.506,0.895,0 -9924,0.506,0.895,2.31 -9925,0.506,0.895,0 -9926,0.506,0.895,0 -9927,0.506,0.895,0.48 -9928,0.506,0.895,0 -9929,0.369,0.843,0 -9930,0.369,0.843,0 -9931,0.369,0.843,0 -9932,0.369,0.843,1.48 -9933,0.369,0.843,0 -9934,0.369,0.843,0 -9935,0.369,0.843,0 -9936,0.369,0.843,13.28 -9937,0.369,0.843,10.15 -9938,0.369,0.843,24.72 -9939,0.369,0.843,26.29 -9940,0.369,0.843,16.53 -9941,0.369,0.843,0 -9942,0.369,0.843,0 -9943,0.369,0.843,6.1 -9944,0.369,0.843,17.32 -9945,0.506,0.895,7.14 -9946,0.506,0.895,0 -9947,0.506,0.895,9.35 -9948,0.506,0.895,28.55 -9949,0.506,0.895,2.81 -9950,0.506,0.895,19.19 -9951,0.506,0.895,17.38 -9952,0.506,0.895,12.9 -9953,0.65,0.943,1.58 -9954,0.65,0.943,0 -9955,0.65,0.943,0 -9956,0.65,0.943,0 -9957,0.65,0.943,0 -9958,0.65,0.943,0 -9959,0.65,0.943,2.53 -9960,0.65,0.943,0 -9961,0.644,0.959,6.25 -9962,0.644,0.959,2.88 -9963,0.644,0.959,16.38 -9964,0.644,0.959,5.89 -9965,0.494,0.843,4.67 -9966,0.494,0.843,0 -9967,0.494,0.843,2.66 -9968,0.494,0.843,6.57 -9969,0.484,0.831,13.86 -9970,0.484,0.831,17.31 -9971,0.484,0.831,6.78 -9972,0.484,0.831,4.13 -9973,0.522,0.802,0 -9974,0.522,0.802,1.66 -9975,0.522,0.802,1.77 -9976,0.522,0.802,0.73 -9977,0.399,0.819,13.98 -9978,0.399,0.819,22.74 -9979,0.399,0.819,14.66 -9980,0.399,0.819,13.61 -9981,0.386,0.814,37.28 -9982,0.386,0.814,14.12 -9983,0.386,0.814,25.35 -9984,0.386,0.814,13.42 -9985,0.601,0.817,27.83 -9986,0.601,0.817,15.06 -9987,0.601,0.817,24.9 -9988,0.601,0.817,12.9 -9989,0.618,0.811,2.01 -9990,0.618,0.811,15.1 -9991,0.618,0.811,6.31 -9992,0.618,0.811,13.42 -9993,0.564,0.785,2.19 -9994,0.564,0.785,5.26 -9995,0.564,0.785,3.92 -9996,0.564,0.785,17.6 -9997,0.48,0.799,0.91 -9998,0.48,0.799,1.71 -9999,0.48,0.799,3.87 -10000,0.48,0.799,0.27 -10001,0.508,0.864,20.08 -10002,0.508,0.864,3.06 -10003,0.508,0.864,6.49 -10004,0.508,0.864,3.52 -10005,0.631,0.937,5.53 -10006,0.631,0.937,10.17 -10007,0.631,0.937,2.55 -10008,0.631,0.937,6.38 -10009,0.62,0.913,29.25 -10010,0.62,0.913,15.21 -10011,0.62,0.913,0.48 -10012,0.62,0.913,3.89 -10013,0.565,0.896,11.89 -10014,0.565,0.896,23.3 -10015,0.565,0.896,14.57 -10016,0.565,0.896,0.14 -10017,0.555,0.786,0 -10018,0.555,0.786,1.45 -10019,0.555,0.786,0 -10020,0.555,0.786,0.22 -10021,0.555,0.786,1.4 -10022,0.555,0.786,13.9 -10023,0.555,0.786,0.22 -10024,0.555,0.786,11.5 -10025,0.586,0.815,7.36 -10026,0.586,0.815,13.56 -10027,0.586,0.815,20.97 -10028,0.586,0.815,11.3 -10029,0.586,0.815,2.73 -10030,0.586,0.815,0 -10031,0.586,0.815,0 -10032,0.586,0.815,0 -10033,0.586,0.815,0 -10034,0.586,0.815,0 -10035,0.586,0.815,0 -10036,0.586,0.815,0 -10037,0.586,0.815,1.9 -10038,0.586,0.815,1.42 -10039,0.586,0.815,1.55 -10040,0.586,0.815,0 -10041,0.555,0.786,0 -10042,0.555,0.786,0 -10043,0.555,0.786,0 -10044,0.555,0.786,0 -10045,0.555,0.786,0 -10046,0.555,0.786,0 -10047,0.555,0.786,0 -10048,0.555,0.786,0 -10049,0.604,0.877,21.41 -10050,0.604,0.877,4.07 -10051,0.604,0.877,9.52 -10052,0.604,0.877,0 -10053,0.62,0.911,0 -10054,0.62,0.911,2.11 -10055,0.62,0.911,0 -10056,0.62,0.911,0 -10057,0.609,0.939,0 -10058,0.609,0.939,0 -10059,0.609,0.939,0 -10060,0.609,0.939,0 -10061,0.609,0.939,0 -10062,0.609,0.939,0 -10063,0.622,0.938,0 -10064,0.622,0.938,0 -10065,0.622,0.938,0 -10066,0.622,0.938,1.19 -10067,0.437,0.906,3.7 -10068,0.437,0.906,23.18 -10069,0.437,0.906,32.59 -10070,0.437,0.906,2.5 -10071,0.369,0.931,0.75 -10072,0.369,0.931,0 -10073,0.369,0.931,11.12 -10074,0.369,0.931,0 -10075,0.615,0.872,31.16 -10076,0.615,0.872,0 -10077,0.615,0.872,19.2 -10078,0.615,0.872,3.85 -10079,0.437,0.906,17.09 -10080,0.437,0.907,6.34 -10081,0.526,0.867,8.18 -10082,0.453,0.961,22.47 -10083,0.679,0.926,6.82 -10084,0.679,0.926,22.55 -10085,0.679,0.926,5.79 -10086,0.679,0.926,38.03 -10087,0.683,0.937,0 -10088,0.683,0.937,0 -10089,0.683,0.937,0 -10090,0.683,0.937,0 -10091,0.683,0.937,0 -10092,0.683,0.937,0 -10093,0.773,0.869,0 -10094,0.773,0.869,0 -10095,0.773,0.869,0.47 -10096,0.773,0.869,0 -10097,0.687,0.926,19.83 -10098,0.453,0.855,43.75 -10099,0.774,0.864,20.13 -10100,0.462,0.855,47.44 -10101,0.528,0.864,7.46 -10102,0.454,0.961,25.55 -10103,0.398,0.849,31.34 -10104,0.394,0.849,31.87 -10105,0.647,0.852,23.98 -10106,0.649,0.851,0 -10107,0.646,0.851,6.86 -10108,0.649,0.851,1.39 -10109,0.491,0.945,24.36 -10110,0.491,0.945,2.52 -10111,0.495,0.941,6 -10112,0.495,0.941,0.01 -10113,0.448,0.892,35.41 -10114,0.448,0.892,41.34 -10115,0.448,0.892,37.49 -10116,0.448,0.892,37.44 -10117,0.702,0.851,28.08 -10118,0.702,0.851,38.46 -10119,0.702,0.851,27.8 -10120,0.702,0.851,31.46 -10121,0.773,0.862,0 -10122,0.773,0.862,0 -10123,0.773,0.862,1.51 -10124,0.692,0.829,21.23 -10125,0.562,0.825,32.78 -10126,0.695,0.829,15.89 -10127,0.471,0.822,43.3 -10128,0.557,0.922,30.34 -10129,0.482,0.93,14.04 -10130,0.688,0.938,19.42 -10131,0.417,0.908,25.41 -10132,0.49,0.933,4.04 -10133,0.498,0.935,9.32 -10134,0.414,0.907,3.03 -10135,0.414,0.908,2.9 -10136,0.596,0.843,0 -10137,0.596,0.843,0 -10138,0.596,0.843,0.02 -10139,0.596,0.843,0 -10140,0.713,0.941,13.31 -10141,0.418,0.908,3.08 -10142,0.361,0.963,32.32 -10143,0.591,0.852,15.36 -10144,0.778,0.772,2.87 -10145,0.778,0.773,36.41 -10146,0.763,0.759,0 -10147,0.713,0.864,33.35 -10148,0.551,0.842,0 -10149,0.551,0.842,0 -10150,0.551,0.842,0 -10151,0.551,0.842,0 -10152,0.593,0.877,0 -10153,0.593,0.877,0 -10154,0.593,0.877,0 -10155,0.593,0.877,0 -10156,0.593,0.877,0 -10157,0.593,0.877,0 -10158,0.593,0.877,0 -10159,0.593,0.877,0 -10160,0.593,0.877,0 -10161,0.593,0.877,0 -10162,0.593,0.877,0 -10163,0.593,0.877,0 -10164,0.551,0.842,0 -10165,0.551,0.842,0 -10166,0.551,0.842,0 -10167,0.551,0.842,0 -10168,0.551,0.842,0 -10169,0.551,0.842,0 -10170,0.551,0.842,0 -10171,0.551,0.842,0.24 -10172,0.461,0.841,5.25 -10173,0.461,0.841,0 -10174,0.461,0.841,0 -10175,0.461,0.841,0 -10176,0.461,0.841,0 -10177,0.461,0.841,0 -10178,0.461,0.841,0 -10179,0.461,0.841,0 -10180,0.757,0.826,0 -10181,0.757,0.826,0 -10182,0.757,0.826,0 -10183,0.757,0.826,0 -10184,0.757,0.826,3.14 -10185,0.757,0.826,0 -10186,0.757,0.826,0 -10187,0.757,0.826,0 -10188,0.757,0.826,0 -10189,0.757,0.826,0 -10190,0.757,0.826,0 -10191,0.757,0.826,0 -10192,0.757,0.826,0 -10193,0.757,0.826,0 -10194,0.757,0.826,0 -10195,0.757,0.826,0 -10196,0.461,0.841,0 -10197,0.461,0.841,0 -10198,0.461,0.841,0 -10199,0.461,0.841,0 -10200,0.461,0.841,0 -10201,0.461,0.841,0 -10202,0.461,0.841,0 -10203,0.461,0.841,0 -10204,0.626,0.9,0 -10205,0.626,0.9,0 -10206,0.626,0.9,0 -10207,0.626,0.9,0 -10208,0.626,0.9,0 -10209,0.626,0.9,0 -10210,0.626,0.9,0 -10211,0.626,0.9,0 -10212,0.749,0.836,0 -10213,0.749,0.836,0 -10214,0.749,0.836,0 -10215,0.749,0.836,0 -10216,0.749,0.836,0 -10217,0.749,0.836,2.31 -10218,0.749,0.836,11.16 -10219,0.749,0.836,0 -10220,0.749,0.836,0.04 -10221,0.749,0.836,0 -10222,0.749,0.836,0 -10223,0.749,0.836,0 -10224,0.749,0.836,0 -10225,0.749,0.836,0 -10226,0.749,0.836,0 -10227,0.749,0.836,0 -10228,0.626,0.9,0 -10229,0.626,0.9,0 -10230,0.626,0.9,0 -10231,0.626,0.9,0 -10232,0.626,0.9,0 -10233,0.626,0.9,0 -10234,0.626,0.9,0 -10235,0.626,0.9,0 -10236,0.564,0.795,0 -10237,0.564,0.795,0 -10238,0.564,0.795,0 -10239,0.564,0.795,0 -10240,0.658,0.855,0 -10241,0.658,0.855,0 -10242,0.658,0.855,0 -10243,0.658,0.855,1.33 -10244,0.6,0.83,2.63 -10245,0.6,0.83,6.88 -10246,0.6,0.83,13.43 -10247,0.6,0.83,0 -10248,0.6,0.83,20.45 -10249,0.6,0.83,25.79 -10250,0.6,0.83,8 -10251,0.6,0.83,0 -10252,0.6,0.83,21.47 -10253,0.6,0.83,10.28 -10254,0.6,0.83,2.5 -10255,0.6,0.83,18.66 -10256,0.658,0.855,3.54 -10257,0.658,0.855,10.44 -10258,0.658,0.855,0.12 -10259,0.658,0.855,0 -10260,0.658,0.855,0 -10261,0.658,0.855,0 -10262,0.658,0.855,2.51 -10263,0.658,0.855,0 -10264,0.564,0.795,0 -10265,0.564,0.795,0 -10266,0.564,0.795,0 -10267,0.564,0.795,16.54 -10268,0.564,0.795,0 -10269,0.564,0.795,0 -10270,0.564,0.795,0 -10271,0.564,0.795,0 -10272,0.497,0.786,0 -10273,0.497,0.786,0 -10274,0.497,0.786,0 -10275,0.497,0.786,0 -10276,0.497,0.786,0 -10277,0.497,0.786,15.44 -10278,0.497,0.786,0 -10279,0.497,0.786,0 -10280,0.497,0.786,11.19 -10281,0.497,0.786,0 -10282,0.497,0.786,0.01 -10283,0.497,0.786,0 -10284,0.497,0.786,0 -10285,0.497,0.786,0 -10286,0.497,0.786,0 -10287,0.497,0.786,0 -10288,0.435,0.762,0.26 -10289,0.435,0.762,4.17 -10290,0.435,0.762,0 -10291,0.435,0.762,0 -10292,0.435,0.762,12.09 -10293,0.435,0.762,10.66 -10294,0.435,0.762,5.95 -10295,0.435,0.762,6.7 -10296,0.435,0.762,0 -10297,0.435,0.762,0 -10298,0.435,0.762,0 -10299,0.435,0.762,0 -10300,0.435,0.762,0 -10301,0.435,0.762,0 -10302,0.435,0.762,0 -10303,0.435,0.762,0 -10304,0.497,0.786,0 -10305,0.497,0.786,0 -10306,0.497,0.786,6.78 -10307,0.497,0.786,0 -10308,0.497,0.786,23.26 -10309,0.497,0.786,0.09 -10310,0.497,0.786,0 -10311,0.497,0.786,0 -10312,0.497,0.786,0 -10313,0.497,0.786,4.75 -10314,0.497,0.786,0 -10315,0.497,0.786,1.03 -10316,0.497,0.786,0 -10317,0.497,0.786,0 -10318,0.497,0.786,0 -10319,0.497,0.786,0 -10320,0.657,0.869,0 -10321,0.657,0.869,0 -10322,0.657,0.869,1.65 -10323,0.657,0.869,24 -10324,0.657,0.869,0 -10325,0.657,0.869,5.79 -10326,0.657,0.869,8.47 -10327,0.657,0.869,6.42 -10328,0.623,0.879,1.2 -10329,0.623,0.879,0 -10330,0.623,0.879,6.78 -10331,0.623,0.879,0 -10332,0.623,0.879,17.35 -10333,0.623,0.879,2.19 -10334,0.623,0.879,16.65 -10335,0.623,0.879,2.48 -10336,0.569,0.911,0 -10337,0.569,0.911,0.18 -10338,0.569,0.911,0 -10339,0.569,0.911,0 -10340,0.569,0.911,0 -10341,0.569,0.911,1.2 -10342,0.569,0.911,0 -10343,0.569,0.911,0 -10344,0.569,0.911,0 -10345,0.569,0.911,0 -10346,0.569,0.911,0 -10347,0.569,0.911,0 -10348,0.569,0.911,0 -10349,0.569,0.911,0 -10350,0.569,0.911,0.9 -10351,0.569,0.911,0 -10352,0.623,0.879,0.08 -10353,0.623,0.879,0 -10354,0.623,0.879,4.82 -10355,0.623,0.879,4.11 -10356,0.623,0.879,1.47 -10357,0.623,0.879,0 -10358,0.623,0.879,8.59 -10359,0.623,0.879,2.39 -10360,0.657,0.869,11.73 -10361,0.657,0.869,0 -10362,0.657,0.869,2.64 -10363,0.657,0.869,4.46 -10364,0.657,0.869,6.64 -10365,0.657,0.869,15.01 -10366,0.657,0.869,4.7 -10367,0.657,0.869,5.92 -10368,0.528,0.881,0 -10369,0.528,0.881,0 -10370,0.528,0.881,0 -10371,0.528,0.881,0 -10372,0.528,0.881,0 -10373,0.528,0.881,0 -10374,0.53,0.874,0 -10375,0.53,0.874,0 -10376,0.53,0.874,0 -10377,0.53,0.874,0 -10378,0.53,0.874,0 -10379,0.53,0.874,0 -10380,0.53,0.874,0 -10381,0.53,0.874,0 -10382,0.53,0.874,0 -10383,0.53,0.874,0 -10384,0.53,0.874,0 -10385,0.53,0.874,0 -10386,0.53,0.874,0 -10387,0.53,0.874,0 -10388,0.53,0.874,0 -10389,0.53,0.874,0 -10390,0.53,0.874,0 -10391,0.53,0.874,0 -10392,0.528,0.881,0 -10393,0.528,0.881,0 -10394,0.528,0.881,0 -10395,0.528,0.881,0 -10396,0.528,0.881,0 -10397,0.528,0.881,0 -10398,0.528,0.881,0 -10399,0.528,0.881,0 -10400,0.528,0.881,0 -10401,0.528,0.881,0 -10402,0.528,0.881,0 -10403,0.528,0.881,0 -10404,0.528,0.881,0 -10405,0.528,0.881,0 -10406,0.528,0.881,0 -10407,0.528,0.881,0 -10408,0.528,0.881,0 -10409,0.528,0.881,0 -10410,0.528,0.881,0 -10411,0.528,0.881,0 -10412,0.528,0.881,0 -10413,0.528,0.881,0 -10414,0.528,0.881,0 -10415,0.528,0.881,0 -10416,0.53,0.874,0 -10417,0.53,0.874,0 -10418,0.53,0.874,0 -10419,0.53,0.874,0 -10420,0.53,0.874,0 -10421,0.53,0.874,0 -10422,0.53,0.874,0 -10423,0.53,0.874,0 -10424,0.53,0.874,0 -10425,0.53,0.874,0 -10426,0.53,0.874,0 -10427,0.53,0.874,0 -10428,0.524,0.873,0 -10429,0.524,0.873,0 -10430,0.524,0.873,0 -10431,0.524,0.873,0 -10432,0.524,0.873,0 -10433,0.524,0.873,0 -10434,0.524,0.873,0 -10435,0.524,0.873,0 -10436,0.524,0.873,0 -10437,0.524,0.873,0 -10438,0.524,0.873,0 -10439,0.524,0.873,0 -10440,0.531,0.876,0 -10441,0.531,0.876,0 -10442,0.531,0.876,0 -10443,0.531,0.876,0 -10444,0.531,0.876,0 -10445,0.531,0.876,0 -10446,0.531,0.876,0 -10447,0.531,0.876,0 -10448,0.531,0.876,0 -10449,0.531,0.876,0 -10450,0.531,0.876,0 -10451,0.531,0.876,0 -10452,0.531,0.876,22.07 -10453,0.531,0.876,0 -10454,0.531,0.876,25.76 -10455,0.531,0.876,0 -10456,0.531,0.876,0 -10457,0.531,0.876,0 -10458,0.531,0.876,0 -10459,0.531,0.876,1.01 -10460,0.531,0.876,0 -10461,0.531,0.876,0 -10462,0.531,0.876,0.97 -10463,0.531,0.876,0 -10464,0.524,0.873,0 -10465,0.524,0.873,0 -10466,0.524,0.873,0 -10467,0.524,0.873,0 -10468,0.524,0.873,0 -10469,0.524,0.873,0 -10470,0.524,0.873,0 -10471,0.524,0.873,0 -10472,0.524,0.873,0 -10473,0.524,0.873,0 -10474,0.524,0.873,0 -10475,0.524,0.873,0 -10476,0.524,0.873,0 -10477,0.524,0.873,0 -10478,0.524,0.873,0 -10479,0.524,0.873,0 -10480,0.524,0.873,0 -10481,0.524,0.873,0 -10482,0.524,0.873,0 -10483,0.524,0.873,0 -10484,0.524,0.873,0 -10485,0.524,0.873,0 -10486,0.524,0.873,0 -10487,0.524,0.873,0 -10488,0.531,0.876,0 -10489,0.531,0.876,0 -10490,0.531,0.876,0 -10491,0.531,0.876,0 -10492,0.531,0.876,0 -10493,0.531,0.876,0 -10494,0.531,0.876,0 -10495,0.531,0.876,0 -10496,0.531,0.876,0.01 -10497,0.531,0.876,0 -10498,0.531,0.876,0 -10499,0.531,0.876,0 -10500,0.527,0.938,0 -10501,0.527,0.938,0 -10502,0.527,0.938,2 -10503,0.527,0.938,0.5 -10504,0.527,0.938,4.08 -10505,0.553,0.956,0.19 -10506,0.553,0.956,2.72 -10507,0.553,0.956,3.41 -10508,0.553,0.956,0 -10509,0.553,0.956,0 -10510,0.553,0.956,0.29 -10511,0.553,0.956,5.08 -10512,0.553,0.956,15.69 -10513,0.553,0.956,0 -10514,0.553,0.956,0.41 -10515,0.553,0.956,0 -10516,0.553,0.956,0 -10517,0.527,0.938,11.3 -10518,0.527,0.938,0 -10519,0.527,0.938,5.57 -10520,0.527,0.938,0 -10521,0.527,0.938,0 -10522,0.527,0.938,9.36 -10523,0.527,0.938,0 -10524,0.527,0.938,0.66 -10525,0.527,0.938,0 -10526,0.527,0.938,2.93 -10527,0.554,0.882,5.63 -10528,0.554,0.882,0 -10529,0.554,0.882,1.64 -10530,0.554,0.882,0 -10531,0.554,0.882,0 -10532,0.554,0.882,3.03 -10533,0.554,0.882,0 -10534,0.554,0.882,0 -10535,0.554,0.882,3.27 -10536,0.554,0.882,9.03 -10537,0.651,0.94,3.69 -10538,0.651,0.94,7.78 -10539,0.651,0.94,12.8 -10540,0.651,0.94,0.01 -10541,0.574,0.965,4.59 -10542,0.574,0.965,11.62 -10543,0.574,0.965,0 -10544,0.574,0.965,18.79 -10545,0.619,0.97,12.66 -10546,0.619,0.97,0 -10547,0.619,0.97,6.3 -10548,0.619,0.97,0 -10549,0.724,0.93,22.33 -10550,0.724,0.93,10.95 -10551,0.724,0.93,7.66 -10552,0.724,0.93,2.23 -10553,0.554,0.882,20.43 -10554,0.554,0.882,23.89 -10555,0.554,0.882,24.36 -10556,0.554,0.882,28.77 -10557,0.554,0.882,0 -10558,0.554,0.882,16.15 -10559,0.554,0.882,0 -10560,0.554,0.882,20.23 -10561,0.554,0.882,0 -10562,0.554,0.882,0 -10563,0.531,0.889,6.67 -10564,0.531,0.889,0 -10565,0.531,0.889,0 -10566,0.531,0.889,9.64 -10567,0.531,0.889,0 -10568,0.531,0.889,0 -10569,0.531,0.889,30.04 -10570,0.531,0.889,22.18 -10571,0.531,0.889,0 -10572,0.531,0.889,3.01 -10573,0.758,0.949,0.42 -10574,0.758,0.949,0 -10575,0.758,0.949,0 -10576,0.758,0.949,0 -10577,0.758,0.949,0 -10578,0.758,0.949,0 -10579,0.758,0.949,0 -10580,0.758,0.949,10.23 -10581,0.758,0.949,0 -10582,0.758,0.949,0 -10583,0.758,0.949,0 -10584,0.758,0.949,0 -10585,0.758,0.949,0 -10586,0.758,0.949,0 -10587,0.758,0.949,1.68 -10588,0.758,0.949,13.81 -10589,0.531,0.889,2.02 -10590,0.531,0.889,9.56 -10591,0.531,0.889,0 -10592,0.531,0.889,1.07 -10593,0.531,0.889,0 -10594,0.531,0.889,2.56 -10595,0.531,0.889,0 -10596,0.531,0.889,0 -10597,0.531,0.889,0 -10598,0.531,0.889,1.92 -10599,0.523,0.983,5.4 -10600,0.523,0.983,19.28 -10601,0.523,0.983,0 -10602,0.523,0.983,2.05 -10603,0.523,0.983,0.47 -10604,0.523,0.983,0 -10605,0.523,0.983,0 -10606,0.523,0.983,0 -10607,0.523,0.983,0 -10608,0.523,0.983,0 -10609,0.523,0.983,0 -10610,0.523,0.983,0 -10611,0.523,0.983,0 -10612,0.523,0.983,0 -10613,0.523,0.983,0 -10614,0.523,0.983,0 -10615,0.523,0.983,0 -10616,0.523,0.983,0 -10617,0.523,0.983,0 -10618,0.523,0.983,0 -10619,0.523,0.983,0 -10620,0.523,0.983,0 -10621,0.523,0.983,0 -10622,0.523,0.983,0 -10623,0.523,0.983,0 -10624,0.523,0.983,0 -10625,0.523,0.983,0 -10626,0.523,0.983,0 -10627,0.523,0.983,0 -10628,0.523,0.983,0 -10629,0.523,0.983,0 -10630,0.523,0.983,0 -10631,0.523,0.983,0 -10632,0.523,0.983,0 -10633,0.523,0.983,0 -10634,0.523,0.983,0 -10635,0.523,0.983,0 -10636,0.523,0.983,0 -10637,0.523,0.983,0 -10638,0.523,0.983,0 -10639,0.523,0.983,0 -10640,0.523,0.983,0 -10641,0.523,0.983,0 -10642,0.523,0.983,0 -10643,0.523,0.983,0 -10644,0.523,0.983,0 -10645,0.523,0.983,0 -10646,0.523,0.983,0 -10647,0.523,0.983,0 -10648,0.523,0.983,0 -10649,0.523,0.983,0 -10650,0.523,0.983,0 -10651,0.523,0.983,0.96 -10652,0.523,0.983,0 -10653,0.523,0.983,0 -10654,0.523,0.983,0 -10655,0.523,0.983,0 -10656,0.523,0.983,0 -10657,0.523,0.983,0 -10658,0.523,0.983,0 -10659,0.523,0.983,0 -10660,0.523,0.983,0 -10661,0.523,0.983,0 -10662,0.523,0.983,0 -10663,0.523,0.983,0 -10664,0.523,0.983,0 -10665,0.523,0.983,0 -10666,0.523,0.983,0 -10667,0.523,0.983,0 -10668,0.523,0.983,0 -10669,0.523,0.983,0 -10670,0.523,0.983,0 -10671,0.523,0.983,0 -10672,0.523,0.983,0 -10673,0.523,0.983,0 -10674,0.523,0.983,0 -10675,0.523,0.983,0 -10676,0.523,0.983,0 -10677,0.523,0.983,0 -10678,0.523,0.983,0 -10679,0.523,0.983,0 -10680,0.523,0.983,0 -10681,0.523,0.983,0 -10682,0.523,0.983,0 -10683,0.552,0.967,0 -10684,0.552,0.967,0 -10685,0.552,0.967,0 -10686,0.552,0.967,0 -10687,0.552,0.967,0 -10688,0.552,0.967,0 -10689,0.552,0.967,0 -10690,0.552,0.967,0 -10691,0.552,0.967,0 -10692,0.552,0.967,0 -10693,0.552,0.967,0 -10694,0.552,0.967,0 -10695,0.552,0.967,0 -10696,0.552,0.967,0 -10697,0.552,0.967,0 -10698,0.552,0.967,0 -10699,0.552,0.967,0 -10700,0.552,0.967,0 -10701,0.552,0.967,0 -10702,0.552,0.967,0 -10703,0.552,0.967,0 -10704,0.552,0.967,0 -10705,0.552,0.967,0 -10706,0.552,0.967,0 -10707,0.523,0.983,0 -10708,0.523,0.983,0 -10709,0.523,0.983,0 -10710,0.523,0.983,0 -10711,0.523,0.983,0 -10712,0.523,0.983,0 -10713,0.523,0.983,0 -10714,0.523,0.983,0 -10715,0.523,0.983,0 -10716,0.523,0.983,0 -10717,0.523,0.983,0 -10718,0.523,0.983,0 -10719,0.523,0.983,0 -10720,0.523,0.983,0 -10721,0.523,0.983,0 -10722,0.523,0.983,0 -10723,0.523,0.983,0 -10724,0.523,0.983,0 -10725,0.523,0.983,0 -10726,0.523,0.983,0 -10727,0.523,0.983,0 -10728,0.523,0.983,0 -10729,0.523,0.983,0 -10730,0.523,0.983,0 -10731,0.552,0.967,0 -10732,0.552,0.967,0 -10733,0.552,0.967,0 -10734,0.552,0.967,0 -10735,0.552,0.967,0 -10736,0.552,0.967,0 -10737,0.552,0.967,0 -10738,0.552,0.967,0 -10739,0.552,0.967,0 -10740,0.552,0.967,0 -10741,0.552,0.967,0 -10742,0.552,0.967,0 -10743,0.613,0.786,0 -10744,0.613,0.786,0 -10745,0.613,0.786,0 -10746,0.613,0.786,0 -10747,0.613,0.786,0 -10748,0.613,0.786,0 -10749,0.613,0.786,0 -10750,0.613,0.786,0 -10751,0.613,0.786,0 -10752,0.613,0.786,0 -10753,0.613,0.786,0 -10754,0.613,0.786,0 -10755,0.601,0.877,0.99 -10756,0.601,0.877,6.36 -10757,0.601,0.877,0 -10758,0.601,0.877,1.85 -10759,0.601,0.877,0 -10760,0.601,0.877,0 -10761,0.601,0.877,0 -10762,0.601,0.877,0 -10763,0.601,0.877,0 -10764,0.601,0.877,0 -10765,0.601,0.877,0 -10766,0.601,0.877,0 -10767,0.601,0.877,0 -10768,0.601,0.877,0 -10769,0.601,0.877,0 -10770,0.601,0.877,0 -10771,0.601,0.877,0 -10772,0.601,0.877,0 -10773,0.601,0.877,0 -10774,0.601,0.877,0 -10775,0.601,0.877,0 -10776,0.601,0.877,0 -10777,0.601,0.877,0 -10778,0.601,0.877,0 -10779,0.613,0.786,0 -10780,0.613,0.786,0 -10781,0.613,0.786,0 -10782,0.613,0.786,0 -10783,0.613,0.786,0 -10784,0.613,0.786,0 -10785,0.613,0.786,0 -10786,0.613,0.786,0 -10787,0.613,0.786,0 -10788,0.613,0.786,0 -10789,0.613,0.786,0 -10790,0.613,0.786,0 -10791,0.613,0.786,0 -10792,0.613,0.786,0 -10793,0.613,0.786,0 -10794,0.613,0.786,0 -10795,0.613,0.786,0 -10796,0.613,0.786,0 -10797,0.613,0.786,0 -10798,0.613,0.786,0 -10799,0.613,0.786,0 -10800,0.613,0.786,0 -10801,0.613,0.786,0 -10802,0.613,0.786,0 -10803,0.601,0.877,0 -10804,0.601,0.877,0 -10805,0.601,0.877,0 -10806,0.601,0.877,0 -10807,0.601,0.877,0 -10808,0.601,0.877,0 -10809,0.601,0.877,0 -10810,0.601,0.877,0 -10811,0.601,0.877,0 -10812,0.601,0.877,0 -10813,0.601,0.877,0 -10814,0.601,0.877,0 -10815,0.764,0.879,0 -10816,0.764,0.879,0 -10817,0.764,0.879,0 -10818,0.764,0.879,0 -10819,0.764,0.879,0 -10820,0.764,0.879,0 -10821,0.764,0.879,0 -10822,0.764,0.879,0 -10823,0.764,0.879,0 -10824,0.764,0.879,0 -10825,0.764,0.879,0 -10826,0.764,0.879,0 -10827,0.744,0.872,0 -10828,0.744,0.872,0 -10829,0.744,0.872,0 -10830,0.744,0.872,0 -10831,0.744,0.872,0 -10832,0.744,0.872,0 -10833,0.744,0.872,0 -10834,0.744,0.872,0 -10835,0.744,0.872,0 -10836,0.744,0.872,0 -10837,0.744,0.872,0 -10838,0.744,0.872,0 -10839,0.744,0.872,0 -10840,0.744,0.872,0 -10841,0.744,0.872,0 -10842,0.744,0.872,0 -10843,0.744,0.872,0 -10844,0.744,0.872,0 -10845,0.744,0.872,0 -10846,0.744,0.872,0 -10847,0.744,0.872,0 -10848,0.744,0.872,0 -10849,0.744,0.872,0 -10850,0.744,0.872,0 -10851,0.764,0.879,0 -10852,0.764,0.879,0.2 -10853,0.764,0.879,0 -10854,0.764,0.879,0 -10855,0.764,0.879,0 -10856,0.764,0.879,0 -10857,0.764,0.879,0 -10858,0.764,0.879,0 -10859,0.764,0.879,0 -10860,0.764,0.879,0 -10861,0.764,0.879,0 -10862,0.764,0.879,0 -10863,0.764,0.879,0 -10864,0.764,0.879,0 -10865,0.764,0.879,0 -10866,0.764,0.879,0 -10867,0.764,0.879,0 -10868,0.764,0.879,0 -10869,0.764,0.879,0 -10870,0.764,0.879,0 -10871,0.764,0.879,0 -10872,0.764,0.879,0 -10873,0.764,0.879,0 -10874,0.764,0.879,0 -10875,0.744,0.872,0 -10876,0.744,0.872,0 -10877,0.744,0.872,0 -10878,0.744,0.872,0 -10879,0.744,0.872,0 -10880,0.744,0.872,0 -10881,0.744,0.872,0 -10882,0.744,0.872,0 -10883,0.744,0.872,0 -10884,0.744,0.872,0 -10885,0.744,0.872,0 -10886,0.744,0.872,0 -10887,0.774,0.78,0 -10888,0.774,0.78,6.94 -10889,0.774,0.78,0 -10890,0.774,0.78,0 -10891,0.774,0.78,6.02 -10892,0.774,0.78,0 -10893,0.774,0.78,0.05 -10894,0.774,0.78,0 -10895,0.74,0.75,0 -10896,0.74,0.75,0 -10897,0.74,0.75,0 -10898,0.74,0.75,0 -10899,0.74,0.75,0 -10900,0.74,0.75,0 -10901,0.74,0.75,0 -10902,0.74,0.75,0 -10903,0.612,0.785,0 -10904,0.612,0.785,0 -10905,0.612,0.785,0 -10906,0.612,0.785,0 -10907,0.612,0.785,0 -10908,0.612,0.785,0 -10909,0.612,0.785,0 -10910,0.612,0.785,0 -10911,0.612,0.785,0 -10912,0.612,0.785,0 -10913,0.612,0.785,0 -10914,0.612,0.785,0 -10915,0.612,0.785,0 -10916,0.612,0.785,0 -10917,0.612,0.785,0 -10918,0.612,0.785,0 -10919,0.74,0.75,0 -10920,0.74,0.75,0 -10921,0.74,0.75,0 -10922,0.74,0.75,0 -10923,0.74,0.75,0 -10924,0.74,0.75,0 -10925,0.74,0.75,0 -10926,0.74,0.75,0 -10927,0.774,0.78,0 -10928,0.774,0.78,0 -10929,0.774,0.78,0 -10930,0.774,0.78,0 -10931,0.774,0.78,10.57 -10932,0.774,0.78,4.72 -10933,0.774,0.78,35.01 -10934,0.774,0.78,13.11 -10935,0.581,0.818,27.15 -10936,0.581,0.818,1.73 -10937,0.581,0.818,23.85 -10938,0.581,0.818,13.09 -10939,0.581,0.818,3.18 -10940,0.581,0.818,0 -10941,0.581,0.818,28.87 -10942,0.581,0.818,36.97 -10943,0.665,0.811,0 -10944,0.665,0.811,0 -10945,0.665,0.811,27.35 -10946,0.665,0.811,29.78 -10947,0.665,0.811,0 -10948,0.665,0.811,0 -10949,0.665,0.811,0.22 -10950,0.665,0.811,1.7 -10951,0.612,0.785,0 -10952,0.612,0.785,0 -10953,0.612,0.785,1.07 -10954,0.612,0.785,0 -10955,0.612,0.785,0 -10956,0.612,0.785,0 -10957,0.612,0.785,0 -10958,0.612,0.785,0 -10959,0.612,0.785,0 -10960,0.612,0.785,0 -10961,0.612,0.785,0 -10962,0.612,0.785,0 -10963,0.612,0.785,4.16 -10964,0.612,0.785,0 -10965,0.612,0.785,13.18 -10966,0.612,0.785,0 -10967,0.665,0.811,18.93 -10968,0.665,0.811,14.22 -10969,0.665,0.811,25.6 -10970,0.665,0.811,12.53 -10971,0.665,0.811,1.22 -10972,0.665,0.811,11.48 -10973,0.665,0.811,35.52 -10974,0.665,0.811,1.74 -10975,0.581,0.818,17.79 -10976,0.581,0.818,39.98 -10977,0.581,0.818,11.51 -10978,0.581,0.818,31.11 -10979,0.581,0.818,31.07 -10980,0.581,0.818,37.92 -10981,0.581,0.818,10.83 -10982,0.581,0.818,18.3 -10983,0.53,0.919,2.22 -10984,0.53,0.919,0 -10985,0.53,0.919,0.04 -10986,0.53,0.919,18.45 -10987,0.53,0.919,3.65 -10988,0.53,0.919,34.12 -10989,0.53,0.919,16.91 -10990,0.53,0.919,33.22 -10991,0.611,0.867,2.77 -10992,0.611,0.867,28.71 -10993,0.611,0.867,20.96 -10994,0.611,0.867,34.22 -10995,0.611,0.867,0 -10996,0.611,0.867,12.69 -10997,0.611,0.867,16.33 -10998,0.611,0.867,27.11 -10999,0.677,0.841,1.36 -11000,0.677,0.841,0 -11001,0.677,0.841,4 -11002,0.677,0.841,0 -11003,0.677,0.841,0 -11004,0.677,0.841,0 -11005,0.677,0.841,0 -11006,0.677,0.841,0 -11007,0.677,0.841,0 -11008,0.677,0.841,1.89 -11009,0.677,0.841,40.01 -11010,0.677,0.841,27.04 -11011,0.677,0.841,15.04 -11012,0.677,0.841,21.54 -11013,0.677,0.841,6.75 -11014,0.677,0.841,30.24 -11015,0.611,0.867,3.79 -11016,0.611,0.867,13.13 -11017,0.611,0.867,0 -11018,0.611,0.867,11.15 -11019,0.611,0.867,29.96 -11020,0.611,0.867,5.57 -11021,0.611,0.867,20.84 -11022,0.611,0.867,28.76 -11023,0.53,0.919,3.25 -11024,0.53,0.919,0 -11025,0.53,0.919,0 -11026,0.53,0.919,0 -11027,0.53,0.919,6.35 -11028,0.53,0.919,5.02 -11029,0.53,0.919,19.03 -11030,0.53,0.919,3.53 -11031,0.629,0.812,0 -11032,0.629,0.812,0 -11033,0.629,0.812,7.13 -11034,0.629,0.812,1.28 -11035,0.629,0.812,0 -11036,0.629,0.812,0 -11037,0.629,0.812,0 -11038,0.629,0.812,0 -11039,0.511,0.799,0 -11040,0.511,0.799,12.43 -11041,0.511,0.799,0 -11042,0.511,0.799,6.31 -11043,0.477,0.801,9.49 -11044,0.477,0.801,0 -11045,0.477,0.801,7.47 -11046,0.477,0.801,7.08 -11047,0.482,0.819,22.1 -11048,0.482,0.819,37.71 -11049,0.482,0.819,13.87 -11050,0.482,0.819,33.77 -11051,0.593,0.908,20.17 -11052,0.593,0.908,1.58 -11053,0.593,0.908,27.57 -11054,0.593,0.908,0.21 -11055,0.617,0.906,24.31 -11056,0.617,0.906,4.43 -11057,0.617,0.906,25.67 -11058,0.617,0.906,26.35 -11059,0.546,0.895,11.96 -11060,0.564,0.878,37.85 -11061,0.566,0.882,28.77 -11062,0.566,0.88,37.56 -11063,0.541,0.951,0.45 -11064,0.541,0.951,6.51 -11065,0.541,0.951,0 -11066,0.541,0.951,0.39 -11067,0.54,0.944,0 -11068,0.54,0.944,7.58 -11069,0.54,0.944,0 -11070,0.54,0.944,4.31 -11071,0.629,0.812,3.95 -11072,0.629,0.812,0.06 -11073,0.629,0.812,24.25 -11074,0.629,0.812,24.57 -11075,0.629,0.812,19.5 -11076,0.629,0.812,1.58 -11077,0.629,0.812,31.88 -11078,0.629,0.812,18.66 -11079,0.727,0.825,19.73 -11080,0.727,0.825,26.1 -11081,0.727,0.825,3.82 -11082,0.727,0.825,4.3 -11083,0.727,0.825,35.51 -11084,0.727,0.825,16.98 -11085,0.727,0.825,9.17 -11086,0.727,0.825,13.77 -11087,0.611,0.873,11.68 -11088,0.611,0.873,2.82 -11089,0.611,0.873,0 -11090,0.611,0.873,2 -11091,0.611,0.873,0.01 -11092,0.611,0.873,0 -11093,0.611,0.873,0 -11094,0.611,0.873,0 -11095,0.636,0.867,0 -11096,0.636,0.867,0.01 -11097,0.636,0.867,0 -11098,0.636,0.867,0.57 -11099,0.636,0.867,16.02 -11100,0.636,0.867,38.37 -11101,0.636,0.867,23.53 -11102,0.636,0.867,35.81 -11103,0.636,0.867,25.35 -11104,0.636,0.867,45.8 -11105,0.636,0.867,24.03 -11106,0.636,0.867,12.63 -11107,0.636,0.867,0 -11108,0.636,0.867,1.04 -11109,0.636,0.867,0.07 -11110,0.636,0.867,2.64 -11111,0.611,0.873,0 -11112,0.611,0.873,0 -11113,0.611,0.873,19.13 -11114,0.611,0.873,2.49 -11115,0.611,0.873,0 -11116,0.611,0.873,1.99 -11117,0.611,0.873,0 -11118,0.611,0.873,1.99 -11119,0.727,0.825,1.02 -11120,0.727,0.825,19.54 -11121,0.727,0.825,0 -11122,0.727,0.825,0 -11123,0.727,0.825,0.44 -11124,0.727,0.825,0 -11125,0.727,0.825,0 -11126,0.727,0.825,0 -11127,0.574,0.8,0 -11128,0.574,0.8,0 -11129,0.574,0.8,0 -11130,0.574,0.8,0 -11131,0.574,0.8,0 -11132,0.574,0.8,0.76 -11133,0.574,0.8,0 -11134,0.574,0.8,0.55 -11135,0.583,0.83,1.26 -11136,0.583,0.83,1.25 -11137,0.583,0.83,2.36 -11138,0.583,0.83,6.5 -11139,0.583,0.83,16.83 -11140,0.583,0.83,5.67 -11141,0.583,0.83,2.77 -11142,0.583,0.83,23.52 -11143,0.424,0.858,3.98 -11144,0.424,0.858,10.25 -11145,0.424,0.858,32.13 -11146,0.424,0.858,20.12 -11147,0.461,0.783,12.91 -11148,0.461,0.783,5.38 -11149,0.461,0.783,17.59 -11150,0.461,0.783,19.51 -11151,0.384,0.811,5.73 -11152,0.384,0.811,9.89 -11153,0.384,0.811,0 -11154,0.384,0.811,7.07 -11155,0.384,0.81,38.96 -11156,0.384,0.81,17.01 -11157,0.384,0.81,8.29 -11158,0.384,0.81,19.4 -11159,0.583,0.83,22.55 -11160,0.583,0.83,17.28 -11161,0.583,0.83,4.72 -11162,0.583,0.83,1.98 -11163,0.583,0.83,22.13 -11164,0.583,0.83,29.47 -11165,0.583,0.83,27.63 -11166,0.583,0.83,23.06 -11167,0.574,0.8,24.98 -11168,0.574,0.8,38.67 -11169,0.574,0.8,22.02 -11170,0.574,0.8,11.51 -11171,0.574,0.8,0 -11172,0.574,0.8,0.06 -11173,0.574,0.8,0 -11174,0.574,0.8,0.04 -11175,0.682,0.829,0 -11176,0.682,0.829,0 -11177,0.682,0.829,0 -11178,0.682,0.829,0 -11179,0.682,0.829,0 -11180,0.682,0.829,0.01 -11181,0.682,0.829,16.55 -11182,0.682,0.829,12.36 -11183,0.682,0.829,29.76 -11184,0.682,0.829,11.86 -11185,0.682,0.829,32.09 -11186,0.682,0.829,24.01 -11187,0.682,0.829,3.01 -11188,0.682,0.829,8.9 -11189,0.682,0.829,0 -11190,0.682,0.829,4.67 -11191,0.728,0.783,0 -11192,0.728,0.783,0 -11193,0.728,0.783,0.53 -11194,0.728,0.783,7.38 -11195,0.728,0.783,8.8 -11196,0.728,0.783,20.91 -11197,0.728,0.783,8.9 -11198,0.728,0.783,2.17 -11199,0.728,0.783,14.58 -11200,0.728,0.783,1.24 -11201,0.728,0.783,14.41 -11202,0.728,0.783,0 -11203,0.728,0.783,7.35 -11204,0.728,0.783,11.98 -11205,0.728,0.783,0 -11206,0.728,0.783,9.03 -11207,0.679,0.743,0 -11208,0.679,0.743,0 -11209,0.679,0.743,0 -11210,0.679,0.743,0 -11211,0.679,0.743,0 -11212,0.679,0.743,0 -11213,0.679,0.743,0 -11214,0.679,0.743,0 -11215,0.679,0.743,0 -11216,0.679,0.743,0 -11217,0.679,0.743,0 -11218,0.679,0.743,0 -11219,0.679,0.743,0 -11220,0.679,0.743,0 -11221,0.679,0.743,0 -11222,0.679,0.743,0 -11223,0.692,0.907,0 -11224,0.692,0.907,0 -11225,0.692,0.907,0 -11226,0.692,0.907,0 -11227,0.692,0.907,0 -11228,0.692,0.907,0 -11229,0.692,0.907,0 -11230,0.692,0.907,0 -11231,0.692,0.907,0 -11232,0.692,0.907,0 -11233,0.692,0.907,0 -11234,0.692,0.907,0 -11235,0.692,0.907,0 -11236,0.692,0.907,0 -11237,0.692,0.907,0 -11238,0.692,0.907,0 -11239,0.692,0.907,0 -11240,0.692,0.907,0 -11241,0.692,0.907,0 -11242,0.692,0.907,0 -11243,0.692,0.907,0 -11244,0.692,0.907,0 -11245,0.692,0.907,0 -11246,0.692,0.907,0 -11247,0.692,0.907,0 -11248,0.692,0.907,0 -11249,0.692,0.907,0 -11250,0.692,0.907,0 -11251,0.692,0.907,0 -11252,0.692,0.907,0 -11253,0.692,0.907,0 -11254,0.692,0.907,0 -11255,0.692,0.907,0 -11256,0.692,0.907,0 -11257,0.692,0.907,0 -11258,0.692,0.907,0 -11259,0.692,0.907,0 -11260,0.692,0.907,0 -11261,0.692,0.907,0 -11262,0.692,0.907,0 -11263,0.692,0.907,0 -11264,0.692,0.907,0 -11265,0.692,0.907,0 -11266,0.692,0.907,0 -11267,0.692,0.907,0 -11268,0.692,0.907,0 -11269,0.692,0.907,0 -11270,0.692,0.907,0 -11271,0.692,0.907,0 -11272,0.692,0.907,0 -11273,0.692,0.907,0 -11274,0.692,0.907,0 -11275,0.692,0.907,0 -11276,0.692,0.907,0 -11277,0.692,0.907,0 -11278,0.692,0.907,0 -11279,0.692,0.907,0 -11280,0.692,0.907,0 -11281,0.692,0.907,0 -11282,0.692,0.907,0 -11283,0.692,0.907,0 -11284,0.692,0.907,0 -11285,0.692,0.907,0 -11286,0.692,0.907,0 -11287,0.692,0.907,0 -11288,0.692,0.907,0 -11289,0.692,0.907,0 -11290,0.692,0.907,0 -11291,0.692,0.907,0 -11292,0.692,0.907,0 -11293,0.692,0.907,0 -11294,0.692,0.907,0 -11295,0.66,0.927,0 -11296,0.66,0.927,0 -11297,0.66,0.927,0 -11298,0.66,0.927,0 -11299,0.66,0.927,0 -11300,0.66,0.927,0 -11301,0.66,0.927,0 -11302,0.66,0.927,0 -11303,0.66,0.927,0 -11304,0.66,0.927,0 -11305,0.66,0.927,0 -11306,0.66,0.927,0 -11307,0.667,0.923,0 -11308,0.667,0.923,0 -11309,0.667,0.923,0 -11310,0.667,0.923,0 -11311,0.667,0.923,0 -11312,0.667,0.923,0 -11313,0.667,0.923,0.83 -11314,0.667,0.923,0 -11315,0.667,0.923,0 -11316,0.667,0.923,0 -11317,0.667,0.923,0 -11318,0.667,0.923,0 -11319,0.667,0.923,0 -11320,0.667,0.923,1.34 -11321,0.667,0.923,1.72 -11322,0.667,0.923,11.14 -11323,0.667,0.923,0.83 -11324,0.667,0.923,0 -11325,0.667,0.923,1.33 -11326,0.667,0.923,0.54 -11327,0.667,0.923,0 -11328,0.667,0.923,0 -11329,0.667,0.923,0 -11330,0.667,0.923,0 -11331,0.66,0.927,0 -11332,0.66,0.927,0 -11333,0.66,0.927,0 -11334,0.66,0.927,0 -11335,0.66,0.927,0 -11336,0.66,0.927,0 -11337,0.66,0.927,0 -11338,0.66,0.927,0 -11339,0.66,0.927,0 -11340,0.66,0.927,0 -11341,0.66,0.927,0 -11342,0.66,0.927,0 -11343,0.66,0.927,0 -11344,0.66,0.927,0 -11345,0.66,0.927,0 -11346,0.66,0.927,0 -11347,0.66,0.927,0 -11348,0.66,0.927,0 -11349,0.66,0.927,0 -11350,0.66,0.927,0 -11351,0.66,0.927,0 -11352,0.66,0.927,0 -11353,0.66,0.927,0 -11354,0.66,0.927,0 -11355,0.667,0.923,0 -11356,0.667,0.923,0 -11357,0.667,0.923,0 -11358,0.667,0.923,0 -11359,0.667,0.923,22.57 -11360,0.667,0.923,0.53 -11361,0.667,0.923,4.88 -11362,0.667,0.923,7.97 -11363,0.667,0.923,0 -11364,0.667,0.923,21.29 -11365,0.667,0.923,5.1 -11366,0.667,0.923,12.41 -11367,0.612,0.789,0 -11368,0.612,0.789,0 -11369,0.612,0.789,0 -11370,0.612,0.789,0 -11371,0.612,0.789,0 -11372,0.612,0.789,0 -11373,0.612,0.789,0 -11374,0.612,0.789,0 -11375,0.612,0.789,0 -11376,0.612,0.789,0 -11377,0.612,0.789,0 -11378,0.612,0.789,0 -11379,0.612,0.785,0 -11380,0.612,0.785,0 -11381,0.612,0.785,0 -11382,0.612,0.785,0 -11383,0.612,0.785,0 -11384,0.612,0.785,0 -11385,0.612,0.785,0 -11386,0.612,0.785,0 -11387,0.612,0.785,0 -11388,0.612,0.785,0 -11389,0.612,0.785,0 -11390,0.612,0.785,0 -11391,0.612,0.785,0 -11392,0.612,0.785,0 -11393,0.612,0.785,0 -11394,0.612,0.785,0 -11395,0.612,0.785,0 -11396,0.612,0.785,0 -11397,0.612,0.785,0 -11398,0.612,0.785,0 -11399,0.612,0.785,0 -11400,0.612,0.785,0 -11401,0.612,0.785,0 -11402,0.612,0.785,0 -11403,0.612,0.789,0 -11404,0.612,0.789,0 -11405,0.612,0.789,0 -11406,0.612,0.789,0 -11407,0.612,0.789,0 -11408,0.612,0.789,0 -11409,0.612,0.789,0 -11410,0.612,0.789,0 -11411,0.612,0.789,0 -11412,0.612,0.789,0 -11413,0.612,0.789,0 -11414,0.612,0.789,0 -11415,0.612,0.789,0 -11416,0.612,0.789,0 -11417,0.612,0.789,0 -11418,0.612,0.789,0 -11419,0.612,0.789,0 -11420,0.612,0.789,0 -11421,0.612,0.789,0 -11422,0.612,0.789,0 -11423,0.612,0.789,0 -11424,0.612,0.789,0 -11425,0.612,0.789,0 -11426,0.612,0.789,0 -11427,0.612,0.785,0 -11428,0.612,0.785,0 -11429,0.612,0.785,0 -11430,0.612,0.785,0 -11431,0.612,0.785,0 -11432,0.612,0.785,0 -11433,0.612,0.785,0 -11434,0.612,0.785,0 -11435,0.612,0.785,0 -11436,0.612,0.785,0 -11437,0.612,0.785,0 -11438,0.612,0.785,0 -11439,0.623,0.807,0 -11440,0.623,0.807,0 -11441,0.623,0.807,0 -11442,0.623,0.807,0 -11443,0.623,0.807,0 -11444,0.623,0.807,0 -11445,0.623,0.807,0 -11446,0.623,0.807,0 -11447,0.623,0.807,0 -11448,0.623,0.807,0 -11449,0.623,0.807,0 -11450,0.623,0.807,0 -11451,0.612,0.785,0 -11452,0.612,0.785,0 -11453,0.612,0.785,0 -11454,0.612,0.785,0 -11455,0.612,0.785,0 -11456,0.612,0.785,0 -11457,0.612,0.785,0 -11458,0.612,0.785,0 -11459,0.612,0.785,0 -11460,0.612,0.785,0 -11461,0.612,0.785,0 -11462,0.612,0.785,0 -11463,0.612,0.785,0 -11464,0.612,0.785,0 -11465,0.612,0.785,0 -11466,0.612,0.785,0 -11467,0.612,0.785,0 -11468,0.612,0.785,0 -11469,0.612,0.785,0 -11470,0.612,0.785,0 -11471,0.612,0.785,0 -11472,0.612,0.785,0 -11473,0.612,0.785,0 -11474,0.612,0.785,0 -11475,0.623,0.807,0 -11476,0.623,0.807,0 -11477,0.623,0.807,0 -11478,0.623,0.807,0 -11479,0.623,0.807,0 -11480,0.623,0.807,0 -11481,0.623,0.807,0 -11482,0.623,0.807,0 -11483,0.623,0.807,0 -11484,0.623,0.807,0 -11485,0.623,0.807,0 -11486,0.623,0.807,0 -11487,0.623,0.807,0 -11488,0.623,0.807,0 -11489,0.623,0.807,0 -11490,0.623,0.807,0 -11491,0.623,0.807,0 -11492,0.623,0.807,0 -11493,0.623,0.807,0 -11494,0.623,0.807,0 -11495,0.623,0.807,0 -11496,0.623,0.807,0 -11497,0.623,0.807,0 -11498,0.623,0.807,0 -11499,0.612,0.785,0 -11500,0.612,0.785,0 -11501,0.612,0.785,0 -11502,0.612,0.785,0 -11503,0.612,0.785,0 -11504,0.612,0.785,0 -11505,0.612,0.785,0 -11506,0.612,0.785,0 -11507,0.612,0.785,0 -11508,0.612,0.785,0 -11509,0.612,0.785,0 -11510,0.612,0.785,0 -11511,0.518,0.81,0 -11512,0.518,0.81,0 -11513,0.518,0.81,0 -11514,0.518,0.81,0 -11515,0.518,0.81,0 -11516,0.518,0.81,0 -11517,0.518,0.81,0 -11518,0.518,0.81,0 -11519,0.506,0.814,0 -11520,0.506,0.814,0 -11521,0.506,0.814,0 -11522,0.506,0.814,0 -11523,0.506,0.814,0 -11524,0.506,0.814,2.82 -11525,0.506,0.814,0 -11526,0.506,0.814,0.04 -11527,0.502,0.829,8.35 -11528,0.502,0.829,30.62 -11529,0.502,0.829,9.33 -11530,0.502,0.829,41.76 -11531,0.609,0.94,9.72 -11532,0.609,0.94,11.01 -11533,0.609,0.94,17.12 -11534,0.609,0.94,3.29 -11535,0.609,0.94,15.96 -11536,0.609,0.94,4.67 -11537,0.609,0.94,8.97 -11538,0.609,0.94,8.99 -11539,0.455,0.9,6.28 -11540,0.455,0.9,27.38 -11541,0.455,0.9,13.02 -11542,0.455,0.9,30.08 -11543,0.506,0.814,0 -11544,0.506,0.814,5.03 -11545,0.506,0.814,0.33 -11546,0.506,0.814,3.38 -11547,0.506,0.814,0 -11548,0.506,0.814,0 -11549,0.506,0.814,6.09 -11550,0.506,0.814,4.06 -11551,0.518,0.81,0 -11552,0.518,0.81,0 -11553,0.518,0.81,0 -11554,0.518,0.81,0 -11555,0.518,0.81,0 -11556,0.518,0.81,0 -11557,0.518,0.81,0 -11558,0.518,0.81,0 -11559,0.605,0.811,0 -11560,0.605,0.811,0 -11561,0.605,0.811,0 -11562,0.605,0.811,0 -11563,0.605,0.811,0 -11564,0.605,0.811,2.86 -11565,0.605,0.811,0 -11566,0.605,0.811,0 -11567,0.591,0.811,13.2 -11568,0.591,0.811,8.2 -11569,0.591,0.811,0 -11570,0.591,0.811,0 -11571,0.591,0.811,1.61 -11572,0.591,0.811,4.16 -11573,0.591,0.811,1 -11574,0.591,0.811,4.65 -11575,0.602,0.845,0 -11576,0.602,0.845,0 -11577,0.602,0.845,2.83 -11578,0.602,0.845,6.85 -11579,0.602,0.845,0 -11580,0.602,0.845,0 -11581,0.602,0.845,0 -11582,0.602,0.845,0 -11583,0.602,0.845,0 -11584,0.602,0.845,0 -11585,0.602,0.845,0 -11586,0.602,0.845,0 -11587,0.602,0.845,0 -11588,0.602,0.845,13.65 -11589,0.602,0.845,0 -11590,0.602,0.845,0 -11591,0.591,0.811,0 -11592,0.591,0.811,8.19 -11593,0.591,0.811,0 -11594,0.591,0.811,0 -11595,0.591,0.811,0 -11596,0.591,0.811,0 -11597,0.591,0.811,0 -11598,0.591,0.811,0 -11599,0.605,0.811,0 -11600,0.605,0.811,0 -11601,0.605,0.811,0 -11602,0.605,0.811,0 -11603,0.605,0.811,0 -11604,0.605,0.811,0 -11605,0.605,0.811,0 -11606,0.605,0.811,0 -11607,0.649,0.813,1.21 -11608,0.649,0.813,0.62 -11609,0.649,0.813,0 -11610,0.649,0.813,0 -11611,0.649,0.813,0 -11612,0.649,0.813,0 -11613,0.649,0.813,0 -11614,0.649,0.813,0 -11615,0.649,0.811,0 -11616,0.649,0.811,0 -11617,0.649,0.811,0 -11618,0.649,0.811,0 -11619,0.649,0.811,0 -11620,0.649,0.811,0 -11621,0.649,0.811,0 -11622,0.649,0.811,0 -11623,0.649,0.811,0 -11624,0.649,0.811,0 -11625,0.649,0.811,0 -11626,0.649,0.811,0 -11627,0.649,0.811,0 -11628,0.649,0.811,0 -11629,0.649,0.811,0 -11630,0.649,0.811,0 -11631,0.649,0.811,0 -11632,0.649,0.811,0 -11633,0.649,0.811,0 -11634,0.649,0.811,0 -11635,0.649,0.811,0 -11636,0.649,0.811,0 -11637,0.649,0.811,0 -11638,0.649,0.811,0 -11639,0.649,0.811,0 -11640,0.649,0.811,0 -11641,0.649,0.811,0 -11642,0.649,0.811,0 -11643,0.649,0.811,0 -11644,0.649,0.811,0 -11645,0.649,0.811,0 -11646,0.649,0.811,0 -11647,0.649,0.813,0 -11648,0.649,0.813,0 -11649,0.649,0.813,0.43 -11650,0.649,0.813,0 -11651,0.649,0.813,0 -11652,0.649,0.813,0 -11653,0.649,0.813,0 -11654,0.649,0.813,0 -11655,0.692,0.842,0.58 -11656,0.692,0.842,1.97 -11657,0.692,0.842,0.89 -11658,0.692,0.842,0 -11659,0.692,0.842,17.83 -11660,0.692,0.842,4.45 -11661,0.692,0.842,0 -11662,0.692,0.842,13.91 -11663,0.673,0.774,1.91 -11664,0.673,0.774,27.62 -11665,0.673,0.774,0.59 -11666,0.673,0.774,0.45 -11667,0.653,0.759,29.74 -11668,0.653,0.759,0 -11669,0.653,0.759,5.2 -11670,0.653,0.759,0 -11671,0.549,0.749,0 -11672,0.549,0.749,10.33 -11673,0.549,0.749,0 -11674,0.549,0.749,0 -11675,0.549,0.749,0 -11676,0.549,0.749,0 -11677,0.549,0.749,0 -11678,0.549,0.749,0 -11679,0.549,0.749,0 -11680,0.549,0.749,0 -11681,0.549,0.749,0 -11682,0.549,0.749,0 -11683,0.549,0.749,0 -11684,0.549,0.749,0 -11685,0.549,0.749,0 -11686,0.549,0.749,0 -11687,0.673,0.772,0 -11688,0.673,0.772,0 -11689,0.673,0.772,0 -11690,0.673,0.772,0 -11691,0.678,0.792,0 -11692,0.678,0.792,0 -11693,0.678,0.792,4.84 -11694,0.678,0.792,0 -11695,0.692,0.842,3.21 -11696,0.692,0.842,2.03 -11697,0.692,0.842,0 -11698,0.692,0.842,7.68 -11699,0.692,0.842,0 -11700,0.692,0.842,0 -11701,0.692,0.842,0 -11702,0.692,0.842,0 -11703,0.668,0.822,0 -11704,0.668,0.822,0 -11705,0.668,0.822,0 -11706,0.668,0.822,0 -11707,0.668,0.822,0 -11708,0.668,0.822,0 -11709,0.668,0.822,0 -11710,0.668,0.822,0 -11711,0.676,0.792,0 -11712,0.676,0.792,0 -11713,0.676,0.792,0 -11714,0.676,0.792,0 -11715,0.676,0.792,0 -11716,0.676,0.792,0 -11717,0.676,0.792,0 -11718,0.676,0.792,0 -11719,0.622,0.753,0 -11720,0.622,0.753,0 -11721,0.622,0.753,0 -11722,0.622,0.753,0 -11723,0.622,0.753,0 -11724,0.622,0.753,0 -11725,0.622,0.753,0 -11726,0.622,0.753,0 -11727,0.622,0.753,0 -11728,0.622,0.753,0 -11729,0.622,0.753,0 -11730,0.622,0.753,0 -11731,0.622,0.753,0 -11732,0.622,0.753,0 -11733,0.622,0.753,2.07 -11734,0.622,0.753,0 -11735,0.676,0.792,0 -11736,0.676,0.792,0 -11737,0.676,0.792,0 -11738,0.676,0.792,0 -11739,0.676,0.792,0 -11740,0.676,0.792,0 -11741,0.676,0.792,0 -11742,0.676,0.792,0 -11743,0.668,0.822,0 -11744,0.668,0.822,0 -11745,0.668,0.822,0 -11746,0.668,0.822,0 -11747,0.668,0.822,0 -11748,0.668,0.822,0 -11749,0.668,0.822,0 -11750,0.668,0.822,0 -11751,0.682,0.825,0 -11752,0.682,0.825,0 -11753,0.682,0.825,0 -11754,0.682,0.825,0 -11755,0.682,0.825,0 -11756,0.682,0.825,0 -11757,0.682,0.825,0 -11758,0.682,0.825,0 -11759,0.625,0.796,0 -11760,0.625,0.796,0 -11761,0.625,0.796,0 -11762,0.625,0.796,3.99 -11763,0.625,0.796,0 -11764,0.625,0.796,0 -11765,0.625,0.796,0 -11766,0.625,0.796,0 -11767,0.635,0.849,2.08 -11768,0.635,0.849,0 -11769,0.635,0.849,2 -11770,0.635,0.849,17.54 -11771,0.635,0.849,0 -11772,0.635,0.849,0 -11773,0.635,0.849,0 -11774,0.635,0.849,0 -11775,0.635,0.849,5.4 -11776,0.635,0.849,0 -11777,0.635,0.849,20.56 -11778,0.635,0.849,0.59 -11779,0.635,0.849,14.09 -11780,0.635,0.849,17.63 -11781,0.635,0.849,35.74 -11782,0.635,0.849,17.68 -11783,0.625,0.796,3.55 -11784,0.625,0.796,3.4 -11785,0.625,0.796,19.87 -11786,0.625,0.796,12.12 -11787,0.625,0.796,0 -11788,0.625,0.796,5.67 -11789,0.625,0.796,0 -11790,0.625,0.796,8.48 -11791,0.682,0.825,0 -11792,0.682,0.825,0 -11793,0.682,0.825,0 -11794,0.682,0.825,0 -11795,0.682,0.825,0 -11796,0.682,0.825,0 -11797,0.682,0.825,0 -11798,0.682,0.825,0.57 -11799,0.681,0.887,0.11 -11800,0.681,0.887,0 -11801,0.681,0.887,0 -11802,0.681,0.887,0 -11803,0.681,0.887,0 -11804,0.681,0.887,4.8 -11805,0.681,0.887,5.18 -11806,0.681,0.887,0.33 -11807,0.681,0.887,0.35 -11808,0.681,0.887,1.78 -11809,0.681,0.887,0 -11810,0.681,0.887,0 -11811,0.681,0.887,0 -11812,0.681,0.887,0 -11813,0.681,0.887,4.16 -11814,0.681,0.887,0 -11815,0.658,0.856,0.22 -11816,0.658,0.856,0 -11817,0.658,0.856,0 -11818,0.658,0.856,0 -11819,0.658,0.856,0 -11820,0.658,0.856,0 -11821,0.658,0.856,0 -11822,0.658,0.856,0 -11823,0.658,0.856,2.08 -11824,0.658,0.856,0 -11825,0.658,0.856,2.66 -11826,0.658,0.856,0 -11827,0.658,0.856,2.56 -11828,0.658,0.856,4.46 -11829,0.658,0.856,0 -11830,0.658,0.856,2.63 -11831,0.644,0.831,0 -11832,0.644,0.831,1.24 -11833,0.644,0.831,0 -11834,0.644,0.831,0 -11835,0.644,0.831,0.52 -11836,0.644,0.831,0 -11837,0.644,0.831,0 -11838,0.644,0.831,0 -11839,0.644,0.831,0 -11840,0.644,0.831,5.05 -11841,0.644,0.831,0 -11842,0.644,0.831,0 -11843,0.644,0.831,1.98 -11844,0.644,0.831,0 -11845,0.644,0.831,3.08 -11846,0.644,0.831,0 -11847,0.482,0.876,0 -11848,0.482,0.876,0 -11849,0.482,0.876,0 -11850,0.482,0.876,0 -11851,0.482,0.876,0.05 -11852,0.482,0.876,8.29 -11853,0.482,0.876,0 -11854,0.482,0.876,5.36 -11855,0.482,0.876,0 -11856,0.482,0.876,0 -11857,0.482,0.876,0 -11858,0.482,0.876,0 -11859,0.481,0.875,0 -11860,0.481,0.875,0 -11861,0.481,0.875,0 -11862,0.481,0.875,0 -11863,0.481,0.875,0 -11864,0.481,0.875,0 -11865,0.481,0.875,0 -11866,0.481,0.875,0 -11867,0.481,0.875,0 -11868,0.481,0.875,0 -11869,0.481,0.875,0 -11870,0.481,0.875,0 -11871,0.481,0.875,0 -11872,0.481,0.875,0 -11873,0.481,0.875,0 -11874,0.481,0.875,0 -11875,0.481,0.875,0 -11876,0.481,0.875,0 -11877,0.481,0.875,0 -11878,0.481,0.875,0 -11879,0.481,0.875,0 -11880,0.481,0.875,0 -11881,0.481,0.875,0 -11882,0.481,0.875,0 -11883,0.482,0.876,0 -11884,0.482,0.876,0 -11885,0.482,0.876,0 -11886,0.482,0.876,0 -11887,0.482,0.876,0 -11888,0.482,0.876,0 -11889,0.482,0.876,0 -11890,0.482,0.876,0 -11891,0.482,0.876,0 -11892,0.482,0.876,0 -11893,0.482,0.876,0 -11894,0.482,0.876,0 -11895,0.482,0.876,0 -11896,0.482,0.876,0 -11897,0.482,0.876,0 -11898,0.482,0.876,0 -11899,0.482,0.876,0 -11900,0.482,0.876,0 -11901,0.482,0.876,0 -11902,0.482,0.876,0 -11903,0.482,0.876,0 -11904,0.482,0.876,0 -11905,0.482,0.876,0 -11906,0.482,0.876,0 -11907,0.481,0.875,0 -11908,0.481,0.875,0 -11909,0.481,0.875,0 -11910,0.481,0.875,0 -11911,0.481,0.875,0 -11912,0.481,0.875,0 -11913,0.481,0.875,0 -11914,0.481,0.875,0 -11915,0.481,0.875,0 -11916,0.481,0.875,0 -11917,0.481,0.875,0 -11918,0.481,0.875,0 -11919,0.482,0.875,0 -11920,0.482,0.875,0 -11921,0.482,0.875,0 -11922,0.482,0.875,0 -11923,0.482,0.875,0 -11924,0.482,0.875,0 -11925,0.482,0.875,0 -11926,0.482,0.875,0 -11927,0.482,0.875,0 -11928,0.482,0.875,0 -11929,0.482,0.875,0 -11930,0.482,0.875,0 -11931,0.483,0.875,0 -11932,0.483,0.875,0 -11933,0.483,0.875,0 -11934,0.483,0.875,0 -11935,0.483,0.875,0 -11936,0.483,0.875,0 -11937,0.483,0.875,0 -11938,0.483,0.875,0 -11939,0.483,0.875,0 -11940,0.483,0.875,0 -11941,0.483,0.875,0 -11942,0.483,0.875,0 -11943,0.483,0.875,0 -11944,0.483,0.875,0 -11945,0.483,0.875,0 -11946,0.483,0.875,0 -11947,0.483,0.875,0 -11948,0.483,0.875,0 -11949,0.483,0.875,0 -11950,0.483,0.875,0 -11951,0.483,0.875,0 -11952,0.483,0.875,0 -11953,0.483,0.875,0 -11954,0.483,0.875,0 -11955,0.482,0.875,0 -11956,0.482,0.875,0 -11957,0.482,0.875,0 -11958,0.482,0.875,0 -11959,0.482,0.875,0 -11960,0.482,0.875,0 -11961,0.482,0.875,0 -11962,0.482,0.875,0 -11963,0.482,0.875,0 -11964,0.482,0.875,0 -11965,0.482,0.875,0 -11966,0.482,0.875,0 -11967,0.482,0.875,0 -11968,0.482,0.875,0 -11969,0.482,0.875,0 -11970,0.482,0.875,0 -11971,0.482,0.875,0 -11972,0.482,0.875,0 -11973,0.482,0.875,0 -11974,0.482,0.875,0 -11975,0.482,0.875,0 -11976,0.482,0.875,0 -11977,0.482,0.875,0 -11978,0.482,0.875,0 -11979,0.483,0.875,0 -11980,0.483,0.875,0 -11981,0.483,0.875,0 -11982,0.483,0.875,0 -11983,0.483,0.875,0 -11984,0.483,0.875,0 -11985,0.483,0.875,0 -11986,0.483,0.875,0 -11987,0.483,0.875,0 -11988,0.483,0.875,0 -11989,0.483,0.875,0 -11990,0.483,0.875,0 -11991,0.481,0.875,0 -11992,0.481,0.875,0 -11993,0.481,0.875,0 -11994,0.481,0.875,0 -11995,0.481,0.875,0 -11996,0.481,0.875,0 -11997,0.481,0.875,0 -11998,0.481,0.875,0 -11999,0.481,0.875,0 -12000,0.481,0.875,0 -12001,0.481,0.875,0 -12002,0.481,0.875,0 -12003,0.481,0.875,0 -12004,0.481,0.875,0 -12005,0.481,0.875,0 -12006,0.481,0.875,0 -12007,0.481,0.875,0 -12008,0.481,0.875,0 -12009,0.481,0.875,0 -12010,0.481,0.875,0 -12011,0.481,0.875,0 -12012,0.481,0.875,0 -12013,0.481,0.875,0 -12014,0.481,0.875,0 -12015,0.481,0.875,0 -12016,0.481,0.875,0 -12017,0.481,0.875,0 -12018,0.481,0.875,0 -12019,0.481,0.875,0 -12020,0.481,0.875,0 -12021,0.481,0.875,0 -12022,0.481,0.875,0 -12023,0.481,0.875,0 -12024,0.481,0.875,0 -12025,0.481,0.875,0 -12026,0.481,0.875,0 -12027,0.481,0.875,0 -12028,0.481,0.875,0 -12029,0.481,0.875,0 -12030,0.481,0.875,0 -12031,0.481,0.875,0 -12032,0.481,0.875,0 -12033,0.481,0.875,0 -12034,0.481,0.875,0 -12035,0.481,0.875,0 -12036,0.481,0.875,0 -12037,0.481,0.875,0 -12038,0.481,0.875,0 -12039,0.481,0.875,0 -12040,0.481,0.875,0 -12041,0.481,0.875,0 -12042,0.481,0.875,0 -12043,0.481,0.875,0 -12044,0.481,0.875,0 -12045,0.481,0.875,0 -12046,0.481,0.875,0 -12047,0.481,0.875,0 -12048,0.481,0.875,0 -12049,0.481,0.875,0 -12050,0.481,0.875,0 -12051,0.481,0.875,0 -12052,0.481,0.875,0 -12053,0.481,0.875,0 -12054,0.481,0.875,0 -12055,0.481,0.875,0 -12056,0.481,0.875,0 -12057,0.481,0.875,0 -12058,0.481,0.875,0 -12059,0.481,0.875,0 -12060,0.481,0.875,0 -12061,0.481,0.875,0 -12062,0.481,0.875,0 -12063,0.482,0.875,0 -12064,0.482,0.875,0 -12065,0.482,0.875,0 -12066,0.482,0.875,0 -12067,0.482,0.875,0 -12068,0.482,0.875,0 -12069,0.482,0.875,0 -12070,0.482,0.875,0 -12071,0.482,0.875,0 -12072,0.482,0.875,0 -12073,0.482,0.875,0 -12074,0.482,0.875,0 -12075,0.482,0.875,0 -12076,0.482,0.875,0 -12077,0.482,0.875,0 -12078,0.482,0.875,0 -12079,0.482,0.875,0 -12080,0.482,0.875,0 -12081,0.482,0.875,0 -12082,0.482,0.875,0 -12083,0.482,0.875,0 -12084,0.482,0.875,0 -12085,0.482,0.875,0 -12086,0.482,0.875,0 -12087,0.482,0.875,0 -12088,0.482,0.875,0 -12089,0.482,0.875,0 -12090,0.482,0.875,0 -12091,0.482,0.875,0 -12092,0.482,0.875,0 -12093,0.482,0.875,0 -12094,0.482,0.875,0 -12095,0.482,0.875,0 -12096,0.482,0.875,0 -12097,0.482,0.875,0 -12098,0.482,0.875,0 -12099,0.482,0.875,0 -12100,0.482,0.875,0 -12101,0.482,0.875,0 -12102,0.482,0.875,0 -12103,0.482,0.875,0 -12104,0.482,0.875,0 -12105,0.482,0.875,0 -12106,0.482,0.875,0 -12107,0.482,0.875,0 -12108,0.482,0.875,0 -12109,0.482,0.875,0 -12110,0.482,0.875,0 -12111,0.482,0.875,0 -12112,0.482,0.875,0 -12113,0.482,0.875,0 -12114,0.482,0.875,0 -12115,0.482,0.875,0 -12116,0.482,0.875,0 -12117,0.482,0.875,0 -12118,0.482,0.875,0 -12119,0.482,0.875,0 -12120,0.482,0.875,0 -12121,0.482,0.875,0 -12122,0.482,0.875,0 -12123,0.482,0.875,0 -12124,0.482,0.875,0 -12125,0.482,0.875,0 -12126,0.482,0.875,0 -12127,0.482,0.875,0 -12128,0.482,0.875,0 -12129,0.482,0.875,0 -12130,0.482,0.875,0 -12131,0.482,0.875,0 -12132,0.482,0.875,0 -12133,0.482,0.875,0 -12134,0.482,0.875,0 -12135,0.656,0.905,0 -12136,0.656,0.905,0 -12137,0.656,0.905,0.08 -12138,0.656,0.905,0 -12139,0.656,0.905,0 -12140,0.656,0.905,0 -12141,0.656,0.905,0 -12142,0.656,0.905,0 -12143,0.656,0.905,0 -12144,0.656,0.905,0 -12145,0.656,0.905,0 -12146,0.656,0.905,0 -12147,0.699,0.909,0 -12148,0.699,0.909,0 -12149,0.699,0.909,0 -12150,0.699,0.909,0 -12151,0.699,0.909,0 -12152,0.699,0.909,0 -12153,0.699,0.909,0 -12154,0.699,0.909,0 -12155,0.699,0.909,0 -12156,0.699,0.909,0 -12157,0.699,0.909,0 -12158,0.699,0.909,0 -12159,0.699,0.909,0 -12160,0.699,0.909,0 -12161,0.699,0.909,0 -12162,0.699,0.909,0 -12163,0.699,0.909,0 -12164,0.699,0.909,0 -12165,0.699,0.909,0 -12166,0.699,0.909,0 -12167,0.699,0.909,0 -12168,0.699,0.909,0 -12169,0.699,0.909,0 -12170,0.699,0.909,0 -12171,0.656,0.905,0 -12172,0.656,0.905,0 -12173,0.656,0.905,0 -12174,0.656,0.905,0 -12175,0.656,0.905,0 -12176,0.656,0.905,0.22 -12177,0.656,0.905,0 -12178,0.656,0.905,0.26 -12179,0.656,0.905,6.36 -12180,0.656,0.905,4.58 -12181,0.656,0.905,1.69 -12182,0.656,0.905,0 -12183,0.656,0.905,0 -12184,0.656,0.905,0 -12185,0.656,0.905,0 -12186,0.656,0.905,0 -12187,0.656,0.905,0 -12188,0.656,0.905,0 -12189,0.656,0.905,2.75 -12190,0.656,0.905,10.52 -12191,0.656,0.905,0 -12192,0.656,0.905,0 -12193,0.656,0.905,0 -12194,0.656,0.905,0 -12195,0.699,0.909,0 -12196,0.699,0.909,0 -12197,0.699,0.909,0 -12198,0.699,0.909,0 -12199,0.699,0.909,0 -12200,0.699,0.909,0 -12201,0.699,0.909,0 -12202,0.699,0.909,0 -12203,0.699,0.909,0 -12204,0.699,0.909,0 -12205,0.699,0.909,0 -12206,0.699,0.909,0 -12207,0.748,0.916,0 -12208,0.748,0.916,0 -12209,0.748,0.916,0 -12210,0.748,0.916,0 -12211,0.748,0.916,0 -12212,0.748,0.916,0 -12213,0.748,0.916,0 -12214,0.748,0.916,0 -12215,0.748,0.916,0 -12216,0.748,0.916,0 -12217,0.748,0.916,0 -12218,0.748,0.916,0 -12219,0.569,0.867,0 -12220,0.569,0.867,0 -12221,0.569,0.867,0 -12222,0.569,0.867,0 -12223,0.569,0.867,0 -12224,0.569,0.867,0 -12225,0.569,0.867,0 -12226,0.569,0.867,0 -12227,0.569,0.867,0 -12228,0.569,0.867,0 -12229,0.569,0.867,0 -12230,0.569,0.867,0 -12231,0.569,0.867,0 -12232,0.569,0.867,0 -12233,0.569,0.867,0 -12234,0.569,0.867,0 -12235,0.569,0.867,0 -12236,0.569,0.867,0 -12237,0.569,0.867,0 -12238,0.569,0.867,0 -12239,0.569,0.867,0 -12240,0.569,0.867,0 -12241,0.569,0.867,0 -12242,0.569,0.867,0 -12243,0.748,0.916,0 -12244,0.748,0.916,0 -12245,0.748,0.916,0 -12246,0.748,0.916,9.26 -12247,0.748,0.916,0 -12248,0.748,0.916,0 -12249,0.748,0.916,15.27 -12250,0.748,0.916,0.04 -12251,0.748,0.916,0 -12252,0.748,0.916,0 -12253,0.748,0.916,0 -12254,0.748,0.916,0 -12255,0.748,0.916,0 -12256,0.748,0.916,0 -12257,0.748,0.916,7.06 -12258,0.748,0.916,0 -12259,0.748,0.916,16.77 -12260,0.748,0.916,17 -12261,0.748,0.916,9.72 -12262,0.748,0.916,26.02 -12263,0.748,0.916,0 -12264,0.748,0.916,25.87 -12265,0.748,0.916,4.03 -12266,0.748,0.916,13.97 -12267,0.569,0.867,0 -12268,0.569,0.867,0 -12269,0.569,0.867,0 -12270,0.569,0.867,0 -12271,0.569,0.867,0 -12272,0.569,0.867,0 -12273,0.569,0.867,0 -12274,0.569,0.867,0 -12275,0.569,0.867,0 -12276,0.569,0.867,0 -12277,0.569,0.867,0 -12278,0.569,0.867,0 -12279,0.652,0.868,0 -12280,0.652,0.868,0 -12281,0.652,0.868,0 -12282,0.652,0.868,0 -12283,0.652,0.868,0 -12284,0.652,0.868,0 -12285,0.652,0.868,0 -12286,0.652,0.868,0 -12287,0.598,0.859,0 -12288,0.598,0.859,0 -12289,0.598,0.859,0 -12290,0.598,0.859,0 -12291,0.598,0.859,0 -12292,0.598,0.859,0 -12293,0.598,0.859,0 -12294,0.598,0.859,0 -12295,0.595,0.893,0 -12296,0.595,0.893,0 -12297,0.595,0.893,0 -12298,0.595,0.893,0 -12299,0.595,0.893,0 -12300,0.595,0.893,0 -12301,0.595,0.893,0 -12302,0.595,0.893,0 -12303,0.595,0.893,0 -12304,0.595,0.893,0 -12305,0.595,0.893,0 -12306,0.595,0.893,0 -12307,0.595,0.893,0 -12308,0.595,0.893,0 -12309,0.595,0.893,0 -12310,0.595,0.893,0 -12311,0.598,0.859,0 -12312,0.598,0.859,0 -12313,0.598,0.859,1.16 -12314,0.598,0.859,0 -12315,0.598,0.859,0 -12316,0.598,0.859,0 -12317,0.598,0.859,0 -12318,0.598,0.859,0.15 -12319,0.652,0.868,0 -12320,0.652,0.868,0 -12321,0.652,0.868,1.8 -12322,0.652,0.868,0 -12323,0.652,0.868,0 -12324,0.652,0.868,0 -12325,0.652,0.868,0.2 -12326,0.652,0.868,5.51 -12327,0.442,0.841,7.1 -12328,0.442,0.841,0.19 -12329,0.442,0.841,0 -12330,0.442,0.841,0 -12331,0.442,0.841,0 -12332,0.442,0.841,0 -12333,0.442,0.841,0 -12334,0.442,0.841,0.7 -12335,0.463,0.898,0 -12336,0.463,0.898,0 -12337,0.463,0.898,1.42 -12338,0.463,0.898,0 -12339,0.463,0.898,0 -12340,0.463,0.898,0 -12341,0.463,0.898,0 -12342,0.463,0.898,0 -12343,0.587,0.835,0 -12344,0.587,0.835,0 -12345,0.587,0.835,0 -12346,0.587,0.835,0 -12347,0.587,0.835,0 -12348,0.587,0.835,0 -12349,0.587,0.835,0 -12350,0.587,0.835,0 -12351,0.587,0.835,0 -12352,0.587,0.835,0 -12353,0.587,0.835,0 -12354,0.587,0.835,0 -12355,0.587,0.835,0 -12356,0.587,0.835,0 -12357,0.587,0.835,0 -12358,0.587,0.835,0 -12359,0.463,0.898,0 -12360,0.463,0.898,0 -12361,0.463,0.898,0 -12362,0.463,0.898,0 -12363,0.463,0.898,0.95 -12364,0.463,0.898,0 -12365,0.463,0.898,1.47 -12366,0.463,0.898,0 -12367,0.442,0.841,14.49 -12368,0.442,0.841,0.72 -12369,0.442,0.841,5.59 -12370,0.442,0.841,9.8 -12371,0.442,0.841,0 -12372,0.442,0.841,0 -12373,0.442,0.841,0 -12374,0.442,0.841,3.05 -12375,0.569,0.852,9.12 -12376,0.569,0.852,15.02 -12377,0.569,0.852,0 -12378,0.569,0.852,0.43 -12379,0.569,0.852,18.28 -12380,0.569,0.852,31.56 -12381,0.569,0.852,21.7 -12382,0.569,0.852,17.29 -12383,0.474,0.891,3.31 -12384,0.474,0.891,1.42 -12385,0.474,0.891,17.39 -12386,0.474,0.891,11.51 -12387,0.474,0.891,7.23 -12388,0.474,0.891,1.69 -12389,0.474,0.891,3.21 -12390,0.474,0.891,0 -12391,0.599,0.732,0 -12392,0.599,0.732,0 -12393,0.599,0.732,0 -12394,0.599,0.732,0 -12395,0.599,0.732,0 -12396,0.599,0.732,0 -12397,0.599,0.732,0 -12398,0.599,0.732,0 -12399,0.599,0.732,0 -12400,0.599,0.732,0 -12401,0.599,0.732,0 -12402,0.599,0.732,0 -12403,0.599,0.732,7.25 -12404,0.599,0.732,0 -12405,0.599,0.732,20.83 -12406,0.599,0.732,8.45 -12407,0.474,0.891,3.14 -12408,0.474,0.891,12.25 -12409,0.474,0.891,28.54 -12410,0.474,0.891,31.97 -12411,0.474,0.891,6.31 -12412,0.474,0.891,22.2 -12413,0.474,0.891,4.98 -12414,0.474,0.891,30.64 -12415,0.569,0.852,3.93 -12416,0.569,0.852,18.71 -12417,0.569,0.852,13.45 -12418,0.569,0.852,1.32 -12419,0.569,0.852,0.38 -12420,0.569,0.852,0.92 -12421,0.569,0.852,0 -12422,0.569,0.852,0 -12423,0.674,0.903,0 -12424,0.674,0.903,0 -12425,0.674,0.903,0 -12426,0.674,0.903,0 -12427,0.674,0.903,0 -12428,0.674,0.903,2.11 -12429,0.674,0.903,0 -12430,0.674,0.903,0 -12431,0.674,0.903,0 -12432,0.674,0.903,0 -12433,0.674,0.903,0 -12434,0.674,0.903,0.55 -12435,0.674,0.903,0 -12436,0.674,0.903,0 -12437,0.674,0.903,0 -12438,0.674,0.903,0 -12439,0.68,0.695,0 -12440,0.68,0.695,0 -12441,0.68,0.695,0 -12442,0.68,0.695,0 -12443,0.68,0.695,0 -12444,0.68,0.695,3.64 -12445,0.68,0.695,0 -12446,0.68,0.695,0 -12447,0.68,0.695,0 -12448,0.68,0.695,0 -12449,0.68,0.695,0 -12450,0.68,0.695,0 -12451,0.68,0.695,0 -12452,0.68,0.695,0 -12453,0.68,0.695,0 -12454,0.68,0.695,0 -12455,0.682,0.684,0 -12456,0.682,0.684,0 -12457,0.682,0.684,0 -12458,0.682,0.684,0 -12459,0.682,0.684,0 -12460,0.682,0.684,0 -12461,0.682,0.684,0 -12462,0.682,0.684,0 -12463,0.682,0.684,0 -12464,0.682,0.684,0 -12465,0.682,0.684,0 -12466,0.682,0.684,0 -12467,0.682,0.684,4.37 -12468,0.682,0.684,0.12 -12469,0.682,0.684,3.66 -12470,0.682,0.684,0 -12471,0.65,0.947,0 -12472,0.65,0.947,0 -12473,0.65,0.947,0 -12474,0.65,0.947,0 -12475,0.65,0.947,0 -12476,0.65,0.947,0 -12477,0.703,0.962,0 -12478,0.703,0.962,0 -12479,0.703,0.962,0 -12480,0.703,0.962,0 -12481,0.703,0.962,0 -12482,0.703,0.962,0 -12483,0.703,0.962,0 -12484,0.703,0.962,0 -12485,0.703,0.962,0 -12486,0.703,0.962,0 -12487,0.703,0.962,0 -12488,0.703,0.962,0 -12489,0.703,0.962,0 -12490,0.703,0.962,0 -12491,0.703,0.962,0 -12492,0.703,0.962,0 -12493,0.703,0.962,0 -12494,0.703,0.962,0 -12495,0.65,0.947,0 -12496,0.65,0.947,0 -12497,0.65,0.947,0 -12498,0.65,0.947,0 -12499,0.65,0.947,0 -12500,0.65,0.947,0 -12501,0.65,0.947,0 -12502,0.65,0.947,0 -12503,0.65,0.947,0 -12504,0.65,0.947,0 -12505,0.65,0.947,0 -12506,0.65,0.947,0 -12507,0.65,0.947,0 -12508,0.65,0.947,0 -12509,0.65,0.947,0 -12510,0.65,0.947,0 -12511,0.65,0.947,0 -12512,0.65,0.947,0 -12513,0.65,0.947,0 -12514,0.65,0.947,0 -12515,0.65,0.947,0 -12516,0.65,0.947,0 -12517,0.65,0.947,0 -12518,0.65,0.947,0 -12519,0.703,0.962,0 -12520,0.703,0.962,0 -12521,0.703,0.962,0 -12522,0.703,0.962,0 -12523,0.703,0.962,0 -12524,0.703,0.962,0 -12525,0.703,0.962,0 -12526,0.703,0.962,0 -12527,0.703,0.962,0 -12528,0.703,0.962,0 -12529,0.703,0.962,0 -12530,0.703,0.962,0 -12531,0.702,0.962,0 -12532,0.702,0.962,0 -12533,0.702,0.962,0 -12534,0.702,0.962,0 -12535,0.702,0.962,0 -12536,0.702,0.962,0 -12537,0.702,0.962,0 -12538,0.702,0.962,0 -12539,0.702,0.962,0 -12540,0.702,0.962,0 -12541,0.702,0.962,0 -12542,0.702,0.962,0 -12543,0.631,0.941,0 -12544,0.631,0.941,0 -12545,0.631,0.941,0 -12546,0.631,0.941,0 -12547,0.631,0.941,0 -12548,0.631,0.941,0 -12549,0.631,0.941,0 -12550,0.631,0.941,0 -12551,0.631,0.941,0 -12552,0.631,0.941,0 -12553,0.631,0.941,0 -12554,0.631,0.941,0 -12555,0.631,0.941,0 -12556,0.631,0.941,0 -12557,0.631,0.941,0 -12558,0.631,0.941,0 -12559,0.631,0.941,0 -12560,0.631,0.941,0 -12561,0.631,0.941,0 -12562,0.631,0.941,4.64 -12563,0.631,0.941,2.43 -12564,0.631,0.941,0 -12565,0.631,0.941,7.71 -12566,0.631,0.941,0 -12567,0.702,0.962,0 -12568,0.702,0.962,0 -12569,0.702,0.962,0 -12570,0.702,0.962,0 -12571,0.702,0.962,0 -12572,0.702,0.962,0 -12573,0.702,0.962,0 -12574,0.702,0.962,0 -12575,0.702,0.962,0 -12576,0.702,0.962,0 -12577,0.702,0.962,0 -12578,0.702,0.962,0 -12579,0.702,0.962,0 -12580,0.702,0.962,0 -12581,0.702,0.962,0 -12582,0.702,0.962,0 -12583,0.702,0.962,0 -12584,0.702,0.962,0 -12585,0.702,0.962,0 -12586,0.702,0.962,0 -12587,0.702,0.962,0 -12588,0.702,0.962,0 -12589,0.702,0.962,0 -12590,0.702,0.962,1.31 -12591,0.631,0.941,0 -12592,0.631,0.941,0 -12593,0.631,0.941,0 -12594,0.631,0.941,0 -12595,0.631,0.941,31.04 -12596,0.631,0.941,12.24 -12597,0.631,0.941,39.31 -12598,0.631,0.941,13.26 -12599,0.631,0.941,0 -12600,0.631,0.941,4.14 -12601,0.631,0.941,0 -12602,0.631,0.941,13.7 -12603,0.481,0.875,0 -12604,0.481,0.875,0 -12605,0.481,0.875,0 -12606,0.481,0.875,0 -12607,0.481,0.875,0 -12608,0.481,0.875,0 -12609,0.481,0.875,0 -12610,0.481,0.875,0 -12611,0.481,0.875,0 -12612,0.481,0.875,0 -12613,0.481,0.875,0 -12614,0.481,0.875,0 -12615,0.481,0.875,0 -12616,0.481,0.875,0 -12617,0.481,0.875,0 -12618,0.481,0.875,0 -12619,0.481,0.875,0 -12620,0.481,0.875,0 -12621,0.481,0.875,0 -12622,0.481,0.875,0 -12623,0.481,0.875,0 -12624,0.481,0.875,0 -12625,0.481,0.875,0 -12626,0.481,0.875,0 -12627,0.481,0.875,0 -12628,0.481,0.875,0 -12629,0.481,0.875,0 -12630,0.481,0.875,0 -12631,0.481,0.875,0 -12632,0.481,0.875,0 -12633,0.481,0.875,0 -12634,0.481,0.875,0 -12635,0.481,0.875,0 -12636,0.481,0.875,0 -12637,0.481,0.875,0 -12638,0.481,0.875,0 -12639,0.481,0.875,0 -12640,0.481,0.875,0 -12641,0.481,0.875,0 -12642,0.481,0.875,0 -12643,0.481,0.875,0 -12644,0.481,0.875,0 -12645,0.481,0.875,0 -12646,0.481,0.875,0 -12647,0.481,0.875,0 -12648,0.481,0.875,0 -12649,0.481,0.875,0 -12650,0.481,0.875,0 -12651,0.481,0.875,0 -12652,0.481,0.875,0 -12653,0.481,0.875,7.53 -12654,0.481,0.875,0 -12655,0.481,0.875,0 -12656,0.481,0.875,0 -12657,0.481,0.875,0 -12658,0.481,0.875,0 -12659,0.481,0.875,0 -12660,0.481,0.875,0 -12661,0.481,0.875,0 -12662,0.481,0.875,0 -12663,0.481,0.875,0 -12664,0.481,0.875,0 -12665,0.481,0.875,0 -12666,0.481,0.875,0 -12667,0.481,0.875,0 -12668,0.481,0.875,0 -12669,0.481,0.875,0 -12670,0.481,0.875,0 -12671,0.481,0.875,0 -12672,0.481,0.875,0 -12673,0.481,0.875,0 -12674,0.481,0.875,0 -12675,0.481,0.875,0 -12676,0.481,0.875,0 -12677,0.481,0.875,0 -12678,0.481,0.875,0 -12679,0.481,0.875,0 -12680,0.481,0.875,0 -12681,0.481,0.875,0 -12682,0.481,0.875,0 -12683,0.481,0.875,0 -12684,0.481,0.875,0 -12685,0.481,0.875,0 -12686,0.481,0.875,0 -12687,0.481,0.875,0 -12688,0.481,0.875,0 -12689,0.481,0.875,0 -12690,0.481,0.875,0 -12691,0.481,0.875,0 -12692,0.481,0.875,0 -12693,0.481,0.875,0 -12694,0.481,0.875,0 -12695,0.481,0.875,0 -12696,0.481,0.875,0 -12697,0.481,0.875,0 -12698,0.481,0.875,0 -12699,0.481,0.875,0 -12700,0.481,0.875,0 -12701,0.481,0.875,0 -12702,0.481,0.875,0 -12703,0.481,0.875,0 -12704,0.481,0.875,0 -12705,0.481,0.875,0 -12706,0.481,0.875,0 -12707,0.481,0.875,0 -12708,0.481,0.875,0 -12709,0.481,0.875,0 -12710,0.481,0.875,0 -12711,0.481,0.875,0 -12712,0.481,0.875,0 -12713,0.481,0.875,0 -12714,0.481,0.875,0 -12715,0.481,0.875,0 -12716,0.481,0.875,0 -12717,0.481,0.875,0 -12718,0.481,0.875,0 -12719,0.481,0.875,0 -12720,0.481,0.875,0 -12721,0.481,0.875,0 -12722,0.481,0.875,0 -12723,0.481,0.875,0 -12724,0.481,0.875,0 -12725,0.481,0.875,0 -12726,0.481,0.875,0 -12727,0.481,0.875,0 -12728,0.481,0.875,0 -12729,0.481,0.875,0 -12730,0.481,0.875,0 -12731,0.481,0.875,0 -12732,0.481,0.875,0 -12733,0.481,0.875,0 -12734,0.481,0.875,0 -12735,0.463,0.787,0 -12736,0.463,0.787,0 -12737,0.463,0.787,0 -12738,0.463,0.787,0 -12739,0.463,0.787,0 -12740,0.463,0.787,0 -12741,0.464,0.787,0 -12742,0.464,0.787,0 -12743,0.464,0.787,0 -12744,0.464,0.787,0 -12745,0.464,0.787,0 -12746,0.464,0.787,0 -12747,0.464,0.787,0 -12748,0.464,0.787,0 -12749,0.464,0.787,0 -12750,0.464,0.787,0 -12751,0.464,0.787,0 -12752,0.464,0.787,0 -12753,0.464,0.787,0.81 -12754,0.464,0.787,0 -12755,0.464,0.787,0 -12756,0.464,0.787,0 -12757,0.464,0.787,0 -12758,0.464,0.787,3.16 -12759,0.463,0.787,0 -12760,0.463,0.787,0 -12761,0.463,0.787,0 -12762,0.463,0.787,0 -12763,0.463,0.787,0 -12764,0.463,0.787,0 -12765,0.463,0.787,0 -12766,0.463,0.787,0 -12767,0.463,0.787,0 -12768,0.463,0.787,0 -12769,0.463,0.787,0 -12770,0.463,0.787,0 -12771,0.463,0.787,0 -12772,0.463,0.787,0 -12773,0.463,0.787,0 -12774,0.463,0.787,0 -12775,0.463,0.787,0 -12776,0.463,0.787,0 -12777,0.463,0.787,0 -12778,0.463,0.787,0 -12779,0.463,0.787,0 -12780,0.463,0.787,0 -12781,0.463,0.787,0 -12782,0.463,0.787,0 -12783,0.464,0.787,0.31 -12784,0.464,0.787,18.72 -12785,0.464,0.787,0 -12786,0.464,0.787,0 -12787,0.464,0.787,1.04 -12788,0.464,0.787,0.01 -12789,0.464,0.787,2.99 -12790,0.464,0.787,1.37 -12791,0.464,0.787,0 -12792,0.464,0.787,0 -12793,0.464,0.787,0 -12794,0.464,0.787,0 -12795,0.463,0.787,0 -12796,0.463,0.787,0 -12797,0.463,0.787,0 -12798,0.463,0.787,0 -12799,0.463,0.787,0 -12800,0.463,0.787,0 -12801,0.463,0.787,0 -12802,0.463,0.787,0 -12803,0.463,0.787,0 -12804,0.463,0.787,0 -12805,0.463,0.787,0 -12806,0.463,0.787,0 -12807,0.463,0.788,0 -12808,0.463,0.788,0 -12809,0.463,0.788,0 -12810,0.463,0.788,0 -12811,0.463,0.788,0 -12812,0.463,0.788,0 -12813,0.463,0.788,0 -12814,0.463,0.788,0 -12815,0.463,0.788,0 -12816,0.463,0.788,0 -12817,0.463,0.788,0 -12818,0.463,0.788,0 -12819,0.463,0.788,0 -12820,0.463,0.788,0 -12821,0.463,0.788,0 -12822,0.463,0.788,0 -12823,0.463,0.788,0 -12824,0.463,0.788,0 -12825,0.463,0.788,0 -12826,0.463,0.788,0 -12827,0.463,0.788,0 -12828,0.463,0.788,0 -12829,0.463,0.788,0 -12830,0.463,0.788,0 -12831,0.463,0.787,0 -12832,0.463,0.787,0 -12833,0.463,0.787,0 -12834,0.463,0.787,0 -12835,0.463,0.787,0 -12836,0.463,0.787,0 -12837,0.463,0.787,0 -12838,0.463,0.787,0 -12839,0.463,0.787,0 -12840,0.463,0.787,0 -12841,0.463,0.787,0 -12842,0.463,0.787,0 -12843,0.463,0.787,0 -12844,0.463,0.787,0 -12845,0.463,0.787,0 -12846,0.463,0.787,0 -12847,0.463,0.787,0 -12848,0.463,0.787,0 -12849,0.463,0.787,0 -12850,0.463,0.787,0 -12851,0.463,0.787,0 -12852,0.463,0.787,0 -12853,0.463,0.787,0 -12854,0.463,0.787,0 -12855,0.463,0.788,0 -12856,0.463,0.788,0 -12857,0.463,0.788,0 -12858,0.463,0.788,0 -12859,0.463,0.788,0 -12860,0.463,0.788,0 -12861,0.463,0.788,0 -12862,0.463,0.788,0 -12863,0.463,0.788,0 -12864,0.463,0.788,0 -12865,0.463,0.788,0 -12866,0.463,0.788,0 -12867,0.686,0.825,0 -12868,0.686,0.825,0 -12869,0.686,0.825,0 -12870,0.686,0.825,0 -12871,0.686,0.825,0 -12872,0.686,0.825,0 -12873,0.682,0.813,0 -12874,0.682,0.813,0 -12875,0.682,0.813,1.26 -12876,0.682,0.813,0 -12877,0.682,0.813,0 -12878,0.682,0.813,0 -12879,0.682,0.813,0 -12880,0.682,0.813,0 -12881,0.682,0.813,0 -12882,0.682,0.813,0 -12883,0.682,0.813,0 -12884,0.682,0.813,0 -12885,0.682,0.813,0 -12886,0.682,0.813,0 -12887,0.682,0.813,10.16 -12888,0.682,0.813,0 -12889,0.682,0.813,3.8 -12890,0.682,0.813,10.82 -12891,0.686,0.825,0 -12892,0.686,0.825,0 -12893,0.686,0.825,0 -12894,0.686,0.825,0 -12895,0.686,0.825,0 -12896,0.686,0.825,0 -12897,0.686,0.825,0 -12898,0.686,0.825,0 -12899,0.686,0.825,0 -12900,0.686,0.825,0 -12901,0.686,0.825,0 -12902,0.686,0.825,0 -12903,0.686,0.825,0 -12904,0.686,0.825,0 -12905,0.686,0.825,0 -12906,0.686,0.825,0 -12907,0.686,0.825,0 -12908,0.686,0.825,0 -12909,0.686,0.825,0 -12910,0.686,0.825,0 -12911,0.686,0.825,0 -12912,0.686,0.825,0 -12913,0.686,0.825,0 -12914,0.686,0.825,0 -12915,0.682,0.813,0 -12916,0.682,0.813,0.99 -12917,0.682,0.813,0 -12918,0.682,0.813,0 -12919,0.682,0.813,0 -12920,0.682,0.813,0 -12921,0.682,0.813,0 -12922,0.682,0.813,0 -12923,0.682,0.813,0 -12924,0.682,0.813,0 -12925,0.682,0.813,0 -12926,0.682,0.813,0 -12927,0.687,0.814,0 -12928,0.687,0.814,0 -12929,0.687,0.814,0 -12930,0.687,0.814,0 -12931,0.687,0.814,0 -12932,0.687,0.814,0 -12933,0.687,0.814,0 -12934,0.687,0.814,0 -12935,0.687,0.814,0 -12936,0.687,0.814,0 -12937,0.687,0.814,0 -12938,0.687,0.814,0 -12939,0.614,0.825,0 -12940,0.614,0.825,0 -12941,0.614,0.825,0 -12942,0.614,0.825,0 -12943,0.614,0.825,0 -12944,0.614,0.825,0 -12945,0.614,0.825,0 -12946,0.614,0.825,0 -12947,0.614,0.825,0 -12948,0.614,0.825,0 -12949,0.614,0.825,0 -12950,0.614,0.825,0 -12951,0.614,0.825,0 -12952,0.614,0.825,0 -12953,0.614,0.825,0 -12954,0.614,0.825,0 -12955,0.614,0.825,0 -12956,0.614,0.825,0 -12957,0.614,0.825,0 -12958,0.614,0.825,0 -12959,0.614,0.825,0 -12960,0.614,0.825,0 -12961,0.614,0.825,0 -12962,0.614,0.825,0 -12963,0.687,0.814,0 -12964,0.687,0.814,0.19 -12965,0.687,0.814,0 -12966,0.687,0.814,0 -12967,0.687,0.814,0 -12968,0.687,0.814,0 -12969,0.687,0.814,0 -12970,0.687,0.814,0 -12971,0.687,0.814,0 -12972,0.687,0.814,0 -12973,0.687,0.814,0 -12974,0.687,0.814,0 -12975,0.687,0.814,0 -12976,0.687,0.814,0 -12977,0.687,0.814,0 -12978,0.687,0.814,0 -12979,0.687,0.814,0 -12980,0.687,0.814,0 -12981,0.687,0.814,0 -12982,0.687,0.814,0 -12983,0.687,0.814,0 -12984,0.687,0.814,0 -12985,0.687,0.814,0 -12986,0.687,0.814,0 -12987,0.614,0.825,0 -12988,0.614,0.825,0 -12989,0.614,0.825,0 -12990,0.614,0.825,0 -12991,0.614,0.825,0 -12992,0.614,0.825,0 -12993,0.614,0.825,0 -12994,0.614,0.825,0 -12995,0.614,0.825,0 -12996,0.614,0.825,0 -12997,0.614,0.825,0 -12998,0.614,0.825,0 -12999,0.547,0.841,0 -13000,0.547,0.841,0 -13001,0.547,0.841,0 -13002,0.547,0.841,0 -13003,0.547,0.841,0 -13004,0.547,0.841,0 -13005,0.547,0.841,0 -13006,0.547,0.841,0 -13007,0.547,0.841,0 -13008,0.547,0.841,0 -13009,0.547,0.841,0 -13010,0.547,0.841,0 -13011,0.54,0.845,0 -13012,0.54,0.845,0 -13013,0.54,0.845,0 -13014,0.54,0.845,0 -13015,0.54,0.845,0 -13016,0.54,0.845,0 -13017,0.54,0.845,0 -13018,0.54,0.845,0 -13019,0.54,0.845,0 -13020,0.54,0.845,0 -13021,0.54,0.845,0 -13022,0.54,0.845,0 -13023,0.54,0.845,0 -13024,0.54,0.845,0 -13025,0.54,0.845,0 -13026,0.54,0.845,0 -13027,0.562,0.826,0 -13028,0.562,0.826,0 -13029,0.562,0.826,0 -13030,0.562,0.826,0 -13031,0.562,0.826,0 -13032,0.562,0.826,1.74 -13033,0.562,0.826,0 -13034,0.562,0.826,0 -13035,0.562,0.826,0 -13036,0.562,0.826,0 -13037,0.562,0.826,0 -13038,0.562,0.826,0.72 -13039,0.562,0.826,0 -13040,0.562,0.826,0 -13041,0.562,0.826,0 -13042,0.562,0.826,0 -13043,0.72,0.896,0 -13044,0.72,0.896,0 -13045,0.72,0.896,0 -13046,0.72,0.896,0 -13047,0.72,0.896,0 -13048,0.72,0.896,0 -13049,0.72,0.896,0 -13050,0.72,0.896,0 -13051,0.72,0.896,0 -13052,0.72,0.896,0 -13053,0.72,0.896,0 -13054,0.72,0.896,0 -13055,0.7,0.976,0 -13056,0.7,0.976,0 -13057,0.7,0.976,0 -13058,0.7,0.976,0 -13059,0.7,0.976,0 -13060,0.7,0.976,0 -13061,0.7,0.976,0.49 -13062,0.7,0.976,0.72 -13063,0.7,0.976,0 -13064,0.7,0.976,0 -13065,0.7,0.976,3.34 -13066,0.7,0.976,0 -13067,0.7,0.976,5.07 -13068,0.7,0.976,0.7 -13069,0.7,0.976,6.69 -13070,0.7,0.976,0.98 -13071,0.7,0.976,8.53 -13072,0.7,0.976,10.27 -13073,0.7,0.976,10.97 -13074,0.7,0.976,13.53 -13075,0.7,0.976,0 -13076,0.7,0.976,0.02 -13077,0.7,0.976,0 -13078,0.7,0.976,0 -13079,0.72,0.896,0 -13080,0.72,0.896,0 -13081,0.72,0.896,0 -13082,0.72,0.896,0 -13083,0.72,0.896,0 -13084,0.72,0.896,0 -13085,0.72,0.896,0 -13086,0.72,0.896,0 -13087,0.72,0.896,0 -13088,0.72,0.896,0 -13089,0.72,0.896,0 -13090,0.72,0.896,0 -13091,0.72,0.896,0 -13092,0.72,0.896,0 -13093,0.72,0.896,0 -13094,0.72,0.896,0 -13095,0.72,0.896,0 -13096,0.72,0.896,0 -13097,0.72,0.896,0 -13098,0.72,0.896,0 -13099,0.72,0.896,0 -13100,0.72,0.896,0 -13101,0.72,0.896,0 -13102,0.72,0.896,0 -13103,0.7,0.976,0 -13104,0.7,0.976,2.05 -13105,0.7,0.976,0 -13106,0.7,0.976,0 -13107,0.7,0.976,5.48 -13108,0.7,0.976,0.68 -13109,0.7,0.976,0 -13110,0.7,0.976,0 -13111,0.7,0.976,1.94 -13112,0.7,0.976,0 -13113,0.7,0.976,0 -13114,0.7,0.976,0 -13115,0.761,0.926,0 -13116,0.761,0.926,0 -13117,0.761,0.926,0 -13118,0.761,0.926,0 -13119,0.761,0.926,0 -13120,0.761,0.926,1.71 -13121,0.761,0.926,0 -13122,0.761,0.926,0 -13123,0.761,0.926,0 -13124,0.761,0.926,0 -13125,0.761,0.926,0 -13126,0.761,0.926,0 -13127,0.753,0.918,0 -13128,0.753,0.918,0 -13129,0.753,0.918,0 -13130,0.753,0.918,0 -13131,0.753,0.918,0 -13132,0.753,0.918,0 -13133,0.753,0.918,0 -13134,0.753,0.918,0 -13135,0.753,0.918,0 -13136,0.753,0.918,0 -13137,0.753,0.918,0 -13138,0.753,0.918,0 -13139,0.753,0.918,0 -13140,0.753,0.918,0 -13141,0.753,0.918,0 -13142,0.753,0.918,0 -13143,0.753,0.918,0 -13144,0.753,0.918,0 -13145,0.753,0.918,0 -13146,0.753,0.918,0 -13147,0.753,0.918,0 -13148,0.753,0.918,0 -13149,0.753,0.918,0 -13150,0.753,0.918,0 -13151,0.761,0.926,0 -13152,0.761,0.926,0 -13153,0.761,0.926,0 -13154,0.761,0.926,0 -13155,0.761,0.926,0 -13156,0.761,0.926,0 -13157,0.761,0.926,0 -13158,0.761,0.926,0 -13159,0.761,0.926,0 -13160,0.761,0.926,0 -13161,0.761,0.926,0 -13162,0.761,0.926,0 -13163,0.761,0.926,0 -13164,0.761,0.926,0 -13165,0.761,0.926,0 -13166,0.761,0.926,0 -13167,0.761,0.926,0 -13168,0.761,0.926,0 -13169,0.761,0.926,0 -13170,0.761,0.926,0 -13171,0.761,0.926,0 -13172,0.761,0.926,0 -13173,0.761,0.926,0 -13174,0.761,0.926,0 -13175,0.753,0.918,0 -13176,0.753,0.918,0 -13177,0.753,0.918,0 -13178,0.753,0.918,0 -13179,0.753,0.918,0 -13180,0.753,0.918,0 -13181,0.753,0.918,0 -13182,0.753,0.918,0 -13183,0.753,0.918,0 -13184,0.753,0.918,0 -13185,0.753,0.918,0 -13186,0.753,0.918,0 -13187,0.649,0.825,0 -13188,0.649,0.825,0 -13189,0.649,0.825,0 -13190,0.649,0.825,0 -13191,0.649,0.825,0 -13192,0.649,0.825,0 -13193,0.649,0.825,0 -13194,0.649,0.825,0 -13195,0.649,0.825,0 -13196,0.649,0.825,0 -13197,0.649,0.825,0 -13198,0.649,0.825,0 -13199,0.649,0.825,0 -13200,0.649,0.825,0 -13201,0.649,0.825,0 -13202,0.649,0.825,0 -13203,0.649,0.825,0 -13204,0.649,0.825,0 -13205,0.649,0.825,0 -13206,0.649,0.825,0 -13207,0.649,0.825,0 -13208,0.649,0.825,0 -13209,0.649,0.825,0 -13210,0.649,0.825,0 -13211,0.649,0.825,0 -13212,0.649,0.825,0 -13213,0.649,0.825,0 -13214,0.649,0.825,0 -13215,0.649,0.825,0 -13216,0.649,0.825,0 -13217,0.649,0.825,0 -13218,0.649,0.825,0 -13219,0.649,0.825,0 -13220,0.649,0.825,0 -13221,0.649,0.825,0 -13222,0.649,0.825,0 -13223,0.649,0.825,0 -13224,0.649,0.825,0 -13225,0.649,0.825,0 -13226,0.649,0.825,0 -13227,0.649,0.825,0 -13228,0.649,0.825,0 -13229,0.649,0.825,0 -13230,0.649,0.825,0 -13231,0.649,0.825,0 -13232,0.649,0.825,0 -13233,0.649,0.825,0 -13234,0.649,0.825,0 -13235,0.649,0.825,0 -13236,0.649,0.825,0 -13237,0.649,0.825,0 -13238,0.649,0.825,0 -13239,0.649,0.825,0 -13240,0.649,0.825,0 -13241,0.649,0.825,0 -13242,0.649,0.825,0 -13243,0.649,0.825,0 -13244,0.649,0.825,0 -13245,0.649,0.825,0 -13246,0.649,0.825,0 -13247,0.649,0.825,0 -13248,0.649,0.825,0 -13249,0.649,0.825,0 -13250,0.649,0.825,0 -13251,0.649,0.825,0 -13252,0.649,0.825,0 -13253,0.649,0.825,0 -13254,0.649,0.825,0 -13255,0.649,0.825,0 -13256,0.649,0.825,0 -13257,0.649,0.825,0 -13258,0.649,0.825,0 -13259,0.722,0.897,0 -13260,0.722,0.897,0 -13261,0.722,0.897,0 -13262,0.722,0.897,0 -13263,0.722,0.897,0 -13264,0.722,0.897,0 -13265,0.722,0.897,0 -13266,0.722,0.897,0 -13267,0.722,0.897,0 -13268,0.722,0.897,0 -13269,0.722,0.897,0 -13270,0.722,0.897,0 -13271,0.673,0.855,0 -13272,0.673,0.855,0 -13273,0.673,0.855,0 -13274,0.673,0.855,0 -13275,0.673,0.855,0 -13276,0.673,0.855,0 -13277,0.673,0.855,0 -13278,0.673,0.855,0 -13279,0.673,0.855,0 -13280,0.673,0.855,0 -13281,0.673,0.855,0 -13282,0.673,0.855,0 -13283,0.673,0.855,0 -13284,0.673,0.855,0 -13285,0.673,0.855,0 -13286,0.673,0.855,0 -13287,0.673,0.855,0 -13288,0.673,0.855,0 -13289,0.673,0.855,0 -13290,0.673,0.855,0 -13291,0.673,0.855,0 -13292,0.673,0.855,0 -13293,0.673,0.855,0 -13294,0.673,0.855,0 -13295,0.722,0.897,0 -13296,0.722,0.897,0 -13297,0.722,0.897,0 -13298,0.722,0.897,0 -13299,0.722,0.897,0 -13300,0.722,0.897,0 -13301,0.722,0.897,0 -13302,0.722,0.897,0 -13303,0.722,0.897,0 -13304,0.722,0.897,0 -13305,0.722,0.897,0 -13306,0.722,0.897,0 -13307,0.722,0.897,0 -13308,0.722,0.897,0 -13309,0.722,0.897,0 -13310,0.722,0.897,0 -13311,0.722,0.897,0 -13312,0.722,0.897,0 -13313,0.722,0.897,0 -13314,0.722,0.897,0 -13315,0.722,0.897,0 -13316,0.722,0.897,0 -13317,0.722,0.897,0 -13318,0.722,0.897,0 -13319,0.673,0.855,0 -13320,0.673,0.855,0 -13321,0.673,0.855,0 -13322,0.673,0.855,0 -13323,0.673,0.855,0 -13324,0.673,0.855,0 -13325,0.673,0.855,0 -13326,0.673,0.855,0 -13327,0.673,0.855,0 -13328,0.673,0.855,0 -13329,0.673,0.855,0 -13330,0.673,0.855,0 -13331,0.583,0.92,0 -13332,0.583,0.92,1.19 -13333,0.583,0.92,0 -13334,0.583,0.92,4.89 -13335,0.583,0.92,1.2 -13336,0.583,0.92,2 -13337,0.583,0.92,6.49 -13338,0.583,0.92,1.03 -13339,0.583,0.92,0 -13340,0.583,0.92,0 -13341,0.583,0.92,0 -13342,0.583,0.92,0 -13343,0.57,0.92,0 -13344,0.57,0.92,0 -13345,0.57,0.92,0 -13346,0.57,0.92,0 -13347,0.57,0.92,0 -13348,0.57,0.92,0 -13349,0.57,0.92,0 -13350,0.57,0.92,0 -13351,0.57,0.92,0 -13352,0.57,0.92,0 -13353,0.57,0.92,0 -13354,0.57,0.92,0 -13355,0.57,0.92,0 -13356,0.57,0.92,0 -13357,0.57,0.92,0 -13358,0.57,0.92,0 -13359,0.57,0.92,0 -13360,0.57,0.92,0 -13361,0.57,0.92,0 -13362,0.57,0.92,0 -13363,0.57,0.92,0 -13364,0.57,0.92,0 -13365,0.57,0.92,0 -13366,0.57,0.92,0 -13367,0.583,0.92,0 -13368,0.583,0.92,0 -13369,0.583,0.92,0 -13370,0.583,0.92,0 -13371,0.583,0.92,7.71 -13372,0.583,0.92,4.03 -13373,0.583,0.92,0 -13374,0.583,0.92,0 -13375,0.583,0.92,0 -13376,0.583,0.92,2.58 -13377,0.583,0.92,0 -13378,0.583,0.92,0 -13379,0.583,0.92,0 -13380,0.583,0.92,0 -13381,0.583,0.92,0 -13382,0.583,0.92,0 -13383,0.583,0.92,0 -13384,0.583,0.92,0 -13385,0.583,0.92,0 -13386,0.583,0.92,0 -13387,0.583,0.92,0 -13388,0.583,0.92,0 -13389,0.583,0.92,0 -13390,0.583,0.92,0 -13391,0.57,0.92,0 -13392,0.57,0.92,0 -13393,0.57,0.92,0 -13394,0.57,0.92,0 -13395,0.57,0.92,0 -13396,0.57,0.92,0 -13397,0.57,0.92,0 -13398,0.57,0.92,0 -13399,0.57,0.92,0 -13400,0.57,0.92,0 -13401,0.57,0.92,0 -13402,0.57,0.92,0 -13403,0.57,0.92,0 -13404,0.57,0.92,0 -13405,0.57,0.92,0 -13406,0.57,0.92,0 -13407,0.57,0.92,0 -13408,0.57,0.92,0 -13409,0.57,0.92,0 -13410,0.57,0.92,0 -13411,0.57,0.92,0 -13412,0.57,0.92,0 -13413,0.57,0.92,0 -13414,0.57,0.92,0 -13415,0.495,0.901,0 -13416,0.495,0.901,0 -13417,0.495,0.901,0 -13418,0.495,0.901,0 -13419,0.495,0.901,0 -13420,0.495,0.901,0 -13421,0.495,0.901,0 -13422,0.495,0.901,0.97 -13423,0.495,0.901,0 -13424,0.495,0.901,0 -13425,0.495,0.901,0.01 -13426,0.495,0.901,2.16 -13427,0.495,0.901,0 -13428,0.495,0.901,7.41 -13429,0.495,0.901,8.93 -13430,0.495,0.901,27.99 -13431,0.495,0.901,0 -13432,0.495,0.901,0 -13433,0.495,0.901,0.41 -13434,0.495,0.901,0 -13435,0.495,0.901,0 -13436,0.495,0.901,0 -13437,0.495,0.901,0 -13438,0.495,0.901,0 -13439,0.57,0.92,0 -13440,0.57,0.92,0 -13441,0.57,0.92,0 -13442,0.57,0.92,0 -13443,0.57,0.92,0 -13444,0.57,0.92,0 -13445,0.57,0.92,0 -13446,0.57,0.92,1.79 -13447,0.57,0.92,0 -13448,0.57,0.92,0 -13449,0.57,0.92,0 -13450,0.57,0.92,0 -13451,0.57,0.92,0 -13452,0.57,0.92,0 -13453,0.57,0.92,0 -13454,0.57,0.92,0 -13455,0.57,0.92,0 -13456,0.57,0.92,0 -13457,0.57,0.92,0 -13458,0.57,0.92,0 -13459,0.57,0.92,0 -13460,0.57,0.92,0 -13461,0.57,0.92,0 -13462,0.57,0.92,0 -13463,0.495,0.901,0 -13464,0.495,0.901,0 -13465,0.495,0.901,0 -13466,0.495,0.901,0 -13467,0.495,0.901,6.89 -13468,0.495,0.901,0 -13469,0.495,0.901,0 -13470,0.495,0.901,0 -13471,0.495,0.901,17.5 -13472,0.495,0.901,11.77 -13473,0.495,0.901,17.72 -13474,0.495,0.901,3.92 -13475,0.716,0.895,2.26 -13476,0.716,0.895,3.28 -13477,0.716,0.895,0 -13478,0.716,0.895,4.18 -13479,0.716,0.895,0.39 -13480,0.716,0.895,0 -13481,0.716,0.895,1.64 -13482,0.716,0.895,6.27 -13483,0.716,0.895,1.31 -13484,0.716,0.895,0 -13485,0.716,0.895,5.13 -13486,0.716,0.895,1.84 -13487,0.722,0.895,1.23 -13488,0.722,0.895,0 -13489,0.722,0.895,0 -13490,0.722,0.895,0 -13491,0.722,0.895,0 -13492,0.722,0.895,0 -13493,0.722,0.895,0.75 -13494,0.722,0.895,0 -13495,0.722,0.895,0 -13496,0.722,0.895,0 -13497,0.722,0.895,0 -13498,0.722,0.895,0 -13499,0.722,0.895,1.31 -13500,0.722,0.895,0 -13501,0.722,0.895,1.81 -13502,0.722,0.895,0 -13503,0.722,0.895,4.64 -13504,0.722,0.895,4.8 -13505,0.722,0.895,1.74 -13506,0.722,0.895,8.09 -13507,0.722,0.895,0.65 -13508,0.722,0.895,2.01 -13509,0.722,0.895,2.09 -13510,0.722,0.895,3.92 -13511,0.716,0.895,6.5 -13512,0.716,0.895,6.9 -13513,0.716,0.895,0.04 -13514,0.716,0.895,8.27 -13515,0.716,0.895,8.16 -13516,0.716,0.895,1.13 -13517,0.716,0.895,7.48 -13518,0.716,0.895,0 -13519,0.716,0.895,0 -13520,0.716,0.895,2.71 -13521,0.716,0.895,0 -13522,0.716,0.895,0 -13523,0.716,0.895,0 -13524,0.716,0.895,0 -13525,0.716,0.895,0 -13526,0.716,0.895,0 -13527,0.716,0.895,0.55 -13528,0.716,0.895,6.15 -13529,0.716,0.895,0 -13530,0.716,0.895,0 -13531,0.716,0.895,4.78 -13532,0.716,0.895,8.18 -13533,0.716,0.895,0 -13534,0.716,0.895,2.11 -13535,0.722,0.895,7.82 -13536,0.722,0.895,0.38 -13537,0.722,0.895,1.67 -13538,0.722,0.895,0 -13539,0.722,0.895,0 -13540,0.722,0.895,1.33 -13541,0.722,0.895,0 -13542,0.722,0.895,0 -13543,0.722,0.895,1.34 -13544,0.722,0.895,0 -13545,0.722,0.895,0 -13546,0.722,0.895,0 -13547,0.739,0.895,0 -13548,0.739,0.895,0 -13549,0.739,0.895,0.01 -13550,0.739,0.895,12.57 -13551,0.739,0.895,0 -13552,0.739,0.895,0 -13553,0.739,0.895,0 -13554,0.739,0.895,0 -13555,0.739,0.895,0 -13556,0.739,0.895,0 -13557,0.739,0.895,0 -13558,0.739,0.895,0 -13559,0.739,0.895,0 -13560,0.739,0.895,0 -13561,0.739,0.895,0 -13562,0.739,0.895,0 -13563,0.739,0.895,0 -13564,0.739,0.895,0 -13565,0.739,0.895,0 -13566,0.739,0.895,2.7 -13567,0.739,0.895,0 -13568,0.739,0.895,0 -13569,0.739,0.895,0 -13570,0.739,0.895,0 -13571,0.739,0.895,0 -13572,0.739,0.895,0 -13573,0.739,0.895,0 -13574,0.739,0.895,0 -13575,0.739,0.895,0 -13576,0.739,0.895,0 -13577,0.739,0.895,0 -13578,0.739,0.895,0 -13579,0.739,0.895,0 -13580,0.739,0.895,0 -13581,0.739,0.895,0 -13582,0.739,0.895,0 -13583,0.739,0.895,0 -13584,0.739,0.895,0 -13585,0.739,0.895,0 -13586,0.739,0.895,0 -13587,0.739,0.895,0 -13588,0.739,0.895,0 -13589,0.739,0.895,0 -13590,0.739,0.895,0 -13591,0.739,0.895,0 -13592,0.739,0.895,0.01 -13593,0.739,0.895,0 -13594,0.739,0.895,0 -13595,0.739,0.895,0 -13596,0.739,0.895,2.29 -13597,0.739,0.895,0 -13598,0.739,0.895,2.37 -13599,0.739,0.895,0 -13600,0.739,0.895,0 -13601,0.739,0.895,0 -13602,0.739,0.895,0 -13603,0.739,0.895,0.19 -13604,0.739,0.895,0 -13605,0.739,0.895,0 -13606,0.739,0.895,0 -13607,0.739,0.895,0 -13608,0.739,0.895,0 -13609,0.739,0.895,0 -13610,0.739,0.895,0 -13611,0.739,0.895,0 -13612,0.739,0.895,0 -13613,0.739,0.895,0 -13614,0.739,0.895,0 -13615,0.739,0.895,0 -13616,0.739,0.895,0 -13617,0.739,0.895,0 -13618,0.739,0.895,0 -13619,0.738,0.895,0 -13620,0.738,0.895,0 -13621,0.738,0.895,0 -13622,0.738,0.895,0 -13623,0.738,0.895,0 -13624,0.738,0.895,0 -13625,0.738,0.895,0 -13626,0.738,0.895,0 -13627,0.738,0.895,0 -13628,0.738,0.895,0 -13629,0.738,0.895,0 -13630,0.738,0.895,0 -13631,0.739,0.895,0 -13632,0.739,0.895,0 -13633,0.739,0.895,0 -13634,0.739,0.895,0 -13635,0.739,0.895,0 -13636,0.739,0.895,0 -13637,0.739,0.895,0 -13638,0.739,0.895,0 -13639,0.739,0.895,0 -13640,0.739,0.895,0 -13641,0.739,0.895,0 -13642,0.739,0.895,0 -13643,0.739,0.895,0 -13644,0.739,0.895,0 -13645,0.739,0.895,0 -13646,0.739,0.895,0 -13647,0.739,0.895,0 -13648,0.739,0.895,0 -13649,0.739,0.895,0 -13650,0.739,0.895,0 -13651,0.739,0.895,0 -13652,0.739,0.895,0 -13653,0.739,0.895,0 -13654,0.739,0.895,0 -13655,0.738,0.895,0 -13656,0.738,0.895,0 -13657,0.738,0.895,0 -13658,0.738,0.895,0 -13659,0.738,0.895,0 -13660,0.738,0.895,0 -13661,0.738,0.895,0 -13662,0.738,0.895,0 -13663,0.738,0.895,0 -13664,0.738,0.895,0 -13665,0.738,0.895,0 -13666,0.738,0.895,0 -13667,0.738,0.895,0 -13668,0.738,0.895,0 -13669,0.738,0.895,0 -13670,0.738,0.895,0 -13671,0.738,0.895,0 -13672,0.738,0.895,0 -13673,0.738,0.895,0 -13674,0.738,0.895,0 -13675,0.738,0.895,0 -13676,0.738,0.895,0 -13677,0.738,0.895,0 -13678,0.738,0.895,0 -13679,0.739,0.895,0 -13680,0.739,0.895,0 -13681,0.739,0.895,0 -13682,0.739,0.895,0 -13683,0.739,0.895,0 -13684,0.739,0.895,0 -13685,0.739,0.895,0 -13686,0.739,0.895,0 -13687,0.739,0.895,0 -13688,0.739,0.895,0 -13689,0.739,0.895,0 -13690,0.739,0.895,0 -13691,0.739,0.895,0 -13692,0.739,0.895,0 -13693,0.739,0.895,0 -13694,0.739,0.895,0 -13695,0.739,0.895,0 -13696,0.739,0.895,0 -13697,0.739,0.895,0 -13698,0.739,0.895,0 -13699,0.739,0.895,0 -13700,0.739,0.895,0 -13701,0.739,0.895,0 -13702,0.739,0.895,0 -13703,0.739,0.895,0 -13704,0.739,0.895,0 -13705,0.739,0.895,0 -13706,0.739,0.895,0 -13707,0.739,0.895,0 -13708,0.739,0.895,0 -13709,0.739,0.895,0 -13710,0.739,0.895,0 -13711,0.739,0.895,0 -13712,0.739,0.895,0 -13713,0.739,0.895,0 -13714,0.739,0.895,0 -13715,0.739,0.895,0 -13716,0.739,0.895,0 -13717,0.739,0.895,0 -13718,0.739,0.895,0 -13719,0.739,0.895,0 -13720,0.739,0.895,0 -13721,0.739,0.895,0 -13722,0.739,0.895,0 -13723,0.739,0.895,0 -13724,0.739,0.895,0 -13725,0.739,0.895,0 -13726,0.739,0.895,0 -13727,0.739,0.895,0 -13728,0.739,0.895,0 -13729,0.739,0.895,0 -13730,0.739,0.895,0 -13731,0.739,0.895,0 -13732,0.739,0.895,0 -13733,0.739,0.895,0 -13734,0.739,0.895,0 -13735,0.739,0.895,0 -13736,0.739,0.895,0 -13737,0.739,0.895,0 -13738,0.739,0.895,0 -13739,0.739,0.895,0 -13740,0.739,0.895,0 -13741,0.739,0.895,0 -13742,0.739,0.895,0 -13743,0.739,0.895,0 -13744,0.739,0.895,0 -13745,0.739,0.895,0 -13746,0.739,0.895,0 -13747,0.739,0.895,0 -13748,0.739,0.895,0 -13749,0.739,0.895,0 -13750,0.739,0.895,0 -13751,0.739,0.895,0 -13752,0.739,0.895,0 -13753,0.739,0.895,0 -13754,0.739,0.895,0 -13755,0.739,0.895,0 -13756,0.739,0.895,0 -13757,0.739,0.895,0 -13758,0.739,0.895,0 -13759,0.739,0.895,0 -13760,0.739,0.895,0 -13761,0.739,0.895,0 -13762,0.739,0.895,0 -13763,0.521,0.819,0 -13764,0.521,0.819,0 -13765,0.521,0.819,0 -13766,0.521,0.819,0 -13767,0.521,0.819,0 -13768,0.521,0.819,0 -13769,0.521,0.819,0 -13770,0.521,0.819,0 -13771,0.521,0.819,0 -13772,0.521,0.819,0 -13773,0.521,0.819,0 -13774,0.521,0.819,0 -13775,0.521,0.819,0 -13776,0.521,0.819,0 -13777,0.521,0.819,0 -13778,0.521,0.819,0 -13779,0.521,0.819,0 -13780,0.521,0.819,0 -13781,0.521,0.819,0 -13782,0.521,0.819,0 -13783,0.521,0.819,0 -13784,0.521,0.819,0 -13785,0.521,0.819,0 -13786,0.521,0.819,0 -13787,0.521,0.819,0 -13788,0.521,0.819,0 -13789,0.521,0.819,0 -13790,0.521,0.819,0 -13791,0.521,0.819,0 -13792,0.521,0.819,0 -13793,0.521,0.819,0 -13794,0.521,0.819,0 -13795,0.521,0.819,0 -13796,0.521,0.819,0 -13797,0.521,0.819,0 -13798,0.521,0.819,0 -13799,0.521,0.819,0 -13800,0.521,0.819,0 -13801,0.521,0.819,0 -13802,0.521,0.819,0 -13803,0.521,0.819,0 -13804,0.521,0.819,0 -13805,0.521,0.819,0 -13806,0.521,0.819,0 -13807,0.521,0.819,0 -13808,0.521,0.819,0 -13809,0.521,0.819,0 -13810,0.521,0.819,0 -13811,0.521,0.819,0 -13812,0.521,0.819,0 -13813,0.521,0.819,0 -13814,0.521,0.819,0 -13815,0.521,0.819,0 -13816,0.521,0.819,0 -13817,0.521,0.819,0 -13818,0.521,0.819,0 -13819,0.521,0.819,0 -13820,0.521,0.819,0 -13821,0.521,0.819,0 -13822,0.521,0.819,0 -13823,0.521,0.819,0 -13824,0.521,0.819,0 -13825,0.521,0.819,0 -13826,0.521,0.819,0 -13827,0.521,0.819,0 -13828,0.521,0.819,0 -13829,0.521,0.819,0 -13830,0.521,0.819,0 -13831,0.521,0.819,0 -13832,0.521,0.819,0 -13833,0.521,0.819,0 -13834,0.521,0.819,0 -13835,0.521,0.819,0 -13836,0.521,0.819,0 -13837,0.521,0.819,0 -13838,0.521,0.819,0 -13839,0.521,0.819,0 -13840,0.521,0.819,0 -13841,0.521,0.819,0 -13842,0.521,0.819,0 -13843,0.521,0.819,0 -13844,0.521,0.819,0 -13845,0.521,0.819,0 -13846,0.521,0.819,0 -13847,0.521,0.819,0 -13848,0.521,0.819,0 -13849,0.521,0.819,0 -13850,0.521,0.819,0 -13851,0.521,0.819,0.55 -13852,0.521,0.819,0 -13853,0.521,0.819,20.59 -13854,0.521,0.819,0 -13855,0.521,0.819,25.45 -13856,0.521,0.819,13.63 -13857,0.521,0.819,17.77 -13858,0.521,0.819,15.78 -13859,0.521,0.819,0 -13860,0.521,0.819,0 -13861,0.521,0.819,0 -13862,0.521,0.819,0 -13863,0.521,0.819,6.88 -13864,0.521,0.819,1.26 -13865,0.521,0.819,0 -13866,0.521,0.819,0 -13867,0.521,0.819,0 -13868,0.521,0.819,0 -13869,0.521,0.819,0 -13870,0.521,0.819,0 -13871,0.521,0.819,0 -13872,0.521,0.819,0 -13873,0.521,0.819,0 -13874,0.521,0.819,0 -13875,0.521,0.819,0 -13876,0.521,0.819,0 -13877,0.521,0.819,0 -13878,0.521,0.819,0 -13879,0.521,0.819,0 -13880,0.521,0.819,0 -13881,0.521,0.819,0 -13882,0.521,0.819,0 -13883,0.521,0.819,0 -13884,0.521,0.819,0 -13885,0.521,0.819,0 -13886,0.521,0.819,0 -13887,0.521,0.819,0 -13888,0.521,0.819,0 -13889,0.521,0.819,0 -13890,0.521,0.819,0 -13891,0.521,0.819,0 -13892,0.521,0.819,0 -13893,0.521,0.819,0 -13894,0.521,0.819,0 -13895,0.521,0.819,0 -13896,0.521,0.819,0 -13897,0.521,0.819,0 -13898,0.521,0.819,0 -13899,0.521,0.819,0 -13900,0.521,0.819,0 -13901,0.521,0.819,0 -13902,0.521,0.819,0 -13903,0.521,0.819,0 -13904,0.521,0.819,0 -13905,0.521,0.819,0 -13906,0.521,0.819,0 -13907,0.823,0.882,0 -13908,0.823,0.882,0 -13909,0.823,0.882,0 -13910,0.823,0.882,0 -13911,0.823,0.882,0 -13912,0.823,0.882,0 -13913,0.823,0.882,0 -13914,0.823,0.882,0 -13915,0.823,0.882,0 -13916,0.823,0.882,0 -13917,0.823,0.882,0 -13918,0.823,0.882,0 -13919,0.811,0.881,0 -13920,0.811,0.881,0 -13921,0.811,0.881,0 -13922,0.811,0.881,0 -13923,0.811,0.881,0 -13924,0.811,0.881,0 -13925,0.811,0.881,0 -13926,0.811,0.881,0 -13927,0.811,0.881,0 -13928,0.811,0.881,0 -13929,0.811,0.881,0 -13930,0.811,0.881,0 -13931,0.811,0.881,0 -13932,0.811,0.881,0 -13933,0.811,0.881,0 -13934,0.811,0.881,0 -13935,0.811,0.881,0 -13936,0.811,0.881,0 -13937,0.811,0.881,0 -13938,0.811,0.881,0 -13939,0.811,0.881,0 -13940,0.811,0.881,0 -13941,0.811,0.881,0 -13942,0.811,0.881,0 -13943,0.823,0.882,0 -13944,0.823,0.882,0 -13945,0.823,0.882,0 -13946,0.823,0.882,0 -13947,0.823,0.882,0 -13948,0.823,0.882,0 -13949,0.823,0.882,0 -13950,0.823,0.882,0 -13951,0.823,0.882,0 -13952,0.823,0.882,0 -13953,0.823,0.882,0 -13954,0.823,0.882,0 -13955,0.823,0.882,0 -13956,0.823,0.882,0 -13957,0.823,0.882,0 -13958,0.823,0.882,0 -13959,0.823,0.882,0 -13960,0.823,0.882,0 -13961,0.823,0.882,0 -13962,0.823,0.882,0 -13963,0.823,0.882,0 -13964,0.823,0.882,0 -13965,0.823,0.882,0 -13966,0.823,0.882,0 -13967,0.811,0.881,0 -13968,0.811,0.881,0 -13969,0.811,0.881,0 -13970,0.811,0.881,0 -13971,0.811,0.881,0 -13972,0.811,0.881,0 -13973,0.811,0.881,0 -13974,0.811,0.881,0 -13975,0.811,0.881,0 -13976,0.811,0.881,0 -13977,0.811,0.881,0 -13978,0.811,0.881,0 -13979,0.823,0.882,0 -13980,0.823,0.882,14.33 -13981,0.823,0.882,2 -13982,0.823,0.882,2.02 -13983,0.823,0.882,0 -13984,0.823,0.882,0 -13985,0.823,0.882,0 -13986,0.823,0.882,0 -13987,0.823,0.882,0 -13988,0.823,0.882,0 -13989,0.823,0.882,0 -13990,0.823,0.882,0 -13991,0.822,0.882,0 -13992,0.822,0.882,0 -13993,0.822,0.882,0 -13994,0.822,0.882,0 -13995,0.822,0.882,0 -13996,0.822,0.882,0 -13997,0.822,0.882,0 -13998,0.822,0.882,0 -13999,0.822,0.882,0 -14000,0.822,0.882,0 -14001,0.822,0.882,0 -14002,0.822,0.882,0 -14003,0.822,0.882,0 -14004,0.822,0.882,0 -14005,0.822,0.882,0 -14006,0.822,0.882,0 -14007,0.822,0.882,0 -14008,0.822,0.882,0 -14009,0.822,0.882,0 -14010,0.822,0.882,0 -14011,0.822,0.882,0 -14012,0.822,0.882,0 -14013,0.822,0.882,0 -14014,0.822,0.882,0 -14015,0.823,0.882,0 -14016,0.823,0.882,0 -14017,0.823,0.882,0 -14018,0.823,0.882,0 -14019,0.823,0.882,0 -14020,0.823,0.882,0 -14021,0.823,0.882,0 -14022,0.823,0.882,0 -14023,0.823,0.882,0 -14024,0.823,0.882,0 -14025,0.823,0.882,0 -14026,0.823,0.882,0 -14027,0.823,0.882,0 -14028,0.823,0.882,0 -14029,0.823,0.882,0 -14030,0.823,0.882,0 -14031,0.823,0.882,0 -14032,0.823,0.882,0 -14033,0.823,0.882,0 -14034,0.823,0.882,0 -14035,0.823,0.882,0 -14036,0.823,0.882,0 -14037,0.823,0.882,0 -14038,0.823,0.882,0 -14039,0.822,0.882,0 -14040,0.822,0.882,0 -14041,0.822,0.882,0 -14042,0.822,0.882,0 -14043,0.822,0.882,0 -14044,0.822,0.882,0 -14045,0.822,0.882,0 -14046,0.822,0.882,0 -14047,0.822,0.882,0 -14048,0.822,0.882,0 -14049,0.822,0.882,0 -14050,0.822,0.882,0 -14051,0.37,0.933,0 -14052,0.37,0.933,0 -14053,0.37,0.933,0 -14054,0.37,0.933,0 -14055,0.37,0.933,0 -14056,0.37,0.933,0 -14057,0.37,0.933,0 -14058,0.37,0.933,0 -14059,0.37,0.933,0 -14060,0.37,0.933,0 -14061,0.37,0.933,0 -14062,0.37,0.933,0 -14063,0.37,0.933,0 -14064,0.37,0.933,0 -14065,0.37,0.933,0 -14066,0.37,0.933,0 -14067,0.37,0.933,0 -14068,0.37,0.933,0 -14069,0.37,0.933,0 -14070,0.37,0.933,0 -14071,0.37,0.933,0 -14072,0.37,0.933,0 -14073,0.37,0.933,0 -14074,0.37,0.933,0 -14075,0.37,0.933,0 -14076,0.37,0.933,0 -14077,0.37,0.933,0 -14078,0.37,0.933,0 -14079,0.37,0.933,0 -14080,0.37,0.933,0 -14081,0.37,0.933,0 -14082,0.37,0.933,0 -14083,0.37,0.933,4.58 -14084,0.37,0.933,0 -14085,0.37,0.933,24.75 -14086,0.37,0.933,0 -14087,0.37,0.933,0 -14088,0.37,0.933,0 -14089,0.37,0.933,0 -14090,0.37,0.933,0.09 -14091,0.37,0.933,0 -14092,0.37,0.933,0 -14093,0.37,0.933,0 -14094,0.37,0.933,0 -14095,0.37,0.933,0 -14096,0.37,0.933,0 -14097,0.37,0.933,0 -14098,0.37,0.933,0 -14099,0.37,0.933,0 -14100,0.37,0.933,0 -14101,0.37,0.933,0 -14102,0.37,0.933,0 -14103,0.37,0.933,0 -14104,0.37,0.933,0 -14105,0.37,0.933,0 -14106,0.37,0.933,0 -14107,0.37,0.933,0 -14108,0.37,0.933,4.85 -14109,0.37,0.933,1.8 -14110,0.37,0.933,1.99 -14111,0.37,0.933,21.51 -14112,0.37,0.933,4.7 -14113,0.37,0.933,13.18 -14114,0.37,0.933,15.02 -14115,0.37,0.933,0 -14116,0.37,0.933,0 -14117,0.37,0.933,7.13 -14118,0.37,0.933,0 -14119,0.37,0.933,0 -14120,0.37,0.933,0 -14121,0.37,0.933,0 -14122,0.37,0.933,0 -14123,0.37,0.933,0 -14124,0.37,0.933,0 -14125,0.37,0.933,0 -14126,0.37,0.933,0 -14127,0.37,0.933,0.06 -14128,0.37,0.933,0 -14129,0.37,0.933,0 -14130,0.37,0.933,0 -14131,0.37,0.933,2.5 -14132,0.37,0.933,10.89 -14133,0.37,0.933,0 -14134,0.37,0.933,0 -14135,0.37,0.933,0.38 -14136,0.37,0.933,1.99 -14137,0.37,0.933,0 -14138,0.37,0.933,0 -14139,0.37,0.933,0 -14140,0.37,0.933,0 -14141,0.37,0.933,0 -14142,0.37,0.933,0 -14143,0.37,0.933,0 -14144,0.37,0.933,0 -14145,0.37,0.933,0 -14146,0.37,0.933,0 -14147,0.37,0.933,0 -14148,0.37,0.933,0 -14149,0.37,0.933,0 -14150,0.37,0.933,0 -14151,0.37,0.933,0 -14152,0.37,0.933,0 -14153,0.37,0.933,0 -14154,0.37,0.933,0 -14155,0.37,0.933,0 -14156,0.37,0.933,0 -14157,0.37,0.933,0 -14158,0.37,0.933,0 -14159,0.37,0.933,0 -14160,0.37,0.933,0 -14161,0.37,0.933,0 -14162,0.37,0.933,0 -14163,0.37,0.933,0 -14164,0.37,0.933,0 -14165,0.37,0.933,0 -14166,0.37,0.933,0 -14167,0.37,0.933,0 -14168,0.37,0.933,0 -14169,0.37,0.933,0 -14170,0.37,0.933,0 -14171,0.37,0.933,0 -14172,0.37,0.933,0 -14173,0.37,0.933,0 -14174,0.37,0.933,0 -14175,0.37,0.933,0 -14176,0.37,0.933,0 -14177,0.37,0.933,0 -14178,0.37,0.933,0 -14179,0.37,0.933,0 -14180,0.37,0.933,0 -14181,0.37,0.933,0 -14182,0.37,0.933,0 -14183,0.37,0.933,0 -14184,0.37,0.933,0 -14185,0.37,0.933,0 -14186,0.37,0.933,0 -14187,0.37,0.933,0 -14188,0.37,0.933,0 -14189,0.37,0.933,0 -14190,0.37,0.933,0 -14191,0.37,0.933,0 -14192,0.37,0.933,0 -14193,0.37,0.933,0 -14194,0.37,0.933,0 -14195,0.37,0.933,0 -14196,0.37,0.933,0 -14197,0.37,0.933,0 -14198,0.37,0.933,0 -14199,0.37,0.933,0 -14200,0.37,0.933,0 -14201,0.37,0.933,0 -14202,0.37,0.933,0 -14203,0.37,0.933,0 -14204,0.37,0.933,0 -14205,0.37,0.933,0 -14206,0.37,0.933,0 -14207,0.37,0.933,0 -14208,0.37,0.933,0 -14209,0.37,0.933,0 -14210,0.37,0.933,0 -14211,0.37,0.933,0 -14212,0.37,0.933,0 -14213,0.371,0.933,0 -14214,0.371,0.933,0 -14215,0.371,0.933,0 -14216,0.371,0.933,0 -14217,0.371,0.933,0 -14218,0.371,0.933,0 -14219,0.371,0.933,0 -14220,0.371,0.933,0 -14221,0.371,0.933,0 -14222,0.371,0.933,0 -14223,0.371,0.933,0 -14224,0.371,0.933,0 -14225,0.371,0.933,0 -14226,0.371,0.933,0 -14227,0.371,0.933,0 -14228,0.371,0.933,0 -14229,0.371,0.933,0 -14230,0.371,0.933,0 -14231,0.769,0.946,0 -14232,0.769,0.946,0 -14233,0.769,0.946,0 -14234,0.769,0.946,0 -14235,0.769,0.946,0 -14236,0.769,0.946,0 -14237,0.769,0.946,0 -14238,0.769,0.946,0 -14239,0.769,0.946,0.11 -14240,0.769,0.946,0 -14241,0.769,0.946,4.8 -14242,0.769,0.946,0 -14243,0.61,0.912,1.9 -14244,0.61,0.912,2.05 -14245,0.61,0.912,3.95 -14246,0.61,0.912,0 -14247,0.61,0.912,0.95 -14248,0.61,0.912,0 -14249,0.61,0.912,1.85 -14250,0.61,0.912,0.71 -14251,0.61,0.912,1.44 -14252,0.61,0.912,0 -14253,0.61,0.912,8.18 -14254,0.61,0.912,19.84 -14255,0.61,0.912,5.78 -14256,0.61,0.912,10.91 -14257,0.61,0.912,13.12 -14258,0.61,0.912,1.75 -14259,0.61,0.912,19.47 -14260,0.61,0.912,15.37 -14261,0.61,0.912,9.35 -14262,0.61,0.912,4.36 -14263,0.61,0.912,0.57 -14264,0.61,0.912,5.55 -14265,0.61,0.912,16.76 -14266,0.61,0.912,12.33 -14267,0.769,0.946,0 -14268,0.769,0.946,0 -14269,0.769,0.946,0 -14270,0.769,0.946,0 -14271,0.769,0.946,2.08 -14272,0.769,0.946,0 -14273,0.769,0.946,3.11 -14274,0.769,0.946,0 -14275,0.769,0.946,0 -14276,0.769,0.946,0 -14277,0.769,0.946,0 -14278,0.769,0.946,0 -14279,0.769,0.946,0 -14280,0.769,0.946,0 -14281,0.769,0.946,0 -14282,0.769,0.946,0 -14283,0.769,0.946,0 -14284,0.769,0.946,0 -14285,0.769,0.946,0 -14286,0.769,0.946,0 -14287,0.769,0.946,0 -14288,0.769,0.946,0 -14289,0.769,0.946,0 -14290,0.769,0.946,0 -14291,0.61,0.912,0 -14292,0.61,0.912,9.23 -14293,0.61,0.912,0 -14294,0.61,0.912,0 -14295,0.61,0.912,2.84 -14296,0.61,0.912,10.24 -14297,0.61,0.912,0 -14298,0.61,0.912,1.92 -14299,0.61,0.912,5.82 -14300,0.61,0.912,0.67 -14301,0.61,0.912,8.17 -14302,0.61,0.912,19.39 -14303,0.77,0.946,0 -14304,0.77,0.946,22.9 -14305,0.77,0.946,0 -14306,0.77,0.946,16.65 -14307,0.77,0.946,0.41 -14308,0.77,0.946,0 -14309,0.77,0.946,2.78 -14310,0.77,0.946,0 -14311,0.77,0.946,0 -14312,0.77,0.946,1.37 -14313,0.77,0.946,0 -14314,0.77,0.946,0 -14315,0.77,0.946,0 -14316,0.77,0.946,0 -14317,0.77,0.946,14.26 -14318,0.77,0.946,0 -14319,0.77,0.946,0 -14320,0.77,0.946,0 -14321,0.77,0.946,0 -14322,0.77,0.946,0 -14323,0.77,0.946,0 -14324,0.77,0.946,0 -14325,0.77,0.946,0 -14326,0.77,0.946,0 -14327,0.77,0.946,0 -14328,0.77,0.946,0 -14329,0.77,0.946,0 -14330,0.77,0.946,19.74 -14331,0.77,0.946,0 -14332,0.77,0.946,0 -14333,0.77,0.946,0 -14334,0.77,0.946,0 -14335,0.77,0.946,0 -14336,0.77,0.946,0 -14337,0.77,0.946,0 -14338,0.77,0.946,0 -14339,0.77,0.946,0 -14340,0.77,0.946,0 -14341,0.77,0.946,0 -14342,0.77,0.946,0 -14343,0.77,0.946,0 -14344,0.77,0.946,0 -14345,0.77,0.946,1.85 -14346,0.77,0.946,0 -14347,0.77,0.946,0 -14348,0.77,0.946,14.39 -14349,0.77,0.946,0 -14350,0.77,0.946,22.77 -14351,0.77,0.946,0 -14352,0.77,0.946,0.05 -14353,0.77,0.946,0 -14354,0.77,0.946,0 -14355,0.77,0.946,0 -14356,0.77,0.946,0 -14357,0.77,0.946,0 -14358,0.77,0.946,0 -14359,0.77,0.946,0 -14360,0.77,0.946,1.88 -14361,0.77,0.946,0 -14362,0.77,0.946,0 -14363,0.77,0.946,0 -14364,0.77,0.946,0 -14365,0.77,0.946,0 -14366,0.77,0.946,0 -14367,0.77,0.946,0 -14368,0.77,0.946,1.13 -14369,0.77,0.946,0 -14370,0.77,0.946,1.03 -14371,0.77,0.946,0 -14372,0.77,0.946,20.98 -14373,0.77,0.946,0 -14374,0.77,0.946,0 -14375,0.66,0.937,0 -14376,0.66,0.937,0 -14377,0.66,0.937,0 -14378,0.66,0.937,0 -14379,0.66,0.937,0 -14380,0.66,0.937,0 -14381,0.66,0.937,0 -14382,0.66,0.937,0 -14383,0.66,0.937,0 -14384,0.66,0.937,0 -14385,0.66,0.937,0 -14386,0.66,0.937,0 -14387,0.66,0.937,0 -14388,0.66,0.937,0 -14389,0.66,0.937,0 -14390,0.66,0.937,0 -14391,0.66,0.937,0 -14392,0.66,0.937,0 -14393,0.66,0.937,0 -14394,0.66,0.937,0 -14395,0.66,0.937,0 -14396,0.66,0.937,0 -14397,0.66,0.937,0 -14398,0.66,0.937,3.71 -14399,0.66,0.937,0 -14400,0.66,0.937,0 -14401,0.66,0.937,3.46 -14402,0.66,0.937,7.45 -14403,0.66,0.937,0 -14404,0.66,0.937,0 -14405,0.66,0.937,0 -14406,0.66,0.937,0 -14407,0.66,0.937,0.2 -14408,0.66,0.937,0 -14409,0.66,0.937,0 -14410,0.66,0.937,0 -14411,0.66,0.937,0 -14412,0.66,0.937,0 -14413,0.66,0.937,0 -14414,0.66,0.937,0 -14415,0.66,0.937,0 -14416,0.66,0.937,0 -14417,0.66,0.937,0 -14418,0.66,0.937,0 -14419,0.66,0.937,0 -14420,0.66,0.937,0 -14421,0.66,0.937,0 -14422,0.66,0.937,0 -14423,0.66,0.937,0 -14424,0.66,0.937,0 -14425,0.66,0.937,0 -14426,0.66,0.937,0 -14427,0.66,0.937,0 -14428,0.66,0.937,0 -14429,0.66,0.937,0 -14430,0.66,0.937,0 -14431,0.66,0.937,0 -14432,0.66,0.937,0 -14433,0.66,0.937,0 -14434,0.66,0.937,0 -14435,0.66,0.937,0 -14436,0.66,0.937,0 -14437,0.66,0.937,0 -14438,0.66,0.937,0 -14439,0.66,0.937,0 -14440,0.66,0.937,0 -14441,0.66,0.937,7.1 -14442,0.66,0.937,0 -14443,0.66,0.937,0 -14444,0.66,0.937,0 -14445,0.66,0.937,0 -14446,0.66,0.937,0 -14447,0.662,0.937,0.22 -14448,0.662,0.937,0 -14449,0.662,0.937,0.15 -14450,0.662,0.937,0.71 -14451,0.662,0.937,3.54 -14452,0.662,0.937,15.06 -14453,0.662,0.937,0.26 -14454,0.662,0.937,23.35 -14455,0.662,0.937,0 -14456,0.662,0.937,0 -14457,0.662,0.937,0 -14458,0.662,0.937,0 -14459,0.661,0.937,0 -14460,0.661,0.937,0 -14461,0.661,0.937,0 -14462,0.661,0.937,0 -14463,0.661,0.937,0 -14464,0.661,0.937,0 -14465,0.661,0.937,0 -14466,0.661,0.937,0 -14467,0.661,0.937,0 -14468,0.661,0.937,0 -14469,0.661,0.937,0 -14470,0.661,0.937,0 -14471,0.661,0.937,0 -14472,0.661,0.937,0 -14473,0.661,0.937,0 -14474,0.661,0.937,0 -14475,0.661,0.937,0 -14476,0.661,0.937,0 -14477,0.661,0.937,0 -14478,0.661,0.937,0 -14479,0.661,0.937,0 -14480,0.661,0.937,0 -14481,0.661,0.937,0 -14482,0.661,0.937,0 -14483,0.662,0.937,0 -14484,0.662,0.937,0 -14485,0.662,0.937,0 -14486,0.662,0.937,0 -14487,0.662,0.937,2.74 -14488,0.662,0.937,26.69 -14489,0.662,0.937,0 -14490,0.662,0.937,0.61 -14491,0.662,0.937,3.87 -14492,0.662,0.937,0.28 -14493,0.662,0.937,0.26 -14494,0.662,0.937,0 -14495,0.662,0.937,0 -14496,0.662,0.937,0 -14497,0.662,0.937,0 -14498,0.662,0.937,0 -14499,0.662,0.937,0 -14500,0.662,0.937,0 -14501,0.662,0.937,0 -14502,0.662,0.937,0 -14503,0.662,0.937,0 -14504,0.662,0.937,0 -14505,0.662,0.937,0 -14506,0.662,0.937,0 -14507,0.661,0.937,0 -14508,0.661,0.937,0 -14509,0.661,0.937,0 -14510,0.661,0.937,0 -14511,0.661,0.937,0 -14512,0.661,0.937,0 -14513,0.661,0.937,0 -14514,0.661,0.937,0 -14515,0.661,0.937,0 -14516,0.661,0.937,0 -14517,0.661,0.937,0 -14518,0.661,0.937,0 -14519,0.591,0.859,0 -14520,0.591,0.859,0 -14521,0.591,0.859,0 -14522,0.591,0.859,0 -14523,0.591,0.859,0 -14524,0.591,0.859,0 -14525,0.591,0.859,0 -14526,0.591,0.859,0 -14527,0.591,0.859,0 -14528,0.591,0.859,0 -14529,0.591,0.859,0 -14530,0.591,0.859,0 -14531,0.591,0.859,0 -14532,0.591,0.859,0.01 -14533,0.591,0.859,0 -14534,0.591,0.859,0 -14535,0.591,0.859,0.87 -14536,0.591,0.859,0.95 -14537,0.591,0.859,0 -14538,0.591,0.859,0 -14539,0.591,0.859,0 -14540,0.591,0.859,0.03 -14541,0.591,0.859,0 -14542,0.591,0.859,0 -14543,0.591,0.859,0 -14544,0.591,0.859,0 -14545,0.591,0.859,0 -14546,0.591,0.859,0 -14547,0.591,0.859,0 -14548,0.591,0.859,0 -14549,0.591,0.859,0.17 -14550,0.591,0.859,0 -14551,0.591,0.859,0 -14552,0.591,0.859,0 -14553,0.591,0.859,0 -14554,0.591,0.859,0 -14555,0.591,0.859,0 -14556,0.591,0.859,0 -14557,0.591,0.859,0 -14558,0.591,0.859,0 -14559,0.591,0.859,0 -14560,0.591,0.859,0 -14561,0.591,0.859,0 -14562,0.591,0.859,0 -14563,0.591,0.859,0 -14564,0.591,0.859,0 -14565,0.591,0.859,0 -14566,0.591,0.859,0 -14567,0.658,0.868,0 -14568,0.658,0.868,0 -14569,0.658,0.868,0 -14570,0.658,0.868,0 -14571,0.658,0.868,0 -14572,0.658,0.868,0 -14573,0.658,0.868,0 -14574,0.658,0.868,0 -14575,0.664,0.869,0 -14576,0.664,0.869,0 -14577,0.664,0.869,0 -14578,0.664,0.869,0 -14579,0.664,0.869,0 -14580,0.664,0.869,0.2 -14581,0.664,0.869,0 -14582,0.664,0.869,0 -14583,0.683,0.874,30.38 -14584,0.683,0.874,10.8 -14585,0.683,0.874,17.84 -14586,0.683,0.874,20.75 -14587,0.683,0.874,0 -14588,0.683,0.874,0 -14589,0.683,0.874,2.98 -14590,0.683,0.874,0 -14591,0.683,0.874,13.42 -14592,0.683,0.874,0.01 -14593,0.683,0.874,0 -14594,0.683,0.874,0 -14595,0.683,0.874,15.07 -14596,0.683,0.874,12 -14597,0.683,0.874,0.25 -14598,0.683,0.874,0 -14599,0.664,0.869,0 -14600,0.664,0.869,20.42 -14601,0.664,0.869,0 -14602,0.664,0.869,0.01 -14603,0.664,0.869,0 -14604,0.664,0.869,0 -14605,0.664,0.869,0 -14606,0.664,0.869,0 -14607,0.658,0.868,0 -14608,0.658,0.868,0 -14609,0.658,0.868,0 -14610,0.658,0.868,0 -14611,0.658,0.868,0 -14612,0.658,0.868,0 -14613,0.658,0.868,0 -14614,0.658,0.868,0 -14615,0.716,0.884,0 -14616,0.716,0.884,0 -14617,0.716,0.884,0 -14618,0.716,0.884,0 -14619,0.716,0.884,0 -14620,0.716,0.884,0 -14621,0.716,0.884,0 -14622,0.716,0.884,0 -14623,0.716,0.884,0 -14624,0.716,0.884,0 -14625,0.716,0.884,0 -14626,0.716,0.884,0 -14627,0.716,0.884,0 -14628,0.716,0.884,0 -14629,0.716,0.884,0 -14630,0.716,0.884,0 -14631,0.716,0.884,0 -14632,0.716,0.884,0 -14633,0.716,0.884,0 -14634,0.716,0.884,0 -14635,0.716,0.884,0 -14636,0.716,0.884,0 -14637,0.716,0.884,0 -14638,0.716,0.884,0 -14639,0.716,0.884,0 -14640,0.716,0.884,0 -14641,0.716,0.884,0 -14642,0.716,0.884,0 -14643,0.716,0.884,0 -14644,0.716,0.884,0 -14645,0.716,0.884,0 -14646,0.716,0.884,0 -14647,0.716,0.884,0 -14648,0.716,0.884,0 -14649,0.716,0.884,0 -14650,0.716,0.884,0 -14651,0.716,0.884,0 -14652,0.716,0.884,0 -14653,0.716,0.884,0 -14654,0.716,0.884,0 -14655,0.716,0.884,0 -14656,0.716,0.884,0 -14657,0.716,0.884,0 -14658,0.716,0.884,0 -14659,0.716,0.884,0 -14660,0.716,0.884,0 -14661,0.716,0.884,0 -14662,0.716,0.884,0 -14663,0.328,0.855,0 -14664,0.328,0.855,0 -14665,0.328,0.855,0 -14666,0.328,0.855,0 -14667,0.328,0.855,0 -14668,0.328,0.855,0 -14669,0.328,0.855,0 -14670,0.328,0.855,0 -14671,0.324,0.856,0 -14672,0.324,0.856,0 -14673,0.324,0.856,0 -14674,0.324,0.856,0 -14675,0.324,0.856,0 -14676,0.324,0.856,0 -14677,0.324,0.856,0 -14678,0.324,0.856,0 -14679,0.326,0.856,0.12 -14680,0.326,0.856,0.83 -14681,0.326,0.856,0 -14682,0.326,0.856,0 -14683,0.326,0.856,3.92 -14684,0.326,0.856,0 -14685,0.326,0.856,0 -14686,0.326,0.856,0 -14687,0.326,0.856,0 -14688,0.326,0.856,0 -14689,0.326,0.856,0 -14690,0.326,0.856,0 -14691,0.326,0.856,0 -14692,0.326,0.856,0 -14693,0.326,0.856,0 -14694,0.326,0.856,0 -14695,0.324,0.856,0 -14696,0.324,0.856,0 -14697,0.324,0.856,0 -14698,0.324,0.856,0 -14699,0.324,0.856,0 -14700,0.324,0.856,0 -14701,0.324,0.856,0 -14702,0.324,0.856,0 -14703,0.328,0.855,0 -14704,0.328,0.855,0 -14705,0.328,0.855,0 -14706,0.328,0.855,0 -14707,0.328,0.855,0 -14708,0.328,0.855,0 -14709,0.328,0.855,0 -14710,0.328,0.855,0 -14711,0.33,0.855,0 -14712,0.33,0.855,0 -14713,0.33,0.855,0 -14714,0.33,0.855,1.84 -14715,0.33,0.855,0 -14716,0.33,0.855,0 -14717,0.33,0.855,0 -14718,0.33,0.855,0 -14719,0.324,0.856,0 -14720,0.324,0.856,0 -14721,0.324,0.856,0 -14722,0.324,0.856,0 -14723,0.324,0.856,0 -14724,0.324,0.856,0 -14725,0.324,0.856,0 -14726,0.324,0.856,0 -14727,0.324,0.856,0 -14728,0.324,0.856,0 -14729,0.324,0.856,0 -14730,0.324,0.856,0 -14731,0.324,0.856,0 -14732,0.324,0.856,0 -14733,0.324,0.856,0 -14734,0.324,0.856,0 -14735,0.324,0.856,0 -14736,0.324,0.856,0 -14737,0.324,0.856,0 -14738,0.324,0.856,0 -14739,0.324,0.856,0 -14740,0.324,0.856,0 -14741,0.324,0.856,0 -14742,0.324,0.856,0 -14743,0.324,0.856,0 -14744,0.324,0.856,0 -14745,0.324,0.856,1.05 -14746,0.324,0.856,0 -14747,0.324,0.856,0 -14748,0.324,0.856,0 -14749,0.324,0.856,0 -14750,0.324,0.856,0 -14751,0.33,0.855,0 -14752,0.33,0.855,0 -14753,0.33,0.855,0 -14754,0.33,0.855,0 -14755,0.33,0.855,1.52 -14756,0.33,0.855,0 -14757,0.33,0.855,0 -14758,0.33,0.855,0 -14759,0.327,0.855,0 -14760,0.327,0.855,0 -14761,0.327,0.855,0 -14762,0.327,0.855,0 -14763,0.327,0.855,0 -14764,0.327,0.855,0 -14765,0.327,0.855,0 -14766,0.327,0.855,0 -14767,0.324,0.856,0 -14768,0.324,0.856,0 -14769,0.324,0.856,0 -14770,0.324,0.856,0 -14771,0.324,0.856,0 -14772,0.324,0.856,0 -14773,0.324,0.856,0 -14774,0.324,0.856,0 -14775,0.324,0.856,0 -14776,0.324,0.856,0 -14777,0.324,0.856,0 -14778,0.324,0.856,0 -14779,0.324,0.856,0 -14780,0.324,0.856,0.44 -14781,0.324,0.856,0 -14782,0.324,0.856,0 -14783,0.324,0.856,0 -14784,0.324,0.856,0 -14785,0.324,0.856,0 -14786,0.324,0.856,0 -14787,0.324,0.856,0 -14788,0.324,0.856,0 -14789,0.324,0.856,0 -14790,0.324,0.856,0 -14791,0.324,0.856,0 -14792,0.324,0.856,0 -14793,0.324,0.856,0 -14794,0.324,0.856,0 -14795,0.324,0.856,0 -14796,0.324,0.856,0 -14797,0.324,0.856,0 -14798,0.324,0.856,0 -14799,0.327,0.855,0 -14800,0.327,0.855,0 -14801,0.327,0.855,0 -14802,0.327,0.855,0 -14803,0.327,0.855,0 -14804,0.327,0.855,0 -14805,0.327,0.855,0 -14806,0.327,0.855,0 -14807,0.735,0.793,0.2 -14808,0.735,0.793,12.43 -14809,0.735,0.793,0 -14810,0.735,0.793,0 -14811,0.735,0.793,36.71 -14812,0.735,0.793,1.15 -14813,0.735,0.793,0 -14814,0.735,0.793,4.23 -14815,0.692,0.766,0 -14816,0.692,0.766,0 -14817,0.692,0.766,1.44 -14818,0.692,0.766,0 -14819,0.692,0.766,0 -14820,0.692,0.766,0 -14821,0.692,0.766,0 -14822,0.692,0.766,0 -14823,0.556,0.773,0 -14824,0.556,0.773,0 -14825,0.556,0.773,0 -14826,0.556,0.773,0 -14827,0.556,0.773,0 -14828,0.556,0.773,0 -14829,0.556,0.773,0 -14830,0.556,0.773,0 -14831,0.556,0.773,0 -14832,0.556,0.773,0 -14833,0.556,0.773,0 -14834,0.556,0.773,0 -14835,0.556,0.773,0 -14836,0.556,0.773,0 -14837,0.556,0.773,0 -14838,0.556,0.773,0 -14839,0.692,0.766,0 -14840,0.692,0.766,0 -14841,0.692,0.766,0 -14842,0.692,0.766,0 -14843,0.692,0.766,0 -14844,0.692,0.766,0 -14845,0.692,0.766,0 -14846,0.692,0.766,0 -14847,0.735,0.793,0 -14848,0.735,0.793,0 -14849,0.735,0.793,0 -14850,0.735,0.793,0 -14851,0.735,0.793,1.26 -14852,0.735,0.793,0 -14853,0.735,0.793,15.15 -14854,0.735,0.793,7.05 -14855,0.653,0.748,27.11 -14856,0.653,0.748,5.07 -14857,0.653,0.748,32.65 -14858,0.653,0.748,0 -14859,0.653,0.748,0 -14860,0.653,0.748,0 -14861,0.653,0.748,0 -14862,0.653,0.748,0 -14863,0.618,0.768,0 -14864,0.618,0.768,0 -14865,0.618,0.768,0 -14866,0.618,0.768,0.16 -14867,0.618,0.768,0 -14868,0.618,0.768,0 -14869,0.618,0.768,0 -14870,0.618,0.768,0 -14871,0.556,0.773,0 -14872,0.556,0.773,0 -14873,0.556,0.773,0 -14874,0.556,0.773,0 -14875,0.556,0.773,0 -14876,0.556,0.773,0 -14877,0.556,0.773,0 -14878,0.556,0.773,0 -14879,0.556,0.773,0 -14880,0.556,0.773,0 -14881,0.556,0.773,0 -14882,0.556,0.773,0 -14883,0.556,0.773,19.7 -14884,0.556,0.773,0 -14885,0.556,0.773,0 -14886,0.556,0.773,0 -14887,0.618,0.768,0 -14888,0.618,0.768,15.11 -14889,0.618,0.768,12.58 -14890,0.618,0.768,31.68 -14891,0.618,0.768,0 -14892,0.618,0.768,25.91 -14893,0.618,0.768,0 -14894,0.618,0.768,0.09 -14895,0.653,0.748,0 -14896,0.653,0.748,0 -14897,0.653,0.748,0 -14898,0.653,0.748,0 -14899,0.653,0.748,0.62 -14900,0.653,0.748,0 -14901,0.653,0.748,0 -14902,0.653,0.748,0 -14903,0.556,0.773,0 -14904,0.556,0.773,0 -14905,0.556,0.773,0 -14906,0.556,0.773,0 -14907,0.556,0.773,0 -14908,0.556,0.773,0 -14909,0.556,0.773,0 -14910,0.556,0.773,0 -14911,0.556,0.773,0 -14912,0.556,0.773,0 -14913,0.556,0.773,0 -14914,0.556,0.773,0 -14915,0.556,0.773,0.17 -14916,0.556,0.773,0 -14917,0.556,0.773,0 -14918,0.556,0.773,0 -14919,0.556,0.773,0 -14920,0.556,0.773,0 -14921,0.556,0.773,0 -14922,0.556,0.773,0 -14923,0.556,0.773,0 -14924,0.556,0.773,0 -14925,0.556,0.773,0 -14926,0.556,0.773,0 -14927,0.556,0.773,0 -14928,0.556,0.773,0 -14929,0.556,0.773,0 -14930,0.556,0.773,0 -14931,0.556,0.773,0 -14932,0.556,0.773,0 -14933,0.556,0.773,0 -14934,0.556,0.773,0 -14935,0.556,0.773,0 -14936,0.556,0.773,0 -14937,0.556,0.773,0 -14938,0.556,0.773,0 -14939,0.556,0.773,0 -14940,0.556,0.773,0 -14941,0.556,0.773,0 -14942,0.556,0.773,0 -14943,0.556,0.773,0 -14944,0.556,0.773,0 -14945,0.556,0.773,0 -14946,0.556,0.773,0 -14947,0.556,0.773,0 -14948,0.556,0.773,0 -14949,0.556,0.773,0 -14950,0.556,0.773,0 -14951,0.511,0.838,0 -14952,0.511,0.838,0.01 -14953,0.511,0.838,0 -14954,0.511,0.838,0 -14955,0.511,0.838,0 -14956,0.511,0.838,3.14 -14957,0.511,0.838,0 -14958,0.511,0.838,0 -14959,0.596,0.869,0 -14960,0.596,0.869,0 -14961,0.596,0.869,0 -14962,0.596,0.869,0 -14963,0.596,0.869,12.92 -14964,0.596,0.869,12.91 -14965,0.596,0.869,0 -14966,0.596,0.869,4.86 -14967,0.695,0.86,28.33 -14968,0.695,0.86,20.35 -14969,0.695,0.86,12.71 -14970,0.695,0.86,8.11 -14971,0.695,0.86,1.91 -14972,0.695,0.86,0 -14973,0.695,0.86,0 -14974,0.695,0.86,0 -14975,0.695,0.86,0 -14976,0.695,0.86,0 -14977,0.695,0.86,0 -14978,0.695,0.86,0.02 -14979,0.695,0.86,1.31 -14980,0.695,0.86,0 -14981,0.695,0.86,18.66 -14982,0.695,0.86,12.5 -14983,0.596,0.869,0 -14984,0.596,0.869,1.13 -14985,0.596,0.869,4.02 -14986,0.596,0.869,29.68 -14987,0.596,0.869,0 -14988,0.596,0.869,0 -14989,0.596,0.869,0 -14990,0.596,0.869,0 -14991,0.511,0.838,0 -14992,0.511,0.838,0 -14993,0.511,0.838,0 -14994,0.511,0.838,0 -14995,0.511,0.838,0 -14996,0.511,0.838,0 -14997,0.511,0.838,0 -14998,0.511,0.838,0 -14999,0.386,0.839,0 -15000,0.386,0.839,0 -15001,0.386,0.839,0 -15002,0.386,0.839,0 -15003,0.386,0.839,0 -15004,0.386,0.839,0 -15005,0.386,0.839,0 -15006,0.386,0.839,0 -15007,0.404,0.886,0 -15008,0.404,0.886,0 -15009,0.404,0.886,0 -15010,0.404,0.886,0 -15011,0.404,0.886,4.17 -15012,0.404,0.886,22.53 -15013,0.404,0.886,0 -15014,0.404,0.886,0 -15015,0.683,0.928,9.29 -15016,0.683,0.928,1.41 -15017,0.683,0.928,0 -15018,0.683,0.928,0 -15019,0.683,0.928,0 -15020,0.683,0.928,0.05 -15021,0.683,0.928,0 -15022,0.683,0.928,2.61 -15023,0.683,0.928,0 -15024,0.683,0.928,0 -15025,0.683,0.928,0 -15026,0.683,0.928,0 -15027,0.683,0.928,0 -15028,0.683,0.928,0 -15029,0.683,0.928,0 -15030,0.683,0.928,0 -15031,0.404,0.886,0 -15032,0.404,0.886,0 -15033,0.404,0.886,0 -15034,0.404,0.886,0 -15035,0.404,0.886,0 -15036,0.404,0.886,0 -15037,0.404,0.886,0 -15038,0.404,0.886,0 -15039,0.386,0.839,0 -15040,0.386,0.839,0 -15041,0.386,0.839,0 -15042,0.386,0.839,0 -15043,0.386,0.839,0 -15044,0.386,0.839,0 -15045,0.386,0.839,0.06 -15046,0.386,0.839,0 -15047,0.388,0.77,0 -15048,0.388,0.77,0 -15049,0.388,0.77,0 -15050,0.388,0.77,0 -15051,0.388,0.77,0 -15052,0.388,0.77,0 -15053,0.388,0.77,0 -15054,0.388,0.77,0 -15055,0.477,0.859,0 -15056,0.477,0.859,0 -15057,0.477,0.859,0 -15058,0.477,0.859,0 -15059,0.477,0.859,0 -15060,0.477,0.859,0 -15061,0.477,0.859,0 -15062,0.477,0.859,0 -15063,0.681,0.927,0 -15064,0.681,0.927,0 -15065,0.681,0.927,0 -15066,0.681,0.927,0 -15067,0.681,0.927,0 -15068,0.681,0.927,0 -15069,0.681,0.927,0 -15070,0.681,0.927,0 -15071,0.681,0.927,0 -15072,0.681,0.927,0 -15073,0.681,0.927,0 -15074,0.681,0.927,0 -15075,0.681,0.927,0 -15076,0.681,0.927,0 -15077,0.681,0.927,0 -15078,0.681,0.927,0 -15079,0.477,0.859,0 -15080,0.477,0.859,0 -15081,0.477,0.859,0 -15082,0.477,0.859,0 -15083,0.477,0.859,0 -15084,0.477,0.859,0 -15085,0.477,0.859,0 -15086,0.477,0.859,0 -15087,0.388,0.77,0 -15088,0.388,0.77,0 -15089,0.388,0.77,0 -15090,0.388,0.77,0 -15091,0.388,0.77,0 -15092,0.388,0.77,0 -15093,0.388,0.77,0 -15094,0.388,0.77,0 -15095,0.38,0.793,0 -15096,0.38,0.793,0 -15097,0.38,0.793,0 -15098,0.38,0.793,0 -15099,0.38,0.793,0 -15100,0.38,0.793,0 -15101,0.38,0.793,0 -15102,0.38,0.793,0 -15103,0.38,0.793,0 -15104,0.38,0.793,0 -15105,0.38,0.793,0 -15106,0.38,0.793,0 -15107,0.38,0.793,0 -15108,0.38,0.793,0 -15109,0.38,0.793,0 -15110,0.38,0.793,0 -15111,0.38,0.793,0 -15112,0.38,0.793,0 -15113,0.38,0.792,0 -15114,0.38,0.792,0 -15115,0.38,0.792,0 -15116,0.38,0.792,0 -15117,0.38,0.792,0 -15118,0.38,0.792,0 -15119,0.38,0.792,0 -15120,0.38,0.792,0 -15121,0.38,0.792,0 -15122,0.38,0.792,0 -15123,0.38,0.792,0 -15124,0.38,0.792,0 -15125,0.38,0.792,0 -15126,0.38,0.792,0 -15127,0.38,0.792,0 -15128,0.38,0.792,0 -15129,0.38,0.792,0 -15130,0.38,0.792,0 -15131,0.51,0.886,15.95 -15132,0.51,0.886,16.1 -15133,0.51,0.886,12.21 -15134,0.51,0.886,10.08 -15135,0.51,0.886,29.92 -15136,0.51,0.886,39.02 -15137,0.51,0.886,5.09 -15138,0.51,0.886,13.12 -15139,0.432,0.895,11.44 -15140,0.432,0.895,42.58 -15141,0.432,0.895,0.19 -15142,0.432,0.895,24.92 -15143,0.432,0.895,24.32 -15144,0.432,0.895,40.64 -15145,0.432,0.895,19.99 -15146,0.432,0.895,29.6 -15147,0.393,0.925,20.96 -15148,0.393,0.925,12.7 -15149,0.393,0.925,15.52 -15150,0.393,0.925,0 -15151,0.393,0.925,21.61 -15152,0.393,0.925,37.7 -15153,0.393,0.925,0 -15154,0.393,0.925,1.64 -15155,0.393,0.925,0 -15156,0.393,0.925,0 -15157,0.393,0.925,0 -15158,0.393,0.925,0 -15159,0.393,0.925,0 -15160,0.393,0.925,0 -15161,0.393,0.925,15.8 -15162,0.393,0.925,0.41 -15163,0.432,0.895,22.17 -15164,0.432,0.895,19.9 -15165,0.432,0.895,4.69 -15166,0.432,0.895,27.26 -15167,0.432,0.895,0 -15168,0.432,0.895,2.8 -15169,0.432,0.895,4.65 -15170,0.432,0.895,1.97 -15171,0.51,0.886,14.94 -15172,0.51,0.886,10.63 -15173,0.51,0.886,9.68 -15174,0.51,0.886,2.5 -15175,0.51,0.886,39.05 -15176,0.51,0.886,26.99 -15177,0.51,0.886,28.09 -15178,0.51,0.886,25.99 -15179,0.589,0.932,19.53 -15180,0.589,0.932,5.03 -15181,0.589,0.932,0.06 -15182,0.589,0.932,0.67 -15183,0.623,0.936,1.11 -15184,0.623,0.936,1.92 -15185,0.623,0.936,12.59 -15186,0.623,0.936,8.02 -15187,0.669,0.879,6.15 -15188,0.669,0.879,2.34 -15189,0.669,0.879,0 -15190,0.669,0.879,1.29 -15191,0.669,0.879,10.7 -15192,0.669,0.879,19.41 -15193,0.669,0.879,6.96 -15194,0.669,0.879,33.45 -15195,0.667,0.856,27.66 -15196,0.667,0.856,21.52 -15197,0.667,0.856,30.95 -15198,0.667,0.856,21.81 -15199,0.667,0.856,0 -15200,0.667,0.856,0 -15201,0.667,0.856,0.09 -15202,0.667,0.856,0 -15203,0.667,0.856,0 -15204,0.667,0.856,0 -15205,0.667,0.856,0 -15206,0.667,0.856,0 -15207,0.667,0.856,29.05 -15208,0.667,0.856,18.4 -15209,0.667,0.856,25.44 -15210,0.667,0.856,14.45 -15211,0.669,0.879,8.03 -15212,0.669,0.879,16.34 -15213,0.669,0.879,3.24 -15214,0.669,0.879,11.15 -15215,0.669,0.879,0 -15216,0.669,0.879,0 -15217,0.669,0.879,0 -15218,0.669,0.879,0 -15219,0.666,0.943,22.91 -15220,0.666,0.943,4.08 -15221,0.666,0.943,5.47 -15222,0.666,0.943,4.31 -15223,0.666,0.941,0 -15224,0.666,0.941,18.88 -15225,0.666,0.941,0 -15226,0.666,0.941,0 -15227,0.666,0.943,0 -15228,0.666,0.943,0 -15229,0.666,0.943,0 -15230,0.666,0.943,0 -15231,0.666,0.943,0 -15232,0.666,0.943,0 -15233,0.666,0.943,0 -15234,0.666,0.943,0 -15235,0.684,0.858,0 -15236,0.684,0.858,0 -15237,0.684,0.858,0 -15238,0.684,0.858,0 -15239,0.684,0.858,0 -15240,0.684,0.858,0.02 -15241,0.684,0.858,0 -15242,0.684,0.858,0 -15243,0.785,0.797,0.02 -15244,0.785,0.797,0.05 -15245,0.785,0.797,0 -15246,0.785,0.797,0 -15247,0.785,0.797,0 -15248,0.785,0.797,0 -15249,0.785,0.797,0 -15250,0.785,0.797,0 -15251,0.785,0.797,0 -15252,0.785,0.797,0 -15253,0.785,0.797,0 -15254,0.785,0.797,0 -15255,0.785,0.797,0 -15256,0.785,0.797,0 -15257,0.785,0.797,0 -15258,0.785,0.797,0 -15259,0.684,0.858,0 -15260,0.684,0.858,0 -15261,0.684,0.858,0.25 -15262,0.684,0.858,0 -15263,0.684,0.858,0.85 -15264,0.684,0.858,0 -15265,0.684,0.858,21.9 -15266,0.684,0.858,0.54 -15267,0.666,0.943,0 -15268,0.666,0.943,0.12 -15269,0.666,0.943,0 -15270,0.666,0.943,0 -15271,0.666,0.943,0 -15272,0.666,0.943,0 -15273,0.666,0.943,1.18 -15274,0.666,0.943,1.64 -15275,0.463,0.799,0.05 -15276,0.463,0.799,0 -15277,0.463,0.799,12.88 -15278,0.463,0.799,0 -15279,0.559,0.805,12.76 -15280,0.559,0.805,13.59 -15281,0.559,0.805,2.94 -15282,0.559,0.805,1.73 -15283,0.489,0.931,0.27 -15284,0.489,0.931,0 -15285,0.489,0.931,26.36 -15286,0.489,0.931,2.4 -15287,0.37,0.957,9.18 -15288,0.37,0.957,18.54 -15289,0.37,0.957,28.32 -15290,0.37,0.957,40.09 -15291,0.55,0.957,23.01 -15292,0.55,0.957,22.92 -15293,0.55,0.957,24.5 -15294,0.55,0.957,39.76 -15295,0.502,0.936,8.86 -15296,0.419,0.942,27.13 -15297,0.588,0.938,30.58 -15298,0.613,0.945,37.69 -15299,0.711,0.908,29.21 -15300,0.759,0.915,38.66 -15301,0.465,0.874,9.89 -15302,0.485,0.878,19.17 -15303,0.447,0.93,46.16 -15304,0.447,0.93,32.79 -15305,0.447,0.93,36.16 -15306,0.447,0.93,25.55 -15307,0.58,0.861,32 -15308,0.44,0.892,42.08 -15309,0.682,0.871,36.29 -15310,0.527,0.845,40.21 -15311,0.489,0.934,42.78 -15312,0.64,0.928,31.01 -15313,0.491,0.899,27.13 -15314,0.698,0.909,40.17 -15315,0.667,0.938,6.8 -15316,0.51,0.903,5.02 -15317,0.655,0.927,2.19 -15318,0.662,0.934,4.08 -15319,0.512,0.903,10.35 -15320,0.512,0.903,3.34 -15321,0.512,0.903,0 -15322,0.512,0.903,1.59 -15323,0.415,0.875,2.61 -15324,0.415,0.875,8.44 -15325,0.415,0.875,0 -15326,0.415,0.875,2.43 -15327,0.57,0.903,6.74 -15328,0.57,0.903,8.93 -15329,0.57,0.903,0 -15330,0.57,0.903,0.54 -15331,0.671,0.895,41.41 -15332,0.671,0.895,37.68 -15333,0.671,0.895,11.89 -15334,0.671,0.895,20.09 -15335,0.66,0.896,23.89 -15336,0.66,0.896,37.57 -15337,0.66,0.896,8.89 -15338,0.66,0.896,10.72 -15339,0.46,0.864,33.48 -15340,0.46,0.864,19.46 -15341,0.46,0.864,15.53 -15342,0.46,0.864,12.09 -15343,0.483,0.87,14.03 -15344,0.483,0.87,35.95 -15345,0.483,0.87,9.66 -15346,0.483,0.87,2.74 -15347,0.614,0.813,4.42 -15348,0.614,0.813,0 -15349,0.614,0.813,0 -15350,0.614,0.813,0 -15351,0.602,0.821,4.17 -15352,0.602,0.821,20.54 -15353,0.602,0.821,0 -15354,0.602,0.821,0 -15355,0.541,0.911,0.32 -15356,0.541,0.911,0 -15357,0.541,0.911,0.07 -15358,0.541,0.911,5.17 -15359,0.531,0.927,2.05 -15360,0.531,0.927,1.03 -15361,0.531,0.927,0.47 -15362,0.531,0.927,0 -15363,0.529,0.925,0 -15364,0.529,0.925,0 -15365,0.529,0.925,0 -15366,0.529,0.925,0.5 -15367,0.529,0.925,6.7 -15368,0.529,0.925,1.15 -15369,0.529,0.925,0.02 -15370,0.529,0.925,4.04 -15371,0.534,0.935,0 -15372,0.534,0.935,0.04 -15373,0.534,0.935,0 -15374,0.534,0.935,0 -15375,0.534,0.935,0 -15376,0.534,0.935,0 -15377,0.534,0.935,0 -15378,0.534,0.935,1.55 -15379,0.534,0.935,0 -15380,0.534,0.935,22.58 -15381,0.534,0.935,0 -15382,0.534,0.935,0.42 -15383,0.534,0.935,4.16 -15384,0.534,0.935,0.02 -15385,0.534,0.935,1.98 -15386,0.534,0.935,0 -15387,0.534,0.935,0 -15388,0.534,0.935,0 -15389,0.534,0.935,2.09 -15390,0.534,0.935,2.08 -15391,0.584,0.838,0 -15392,0.584,0.838,11.99 -15393,0.584,0.838,0 -15394,0.584,0.838,2.56 -15395,0.534,0.935,0 -15396,0.534,0.935,1.63 -15397,0.534,0.935,0 -15398,0.534,0.935,0 -15399,0.534,0.935,0 -15400,0.534,0.935,0.01 -15401,0.534,0.935,0 -15402,0.534,0.935,2.11 -15403,0.534,0.935,0.01 -15404,0.534,0.935,0 -15405,0.534,0.935,0 -15406,0.534,0.935,0 -15407,0.534,0.935,0 -15408,0.534,0.935,0 -15409,0.534,0.935,0 -15410,0.534,0.935,0 -15411,0.534,0.935,0 -15412,0.534,0.935,0 -15413,0.534,0.935,0 -15414,0.534,0.935,0 -15415,0.534,0.935,0 -15416,0.534,0.935,0 -15417,0.534,0.935,0 -15418,0.534,0.935,0 -15419,0.573,0.864,0 -15420,0.573,0.864,0 -15421,0.573,0.864,2.65 -15422,0.573,0.864,0.83 -15423,0.573,0.864,0 -15424,0.573,0.864,0 -15425,0.573,0.864,0 -15426,0.573,0.864,0 -15427,0.638,0.846,14.62 -15428,0.638,0.846,0.02 -15429,0.638,0.846,0 -15430,0.638,0.846,0 -15431,0.638,0.846,0 -15432,0.638,0.846,0 -15433,0.638,0.846,0 -15434,0.638,0.846,0 -15435,0.654,0.866,0 -15436,0.654,0.866,0 -15437,0.654,0.866,11.03 -15438,0.654,0.866,25.8 -15439,0.654,0.866,4.29 -15440,0.654,0.866,0 -15441,0.654,0.866,15.64 -15442,0.654,0.866,27.64 -15443,0.654,0.866,0 -15444,0.654,0.866,0 -15445,0.654,0.866,0 -15446,0.654,0.866,0 -15447,0.654,0.866,0 -15448,0.654,0.866,14.36 -15449,0.654,0.866,0 -15450,0.654,0.866,0 -15451,0.638,0.846,0 -15452,0.638,0.846,0 -15453,0.638,0.846,1.13 -15454,0.638,0.846,2 -15455,0.638,0.846,10.54 -15456,0.638,0.846,0.14 -15457,0.638,0.846,11.1 -15458,0.638,0.846,6.46 -15459,0.573,0.864,1.5 -15460,0.573,0.864,2.68 -15461,0.573,0.864,1.33 -15462,0.573,0.864,0 -15463,0.573,0.864,26.95 -15464,0.573,0.864,2.36 -15465,0.573,0.864,19.02 -15466,0.573,0.864,18.91 -15467,0.494,0.873,0.11 -15468,0.494,0.873,11.14 -15469,0.494,0.873,0 -15470,0.494,0.873,0 -15471,0.494,0.873,0 -15472,0.494,0.873,3.49 -15473,0.494,0.873,0.99 -15474,0.494,0.873,5.11 -15475,0.461,0.84,1.03 -15476,0.461,0.84,5.2 -15477,0.461,0.84,5.99 -15478,0.461,0.84,6.99 -15479,0.461,0.84,6.02 -15480,0.461,0.84,0 -15481,0.461,0.84,12.22 -15482,0.461,0.84,9.79 -15483,0.59,0.809,0 -15484,0.59,0.809,0 -15485,0.59,0.809,17.56 -15486,0.59,0.809,9.28 -15487,0.59,0.809,4.9 -15488,0.59,0.809,6.58 -15489,0.59,0.809,17.16 -15490,0.59,0.809,1.47 -15491,0.59,0.809,2.61 -15492,0.59,0.809,2.54 -15493,0.59,0.809,0 -15494,0.59,0.809,0 -15495,0.59,0.809,0.45 -15496,0.59,0.809,1.99 -15497,0.59,0.809,0.01 -15498,0.59,0.809,1.98 -15499,0.461,0.84,21.6 -15500,0.461,0.84,24.72 -15501,0.461,0.84,3.81 -15502,0.461,0.84,30.95 -15503,0.461,0.84,14.1 -15504,0.461,0.84,2.84 -15505,0.461,0.84,18.38 -15506,0.461,0.84,19.25 -15507,0.494,0.873,15.65 -15508,0.494,0.873,20.36 -15509,0.494,0.873,14.8 -15510,0.494,0.873,29.62 -15511,0.494,0.873,6.84 -15512,0.494,0.873,19.14 -15513,0.494,0.873,36.09 -15514,0.494,0.873,25.26 -15515,0.552,0.825,0.1 -15516,0.552,0.825,0.37 -15517,0.552,0.825,1.15 -15518,0.552,0.825,0.99 -15519,0.552,0.825,0 -15520,0.552,0.825,0 -15521,0.552,0.825,2.31 -15522,0.552,0.825,0 -15523,0.617,0.787,0.04 -15524,0.617,0.787,7.97 -15525,0.617,0.787,10.31 -15526,0.617,0.787,0.04 -15527,0.617,0.787,18.85 -15528,0.617,0.787,0.18 -15529,0.617,0.787,0 -15530,0.617,0.787,8.06 -15531,0.65,0.839,8.61 -15532,0.65,0.839,0.04 -15533,0.65,0.839,27.84 -15534,0.65,0.839,0 -15535,0.65,0.839,0.6 -15536,0.65,0.839,0.1 -15537,0.65,0.839,0.59 -15538,0.65,0.839,0 -15539,0.65,0.839,0 -15540,0.65,0.839,0 -15541,0.65,0.839,0 -15542,0.65,0.839,3.99 -15543,0.65,0.839,16.13 -15544,0.65,0.839,12.71 -15545,0.65,0.839,26.3 -15546,0.65,0.839,15.7 -15547,0.617,0.787,0 -15548,0.617,0.787,33.36 -15549,0.617,0.787,14.56 -15550,0.617,0.787,23.15 -15551,0.617,0.787,1.94 -15552,0.617,0.787,9.01 -15553,0.617,0.787,0 -15554,0.617,0.787,0 -15555,0.552,0.825,8.82 -15556,0.552,0.825,0.29 -15557,0.552,0.825,0.02 -15558,0.552,0.825,0 -15559,0.552,0.825,0.87 -15560,0.552,0.825,9.14 -15561,0.552,0.825,0.01 -15562,0.552,0.825,0 -15563,0.648,0.723,0 -15564,0.648,0.723,0 -15565,0.648,0.723,0 -15566,0.648,0.723,0 -15567,0.648,0.723,3.76 -15568,0.648,0.723,6.94 -15569,0.648,0.723,0 -15570,0.648,0.723,0.01 -15571,0.648,0.723,16.06 -15572,0.648,0.723,0.78 -15573,0.648,0.723,0.87 -15574,0.648,0.723,11.01 -15575,0.619,0.823,0.19 -15576,0.619,0.823,0.02 -15577,0.619,0.823,3.3 -15578,0.619,0.823,2.47 -15579,0.605,0.809,4.65 -15580,0.605,0.809,3.69 -15581,0.605,0.809,16.67 -15582,0.605,0.809,13.31 -15583,0.605,0.809,7.51 -15584,0.605,0.809,2.3 -15585,0.605,0.809,14.79 -15586,0.605,0.809,7.98 -15587,0.605,0.809,8.91 -15588,0.605,0.809,14.05 -15589,0.605,0.809,9.22 -15590,0.605,0.809,26.42 -15591,0.605,0.809,24.93 -15592,0.605,0.809,19.15 -15593,0.605,0.809,30.76 -15594,0.605,0.809,17.3 -15595,0.621,0.852,14.12 -15596,0.621,0.852,21.05 -15597,0.621,0.852,19.22 -15598,0.621,0.852,35.1 -15599,0.657,0.816,18.53 -15600,0.657,0.816,21.64 -15601,0.657,0.816,31.64 -15602,0.657,0.816,20.09 -15603,0.648,0.725,10.62 -15604,0.648,0.725,15.15 -15605,0.648,0.725,22.08 -15606,0.648,0.725,35.48 -15607,0.637,0.832,14 -15608,0.637,0.832,17.83 -15609,0.637,0.832,24.15 -15610,0.637,0.832,25.38 -15611,0.585,0.846,1.27 -15612,0.585,0.846,29.3 -15613,0.585,0.846,24.04 -15614,0.585,0.846,26.53 -15615,0.585,0.846,31.13 -15616,0.585,0.846,0.08 -15617,0.585,0.846,29.52 -15618,0.585,0.846,10.43 -15619,0.551,0.814,11.41 -15620,0.551,0.814,15.03 -15621,0.551,0.814,7.66 -15622,0.551,0.814,0 -15623,0.551,0.814,17.26 -15624,0.551,0.814,1.22 -15625,0.551,0.814,5.1 -15626,0.551,0.814,10.87 -15627,0.496,0.845,8.81 -15628,0.496,0.845,2.26 -15629,0.496,0.845,0 -15630,0.496,0.845,0 -15631,0.496,0.845,5.88 -15632,0.496,0.845,10.8 -15633,0.496,0.845,5.98 -15634,0.496,0.845,4.67 -15635,0.496,0.845,12.87 -15636,0.496,0.845,8.28 -15637,0.496,0.845,18.53 -15638,0.496,0.845,16.17 -15639,0.496,0.845,0.18 -15640,0.496,0.845,0 -15641,0.496,0.845,23.22 -15642,0.496,0.845,9.48 -15643,0.551,0.814,15.32 -15644,0.551,0.814,9.38 -15645,0.551,0.814,19.35 -15646,0.551,0.814,26.89 -15647,0.551,0.814,9.07 -15648,0.551,0.814,8.98 -15649,0.551,0.814,16.43 -15650,0.551,0.814,6.6 -15651,0.585,0.846,9.74 -15652,0.585,0.846,4.3 -15653,0.585,0.846,0 -15654,0.585,0.846,13.02 -15655,0.585,0.846,18.85 -15656,0.585,0.846,14.84 -15657,0.585,0.846,22.23 -15658,0.585,0.846,7.67 -15659,0.534,0.823,0 -15660,0.534,0.823,0 -15661,0.534,0.823,0.01 -15662,0.534,0.823,1.97 -15663,0.534,0.823,0 -15664,0.534,0.823,0 -15665,0.534,0.823,4.55 -15666,0.534,0.823,1.17 -15667,0.557,0.778,7.15 -15668,0.557,0.778,22.64 -15669,0.557,0.778,0 -15670,0.557,0.778,0 -15671,0.557,0.778,22.96 -15672,0.557,0.778,10.11 -15673,0.557,0.778,0 -15674,0.557,0.778,0 -15675,0.645,0.783,12.3 -15676,0.645,0.783,14.3 -15677,0.645,0.783,13.97 -15678,0.645,0.783,16.51 -15679,0.645,0.783,3.22 -15680,0.645,0.783,20.93 -15681,0.645,0.783,34.86 -15682,0.645,0.783,17.59 -15683,0.645,0.783,27.29 -15684,0.645,0.783,24 -15685,0.645,0.783,6.71 -15686,0.645,0.783,17.56 -15687,0.645,0.783,0 -15688,0.645,0.783,16.6 -15689,0.645,0.783,0.01 -15690,0.645,0.783,15.27 -15691,0.557,0.778,0 -15692,0.557,0.778,0 -15693,0.557,0.778,0 -15694,0.557,0.778,0 -15695,0.557,0.778,0 -15696,0.557,0.778,0 -15697,0.557,0.778,0 -15698,0.557,0.778,0 -15699,0.534,0.823,30.87 -15700,0.534,0.823,2.3 -15701,0.534,0.823,15.73 -15702,0.534,0.823,3.03 -15703,0.534,0.823,6.85 -15704,0.534,0.823,6.18 -15705,0.534,0.823,2.42 -15706,0.534,0.823,0.92 -15707,0.627,0.898,23.52 -15708,0.627,0.898,8.15 -15709,0.627,0.898,31.19 -15710,0.627,0.898,28.48 -15711,0.627,0.898,6.49 -15712,0.627,0.898,1.98 -15713,0.627,0.898,12.76 -15714,0.627,0.898,0 -15715,0.536,0.787,12.43 -15716,0.536,0.787,1.58 -15717,0.536,0.787,0.04 -15718,0.536,0.787,0.01 -15719,0.536,0.787,33.14 -15720,0.536,0.787,11.68 -15721,0.536,0.787,4.48 -15722,0.536,0.787,0.79 -15723,0.529,0.814,30.1 -15724,0.529,0.814,0.03 -15725,0.529,0.814,21.49 -15726,0.529,0.814,4.89 -15727,0.529,0.814,0 -15728,0.529,0.814,0 -15729,0.529,0.814,0.04 -15730,0.529,0.814,0 -15731,0.529,0.814,0 -15732,0.529,0.814,0 -15733,0.529,0.814,0 -15734,0.529,0.814,0 -15735,0.529,0.814,23.41 -15736,0.529,0.814,17.66 -15737,0.529,0.814,11.52 -15738,0.529,0.814,10.72 -15739,0.536,0.787,0.28 -15740,0.536,0.787,23.5 -15741,0.536,0.787,8.66 -15742,0.536,0.787,12.59 -15743,0.536,0.787,0 -15744,0.536,0.787,1.43 -15745,0.536,0.787,2 -15746,0.536,0.787,20.22 -15747,0.627,0.898,0 -15748,0.627,0.898,0 -15749,0.627,0.898,1.37 -15750,0.627,0.898,1.99 -15751,0.627,0.898,30.03 -15752,0.627,0.898,30.67 -15753,0.627,0.898,23.58 -15754,0.627,0.898,28.14 -15755,0.544,0.874,21.42 -15756,0.544,0.874,23.36 -15757,0.544,0.874,0 -15758,0.544,0.874,0 -15759,0.544,0.874,2.59 -15760,0.544,0.874,0.71 -15761,0.544,0.874,0 -15762,0.544,0.874,0.17 -15763,0.603,0.83,2.37 -15764,0.603,0.83,9.88 -15765,0.603,0.83,3.53 -15766,0.603,0.83,9.41 -15767,0.603,0.83,19.93 -15768,0.603,0.83,19.49 -15769,0.603,0.83,11.61 -15770,0.603,0.83,6.9 -15771,0.594,0.831,16.86 -15772,0.594,0.831,13.18 -15773,0.594,0.831,8.68 -15774,0.594,0.831,14.4 -15775,0.594,0.831,0 -15776,0.594,0.831,0 -15777,0.594,0.831,0.08 -15778,0.594,0.831,0 -15779,0.594,0.831,0.32 -15780,0.594,0.831,0 -15781,0.594,0.831,0.05 -15782,0.594,0.831,0 -15783,0.594,0.831,1.88 -15784,0.594,0.831,6.31 -15785,0.594,0.831,0 -15786,0.594,0.831,3.69 -15787,0.603,0.83,21.07 -15788,0.603,0.83,7.91 -15789,0.603,0.83,22.54 -15790,0.603,0.83,16.66 -15791,0.603,0.83,6.7 -15792,0.603,0.83,23.84 -15793,0.603,0.83,0 -15794,0.603,0.83,16.99 -15795,0.544,0.874,1.67 -15796,0.544,0.874,3.46 -15797,0.544,0.874,0.47 -15798,0.544,0.874,17.99 -15799,0.544,0.874,30.65 -15800,0.544,0.874,26.01 -15801,0.544,0.874,32.23 -15802,0.544,0.874,13.08 -15803,0.367,0.915,2.14 -15804,0.367,0.915,11.28 -15805,0.367,0.915,1.61 -15806,0.367,0.915,2.35 -15807,0.367,0.915,11.35 -15808,0.367,0.915,25.63 -15809,0.367,0.915,7.48 -15810,0.367,0.915,1.08 -15811,0.675,0.848,6.01 -15812,0.675,0.848,0 -15813,0.675,0.848,3.82 -15814,0.675,0.848,11.46 -15815,0.675,0.848,1.51 -15816,0.675,0.848,4.59 -15817,0.675,0.848,3.39 -15818,0.675,0.848,13.96 -15819,0.502,0.865,0 -15820,0.502,0.865,0.65 -15821,0.502,0.865,8.47 -15822,0.502,0.865,21.84 -15823,0.502,0.865,37.51 -15824,0.502,0.865,32.68 -15825,0.502,0.865,36.48 -15826,0.502,0.865,41.46 -15827,0.502,0.865,2.29 -15828,0.502,0.865,26.99 -15829,0.502,0.865,28.21 -15830,0.502,0.865,30.69 -15831,0.502,0.865,26.55 -15832,0.502,0.865,34.04 -15833,0.502,0.865,34.51 -15834,0.502,0.865,26.09 -15835,0.675,0.848,30.99 -15836,0.675,0.848,33.28 -15837,0.675,0.848,29.75 -15838,0.675,0.848,33.89 -15839,0.675,0.848,8.47 -15840,0.675,0.848,23.81 -15841,0.675,0.848,9.33 -15842,0.675,0.848,20.02 -15843,0.367,0.915,23.65 -15844,0.367,0.915,1.91 -15845,0.367,0.915,11.38 -15846,0.367,0.915,15.48 -15847,0.367,0.915,6.48 -15848,0.367,0.915,15.6 -15849,0.367,0.915,17.33 -15850,0.367,0.915,35.34 -15851,0.582,0.838,3.94 -15852,0.582,0.838,4.16 -15853,0.582,0.838,0 -15854,0.582,0.838,0 -15855,0.582,0.838,2.3 -15856,0.582,0.838,1.92 -15857,0.582,0.838,0 -15858,0.582,0.838,0 -15859,0.528,0.887,1.92 -15860,0.528,0.887,20.44 -15861,0.528,0.887,0 -15862,0.528,0.887,0 -15863,0.528,0.887,41.53 -15864,0.528,0.887,41.87 -15865,0.528,0.887,18.02 -15866,0.528,0.887,0.98 -15867,0.507,0.888,42.24 -15868,0.507,0.888,0.71 -15869,0.507,0.888,0 -15870,0.507,0.888,0 -15871,0.507,0.888,9.5 -15872,0.507,0.888,12.07 -15873,0.507,0.888,28.06 -15874,0.507,0.888,18.72 -15875,0.507,0.888,12.33 -15876,0.507,0.888,26.7 -15877,0.507,0.888,5.48 -15878,0.507,0.888,31.59 -15879,0.507,0.888,0 -15880,0.507,0.888,0.07 -15881,0.507,0.888,0 -15882,0.507,0.888,0.5 -15883,0.528,0.887,0 -15884,0.528,0.887,0.68 -15885,0.528,0.887,0 -15886,0.528,0.887,0 -15887,0.528,0.887,0 -15888,0.528,0.887,0 -15889,0.528,0.887,0 -15890,0.528,0.887,0 -15891,0.582,0.838,0 -15892,0.582,0.838,0 -15893,0.582,0.838,0 -15894,0.582,0.838,0 -15895,0.582,0.838,2.49 -15896,0.582,0.838,0 -15897,0.582,0.838,8.4 -15898,0.582,0.838,2.72 -15899,0.515,0.852,35.33 -15900,0.515,0.852,3.63 -15901,0.515,0.852,29.99 -15902,0.515,0.852,9.47 -15903,0.515,0.852,2.75 -15904,0.515,0.852,0.88 -15905,0.515,0.852,4.13 -15906,0.515,0.852,0.33 -15907,0.608,0.823,0 -15908,0.608,0.823,2.08 -15909,0.608,0.823,0 -15910,0.608,0.823,0 -15911,0.608,0.823,0 -15912,0.608,0.823,0 -15913,0.608,0.823,0 -15914,0.608,0.823,0 -15915,0.545,0.865,0 -15916,0.545,0.865,0 -15917,0.545,0.865,0 -15918,0.545,0.865,0 -15919,0.545,0.865,0.29 -15920,0.545,0.865,12.69 -15921,0.545,0.865,17.06 -15922,0.545,0.865,11.68 -15923,0.545,0.865,0.02 -15924,0.545,0.865,15.66 -15925,0.545,0.865,12.05 -15926,0.545,0.865,13.71 -15927,0.545,0.865,0 -15928,0.545,0.865,23.56 -15929,0.545,0.865,0 -15930,0.545,0.865,20.8 -15931,0.608,0.823,0 -15932,0.608,0.823,0 -15933,0.608,0.823,1.1 -15934,0.608,0.823,0 -15935,0.608,0.823,0 -15936,0.608,0.823,0 -15937,0.608,0.823,0 -15938,0.608,0.823,0 -15939,0.515,0.852,31.06 -15940,0.515,0.852,10.71 -15941,0.515,0.852,27.6 -15942,0.515,0.852,23.75 -15943,0.515,0.852,28.23 -15944,0.515,0.852,17.66 -15945,0.515,0.852,12.72 -15946,0.515,0.852,27.78 -15947,0.457,0.897,10.22 -15948,0.457,0.897,10.43 -15949,0.457,0.897,3.69 -15950,0.457,0.897,0.14 -15951,0.457,0.897,30.48 -15952,0.457,0.897,25.67 -15953,0.457,0.897,13.38 -15954,0.457,0.897,0.03 -15955,0.679,0.869,1.07 -15956,0.679,0.869,0 -15957,0.679,0.869,2.25 -15958,0.679,0.869,0 -15959,0.513,0.896,0 -15960,0.513,0.896,0 -15961,0.513,0.896,0 -15962,0.513,0.896,0 -15963,0.443,0.894,1.83 -15964,0.443,0.894,0 -15965,0.443,0.894,1.96 -15966,0.443,0.894,2 -15967,0.446,0.922,0.01 -15968,0.446,0.922,0 -15969,0.446,0.922,2.23 -15970,0.446,0.922,12.25 -15971,0.442,0.917,18.78 -15972,0.442,0.917,9.5 -15973,0.442,0.917,1.33 -15974,0.442,0.917,9.43 -15975,0.403,0.909,0 -15976,0.403,0.909,4.09 -15977,0.403,0.909,25.09 -15978,0.403,0.909,10.81 -15979,0.674,0.963,0.83 -15980,0.674,0.963,8.31 -15981,0.674,0.963,4.32 -15982,0.674,0.963,11.82 -15983,0.65,0.878,0.18 -15984,0.65,0.878,0.75 -15985,0.65,0.878,0.23 -15986,0.65,0.878,3.63 -15987,0.457,0.897,0 -15988,0.457,0.897,1.24 -15989,0.457,0.897,0.01 -15990,0.457,0.897,0.14 -15991,0.457,0.897,0 -15992,0.457,0.897,0 -15993,0.457,0.897,0 -15994,0.457,0.897,0 -15995,0.418,0.862,0 -15996,0.418,0.862,6.81 -15997,0.418,0.862,13.08 -15998,0.418,0.862,10.41 -15999,0.418,0.862,6.69 -16000,0.418,0.862,5.05 -16001,0.418,0.862,16.01 -16002,0.418,0.862,8.04 -16003,0.502,0.857,0.01 -16004,0.502,0.857,0.53 -16005,0.502,0.857,0 -16006,0.502,0.857,0 -16007,0.502,0.857,0 -16008,0.502,0.857,2.63 -16009,0.502,0.857,0 -16010,0.502,0.857,0.77 -16011,0.392,0.87,0.68 -16012,0.392,0.87,1.84 -16013,0.392,0.87,0.02 -16014,0.392,0.87,0 -16015,0.392,0.87,1.36 -16016,0.392,0.87,5.71 -16017,0.392,0.87,3.61 -16018,0.392,0.87,2.19 -16019,0.392,0.87,2.51 -16020,0.392,0.87,4.39 -16021,0.392,0.87,0.01 -16022,0.392,0.87,8.36 -16023,0.392,0.87,0 -16024,0.392,0.87,0 -16025,0.392,0.87,0 -16026,0.392,0.87,0 -16027,0.502,0.857,0.64 -16028,0.502,0.857,0 -16029,0.502,0.857,6.09 -16030,0.502,0.857,0 -16031,0.502,0.857,29.03 -16032,0.502,0.857,11.61 -16033,0.502,0.857,30.79 -16034,0.502,0.857,6.99 -16035,0.418,0.862,8.22 -16036,0.418,0.862,16.83 -16037,0.418,0.862,0.13 -16038,0.418,0.862,3.16 -16039,0.418,0.862,27.78 -16040,0.418,0.862,21.37 -16041,0.418,0.862,0.4 -16042,0.418,0.862,17.71 -16043,0.737,0.829,8.52 -16044,0.737,0.829,0.02 -16045,0.737,0.829,13.92 -16046,0.737,0.829,0.03 -16047,0.737,0.829,11.12 -16048,0.737,0.829,25.19 -16049,0.737,0.829,16.17 -16050,0.737,0.829,0 -16051,0.562,0.849,0.01 -16052,0.562,0.849,0 -16053,0.562,0.849,1.4 -16054,0.562,0.849,0.66 -16055,0.562,0.849,0.01 -16056,0.562,0.849,3.74 -16057,0.562,0.849,0 -16058,0.562,0.849,0 -16059,0.524,0.859,0 -16060,0.524,0.859,0 -16061,0.524,0.859,0 -16062,0.524,0.859,0 -16063,0.524,0.859,0 -16064,0.524,0.859,27.2 -16065,0.524,0.859,0 -16066,0.524,0.859,15.63 -16067,0.524,0.859,2.52 -16068,0.524,0.859,7.62 -16069,0.524,0.859,13.99 -16070,0.524,0.859,33.68 -16071,0.524,0.859,0 -16072,0.524,0.859,0.01 -16073,0.524,0.859,0 -16074,0.524,0.859,0.01 -16075,0.562,0.849,4.25 -16076,0.562,0.849,0 -16077,0.562,0.849,14.56 -16078,0.562,0.849,16.64 -16079,0.562,0.849,10.07 -16080,0.562,0.849,0 -16081,0.562,0.849,0 -16082,0.562,0.849,8.16 -16083,0.737,0.829,4.03 -16084,0.737,0.829,3.14 -16085,0.737,0.829,0 -16086,0.737,0.829,0 -16087,0.737,0.829,2.53 -16088,0.737,0.829,4.51 -16089,0.737,0.829,0 -16090,0.737,0.829,0 -16091,0.686,0.824,5.96 -16092,0.686,0.824,0 -16093,0.686,0.824,0 -16094,0.686,0.824,0 -16095,0.686,0.824,0 -16096,0.686,0.824,0 -16097,0.686,0.824,0 -16098,0.686,0.824,0 -16099,0.57,0.866,0 -16100,0.57,0.866,0 -16101,0.57,0.866,0 -16102,0.57,0.866,0 -16103,0.57,0.866,0 -16104,0.57,0.866,17.78 -16105,0.57,0.866,0 -16106,0.57,0.866,0 -16107,0.585,0.855,9.59 -16108,0.585,0.855,10.16 -16109,0.585,0.855,0 -16110,0.585,0.855,0.01 -16111,0.585,0.855,7.5 -16112,0.585,0.855,12.33 -16113,0.585,0.855,7.04 -16114,0.585,0.855,37.43 -16115,0.585,0.855,16.35 -16116,0.585,0.855,18.96 -16117,0.585,0.855,3.97 -16118,0.585,0.855,12.33 -16119,0.585,0.855,0 -16120,0.585,0.855,0 -16121,0.585,0.855,0.73 -16122,0.585,0.855,6.94 -16123,0.57,0.866,0 -16124,0.57,0.866,0 -16125,0.57,0.866,0 -16126,0.57,0.866,0 -16127,0.57,0.866,0 -16128,0.57,0.866,0 -16129,0.57,0.866,0 -16130,0.57,0.866,0 -16131,0.686,0.824,0 -16132,0.686,0.824,0 -16133,0.686,0.824,0 -16134,0.686,0.824,0 -16135,0.686,0.824,0 -16136,0.686,0.824,0 -16137,0.686,0.824,0 -16138,0.686,0.824,0 -16139,0.777,0.648,36.45 -16140,0.777,0.648,21.65 -16141,0.777,0.648,37.46 -16142,0.777,0.648,35.5 -16143,0.777,0.648,23.68 -16144,0.777,0.648,3.68 -16145,0.777,0.648,37.26 -16146,0.777,0.648,19.5 -16147,0.56,0.68,35.83 -16148,0.56,0.68,34.39 -16149,0.56,0.68,28.15 -16150,0.56,0.68,21.5 -16151,0.56,0.68,24.56 -16152,0.56,0.68,11.87 -16153,0.56,0.68,23.7 -16154,0.56,0.68,21.86 -16155,0.665,0.676,0 -16156,0.665,0.676,27.7 -16157,0.665,0.676,20.94 -16158,0.665,0.676,22.2 -16159,0.665,0.676,36.09 -16160,0.665,0.676,43.89 -16161,0.665,0.676,29.29 -16162,0.665,0.676,31.5 -16163,0.665,0.676,35.33 -16164,0.665,0.676,33.25 -16165,0.665,0.676,18.33 -16166,0.665,0.676,8.03 -16167,0.665,0.676,4.21 -16168,0.665,0.676,6.53 -16169,0.665,0.676,2.3 -16170,0.665,0.676,1.83 -16171,0.56,0.68,27.97 -16172,0.56,0.68,31.49 -16173,0.56,0.68,27.41 -16174,0.56,0.68,33.66 -16175,0.56,0.68,5.79 -16176,0.56,0.68,7.37 -16177,0.56,0.68,0.03 -16178,0.56,0.68,9.91 -16179,0.777,0.648,36.4 -16180,0.777,0.648,35.17 -16181,0.777,0.648,36.36 -16182,0.777,0.648,32.62 -16183,0.777,0.648,17.92 -16184,0.777,0.648,32.34 -16185,0.777,0.648,13.43 -16186,0.777,0.648,1.29 -16187,0.685,0.707,38.38 -16188,0.685,0.707,13.84 -16189,0.685,0.707,30.67 -16190,0.685,0.707,2.89 -16191,0.685,0.707,20.42 -16192,0.685,0.707,33.72 -16193,0.685,0.707,0 -16194,0.685,0.707,16.75 -16195,0.609,0.694,27.59 -16196,0.609,0.694,24.77 -16197,0.609,0.694,26.11 -16198,0.609,0.694,30.76 -16199,0.609,0.694,12.24 -16200,0.609,0.694,11.16 -16201,0.609,0.694,13 -16202,0.609,0.694,24.65 -16203,0.629,0.779,19.95 -16204,0.629,0.779,0 -16205,0.629,0.779,20.84 -16206,0.629,0.779,0 -16207,0.629,0.779,0 -16208,0.629,0.779,0.27 -16209,0.629,0.779,0 -16210,0.629,0.779,0 -16211,0.629,0.779,0 -16212,0.629,0.779,0 -16213,0.629,0.779,3.81 -16214,0.629,0.779,0.26 -16215,0.629,0.779,18.77 -16216,0.629,0.779,0 -16217,0.629,0.779,31.15 -16218,0.629,0.779,0 -16219,0.609,0.694,20.67 -16220,0.609,0.694,20.92 -16221,0.609,0.694,29.23 -16222,0.609,0.694,11.48 -16223,0.609,0.694,23.33 -16224,0.609,0.694,36.66 -16225,0.609,0.694,11.1 -16226,0.609,0.694,17.94 -16227,0.685,0.707,0 -16228,0.685,0.707,0 -16229,0.685,0.707,0 -16230,0.685,0.707,0 -16231,0.685,0.707,11.38 -16232,0.685,0.707,0 -16233,0.685,0.707,0 -16234,0.685,0.707,0 -16235,0.663,0.697,0 -16236,0.663,0.697,0 -16237,0.663,0.697,7.67 -16238,0.663,0.697,9.3 -16239,0.663,0.697,0 -16240,0.663,0.697,2.01 -16241,0.663,0.697,28.11 -16242,0.663,0.697,11.27 -16243,0.503,0.718,0 -16244,0.503,0.718,1.46 -16245,0.503,0.718,0 -16246,0.503,0.718,5.19 -16247,0.503,0.718,31.5 -16248,0.503,0.718,3.99 -16249,0.503,0.718,25.97 -16250,0.503,0.718,2.27 -16251,0.564,0.784,21.42 -16252,0.564,0.784,0 -16253,0.564,0.784,17.07 -16254,0.564,0.784,1.31 -16255,0.564,0.784,0 -16256,0.564,0.784,1.13 -16257,0.564,0.784,9.03 -16258,0.564,0.784,8.64 -16259,0.564,0.784,23.3 -16260,0.564,0.784,5.18 -16261,0.564,0.784,26.18 -16262,0.564,0.784,21.69 -16263,0.564,0.784,15.26 -16264,0.564,0.784,25.27 -16265,0.564,0.784,32.06 -16266,0.564,0.784,29.17 -16267,0.503,0.718,27.03 -16268,0.503,0.718,3.28 -16269,0.503,0.718,35.01 -16270,0.503,0.718,32.21 -16271,0.503,0.718,0 -16272,0.503,0.718,16.75 -16273,0.503,0.718,0.9 -16274,0.503,0.718,11.41 -16275,0.663,0.697,25.45 -16276,0.663,0.697,15.53 -16277,0.663,0.697,0.03 -16278,0.663,0.697,2.3 -16279,0.663,0.697,3.55 -16280,0.663,0.697,1.71 -16281,0.663,0.697,1.64 -16282,0.663,0.697,0 -16283,0.437,0.81,6.85 -16284,0.437,0.81,25.6 -16285,0.437,0.81,4.43 -16286,0.437,0.81,3.47 -16287,0.537,0.822,29.72 -16288,0.537,0.822,5.6 -16289,0.537,0.822,34.52 -16290,0.537,0.822,22.94 -16291,0.734,0.736,1.97 -16292,0.734,0.736,2.02 -16293,0.734,0.736,7.31 -16294,0.734,0.736,0 -16295,0.809,0.707,29.22 -16296,0.809,0.707,20.22 -16297,0.809,0.707,1.11 -16298,0.809,0.707,0.56 -16299,0.584,0.743,37.13 -16300,0.584,0.743,36.04 -16301,0.584,0.743,15.6 -16302,0.584,0.743,18.41 -16303,0.584,0.743,26.54 -16304,0.584,0.743,33.06 -16305,0.584,0.743,18.95 -16306,0.584,0.743,15.23 -16307,0.584,0.743,5.58 -16308,0.584,0.743,6.88 -16309,0.584,0.743,20.03 -16310,0.584,0.743,27.41 -16311,0.584,0.743,17.71 -16312,0.584,0.743,2.53 -16313,0.584,0.743,37.53 -16314,0.584,0.743,27.14 -16315,0.517,0.836,9.94 -16316,0.517,0.836,20.95 -16317,0.517,0.836,39 -16318,0.517,0.836,33.38 -16319,0.577,0.867,19.7 -16320,0.577,0.867,14.81 -16321,0.577,0.867,31.93 -16322,0.577,0.867,25.35 -16323,0.564,0.848,31.69 -16324,0.564,0.848,22.06 -16325,0.564,0.848,30.36 -16326,0.564,0.848,29.78 -16327,0.466,0.842,8.97 -16328,0.466,0.842,24.38 -16329,0.466,0.842,13.59 -16330,0.466,0.842,30.42 -16331,0.646,0.865,1.98 -16332,0.646,0.865,4.07 -16333,0.646,0.865,3.64 -16334,0.646,0.865,3.9 -16335,0.646,0.865,23.31 -16336,0.646,0.865,22.4 -16337,0.646,0.865,2.11 -16338,0.646,0.865,5.47 -16339,0.484,0.829,22.77 -16340,0.484,0.829,21.21 -16341,0.484,0.829,15.5 -16342,0.484,0.829,23.84 -16343,0.632,0.863,37.97 -16344,0.632,0.863,37.62 -16345,0.632,0.863,24.94 -16346,0.632,0.863,24.88 -16347,0.618,0.849,18.7 -16348,0.618,0.849,25.03 -16349,0.618,0.849,4.53 -16350,0.618,0.849,33.85 -16351,0.618,0.849,21.15 -16352,0.618,0.849,38.72 -16353,0.618,0.849,33.39 -16354,0.618,0.849,34.44 -16355,0.618,0.849,31.33 -16356,0.618,0.849,30.41 -16357,0.618,0.849,35.41 -16358,0.618,0.849,36.4 -16359,0.618,0.849,3 -16360,0.618,0.849,1.58 -16361,0.618,0.849,0 -16362,0.618,0.849,3.48 -16363,0.668,0.864,18.65 -16364,0.668,0.864,11.88 -16365,0.668,0.864,2.96 -16366,0.668,0.864,0.15 -16367,0.597,0.84,4.29 -16368,0.597,0.84,6.3 -16369,0.597,0.84,8.98 -16370,0.597,0.84,5.09 -16371,0.646,0.865,5.12 -16372,0.646,0.865,0.98 -16373,0.646,0.865,1.41 -16374,0.646,0.865,5.41 -16375,0.646,0.865,0 -16376,0.646,0.865,3.47 -16377,0.646,0.865,0 -16378,0.646,0.865,0 -16379,0.695,0.92,0 -16380,0.695,0.92,0 -16381,0.695,0.92,0 -16382,0.695,0.92,0 -16383,0.695,0.92,0 -16384,0.695,0.92,0.38 -16385,0.695,0.92,3.56 -16386,0.695,0.92,0 -16387,0.622,0.849,3.86 -16388,0.622,0.849,7.76 -16389,0.622,0.849,0 -16390,0.622,0.849,36.01 -16391,0.622,0.849,3.63 -16392,0.622,0.849,3.93 -16393,0.622,0.849,21.74 -16394,0.622,0.849,1.21 -16395,0.674,0.876,1.07 -16396,0.674,0.876,0 -16397,0.674,0.876,0.71 -16398,0.674,0.876,0.19 -16399,0.656,0.841,11.82 -16400,0.656,0.841,0 -16401,0.656,0.841,4.22 -16402,0.656,0.841,1.38 -16403,0.529,0.855,0.4 -16404,0.529,0.855,0.77 -16405,0.529,0.855,16 -16406,0.529,0.855,4.57 -16407,0.511,0.858,26.64 -16408,0.511,0.858,0.17 -16409,0.511,0.858,0.01 -16410,0.511,0.858,28.46 -16411,0.622,0.849,41.99 -16412,0.622,0.849,16.27 -16413,0.622,0.849,21.98 -16414,0.622,0.849,25.19 -16415,0.622,0.849,0 -16416,0.622,0.849,22.45 -16417,0.622,0.849,0 -16418,0.622,0.849,11.7 -16419,0.695,0.92,0 -16420,0.695,0.92,0 -16421,0.695,0.92,0 -16422,0.695,0.92,1.72 -16423,0.695,0.92,0 -16424,0.695,0.92,0 -16425,0.695,0.92,0 -16426,0.695,0.92,0 -16427,0.614,0.908,0 -16428,0.614,0.908,0 -16429,0.594,0.928,0 -16430,0.614,0.908,0 -16431,0.613,0.908,0 -16432,0.363,0.869,2.02 -16433,0.541,0.94,14.54 -16434,0.482,0.917,2.42 -16435,0.578,0.953,2.4 -16436,0.335,0.964,3.21 -16437,0.588,0.909,0.33 -16438,0.328,0.861,2.91 -16439,0.368,0.87,1.82 -16440,0.477,0.911,0.22 -16441,0.577,0.91,0 -16442,0.569,0.911,0.6 -16443,0.477,0.911,0 -16444,0.477,0.911,0 -16445,0.6,0.91,0.47 -16446,0.586,0.894,0 -16447,0.514,0.961,2.7 -16448,0.608,0.899,0 -16449,0.518,0.864,0 -16450,0.495,0.839,0 -16451,0.495,0.839,0 -16452,0.515,0.863,0 -16453,0.471,0.875,0 -16454,0.465,0.877,0 -16455,0.465,0.877,0 -16456,0.465,0.877,0 -16457,0.465,0.877,0 -16458,0.465,0.877,0 -16459,0.465,0.877,0 -16460,0.465,0.877,0 -16461,0.465,0.877,0 -16462,0.465,0.877,0 -16463,0.465,0.877,0 -16464,0.465,0.877,0 -16465,0.465,0.877,0 -16466,0.465,0.877,0 -16467,0.465,0.877,0 -16468,0.465,0.877,0 -16469,0.465,0.877,0 -16470,0.465,0.877,0.09 -16471,0.465,0.877,0 -16472,0.465,0.877,0 -16473,0.465,0.877,0 -16474,0.465,0.877,0 -16475,0.465,0.877,0 -16476,0.465,0.877,0 -16477,0.465,0.877,0 -16478,0.465,0.877,0 -16479,0.465,0.877,0 -16480,0.465,0.877,0 -16481,0.465,0.877,0 -16482,0.465,0.877,0.64 -16483,0.465,0.877,0 -16484,0.465,0.877,0 -16485,0.465,0.877,0 -16486,0.465,0.877,0 -16487,0.465,0.877,0.29 -16488,0.465,0.877,0 -16489,0.465,0.877,0 -16490,0.465,0.877,1.65 -16491,0.465,0.877,0 -16492,0.465,0.877,0.51 -16493,0.465,0.877,0 -16494,0.465,0.877,0 -16495,0.465,0.877,0 -16496,0.465,0.877,0.35 -16497,0.465,0.877,1.7 -16498,0.465,0.877,0 -16499,0.465,0.877,0 -16500,0.465,0.877,0 -16501,0.465,0.877,0 -16502,0.465,0.877,0 -16503,0.465,0.877,0 -16504,0.465,0.877,0 -16505,0.465,0.877,0 -16506,0.465,0.877,0 -16507,0.465,0.877,0.51 -16508,0.465,0.877,0 -16509,0.465,0.877,0 -16510,0.465,0.877,0 -16511,0.465,0.877,0 -16512,0.465,0.877,0 -16513,0.465,0.877,0 -16514,0.465,0.877,0 -16515,0.465,0.877,0 -16516,0.465,0.877,0 -16517,0.465,0.877,0 -16518,0.465,0.877,0.52 -16519,0.465,0.877,0 -16520,0.465,0.877,0 -16521,0.465,0.877,0 -16522,0.465,0.877,0 -16523,0.465,0.877,0 -16524,0.465,0.877,0 -16525,0.465,0.877,0 -16526,0.465,0.877,1.06 -16527,0.465,0.877,0 -16528,0.465,0.877,0 -16529,0.465,0.877,0 -16530,0.465,0.877,1.28 -16531,0.465,0.877,0 -16532,0.465,0.877,0 -16533,0.465,0.877,0 -16534,0.465,0.877,0 -16535,0.465,0.877,0 -16536,0.465,0.877,0 -16537,0.465,0.877,0 -16538,0.465,0.877,0 -16539,0.465,0.877,0 -16540,0.465,0.877,0.95 -16541,0.465,0.877,0 -16542,0.465,0.877,0 -16543,0.465,0.877,0 -16544,0.465,0.877,1.32 -16545,0.465,0.877,2.23 -16546,0.465,0.877,0 -16547,0.465,0.877,0 -16548,0.465,0.877,0 -16549,0.465,0.877,0 -16550,0.465,0.877,10.55 -16551,0.465,0.877,12.72 -16552,0.465,0.877,0.71 -16553,0.465,0.877,21.67 -16554,0.465,0.877,6.46 -16555,0.465,0.877,4.9 -16556,0.465,0.877,17.87 -16557,0.465,0.877,15.85 -16558,0.465,0.877,4.08 -16559,0.465,0.877,1.92 -16560,0.465,0.877,8.89 -16561,0.465,0.877,4.1 -16562,0.465,0.877,0 -16563,0.465,0.877,0 -16564,0.465,0.877,3.12 -16565,0.465,0.877,0 -16566,0.465,0.877,0 -16567,0.465,0.877,0 -16568,0.465,0.877,0 -16569,0.465,0.877,0 -16570,0.465,0.877,0 -16571,0.465,0.877,0 -16572,0.465,0.877,0.3 -16573,0.465,0.877,0 -16574,0.465,0.877,0 -16575,0.465,0.877,0 -16576,0.465,0.877,0 -16577,0.465,0.877,0 -16578,0.465,0.877,0 -16579,0.465,0.877,0.21 -16580,0.465,0.877,21.63 -16581,0.465,0.877,4.75 -16582,0.465,0.877,0.25 -16583,0.465,0.877,0 -16584,0.465,0.877,0 -16585,0.465,0.877,11.25 -16586,0.465,0.877,1.07 -16587,0.465,0.877,0 -16588,0.465,0.877,0 -16589,0.465,0.877,1.48 -16590,0.465,0.877,16.14 -16591,0.465,0.877,4.75 -16592,0.465,0.877,2.7 -16593,0.465,0.877,0.38 -16594,0.465,0.877,0 -16595,0.465,0.877,22.4 -16596,0.465,0.877,0 -16597,0.465,0.877,7.41 -16598,0.515,0.863,0 -16599,0.48,0.831,0 -16600,0.412,0.787,0 -16601,0.412,0.787,0 -16602,0.412,0.787,0 -16603,0.412,0.787,0 -16604,0.488,0.883,0 -16605,0.609,0.889,0 -16606,0.541,0.846,0 -16607,0.459,0.904,0 -16608,0.412,0.833,17.4 -16609,0.476,0.907,10.02 -16610,0.646,0.858,4.07 -16611,0.396,0.839,0.83 -16612,0.354,0.784,0 -16613,0.536,0.916,0 -16614,0.416,0.841,0 -16615,0.543,0.917,4.93 -16616,0.469,0.893,15.14 -16617,0.628,0.907,0.04 -16618,0.5,0.918,1.84 -16619,0.498,0.888,3.68 -16620,0.582,0.881,0.05 -16621,0.459,0.904,0 -16622,0.464,0.88,0 -16623,0.546,0.868,0 -16624,0.56,0.85,11.37 -16625,0.43,0.855,1.52 -16626,0.514,0.866,0 -16627,0.366,0.835,1.02 -16628,0.367,0.836,0 -16629,0.591,0.84,3.52 -16630,0.366,0.835,0.17 -16631,0.366,0.835,0 -16632,0.625,0.921,0 -16633,0.625,0.921,0 -16634,0.624,0.921,0 -16635,0.625,0.921,0 -16636,0.48,0.909,0.65 -16637,0.429,0.905,1.9 -16638,0.43,0.903,0 -16639,0.429,0.904,0 -16640,0.44,0.906,0 -16641,0.485,0.919,0 -16642,0.485,0.919,0 -16643,0.487,0.953,0 -16644,0.551,0.927,0 -16645,0.504,0.921,0 -16646,0.608,0.87,0 -16647,0.583,0.903,0 -16648,0.587,0.903,0 -16649,0.606,0.871,0 -16650,0.56,0.941,0 -16651,0.559,0.812,1.87 -16652,0.55,0.956,3.44 -16653,0.633,0.946,0 -16654,0.635,0.947,0 -16655,0.808,0.903,0 -16656,0.814,0.904,0 -16657,0.814,0.904,0 -16658,0.783,0.911,0 -16659,0.514,0.937,0 -16660,0.517,0.935,3.47 -16661,0.514,0.937,0 -16662,0.531,0.81,1.1 -16663,0.514,0.937,0 -16664,0.572,0.877,0.33 -16665,0.572,0.877,10.28 -16666,0.572,0.877,0.66 -16667,0.572,0.877,14.19 -16668,0.572,0.877,0 -16669,0.572,0.877,2.61 -16670,0.572,0.877,21.54 -16671,0.572,0.877,3.47 -16672,0.572,0.877,0.34 -16673,0.572,0.877,3.83 -16674,0.572,0.877,1.73 -16675,0.572,0.877,8.75 -16676,0.572,0.877,0 -16677,0.572,0.877,0 -16678,0.572,0.877,1.75 -16679,0.572,0.877,5.83 -16680,0.572,0.877,0 -16681,0.572,0.877,0 -16682,0.572,0.877,0.48 -16683,0.572,0.877,0 -16684,0.572,0.877,0 -16685,0.572,0.877,0 -16686,0.572,0.877,0 -16687,0.572,0.877,0 -16688,0.572,0.877,1.3 -16689,0.572,0.877,1.07 -16690,0.572,0.877,0 -16691,0.572,0.877,0.28 -16692,0.572,0.877,2.79 -16693,0.572,0.877,0 -16694,0.572,0.877,0 -16695,0.572,0.877,0 -16696,0.572,0.877,0.77 -16697,0.572,0.877,4.36 -16698,0.572,0.877,0 -16699,0.572,0.877,0.05 -16700,0.572,0.877,3.18 -16701,0.572,0.877,9.9 -16702,0.572,0.877,0 -16703,0.572,0.877,0 -16704,0.572,0.877,13.7 -16705,0.572,0.877,8.59 -16706,0.572,0.877,7.11 -16707,0.572,0.877,0 -16708,0.572,0.877,0 -16709,0.572,0.877,0 -16710,0.572,0.877,0 -16711,0.572,0.877,14.7 -16712,0.572,0.877,2.87 -16713,0.572,0.877,11.49 -16714,0.572,0.877,0.97 -16715,0.572,0.877,0.5 -16716,0.572,0.877,10.02 -16717,0.572,0.877,5.84 -16718,0.572,0.877,11.36 -16719,0.572,0.877,0 -16720,0.572,0.877,0 -16721,0.572,0.877,0 -16722,0.572,0.877,0 -16723,0.572,0.877,0 -16724,0.572,0.877,0 -16725,0.572,0.877,0 -16726,0.572,0.877,0 -16727,0.572,0.877,3.55 -16728,0.572,0.877,0 -16729,0.572,0.877,0 -16730,0.572,0.877,4.3 -16731,0.572,0.877,0 -16732,0.572,0.877,2.17 -16733,0.572,0.877,0 -16734,0.572,0.877,0 -16735,0.572,0.877,0.95 -16736,0.572,0.877,0 -16737,0.572,0.877,0 -16738,0.572,0.877,0 -16739,0.572,0.877,0 -16740,0.572,0.877,15.51 -16741,0.572,0.877,1.87 -16742,0.572,0.877,2.25 -16743,0.572,0.877,2.28 -16744,0.572,0.877,6.18 -16745,0.572,0.877,14.49 -16746,0.572,0.877,3.16 -16747,0.572,0.877,2.2 -16748,0.572,0.877,0 -16749,0.572,0.877,22.35 -16750,0.572,0.877,2.09 -16751,0.572,0.877,0.03 -16752,0.572,0.877,9.83 -16753,0.572,0.877,0 -16754,0.572,0.877,0 -16755,0.572,0.877,0 -16756,0.572,0.877,2.92 -16757,0.572,0.877,0.26 -16758,0.572,0.877,0.13 -16759,0.572,0.877,0 -16760,0.572,0.877,0 -16761,0.572,0.877,1.02 -16762,0.572,0.877,0.7 -16763,0.572,0.877,0 -16764,0.572,0.877,0 -16765,0.572,0.877,1.04 -16766,0.572,0.877,0 -16767,0.572,0.877,0 -16768,0.572,0.877,0 -16769,0.572,0.877,0 -16770,0.572,0.877,0 -16771,0.572,0.877,0 -16772,0.572,0.877,1.77 -16773,0.572,0.877,2.42 -16774,0.572,0.877,0.89 -16775,0.572,0.877,0 -16776,0.572,0.877,1.64 -16777,0.572,0.877,0 -16778,0.572,0.877,0.56 -16779,0.572,0.877,2.69 -16780,0.572,0.877,0 -16781,0.572,0.877,0.26 -16782,0.572,0.877,0 -16783,0.572,0.877,0 -16784,0.572,0.877,1.02 -16785,0.572,0.877,2.32 -16786,0.572,0.877,0 -16787,0.572,0.877,0 -16788,0.572,0.877,0 -16789,0.572,0.877,0 -16790,0.572,0.877,0 -16791,0.572,0.877,0 -16792,0.572,0.877,0.05 -16793,0.572,0.877,0 -16794,0.572,0.877,0 -16795,0.572,0.877,0 -16796,0.572,0.877,0 -16797,0.572,0.877,0 -16798,0.572,0.877,0 -16799,0.572,0.877,0 -16800,0.572,0.877,7.58 -16801,0.572,0.877,0.62 -16802,0.572,0.877,2.24 -16803,0.572,0.877,0 -16804,0.572,0.877,0 -16805,0.572,0.877,6.55 -16806,0.572,0.877,0 -16807,0.572,0.877,0 -16808,0.611,0.914,0 -16809,0.636,0.908,0 -16810,0.676,0.905,0 -16811,0.611,0.914,0 -16812,0.611,0.914,0 -16813,0.648,0.882,0 -16814,0.611,0.914,0 -16815,0.285,0.801,0 -16816,0.585,0.811,0 -16817,0.478,0.89,0 -16818,0.65,0.907,0 -16819,0.599,0.91,3.36 -16820,0.604,0.892,10.03 -16821,0.607,0.913,0 -16822,0.517,0.827,0 -16823,0.676,0.905,0 -16824,0.523,0.893,0.43 -16825,0.527,0.876,1.02 -16826,0.53,0.858,0 -16827,0.552,0.944,0 -16828,0.705,0.924,0 -16829,0.611,0.914,0 -16830,0.648,0.882,0 -16831,0.649,0.882,0 -16832,0.432,0.927,0.13 -16833,0.491,0.921,0 -16834,0.705,0.924,0 -16835,0.547,0.933,1.41 -16836,0.526,0.906,6.39 -16837,0.478,0.809,9.94 -16838,0.524,0.917,0 -16839,0.409,0.89,0.33 -16840,0.493,0.877,3.62 -16841,0.609,0.885,5.18 -16842,0.56,0.921,12.35 -16843,0.58,0.914,0 -16844,0.29,0.926,0 -16845,0.502,0.949,0 -16846,0.448,0.942,0 -16847,0.563,0.923,0 -16848,0.502,0.949,0 -16849,0.635,0.942,0 -16850,0.634,0.942,0 -16851,0.618,0.94,0 -16852,0.608,0.942,0 -16853,0.448,0.918,0 -16854,0.491,0.887,0 -16855,0.505,0.869,0.36 -16856,0.511,0.845,0 -16857,0.48,0.894,0 -16858,0.283,0.912,0 -16859,0.579,0.934,0 -16860,0.418,0.883,0 -16861,0.422,0.886,0 -16862,0.553,0.965,3.91 -16863,0.418,0.883,0 -16864,0.439,0.971,0.7 -16865,0.419,0.884,0 -16866,0.418,0.883,0 -16867,0.418,0.883,0 -16868,0.417,0.912,11.87 -16869,0.439,0.972,0 -16870,0.418,0.883,0 -16871,0.664,0.951,0 -16872,0.68,0.923,0 -16873,0.529,0.902,0 -16874,0.485,0.939,0 -16875,0.495,0.933,0 -16876,0.661,0.929,0 -16877,0.68,0.923,0 -16878,0.532,0.926,5.23 -16879,0.323,0.94,3.37 -16880,0.403,0.922,7.28 -16881,0.606,0.922,0 -16882,0.406,0.955,7.69 -16883,0.458,0.94,1.42 -16884,0.436,0.929,0.07 -16885,0.606,0.878,0 -16886,0.597,0.885,0.81 -16887,0.548,0.934,0 -16888,0.326,0.932,6.1 -16889,0.494,0.929,9.98 -16890,0.486,0.948,0 -16891,0.486,0.948,0 -16892,0.548,0.94,0 -16893,0.465,0.937,1.23 -16894,0.572,0.926,0 -16895,0.548,0.938,3.02 -16896,0.486,0.948,0 -16897,0.6,0.94,0 -16898,0.495,0.948,0 -16899,0.409,0.953,0.83 -16900,0.539,0.933,0 -16901,0.66,0.925,0 -16902,0.314,0.938,0 -16903,0.324,0.938,1.67 -16904,0.558,0.932,1.35 -16905,0.607,0.921,0 -16906,0.583,0.925,0 -16907,0.572,0.926,0 -16908,0.572,0.926,0 -16909,0.572,0.926,0 -16910,0.536,0.931,0.17 -16911,0.573,0.929,0 -16912,0.537,0.933,0 -16913,0.569,0.948,0 -16914,0.588,0.923,0 -16915,0.519,0.921,0 -16916,0.586,0.921,0 -16917,0.591,0.923,0 -16918,0.598,0.927,0 -16919,0.598,0.928,0 -16920,0.598,0.928,0 -16921,0.519,0.921,0 -16922,0.54,0.973,0 -16923,0.538,0.946,0 -16924,0.54,0.973,3.35 -16925,0.519,0.921,0 -16926,0.519,0.921,0 -16927,0.513,0.912,0 -16928,0.502,0.91,0 -16929,0.57,0.918,0 -16930,0.557,0.914,0.01 -16931,0.571,0.918,0.6 -16932,0.556,0.929,0 -16933,0.556,0.929,0 -16934,0.529,0.908,0 -16935,0.529,0.908,0 -16936,0.52,0.888,0 -16937,0.519,0.888,0 -16938,0.458,0.908,0 -16939,0.476,0.888,0.49 -16940,0.464,0.912,0.21 -16941,0.663,0.903,2.94 -16942,0.469,0.895,0.08 -16943,0.466,0.914,7.27 -16944,0.642,0.904,0 -16945,0.663,0.903,1.53 -16946,0.457,0.908,0 -16947,0.48,0.936,0 -16948,0.71,0.934,0 -16949,0.552,0.945,0 -16950,0.576,0.941,0 -16951,0.578,0.941,0 -16952,0.58,0.942,0 -16953,0.58,0.942,0.5 -16954,0.584,0.947,0 -16955,0.62,0.863,0 -16956,0.486,0.887,0.58 -16957,0.484,0.888,0.29 -16958,0.487,0.888,0 -16959,0.674,0.873,0 -16960,0.621,0.863,0 -16961,0.621,0.863,0 -16962,0.621,0.863,0 -16963,0.621,0.863,0.24 -16964,0.487,0.888,0 -16965,0.335,0.911,0 -16966,0.335,0.911,0.39 -16967,0.335,0.911,0.3 -16968,0.335,0.91,0 -16969,0.338,0.91,0 -16970,0.335,0.911,0 -16971,0.335,0.911,0 -16972,0.616,0.941,0 -16973,0.545,0.96,10.14 -16974,0.598,0.861,1.59 -16975,0.492,0.952,0 -16976,0.492,0.952,0 -16977,0.492,0.952,0 -16978,0.645,0.94,3.19 -16979,0.518,0.907,0.51 -16980,0.493,0.952,0 -16981,0.668,0.871,0 -16982,0.691,0.944,4.3 -16983,0.668,0.871,0 -16984,0.668,0.871,0 -16985,0.673,0.893,2.7 -16986,0.7,0.961,5.2 -16987,0.616,0.936,0.05 -16988,0.709,0.949,4.91 -16989,0.668,0.871,0 -16990,0.535,0.878,0.37 -16991,0.569,0.961,0.34 -16992,0.567,0.856,17.34 -16993,0.599,0.93,11.57 -16994,0.441,0.904,6.76 -16995,0.654,0.927,5.73 -16996,0.611,0.844,13.84 -16997,0.643,0.893,14.92 -16998,0.603,0.866,9.32 -16999,0.6,0.892,10.96 -17000,0.403,0.928,10.98 -17001,0.505,0.9,12.76 -17002,0.42,0.906,5.09 -17003,0.453,0.911,5.33 -17004,0.511,0.911,11.7 -17005,0.411,0.921,15.6 -17006,0.37,0.885,6.12 -17007,0.463,0.84,10.48 -17008,0.757,0.95,0 -17009,0.757,0.95,0 -17010,0.758,0.951,0 -17011,0.637,0.952,1.69 -17012,0.538,0.93,7.48 -17013,0.505,0.931,12.19 -17014,0.497,0.927,9.17 -17015,0.524,0.911,1.82 -17016,0.374,0.928,1.34 -17017,0.555,0.918,2.13 -17018,0.492,0.923,0 -17019,0.5,0.911,5.18 -17020,0.514,0.91,5.52 -17021,0.476,0.848,0 -17022,0.565,0.924,0.75 -17023,0.559,0.88,0.28 -17024,0.493,0.843,0 -17025,0.523,0.855,0.32 -17026,0.603,0.922,3.96 -17027,0.8,0.817,2.01 -17028,0.579,0.94,6.98 -17029,0.799,0.817,3.03 -17030,0.8,0.817,0.49 -17031,0.513,0.903,3.73 -17032,0.49,0.887,5.05 -17033,0.551,0.922,7.59 -17034,0.51,0.915,0 -17035,0.529,0.909,0 -17036,0.574,0.927,0 -17037,0.518,0.911,0 -17038,0.51,0.916,0 -17039,0.459,0.908,0 -17040,0.548,0.908,0.1 -17041,0.51,0.916,0 -17042,0.578,0.934,1.57 -17043,0.578,0.934,0.39 -17044,0.547,0.908,2.32 -17045,0.576,0.934,0 -17046,0.382,0.907,6.54 -17047,0.578,0.934,0 -17048,0.578,0.934,1.05 -17049,0.382,0.907,3.34 -17050,0.532,0.908,1.34 -17051,0.533,0.908,0 -17052,0.532,0.908,2.96 -17053,0.488,0.906,8.11 -17054,0.495,0.906,2.59 -17055,0.533,0.908,0 -17056,0.496,0.923,1.75 -17057,0.527,0.914,12.93 -17058,0.454,0.874,0 -17059,0.553,0.949,15.03 -17060,0.489,0.893,0 -17061,0.456,0.88,0 -17062,0.485,0.891,0 -17063,0.481,0.904,4.6 -17064,0.619,0.874,9.74 -17065,0.376,0.942,0 -17066,0.491,0.909,0 -17067,0.498,0.872,3.73 -17068,0.581,0.918,1.24 -17069,0.74,0.935,2.56 -17070,0.498,0.872,4.58 -17071,0.448,0.918,3.42 -17072,0.376,0.942,0 -17073,0.45,0.9,4.49 -17074,0.556,0.939,2.26 -17075,0.589,0.916,5.13 -17076,0.556,0.939,0.89 -17077,0.589,0.915,1.25 -17078,0.556,0.939,0 -17079,0.556,0.939,0.18 -17080,0.449,0.88,5.63 -17081,0.395,0.939,2.51 -17082,0.422,0.942,0.4 -17083,0.579,0.964,13.27 -17084,0.356,0.948,9.23 -17085,0.57,0.944,17.6 -17086,0.574,0.891,12.34 -17087,0.459,0.862,14.75 -17088,0.613,0.865,7.88 -17089,0.695,0.862,5.5 -17090,0.523,0.884,3.47 -17091,0.495,0.896,7.73 -17092,0.573,0.898,11.62 -17093,0.422,0.88,0 -17094,0.649,0.882,11.05 -17095,0.496,0.858,8.74 -17096,0.454,0.88,13.77 -17097,0.507,0.896,0 -17098,0.457,0.937,12.86 -17099,0.462,0.923,7.69 -17100,0.478,0.942,6.12 -17101,0.599,0.902,8.53 -17102,0.424,0.92,12 -17103,0.301,0.959,13.33 -17104,0.424,0.946,3.72 -17105,0.531,0.885,8.76 -17106,0.574,0.929,22.84 -17107,0.67,0.868,26.54 -17108,0.379,0.833,17.17 -17109,0.509,0.943,9 -17110,0.787,0.875,8.05 -17111,0.453,0.915,16.66 -17112,0.579,0.901,5.98 -17113,0.596,0.903,0 -17114,0.54,0.929,9.67 -17115,0.574,0.942,16.03 -17116,0.544,0.829,0 -17117,0.432,0.914,16.69 -17118,0.517,0.883,17.52 -17119,0.652,0.954,15.15 -17120,0.511,0.914,17.63 -17121,0.607,0.898,26.68 -17122,0.558,0.899,8.29 -17123,0.617,0.91,9.43 -17124,0.827,0.857,5.09 -17125,0.592,0.975,1.41 -17126,0.595,0.919,10.53 -17127,0.623,0.897,0.01 -17128,0.736,0.874,8.33 -17129,0.572,0.889,8.38 -17130,0.59,0.895,0 -17131,0.504,0.948,0 -17132,0.504,0.948,0 -17133,0.525,0.929,0 -17134,0.504,0.948,0 -17135,0.563,0.93,0 -17136,0.53,0.944,0 -17137,0.554,0.883,0 -17138,0.567,0.854,0 -17139,0.563,0.93,0 -17140,0.623,0.914,0 -17141,0.563,0.93,0 -17142,0.536,0.939,0 -17143,0.536,0.939,0 -17144,0.53,0.944,0 -17145,0.543,0.943,0 -17146,0.421,0.896,0 -17147,0.502,0.922,4.66 -17148,0.551,0.941,0 -17149,0.566,0.943,0 -17150,0.521,0.95,1.19 -17151,0.644,0.947,0.46 -17152,0.536,0.939,0 -17153,0.648,0.941,0.06 -17154,0.567,0.937,0 -17155,0.518,0.953,0.79 -17156,0.521,0.95,0 -17157,0.605,0.923,0.18 -17158,0.579,0.843,10.02 -17159,0.442,0.901,2.38 -17160,0.61,0.955,1.73 -17161,0.522,0.915,0.82 -17162,0.543,0.966,0 -17163,0.543,0.966,0.18 -17164,0.486,0.911,0.27 -17165,0.57,0.918,0.22 -17166,0.798,0.953,0.37 -17167,0.41,0.965,4.59 -17168,0.747,0.952,0.69 -17169,0.385,0.923,2.49 -17170,0.442,0.947,0 -17171,0.787,0.954,1.74 -17172,0.422,0.84,4.95 -17173,0.474,0.949,0.78 -17174,0.797,0.953,0 -17175,0.432,0.912,0 -17176,0.512,0.952,1.03 -17177,0.457,0.921,0 -17178,0.491,0.948,0 -17179,0.543,0.966,0.01 -17180,0.382,0.917,0.78 -17181,0.501,0.953,0 -17182,0.489,0.917,10.64 -17183,0.617,0.818,5.61 -17184,0.629,0.924,2.5 -17185,0.587,0.743,5.68 -17186,0.538,0.887,13.32 -17187,0.547,0.965,0 -17188,0.547,0.965,0 -17189,0.547,0.965,0.97 -17190,0.547,0.965,0 -17191,0.547,0.965,0 -17192,0.411,0.91,0 -17193,0.366,0.896,2.06 -17194,0.366,0.896,0 -17195,0.453,0.936,0.19 -17196,0.454,0.936,0.56 -17197,0.453,0.936,0 -17198,0.453,0.936,0 -17199,0.482,0.953,0 -17200,0.471,0.946,0 -17201,0.463,0.94,0 -17202,0.41,0.927,0.05 -17203,0.419,0.928,0 -17204,0.72,0.889,3.14 -17205,0.646,0.902,2.76 -17206,0.485,0.8,8.76 -17207,0.646,0.902,0.66 -17208,0.646,0.902,0 -17209,0.646,0.902,1.95 -17210,0.469,0.9,7.04 -17211,0.415,0.882,14.48 -17212,0.646,0.902,0 -17213,0.646,0.902,0 -17214,0.47,0.891,7.34 -17215,0.577,0.905,1.76 -17216,0.678,0.875,3.16 -17217,0.567,0.897,0.44 -17218,0.537,0.883,2.03 -17219,0.588,0.891,5.41 -17220,0.583,0.889,4 -17221,0.481,0.833,17.8 -17222,0.539,0.83,7.54 -17223,0.574,0.905,0.39 -17224,0.542,0.885,0.55 -17225,0.685,0.787,4.69 -17226,0.571,0.842,0.37 -17227,0.638,0.846,0.93 -17228,0.472,0.927,0.6 -17229,0.557,0.943,1.26 -17230,0.645,0.817,2.84 -17231,0.608,0.902,1.4 -17232,0.628,0.904,7.22 -17233,0.656,0.835,8.15 -17234,0.602,0.942,8.57 -17235,0.632,0.858,2.31 -17236,0.31,0.932,6.85 -17237,0.613,0.96,5.23 -17238,0.577,0.951,11.67 -17239,0.315,0.887,3.51 -17240,0.585,0.931,5.63 -17241,0.47,0.94,14.17 -17242,0.314,0.887,5.82 -17243,0.438,0.934,9.95 -17244,0.707,0.774,3.17 -17245,0.59,0.773,0 -17246,0.708,0.774,2.9 -17247,0.588,0.774,2.76 -17248,0.677,0.901,2.53 -17249,0.791,0.921,4.4 -17250,0.704,0.829,4.97 -17251,0.673,0.903,6.35 -17252,0.69,0.848,11.22 -17253,0.693,0.851,5.74 -17254,0.415,0.875,0.77 -17255,0.507,0.892,0 -17256,0.411,0.854,0 -17257,0.483,0.907,0.22 -17258,0.518,0.913,0.89 -17259,0.59,0.898,1.51 -17260,0.492,0.947,3.14 -17261,0.621,0.89,0 -17262,0.513,0.888,0.92 -17263,0.481,0.862,2.15 -17264,0.661,0.903,0.86 -17265,0.488,0.864,1.16 -17266,0.656,0.903,1.96 -17267,0.755,0.87,0 -17268,0.756,0.87,0.28 -17269,0.755,0.87,0 -17270,0.755,0.871,1.98 -17271,0.595,0.903,7.77 -17272,0.454,0.893,11.93 -17273,0.614,0.887,1.66 -17274,0.631,0.924,0 -17275,0.614,0.887,1.35 -17276,0.494,0.909,19.38 -17277,0.516,0.921,5.98 -17278,0.564,0.91,12.42 -17279,0.624,0.906,0 -17280,0.675,0.946,7.17 -17281,0.523,0.926,0 -17282,0.576,0.892,17.22 -17283,0.449,0.922,0 -17284,0.449,0.922,0 -17285,0.488,0.88,0.21 -17286,0.489,0.878,0 -17287,0.501,0.87,0 -17288,0.501,0.882,0 -17289,0.516,0.91,6.2 -17290,0.555,0.895,9.6 -17291,0.503,0.915,17.4 -17292,0.498,0.872,3.63 -17293,0.501,0.871,5.32 -17294,0.501,0.87,0 -17295,0.501,0.87,0.41 -17296,0.649,0.875,2.46 -17297,0.423,0.879,12.82 -17298,0.512,0.856,22.56 -17299,0.703,0.869,0 -17300,0.703,0.869,2.76 -17301,0.655,0.88,0.38 -17302,0.704,0.869,0 -17303,0.6,0.86,0 -17304,0.491,0.895,0 -17305,0.6,0.86,0 -17306,0.481,0.925,7.7 -17307,0.704,0.869,0 -17308,0.6,0.86,2.11 -17309,0.6,0.86,0 -17310,0.515,0.901,1.76 -17311,0.523,0.943,3.9 -17312,0.644,0.872,0.19 -17313,0.55,0.876,0 -17314,0.55,0.876,0 -17315,0.55,0.876,0 -17316,0.727,0.9,0 -17317,0.728,0.9,0 -17318,0.725,0.897,1.18 -17319,0.727,0.9,0 -17320,0.684,0.837,0 -17321,0.471,0.921,6.9 -17322,0.684,0.837,0 -17323,0.673,0.895,4.99 -17324,0.641,0.855,2.74 -17325,0.684,0.838,0 -17326,0.66,0.895,2.3 -17327,0.528,0.865,7.95 -17328,0.547,0.876,4.87 -17329,0.547,0.831,18.21 -17330,0.52,0.894,16.14 -17331,0.562,0.92,11.09 -17332,0.574,0.86,7.65 -17333,0.698,0.825,15.14 -17334,0.592,0.905,3.28 -17335,0.6,0.868,0 -17336,0.6,0.868,1.12 -17337,0.6,0.868,0 -17338,0.574,0.877,0 -17339,0.569,0.879,1.38 -17340,0.574,0.877,0 -17341,0.573,0.878,0 -17342,0.53,0.867,0.02 -17343,0.531,0.867,0 -17344,0.53,0.867,0 -17345,0.53,0.867,0 -17346,0.59,0.911,1.97 -17347,0.698,0.928,0.12 -17348,0.704,0.926,0 -17349,0.704,0.926,0.05 -17350,0.543,0.906,5.28 -17351,0.586,0.933,1.68 -17352,0.539,0.892,5.48 -17353,0.574,0.93,5.59 -17354,0.479,0.916,10.05 -17355,0.662,0.932,0 -17356,0.587,0.867,0 -17357,0.645,0.881,0 -17358,0.626,0.912,0 -17359,0.525,0.841,3.49 -17360,0.498,0.81,2.3 -17361,0.67,0.861,0 -17362,0.515,0.84,0.94 -17363,0.632,0.847,0 -17364,0.524,0.868,0.6 -17365,0.667,0.862,0 -17366,0.622,0.879,0 -17367,0.571,0.887,1.3 -17368,0.663,0.931,0.37 -17369,0.664,0.929,0 -17370,0.662,0.932,0 -17371,0.662,0.932,0 -17372,0.497,0.891,3.12 -17373,0.481,0.874,5.93 -17374,0.627,0.933,1.1 -17375,0.308,0.888,2.36 -17376,0.557,0.862,0.41 -17377,0.309,0.888,0.27 -17378,0.522,0.884,0 -17379,0.627,0.923,0 -17380,0.627,0.899,0 -17381,0.441,0.906,6.14 -17382,0.584,0.963,1.49 -17383,0.464,0.947,0.88 -17384,0.549,0.898,0.16 -17385,0.537,0.837,3.99 -17386,0.512,0.946,0 -17387,0.62,0.866,6.12 -17388,0.512,0.946,0 -17389,0.564,0.891,1.83 -17390,0.477,0.911,1.37 -17391,0.512,0.946,0.13 -17392,0.512,0.945,0 -17393,0.513,0.945,0.25 -17394,0.505,0.807,0 -17395,0.621,0.93,1.13 -17396,0.438,0.816,0 -17397,0.483,0.902,1.29 -17398,0.437,0.817,0 -17399,0.568,0.86,0 -17400,0.521,0.878,0 -17401,0.605,0.947,0.81 -17402,0.473,0.9,0 -17403,0.473,0.9,0 -17404,0.677,0.786,0 -17405,0.54,0.89,4.68 -17406,0.677,0.786,0 -17407,0.677,0.786,0 -17408,0.677,0.786,1.74 -17409,0.677,0.786,0 -17410,0.452,0.726,4.92 -17411,0.569,0.77,0 -17412,0.677,0.786,0 -17413,0.576,0.87,0 -17414,0.568,0.861,0 -17415,0.685,0.814,0.1 -17416,0.698,0.753,1.13 -17417,0.68,0.839,0 -17418,0.619,0.868,1.15 diff --git a/Database/tg/fortran/tg_hhtype_lookup.csv b/Database/tg/fortran/tg_hhtype_lookup.csv deleted file mode 100644 index 43e726c..0000000 --- a/Database/tg/fortran/tg_hhtype_lookup.csv +++ /dev/null @@ -1,625 +0,0 @@ -HHTYPE,ADULT,WORKER,CHILD,INCOME,AGE_INDEX -1,1,0,0.0,1.0,1.0 -2,2,0,0.0,1.0,1.0 -3,3,0,0.0,1.0,1.0 -4,4,0,0.0,1.0,1.0 -5,1,1,0.0,1.0,1.0 -6,2,1,0.0,1.0,1.0 -7,3,1,0.0,1.0,1.0 -8,4,1,0.0,1.0,1.0 -9,2,2,0.0,1.0,1.0 -10,3,2,0.0,1.0,1.0 -11,4,2,0.0,1.0,1.0 -12,3,3,0.0,1.0,1.0 -13,4,3,0.0,1.0,1.0 -14,1,0,1.0,1.0,1.0 -15,2,0,1.0,1.0,1.0 -16,3,0,1.0,1.0,1.0 -17,4,0,1.0,1.0,1.0 -18,1,1,1.0,1.0,1.0 -19,2,1,1.0,1.0,1.0 -20,3,1,1.0,1.0,1.0 -21,4,1,1.0,1.0,1.0 -22,2,2,1.0,1.0,1.0 -23,3,2,1.0,1.0,1.0 -24,4,2,1.0,1.0,1.0 -25,3,3,1.0,1.0,1.0 -26,4,3,1.0,1.0,1.0 -27,1,0,2.0,1.0,1.0 -28,2,0,2.0,1.0,1.0 -29,3,0,2.0,1.0,1.0 -30,4,0,2.0,1.0,1.0 -31,1,1,2.0,1.0,1.0 -32,2,1,2.0,1.0,1.0 -33,3,1,2.0,1.0,1.0 -34,4,1,2.0,1.0,1.0 -35,2,2,2.0,1.0,1.0 -36,3,2,2.0,1.0,1.0 -37,4,2,2.0,1.0,1.0 -38,3,3,2.0,1.0,1.0 -39,4,3,2.0,1.0,1.0 -40,1,0,3.0,1.0,1.0 -41,2,0,3.0,1.0,1.0 -42,3,0,3.0,1.0,1.0 -43,4,0,3.0,1.0,1.0 -44,1,1,3.0,1.0,1.0 -45,2,1,3.0,1.0,1.0 -46,3,1,3.0,1.0,1.0 -47,4,1,3.0,1.0,1.0 -48,2,2,3.0,1.0,1.0 -49,3,2,3.0,1.0,1.0 -50,4,2,3.0,1.0,1.0 -51,3,3,3.0,1.0,1.0 -52,4,3,3.0,1.0,1.0 -53,1,0,0.0,2.0,1.0 -54,2,0,0.0,2.0,1.0 -55,3,0,0.0,2.0,1.0 -56,4,0,0.0,2.0,1.0 -57,1,1,0.0,2.0,1.0 -58,2,1,0.0,2.0,1.0 -59,3,1,0.0,2.0,1.0 -60,4,1,0.0,2.0,1.0 -61,2,2,0.0,2.0,1.0 -62,3,2,0.0,2.0,1.0 -63,4,2,0.0,2.0,1.0 -64,3,3,0.0,2.0,1.0 -65,4,3,0.0,2.0,1.0 -66,1,0,1.0,2.0,1.0 -67,2,0,1.0,2.0,1.0 -68,3,0,1.0,2.0,1.0 -69,4,0,1.0,2.0,1.0 -70,1,1,1.0,2.0,1.0 -71,2,1,1.0,2.0,1.0 -72,3,1,1.0,2.0,1.0 -73,4,1,1.0,2.0,1.0 -74,2,2,1.0,2.0,1.0 -75,3,2,1.0,2.0,1.0 -76,4,2,1.0,2.0,1.0 -77,3,3,1.0,2.0,1.0 -78,4,3,1.0,2.0,1.0 -79,1,0,2.0,2.0,1.0 -80,2,0,2.0,2.0,1.0 -81,3,0,2.0,2.0,1.0 -82,4,0,2.0,2.0,1.0 -83,1,1,2.0,2.0,1.0 -84,2,1,2.0,2.0,1.0 -85,3,1,2.0,2.0,1.0 -86,4,1,2.0,2.0,1.0 -87,2,2,2.0,2.0,1.0 -88,3,2,2.0,2.0,1.0 -89,4,2,2.0,2.0,1.0 -90,3,3,2.0,2.0,1.0 -91,4,3,2.0,2.0,1.0 -92,1,0,3.0,2.0,1.0 -93,2,0,3.0,2.0,1.0 -94,3,0,3.0,2.0,1.0 -95,4,0,3.0,2.0,1.0 -96,1,1,3.0,2.0,1.0 -97,2,1,3.0,2.0,1.0 -98,3,1,3.0,2.0,1.0 -99,4,1,3.0,2.0,1.0 -100,2,2,3.0,2.0,1.0 -101,3,2,3.0,2.0,1.0 -102,4,2,3.0,2.0,1.0 -103,3,3,3.0,2.0,1.0 -104,4,3,3.0,2.0,1.0 -105,1,0,0.0,3.0,1.0 -106,2,0,0.0,3.0,1.0 -107,3,0,0.0,3.0,1.0 -108,4,0,0.0,3.0,1.0 -109,1,1,0.0,3.0,1.0 -110,2,1,0.0,3.0,1.0 -111,3,1,0.0,3.0,1.0 -112,4,1,0.0,3.0,1.0 -113,2,2,0.0,3.0,1.0 -114,3,2,0.0,3.0,1.0 -115,4,2,0.0,3.0,1.0 -116,3,3,0.0,3.0,1.0 -117,4,3,0.0,3.0,1.0 -118,1,0,1.0,3.0,1.0 -119,2,0,1.0,3.0,1.0 -120,3,0,1.0,3.0,1.0 -121,4,0,1.0,3.0,1.0 -122,1,1,1.0,3.0,1.0 -123,2,1,1.0,3.0,1.0 -124,3,1,1.0,3.0,1.0 -125,4,1,1.0,3.0,1.0 -126,2,2,1.0,3.0,1.0 -127,3,2,1.0,3.0,1.0 -128,4,2,1.0,3.0,1.0 -129,3,3,1.0,3.0,1.0 -130,4,3,1.0,3.0,1.0 -131,1,0,2.0,3.0,1.0 -132,2,0,2.0,3.0,1.0 -133,3,0,2.0,3.0,1.0 -134,4,0,2.0,3.0,1.0 -135,1,1,2.0,3.0,1.0 -136,2,1,2.0,3.0,1.0 -137,3,1,2.0,3.0,1.0 -138,4,1,2.0,3.0,1.0 -139,2,2,2.0,3.0,1.0 -140,3,2,2.0,3.0,1.0 -141,4,2,2.0,3.0,1.0 -142,3,3,2.0,3.0,1.0 -143,4,3,2.0,3.0,1.0 -144,1,0,3.0,3.0,1.0 -145,2,0,3.0,3.0,1.0 -146,3,0,3.0,3.0,1.0 -147,4,0,3.0,3.0,1.0 -148,1,1,3.0,3.0,1.0 -149,2,1,3.0,3.0,1.0 -150,3,1,3.0,3.0,1.0 -151,4,1,3.0,3.0,1.0 -152,2,2,3.0,3.0,1.0 -153,3,2,3.0,3.0,1.0 -154,4,2,3.0,3.0,1.0 -155,3,3,3.0,3.0,1.0 -156,4,3,3.0,3.0,1.0 -157,1,0,0.0,4.0,1.0 -158,2,0,0.0,4.0,1.0 -159,3,0,0.0,4.0,1.0 -160,4,0,0.0,4.0,1.0 -161,1,1,0.0,4.0,1.0 -162,2,1,0.0,4.0,1.0 -163,3,1,0.0,4.0,1.0 -164,4,1,0.0,4.0,1.0 -165,2,2,0.0,4.0,1.0 -166,3,2,0.0,4.0,1.0 -167,4,2,0.0,4.0,1.0 -168,3,3,0.0,4.0,1.0 -169,4,3,0.0,4.0,1.0 -170,1,0,1.0,4.0,1.0 -171,2,0,1.0,4.0,1.0 -172,3,0,1.0,4.0,1.0 -173,4,0,1.0,4.0,1.0 -174,1,1,1.0,4.0,1.0 -175,2,1,1.0,4.0,1.0 -176,3,1,1.0,4.0,1.0 -177,4,1,1.0,4.0,1.0 -178,2,2,1.0,4.0,1.0 -179,3,2,1.0,4.0,1.0 -180,4,2,1.0,4.0,1.0 -181,3,3,1.0,4.0,1.0 -182,4,3,1.0,4.0,1.0 -183,1,0,2.0,4.0,1.0 -184,2,0,2.0,4.0,1.0 -185,3,0,2.0,4.0,1.0 -186,4,0,2.0,4.0,1.0 -187,1,1,2.0,4.0,1.0 -188,2,1,2.0,4.0,1.0 -189,3,1,2.0,4.0,1.0 -190,4,1,2.0,4.0,1.0 -191,2,2,2.0,4.0,1.0 -192,3,2,2.0,4.0,1.0 -193,4,2,2.0,4.0,1.0 -194,3,3,2.0,4.0,1.0 -195,4,3,2.0,4.0,1.0 -196,1,0,3.0,4.0,1.0 -197,2,0,3.0,4.0,1.0 -198,3,0,3.0,4.0,1.0 -199,4,0,3.0,4.0,1.0 -200,1,1,3.0,4.0,1.0 -201,2,1,3.0,4.0,1.0 -202,3,1,3.0,4.0,1.0 -203,4,1,3.0,4.0,1.0 -204,2,2,3.0,4.0,1.0 -205,3,2,3.0,4.0,1.0 -206,4,2,3.0,4.0,1.0 -207,3,3,3.0,4.0,1.0 -208,4,3,3.0,4.0,1.0 -209,1,0,0.0,1.0,2.0 -210,2,0,0.0,1.0,2.0 -211,3,0,0.0,1.0,2.0 -212,4,0,0.0,1.0,2.0 -213,1,1,0.0,1.0,2.0 -214,2,1,0.0,1.0,2.0 -215,3,1,0.0,1.0,2.0 -216,4,1,0.0,1.0,2.0 -217,2,2,0.0,1.0,2.0 -218,3,2,0.0,1.0,2.0 -219,4,2,0.0,1.0,2.0 -220,3,3,0.0,1.0,2.0 -221,4,3,0.0,1.0,2.0 -222,1,0,1.0,1.0,2.0 -223,2,0,1.0,1.0,2.0 -224,3,0,1.0,1.0,2.0 -225,4,0,1.0,1.0,2.0 -226,1,1,1.0,1.0,2.0 -227,2,1,1.0,1.0,2.0 -228,3,1,1.0,1.0,2.0 -229,4,1,1.0,1.0,2.0 -230,2,2,1.0,1.0,2.0 -231,3,2,1.0,1.0,2.0 -232,4,2,1.0,1.0,2.0 -233,3,3,1.0,1.0,2.0 -234,4,3,1.0,1.0,2.0 -235,1,0,2.0,1.0,2.0 -236,2,0,2.0,1.0,2.0 -237,3,0,2.0,1.0,2.0 -238,4,0,2.0,1.0,2.0 -239,1,1,2.0,1.0,2.0 -240,2,1,2.0,1.0,2.0 -241,3,1,2.0,1.0,2.0 -242,4,1,2.0,1.0,2.0 -243,2,2,2.0,1.0,2.0 -244,3,2,2.0,1.0,2.0 -245,4,2,2.0,1.0,2.0 -246,3,3,2.0,1.0,2.0 -247,4,3,2.0,1.0,2.0 -248,1,0,3.0,1.0,2.0 -249,2,0,3.0,1.0,2.0 -250,3,0,3.0,1.0,2.0 -251,4,0,3.0,1.0,2.0 -252,1,1,3.0,1.0,2.0 -253,2,1,3.0,1.0,2.0 -254,3,1,3.0,1.0,2.0 -255,4,1,3.0,1.0,2.0 -256,2,2,3.0,1.0,2.0 -257,3,2,3.0,1.0,2.0 -258,4,2,3.0,1.0,2.0 -259,3,3,3.0,1.0,2.0 -260,4,3,3.0,1.0,2.0 -261,1,0,0.0,2.0,2.0 -262,2,0,0.0,2.0,2.0 -263,3,0,0.0,2.0,2.0 -264,4,0,0.0,2.0,2.0 -265,1,1,0.0,2.0,2.0 -266,2,1,0.0,2.0,2.0 -267,3,1,0.0,2.0,2.0 -268,4,1,0.0,2.0,2.0 -269,2,2,0.0,2.0,2.0 -270,3,2,0.0,2.0,2.0 -271,4,2,0.0,2.0,2.0 -272,3,3,0.0,2.0,2.0 -273,4,3,0.0,2.0,2.0 -274,1,0,1.0,2.0,2.0 -275,2,0,1.0,2.0,2.0 -276,3,0,1.0,2.0,2.0 -277,4,0,1.0,2.0,2.0 -278,1,1,1.0,2.0,2.0 -279,2,1,1.0,2.0,2.0 -280,3,1,1.0,2.0,2.0 -281,4,1,1.0,2.0,2.0 -282,2,2,1.0,2.0,2.0 -283,3,2,1.0,2.0,2.0 -284,4,2,1.0,2.0,2.0 -285,3,3,1.0,2.0,2.0 -286,4,3,1.0,2.0,2.0 -287,1,0,2.0,2.0,2.0 -288,2,0,2.0,2.0,2.0 -289,3,0,2.0,2.0,2.0 -290,4,0,2.0,2.0,2.0 -291,1,1,2.0,2.0,2.0 -292,2,1,2.0,2.0,2.0 -293,3,1,2.0,2.0,2.0 -294,4,1,2.0,2.0,2.0 -295,2,2,2.0,2.0,2.0 -296,3,2,2.0,2.0,2.0 -297,4,2,2.0,2.0,2.0 -298,3,3,2.0,2.0,2.0 -299,4,3,2.0,2.0,2.0 -300,1,0,3.0,2.0,2.0 -301,2,0,3.0,2.0,2.0 -302,3,0,3.0,2.0,2.0 -303,4,0,3.0,2.0,2.0 -304,1,1,3.0,2.0,2.0 -305,2,1,3.0,2.0,2.0 -306,3,1,3.0,2.0,2.0 -307,4,1,3.0,2.0,2.0 -308,2,2,3.0,2.0,2.0 -309,3,2,3.0,2.0,2.0 -310,4,2,3.0,2.0,2.0 -311,3,3,3.0,2.0,2.0 -312,4,3,3.0,2.0,2.0 -313,1,0,0.0,3.0,2.0 -314,2,0,0.0,3.0,2.0 -315,3,0,0.0,3.0,2.0 -316,4,0,0.0,3.0,2.0 -317,1,1,0.0,3.0,2.0 -318,2,1,0.0,3.0,2.0 -319,3,1,0.0,3.0,2.0 -320,4,1,0.0,3.0,2.0 -321,2,2,0.0,3.0,2.0 -322,3,2,0.0,3.0,2.0 -323,4,2,0.0,3.0,2.0 -324,3,3,0.0,3.0,2.0 -325,4,3,0.0,3.0,2.0 -326,1,0,1.0,3.0,2.0 -327,2,0,1.0,3.0,2.0 -328,3,0,1.0,3.0,2.0 -329,4,0,1.0,3.0,2.0 -330,1,1,1.0,3.0,2.0 -331,2,1,1.0,3.0,2.0 -332,3,1,1.0,3.0,2.0 -333,4,1,1.0,3.0,2.0 -334,2,2,1.0,3.0,2.0 -335,3,2,1.0,3.0,2.0 -336,4,2,1.0,3.0,2.0 -337,3,3,1.0,3.0,2.0 -338,4,3,1.0,3.0,2.0 -339,1,0,2.0,3.0,2.0 -340,2,0,2.0,3.0,2.0 -341,3,0,2.0,3.0,2.0 -342,4,0,2.0,3.0,2.0 -343,1,1,2.0,3.0,2.0 -344,2,1,2.0,3.0,2.0 -345,3,1,2.0,3.0,2.0 -346,4,1,2.0,3.0,2.0 -347,2,2,2.0,3.0,2.0 -348,3,2,2.0,3.0,2.0 -349,4,2,2.0,3.0,2.0 -350,3,3,2.0,3.0,2.0 -351,4,3,2.0,3.0,2.0 -352,1,0,3.0,3.0,2.0 -353,2,0,3.0,3.0,2.0 -354,3,0,3.0,3.0,2.0 -355,4,0,3.0,3.0,2.0 -356,1,1,3.0,3.0,2.0 -357,2,1,3.0,3.0,2.0 -358,3,1,3.0,3.0,2.0 -359,4,1,3.0,3.0,2.0 -360,2,2,3.0,3.0,2.0 -361,3,2,3.0,3.0,2.0 -362,4,2,3.0,3.0,2.0 -363,3,3,3.0,3.0,2.0 -364,4,3,3.0,3.0,2.0 -365,1,0,0.0,4.0,2.0 -366,2,0,0.0,4.0,2.0 -367,3,0,0.0,4.0,2.0 -368,4,0,0.0,4.0,2.0 -369,1,1,0.0,4.0,2.0 -370,2,1,0.0,4.0,2.0 -371,3,1,0.0,4.0,2.0 -372,4,1,0.0,4.0,2.0 -373,2,2,0.0,4.0,2.0 -374,3,2,0.0,4.0,2.0 -375,4,2,0.0,4.0,2.0 -376,3,3,0.0,4.0,2.0 -377,4,3,0.0,4.0,2.0 -378,1,0,1.0,4.0,2.0 -379,2,0,1.0,4.0,2.0 -380,3,0,1.0,4.0,2.0 -381,4,0,1.0,4.0,2.0 -382,1,1,1.0,4.0,2.0 -383,2,1,1.0,4.0,2.0 -384,3,1,1.0,4.0,2.0 -385,4,1,1.0,4.0,2.0 -386,2,2,1.0,4.0,2.0 -387,3,2,1.0,4.0,2.0 -388,4,2,1.0,4.0,2.0 -389,3,3,1.0,4.0,2.0 -390,4,3,1.0,4.0,2.0 -391,1,0,2.0,4.0,2.0 -392,2,0,2.0,4.0,2.0 -393,3,0,2.0,4.0,2.0 -394,4,0,2.0,4.0,2.0 -395,1,1,2.0,4.0,2.0 -396,2,1,2.0,4.0,2.0 -397,3,1,2.0,4.0,2.0 -398,4,1,2.0,4.0,2.0 -399,2,2,2.0,4.0,2.0 -400,3,2,2.0,4.0,2.0 -401,4,2,2.0,4.0,2.0 -402,3,3,2.0,4.0,2.0 -403,4,3,2.0,4.0,2.0 -404,1,0,3.0,4.0,2.0 -405,2,0,3.0,4.0,2.0 -406,3,0,3.0,4.0,2.0 -407,4,0,3.0,4.0,2.0 -408,1,1,3.0,4.0,2.0 -409,2,1,3.0,4.0,2.0 -410,3,1,3.0,4.0,2.0 -411,4,1,3.0,4.0,2.0 -412,2,2,3.0,4.0,2.0 -413,3,2,3.0,4.0,2.0 -414,4,2,3.0,4.0,2.0 -415,3,3,3.0,4.0,2.0 -416,4,3,3.0,4.0,2.0 -417,1,0,0.0,1.0,3.0 -418,2,0,0.0,1.0,3.0 -419,3,0,0.0,1.0,3.0 -420,4,0,0.0,1.0,3.0 -421,1,1,0.0,1.0,3.0 -422,2,1,0.0,1.0,3.0 -423,3,1,0.0,1.0,3.0 -424,4,1,0.0,1.0,3.0 -425,2,2,0.0,1.0,3.0 -426,3,2,0.0,1.0,3.0 -427,4,2,0.0,1.0,3.0 -428,3,3,0.0,1.0,3.0 -429,4,3,0.0,1.0,3.0 -430,1,0,1.0,1.0,3.0 -431,2,0,1.0,1.0,3.0 -432,3,0,1.0,1.0,3.0 -433,4,0,1.0,1.0,3.0 -434,1,1,1.0,1.0,3.0 -435,2,1,1.0,1.0,3.0 -436,3,1,1.0,1.0,3.0 -437,4,1,1.0,1.0,3.0 -438,2,2,1.0,1.0,3.0 -439,3,2,1.0,1.0,3.0 -440,4,2,1.0,1.0,3.0 -441,3,3,1.0,1.0,3.0 -442,4,3,1.0,1.0,3.0 -443,1,0,2.0,1.0,3.0 -444,2,0,2.0,1.0,3.0 -445,3,0,2.0,1.0,3.0 -446,4,0,2.0,1.0,3.0 -447,1,1,2.0,1.0,3.0 -448,2,1,2.0,1.0,3.0 -449,3,1,2.0,1.0,3.0 -450,4,1,2.0,1.0,3.0 -451,2,2,2.0,1.0,3.0 -452,3,2,2.0,1.0,3.0 -453,4,2,2.0,1.0,3.0 -454,3,3,2.0,1.0,3.0 -455,4,3,2.0,1.0,3.0 -456,1,0,3.0,1.0,3.0 -457,2,0,3.0,1.0,3.0 -458,3,0,3.0,1.0,3.0 -459,4,0,3.0,1.0,3.0 -460,1,1,3.0,1.0,3.0 -461,2,1,3.0,1.0,3.0 -462,3,1,3.0,1.0,3.0 -463,4,1,3.0,1.0,3.0 -464,2,2,3.0,1.0,3.0 -465,3,2,3.0,1.0,3.0 -466,4,2,3.0,1.0,3.0 -467,3,3,3.0,1.0,3.0 -468,4,3,3.0,1.0,3.0 -469,1,0,0.0,2.0,3.0 -470,2,0,0.0,2.0,3.0 -471,3,0,0.0,2.0,3.0 -472,4,0,0.0,2.0,3.0 -473,1,1,0.0,2.0,3.0 -474,2,1,0.0,2.0,3.0 -475,3,1,0.0,2.0,3.0 -476,4,1,0.0,2.0,3.0 -477,2,2,0.0,2.0,3.0 -478,3,2,0.0,2.0,3.0 -479,4,2,0.0,2.0,3.0 -480,3,3,0.0,2.0,3.0 -481,4,3,0.0,2.0,3.0 -482,1,0,1.0,2.0,3.0 -483,2,0,1.0,2.0,3.0 -484,3,0,1.0,2.0,3.0 -485,4,0,1.0,2.0,3.0 -486,1,1,1.0,2.0,3.0 -487,2,1,1.0,2.0,3.0 -488,3,1,1.0,2.0,3.0 -489,4,1,1.0,2.0,3.0 -490,2,2,1.0,2.0,3.0 -491,3,2,1.0,2.0,3.0 -492,4,2,1.0,2.0,3.0 -493,3,3,1.0,2.0,3.0 -494,4,3,1.0,2.0,3.0 -495,1,0,2.0,2.0,3.0 -496,2,0,2.0,2.0,3.0 -497,3,0,2.0,2.0,3.0 -498,4,0,2.0,2.0,3.0 -499,1,1,2.0,2.0,3.0 -500,2,1,2.0,2.0,3.0 -501,3,1,2.0,2.0,3.0 -502,4,1,2.0,2.0,3.0 -503,2,2,2.0,2.0,3.0 -504,3,2,2.0,2.0,3.0 -505,4,2,2.0,2.0,3.0 -506,3,3,2.0,2.0,3.0 -507,4,3,2.0,2.0,3.0 -508,1,0,3.0,2.0,3.0 -509,2,0,3.0,2.0,3.0 -510,3,0,3.0,2.0,3.0 -511,4,0,3.0,2.0,3.0 -512,1,1,3.0,2.0,3.0 -513,2,1,3.0,2.0,3.0 -514,3,1,3.0,2.0,3.0 -515,4,1,3.0,2.0,3.0 -516,2,2,3.0,2.0,3.0 -517,3,2,3.0,2.0,3.0 -518,4,2,3.0,2.0,3.0 -519,3,3,3.0,2.0,3.0 -520,4,3,3.0,2.0,3.0 -521,1,0,0.0,3.0,3.0 -522,2,0,0.0,3.0,3.0 -523,3,0,0.0,3.0,3.0 -524,4,0,0.0,3.0,3.0 -525,1,1,0.0,3.0,3.0 -526,2,1,0.0,3.0,3.0 -527,3,1,0.0,3.0,3.0 -528,4,1,0.0,3.0,3.0 -529,2,2,0.0,3.0,3.0 -530,3,2,0.0,3.0,3.0 -531,4,2,0.0,3.0,3.0 -532,3,3,0.0,3.0,3.0 -533,4,3,0.0,3.0,3.0 -534,1,0,1.0,3.0,3.0 -535,2,0,1.0,3.0,3.0 -536,3,0,1.0,3.0,3.0 -537,4,0,1.0,3.0,3.0 -538,1,1,1.0,3.0,3.0 -539,2,1,1.0,3.0,3.0 -540,3,1,1.0,3.0,3.0 -541,4,1,1.0,3.0,3.0 -542,2,2,1.0,3.0,3.0 -543,3,2,1.0,3.0,3.0 -544,4,2,1.0,3.0,3.0 -545,3,3,1.0,3.0,3.0 -546,4,3,1.0,3.0,3.0 -547,1,0,2.0,3.0,3.0 -548,2,0,2.0,3.0,3.0 -549,3,0,2.0,3.0,3.0 -550,4,0,2.0,3.0,3.0 -551,1,1,2.0,3.0,3.0 -552,2,1,2.0,3.0,3.0 -553,3,1,2.0,3.0,3.0 -554,4,1,2.0,3.0,3.0 -555,2,2,2.0,3.0,3.0 -556,3,2,2.0,3.0,3.0 -557,4,2,2.0,3.0,3.0 -558,3,3,2.0,3.0,3.0 -559,4,3,2.0,3.0,3.0 -560,1,0,3.0,3.0,3.0 -561,2,0,3.0,3.0,3.0 -562,3,0,3.0,3.0,3.0 -563,4,0,3.0,3.0,3.0 -564,1,1,3.0,3.0,3.0 -565,2,1,3.0,3.0,3.0 -566,3,1,3.0,3.0,3.0 -567,4,1,3.0,3.0,3.0 -568,2,2,3.0,3.0,3.0 -569,3,2,3.0,3.0,3.0 -570,4,2,3.0,3.0,3.0 -571,3,3,3.0,3.0,3.0 -572,4,3,3.0,3.0,3.0 -573,1,0,0.0,4.0,3.0 -574,2,0,0.0,4.0,3.0 -575,3,0,0.0,4.0,3.0 -576,4,0,0.0,4.0,3.0 -577,1,1,0.0,4.0,3.0 -578,2,1,0.0,4.0,3.0 -579,3,1,0.0,4.0,3.0 -580,4,1,0.0,4.0,3.0 -581,2,2,0.0,4.0,3.0 -582,3,2,0.0,4.0,3.0 -583,4,2,0.0,4.0,3.0 -584,3,3,0.0,4.0,3.0 -585,4,3,0.0,4.0,3.0 -586,1,0,1.0,4.0,3.0 -587,2,0,1.0,4.0,3.0 -588,3,0,1.0,4.0,3.0 -589,4,0,1.0,4.0,3.0 -590,1,1,1.0,4.0,3.0 -591,2,1,1.0,4.0,3.0 -592,3,1,1.0,4.0,3.0 -593,4,1,1.0,4.0,3.0 -594,2,2,1.0,4.0,3.0 -595,3,2,1.0,4.0,3.0 -596,4,2,1.0,4.0,3.0 -597,3,3,1.0,4.0,3.0 -598,4,3,1.0,4.0,3.0 -599,1,0,2.0,4.0,3.0 -600,2,0,2.0,4.0,3.0 -601,3,0,2.0,4.0,3.0 -602,4,0,2.0,4.0,3.0 -603,1,1,2.0,4.0,3.0 -604,2,1,2.0,4.0,3.0 -605,3,1,2.0,4.0,3.0 -606,4,1,2.0,4.0,3.0 -607,2,2,2.0,4.0,3.0 -608,3,2,2.0,4.0,3.0 -609,4,2,2.0,4.0,3.0 -610,3,3,2.0,4.0,3.0 -611,4,3,2.0,4.0,3.0 -612,1,0,3.0,4.0,3.0 -613,2,0,3.0,4.0,3.0 -614,3,0,3.0,4.0,3.0 -615,4,0,3.0,4.0,3.0 -616,1,1,3.0,4.0,3.0 -617,2,1,3.0,4.0,3.0 -618,3,1,3.0,4.0,3.0 -619,4,1,3.0,4.0,3.0 -620,2,2,3.0,4.0,3.0 -621,3,2,3.0,4.0,3.0 -622,4,2,3.0,4.0,3.0 -623,3,3,3.0,4.0,3.0 -624,4,3,3.0,4.0,3.0 diff --git a/Database/tg/fortran/tg_hhvtype_lookup.csv b/Database/tg/fortran/tg_hhvtype_lookup.csv deleted file mode 100644 index 2965f4f..0000000 --- a/Database/tg/fortran/tg_hhvtype_lookup.csv +++ /dev/null @@ -1,625 +0,0 @@ -HHVTYPE,ADULT,WORKER,CHILD,VEH,AGE_INDEX -1,1,0,0.0,0.0,1.0 -2,2,0,0.0,0.0,1.0 -3,3,0,0.0,0.0,1.0 -4,4,0,0.0,0.0,1.0 -5,1,1,0.0,0.0,1.0 -6,2,1,0.0,0.0,1.0 -7,3,1,0.0,0.0,1.0 -8,4,1,0.0,0.0,1.0 -9,2,2,0.0,0.0,1.0 -10,3,2,0.0,0.0,1.0 -11,4,2,0.0,0.0,1.0 -12,3,3,0.0,0.0,1.0 -13,4,3,0.0,0.0,1.0 -14,1,0,1.0,0.0,1.0 -15,2,0,1.0,0.0,1.0 -16,3,0,1.0,0.0,1.0 -17,4,0,1.0,0.0,1.0 -18,1,1,1.0,0.0,1.0 -19,2,1,1.0,0.0,1.0 -20,3,1,1.0,0.0,1.0 -21,4,1,1.0,0.0,1.0 -22,2,2,1.0,0.0,1.0 -23,3,2,1.0,0.0,1.0 -24,4,2,1.0,0.0,1.0 -25,3,3,1.0,0.0,1.0 -26,4,3,1.0,0.0,1.0 -27,1,0,2.0,0.0,1.0 -28,2,0,2.0,0.0,1.0 -29,3,0,2.0,0.0,1.0 -30,4,0,2.0,0.0,1.0 -31,1,1,2.0,0.0,1.0 -32,2,1,2.0,0.0,1.0 -33,3,1,2.0,0.0,1.0 -34,4,1,2.0,0.0,1.0 -35,2,2,2.0,0.0,1.0 -36,3,2,2.0,0.0,1.0 -37,4,2,2.0,0.0,1.0 -38,3,3,2.0,0.0,1.0 -39,4,3,2.0,0.0,1.0 -40,1,0,3.0,0.0,1.0 -41,2,0,3.0,0.0,1.0 -42,3,0,3.0,0.0,1.0 -43,4,0,3.0,0.0,1.0 -44,1,1,3.0,0.0,1.0 -45,2,1,3.0,0.0,1.0 -46,3,1,3.0,0.0,1.0 -47,4,1,3.0,0.0,1.0 -48,2,2,3.0,0.0,1.0 -49,3,2,3.0,0.0,1.0 -50,4,2,3.0,0.0,1.0 -51,3,3,3.0,0.0,1.0 -52,4,3,3.0,0.0,1.0 -53,1,0,0.0,1.0,1.0 -54,2,0,0.0,1.0,1.0 -55,3,0,0.0,1.0,1.0 -56,4,0,0.0,1.0,1.0 -57,1,1,0.0,1.0,1.0 -58,2,1,0.0,1.0,1.0 -59,3,1,0.0,1.0,1.0 -60,4,1,0.0,1.0,1.0 -61,2,2,0.0,1.0,1.0 -62,3,2,0.0,1.0,1.0 -63,4,2,0.0,1.0,1.0 -64,3,3,0.0,1.0,1.0 -65,4,3,0.0,1.0,1.0 -66,1,0,1.0,1.0,1.0 -67,2,0,1.0,1.0,1.0 -68,3,0,1.0,1.0,1.0 -69,4,0,1.0,1.0,1.0 -70,1,1,1.0,1.0,1.0 -71,2,1,1.0,1.0,1.0 -72,3,1,1.0,1.0,1.0 -73,4,1,1.0,1.0,1.0 -74,2,2,1.0,1.0,1.0 -75,3,2,1.0,1.0,1.0 -76,4,2,1.0,1.0,1.0 -77,3,3,1.0,1.0,1.0 -78,4,3,1.0,1.0,1.0 -79,1,0,2.0,1.0,1.0 -80,2,0,2.0,1.0,1.0 -81,3,0,2.0,1.0,1.0 -82,4,0,2.0,1.0,1.0 -83,1,1,2.0,1.0,1.0 -84,2,1,2.0,1.0,1.0 -85,3,1,2.0,1.0,1.0 -86,4,1,2.0,1.0,1.0 -87,2,2,2.0,1.0,1.0 -88,3,2,2.0,1.0,1.0 -89,4,2,2.0,1.0,1.0 -90,3,3,2.0,1.0,1.0 -91,4,3,2.0,1.0,1.0 -92,1,0,3.0,1.0,1.0 -93,2,0,3.0,1.0,1.0 -94,3,0,3.0,1.0,1.0 -95,4,0,3.0,1.0,1.0 -96,1,1,3.0,1.0,1.0 -97,2,1,3.0,1.0,1.0 -98,3,1,3.0,1.0,1.0 -99,4,1,3.0,1.0,1.0 -100,2,2,3.0,1.0,1.0 -101,3,2,3.0,1.0,1.0 -102,4,2,3.0,1.0,1.0 -103,3,3,3.0,1.0,1.0 -104,4,3,3.0,1.0,1.0 -105,1,0,0.0,2.0,1.0 -106,2,0,0.0,2.0,1.0 -107,3,0,0.0,2.0,1.0 -108,4,0,0.0,2.0,1.0 -109,1,1,0.0,2.0,1.0 -110,2,1,0.0,2.0,1.0 -111,3,1,0.0,2.0,1.0 -112,4,1,0.0,2.0,1.0 -113,2,2,0.0,2.0,1.0 -114,3,2,0.0,2.0,1.0 -115,4,2,0.0,2.0,1.0 -116,3,3,0.0,2.0,1.0 -117,4,3,0.0,2.0,1.0 -118,1,0,1.0,2.0,1.0 -119,2,0,1.0,2.0,1.0 -120,3,0,1.0,2.0,1.0 -121,4,0,1.0,2.0,1.0 -122,1,1,1.0,2.0,1.0 -123,2,1,1.0,2.0,1.0 -124,3,1,1.0,2.0,1.0 -125,4,1,1.0,2.0,1.0 -126,2,2,1.0,2.0,1.0 -127,3,2,1.0,2.0,1.0 -128,4,2,1.0,2.0,1.0 -129,3,3,1.0,2.0,1.0 -130,4,3,1.0,2.0,1.0 -131,1,0,2.0,2.0,1.0 -132,2,0,2.0,2.0,1.0 -133,3,0,2.0,2.0,1.0 -134,4,0,2.0,2.0,1.0 -135,1,1,2.0,2.0,1.0 -136,2,1,2.0,2.0,1.0 -137,3,1,2.0,2.0,1.0 -138,4,1,2.0,2.0,1.0 -139,2,2,2.0,2.0,1.0 -140,3,2,2.0,2.0,1.0 -141,4,2,2.0,2.0,1.0 -142,3,3,2.0,2.0,1.0 -143,4,3,2.0,2.0,1.0 -144,1,0,3.0,2.0,1.0 -145,2,0,3.0,2.0,1.0 -146,3,0,3.0,2.0,1.0 -147,4,0,3.0,2.0,1.0 -148,1,1,3.0,2.0,1.0 -149,2,1,3.0,2.0,1.0 -150,3,1,3.0,2.0,1.0 -151,4,1,3.0,2.0,1.0 -152,2,2,3.0,2.0,1.0 -153,3,2,3.0,2.0,1.0 -154,4,2,3.0,2.0,1.0 -155,3,3,3.0,2.0,1.0 -156,4,3,3.0,2.0,1.0 -157,1,0,0.0,3.0,1.0 -158,2,0,0.0,3.0,1.0 -159,3,0,0.0,3.0,1.0 -160,4,0,0.0,3.0,1.0 -161,1,1,0.0,3.0,1.0 -162,2,1,0.0,3.0,1.0 -163,3,1,0.0,3.0,1.0 -164,4,1,0.0,3.0,1.0 -165,2,2,0.0,3.0,1.0 -166,3,2,0.0,3.0,1.0 -167,4,2,0.0,3.0,1.0 -168,3,3,0.0,3.0,1.0 -169,4,3,0.0,3.0,1.0 -170,1,0,1.0,3.0,1.0 -171,2,0,1.0,3.0,1.0 -172,3,0,1.0,3.0,1.0 -173,4,0,1.0,3.0,1.0 -174,1,1,1.0,3.0,1.0 -175,2,1,1.0,3.0,1.0 -176,3,1,1.0,3.0,1.0 -177,4,1,1.0,3.0,1.0 -178,2,2,1.0,3.0,1.0 -179,3,2,1.0,3.0,1.0 -180,4,2,1.0,3.0,1.0 -181,3,3,1.0,3.0,1.0 -182,4,3,1.0,3.0,1.0 -183,1,0,2.0,3.0,1.0 -184,2,0,2.0,3.0,1.0 -185,3,0,2.0,3.0,1.0 -186,4,0,2.0,3.0,1.0 -187,1,1,2.0,3.0,1.0 -188,2,1,2.0,3.0,1.0 -189,3,1,2.0,3.0,1.0 -190,4,1,2.0,3.0,1.0 -191,2,2,2.0,3.0,1.0 -192,3,2,2.0,3.0,1.0 -193,4,2,2.0,3.0,1.0 -194,3,3,2.0,3.0,1.0 -195,4,3,2.0,3.0,1.0 -196,1,0,3.0,3.0,1.0 -197,2,0,3.0,3.0,1.0 -198,3,0,3.0,3.0,1.0 -199,4,0,3.0,3.0,1.0 -200,1,1,3.0,3.0,1.0 -201,2,1,3.0,3.0,1.0 -202,3,1,3.0,3.0,1.0 -203,4,1,3.0,3.0,1.0 -204,2,2,3.0,3.0,1.0 -205,3,2,3.0,3.0,1.0 -206,4,2,3.0,3.0,1.0 -207,3,3,3.0,3.0,1.0 -208,4,3,3.0,3.0,1.0 -209,1,0,0.0,0.0,2.0 -210,2,0,0.0,0.0,2.0 -211,3,0,0.0,0.0,2.0 -212,4,0,0.0,0.0,2.0 -213,1,1,0.0,0.0,2.0 -214,2,1,0.0,0.0,2.0 -215,3,1,0.0,0.0,2.0 -216,4,1,0.0,0.0,2.0 -217,2,2,0.0,0.0,2.0 -218,3,2,0.0,0.0,2.0 -219,4,2,0.0,0.0,2.0 -220,3,3,0.0,0.0,2.0 -221,4,3,0.0,0.0,2.0 -222,1,0,1.0,0.0,2.0 -223,2,0,1.0,0.0,2.0 -224,3,0,1.0,0.0,2.0 -225,4,0,1.0,0.0,2.0 -226,1,1,1.0,0.0,2.0 -227,2,1,1.0,0.0,2.0 -228,3,1,1.0,0.0,2.0 -229,4,1,1.0,0.0,2.0 -230,2,2,1.0,0.0,2.0 -231,3,2,1.0,0.0,2.0 -232,4,2,1.0,0.0,2.0 -233,3,3,1.0,0.0,2.0 -234,4,3,1.0,0.0,2.0 -235,1,0,2.0,0.0,2.0 -236,2,0,2.0,0.0,2.0 -237,3,0,2.0,0.0,2.0 -238,4,0,2.0,0.0,2.0 -239,1,1,2.0,0.0,2.0 -240,2,1,2.0,0.0,2.0 -241,3,1,2.0,0.0,2.0 -242,4,1,2.0,0.0,2.0 -243,2,2,2.0,0.0,2.0 -244,3,2,2.0,0.0,2.0 -245,4,2,2.0,0.0,2.0 -246,3,3,2.0,0.0,2.0 -247,4,3,2.0,0.0,2.0 -248,1,0,3.0,0.0,2.0 -249,2,0,3.0,0.0,2.0 -250,3,0,3.0,0.0,2.0 -251,4,0,3.0,0.0,2.0 -252,1,1,3.0,0.0,2.0 -253,2,1,3.0,0.0,2.0 -254,3,1,3.0,0.0,2.0 -255,4,1,3.0,0.0,2.0 -256,2,2,3.0,0.0,2.0 -257,3,2,3.0,0.0,2.0 -258,4,2,3.0,0.0,2.0 -259,3,3,3.0,0.0,2.0 -260,4,3,3.0,0.0,2.0 -261,1,0,0.0,1.0,2.0 -262,2,0,0.0,1.0,2.0 -263,3,0,0.0,1.0,2.0 -264,4,0,0.0,1.0,2.0 -265,1,1,0.0,1.0,2.0 -266,2,1,0.0,1.0,2.0 -267,3,1,0.0,1.0,2.0 -268,4,1,0.0,1.0,2.0 -269,2,2,0.0,1.0,2.0 -270,3,2,0.0,1.0,2.0 -271,4,2,0.0,1.0,2.0 -272,3,3,0.0,1.0,2.0 -273,4,3,0.0,1.0,2.0 -274,1,0,1.0,1.0,2.0 -275,2,0,1.0,1.0,2.0 -276,3,0,1.0,1.0,2.0 -277,4,0,1.0,1.0,2.0 -278,1,1,1.0,1.0,2.0 -279,2,1,1.0,1.0,2.0 -280,3,1,1.0,1.0,2.0 -281,4,1,1.0,1.0,2.0 -282,2,2,1.0,1.0,2.0 -283,3,2,1.0,1.0,2.0 -284,4,2,1.0,1.0,2.0 -285,3,3,1.0,1.0,2.0 -286,4,3,1.0,1.0,2.0 -287,1,0,2.0,1.0,2.0 -288,2,0,2.0,1.0,2.0 -289,3,0,2.0,1.0,2.0 -290,4,0,2.0,1.0,2.0 -291,1,1,2.0,1.0,2.0 -292,2,1,2.0,1.0,2.0 -293,3,1,2.0,1.0,2.0 -294,4,1,2.0,1.0,2.0 -295,2,2,2.0,1.0,2.0 -296,3,2,2.0,1.0,2.0 -297,4,2,2.0,1.0,2.0 -298,3,3,2.0,1.0,2.0 -299,4,3,2.0,1.0,2.0 -300,1,0,3.0,1.0,2.0 -301,2,0,3.0,1.0,2.0 -302,3,0,3.0,1.0,2.0 -303,4,0,3.0,1.0,2.0 -304,1,1,3.0,1.0,2.0 -305,2,1,3.0,1.0,2.0 -306,3,1,3.0,1.0,2.0 -307,4,1,3.0,1.0,2.0 -308,2,2,3.0,1.0,2.0 -309,3,2,3.0,1.0,2.0 -310,4,2,3.0,1.0,2.0 -311,3,3,3.0,1.0,2.0 -312,4,3,3.0,1.0,2.0 -313,1,0,0.0,2.0,2.0 -314,2,0,0.0,2.0,2.0 -315,3,0,0.0,2.0,2.0 -316,4,0,0.0,2.0,2.0 -317,1,1,0.0,2.0,2.0 -318,2,1,0.0,2.0,2.0 -319,3,1,0.0,2.0,2.0 -320,4,1,0.0,2.0,2.0 -321,2,2,0.0,2.0,2.0 -322,3,2,0.0,2.0,2.0 -323,4,2,0.0,2.0,2.0 -324,3,3,0.0,2.0,2.0 -325,4,3,0.0,2.0,2.0 -326,1,0,1.0,2.0,2.0 -327,2,0,1.0,2.0,2.0 -328,3,0,1.0,2.0,2.0 -329,4,0,1.0,2.0,2.0 -330,1,1,1.0,2.0,2.0 -331,2,1,1.0,2.0,2.0 -332,3,1,1.0,2.0,2.0 -333,4,1,1.0,2.0,2.0 -334,2,2,1.0,2.0,2.0 -335,3,2,1.0,2.0,2.0 -336,4,2,1.0,2.0,2.0 -337,3,3,1.0,2.0,2.0 -338,4,3,1.0,2.0,2.0 -339,1,0,2.0,2.0,2.0 -340,2,0,2.0,2.0,2.0 -341,3,0,2.0,2.0,2.0 -342,4,0,2.0,2.0,2.0 -343,1,1,2.0,2.0,2.0 -344,2,1,2.0,2.0,2.0 -345,3,1,2.0,2.0,2.0 -346,4,1,2.0,2.0,2.0 -347,2,2,2.0,2.0,2.0 -348,3,2,2.0,2.0,2.0 -349,4,2,2.0,2.0,2.0 -350,3,3,2.0,2.0,2.0 -351,4,3,2.0,2.0,2.0 -352,1,0,3.0,2.0,2.0 -353,2,0,3.0,2.0,2.0 -354,3,0,3.0,2.0,2.0 -355,4,0,3.0,2.0,2.0 -356,1,1,3.0,2.0,2.0 -357,2,1,3.0,2.0,2.0 -358,3,1,3.0,2.0,2.0 -359,4,1,3.0,2.0,2.0 -360,2,2,3.0,2.0,2.0 -361,3,2,3.0,2.0,2.0 -362,4,2,3.0,2.0,2.0 -363,3,3,3.0,2.0,2.0 -364,4,3,3.0,2.0,2.0 -365,1,0,0.0,3.0,2.0 -366,2,0,0.0,3.0,2.0 -367,3,0,0.0,3.0,2.0 -368,4,0,0.0,3.0,2.0 -369,1,1,0.0,3.0,2.0 -370,2,1,0.0,3.0,2.0 -371,3,1,0.0,3.0,2.0 -372,4,1,0.0,3.0,2.0 -373,2,2,0.0,3.0,2.0 -374,3,2,0.0,3.0,2.0 -375,4,2,0.0,3.0,2.0 -376,3,3,0.0,3.0,2.0 -377,4,3,0.0,3.0,2.0 -378,1,0,1.0,3.0,2.0 -379,2,0,1.0,3.0,2.0 -380,3,0,1.0,3.0,2.0 -381,4,0,1.0,3.0,2.0 -382,1,1,1.0,3.0,2.0 -383,2,1,1.0,3.0,2.0 -384,3,1,1.0,3.0,2.0 -385,4,1,1.0,3.0,2.0 -386,2,2,1.0,3.0,2.0 -387,3,2,1.0,3.0,2.0 -388,4,2,1.0,3.0,2.0 -389,3,3,1.0,3.0,2.0 -390,4,3,1.0,3.0,2.0 -391,1,0,2.0,3.0,2.0 -392,2,0,2.0,3.0,2.0 -393,3,0,2.0,3.0,2.0 -394,4,0,2.0,3.0,2.0 -395,1,1,2.0,3.0,2.0 -396,2,1,2.0,3.0,2.0 -397,3,1,2.0,3.0,2.0 -398,4,1,2.0,3.0,2.0 -399,2,2,2.0,3.0,2.0 -400,3,2,2.0,3.0,2.0 -401,4,2,2.0,3.0,2.0 -402,3,3,2.0,3.0,2.0 -403,4,3,2.0,3.0,2.0 -404,1,0,3.0,3.0,2.0 -405,2,0,3.0,3.0,2.0 -406,3,0,3.0,3.0,2.0 -407,4,0,3.0,3.0,2.0 -408,1,1,3.0,3.0,2.0 -409,2,1,3.0,3.0,2.0 -410,3,1,3.0,3.0,2.0 -411,4,1,3.0,3.0,2.0 -412,2,2,3.0,3.0,2.0 -413,3,2,3.0,3.0,2.0 -414,4,2,3.0,3.0,2.0 -415,3,3,3.0,3.0,2.0 -416,4,3,3.0,3.0,2.0 -417,1,0,0.0,0.0,3.0 -418,2,0,0.0,0.0,3.0 -419,3,0,0.0,0.0,3.0 -420,4,0,0.0,0.0,3.0 -421,1,1,0.0,0.0,3.0 -422,2,1,0.0,0.0,3.0 -423,3,1,0.0,0.0,3.0 -424,4,1,0.0,0.0,3.0 -425,2,2,0.0,0.0,3.0 -426,3,2,0.0,0.0,3.0 -427,4,2,0.0,0.0,3.0 -428,3,3,0.0,0.0,3.0 -429,4,3,0.0,0.0,3.0 -430,1,0,1.0,0.0,3.0 -431,2,0,1.0,0.0,3.0 -432,3,0,1.0,0.0,3.0 -433,4,0,1.0,0.0,3.0 -434,1,1,1.0,0.0,3.0 -435,2,1,1.0,0.0,3.0 -436,3,1,1.0,0.0,3.0 -437,4,1,1.0,0.0,3.0 -438,2,2,1.0,0.0,3.0 -439,3,2,1.0,0.0,3.0 -440,4,2,1.0,0.0,3.0 -441,3,3,1.0,0.0,3.0 -442,4,3,1.0,0.0,3.0 -443,1,0,2.0,0.0,3.0 -444,2,0,2.0,0.0,3.0 -445,3,0,2.0,0.0,3.0 -446,4,0,2.0,0.0,3.0 -447,1,1,2.0,0.0,3.0 -448,2,1,2.0,0.0,3.0 -449,3,1,2.0,0.0,3.0 -450,4,1,2.0,0.0,3.0 -451,2,2,2.0,0.0,3.0 -452,3,2,2.0,0.0,3.0 -453,4,2,2.0,0.0,3.0 -454,3,3,2.0,0.0,3.0 -455,4,3,2.0,0.0,3.0 -456,1,0,3.0,0.0,3.0 -457,2,0,3.0,0.0,3.0 -458,3,0,3.0,0.0,3.0 -459,4,0,3.0,0.0,3.0 -460,1,1,3.0,0.0,3.0 -461,2,1,3.0,0.0,3.0 -462,3,1,3.0,0.0,3.0 -463,4,1,3.0,0.0,3.0 -464,2,2,3.0,0.0,3.0 -465,3,2,3.0,0.0,3.0 -466,4,2,3.0,0.0,3.0 -467,3,3,3.0,0.0,3.0 -468,4,3,3.0,0.0,3.0 -469,1,0,0.0,1.0,3.0 -470,2,0,0.0,1.0,3.0 -471,3,0,0.0,1.0,3.0 -472,4,0,0.0,1.0,3.0 -473,1,1,0.0,1.0,3.0 -474,2,1,0.0,1.0,3.0 -475,3,1,0.0,1.0,3.0 -476,4,1,0.0,1.0,3.0 -477,2,2,0.0,1.0,3.0 -478,3,2,0.0,1.0,3.0 -479,4,2,0.0,1.0,3.0 -480,3,3,0.0,1.0,3.0 -481,4,3,0.0,1.0,3.0 -482,1,0,1.0,1.0,3.0 -483,2,0,1.0,1.0,3.0 -484,3,0,1.0,1.0,3.0 -485,4,0,1.0,1.0,3.0 -486,1,1,1.0,1.0,3.0 -487,2,1,1.0,1.0,3.0 -488,3,1,1.0,1.0,3.0 -489,4,1,1.0,1.0,3.0 -490,2,2,1.0,1.0,3.0 -491,3,2,1.0,1.0,3.0 -492,4,2,1.0,1.0,3.0 -493,3,3,1.0,1.0,3.0 -494,4,3,1.0,1.0,3.0 -495,1,0,2.0,1.0,3.0 -496,2,0,2.0,1.0,3.0 -497,3,0,2.0,1.0,3.0 -498,4,0,2.0,1.0,3.0 -499,1,1,2.0,1.0,3.0 -500,2,1,2.0,1.0,3.0 -501,3,1,2.0,1.0,3.0 -502,4,1,2.0,1.0,3.0 -503,2,2,2.0,1.0,3.0 -504,3,2,2.0,1.0,3.0 -505,4,2,2.0,1.0,3.0 -506,3,3,2.0,1.0,3.0 -507,4,3,2.0,1.0,3.0 -508,1,0,3.0,1.0,3.0 -509,2,0,3.0,1.0,3.0 -510,3,0,3.0,1.0,3.0 -511,4,0,3.0,1.0,3.0 -512,1,1,3.0,1.0,3.0 -513,2,1,3.0,1.0,3.0 -514,3,1,3.0,1.0,3.0 -515,4,1,3.0,1.0,3.0 -516,2,2,3.0,1.0,3.0 -517,3,2,3.0,1.0,3.0 -518,4,2,3.0,1.0,3.0 -519,3,3,3.0,1.0,3.0 -520,4,3,3.0,1.0,3.0 -521,1,0,0.0,2.0,3.0 -522,2,0,0.0,2.0,3.0 -523,3,0,0.0,2.0,3.0 -524,4,0,0.0,2.0,3.0 -525,1,1,0.0,2.0,3.0 -526,2,1,0.0,2.0,3.0 -527,3,1,0.0,2.0,3.0 -528,4,1,0.0,2.0,3.0 -529,2,2,0.0,2.0,3.0 -530,3,2,0.0,2.0,3.0 -531,4,2,0.0,2.0,3.0 -532,3,3,0.0,2.0,3.0 -533,4,3,0.0,2.0,3.0 -534,1,0,1.0,2.0,3.0 -535,2,0,1.0,2.0,3.0 -536,3,0,1.0,2.0,3.0 -537,4,0,1.0,2.0,3.0 -538,1,1,1.0,2.0,3.0 -539,2,1,1.0,2.0,3.0 -540,3,1,1.0,2.0,3.0 -541,4,1,1.0,2.0,3.0 -542,2,2,1.0,2.0,3.0 -543,3,2,1.0,2.0,3.0 -544,4,2,1.0,2.0,3.0 -545,3,3,1.0,2.0,3.0 -546,4,3,1.0,2.0,3.0 -547,1,0,2.0,2.0,3.0 -548,2,0,2.0,2.0,3.0 -549,3,0,2.0,2.0,3.0 -550,4,0,2.0,2.0,3.0 -551,1,1,2.0,2.0,3.0 -552,2,1,2.0,2.0,3.0 -553,3,1,2.0,2.0,3.0 -554,4,1,2.0,2.0,3.0 -555,2,2,2.0,2.0,3.0 -556,3,2,2.0,2.0,3.0 -557,4,2,2.0,2.0,3.0 -558,3,3,2.0,2.0,3.0 -559,4,3,2.0,2.0,3.0 -560,1,0,3.0,2.0,3.0 -561,2,0,3.0,2.0,3.0 -562,3,0,3.0,2.0,3.0 -563,4,0,3.0,2.0,3.0 -564,1,1,3.0,2.0,3.0 -565,2,1,3.0,2.0,3.0 -566,3,1,3.0,2.0,3.0 -567,4,1,3.0,2.0,3.0 -568,2,2,3.0,2.0,3.0 -569,3,2,3.0,2.0,3.0 -570,4,2,3.0,2.0,3.0 -571,3,3,3.0,2.0,3.0 -572,4,3,3.0,2.0,3.0 -573,1,0,0.0,3.0,3.0 -574,2,0,0.0,3.0,3.0 -575,3,0,0.0,3.0,3.0 -576,4,0,0.0,3.0,3.0 -577,1,1,0.0,3.0,3.0 -578,2,1,0.0,3.0,3.0 -579,3,1,0.0,3.0,3.0 -580,4,1,0.0,3.0,3.0 -581,2,2,0.0,3.0,3.0 -582,3,2,0.0,3.0,3.0 -583,4,2,0.0,3.0,3.0 -584,3,3,0.0,3.0,3.0 -585,4,3,0.0,3.0,3.0 -586,1,0,1.0,3.0,3.0 -587,2,0,1.0,3.0,3.0 -588,3,0,1.0,3.0,3.0 -589,4,0,1.0,3.0,3.0 -590,1,1,1.0,3.0,3.0 -591,2,1,1.0,3.0,3.0 -592,3,1,1.0,3.0,3.0 -593,4,1,1.0,3.0,3.0 -594,2,2,1.0,3.0,3.0 -595,3,2,1.0,3.0,3.0 -596,4,2,1.0,3.0,3.0 -597,3,3,1.0,3.0,3.0 -598,4,3,1.0,3.0,3.0 -599,1,0,2.0,3.0,3.0 -600,2,0,2.0,3.0,3.0 -601,3,0,2.0,3.0,3.0 -602,4,0,2.0,3.0,3.0 -603,1,1,2.0,3.0,3.0 -604,2,1,2.0,3.0,3.0 -605,3,1,2.0,3.0,3.0 -606,4,1,2.0,3.0,3.0 -607,2,2,2.0,3.0,3.0 -608,3,2,2.0,3.0,3.0 -609,4,2,2.0,3.0,3.0 -610,3,3,2.0,3.0,3.0 -611,4,3,2.0,3.0,3.0 -612,1,0,3.0,3.0,3.0 -613,2,0,3.0,3.0,3.0 -614,3,0,3.0,3.0,3.0 -615,4,0,3.0,3.0,3.0 -616,1,1,3.0,3.0,3.0 -617,2,1,3.0,3.0,3.0 -618,3,1,3.0,3.0,3.0 -619,4,1,3.0,3.0,3.0 -620,2,2,3.0,3.0,3.0 -621,3,2,3.0,3.0,3.0 -622,4,2,3.0,3.0,3.0 -623,3,3,3.0,3.0,3.0 -624,4,3,3.0,3.0,3.0 diff --git a/Database/tg/fortran/wfhmodule/edudist.csv b/Database/tg/fortran/wfhmodule/edudist.csv deleted file mode 100644 index 92e43db..0000000 --- a/Database/tg/fortran/wfhmodule/edudist.csv +++ /dev/null @@ -1,7 +0,0 @@ -wfhgroup,hhedu2,pct -high,1,0.202 -high,2,0.798 -medium,1,0.268 -medium,2,0.732 -low,1,0.305 -low,2,0.695 diff --git a/Database/tg/fortran/wfhmodule/indp_naics.csv b/Database/tg/fortran/wfhmodule/indp_naics.csv index e3933e3..abe0f56 100644 --- a/Database/tg/fortran/wfhmodule/indp_naics.csv +++ b/Database/tg/fortran/wfhmodule/indp_naics.csv @@ -1,295 +1,295 @@ -INDP,naics2,trc -170,11,low -180,11,low -190,11,low -270,11,low -280,11,low -290,11,low -370,21,low -380,21,low -390,21,low -470,21,low -490,21,low -570,22,medium -580,22,medium -590,22,medium -670,22,medium -680,22,medium -690,22,medium -770,23,low -1070,31-33,low -1080,31-33,low -1090,31-33,low -1170,31-33,low -1180,31-33,low -1190,31-33,low -1270,31-33,low -1280,31-33,low -1290,31-33,low -1370,31-33,low -1390,31-33,low -1470,31-33,low -1480,31-33,low -1490,31-33,low -1570,31-33,low -1590,31-33,low -1670,31-33,low -1680,31-33,low -1690,31-33,low -1691,31-33,low -1770,31-33,low -1790,31-33,low -1870,31-33,low -1880,31-33,low -1890,31-33,low -1990,31-33,low -2070,31-33,low -2090,31-33,low -2170,31-33,low -2180,31-33,low -2190,31-33,low -2270,31-33,low -2280,31-33,low -2290,31-33,low -2370,31-33,low -2380,31-33,low -2390,31-33,low -2470,31-33,low -2480,31-33,low -2490,31-33,low -2570,31-33,low -2590,31-33,low -2670,31-33,low -2680,31-33,low -2690,31-33,low -2770,31-33,low -2780,31-33,low -2790,31-33,low -2870,31-33,low -2880,31-33,low -2890,31-33,low -2970,31-33,low -2980,31-33,low -2990,31-33,low -3070,31-33,low -3080,31-33,low -3090,31-33,low -3095,31-33,low -3170,31-33,low -3180,31-33,low -3190,31-33,low -3291,31-33,low -3360,31-33,low -3365,31-33,low -3370,31-33,low -3380,31-33,low -3390,31-33,low -3470,31-33,low -3490,31-33,low -3570,31-33,low -3580,31-33,low -3590,31-33,low -3670,31-33,low -3680,31-33,low -3690,31-33,low -3770,31-33,low -3780,31-33,low -3790,31-33,low -3870,31-33,low -3875,31-33,low -3890,31-33,low -3895,31-33,low -3960,31-33,low -3970,31-33,low -3980,31-33,low -3990,31-33,low -4070,42,medium -4080,42,medium -4090,42,medium -4170,42,medium -4180,42,medium -4190,42,medium -4195,42,medium -4260,42,medium -4265,42,medium -4270,42,medium -4280,42,medium -4290,42,medium -4370,42,medium -4380,42,medium -4390,42,medium -4470,42,medium -4480,42,medium -4490,42,medium -4560,42,medium -4570,42,medium -4580,42,medium -4585,42,medium -4590,42,medium -4670,44-45,low -4680,44-45,low -4690,44-45,low -4770,44-45,low -4780,44-45,low -4790,44-45,low -4795,44-45,low -4870,44-45,low -4880,44-45,low -4890,44-45,low -4970,44-45,low -4971,44-45,low -4972,44-45,low -4980,44-45,low -4990,44-45,low -5070,44-45,low -5080,44-45,low -5090,44-45,low -5170,44-45,low -5180,44-45,low -5190,44-45,low -5270,44-45,low -5275,44-45,low -5280,44-45,low -5290,44-45,low -5295,44-45,low -5370,44-45,low -5380,44-45,low -5381,44-45,low -5390,44-45,low -5391,44-45,low -5470,44-45,low -5480,44-45,low -5490,44-45,low -5570,44-45,low -5580,44-45,low -5590,44-45,low -5591,44-45,low -5592,44-45,low -5593,44-45,low -5670,44-45,low -5680,44-45,low -5690,44-45,low -5790,44-45,low -6070,48-49,low -6080,48-49,low -6090,48-49,low -6170,48-49,low -6180,48-49,low -6190,48-49,low -6270,48-49,low -6280,48-49,low -6290,48-49,low -6370,48-49,low -6380,48-49,low -6390,48-49,low -6470,51,high -6480,51,high -6490,51,high -6570,51,high -6590,51,high -6670,51,high -6672,51,high -6680,51,high -6690,51,high -6695,51,high -6770,51,high -6780,51,high -6870,52,high -6880,52,high -6890,52,high -6970,52,high -6990,52,high -6991,52,high -6992,52,high -7070,53,high -7071,53,high -7072,53,high -7080,53,high -7170,53,high -7180,53,high -7181,53,high -7190,53,high -7270,54,high -7280,54,high -7290,54,high -7370,54,high -7380,54,high -7390,54,high -7460,54,high -7470,54,high -7480,54,high -7490,54,high -7570,55,low -7580,56,low -7590,56,low -7670,56,low -7680,56,low -7690,56,low -7770,56,low -7780,56,low -7790,56,low -7860,61,low -7870,61,low -7880,61,low -7890,61,low -7970,62,low -7980,62,low -7990,62,low -8070,62,low -8080,62,low -8090,62,low -8170,62,low -8180,62,low -8190,62,low -8191,62,low -8192,62,low -8270,62,low -8290,62,low -8370,62,low -8380,62,low -8390,62,low -8470,62,low -8560,71,medium -8561,71,medium -8562,71,medium -8563,71,medium -8564,71,medium -8570,71,medium -8580,71,medium -8590,71,medium -8660,72,low -8670,72,low -8680,72,low -8690,72,low -8770,81,low -8780,81,low -8790,81,low -8870,81,low -8880,81,low -8891,81,low -8970,81,low -8980,81,low -8990,81,low -9070,81,low -9080,81,low -9090,81,low -9160,81,low -9170,81,low -9180,81,low -9190,81,low -9290,81,low -9370,92,medium -9380,92,medium -9390,92,medium -9470,92,medium -9480,92,medium -9490,92,medium -9570,92,medium -9590,92,medium -9670,92,medium -9680,92,medium -9690,92,medium -9770,92,medium -9780,92,medium -9790,92,medium -9870,92,medium +INDP,naics2 +170,11 +180,11 +190,11 +270,11 +280,11 +290,11 +370,21 +380,21 +390,21 +470,21 +490,21 +570,22 +580,22 +590,22 +670,22 +680,22 +690,22 +770,23 +1070,31-33 +1080,31-33 +1090,31-33 +1170,31-33 +1180,31-33 +1190,31-33 +1270,31-33 +1280,31-33 +1290,31-33 +1370,31-33 +1390,31-33 +1470,31-33 +1480,31-33 +1490,31-33 +1570,31-33 +1590,31-33 +1670,31-33 +1680,31-33 +1690,31-33 +1691,31-33 +1770,31-33 +1790,31-33 +1870,31-33 +1880,31-33 +1890,31-33 +1990,31-33 +2070,31-33 +2090,31-33 +2170,31-33 +2180,31-33 +2190,31-33 +2270,31-33 +2280,31-33 +2290,31-33 +2370,31-33 +2380,31-33 +2390,31-33 +2470,31-33 +2480,31-33 +2490,31-33 +2570,31-33 +2590,31-33 +2670,31-33 +2680,31-33 +2690,31-33 +2770,31-33 +2780,31-33 +2790,31-33 +2870,31-33 +2880,31-33 +2890,31-33 +2970,31-33 +2980,31-33 +2990,31-33 +3070,31-33 +3080,31-33 +3090,31-33 +3095,31-33 +3170,31-33 +3180,31-33 +3190,31-33 +3291,31-33 +3360,31-33 +3365,31-33 +3370,31-33 +3380,31-33 +3390,31-33 +3470,31-33 +3490,31-33 +3570,31-33 +3580,31-33 +3590,31-33 +3670,31-33 +3680,31-33 +3690,31-33 +3770,31-33 +3780,31-33 +3790,31-33 +3870,31-33 +3875,31-33 +3890,31-33 +3895,31-33 +3960,31-33 +3970,31-33 +3980,31-33 +3990,31-33 +4070,42 +4080,42 +4090,42 +4170,42 +4180,42 +4190,42 +4195,42 +4260,42 +4265,42 +4270,42 +4280,42 +4290,42 +4370,42 +4380,42 +4390,42 +4470,42 +4480,42 +4490,42 +4560,42 +4570,42 +4580,42 +4585,42 +4590,42 +4670,44-45 +4680,44-45 +4690,44-45 +4770,44-45 +4780,44-45 +4790,44-45 +4795,44-45 +4870,44-45 +4880,44-45 +4890,44-45 +4970,44-45 +4971,44-45 +4972,44-45 +4980,44-45 +4990,44-45 +5070,44-45 +5080,44-45 +5090,44-45 +5170,44-45 +5180,44-45 +5190,44-45 +5270,44-45 +5275,44-45 +5280,44-45 +5290,44-45 +5295,44-45 +5370,44-45 +5380,44-45 +5381,44-45 +5390,44-45 +5391,44-45 +5470,44-45 +5480,44-45 +5490,44-45 +5570,44-45 +5580,44-45 +5590,44-45 +5591,44-45 +5592,44-45 +5593,44-45 +5670,44-45 +5680,44-45 +5690,44-45 +5790,44-45 +6070,48-49 +6080,48-49 +6090,48-49 +6170,48-49 +6180,48-49 +6190,48-49 +6270,48-49 +6280,48-49 +6290,48-49 +6370,48-49 +6380,48-49 +6390,48-49 +6470,51 +6480,51 +6490,51 +6570,51 +6590,51 +6670,51 +6672,51 +6680,51 +6690,51 +6695,51 +6770,51 +6780,51 +6870,52 +6880,52 +6890,52 +6970,52 +6990,52 +6991,52 +6992,52 +7070,53 +7071,53 +7072,53 +7080,53 +7170,53 +7180,53 +7181,53 +7190,53 +7270,54 +7280,54 +7290,54 +7370,54 +7380,54 +7390,54 +7460,54 +7470,54 +7480,54 +7490,54 +7570,55 +7580,56 +7590,56 +7670,56 +7680,56 +7690,56 +7770,56 +7780,56 +7790,56 +7860,61 +7870,61 +7880,61 +7890,61 +7970,62 +7980,62 +7990,62 +8070,62 +8080,62 +8090,62 +8170,62 +8180,62 +8190,62 +8191,62 +8192,62 +8270,62 +8290,62 +8370,62 +8380,62 +8390,62 +8470,62 +8560,71 +8561,71 +8562,71 +8563,71 +8564,71 +8570,71 +8580,71 +8590,71 +8660,72 +8670,72 +8680,72 +8690,72 +8770,81 +8780,81 +8790,81 +8870,81 +8880,81 +8891,81 +8970,81 +8980,81 +8990,81 +9070,81 +9080,81 +9090,81 +9160,81 +9170,81 +9180,81 +9190,81 +9290,81 +9370,92 +9380,92 +9390,92 +9470,92 +9480,92 +9490,92 +9570,92 +9590,92 +9670,92 +9680,92 +9690,92 +9770,92 +9780,92 +9790,92 +9870,92 diff --git a/Database/tg/fortran/wfhmodule/wfhflag.py b/Database/tg/fortran/wfhmodule/wfhflag.py index ab59c34..95a8f02 100644 --- a/Database/tg/fortran/wfhmodule/wfhflag.py +++ b/Database/tg/fortran/wfhmodule/wfhflag.py @@ -3,8 +3,6 @@ # this flags tbm people as usualwfh or tc14 import pandas as pd import numpy as np -from pathlib import Path -import yaml import sys import os @@ -15,96 +13,328 @@ synpoppath = "synthetic_persons.zip" synhhpath = "synthetic_households.zip" popsynhhpath = savedir + "/POPSYN_HH.csv" +incdistpath = "incdist.csv" +indmixpath = "indusmix.csv" indpxwalkpath = "indp_naics.csv" -geoinpath = savedir + "/GEOG_IN.TXT" - -db = Path(__file__).resolve().parents[3] # database folder -with open(os.path.join(db, 'Telework.yaml')) as f: - lines_without_backslashes = ''.join([line.replace('\\','/') for line in f]) - wfh_data = yaml.safe_load(lines_without_backslashes) - -with open(os.path.join(db, 'batch_file.yaml')) as f: - lines_without_backslashes = ''.join([line.replace('\\','/') for line in f]) - batch_data = yaml.safe_load(lines_without_backslashes) - -# find and read config file -config_file = Path(__file__).resolve().parents[4].joinpath('Scripts','prepare', - 'conformity_scenario', - 'hand','config.yaml') -with open(config_file) as f: - config = yaml.safe_load(f) # save additional output files? savefiles = sys.argv[3] -# scenario code and year -scen_code = batch_data['scenario_code'] -real_year = config['scenario_years'][scen_code] - -# Assume decline_rate from 2026 to 2050, -decline_rate = wfh_data['declinerate'] - -# Based on year gap calculate the adjust rate from 2026 to scenaior year -scen_yr_adj_rate = 1 - (real_year-2026)/(2050-2026) * decline_rate -print('Telework decline rate applied: {0:.4f}'.format(scen_yr_adj_rate)) -wfhl = wfh_data['wfhpctlow'] * scen_yr_adj_rate -wfhm = wfh_data['wfhpctmedium'] * scen_yr_adj_rate -wfhh = wfh_data['wfhpcthigh'] * scen_yr_adj_rate - -# Combine to list for easy loop process -wfhpctlist = [wfhl, wfhm, wfhh] - -# Read income and eduction portion for different WFH rate group from YAML file -incdist_dict = wfh_data['inc'] -edudist_dict = wfh_data['edu'] +# major parameters - source: mdt + nirpc survey (which is higher than PUMS data...) +# percent of all workers +usualwfhpct = float(sys.argv[4]) +tc14pct = float(sys.argv[5]) # set seedvalue seedvalue = 2 np.random.seed(seed=seedvalue) +# place industries in one of two income distributions types +# high is based on industries that had >60% of workers in income group 4 +# low is based on other industries +lowlist = ['11', '21', '44-45', '48-49', '56', '61', '62', '71', '72', '81'] +highlist = ['22', '23', '31-33', '42', '51', '52', '53', '54', '55', '92'] + +# setup education weights for usualwfh (low to high) +eduw = [0.177, 0.246, 0.576] +# setup education weights for usualwfh (low to high, fine they don't sum to 1) +eduwtc = [0.049, 0.114, 0.720] + +# set distribution of tc14 into the 4 days +tcportions = [0.575, 0.254, 0.112, 0.059] + +print('setting up for wfhflag script...') # read in files dfpop = pd.read_csv(synpoppath) dfhh = pd.read_csv(synhhpath, dtype={'MV': object}) indpxwalk = pd.read_csv(indpxwalkpath) +indmix = pd.read_csv(indmixpath) +incdist = pd.read_csv(incdistpath) + +# industry mix - source: mdt + nirpc survey (rescaled after removing industries -7, -8, and 97 to sum to 1) +indmix1 = indmix[indmix['cat'] == 'usualwfh'][['indus', 'pct']] +indmix2 = indmix[indmix['cat'] == 'tc14'][['indus', 'pct']] -# merge income2, edu2, trc get workers +# merge naics2, income4, edu, get workers dfpop = dfpop.merge(indpxwalk, on='INDP', how='left') dfpop = dfpop.merge(dfhh[['household_id', 'HINCP19']], on='household_id', how='left') - -dfpop['inccat2'] = pd.cut(dfpop.HINCP19, bins=[-99999, 100000, 2000000], right=False, labels=[1, 2]) +dfpop['inccat4'] = pd.cut(dfpop.HINCP19, bins=[-99999, 30000, 60000, 100000, 2000000], right=False, labels=[1, 2, 3, 4]) workers = dfpop[dfpop['JWTR'] != 'bb'].copy() workers.JWTR = workers.JWTR.astype(float).astype(int) workers.SCHL = workers.SCHL.astype(float).astype(int) +workers.loc[workers.SCHL.isin([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]), 'edu'] = 1 +workers.loc[workers.SCHL.isin([18, 19, 20]), 'edu'] = 2 +workers.loc[workers.SCHL.isin([21, 22, 23, 24]), 'edu'] = 3 +workers.loc[:, 'selected'] = 0 -workers.loc[workers.SCHL.isin([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]), 'edu'] = 1 -workers.loc[workers.SCHL.isin([21, 22, 23, 24]), 'edu'] = 2 +# overall targets +targetwfh = round(len(workers) * usualwfhpct, 0) +targettc14 = round(len(workers) * tc14pct, 0) -workers.loc[:, 'selected'] = 0 workers = workers[workers['ESR'] != '4'] -def samplingworkers(df, wfhpctlist): +# functions +def portionout(df, pctcol, total, colname): + """ + divides up a total based on a percent column into a new column (no decimals) + :param df: input dataframe + :param pctcol: name of column that has percentages + :param total: can be name of column that has totals, or a numeric total that the percentages will be applied to + :param colname: the name of the result column + :return: dataframe with targetdec, targetint, decimal, and colname columns + """ df = df.copy() + indcounts = workers[workers.selected == 0].groupby('naics2').agg({'household_id':'count'}).reset_index() + indcounts.rename({'household_id':'sectortotal'}, axis=1, inplace=True) + + + if isinstance(total, int) or isinstance(total, float): + df['targetdec'] = df[pctcol] * total + + df2 = df.merge(indcounts, left_on='indus', right_on='naics2') + df2['testtot'] = df2['sectortotal'] - df2['targetdec'] + + if len(df2[df2.testtot < 0]) == 0: + pass + else: + # don't go all the way up to max to prevent same issue further down the line + df2.loc[df2.testtot < 0, 'newpct'] = (df2.sectortotal - 10) / total + df2.loc[df2.testtot < 0, 'pctdiff'] = df2[pctcol] - df2.newpct + todistribute = df2.pctdiff.sum() + # normalize unchanged pcts to one to distribute out the missing pct + newdenom = 1 - df2.loc[df2.testtot < 0][pctcol].sum() + df2.loc[df2.testtot >=0, 'pctfordist'] = df2[pctcol] / newdenom + df2.loc[df2.testtot >= 0, 'newpct'] = (df2.pctfordist * todistribute) + df2[pctcol] + df2[pctcol] = df2['newpct'] + df2['targetdec'] = df2[pctcol] * total + + df2['targetint'] = df2['targetdec'].astype('int') + df2['decimal'] = df2['targetdec'] - df2['targetint'] + leftover = total - df2['targetint'].sum() + df2.sort_values('decimal', ascending=False, inplace=True) + df2.reset_index(drop=True, inplace=True) + df2.loc[df2.index < leftover, 'targetint'] = df2.targetint + 1 + assert (total - df2.targetint.sum()) == 0, "Targets do not sum to total" + df2.rename({'targetint': colname}, axis=1, inplace=True) + return df2 + + elif isinstance(total, str): + df['targetdec'] = df[pctcol] * df[total] + + df2 = df.merge(indcounts, left_on='indus', right_on='naics2') + df2['testtot'] = df2['sectortotal'] - df2['targetdec'] + + if len(df2[df2.testtot < 0]) == 0: + pass + else: + df2.loc[df2.testtot < 0, 'newpct'] = (df2.sectortotal - 10) / df[total] + df2.loc[df2.testtot < 0, 'pctdiff'] = df2[pctcol] - df2.newpct + todistribute = df2.pctdiff.sum() + df2.loc[df2.testtot >= 0, 'newpct'] = df2[pctcol] * (1 + todistribute) + df2[pctcol] = df2['newpct'] + df2['targetdec'] = df2[pctcol] * df2[total] + + df2['targetint'] = df2['targetdec'].astype('int') + df2['decimal'] = df2['targetdec'] - df2['targetint'] + + totallist = [x for x in df2[total].unique()] + piecelist = [] + for i in totallist: + selection = df2[df2[total] == i].copy() + leftover = i - selection['targetint'].sum() + if leftover != 0: + selection.sort_values('decimal', ascending=False, inplace=True) + selection.reset_index(drop=True, inplace=True) + selection.loc[selection.index < leftover, 'targetint'] = selection.targetint + 1 + assert (i - selection.targetint.sum()) == 0, "Targets do not sum to total" + piecelist.append(selection) + df2 = pd.concat(piecelist) + df2.rename({'targetint': colname}, axis=1, inplace=True) + return df2 + + +def settargets(indmix, overalltarget): + """ + use portionout function to set industry/income targets for group of interest (usualwfh or tc14) + :param indmix: input df with distribution of people in group of interest into industries + :param overalltarget: total target value for people in group of interest + :return: + """ + indmixfinal = portionout(indmix, 'pct', overalltarget, 'indint') + + # income targets + indmixfinal.loc[indmixfinal['indus'].isin(lowlist), 'incdist'] = 'low' + indmixfinal.loc[indmixfinal['indus'].isin(highlist), 'incdist'] = 'high' + targets = indmixfinal[['indus', 'pct', 'indint', 'incdist']].merge(incdist, on='incdist', how='left') + finaltargets = portionout(targets, 'pct_y', 'indint', 'indincint') + finaltargets.reset_index(drop=True, inplace=True) + + return finaltargets - for idx, trc in enumerate(["low", "medium", "high"]): - filtered_df = df[df["trc"] == trc] - targetgrouptotal = int(len(filtered_df) * wfhpctlist[idx]) + +def jwtr11flag(targetdf, workerdf, flagvalue): + """ + flag workers in workerdf with jwtr11 with the flagvalue according to counts in targetdf + :param targetdf: guiding dataframe with targets values for each category + :param workerdf: worker df with selected flag column + :param flagvalue: the value to set the selected column to + :return:workerdf + """ + for i, row in targetdf.iterrows(): + ind = row['indus'] + inc4 = row['hhinc4'] + target = row['indincint'] + options = workerdf[(workerdf['naics2'] == ind) & (workerdf['selected'] == 0) & ( + workerdf['inccat4'] == inc4) & (workerdf['JWTR'] == 11)] + if len(options) > target: + ilist = [x for x in options.sample(target, random_state=seedvalue).index.values] + workerdf.loc[workerdf.index.isin(ilist), 'selected'] = flagvalue + else: + ilist2 = [x for x in options.index.values] + workerdf.loc[workerdf.index.isin(ilist2), 'selected'] = flagvalue + + return workerdf + + + +def preproundtwo(workerdf, flagvalue, eduweights, targets): + """ + prepare for roundtwo assignment by calculating numbers still needed and adding eduwgt column + :param workerdf: worker df with selected flag column + :param flagvalue: value in the 'selected' column to evaluate + :param eduweights: weights to apply based on edu field for use in sampling + :return: b, workerdf. b is the new guiding df that lists how many are still needed in each category + """ + result = workerdf[workerdf['selected'] == flagvalue].groupby(['naics2', 'inccat4']). \ + household_id.count().reset_index() + + # calculate number still needed in each category + comparison = targets.merge(result, left_on=['indus', 'hhinc4'], + right_on=['naics2', 'inccat4'], how='left').reset_index() + comparison.household_id.fillna(0, inplace=True) + comparison['needed'] = comparison['indincint'] - comparison['household_id'] + b = comparison[comparison['needed'] > 0] + workerdf = workerdf.merge(comparison[['indus', 'hhinc4', 'needed']], + left_on=['naics2', 'inccat4'], right_on=['indus', 'hhinc4'], how='left') + workerdf.loc[workerdf['edu'] == 1, 'eduwgt'] = eduweights[0] + workerdf.loc[workerdf['edu'] == 2, 'eduwgt'] = eduweights[1] + workerdf.loc[workerdf['edu'] == 3, 'eduwgt'] = eduweights[2] + + return b, workerdf + + +def roundtwo(dfb, workerdf, flagvalue): + """ + finish flagging workers to meet target values (outside of jwtr == 11) using eduwgt column + :param dfb: guiding dataframe with targets values for each category + :param workerdf: worker df with selected flag column + :param flagvalue: value to set 'selected' column to + :return: workerdf + """ + dolater = {} + + for i, row in dfb.iterrows(): + ind = row['indus'] + inc4 = row['hhinc4'] + target = int(row['needed']) + options = workerdf[(workerdf['naics2'] == ind) & (workerdf['selected'] == 0) & ( + workerdf['inccat4'] == inc4)] + + if len(options) >= target: + ilist = [x for x in options.sample(target, weights='eduwgt', random_state=seedvalue).index.values] + workerdf.loc[workerdf.index.isin(ilist), 'selected'] = flagvalue + elif len(options) < target: + dolater[i] = (ind,inc4,target) - for i in [1, 2]: - for e in [1, 2]: - inc_factor = incdist_dict[trc][i] - edu_factor = edudist_dict[trc][e] - targetwfhworkers = int(targetgrouptotal * inc_factor * edu_factor) - - sub_filtered_df = filtered_df[(filtered_df["inccat2"] == i) & (filtered_df["edu"] == e)] - if targetwfhworkers > 0 and len(sub_filtered_df) >= targetwfhworkers: - sample_idx = sub_filtered_df.sample(n=targetwfhworkers, random_state=2).index - df.loc[sample_idx, "selected"] = 1 # mark selected rows - - return df + + if len(dolater) > 0: + donow = pd.DataFrame.from_dict(dolater, orient='index', columns=['ind','inc','target']) + for i,row in donow.iterrows(): + ind = row['ind'] + inc4 = row['inc'] + target = int(row['target']) + options = workerdf[(workerdf['naics2'] == ind) & (workerdf['selected'] == 0) & ( + workerdf['inccat4'] == inc4)] + ilist = [x for x in options.index.values] + stillneed = target - len(ilist) + options2 = workerdf[(workerdf['naics2'] == ind) & (workerdf['selected'] == 0) & (workerdf.inccat4 != inc4)] + ilist.extend([x for x in options2.sample(stillneed).index.values]) + workerdf.loc[workerdf.index.isin(ilist), 'selected'] = flagvalue -workers = samplingworkers(workers, wfhpctlist) + return workerdf + + +########################################## +# part one: usualwfh +########################################## + +# industry targets +finaltargets1 = settargets(indmix1, targetwfh) + +print('selecting usualwfh from JWTR 11...') +# round one +workers = jwtr11flag(finaltargets1, workers, 1) + +# round two +b1, workers = preproundtwo(workers, 1, eduw, finaltargets1) + +print('selecting usualwfh from any...') +workers = roundtwo(b1, workers, 1) + +current = workers.selected.sum() +remaining = int(targetwfh - current) +print('checking overall usualwfh target met...') +assert remaining == 0, "overall usualwfh target not met" +workers = workers.drop(['indus', 'hhinc4', 'needed', 'eduwgt'], axis=1) + +########################################## +# part two: tc14 +########################################## + +# industry targets +finaltargets2 = settargets(indmix2, targettc14) + +print('selecting tc14 from JWTR 11...') +# round one +workers = jwtr11flag(finaltargets2, workers, 2) + +# round two +b2, workers = preproundtwo(workers, 2, eduwtc, finaltargets2) + +print('selecting tc14 from any...') +workers = roundtwo(b2, workers, 2) + +current = len(workers[workers['selected'] == 2]) +remaining = int(targettc14 - current) +print('checking overall tc14 target met...') +assert remaining == 0, "overall tc14 target not met" + +########################################## +# assign tc14 wfh status for given day +########################################## +print('assigning wfh status for tc14...') +workers['tc'] = 0 + +tc1 = targettc14 * tcportions[0] +tc2 = targettc14 * tcportions[1] +tc3 = targettc14 * tcportions[2] +tc4 = targettc14 * tcportions[3] + +count = 4 +for t in [tc4, tc3, tc2]: + options = workers[(workers['selected'] == 2) & (workers['tc'] == 0)] + it = int(t) + ilist = [x for x in options.sample(it, random_state=seedvalue).index.values] + workers.loc[workers.index.isin(ilist), 'tc'] = count + count -= 1 + +workers.loc[(workers['selected'] == 2) & (workers['tc'] == 0), 'tc'] = 1 + +workers['random'] = np.random.random(size=len(workers)) +workers.loc[(workers['selected'] == 2) & (workers['random'] < (workers['tc'] / 5)), 'working'] = 1 +workers.working.fillna(0, inplace=True) ########################################## # format and save @@ -113,10 +343,18 @@ def samplingworkers(df, wfhpctlist): popsynhh = pd.read_csv(popsynhhpath, names=['sz', 'hhtype', 'vehicles', 'serialno', 'stpuma5', 'rowcol', 'adults', 'workers', 'children', 'iq', 'age', 'hhvtype', 'income']) - -hhsummary = workers.groupby("household_id").agg(finalflag=("selected", lambda x: int(x.sum() > 0)),wfhworkers=("selected", "sum")).reset_index() - -final1 = dfhh[['household_id','SERIALNO']].merge(hhsummary[['household_id','finalflag','wfhworkers']],on='household_id', how='left') +workers.loc[workers['selected'] == 1, 'usualwfh'] = 1 +workers.loc[(workers['selected'] == 2) & (workers['working'] == 1), 'tc14'] = 1 +workers.loc[(workers['selected'] == 2) & (workers['working'] == 0), 'tc14nw'] = 1 +workers.usualwfh.fillna(0, inplace=True) +workers.tc14.fillna(0, inplace=True) +workers.tc14nw.fillna(0, inplace=True) +hhsummary = workers.groupby('household_id').agg({'usualwfh':'sum','tc14':'sum','tc14nw':'max'}).reset_index() +hhsummary['wfhworkers'] = hhsummary['tc14'] + hhsummary['usualwfh'] +hhsummary.loc[(hhsummary['tc14'] > 0) & (hhsummary['usualwfh'] > 0), 'finalflag'] = 1 +hhsummary.loc[(hhsummary['tc14'] > 0) & (hhsummary['usualwfh'] == 0), 'finalflag'] = 2 +hhsummary.loc[(hhsummary['tc14'] == 0) & (hhsummary['usualwfh'] > 0), 'finalflag'] = 1 +final1 = dfhh[['household_id','SERIALNO']].merge(hhsummary[['household_id','finalflag','wfhworkers','tc14nw']],on='household_id', how='left') final1.finalflag.fillna(0, inplace=True) try: final1['SERIALNO'] = final1['SERIALNO'].str.replace('HU','99') @@ -133,73 +371,11 @@ def samplingworkers(df, wfhpctlist): final1sort['diffcheck'] = final1sort['SERIALNO'] - final1sort['sn2'] assert (final1sort.diffcheck == 0).all(), "file not aligned with popsyn_hh" final1sort.wfhworkers.fillna(0, inplace=True) +final1sort.tc14nw.fillna(0, inplace=True) final1sort['finalflag'] = final1sort.finalflag.astype('int') final1sort['wfhworkers'] = final1sort.wfhworkers.astype('int') -final1sort[['SERIALNO', 'finalflag','wfhworkers']].to_csv(savedir + "/HH_WFH_STATUS.CSV", index=False, header=False) - -# Red GEO data get puma to county -pumacross = pd.read_csv(geoinpath, sep=",", usecols=[1, 2, 3, 4], names=["fips", "cnty_name", "state", "puma5"], header=None ) -pumacross = pumacross.drop_duplicates() -pumacross["puma5"] = pumacross["puma5"].astype(str) - -# Merge to new data prepare the county status -final2 = pd.merge(popsynhh, final1sort, left_index=True, right_index=True, how='inner') -final2['State'] = final2['stpuma5'].astype(str).str[0:2] -final2['PUMA'] = final2['stpuma5'].astype(str).str[2:] -final2['PUMA'] = final2['PUMA'].str.lstrip('0') -final2["PUMA"] = final2["PUMA"].astype(str) -final2_all = pd.merge(final2, pumacross, left_on="PUMA", right_on="puma5") - -# Convert children to numeric first -final2_all["children"] = pd.to_numeric(final2_all["children"], errors="coerce") -final2_all["wfhworkers"] = pd.to_numeric(final2_all["wfhworkers"], errors="coerce") - -# --- COUNTY MERGES & FILTERS --- -# Combine Boone + Winnebago → Winnebago-Boone -final2_all.loc[ - final2_all["cnty_name"].isin(["BOONE", "WINNEBAGO"]), "cnty_name" - ] = "WINNEBAGO-BOONE" - -# Combine Kane + Kendall → Kane-Kendall -final2_all.loc[ - final2_all["cnty_name"].isin(["KANE", "KENDALL"]), "cnty_name" - ] = "KANE-KENDALL" - -# Remove Lee + Ogle -final2_all = final2_all[~final2_all["cnty_name"].isin(["LEE", "OGLE"])] - -county_worker = final2_all.groupby(['State','cnty_name'])[['workers','wfhworkers']].sum().reset_index() - -county_worker.to_csv(savedir + "/PERSON_COUNTY_STATUS.CSV", index=False) - -# Now collapse 3+ into "3+" -final2_all["children"] = final2_all["children"].apply( - lambda x: "3+" if x >= 3 else x -) -final2_all["wfhworkers"] = final2_all["wfhworkers"].apply( - lambda x: "3+" if x >= 3 else x -) - -# Group and compute counts -hh_child_work = ( - final2_all - .groupby(['cnty_name','State','children','wfhworkers']) - .size() - .reset_index(name='HH') -) - -# Totals per county/state -hh_child_work['HH_county'] = ( - hh_child_work.groupby(['cnty_name','State'])['HH'] - .transform('sum') -) - -# Shares -hh_child_work['HH_county_share'] = ( - hh_child_work['HH'] / hh_child_work['HH_county'] -) - -hh_child_work.to_csv(savedir + "/HH_CHILD_WORK.CSV", index=False) +final1sort['tc14nw'] = final1sort.tc14nw.astype('int') +final1sort[['SERIALNO', 'finalflag','wfhworkers','tc14nw']].to_csv(savedir + "/HH_WFH_STATUS.CSV", index=False, header=False) ########################################## # save additional files @@ -207,4 +383,6 @@ def samplingworkers(df, wfhpctlist): if savefiles == "Y": print('saving additional files...') - workers.to_csv("workers.csv", index=False) \ No newline at end of file + workers.to_csv("workers.csv", index=False) + finaltargets1.to_csv("finaltargets_usualwfh.csv", index=False) + finaltargets2.to_csv("finaltargets_tc14.csv", index=False) \ No newline at end of file diff --git a/Database/tg/fortran/wfhmodule/wfhflag_base.py b/Database/tg/fortran/wfhmodule/wfhflag_base.py deleted file mode 100644 index edb7d40..0000000 --- a/Database/tg/fortran/wfhmodule/wfhflag_base.py +++ /dev/null @@ -1,393 +0,0 @@ -# coding=utf-8 - -# this flags tbm people as usualwfh or tc14 -import pandas as pd -import numpy as np -from pathlib import Path -import yaml -import sys -import os - -# pathways -savedir = sys.argv[2] -assert os.path.exists(savedir) == True, "savedir not valid" -os.chdir(sys.argv[1]) -synpoppath = "synthetic_persons.zip" -synhhpath = "synthetic_households.zip" -popsynhhpath = savedir + "/POPSYN_HH.csv" -incdistpath = "incdist.csv" -indmixpath = "indusmix.csv" -indpxwalkpath = "indp_naics.csv" -db = Path(__file__).resolve().parents[3] # database folder -with open(os.path.join(db, 'Telework.yaml')) as f: - lines_without_backslashes = ''.join([line.replace('\\','/') for line in f]) - wfh_data = yaml.safe_load(lines_without_backslashes) -# save additional output files? -savefiles = sys.argv[3] - -# major parameters - source: mdt + nirpc survey (which is higher than PUMS data...) -# Read WFH data from YAML file -usualwfhpct = wfh_data['usualwfhpct'] -tc14pct = wfh_data['tc14pct'] - -# set seedvalue -seedvalue = 2 -np.random.seed(seed=seedvalue) - -# place industries in one of two income distributions types -# high is based on industries that had >60% of workers in income group 4 -# low is based on other industries -lowlist = ['11', '21', '44-45', '48-49', '56', '61', '62', '71', '72', '81'] -highlist = ['22', '23', '31-33', '42', '51', '52', '53', '54', '55', '92'] - -# setup education weights for usualwfh (low to high) -eduw = [0.177, 0.246, 0.576] -# setup education weights for usualwfh (low to high, fine they don't sum to 1) -eduwtc = [0.049, 0.114, 0.720] - -# set distribution of tc14 into the 4 days -tcportions = [0.575, 0.254, 0.112, 0.059] - -print('setting up for wfhflag script...') -# read in files -dfpop = pd.read_csv(synpoppath) -dfhh = pd.read_csv(synhhpath, dtype={'MV': object}) -indpxwalk = pd.read_csv(indpxwalkpath) -indmix = pd.read_csv(indmixpath) -incdist = pd.read_csv(incdistpath) - -# industry mix - source: mdt + nirpc survey (rescaled after removing industries -7, -8, and 97 to sum to 1) -indmix1 = indmix[indmix['cat'] == 'usualwfh'][['indus', 'pct']] -indmix2 = indmix[indmix['cat'] == 'tc14'][['indus', 'pct']] - -# merge naics2, income4, edu, get workers -dfpop = dfpop.merge(indpxwalk, on='INDP', how='left') -dfpop = dfpop.merge(dfhh[['household_id', 'HINCP19']], on='household_id', how='left') -dfpop['inccat4'] = pd.cut(dfpop.HINCP19, bins=[-99999, 30000, 60000, 100000, 2000000], right=False, labels=[1, 2, 3, 4]) - -workers = dfpop[dfpop['JWTR'] != 'bb'].copy() -workers.JWTR = workers.JWTR.astype(float).astype(int) -workers.SCHL = workers.SCHL.astype(float).astype(int) -workers.loc[workers.SCHL.isin([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]), 'edu'] = 1 -workers.loc[workers.SCHL.isin([18, 19, 20]), 'edu'] = 2 -workers.loc[workers.SCHL.isin([21, 22, 23, 24]), 'edu'] = 3 -workers.loc[:, 'selected'] = 0 - -# overall targets -targetwfh = round(len(workers) * usualwfhpct, 0) -targettc14 = round(len(workers) * tc14pct, 0) - -workers = workers[workers['ESR'] != '4'] - -# functions -def portionout(df, pctcol, total, colname): - """ - divides up a total based on a percent column into a new column (no decimals) - :param df: input dataframe - :param pctcol: name of column that has percentages - :param total: can be name of column that has totals, or a numeric total that the percentages will be applied to - :param colname: the name of the result column - :return: dataframe with targetdec, targetint, decimal, and colname columns - """ - df = df.copy() - indcounts = workers[workers.selected == 0].groupby('naics2').agg({'household_id':'count'}).reset_index() - indcounts.rename({'household_id':'sectortotal'}, axis=1, inplace=True) - - - if isinstance(total, int) or isinstance(total, float): - df['targetdec'] = df[pctcol] * total - - df2 = df.merge(indcounts, left_on='indus', right_on='naics2') - df2['testtot'] = df2['sectortotal'] - df2['targetdec'] - - if len(df2[df2.testtot < 0]) == 0: - pass - else: - # don't go all the way up to max to prevent same issue further down the line - df2.loc[df2.testtot < 0, 'newpct'] = (df2.sectortotal - 10) / total - df2.loc[df2.testtot < 0, 'pctdiff'] = df2[pctcol] - df2.newpct - todistribute = df2.pctdiff.sum() - # normalize unchanged pcts to one to distribute out the missing pct - newdenom = 1 - df2.loc[df2.testtot < 0][pctcol].sum() - df2.loc[df2.testtot >=0, 'pctfordist'] = df2[pctcol] / newdenom - df2.loc[df2.testtot >= 0, 'newpct'] = (df2.pctfordist * todistribute) + df2[pctcol] - df2[pctcol] = df2['newpct'] - df2['targetdec'] = df2[pctcol] * total - - df2['targetint'] = df2['targetdec'].astype('int') - df2['decimal'] = df2['targetdec'] - df2['targetint'] - leftover = total - df2['targetint'].sum() - df2.sort_values('decimal', ascending=False, inplace=True) - df2.reset_index(drop=True, inplace=True) - df2.loc[df2.index < leftover, 'targetint'] = df2.targetint + 1 - assert (total - df2.targetint.sum()) == 0, "Targets do not sum to total" - df2.rename({'targetint': colname}, axis=1, inplace=True) - return df2 - - elif isinstance(total, str): - df['targetdec'] = df[pctcol] * df[total] - - df2 = df.merge(indcounts, left_on='indus', right_on='naics2') - df2['testtot'] = df2['sectortotal'] - df2['targetdec'] - - if len(df2[df2.testtot < 0]) == 0: - pass - else: - df2.loc[df2.testtot < 0, 'newpct'] = (df2.sectortotal - 10) / df[total] - df2.loc[df2.testtot < 0, 'pctdiff'] = df2[pctcol] - df2.newpct - todistribute = df2.pctdiff.sum() - df2.loc[df2.testtot >= 0, 'newpct'] = df2[pctcol] * (1 + todistribute) - df2[pctcol] = df2['newpct'] - df2['targetdec'] = df2[pctcol] * df2[total] - - df2['targetint'] = df2['targetdec'].astype('int') - df2['decimal'] = df2['targetdec'] - df2['targetint'] - - totallist = [x for x in df2[total].unique()] - piecelist = [] - for i in totallist: - selection = df2[df2[total] == i].copy() - leftover = i - selection['targetint'].sum() - if leftover != 0: - selection.sort_values('decimal', ascending=False, inplace=True) - selection.reset_index(drop=True, inplace=True) - selection.loc[selection.index < leftover, 'targetint'] = selection.targetint + 1 - assert (i - selection.targetint.sum()) == 0, "Targets do not sum to total" - piecelist.append(selection) - df2 = pd.concat(piecelist) - df2.rename({'targetint': colname}, axis=1, inplace=True) - return df2 - - -def settargets(indmix, overalltarget): - """ - use portionout function to set industry/income targets for group of interest (usualwfh or tc14) - :param indmix: input df with distribution of people in group of interest into industries - :param overalltarget: total target value for people in group of interest - :return: - """ - indmixfinal = portionout(indmix, 'pct', overalltarget, 'indint') - - # income targets - indmixfinal.loc[indmixfinal['indus'].isin(lowlist), 'incdist'] = 'low' - indmixfinal.loc[indmixfinal['indus'].isin(highlist), 'incdist'] = 'high' - targets = indmixfinal[['indus', 'pct', 'indint', 'incdist']].merge(incdist, on='incdist', how='left') - finaltargets = portionout(targets, 'pct_y', 'indint', 'indincint') - finaltargets.reset_index(drop=True, inplace=True) - - return finaltargets - - -def jwtr11flag(targetdf, workerdf, flagvalue): - """ - flag workers in workerdf with jwtr11 with the flagvalue according to counts in targetdf - :param targetdf: guiding dataframe with targets values for each category - :param workerdf: worker df with selected flag column - :param flagvalue: the value to set the selected column to - :return:workerdf - """ - for i, row in targetdf.iterrows(): - ind = row['indus'] - inc4 = row['hhinc4'] - target = row['indincint'] - options = workerdf[(workerdf['naics2'] == ind) & (workerdf['selected'] == 0) & ( - workerdf['inccat4'] == inc4) & (workerdf['JWTR'] == 11)] - if len(options) > target: - ilist = [x for x in options.sample(target, random_state=seedvalue).index.values] - workerdf.loc[workerdf.index.isin(ilist), 'selected'] = flagvalue - else: - ilist2 = [x for x in options.index.values] - workerdf.loc[workerdf.index.isin(ilist2), 'selected'] = flagvalue - - return workerdf - - - -def preproundtwo(workerdf, flagvalue, eduweights, targets): - """ - prepare for roundtwo assignment by calculating numbers still needed and adding eduwgt column - :param workerdf: worker df with selected flag column - :param flagvalue: value in the 'selected' column to evaluate - :param eduweights: weights to apply based on edu field for use in sampling - :return: b, workerdf. b is the new guiding df that lists how many are still needed in each category - """ - result = workerdf[workerdf['selected'] == flagvalue].groupby(['naics2', 'inccat4']). \ - household_id.count().reset_index() - - # calculate number still needed in each category - comparison = targets.merge(result, left_on=['indus', 'hhinc4'], - right_on=['naics2', 'inccat4'], how='left').reset_index() - comparison.household_id.fillna(0, inplace=True) - comparison['needed'] = comparison['indincint'] - comparison['household_id'] - b = comparison[comparison['needed'] > 0] - workerdf = workerdf.merge(comparison[['indus', 'hhinc4', 'needed']], - left_on=['naics2', 'inccat4'], right_on=['indus', 'hhinc4'], how='left') - workerdf.loc[workerdf['edu'] == 1, 'eduwgt'] = eduweights[0] - workerdf.loc[workerdf['edu'] == 2, 'eduwgt'] = eduweights[1] - workerdf.loc[workerdf['edu'] == 3, 'eduwgt'] = eduweights[2] - - return b, workerdf - - -def roundtwo(dfb, workerdf, flagvalue): - """ - finish flagging workers to meet target values (outside of jwtr == 11) using eduwgt column - :param dfb: guiding dataframe with targets values for each category - :param workerdf: worker df with selected flag column - :param flagvalue: value to set 'selected' column to - :return: workerdf - """ - dolater = {} - - for i, row in dfb.iterrows(): - ind = row['indus'] - inc4 = row['hhinc4'] - target = int(row['needed']) - options = workerdf[(workerdf['naics2'] == ind) & (workerdf['selected'] == 0) & ( - workerdf['inccat4'] == inc4)] - - if len(options) >= target: - ilist = [x for x in options.sample(target, weights='eduwgt', random_state=seedvalue).index.values] - workerdf.loc[workerdf.index.isin(ilist), 'selected'] = flagvalue - elif len(options) < target: - dolater[i] = (ind,inc4,target) - - - if len(dolater) > 0: - donow = pd.DataFrame.from_dict(dolater, orient='index', columns=['ind','inc','target']) - for i,row in donow.iterrows(): - ind = row['ind'] - inc4 = row['inc'] - target = int(row['target']) - options = workerdf[(workerdf['naics2'] == ind) & (workerdf['selected'] == 0) & ( - workerdf['inccat4'] == inc4)] - ilist = [x for x in options.index.values] - stillneed = target - len(ilist) - options2 = workerdf[(workerdf['naics2'] == ind) & (workerdf['selected'] == 0) & (workerdf.inccat4 != inc4)] - ilist.extend([x for x in options2.sample(stillneed).index.values]) - - workerdf.loc[workerdf.index.isin(ilist), 'selected'] = flagvalue - - return workerdf - - -########################################## -# part one: usualwfh -########################################## - -# industry targets -finaltargets1 = settargets(indmix1, targetwfh) - -print('selecting usualwfh from JWTR 11...') -# round one -workers = jwtr11flag(finaltargets1, workers, 1) - -# round two -b1, workers = preproundtwo(workers, 1, eduw, finaltargets1) - -print('selecting usualwfh from any...') -workers = roundtwo(b1, workers, 1) - -current = workers.selected.sum() -remaining = int(targetwfh - current) -print('checking overall usualwfh target met...') -assert remaining == 0, "overall usualwfh target not met" -workers = workers.drop(['indus', 'hhinc4', 'needed', 'eduwgt'], axis=1) - -########################################## -# part two: tc14 -########################################## - -# industry targets -finaltargets2 = settargets(indmix2, targettc14) - -print('selecting tc14 from JWTR 11...') -# round one -workers = jwtr11flag(finaltargets2, workers, 2) - -# round two -b2, workers = preproundtwo(workers, 2, eduwtc, finaltargets2) - -print('selecting tc14 from any...') -workers = roundtwo(b2, workers, 2) - -current = len(workers[workers['selected'] == 2]) -remaining = int(targettc14 - current) -print('checking overall tc14 target met...') -assert remaining == 0, "overall tc14 target not met" - -########################################## -# assign tc14 wfh status for given day -########################################## -print('assigning wfh status for tc14...') -workers['tc'] = 0 - -tc1 = targettc14 * tcportions[0] -tc2 = targettc14 * tcportions[1] -tc3 = targettc14 * tcportions[2] -tc4 = targettc14 * tcportions[3] - -count = 4 -for t in [tc4, tc3, tc2]: - options = workers[(workers['selected'] == 2) & (workers['tc'] == 0)] - it = int(t) - ilist = [x for x in options.sample(it, random_state=seedvalue).index.values] - workers.loc[workers.index.isin(ilist), 'tc'] = count - count -= 1 - -workers.loc[(workers['selected'] == 2) & (workers['tc'] == 0), 'tc'] = 1 - -workers['random'] = np.random.random(size=len(workers)) -workers.loc[(workers['selected'] == 2) & (workers['random'] < (workers['tc'] / 5)), 'working'] = 1 -workers.working.fillna(0, inplace=True) - -########################################## -# format and save -########################################## -print('preparing and saving HH_WFH_STATUS.csv...') -popsynhh = pd.read_csv(popsynhhpath, names=['sz', 'hhtype', 'vehicles', - 'serialno', 'stpuma5', 'rowcol', 'adults', 'workers', - 'children', 'iq', 'age', 'hhvtype', 'income']) -workers.loc[workers['selected'] == 1, 'usualwfh'] = 1 -workers.loc[(workers['selected'] == 2) & (workers['working'] == 1), 'tc14'] = 1 -workers.loc[(workers['selected'] == 2) & (workers['working'] == 0), 'tc14nw'] = 1 -workers.usualwfh.fillna(0, inplace=True) -workers.tc14.fillna(0, inplace=True) -workers.tc14nw.fillna(0, inplace=True) -hhsummary = workers.groupby('household_id').agg({'usualwfh':'sum','tc14':'sum','tc14nw':'max'}).reset_index() -hhsummary['wfhworkers'] = hhsummary['tc14'] + hhsummary['usualwfh'] -hhsummary.loc[(hhsummary['tc14'] > 0) & (hhsummary['usualwfh'] > 0), 'finalflag'] = 1 -hhsummary.loc[(hhsummary['tc14'] > 0) & (hhsummary['usualwfh'] == 0), 'finalflag'] = 2 -hhsummary.loc[(hhsummary['tc14'] == 0) & (hhsummary['usualwfh'] > 0), 'finalflag'] = 1 -final1 = dfhh[['household_id','SERIALNO']].merge(hhsummary[['household_id','finalflag','wfhworkers','tc14nw']],on='household_id', how='left') -final1.finalflag.fillna(0, inplace=True) -try: - final1['SERIALNO'] = final1['SERIALNO'].str.replace('HU','99') -except AttributeError: - pass -final1sort = final1.sort_values('SERIALNO').reset_index() - -pssort = popsynhh.sort_values('serialno').reset_index() -final1sort['newindex'] = pssort['index'] -final1sort['sn2'] = pssort['serialno'] -final1sort.sort_values('newindex', inplace=True) -final1sort.set_index('newindex', inplace=True) -final1sort['SERIALNO'] = final1sort.SERIALNO.astype('int64') -final1sort['diffcheck'] = final1sort['SERIALNO'] - final1sort['sn2'] -assert (final1sort.diffcheck == 0).all(), "file not aligned with popsyn_hh" -final1sort.wfhworkers.fillna(0, inplace=True) -final1sort.tc14nw.fillna(0, inplace=True) -final1sort['finalflag'] = final1sort.finalflag.astype('int') -final1sort['wfhworkers'] = final1sort.wfhworkers.astype('int') -final1sort['tc14nw'] = final1sort.tc14nw.astype('int') -final1sort[['SERIALNO', 'finalflag','wfhworkers','tc14nw']].to_csv(savedir + "/HH_WFH_STATUS.CSV", index=False, header=False) - -########################################## -# save additional files -########################################## - -if savefiles == "Y": - print('saving additional files...') - workers.to_csv("workers.csv", index=False) - finaltargets1.to_csv("finaltargets_usualwfh.csv", index=False) - finaltargets2.to_csv("finaltargets_tc14.csv", index=False) \ No newline at end of file diff --git a/Database/tg/scripts/summarize_tg_results.py b/Database/tg/scripts/summarize_tg_results.py index 5bbdce7..da062db 100644 --- a/Database/tg/scripts/summarize_tg_results.py +++ b/Database/tg/scripts/summarize_tg_results.py @@ -1,6 +1,6 @@ """ summarize_tg_results.py -06/12/2025 +05/22/2020 N. Ferguson Reads data files from the trip generation model and creates a dataset @@ -8,7 +8,6 @@ Revision history ---------------- -06/12/2025 Heither: revised line 103 to identify correct columns in new file layout 05/22/2020 Ferguson: Adapted from summary_tg_results_popsyn.sas. 08/13/2020 Ferguson: Corrected error in P-A to O-D format conversion affecting non-home attractions. @@ -101,7 +100,7 @@ labels_bin = {'1': 'yes', '0': 'no'} # Households -hh = pd.read_csv(pth_hh, header=None, usecols=[0, 12, 13]) +hh = pd.read_csv(pth_hh, header=None, usecols=[0, 34, 35]) hh.columns = ['subzone17', 'wrkautoms', 'sdwlkidx'] labels_hh = dict( subzone17 = 'subzone', @@ -180,7 +179,7 @@ widths=[6, 6, 2, 9, 9], names=['subzone17', 'zone17', 'trip_type', 'hh_prods', 'hh_attrs'] ) -trip = pd.concat([not_wfh_trip, wfh_trip], ignore_index=True) +trip = not_wfh_trip.append(wfh_trip) trip = trip.groupby(['subzone17', 'zone17', 'trip_type']).sum().reset_index() # Calculate TAZ median household income diff --git a/Database/tg/scripts/urbansim_hcv_allocation.py b/Database/tg/scripts/urbansim_hcv_allocation.py index c79e1c2..c38d084 100644 --- a/Database/tg/scripts/urbansim_hcv_allocation.py +++ b/Database/tg/scripts/urbansim_hcv_allocation.py @@ -1,20 +1,15 @@ ''' ##################################################################################### URBANSIM_HCV_ALLOCATION.PY - Craig Heither, rev. 07-21-2025 - Karly Cazzato, rev. 01-21-2026 - - Script reads subzone employment by NAICS from UrbanSim files and uses it to develop - allocation weights for heavy commercial vehicle trips. NAICS-level employment - is paired with trips/employee by NAICS estimates and weighted by the zonal share - of 2020 building squarefeet. If no buildings exist in the zone in 2020 then a county average - zonal share of building sqft is applied to ensure future employment in the zones is - considered. External zones were assigned a zonal share of building sqft based on - an internal zone with a similar trip truck generation rate based on the ATRI - calibration dataset. These weighted values are then scaled up to realistic trip volumes. - A file of estimated 2018 truck trips from rail intermodal facilities is also included to - address a gap in the methodology. This ensures the allocation is consistent with the - forecast growth in HCV-dependent land uses. + Craig Heither, rev. 03-28-2022 + + Script reads the scenario buildings file from UrbanSim and uses it to develop + allocation weights for heavy commercial vehicle trips. For the external area, + subzone employment by NAICS is used (along with sqft per worker and truck trip + rates) to develop heavy truck trips. A file of estimated 2018 truck trips from + rail intermodal facilities is also included to address a gap in the methodology. + This ensures the allocation is consistent with the forecast growth in HCV-dependent + land uses. ##################################################################################### ''' @@ -24,104 +19,106 @@ # ---------------------------------------------------------------------------- import os, pandas as pd, csv import fnmatch ##-- filter files in directory -import numpy as np + cmapSubzone = 16426 ##-- maximum internal CMAP subzone -maxZone = 2926 -total_wgt = 564043.02617679 # From ATRI calibration dataset, total weight value for all internal and external truck trips; used to scale final weights to realistic value so intermodal can be added in - + + # ---------------------------------------------------------------------------- # Input files. # ---------------------------------------------------------------------------- USpth ="..\\UrbanSim_inputs" ## -- create a list of the UrbanSim files to be processed -- ## -d1 = fnmatch.filter(os.listdir(USpth), '*subzonetm*') ##-- subzone files +d1 = fnmatch.filter(os.listdir(USpth), '*buildings*') ##-- 7 county +d2 = fnmatch.filter(os.listdir(USpth), '*xsubzonetm*') ##-- external area +dirListing = d1 + d2 newFiles = [] -for item in d1: +for item in dirListing: newFiles.append(USpth+"\\"+item) # geog = "..\\fortran\\GEOG_IN.TXT" +# +rates = "..\\..\\data\\hcv_tg_rates.txt" ##-- heavy truck trip rates +corresp = "..\\..\\data\\hcv_building_naics_corresp.csv" ##-- NAICS-building type correspondence +jobsqft = "..\\..\\data\\hcv_sqft_per_job.csv" ##-- average square feet per job imx = "..\\..\\data\\hcv_intermodal.csv" ##-- estimate of 2018 truck trips for intermodal facilities -in_naicsRates = "..\\..\\data\\tg_rates.csv" ##-- estimated trips/employee by NAICS code -in_build_props = "..\\..\\data\\land_use_proportions.csv" ##-- proportion of building sqft in zone of all building sqft in CMAP region + # ---------------------------------------------------------------------------- # Output files. # ---------------------------------------------------------------------------- +chk2 = "..\\..\\data\\chk2.csv" mo20 = "..\\..\\data\\mo20.txt" -print("Subzone files: {0}".format(newFiles)) +print("Building files: {0}".format(newFiles)) + # ---------------------------------------------------------------------------- -# Read subzone employment, geographic correspondence and truck trip rates. +# Calculate allocation weights for CMAP 7 counties. # ---------------------------------------------------------------------------- +## -- Start with CMAP 7-county buildings -- ## +bldg1 = pd.read_csv(newFiles[0], sep=',') ##-- CMAP buildings +print(" --> CMAP Buildings: {0}".format(bldg1.shape[0])) +test = bldg1[bldg1['subzone_id'] < 5] +##test.to_csv(chk1,index=False) + ## -- Read in GEOG_IN to attach Zones -- ## geo = pd.read_csv(geog, sep=',', header=None, usecols=[0, 5]) geo.columns=['subzone_id','zone'] print(" --> GEOG_IN subzone summary Rows: {0}".format(geo.shape[0])) + +## -- Read in truck trip rates file -- ## +rate = pd.read_csv(rates, sep=',') +rate.to_csv(chk2,index=False) +bldg1 = bldg1.merge(geo, how='left', on='subzone_id', copy=False) +bldg1 = bldg1.merge(rate, how='left', on='building_type_id', copy=False) # -## -- Read in trips/employee by NAICS -- ## -naicsRates = pd.read_csv(in_naicsRates, sep=',') +## -- Calculate HCV allocation weights -- ## +bldg1['hcvWgt'] = bldg1['non_residential_sqft'] * bldg1['hcv_rate'] / 1000 ##-- rates per 1000 sqft +hcv1 = bldg1.groupby(['zone']).agg({'hcvWgt': 'sum'}).round(4).reset_index() + + +# ---------------------------------------------------------------------------- +# Calculate allocation weights for external area. +# ---------------------------------------------------------------------------- +extern = pd.read_csv(newFiles[1], usecols=['subzone_id','num_jobs_sector_11','num_jobs_sector_21','num_jobs_sector_22','num_jobs_sector_23', + 'num_jobs_sector_31','num_jobs_sector_42','num_jobs_sector_44','num_jobs_sector_48','num_jobs_sector_51','num_jobs_sector_52','num_jobs_sector_53', + 'num_jobs_sector_54','num_jobs_sector_55','num_jobs_sector_56','num_jobs_sector_61','num_jobs_sector_62','num_jobs_sector_71','num_jobs_sector_72', + 'num_jobs_sector_81','num_jobs_sector_92'], sep=',') ##-- external subzones +ext1 = extern[extern['subzone_id'] > cmapSubzone] ##-- Ensure only external subzones +print(" --> External subzone summary Rows: {0}".format(ext1.shape[0])) +## -- Convert from wide to long -- ## +external = pd.melt(ext1, id_vars='subzone_id') +external['NAICS1'] = external['variable'].str[-2:].astype(int) ##-- extract NAICS code # -## -- Read in zonal share of building sqft -- ## -landUse = pd.read_csv(in_build_props, sep=',') +## -- Attach likely building types to NAICS employment (Cartesian join)-- ## +bldgType = pd.read_csv(corresp, usecols=['building_type_id', 'NAICS'], sep=',') +externalCart = external.merge(bldgType, how='cross') +external = externalCart[externalCart['NAICS1'] == externalCart['NAICS']] ##-- keep only true NAICS matches +print(" --> External subzone summary Rows after building types attached: {0}".format(external.shape[0])) # -intmod = pd.read_csv(imx, usecols=['zone','hcvWgt'], sep=',') -# +## -- Calculate square feet by industry for each subzone -- ## +jbsqft = pd.read_csv(jobsqft, usecols=['building_type_id', 'building_sqft_per_job'], sep=',') +external = external.merge(jbsqft, how='left', on='building_type_id', copy=False) +external['non_residential_sqft'] = external['building_sqft_per_job'] * external['value'] # -## -- Read in subzone employment -- ## -goodCols = ['subzone_id','num_jobs_sector_11','num_jobs_sector_21','num_jobs_sector_22','num_jobs_sector_23', - 'num_jobs_sector_31','num_jobs_sector_42','num_jobs_sector_44','num_jobs_sector_48','num_jobs_sector_51','num_jobs_sector_52','num_jobs_sector_53', - 'num_jobs_sector_54','num_jobs_sector_55','num_jobs_sector_56','num_jobs_sector_61','num_jobs_sector_62','num_jobs_sector_71','num_jobs_sector_72', - 'num_jobs_sector_81','num_jobs_sector_92'] -cmap = pd.read_csv(newFiles[0], usecols=goodCols, sep=',') ##-- CMAP 7-county subzones -cmap = cmap[cmap.subzone_id.le(cmapSubzone)] ##-- ensure only CMAP 7-county subzones -print(" --> CMAP subzones: {0:,}".format(cmap.shape[0])) -print(' --> QC: CMAP subzone id is unique: {0}'.format(cmap.subzone_id.is_unique)) +## -- Use NAICS-building type correspondence file to determine average truck trip rate per industry -- ## +external = external.merge(rate, how='left', on='building_type_id', copy=False) +external['hcvWgt'] = external['non_residential_sqft'] * external['hcv_rate'] / 1000 ##-- rates per 1000 sqft # -extern = pd.read_csv(newFiles[1], usecols=goodCols, sep=',') ##-- external subzones -extern = extern[extern.subzone_id.gt(cmapSubzone)] ##-- Ensure only external subzones -print(" --> External subzones: {0:,}".format(extern.shape[0])) -print(' --> QC: External subzone id is unique: {0}'.format(extern.subzone_id.is_unique)) -sz = pd.concat([cmap,extern], ignore_index=True, sort=False) -print(" --> Total subzones: {0:,}".format(sz.shape[0])) -print(' --> QC: subzone id is unique: {0}'.format(sz.subzone_id.is_unique)) - +## -- We do not know what the actual building types are so use the average trip rate per subzone-NAICS combination to estimate -- ## +hcv2a = external.groupby(['subzone_id','NAICS']).agg({'hcvWgt': 'mean'}).round(4).reset_index() # -# ---------------------------------------------------------------------------- -# Calculate allocation weights for internal and external area. -# ---------------------------------------------------------------------------- -emp = pd.melt(sz, id_vars='subzone_id') -emp['NAICS'] = emp['variable'].str[-2:].astype(int) ##-- extract NAICS code +## -- Now calculate zonal values -- ## +hcv2a = hcv2a.merge(geo, how='left', on='subzone_id', copy=False) +hcv2 = hcv2a.groupby(['zone']).agg({'hcvWgt': 'sum'}).round(4).reset_index() -# Merge subzones with zone crosswalk -internal = emp.merge(geo, how='left', on='subzone_id', copy=False) - -# Aggregate employment by NAICS to zone level -zn_internal=internal.groupby(['zone', 'NAICS']).agg({'value': 'sum'}).reset_index() - -# Apply trips/employee rates by NAICS -naics_emp = zn_internal.merge(naicsRates, how='left', on=['NAICS']) -naics_emp['hcvWgt_1']=naics_emp['trips_emp']*naics_emp['value'].round(4) - -# Apply land use adjustment -naics_emp=naics_emp.merge(landUse, how='left', left_on='zone', right_on='zone17') -naics_emp['propArea'] = np.where(naics_emp['propArea'].isnull(), naics_emp['propArea'].min(), naics_emp['propArea']) -naics_emp['hcvWgt_o']=naics_emp['hcvWgt_1']*naics_emp['propArea'] -naics_emp=naics_emp[['zone', 'NAICS', 'value', 'hcvWgt_o']].copy() - -# Find shares of developed weights, and apply to total weight to find adjusted weight -naics_emp['total'] = naics_emp['hcvWgt_o'].sum() -naics_emp['prop'] = naics_emp['hcvWgt_o']/naics_emp['total'] -naics_emp['hcvWgt'] = naics_emp['prop'] *total_wgt - -zn_wt = naics_emp[['zone', 'hcvWgt']].copy() -zn_wt = zn_wt.groupby(['zone']).agg({'hcvWgt': 'sum'}).round(4).reset_index() # ---------------------------------------------------------------------------- # Create allocation weight file. # ---------------------------------------------------------------------------- ## -- Add estimate of truck trips for intermodal facilities since building sqft won't quite cover these -- ## -a = pd.concat([intmod, zn_wt]) +intmod = pd.read_csv(imx, usecols=['zone','hcvWgt'], sep=',') +a = pd.concat([hcv1,hcv2,intmod]) hcv = a.groupby(['zone']).agg({'hcvWgt': 'sum'}).round(4).reset_index() # ## -- Create a template with all zones -- ## @@ -139,6 +136,7 @@ geo1['a1'] = 'all:' geo1.sort_values(by=['zone'], inplace=True) +##geo1.to_csv(chk2,index=False) f = open(mo20,'w') print("t matrices \nd matrix=mo20 \na matrix=mo20 htrkseed 0 heavy truck allocation seed matrix", file=f) diff --git a/Database/tg/scripts/urbansim_skims.py b/Database/tg/scripts/urbansim_skims.py index c8c22f2..18afed8 100644 --- a/Database/tg/scripts/urbansim_skims.py +++ b/Database/tg/scripts/urbansim_skims.py @@ -14,15 +14,13 @@ # ---------------------------------------------------------------------------- import os, numpy as np, pandas as pd -cwd = os.getcwd() +hwyTime = os.getcwd() + "\\emmemat\\mf44.emx" ## -- Congested highway skim time +tranTime = os.getcwd() + "\\emmemat\\mf822.emx" ## -- Indexed peak in-vehicle minutes +tranXfer = os.getcwd() + "\\emmemat\\mf823.emx" ## -- Indexed peak walk transfer minutes +tranWait = os.getcwd() + "\\emmemat\\mf824.emx" ## -- Indexed wait time minutes -hwyTime = cwd + "\\emmemat\\mf44.emx" ## -- Congested highway skim time -tranTime = cwd + "\\emmemat\\mf822.emx" ## -- Indexed peak in-vehicle minutes -tranXfer = cwd + "\\emmemat\\mf823.emx" ## -- Indexed peak walk transfer minutes -tranWait = cwd + "\\emmemat\\mf824.emx" ## -- Indexed wait time minutes - -outFolder = cwd + "\\data\\UrbanSim_skims" ## -- output folder for skims -outFile = outFolder + "\\skims.parquet" +outFolder = os.getcwd() + "\\data\\UrbanSim_skims" ## -- output folder for skims +outFile = outFolder + "\\skims.csv" maxZone = 3649 ## -- maximum zone number maxInternal = 3632 ## -- maximum non-POE zone @@ -69,18 +67,4 @@ skims['am_peak_transit_time'] = skims['InVehicle'] + skims['Walk_time'] + skims['Wait_time'] skims['am_peak_transit_time'] = np.where(skims['am_peak_transit_time'] > 1000.0, 1000000.0, skims['am_peak_transit_time']) ##-- replace 1.00E20 with 1000000 to show no transit path exists skims = skims.round({'am_peak_travel_time': 2, 'am_peak_transit_time': 2}) - -# skims.to_csv(outFile, columns=['from_zone_id','to_zone_id','am_peak_travel_time','am_peak_transit_time'], index=False) - -#NEW in 2026: set from/to as index, rename columns, then write as parquet instead of csv -skims.rename( - columns={ - 'am_peak_travel_time': 'travel_time_sov', - 'am_peak_transit_time': 'travel_time_transit' - }, - inplace=True -) - -skims.set_index(['from_zone_id', 'to_zone_id'], inplace=True) - -skims[['travel_time_sov', 'travel_time_transit']].to_parquet(outFile) \ No newline at end of file +skims.to_csv(outFile, columns=['from_zone_id','to_zone_id','am_peak_travel_time','am_peak_transit_time'], index=False) diff --git a/Database/tg/scripts/urbansim_update_tg_input_files.py b/Database/tg/scripts/urbansim_update_tg_input_files.py index da124fa..5f44631 100644 --- a/Database/tg/scripts/urbansim_update_tg_input_files.py +++ b/Database/tg/scripts/urbansim_update_tg_input_files.py @@ -1,419 +1,237 @@ ''' -######################################################################################################## +##################################################################################### URBANSIM_UPDATE_TG_INPUT_FILES.PY - Craig Heither, rev. 01-31-2026 + Craig Heither, rev. 01-11-2022 Script reads output files from UrbanSim and uses the data to create new versions - of ATTR_IN.TXT, HH_IN.TXT, GQ_IN.TXT and POPSYN_HH.CSV that the Trip Generation - model will use. + of ATTR_IN.TXT, HH_IN.TXT and POPSYN_HH.CSV that the Trip Generation model will + use. - Additonal data cleanup steps for 2026 LRTP: - - if necessary, set household_id to unique values across the CMAP & external files - - if necessary, remove persons from the files that are not in households in the household files - - if necessary, updates hhtype and hhvtype for households with no report_fileadults - -######################################################################################################## +##################################################################################### ''' # ---------------------------------------------------------------------------- # Import System Modules and Set Variables. # ---------------------------------------------------------------------------- -import os -import pandas as pd -import numpy as np -import zipfile ##-- to write zip objects -import fnmatch ##-- filter files in directory -import yaml -import math -from pathlib import Path +import os, pandas as pd +import zipfile ##-- to write zip objects +import fnmatch ##-- filter files in directory -with open(Path.cwd().parent.parent.joinpath('batch_file.yaml')) as f: - lines_without_backslashes = ''.join([line.replace('\\','/') for line in f]) - config = yaml.safe_load(lines_without_backslashes) - -puma = config['pumaVersion'] -print("PUMA version: {0}".format(puma)) - -cmapSubzone = 16426 ##-- maximum internal CMAP subzone +cmapSubzone = 16426 ##-- maximum internal CMAP subzone +dollar2010 = 0.855 ##-- CPI value to convert 2019 dollars from UrbanSim to 2010 [https://www.bls.gov/data/inflation_calculator.htm] + ##-- (not used for new trip-based model) # ---------------------------------------------------------------------------- # Input files. # ---------------------------------------------------------------------------- -UrbanSim_path = Path(__file__).resolve().parents[1].joinpath('UrbanSim_inputs') +USpth ="..\\UrbanSim_inputs" +rptFile =USpth + "\\UrbansSim_file_report.TXT" # -fortran_path = Path(__file__).resolve().parents[1].joinpath('fortran') -hhtypeCat_file = fortran_path / 'tg_hhtype_lookup.csv' -hhvtypeCat_file = fortran_path / 'tg_hhvtype_lookup.csv' -geog_file = fortran_path / 'GEOG_IN.TXT' -sz_data = fortran_path / 'subzone_tg_data.txt' - -# ---------------------------------------------------------------------------- -# Output files. -# ---------------------------------------------------------------------------- -noHHID_file = fortran_path / 'persons_missing_HHID_CMAP.csv' -noHHIDext_file = fortran_path / 'persons_missing_HHID_External.csv' -noHHIDany_file = fortran_path / 'persons_missing_HHID.csv' -noHHTYPE_file = fortran_path / 'missing_hhtype.csv' -attr_file = fortran_path / 'ATTR_IN.TXT' -hh_file = fortran_path / 'HH_IN.TXT' -gq_file = fortran_path / 'GQ_IN.TXT' -popsyn_file = fortran_path / 'POPSYN_HH.CSV' +pth2 = "..\\fortran" +attr = pth2 + "\\ATTR_IN.TXT" +hh = pth2 + "\\HH_IN.TXT" +popsyn = pth2 + "\\POPSYN_HH.CSV" +noHH = pth2 + "\\persons_missing_HHID_CMAP.CSV" +noHH2 = pth2 + "\\persons_missing_HHID_External.CSV" +noHH3 = pth2 + "\\persons_missing_HHID.CSV" +# -- files renamed +attr_r = pth2 + "\\ATTR_INr.TXT" +hh_r = pth2 + "\\HH_INr.TXT" +popsyn_r = pth2 + "\\POPSYN_HHr.CSV" # -wfh_path = Path(__file__).resolve().parents[1].joinpath('fortran','wfhmodule') -hhZip_file = wfh_path / 'synthetic_households.zip' -temp1_file = wfh_path / 'synthetic_households.csv' -perZip_file = wfh_path / 'synthetic_persons.zip' -temp2_file = wfh_path / 'synthetic_persons.csv' +geog = pth2 + "\\GEOG_IN.TXT" # -report_file = UrbanSim_path / 'UrbansSim_file_report.txt' +pth3 = "..\\fortran\\wfhmodule\\" +hhZip = pth3 + "\\synthetic_households.zip" +temp1 = pth3 + "synthetic_households.csv" +perZip = pth3 + "\\synthetic_persons.zip" +temp2 = pth3 + "synthetic_persons.csv" + # ---------------------------------------------------------------------------- # Get the UrbanSim input file names. # ---------------------------------------------------------------------------- ## -- create a list of the UrbanSim files to be processed -- ## -d1 = fnmatch.filter(os.listdir(UrbanSim_path), '*hhtm*') -d2 = fnmatch.filter(os.listdir(UrbanSim_path), '*persons*') -d3 = fnmatch.filter(os.listdir(UrbanSim_path), '*subzone*') +d1 = fnmatch.filter(os.listdir(USpth), '*hhtm*') +d2 = fnmatch.filter(os.listdir(USpth), '*persons*') +d3 = fnmatch.filter(os.listdir(USpth), '*subzone*') dirListing = d1 + d2 + d3 -if os.path.exists(report_file): - os.remove(report_file) +if os.path.exists(rptFile): + os.remove(rptFile) newFiles = [] for item in dirListing: - newFiles.append(UrbanSim_path / item) + newFiles.append(USpth+"\\"+item) + +print("{0} {1} {2} {3} {4} {5} \n".format(newFiles[0], newFiles[1], newFiles[2], newFiles[3], newFiles[4], newFiles[5])) -print("{0} \n{1} \n{2} \n{3} \n{4} \n{5} \n".format(newFiles[0], newFiles[1], newFiles[2], - newFiles[3], newFiles[4], newFiles[5])) # ---------------------------------------------------------------------------- # Rename existing TG files prior to update. # ---------------------------------------------------------------------------- -if os.path.exists(hhZip_file): - os.remove(hhZip_file) -if os.path.exists(perZip_file): - os.remove(perZip_file) +origFiles = (attr, hh, popsyn) +renamedFiles = (attr_r, hh_r, popsyn_r) +x = 0 +for f in origFiles: + if os.path.exists(renamedFiles[x]): + os.remove(renamedFiles[x]) + os.rename(origFiles[x],renamedFiles[x]) + x += 1 + +if os.path.exists(hhZip): + os.remove(hhZip) +if os.path.exists(perZip): + os.remove(perZip) + # ---------------------------------------------------------------------------- # Read in the UrbanSim household files. # ---------------------------------------------------------------------------- ## -- HH files are 0 & 1, Person files are 2 & 3, Subzone files are 4 & 5 -hh1 = pd.read_csv(newFiles[0], sep=',') ##-- CMAP households -##hh1 = hh1[hh1.subzone_id.le(cmapSubzone)] ##-- limit to CMAP 7-county subzones -print(" --> CMAP Households: {0:,}".format(hh1.shape[0])) -print(' --> QC: Household id is unique: {0}'.format(hh1.household_id.is_unique)) -print(' --> QC: CMAP household_id Minimum = {0:,}, Maximum = {1:,}'.format( - hh1['household_id'].min(), hh1['household_id'].max())) -print(' --> QC: CMAP subzone_ID Minimum = {0:,}, Maximum = {1:,}'.format( - hh1['subzone_id'].min(), hh1['subzone_id'].max())) -# -hh2=pd.read_csv(newFiles[1], sep=',') ##-- external households -##hh2 = hh2[hh2.subzone_id.gt(cmapSubzone)] ##-- limit to external subzones -print(" --> External Households: {0:,}".format(hh2.shape[0])) -print(' --> QC: Household id is unique: {0}'.format(hh2.household_id.is_unique)) -print(' --> QC: External household_id Minimum = {0:,}, Maximum = {1:,}'.format( - hh2['household_id'].min(), hh2['household_id'].max())) -print(' --> QC: External subzone_ID Minimum = {0:,}, Maximum = {1:,}'.format( - hh2['subzone_id'].min(), hh2['subzone_id'].max())) - -## -- Read in Person files and remove persons not in households in the modeling area -- ## -per1 = pd.read_csv(newFiles[2], sep=',') ##-- CMAP persons -print(" --> CMAP Persons in households: {0:,}".format(per1.shape[0])) -inRegion = hh1[['household_id','subzone_id']].copy() -per1 = per1.merge(inRegion, how='left', on='household_id', copy=False) -##per1 = per1[per1.subzone_id.gt(0)] -print(' --> QC: CMAP household_id Minimum = {0:,}, Maximum = {1:,}'.format( - per1['household_id'].min(), per1['household_id'].max())) -print(' --> QC: CMAP subzone_ID Minimum = {0:,}, Maximum = {1:,}'.format( - per1['subzone_id'].min(), per1['subzone_id'].max())) -print(" --> Confirmed CMAP Persons in households: {0:,}".format(per1.shape[0])) -# -per2 = pd.read_csv(newFiles[3], sep=',') ##-- external persons -print(" --> External Persons in households: {0:,}".format(per2.shape[0])) -inExternal = hh2[['household_id','subzone_id']].copy() -per2 = per2.merge(inExternal, how='left', on='household_id', copy=False) -##per2 = per2[per2.subzone_id.gt(0)] -print(' --> QC: External household_id Minimum = {0:,}, Maximum = {1:,}'.format( - per2['household_id'].min(), per2['household_id'].max())) -print(' --> QC: External subzone_ID Minimum = {0:,}, Maximum = {1:,}'.format( - per2['subzone_id'].min(), per2['subzone_id'].max())) -print(" --> Confirmed External Persons in households: {0:,}".format(per2.shape[0])) - -## -## -- If needed, implement adjustment so all Household_ids are unique -- ## -maxCmapHH = hh1['household_id'].max() -minExternalHH = hh2['household_id'].min() -print(' --> QC: Maximum CMAP Household id: {0:,}, Minimum external Household id: {1:,}'.format( - maxCmapHH, minExternalHH)) - -if minExternalHH < maxCmapHH: - print(' --> FIXING_ISSUE: Implementing adjustment to external files so all Household_ids are unique') - hh2['household_id'] = hh2['household_id'] + maxCmapHH - per2['household_id'] = per2['household_id'] + maxCmapHH - print(' --> FIXING_ISSUE: Done') - -# -## -- Finish processing household files -- ## -hhs = pd.concat([hh1,hh2], ignore_index=True, sort=False) ##-- concatenate the household files -print(' --> QC: Household id is unique: {0}'.format(hhs.household_id.is_unique)) -# Trip Generation model Fortran code expects this sort order -hhs.sort_values(by=['subzone_id', 'hhtype'], ignore_index=True, inplace=True) -# index location in POPSYN_HH (new HH_ID based on row number) -hhs['HH_id'] = hhs.index + 1 -#---------------------------------------------------------------------------------------------------# -### --- Missing hhtype and hhvtype --- ### -# The TBM trip generation model requires households to have at least one adult (age 16+). -# In some PUMS records, the head of household is 15. This code block corrects the issue for the TBM. -nullHHTYPE = hhs[hhs['hhtype'].isnull()] -if nullHHTYPE.shape[0] > 0: - nullHHTYPE.to_csv(noHHTYPE_file, index=False) ##-- file of households where hhtype & hhvtype is corrected -### --- Adjust household types -- ### -hhs.loc[hhs['adults'] == 0, 'children_15_under'] = hhs['children_15_under'] - 1 ##-- reclassify one child as an adult -hhs.loc[hhs['adults'] == 0, 'adults'] = 1 -### --- Update hhtype --- ### -hhtype = pd.read_csv(hhtypeCat_file, sep=',') ##-- hhtype definitions -### --- set category values --- ### -hhs['ADULT'] = hhs['adults'] -hhs.loc[hhs['adults'] > 4, 'ADULT'] = 4 -hhs['WORKER'] = hhs['adult_workers'] -hhs.loc[hhs['adult_workers'] > 3, 'WORKER'] = 3 -hhs['CHILD'] = hhs['children_15_under'] -hhs.loc[hhs['children_15_under'] > 3, 'CHILD'] = 3 -hhs['INCOME'] = hhs['income_category'] -hhs['AGE_INDEX'] = hhs['age_of_head_category'] -hhs['VEH'] = hhs['cars'] -hhs.loc[hhs['cars'] > 3, 'VEH'] = 3 -# -hhs = hhs.merge(hhtype, how='left', on=['ADULT','WORKER','CHILD','AGE_INDEX','INCOME'], copy=False) -hhs.loc[hhs['hhtype'].isnull(), 'hhtype'] = hhs['HHTYPE'] -### --- Update hhtype --- ### -hhvtype = pd.read_csv(hhvtypeCat_file, sep=',') ##-- hhvtype definitions -hhs = hhs.merge(hhvtype, how='left', on=['ADULT','WORKER','CHILD','AGE_INDEX','VEH'], copy=False) -hhs.loc[hhs['hhvtype'].isnull(), 'hhvtype'] = hhs['HHVTYPE'] -hhs.drop(['ADULT','WORKER','CHILD','AGE_INDEX','INCOME','VEH','HHTYPE','HHVTYPE'], axis=1, inplace=True) -#---------------------------------------------------------------------------------------------------------------------# - -### --- Convert SERIALNO to integers --- ### -hhs['serialno'] = hhs['serialno'].astype(str).str.replace('HU', '99', regex=False) -hhs['serialno'] = hhs['serialno'].astype(np.int64) -print(" --> Total Households: {0:,}".format(hhs.shape[0])) +hh1 = pd.read_csv(newFiles[0], sep=',') ##-- CMAP households +print(" --> CMAP Households: {0}".format(hh1.shape[0])) +hh2=pd.read_csv(newFiles[1], sep=',') ##-- external households +print(" --> External Households: {0}".format(hh2.shape[0])) +hhs = pd.concat([hh1,hh2],ignore_index=True,sort=False) ##-- concatenate the household files +print(" --> Total Households: {0}".format(hhs.shape[0])) +##hhs['income_2019_usd'] = hhs['income_2019_usd'] * dollar2010 ##-- For Current set up, convert 2019 dollars to 2010 - commented out for new TBM hhs['income_2019_usd'] = round(hhs['income_2019_usd'],2) -## -- Read in GEOG_IN to fill in RowCol -- ## -geo = pd.read_csv(geog_file, sep=',', header=None) -geo.columns=['subzone_id','county','cntyname','state','stpuma5','zone','chicago','cbd', - 'rowcol','area','cmap'] -# get stpuma5 and rowcol to attach to UrbanSim data -geoSumry = geo.groupby('subzone_id')[['rowcol']].mean() -print(" --> GEOG_IN subzone summary Rows: {0:,}".format(geoSumry.shape[0])) -szTemplate = geo[['subzone_id']].copy() +## -- Read in GEOG_IN to fill in PUMA nd RowCol -- ## +geo = pd.read_csv(geog, sep=',', header=None) +geo.columns=['subzone_id','county','cntyname','state','stpuma5','zone','chicago','cbd','rowcol','area','cmap'] ##-- updated for new TBM FY22 +geoSumry = geo.groupby('subzone_id')[['rowcol']].mean() ##-- get stpuma5 and rowcol to attach to UrbanSim data +print(" --> GEOG_IN subzone summary Rows: {0}".format(geoSumry.shape[0])) ## -- Merge files -- ## hhsData = hhs.merge(geoSumry, how='left', on='subzone_id', copy=False) hhsData['rowcol'] = hhsData['rowcol'].astype(int) hhsData['adults'] = hhsData['adults'].astype(int) hhsData['adult_workers'] = hhsData['adult_workers'].astype(int) hhsData['children_15_under'] = hhsData['children_15_under'].astype(int) - -#urbansim data on or after 2026 has puma_id column -if 'puma_id' in hhsData.columns: - hhsData['puma_id'] = hhsData['puma_id'].astype(int) - -## -- Set 2010 PUMA values, if needed -- ## -if puma == 2010: - geo.eval('puma_id_2010 = floor(county/1000) * 100000 + stpuma5', inplace=True) - geo['puma_id_2010'] = geo['puma_id_2010'].astype(int) - geo2 = geo[['subzone_id', 'puma_id_2010']].copy() - hhsData = hhsData.merge(geo2, how='left', on='subzone_id', copy=False) - - if 'puma_id' in hhsData.columns: - puma_mismatch = hhsData.loc[hhsData['puma_id'].astype(int) != hhsData['puma_id_2010']] - if len(puma_mismatch>0): - print('puma in urbansim input files is 2020. converting to 2010.') - hhsData['puma_id'] = hhsData['puma_id_2010'] - else: - hhsData['puma_id'] = hhsData['puma_id_2010'] - -# Trip Generation model Fortran code expects this sort order -hhsData.sort_values(by=['HH_id'], inplace=True) -print(' --> QC: Household file contains null values: {0}'.format(hhsData.isnull().values.any())) -print(' --> QC: Household Adults Minimum = {0:,}, Maximum = {1:,}'.format(hhsData['adults'].min(), - hhsData['adults'].max())) -print(' --> QC: Household Workers Minimum = {0:,}, Maximum = {1:,}'.format(hhsData['adult_workers'].min(), - hhsData['adult_workers'].max())) -print(' --> QC: Household Children Minimum = {0:,}, Maximum = {1:,}'.format(hhsData['children_15_under'].min(), - hhsData['children_15_under'].max())) -print(' --> QC: Household type categories Minimum = {0:,}, Maximum = {1:,}'.format( - hhsData['hhtype'].min(), hhsData['hhtype'].max())) -hhsData.to_csv(popsyn_file, columns=['subzone_id','hhtype','cars','serialno','puma_id','rowcol','adults', - 'adult_workers','children_15_under','income_category', - 'age_of_head_category','hhvtype','income_2019_usd'], header=False, index=False) +hhsData.sort_values(by=['subzone_id', 'hhtype'], inplace=True) ##-- Trip Generation model Fortran code expects this sort order +hhsData.to_csv(popsyn, columns=['subzone_id','hhtype','cars','serialno','puma_id','rowcol','adults','adult_workers','children_15_under','income_category','age_of_head_category','hhvtype','income_2019_usd'], header=False, index=False) ## -- Create synthetic HH file ... -- ## -hhsData['HINCP19'] = hhsData['income_2019_usd'] -# save household_id & HH_id to link to person file -ids = hhsData[['household_id','HH_id']].copy() -# reset household_id to reflect index position in POPSYN_HH -hhsData['household_id'] = hhsData['HH_id'] +hhsData['HH_id'] = hhsData.reset_index().index + 1 ##-- index location in POPSYN_HH +hhsData['HINCP19'] = hhsData['income_2019_usd'] +ids = hhsData.filter(['household_id','HH_id'], axis=1) ##-- save household_id & HH_id to link to person file +hhsData['household_id'] = hhsData['HH_id'] ##-- reset household_id to reflect index position in POPSYN_HH hhsData['SERIALNO'] = hhsData['serialno'] -hhsData.to_csv(temp1_file , columns=['household_id','HINCP19','SERIALNO'], header=True, index=False) +hhsData.to_csv(temp1, columns=['household_id','HINCP19','SERIALNO'], header=True, index=False) ## -- ... and write zipped file into WFH module. -- ## -with zipfile.ZipFile(hhZip_file , "w", compression=zipfile.ZIP_DEFLATED) as zf: - zf.write(temp1_file , os.path.basename(temp1_file )) -if os.path.exists(temp1_file ): - os.remove(temp1_file ) +with zipfile.ZipFile(hhZip, "w", compression=zipfile.ZIP_DEFLATED) as zf: + zf.write(temp1, os.path.basename(temp1)) +if os.path.exists(temp1): + os.remove(temp1) ## -- Create synthetic Person file ... -- ## -### --- person files already opened +per1 = pd.read_csv(newFiles[2], sep=',') ##-- CMAP persons +per1.drop(['Unnamed: 0'], axis=1, inplace=True) +print(" --> CMAP Persons: {0}".format(per1.shape[0])) nullDf = per1[per1['household_id'].isnull()] -if nullDf.shape[0] > 0: - nullDf.to_csv(noHHID_file, index=False) -# +nullDf.to_csv(noHH, index=False) + +per2 = pd.read_csv(newFiles[3], sep=',') ##-- external persons +per2.drop(['Unnamed: 0'], axis=1, inplace=True) +print(" --> External Persons: {0}".format(per2.shape[0])) nullDf = per2[per2['household_id'].isnull()] -if nullDf.shape[0] > 0: - nullDf.to_csv(noHHIDext_file, index=False) -# -# concatenate the person files -pers = pd.concat([per1,per2],ignore_index=True,sort=False) -print(" --> Total Persons in households: {0:,}".format(pers.shape[0])) -print(' --> QC: Household id is unique: {0}'.format(ids.household_id.is_unique)) -# attach HH_id -persData = pers.merge(ids, how='left', on='household_id', copy=False) +nullDf.to_csv(noHH2, index=False) + +pers = pd.concat([per1,per2],ignore_index=True,sort=False) ##-- concatenate the person files +print(" --> Total Persons: {0}".format(pers.shape[0])) +persData = pers.merge(ids, how='left', on='household_id', copy=False) ##-- attach HH_id nullDf = persData[persData['HH_id'].isnull()] -if nullDf.shape[0] > 0: - nullDf.to_csv(noHHIDany_file, index=False) -# +nullDf.to_csv(noHH3, index=False) + + persData['household_id'] = persData['HH_id'] persData['per_num'] = persData['member_id'] persData['SEX'] = persData['sex'] persData['AGEP'] = persData['age'] persData['SCHL'] = persData['education'] persData['RAC1P'] = persData['race_id'] -persData['INDP'] = persData['INDP'].fillna(169) + +persData['INDP'] = persData['INDP'].fillna(169) ##-- replace Nulls with 169 persData.loc[persData.JWTR.isnull(),'JWTR'] = 'bb' persData.loc[persData.ESR.isnull(),'ESR'] = 'b' persData.loc[persData.SCHL.isnull(),'SCHL'] = 'bb' persData['INDP'] = persData['INDP'].astype(int) -# change in schema post-2026, some of these no longer exist -- change to keeping some cols instead of dropping -# persData.drop(['person_id','member_id','age','hh_relationship','education','race_id','sex', -# 'hours','income','student_status','worker_status'], axis=1, inplace=True) -keepcols = [ - 'household_id', 'per_num', 'JWTR', - 'INDP', 'ESR', 'SEX', 'AGEP', - 'SCHL', 'RAC1P' -] -persData = persData[keepcols].copy() persData = persData[~persData.household_id.isnull()] -print(' --> QC: Person file contains null values: {0}'.format(persData.isnull().values.any())) + persData.sort_values(by=['household_id','per_num'], inplace=True) -print(" --> Total Persons with indexed HH id: {0:,}".format(persData.shape[0])) -persData.to_csv(temp2_file, columns=['household_id','per_num','JWTR','INDP','ESR','SEX','AGEP', - 'SCHL','RAC1P'], header=True, index=False) +print(" --> Total Persons with indexed HH id: {0}".format(persData.shape[0])) +persData.to_csv(temp2, columns=['household_id','per_num','JWTR','INDP','ESR','SEX','AGEP','SCHL','RAC1P'], header=True, index=False) ## -- ... and write zipped file into WFH module. -- ## -with zipfile.ZipFile(perZip_file, "w", compression=zipfile.ZIP_DEFLATED) as zf: - zf.write(temp2_file, os.path.basename(temp2_file)) -if os.path.exists(temp2_file): - os.remove(temp2_file) +with zipfile.ZipFile(perZip, "w", compression=zipfile.ZIP_DEFLATED) as zf: + zf.write(temp2, os.path.basename(temp2)) +if os.path.exists(temp2): + os.remove(temp2) + # ---------------------------------------------------------------------------- # Read in the subzone files. # ---------------------------------------------------------------------------- -# CMAP subzones -sz1 = pd.read_csv(newFiles[4], sep=',') -#sz1 = sz1[sz1.subzone_id.le(cmapSubzone)] ##-- limit to CMAP 7-county subzones -print(" --> CMAP Subzones with UrbanSim data: {0:,}".format(sz1.shape[0])) -# external subzones -sz2=pd.read_csv(newFiles[5], sep=',') -#sz2 = sz2[sz2.subzone_id.gt(cmapSubzone)] ##-- limit to external subzones -print(" --> External Subzones with UrbanSim data: {0:,}".format(sz2.shape[0])) -subzs = pd.concat([sz1,sz2], ignore_index=True, sort=False) -## -- Clean things up if external file has data in CMAP subzones -- ## -szsCols = subzs.columns.tolist() -szsCols.remove('subzone_id') -szs = subzs.groupby('subzone_id')[szsCols].sum() -# -print(" --> Subzones with UrbanSim data: {0:,}".format(szs.shape[0])) -# merge UrbanSim data to full template of subzones -szs = szTemplate.merge(szs, how='left', on='subzone_id', copy=False) -print(" --> Total Subzones: {0:,}".format(szs.shape[0])) -print(' --> QC: Households in subzone file: {0:,}'.format(szs['total_households'].sum())) -## -- Read in original ATTR_IN to get highEarn -- ## -jobs = pd.read_csv(sz_data, sep=',', header=None, usecols=[0, 1], skiprows=1) +sz1 = pd.read_csv(newFiles[4], sep=',') ##-- CMAP subzones +sz1 = sz1[sz1.subzone_id.le(cmapSubzone)] ##-- limit to internal CMAP households +print(" --> CMAP Subzones: {0}".format(sz1.shape[0])) +sz2=pd.read_csv(newFiles[5], sep=',') ##-- external subzones +print(" --> External Subzones: {0}".format(sz2.shape[0])) + +## -- External subzones do not contain household type distribution so add Zeroes -- ## +l = ['building_type_1_hhs','building_type_2_hhs','building_type_3_hhs','building_type_4_hhs','building_type_5_hhs','building_type_6_hhs','building_type_7_hhs', +'building_type_8_hhs','building_type_9_hhs','building_type_10_hhs',] +for col in l: + sz2[col] = 0 + +szs = pd.concat([sz1,sz2],ignore_index=True,sort=False) ##-- concatenate the subzone files +print(" --> Total Subzones: {0}".format(szs.shape[0])) +## -- Read in original ATTR_IN -- ## +jobs = pd.read_csv(attr_r, sep=',', header=None, usecols=[0, 3]) jobs.columns=['subzone_id','highEarn'] -jobs['subzone_id']=jobs['subzone_id'].astype(int) -## -- Read in original HH_IN to get private auto commute share and sidewalk density-- ## -# read the HH_IN file in to determine its vintage -szhh = pd.read_csv(sz_data, sep=',', header=None, usecols=[0,2,3], skiprows=1) +## -- Read in original HH_IN -- ## +test = pd.read_csv(hh_r, sep=',', header=None) ##-- read file in to check if it is in the old or new format +if len(test.columns)==9: + szhh = pd.read_csv(hh_r, sep=',', header=None, usecols=[0, 7, 8]) ##-- old format +else: + szhh = pd.read_csv(hh_r, sep=',', header=None, usecols=[0, 34, 35]) ##-- new format szhh.columns=['subzone_id','commuteShare','pef'] -szhh['subzone_id']=szhh['subzone_id'].astype(int) ## -- Merge files -- ## szData = szs.merge(jobs, how='left', on='subzone_id', copy=False) szData = szData.merge(szhh, how='left', on='subzone_id', copy=False) szData.sort_values(by=['subzone_id'], inplace=True) -szData.fillna(0, inplace=True) szData['jobs_retail_44_45'] = szData['jobs_retail_44_45'].round().astype(int) szData['total_households'] = szData['total_households'].round().astype(int) szData['total_jobs'] = szData['total_jobs'].round().astype(int) szData['highEarn'] = szData['highEarn'].round(3) szData['pef'] = szData['pef'].round(2) -szData.to_csv(attr_file, columns=['subzone_id','jobs_retail_44_45','total_jobs', - 'highEarn'], header=False, index=False) -print(" --> {0:,} records written to {1}".format(szData.shape[0], attr_file)) -#accommodate change in schema post-2026 -- fix "househols" typo to "households", if exists -szData.rename(columns={c: c.replace('househols','households') for c in szData.columns}, inplace=True) +szData.to_csv(attr, columns=['subzone_id','jobs_retail_44_45','total_jobs','highEarn'], header=False, index=False) +szData.to_csv(hh, columns=['subzone_id','total_households','total_adults','total_adult_workers','total_children_15_under','households_income_30k_less','income_category2_hhs','income_category3_hhs', +'income_category4_hhs','households_head_35_less','age_householder_category2_hhs','age_householder_category3_hhs', +'households_size1','households_size2','households_size3','households_size4','households_size5','households_size6','households_size7','building_type_1_hhs','building_type_2_hhs', +'building_type_3_hhs','building_type_4_hhs','building_type_5_hhs','building_type_6_hhs','building_type_7_hhs','building_type_8_hhs','building_type_9_hhs','building_type_10_hhs', +'race_ethnicity_category1_hhs','race_ethnicity_category2_hhs','race_ethnicity_category3_hhs','race_ethnicity_category4_hhs','race_ethnicity_category5_hhs','commuteShare','pef'], header=False, index=False) + +print("Households: Subzone Minimum = {0:.1f}, Subzone Maximum = {1:.1f}, Subzone Mean = {2:.1f}".format(szData['total_households'].min(), szData['total_households'].max(), + szData['total_households'].mean())) +print("Total Employment: Subzone Minimum = {0:.1f}, Subzone Maximum = {1:.1f}, Subzone Mean = {2:.1f}".format(szData['total_jobs'].min(), szData['total_jobs'].max(), + szData['total_jobs'].mean())) +print("Retail Employment: Subzone Minimum = {0:.1f}, Subzone Maximum = {1:.1f}, Subzone Mean = {2:.1f}".format(szData['jobs_retail_44_45'].min(), szData['jobs_retail_44_45'].max(), + szData['jobs_retail_44_45'].mean())) + +x = 0 +for f in renamedFiles: + if os.path.exists(renamedFiles[x]): + os.remove(renamedFiles[x]) + x += 1 -szData.to_csv(hh_file, columns=['subzone_id','total_households','total_adults', - 'total_adult_workers','total_children_15_under', - 'households_income_30k_less','income_category2_hhs', - 'income_category3_hhs','income_category4_hhs', - 'households_head_35_less','age_householder_category2_hhs', - 'age_householder_category3_hhs','commuteShare','pef'], - header=False, index=False) -## -- Group Quarters population -- ## -szData['total_mil'] = szData['total_mil'].astype(int) -szData['total_uni'] = szData['total_uni'].astype(int) -szData['total_non_inst_16_64'] = szData['total_non_inst_16_64'].astype(int) -szData['total_non_inst_65_plus'] = szData['total_non_inst_65_plus'].astype(int) -szData.to_csv(gq_file, columns=['subzone_id','total_mil','total_uni', - 'total_non_inst_16_64','total_non_inst_65_plus'], - header=False, index=False) -print(" --> Group Quarters population") -print(" - In military barracks: {0:,}".format(szData['total_mil'].sum())) -print(" - In dormitories: {0:,}".format(szData['total_uni'].sum())) -print(" - In other non-institutionalized group quarters ages 16-64: {0:,}".format( - szData['total_non_inst_16_64'].sum())) -print(" - In other non-institutionalized group quarters ages 65+: {0:,}".format( - szData['total_non_inst_65_plus'].sum())) -print(" --> {0:,} records written to {1}".format(szData.shape[0], gq_file)) -print("-----") -print("Households: Subzone Minimum = {0:.1f}, Subzone Maximum = {1:.1f}, " \ - "Subzone Mean = {2:.1f}".format(szData['total_households'].min(), - szData['total_households'].max(), - szData['total_households'].mean())) -print("Total Employment: Subzone Minimum = {0:.1f}, Subzone Maximum = {1:.1f}," \ - "Subzone Mean = {2:.1f}".format(szData['total_jobs'].min(), - szData['total_jobs'].max(),szData['total_jobs'].mean())) -print("Retail Employment: Subzone Minimum = {0:.1f}, Subzone Maximum = {1:.1f}," \ - "Subzone Mean = {2:.1f}".format(szData['jobs_retail_44_45'].min(), - szData['jobs_retail_44_45'].max(), - szData['jobs_retail_44_45'].mean())) - # ---------------------------------------------------------------------------- # Write report file. # ---------------------------------------------------------------------------- -f = open(report_file,'w') -print("Subzone File: Subzone Minimum = {0}, Subzone Maximum = {1}".format( - szData['subzone_id'].min(), szData['subzone_id'].max()), file=f) -print("Household File: Subzone Minimum = {0}, Subzone Maximum = {1}".format( - hhsData['subzone_id'].min(), hhsData['subzone_id'].max()), file=f) -print("Household File: Puma Minimum = {0}, Puma Maximum = {1}".format( - hhsData['puma_id'].min(), hhsData['puma_id'].max()), file=f) -print("Household File: Rowcol Minimum = {0}, Rowcol Maximum = {1}".format( - hhsData['rowcol'].min(), hhsData['rowcol'].max()), file=f) -print("QC: Total households: {0:,}".format(hhs.shape[0]), file=f) -print("QC: Total people: {0:,}".format(persData.shape[0]), file=f) -print("QC: Total jobs: {0:,}".format(szData['total_jobs'].sum()), file=f) -print("QC: Household file contains null values: {0}".format(hhs.isnull().values.any()), file=f) -print("QC: Household id is unique: {0}".format(hhs.household_id.is_unique), file=f) -print("QC: Person file contains null values: {0}".format(persData.isnull().values.any()), file=f) -f.close() \ No newline at end of file +f = open(rptFile,'w') +print("Subzone File: Subzone Minimum = {0}, Subzone Maximum = {1}".format(szData['subzone_id'].min(), szData['subzone_id'].max()), file=f) +print("Household File: Subzone Minimum = {0}, Subzone Maximum = {1}".format(hhsData['subzone_id'].min(), hhsData['subzone_id'].max()), file=f) +print("Household File: Puma Minimum = {0}, Puma Maximum = {1}".format(hhsData['puma_id'].min(), hhsData['puma_id'].max()), file=f) +print("Household File: Rowcol Minimum = {0}, Rowcol Maximum = {1}".format(hhsData['rowcol'].min(), hhsData['rowcol'].max()), file=f) +f.close() diff --git a/Database/transit_asmt_macros/create_transit_demand.bat b/Database/transit_asmt_macros/create_transit_demand.bat index 85cb418..a57193e 100644 --- a/Database/transit_asmt_macros/create_transit_demand.bat +++ b/Database/transit_asmt_macros/create_transit_demand.bat @@ -29,11 +29,11 @@ cd .. 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=10 tokens=2 delims=:" %%f in (batch_file.yaml) do (set transitAsmt=%%f & goto break2) +for /f "eol=# skip=14 tokens=2 delims=:" %%f in (batch_file.yaml) do (set transitAsmt=%%f & goto break2) :break2 -for /f "eol=# skip=12 tokens=2 delims=:" %%h in (batch_file.yaml) do (set selLineFile=%%h & goto break4) +for /f "eol=# skip=16 tokens=2 delims=:" %%h in (batch_file.yaml) do (set selLineFile=%%h & goto break4) :break4 -for /f "eol=# skip=18 tokens=2 delims=:" %%k in (batch_file.yaml) do (set RSPrun=%%k & goto break5) +for /f "eol=# skip=22 tokens=2 delims=:" %%k in (batch_file.yaml) do (set RSPrun=%%k & goto break5) :break5 set val=%val:~1,3% diff --git a/Database/transit_asmt_macros/run_transit_assignment.bat b/Database/transit_asmt_macros/run_transit_assignment.bat index f143a5a..434dae4 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=10 tokens=2 delims=:" %%f in (batch_file.yaml) do (set transitAsmt=%%f & goto break2) +for /f "eol=# skip=14 tokens=2 delims=:" %%f in (batch_file.yaml) do (set transitAsmt=%%f & goto break2) :break2 -for /f "eol=# skip=12 tokens=2 delims=:" %%h in (batch_file.yaml) do (set selLineFile=%%h & goto break4) +for /f "eol=# skip=16 tokens=2 delims=:" %%h in (batch_file.yaml) do (set selLineFile=%%h & goto break4) :break4 -for /f "eol=# skip=18 tokens=2 delims=:" %%k in (batch_file.yaml) do (set RSPrun=%%k & goto break5) +for /f "eol=# skip=22 tokens=2 delims=:" %%k in (batch_file.yaml) do (set RSPrun=%%k & goto break5) :break5 set val=%val:~1,3% diff --git a/Database/transit_asmt_macros/summarize_transit_boardings.mac b/Database/transit_asmt_macros/summarize_transit_boardings.mac deleted file mode 100644 index 900821c..0000000 --- a/Database/transit_asmt_macros/summarize_transit_boardings.mac +++ /dev/null @@ -1,97 +0,0 @@ - -~# SUMMARIZE_TRANSIT_BOARDINGS.MAC -~# Craig Heither, 10-25-2022 -~# -~# Summarize transit boardings for congested transit assignment. -~# submit with: ~ -~# e.g.: " ~>%t3% -~"Line,Scenario,TotalBoard,PassengerMiles -~> -~# #### -~# -~:full_loop -~# -~:scenario_loop -s=%x% -~?y=1 -~+;~t1=CTA_Rail_Blue_Line;~t2=cbl___ -~?y=2 -~+;~t1=CTA_Rail_Brown_Line;~t2=cbr___ -~?y=3 -~+;~t1=CTA_Rail_Green_Line;~t2=cg____ -~?y=4 -~+;~t1=CTA_Rail_Orange_Line;~t2=cor___ -~?y=5 -~+;~t1=CTA_Rail_Pink_Line;~t2=cpk___ -~?y=6 -~+;~t1=CTA_Rail_Purple_Line;~t2=cpr___ -~?y=7 -~+;~t1=CTA_Rail_Red_Line;~t2=crd___ -~?y=8 -~+;~t1=CTA_Rail_Yellow_Line;~t2=cye___ -~?y=9 -~+;~t1=Metra_BNSF;~t2=mbn___ -~?y=10 -~+;~t1=Metra_Heritage_Corridor;~t2=mhc___ -~?y=11 -~+;~t1=Metra_Electric;~t2=mme___ -~?y=12 -~+;~t1=Metra_Milwaukee_North;~t2=mmn___ -~?y=13 -~+;~t1=Metra_Milwaukee_West;~t2=mmw___ -~?y=14 -~+;~t1=Metra_North_Central;~t2=mnc___ -~?y=15 -~+;~t1=Metra_Rock_Island;~t2=mri___ -~?y=16 -~+;~t1=Metra_SouthWest_Service;~t2=msw___ -~?y=17 -~+;~t1=Metra_UP_North;~t2=mun___ -~?y=18 -~+;~t1=Metra_UP_Northwest;~t2=mnw___ -~?y=19 -~+;~t1=Metra_UP_West;~t2=muw___ -~?y=20 -~+;~t1=NICTD_South_Shore;~t2=mss___ -~?y=21 -~+;~t1=CTA_Bus_Regular;~t2=mod=B -~?y=22 -~+;~t1=CTA_Bus_Express;~t2=mod=E -~?y=23 -~+;~t1=Pace_Bus_Regular;~t2=mod=P -~?y=24 -~+;~t1=Pace_Bus_Express;~t2=mod=Q -~?y=25 -~+;~t1=Pace_Bus_Local;~t2=mod=L -~# -~# ##-- Boardings -- ## -2.41 -~+;1;n;board; ;%t2%; ;*;5;4;ms900;allbrd;All line boards;1 -~+;1;n;voltr*len; ;%t2%; ;*;5;4;ms901;pssmle;Passenger miles;1;q -~# -~>>%t3% -~"%t1%,%s%,%ms900.0%,%ms901.0% -~> -~x+2 -~+;~?x<%z%;~$scenario_loop -~# ##-- next line --## -~+;~x-8;~y+1 -~+;~?y<26;~$full_loop -~# -~# ##-- Delete matrices --## -3.12 -~+;2;ms900;y -~+;2;ms901;y;q -~/ summary done! -q diff --git a/Database/transit_asmt_macros/summarize_transit_boardings.py b/Database/transit_asmt_macros/summarize_transit_boardings.py new file mode 100644 index 0000000..ececcc1 --- /dev/null +++ b/Database/transit_asmt_macros/summarize_transit_boardings.py @@ -0,0 +1,177 @@ +''' +SUMMARIZE_TRANSIT_BOARDINGS.PY + Craig Heither, 10-25-2022 + Translated from Emme macro to Python by Tim O'Leary, 9-26-2025 + + Summarize transit boardings for congested transit assignment. + No inputs necessary-- reads batch_file.yaml to determine scen numbers. + Will not run unless transit assignment has been completed. +''' + +#libraries +import os +import sys +from pathlib import Path +import yaml +import pandas as pd + +#startup emme +proj_dir = Path(__file__).resolve().parents[2] +db = proj_dir.joinpath('Database') +sys.path.append(str(proj_dir.joinpath('Scripts'))) +from tbmtools import project as tbm + +#connect to modeller +modeller = tbm.connect(proj_dir) +emmebank = modeller.emmebank + +#output location +out_boarding_csv = os.path.join( + db, 'transit_asmt_macros/report/Boarding_summary.csv' +) +out_transit_punch = os.path.join( + db, 'transit_asmt_macros/report/transit_punch_segment.csv' +) + +if os.path.exists(out_boarding_csv): + os.remove(out_boarding_csv) + +#get scenario info from batch_file.yaml for transit asmt scenarios +db = proj_dir.joinpath('Database') +with open(os.path.join(db, 'batch_file.yaml')) as f: + lines_without_backslashes = ''.join([line.replace('\\','/') for line in f]) + config = yaml.safe_load(lines_without_backslashes) +yr = str(config['scenario_code'])[0] # e.g., '2' from '200' + +trnt_scens = { + f'Night (6pm-6am)': f'{yr}21', + f'AM (6am-9am)': f'{yr}23', + f'Midday (9am-4pm)': f'{yr}25', + f'PM (4pm-6pm)': f'{yr}27', +} + +tr_dfs = [] + +for period_name, scen_num in trnt_scens.items(): + + scen = emmebank.scenario(scen_num) + if scen is None: + raise ValueError(f'Scenario {scen_num} not found in Emmebank') + + network = scen.get_network() + links = network.links() + + trpunch_list = [] + for link in network.links(): + segments = link.segments() #empty if link does not have transit segments + inode = network.node(link.i_node) + jnode = network.node(link.j_node) + #for each segment (if it has any), add this info to table: + for segment in segments: + line = network.transit_line(str(segment.id).split('-')[0]) + seg = [ + link.id, + segment.id, + link.length, + line.headway, + segment['transit_boardings'], + segment['transit_volume'], + segment['data1'], + inode['@zone'], + jnode['@zone'] + ] + + trpunch_list.append(seg) + + columns = ['id', 'segment_id', 'length', 'headway', 'transit_boardings','transit_volume','ltime','inode_zone','jnode_zone'] + trpunch = pd.DataFrame(data=trpunch_list, columns=columns) + + trpunch.eval('pmt = transit_volume * length', inplace=True) + trpunch.eval('pht = transit_volume * ltime / 60', inplace=True) + + #use transit line info to determine mode + def line_mode(x): + ''' + function for .map() method used directly below this function + to determine mode name from segment_id + + segment_id format: [alpha-code][5-digit number], e.g., 'b12535', 'cbl10011' + + b -> CTA local bus + e -> CTA express + p -> Pace regular bus + l -> Pace feeder bus + q -> Pace express bus + c** -> CTA rail lines (3-letter code) + m** -> Metra lines (3-letter code) + + returns: the english name representation of the mode code + + ''' + + line = x.split('-')[0] + name = ''.join([char for char in line if char.isalpha()]) + name_key = { + 'cbl': 'CTA Blue Line', + 'cbr': 'CTA Brown Line', + 'cg': 'CTA Green Line', + 'cor': 'CTA Orange Line', + 'cpk': 'CTA Pink Line', + 'cpr': 'CTA Purple Line', + 'crd': 'CTA Red Line', + 'cye': 'CTA Yellow Line', + 'mbn': 'Metra BNSF', + 'mhc': 'Metra Heritage Corridor', + 'mme': 'Metra Electric', + 'mmn': 'Metra Milwaukee North', + 'mmw': 'Metra Milwaukee West', + 'mnc': 'Metra North Central', + 'mri': 'Metra Rock Island', + 'msw': 'Metra SouthWest Service', + 'mun': 'Metra UP North', + 'mnw': 'Metra UP Northwest', + 'muw': 'Metra UP West', + 'mss': 'NICTD South Shore', + 'b': 'CTA Regular Bus', + 'e': 'CTA Express Bus', + 'p': 'Pace Regular Bus', + 'q': 'Pace Express Bus', + 'l': 'Pace Feeder Bus', + } + nam = [code for code in name_key.keys() if code in name] + nam = max(nam, key=len) if len(nam) > 0 else None + return name_key[nam] + + trpunch['mode'] = trpunch['segment_id'].map(line_mode) + + if len(trpunch.loc[trpunch['mode'].isnull()]) > 0: + print(f'SOME TRANSIT SEGMENTS WERE NOT MAPPED TO A MODE!') + print(trpunch.loc[trpunch['mode'].isnull()]) + raise ValueError('Some transit segments were not mapped to a mode (must be c, m, p, q, l, b, or e). Look at printed output of errors above.') + + trpunch['tod'] = scen_num + trpunch['tod_name'] = period_name + + tr_dfs.append(trpunch) + +tr_all = pd.concat(tr_dfs, ignore_index=True) + +#output all segment info to csv (similar to punch link) +tr_all.to_csv(out_transit_punch, index=False) + +#summary by time-of-day +summary_tod = tr_all.groupby(['tod_name', 'tod', 'mode']).agg({ + 'transit_boardings':'sum', + 'pmt':'sum' +}).reset_index() +#total daily +summary_daily = summary_tod.groupby('mode').agg({ + 'transit_boardings':'sum', + 'pmt':'sum' +}).reset_index() +summary_daily['tod'] = 'All' +summary_daily['tod_name'] = 'Daily' + +summary = pd.concat([summary_tod, summary_daily], ignore_index=True) +summary.to_csv(out_boarding_csv, index=False) +print(f'Summary transit boarding information written to: {out_boarding_csv}') \ No newline at end of file diff --git a/Database/trip_gen.bat b/Database/trip_gen.bat index e456432..c571a05 100644 --- a/Database/trip_gen.bat +++ b/Database/trip_gen.bat @@ -39,47 +39,26 @@ rem -------- rem In case CMD.exe is doing stuff in the wrong directory, this command rem changes the directory to where the batch file was called from. cd %~dp0 -rem -- Read model run settings from Telework.yaml -- +rem -- Read model run settings from batch_file.yaml -- for /f "eol=# skip=2 tokens=2 delims=:" %%a in (batch_file.yaml) do (set sc=%%a & goto break1) :break1 -for /f "eol=# skip=1 tokens=2 delims=:" %%b in (Telework.yaml) do (set wfhFile=%%b & goto break2) +for /f "eol=# skip=4 tokens=2 delims=:" %%b in (batch_file.yaml) do (set wfhFile=%%b & goto break2) :break2 -for /f "eol=# skip=2 tokens=2 delims=:" %%c in (Telework.yaml) do (set wfh=%%c & goto break3) +for /f "eol=# skip=5 tokens=2 delims=:" %%c in (batch_file.yaml) do (set wfh=%%c & goto break3) :break3 -for /f "eol=# skip=3 tokens=2 delims=:" %%d in (Telework.yaml) do (set tc14=%%d & goto break4) +for /f "eol=# skip=6 tokens=2 delims=:" %%d in (batch_file.yaml) do (set tc14=%%d & goto break4) :break4 -for /f "eol=# skip=5 tokens=2 delims=:" %%e in (Telework.yaml) do (set wfhLow=%%e & goto break5) -:break5 -for /f "eol=# skip=6 tokens=2 delims=:" %%f in (Telework.yaml) do (set wfhMedium=%%f & goto break6) -:break6 -for /f "eol=# skip=7 tokens=2 delims=:" %%g in (Telework.yaml) do (set wfhHigh=%%g & goto break7) -:break7 -for /f "eol=# skip=8 tokens=2 delims=:" %%g in (Telework.yaml) do (set declineScaled=%%g & goto break8) -:break8 - set sc=%sc:~1,3% set wfhFile=%wfhFile:~1% set wfh=%wfh:~1% set tc14=%tc14:~1% -set wfhLow=%wfhLow:~1% -set wfhMedium=%wfhMedium:~1% -set wfhHigh=%wfhHigh:~1% -set declineScaled=%declineScaled:~1% - @echo. @echo ======================================== @echo --- Model Run Settings --- @echo Scenario = %sc% @echo Create WFH validation file = %wfhFile% -if %sc%==100 ( - @echo 2019 Usual WFH share = %wfh% - @echo 2019 WFH 1-4 days share = %tc14% -) else ( - @echo 2025/26 WFH low rate group share= %wfhLow% - @echo 2025/26 WFH medium rate group share= %wfhMedium% - @echo 2025/26 WFH high rate group share= %wfhHigh% - @echo Decline factor= %declineScaled% -) +@echo Usual WFH share = %wfh% +@echo WFH 1-4 days share = %tc14% @echo ======================================== @echo. rem @@ -120,6 +99,14 @@ echo * prep_macros\distribute.poes echo. echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pause +echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +echo. +echo WORK FROM HOME RATES +echo. +echo Do the WFH rates and industry files need to be updated? +echo. +echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +pause echo. rem -- Run trip generation model. -- @@ -130,9 +117,9 @@ goto badscen :runit rem Supply project and run titles. -set /p project="[ENTER PROJECT TITLE (E.G., c26q2)] " +set /p project="[ENTER PROJECT TITLE (E.G., c20q2)] " echo. -set /p run="[ENTER RUN TITLE (E.G., 100_20260202)] " +set /p run="[ENTER RUN TITLE (E.G., 100_20200330)] " echo. set project=%project: =% @@ -152,19 +139,17 @@ if "%run%" == "" ( echo =================================================================== echo. +rem Activate Python env +call %~dp0..\Scripts\manage\env\activate_env.cmd +if %ERRORLEVEL% NEQ 0 (goto end) + cd tg\scripts -echo. -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ echo Updating Trip Generation inputs with UrbanSim data ... -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -uv run urbansim_update_tg_input_files.py +python urbansim_update_tg_input_files.py if %ERRORLEVEL% NEQ 0 (goto urbansim_issue) @echo. -echo. -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ echo Updating Heavy Truck Trip allocation weights with UrbanSim data ... -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -uv run urbansim_hcv_allocation.py +python urbansim_hcv_allocation.py if %ERRORLEVEL% NEQ 0 (goto hcv_issue) cd ..\fortran @@ -173,18 +158,9 @@ set savedir="%cd%" cd wfhmodule set filedir="%cd%" echo. -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ echo Starting the work-from-home allocation model ... -echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -if %val%==100 ( - echo Running wfhflag_base.py ... - uv run wfhflag_base.py %filedir% %savedir% %wfhFile% -) else ( - echo Running wfhflag.py ... - uv run wfhflag.py %filedir% %savedir% %wfhFile% -) - +echo wfh arguments: %filedir% %savedir% %wfhFile% %wfh% %tc14% +python wfhflag.py %filedir% %savedir% %wfhFile% %wfh% %tc14% if %ERRORLEVEL% NEQ 0 (goto wfh_issue) cd .. @@ -194,24 +170,17 @@ 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 and deprecated files. +rem Delete old output files. if exist *OUT.TXT (del *OUT.TXT) if exist *OUTPUT.TXT (del *OUTPUT.TXT) if exist MCHW_HH.TXT (del MCHW_HH.TXT) -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 ============================================================= -uv run trip_generation\trip_generation_model.py -cd tg\scripts + +TG_PopSyn.exe +cd ..\scripts echo Creating summary files ... -uv run summarize_tg_results.py %project% %run% -uv run prepare_iom_inputs.py %project% %run% +python summarize_tg_results.py %project% %run% +python prepare_iom_inputs.py %project% %run% echo. cd ..\data @@ -229,6 +198,8 @@ if not exist m01type.csv (goto m01_data_error) cd %~dp0 +python tg\fortran\create_HHvtype_file.py + echo Module 1 finished. echo. echo =================================================================== @@ -264,6 +235,8 @@ if exist tg.rpt (del tg.rpt) if exist report\stop_truck_distribution.txt ( del report\stop_truck_distribution.txt ) +if not exist tg\fortran\MCHW_HH.TXT (goto filemiss1) +copy tg\fortran\MCHW_HH.TXT MCHW_HH.TXT /y copy tg\fortran\TG_HHENUM_OUTPUT.TXT TG_HHENUM_OUTPUT.TXT /y echo. @@ -279,8 +252,12 @@ call :CheckEmpty %infile% if exist %infile% (del %infile% /Q) cd Database +rem Activate Emme Python env +call %~dp0..\Scripts\manage\env\activate_env.cmd emme +if %ERRORLEVEL% NEQ 0 (goto end) + echo Preparing emmebank for model run... -uv run useful_macros\cleanup_for_rerun.py %val%>> tg.rpt +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)... @@ -288,7 +265,7 @@ call emme -ng 000 -m prep_macros\import.tg.results 1 >> tg.rpt echo. echo Skimming highway network... -uv run prep_macros\free.skim.mac.py %file1% %val% +call python prep_macros\free.skim.mac.py %file1% %val% echo. echo Distributing trucks... @@ -339,6 +316,10 @@ goto end echo !!! THE WORK FROM HOME ALLOCATION MODEL DID NOT RUN PROPERLY !!! goto end +:filemiss1 +echo !!! tg\fortran\MCHW_HH.TXT DOES NOT EXIST !!! +goto end + :truck_balance_err echo !!! TRUCK BALANCING PROCEDURES PRODUCED NaN ERRORS !!! echo Please review report\truck.access.rpt, modify distribute.trucks and diff --git a/Database/trip_generation/household_trip_enumeration.py b/Database/trip_generation/household_trip_enumeration.py deleted file mode 100644 index ed7574b..0000000 --- a/Database/trip_generation/household_trip_enumeration.py +++ /dev/null @@ -1,115 +0,0 @@ -""" -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 deleted file mode 100644 index 738087e..0000000 --- a/Database/trip_generation/trip_generation.yaml +++ /dev/null @@ -1,39 +0,0 @@ -## -- 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 deleted file mode 100644 index 9bda35c..0000000 --- a/Database/trip_generation/trip_generation_model.py +++ /dev/null @@ -1,987 +0,0 @@ -""" -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 deleted file mode 100644 index 3349c74..0000000 --- a/Database/trip_generation/vehicle_availability.py +++ /dev/null @@ -1,326 +0,0 @@ -""" -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/Database/useful_macros/cleanup_for_rerun.py b/Database/useful_macros/cleanup_for_rerun.py index f5caa0c..cd281db 100644 --- a/Database/useful_macros/cleanup_for_rerun.py +++ b/Database/useful_macros/cleanup_for_rerun.py @@ -16,10 +16,9 @@ def main(): #set variables currentScen = int(sys.argv[1]) - cScenAM = currentScen + 3 - scenario = str(cScenAM) + scenario = str(currentScen) cScenMD = currentScen + 5 - moveF11 = "build_" + str(cScenAM) + "transit.rpt" + moveF11 = "build_" + str(currentScen) + "transit.rpt" moveF12 = "report/" + moveF11 moveF21 = "build_" + str(cScenMD) + "transit.rpt" moveF22 = "report/" + moveF21 @@ -66,7 +65,7 @@ def main(): if os.path.isfile("truck.access.rpt"): shutil.move("truck.access.rpt", "report/truck.access.rpt") #Set primary scenario - change_scenario(scenario=cScenMD) + change_scenario(scenario=currentScen) #delete scenarios and matrices for c in counters1: if c == 0: @@ -76,17 +75,19 @@ def main(): counter1 = counter1+1 else: while counter1 <= c +9: - scen = str(currentScen) + str(counter1) + scen = str(scenario) + str(counter1) scenDel = emmebank.scenario(scen) if scenDel: delete_scenario(scenDel) counter1 = int(counter1) counter1 = counter1+1 - #delete transit overnight and PM peak skim scenarios if exist - trSkims= (currentScen+1, currentScen+7) - for t in trSkims: - scenDel = emmebank.scenario(t) - if scenDel: delete_scenario(scenDel) + # #delete transit assignment scenarios if exist + # for c in counters2: + # scen = currentScen + c + # scenDel = _m.Modeller().emmebank.scenario(scen) + # if scenDel: delete_scenario(scenDel) + # counter2 = int(counter2) + # counter2 = counter2+1 #delete matrices matpairs = {} @@ -103,7 +104,7 @@ def main(): begVal = begVal + 1 if matrix: delete_matrix(matrix) - #set ms97, ms98, & ms99 to proper values for rerun (create if necessary) + #set ms97, ms98, &ms99 to proper values for rerun (create if necessary) new_mat97 = create_matrix(matrix_id="ms97", matrix_name="one", matrix_description="dummy for assignment", @@ -120,11 +121,9 @@ def main(): default_value=0, overwrite ="True") - #delete set of matrices no longer used in model - unneeded = ("ms1","mf835","mf836","mf839","mf935","mf936","mf939") - for u in unneeded: - matrix = emmebank.matrix(u) - if matrix: delete_matrix(matrix) + #delete ms1: no using lower bound for impedance matrix balancing in revised distribution + matrix = emmebank.matrix("ms1") + if matrix: delete_matrix(matrix) if __name__ == '__main__': main() \ No newline at end of file diff --git a/Database/useful_macros/delete.initial.batchin.scenarios b/Database/useful_macros/delete.initial.batchin.scenarios deleted file mode 100644 index 07f53cd..0000000 --- a/Database/useful_macros/delete.initial.batchin.scenarios +++ /dev/null @@ -1,47 +0,0 @@ -~/ delete.initial.batchin.scenarios -~/ Craig Heither, 3/31/09 -~/ Deletes scenarios -~/ submit with 3-digit scenario number -~/ -~# Heither, modified 07-26-2016: delete build_turn.rpt -~# ------------------------------------------------------------- -~x=%0% -~+;~?!x=1;~$>error -~/ -~! if exist report\build_turn.rpt (del report\build_turn.rpt) -~/ -~/ DELETE SCENARIOS xxx0,xxx00-xxx08 IF THEY EXIST -~/ -~r1=%1% -~r1*10 -1.22 -2 -%r1% -~?e -~+;~/Scenario %r1% does not exist; ;q;~$>next1 -y -q -~:next1 -~/ -~r1*10 -~/ -~:loop -1.22 -2 -%r1% -~?e -~+;~/Scenario %r1% does not exist; ;q;~$>next2 -y -q -~:next2 -~r1+1 -~+;~?r1<%1%09;~$loop -~/ END LOOP -~/ -~/ -~$>end -~:error -~/ SUBMIT WITH PROJECT DIRECTORY NAME!!!!!!! -~/ -~:end -~/end of macro diff --git a/Database/useful_macros/delete.matrices b/Database/useful_macros/delete.matrices deleted file mode 100644 index ac46569..0000000 --- a/Database/useful_macros/delete.matrices +++ /dev/null @@ -1,58 +0,0 @@ -~/ -~/********************************************************************** -~/********************************************************************** -~/ -~/ Macro Delete.matx.mac %1% %2% -~/ where %1% = low end range of matrix number to delete -~/ %2% = high end range of matrix number to delete -~/ -~/********************************************************************** -~/ Macro deletes a range of full matrices. -~/ -~/********************************************************************** -~/ -~/ Written by DBE 11May2004 -~/ -~/********************************************************************** -~/ -~/ register x = matrix number to be deleted, incremented & checked. -~/ REMOVED LINE BETWEEM ~:ERR AND ~:END IT WAS CAUSING THE PROGRAM TO FAIL -~/ WHEN THE MATRICES DID NOT EXIST BOZIC 11-2-2017 -~/********************************************************************** -~/ -~x=%1% -~:startloop -3.12 -2 -mf%x% -~?e -~$>err -yes -~$>end -~:err - -~:end -q -~/ -~/********************************************************************** -~/ -~/ All requested matrices deleted? -~/ -~/********************************************************************** -~/ -~x+1 -~?x>%2% -~$>done -~$startloop -~:done -~/ -~/********************************************************************** -~/ -~/ End of macro -~/ -~/********************************************************************** -~/ -3.14 -2 -m -1 \ No newline at end of file diff --git a/Database/useful_macros/delete.scenarios b/Database/useful_macros/delete.scenarios deleted file mode 100644 index 7a4396a..0000000 --- a/Database/useful_macros/delete.scenarios +++ /dev/null @@ -1,21 +0,0 @@ -~/ macro for deleting a range of network scenarios -~/ -~/ r11 = counter -~/ Created by DBE 21May2004, modified kww 6/6 -~/ modified by cmh 3/09: continues running if scenario does not exist -~x=%1% -~:loop -~x+1 -~r11+1 -1.22 -2 -%x% -~?e -~+; ;q;~$>next -yes -q -~:next -~?!x=%2% -~$loop -~:done -s= \ No newline at end of file diff --git a/Database/useful_macros/delete_initial_batchin_scenarios.py b/Database/useful_macros/delete_initial_batchin_scenarios.py new file mode 100644 index 0000000..713719f --- /dev/null +++ b/Database/useful_macros/delete_initial_batchin_scenarios.py @@ -0,0 +1,53 @@ +''' +delete_initial_batchin_scenarios.py + +author: Craig Heither, 3/31/09 + - deletes scenarios + - submit with 3-digit scenario number + - modified 7/26/2016: also delete build.turn.rpt +translated: Tim O'Leary, 9/26/2025 to Python 3 +''' + +import os +import sys +from pathlib import Path +import yaml + +proj_dir = Path(__file__).resolve().parents[2] +sys.path.append(str(proj_dir.joinpath('Scripts'))) +from tbmtools import project as tbm + +print('delete initial batchin scenarios (*0001-*0008)') +print('(and build_turn.rpt if it exists)') +print(' executing...') + +#connect to modeller +modeller = tbm.connect(proj_dir) +emmebank = modeller.emmebank + +#define tools +delete_scenario = modeller.tool('inro.emme.data.scenario.delete_scenario') + +#get scenario info from batch_file.yaml for scenario numbers to delete +db = proj_dir.joinpath('Database') +with open(os.path.join(db, 'batch_file.yaml')) as f: + lines_without_backslashes = ''.join([line.replace('\\','/') for line in f]) + config = yaml.safe_load(lines_without_backslashes) +scen_yr = config['scenario_code'] # e.g., '200' +scenarios_to_delete = [f'{scen_yr}0{i}' for i in range(1,9)] + [f'{scen_yr}0'] + +#delete scenarios +for scen in scenarios_to_delete: + if emmebank.scenario(scen): #returns None if DNE + delete_scenario(emmebank.scenario(scen)) + else: + print(f'scenario {scen} does not exist') + +#delete build_turn.rpt if it exists +rptfile = db.joinpath('report/build_turn.rpt') +if os.path.exists(rptfile): + os.remove(rptfile) +else: + print('build_turn.rpt does not exist') + +print('done') \ No newline at end of file diff --git a/Database/useful_macros/delete_matrices.py b/Database/useful_macros/delete_matrices.py new file mode 100644 index 0000000..8afd251 --- /dev/null +++ b/Database/useful_macros/delete_matrices.py @@ -0,0 +1,108 @@ +''' +`delete_matrices.py` +Author: Tim O'Leary +Date: 9/26/2025 + +Description: This script deletes specified matrices from the emme databank. It can +be called as a subscript or by itself. Contains delete_matrices() function that can take +a string or a list of strings as input. + +Translated from 'delete.matrices' Emme macro written by DBE 5/11/2004 +- Added functionality to call a single matrix, range, or list +- Runs interactively if called by itself, or function could be imported and called by another script +''' + +print('delete_matrices.py\nstarting up...') +import os +import sys +from pathlib import Path +import textwrap + +proj_dir = Path(__file__).resolve().parents[2] +sys.path.append(str(proj_dir.joinpath('Scripts'))) +from tbmtools import project as tbm + +#connect to modeller +modeller = tbm.connect(proj_dir) +emmebank = modeller.emmebank + +#define tools +delete_matrix = modeller.tool('inro.emme.data.matrix.delete_matrix') + +def delete_matrices(mats_to_delete): + ''' + Deletes specified matrices from the databank. + Input may be one of the following: + - a single matrix (e.g., 'mf2') + - a range of matrices separated by a hyphen (e.g., 'mf25-mf90') + - a list of numbers (e.g., 'mf25, mf30, mf45')) + ''' + + bad_input_msg = textwrap.dedent(f'''\ + Input not recognized. Please input IDs with prefix (e.g., "mf"), in one of the following formats: + \t- a single matrix ID (e.g., "mf54"); + \t- a range of IDs with hyphen between (e.g., "mf25-mf90"); or + \t- a list of IDs (e.g., [id1,id2,...]).''') + + #if passed function with no input + if mats_to_delete is None or mats_to_delete == '': + raise ValueError(bad_input_msg) + + #check for incorrectly formatted matrix IDs + if '-' in str(mats_to_delete): + input_type = 'range' + mats_check = str(mats_to_delete).split('-') + mats_check = [m.strip() for m in mats_check] + else: + input_type = 'list' + mats_check = str(mats_to_delete).replace('[','').replace(']','').split(',') + mats_check = [m.strip() for m in mats_check] + + #make sure prefixes and suffixes aren't invalid, and check if mixed matrix types + bad_prefix = [m for m in mats_check if m[:2] not in ['mf', 'mo', 'md', 'ms']] + mixed_types = [m[:2] for m in mats_check] + bad_suffix = [m for m in mats_check if not m[2:].isdigit()] + if len(bad_prefix + bad_suffix) > 0: + raise ValueError(bad_input_msg) + if len(set(mixed_types)) > 1: + raise ValueError('Sorry, cannot mix matrix types in one call for now. Please only do one matrix type at a time.') + + #handle range input + if input_type == 'range': + mtx_type = set(mixed_types)[0] + min = int(mats_check[0][2:]) + max = int(mats_check[1][2:]) + mats = [f'{mtx_type}{m}' for m in range(min, max+1)] + else: + mats = mats_check + + #delete matrices + for mat in mats: + if emmebank.matrix(mat): + delete_matrix(emmebank.matrix(mat)) + else: + print(f' - matrix {mat} not in dabatank, skipping...') + +print(''' + DELETE_MATRICES.PY + This script will delete specified matrices from the emme databank! + Input may be one of the following: + - a single matrix (e.g., 'mf2') + - a range of matrices, min and max separated by a hyphen (e.g., 'mf25-mf90') + - a list of matrix IDs, separated by commas (e.g., 'mf25, mf30, mf45')) + ''') + +while True: + try: + user_input = input('Enter matrices to delete (or "exit" to quit): ') + if user_input.lower() == 'exit': + break + delete_matrices(user_input) + print('\n - done! want to go again?\n') + except ValueError as e: + print(f'\n!! Error: {e}\n') + except Exception as e: + print(f'\n!! Unexpected error occurred: {e}\n') +print('bye-bye, then!') +input('press any key to exit') +sys.exit() diff --git a/Database/useful_macros/delete_matrix_named b/Database/useful_macros/delete_matrix_named deleted file mode 100644 index 4bbbfbf..0000000 --- a/Database/useful_macros/delete_matrix_named +++ /dev/null @@ -1,12 +0,0 @@ -3.12 -2 -%1% -~?e -~$>err1 -yes -~$>end1 -~:err1 - -r -~:end1 -q \ No newline at end of file diff --git a/Database/useful_macros/delete_scenarios.py b/Database/useful_macros/delete_scenarios.py new file mode 100644 index 0000000..d30b5cf --- /dev/null +++ b/Database/useful_macros/delete_scenarios.py @@ -0,0 +1,107 @@ +''' +`delete_scenarios.py` +Author: Tim O'Leary +Date: 9/26/2025 + +Description: This script deletes specified scenarios from the emme databank. It can +be called as a subscript or by itself. Contains delete_scenarios() function that can take +a string or a list of strings as input. + +Translated to Python 3 from 'delete.scenarios' Emme macro +Written by DBE 5/2004 and modified to handle non-existent scenarios by CH 3/2009 +Added functionality with Python translation: +- Can call a single scenario, a range of scenarios, or list +- Runs interactively with user input if called by itself, or the function 'delete_scenarios()' can be imported and called by another script +''' + +print('delete_scenarios.py\nstarting up...') +import os +import sys +from pathlib import Path +import textwrap + +proj_dir = Path(__file__).resolve().parents[2] +sys.path.append(str(proj_dir.joinpath('Scripts'))) +from tbmtools import project as tbm + +#connect to modeller +modeller = tbm.connect(proj_dir) +emmebank = modeller.emmebank + +#define tools +delete_scenario = modeller.tool('inro.emme.data.scenario.delete_scenario') + +def delete_scenarios(scens_to_delete): + ''' + Deletes specified scenarios from the databank. + Input may be one of the following: + - a single scenario (e.g., '20003') + - a range of scenarios separated by a hyphen (e.g., '20021-20028') + - a list of scenarios (e.g., '221, 22003, 22004')) + ''' + + bad_input_msg = textwrap.dedent(f'''\ + Input not recognized. Please input scenario IDs as integers in one of the following formats: + \t- a single scenario ID (e.g., '20003'); + \t- a range of IDs with hyphen between (e.g., '20021-20028'); or + \t- a list of IDs (e.g., '221, 22003, 22004').''') + + #if passed function with no input + if scens_to_delete is None or scens_to_delete == '': + raise ValueError(bad_input_msg) + + #check for incorrectly formatted input + if '-' in str(scens_to_delete): + input_type = 'range' + scens_check = str(scens_to_delete).split('-') + scens_check = [m.strip() for m in scens_check] + else: + input_type = 'list' + scens_check = str(scens_to_delete).replace('[','').replace(']','').split(',') + scens_check = [m.strip() for m in scens_check] + + #make sure prefixes and suffixes aren't invalid, and check if mixed matrix types + not_a_number = [m for m in scens_check if not m.isnumeric()] + if not_a_number: + raise ValueError(bad_input_msg) + + #handle range input + if input_type == 'range': + min = int(scens_check[0]) + max = int(scens_check[1]) + if min >= max: + raise ValueError('Your min should be less than your max.') + scens = [m for m in range(min, max+1)] + else: + scens = scens_check + + #delete matrices + for scen in scens: + if emmebank.scenario(scen): + delete_scenario(emmebank.scenario(scen)) + else: + print(f' - scenario {scen} not in dabatank, skipping...') + +print(''' + DELETE_SCENARIOS.PY + This script will delete specified scenarios from the emme databank! + Input may be one of the following: + - a single scenario ID (e.g., '20027') + - a range of scenarios, min and max separated by a hyphen (e.g., '221-227') + - a list of scenario IDs, separated by commas (e.g., '5, 8, 20005, 20008')) + ''') + +while True: + try: + user_input = input('Enter scenarios to delete (or "exit" to quit): ') + if user_input.lower() == 'exit': + break + delete_scenarios(user_input) + print('\n - done! want to go again?\n') + except ValueError as e: + print(f'\n!! Error: {e}\n') + except Exception as e: + print(f'\n!! Unexpected error occurred: {e}\n') +print('bye-bye, then!') +input('press any key to exit') +sys.exit() diff --git a/Scripts/manage/env/CMAP-TRIP2.yml b/Scripts/manage/env/CMAP-TRIP2.yml new file mode 100644 index 0000000..674f2a1 --- /dev/null +++ b/Scripts/manage/env/CMAP-TRIP2.yml @@ -0,0 +1,57 @@ +# To use this file: +# conda env create -f CMAP-TRIP2.yml +name: CMAP-TRIP2 +channels: + - conda-forge +dependencies: + - altair=4.1 + - appdirs=1.4 + - cloudpickle=2.0 + - dask=2021.12 + - datashader=0.13 + - distributed=2021.12 + - fiona=1.8 + - geopandas=0.10 + - gh=2.4 + - git=2.34 + - graphviz=2.50 + - ipykernel=6.6 + - ipyparallel=8.1 + - ipywidgets=7.6 + - joblib=1.1 + - jupyter=1.0 + - jupyter_contrib_nbextensions=0.5 # On conda-forge only + - larch=5.5.9 + - matplotlib=3.5 + - nb_conda=2.2 + - notebook=6.4 + - numba=0.53 + - numpy=1.21 + - numexpr=2.7 + - pandas=1.3 + - pip=21.3 + - platypus-opt=1.0 + - plotly=5.5 + - pyarrow=6.0 + - pydot=1.4 + - pyscaffold=4.1 + - pytest=6.2 + - python=3.9 + - python-kaleido=0.2 # Plotly Static Image Export + - pyzmq=22.3 + - salib=1.4 + - scikit-learn=1.0 + - scipy=1.7 + - seaborn=0.11 + - shortuuid=1.0 + - sqlalchemy=1.4 + - statsmodels=0.13 + - tbb=2021.4 + - tbb4py=2021.4 + - xarray=0.20 + - 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 diff --git a/Scripts/manage/env/activate_env.cmd b/Scripts/manage/env/activate_env.cmd new file mode 100644 index 0000000..7b67d2f --- /dev/null +++ b/Scripts/manage/env/activate_env.cmd @@ -0,0 +1,64 @@ +@echo off + +rem activate_env.cmd [1] + +rem Activates an existing conda environment or, if it does not exist, +rem creates the environment before activating it. + +rem Parameters: +rem 1 : emme +rem Activate the custom Emme environment instead of the TBM +rem environment (default). + +if [%~1] == [emme] (set EMME_ENV=y) else (set EMME_ENV=n) +set PDIR=%~dp0 + +rem Define here the name of the TBM environment to be used. +set TBM_ENVNAME=CMAP-TRIP2 +rem Define here the name of the custom Emme environment to be used. +set EMME_ENVNAME=emme-plus + +call "%PDIR%set_condapath.cmd" +if %ERRORLEVEL% neq 0 (goto end) + +if %EMME_ENV%==y (set ENVNAME=%EMME_ENVNAME%) else (set ENVNAME=%TBM_ENVNAME%) +set ENVPATH=%CONDAPATH%\envs\%ENVNAME% + +rem Create it if it doesn't exist. +if not exist "%ENVPATH%\python.exe" ( + echo Python not found at "%ENVPATH%" + echo. + rem Activate the conda base environment. + rem Using call is required here, see: + rem https://stackoverflow.com/questions/24678144/conda-environments-and-bat-files + call "%CONDAPATH%\Scripts\activate.bat" + if %ERRORLEVEL% neq 0 ( + echo Error in activating conda + goto end + ) + rem Create it from a file. + echo Creating %ENVNAME% environment + echo. + call conda env create -f "%PDIR%%ENVNAME%.yml" + + if %EMME_ENV%==y ( + rem Add the path configuration file to include Emme Python libraries. + copy "%PDIR%emme.pth" "%ENVPATH%\Lib\site-packages" + ) +) + +rem Activate it. +call "%CONDAPATH%\Scripts\activate.bat" "%ENVPATH%" +if %ERRORLEVEL% neq 0 ( + echo Error in activating %ENVNAME% + goto end +) else (goto activated) + +:end +echo. +pause +exit + +:activated +echo Active conda environment is %ENVNAME% +echo. \ No newline at end of file diff --git a/Scripts/manage/env/emme-plus.yml b/Scripts/manage/env/emme-plus.yml new file mode 100644 index 0000000..e9cb7f3 --- /dev/null +++ b/Scripts/manage/env/emme-plus.yml @@ -0,0 +1,16 @@ +# To use this file: +# conda env create -f emme-plus_environment.yml +name: emme-plus +channels: + - conda-forge +dependencies: + - jinja2 + - markdown + - myst-parser + - openpyxl + - pyarrow + - python=3.11.6 + - pyyaml + - sphinx + - sphinx_rtd_theme + - tqdm \ No newline at end of file diff --git a/Scripts/manage_envs/emme.pth b/Scripts/manage/env/emme.pth similarity index 100% rename from Scripts/manage_envs/emme.pth rename to Scripts/manage/env/emme.pth diff --git a/Scripts/manage/env/set_condapath.cmd b/Scripts/manage/env/set_condapath.cmd new file mode 100644 index 0000000..cc8d49e --- /dev/null +++ b/Scripts/manage/env/set_condapath.cmd @@ -0,0 +1,46 @@ +@echo off + +rem The `CONDAPATH` environment variable should be set before running this .cmd +rem It points to the place where conda is installed +rem Alternatively, if running in a conda prompt itself then CONDA_PREFIX will be set +if defined CONDAPATH ( + goto condafound +) +if defined CONDA_PREFIX ( + set CONDAPATH=%CONDA_PREFIX% + echo CONDA_PREFIX is "%CONDAPATH%" + goto condafound +) +rem Define here all the places where we might find the conda installation +rem If you try to run the model, you know that conda is installed, and the +rem model fails with "cannot find conda", then visit a conda prompt, +rem run `where conda`, and add the resulting path to this list. +for %%x in ( + %CONDAPATH% + %CONDA_PREFIX% + %LOCALAPPDATA%\mambaforge + %LOCALAPPDATA%\miniforge + %LOCALAPPDATA%\miniconda + %LOCALAPPDATA%\miniconda3 + %LOCALAPPDATA%\Anaconda3 + %USERPROFILE%\Anaconda3 + %USERPROFILE%\Anaconda + %USERPROFILE%\Anaconda2 + %USERPROFILE%\miniconda3 + %USERPROFILE%\miniconda + %USERPROFILE%\miniconda2 +) do ( + if exist "%%x\Scripts\activate.bat" ( + set CONDAPATH=%%x + goto condafound + ) +) +echo Cannot find conda in any of the usual places. +echo CONDAPATH is not defined, first run set CONDAPATH=C:\... to point to the conda installation. +echo. +pause +exit + +:condafound +echo CONDAPATH is "%CONDAPATH%" +echo. \ No newline at end of file diff --git a/Scripts/manage_envs/cmap-modedest/cmap-modedest.yml b/Scripts/manage_envs/cmap-modedest/cmap-modedest.yml deleted file mode 100644 index d44d1a7..0000000 --- a/Scripts/manage_envs/cmap-modedest/cmap-modedest.yml +++ /dev/null @@ -1,7 +0,0 @@ -name: cmap-modedest -channels: - - conda-forge -dependencies: - - larch=5.5.9 - - python=3.9 - - uv \ No newline at end of file diff --git a/Scripts/manage_envs/cmap-modedest/requirements.txt b/Scripts/manage_envs/cmap-modedest/requirements.txt deleted file mode 100644 index 4b2351e..0000000 --- a/Scripts/manage_envs/cmap-modedest/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -git+https://github.com/CMAP-REPOS/cmap_modedest@v24.4.1 \ No newline at end of file diff --git a/Scripts/manage_envs/install_envs.ps1 b/Scripts/manage_envs/install_envs.ps1 deleted file mode 100644 index 4fa4c9c..0000000 --- a/Scripts/manage_envs/install_envs.ps1 +++ /dev/null @@ -1,49 +0,0 @@ -# Install miniconda. -$condaPath = "$env:LOCALAPPDATA\miniconda3" -if (-not (Test-Path -Path "$condaPath\python.exe")) { - Invoke-WebRequest -Uri "https://repo.anaconda.com/miniconda/Miniconda3-latest-Windows-x86_64.exe" -OutFile "$env:USERPROFILE\Downloads\Miniconda3-latest-Windows-x86_64.exe" - Start-Process -FilePath "$env:USERPROFILE\Downloads\Miniconda3-latest-Windows-x86_64.exe" -ArgumentList "/S", "/D=$condaPath" -Wait -} -# Install uv. -$uvPath = "$env:USERPROFILE\.local\bin" -if (-not (Test-Path -Path "$uvPath\uv.exe")) { - # Run the installer. Please review the printed message after installation. - powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" - # Add uv to Path - $env:Path = "$uvPath;$env:Path" -} -.$condaPath\shell\condabin\conda-hook.ps1 -# Create the R conda environment for running R scripts. -if (-not (conda env list | Select-String -Pattern "tbm-r" -Quiet)) { - conda env create --file "$PSScriptRoot\tbm-r\tbm-r.yml" --yes - if ($LastExitCode -ne 0) { - Write-Error "conda env create tbm-r failed" - exit $LastExitCode - } -} -# Create the Python conda environment for running cmap_modedest. -if (-not (conda env list | Select-String -Pattern "cmap-modedest" -Quiet)) { - conda env create --file "$PSScriptRoot\cmap-modedest\cmap-modedest.yml" --yes - if ($LastExitCode -ne 0) { - Write-Error "conda env create cmap-modedest failed" - exit $LastExitCode - } - conda activate cmap-modedest - uv pip install --requirements "$PSScriptRoot\cmap-modedest\requirements.txt" - if ($LastExitCode -ne 0) { - Write-Error "(cmap-modedest) uv pip install failed" - exit $LastExitCode - } - conda deactivate -} -# Sync the base uv environment for running the model. -if (-not (Test-Path -Path "$PSScriptRoot\..\..\uv.lock")) { - uv lock -} -uv sync --locked -if ($LastExitCode -ne 0) { - Write-Error "uv sync failed" - exit $LastExitCode -} -# Extend the base environment to include Emme packages. -Copy-Item -Path "$PSScriptRoot\emme.pth" -Destination "$PSScriptRoot\..\..\.venv\Lib\site-packages" \ No newline at end of file diff --git a/Scripts/manage_envs/tbm-r/tbm-r.yml b/Scripts/manage_envs/tbm-r/tbm-r.yml deleted file mode 100644 index 6cc3d50..0000000 --- a/Scripts/manage_envs/tbm-r/tbm-r.yml +++ /dev/null @@ -1,8 +0,0 @@ -name: tbm-r -channels: - - conda-forge -dependencies: - - r-base=4.3 - - r-foreign - - r-tidyverse - - r-sf \ No newline at end of file diff --git a/Scripts/manage_envs/uninstall_envs.ps1 b/Scripts/manage_envs/uninstall_envs.ps1 deleted file mode 100644 index 8bac98a..0000000 --- a/Scripts/manage_envs/uninstall_envs.ps1 +++ /dev/null @@ -1,4 +0,0 @@ -$condaPath = "$env:LOCALAPPDATA\miniconda3" -.$condaPath\shell\condabin\conda-hook.ps1 -conda remove --name tbm-r --yes --all -conda remove --name cmap-modedest --yes --all \ No newline at end of file diff --git a/Scripts/prepare/conformity_scenario/hand/config.yaml b/Scripts/prepare/conformity_scenario/hand/config.yaml index 3249257..5300f9a 100644 --- a/Scripts/prepare/conformity_scenario/hand/config.yaml +++ b/Scripts/prepare/conformity_scenario/hand/config.yaml @@ -1,28 +1,46 @@ # model_version: c24q4 # scenario_code: 100 -similar_model_version: c25q4 # For copying model data +similar_model_version: c24q4 # For copying model data scenario_years: 100: 2019 - 200: 2026 + 200: 2025 300: 2030 - 400: 2032 - 500: 2035 - 600: 2040 - 700: 2045 - 800: 2050 + 400: 2035 + 500: 2040 + 600: 2045 + 700: 2050 +wfh_rates: + 2019: + fully_remote: 0.0510 + hybrid: 0.1031 + 2025: + fully_remote: 0.0869 + hybrid: .1257 + 2030: + fully_remote: 0.0875 + hybrid: 0.1263 + 2035: + fully_remote: 0.0880 + hybrid: 0.1270 + 2040: + fully_remote: 0.0884 + hybrid: .1273 + 2045: + fully_remote: 0.0884 + hybrid: 0.1272 + 2050: + fully_remote: 0.0882 + hybrid: 0.1269 trip_growth_factors: 2019: truck/poe: 1.19 visit: 1.00 - 2026: - truck/poe: 1.26 + 2025: + truck/poe: 1.25 visit: 1.05 2030: truck/poe: 1.30 visit: 1.18 - 2032: - truck/poe: 1.32 - visit: 1.24 2035: truck/poe: 1.35 visit: 1.34 diff --git a/Scripts/prepare/conformity_scenario/run.cmd b/Scripts/prepare/conformity_scenario/run.cmd index 0d93afa..8bc1d72 100644 --- a/Scripts/prepare/conformity_scenario/run.cmd +++ b/Scripts/prepare/conformity_scenario/run.cmd @@ -2,6 +2,7 @@ cd %~dp0 -uv run ".\src\prepare_conformity_scenario.py" +call "..\..\manage\env\activate_env.cmd" "emme" +python ".\src\prepare_conformity_scenario.py" pause \ No newline at end of file diff --git a/Scripts/prepare/conformity_scenario/src/prepare_conformity_scenario.py b/Scripts/prepare/conformity_scenario/src/prepare_conformity_scenario.py index 560489d..e9266c8 100644 --- a/Scripts/prepare/conformity_scenario/src/prepare_conformity_scenario.py +++ b/Scripts/prepare/conformity_scenario/src/prepare_conformity_scenario.py @@ -69,7 +69,15 @@ def rename_project(config): emp_file.rename(Path(emp_file.parent, new_name + '.emp')) prj_file.rename(Path(prj_file.parent, new_name + '.emp.prj')) print('project renamed') - + +def get_wfh_rates(config): + scenario_year = config['scenario_years'][config['scenario_code']] + wfh_rates = config['wfh_rates'][scenario_year] + print('\n' + f'Set these {scenario_year} WFH rates in \\Database\\batch_file.yaml:\n' + f" * usualwfhpct: {wfh_rates['fully_remote']}\n" + f" * tc14pct: {wfh_rates['hybrid']}\n") + def get_trip_growth_factors(config): scenario_year = config['scenario_years'][config['scenario_code']] trip_growth_factors = config['trip_growth_factors'][scenario_year] @@ -104,6 +112,7 @@ def main(): input_data_mac.main() print('warm start matrices generated') rename_project(config) + get_wfh_rates(config) get_trip_growth_factors(config) get_tnc_surcharge_rates(config) diff --git a/Scripts/share/standard_data/hand/data_user_guide_md.txt b/Scripts/share/standard_data/hand/data_user_guide_md.txt index dac5706..355d1b9 100644 --- a/Scripts/share/standard_data/hand/data_user_guide_md.txt +++ b/Scripts/share/standard_data/hand/data_user_guide_md.txt @@ -521,12 +521,12 @@ SOV vehicle trip value-of-time conversion:
-[**Subzone 2017 Geography**](https://datahub.cmap.illinois.gov/datasets/CMAPGIS::trip-generation-zones-subzones-2017/about) +[**Subzone 2017 Geography**](https://datahub.cmap.illinois.gov/datasets/CMAPGIS::trip-generation-zone-subzone-geography-2017/about) Trip generation information can be joined to subzones for visualization and spatial analysis.
-[**Traffic Analysis Zone 2017 Geography**](https://datahub.cmap.illinois.gov/datasets/CMAPGIS::trip-generation-zones-zones-2017/about) +[**Traffic Analysis Zone 2017 Geography**](https://datahub.cmap.illinois.gov/datasets/CMAPGIS::traffic-analysis-zone-geography-2017/about) Trip productions and attractions and distributed trip table information can be joined to TAZs for visualization and spatial analysis. \ No newline at end of file diff --git a/Scripts/share/standard_data/src/standard_data.py b/Scripts/share/standard_data/src/standard_data.py index edaf8c9..50ea576 100644 --- a/Scripts/share/standard_data/src/standard_data.py +++ b/Scripts/share/standard_data/src/standard_data.py @@ -182,11 +182,7 @@ def export(project_file_name, trip_roster_file_name, tg_data_file_name, scenario # Copy TG results to output directory. logging.info('Copying TG results') tg_dir = _proj_dir.joinpath('Database/tg') - tg_results_file = sorted(tg_dir.joinpath('data').glob('tg_results*.csv')) - if len(tg_results_file) > 1: - raise FileNotFoundError(f'Multiple TG results files exist in {tg_dir}.') - else: - file = tg_results_file[0] + file = sorted(tg_dir.joinpath('data').glob('tg_results*.csv'))[0] shutil.copy(file, _out_dir) file_copy = _out_dir.joinpath(file.name) renamed_copy = file_copy.with_name(tg_data_file_name) diff --git a/c25q4_100.emp b/c25q2_100.emp similarity index 99% rename from c25q4_100.emp rename to c25q2_100.emp index 0fd214e..487c4aa 100644 --- a/c25q4_100.emp +++ b/c25q2_100.emp @@ -1,9 +1,9 @@ 0CAFACB7-AD3C-40E4-80DD-675DE315EA7F 07B0F5AD-A2A7-4B4E-B4A9-06EB441586D6 2 2 0 -# Emme project file generated on Tue Nov 4 17:13:01 2025 -# File: E:/nrf/tbm/c25q4/cmap_trip-based_model/c25q2_100.emp +# Emme project file generated on Sat Apr 5 07:23:11 2025 +# File: D:/nrf/TBM/cmap_trip-based_model/c25q2_100.emp # # String Name: name of preference configuration (tr) -Name = c25q4_100 +Name = c25q2_100 # Text Description: description of preference configuration (tr,subst) Description = Created by Claire Bozic 4-24-2017 # String TranslationContext: context for translations of configuration texts (subst) diff --git a/c25q4_100.emp.prj b/c25q2_100.emp.prj similarity index 100% rename from c25q4_100.emp.prj rename to c25q2_100.emp.prj diff --git a/copy_scenario_data.ps1 b/copy_scenario_data.ps1 index b6a6b43..fdd0ca8 100644 --- a/copy_scenario_data.ps1 +++ b/copy_scenario_data.ps1 @@ -8,6 +8,11 @@ $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") diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index 8f914ca..0000000 --- a/pyproject.toml +++ /dev/null @@ -1,21 +0,0 @@ -[project] -name = "cmap_trip-based_model" -version = "26.4.22" -requires-python = "==3.11.6" -dependencies = [ - "jinja2", - "markdown", - "myst-parser", - "numpy~=1.0", - "numexpr>=2.8.0,<2.8.5", - "openpyxl", - "pandas~=2.0", - "pyarrow", - "pyyaml", - "sphinx", - "sphinx_rtd_theme", - "tqdm" -] - -[tool.uv] -package = false \ No newline at end of file diff --git a/src/Mode-Dest-TOD/.gitignore b/src/Mode-Dest-TOD/.gitignore new file mode 100644 index 0000000..bee8a64 --- /dev/null +++ b/src/Mode-Dest-TOD/.gitignore @@ -0,0 +1 @@ +__pycache__ diff --git a/src/Mode-Dest-TOD/README.md b/src/Mode-Dest-TOD/README.md new file mode 100644 index 0000000..82de4bf --- /dev/null +++ b/src/Mode-Dest-TOD/README.md @@ -0,0 +1,81 @@ +# 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 new file mode 100644 index 0000000..6ec0825 --- /dev/null +++ b/src/Mode-Dest-TOD/TECHNICALGUIDE.md @@ -0,0 +1,66 @@ +# 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 new file mode 100644 index 0000000..07a1111 --- /dev/null +++ b/src/Mode-Dest-TOD/USERGUIDE.md @@ -0,0 +1,495 @@ +# 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 new file mode 100644 index 0000000..ba3e4a8 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/__init__.py @@ -0,0 +1,6 @@ +# 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 new file mode 100644 index 0000000..e1c0832 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/__main__.py @@ -0,0 +1,274 @@ +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 new file mode 100644 index 0000000..734665a --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/addict.py @@ -0,0 +1,203 @@ +# - 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 new file mode 100644 index 0000000..b24f9fd --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/ae_distance_sim.py @@ -0,0 +1,80 @@ +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 new file mode 100644 index 0000000..1de062a --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/application.py @@ -0,0 +1,1495 @@ +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 new file mode 100755 index 0000000..165c1f5 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/choice_model.py @@ -0,0 +1,544 @@ +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 new file mode 100644 index 0000000..4962486 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/cmap_logging.py @@ -0,0 +1,121 @@ +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 new file mode 100755 index 0000000..e69de29 diff --git a/src/Mode-Dest-TOD/cmap_modedest/data_handlers/__init__.py b/src/Mode-Dest-TOD/cmap_modedest/data_handlers/__init__.py new file mode 100644 index 0000000..fd1c057 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/data_handlers/__init__.py @@ -0,0 +1,267 @@ +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 new file mode 100644 index 0000000..47f7201 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/data_handlers/distr_handler.py @@ -0,0 +1,28 @@ +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 new file mode 100644 index 0000000..6ff5d17 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/data_handlers/filepaths.py @@ -0,0 +1,284 @@ +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 new file mode 100644 index 0000000..9ca1106 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/data_handlers/household_types.csv @@ -0,0 +1,625 @@ +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 new file mode 100644 index 0000000..7b55f95 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/data_handlers/household_types.py @@ -0,0 +1,23 @@ +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 new file mode 100755 index 0000000..ca5e0bf --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/data_handlers/m01_handler.py @@ -0,0 +1,171 @@ + +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 new file mode 100644 index 0000000..74fb202 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/data_handlers/m023_handler.py @@ -0,0 +1,39 @@ +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 new file mode 100644 index 0000000..91101cd --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/data_handlers/pa_trip_types.csv @@ -0,0 +1,50 @@ +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 new file mode 100644 index 0000000..6b3136a --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/data_handlers/parking_handler.py @@ -0,0 +1,74 @@ +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 new file mode 100644 index 0000000..7ede3c6 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/data_handlers/shp_handler.py @@ -0,0 +1,11 @@ + +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 new file mode 100644 index 0000000..d4bba73 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/data_handlers/skims_handler.py @@ -0,0 +1,226 @@ +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 new file mode 100644 index 0000000..b3daa55 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/data_handlers/tabler.py @@ -0,0 +1 @@ +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 new file mode 100644 index 0000000..5fc2d18 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/data_handlers/tg_handler.py @@ -0,0 +1,129 @@ +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 new file mode 100644 index 0000000..0c0612b --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/data_handlers/visitors.py @@ -0,0 +1,39 @@ +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 new file mode 100644 index 0000000..8ac89c9 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/deadheading.py @@ -0,0 +1,144 @@ +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 new file mode 100644 index 0000000..c523523 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/estimation/__init__.py @@ -0,0 +1,12 @@ +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 new file mode 100644 index 0000000..f36f588 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/estimation/est_choice.py @@ -0,0 +1,863 @@ +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 new file mode 100644 index 0000000..c2a3ca9 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/estimation/est_config.py @@ -0,0 +1,137 @@ +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 new file mode 100644 index 0000000..a584775 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/estimation/est_data.py @@ -0,0 +1,25 @@ +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 new file mode 100644 index 0000000..b240d38 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/estimation/est_logging.py @@ -0,0 +1,13 @@ +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 new file mode 100644 index 0000000..1c78d21 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/estimation/est_sample_dest.py @@ -0,0 +1,270 @@ +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 new file mode 100644 index 0000000..d9664a6 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/estimation/est_skims_convol.py @@ -0,0 +1,29 @@ +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 new file mode 100644 index 0000000..cec5e4e --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/estimation/est_survey.py @@ -0,0 +1,565 @@ +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 new file mode 100644 index 0000000..2bb06f8 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/estimation/est_timeofday.py @@ -0,0 +1,60 @@ +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..d81e905 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/__init__.py @@ -0,0 +1,467 @@ +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..4a2efbf --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/extra_funcs.py @@ -0,0 +1,6 @@ +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..4f90f20 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/extra_vars.py @@ -0,0 +1,7 @@ +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..a50153a --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_dist_OFFPEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..53e50be --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_dist_PEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..4107f13 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_opcost_OFFPEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..043d805 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_opcost_PEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..3cb9fcc --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_opcost_hov_PEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..fcface8 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_time_OFFPEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..308ec21 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_time_PEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..c169b1c --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_OFFPEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..61d7089 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_hiinc_PEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..d77ec33 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_hov_hiinc_PEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..22c7941 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_hov_loinc_PEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..bda3b6a --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_auto_toll_loinc_PEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..26d0d4d --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_autopropensity.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..78cb643 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___1_OWXSNW5EFKHSRO2IUCB6DHTR.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..63aa595 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___2_FIT25FYRGELBEONPX2MTPZFN.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..fffecee --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___3_LIPIKNXA6ZB3PUNRJBVIHATL.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..576db9b --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmax_ozone_areatype__areatype___4_J3D56DXM2MR6NEMIQ6ALSFID.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..14d4e60 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___1_OTNZJFEFZT7N3JG6YKEUWGTF.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..1e743ea --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___2_FY4D7BMCO2N4QRIA6QIIWTZI.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..c7c4a5d --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___3_34BD5WGYZOPLALWPB2MCWKA7.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..44f26be --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_fmin_ozone_areatype__areatype___4_64S6AODYPVZP57LTAC522OHX.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..ad7884f --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBO.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..bcdbdeb --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBO____666_5VORECHSLO2A6MKP5I3SGJVQ.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..50a1cb5 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBS.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..dac95e3 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBS____666_L3ZMVRT365KFSBLEDVABFEGL.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..2e92b51 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWH.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..638cd9e --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWH____666_GW3RKVJQOVET3XE7MYE2MA7V.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..bf302cc --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWL.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..03e9d24 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_HBWL____666_IQGLCTAX7EZOXKEFCIBK33BD.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..a76ad09 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_NHB.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..529c3ff --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_log_attractions_NHB____666_3GFB7KMY3JN5TSJE4MRRR2HM.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..8d0d860 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_o_zone____dtaz_HXCH5HUPIDPV3EWONWFXBZHM.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..11bc0b9 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_0_5_1_0__HZLL3YOGUR763JRQHG7SM6TX.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..0d67afc --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_10_None__6EE7X5PWAQKBS6WQUONWVI63.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..cbe8bc9 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_1_0_None__FBK6GF2KEWWDN7AL3ENVH3VS.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..d93d41c --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_5_10__5RQTWWGPPCPP6EQU6ZV5MX2R.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..55a397b --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_None_0_5__537AWC5AWFXLM3TRB3PPSGYZ.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..8aa0e5c --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_OFFPEAK_None_5__YWXA4HRZAVEZKC7EV5M2AX3B.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..f3e83e1 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_0_5_1_0__4K5ZPM55FQJVFMWKUPZIQ2ET.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..5cdfe54 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_10_None__L3GKJNRUTTFCDUYV65K7KFQD.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..aaadc74 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_1_0_None__FMBHM5APW4TIH6B5EKSKSXYD.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..552904b --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_5_10__DSXTFACXD5HSWU7YKUPQEGAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..869dc31 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_None_0_5__NZ6HG4EJYEENT2OAOBDF3W5W.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..b605969 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_auto_dist_PEAK_None_5__7D72ALZRBNSP634JYUY7IV5P.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..4e77239 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_transit_ivtt_OFFPEAK__20__None__2SYXPZCTOY3PKAO2L4ALLHLI.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..59e58bd --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_piece_transit_ivtt_OFFPEAK__None__20__54N5BOFSYCN6SMRBKXM4V4TW.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..07b281b --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_fare_OFFPEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..2dc2c8b --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_fare_PEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..f40744c --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_OFFPEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..0156f1a --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_OFFPEAK_auto_dist_OFFPEAK_HC62HOLRZIWJJDAOIFX5XHV6.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..8a09c16 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_PEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..585a40a --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_taxi_wait_time_PEAK_auto_dist_PEAK_CBYSKDURSGAJ4RHX2ASS76Q2.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..90bf1df --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_fare_OFFPEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..68906b3 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_fare_PEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..a190a78 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_OFFPEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..88e23d4 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_OFFPEAK_auto_dist_OFFPEAK_FNBOP5IL57Q6SQM4VB7EXQBB.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..8e749a2 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_PEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..90bfa02 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_pool_wait_time_PEAK_auto_dist_PEAK_NHA453KUTMUKTUCSMA2XQQZV.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..83a3231 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_fare_OFFPEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..d6256cf --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_fare_PEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..8e40c74 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_OFFPEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..ea179b2 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_OFFPEAK_auto_dist_OFFPEAK_CA5RZWRWZJWFNZATH2HHD3TO.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..d3a8667 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_PEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..7c55798 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_tnc_solo_wait_time_PEAK_auto_dist_PEAK_2EZZEATSM4EAHST74DMGSFSS.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..e401cfc --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_fare_OFFPEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..3f1b119 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_fare_PEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..5862f24 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ivtt_OFFPEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..09e64ce --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ivtt_PEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..d149882 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ovtt_OFFPEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..3a13606 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S1/f_transit_ovtt_PEAK.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..a7c1930 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/__init__.py @@ -0,0 +1,312 @@ +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..196f0d0 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBO_EKWWH33ZEA3VXLR4UYBVLRUX.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..6021d18 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBS_JA6SY3LPJJDVZQF7IFNL4EWX.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..50955fe --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBWH_RSSCN3EFDQ2CM4RPVZVAP7K3.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..7bae017 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_HBWL_VWN3Q4WQRAVVJ5ZTYY4OHM63.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..01950cd --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_auto_avail_NHB_XHHWLREMVWOEBM6NUQF7EFH6.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..62e033c --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBO_K3RWOEPC3IXNAPRPQQJCHORY.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..8e1bdce --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBS_5CZV3HKDPQJDWZME2XMN7NW6.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..905c093 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBWH_NMEWQX35KIWZJMZ5IZZTZHOE.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..132b894 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_HBWL_MPZ7IOPMILS7SZEG5T2D6HG2.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..15d6136 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f__1_transit_avail_NHB_WN7OPNQOSVQ544PG5Q2ZGTNF.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..97f64e8 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBO.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..efa8332 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBS.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..003f33a --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBWH.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..2c4dd9b --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_HBWL.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..212f7a2 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_avail_NHB.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..e672b1f --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBO.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..66268b7 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBOR.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..df6d3ab --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBS.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..0191aa2 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBWH.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..bb94bb2 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_HBWL.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..d08c175 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_NHB.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..47c2972 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_NHBR.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..2b02df6 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_auto_parking_cost_NHBS.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..fac81d8 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_hard_sigmoid_transit_approach_walktime_OFFPEAK__4_0__2_0__FPYQ4GNCVUNJNUMJTUIBMLKO.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..e0bd3be --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_hard_sigmoid_transit_approach_walktime_PEAK__4_0__2_0__AJ26DYAVZX7MOBOG5SOJABST.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..571d66e --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_log_1_samp_wgt__PLSMOODNF77UOPHIVH6I2WBL.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..24f6e4a --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_samp_wgt.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..ec46953 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_drivetime_OFFPEAK_auto_dist_OFFPEAK_U2242PIA3ZL4MJS726HCCG73.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..607fb27 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_drivetime_PEAK_auto_dist_PEAK_SVETJXGBSVYEYM7OVBAQW2PX.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..79f01ca --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_waittime_OFFPEAK_auto_dist_OFFPEAK_22UIGWVENT7RTALQKKOHEPXM.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..1d62e39 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_waittime_PEAK_auto_dist_PEAK_YHJNF2B3VEICSZL64Y2XLV4S.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..71aa571 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_walktime_OFFPEAK_auto_dist_OFFPEAK_ITAE2YOSBIY76DBTPIPT6QD2.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..3c18880 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_approach_walktime_PEAK_auto_dist_PEAK_T52CC4SUBMFSLGDNMCSO7A7J.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..1486d27 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBO.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..cfd01f6 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBS.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..3a39e56 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBWH.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..9ae5ea4 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_HBWL.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..a6d4ee2 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_avail_NHB.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..530c3d6 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_ovtt_OFFPEAK_auto_dist_OFFPEAK_IY4UAVBMS2HPHNYZJLSMWG3V.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 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 new file mode 100644 index 0000000..f9af209 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/__sc/S2/f_transit_ovtt_PEAK_auto_dist_PEAK_UIAXX4VIE5PP53PJMCSMEFOP.py @@ -0,0 +1,16 @@ + +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 new file mode 100755 index 0000000..e69de29 diff --git a/src/Mode-Dest-TOD/cmap_modedest/fast/application_data.py b/src/Mode-Dest-TOD/cmap_modedest/fast/application_data.py new file mode 100644 index 0000000..8d839fe --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/application_data.py @@ -0,0 +1,335 @@ +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 new file mode 100644 index 0000000..c4f8c91 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/parking_cost.py @@ -0,0 +1,102 @@ +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 new file mode 100644 index 0000000..7fc05c1 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/random_generator.py @@ -0,0 +1,42 @@ +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 new file mode 100644 index 0000000..1b05655 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/tnc_los.py @@ -0,0 +1,388 @@ +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 new file mode 100644 index 0000000..e69de29 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 new file mode 100644 index 0000000..211afd7 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/transit/access_egress_distance.py @@ -0,0 +1,165 @@ +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 new file mode 100644 index 0000000..a33cc51 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/fast/transit/approach.py @@ -0,0 +1,836 @@ + +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 new file mode 100644 index 0000000..72e5486 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/hh_sampling.py @@ -0,0 +1,25 @@ +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 new file mode 100644 index 0000000..08eb695 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/incomes.py @@ -0,0 +1,99 @@ +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 new file mode 100644 index 0000000..8524a96 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/modecodes.py @@ -0,0 +1,60 @@ +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 new file mode 100644 index 0000000..59dd7a5 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/numexpr_patch.py @@ -0,0 +1,31 @@ + +# 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 new file mode 100644 index 0000000..924b198 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/parking_costs.py @@ -0,0 +1,371 @@ +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 new file mode 100644 index 0000000..55b0387 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/purposes.py @@ -0,0 +1,60 @@ + +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 new file mode 100644 index 0000000..7b76a0e --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/random_states.py @@ -0,0 +1,46 @@ +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 new file mode 100644 index 0000000..4d67614 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/runtime.py @@ -0,0 +1,40 @@ +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 new file mode 100644 index 0000000..26edd5b --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/skims/__init__.py @@ -0,0 +1,57 @@ +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 new file mode 100644 index 0000000..fc1a917 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/skims/compression.py @@ -0,0 +1,191 @@ +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 new file mode 100644 index 0000000..8fdd177 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/skims/names.py @@ -0,0 +1,15 @@ +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 new file mode 100644 index 0000000..d04a6fd --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/time_of_day_model.py @@ -0,0 +1,130 @@ +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 new file mode 100644 index 0000000..3e18d1f --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/timeperiods.py @@ -0,0 +1,51 @@ + + +# 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 new file mode 100644 index 0000000..55a76db --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/tnc_costs.py @@ -0,0 +1,124 @@ +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 new file mode 100644 index 0000000..349aaee --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/transit_approach.py @@ -0,0 +1,731 @@ +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 new file mode 100644 index 0000000..1ce0d25 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/transit_skim_convolution.py @@ -0,0 +1,265 @@ +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 new file mode 100644 index 0000000..74d322a --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/util.py @@ -0,0 +1,138 @@ +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 new file mode 100644 index 0000000..6286e43 --- /dev/null +++ b/src/Mode-Dest-TOD/cmap_modedest/validation.py @@ -0,0 +1,96 @@ +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 new file mode 100644 index 0000000..148f406 Binary files /dev/null and b/src/Mode-Dest-TOD/nesting-tree.png differ diff --git a/src/Mode-Dest-TOD/requirements.txt b/src/Mode-Dest-TOD/requirements.txt new file mode 100644 index 0000000..cb569c0 --- /dev/null +++ b/src/Mode-Dest-TOD/requirements.txt @@ -0,0 +1,5 @@ +numpy +scipy +pandas +addict>=2.2 +larch diff --git a/src/Mode-Dest-TOD/setup.py b/src/Mode-Dest-TOD/setup.py new file mode 100644 index 0000000..26db817 --- /dev/null +++ b/src/Mode-Dest-TOD/setup.py @@ -0,0 +1,62 @@ +""" +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 new file mode 100644 index 0000000..32effd1 --- /dev/null +++ b/src/Mode-Dest-TOD/sharrow/.idea/sharrow_lite.iml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/Mode-Dest-TOD/sharrow/LICENSE b/src/Mode-Dest-TOD/sharrow/LICENSE new file mode 100644 index 0000000..7026335 --- /dev/null +++ b/src/Mode-Dest-TOD/sharrow/LICENSE @@ -0,0 +1,29 @@ +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 new file mode 100644 index 0000000..285f345 --- /dev/null +++ b/src/Mode-Dest-TOD/sharrow/README.md @@ -0,0 +1,4 @@ +# 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 new file mode 100644 index 0000000..25ff221 --- /dev/null +++ b/src/Mode-Dest-TOD/sharrow/requirements.txt @@ -0,0 +1,5 @@ +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 new file mode 100644 index 0000000..6fac007 --- /dev/null +++ b/src/Mode-Dest-TOD/sharrow/setup.py @@ -0,0 +1,64 @@ + +# 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 new file mode 100644 index 0000000..d168061 --- /dev/null +++ b/src/Mode-Dest-TOD/sharrow/sharrow/__init__.py @@ -0,0 +1,19 @@ +__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 new file mode 100644 index 0000000..612ad8c --- /dev/null +++ b/src/Mode-Dest-TOD/sharrow/sharrow/dataset.py @@ -0,0 +1,457 @@ +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 new file mode 100644 index 0000000..f8fcd92 --- /dev/null +++ b/src/Mode-Dest-TOD/sharrow/sharrow/interface.py @@ -0,0 +1,90 @@ +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 new file mode 100644 index 0000000..cc40ffd --- /dev/null +++ b/src/Mode-Dest-TOD/sharrow/sharrow/local_dir.py @@ -0,0 +1,6 @@ +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 new file mode 100644 index 0000000..c3bb39f --- /dev/null +++ b/src/Mode-Dest-TOD/sharrow/sharrow/logging.py @@ -0,0 +1,142 @@ +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"